diff options
| author | Tusooa Zhu <tusooa@kazv.moe> | 2022-07-25 15:38:05 -0400 |
|---|---|---|
| committer | tusooa <tusooa@kazv.moe> | 2022-12-23 22:45:55 -0500 |
| commit | b7e93739656d225ed0a8854f357746b5291b6857 (patch) | |
| tree | 21f22ec2ae9cf2649e2a0c8039b5db3643dfcef6 /src/i18n/messages.js | |
| parent | 25e628efe265db583797fe1c10fdcab2f0d9cc9d (diff) | |
Add support for multiple interface languages
Diffstat (limited to 'src/i18n/messages.js')
| -rw-r--r-- | src/i18n/messages.js | 26 |
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 } } |
