فهرست منبع

feat: 国际化保持
1. 对国际化内容增加了自动选择与浏览器缓存

kindring 3 هفته پیش
والد
کامیت
7963e79510
4فایلهای تغییر یافته به همراه65 افزوده شده و 29 حذف شده
  1. 37 17
      web_src/src/assets/i18/i18n.js
  2. 2 2
      web_src/src/components/Login.vue
  3. 2 2
      web_src/src/layout/UiHeader.vue
  4. 24 8
      web_src/src/pages/index/main.js

+ 37 - 17
web_src/src/assets/i18/i18n.js

@@ -32,40 +32,60 @@ export const i18n = new VueI18n({
     // }
 });
 
-export  function changLang(langs) {
-    // if (currentLang === 'en') {
-    //     dayjs.locale('en');
-    // } else {
-    //     dayjs.locale('zh-cn');
-    // }
-    console.log( langs)
-    // cookies.set('blueking_language', langs);
+
+// 获取用户首选语言(考虑存储和浏览器设置)
+export function getPreferredLanguage() {
+    // 1. 检查是否有存储的语言设置
+    const savedLang = localStorage.getItem('blueking_language');
+    if (savedLang) return savedLang;
+
+    // 2. 检查浏览器语言设置
+    const browserLang = navigator.language.toLowerCase();
+    const availableLangs = langList.map(lang => lang.value);
+
+    // 尝试精确匹配 (zh-cn)
+    if (availableLangs.includes(browserLang)) {
+        return browserLang;
+    }
+
+    // 尝试主语言匹配 (zh)
+    const primaryLang = browserLang.split('-')[0];
+    const matchedLang = langList.find(lang => lang.value.startsWith(primaryLang));
+
+    return matchedLang ? matchedLang.value : langList[0].value;
+}
+
+export function changLang(langs) {
+    // 持久化存储语言选择
+    localStorage.setItem('blueking_language', langs);
     loadLanguageAsync(langs);
-    // window.location.reload();
 }
+
+
 export function setI18nLanguage(lang) {
     i18n.global.locale = lang;
     return lang;
 }
 export function loadLanguageAsync(lang) {
-    if (i18n.locale === lang) {
+    const targetLang = lang || getPreferredLanguage();
+    if (i18n.locale === targetLang) {
         return Promise.resolve()
     }
 
     // 如果语言已加载
-    if (loadedLanguages.includes(lang)) {
-        i18n.locale = lang
+    if (loadedLanguages.includes(targetLang)) {
+        i18n.locale = targetLang
         return Promise.resolve()
     }
 
     // 动态加载语言包
-    return import(/* webpackChunkName: "lang-[request]" */ `./lang/${lang}`)
+    return import(/* webpackChunkName: "lang-[request]" */ `./lang/${targetLang}`)
         .then(module => {
             console.log( module);
-            i18n.setLocaleMessage(lang, module.default)
-            loadedLanguages.push(lang)
-            i18n.locale = lang
-            return lang
+            i18n.setLocaleMessage(targetLang, module.default)
+            loadedLanguages.push(targetLang)
+            i18n.locale = targetLang
+            return targetLang
         })
         .catch(err => {
             console.error(`加载语言包失败: ${err}`)

+ 2 - 2
web_src/src/components/Login.vue

@@ -61,7 +61,7 @@ import api_user from "@/apiStore/api_user";
 import userService from "./service/UserService";
 import handle from "@/until/handle";
 import querystring from "querystring";
-import {langList, loadLanguageAsync} from "../assets/i18/i18n";
+import {changLang, langList} from "../assets/i18/i18n";
 
 export default {
   name: 'Login',
@@ -92,7 +92,7 @@ export default {
       return langList
     },
     changeLang(lang) {
-      loadLanguageAsync(lang)
+      changLang(lang)
     },
 
     async executeIsDefault() {

+ 2 - 2
web_src/src/layout/UiHeader.vue

@@ -62,7 +62,7 @@ import changePasswordDialog from '../components/dialog/changePassword.vue'
 import userService from '../components/service/UserService'
 import handle from "@/until/handle";
 import {arithmeticEnum} from "@/map/ai";
-import {langList, loadLanguageAsync} from "../assets/i18/i18n";
+import {changLang, langList} from "../assets/i18/i18n";
 
 export default {
   name: "UiHeader",
@@ -95,7 +95,7 @@ export default {
       return langList
     },
     changeLang(lang) {
-      loadLanguageAsync(lang)
+      changLang(lang)
     },
     logout() {
       this.$axios.axios({

+ 24 - 8
web_src/src/pages/index/main.js

@@ -20,7 +20,7 @@ import Contextmenu from "vue-contextmenujs"
 import userService from "@/components/service/UserService"
 import '@/icons/registerSvg';
 import VueI18n from 'vue-i18n'
-import {i18n, loadLanguageAsync, currentLang} from '@assets/i18/i18n.js'
+import {i18n, loadLanguageAsync} from '@assets/i18/i18n.js'
 import {langList} from "../../assets/i18/i18n";
 
 
@@ -99,11 +99,27 @@ Vue.prototype.$axios = axios;
 Vue.prototype.$cookies.config(60*30);
 
 
-loadLanguageAsync(langList[0].value).then(() => {
-  new Vue({
-    i18n,
-    router: router,
-    render: h => h(App),
-  }).$mount('#app')
-})
+
+
+const initApp = async () => {
+  try {
+    // 加载用户首选语言
+    await loadLanguageAsync();
+
+    // 确保加载的包被正确设置
+    if (!i18n.locale) {
+      i18n.locale = getPreferredLanguage();
+    }
+
+    new Vue({
+      i18n,
+      router: router,
+      render: h => h(App),
+    }).$mount('#app');
+  } catch (error) {
+    console.error('应用初始化失败:', error);
+  }
+};
+
+initApp();