diff --git a/package.json b/package.json index da85db3..2755f68 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "jshint": "^2.11.1", "less-loader": "^6.1.0", "lib-flexible": "^0.3.2", + "lodash": "^4.17.21", "moment": "^2.29.4", "monaco-editor": "^0.23.0", "monaco-editor-vue": "^1.0.10", @@ -56,6 +57,7 @@ "vue-aplayer": "^1.6.1", "vue-color": "^2.8.1", "vue-demi": "^0.14.6", + "vue-i18n": "^8.28.2", "vue-runtime-helpers": "^1.1.2", "vue-simple-uploader": "0.7.6", "vuedraggable": "^2.23.2", diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue index 382e6de..f029e94 100644 --- a/src/layout/components/Navbar.vue +++ b/src/layout/components/Navbar.vue @@ -36,7 +36,8 @@ - 退出登录 + + {{ $t('login.logout') }} diff --git a/src/layout/components/Sidebar/index.vue b/src/layout/components/Sidebar/index.vue index 3e16e43..16c0049 100644 --- a/src/layout/components/Sidebar/index.vue +++ b/src/layout/components/Sidebar/index.vue @@ -73,7 +73,7 @@
WebDAV
-
点击复制WebDAV地址
{{ webdavUrl }}
+
{{ $t('app.clickCopyWebDAVAddress') }}
{{ webdavUrl }}
h(App), diff --git a/src/store/getters.js b/src/store/getters.js index 633dff5..a111d20 100644 --- a/src/store/getters.js +++ b/src/store/getters.js @@ -1,6 +1,7 @@ const getters = { sidebar: state => state.app.sidebar, device: state => state.app.device, + lang: state => state.app.lang, token: state => state.user.token, shareToken: state => state.user.shareToken, avatar: state => state.user.avatar, diff --git a/src/store/modules/app.js b/src/store/modules/app.js index 7ea7e33..8f171b9 100644 --- a/src/store/modules/app.js +++ b/src/store/modules/app.js @@ -1,13 +1,21 @@ +import { getConsumerId, getShareToken, getToken, getUsername } from '@/utils/auth' import Cookies from 'js-cookie' -const state = { - sidebar: { - opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true, - withoutAnimation: false - }, - device: 'desktop' + +const getDefaultState = () => { + const app = sessionStorage.getItem('app') && JSON.parse(sessionStorage.getItem('app')) + return { + sidebar: { + opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true, + withoutAnimation: false + }, + device: 'desktop', + lang: app ? app.lang : undefined + } } +const state = getDefaultState() + const mutations = { TOGGLE_SIDEBAR: state => { state.sidebar.opened = !state.sidebar.opened @@ -25,18 +33,32 @@ const mutations = { }, TOGGLE_DEVICE: (state, device) => { state.device = device + }, + SET_LANG: (state, lang) => { + state.lang = lang } } +function setStorage() { + sessionStorage.setItem('app', JSON.stringify(state)) +} + const actions = { toggleSideBar({ commit }) { commit('TOGGLE_SIDEBAR') + setStorage() }, closeSideBar({ commit }, { withoutAnimation }) { commit('CLOSE_SIDEBAR', withoutAnimation) + setStorage() }, toggleDevice({ commit }, device) { commit('TOGGLE_DEVICE', device) + setStorage() + }, + setLang({ commit }, lang) { + commit('SET_LANG', lang) + setStorage() } } diff --git a/src/store/modules/user.js b/src/store/modules/user.js index 9de0f06..672a750 100644 --- a/src/store/modules/user.js +++ b/src/store/modules/user.js @@ -22,18 +22,19 @@ import Layout from '@/layout' import ParentView from '@/components/ParentView' const getDefaultState = () => { + const store = sessionStorage.getItem('store') && JSON.parse(sessionStorage.getItem('store')) return { token: getToken(), shareToken: getShareToken(), name: getUsername(), - showName: '', + showName: store ? store.showName : '', userInfo: {}, - avatar: '', + avatar: store ? store.avatar : '', userId: getConsumerId(), menuList: [], - netdiskName: '', - netdiskLogo: '', - newVersion: '', + netdiskName: store ? store.netdiskName : '', + netdiskLogo: store ? store.netdiskLogo : '', + newVersion: store ? store.newVersion : '', iframePreviewConfig: {} } } @@ -140,6 +141,7 @@ const actions = { commit('SET_NETDISK_NAME', netdiskName) commit('SET_NETDISK_LOGO', netdiskLogo) setLogo(netdiskName, netdiskLogo) + sessionStorage.setItem('store', JSON.stringify(state)) }, // get user info diff --git a/src/utils/loadLocaleMessages.js b/src/utils/loadLocaleMessages.js new file mode 100644 index 0000000..f3c20c5 --- /dev/null +++ b/src/utils/loadLocaleMessages.js @@ -0,0 +1,27 @@ +// 使用 require.context 动态加载 locales 目录中的语言文件 + +export function loadLocaleMessages() { + const locales = require.context('@/locales', true, /\.js$/) + + return locales.keys().reduce((messages, key) => { + // 获取语言文件的默认导出 + const locale = locales(key).default + + // 根据文件名推断语言代码,比如将 `en_US.js` 解析为 `en_US` + const localeKey = key.match(/([a-zA-Z_]+)\./i)[1] + + // 添加到 messages 对象 + messages[localeKey] = locale + return messages + }, {}) +} + +export function getBrowserLanguage() { + const browserLanguage = navigator.language || navigator.userLanguage + return browserLanguage.replace('-', '_') +} + +// 获取浏览器语言,判断是否支持,返回相应语言代码 +export function getBrowserLocale(messages, fallbackLocale = 'en_US') { + return Object.keys(messages).includes(getBrowserLanguage()) ? getBrowserLanguage() : fallbackLocale +} diff --git a/src/utils/request.js b/src/utils/request.js index 8febd08..bd3fab0 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -24,6 +24,8 @@ service.interceptors.request.use( config.headers['share-token'] = getShareToken() config.headers['shareId'] = getShareId() } + // add i18n + config.headers['lang'] = store.getters.lang return config }, error => { diff --git a/src/views/home/mobile/index.vue b/src/views/home/mobile/index.vue index 5507ea1..dc8dcd5 100644 --- a/src/views/home/mobile/index.vue +++ b/src/views/home/mobile/index.vue @@ -16,16 +16,16 @@ {{ name }}
- - - - - - + + + + + +
- 退出登录 + {{ $t('login.logout') }}
@@ -43,10 +43,10 @@
@@ -65,9 +65,9 @@ @@ -91,12 +91,12 @@ v-model="searchValue" :show-action="searchStatus" shape="round" - placeholder="搜索" + :placeholder="$t('common.search')" @focus="startSearch" @search="onSearch" @input="onSearch" > -
取消
+
{{ $t('common.cancel') }}
diff --git a/src/views/login/index.vue b/src/views/login/index.vue index 7c23be0..87fa52f 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -18,7 +18,7 @@ -

创建管理员

+

{{ $t('login.createAdmin') }}

@@ -28,7 +28,7 @@ - + @@ -70,7 +70,7 @@ ref="password" v-model="loginForm.confirmPassword" :type="passwordType" - placeholder="确认密码" + :placeholder="$t('login.confirmPassword')" name="password" tabindex="2" auto-complete="on" @@ -80,7 +80,7 @@ - {{initialize?'创建':'登录'}} + {{initialize?$t('login.create'):$t('login.login')}} @@ -101,7 +101,6 @@ import { getWebstieRecord } from "@/api/setting-api"; import { hasUser, initialization } from '@/api/user' import { getRememberName } from '@/utils/auth' import Logo from "@/components/Logo"; -import Bus from "@/assets/js/bus"; export default { name: 'Login', @@ -109,7 +108,7 @@ export default { data() { const validateUsername = (rule, value, callback) => { if (!this.validUsername(value)) { - callback(new Error('请输入正确的用户名')) + callback(new Error(this.$t('login.ruleUsername'))) } else { callback() } @@ -123,7 +122,7 @@ export default { const confirmPassword = (rule, value, callback) => { if (value.length < 6) { } else if(this.loginForm.password !== value) { - callback(new Error('密码不一致')) + callback(new Error(this.$t('login.ruleConfirmPassword'))) } else { callback() } @@ -131,14 +130,14 @@ export default { return { beianUrl: "http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=", webstieRecord: { - copyright: 'Copyright © 2020 Journey Magical AL', + copyright: '', recordPermissionNum: '', - netdiskName: 'jmalcloud', - netdiskLogo: '' + netdiskName: '', + netdiskLogo: this.$store.state.user.netdiskLogo }, loginForm: { - username: '', - password: '', + username: this.$route.query.username || '', + password: this.$route.query.password || '', rememberMe: false, confirmPassword: '' }, @@ -182,7 +181,6 @@ export default { this.loginForm.username = rememberName this.loginForm.rememberMe = true } - getWebstieRecord().then((res) => { this.webstieRecord = res.data if (this.webstieRecord.netdiskName || this.webstieRecord.netdiskLogo) { @@ -212,7 +210,7 @@ export default { this.loading = true initialization(data).then(()=>{ this.initialize = false - this.$message.success('创建成功') + this.$message.success(this.$t('message.createSuccess')) this.loading = false }) }else{ diff --git a/src/views/setting/cloudManager.vue b/src/views/setting/cloudManager.vue index c7bdf79..6ddcbf3 100644 --- a/src/views/setting/cloudManager.vue +++ b/src/views/setting/cloudManager.vue @@ -4,22 +4,22 @@
- 网盘设置 + {{ $t('app.setting') }}
- +
-
网盘名称: - {{ $t('app.netDiskName') }}: +
-