diff --git a/.tx/config b/.tx/config index 65d891131e..58da2cc97d 100644 --- a/.tx/config +++ b/.tx/config @@ -3,7 +3,7 @@ host = https://www.transifex.com [nodebb.category] file_filter = public/language//category.json -source_file = public/language/en_GB/category.json +source_file = public/language/en-GB/category.json source_lang = en_GB trans.ar = public/language/ar/category.json trans.bn = public/language/bn/category.json @@ -12,11 +12,11 @@ trans.cs = public/language/cs/category.json trans.da = public/language/da/category.json trans.de = public/language/de/category.json trans.el = public/language/el/category.json -trans.en_US = public/language/en_US/category.json -trans.en@pirate = public/language/en@pirate/category.json +trans.en_US = public/language/en-US/category.json +trans.en@pirate = public/language/en-x-pirate/category.json trans.es = public/language/es/category.json trans.et = public/language/et/category.json -trans.fa_IR = public/language/fa_IR/category.json +trans.fa_IR = public/language/fa-IR/category.json trans.fi = public/language/fi/category.json trans.fr = public/language/fr/category.json trans.gl = public/language/gl/category.json @@ -31,7 +31,7 @@ trans.ms = public/language/ms/category.json trans.nb = public/language/nb/category.json trans.nl = public/language/nl/category.json trans.pl = public/language/pl/category.json -trans.pt_BR = public/language/pt_BR/category.json +trans.pt_BR = public/language/pt-BR/category.json trans.ru = public/language/ru/category.json trans.ro = public/language/ro/category.json trans.rw = public/language/rw/category.json @@ -43,13 +43,13 @@ trans.sv = public/language/sv/category.json trans.th = public/language/th/category.json trans.tr = public/language/tr/category.json trans.vi = public/language/vi/category.json -trans.zh_CN = public/language/zh_CN/category.json -trans.zh_TW = public/language/zh_TW/category.json +trans.zh_CN = public/language/zh-CN/category.json +trans.zh_TW = public/language/zh-TW/category.json type = KEYVALUEJSON [nodebb.login] file_filter = public/language//login.json -source_file = public/language/en_GB/login.json +source_file = public/language/en-GB/login.json source_lang = en_GB trans.ar = public/language/ar/login.json trans.bn = public/language/bn/login.json @@ -58,11 +58,11 @@ trans.cs = public/language/cs/login.json trans.da = public/language/da/login.json trans.de = public/language/de/login.json trans.el = public/language/el/login.json -trans.en_US = public/language/en_US/login.json -trans.en@pirate = public/language/en@pirate/login.json +trans.en_US = public/language/en-US/login.json +trans.en@pirate = public/language/en-x-pirate/login.json trans.es = public/language/es/login.json trans.et = public/language/et/login.json -trans.fa_IR = public/language/fa_IR/login.json +trans.fa_IR = public/language/fa-IR/login.json trans.fi = public/language/fi/login.json trans.fr = public/language/fr/login.json trans.gl = public/language/gl/login.json @@ -77,7 +77,7 @@ trans.ms = public/language/ms/login.json trans.nb = public/language/nb/login.json trans.nl = public/language/nl/login.json trans.pl = public/language/pl/login.json -trans.pt_BR = public/language/pt_BR/login.json +trans.pt_BR = public/language/pt-BR/login.json trans.ru = public/language/ru/login.json trans.ro = public/language/ro/login.json trans.rw = public/language/rw/login.json @@ -89,13 +89,13 @@ trans.sv = public/language/sv/login.json trans.th = public/language/th/login.json trans.tr = public/language/tr/login.json trans.vi = public/language/vi/login.json -trans.zh_CN = public/language/zh_CN/login.json -trans.zh_TW = public/language/zh_TW/login.json +trans.zh_CN = public/language/zh-CN/login.json +trans.zh_TW = public/language/zh-TW/login.json type = KEYVALUEJSON [nodebb.recent] file_filter = public/language//recent.json -source_file = public/language/en_GB/recent.json +source_file = public/language/en-GB/recent.json source_lang = en_GB trans.ar = public/language/ar/recent.json trans.bn = public/language/bn/recent.json @@ -104,11 +104,11 @@ trans.cs = public/language/cs/recent.json trans.da = public/language/da/recent.json trans.de = public/language/de/recent.json trans.el = public/language/el/recent.json -trans.en_US = public/language/en_US/recent.json -trans.en@pirate = public/language/en@pirate/recent.json +trans.en_US = public/language/en-US/recent.json +trans.en@pirate = public/language/en-x-pirate/recent.json trans.es = public/language/es/recent.json trans.et = public/language/et/recent.json -trans.fa_IR = public/language/fa_IR/recent.json +trans.fa_IR = public/language/fa-IR/recent.json trans.fi = public/language/fi/recent.json trans.fr = public/language/fr/recent.json trans.gl = public/language/gl/recent.json @@ -123,7 +123,7 @@ trans.ms = public/language/ms/recent.json trans.nb = public/language/nb/recent.json trans.nl = public/language/nl/recent.json trans.pl = public/language/pl/recent.json -trans.pt_BR = public/language/pt_BR/recent.json +trans.pt_BR = public/language/pt-BR/recent.json trans.ru = public/language/ru/recent.json trans.ro = public/language/ro/recent.json trans.rw = public/language/rw/recent.json @@ -135,13 +135,13 @@ trans.sv = public/language/sv/recent.json trans.th = public/language/th/recent.json trans.tr = public/language/tr/recent.json trans.vi = public/language/vi/recent.json -trans.zh_CN = public/language/zh_CN/recent.json -trans.zh_TW = public/language/zh_TW/recent.json +trans.zh_CN = public/language/zh-CN/recent.json +trans.zh_TW = public/language/zh-TW/recent.json type = KEYVALUEJSON [nodebb.unread] file_filter = public/language//unread.json -source_file = public/language/en_GB/unread.json +source_file = public/language/en-GB/unread.json source_lang = en_GB trans.ar = public/language/ar/unread.json trans.bn = public/language/bn/unread.json @@ -150,11 +150,11 @@ trans.cs = public/language/cs/unread.json trans.da = public/language/da/unread.json trans.de = public/language/de/unread.json trans.el = public/language/el/unread.json -trans.en_US = public/language/en_US/unread.json -trans.en@pirate = public/language/en@pirate/unread.json +trans.en_US = public/language/en-US/unread.json +trans.en@pirate = public/language/en-x-pirate/unread.json trans.es = public/language/es/unread.json trans.et = public/language/et/unread.json -trans.fa_IR = public/language/fa_IR/unread.json +trans.fa_IR = public/language/fa-IR/unread.json trans.fi = public/language/fi/unread.json trans.fr = public/language/fr/unread.json trans.gl = public/language/gl/unread.json @@ -169,7 +169,7 @@ trans.ms = public/language/ms/unread.json trans.nb = public/language/nb/unread.json trans.nl = public/language/nl/unread.json trans.pl = public/language/pl/unread.json -trans.pt_BR = public/language/pt_BR/unread.json +trans.pt_BR = public/language/pt-BR/unread.json trans.ru = public/language/ru/unread.json trans.ro = public/language/ro/unread.json trans.rw = public/language/rw/unread.json @@ -181,13 +181,13 @@ trans.sv = public/language/sv/unread.json trans.th = public/language/th/unread.json trans.tr = public/language/tr/unread.json trans.vi = public/language/vi/unread.json -trans.zh_CN = public/language/zh_CN/unread.json -trans.zh_TW = public/language/zh_TW/unread.json +trans.zh_CN = public/language/zh-CN/unread.json +trans.zh_TW = public/language/zh-TW/unread.json type = KEYVALUEJSON [nodebb.modules] file_filter = public/language//modules.json -source_file = public/language/en_GB/modules.json +source_file = public/language/en-GB/modules.json source_lang = en_GB trans.ar = public/language/ar/modules.json trans.bn = public/language/bn/modules.json @@ -196,11 +196,11 @@ trans.cs = public/language/cs/modules.json trans.da = public/language/da/modules.json trans.de = public/language/de/modules.json trans.el = public/language/el/modules.json -trans.en_US = public/language/en_US/modules.json -trans.en@pirate = public/language/en@pirate/modules.json +trans.en_US = public/language/en-US/modules.json +trans.en@pirate = public/language/en-x-pirate/modules.json trans.es = public/language/es/modules.json trans.et = public/language/et/modules.json -trans.fa_IR = public/language/fa_IR/modules.json +trans.fa_IR = public/language/fa-IR/modules.json trans.fi = public/language/fi/modules.json trans.fr = public/language/fr/modules.json trans.gl = public/language/gl/modules.json @@ -215,7 +215,7 @@ trans.ms = public/language/ms/modules.json trans.nb = public/language/nb/modules.json trans.nl = public/language/nl/modules.json trans.pl = public/language/pl/modules.json -trans.pt_BR = public/language/pt_BR/modules.json +trans.pt_BR = public/language/pt-BR/modules.json trans.ru = public/language/ru/modules.json trans.ro = public/language/ro/modules.json trans.rw = public/language/rw/modules.json @@ -227,13 +227,13 @@ trans.sv = public/language/sv/modules.json trans.th = public/language/th/modules.json trans.tr = public/language/tr/modules.json trans.vi = public/language/vi/modules.json -trans.zh_CN = public/language/zh_CN/modules.json -trans.zh_TW = public/language/zh_TW/modules.json +trans.zh_CN = public/language/zh-CN/modules.json +trans.zh_TW = public/language/zh-TW/modules.json type = KEYVALUEJSON [nodebb.register] file_filter = public/language//register.json -source_file = public/language/en_GB/register.json +source_file = public/language/en-GB/register.json source_lang = en_GB trans.ar = public/language/ar/register.json trans.bn = public/language/bn/register.json @@ -242,11 +242,11 @@ trans.cs = public/language/cs/register.json trans.da = public/language/da/register.json trans.de = public/language/de/register.json trans.el = public/language/el/register.json -trans.en_US = public/language/en_US/register.json -trans.en@pirate = public/language/en@pirate/register.json +trans.en_US = public/language/en-US/register.json +trans.en@pirate = public/language/en-x-pirate/register.json trans.es = public/language/es/register.json trans.et = public/language/et/register.json -trans.fa_IR = public/language/fa_IR/register.json +trans.fa_IR = public/language/fa-IR/register.json trans.fi = public/language/fi/register.json trans.fr = public/language/fr/register.json trans.gl = public/language/gl/register.json @@ -261,7 +261,7 @@ trans.ms = public/language/ms/register.json trans.nb = public/language/nb/register.json trans.nl = public/language/nl/register.json trans.pl = public/language/pl/register.json -trans.pt_BR = public/language/pt_BR/register.json +trans.pt_BR = public/language/pt-BR/register.json trans.ru = public/language/ru/register.json trans.ro = public/language/ro/register.json trans.rw = public/language/rw/register.json @@ -273,13 +273,13 @@ trans.sv = public/language/sv/register.json trans.th = public/language/th/register.json trans.tr = public/language/tr/register.json trans.vi = public/language/vi/register.json -trans.zh_CN = public/language/zh_CN/register.json -trans.zh_TW = public/language/zh_TW/register.json +trans.zh_CN = public/language/zh-CN/register.json +trans.zh_TW = public/language/zh-TW/register.json type = KEYVALUEJSON [nodebb.user] file_filter = public/language//user.json -source_file = public/language/en_GB/user.json +source_file = public/language/en-GB/user.json source_lang = en_GB trans.ar = public/language/ar/user.json trans.bn = public/language/bn/user.json @@ -288,11 +288,11 @@ trans.cs = public/language/cs/user.json trans.da = public/language/da/user.json trans.de = public/language/de/user.json trans.el = public/language/el/user.json -trans.en_US = public/language/en_US/user.json -trans.en@pirate = public/language/en@pirate/user.json +trans.en_US = public/language/en-US/user.json +trans.en@pirate = public/language/en-x-pirate/user.json trans.es = public/language/es/user.json trans.et = public/language/et/user.json -trans.fa_IR = public/language/fa_IR/user.json +trans.fa_IR = public/language/fa-IR/user.json trans.fi = public/language/fi/user.json trans.fr = public/language/fr/user.json trans.gl = public/language/gl/user.json @@ -307,7 +307,7 @@ trans.ms = public/language/ms/user.json trans.nb = public/language/nb/user.json trans.nl = public/language/nl/user.json trans.pl = public/language/pl/user.json -trans.pt_BR = public/language/pt_BR/user.json +trans.pt_BR = public/language/pt-BR/user.json trans.ru = public/language/ru/user.json trans.ro = public/language/ro/user.json trans.rw = public/language/rw/user.json @@ -319,13 +319,13 @@ trans.sv = public/language/sv/user.json trans.th = public/language/th/user.json trans.tr = public/language/tr/user.json trans.vi = public/language/vi/user.json -trans.zh_CN = public/language/zh_CN/user.json -trans.zh_TW = public/language/zh_TW/user.json +trans.zh_CN = public/language/zh-CN/user.json +trans.zh_TW = public/language/zh-TW/user.json type = KEYVALUEJSON [nodebb.global] file_filter = public/language//global.json -source_file = public/language/en_GB/global.json +source_file = public/language/en-GB/global.json source_lang = en_GB trans.ar = public/language/ar/global.json trans.bn = public/language/bn/global.json @@ -334,11 +334,11 @@ trans.cs = public/language/cs/global.json trans.da = public/language/da/global.json trans.de = public/language/de/global.json trans.el = public/language/el/global.json -trans.en_US = public/language/en_US/global.json -trans.en@pirate = public/language/en@pirate/global.json +trans.en_US = public/language/en-US/global.json +trans.en@pirate = public/language/en-x-pirate/global.json trans.es = public/language/es/global.json trans.et = public/language/et/global.json -trans.fa_IR = public/language/fa_IR/global.json +trans.fa_IR = public/language/fa-IR/global.json trans.fi = public/language/fi/global.json trans.fr = public/language/fr/global.json trans.gl = public/language/gl/global.json @@ -353,7 +353,7 @@ trans.ms = public/language/ms/global.json trans.nb = public/language/nb/global.json trans.nl = public/language/nl/global.json trans.pl = public/language/pl/global.json -trans.pt_BR = public/language/pt_BR/global.json +trans.pt_BR = public/language/pt-BR/global.json trans.ru = public/language/ru/global.json trans.ro = public/language/ro/global.json trans.rw = public/language/rw/global.json @@ -365,13 +365,13 @@ trans.sv = public/language/sv/global.json trans.th = public/language/th/global.json trans.tr = public/language/tr/global.json trans.vi = public/language/vi/global.json -trans.zh_CN = public/language/zh_CN/global.json -trans.zh_TW = public/language/zh_TW/global.json +trans.zh_CN = public/language/zh-CN/global.json +trans.zh_TW = public/language/zh-TW/global.json type = KEYVALUEJSON [nodebb.notifications] file_filter = public/language//notifications.json -source_file = public/language/en_GB/notifications.json +source_file = public/language/en-GB/notifications.json source_lang = en_GB trans.ar = public/language/ar/notifications.json trans.bn = public/language/bn/notifications.json @@ -380,11 +380,11 @@ trans.cs = public/language/cs/notifications.json trans.da = public/language/da/notifications.json trans.de = public/language/de/notifications.json trans.el = public/language/el/notifications.json -trans.en_US = public/language/en_US/notifications.json -trans.en@pirate = public/language/en@pirate/notifications.json +trans.en_US = public/language/en-US/notifications.json +trans.en@pirate = public/language/en-x-pirate/notifications.json trans.es = public/language/es/notifications.json trans.et = public/language/et/notifications.json -trans.fa_IR = public/language/fa_IR/notifications.json +trans.fa_IR = public/language/fa-IR/notifications.json trans.fi = public/language/fi/notifications.json trans.fr = public/language/fr/notifications.json trans.gl = public/language/gl/notifications.json @@ -399,7 +399,7 @@ trans.ms = public/language/ms/notifications.json trans.nb = public/language/nb/notifications.json trans.nl = public/language/nl/notifications.json trans.pl = public/language/pl/notifications.json -trans.pt_BR = public/language/pt_BR/notifications.json +trans.pt_BR = public/language/pt-BR/notifications.json trans.ru = public/language/ru/notifications.json trans.ro = public/language/ro/notifications.json trans.rw = public/language/rw/notifications.json @@ -411,13 +411,13 @@ trans.sv = public/language/sv/notifications.json trans.th = public/language/th/notifications.json trans.tr = public/language/tr/notifications.json trans.vi = public/language/vi/notifications.json -trans.zh_CN = public/language/zh_CN/notifications.json -trans.zh_TW = public/language/zh_TW/notifications.json +trans.zh_CN = public/language/zh-CN/notifications.json +trans.zh_TW = public/language/zh-TW/notifications.json type = KEYVALUEJSON [nodebb.reset_password] file_filter = public/language//reset_password.json -source_file = public/language/en_GB/reset_password.json +source_file = public/language/en-GB/reset_password.json source_lang = en_GB trans.ar = public/language/ar/reset_password.json trans.bn = public/language/bn/reset_password.json @@ -426,11 +426,11 @@ trans.cs = public/language/cs/reset_password.json trans.da = public/language/da/reset_password.json trans.de = public/language/de/reset_password.json trans.el = public/language/el/reset_password.json -trans.en_US = public/language/en_US/reset_password.json -trans.en@pirate = public/language/en@pirate/reset_password.json +trans.en_US = public/language/en-US/reset_password.json +trans.en@pirate = public/language/en-x-pirate/reset_password.json trans.es = public/language/es/reset_password.json trans.et = public/language/et/reset_password.json -trans.fa_IR = public/language/fa_IR/reset_password.json +trans.fa_IR = public/language/fa-IR/reset_password.json trans.fi = public/language/fi/reset_password.json trans.fr = public/language/fr/reset_password.json trans.gl = public/language/gl/reset_password.json @@ -445,7 +445,7 @@ trans.ms = public/language/ms/reset_password.json trans.nb = public/language/nb/reset_password.json trans.nl = public/language/nl/reset_password.json trans.pl = public/language/pl/reset_password.json -trans.pt_BR = public/language/pt_BR/reset_password.json +trans.pt_BR = public/language/pt-BR/reset_password.json trans.ru = public/language/ru/reset_password.json trans.ro = public/language/ro/reset_password.json trans.rw = public/language/rw/reset_password.json @@ -457,13 +457,13 @@ trans.sv = public/language/sv/reset_password.json trans.th = public/language/th/reset_password.json trans.tr = public/language/tr/reset_password.json trans.vi = public/language/vi/reset_password.json -trans.zh_CN = public/language/zh_CN/reset_password.json -trans.zh_TW = public/language/zh_TW/reset_password.json +trans.zh_CN = public/language/zh-CN/reset_password.json +trans.zh_TW = public/language/zh-TW/reset_password.json type = KEYVALUEJSON [nodebb.users] file_filter = public/language//users.json -source_file = public/language/en_GB/users.json +source_file = public/language/en-GB/users.json source_lang = en_GB trans.ar = public/language/ar/users.json trans.bn = public/language/bn/users.json @@ -472,11 +472,11 @@ trans.cs = public/language/cs/users.json trans.da = public/language/da/users.json trans.de = public/language/de/users.json trans.el = public/language/el/users.json -trans.en_US = public/language/en_US/users.json -trans.en@pirate = public/language/en@pirate/users.json +trans.en_US = public/language/en-US/users.json +trans.en@pirate = public/language/en-x-pirate/users.json trans.es = public/language/es/users.json trans.et = public/language/et/users.json -trans.fa_IR = public/language/fa_IR/users.json +trans.fa_IR = public/language/fa-IR/users.json trans.fi = public/language/fi/users.json trans.fr = public/language/fr/users.json trans.gl = public/language/gl/users.json @@ -491,7 +491,7 @@ trans.ms = public/language/ms/users.json trans.nb = public/language/nb/users.json trans.nl = public/language/nl/users.json trans.pl = public/language/pl/users.json -trans.pt_BR = public/language/pt_BR/users.json +trans.pt_BR = public/language/pt-BR/users.json trans.ru = public/language/ru/users.json trans.ro = public/language/ro/users.json trans.rw = public/language/rw/users.json @@ -503,13 +503,13 @@ trans.sv = public/language/sv/users.json trans.th = public/language/th/users.json trans.tr = public/language/tr/users.json trans.vi = public/language/vi/users.json -trans.zh_CN = public/language/zh_CN/users.json -trans.zh_TW = public/language/zh_TW/users.json +trans.zh_CN = public/language/zh-CN/users.json +trans.zh_TW = public/language/zh-TW/users.json type = KEYVALUEJSON [nodebb.language-1] file_filter = public/language//language.json -source_file = public/language/en_GB/language.json +source_file = public/language/en-GB/language.json source_lang = en_GB trans.ar = public/language/ar/language.json trans.bn = public/language/bn/language.json @@ -518,11 +518,11 @@ trans.cs = public/language/cs/language.json trans.da = public/language/da/language.json trans.de = public/language/de/language.json trans.el = public/language/el/language.json -trans.en_US = public/language/en_US/language.json -trans.en@pirate = public/language/en@pirate/language.json +trans.en_US = public/language/en-US/language.json +trans.en@pirate = public/language/en-x-pirate/language.json trans.es = public/language/es/language.json trans.et = public/language/et/language.json -trans.fa_IR = public/language/fa_IR/language.json +trans.fa_IR = public/language/fa-IR/language.json trans.fi = public/language/fi/language.json trans.fr = public/language/fr/language.json trans.gl = public/language/gl/language.json @@ -537,7 +537,7 @@ trans.ms = public/language/ms/language.json trans.nb = public/language/nb/language.json trans.nl = public/language/nl/language.json trans.pl = public/language/pl/language.json -trans.pt_BR = public/language/pt_BR/language.json +trans.pt_BR = public/language/pt-BR/language.json trans.ru = public/language/ru/language.json trans.ro = public/language/ro/language.json trans.rw = public/language/rw/language.json @@ -549,13 +549,13 @@ trans.sv = public/language/sv/language.json trans.th = public/language/th/language.json trans.tr = public/language/tr/language.json trans.vi = public/language/vi/language.json -trans.zh_CN = public/language/zh_CN/language.json -trans.zh_TW = public/language/zh_TW/language.json +trans.zh_CN = public/language/zh-CN/language.json +trans.zh_TW = public/language/zh-TW/language.json type = KEYVALUEJSON [nodebb.pages] file_filter = public/language//pages.json -source_file = public/language/en_GB/pages.json +source_file = public/language/en-GB/pages.json source_lang = en_GB trans.ar = public/language/ar/pages.json trans.bn = public/language/bn/pages.json @@ -564,11 +564,11 @@ trans.cs = public/language/cs/pages.json trans.da = public/language/da/pages.json trans.de = public/language/de/pages.json trans.el = public/language/el/pages.json -trans.en_US = public/language/en_US/pages.json -trans.en@pirate = public/language/en@pirate/pages.json +trans.en_US = public/language/en-US/pages.json +trans.en@pirate = public/language/en-x-pirate/pages.json trans.es = public/language/es/pages.json trans.et = public/language/et/pages.json -trans.fa_IR = public/language/fa_IR/pages.json +trans.fa_IR = public/language/fa-IR/pages.json trans.fi = public/language/fi/pages.json trans.fr = public/language/fr/pages.json trans.gl = public/language/gl/pages.json @@ -583,7 +583,7 @@ trans.ms = public/language/ms/pages.json trans.nb = public/language/nb/pages.json trans.nl = public/language/nl/pages.json trans.pl = public/language/pl/pages.json -trans.pt_BR = public/language/pt_BR/pages.json +trans.pt_BR = public/language/pt-BR/pages.json trans.ru = public/language/ru/pages.json trans.ro = public/language/ro/pages.json trans.rw = public/language/rw/pages.json @@ -595,13 +595,13 @@ trans.sv = public/language/sv/pages.json trans.th = public/language/th/pages.json trans.tr = public/language/tr/pages.json trans.vi = public/language/vi/pages.json -trans.zh_CN = public/language/zh_CN/pages.json -trans.zh_TW = public/language/zh_TW/pages.json +trans.zh_CN = public/language/zh-CN/pages.json +trans.zh_TW = public/language/zh-TW/pages.json type = KEYVALUEJSON [nodebb.topic] file_filter = public/language//topic.json -source_file = public/language/en_GB/topic.json +source_file = public/language/en-GB/topic.json source_lang = en_GB trans.ar = public/language/ar/topic.json trans.bn = public/language/bn/topic.json @@ -610,11 +610,11 @@ trans.cs = public/language/cs/topic.json trans.da = public/language/da/topic.json trans.de = public/language/de/topic.json trans.el = public/language/el/topic.json -trans.en_US = public/language/en_US/topic.json -trans.en@pirate = public/language/en@pirate/topic.json +trans.en_US = public/language/en-US/topic.json +trans.en@pirate = public/language/en-x-pirate/topic.json trans.es = public/language/es/topic.json trans.et = public/language/et/topic.json -trans.fa_IR = public/language/fa_IR/topic.json +trans.fa_IR = public/language/fa-IR/topic.json trans.fi = public/language/fi/topic.json trans.fr = public/language/fr/topic.json trans.gl = public/language/gl/topic.json @@ -629,7 +629,7 @@ trans.ms = public/language/ms/topic.json trans.nb = public/language/nb/topic.json trans.nl = public/language/nl/topic.json trans.pl = public/language/pl/topic.json -trans.pt_BR = public/language/pt_BR/topic.json +trans.pt_BR = public/language/pt-BR/topic.json trans.ru = public/language/ru/topic.json trans.ro = public/language/ro/topic.json trans.rw = public/language/rw/topic.json @@ -641,13 +641,13 @@ trans.sv = public/language/sv/topic.json trans.th = public/language/th/topic.json trans.tr = public/language/tr/topic.json trans.vi = public/language/vi/topic.json -trans.zh_CN = public/language/zh_CN/topic.json -trans.zh_TW = public/language/zh_TW/topic.json +trans.zh_CN = public/language/zh-CN/topic.json +trans.zh_TW = public/language/zh-TW/topic.json type = KEYVALUEJSON [nodebb.success] file_filter = public/language//success.json -source_file = public/language/en_GB/success.json +source_file = public/language/en-GB/success.json source_lang = en_GB trans.ar = public/language/ar/success.json trans.bn = public/language/bn/success.json @@ -656,11 +656,11 @@ trans.cs = public/language/cs/success.json trans.da = public/language/da/success.json trans.de = public/language/de/success.json trans.el = public/language/el/success.json -trans.en_US = public/language/en_US/success.json -trans.en@pirate = public/language/en@pirate/success.json +trans.en_US = public/language/en-US/success.json +trans.en@pirate = public/language/en-x-pirate/success.json trans.es = public/language/es/success.json trans.et = public/language/et/success.json -trans.fa_IR = public/language/fa_IR/success.json +trans.fa_IR = public/language/fa-IR/success.json trans.fi = public/language/fi/success.json trans.fr = public/language/fr/success.json trans.gl = public/language/gl/success.json @@ -675,7 +675,7 @@ trans.ms = public/language/ms/success.json trans.nb = public/language/nb/success.json trans.nl = public/language/nl/success.json trans.pl = public/language/pl/success.json -trans.pt_BR = public/language/pt_BR/success.json +trans.pt_BR = public/language/pt-BR/success.json trans.ru = public/language/ru/success.json trans.ro = public/language/ro/success.json trans.rw = public/language/rw/success.json @@ -687,13 +687,13 @@ trans.sv = public/language/sv/success.json trans.th = public/language/th/success.json trans.tr = public/language/tr/success.json trans.vi = public/language/vi/success.json -trans.zh_CN = public/language/zh_CN/success.json -trans.zh_TW = public/language/zh_TW/success.json +trans.zh_CN = public/language/zh-CN/success.json +trans.zh_TW = public/language/zh-TW/success.json type = KEYVALUEJSON [nodebb.error] file_filter = public/language//error.json -source_file = public/language/en_GB/error.json +source_file = public/language/en-GB/error.json source_lang = en_GB trans.ar = public/language/ar/error.json trans.bn = public/language/bn/error.json @@ -702,11 +702,11 @@ trans.cs = public/language/cs/error.json trans.da = public/language/da/error.json trans.de = public/language/de/error.json trans.el = public/language/el/error.json -trans.en_US = public/language/en_US/error.json -trans.en@pirate = public/language/en@pirate/error.json +trans.en_US = public/language/en-US/error.json +trans.en@pirate = public/language/en-x-pirate/error.json trans.es = public/language/es/error.json trans.et = public/language/et/error.json -trans.fa_IR = public/language/fa_IR/error.json +trans.fa_IR = public/language/fa-IR/error.json trans.fi = public/language/fi/error.json trans.fr = public/language/fr/error.json trans.gl = public/language/gl/error.json @@ -721,7 +721,7 @@ trans.ms = public/language/ms/error.json trans.nb = public/language/nb/error.json trans.nl = public/language/nl/error.json trans.pl = public/language/pl/error.json -trans.pt_BR = public/language/pt_BR/error.json +trans.pt_BR = public/language/pt-BR/error.json trans.ru = public/language/ru/error.json trans.ro = public/language/ro/error.json trans.rw = public/language/rw/error.json @@ -733,13 +733,13 @@ trans.sv = public/language/sv/error.json trans.th = public/language/th/error.json trans.tr = public/language/tr/error.json trans.vi = public/language/vi/error.json -trans.zh_CN = public/language/zh_CN/error.json -trans.zh_TW = public/language/zh_TW/error.json +trans.zh_CN = public/language/zh-CN/error.json +trans.zh_TW = public/language/zh-TW/error.json type = KEYVALUEJSON [nodebb.tags] file_filter = public/language//tags.json -source_file = public/language/en_GB/tags.json +source_file = public/language/en-GB/tags.json source_lang = en_GB trans.ar = public/language/ar/tags.json trans.bn = public/language/bn/tags.json @@ -748,11 +748,11 @@ trans.cs = public/language/cs/tags.json trans.da = public/language/da/tags.json trans.de = public/language/de/tags.json trans.el = public/language/el/tags.json -trans.en_US = public/language/en_US/tags.json -trans.en@pirate = public/language/en@pirate/tags.json +trans.en_US = public/language/en-US/tags.json +trans.en@pirate = public/language/en-x-pirate/tags.json trans.es = public/language/es/tags.json trans.et = public/language/et/tags.json -trans.fa_IR = public/language/fa_IR/tags.json +trans.fa_IR = public/language/fa-IR/tags.json trans.fi = public/language/fi/tags.json trans.fr = public/language/fr/tags.json trans.gl = public/language/gl/tags.json @@ -767,7 +767,7 @@ trans.ms = public/language/ms/tags.json trans.nb = public/language/nb/tags.json trans.nl = public/language/nl/tags.json trans.pl = public/language/pl/tags.json -trans.pt_BR = public/language/pt_BR/tags.json +trans.pt_BR = public/language/pt-BR/tags.json trans.ru = public/language/ru/tags.json trans.ro = public/language/ro/tags.json trans.rw = public/language/rw/tags.json @@ -779,13 +779,13 @@ trans.sv = public/language/sv/tags.json trans.th = public/language/th/tags.json trans.tr = public/language/tr/tags.json trans.vi = public/language/vi/tags.json -trans.zh_CN = public/language/zh_CN/tags.json -trans.zh_TW = public/language/zh_TW/tags.json +trans.zh_CN = public/language/zh-CN/tags.json +trans.zh_TW = public/language/zh-TW/tags.json type = KEYVALUEJSON [nodebb.email] file_filter = public/language//email.json -source_file = public/language/en_GB/email.json +source_file = public/language/en-GB/email.json source_lang = en_GB trans.ar = public/language/ar/email.json trans.bn = public/language/bn/email.json @@ -794,11 +794,11 @@ trans.cs = public/language/cs/email.json trans.da = public/language/da/email.json trans.de = public/language/de/email.json trans.el = public/language/el/email.json -trans.en_US = public/language/en_US/email.json -trans.en@pirate = public/language/en@pirate/email.json +trans.en_US = public/language/en-US/email.json +trans.en@pirate = public/language/en-x-pirate/email.json trans.es = public/language/es/email.json trans.et = public/language/et/email.json -trans.fa_IR = public/language/fa_IR/email.json +trans.fa_IR = public/language/fa-IR/email.json trans.fi = public/language/fi/email.json trans.fr = public/language/fr/email.json trans.gl = public/language/gl/email.json @@ -813,7 +813,7 @@ trans.ms = public/language/ms/email.json trans.nb = public/language/nb/email.json trans.nl = public/language/nl/email.json trans.pl = public/language/pl/email.json -trans.pt_BR = public/language/pt_BR/email.json +trans.pt_BR = public/language/pt-BR/email.json trans.ru = public/language/ru/email.json trans.ro = public/language/ro/email.json trans.rw = public/language/rw/email.json @@ -825,13 +825,13 @@ trans.sv = public/language/sv/email.json trans.th = public/language/th/email.json trans.tr = public/language/tr/email.json trans.vi = public/language/vi/email.json -trans.zh_CN = public/language/zh_CN/email.json -trans.zh_TW = public/language/zh_TW/email.json +trans.zh_CN = public/language/zh-CN/email.json +trans.zh_TW = public/language/zh-TW/email.json type = KEYVALUEJSON [nodebb.search] file_filter = public/language//search.json -source_file = public/language/en_GB/search.json +source_file = public/language/en-GB/search.json source_lang = en_GB trans.ar = public/language/ar/search.json trans.bn = public/language/bn/search.json @@ -840,11 +840,11 @@ trans.cs = public/language/cs/search.json trans.da = public/language/da/search.json trans.de = public/language/de/search.json trans.el = public/language/el/search.json -trans.en_US = public/language/en_US/search.json -trans.en@pirate = public/language/en@pirate/search.json +trans.en_US = public/language/en-US/search.json +trans.en@pirate = public/language/en-x-pirate/search.json trans.es = public/language/es/search.json trans.et = public/language/et/search.json -trans.fa_IR = public/language/fa_IR/search.json +trans.fa_IR = public/language/fa-IR/search.json trans.fi = public/language/fi/search.json trans.fr = public/language/fr/search.json trans.gl = public/language/gl/search.json @@ -859,7 +859,7 @@ trans.ms = public/language/ms/search.json trans.nb = public/language/nb/search.json trans.nl = public/language/nl/search.json trans.pl = public/language/pl/search.json -trans.pt_BR = public/language/pt_BR/search.json +trans.pt_BR = public/language/pt-BR/search.json trans.ru = public/language/ru/search.json trans.ro = public/language/ro/search.json trans.rw = public/language/rw/search.json @@ -871,13 +871,13 @@ trans.sv = public/language/sv/search.json trans.th = public/language/th/search.json trans.tr = public/language/tr/search.json trans.vi = public/language/vi/search.json -trans.zh_CN = public/language/zh_CN/search.json -trans.zh_TW = public/language/zh_TW/search.json +trans.zh_CN = public/language/zh-CN/search.json +trans.zh_TW = public/language/zh-TW/search.json type = KEYVALUEJSON [nodebb.groups] file_filter = public/language//groups.json -source_file = public/language/en_GB/groups.json +source_file = public/language/en-GB/groups.json source_lang = en_GB trans.ar = public/language/ar/groups.json trans.bn = public/language/bn/groups.json @@ -886,11 +886,11 @@ trans.cs = public/language/cs/groups.json trans.da = public/language/da/groups.json trans.de = public/language/de/groups.json trans.el = public/language/el/groups.json -trans.en_US = public/language/en_US/groups.json -trans.en@pirate = public/language/en@pirate/groups.json +trans.en_US = public/language/en-US/groups.json +trans.en@pirate = public/language/en-x-pirate/groups.json trans.es = public/language/es/groups.json trans.et = public/language/et/groups.json -trans.fa_IR = public/language/fa_IR/groups.json +trans.fa_IR = public/language/fa-IR/groups.json trans.fi = public/language/fi/groups.json trans.fr = public/language/fr/groups.json trans.gl = public/language/gl/groups.json @@ -905,7 +905,7 @@ trans.ms = public/language/ms/groups.json trans.nb = public/language/nb/groups.json trans.nl = public/language/nl/groups.json trans.pl = public/language/pl/groups.json -trans.pt_BR = public/language/pt_BR/groups.json +trans.pt_BR = public/language/pt-BR/groups.json trans.ru = public/language/ru/groups.json trans.ro = public/language/ro/groups.json trans.rw = public/language/rw/groups.json @@ -917,13 +917,13 @@ trans.sv = public/language/sv/groups.json trans.th = public/language/th/groups.json trans.tr = public/language/tr/groups.json trans.vi = public/language/vi/groups.json -trans.zh_CN = public/language/zh_CN/groups.json -trans.zh_TW = public/language/zh_TW/groups.json +trans.zh_CN = public/language/zh-CN/groups.json +trans.zh_TW = public/language/zh-TW/groups.json type = KEYVALUEJSON [nodebb.uploads] file_filter = public/language//uploads.json -source_file = public/language/en_GB/uploads.json +source_file = public/language/en-GB/uploads.json source_lang = en_GB trans.ar = public/language/ar/uploads.json trans.bn = public/language/bn/uploads.json @@ -932,11 +932,11 @@ trans.cs = public/language/cs/uploads.json trans.da = public/language/da/uploads.json trans.de = public/language/de/uploads.json trans.el = public/language/el/uploads.json -trans.en_US = public/language/en_US/uploads.json -trans.en@pirate = public/language/en@pirate/uploads.json +trans.en_US = public/language/en-US/uploads.json +trans.en@pirate = public/language/en-x-pirate/uploads.json trans.es = public/language/es/uploads.json trans.et = public/language/et/uploads.json -trans.fa_IR = public/language/fa_IR/uploads.json +trans.fa_IR = public/language/fa-IR/uploads.json trans.fi = public/language/fi/uploads.json trans.fr = public/language/fr/uploads.json trans.gl = public/language/gl/uploads.json @@ -951,7 +951,7 @@ trans.ms = public/language/ms/uploads.json trans.nb = public/language/nb/uploads.json trans.nl = public/language/nl/uploads.json trans.pl = public/language/pl/uploads.json -trans.pt_BR = public/language/pt_BR/uploads.json +trans.pt_BR = public/language/pt-BR/uploads.json trans.ru = public/language/ru/uploads.json trans.ro = public/language/ro/uploads.json trans.rw = public/language/rw/uploads.json @@ -963,6 +963,6 @@ trans.sv = public/language/sv/uploads.json trans.th = public/language/th/uploads.json trans.tr = public/language/tr/uploads.json trans.vi = public/language/vi/uploads.json -trans.zh_CN = public/language/zh_CN/uploads.json -trans.zh_TW = public/language/zh_TW/uploads.json +trans.zh_CN = public/language/zh-CN/uploads.json +trans.zh_TW = public/language/zh-TW/uploads.json type = KEYVALUEJSON \ No newline at end of file diff --git a/public/language/en_GB/category.json b/public/language/en-GB/category.json similarity index 100% rename from public/language/en_GB/category.json rename to public/language/en-GB/category.json diff --git a/public/language/en_GB/email.json b/public/language/en-GB/email.json similarity index 100% rename from public/language/en_GB/email.json rename to public/language/en-GB/email.json diff --git a/public/language/en_GB/error.json b/public/language/en-GB/error.json similarity index 100% rename from public/language/en_GB/error.json rename to public/language/en-GB/error.json diff --git a/public/language/en_GB/global.json b/public/language/en-GB/global.json similarity index 100% rename from public/language/en_GB/global.json rename to public/language/en-GB/global.json diff --git a/public/language/en_GB/groups.json b/public/language/en-GB/groups.json similarity index 100% rename from public/language/en_GB/groups.json rename to public/language/en-GB/groups.json diff --git a/public/language/en_GB/language.json b/public/language/en-GB/language.json similarity index 77% rename from public/language/en_GB/language.json rename to public/language/en-GB/language.json index 41d8e9a6c2..dab8ef1141 100644 --- a/public/language/en_GB/language.json +++ b/public/language/en-GB/language.json @@ -1,5 +1,5 @@ { "name": "English (United Kingdom/Canada)", - "code": "en_GB", + "code": "en-GB", "dir": "ltr" } \ No newline at end of file diff --git a/public/language/en_GB/login.json b/public/language/en-GB/login.json similarity index 100% rename from public/language/en_GB/login.json rename to public/language/en-GB/login.json diff --git a/public/language/en_GB/modules.json b/public/language/en-GB/modules.json similarity index 100% rename from public/language/en_GB/modules.json rename to public/language/en-GB/modules.json diff --git a/public/language/en_GB/notifications.json b/public/language/en-GB/notifications.json similarity index 100% rename from public/language/en_GB/notifications.json rename to public/language/en-GB/notifications.json diff --git a/public/language/en_GB/pages.json b/public/language/en-GB/pages.json similarity index 100% rename from public/language/en_GB/pages.json rename to public/language/en-GB/pages.json diff --git a/public/language/en_GB/recent.json b/public/language/en-GB/recent.json similarity index 100% rename from public/language/en_GB/recent.json rename to public/language/en-GB/recent.json diff --git a/public/language/en_GB/register.json b/public/language/en-GB/register.json similarity index 100% rename from public/language/en_GB/register.json rename to public/language/en-GB/register.json diff --git a/public/language/en_GB/reset_password.json b/public/language/en-GB/reset_password.json similarity index 100% rename from public/language/en_GB/reset_password.json rename to public/language/en-GB/reset_password.json diff --git a/public/language/en_GB/search.json b/public/language/en-GB/search.json similarity index 100% rename from public/language/en_GB/search.json rename to public/language/en-GB/search.json diff --git a/public/language/en_GB/success.json b/public/language/en-GB/success.json similarity index 100% rename from public/language/en_GB/success.json rename to public/language/en-GB/success.json diff --git a/public/language/en_GB/tags.json b/public/language/en-GB/tags.json similarity index 100% rename from public/language/en_GB/tags.json rename to public/language/en-GB/tags.json diff --git a/public/language/en_GB/topic.json b/public/language/en-GB/topic.json similarity index 100% rename from public/language/en_GB/topic.json rename to public/language/en-GB/topic.json diff --git a/public/language/en_GB/unread.json b/public/language/en-GB/unread.json similarity index 100% rename from public/language/en_GB/unread.json rename to public/language/en-GB/unread.json diff --git a/public/language/en_GB/uploads.json b/public/language/en-GB/uploads.json similarity index 100% rename from public/language/en_GB/uploads.json rename to public/language/en-GB/uploads.json diff --git a/public/language/en_GB/user.json b/public/language/en-GB/user.json similarity index 100% rename from public/language/en_GB/user.json rename to public/language/en-GB/user.json diff --git a/public/language/en_GB/users.json b/public/language/en-GB/users.json similarity index 100% rename from public/language/en_GB/users.json rename to public/language/en-GB/users.json diff --git a/public/language/en_US/category.json b/public/language/en-US/category.json similarity index 100% rename from public/language/en_US/category.json rename to public/language/en-US/category.json diff --git a/public/language/en_US/email.json b/public/language/en-US/email.json similarity index 100% rename from public/language/en_US/email.json rename to public/language/en-US/email.json diff --git a/public/language/en@pirate/error.json b/public/language/en-US/error.json similarity index 100% rename from public/language/en@pirate/error.json rename to public/language/en-US/error.json diff --git a/public/language/en_US/global.json b/public/language/en-US/global.json similarity index 100% rename from public/language/en_US/global.json rename to public/language/en-US/global.json diff --git a/public/language/en_US/groups.json b/public/language/en-US/groups.json similarity index 100% rename from public/language/en_US/groups.json rename to public/language/en-US/groups.json diff --git a/public/language/en_US/language.json b/public/language/en-US/language.json similarity index 73% rename from public/language/en_US/language.json rename to public/language/en-US/language.json index 64fa5738f6..0967664491 100644 --- a/public/language/en_US/language.json +++ b/public/language/en-US/language.json @@ -1,5 +1,5 @@ { "name": "English (United States)", - "code": "en_US", + "code": "en-US", "dir": "ltr" } \ No newline at end of file diff --git a/public/language/en_US/login.json b/public/language/en-US/login.json similarity index 100% rename from public/language/en_US/login.json rename to public/language/en-US/login.json diff --git a/public/language/en_US/modules.json b/public/language/en-US/modules.json similarity index 100% rename from public/language/en_US/modules.json rename to public/language/en-US/modules.json diff --git a/public/language/en_US/notifications.json b/public/language/en-US/notifications.json similarity index 100% rename from public/language/en_US/notifications.json rename to public/language/en-US/notifications.json diff --git a/public/language/en@pirate/pages.json b/public/language/en-US/pages.json similarity index 100% rename from public/language/en@pirate/pages.json rename to public/language/en-US/pages.json diff --git a/public/language/en_US/recent.json b/public/language/en-US/recent.json similarity index 100% rename from public/language/en_US/recent.json rename to public/language/en-US/recent.json diff --git a/public/language/en_US/register.json b/public/language/en-US/register.json similarity index 100% rename from public/language/en_US/register.json rename to public/language/en-US/register.json diff --git a/public/language/en@pirate/reset_password.json b/public/language/en-US/reset_password.json similarity index 100% rename from public/language/en@pirate/reset_password.json rename to public/language/en-US/reset_password.json diff --git a/public/language/en@pirate/search.json b/public/language/en-US/search.json similarity index 100% rename from public/language/en@pirate/search.json rename to public/language/en-US/search.json diff --git a/public/language/en@pirate/success.json b/public/language/en-US/success.json similarity index 100% rename from public/language/en@pirate/success.json rename to public/language/en-US/success.json diff --git a/public/language/en@pirate/tags.json b/public/language/en-US/tags.json similarity index 100% rename from public/language/en@pirate/tags.json rename to public/language/en-US/tags.json diff --git a/public/language/en@pirate/topic.json b/public/language/en-US/topic.json similarity index 100% rename from public/language/en@pirate/topic.json rename to public/language/en-US/topic.json diff --git a/public/language/en_US/unread.json b/public/language/en-US/unread.json similarity index 100% rename from public/language/en_US/unread.json rename to public/language/en-US/unread.json diff --git a/public/language/en_US/uploads.json b/public/language/en-US/uploads.json similarity index 100% rename from public/language/en_US/uploads.json rename to public/language/en-US/uploads.json diff --git a/public/language/en_US/user.json b/public/language/en-US/user.json similarity index 100% rename from public/language/en_US/user.json rename to public/language/en-US/user.json diff --git a/public/language/en_US/users.json b/public/language/en-US/users.json similarity index 100% rename from public/language/en_US/users.json rename to public/language/en-US/users.json diff --git a/public/language/en@pirate/category.json b/public/language/en-x-pirate/category.json similarity index 100% rename from public/language/en@pirate/category.json rename to public/language/en-x-pirate/category.json diff --git a/public/language/en@pirate/email.json b/public/language/en-x-pirate/email.json similarity index 100% rename from public/language/en@pirate/email.json rename to public/language/en-x-pirate/email.json diff --git a/public/language/en_US/error.json b/public/language/en-x-pirate/error.json similarity index 100% rename from public/language/en_US/error.json rename to public/language/en-x-pirate/error.json diff --git a/public/language/en@pirate/global.json b/public/language/en-x-pirate/global.json similarity index 100% rename from public/language/en@pirate/global.json rename to public/language/en-x-pirate/global.json diff --git a/public/language/en@pirate/groups.json b/public/language/en-x-pirate/groups.json similarity index 100% rename from public/language/en@pirate/groups.json rename to public/language/en-x-pirate/groups.json diff --git a/public/language/en@pirate/language.json b/public/language/en-x-pirate/language.json similarity index 65% rename from public/language/en@pirate/language.json rename to public/language/en-x-pirate/language.json index 214c4b0c2d..34b9317fb5 100644 --- a/public/language/en@pirate/language.json +++ b/public/language/en-x-pirate/language.json @@ -1,5 +1,5 @@ { "name": "English (Pirate)", - "code": "en@pirate", + "code": "en-x-pirate", "dir": "ltr" } \ No newline at end of file diff --git a/public/language/en@pirate/login.json b/public/language/en-x-pirate/login.json similarity index 100% rename from public/language/en@pirate/login.json rename to public/language/en-x-pirate/login.json diff --git a/public/language/en@pirate/modules.json b/public/language/en-x-pirate/modules.json similarity index 100% rename from public/language/en@pirate/modules.json rename to public/language/en-x-pirate/modules.json diff --git a/public/language/en@pirate/notifications.json b/public/language/en-x-pirate/notifications.json similarity index 100% rename from public/language/en@pirate/notifications.json rename to public/language/en-x-pirate/notifications.json diff --git a/public/language/en_US/pages.json b/public/language/en-x-pirate/pages.json similarity index 100% rename from public/language/en_US/pages.json rename to public/language/en-x-pirate/pages.json diff --git a/public/language/en@pirate/recent.json b/public/language/en-x-pirate/recent.json similarity index 100% rename from public/language/en@pirate/recent.json rename to public/language/en-x-pirate/recent.json diff --git a/public/language/en@pirate/register.json b/public/language/en-x-pirate/register.json similarity index 100% rename from public/language/en@pirate/register.json rename to public/language/en-x-pirate/register.json diff --git a/public/language/en_US/reset_password.json b/public/language/en-x-pirate/reset_password.json similarity index 100% rename from public/language/en_US/reset_password.json rename to public/language/en-x-pirate/reset_password.json diff --git a/public/language/en_US/search.json b/public/language/en-x-pirate/search.json similarity index 100% rename from public/language/en_US/search.json rename to public/language/en-x-pirate/search.json diff --git a/public/language/en_US/success.json b/public/language/en-x-pirate/success.json similarity index 100% rename from public/language/en_US/success.json rename to public/language/en-x-pirate/success.json diff --git a/public/language/en_US/tags.json b/public/language/en-x-pirate/tags.json similarity index 100% rename from public/language/en_US/tags.json rename to public/language/en-x-pirate/tags.json diff --git a/public/language/en_US/topic.json b/public/language/en-x-pirate/topic.json similarity index 100% rename from public/language/en_US/topic.json rename to public/language/en-x-pirate/topic.json diff --git a/public/language/en@pirate/unread.json b/public/language/en-x-pirate/unread.json similarity index 100% rename from public/language/en@pirate/unread.json rename to public/language/en-x-pirate/unread.json diff --git a/public/language/en@pirate/uploads.json b/public/language/en-x-pirate/uploads.json similarity index 100% rename from public/language/en@pirate/uploads.json rename to public/language/en-x-pirate/uploads.json diff --git a/public/language/en@pirate/user.json b/public/language/en-x-pirate/user.json similarity index 100% rename from public/language/en@pirate/user.json rename to public/language/en-x-pirate/user.json diff --git a/public/language/en@pirate/users.json b/public/language/en-x-pirate/users.json similarity index 100% rename from public/language/en@pirate/users.json rename to public/language/en-x-pirate/users.json diff --git a/public/language/fa_IR/category.json b/public/language/fa-IR/category.json similarity index 100% rename from public/language/fa_IR/category.json rename to public/language/fa-IR/category.json diff --git a/public/language/fa_IR/email.json b/public/language/fa-IR/email.json similarity index 100% rename from public/language/fa_IR/email.json rename to public/language/fa-IR/email.json diff --git a/public/language/fa_IR/error.json b/public/language/fa-IR/error.json similarity index 100% rename from public/language/fa_IR/error.json rename to public/language/fa-IR/error.json diff --git a/public/language/fa_IR/global.json b/public/language/fa-IR/global.json similarity index 100% rename from public/language/fa_IR/global.json rename to public/language/fa-IR/global.json diff --git a/public/language/fa_IR/groups.json b/public/language/fa-IR/groups.json similarity index 100% rename from public/language/fa_IR/groups.json rename to public/language/fa-IR/groups.json diff --git a/public/language/fa_IR/language.json b/public/language/fa-IR/language.json similarity index 68% rename from public/language/fa_IR/language.json rename to public/language/fa-IR/language.json index c387007d53..53117369f8 100644 --- a/public/language/fa_IR/language.json +++ b/public/language/fa-IR/language.json @@ -1,5 +1,5 @@ { "name": "فارسی", - "code": "fa_IR", + "code": "fa-IR", "dir": "rtl" } \ No newline at end of file diff --git a/public/language/fa_IR/login.json b/public/language/fa-IR/login.json similarity index 100% rename from public/language/fa_IR/login.json rename to public/language/fa-IR/login.json diff --git a/public/language/fa_IR/modules.json b/public/language/fa-IR/modules.json similarity index 100% rename from public/language/fa_IR/modules.json rename to public/language/fa-IR/modules.json diff --git a/public/language/fa_IR/notifications.json b/public/language/fa-IR/notifications.json similarity index 100% rename from public/language/fa_IR/notifications.json rename to public/language/fa-IR/notifications.json diff --git a/public/language/fa_IR/pages.json b/public/language/fa-IR/pages.json similarity index 100% rename from public/language/fa_IR/pages.json rename to public/language/fa-IR/pages.json diff --git a/public/language/fa_IR/recent.json b/public/language/fa-IR/recent.json similarity index 100% rename from public/language/fa_IR/recent.json rename to public/language/fa-IR/recent.json diff --git a/public/language/fa_IR/register.json b/public/language/fa-IR/register.json similarity index 100% rename from public/language/fa_IR/register.json rename to public/language/fa-IR/register.json diff --git a/public/language/fa_IR/reset_password.json b/public/language/fa-IR/reset_password.json similarity index 100% rename from public/language/fa_IR/reset_password.json rename to public/language/fa-IR/reset_password.json diff --git a/public/language/fa_IR/search.json b/public/language/fa-IR/search.json similarity index 100% rename from public/language/fa_IR/search.json rename to public/language/fa-IR/search.json diff --git a/public/language/fa_IR/success.json b/public/language/fa-IR/success.json similarity index 100% rename from public/language/fa_IR/success.json rename to public/language/fa-IR/success.json diff --git a/public/language/fa_IR/tags.json b/public/language/fa-IR/tags.json similarity index 100% rename from public/language/fa_IR/tags.json rename to public/language/fa-IR/tags.json diff --git a/public/language/fa_IR/topic.json b/public/language/fa-IR/topic.json similarity index 100% rename from public/language/fa_IR/topic.json rename to public/language/fa-IR/topic.json diff --git a/public/language/fa_IR/unread.json b/public/language/fa-IR/unread.json similarity index 100% rename from public/language/fa_IR/unread.json rename to public/language/fa-IR/unread.json diff --git a/public/language/fa_IR/uploads.json b/public/language/fa-IR/uploads.json similarity index 100% rename from public/language/fa_IR/uploads.json rename to public/language/fa-IR/uploads.json diff --git a/public/language/fa_IR/user.json b/public/language/fa-IR/user.json similarity index 100% rename from public/language/fa_IR/user.json rename to public/language/fa-IR/user.json diff --git a/public/language/fa_IR/users.json b/public/language/fa-IR/users.json similarity index 100% rename from public/language/fa_IR/users.json rename to public/language/fa-IR/users.json diff --git a/public/language/pt_BR/category.json b/public/language/pt-BR/category.json similarity index 100% rename from public/language/pt_BR/category.json rename to public/language/pt-BR/category.json diff --git a/public/language/pt_BR/email.json b/public/language/pt-BR/email.json similarity index 100% rename from public/language/pt_BR/email.json rename to public/language/pt-BR/email.json diff --git a/public/language/pt_BR/error.json b/public/language/pt-BR/error.json similarity index 100% rename from public/language/pt_BR/error.json rename to public/language/pt-BR/error.json diff --git a/public/language/pt_BR/global.json b/public/language/pt-BR/global.json similarity index 100% rename from public/language/pt_BR/global.json rename to public/language/pt-BR/global.json diff --git a/public/language/pt_BR/groups.json b/public/language/pt-BR/groups.json similarity index 100% rename from public/language/pt_BR/groups.json rename to public/language/pt-BR/groups.json diff --git a/public/language/pt_BR/language.json b/public/language/pt-BR/language.json similarity index 72% rename from public/language/pt_BR/language.json rename to public/language/pt-BR/language.json index 5a353a4610..a506508cc6 100644 --- a/public/language/pt_BR/language.json +++ b/public/language/pt-BR/language.json @@ -1,5 +1,5 @@ { "name": "Português (Brasil)", - "code": "pt_BR", + "code": "pt-BR", "dir": "ltr" } \ No newline at end of file diff --git a/public/language/pt_BR/login.json b/public/language/pt-BR/login.json similarity index 100% rename from public/language/pt_BR/login.json rename to public/language/pt-BR/login.json diff --git a/public/language/pt_BR/modules.json b/public/language/pt-BR/modules.json similarity index 100% rename from public/language/pt_BR/modules.json rename to public/language/pt-BR/modules.json diff --git a/public/language/pt_BR/notifications.json b/public/language/pt-BR/notifications.json similarity index 100% rename from public/language/pt_BR/notifications.json rename to public/language/pt-BR/notifications.json diff --git a/public/language/pt_BR/pages.json b/public/language/pt-BR/pages.json similarity index 100% rename from public/language/pt_BR/pages.json rename to public/language/pt-BR/pages.json diff --git a/public/language/pt_BR/recent.json b/public/language/pt-BR/recent.json similarity index 100% rename from public/language/pt_BR/recent.json rename to public/language/pt-BR/recent.json diff --git a/public/language/pt_BR/register.json b/public/language/pt-BR/register.json similarity index 100% rename from public/language/pt_BR/register.json rename to public/language/pt-BR/register.json diff --git a/public/language/pt_BR/reset_password.json b/public/language/pt-BR/reset_password.json similarity index 100% rename from public/language/pt_BR/reset_password.json rename to public/language/pt-BR/reset_password.json diff --git a/public/language/pt_BR/search.json b/public/language/pt-BR/search.json similarity index 100% rename from public/language/pt_BR/search.json rename to public/language/pt-BR/search.json diff --git a/public/language/pt_BR/success.json b/public/language/pt-BR/success.json similarity index 100% rename from public/language/pt_BR/success.json rename to public/language/pt-BR/success.json diff --git a/public/language/pt_BR/tags.json b/public/language/pt-BR/tags.json similarity index 100% rename from public/language/pt_BR/tags.json rename to public/language/pt-BR/tags.json diff --git a/public/language/pt_BR/topic.json b/public/language/pt-BR/topic.json similarity index 100% rename from public/language/pt_BR/topic.json rename to public/language/pt-BR/topic.json diff --git a/public/language/pt_BR/unread.json b/public/language/pt-BR/unread.json similarity index 100% rename from public/language/pt_BR/unread.json rename to public/language/pt-BR/unread.json diff --git a/public/language/pt_BR/uploads.json b/public/language/pt-BR/uploads.json similarity index 100% rename from public/language/pt_BR/uploads.json rename to public/language/pt-BR/uploads.json diff --git a/public/language/pt_BR/user.json b/public/language/pt-BR/user.json similarity index 100% rename from public/language/pt_BR/user.json rename to public/language/pt-BR/user.json diff --git a/public/language/pt_BR/users.json b/public/language/pt-BR/users.json similarity index 100% rename from public/language/pt_BR/users.json rename to public/language/pt-BR/users.json diff --git a/public/language/zh_CN/category.json b/public/language/zh-CN/category.json similarity index 100% rename from public/language/zh_CN/category.json rename to public/language/zh-CN/category.json diff --git a/public/language/zh_CN/email.json b/public/language/zh-CN/email.json similarity index 100% rename from public/language/zh_CN/email.json rename to public/language/zh-CN/email.json diff --git a/public/language/zh_CN/error.json b/public/language/zh-CN/error.json similarity index 100% rename from public/language/zh_CN/error.json rename to public/language/zh-CN/error.json diff --git a/public/language/zh_CN/global.json b/public/language/zh-CN/global.json similarity index 100% rename from public/language/zh_CN/global.json rename to public/language/zh-CN/global.json diff --git a/public/language/zh_CN/groups.json b/public/language/zh-CN/groups.json similarity index 100% rename from public/language/zh_CN/groups.json rename to public/language/zh-CN/groups.json diff --git a/public/language/zh_CN/language.json b/public/language/zh-CN/language.json similarity index 69% rename from public/language/zh_CN/language.json rename to public/language/zh-CN/language.json index 282a107861..251bc4ef91 100644 --- a/public/language/zh_CN/language.json +++ b/public/language/zh-CN/language.json @@ -1,5 +1,5 @@ { "name": "简体中文", - "code": "zh_CN", + "code": "zh-CN", "dir": "ltr" } \ No newline at end of file diff --git a/public/language/zh_CN/login.json b/public/language/zh-CN/login.json similarity index 100% rename from public/language/zh_CN/login.json rename to public/language/zh-CN/login.json diff --git a/public/language/zh_CN/modules.json b/public/language/zh-CN/modules.json similarity index 100% rename from public/language/zh_CN/modules.json rename to public/language/zh-CN/modules.json diff --git a/public/language/zh_CN/notifications.json b/public/language/zh-CN/notifications.json similarity index 100% rename from public/language/zh_CN/notifications.json rename to public/language/zh-CN/notifications.json diff --git a/public/language/zh_CN/pages.json b/public/language/zh-CN/pages.json similarity index 100% rename from public/language/zh_CN/pages.json rename to public/language/zh-CN/pages.json diff --git a/public/language/zh_CN/recent.json b/public/language/zh-CN/recent.json similarity index 100% rename from public/language/zh_CN/recent.json rename to public/language/zh-CN/recent.json diff --git a/public/language/zh_CN/register.json b/public/language/zh-CN/register.json similarity index 100% rename from public/language/zh_CN/register.json rename to public/language/zh-CN/register.json diff --git a/public/language/zh_CN/reset_password.json b/public/language/zh-CN/reset_password.json similarity index 100% rename from public/language/zh_CN/reset_password.json rename to public/language/zh-CN/reset_password.json diff --git a/public/language/zh_CN/search.json b/public/language/zh-CN/search.json similarity index 100% rename from public/language/zh_CN/search.json rename to public/language/zh-CN/search.json diff --git a/public/language/zh_CN/success.json b/public/language/zh-CN/success.json similarity index 100% rename from public/language/zh_CN/success.json rename to public/language/zh-CN/success.json diff --git a/public/language/zh_CN/tags.json b/public/language/zh-CN/tags.json similarity index 100% rename from public/language/zh_CN/tags.json rename to public/language/zh-CN/tags.json diff --git a/public/language/zh_CN/topic.json b/public/language/zh-CN/topic.json similarity index 100% rename from public/language/zh_CN/topic.json rename to public/language/zh-CN/topic.json diff --git a/public/language/zh_CN/unread.json b/public/language/zh-CN/unread.json similarity index 100% rename from public/language/zh_CN/unread.json rename to public/language/zh-CN/unread.json diff --git a/public/language/zh_CN/uploads.json b/public/language/zh-CN/uploads.json similarity index 100% rename from public/language/zh_CN/uploads.json rename to public/language/zh-CN/uploads.json diff --git a/public/language/zh_CN/user.json b/public/language/zh-CN/user.json similarity index 100% rename from public/language/zh_CN/user.json rename to public/language/zh-CN/user.json diff --git a/public/language/zh_CN/users.json b/public/language/zh-CN/users.json similarity index 100% rename from public/language/zh_CN/users.json rename to public/language/zh-CN/users.json diff --git a/public/language/zh_TW/category.json b/public/language/zh-TW/category.json similarity index 100% rename from public/language/zh_TW/category.json rename to public/language/zh-TW/category.json diff --git a/public/language/zh_TW/email.json b/public/language/zh-TW/email.json similarity index 100% rename from public/language/zh_TW/email.json rename to public/language/zh-TW/email.json diff --git a/public/language/zh_TW/error.json b/public/language/zh-TW/error.json similarity index 100% rename from public/language/zh_TW/error.json rename to public/language/zh-TW/error.json diff --git a/public/language/zh_TW/global.json b/public/language/zh-TW/global.json similarity index 100% rename from public/language/zh_TW/global.json rename to public/language/zh-TW/global.json diff --git a/public/language/zh_TW/groups.json b/public/language/zh-TW/groups.json similarity index 100% rename from public/language/zh_TW/groups.json rename to public/language/zh-TW/groups.json diff --git a/public/language/zh_TW/language.json b/public/language/zh-TW/language.json similarity index 69% rename from public/language/zh_TW/language.json rename to public/language/zh-TW/language.json index a27c0a9ef8..de9713d95a 100644 --- a/public/language/zh_TW/language.json +++ b/public/language/zh-TW/language.json @@ -1,5 +1,5 @@ { "name": "繁體中文", - "code": "zh_TW", + "code": "zh-TW", "dir": "ltr" } \ No newline at end of file diff --git a/public/language/zh_TW/login.json b/public/language/zh-TW/login.json similarity index 100% rename from public/language/zh_TW/login.json rename to public/language/zh-TW/login.json diff --git a/public/language/zh_TW/modules.json b/public/language/zh-TW/modules.json similarity index 100% rename from public/language/zh_TW/modules.json rename to public/language/zh-TW/modules.json diff --git a/public/language/zh_TW/notifications.json b/public/language/zh-TW/notifications.json similarity index 100% rename from public/language/zh_TW/notifications.json rename to public/language/zh-TW/notifications.json diff --git a/public/language/zh_TW/pages.json b/public/language/zh-TW/pages.json similarity index 100% rename from public/language/zh_TW/pages.json rename to public/language/zh-TW/pages.json diff --git a/public/language/zh_TW/recent.json b/public/language/zh-TW/recent.json similarity index 100% rename from public/language/zh_TW/recent.json rename to public/language/zh-TW/recent.json diff --git a/public/language/zh_TW/register.json b/public/language/zh-TW/register.json similarity index 100% rename from public/language/zh_TW/register.json rename to public/language/zh-TW/register.json diff --git a/public/language/zh_TW/reset_password.json b/public/language/zh-TW/reset_password.json similarity index 100% rename from public/language/zh_TW/reset_password.json rename to public/language/zh-TW/reset_password.json diff --git a/public/language/zh_TW/search.json b/public/language/zh-TW/search.json similarity index 100% rename from public/language/zh_TW/search.json rename to public/language/zh-TW/search.json diff --git a/public/language/zh_TW/success.json b/public/language/zh-TW/success.json similarity index 100% rename from public/language/zh_TW/success.json rename to public/language/zh-TW/success.json diff --git a/public/language/zh_TW/tags.json b/public/language/zh-TW/tags.json similarity index 100% rename from public/language/zh_TW/tags.json rename to public/language/zh-TW/tags.json diff --git a/public/language/zh_TW/topic.json b/public/language/zh-TW/topic.json similarity index 100% rename from public/language/zh_TW/topic.json rename to public/language/zh-TW/topic.json diff --git a/public/language/zh_TW/unread.json b/public/language/zh-TW/unread.json similarity index 100% rename from public/language/zh_TW/unread.json rename to public/language/zh-TW/unread.json diff --git a/public/language/zh_TW/uploads.json b/public/language/zh-TW/uploads.json similarity index 100% rename from public/language/zh_TW/uploads.json rename to public/language/zh-TW/uploads.json diff --git a/public/language/zh_TW/user.json b/public/language/zh-TW/user.json similarity index 100% rename from public/language/zh_TW/user.json rename to public/language/zh-TW/user.json diff --git a/public/language/zh_TW/users.json b/public/language/zh-TW/users.json similarity index 100% rename from public/language/zh_TW/users.json rename to public/language/zh-TW/users.json diff --git a/public/src/modules/translator.js b/public/src/modules/translator.js index fe377f987e..0771ab56a5 100644 --- a/public/src/modules/translator.js +++ b/public/src/modules/translator.js @@ -1,9 +1,9 @@ -/* global define, jQuery, config, RELATIVE_PATH, utils, window, Promise */ +/* global define, jQuery, config, utils, window, Promise */ (function (factory) { 'use strict'; - function loadClient(language, filename) { - return Promise.resolve(jQuery.getJSON(config.relative_path + '/language/' + language + '/' + (filename + '.json?v=' + config['cache-buster']))); + function loadClient(language, namespace) { + return Promise.resolve(jQuery.getJSON(config.relative_path + '/api/language/' + language + '/' + namespace)); } if (typeof define === 'function' && define.amd) { // AMD. Register as a named module @@ -16,9 +16,9 @@ require('promise-polyfill'); var languages = require('../../../src/languages'); - function loadServer(language, filename) { + function loadServer(language, namespace) { return new Promise(function (resolve, reject) { - languages.get(language, filename + '.json', function (err, data) { + languages.get(language, namespace, function (err, data) { if (err) { reject(err); } else { @@ -297,10 +297,10 @@ var lang; if (typeof window === 'object' && window.config && window.utils) { - lang = utils.params().lang || config.userLang || config.defaultLang || 'en_GB'; + lang = utils.params().lang || config.userLang || config.defaultLang || 'en-GB'; } else { var meta = require('../../../src/meta'); - lang = meta.config.defaultLang || 'en_GB'; + lang = meta.config.defaultLang || 'en-GB'; } return lang; @@ -308,7 +308,7 @@ /** * Create and cache a new Translator instance, or return a cached one - * @param {string} [language] - ('en_GB') Language string + * @param {string} [language] - ('en-GB') Language string * @returns {Translator} */ Translator.create = function create(language) { @@ -401,8 +401,8 @@ /** * Add translations to the cache */ - addTranslation: function addTranslation(language, filename, translation) { - Translator.create(language).getTranslation(filename).then(function (translations) { + addTranslation: function addTranslation(language, namespace, translation) { + Translator.create(language).getTranslation(namespace).then(function (translations) { assign(translations, translation); }); }, @@ -410,16 +410,16 @@ /** * Get the translations object */ - getTranslations: function getTranslations(language, filename, callback) { + getTranslations: function getTranslations(language, namespace, callback) { callback = callback || function () {}; - Translator.create(language).getTranslation(filename).then(callback); + Translator.create(language).getTranslation(namespace).then(callback); }, /** * Alias of getTranslations */ - load: function load(language, filename, callback) { - adaptor.getTranslations(language, filename, callback); + load: function load(language, namespace, callback) { + adaptor.getTranslations(language, namespace, callback); }, /** @@ -437,16 +437,16 @@ // and correct NodeBB language codes to timeago codes, if necessary var languageCode = void 0; switch (config.userLang) { - case 'en_GB': - case 'en_US': + case 'en-GB': + case 'en-US': languageCode = 'en'; break; - case 'fa_IR': + case 'fa-IR': languageCode = 'fa'; break; - case 'pt_BR': + case 'pt-BR': languageCode = 'pt-br'; break; @@ -454,25 +454,17 @@ languageCode = 'no'; break; - case 'zh_TW': - languageCode = 'zh-TW'; - break; - - case 'zh_CN': - languageCode = 'zh-CN'; - break; - default: languageCode = config.userLang; break; } - jQuery.getScript(RELATIVE_PATH + '/vendor/jquery/timeago/locales/jquery.timeago.' + languageCode + '.js').done(function () { + jQuery.getScript(config.relative_path + '/vendor/jquery/timeago/locales/jquery.timeago.' + languageCode + '.js').done(function () { jQuery('.timeago').timeago(); adaptor.timeagoShort = assign({}, jQuery.timeago.settings.strings); // Retrieve the shorthand timeago values as well - jQuery.getScript(RELATIVE_PATH + '/vendor/jquery/timeago/locales/jquery.timeago.' + languageCode + '-short.js').done(function () { + jQuery.getScript(config.relative_path + '/vendor/jquery/timeago/locales/jquery.timeago.' + languageCode + '-short.js').done(function () { // Switch back to long-form adaptor.toggleTimeagoShorthand(); }); diff --git a/src/controllers/admin/languages.js b/src/controllers/admin/languages.js index 292cd2a3b4..2b458d1508 100644 --- a/src/controllers/admin/languages.js +++ b/src/controllers/admin/languages.js @@ -13,7 +13,7 @@ languagesController.get = function (req, res, next) { } languages.forEach(function (language) { - language.selected = language.code === (meta.config.defaultLang || 'en_GB'); + language.selected = language.code === (meta.config.defaultLang || 'en-GB'); }); res.render('admin/general/languages', { diff --git a/src/controllers/api.js b/src/controllers/api.js index bc75a38aba..f5dcdfa54e 100644 --- a/src/controllers/api.js +++ b/src/controllers/api.js @@ -53,7 +53,7 @@ apiController.getConfig = function (req, res, next) { config.maximumFileSize = meta.config.maximumFileSize; config['theme:id'] = meta.config['theme:id']; config['theme:src'] = meta.config['theme:src']; - config.defaultLang = meta.config.defaultLang || 'en_GB'; + config.defaultLang = meta.config.defaultLang || 'en-GB'; config.userLang = req.query.lang ? validator.escape(String(req.query.lang)) : config.defaultLang; config.loggedIn = !!req.user; config['cache-buster'] = meta.config['cache-buster'] || ''; diff --git a/src/controllers/index.js b/src/controllers/index.js index a8cfa96d89..e6b0d3753c 100644 --- a/src/controllers/index.js +++ b/src/controllers/index.js @@ -351,7 +351,7 @@ Controllers.ping = function (req, res) { Controllers.handle404 = function (req, res) { var relativePath = nconf.get('relative_path'); - var isLanguage = new RegExp('^' + relativePath + '/language/.*/.*.json'); + var isLanguage = new RegExp('^' + relativePath + '/api/language/.*/.*'); var isClientScript = new RegExp('^' + relativePath + '\\/src\\/.+\\.js'); if (plugins.hasListeners('action:meta.override404')) { diff --git a/src/emailer.js b/src/emailer.js index 4196fbb333..1e66ce2c1a 100644 --- a/src/emailer.js +++ b/src/emailer.js @@ -73,7 +73,7 @@ var fallbackTransport; Emailer.sendToEmail = function (template, email, language, params, callback) { callback = callback || function () {}; - var lang = language || meta.config.defaultLang || 'en_GB'; + var lang = language || meta.config.defaultLang || 'en-GB'; async.waterfall([ function (next) { diff --git a/src/languages.js b/src/languages.js index 51def2f922..86563628b2 100644 --- a/src/languages.js +++ b/src/languages.js @@ -1,14 +1,14 @@ 'use strict'; -var fs = require('fs'), - path = require('path'), - async = require('async'), - LRU = require('lru-cache'), - _ = require('underscore'); +var fs = require('fs'); +var path = require('path'); +var async = require('async'); +var LRU = require('lru-cache'); var plugins = require('./plugins'); var Languages = {}; +var languagesPath = path.join(__dirname, '../public/language'); Languages.init = function (next) { if (Languages.hasOwnProperty('_cache')) { @@ -20,16 +20,16 @@ Languages.init = function (next) { next(); }; -Languages.get = function (code, key, callback) { - var combined = [code, key].join('/'); +Languages.get = function (language, namespace, callback) { + var langNamespace = language + '/' + namespace; - if (Languages._cache && Languages._cache.has(combined)) { - return callback(null, Languages._cache.get(combined)); + if (Languages._cache && Languages._cache.has(langNamespace)) { + return callback(null, Languages._cache.get(langNamespace)); } var languageData; - fs.readFile(path.join(__dirname, '../public/language/', code, key), { encoding: 'utf-8' }, function (err, data) { + fs.readFile(path.join(languagesPath, language, namespace + '.json'), { encoding: 'utf-8' }, function (err, data) { if (err && err.code !== 'ENOENT') { return callback(err); } @@ -41,12 +41,12 @@ Languages.get = function (code, key, callback) { languageData = {}; } - if (plugins.customLanguages.hasOwnProperty(combined)) { - _.extendOwn(languageData, plugins.customLanguages[combined]); + if (plugins.customLanguages.hasOwnProperty(langNamespace)) { + Object.assign(languageData, plugins.customLanguages[langNamespace]); } if (Languages._cache) { - Languages._cache.set(combined, languageData); + Languages._cache.set(langNamespace, languageData); } callback(null, languageData); @@ -54,8 +54,7 @@ Languages.get = function (code, key, callback) { }; Languages.list = function (callback) { - var languagesPath = path.join(__dirname, '../public/language'), - languages = []; + var languages = []; fs.readdir(languagesPath, function (err, files) { if (err) { diff --git a/src/middleware/header.js b/src/middleware/header.js index 53a20e33eb..c1b4175b5b 100644 --- a/src/middleware/header.js +++ b/src/middleware/header.js @@ -136,7 +136,7 @@ module.exports = function (middleware) { templateValues.useCustomJS = parseInt(meta.config.useCustomJS, 10) === 1; templateValues.customJS = templateValues.useCustomJS ? meta.config.customJS : ''; templateValues.maintenanceHeader = parseInt(meta.config.maintenanceMode, 10) === 1 && !results.isAdmin; - templateValues.defaultLang = meta.config.defaultLang || 'en_GB'; + templateValues.defaultLang = meta.config.defaultLang || 'en-GB'; templateValues.privateUserInfo = parseInt(meta.config.privateUserInfo, 10) === 1; templateValues.privateTagListing = parseInt(meta.config.privateTagListing, 10) === 1; diff --git a/src/middleware/index.js b/src/middleware/index.js index fdef19db32..7f55388804 100644 --- a/src/middleware/index.js +++ b/src/middleware/index.js @@ -159,17 +159,17 @@ middleware.applyBlacklist = function (req, res, next) { }); }; -middleware.processLanguages = function (req, res, next) { - var code = req.params.code; - var key = req.path.match(/[\w]+\.json/); +middleware.getTranslation = function (req, res, next) { + var language = req.params.language; + var namespace = req.params.namespace; - if (code && key) { - languages.get(code, key[0], function (err, language) { + if (language && namespace) { + languages.get(language, namespace, function (err, translations) { if (err) { return next(err); } - res.status(200).json(language); + res.status(200).json(translations); }); } else { res.status(404).json('{}'); diff --git a/src/middleware/maintenance.js b/src/middleware/maintenance.js index e274c295eb..5199fb9332 100644 --- a/src/middleware/maintenance.js +++ b/src/middleware/maintenance.js @@ -24,7 +24,7 @@ module.exports = function (middleware) { '^/templates/[\\w/]+.tpl', '^/api/login', '^/api/widgets/render', - '^/language/.+', + '^/api/language/.+', '^/uploads/system/site-logo.png' ]; diff --git a/src/middleware/render.js b/src/middleware/render.js index f9124971c0..399f81abbe 100644 --- a/src/middleware/render.js +++ b/src/middleware/render.js @@ -100,7 +100,7 @@ module.exports = function (middleware) { } function translate(str, req, res, next) { - var language = res.locals.config ? res.locals.config.userLang || 'en_GB' : 'en_GB'; + var language = res.locals.config && res.locals.config.userLang || 'en-GB'; language = req.query.lang ? validator.escape(String(req.query.lang)) : language; translator.translate(str, language, function (translated) { next(null, translator.unescape(translated)); diff --git a/src/plugins.js b/src/plugins.js index a132d6959a..8f9d0a3a45 100644 --- a/src/plugins.js +++ b/src/plugins.js @@ -12,6 +12,7 @@ var db = require('./database'); var utils = require('../public/src/utils'); var hotswap = require('./hotswap'); var file = require('./file'); +var languages = require('./languages'); var app; var middleware; @@ -87,13 +88,13 @@ var middleware; async.waterfall([ function (next) { // Build language code list - fs.readdir(path.join(__dirname, '../public/language'), function (err, directories) { + languages.list(function (err, languages) { if (err) { return next(err); } - Plugins.languageCodes = directories.filter(function (code) { - return code !== 'TODO'; + Plugins.languageCodes = languages.map(function (data) { + return data.code; }); next(); diff --git a/src/plugins/load.js b/src/plugins/load.js index 132863cbae..d5ddfa9dd2 100644 --- a/src/plugins/load.js +++ b/src/plugins/load.js @@ -261,6 +261,7 @@ module.exports = function (Plugins) { } var pathToFolder = path.join(__dirname, '../../node_modules/', pluginData.id, pluginData.languages); + var defaultLang = pluginData.defaultLang.replace('_', '-').replace('@', '-x-'); utils.walk(pathToFolder, function (err, languages) { if (err) { @@ -273,7 +274,9 @@ module.exports = function (Plugins) { return next(err); } var data; - var route = pathToLang.replace(pathToFolder + '/', ''); + var language = path.dirname(pathToLang).split(/[\/\\]/).pop().replace('_', '-').replace('@', '-x-'); + var namespace = path.basename(pathToLang, '.json'); + var langNamespace = language + '/' + namespace; try { data = JSON.parse(file.toString()); @@ -282,18 +285,15 @@ module.exports = function (Plugins) { return next(err); } - Plugins.customLanguages[route] = Plugins.customLanguages[route] || {}; - _.extendOwn(Plugins.customLanguages[route], data); + Plugins.customLanguages[langNamespace] = Plugins.customLanguages[langNamespace] || {}; + Object.assign(Plugins.customLanguages[langNamespace], data); - if (pluginData.defaultLang && pathToLang.endsWith(pluginData.defaultLang + '/' + path.basename(pathToLang))) { - Plugins.languageCodes.map(function (code) { - if (pluginData.defaultLang !== code) { - return code + '/' + path.basename(pathToLang); - } else { - return null; - } - }).filter(Boolean).forEach(function (key) { - Plugins.customLanguages[key] = _.defaults(Plugins.customLanguages[key] || {}, data); + if (defaultLang && defaultLang === language) { + Plugins.languageCodes.filter(function (lang) { + return defaultLang !== lang; + }).forEach(function (lang) { + var langNS = lang + '/' + namespace; + Plugins.customLanguages[langNS] = Object.assign(Plugins.customLanguages[langNS] || {}, data); }); } diff --git a/src/routes/index.js b/src/routes/index.js index d419f4ab57..f36ad1468a 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -144,7 +144,7 @@ module.exports = function (app, middleware, hotswapIds) { } app.use(middleware.privateUploads); - app.use(relativePath + '/language/:code', middleware.processLanguages); + app.use(relativePath + '/api/language/:language/:namespace', middleware.getTranslation); app.use(relativePath, express.static(path.join(__dirname, '../../', 'public'), { maxAge: app.enabled('cache') ? 5184000000 : 0 })); diff --git a/src/upgrade.js b/src/upgrade.js index 9aa66e8f22..06999b2da8 100644 --- a/src/upgrade.js +++ b/src/upgrade.js @@ -1,5 +1,7 @@ "use strict"; +/* globals define, console, require */ + var db = require('./database'), async = require('async'), winston = require('winston'), @@ -10,7 +12,7 @@ var db = require('./database'), schemaDate, thisSchemaDate, // IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema - latestSchema = Date.UTC(2016, 9, 14); + latestSchema = Date.UTC(2016, 10, 22); Upgrade.check = function (callback) { db.get('schemaDate', function (err, value) { @@ -946,6 +948,70 @@ Upgrade.upgrade = function (callback) { winston.info('[2016/10/14] Creating sorted sets for post replies - skipped!'); next(); } + }, + function (next) { + thisSchemaDate = Date.UTC(2016, 10, 22); + + if (schemaDate < thisSchemaDate) { + updatesMade = true; + winston.info('[2016/11/22] Update global and user language keys'); + + var user = require('./user'); + var meta = require('./meta'); + var batch = require('./batch'); + var newLanguage; + var i = 0; + var j = 0; + async.parallel([ + function(next) { + meta.configs.get('defaultLang', function(err, defaultLang) { + if (!defaultLang) { + return setImmediate(next); + } + + newLanguage = defaultLang.replace('_', '-').replace('@', '-x-'); + if (newLanguage !== defaultLang) { + meta.configs.set('defaultLang', newLanguage, next); + } else { + setImmediate(next); + } + }); + }, + function (next) { + batch.processSortedSet('users:joindate', function (ids, next) { + async.each(ids, function(uid, next) { + async.waterfall([ + async.apply(db.getObjectField, 'user:' + uid + ':settings', 'userLang'), + function(language, next) { + ++i; + if (!language) { + return setImmediate(next); + } + + newLanguage = language.replace('_', '-').replace('@', '-x-'); + if (newLanguage !== language) { + ++j; + user.setSetting(uid, 'userLang', newLanguage, next); + } else { + setImmediate(next); + } + } + ], next); + }, next); + }, next); + } + ], function (err) { + if (err) { + return next(err); + } + + winston.info('[2016/11/22] Update global and user language keys - done (' + i + ' processed, ' + j + ' updated)'); + Upgrade.update(thisSchemaDate, next); + }); + } else { + winston.info('[2016/11/22] Update global and user language keys - skipped!'); + next(); + } } // Add new schema updates here // IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema IN LINE 24!!! diff --git a/src/user/settings.js b/src/user/settings.js index 29666cfce5..3a5b53b9c3 100644 --- a/src/user/settings.js +++ b/src/user/settings.js @@ -65,7 +65,7 @@ module.exports = function (User) { settings.usePagination = parseInt(getSetting(settings, 'usePagination', 0), 10) === 1; settings.topicsPerPage = Math.min(settings.topicsPerPage ? parseInt(settings.topicsPerPage, 10) : defaultTopicsPerPage, defaultTopicsPerPage); settings.postsPerPage = Math.min(settings.postsPerPage ? parseInt(settings.postsPerPage, 10) : defaultPostsPerPage, defaultPostsPerPage); - settings.userLang = settings.userLang || meta.config.defaultLang || 'en_GB'; + settings.userLang = settings.userLang || meta.config.defaultLang || 'en-GB'; settings.topicPostSort = getSetting(settings, 'topicPostSort', 'oldest_to_newest'); settings.categoryTopicSort = getSetting(settings, 'categoryTopicSort', 'newest_to_oldest'); settings.followTopicsOnCreate = parseInt(getSetting(settings, 'followTopicsOnCreate', 1), 10) === 1; diff --git a/test/translator.js b/test/translator.js index c3740a4f84..9df035cfde 100644 --- a/test/translator.js +++ b/test/translator.js @@ -28,7 +28,7 @@ describe('new Translator(language)', function () { describe('.translate()', function () { it('should handle basic translations', function (done) { - var translator = Translator.create('en_GB'); + var translator = Translator.create('en-GB'); translator.translate('[[global:home]]').then(function (translated) { assert.strictEqual(translated, 'Home'); @@ -37,7 +37,7 @@ describe('new Translator(language)', function () { }); it('should handle language keys in regular text', function (done) { - var translator = Translator.create('en_GB'); + var translator = Translator.create('en-GB'); translator.translate('Let\'s go [[global:home]]').then(function (translated) { assert.strictEqual(translated, 'Let\'s go Home'); @@ -64,7 +64,7 @@ describe('new Translator(language)', function () { }); it('should handle language keys with parameters', function (done) { - var translator = Translator.create('en_GB'); + var translator = Translator.create('en-GB'); translator.translate('[[global:pagination.out_of, 1, 5]]').then(function (translated) { assert.strictEqual(translated, '1 out of 5'); @@ -73,7 +73,7 @@ describe('new Translator(language)', function () { }); it('should handle language keys inside language keys', function (done) { - var translator = Translator.create('en_GB'); + var translator = Translator.create('en-GB'); translator.translate('[[notifications:outgoing_link_message, [[global:guest]]]]').then(function (translated) { assert.strictEqual(translated, 'You are now leaving Guest'); @@ -82,7 +82,7 @@ describe('new Translator(language)', function () { }); it('should handle language keys inside language keys with multiple parameters', function (done) { - var translator = Translator.create('en_GB'); + var translator = Translator.create('en-GB'); translator.translate('[[notifications:user_posted_to, [[global:guest]], My Topic]]').then(function (translated) { assert.strictEqual(translated, 'Guest has posted a reply to: My Topic'); @@ -91,7 +91,7 @@ describe('new Translator(language)', function () { }); it('should handle language keys inside language keys with all parameters as language keys', function (done) { - var translator = Translator.create('en_GB'); + var translator = Translator.create('en-GB'); translator.translate('[[notifications:user_posted_to, [[global:guest]], [[global:guest]]]]').then(function (translated) { assert.strictEqual(translated, 'Guest has posted a reply to: Guest'); @@ -100,7 +100,7 @@ describe('new Translator(language)', function () { }); it('should properly handle parameters that contain square brackets', function (done) { - var translator = Translator.create('en_GB'); + var translator = Translator.create('en-GB'); translator.translate('[[global:pagination.out_of, [guest], [[global:home]]]]').then(function (translated) { assert.strictEqual(translated, '[guest] out of Home'); @@ -109,7 +109,7 @@ describe('new Translator(language)', function () { }); it('should properly handle parameters that contain parentheses', function (done) { - var translator = Translator.create('en_GB'); + var translator = Translator.create('en-GB'); translator.translate('[[global:pagination.out_of, (foobar), [[global:home]]]]').then(function (translated) { assert.strictEqual(translated, '(foobar) out of Home'); @@ -118,7 +118,7 @@ describe('new Translator(language)', function () { }); it('should not translate language key parameters with HTML in them', function (done) { - var translator = Translator.create('en_GB'); + var translator = Translator.create('en-GB'); var key = '[[global:403.login, test]]'; translator.translate(key).then(function (translated) { @@ -128,7 +128,7 @@ describe('new Translator(language)', function () { }); it('should properly escape % and ,', function (done) { - var translator = Translator.create('en_GB'); + var translator = Translator.create('en-GB'); var title = 'Test 1, 2, 3 % salmon'; title = title.replace(/%/g, '%').replace(/,/g, ','); @@ -140,7 +140,7 @@ describe('new Translator(language)', function () { }); it('should not translate [[derp] some text', function (done) { - var translator = Translator.create('en_GB'); + var translator = Translator.create('en-GB'); translator.translate('[[derp] some text').then(function (translated) { assert.strictEqual('[[derp] some text', translated); done(); @@ -148,7 +148,7 @@ describe('new Translator(language)', function () { }); it('should not translate [[derp:xyz] some text', function (done) { - var translator = Translator.create('en_GB'); + var translator = Translator.create('en-GB'); translator.translate('[[derp:xyz] some text').then(function (translated) { assert.strictEqual('[[derp:xyz] some text', translated); done(); @@ -156,7 +156,7 @@ describe('new Translator(language)', function () { }); it('should translate [[pages:users/latest]] properly', function (done) { - var translator = Translator.create('en_GB'); + var translator = Translator.create('en-GB'); translator.translate('[[pages:users/latest]]').then(function (translated) { assert.strictEqual(translated, 'Latest Users'); done(); @@ -167,7 +167,7 @@ describe('new Translator(language)', function () { describe('Translator.create()', function () { it('should return an instance of Translator', function (done) { - var translator = Translator.create('en_GB'); + var translator = Translator.create('en-GB'); assert(translator instanceof Translator); done(); @@ -182,7 +182,7 @@ describe('Translator.create()', function () { it('should default to defaultLang', function (done) { var translator = Translator.create(); - assert.strictEqual(translator.lang, 'en_GB'); + assert.strictEqual(translator.lang, 'en-GB'); done(); }); });