diff --git a/src/common/i18n.js b/src/common/i18n.js index 399e62c3..a52dda9a 100644 --- a/src/common/i18n.js +++ b/src/common/i18n.js @@ -1,11 +1,102 @@ import en from './langs/en.js' import zhHans from './langs/zh_Hans.js' -export default { - locale: 'en', - fallbackLocale: 'en', - messages: { - 'en': en, - 'zh_Hans': zhHans +const defaultLanguage = 'en'; + +const allLanguages = { + 'en': { + name: 'English', + displayName: 'English', + content: en + }, + 'zh-Hans': { + name: 'Simplified Chinese', + displayName: '简体中文', + aliases: ['zh-CHS', 'zh-CN', 'zh-SG'], + content: zhHans } }; + +const i18nOptions = { + locale: defaultLanguage, + fallbackLocale: defaultLanguage, + formatFallbackMessages: true, + messages: (function () { + const messages = {}; + + for (let locale in allLanguages) { + if (!Object.prototype.hasOwnProperty.call(allLanguages, locale)) { + continue; + } + + const lang = allLanguages[locale]; + messages[locale] = lang.content; + } + + return messages; + })() +}; + +function getAllLanguages() { + return allLanguages; +} + +function getLanguage(locale) { + return allLanguages[locale]; +} + +function getLocaleFromLanguageAlias(alias) { + for (let locale in allLanguages) { + if (!Object.prototype.hasOwnProperty.call(allLanguages, locale)) { + continue; + } + + const lang = allLanguages[locale]; + const aliases = lang.aliases; + + if (!aliases || aliases.length < 1) { + continue; + } + + for (let i = 0; i < aliases.length; i++) { + if (aliases[i] === alias) { + return locale; + } + } + } + + return null; +} + +function getDefaultLanguage() { + if (!window || !window.navigator) { + return defaultLanguage; + } + + let browserLocale = window.navigator.browserLanguage || window.navigator.language; + + if (!browserLocale) { + return defaultLanguage; + } + + if (!allLanguages[browserLocale]) { + const locale = getLocaleFromLanguageAlias(browserLocale); + + if (locale) { + browserLocale = locale; + } + } + + if (!allLanguages[browserLocale]) { + return defaultLanguage; + } + + return browserLocale; +} + +export default { + i18nOptions, + getAllLanguages, + getLanguage, + getDefaultLanguage +}; diff --git a/src/common/langs/en.js b/src/common/langs/en.js index 4bf8e391..cefea1f4 100644 --- a/src/common/langs/en.js +++ b/src/common/langs/en.js @@ -1,7 +1,7 @@ export default { 'global': { 'app': { - 'title': 'lightweight account book' + 'title': 'lab app' } }, 'error': { @@ -28,9 +28,10 @@ export default { 'Password': 'Password', 'Log In': 'Log In', 'Don\'t have an account?': 'Don\'t have an account?', - 'Sign up': 'Sign up', - 'Have problem with login?': 'Have problem with login?', - 'Forget Password': 'Forget Password', + 'Create an account': 'Create an account', + 'Forget Password?': 'Forget Password?', + 'Please input username': 'Please input username', + 'Please input password': 'Please input password', 'Unable to login': 'Unable to login', 'Logout': 'Logout' }; diff --git a/src/common/langs/zh_Hans.js b/src/common/langs/zh_Hans.js index a221ebf4..74f3491d 100644 --- a/src/common/langs/zh_Hans.js +++ b/src/common/langs/zh_Hans.js @@ -28,9 +28,10 @@ export default { 'Password': '密码', 'Log In': '登录', 'Don\'t have an account?': '还没有账号?', - 'Sign up': '注册', - 'Have problem with login?': '登录遇到问题?', - 'Forget Password': '找回密码', + 'Create an account': '创建新账号', + 'Forget Password?': '找回密码?', + 'Please input username': '请输入用户名', + 'Please input password': '请输入密码', 'Unable to login': '无法登录', 'Logout': '退出登录' }; diff --git a/src/common/settings.js b/src/common/settings.js new file mode 100644 index 00000000..2ef7c8c9 --- /dev/null +++ b/src/common/settings.js @@ -0,0 +1,43 @@ +const settingsLocalStorageKey = 'lab_user_settings'; +const defaultSettings = { + lang: 'en' +}; + +function getOriginalSettings() { + try { + const storageData = localStorage.getItem(settingsLocalStorageKey) || '{}'; + return JSON.parse(storageData); + } catch (ex) { + console.warn('settings in local storage is invalid', ex); + return {}; + } +} + +function getFinalSettings() { + return Object.assign({}, defaultSettings, getOriginalSettings()); +} + +function setSettings(settings) { + const storageData = JSON.stringify(settings); + return localStorage.setItem(settingsLocalStorageKey, storageData); +} + +function getOriginalOption(key) { + return getOriginalSettings()[key]; +} + +function setOption(key, value) { + if (!Object.prototype.hasOwnProperty.call(defaultSettings, key)) { + return; + } + + const settings = getFinalSettings(); + settings[key] = value; + + return setSettings(settings); +} + +export default { + getLanguage: () => getOriginalOption('lang'), + setLanguage: value => setOption('lang', value) +}; diff --git a/src/mobile/components/Login.vue b/src/mobile/components/Login.vue index a5198ef5..9b487cf1 100644 --- a/src/mobile/components/Login.vue +++ b/src/mobile/components/Login.vue @@ -27,51 +27,103 @@ {{ $t('Log In') }}   - {{ $t('Sign up') }} + {{ $t('Create an account') }}
-   - {{ $t('Forget Password') }} + {{ $t('Forget Password?') }} +
+ + {{ currentLanguageName }} + + + + +