aboutsummaryrefslogtreecommitdiff
path: root/src/i18n/messages.js
diff options
context:
space:
mode:
authorTusooa Zhu <tusooa@kazv.moe>2022-07-25 15:38:05 -0400
committertusooa <tusooa@kazv.moe>2022-12-23 22:45:55 -0500
commitb7e93739656d225ed0a8854f357746b5291b6857 (patch)
tree21f22ec2ae9cf2649e2a0c8039b5db3643dfcef6 /src/i18n/messages.js
parent25e628efe265db583797fe1c10fdcab2f0d9cc9d (diff)
Add support for multiple interface languages
Diffstat (limited to 'src/i18n/messages.js')
-rw-r--r--src/i18n/messages.js26
1 files changed, 22 insertions, 4 deletions
diff --git a/src/i18n/messages.js b/src/i18n/messages.js
index 74a89ca8..849d98fd 100644
--- a/src/i18n/messages.js
+++ b/src/i18n/messages.js
@@ -7,8 +7,11 @@
// sed -i -e "s/'//gm" -e 's/"/\\"/gm' -re 's/^( +)(.+?): ((.+?))?(,?)(\{?)$/\1"\2": "\4"/gm' -e 's/\"\{\"/{/g' -e 's/,"$/",/g' file.json
// There's only problem that apostrophe character ' gets replaced by \\ so you have to fix it manually, sorry.
+import { isEqual } from 'lodash'
import { languages, langCodeToJsonName } from './languages.js'
+const ULTIMATE_FALLBACK_LOCALE = 'en'
+
const hasLanguageFile = (code) => languages.includes(code)
const loadLanguageFile = (code) => {
@@ -25,11 +28,26 @@ const messages = {
en: require('./en.json').default
},
setLanguage: async (i18n, language) => {
- if (hasLanguageFile(language)) {
- const messages = await loadLanguageFile(language)
- i18n.setLocaleMessage(language, messages.default)
+ const languages = (Array.isArray(language) ? language : [language]).filter(k => k)
+
+ if (!languages.includes(ULTIMATE_FALLBACK_LOCALE)) {
+ languages.push(ULTIMATE_FALLBACK_LOCALE)
+ }
+ const [first, ...rest] = languages
+
+ if (first === i18n.locale && isEqual(rest, i18n.fallbackLocale)) {
+ return
}
- i18n.locale = language
+
+ for (const lang of languages) {
+ if (hasLanguageFile(lang)) {
+ const messages = await loadLanguageFile(lang)
+ i18n.setLocaleMessage(lang, messages.default)
+ }
+ }
+
+ i18n.fallbackLocale = rest
+ i18n.locale = first
}
}