Forráskód Böngészése

529中英文放src

tangjunhao 3 hónapja
szülő
commit
9f1c3ff772

+ 0 - 95
public/locales/en.json

@@ -1,95 +0,0 @@
-{
-  "message": {
-    "hello": "Hello World",
-    "welcome": "Welcome to our app",
-    "confirmDelete": "Are you sure to delete the selected items?",
-    "deleteSuccess": "Delete successful",
-    "deleteFailed": "Delete failed",
-    "deleteCancelled": "Deletion cancelled",
-    "logoutSuccess": "Logout successful"
-  },
-  "common": {
-    "tip": "Tip",
-    "confirm": "Confirm",
-    "ok":"OK",
-    "cancel": "Cancel"
-  },
-  "preferences": {
-    "title": "Preferences",
-    "theme": "Theme",
-    "language": "Language",
-    "notifications": "Notifications",
-    "privacy": "Privacy Settings"
-  },
-  "login": {
-    "title": "Login",
-    "subtitle": "Web-Based Engine System-Level Simulation Software",
-    "username": "Username",
-    "inputusername": "Please enter your username",
-    "inputpassword": "Please enter your password",
-    "checknamepwd": "Please enter username and password",
-    "loginError": "Login failed, please check your username and password",
-    "password": "Password",
-    "rememberMe": "Remember Me",
-    "loginButton": "Login",
-    "forgotPassword": "Forgot Password?",
-    "register": "Register"
-  },
-  "index": {
-    "title": "Home",
-    "subtitle": "Web-Based Engine System-Level Simulation Software",
-    "headetag": "PLATFORM",
-    "project": "Project",
-    "preferences": "Preferences",
-    "userinfo": "User Info",
-    "changePassword": "Change Password",
-    "logout": "Logout"
-  },
-  "project": {
-    "open": "OPEN",
-    "create": "New Project",
-    "newcompound": "New Compound",
-    "newlibrary": "New Library",
-    "projectlist": "Project List",
-    "number": "Number",
-    "name": "Project Name",
-    "dirsize": "Size",
-    "updateTime": "Last Modified",
-    "uname": "Author",
-    "keywords": "Keywords",
-    "description": "Description",
-    "total": "Total",
-    "selectAll": "Select All",
-    "delete": "Delete",
-    "ok": "OK"
-  },
-  "dialog": {
-    "ok": "OK",
-    "cancel": "Cancel",
-    "error": "Error",
-    "success": "Success",
-    "warning": "Warning",
-    "info": "Info",
-    "loading": "Loading",
-    "new": "New",
-    "edit": "Edit",
-    "delete": "Delete",
-    "save": "Save",
-    "userinfo": "User Info",
-    "changePassword": "Change Password",
-    "oldPassword": "Old Password",
-    "newPassword": "New Password",
-    "confirmNewPassword": "Confirm Again",
-    "inputOldPassword": "Please enter old password",
-    "inputNewPassword": "Please enter new password",
-    "inputConfirmNewPassword": "Please confirm new password",
-    "passwordMismatch": "Passwords do not match",
-    "passwordChangeSuccess": "Password changed successfully",
-    "passwordChangeFailed": "Password change failed",
-    "username": "Username",
-    "nickname": "Nickname",
-    "email": "Email",
-    "regTime": "Registration Time",
-    "mobileNo": "Mobile Number"
-  }
-}

+ 0 - 96
public/locales/zh-CN.json

@@ -1,96 +0,0 @@
-{
-  "message": {
-    "hello": "你好世界",
-    "welcome": "欢迎使用我们的应用",
-    "confirmDelete": "您确定要删除选中的项目吗?",
-    "deleteSuccess": "删除成功",
-    "deleteFailed": "删除失败",
-    "deleteCancelled": "已取消删除",
-    "logoutSuccess": "退出登录成功"
-  },
-  "common": {
-    "tip": "提示",
-    "confirm": "确认",
-    "ok": "确定",
-    "cancel": "取消"
-  },
-  "preferences": {
-    "title": "偏好设置",
-    "theme": "主题",
-    "language": "语言",
-    "notifications": "通知",
-    "privacy": "隐私设置"
-  },
-  "login": {
-    "title": "登录",
-    "subtitle": "基于Web的引擎系统级仿真软件",
-    "username": "用户名",
-    "password": "密码",
-    "inputusername": "请输入用户名",
-    "inputpassword": "请输入密码",
-    "checknamepwd": "请输入用户名和密码",
-    "loginError": "登录失败,请检查您的用户名和密码",
-    "rememberMe": "记住密码",
-    "loginButton": "登录",
-    "forgotPassword": "忘记密码?",
-    "register": "注册"
-  },
-  "index": {
-    "title": "首页",
-    "subtitle": "基于Web的引擎系统级仿真软件",
-    "headetag": "平台",
-    "project": "项目",
-    "preferences": "偏好设置",
-    "userinfo": "个人信息",
-    "changePassword": "修改密码",
-    "logout": "退出登录"
-  },
-  "project": {
-    "open": "打开",
-    "create": "新建项目",
-    "newcompound": "新建化合物",
-    "newlibrary": "新建库",
-    "projectlist": "项目列表",
-    "number": "编号",
-    "name": "项目名",
-    "dirsize": "大小",
-    "updateTime": "最后修改",
-    "uname": "作者",
-    "keywords": "关键词",
-    "description": "描述",
-    "total": "总计",
-    "selectAll": "全选",
-    "delete": "删除",
-    "ok": "确定"
-  },
-  "dialog": {
-    "ok": "确认",
-    "cancel": "取消",
-    "error": "错误",
-    "success": "成功",
-    "warning": "警告",
-    "info": "提示",
-    "loading": "加载中",
-    "new": "新建",
-    "edit": "编辑",
-    "delete": "删除",
-    "save": "保存",
-    "userinfo": "个人信息",
-    "changePassword": "修改密码",
-    "oldPassword": "原密码",
-    "newPassword": "新密码",
-    "confirmNewPassword": "确认密码",
-    "inputOldPassword": "请输入原密码",
-    "inputNewPassword": "请输入新密码",
-    "inputConfirmNewPassword": "请确认新密码",
-    "passwordMismatch": "两次输入的密码不一致",
-    "passwordChangeSuccess": "密码修改成功",
-    "passwordChangeFailed": "密码修改失败",
-    "username": "用户名",
-    "nickname": "昵称",
-    "email": "邮箱",
-    "regTime": "注册时间",
-    "mobileNo": "手机号码"
-  }
-
-}

+ 261 - 0
src/components/layout/HeaderIcons.vue

@@ -0,0 +1,261 @@
+<template>
+  <div class="open-page-header-icons">
+    <el-button class="custom-icon-button">
+      <img :src="zk" style="width: 22px;" />
+    </el-button>
+    <el-button class="custom-icon-button">
+      <img :src="help" style="width: 22px;" />
+    </el-button>
+    <el-avatar :src="user" :size="22" />
+    <el-dropdown>
+      <div class="user-dropdown-trigger">
+        <span class="nickname">{{ nickName }}</span>
+        <el-icon class="el-icon--right"><arrow-down /></el-icon>
+      </div>
+      <template #dropdown>
+        <el-dropdown-menu>
+          <el-dropdown-item @click="handleProfile">
+            <el-icon><User /></el-icon>
+            <span>{{ $t('index.userinfo') }}</span>
+          </el-dropdown-item>
+          <el-dropdown-item @click="handleChangePassword">
+            <el-icon><Key /></el-icon>
+            <span>{{ $t('index.changePassword') }}</span>
+          </el-dropdown-item>
+          <el-dropdown-item divided @click="handleLogout" style="color: #F56C6C;">
+            <el-icon><SwitchButton /></el-icon>
+            <span>{{ $t('index.logout') }}</span>
+          </el-dropdown-item>
+        </el-dropdown-menu>
+      </template>
+    </el-dropdown>
+
+    <el-dialog v-model="dialog.userinfoDialog" align-center :append-to-body="true" 
+      width="500" class="dialog_class" draggable>
+
+      <template #header="{ titleId, titleClass }">
+        <div class="my-header ">
+          <!-- <el-image :src="icon" fit="contain"></el-image> -->
+          <h4 :id="titleId" :class="titleClass">{{ $t('dialog.userinfo') }}</h4>
+        </div>
+      </template>
+      
+      <el-card class="userinfo-card" shadow="never">
+        <template #header>
+          <div class="userinfo-header">
+            <el-avatar :src="user" :size="30"/>
+            <h4 class="userinfo-nickname">{{ userStore.userInfo.nickName || 'User' }}</h4>
+          </div>
+          
+        </template>
+        <el-form :label-width="labelWidth" class="userinfo-form">
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item :label="$t('dialog.username')">
+                {{ userStore.userInfo.userName }}
+              </el-form-item>
+              <el-form-item :label="$t('dialog.mobileNo')">
+                {{ userStore.userInfo.mobileNo }}
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item :label="$t('dialog.nickname')">
+                {{ userStore.userInfo.nickName || 'User' }}
+              </el-form-item>
+              <el-form-item :label="$t('dialog.email')">
+                {{ userStore.userInfo.email }}
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-form-item :label="$t('dialog.regTime')">
+            {{ userStore.userInfo.regTime }}
+          </el-form-item>
+        </el-form>
+      </el-card>
+
+      <template #footer>
+        <span class="userinfo-footer lastbtn">
+          <el-button @click="dialog.userinfoDialog = false">{{ $t('dialog.cancel') }}</el-button>
+          <el-button @click="dialog.userinfoDialog = false">
+            {{ $t('dialog.ok') }}
+          </el-button>
+        </span>
+      </template>
+
+    </el-dialog>
+
+    <!-- 修改密码 -->
+    <el-dialog v-model="dialog.changePassword" align-center :append-to-body="true" 
+      width="500" class="dialog_class" draggable>
+
+      <template #header="{ titleId, titleClass }">
+        <div class="my-header ">
+          <!-- <el-image :src="icon" fit="contain"></el-image> -->
+          <h4 :id="titleId" :class="titleClass">{{ $t('dialog.changePassword') }}</h4>
+        </div>
+      </template>
+      
+      <el-card class="userinfo-card" shadow="never">
+        
+        <el-form :label-width="labelWidth1">
+          <el-form-item :label="`${$t('dialog.oldPassword')}:`">
+            <el-input v-model="pwd.oldPassword" 
+            type="password"
+            show-password 
+            :placeholder="$t('dialog.inputOldPassword')" />
+          </el-form-item>
+          <el-form-item :label="`${$t('dialog.newPassword')}:`">
+            <el-input v-model="pwd.newPassword" 
+            type="password"
+            show-password 
+            :placeholder="$t('dialog.inputNewPassword')" />
+          </el-form-item>
+          <el-form-item :label="`${$t('dialog.confirmNewPassword')}:`">
+            <el-input v-model="pwd.confirmNewPassword" 
+            type="password"
+            show-password
+            :placeholder="$t('dialog.inputConfirmNewPassword')" />
+          </el-form-item>
+        </el-form>
+      </el-card>
+
+      <template #footer>
+        <span class="lastbtn">
+          <el-button @click="dialog.changePassword = false">{{ $t('dialog.cancel') }}</el-button>
+          <el-button @click="ChangePassword">
+            {{ $t('dialog.ok') }}
+          </el-button>
+        </span>
+      </template>
+
+    </el-dialog>
+
+  </div>
+  
+</template>
+
+<script setup>
+import { ElMessageBox, ElMessage } from 'element-plus'
+import { useRouter } from 'vue-router'
+import { useUserStore } from '@/store/user'
+import { useI18n } from 'vue-i18n'
+import { removeToken,removeUserId} from "@/utils/token";
+import { ArrowDown, User, Key, SwitchButton } from '@element-plus/icons-vue'
+import zk from '@/assets/img/zk.png'
+import help from '@/assets/img/help.png'
+import user from '@/assets/img/user.png'
+
+const { t, locale} = useI18n()
+const router = useRouter()
+const userStore = useUserStore()
+const nickName = computed(() => userStore.userInfo.nickName || 'User')
+
+const showProfileDialog = ref(false)
+const showPasswordDialog = ref(false)
+
+const labelWidth = computed(() => {
+  return locale.value === 'zh-CN' ? '80px' : '120px'
+})
+
+const labelWidth1 = computed(() => {
+  return locale.value === 'zh-CN' ? '90px' : '140px'
+})
+
+let dialog = ref({
+  userinfoDialog: false,
+  changePassword: false,
+});
+
+let pwd = ref({
+  oldPassword: '',
+  newPassword: '',
+  confirmNewPassword: ''
+})
+
+const handleProfile = () => {
+  dialog.value.userinfoDialog = true;
+}
+
+const handleChangePassword = () => {
+  dialog.value.changePassword = true;
+  pwd.value.oldPassword = '';
+  pwd.value.newPassword = '';
+  pwd.value.confirmNewPassword = '';
+}
+
+const ChangePassword = () => {
+  if (!pwd.value.oldPassword) {
+    ElMessage.error(t('dialog.inputOldPassword'));
+    return;
+  }else if(!pwd.value.newPassword) {
+    ElMessage.error(t('dialog.inputNewPassword'));
+    return;
+  }else if(!pwd.value.confirmNewPassword) {
+    ElMessage.error(t('dialog.inputConfirmNewPassword'));
+    return;
+  }
+  if (pwd.value.newPassword !== pwd.value.confirmNewPassword) {
+    ElMessage.error(t('dialog.passwordMismatch'));
+    return;
+  }
+
+  const params = {
+      transCode: "B00003",
+      oldPassword: enPassword(pwd.value.oldPassword),
+      newPassword: enPassword( pwd.value.newPassword),
+    } 
+
+  request(params).then(res => {
+    ElMessage.success(t('dialog.passwordChangeSuccess'));
+    dialog.value.changePassword = false;
+  }).catch(error => {
+    console.error(error);
+    ElMessage.error(t('dialog.passwordChangeFailed'));
+  });
+}
+
+const handleLogout = () => {
+  userStore.clearUserInfo();
+  removeToken();
+  removeUserId();
+  // 跳转到登录页面
+  ElMessage.success(t('message.logoutSuccess'));
+  router.push('/login');
+}
+
+</script>
+
+<style scoped>
+.open-page-header-icons {
+  width: 150px;
+  display: flex;
+  align-items: center;
+  justify-content: space-around;
+}
+.open-page-header-icons .el-button {
+  padding: 0;
+  border: none;
+  margin: 0;
+}
+.user-dropdown-trigger {
+  display: flex;
+  align-items: center;
+  cursor: pointer;
+}
+.nickname {
+  margin-right: 4px;
+}
+
+
+.userinfo-header {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  
+}
+
+.userinfo-footer {
+  display: flex;
+  justify-content: center;
+}
+</style>

+ 7 - 225
src/components/layout/openpage.vue

@@ -9,47 +9,13 @@
           <div class="open-page-header-title">
             {{ $t('index.headetag') }}
           </div>
-          <div class="open-page-header-icons">
-            <el-button class="custom-icon-button">
-              <img :src="zk" style="width: 22px;"/>
-            </el-button>
-            <el-button class="custom-icon-button">
-              <img :src="help" style="width: 22px;"/>
-            </el-button>
-            <el-avatar :src="user" :size="22"/>
-            <el-dropdown>
-              <div class="user-dropdown-trigger">
-                <span class="nickname">{{ nickName }}</span>
-                <el-icon class="el-icon--right"><arrow-down /></el-icon>
-              </div>
-
-             <template #dropdown>
-                <el-dropdown-menu>
-                <!-- 上半部分:个人信息和修改密码 -->
-                  <el-dropdown-item @click="handleProfile">
-                    <el-icon><User /></el-icon>
-                    <span>{{ $t('index.userinfo') }}</span>
-                  </el-dropdown-item>
-                  <el-dropdown-item @click="handleChangePassword">
-                    <el-icon><Key /></el-icon>
-                    <span>{{ $t('index.changePassword') }}</span>
-                  </el-dropdown-item>
-
-                  <!-- 下半部分:退出登录 -->
-                  <el-dropdown-item divided @click="handleLogout" style="color: #F56C6C;">
-                    <el-icon><SwitchButton /></el-icon>
-                    <span>{{ $t('index.logout') }}</span>
-                  </el-dropdown-item>
-                  </el-dropdown-menu>
-              </template>
-            </el-dropdown>
-          </div>
+          <HeaderIcons />
         </div>
         <div class="open-page-content">
           <div class="open-page-leftside">
             <el-menu
               class="open-page-menu"
-              default-active="activeIndex"
+              :default-active="activeIndex"
               :router='true'
             >
               <el-menu-item index="/project">
@@ -69,110 +35,16 @@
       </div>
     </el-main>
 
-    <el-dialog v-model="dialog.userinfoDialog" align-center :append-to-body="true" 
-      width="500" class="dialog_class" draggable>
-
-      <template #header="{ titleId, titleClass }">
-        <div class="my-header ">
-          <!-- <el-image :src="icon" fit="contain"></el-image> -->
-          <h4 :id="titleId" :class="titleClass">{{ $t('dialog.userinfo') }}</h4>
-        </div>
-      </template>
-      
-      <el-card class="userinfo-card" shadow="never">
-        <template #header>
-          <div class="userinfo-header">
-            <el-avatar :src="user" :size="30"/>
-            <h4 class="userinfo-nickname">{{ userStore.userInfo.nickName || 'User' }}</h4>
-          </div>
-          
-        </template>
-        <el-form :label-width="labelWidth" class="userinfo-form">
-          <el-row :gutter="20">
-            <el-col :span="12">
-              <el-form-item :label="$t('dialog.username')">
-                {{ userStore.userInfo.userName }}
-              </el-form-item>
-              <el-form-item :label="$t('dialog.mobileNo')">
-                {{ userStore.userInfo.mobileNo }}
-              </el-form-item>
-            </el-col>
-            <el-col :span="12">
-              <el-form-item :label="$t('dialog.nickname')">
-                {{ userStore.userInfo.nickName || 'User' }}
-              </el-form-item>
-              <el-form-item :label="$t('dialog.email')">
-                {{ userStore.userInfo.email }}
-              </el-form-item>
-            </el-col>
-          </el-row>
-          <el-form-item :label="$t('dialog.regTime')">
-            {{ userStore.userInfo.regTime }}
-          </el-form-item>
-        </el-form>
-      </el-card>
-
-      <template #footer>
-        <span class="userinfo-footer lastbtn">
-          <el-button @click="dialog.userinfoDialog = false">{{ $t('dialog.cancel') }}</el-button>
-          <el-button @click="dialog.userinfoDialog = false">
-            {{ $t('dialog.ok') }}
-          </el-button>
-        </span>
-      </template>
-
-    </el-dialog>
-
-    <!-- 修改密码 -->
-    <el-dialog v-model="dialog.changePassword" align-center :append-to-body="true" 
-      width="500" class="dialog_class" draggable>
-
-      <template #header="{ titleId, titleClass }">
-        <div class="my-header ">
-          <!-- <el-image :src="icon" fit="contain"></el-image> -->
-          <h4 :id="titleId" :class="titleClass">{{ $t('dialog.changePassword') }}</h4>
-        </div>
-      </template>
-      
-      <el-card class="userinfo-card" shadow="never">
-        
-        <el-form :label-width="labelWidth1">
-          <el-form-item :label="`${$t('dialog.oldPassword')}:`">
-            <el-input v-model="pwd.oldPassword" 
-            type="password"
-            show-password 
-            :placeholder="$t('dialog.inputOldPassword')" />
-          </el-form-item>
-          <el-form-item :label="`${$t('dialog.newPassword')}:`">
-            <el-input v-model="pwd.newPassword" 
-            type="password"
-            show-password 
-            :placeholder="$t('dialog.inputNewPassword')" />
-          </el-form-item>
-          <el-form-item :label="`${$t('dialog.confirmNewPassword')}:`">
-            <el-input v-model="pwd.confirmNewPassword" 
-            type="password"
-            show-password
-            :placeholder="$t('dialog.inputConfirmNewPassword')" />
-          </el-form-item>
-        </el-form>
-      </el-card>
-
-      <template #footer>
-        <span class="lastbtn">
-          <el-button @click="dialog.changePassword = false">{{ $t('dialog.cancel') }}</el-button>
-          <el-button @click="ChangePassword">
-            {{ $t('dialog.ok') }}
-          </el-button>
-        </span>
-      </template>
+    
 
-    </el-dialog>
+    
   </div>
 </template>
 
 <script setup>
 import myheader from '@/components/layout/header.vue'
+import HeaderIcons from '@/components/layout/HeaderIcons.vue'
+
 import { RouterView, RouterLink,useRouter } from "vue-router"
 import { request, enPassword } from "@/utils/request";
 import { ElMessage } from 'element-plus'
@@ -192,26 +64,13 @@ import user from '@/assets/img/user.png'
 const router = useRouter();
 const userStore = useUserStore();
 
-const nickName = userStore.userInfo.nickName || 'User';
-
-const labelWidth = computed(() => {
-  return locale.value === 'zh-CN' ? '80px' : '120px'
-})
-
-const labelWidth1 = computed(() => {
-  return locale.value === 'zh-CN' ? '90px' : '140px'
-})
 
 let dialog = ref({
   userinfoDialog: false,
   changePassword: false,
 });
 
-let pwd = ref({
-  oldPassword: '',
-  newPassword: '',
-  confirmNewPassword: ''
-})
+
 
 const activeIndex = computed(() => {
   // 获取当前路由的所有匹配路径
@@ -220,58 +79,6 @@ const activeIndex = computed(() => {
   return matched[matched.length - 1]?.path || '/project'
 })
 
-const handleProfile = () => {
-  dialog.value.userinfoDialog = true;
-  
-}
-
-const handleChangePassword = () => {
-  dialog.value.changePassword = true;
-  pwd.value.oldPassword = '';
-  pwd.value.newPassword = '';
-  pwd.value.confirmNewPassword = '';
-}
-
-const ChangePassword = () => {
-  if (!pwd.value.oldPassword) {
-    ElMessage.error(t('dialog.inputOldPassword'));
-    return;
-  }else if(!pwd.value.newPassword) {
-    ElMessage.error(t('dialog.inputNewPassword'));
-    return;
-  }else if(!pwd.value.confirmNewPassword) {
-    ElMessage.error(t('dialog.inputConfirmNewPassword'));
-    return;
-  }
-  if (pwd.value.newPassword !== pwd.value.confirmNewPassword) {
-    ElMessage.error(t('dialog.passwordMismatch'));
-    return;
-  }
-
-  const params = {
-      transCode: "B00003",
-      oldPassword: enPassword(pwd.value.oldPassword),
-      newPassword: enPassword( pwd.value.newPassword),
-    } 
-
-  request(params).then(res => {
-    ElMessage.success(t('dialog.passwordChangeSuccess'));
-    dialog.value.changePassword = false;
-  }).catch(error => {
-    console.error(error);
-    ElMessage.error(t('dialog.passwordChangeFailed'));
-  });
-}
-
-const handleLogout = () => {
-  userStore.clearUserInfo();
-  removeToken();
-  removeUserId();
-  // 跳转到登录页面
-  ElMessage.success(t('message.logoutSuccess'));
-  router.push('/login');
-}
-
 </script>
 
 <style scoped>
@@ -294,13 +101,6 @@ const handleLogout = () => {
   color: #333333;
 }
 
-.open-page-header-icons{
-  width: 150px;
-  display: flex;
-  align-items: center;
-  justify-content: space-around;
-}
-
 .open-page-header-icons .el-button {
   padding: 0;
   border: none;
@@ -345,22 +145,4 @@ const handleLogout = () => {
   text-transform: none;
 }
 
-.user-dropdown-trigger {
-  display: flex;
-  align-items: center;
-  cursor: pointer;
-}
-
-.userinfo-header {
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  
-}
-
-.userinfo-footer {
-  display: flex;
-  justify-content: center;
-}
-
 </style>

+ 48 - 27
src/utils/i18n.js

@@ -1,35 +1,56 @@
-import { createI18n } from 'vue-i18n'
+// import { createI18n } from 'vue-i18n'
 
 // 缓存已加载语言包,避免重复加载
-const loadedLanguages = []
+// const loadedLanguages = []
+
+// const i18n = createI18n({
+//   legacy: false,
+//   locale: localStorage.getItem('locale') || 'zh-CN',
+//   fallbackLocale: 'en',
+//   messages: {}  // 初始为空,动态加载
+// })
+
+// // 动态加载语言包函数
+// export async function loadLocaleMessages(locale) {
+//   if (loadedLanguages.includes(locale)) {
+//     return Promise.resolve()
+//   }
+//   try {
+//     const baseUrl = import.meta.env.VITE_BASE_URL || ''
+//     const response = await fetch(`${baseUrl}/locales/${locale}.json`)
+//     if (!response.ok) throw new Error('Failed to load locale messages')
+//     const messages = await response.json()
+//     i18n.global.setLocaleMessage(locale, messages)
+//     loadedLanguages.push(locale)
+//     return Promise.resolve()
+//   } catch (error) {
+//     console.error(error)
+//     return Promise.reject(error)
+//   }
+// }
+
+// // 应用初始化时,加载默认语言包
+// loadLocaleMessages(i18n.global.locale.value)
+
+// export default i18n
+
+
+import { createI18n } from 'vue-i18n'
+import en from '../locales/en.json'
+import zhCN from '../locales/zh-CN.json'
+
+const messages = {
+  en,
+  'zh-CN': zhCN
+}
 
 const i18n = createI18n({
-  legacy: false,
-  locale: localStorage.getItem('locale') || 'zh-CN',
-  fallbackLocale: 'en',
-  messages: {}  // 初始为空,动态加载
+  legacy: false, // 使用Composition API模式
+  locale: 'zh-CN', // 默认语言
+  fallbackLocale: 'en', // 备用语言
+  messages
 })
 
-// 动态加载语言包函数
-export async function loadLocaleMessages(locale) {
-  if (loadedLanguages.includes(locale)) {
-    return Promise.resolve()
-  }
-  try {
-    const baseUrl = import.meta.env.VITE_BASE_URL || ''
-    const response = await fetch(`${baseUrl}/locales/${locale}.json`)
-    if (!response.ok) throw new Error('Failed to load locale messages')
-    const messages = await response.json()
-    i18n.global.setLocaleMessage(locale, messages)
-    loadedLanguages.push(locale)
-    return Promise.resolve()
-  } catch (error) {
-    console.error(error)
-    return Promise.reject(error)
-  }
-}
+export default i18n
 
-// 应用初始化时,加载默认语言包
-loadLocaleMessages(i18n.global.locale.value)
 
-export default i18n

+ 17 - 7
src/views/preference/index.vue

@@ -31,7 +31,7 @@
 
 import { getCurrentInstance } from 'vue'
 import { useI18n } from 'vue-i18n'
-import { loadLocaleMessages } from '@/utils/i18n'
+// import { loadLocaleMessages } from '@/utils/i18n'
 import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
 import en from 'element-plus/dist/locale/en.mjs'
 
@@ -44,18 +44,28 @@ const languages = [
   { value: 'en', label: 'English' }
 ]
 
-watch(currentLang, async (newVal) => {
-  try {
-    await loadLocaleMessages(newVal) // 动态加载语言包
+// public放中英文时
+// watch(currentLang, async (newVal) => {
+//   try {
+//     await loadLocaleMessages(newVal) // 动态加载语言包
+//     locale.value = newVal
+//     localStorage.setItem('locale', newVal)
+
+//     // 切换 Element Plus 语言
+//     const elementLocale = newVal === 'zh-CN' ? zhCn : en
+//     appContext.config.globalProperties.$ELEMENT = { locale: elementLocale }
+//   } catch (error) {
+//     console.error('切换语言失败', error)
+//   }
+// })
+
+watch(currentLang, (newVal) => {
     locale.value = newVal
     localStorage.setItem('locale', newVal)
 
     // 切换 Element Plus 语言
     const elementLocale = newVal === 'zh-CN' ? zhCn : en
     appContext.config.globalProperties.$ELEMENT = { locale: elementLocale }
-  } catch (error) {
-    console.error('切换语言失败', error)
-  }
 })