Quellcode durchsuchen

租户套餐的国际化基本完成

Huanyi vor 1 Woche
Ursprung
Commit
0234784eca

+ 4 - 1
src/lang/en_US.ts

@@ -4,6 +4,7 @@ import system from './modules/system/index_en';
 import monitor from './modules/monitor/index_en';
 import setting from './modules/setting/index_en';
 import tool from './modules/tool/en_US';
+import project from './modules/project/index_en';
 
 export default {
   // 路由国际化
@@ -102,5 +103,7 @@ export default {
   // 设置管理模块
   ...setting,
   // 工具模块
-  ...tool
+  ...tool,
+  // 项目管理模块
+  ...project
 };

+ 6 - 0
src/lang/modules/project/index.ts

@@ -0,0 +1,6 @@
+// 项目管理模块 - 统一导出
+import management from './management/zh_CN';
+
+export default {
+  management
+};

+ 6 - 0
src/lang/modules/project/index_en.ts

@@ -0,0 +1,6 @@
+// Project Management Module - Export (English)
+import management from './management/en_US';
+
+export default {
+  management
+};

+ 110 - 0
src/lang/modules/project/management/en_US.ts

@@ -0,0 +1,110 @@
+// Project Management Module - English Translation
+export default {
+  // Search Form
+  search: {
+    code: 'Project Code',
+    codePlaceholder: 'Please enter project code',
+    name: 'Name',
+    namePlaceholder: 'Please enter name',
+    language: 'Project Language',
+    languagePlaceholder: 'Please select project language',
+    type: 'Project Type',
+    typePlaceholder: 'Please select project type',
+    pdGpd: 'PD/GPD',
+    pdGpdPlaceholder: 'Please enter PD/GPD',
+    pmGpm: 'PM/GPM',
+    pmGpmPlaceholder: 'Please enter PM/GPM',
+    ctaGcta: 'CTA/GCTA',
+    ctaGctaPlaceholder: 'Please enter CTA/GCTA',
+    sponsor: 'Sponsor',
+    sponsorPlaceholder: 'Please enter sponsor',
+    cro: 'CRO',
+    croPlaceholder: 'Please enter CRO',
+    note: 'Note',
+    notePlaceholder: 'Please enter note',
+    createTime: 'Create Time',
+    createTimePlaceholder: 'Please select create time',
+    updateTime: 'Update Time',
+    updateTimePlaceholder: 'Please select update time',
+    search: 'Search',
+    reset: 'Reset'
+  },
+  // Button Operations
+  button: {
+    add: 'Add',
+    edit: 'Edit',
+    delete: 'Delete',
+    export: 'Export',
+    submit: 'Submit',
+    cancel: 'Cancel'
+  },
+  // Table Columns
+  table: {
+    id: 'ID',
+    code: 'Project Code',
+    name: 'Name',
+    icon: 'Icon',
+    language: 'Project Language',
+    type: 'Project Type',
+    status: 'Status',
+    pdGpd: 'PD/GPD',
+    pmGpm: 'PM/GPM',
+    ctaGcta: 'CTA/GCTA',
+    sponsor: 'Sponsor',
+    cro: 'CRO',
+    note: 'Note',
+    createTime: 'Create Time',
+    updateTime: 'Update Time',
+    operation: 'Operation'
+  },
+  // Form
+  form: {
+    code: 'Project Code',
+    codePlaceholder: 'Please enter project code',
+    name: 'Name',
+    namePlaceholder: 'Please enter name',
+    icon: 'Icon',
+    language: 'Project Language',
+    languagePlaceholder: 'Please select project language',
+    type: 'Project Type',
+    typePlaceholder: 'Please select project type',
+    pdGpd: 'PD/GPD',
+    pdGpdPlaceholder: 'Please enter PD/GPD',
+    pmGpm: 'PM/GPM',
+    pmGpmPlaceholder: 'Please enter PM/GPM',
+    ctaGcta: 'CTA/GCTA',
+    ctaGctaPlaceholder: 'Please enter CTA/GCTA',
+    sponsor: 'Sponsor',
+    sponsorPlaceholder: 'Please enter sponsor',
+    cro: 'CRO',
+    croPlaceholder: 'Please enter CRO',
+    note: 'Note',
+    notePlaceholder: 'Please enter note'
+  },
+  // Dialog Titles
+  dialog: {
+    add: 'Add Project',
+    edit: 'Edit Project'
+  },
+  // Messages
+  message: {
+    deleteConfirm: 'Are you sure you want to delete the project with code "{ids}"?',
+    deleteSuccess: 'Delete successfully',
+    operationSuccess: 'Operation successful'
+  },
+  // Tooltip
+  tooltip: {
+    edit: 'Edit',
+    delete: 'Delete'
+  },
+  // Validation Rules
+  rule: {
+    idRequired: 'ID cannot be empty',
+    codeRequired: 'Project code cannot be empty',
+    nameRequired: 'Name cannot be empty',
+    iconRequired: 'Icon cannot be empty',
+    languageRequired: 'Project language cannot be empty',
+    typeRequired: 'Project type cannot be empty',
+    statusRequired: 'Status cannot be empty'
+  }
+};

+ 110 - 0
src/lang/modules/project/management/zh_CN.ts

@@ -0,0 +1,110 @@
+// 项目管理模块 - 中文翻译
+export default {
+  // 搜索表单
+  search: {
+    code: '项目编号',
+    codePlaceholder: '请输入项目编号',
+    name: '名称',
+    namePlaceholder: '请输入名称',
+    language: '项目语言',
+    languagePlaceholder: '请选择项目语言',
+    type: '项目类型',
+    typePlaceholder: '请选择项目类型',
+    pdGpd: 'PD/GPD',
+    pdGpdPlaceholder: '请输入PD/GPD',
+    pmGpm: 'PM/GPM',
+    pmGpmPlaceholder: '请输入PM/GPM',
+    ctaGcta: 'CTA/GCTA',
+    ctaGctaPlaceholder: '请输入CTA/GCTA',
+    sponsor: '申办方',
+    sponsorPlaceholder: '请输入申办方',
+    cro: 'CRO',
+    croPlaceholder: '请输入CRO',
+    note: '备注',
+    notePlaceholder: '请输入备注',
+    createTime: '创建时间',
+    createTimePlaceholder: '请选择创建时间',
+    updateTime: '更新时间',
+    updateTimePlaceholder: '请选择更新时间',
+    search: '搜索',
+    reset: '重置'
+  },
+  // 按钮操作
+  button: {
+    add: '新增',
+    edit: '修改',
+    delete: '删除',
+    export: '导出',
+    submit: '确 定',
+    cancel: '取 消'
+  },
+  // 表格列
+  table: {
+    id: '序号',
+    code: '项目编号',
+    name: '名称',
+    icon: '图标',
+    language: '项目语言',
+    type: '项目类型',
+    status: '状态',
+    pdGpd: 'PD/GPD',
+    pmGpm: 'PM/GPM',
+    ctaGcta: 'CTA/GCTA',
+    sponsor: '申办方',
+    cro: 'CRO',
+    note: '备注',
+    createTime: '创建时间',
+    updateTime: '更新时间',
+    operation: '操作'
+  },
+  // 表单
+  form: {
+    code: '项目编号',
+    codePlaceholder: '请输入项目编号',
+    name: '名称',
+    namePlaceholder: '请输入名称',
+    icon: '图标',
+    language: '项目语言',
+    languagePlaceholder: '请选择项目语言',
+    type: '项目类型',
+    typePlaceholder: '请选择项目类型',
+    pdGpd: 'PD/GPD',
+    pdGpdPlaceholder: '请输入PD/GPD',
+    pmGpm: 'PM/GPM',
+    pmGpmPlaceholder: '请输入PM/GPM',
+    ctaGcta: 'CTA/GCTA',
+    ctaGctaPlaceholder: '请输入CTA/GCTA',
+    sponsor: '申办方',
+    sponsorPlaceholder: '请输入申办方',
+    cro: 'CRO',
+    croPlaceholder: '请输入CRO',
+    note: '备注',
+    notePlaceholder: '请输入备注'
+  },
+  // 对话框标题
+  dialog: {
+    add: '添加项目',
+    edit: '修改项目'
+  },
+  // 提示信息
+  message: {
+    deleteConfirm: '是否确认删除项目编号为"{ids}"的数据项?',
+    deleteSuccess: '删除成功',
+    operationSuccess: '操作成功'
+  },
+  // Tooltip 提示
+  tooltip: {
+    edit: '修改',
+    delete: '删除'
+  },
+  // 验证规则
+  rule: {
+    idRequired: '序号不能为空',
+    codeRequired: '项目编号不能为空',
+    nameRequired: '名称不能为空',
+    iconRequired: '图标不能为空',
+    languageRequired: '项目语言不能为空',
+    typeRequired: '项目类型不能为空',
+    statusRequired: '状态不能为空'
+  }
+};

+ 4 - 1
src/lang/zh_CN.ts

@@ -4,6 +4,7 @@ import system from './modules/system/index';
 import monitor from './modules/monitor/index';
 import setting from './modules/setting/index';
 import tool from './modules/tool/zh_CN';
+import project from './modules/project/index';
 
 export default {
   // 路由国际化
@@ -102,5 +103,7 @@ export default {
   // 设置管理模块
   ...setting,
   // 工具模块
-  ...tool
+  ...tool,
+  // 项目管理模块
+  ...project
 };

+ 32 - 1
src/views/system/tenantPackage/index.vue

@@ -113,9 +113,11 @@ import { TenantPkgForm, TenantPkgQuery, TenantPkgVO } from '@/api/system/tenantP
 import { MenuTreeOption } from '@/api/system/menu/types';
 import to from 'await-to-js';
 import { useI18n } from 'vue-i18n';
+import { useAppStore } from '@/store/modules/app';
 
 const { t } = useI18n();
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const appStore = useAppStore();
 
 const tenantPackageList = ref<TenantPkgVO[]>([]);
 const buttonLoading = ref(false);
@@ -160,6 +162,34 @@ const data = reactive<PageData<TenantPkgForm, TenantPkgQuery>>({
 
 const { queryParams, form, rules } = toRefs(data);
 
+/** 解析多语言标签 */
+const parseI18nLabel = (label: string): string => {
+  try {
+    // 尝试解析JSON格式的多语言标签
+    const parsed = JSON.parse(label);
+    // 获取当前语言,如果没有对应的翻译则使用中文,再没有则返回原始标签
+    const currentLang = appStore.language;
+    return parsed[currentLang] || parsed['zh_CN'] || label;
+  } catch (e) {
+    // 如果不是JSON格式,直接返回原标签
+    return label;
+  }
+};
+
+/** 递归处理菜单树的标签国际化 */
+const processMenuTreeI18n = (menus: MenuTreeOption[]): MenuTreeOption[] => {
+  return menus.map(menu => {
+    const processedMenu = {
+      ...menu,
+      label: parseI18nLabel(menu.label)
+    };
+    if (menu.children && menu.children.length > 0) {
+      processedMenu.children = processMenuTreeI18n(menu.children);
+    }
+    return processedMenu;
+  });
+};
+
 // 所有菜单节点数据
 const getMenuAllCheckedKeys = (): any => {
   // 目前被选中的菜单节点
@@ -175,7 +205,8 @@ const getMenuAllCheckedKeys = (): any => {
 /** 根据企业套餐ID查询菜单树结构 */
 const getPackageMenuTreeselect = async (packageId: string | number) => {
   const res = await tenantPackageMenuTreeselect(packageId);
-  menuOptions.value = res.data.menus;
+  // 处理菜单树的国际化标签
+  menuOptions.value = processMenuTreeI18n(res.data.menus);
   return Promise.resolve(res);
 };