瀏覽代碼

多语言的俄文添加,设置俄文静态文件

lipenghui 2 月之前
父節點
當前提交
c7fc976196

+ 12 - 8
src/components/language/LangInput.vue

@@ -27,7 +27,7 @@
               <el-input v-model="englishValue" placeholder="英文" />
             </div>
             <div class="lang-item mt-10">
-              <span class="flag-icon uk-flag"></span>
+              <span class="flag-icon ru-flag"></span>
               <el-input v-model="russiaValue" placeholder="俄文" />
             </div>
             <div class="popover-footer">
@@ -68,22 +68,23 @@ const displayValue = computed({
     return props.modelValue.split('~~')[0] || ''
   },
   set(val) {
-    if (englishValue.value !== null&&englishValue.value !== undefined&&englishValue.value !== '') {
-      emit('update:modelValue', val + '~~' + englishValue.value)
-    }else {
+    // if (englishValue.value !== null&&englishValue.value !== undefined&&englishValue.value !== '') {
+    //   emit('update:modelValue', val + '~~en**' + englishValue.value)
+    // }else {
       emit('update:modelValue', val)
-    }
+    // }
   }
 })
 
 watch(() => props.modelValue, (newVal) => {
-  const [chinese, english] = newVal.split('~~')
+  const [chinese, english, russia] = newVal.split('~~')
   chineseValue.value = chinese || ''
-  englishValue.value = english || ''
+  englishValue.value = english?english.replace('en**','') : ''
+  russiaValue.value = russia?russia.replace('ru**','') : ''
 }, { immediate: true })
 
 const saveLang = () => {
-  emit('update:modelValue', chineseValue.value + '~~' + 'en**'+englishValue.value)
+  emit('update:modelValue', chineseValue.value + '~~en**' + englishValue.value+'~~ru**'+russiaValue.value)
 }
 
 const closePopover = () => {
@@ -127,6 +128,9 @@ const saveAndClose = () => {
 .uk-flag {
   background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 60 30'%3e%3cpath fill='%23012169' d='M0 0h60v30H0z'/%3e%3cpath fill='%23fff' d='M0 0l60 30m0-30L0 30' stroke='%23fff' stroke-width='6'/%3e%3cpath fill='%23c8102e' d='M0 0l60 30m0-30L0 30' stroke='%23c8102e' stroke-width='4'/%3e%3cpath fill='%23c8102e' d='M30 0v30M0 15h60' stroke='%23fff' stroke-width='10'/%3e%3c/svg%3e");
 }
+.ru-flag {
+  background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 60 30'%3e%3crect width='60' height='10' fill='%23FFFFFF'/%3e%3crect y='10' width='60' height='10' fill='%230039A6'/%3e%3crect y='20' width='60' height='10' fill='%23D52B1E'/%3e%3c/svg%3e");
+}
 .mt-10 {
   margin-top: 10px;
 }

+ 1 - 1
src/config/axios/service.ts

@@ -180,7 +180,7 @@ service.interceptors.response.use(
 
       const requestUrl = response.config.url || ''
       // 判断是否包含rq/iot路径
-      if (requestUrl.includes('rq/')||requestUrl.includes('system/dict')||requestUrl.includes('system/auth/get-permission-info')||requestUrl.includes('system/menu/list')) {
+      if (requestUrl.includes('rq/')||requestUrl.includes('system/dict')||requestUrl.includes('system/auth/get-permission-info')||requestUrl.includes('system/menu/list')||requestUrl.includes('system/menu/simple-list')) {
         const localeStore = useLocaleStore()
         const lang = localeStore.getCurrentLocale.lang
         if (data&& data.data) {

+ 7 - 1
src/layout/components/LocaleDropdown/src/LocaleDropdown.vue

@@ -3,6 +3,7 @@ import { useLocaleStore } from '@/store/modules/locale'
 import { useLocale } from '@/hooks/web/useLocale'
 import { propTypes } from '@/utils/propTypes'
 import { useDesign } from '@/hooks/web/useDesign'
+import {useCache,CACHE_KEY} from "@/hooks/web/useCache";
 
 defineOptions({ name: 'LocaleDropdown' })
 
@@ -15,6 +16,7 @@ defineProps({
 })
 
 const localeStore = useLocaleStore()
+const { wsCache } = useCache()
 
 const langMap = computed(() => localeStore.getLocaleMap)
 
@@ -23,12 +25,16 @@ const currentLang = computed(() => localeStore.getCurrentLocale)
 const setLang = (lang: LocaleType) => {
   if (lang === unref(currentLang).lang) return
   // 需要重新加载页面让整个语言多初始化
-  window.location.reload()
+  // window.location.reload()
   localeStore.setCurrentLocale({
     lang
   })
   const { changeLocale } = useLocale()
   changeLocale(lang)
+  // 清空,从而触发刷新
+  wsCache.delete(CACHE_KEY.USER)
+  wsCache.delete(CACHE_KEY.ROLE_ROUTERS)
+  location.reload()
 }
 </script>
 

+ 990 - 0
src/locales/ru.ts

@@ -0,0 +1,990 @@
+export default {
+  common: {
+    sort:'排序',
+    inputText: '请输入',
+    selectText: '请选择',
+    startTimeText: '开始时间',
+    endTimeText: '结束时间',
+    login: '登录',
+    required: '该项为必填项',
+    loginOut: '退出系统',
+    document: '项目文档',
+    profile: '个人中心',
+    reminder: '温馨提示',
+    loginOutMessage: '是否退出本系统?',
+    back: '返回',
+    ok: '确定',
+    save: '保存',
+    cancel: '取消',
+    close: '关闭',
+    reload: '重新加载',
+    success: '成功',
+    closeTab: '关闭标签页',
+    closeTheLeftTab: '关闭左侧标签页',
+    closeTheRightTab: '关闭右侧标签页',
+    closeOther: '关闭其他标签页',
+    closeAll: '关闭全部标签页',
+    prevLabel: '上一步',
+    nextLabel: '下一步',
+    skipLabel: '跳过',
+    doneLabel: '结束',
+    menu: '菜单',
+    menuDes: '以路由的结构渲染的菜单栏',
+    collapse: '展开缩收',
+    collapseDes: '展开和缩放菜单栏',
+    tagsView: '标签页',
+    tagsViewDes: '用于记录路由历史记录',
+    tool: '工具',
+    toolDes: '用于设置定制系统',
+    query: '查询',
+    reset: '重置',
+    shrink: '收起',
+    expand: '展开',
+    confirmTitle: '系统提示',
+    exportMessage: '是否确认导出数据项?',
+    importMessage: '是否确认导入数据项?',
+    createSuccess: '新增成功',
+    updateSuccess: '修改成功',
+    delMessage: '是否删除所选中数据?',
+    delDataMessage: '是否删除数据?',
+    delNoData: '请选择需要删除的数据',
+    delSuccess: '删除成功',
+    index: '序号',
+    status: '状态',
+    createTime: '创建时间',
+    updateTime: '更新时间',
+    copy: '复制',
+    copySuccess: '复制成功',
+    copyError: '复制失败'
+  },
+  lock: {
+    lockScreen: '锁定屏幕',
+    lock: '锁定',
+    lockPassword: '锁屏密码',
+    unlock: '点击解锁',
+    backToLogin: '返回登录',
+    entrySystem: '进入系统',
+    placeholder: '请输入锁屏密码',
+    message: '锁屏密码错误'
+  },
+  error: {
+    noPermission: `抱歉,您无权访问此页面。`,
+    pageError: '抱歉,您访问的页面不存在。',
+    networkError: '抱歉,服务器报告错误。',
+    returnToHome: '返回首页',
+  },
+  permission: {
+    hasPermission: `请设置操作权限标签值`,
+    hasRole: `请设置角色权限标签值`
+  },
+  setting: {
+    projectSetting: '项目配置',
+    theme: '主题',
+    layout: '布局',
+    systemTheme: '系统主题',
+    menuTheme: '菜单主题',
+    interfaceDisplay: '界面显示',
+    breadcrumb: '面包屑',
+    breadcrumbIcon: '面包屑图标',
+    collapseMenu: '折叠菜单',
+    hamburgerIcon: '折叠图标',
+    screenfullIcon: '全屏图标',
+    sizeIcon: '尺寸图标',
+    localeIcon: '多语言图标',
+    messageIcon: '消息图标',
+    tagsView: '标签页',
+    tagsViewImmerse: '标签页沉浸',
+    logo: '标志',
+    greyMode: '灰色模式',
+    fixedHeader: '固定头部',
+    headerTheme: '头部主题',
+    cutMenu: '切割菜单',
+    copy: '拷贝',
+    clearAndReset: '清除缓存并且重置',
+    copySuccess: '拷贝成功',
+    copyFailed: '拷贝失败',
+    footer: '页脚',
+    uniqueOpened: '菜单手风琴',
+    tagsViewIcon: '标签页图标',
+    reExperienced: '请重新退出登录体验',
+    fixedMenu: '固定菜单'
+  },
+  size: {
+    default: '默认',
+    large: '大',
+    small: '小'
+  },
+  login: {
+    welcome: '欢迎使用本系统',
+    message: '',
+    tenantname: '租户名称',
+    username: '用户名',
+    password: '密码',
+    code: '验证码',
+    login: '登录',
+    relogin: '重新登录',
+    otherLogin: '其他登录方式',
+    register: '注册',
+    checkPassword: '确认密码',
+    remember: '记住我',
+    hasUser: '已有账号?去登录',
+    forgetPassword: '忘记密码?',
+    tenantNamePlaceholder: '请输入租户名称',
+    usernamePlaceholder: '请输入用户名',
+    passwordPlaceholder: '请输入密码',
+    codePlaceholder: '请输入验证码',
+    mobileTitle: '手机登录',
+    mobileNumber: '手机号码',
+    mobileNumberPlaceholder: '请输入手机号码',
+    backLogin: '返回',
+    getSmsCode: '获取验证码',
+    btnMobile: '手机登录',
+    btnQRCode: '钉钉扫码登录',
+    qrcode: '扫描二维码登录',
+    btnRegister: '注册',
+    SmsSendMsg: '验证码已发送',
+    resetPassword: "重置密码",
+    resetPasswordSuccess: "重置密码成功",
+    invalidTenantName: "无效的租户名称"
+  },
+  captcha: {
+    verification: '请完成安全验证',
+    slide: '向右滑动完成验证',
+    point: '请依次点击',
+    success: '验证成功',
+    fail: '验证失败'
+  },
+  router: {
+    login: '登录',
+    socialLogin: '社交登录',
+    home: '首页',
+    analysis: '分析页',
+    workplace: '工作台'
+  },
+  analysis: {
+    newUser: '新增用户',
+    unreadInformation: '未读消息',
+    transactionAmount: '成交金额',
+    totalShopping: '购物总量',
+    monthlySales: '每月销售额',
+    userAccessSource: '用户访问来源',
+    january: '一月',
+    february: '二月',
+    march: '三月',
+    april: '四月',
+    may: '五月',
+    june: '六月',
+    july: '七月',
+    august: '八月',
+    september: '九月',
+    october: '十月',
+    november: '十一月',
+    december: '十二月',
+    estimate: '预计',
+    actual: '实际',
+    directAccess: '直接访问',
+    mailMarketing: '邮件营销',
+    allianceAdvertising: '联盟广告',
+    videoAdvertising: '视频广告',
+    searchEngines: '搜索引擎',
+    weeklyUserActivity: '每周用户活跃量',
+    activeQuantity: '活跃量',
+    monday: '周一',
+    tuesday: '周二',
+    wednesday: '周三',
+    thursday: '周四',
+    friday: '周五',
+    saturday: '周六',
+    sunday: '周日'
+  },
+  workplace: {
+    welcome: '你好',
+    happyDay: '祝你开心每一天!',
+    toady: '今日晴',
+    notice: '通知公告',
+    project: '项目数',
+    access: '项目访问',
+    toDo: '待办',
+    introduction: '一个正经的简介',
+    shortcutOperation: '快捷入口',
+    operation: '操作',
+    index: '指数',
+    personal: '个人',
+    team: '团队',
+    quote: '引用',
+    contribution: '贡献',
+    hot: '热度',
+    yield: '产量',
+    dynamic: '动态',
+    push: '推送',
+    follow: '关注'
+  },
+  form: {
+    input: '输入框',
+    inputNumber: '数字输入框',
+    default: '默认',
+    icon: '图标',
+    mixed: '复合型',
+    textarea: '多行文本',
+    slot: '插槽',
+    position: '位置',
+    autocomplete: '自动补全',
+    select: '选择器',
+    selectGroup: '选项分组',
+    selectV2: '虚拟列表选择器',
+    cascader: '级联选择器',
+    switch: '开关',
+    rate: '评分',
+    colorPicker: '颜色选择器',
+    transfer: '穿梭框',
+    render: '渲染器',
+    radio: '单选框',
+    button: '按钮',
+    checkbox: '多选框',
+    slider: '滑块',
+    datePicker: '日期选择器',
+    shortcuts: '快捷选项',
+    today: '今天',
+    yesterday: '昨天',
+    aWeekAgo: '一周前',
+    week: '周',
+    year: '年',
+    month: '月',
+    dates: '日期',
+    daterange: '日期范围',
+    monthrange: '月份范围',
+    dateTimePicker: '日期时间选择器',
+    dateTimerange: '日期时间范围',
+    timePicker: '时间选择器',
+    timeSelect: '时间选择',
+    inputPassword: '密码输入框',
+    passwordStrength: '密码强度',
+    operate: '操作',
+    change: '更改',
+    restore: '还原',
+    disabled: '禁用',
+    disablement: '解除禁用',
+    delete: '删除',
+    add: '添加',
+    setValue: '设置值',
+    resetValue: '重置值',
+    set: '设置',
+    subitem: '子项',
+    formValidation: '表单验证',
+    verifyReset: '验证重置',
+    remark: '备注',
+    repeatDevice:'已存在该分类,请重新选择',
+    relatedModel:'改模板已被使用,请勿删除',
+    relatedProject:'该项目信息已存在任务,请勿删除'
+  },
+  watermark: {
+    watermark: '水印'
+  },
+  table: {
+    table: '表格',
+    index: '序号',
+    title: '标题',
+    author: '作者',
+    createTime: '创建时间',
+    action: '操作',
+    pagination: '分页',
+    reserveIndex: '叠加序号',
+    restoreIndex: '还原序号',
+    showSelections: '显示多选',
+    hiddenSelections: '隐藏多选',
+    showExpandedRows: '显示展开行',
+    hiddenExpandedRows: '隐藏展开行',
+    header: '头部'
+  },
+  action: {
+    search:'搜索',
+    create: '新增',
+    add: '新增',
+    del: '删除',
+    delete: '删除',
+    edit: '编辑',
+    update: '编辑',
+    preview: '预览',
+    more: '更多',
+    sync: '同步',
+    save: '保存',
+    detail: '详情',
+    export: '导出',
+    import: '导入',
+    generate: '生成',
+    logout: '强制退出',
+    test: '测试',
+    typeCreate: '字典类型新增',
+    typeUpdate: '字典类型编辑',
+    dataCreate: '字典数据新增',
+    dataUpdate: '字典数据编辑'
+  },
+  dialog: {
+    dialog: '弹窗',
+    open: '打开',
+    close: '关闭'
+  },
+  sys: {
+    api: {
+      operationFailed: '操作失败',
+      errorTip: '错误提示',
+      errorMessage: '操作失败,系统异常!',
+      timeoutMessage: '登录超时,请重新登录!',
+      apiTimeoutMessage: '接口请求超时,请刷新页面重试!',
+      apiRequestFailed: '请求出错,请稍候重试',
+      networkException: '网络异常',
+      networkExceptionMsg: '网络异常,请检查您的网络连接是否正常!',
+      errMsg401: '用户没有权限(令牌、用户名、密码错误)!',
+      errMsg403: '用户得到授权,但是访问是被禁止的。!',
+      errMsg404: '网络请求错误,未找到该资源!',
+      errMsg405: '网络请求错误,请求方法未允许!',
+      errMsg408: '网络请求超时!',
+      errMsg500: '服务器错误,请联系管理员!',
+      errMsg501: '网络未实现!',
+      errMsg502: '网络错误!',
+      errMsg503: '服务不可用,服务器暂时过载或维护!',
+      errMsg504: '网络超时!',
+      errMsg505: 'http版本不支持该请求!',
+      errMsg901: '演示模式,无法进行写操作!'
+    },
+    app: {
+      logoutTip: '温馨提醒',
+      logoutMessage: '是否确认退出系统?',
+      menuLoading: '菜单加载中...'
+    },
+    exception: {
+      backLogin: '返回登录',
+      backHome: '返回首页',
+      subTitle403: '抱歉,您无权访问此页面。',
+      subTitle404: '抱歉,您访问的页面不存在。',
+      subTitle500: '抱歉,服务器报告错误。',
+      noDataTitle: '当前页无数据',
+      networkErrorTitle: '网络错误',
+      networkErrorSubTitle: '抱歉,您的网络连接已断开,请检查您的网络!'
+    },
+    lock: {
+      unlock: '点击解锁',
+      alert: '锁屏密码错误',
+      backToLogin: '返回登录',
+      entry: '进入系统',
+      placeholder: '请输入锁屏密码或者用户密码'
+    },
+    login: {
+      backSignIn: '返回',
+      signInFormTitle: '登录',
+      ssoFormTitle: '三方授权',
+      mobileSignInFormTitle: '手机登录',
+      qrSignInFormTitle: '钉钉扫码登录',
+      signUpFormTitle: '注册',
+      forgetFormTitle: '重置密码',
+      signInTitle: '开箱即用的中后台管理系统',
+      signInDesc: '输入您的个人详细信息开始使用!',
+      policy: '我同意xxx隐私政策',
+      scanSign: `扫码后点击"确认",即可完成登录`,
+      loginButton: '登录',
+      registerButton: '注册',
+      rememberMe: '记住我',
+      forgetPassword: '忘记密码?',
+      otherSignIn: '其他登录方式',
+      // notify
+      loginSuccessTitle: '登录成功',
+      loginSuccessDesc: '欢迎回来',
+      // placeholder
+      accountPlaceholder: '请输入账号',
+      passwordPlaceholder: '请输入密码',
+      smsPlaceholder: '请输入验证码',
+      mobilePlaceholder: '请输入手机号码',
+      policyPlaceholder: '勾选后才能注册',
+      diffPwd: '两次输入密码不一致',
+      userName: '账号',
+      password: '密码',
+      confirmPassword: '确认密码',
+      email: '邮箱',
+      smsCode: '短信验证码',
+      mobile: '手机号码'
+    }
+  },
+  profile: {
+    user: {
+      title: '个人信息',
+      username: '用户名称',
+      nickname: '用户昵称',
+      mobile: '手机号码',
+      email: '用户邮箱',
+      dept: '所属部门',
+      posts: '所属岗位',
+      roles: '所属角色',
+      sex: '性别',
+      man: '男',
+      woman: '女',
+      createTime: '创建日期'
+    },
+    info: {
+      title: '基本信息',
+      basicInfo: '基本资料',
+      resetPwd: '修改密码',
+      userSocial: '社交信息'
+    },
+    rules: {
+      nickname: '请输入用户昵称',
+      mail: '请输入邮箱地址',
+      truemail: '请输入正确的邮箱地址',
+      phone: '请输入正确的手机号码',
+      truephone: '请输入正确的手机号码'
+    },
+    password: {
+      oldPassword: '旧密码',
+      newPassword: '新密码',
+      confirmPassword: '确认密码',
+      oldPwdMsg: '请输入旧密码',
+      newPwdMsg: '请输入新密码',
+      cfPwdMsg: '请输入确认密码',
+      pwdRules: '长度在 6 到 20 个字符',
+      diffPwd: '两次输入密码不一致'
+    }
+  },
+  cropper: {
+    selectImage: '选择图片',
+    uploadSuccess: '上传成功',
+    modalTitle: '头像上传',
+    okText: '确认并上传',
+    btn_reset: '重置',
+    btn_rotate_left: '逆时针旋转',
+    btn_rotate_right: '顺时针旋转',
+    btn_scale_x: '水平翻转',
+    btn_scale_y: '垂直翻转',
+    btn_zoom_in: '放大',
+    btn_zoom_out: '缩小',
+    preview: '预览'
+  },
+  dict:{
+    no:'字典编号',
+    name:'字典名称',
+    type:'字典类型',
+    status:'状态',
+    remark:'备注',
+    createTime:'创建时间',
+    data:'数据',
+    label:'字典标签',
+    labelPlace:'请输入字典标签',
+    statusPlace:'请输入状态',
+    value:'字典键值',
+    color:'颜色类型',
+    typePlace:'请输入字典类型',
+    dataPlace:'请输入数据标签',
+    valuePlace:'请输入数据键值',
+    dataLabel:'数据标签',
+    dataValue:'数据键值'
+  },
+  operationFill:{
+    name:'工单名:',
+    nameHolder:'请输入工单名',
+    status:'工单状态:',
+    createTime:'创建时间:',
+    start:'开始日期',
+    end:'结束日期',
+    search:'搜索',
+    reset:'重置',
+    add:'新增',
+    query:'查询',
+    operation:'操作',
+    duty:'责任人',
+    view:'查看',
+    fill:'填写'
+  },
+  operationFillForm:{
+    team:'所属队伍',
+    sumTime:'累计运行时间(h)',
+    sumKil:'累计运行公里数(Km)',
+    confirm:'确定',
+    cancel:'取消',
+  },
+  modelTemplate:{
+    name:'模板名称',
+    nameHolder:'请输入模板名称',
+    status:'状态',
+    createTime:'创建时间',
+    ec:'设备分类名称',
+    update:'修改',
+    delete:'删除'
+  },
+  iotDevice:{
+    name:'设备名称',
+    nameHolder:'请输入设备名称',
+    code:'设备编码',
+    codeHolder:'请输入设备编码',
+    brand:'品牌',
+    brandHolder:'请输入品牌',
+    moreSearch:'更多查询',
+    closeSearch:'收起查询',
+    status:'设备状态',
+    statusHolder:'设备状态',
+    assets:'资产性质',
+    assetsHolder:'资产性质',
+    serial:'序号',
+    dept:'所在部门',
+    update:'修改',
+    delete:'删除',
+    upload:'资料上传'
+  },
+  deviceForm:{
+    basic:'基本信息',
+    make:'制造信息',
+    finance:'财务信息',
+    other:'其他信息',
+    category:'设备类别',
+    categoryHolder:'请选择设备类别',
+    model:'规格型号',
+    modelHolder:'请输入规格型号',
+    picture:'图片',
+    remark:'备注',
+    remarkHolder:'请输入备注',
+    mfg:'制造商',
+    mfgHolder:'请输入制造商',
+    pd:'生产日期',
+    pdHolder:'请选择生产日期',
+    supplier:'供应商',
+    suppHolder:'请输入供应商',
+    warranty:'质保到期',
+    warrHolder:'请选择质保到期',
+    ni:'铭牌信息',
+    niHolder:'请选择质保到期',
+    pp:'采购价格',
+    pdate:'采购日期',
+    dp:'折旧年限',
+    ds:'折旧开始日期',
+    yd:'已提折旧月数',
+    yy:'已提折旧金额',
+    sy:'剩余金额',
+    choose:'请选择',
+    expand:'一键展开',
+    close:'一键收起',
+    save:'保存',
+    return:'返回'
+  },
+  file:{
+    name:'文件名称',
+    nameHolder:'请输入文件名称',
+    search:'搜索',
+    reset:'重置',
+    upload:'文件上传',
+    fileType:'文件类型',
+    fileSize:'文件大小',
+    preview:'查看预览',
+    operation:'操作',
+    dow:'下载',
+    check:'查看'
+  },
+  fileInfo:{
+    fileDirectory:'文件目录',
+    appendix:'附件',
+    fileType:'文件类型',
+    remark:'备注',
+    rHolder:'请输入备注'
+  },
+  monitor:{
+    deviceName:'设备名称',
+    nameHolder:'请输入设备名称',
+    deviceCode:'设备编码',
+    codeHolder:'请输入设备编码',
+    search:'搜索',
+    reset:'重置',
+    serial:'序号',
+    category:'设备类别',
+    status:'设备状态',
+    online:'在线状态',
+    latestDataTime:'最新在线时间',
+    operation:'操作',
+    check:'查看',
+    details:'详情'
+  },
+  deviceAllot:{
+    setUp:'调拨设备',
+    adjustmentRecords:'调拨记录',
+  },
+  devicePerson:{
+    deviceName:'设备名称',
+    nameHolder:'请输入设备名称',
+    deviceCode:'设备编码',
+    codeHolder:'请输入设备编码',
+    responsiblePerson:'是否设置责任人',
+    choose:'请选择',
+    status:'设备状态',
+    statusHolder:'设备状态',
+    assets:'资产性质',
+    assetsHolder:'资产性质',
+    brand:'品牌',
+    brandHolder:'请输入品牌',
+    moreSearch:'更多查询',
+    closeSearch:'收起查询',
+    search:'搜索',
+    reset:'重置',
+    setUp:'设置责任人',
+    serial:'序号',
+    dept:'所在部门',
+    rp:'责任人',
+    operation:'操作',
+    adjustmentRecords:'调整记录',
+    filterDevicePlaceholder: "输入设备编码或名称过滤"
+  },
+  configPerson:{
+    deviceList:'设备列表',
+    deviceListHolder:'请选择设备所属部门',
+    rp:'责任人关联设置',
+    rpHolder:'请选择所属部门',
+    reasonForAdjustment:'调整原因',
+    rfaHolder:'请输入调整原因',
+    adjustmentRecords:'调整记录',
+    selectPersons: '请选择责任人'
+  },
+  deviceStatus:{
+    deviceName:'设备名称',
+    nameHolder:'请输入设备名称',
+    deviceCode:'设备编码',
+    codeHolder:'请输入设备编码',
+    statusAdjust:'状态是否调整',
+    transfer:'是否调拨',
+    search:'搜索',
+    reset:'重置',
+    setUp:'调整状态',
+    choose:'请选择',
+    moreSearch:'更多查询',
+    closeSearch:'收起查询',
+    status:'设备状态',
+    statusHolder:'设备状态',
+    assets:'资产性质',
+    assetsHolder:'资产性质',
+    brand:'品牌',
+    brandHolder:'请输入品牌',
+    serial:'序号',
+    dept:'所在部门',
+    operation:'操作',
+    adjustmentRecords:'调整记录',
+    beforePerson:'调整前责任人',
+    afterPerson:'调整后责任人',
+    beforeStatus:'调整前状态',
+    afterStatus:'调整后状态',
+    beforeDept:'调整前部门',
+    afterDept:'调整后部门',
+    adjuster:'调整人',
+    adjustTime:'调整时间'
+  },
+  configDevice:{
+    deviceList:'设备列表',
+    deptList:'部门列表',
+    deviceListHolder:'请选择设备所属部门',
+    rp:'设备状态',
+    rpHolder:'请选择所属部门',
+    reasonForAdjustment:'调整原因',
+    rfaHolder:'请输入调整原因',
+    adjustmentRecords:'调整记录',
+
+  },
+  fault:{
+    faultTitle:'故障标题',
+    titleHolder:'请输入故障标题',
+    status:'状态',
+    shutDown:'是否停机',
+    failureTime:'故障时间',
+    dealTime:'解决时间',
+    start:'开始时间',
+    end:'结束时间',
+    solve:'是否解决',
+    assist:'是否协助',
+    search:'搜索',
+    reset:'重置',
+    moreSearch:'更多查询',
+    closeSearch:'收起查询',
+    added:'新增',
+    serial:'序号',
+    deviceName:'设备名称',
+    approvalStatus:'审批状态',
+    solveTime:'解决用时',
+    operation:'操作',
+    view:'查看',
+    edit: '编辑',
+    del:'删除'
+  },
+  faultForm:{
+    device:'设备',
+    solve:'是否解决',
+    assist:'是否协助',
+    faultySystem:'故障系统',
+    faultySystemHolder:'请输入故障系统',
+    failureTime:'故障时间',
+    dealTime:'解决时间',
+    failureTimeHolder:'请选择故障时间',
+    shutDown:'是否停机',
+    picture: '图片',
+    faultImpact:'故障影响',
+    faultImpactHolder:'请输入故障影响',
+    faultDescription:'故障描述',
+    remark:'备注',
+    rHolder:'请输入备注',
+    choose:'请选择',
+    ok: '确定',
+    cancel: '取消',
+    deptId:'部门ID'
+  },
+  deviceList:{
+    selectDevice:'选择设备',
+    deviceName:'设备名称',
+    nameHolder:'请输入设备名称',
+    deviceCode:'设备编码',
+    codeHolder:'请输入设备编码',
+    search:'搜索',
+    reset:'重置',
+    select:'选择',
+    createTime:'创建时间',
+  },
+  maintain: {
+    faultCode:'故障编码',
+    codeHolder:'请输入故障编码',
+    faultName:'故障名称',
+    nameHolder:'请输入故障名称',
+    status:'状态',
+    search:'搜索',
+    reset:'重置',
+    moreSearch:'更多查询',
+    closeSearch:'收起查询',
+    added:'新增',
+    shutDown:'是否停机',
+    failureTime:'故障时间',
+    solve:'是否解决',
+    assist:'是否协助',
+    serial:'序号',
+    deviceName:'设备名称',
+    source:'工单来源',
+    audit:'审核状态',
+    operation:'操作',
+    view:'查看',
+    fill:'填写'
+  },
+  iotMaintain:{
+    device:'设备',
+
+    deviceHolder:'请选择设备',
+    shutDownHolder:'是否停机',
+    startTimeHolder:'选择维修开始时间',
+    endTimeHolder:'选择维修结束时间',
+    failureTimeHolder:'选择故障时间',
+    failureImpactHolder:'请输入故障影响',
+    faultySystemHolder: '请输入故障系统',
+    remarkHolder:'请输入备注',
+    repairTypeHolder:'请选择维修类型',
+    PersonInCharge:'负责人',
+    supplier:'供应商',
+    suppHolder:'请输入供应商',
+    attachment:'委外相关附件',
+
+    repairType:'维修类型',
+    shutDown:'是否停机',
+    startTime:'维修开始时间',
+    endTime:'维修结束时间',
+    failureTime:'故障时间',
+    failureImpact:'故障影响',
+    faultySystem:'故障系统',
+    picture: '图片',
+    repairCosts:'维修费用',
+    costHolder:'请输入维修费用',
+
+    faultDescription:'故障描述',
+    repairDescription:'维修描述',
+    solution:'解决办法',
+    remark:'备注',
+    selectMaintenanceItem:'选择维修项',
+    addMaintenanceItems:'新增维修项',
+    deviceName:'设备名称',
+    deviceCode:'设备编码',
+    repairItems:'维修项',
+    repairItemsHolder:'请输入维修项',
+    numberOfMaterials:'物料数量',
+    operation:'操作',
+    remove:'移除',
+    selectMaterials:'选择物料',
+    viewMaterials:'查看物料',
+    save: '保存',
+    cancel: '取消',
+    BOMNodeID:'BOM节点ID',
+    ok: '确定',
+  },
+  workOrderMaterial:{
+    materialCode:'物料编码',
+    codeHolder:'请输入物料编码',
+    materialName:'物料名称',
+    nameHolder:'请输入物料名称',
+    search:'搜索',
+    reset:'重置',
+    confirm:'确认选择',
+    added:'新增物料',
+    select:'选择',
+    factory:'工厂',
+    costCenter:'成本中心',
+    storageLocation:'库存地点',
+    unit:'单位',
+    unitPrice:'单价',
+    total:'总库存数量',
+    source:'来源',
+    ConsumptionQuantity:'消耗数量',
+    materialGroup:'物料组',
+    groupHolder:'请选择所属物料组'
+  },
+  chooseMaintain:{
+    selectRepairItem:'选择维修项',
+    materialCode:'物料编码',
+    codeHolder:'请输入物料编码',
+    materialName:'物料名称',
+    nameHolder:'请输入物料名称',
+    search:'搜索',
+    reset:'重置',
+    confirm:'确认选择',
+    selectAll:'全选',
+    cancelAllSelection:'取消全选',
+    deviceName:'设备名称:',
+    deviceCode:'资产编码:',
+    repairItems:'维修项',
+    createTime:'创建时间',
+  },
+  info:{
+    deviceClass:'设备分类:',
+    classHolder:'请选择设备分类',
+    faultySystem:'故障系统',
+    faultySystemHolder:'请输入故障系统',
+    createTime: '创建时间',
+    start:'开始日期',
+    end:'结束日期',
+    search:'搜索',
+    reset:'重置',
+    add:'新增',
+    description:'描述',
+    delete: '删除',
+    edit: '编辑',
+    classHolder1:'设备分类不能为空',
+    faultyImpact:'故障影响不能为空',
+    solution:'解决办法不能为空',
+  },
+  calender:{
+    loading:'加载中',
+    today:'今天',
+    month:'月视图',
+    week:'周视图',
+    maintenance:'保养工单',
+    repair:'维修工单'
+  },
+  deviceInfo:{
+    basicInformation:'基础信息',
+    mfg:'制造商:',
+    pd:'生产日期:',
+    supplier:'供应商:',
+    ni:'铭牌信息:',
+    warranty:'质保到期:',
+    pp:'采购价格:',
+    pdate:'采购日期:',
+    dp:'折旧年限:',
+    ds:'折旧开始日期:',
+    yd:'已提折旧月数:',
+    yy:'已提折旧金额:',
+    sy:'剩余金额:',
+
+    fileLibrary:'资料库',
+    deviceBOM:'设备BOM',
+    operationRecords:'运行记录',
+    faultRecords:'故障记录',
+    repairRecords:'维修记录',
+    maintenanceRecords:'保养记录',
+    inspectionRecords:'巡检记录',
+    transferRecords:'调拨记录',
+    statusChangeRecords:'状态变更记录',
+    RPAdjustmentRecords:'责任人调整记录'
+  },
+  bomList:{
+    bomNodeName:'BOM节点名称',
+    nameHolder:'请输入BOM节点名称',
+    bomNode:'BOM节点',
+    nodeHolder:'请选择节点',
+    search:'搜索',
+    reset:'重置',
+    add:'新增',
+    unfold:'展开/折叠',
+    superiorBOM:'上级BOM',
+    bomHolder:'请选择上级BOM',
+    BOMNodeAttributes:'BOM节点属性',
+    sort:'排序',
+    status:'状态',
+    materialDetail:'物料详情',
+    name:'工单名称',
+    nHolder:'请输入名称',
+    serviceDue:'距离保养',
+    code:'工单编码',
+    codeHolder:'请输入工单编码',
+    type:'类型'
+  },
+  main:{
+    planCode:'计划编号',
+    codeHolder:'请输入计划编号',
+    planName:'计划名称',
+    nameHolder:'请输入计划名称',
+    mileage:'运行里程',
+    runTime:'运行时间',
+    date:'自然日期'
+  },
+  mainPlan:{
+    basicMaintenanceRecords:'基础保养记录',
+    lastMaintenanceMileage:'上次保养里程数(KM)',
+    lastMaintenanceOperationTime:'上次保养运行时间(H)',
+    lastMaintenanceNaturalDate:'上次保养自然日期',
+    operatingMileageRuleConfiguration:'运行里程规则配置',
+    operatingMileageCycle:'运行里程周期(KM)',
+    OperatingMileageCycle_lead:'运行里程周期-提前量(KM)',
+    RunTimeRuleConfiguration:'运行时间规则配置',
+    RunTimeCycle:'运行时间周期(H)',
+    RunTimeCycle_Lead:'运行时间周期-提前量(H)',
+    NaturalDayRuleConfig:'自然日规则配置',
+    NaturalDailyCycle:'自然日周期(D)',
+    NaturalDailyCycle_Lead:'自然日周期-提前量(D)',
+    duty:'已经选择的设备关联的负责人列表',
+    deviceId:'设备id',
+    MaintenanceMethod:'保养方式',
+    MaintenanceResult:'保养结果',
+    MaintenanceCost:'保养费用(元)',
+    otherCost:'其他费用(元)',
+    DelayKil:'推迟公里数(KM)',
+    DelayDuration:'推迟时长',
+    DelayDate:'推迟自然日期(D)',
+    MaintItems:'保养项',
+    nextMaintTime:'距离下次保养运行时长(H)',
+    nextMaintKil:'距离下次保养公里数(KM)',
+    nextMaintDate:'下次保养自然日期'
+  },
+  inspect:{
+    InspectionItems:'巡检项',
+    itemHolder:'请输入巡检项',
+    sortHolder:'请输入排序',
+    InspectionStandards:'巡检标准',
+    stanHolder:'请输入巡检标准'
+  },
+  route:{
+    RouteName:'路线名称',
+    nHolder:'请输入路线名称',
+    selectInspectionItems:'选择巡检项',
+    unitHolder:'请选择单位',
+    cycle:'周期',
+    SelectInspectionDevice:'选择巡检设备',
+    InspectionRoute:'巡检路线',
+    planTitle:'计划标题',
+    planNumber:'计划编号',
+    orderType:'工单类型',
+    IsItConfigured:'是否配置',
+    quantity:'数量',
+    safetyStock:'安全库存',
+  },
+  stock:{
+    selectStock:'选择库存',
+    storageTime:'入库时间',
+    selectMaterial:'选择物料',
+    quantity: '库存数量',
+    requQuantity: '领用数量'
+  },
+
+  'OAuth 2.0': 'OAuth 2.0' // 避免菜单名是 OAuth 2.0 时,一直 warn 报错
+}

+ 4 - 0
src/store/modules/locale.ts

@@ -32,6 +32,10 @@ export const useLocaleStore = defineStore('locales', {
         {
           lang: 'en',
           name: 'English'
+        },
+        {
+          lang: 'ru',
+          name: 'Russia'
         }
       ]
     }

+ 14 - 5
src/utils/langHelper.ts

@@ -2,21 +2,30 @@
 interface LangPair {
   zh: string
   en: string
+  ru: string
 }
 
 export const langHelper = {
   parseLangString(str: string): LangPair {
-    if (!str.includes('~~')) return { zh: str, en: str }
-    const [zhPart, enPart] = str.split('~~')
+    if (!str.includes('~~')) return { zh: str, en: str, ru: str }
+    const [zhPart, enPart, ruPart] = str.split('~~')
     return {
       zh: zhPart.replace('zh-CN**', ''),
-      en: enPart?.replace('en**', '') || zhPart.replace('zh-CN**', '')
+      en: enPart?.replace('en**', '') || zhPart.replace('zh-CN**', ''),
+      ru: ruPart?ruPart.replace('ru**', ''):zhPart.replace('zh-CN**', '')
     }
   },
 
   getDisplayText(str: string, currentLang: string): string {
-    const { zh, en } = this.parseLangString(str)
-    return currentLang === 'zh-CN' ? zh : (en || zh)
+    const { zh, en,ru } = this.parseLangString(str)
+    if (currentLang==='zh-CN'){
+        return zh;
+    } else if (currentLang==='en'){
+      return en;
+    } else if (currentLang==='ru'){
+      return ru;
+    }
+    // return currentLang === 'zh-CN' ? zh : (en || zh)
   },
 
   transformObject<T extends Record<string, any>>(obj: T, currentLang: string): T {