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 }}
+