bill 2 ヶ月 前
コミット
133d55b5a3
52 ファイル変更380 行追加328 行削除
  1. 10 9
      src/api/animation.ts
  2. 3 2
      src/api/monitor.ts
  3. 2 1
      src/app.vue
  4. 2 5
      src/below.vue
  5. 1 1
      src/components/drawing-time-line/empty.vue
  6. 4 3
      src/components/drawing-time-line/index.vue
  7. 8 7
      src/components/global-search/index.vue
  8. 2 2
      src/components/materials/index.vue
  9. 13 4
      src/components/view-setting/index.vue
  10. 0 29
      src/lang/locales/en.json
  11. 0 29
      src/lang/locales/ja.json
  12. 0 29
      src/lang/locales/ko.json
  13. 134 30
      src/lang/locales/zh.json
  14. 2 2
      src/layout/edit/header/index.vue
  15. 2 2
      src/layout/edit/scene-select.vue
  16. 9 3
      src/layout/model-list/mode-tab.vue
  17. 7 7
      src/layout/show/slide-menu.vue
  18. 5 5
      src/router/config.ts
  19. 9 9
      src/router/constant.ts
  20. 2 1
      src/sdk/association/index.ts
  21. 2 1
      src/store/animation.ts
  22. 2 1
      src/store/monitor.ts
  23. 1 1
      src/store/sys.ts
  24. 2 1
      src/store/tagging.ts
  25. 4 3
      src/views/animation/index.vue
  26. 2 2
      src/views/animation/left.vue
  27. 10 8
      src/views/animation/right/action.vue
  28. 42 38
      src/views/animation/right/am.vue
  29. 4 3
      src/views/animation/right/frame.vue
  30. 2 1
      src/views/animation/right/index.vue
  31. 8 8
      src/views/animation/right/path.vue
  32. 9 9
      src/views/animation/right/subtitle.vue
  33. 5 3
      src/views/animation/type.ts
  34. 8 2
      src/views/guide/guide/attach-animation-sam.vue
  35. 1 1
      src/views/guide/guide/show.vue
  36. 3 3
      src/views/guide/index.vue
  37. 1 5
      src/views/guide/path/edit.vue
  38. 1 1
      src/views/guide/path/show.vue
  39. 11 8
      src/views/login.vue
  40. 0 7
      src/views/measure/index.vue
  41. 4 3
      src/views/merge/index.ts
  42. 4 4
      src/views/merge/index.vue
  43. 4 13
      src/views/setting/index.vue
  44. 1 1
      src/views/summary/index.vue
  45. 2 2
      src/views/tagging/hot/edit.vue
  46. 7 2
      src/views/tagging/hot/index.vue
  47. 1 1
      src/views/tagging/hot/sign.vue
  48. 2 1
      src/views/tagging/hot/style-float-select.vue
  49. 11 10
      src/views/tagging/index.vue
  50. 7 2
      src/views/tagging/monitor/index.vue
  51. 1 1
      src/views/tagging/monitor/show.vue
  52. 3 2
      src/views/tagging/monitor/sign.vue

+ 10 - 9
src/api/animation.ts

@@ -6,6 +6,7 @@ import {
   UPDATE_AM_MODEL,
   DELETE_AM_MODEL,
 } from "./constant";
+import { ui18n } from "@/lang";
 
 type ServiceAnimationModel = {
   key?: string
@@ -113,15 +114,15 @@ export const fetchAnimationModels = async () => {
 
 export const fetchAnimationActions = async () => {
   return [
-    { id: "1", action: "Walk", title: "走", url: "" },
-    { id: "2", action: "Run", title: "跑", url: "" },
-    { id: "3", action: "Climb", title: "爬", url: "" },
-    { id: "2", action: "JumpUp", title: "向上跳", url: "" },
-    { id: "3", action: "JumpDown", title: "向下跳", url: "" },
-    { id: "2", action: "TurnLeft", title: "左转", url: "" },
-    { id: "3", action: "TurnRight", title: "右转", url: "" },
-    { id: "3", action: "FallForward", title: "向前倒地", url: "" },
-    { id: "3", action: "FallBackward", title: "向后倒地", url: "" },
+    { id: "1", action: "Walk", title: ui18n.t('am.actions.Walk'), url: "" },
+    { id: "2", action: "Run", title: ui18n.t('am.actions.Run'), url: "" },
+    { id: "3", action: "Climb", title: ui18n.t('am.actions.Climb'), url: "" },
+    { id: "2", action: "JumpUp", title: ui18n.t('am.actions.JumpUp'), url: "" },
+    { id: "3", action: "JumpDown", title: ui18n.t('am.actions.JumpDown'), url: "" },
+    { id: "2", action: "TurnLeft", title: ui18n.t('am.actions.TurnLeft'), url: "" },
+    { id: "3", action: "TurnRight", title: ui18n.t('am.actions.TurnRight'), url: "" },
+    { id: "3", action: "FallForward", title: ui18n.t('am.actions.FallForward'), url: "" },
+    { id: "3", action: "FallBackward", title: ui18n.t('am.actions.FallBackward'), url: "" },
   ];
 };
 

+ 3 - 2
src/api/monitor.ts

@@ -8,6 +8,7 @@ import {
 } from "./constant";
 
 import type { Guide } from "./guide";
+import { ui18n } from "@/lang";
 
 interface ServiceMonitor {
   id: string;
@@ -35,12 +36,12 @@ export const fetchMonitors = async () => {
   return [
     {
       id: 1,
-      title: "室内监控",
+      title: ui18n.t('motior.name'),
       content: "",
     },
     {
       id: 2,
-      title: "室内监控",
+      title: ui18n.t('motior.name'),
       content: "",
     },
   ];

+ 2 - 1
src/app.vue

@@ -75,6 +75,7 @@ import GAxios from "axios";
 import { addReqErrorHandler, addResErrorHandler, ResCode, setToken } from "./api";
 import { mergeFuns } from "./components/drawing/hook";
 import Login from "./views/login.vue";
+import { ui18n } from "./lang";
 
 const gotoLogin = () => {
   showLogin.value = true;
@@ -165,7 +166,7 @@ const stopWatch = watch(
 );
 
 watchEffect(() => {
-  prefix.value = caseProject.value?.fusionTitle || "多元融合";
+  prefix.value = caseProject.value?.fusionTitle || ui18n.t('fuse.name');
 });
 
 const layoutClassNames = computed(() => {

+ 2 - 5
src/below.vue

@@ -2,8 +2,8 @@
   <div class="below-layout">
     <div class="content">
       <img :src="a" alt="" />
-      <p>无法打开页面,请升级或更换浏览器后重新打开</p>
-      <span>建议使用以下浏览器</span>
+      <p>{{$t('sys.BrowserLow')}}</p>
+      <span>{{$t('sys.BrowserJY')}}</span>
       <div class="list">
         <div v-for="item in items">
           <img :src="item.icon" />
@@ -19,12 +19,9 @@
 const a = "images/err.png";
 const b = "images/download.png";
 
-// 识别国产操作系统逻辑(示例覆盖常见标识,可根据需要补充)
 function isDomesticOS() {
   const userAgent = navigator.userAgent.toLowerCase();
   const platform = navigator.platform.toLowerCase();
-  console.log(userAgent, platform, "浏览器标识");
-  // 统信 UOS、银河麒麟、深度 Deepin、中标麒麟等标识
   return (
     /uos|kylin|deepin|neokylin/.test(userAgent) ||
     /linux/.test(platform) ||

+ 1 - 1
src/components/drawing-time-line/empty.vue

@@ -1,7 +1,7 @@
 <template>
   <v-text
     :config="{
-      text: '未添加动画',
+      text: $t('am.empty'),
       height: size?.height,
       width: size?.width,
       fill: '#fff',

+ 4 - 3
src/components/drawing-time-line/index.vue

@@ -23,11 +23,11 @@
       :target="itemShape"
       :menus="[
         {
-          label: '复制',
+          label: ui18n.t('sys.copy'),
           handler: () => copyHandler(i),
         },
         {
-          label: '删除',
+          label: ui18n.t('sys.del'),
           handler: () => delHandler(i),
         },
       ]"
@@ -47,6 +47,7 @@ import { Transform } from "konva/lib/Util";
 import { DC, EntityShape } from "../drawing/dec";
 import Operate from "../drawing/operate.vue";
 import { checkTLItem, getAddTLItemTime, TLItem } from "./check";
+import { ui18n } from "@/lang";
 
 const { misPixel } = useGlobalVar();
 const { size } = useGlobalResize();
@@ -114,7 +115,7 @@ watchEffect((onCleanup) => {
 const copyHandler = (ndx: number) => {
   const newFrame = {
     ...props.items[ndx],
-    ...getAddTLItemTime(props.items, ndx, props.items[ndx].duration)!
+    ...getAddTLItemTime(props.items, ndx, props.items[ndx].duration)!,
   };
   emit("add", newFrame);
 };

+ 8 - 7
src/components/global-search/index.vue

@@ -16,7 +16,7 @@
       :dropdownMatchSelectWidth="false"
       :popupClassName="popupClassName || 'global-search-menu'"
       allowClear
-      placeholder="搜索"
+      :placeholder="$t('sys.search')"
     >
       <template v-for="item in options" :key="item.key">
         <SelectOptGroup v-if="item.options.length" class="group-item" :key="item.key">
@@ -72,6 +72,7 @@ import { custom, params } from "@/env";
 import { debounce } from "@/utils";
 import { searchAddress, Address } from "@/store/map";
 import { fuseModels } from "@/store";
+import { ui18n } from "@/lang";
 
 const props = defineProps<{ popupClassName?: string; enable?: string }>();
 const emit = defineEmits<{ (e: "update:data", val: any): void }>();
@@ -80,35 +81,35 @@ const addressItems = ref<Address[]>([]);
 const optionsAll = computed(() => [
   {
     key: "mode-",
-    name: "模型",
+    name: ui18n.t("fuse.model"),
     options: fuseModels.value,
     getLabel: (tag: FuseModel) => tag.title,
     comp: ModelComp,
   },
   {
     key: "tagging-",
-    name: "标签",
+    name: ui18n.t("tagging.name"),
     options: taggings.value,
     getLabel: (tag: Tagging) => tag.title,
     comp: TaggingComp,
   },
   {
     key: "path-",
-    name: "路径",
+    name: ui18n.t("guide.name"),
     options: paths.value,
     getLabel: (tag: Path) => tag.name,
     comp: PathComp,
   },
   {
     key: "measure-",
-    name: "测量",
+    name: ui18n.t("measure.name"),
     options: measures.value,
     getLabel: (tag: Measure) => tag.title,
     comp: MeasureComp,
   },
   {
     key: "guide-",
-    name: "导览",
+    name: ui18n.t("guide.name"),
     options: guides.value,
     getLabel: (tag: Guide) => tag.title,
     comp: GuideComp,
@@ -129,7 +130,7 @@ const optionsAll = computed(() => [
   // },
   {
     key: "map-",
-    name: "地址",
+    name: ui18n.t("sys.address"),
     options: [...addressItems.value],
     getLabel: (tag: Address) => tag.address,
     comp: MapComp,

+ 2 - 2
src/components/materials/index.vue

@@ -48,7 +48,7 @@
             style="margin-left: 10px"
             @click="foreceRefresh"
           >
-            刷新
+            {{ $t("sys.refresh") }}
           </Button>
         </div>
       </div>
@@ -218,7 +218,7 @@ const cloumns = computed(() => {
           },
           {
             width: "200px",
-            title: "案件",
+            title: ui18n.t("sys.caseTitle"),
             dataIndex: "caseTitle",
             key: "caseTitle",
           },

+ 13 - 4
src/components/view-setting/index.vue

@@ -2,7 +2,7 @@
   <div v-if="custom.showViewSetting && currentModel === fuseModel && !params.pure">
     <Dropdown placement="top">
       <div class="strengthen show-setting">
-        <span>显示设置</span>
+        <span>{{ $t("sys.showSetting") }}</span>
         <DownOutlined />
       </div>
       <template #overlay>
@@ -36,16 +36,25 @@ import { DownOutlined } from "@ant-design/icons-vue";
 import { computed, watch, watchEffect } from "vue";
 import { selectPaths } from "@/store";
 import { currentModel, fuseModel } from "@/model";
+import { ui18n } from "@/lang";
 
 const props = defineProps<{ value?: Record<string, boolean> }>();
 const emit = defineEmits<{ (e: "update:value", v: Record<string, boolean>): void }>();
 
 const showOptions = [
-  { key: "showTagging", text: "标签", stack: showTaggingsStack.current.value },
-  { key: "showMeasure", text: "测量", stack: showMeasuresStack.current.value },
+  {
+    key: "showTagging",
+    text: ui18n.t("tagging.name"),
+    stack: showTaggingsStack.current.value,
+  },
+  {
+    key: "showMeasure",
+    text: ui18n.t("measure.name"),
+    stack: showMeasuresStack.current.value,
+  },
   {
     key: "showPath",
-    text: "路径",
+    text: ui18n.t("path.name"),
     stack: computed({
       get: () => {
         return selectPaths.all.value || selectPaths.selects.value.length > 0;

+ 0 - 29
src/lang/locales/en.json

@@ -1,33 +1,4 @@
 {
-  "case": {
-    "cols": {
-      "caseAddress": "Incident location",
-      "caseCategory": "Case category",
-      "caseNum": "Case number",
-      "caseRegion": "Incident area",
-      "caseTitle": "Case name",
-      "crimeTime": "Incident time",
-      "criminalCase": "Is it a criminal case?",
-      "homicideCase": "Is it a homicide case?",
-      "latAndLong": "Latitude and Longitude"
-    },
-    "name": "Case information",
-    "nv": "No",
-    "sn": "Case name",
-    "summary": "Case summary",
-    "tmCols": {
-      "alarmName": "Reporter",
-      "alarmTime": "Report Time",
-      "assignDept": "Assigned/Reporting Unit",
-      "assignType": "Assignment Method",
-      "commandTime": "Command Center Phone Hours",
-      "inquestAddress": "Inspection location",
-      "inquestDept": "On-site inspection unit",
-      "times": "Inspection time"
-    },
-    "tmName": "Inspection information",
-    "yv": "Yes"
-  },
   "common": {
     "NoFilesSelected": "No file selected"
   },

+ 0 - 29
src/lang/locales/ja.json

@@ -1,33 +1,4 @@
 {
-  "case": {
-    "cols": {
-      "caseAddress": "発生場所",
-      "caseCategory": "事件カテゴリ",
-      "caseNum": "登録番号",
-      "caseRegion": "発生地域",
-      "caseTitle": "事件名",
-      "crimeTime": "発生時刻",
-      "criminalCase": "刑事事件か",
-      "homicideCase": "殺人事件か",
-      "latAndLong": "緯度経度"
-    },
-    "name": "事件情報",
-    "nv": "いいえ",
-    "sn": "事件名",
-    "summary": "事件概要",
-    "tmCols": {
-      "alarmName": "通報者",
-      "alarmTime": "通報時刻",
-      "assignDept": "指定/報告部署",
-      "assignType": "指定方法",
-      "commandTime": "指令センター通話時刻",
-      "inquestAddress": "検証場所",
-      "inquestDept": "現場検証部署",
-      "times": "検証時間"
-    },
-    "tmName": "検証情報",
-    "yv": "はい"
-  },
   "common": {
     "NoFilesSelected": "ファイルを選択してください。"
   },

+ 0 - 29
src/lang/locales/ko.json

@@ -1,33 +1,4 @@
 {
-  "case": {
-    "cols": {
-      "caseAddress": "사건 발생 장소",
-      "caseCategory": "사건 유형",
-      "caseNum": "입안 번호",
-      "caseRegion": "사건 발생 지역",
-      "caseTitle": "사건 명칭",
-      "crimeTime": "사건 발생 시간",
-      "criminalCase": "형사 사건인지 아닌지",
-      "homicideCase": "살인 사건인지 아닌지",
-      "latAndLong": "경위도"
-    },
-    "name": "사건 정보",
-    "nv": "거절",
-    "sn": "사건 명칭",
-    "summary": "사건 개요",
-    "tmCols": {
-      "alarmName": "경보 신고자",
-      "alarmTime": "경보 신고 시간",
-      "assignDept": "지정/보고 단위",
-      "assignType": "지정 방식",
-      "commandTime": "지휘 센터 전화 시간",
-      "inquestAddress": "감문 장소",
-      "inquestDept": "현장 감안 단위",
-      "times": "감문 시간"
-    },
-    "tmName": "감문 정보",
-    "yv": "예"
-  },
   "common": {
     "NoFilesSelected": "아무 파일도 선택되지 않았습니다."
   },

+ 134 - 30
src/lang/locales/zh.json

@@ -1,33 +1,4 @@
 {
-  "case": {
-    "cols": {
-      "caseAddress": "案发地点",
-      "caseCategory": "案件类别",
-      "caseNum": "立案编号",
-      "caseRegion": "案发区域",
-      "caseTitle": "案件名称",
-      "crimeTime": "案发时间",
-      "criminalCase": "是否刑案",
-      "homicideCase": "是否命案",
-      "latAndLong": "经纬度"
-    },
-    "name": "案件信息",
-    "nv": "否",
-    "sn": "案件名称",
-    "summary": "案件概要",
-    "tmCols": {
-      "alarmName": "报警人",
-      "alarmTime": "报警时间",
-      "assignDept": "指派/报告单位",
-      "assignType": "指派方式",
-      "commandTime": "指挥中心电话时间",
-      "inquestAddress": "勘验地点",
-      "inquestDept": "现场勘验单位",
-      "times": "勘验时间"
-    },
-    "tmName": "勘验信息",
-    "yv": "是"
-  },
   "floder": {
     "extractList": "提取清单",
     "name": "卷宗",
@@ -48,6 +19,7 @@
     "model": "三维模型",
     "move": "移动",
     "name": "多元融合",
+    "scale": "缩放",
     "opacity": "模型不透明度",
     "opacity1": "透明度",
     "pano": "全景图",
@@ -71,7 +43,12 @@
       "name": "导览",
       "time": "视频时长",
       "unItems": "无法保存空路径导览!",
-      "undata": "暂无导览"
+      "undata": "暂无导览",
+      "activeam": "激活",
+      "unactiveam": "关闭",
+      "activetip": "动画已激活,请至少添加2个视角",
+      "activeclose": "动画已关闭",
+      "list": "导览列表"
     },
     "guideName": "导览({count})",
     "modelErr": "路径所在模型被删除,无法播放",
@@ -185,6 +162,8 @@
     "name": "安防"
   },
   "setting": {
+    "name1": "名称",
+    "name1tip": "标题不能为空",
     "back": "设置天空",
     "backs[0]": "无",
     "backs[1]": "地图",
@@ -195,7 +174,30 @@
     "initView": "初始画面",
     "name": "设置"
   },
+  "path": {
+    "name": "路径",
+    "name1": "路线"
+  },
   "sys": {
+    "import": "导入",
+    "selectAll": "全选",
+    "setting": "设置",
+    "login": {
+      "name": "登录",
+      "title": "登录多元融合",
+      "username": "请输入账号",
+      "pwd": "请输入密码",
+      "mark": "记住密码",
+      "emptyusername": "账号不能为空",
+      "emptypwd": "密码不能为空"
+    },
+    "showSetting": "显示设置",
+    "caseTitle": "案件",
+    "refresh": "刷新",
+    "address": "地址",
+    "copy": "复制",
+    "BrowserLow": "无法打开页面,请升级或更换浏览器后重新打开",
+    "BrowserJY": "建议使用以下浏览器",
     "404Page": "资源不存在或已删除",
     "add": "新增",
     "addData": "添加数据",
@@ -249,6 +251,11 @@
     "viewPWD": "访问密码"
   },
   "tagging": {
+    "taStatus": {
+      "UN": "未送检",
+      "ING": "送检中",
+      "END": "完成检验"
+    },
     "apply": "应用到全部",
     "applyConfirm": "确定要将此属性应用到所有位置?",
     "list": "标签列表",
@@ -289,6 +296,7 @@
       "typeId": "特征描述"
     },
     "titleErr": "标签标题必须填写!",
+    "titleErr1": "标题长度在15字以内!",
     "titleFex": "标题常驻",
     "type": {
       "1": "痕迹",
@@ -306,5 +314,101 @@
     "name": "视图提取",
     "nameErr": "视图名称不可为空",
     "vName": "视图"
+  },
+  "am": {
+    "name1": "动画",
+    "eqtimeTip": "同一时间内请勿重复添加",
+    "model": "模型",
+    "empty": "未添加动画",
+    "actions": {
+      "Walk": "走",
+      "Run": "跑",
+      "Climb": "爬",
+      "JumpUp": "向上跳",
+      "JumpDown": "向下跳",
+      "TurnLeft": "左转",
+      "TurnRight": "右转",
+      "FallForward": "向前倒地",
+      "FallBackward": "向后倒地"
+    },
+    "applyAllConfirm": "确定要将此属性应用到所有动画模型?",
+    "move": "移动到这里",
+    "name": "动画模型",
+    "list": "数据列表",
+    "tabs": {
+      "actions": "动作",
+      "paths": "路径",
+      "subtitles": "字幕"
+    },
+    "setting": {
+      "title": "设置动画",
+      "name": "名称",
+      "nameplace": "请输入名称",
+      "amplitude": "幅度",
+      "speed": "速度",
+      "dur": "时长",
+      "duration": "持续时间"
+    },
+    "ammodel": {
+      "name": "名称",
+      "nameplace": "请输入名称",
+      "nameShow": "显示名称",
+      "fontsize": "文字大小",
+      "range": "可见范围",
+      "globalVisibility": "全部范围可视",
+      "am": {
+        "name": "动画",
+        "frame": "加帧",
+        "path": "路径",
+        "subtitle": "字幕",
+        "actionk": "动作库",
+        "selectpath": "选择路径",
+        "selectpathtip": "请选择路径",
+        "sit_to_stand": "坐:站起",
+        "fist_pump": "坐下",
+        "end_bicycle_sit_up": "躺:起来",
+        "hit_on_legs": "向后倒下",
+        "crawling": "爬",
+        "medium_hit_to_head": "挨打",
+        "illegal_knee": "左膝盖",
+        "death_from_back_headshot": "向前倒地",
+        "dying": "向前倒地死掉",
+        "standard_walk": "标准走",
+        "start_walking": "起步走",
+        "left_turn_wbriefcase": "向左转",
+        "running": "标准跑",
+        "drunk_walk": "醉汉走",
+        "mma_kick": "右前踢",
+        "standing_jump": "标准向上跳",
+        "sitting": "标准坐",
+        "a_idel": "站立",
+        "peone_forward": "匍匐前行",
+        "wall_crash": "松手摔倒",
+        "head_hit": "头被击中"
+      }
+    },
+    "path": {
+      "list": "路径列表",
+      "title": "设置路径",
+      "name": "路径",
+      "nameplace": "请输入名称",
+      "pathtip": "请选择路径",
+      "reverse":"终点反向",
+      "dur": "持续时间"
+    },
+    "subtitle": {
+      "title": "设置字幕",
+      "name": "名称",
+      "nameplace": "请输入名称",
+      "content": "字幕",
+      "contentplace": "请输入字幕",
+      "dur": "画面停留",
+      "color": "背景颜色"
+    }
+  },
+  "motior": {
+    "list": "监控列表",
+    "name": "室内监控",
+    "error": "无法查看监控,请检查网络是否正常"
   }
 }

+ 2 - 2
src/layout/edit/header/index.vue

@@ -13,9 +13,9 @@
         @click="custom.full = !custom.full"
       /> -->
       <template v-if="isEdit">
-        <ui-button width="105px" @click="leave">退出</ui-button>
+        <ui-button width="105px" @click="leave">{{ $t("sys.quit") }}</ui-button>
         <ui-button width="105px" type="primary" class="save" v-if="isOld" @click="save">
-          保存
+          {{ $t("sys.save") }}
         </ui-button>
       </template>
     </div>

+ 2 - 2
src/layout/edit/scene-select.vue

@@ -122,11 +122,11 @@ const meshParams = ref({ isObj: 1, pageNum: 1, pageSize: 12, total: 0 })
 const cloudParams = ref({ isObj: 0, pageNum: 1, pageSize: 12, total: 0 })
 const meshList = ref<Scene[]>([])
 const cloudList = ref<Scene[]>([])
-const params = computed(() => type.value === 'Mesh场景' ? meshParams.value : cloudParams.value)
+const params = computed(() => type.value === ui18n.t('scene.typeRaws.0') ? meshParams.value : cloudParams.value)
 
 let loadCount = 0
 watchEffect(() => {
-  const list = type.value === '点云场景' ? meshList : cloudList
+  const list = type.value === ui18n.t('scene.typeRaws.2') ? meshList : cloudList
   const currentCount = ++loadCount
   fetchScenesAll(params.value).then((data) => {
     console.log('====>', currentCount, loadCount, params.value)

+ 9 - 3
src/layout/model-list/mode-tab.vue

@@ -1,7 +1,7 @@
 <template>
   <div
     class="mode-tab strengthen"
-     :class="{ pure: params.pure }"
+    :class="{ pure: params.pure }"
     v-if="panoModel && currentModel === fuseModel && custom.showModeTab"
   >
     <div
@@ -9,14 +9,20 @@
       @click="flyModel(panoModel, 'fuse')"
       :class="{ active: custom.showMode === 'fuse' }"
     >
-      <ui-icon type="show_3d_n" class="icon" ctrl tip="三维模型" tipV="top" />
+      <ui-icon type="show_3d_n" class="icon" ctrl :tip="$t('fuse.model')" tipV="top" />
     </div>
     <div
       class="mode-icon-layout"
       @click="flyModel(panoModel, 'pano')"
       :class="{ active: custom.showMode === 'pano' }"
     >
-      <ui-icon type="show_roaming_n" class="icon" ctrl tip="全景图" tipV="top" />
+      <ui-icon
+        type="show_roaming_n"
+        class="icon"
+        ctrl
+        :tip="$t('fuse.pano')"
+        tipV="top"
+      />
     </div>
   </div>
 </template>

+ 7 - 7
src/layout/show/slide-menu.vue

@@ -43,13 +43,13 @@ const items = computed(() => {
       ...metas[RoutesName.summaryShow],
     },
   ];
-  if (params.ga === "true") {
-    items.unshift({
-      name: RoutesName.fireInfo,
-      config: getRouteConfig(RoutesName.fireInfo),
-      ...metas[RoutesName.fireInfo],
-    });
-  }
+  // if (params.ga === "true") {
+  //   items.unshift({
+  //     name: RoutesName.fireInfo,
+  //     config: getRouteConfig(RoutesName.fireInfo),
+  //     ...metas[RoutesName.fireInfo],
+  //   });
+  // }
 
   // if (views.value.length) {
   //   items.push({

+ 5 - 5
src/router/config.ts

@@ -99,11 +99,11 @@ export const routes = [
         name: RoutesName.security,
         component: () => import('@/views/security/index.vue')
       },
-      {
-        path: paths[RoutesName.fireInfo],
-        name: RoutesName.fireInfo,
-        component: () => import('@/views/folder/index.vue')
-      },
+      // {
+      //   path: paths[RoutesName.fireInfo],
+      //   name: RoutesName.fireInfo,
+      //   component: () => import('@/views/folder/index.vue')
+      // },
       // {
       //   path: paths[RoutesName.viewShow],
       //   name: RoutesName.viewShow,

+ 9 - 9
src/router/constant.ts

@@ -66,7 +66,7 @@ export const paths = {
   [RoutesName.view]: "view",
 
   [RoutesName.show]: "/show",
-  [RoutesName.fireInfo]: "fireInfo",
+  // [RoutesName.fireInfo]: "fireInfo",
   [RoutesName.summaryShow]: "summary",
   [RoutesName.recordShow]: "record",
   [RoutesName.viewShow]: "view",
@@ -91,8 +91,8 @@ export const metas: any = {
   },
   [RoutesName.guide]: {
     icon: "guide_p",
-    title: "导览",
-    sysTitle: "多元融合",
+    title: ui18n.t("guide.guide.name") ,
+    sysTitle: ui18n.t("fuse.name"),
   },
   [RoutesName.animation]: {
     icon: "path",
@@ -143,10 +143,10 @@ export const metas: any = {
     title: ui18n.t("security.name"),
   },
 };
-if (params.ga === 'true') {
-  (metas as any)[RoutesName.fireInfo] = {
-    icon: "message_c",
-    title: ui18n.t("case.name"),
-  };
-}
+// if (params.ga === 'true') {
+//   (metas as any)[RoutesName.fireInfo] = {
+//     icon: "message_c",
+//     title: ui18n.t("case.name"),
+//   };
+// }
 export const ViewHome = RoutesName.merge;

+ 2 - 1
src/sdk/association/index.ts

@@ -21,6 +21,7 @@ import { associationPaths } from "./path";
 import { associationAnimation } from "./animation";
 import { associationMonitor } from "./monitor";
 import { Message } from "bill/expose-common";
+import { ui18n } from "@/lang";
 
 export const getSupperPanoModel = () => {
   const supperModel = ref<FuseModel | null>(null);
@@ -132,7 +133,7 @@ export const setupAssociation = (mountEl: HTMLDivElement, sdk: SDK) => {
   associationModels(sdk);
 
   sdk.sceneBus.on("monitorError", () => {
-    Message.error("无法查看监控,请检查网络是否正常");
+    Message.error(ui18n.t("motior.error"));
   });
 
   const stopWatch = watchEffect(() => {

+ 2 - 1
src/store/animation.ts

@@ -22,6 +22,7 @@ import type {
 } from "@/api";
 import { inRevise } from "bill/utils";
 import { uuid } from "@/components/drawing/hook";
+import { ui18n } from "@/lang";
 export type {
   AnimationModelAction,
   AnimationModelFrame,
@@ -36,7 +37,7 @@ export const createAnimationModel = (
   am: Partial<AnimationModel> = {}
 ): AnimationModel => ({
   id: createTemploraryID(),
-  title: `模型`,
+  title: ui18n.t("am.model"),
   url: "",
   showTitle: true,
   fontSize: 12,

+ 2 - 1
src/store/monitor.ts

@@ -11,6 +11,7 @@ import {
 } from "@/utils";
 
 import type { Monitor, Monitors } from "@/api";
+import { ui18n } from "@/lang";
 export type { Monitors, Monitor } from "@/api";
 
 export const monitors = ref<Monitors>([]);
@@ -23,7 +24,7 @@ export const createMonitor = (
   am: Partial<Monitor> = {}
 ): Monitor => ({
   id: createTemploraryID(),
-  title: `模型`,
+  title: ui18n.t('am.model'),
   content: '',
   ...am,
 });

+ 1 - 1
src/store/sys.ts

@@ -23,7 +23,7 @@ export const isNow = computed(() => !!(mode.value & Flags.NOW));
 export const appEl = ref<HTMLDivElement | null>(null);
 export const prefix = ref("");
 
-export const defTitle = ref(ui18n.t('case.name'));
+export const defTitle = ref(ui18n.t('fuse.name'));
 export const title = computed(() => {
   console.error(currentMeta.value);
   const last =

+ 2 - 1
src/store/tagging.ts

@@ -38,6 +38,7 @@ import {
 
 import type { Tagging as STagging } from '@/api'
 import type { TaggingStyle } from './tagging-style'
+import { ui18n } from '@/lang'
 
 export type Tagging = LocalMode<LocalMode<STagging, 'images'>, 'audio'>
 export type Taggings = Tagging[]
@@ -55,7 +56,7 @@ export const createTagging = (tagging: Partial<Tagging> = {}): Tagging => {
     styleId: '',
     desc: '',
     part: '',
-    method: '未送检',
+    method: ui18n.t('tagging.taStatus.UN'),
     show3dTitle: false,
     audioName: '',
     principal: '',

+ 4 - 3
src/views/animation/index.vue

@@ -81,6 +81,7 @@ import { clickListener } from "@/utils/event";
 import { useRMenus } from "@/components/right-menu";
 import { asyncTimeout } from "@/utils";
 import { currentIsFullView } from "@/utils/full";
+import { ui18n } from "@/lang";
 
 enterEdit(() => back());
 useViewStack(autoSaveAnimationModel);
@@ -125,7 +126,7 @@ const frameAction = ref<string>();
 
 const applyGlobal = async (k: keyof AnimationModel) => {
   console.error(k, focusAM.value![k]);
-  if (!(await Dialog.confirm("确定要将此属性应用到所有动画模型?"))) return;
+  if (!(await Dialog.confirm(ui18n.t("am.applyAllConfirm")))) return;
   ams.value.forEach((am: any) => (am[k] = focusAM.value![k]));
 };
 
@@ -280,7 +281,7 @@ const add = <T extends Active["key"]>(
     typeof preset.duration === "number" ? preset.duration : 10
   );
   if (!attr) {
-    Message.error("同一时间内请勿重复添加");
+    Message.error(ui18n.t("am.eqtimeTip"));
   } else {
     const item = reactive({
       id: uuid(),
@@ -346,7 +347,7 @@ onUnmounted(
         setTimeout(() => {
           unMount = useRMenus(pixel, [
             {
-              label: "移动到这里",
+              label: ui18n.t("am.move"),
               icon: "move",
               handler() {
                 amMap[getAMKey(focusAM.value!)]?.am?.moveModelTo(pixel, pos?.worldPos);

+ 2 - 2
src/views/animation/left.vue

@@ -4,8 +4,8 @@
       <template v-slot:header>
         <div class="animation-left-header">
           <Tabs v-model:activeKey="activeKey" width="100%">
-            <TabPane key="model" tab="数据列表" />
-            <TabPane key="animation" tab="动画模型" />
+            <TabPane key="model" :tab="$t('am.list')" />
+            <TabPane key="animation" :tab="$t('am.name')" />
             <template #rightExtra v-if="activeKey === 'animation'">
               <ui-icon ctrl type="add" @click="selectModel" />
             </template>

+ 10 - 8
src/views/animation/right/action.vue

@@ -1,42 +1,44 @@
 <template>
   <Tabs activeKey="t" width="100%">
-    <TabPane key="t" tab="设置动画">
+    <TabPane key="t" :tab="$t('am.setting.title')">
       <ui-group>
         <ui-group-option>
-          <SignItem label="名称" not-apply>
+          <SignItem :label="$t('am.setting.name')" not-apply>
             <ui-input
               width="100%"
               type="text"
               ref="nameInput"
               class="nameInput"
-              placeholder="请输入名称"
+              :placeholder="$t('am.setting.nameplace')"
               v-model="data.name"
               :maxlength="100"
             />
           </SignItem>
         </ui-group-option>
         <ui-group-option>
-          <SignItem label="幅度" not-apply>
+          <SignItem :label="$t('am.setting.amplitude')" not-apply>
             <Slider v-model:value="data.amplitude" :min="0.1" :max="1" :step="0.1" />
           </SignItem>
         </ui-group-option>
         <ui-group-option>
-          <SignItem label="速度" not-apply>
+          <SignItem :label="$t('am.setting.speed')" not-apply>
             <template v-slot:append>
-              <span v-if="dur">时长: {{ Math.floor(dur * 100) / 100 }}S</span>
+              <span v-if="dur"
+                >{{ $t("am.setting.dur") }}: {{ Math.floor(dur * 100) / 100 }}S</span
+              >
             </template>
             <Slider v-model:value="data.speed" :min="0.1" :max="10" :step="0.1" />
           </SignItem>
         </ui-group-option>
 
         <ui-group-option class="item">
-          <span class="label">持续时间</span>
+          <span class="label">{{ $t("am.setting.duration") }}</span>
           <span class="oper">
             <ui-input
               width="75px"
               type="number"
               ref="nameInput"
-              placeholder="请输入"
+              :placeholder="$t('sys.placeInput')"
               :modelValue="data.duration"
               :min="0.1"
               @change="(ev: any) => $emit('updateDuration', Math.max(0.1, Number(ev.target.value)))"

+ 42 - 38
src/views/animation/right/am.vue

@@ -1,29 +1,32 @@
 <template>
   <Tabs v-model:activeKey="activeKey" width="100%">
-    <TabPane key="setting" tab="设置">
+    <TabPane key="setting" :tab="$t('sys.setting')">
       <ui-group borderBottom>
         <ui-group-option>
-          <SignItem label="名称" not-apply>
+          <SignItem :label="$t('am.ammodel.name')" not-apply>
             <ui-input
               width="100%"
               type="text"
               ref="nameInput"
               class="nameInput"
-              placeholder="请输入名称"
+              :placeholder="$t('am.ammodel.nameplace')"
               v-model="am.title"
               :maxlength="100"
             />
           </SignItem>
         </ui-group-option>
         <ui-group-option class="item">
-          <span class="label">显示名称</span>
+          <span class="label">{{ $t("am.ammodel.nameShow") }}</span>
           <span class="oper"> <Switch v-model:checked="am.showTitle" /> </span>
         </ui-group-option>
       </ui-group>
 
       <ui-group borderBottom>
         <ui-group-option>
-          <SignItem label="文字大小" @apply-global="$emit('applyGlobal', 'fontSize')">
+          <SignItem
+            :label="$t('am.ammodel.fontsize')"
+            @apply-global="$emit('applyGlobal', 'fontSize')"
+          >
             <Slider v-model:value="am.fontSize" :min="12" :max="60" :step="0.1" />
           </SignItem>
         </ui-group-option>
@@ -31,7 +34,7 @@
       <ui-group borderBottom>
         <ui-group-option>
           <SignItem
-            label="可见范围"
+            :label="$t('am.ammodel.range')"
             v-if="!am.globalVisibility"
             @apply-global="$emit('applyGlobal', 'visibilityRange')"
           >
@@ -41,29 +44,29 @@
         <ui-group-option>
           <ui-input
             type="checkbox"
-            label="全部范围可视"
+            :label="$t('am.ammodel.globalVisibility')"
             :modelValue="!!am.globalVisibility"
             @update:modelValue="(v: boolean) => am.globalVisibility = v"
           />
         </ui-group-option>
       </ui-group>
     </TabPane>
-    <TabPane key="animation" tab="动画">
+    <TabPane key="animation" :tab="$t('am.ammodel.am.name')">
       <ui-group borderBottom>
         <ui-group-option class="item">
-          <span class="label">加帧</span>
+          <span class="label">{{ $t("am.ammodel.am.frame") }}</span>
           <span class="oper" @click="$emit('addFrame')">
             <ui-icon type="keys_a" ctrl />
           </span>
         </ui-group-option>
         <ui-group-option class="item">
-          <span class="label">路径</span>
+          <span class="label">{{ $t("am.ammodel.am.path") }}</span>
           <span class="oper">
             <ui-icon @click="visibleSelectPath = true" type="add_a" ctrl />
           </span>
         </ui-group-option>
         <ui-group-option class="item">
-          <span class="label">字幕</span>
+          <span class="label">{{ $t("am.ammodel.am.subtitle") }}</span>
           <span class="oper">
             <ui-icon
               @click="$emit('addSubtitle', { background: '#000' })"
@@ -75,7 +78,7 @@
       </ui-group>
       <ui-group borderBottom v-if="amActions.length">
         <ui-group-option class="item">
-          <span class="label">动作库</span>
+          <span class="label">{{ $t("am.ammodel.am.actionk") }}</span>
         </ui-group-option>
         <ui-group-option class="item action-item" v-for="action in amActions">
           <span class="label">{{ action.title }}</span>
@@ -110,12 +113,12 @@
 
   <Modal
     width="400px"
-    title="选择路径"
+    :title="$t('am.ammodel.am.selectpath')"
     :open="visibleSelectPath"
     @ok="selectPathHandler"
     @cancel="visibleSelectPath = false"
-    okText="确定"
-    cancelText="取消"
+    :okText="$t('sys.enter')"
+    :cancelText="$t('sys.cancel')"
     class="model-table"
   >
     <div style="margin: 20px 0">
@@ -123,7 +126,7 @@
         width="100%"
         type="select"
         :options="options"
-        placeholder="请选择路径"
+        :placeholder="$t('am.ammodel.am.selectpathtip')"
         v-model="pathId"
       />
     </div>
@@ -140,6 +143,7 @@ import { paths } from "@/store/path";
 import Message from "bill/components/message/message.vue";
 import { Modal } from "ant-design-vue";
 import { amMap, getAMKey } from "@/sdk/association/animation";
+import { ui18n } from "@/lang";
 
 const props = defineProps<{ am: AnimationModel }>();
 const emit = defineEmits<{
@@ -149,27 +153,27 @@ const emit = defineEmits<{
 const activeKey = ref("setting");
 
 const actionsMap: Record<string, string> = {
-  sit_to_stand: "坐:站起",
-  fist_pump: "坐下",
-  end_bicycle_sit_up: "躺:起来",
-  hit_on_legs: "向后倒下",
-  crawling: "爬",
-  medium_hit_to_head: "挨打",
-  illegal_knee: "左膝盖",
-  death_from_back_headshot: "向前倒地",
-  dying: "向前倒地死掉",
-  standard_walk: "标准走",
-  start_walking: "起步走",
-  left_turn_wbriefcase: "向左转",
-  running: "标准跑",
-  drunk_walk: "醉汉走",
-  mma_kick: "右前踢",
-  standing_jump: "标准向上跳",
-  sitting: "标准坐",
-  a_idel: "站立",
-  peone_forward: "匍匐前行",
-  wall_crash: "松手摔倒",
-  head_hit: "头被击中",
+  sit_to_stand: ui18n.t("am.ammodel.am.sit_to_stand"),
+  fist_pump: ui18n.t("am.ammodel.am.fist_pump"),
+  end_bicycle_sit_up: ui18n.t("am.ammodel.am.end_bicycle_sit_up"),
+  hit_on_legs: ui18n.t("am.ammodel.am.hit_on_legs"),
+  crawling: ui18n.t("am.ammodel.am.crawling"),
+  medium_hit_to_head: ui18n.t("am.ammodel.am.medium_hit_to_head"),
+  illegal_knee: ui18n.t("am.ammodel.am.illegal_knee"),
+  death_from_back_headshot: ui18n.t("am.ammodel.am.death_from_back_headshot"),
+  dying: ui18n.t("am.ammodel.am.dying"),
+  standard_walk: ui18n.t("am.ammodel.am.standard_walk"),
+  start_walking: ui18n.t("am.ammodel.am.start_walking"),
+  left_turn_wbriefcase: ui18n.t("am.ammodel.am.left_turn_wbriefcase"),
+  running: ui18n.t("am.ammodel.am.running"),
+  drunk_walk: ui18n.t("am.ammodel.am.drunk_walk"),
+  mma_kick: ui18n.t("am.ammodel.am.mma_kick"),
+  standing_jump: ui18n.t("am.ammodel.am.standing_jump"),
+  sitting: ui18n.t("am.ammodel.am.sitting"),
+  a_idel: ui18n.t("am.ammodel.am.a_idel"),
+  peone_forward: ui18n.t("am.ammodel.am.peone_forward"),
+  wall_crash: ui18n.t("am.ammodel.am.wall_crash"),
+  head_hit: ui18n.t("am.ammodel.am.head_hit"),
 };
 const keys = Object.keys(actionsMap);
 const amActions = computed(() => {
@@ -190,7 +194,7 @@ const pathId = ref<string>();
 const visibleSelectPath = ref(false);
 const selectPathHandler = () => {
   if (!pathId.value) {
-    Message.error("请选择路径");
+    Message.error(ui18n.t("am.ammodel.am.selectpathtip"));
     return;
   }
   const name = options.value.find(({ value }) => value === pathId.value)!.label;

+ 4 - 3
src/views/animation/right/frame.vue

@@ -21,11 +21,12 @@
 
 <script lang="ts" setup>
 import { AnimationModelFrame } from "@/api";
+import { ui18n } from "@/lang";
 
 const actions = [
-  { key: "translate", icon: "a-move", tip: "移动" },
-  { key: "rotate", icon: "a-rotate", tip: "旋转" },
-  { key: "scale", icon: "a-zoom", tip: "缩放" },
+  { key: "translate", icon: "a-move", tip: ui18n.t("fuse.move") },
+  { key: "rotate", icon: "a-rotate", tip: ui18n.t("fuse.flip") },
+  { key: "scale", icon: "a-zoom", tip: ui18n.t("fuse.scale") },
   // { key: "originTranslate", icon: "a-anchor" },
 ];
 

+ 2 - 1
src/views/animation/right/index.vue

@@ -48,6 +48,7 @@ import Subtitle from "./subtitle.vue";
 import { checkTLItem } from "@/components/drawing-time-line/check";
 import { Message } from "bill/expose-common";
 import { AnimationModel, AnimationModelFrame } from "@/store/animation";
+import { ui18n } from "@/lang";
 
 const props = defineProps<{
   am: AnimationModel;
@@ -72,7 +73,7 @@ const setDuration = (dur: number) => {
   const cur = items[ndx];
 
   if (!checkTLItem(items, { ...cur, duration: dur }, ndx)) {
-    Message.error("同一时间内请勿重复添加");
+    Message.error(ui18n.t("am.eqtimeTip"));
   } else {
     cur.duration = dur;
   }

+ 8 - 8
src/views/animation/right/path.vue

@@ -1,43 +1,43 @@
 <template>
   <Tabs activeKey="t" width="100%">
-    <TabPane key="t" tab="设置路径">
+    <TabPane key="t" :tab="$t('am.path.title')">
       <ui-group>
         <ui-group-option>
-          <SignItem label="名称" not-apply>
+          <SignItem :label="$t('am.path.name')" not-apply>
             <ui-input
               width="100%"
               type="text"
               ref="nameInput"
               class="nameInput"
-              placeholder="请输入名称"
+              :placeholder="$t('am.path.nameplace')"
               v-model="data.name"
               :maxlength="100"
             />
           </SignItem>
         </ui-group-option>
         <ui-group-option>
-          <SignItem label="路径" not-apply>
+          <SignItem :label="$t('am.path.name')" not-apply>
             <ui-input
               width="100%"
               type="select"
               :options="options"
-              placeholder="请选择路径"
+              :placeholder="$t('am.path.nameplace')"
               v-model="data.pathId"
             />
           </SignItem>
         </ui-group-option>
         <ui-group-option class="item">
-          <span class="label">终点反向</span>
+          <span class="label">{{ $t("am.path.reverse") }}</span>
           <span class="oper"> <Switch v-model:checked="data.reverse" /> </span>
         </ui-group-option>
         <ui-group-option class="item">
-          <span class="label">持续时间</span>
+          <span class="label">{{ $t("am.path.dur") }}</span>
           <span class="oper">
             <ui-input
               width="75px"
               type="number"
               ref="nameInput"
-              placeholder="请输入"
+              :placeholder="$t('sys.placeInput')"
               :modelValue="data.duration"
               :min="0.1"
               @change="(ev: any) => $emit('updateDuration', Math.max(0.1, Number(ev.target.value)))"

+ 9 - 9
src/views/animation/right/subtitle.vue

@@ -1,15 +1,15 @@
 <template>
   <Tabs activeKey="t" width="100%">
-    <TabPane key="t" tab="设置字幕">
+    <TabPane key="t" :tab="$t('am.subtitle.title')">
       <ui-group>
         <ui-group-option>
-          <SignItem label="名称" not-apply>
+          <SignItem :label="$t('am.subtitle.name')" not-apply>
             <ui-input
               width="100%"
               type="text"
               ref="nameInput"
               class="nameInput"
-              placeholder="请输入名称"
+              :placeholder="$t('am.subtitle.nameplace')"
               v-model="data.name"
               :maxlength="50"
             />
@@ -17,13 +17,13 @@
         </ui-group-option>
 
         <ui-group-option>
-          <SignItem label="字幕" not-apply>
+          <SignItem :label="$t('am.subtitle.content')" not-apply>
             <ui-input
               class="input"
               width="100%"
               height="158px"
               type="richtext"
-              placeholder="请输入字幕"
+              :placeholder="$t('am.subtitle.contentplace')"
               v-model="data.content"
               :maxlength="500"
             />
@@ -31,13 +31,13 @@
         </ui-group-option>
 
         <ui-group-option class="item">
-          <span class="label">画面停留</span>
+          <span class="label">{{ $t("am.subtitle.dur") }}</span>
           <span class="oper">
             <ui-input
               width="75px"
               type="number"
               ref="nameInput"
-              placeholder="请输入"
+              :placeholder="$t('sys.placeInput')"
               :modelValue="data.duration"
               :min="0.1"
               @change="(ev: any) => $emit('updateDuration', Math.max(0.1, Number(ev.target.value)))"
@@ -47,12 +47,12 @@
         </ui-group-option>
 
         <ui-group-option class="item">
-          <span class="label">背景颜色</span>
+          <span class="label">{{ $t("am.subtitle.color") }}</span>
           <span class="oper">
             <ui-input
               width="50px"
               type="color"
-              placeholder="请输入名称"
+              :placeholder="$t('sys.placeInput')"
               v-model="data.background"
             />
           </span>

+ 5 - 3
src/views/animation/type.ts

@@ -1,3 +1,5 @@
+import { ui18n } from "@/lang";
+
 export type Active = {
   key: "frames" | "actions" | "subtitles" | "paths";
   ndx: number;
@@ -5,8 +7,8 @@ export type Active = {
 
 
 export const title = {
-  actions: "动作",
-  paths: "路径",
-  subtitles: "字幕",
+  actions: ui18n.t('am.tabs.actions'),
+  paths: ui18n.t('am.tabs.paths'),
+  subtitles: ui18n.t('am.tabs.subtitles'),
   frames: "",
 };

+ 8 - 2
src/views/guide/guide/attach-animation-sam.vue

@@ -6,7 +6,10 @@
     v-if="ams.length"
   >
     <ui-icon type="a-animation_s" />
-    <span>{{ isPlayIng ? "关闭" : "激活" }}动画</span>
+    <span
+      >{{ isPlayIng ? $t("guide.guide.activeam") : $t("guide.guide.unactiveam")
+      }}{{ $t("am.name1") }}</span
+    >
   </div>
 </template>
 
@@ -16,6 +19,7 @@ import { computed, ref, watchEffect } from "vue";
 import { GuidePath } from "@/store";
 import { Message } from "bill/index";
 import { ams } from "@/store/animation";
+import { ui18n } from "@/lang";
 
 const props = defineProps<{ current: GuidePath; paths: GuidePath[] }>();
 
@@ -43,7 +47,9 @@ watchEffect(() => {
 const attachAnimation = () => {
   props.current.playAnimation = !props.current.playAnimation;
   Message.success(
-    props.current.playAnimation ? "动画已激活,请至少添加2个视角" : "动画已关闭"
+    props.current.playAnimation
+      ? ui18n.t("guide.guide.activetip")
+      : ui18n.t("guide.guide.activeclose")
   );
 };
 </script>

+ 1 - 1
src/views/guide/guide/show.vue

@@ -1,5 +1,5 @@
 <template>
-  <ui-group title="导览列表" class="show-taggings">
+  <ui-group :title="$t('guide.guide.list')" class="show-taggings">
     <GuideSign
       v-for="guide in filterGuides"
       :key="guide.id"

+ 3 - 3
src/views/guide/index.vue

@@ -19,15 +19,15 @@
     <div class="quisks" v-if="!isEdit && !currentIsFullView && !custom.full">
       <div class="quisk-item fun-ctrl" @click="quiskAdd('guide')">
         <ui-icon type="a-guide_s" />
-        <span>导览</span>
+        <span>{{ $t("guide.guide.name") }}</span>
       </div>
       <div class="quisk-item fun-ctrl" @click="quiskAdd('animation')">
         <ui-icon type="a-animation_s" />
-        <span>动画</span>
+        <span>{{ $t("am.name1") }}</span>
       </div>
       <div class="quisk-item fun-ctrl" @click="quiskAdd('path')">
         <ui-icon type="a-path_s" />
-        <span>路线</span>
+        <span>{{ $t("path.name1") }}</span>
       </div>
     </div>
   </Teleport>

+ 1 - 5
src/views/guide/path/edit.vue

@@ -1,12 +1,8 @@
 <template>
   <ui-group borderBottom class="path-header">
     <template #header>
-      <!-- <ui-button @click="edit()">
-        <ui-icon type="add" />
-        新增
-      </ui-button> -->
       <div class="path-header-content">
-        <ui-input type="checkbox" v-model="all" label="全选" />
+        <ui-input type="checkbox" v-model="all" :label="$t('sys.selectAll')" />
         <ui-icon type="add" ctrl @click="edit()" />
       </div>
     </template>

+ 1 - 1
src/views/guide/path/show.vue

@@ -1,5 +1,5 @@
 <template>
-  <ui-group title="路径列表" class="show-taggings">
+  <ui-group :title="$t('am.path.list')" class="show-taggings">
     <template #icon>
       <ui-icon
         ctrl

+ 11 - 8
src/views/login.vue

@@ -3,20 +3,20 @@
     <div class="login-content">
       <div class="header">
         <img src="/favicon.ico" />
-        <p>登录多元融合</p>
+        <p>{{ $t("sys.login.title") }}</p>
       </div>
 
       <div class="body">
         <ui-input
           type="text"
-          placeholder="请输入账号"
+          :placeholder="$t('sys.login.username')"
           v-model="username"
           style="width: 100%"
         />
         <br />
         <ui-input
           :type="showPwd ? 'text' : 'password'"
-          placeholder="请输入密码"
+          :placeholder="$t('sys.login.pwd')"
           v-model="password"
           style="width: 100%; margin-top: 20px"
         >
@@ -33,14 +33,16 @@
         <ui-input
           type="checkbox"
           @click.stop
-          label="记住密码"
+          :label="$t('sys.login.mark')"
           style="margin-top: 20px"
           :modelValue="mark"
           @update:modelValue="(select: any) => mark = select"
         />
       </div>
       <div class="bottom">
-        <ui-button type="submit" @click="login(username, password)">登录</ui-button>
+        <ui-button type="submit" @click="login(username, password)">{{
+          $t("sys.login.name")
+        }}</ui-button>
       </div>
     </div>
   </div>
@@ -55,6 +57,7 @@ import { Message } from "bill/expose-common";
 import { params } from "@/env";
 import { GET_SETTING, UPDATE_SETTING } from "@/api/constant";
 import { currentLayout, RoutesName } from "@/router";
+import { ui18n } from "@/lang";
 
 const username = ref(localStorage.getItem("fuse-username") || "");
 const password = ref(localStorage.getItem("fuse-password") || "");
@@ -62,10 +65,10 @@ const mark = ref(!!localStorage.getItem("fuse-mark"));
 const showPwd = ref(false);
 const login = (username: string, password: string) => {
   if (!username) {
-    return Message.error("账号不能为空");
+    return Message.error(ui18n.t("sys.login.emptyusername"));
   }
   if (!password) {
-    return Message.error("密码不能为空");
+    return Message.error(ui18n.t("sys.login.emptypwd"));
   }
 
   const isView = [RoutesName.show, RoutesName.signModel, RoutesName.error].includes(
@@ -91,7 +94,7 @@ const login = (username: string, password: string) => {
       headers: { ...headers, token: res.data.data.token },
     });
     if (res1.data.code === 40111) {
-      return Message.error("您没有权限,请联系管理员开通");
+      return Message.error(ui18n.t("resCode.40111"));
     }
     setToken(res.data.data.token);
 

+ 0 - 7
src/views/measure/index.vue

@@ -20,13 +20,6 @@
           @click="custom.showMeasures = !custom.showMeasures"
         />
       </template>
-      <!-- <ui-group-option>
-        <ui-input type="text" width="100%" placeholder="搜索" v-model="keyword">
-          <template #preIcon>
-            <ui-icon type="search" />
-          </template>
-        </ui-input>
-      </ui-group-option> -->
       <MeasureSign
         v-for="measure in filterMeasures"
         :key="measure.id"

+ 4 - 3
src/views/merge/index.ts

@@ -1,5 +1,6 @@
 import { ActionsItem, ActionsProps } from "@/components/actions-merge/index.vue";
 import { custom } from "@/env";
+import { ui18n } from "@/lang";
 import { getSceneModel } from "@/sdk";
 import { reactive, ref } from "vue";
 
@@ -8,7 +9,7 @@ export const currentItem = ref<ActionsItem | null>(null);
 export const actionItems: ActionsProps["items"] = reactive([
   {
     icon: "a-move",
-    text: "移动",
+    text: ui18n.t('fuse.move'),
     action: () => {
       getSceneModel(custom.currentModel)?.enterMoveMode();
       console.error('move', getSceneModel(custom.currentModel))
@@ -17,7 +18,7 @@ export const actionItems: ActionsProps["items"] = reactive([
   },
   {
     icon: "a-rotate",
-    text: "旋转",
+    text: ui18n.t('fuse.flip'),
     action: () => {
       getSceneModel(custom.currentModel)?.enterRotateMode();
       return () => {
@@ -27,7 +28,7 @@ export const actionItems: ActionsProps["items"] = reactive([
   },
   {
     icon: "a-zoom",
-    text: "缩放",
+    text: ui18n.t('fuse.scale'),
     action: () => {
       getSceneModel(custom.currentModel)?.enterScaleMode();
       return () => {

+ 4 - 4
src/views/merge/index.vue

@@ -18,7 +18,7 @@
       />
     </div>
     <ui-group>
-      <ui-group-option label="等比缩放">
+      <ui-group-option :label="ui18n.t('fuse.repScale')">
         <template #icon>
           <ui-icon
             class="set-prop"
@@ -89,7 +89,7 @@ const active = useActive();
 const othActions = reactive([
   {
     icon: "rectification",
-    text: "配准",
+    text: ui18n.t("fuse.registration"),
     single: true,
     disabled: computed(() => isOld.value || !!currentItem.value),
     action: () => {
@@ -101,7 +101,7 @@ const othActions = reactive([
   },
   {
     icon: "reset",
-    text: "恢复默认",
+    text: ui18n.t("fuse.def"),
     single: true,
     action: () => {
       reset();
@@ -161,7 +161,7 @@ useViewStack(() =>
         setTimeout(() => {
           unMount = useRMenus(pixel, [
             {
-              label: "移动到这里",
+              label: ui18n.t("am.move"),
               icon: "move",
               handler() {
                 getSceneModel(custom.currentModel!)?.moveModelTo(pixel, pos?.worldPos);

+ 4 - 13
src/views/setting/index.vue

@@ -1,27 +1,17 @@
 <template>
   <RightFillPano>
-    <ui-group title="名称" borderBottom>
+    <ui-group :title="ui18n.t('setting.name1')" borderBottom>
       <ui-group-option>
         <Input
           :value="caseProject!.fusionTitle"
           @update:value="(title: string) => changeBack(undefined, title)"
           style="width: 100%; height: 40px"
-          defaultValue="多元融合"
+          :defaultValue="ui18n.t('fuse.name')"
           :maxlength="500"
           showCount
         />
       </ui-group-option>
     </ui-group>
-    <!-- <ui-group title="位置" borderBottom>
-      <ui-group-option>
-        <GlobalSearch
-          class="gps"
-          popupClassName="gps-popupClassName"
-          enable="map-"
-          @update:data="updateGPS"
-        />
-      </ui-group-option>
-    </ui-group> -->
 
     <ui-group :title="$t('setting.initView')" borderBottom>
       <ui-group-option>
@@ -60,6 +50,7 @@ import selectBack from "./select-back.vue";
 import { Input } from "ant-design-vue";
 import { updateCaseInfo } from "@/api";
 import Message from "bill/components/message/message.vue";
+import { ui18n } from "@/lang";
 
 const updateGPS = (val: any) => {
   console.log(val);
@@ -113,7 +104,7 @@ const changeBack = (mapData?: [string | null, number | null], title?: string) =>
     });
     enterOld(async () => {
       if (!caseProject.value?.fusionTitle?.trim()) {
-        Message.error("标题不能为空");
+        Message.error(ui18n.t("setting.name1tip"));
         throw "标题不能为空";
       }
       initBack = setting.value!.back;

+ 1 - 1
src/views/summary/index.vue

@@ -43,7 +43,7 @@ enum TabKey {
 const tabs = [
   { comp: Taggings, key: TabKey.tagging, text: ui18n.t("tagging.name") },
   // { comp: Monitor, key: TabKey.monitor, text: "监控" },
-  { comp: Paths, key: TabKey.path, text: "路径" },
+  { comp: Paths, key: TabKey.path, text: ui18n.t("path.name") },
   { comp: Measures, key: TabKey.measure, text: ui18n.t("measure.name") },
   { comp: Guides, key: TabKey.guide, text: ui18n.t("guide.name") },
 ];

+ 2 - 2
src/views/tagging/hot/edit.vue

@@ -77,7 +77,7 @@
                 show-time
                 valueFormat="YYYY-MM-DD HH:mm:ss"
                 :value="tagging.tqTime"
-                @update:value="(val) => (tagging.tqTime = val)"
+                @update:value="(val: any) => (tagging.tqTime = val)"
               />
             </span>
           </template>
@@ -288,7 +288,7 @@ const submitHandler = () => {
   } else if (!tagging.value.title.trim()) {
     Message.error(ui18n.t("tagging.titleErr"));
   } else if (tagging.value.title.trim().length > 15) {
-    Message.error("标题长度在15字以内!");
+    Message.error(ui18n.t("tagging.titleErr1"));
   }
   //  else if (!tagging.value.images.length) {
   //   Message.error("至少上传一张图片!");

+ 7 - 2
src/views/tagging/hot/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <ui-group title="标签列表" class="tagging-list">
+  <ui-group :title="$t('tagging.list')" class="tagging-list">
     <template #header>
       <div class="header">
         <StyleTypeSelect v-model:value="type" all count />
@@ -18,7 +18,12 @@
       </div>
     </template>
     <ui-group-option v-if="showSearch">
-      <ui-input type="text" width="100%" placeholder="搜索" v-model="keyword">
+      <ui-input
+        type="text"
+        width="100%"
+        :placeholder="$t('sys.search')"
+        v-model="keyword"
+      >
         <template #preIcon>
           <ui-icon type="search" />
         </template>

+ 1 - 1
src/views/tagging/hot/sign.vue

@@ -13,7 +13,7 @@
           </template>
           <p>{{ tagging.title }}</p>
         </Popover>
-        <span>放置:{{ positions.length }}</span>
+        <span>{{ $t("tagging.pos") }}:{{ positions.length }}</span>
       </div>
     </div>
     <div class="actions" @click.stop v-if="!search">

+ 2 - 1
src/views/tagging/hot/style-float-select.vue

@@ -66,11 +66,12 @@ import { computed, nextTick, ref, watch, watchEffect } from "vue";
 import { Menu, Dropdown } from "ant-design-vue";
 import { DownOutlined } from "@ant-design/icons-vue";
 import { taggings, getTaggingStyle } from "@/store";
+import { ui18n } from "@/lang";
 
 const props = defineProps<{ value: number; all?: boolean; count?: boolean }>();
 const emit = defineEmits<{ (e: "update:value", v: number): void }>();
 const keyword = ref("");
-const allType = { name: "全部", id: -1 };
+const allType = { name: ui18n.t("sys.all"), id: -1 };
 const getTypeCount = (item: any) => {
   if (item.id === allType.id) {
     return taggings.value.length;

+ 11 - 10
src/views/tagging/index.vue

@@ -22,16 +22,16 @@
       <Dropdown>
         <div class="quisk-item fun-ctrl">
           <ui-icon type="label" />
-          <span>标签</span>
+          <span>{{ $t("tagging.name") }}</span>
         </div>
         <template #overlay>
           <Menu class="tag-menu">
-            <menu-item key="1" @click="exposeTagging" style="text-align: center"
-              >导入</menu-item
-            >
-            <menu-item key="2" @click="quiskAdd('tagging')" style="text-align: center"
-              >新增</menu-item
-            >
+            <menu-item key="1" @click="exposeTagging" style="text-align: center">{{
+              $t("sys.import")
+            }}</menu-item>
+            <menu-item key="2" @click="quiskAdd('tagging')" style="text-align: center">{{
+              $t("sys.add")
+            }}</menu-item>
           </Menu>
         </template>
       </Dropdown>
@@ -65,14 +65,15 @@ import { defStyleType, getStyleTypeId, tqStatusEnum } from "@/api";
 import { formatDate } from "@/utils";
 import { FileType } from "@/api/material";
 import { custom } from "@/env";
+import { ui18n } from "@/lang";
 
 const current = ref("tagging");
 const tabs = reactive([
-  { key: "tagging", text: "标签()" },
+  { key: "tagging", text: `${ui18n.t("tagging.name")}()` },
   // { key: "monitor", text: "监控()" },
 ]);
 watchEffect(() => {
-  tabs[0].text = `标签(${taggings.value.length})`;
+  tabs[0].text = `${ui18n.t("tagging.name")}(${taggings.value.length})`;
   // tabs[1].text = `监控(${monitors.value.length})`;
 });
 const quiskObj = ref<any>();
@@ -100,7 +101,7 @@ const exposeTagging = async () => {
         "yyyy-MM-dd hh:mm:ss"
       ),
       part: item.content?.leftPosition || "",
-      method: item.content?.collectionModeName || "未送检",
+      method: item.content?.collectionModeName || ui18n.t("tagging.taStatus.UN"),
       principal: item.content?.createAccount || "",
       tqStatus: [tqStatusEnum.UN, tqStatusEnum.ING, tqStatusEnum.END][
         item.content?.status || 0

+ 7 - 2
src/views/tagging/monitor/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <ui-group title="监控列表" class="tagging-list">
+  <ui-group :title="$t('motior.list')" class="tagging-list">
     <template #icon>
       <ui-icon
         ctrl
@@ -15,7 +15,12 @@
       />
     </template>
     <ui-group-option v-if="showSearch">
-      <ui-input type="text" width="100%" placeholder="搜索" v-model="keyword">
+      <ui-input
+        type="text"
+        width="100%"
+        :placeholder="$t('sys.search')"
+        v-model="keyword"
+      >
         <template #preIcon>
           <ui-icon type="search" />
         </template>

+ 1 - 1
src/views/tagging/monitor/show.vue

@@ -1,5 +1,5 @@
 <template>
-  <ui-group title="监控列表" class="show-taggings">
+  <ui-group :title="$t('motior.list')" class="show-taggings">
     <template #icon>
       <ui-icon
         ctrl

+ 3 - 2
src/views/tagging/monitor/sign.vue

@@ -28,6 +28,7 @@
 </template>
 
 <script setup lang="ts">
+import { ui18n } from "@/lang";
 import type { Monitor } from "@/store";
 import useFocus from "bill/hook/useFocus";
 import { computed, ref } from "vue";
@@ -51,8 +52,8 @@ const emit = defineEmits<{
 }>();
 
 const menus = [
-  { label: "编辑", value: "edit" },
-  { label: "删除", value: "delete" },
+  { label: ui18n.t("sys.edit"), value: "edit" },
+  { label: ui18n.t("sys.del"), value: "delete" },
 ];
 const actions = {
   edit: () => (isEditTitle.value = true),