From c5237443cdad298423130ca317f34fc02cf854a5 Mon Sep 17 00:00:00 2001
From: Peter Jaszkowiak
Date: Wed, 23 Nov 2016 09:50:49 -0700
Subject: [PATCH] Standard language codes (#5218)
* Use standard language codes. Fallback for plugins.
* Fix transifex config
* Tab vs space here for some reason
* Remove redundancies
* config.relative_path instead of allcaps
* added upgrade script for existing users' accounts
---
.tx/config | 294 +++++++++---------
.../language/{en_GB => en-GB}/category.json | 0
public/language/{en_GB => en-GB}/email.json | 0
public/language/{en_GB => en-GB}/error.json | 0
public/language/{en_GB => en-GB}/global.json | 0
public/language/{en_GB => en-GB}/groups.json | 0
.../language/{en_GB => en-GB}/language.json | 2 +-
public/language/{en_GB => en-GB}/login.json | 0
public/language/{en_GB => en-GB}/modules.json | 0
.../{en_GB => en-GB}/notifications.json | 0
public/language/{en_GB => en-GB}/pages.json | 0
public/language/{en_GB => en-GB}/recent.json | 0
.../language/{en_GB => en-GB}/register.json | 0
.../{en_GB => en-GB}/reset_password.json | 0
public/language/{en_GB => en-GB}/search.json | 0
public/language/{en_GB => en-GB}/success.json | 0
public/language/{en_GB => en-GB}/tags.json | 0
public/language/{en_GB => en-GB}/topic.json | 0
public/language/{en_GB => en-GB}/unread.json | 0
public/language/{en_GB => en-GB}/uploads.json | 0
public/language/{en_GB => en-GB}/user.json | 0
public/language/{en_GB => en-GB}/users.json | 0
.../language/{en_US => en-US}/category.json | 0
public/language/{en_US => en-US}/email.json | 0
.../language/{en@pirate => en-US}/error.json | 0
public/language/{en_US => en-US}/global.json | 0
public/language/{en_US => en-US}/groups.json | 0
.../language/{en_US => en-US}/language.json | 2 +-
public/language/{en_US => en-US}/login.json | 0
public/language/{en_US => en-US}/modules.json | 0
.../{en_US => en-US}/notifications.json | 0
.../language/{en@pirate => en-US}/pages.json | 0
public/language/{en_US => en-US}/recent.json | 0
.../language/{en_US => en-US}/register.json | 0
.../{en@pirate => en-US}/reset_password.json | 0
.../language/{en@pirate => en-US}/search.json | 0
.../{en@pirate => en-US}/success.json | 0
.../language/{en@pirate => en-US}/tags.json | 0
.../language/{en@pirate => en-US}/topic.json | 0
public/language/{en_US => en-US}/unread.json | 0
public/language/{en_US => en-US}/uploads.json | 0
public/language/{en_US => en-US}/user.json | 0
public/language/{en_US => en-US}/users.json | 0
.../{en@pirate => en-x-pirate}/category.json | 0
.../{en@pirate => en-x-pirate}/email.json | 0
.../{en_US => en-x-pirate}/error.json | 0
.../{en@pirate => en-x-pirate}/global.json | 0
.../{en@pirate => en-x-pirate}/groups.json | 0
.../{en@pirate => en-x-pirate}/language.json | 2 +-
.../{en@pirate => en-x-pirate}/login.json | 0
.../{en@pirate => en-x-pirate}/modules.json | 0
.../notifications.json | 0
.../{en_US => en-x-pirate}/pages.json | 0
.../{en@pirate => en-x-pirate}/recent.json | 0
.../{en@pirate => en-x-pirate}/register.json | 0
.../reset_password.json | 0
.../{en_US => en-x-pirate}/search.json | 0
.../{en_US => en-x-pirate}/success.json | 0
.../language/{en_US => en-x-pirate}/tags.json | 0
.../{en_US => en-x-pirate}/topic.json | 0
.../{en@pirate => en-x-pirate}/unread.json | 0
.../{en@pirate => en-x-pirate}/uploads.json | 0
.../{en@pirate => en-x-pirate}/user.json | 0
.../{en@pirate => en-x-pirate}/users.json | 0
.../language/{fa_IR => fa-IR}/category.json | 0
public/language/{fa_IR => fa-IR}/email.json | 0
public/language/{fa_IR => fa-IR}/error.json | 0
public/language/{fa_IR => fa-IR}/global.json | 0
public/language/{fa_IR => fa-IR}/groups.json | 0
.../language/{fa_IR => fa-IR}/language.json | 2 +-
public/language/{fa_IR => fa-IR}/login.json | 0
public/language/{fa_IR => fa-IR}/modules.json | 0
.../{fa_IR => fa-IR}/notifications.json | 0
public/language/{fa_IR => fa-IR}/pages.json | 0
public/language/{fa_IR => fa-IR}/recent.json | 0
.../language/{fa_IR => fa-IR}/register.json | 0
.../{fa_IR => fa-IR}/reset_password.json | 0
public/language/{fa_IR => fa-IR}/search.json | 0
public/language/{fa_IR => fa-IR}/success.json | 0
public/language/{fa_IR => fa-IR}/tags.json | 0
public/language/{fa_IR => fa-IR}/topic.json | 0
public/language/{fa_IR => fa-IR}/unread.json | 0
public/language/{fa_IR => fa-IR}/uploads.json | 0
public/language/{fa_IR => fa-IR}/user.json | 0
public/language/{fa_IR => fa-IR}/users.json | 0
.../language/{pt_BR => pt-BR}/category.json | 0
public/language/{pt_BR => pt-BR}/email.json | 0
public/language/{pt_BR => pt-BR}/error.json | 0
public/language/{pt_BR => pt-BR}/global.json | 0
public/language/{pt_BR => pt-BR}/groups.json | 0
.../language/{pt_BR => pt-BR}/language.json | 2 +-
public/language/{pt_BR => pt-BR}/login.json | 0
public/language/{pt_BR => pt-BR}/modules.json | 0
.../{pt_BR => pt-BR}/notifications.json | 0
public/language/{pt_BR => pt-BR}/pages.json | 0
public/language/{pt_BR => pt-BR}/recent.json | 0
.../language/{pt_BR => pt-BR}/register.json | 0
.../{pt_BR => pt-BR}/reset_password.json | 0
public/language/{pt_BR => pt-BR}/search.json | 0
public/language/{pt_BR => pt-BR}/success.json | 0
public/language/{pt_BR => pt-BR}/tags.json | 0
public/language/{pt_BR => pt-BR}/topic.json | 0
public/language/{pt_BR => pt-BR}/unread.json | 0
public/language/{pt_BR => pt-BR}/uploads.json | 0
public/language/{pt_BR => pt-BR}/user.json | 0
public/language/{pt_BR => pt-BR}/users.json | 0
.../language/{zh_CN => zh-CN}/category.json | 0
public/language/{zh_CN => zh-CN}/email.json | 0
public/language/{zh_CN => zh-CN}/error.json | 0
public/language/{zh_CN => zh-CN}/global.json | 0
public/language/{zh_CN => zh-CN}/groups.json | 0
.../language/{zh_CN => zh-CN}/language.json | 2 +-
public/language/{zh_CN => zh-CN}/login.json | 0
public/language/{zh_CN => zh-CN}/modules.json | 0
.../{zh_CN => zh-CN}/notifications.json | 0
public/language/{zh_CN => zh-CN}/pages.json | 0
public/language/{zh_CN => zh-CN}/recent.json | 0
.../language/{zh_CN => zh-CN}/register.json | 0
.../{zh_CN => zh-CN}/reset_password.json | 0
public/language/{zh_CN => zh-CN}/search.json | 0
public/language/{zh_CN => zh-CN}/success.json | 0
public/language/{zh_CN => zh-CN}/tags.json | 0
public/language/{zh_CN => zh-CN}/topic.json | 0
public/language/{zh_CN => zh-CN}/unread.json | 0
public/language/{zh_CN => zh-CN}/uploads.json | 0
public/language/{zh_CN => zh-CN}/user.json | 0
public/language/{zh_CN => zh-CN}/users.json | 0
.../language/{zh_TW => zh-TW}/category.json | 0
public/language/{zh_TW => zh-TW}/email.json | 0
public/language/{zh_TW => zh-TW}/error.json | 0
public/language/{zh_TW => zh-TW}/global.json | 0
public/language/{zh_TW => zh-TW}/groups.json | 0
.../language/{zh_TW => zh-TW}/language.json | 2 +-
public/language/{zh_TW => zh-TW}/login.json | 0
public/language/{zh_TW => zh-TW}/modules.json | 0
.../{zh_TW => zh-TW}/notifications.json | 0
public/language/{zh_TW => zh-TW}/pages.json | 0
public/language/{zh_TW => zh-TW}/recent.json | 0
.../language/{zh_TW => zh-TW}/register.json | 0
.../{zh_TW => zh-TW}/reset_password.json | 0
public/language/{zh_TW => zh-TW}/search.json | 0
public/language/{zh_TW => zh-TW}/success.json | 0
public/language/{zh_TW => zh-TW}/tags.json | 0
public/language/{zh_TW => zh-TW}/topic.json | 0
public/language/{zh_TW => zh-TW}/unread.json | 0
public/language/{zh_TW => zh-TW}/uploads.json | 0
public/language/{zh_TW => zh-TW}/user.json | 0
public/language/{zh_TW => zh-TW}/users.json | 0
public/src/modules/translator.js | 48 ++-
src/controllers/admin/languages.js | 2 +-
src/controllers/api.js | 2 +-
src/controllers/index.js | 2 +-
src/emailer.js | 2 +-
src/languages.js | 29 +-
src/middleware/header.js | 2 +-
src/middleware/index.js | 12 +-
src/middleware/maintenance.js | 2 +-
src/middleware/render.js | 2 +-
src/plugins.js | 7 +-
src/plugins/load.js | 24 +-
src/routes/index.js | 2 +-
src/upgrade.js | 68 +++-
src/user/settings.js | 2 +-
test/translator.js | 30 +-
164 files changed, 301 insertions(+), 243 deletions(-)
rename public/language/{en_GB => en-GB}/category.json (100%)
rename public/language/{en_GB => en-GB}/email.json (100%)
rename public/language/{en_GB => en-GB}/error.json (100%)
rename public/language/{en_GB => en-GB}/global.json (100%)
rename public/language/{en_GB => en-GB}/groups.json (100%)
rename public/language/{en_GB => en-GB}/language.json (77%)
rename public/language/{en_GB => en-GB}/login.json (100%)
rename public/language/{en_GB => en-GB}/modules.json (100%)
rename public/language/{en_GB => en-GB}/notifications.json (100%)
rename public/language/{en_GB => en-GB}/pages.json (100%)
rename public/language/{en_GB => en-GB}/recent.json (100%)
rename public/language/{en_GB => en-GB}/register.json (100%)
rename public/language/{en_GB => en-GB}/reset_password.json (100%)
rename public/language/{en_GB => en-GB}/search.json (100%)
rename public/language/{en_GB => en-GB}/success.json (100%)
rename public/language/{en_GB => en-GB}/tags.json (100%)
rename public/language/{en_GB => en-GB}/topic.json (100%)
rename public/language/{en_GB => en-GB}/unread.json (100%)
rename public/language/{en_GB => en-GB}/uploads.json (100%)
rename public/language/{en_GB => en-GB}/user.json (100%)
rename public/language/{en_GB => en-GB}/users.json (100%)
rename public/language/{en_US => en-US}/category.json (100%)
rename public/language/{en_US => en-US}/email.json (100%)
rename public/language/{en@pirate => en-US}/error.json (100%)
rename public/language/{en_US => en-US}/global.json (100%)
rename public/language/{en_US => en-US}/groups.json (100%)
rename public/language/{en_US => en-US}/language.json (73%)
rename public/language/{en_US => en-US}/login.json (100%)
rename public/language/{en_US => en-US}/modules.json (100%)
rename public/language/{en_US => en-US}/notifications.json (100%)
rename public/language/{en@pirate => en-US}/pages.json (100%)
rename public/language/{en_US => en-US}/recent.json (100%)
rename public/language/{en_US => en-US}/register.json (100%)
rename public/language/{en@pirate => en-US}/reset_password.json (100%)
rename public/language/{en@pirate => en-US}/search.json (100%)
rename public/language/{en@pirate => en-US}/success.json (100%)
rename public/language/{en@pirate => en-US}/tags.json (100%)
rename public/language/{en@pirate => en-US}/topic.json (100%)
rename public/language/{en_US => en-US}/unread.json (100%)
rename public/language/{en_US => en-US}/uploads.json (100%)
rename public/language/{en_US => en-US}/user.json (100%)
rename public/language/{en_US => en-US}/users.json (100%)
rename public/language/{en@pirate => en-x-pirate}/category.json (100%)
rename public/language/{en@pirate => en-x-pirate}/email.json (100%)
rename public/language/{en_US => en-x-pirate}/error.json (100%)
rename public/language/{en@pirate => en-x-pirate}/global.json (100%)
rename public/language/{en@pirate => en-x-pirate}/groups.json (100%)
rename public/language/{en@pirate => en-x-pirate}/language.json (65%)
rename public/language/{en@pirate => en-x-pirate}/login.json (100%)
rename public/language/{en@pirate => en-x-pirate}/modules.json (100%)
rename public/language/{en@pirate => en-x-pirate}/notifications.json (100%)
rename public/language/{en_US => en-x-pirate}/pages.json (100%)
rename public/language/{en@pirate => en-x-pirate}/recent.json (100%)
rename public/language/{en@pirate => en-x-pirate}/register.json (100%)
rename public/language/{en_US => en-x-pirate}/reset_password.json (100%)
rename public/language/{en_US => en-x-pirate}/search.json (100%)
rename public/language/{en_US => en-x-pirate}/success.json (100%)
rename public/language/{en_US => en-x-pirate}/tags.json (100%)
rename public/language/{en_US => en-x-pirate}/topic.json (100%)
rename public/language/{en@pirate => en-x-pirate}/unread.json (100%)
rename public/language/{en@pirate => en-x-pirate}/uploads.json (100%)
rename public/language/{en@pirate => en-x-pirate}/user.json (100%)
rename public/language/{en@pirate => en-x-pirate}/users.json (100%)
rename public/language/{fa_IR => fa-IR}/category.json (100%)
rename public/language/{fa_IR => fa-IR}/email.json (100%)
rename public/language/{fa_IR => fa-IR}/error.json (100%)
rename public/language/{fa_IR => fa-IR}/global.json (100%)
rename public/language/{fa_IR => fa-IR}/groups.json (100%)
rename public/language/{fa_IR => fa-IR}/language.json (68%)
rename public/language/{fa_IR => fa-IR}/login.json (100%)
rename public/language/{fa_IR => fa-IR}/modules.json (100%)
rename public/language/{fa_IR => fa-IR}/notifications.json (100%)
rename public/language/{fa_IR => fa-IR}/pages.json (100%)
rename public/language/{fa_IR => fa-IR}/recent.json (100%)
rename public/language/{fa_IR => fa-IR}/register.json (100%)
rename public/language/{fa_IR => fa-IR}/reset_password.json (100%)
rename public/language/{fa_IR => fa-IR}/search.json (100%)
rename public/language/{fa_IR => fa-IR}/success.json (100%)
rename public/language/{fa_IR => fa-IR}/tags.json (100%)
rename public/language/{fa_IR => fa-IR}/topic.json (100%)
rename public/language/{fa_IR => fa-IR}/unread.json (100%)
rename public/language/{fa_IR => fa-IR}/uploads.json (100%)
rename public/language/{fa_IR => fa-IR}/user.json (100%)
rename public/language/{fa_IR => fa-IR}/users.json (100%)
rename public/language/{pt_BR => pt-BR}/category.json (100%)
rename public/language/{pt_BR => pt-BR}/email.json (100%)
rename public/language/{pt_BR => pt-BR}/error.json (100%)
rename public/language/{pt_BR => pt-BR}/global.json (100%)
rename public/language/{pt_BR => pt-BR}/groups.json (100%)
rename public/language/{pt_BR => pt-BR}/language.json (72%)
rename public/language/{pt_BR => pt-BR}/login.json (100%)
rename public/language/{pt_BR => pt-BR}/modules.json (100%)
rename public/language/{pt_BR => pt-BR}/notifications.json (100%)
rename public/language/{pt_BR => pt-BR}/pages.json (100%)
rename public/language/{pt_BR => pt-BR}/recent.json (100%)
rename public/language/{pt_BR => pt-BR}/register.json (100%)
rename public/language/{pt_BR => pt-BR}/reset_password.json (100%)
rename public/language/{pt_BR => pt-BR}/search.json (100%)
rename public/language/{pt_BR => pt-BR}/success.json (100%)
rename public/language/{pt_BR => pt-BR}/tags.json (100%)
rename public/language/{pt_BR => pt-BR}/topic.json (100%)
rename public/language/{pt_BR => pt-BR}/unread.json (100%)
rename public/language/{pt_BR => pt-BR}/uploads.json (100%)
rename public/language/{pt_BR => pt-BR}/user.json (100%)
rename public/language/{pt_BR => pt-BR}/users.json (100%)
rename public/language/{zh_CN => zh-CN}/category.json (100%)
rename public/language/{zh_CN => zh-CN}/email.json (100%)
rename public/language/{zh_CN => zh-CN}/error.json (100%)
rename public/language/{zh_CN => zh-CN}/global.json (100%)
rename public/language/{zh_CN => zh-CN}/groups.json (100%)
rename public/language/{zh_CN => zh-CN}/language.json (69%)
rename public/language/{zh_CN => zh-CN}/login.json (100%)
rename public/language/{zh_CN => zh-CN}/modules.json (100%)
rename public/language/{zh_CN => zh-CN}/notifications.json (100%)
rename public/language/{zh_CN => zh-CN}/pages.json (100%)
rename public/language/{zh_CN => zh-CN}/recent.json (100%)
rename public/language/{zh_CN => zh-CN}/register.json (100%)
rename public/language/{zh_CN => zh-CN}/reset_password.json (100%)
rename public/language/{zh_CN => zh-CN}/search.json (100%)
rename public/language/{zh_CN => zh-CN}/success.json (100%)
rename public/language/{zh_CN => zh-CN}/tags.json (100%)
rename public/language/{zh_CN => zh-CN}/topic.json (100%)
rename public/language/{zh_CN => zh-CN}/unread.json (100%)
rename public/language/{zh_CN => zh-CN}/uploads.json (100%)
rename public/language/{zh_CN => zh-CN}/user.json (100%)
rename public/language/{zh_CN => zh-CN}/users.json (100%)
rename public/language/{zh_TW => zh-TW}/category.json (100%)
rename public/language/{zh_TW => zh-TW}/email.json (100%)
rename public/language/{zh_TW => zh-TW}/error.json (100%)
rename public/language/{zh_TW => zh-TW}/global.json (100%)
rename public/language/{zh_TW => zh-TW}/groups.json (100%)
rename public/language/{zh_TW => zh-TW}/language.json (69%)
rename public/language/{zh_TW => zh-TW}/login.json (100%)
rename public/language/{zh_TW => zh-TW}/modules.json (100%)
rename public/language/{zh_TW => zh-TW}/notifications.json (100%)
rename public/language/{zh_TW => zh-TW}/pages.json (100%)
rename public/language/{zh_TW => zh-TW}/recent.json (100%)
rename public/language/{zh_TW => zh-TW}/register.json (100%)
rename public/language/{zh_TW => zh-TW}/reset_password.json (100%)
rename public/language/{zh_TW => zh-TW}/search.json (100%)
rename public/language/{zh_TW => zh-TW}/success.json (100%)
rename public/language/{zh_TW => zh-TW}/tags.json (100%)
rename public/language/{zh_TW => zh-TW}/topic.json (100%)
rename public/language/{zh_TW => zh-TW}/unread.json (100%)
rename public/language/{zh_TW => zh-TW}/uploads.json (100%)
rename public/language/{zh_TW => zh-TW}/user.json (100%)
rename public/language/{zh_TW => zh-TW}/users.json (100%)
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();
});
});