bill hai 1 ano
pai
achega
db38a949b3
Modificáronse 51 ficheiros con 1830 adicións e 900 borrados
  1. 15 14
      src/components/edit-fix-point/index.vue
  2. 1 3
      src/components/photos/header.vue
  3. 3 1
      src/graphic/Controls/AddPoint.js
  4. 2 1
      src/graphic/Geometry/Text.js
  5. 8 7
      src/graphic/Renderer/Draw.js
  6. 7 5
      src/graphic/enum/Msg.js
  7. 18 18
      src/lang/zh-entry.ts
  8. 551 0
      src/lang/zh/tl.ts
  9. 41 34
      src/router/constant.ts
  10. 7 1
      src/store/accidentPhotos.ts
  11. 4 4
      src/store/roadPhotos.ts
  12. 2 1
      src/store/sync.ts
  13. 10 9
      src/views/accidents/index.vue
  14. 49 43
      src/views/accidents/print.vue
  15. 7 6
      src/views/graphic/geos/arrow.vue
  16. 27 28
      src/views/graphic/geos/circle.vue
  17. 2 1
      src/views/graphic/geos/del.vue
  18. 22 21
      src/views/graphic/geos/delAndCopu.vue
  19. 6 5
      src/views/graphic/geos/magnifier.vue
  20. 12 11
      src/views/graphic/geos/normalLine.vue
  21. 6 5
      src/views/graphic/geos/road.vue
  22. 8 7
      src/views/graphic/geos/roadEdge.vue
  23. 5 4
      src/views/graphic/geos/text.vue
  24. 6 5
      src/views/graphic/header.vue
  25. 5 4
      src/views/graphic/imageLabel.vue
  26. 117 105
      src/views/graphic/menus.ts
  27. 12 7
      src/views/graphic/setting.vue
  28. 12 11
      src/views/photos/index.vue
  29. 11 10
      src/views/roads/index.vue
  30. 20 13
      src/views/roads/tabulation.vue
  31. 2 1
      src/views/scene/covers/basePoints.vue
  32. 4 3
      src/views/scene/covers/fixPoints.vue
  33. 2 1
      src/views/scene/covers/measures.vue
  34. 10 9
      src/views/scene/fixManage.ts
  35. 18 15
      src/views/scene/index.vue
  36. 2 1
      src/views/scene/linkage/measure.ts
  37. 12 11
      src/views/scene/menus/actions.ts
  38. 18 17
      src/views/scene/menus/menus.ts
  39. 76 36
      src/views/tables/ask.vue
  40. 26 21
      src/views/tables/author/author-one.vue
  41. 17 8
      src/views/tables/author/author-two.vue
  42. 30 21
      src/views/tables/demo.vue
  43. 51 30
      src/views/tables/explorate-four.vue
  44. 224 184
      src/views/tables/explorate-one.vue
  45. 43 17
      src/views/tables/explorate-three.vue
  46. 94 48
      src/views/tables/explorate-two.vue
  47. 24 23
      src/views/tables/extract.vue
  48. 34 28
      src/views/tables/identification.vue
  49. 72 17
      src/views/tables/index.vue
  50. 47 17
      src/views/tables/legacy.vue
  51. 28 8
      src/views/tables/write/doc.vue

+ 15 - 14
src/components/edit-fix-point/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="edit-fix-point" @touchstart.stop>
     <div class="header">
-      <h3>添加名称</h3>
+      <h3>{{ $t("tl.addName") }}</h3>
       <ui-icon type="close" ctrl @click="$emit('quit')" />
     </div>
     <ui-input
@@ -13,7 +13,7 @@
       class="search-fix"
     />
     <div class="select">
-      <span>常用名称</span>
+      <span>{{ $t("tl.pubName") }}</span>
       <p
         v-for="option in options"
         :key="option"
@@ -28,6 +28,7 @@
 </template>
 
 <script lang="ts" setup>
+import { ui18n } from "@/lang";
 import { ref } from "vue";
 
 defineProps<{ text: string }>();
@@ -37,18 +38,18 @@ const dom = ref<HTMLDivElement>();
 defineExpose(dom);
 
 const options = [
-  "轿车 / 平面",
-  "客车 / 平面",
-  "客车 / 侧面",
-  "货车 / 平面",
-  "牵引车 / 平面",
-  "正三轮机动车 / 平面",
-  "自行车",
-  "伤体",
-  "牲畜",
-  "散落物",
-  "岗台",
-  "桥",
+  `${ui18n.t("tl.coption1")} / ${ui18n.t("tl.slide1")}`,
+  `${ui18n.t("tl.coption2")} / ${ui18n.t("tl.slide1")}`,
+  `${ui18n.t("tl.coption2")} / ${ui18n.t("tl.slide2")}`,
+  `${ui18n.t("tl.coption3")} / ${ui18n.t("tl.slide1")}`,
+  `${ui18n.t("tl.coption4")} / ${ui18n.t("tl.slide1")}`,
+  `${ui18n.t("tl.coption5")} / ${ui18n.t("tl.slide1")}`,
+  `${ui18n.t("tl.coption6")}`,
+  `${ui18n.t("tl.coption7")}`,
+  `${ui18n.t("tl.coption8")}`,
+  `${ui18n.t("tl.coption9")}`,
+  `${ui18n.t("tl.coption10")}`,
+  `${ui18n.t("tl.coption11")}`,
 ];
 </script>
 

+ 1 - 3
src/components/photos/header.vue

@@ -14,9 +14,7 @@
       <template v-if="$slots.center">
         <slot name="center" :count="count" />
       </template>
-      <template v-else-if="count">
-        已选择 <span class="count">{{ count }}</span> 张
-      </template>
+      <template v-else-if="count" v-html="$t('tl.selected', { count })"> </template>
     </span>
     <div class="right">
       <slot />

+ 3 - 1
src/graphic/Controls/AddPoint.js

@@ -13,6 +13,7 @@ import Constant from "../Constant";
 import { listenLayer } from "../ListenLayer";
 import { textService } from "../Service/TextService";
 import { uiService } from "../Service/UIService";
+import { ui18n } from "@/lang";
 
 export default class AddPoint {
   constructor() {
@@ -33,7 +34,8 @@ export default class AddPoint {
       newPoint = pointService.create(position);
       stateService.setEventName(LayerEvents.AddPoint);
       const textVector = textService.create(position);
-      textVector.setValue("固定点");
+      textVector.setValue(ui18n.t("tl.fixPoint"));
+
       newPoint.linkedTextId = textVector.vectorId;
       textVector.linkedPointId = newPoint.vectorId;
     }

+ 2 - 1
src/graphic/Geometry/Text.js

@@ -4,13 +4,14 @@ import { mathUtil } from "../Util/MathUtil.js";
 import { coordinate } from "../Coordinate.js";
 import Constant from "../Constant.js";
 import Style from "@/graphic/CanvasStyle/index.js";
+import { ui18n } from "@/lang/index.js";
 
 //不靠墙
 export default class Text extends Geometry {
   constructor(center, vectorId) {
     super();
     this.center = center;
-    this.value = "文本";
+    this.value = ui18n.t("tl.dtex");
     this.angle = 0;
     this.color = Style.Text.fillStyle;
     this.fontSize = Style.Text.fontSize;

+ 8 - 7
src/graphic/Renderer/Draw.js

@@ -12,6 +12,7 @@ import VectorStyle from "@/graphic/enum/VectorStyle.js";
 import VectorWeight from "@/graphic/enum/VectorWeight.js";
 import router from "@/router/index";
 import VectorType from "../enum/VectorType.js";
+import { ui18n } from "@/lang/index.js";
 
 const isScreenStyle = () =>
   Settings.screenMode && router.currentRoute.value.params.mode === "0";
@@ -619,7 +620,7 @@ export default class Draw {
 
       const [style] = help.setVectorStyle(this.context, vector, ["NormalLine"]);
       help.drawStyleLine(this.context, [start, end]);
-      help.drawLineText(this.context, start, end, width, {
+      help.drawLineText(this.context, start, end, Math.round(width * 0.1), {
         padding: 6,
         fontSize: 12,
       });
@@ -728,7 +729,7 @@ export default class Draw {
             ctx,
             coordinate.getScreenXY(tstart),
             coordinate.getScreenXY(tend),
-            Math.round(edgeVector.roadSide.width * 1000),
+            Math.round(edgeVector.roadSide.width * 1000 * 0.1),
             {
               padding: 6,
               fontSize: 12,
@@ -1299,7 +1300,7 @@ export default class Draw {
 
     if (vector.category === "BasePoint") {
       ctx.font = `${12 * coordinate.ratio}px Microsoft YaHei`;
-      const bound = help.getTextCenter(ctx, "基准点");
+      const bound = help.getTextCenter(ctx, ui18n.t("tl.basep"));
 
       const screen = coordinate.getScreenXY(vector);
       const textPt = coordinate.getXYFromScreenNotRatio({
@@ -1308,7 +1309,7 @@ export default class Draw {
       });
 
       ctx.fillStyle = style.fillStyle;
-      this.drawTextByInfo(textPt, "基准点", 0, false);
+      this.drawTextByInfo(textPt, ui18n.t("tl.basep"), 0, false);
     } else {
       if (import.meta.env.DEV) {
         if (vector.vectorId) {
@@ -1499,8 +1500,8 @@ export default class Draw {
       coordinate.getScreenXY(startReal),
       coordinate.getScreenXY(endReal),
       vector.value
-        ? Math.round(vector.value * 1000)
-        : help.getRealDistance(startReal, endReal),
+        ? Math.round(vector.value * 1000 * 0.1)
+        : Math.round(help.getRealDistance(startReal, endReal) * 0.1),
       style
     );
   }
@@ -1545,7 +1546,7 @@ export default class Draw {
       this.context,
       help.getPerpendicularPoint(point, p5, p5, 10 * coordinate.ratio),
       help.getPerpendicularPoint(point, p5, p5, -10 * coordinate.ratio),
-      "基准线",
+      ui18n.t("tl.basel"),
       {
         padding: 6 * coordinate.ratio,
         backColor: "rgba(0,0,0,0)",

+ 7 - 5
src/graphic/enum/Msg.js

@@ -1,9 +1,11 @@
+import { ui18n } from "@/lang";
+
 const Msg = {
-  OK: "成功",
-  UnBaseLine: "请先创建基准线",
-  UnBasePoint: "请先创建基准点",
-  UnSelectBasePoint: "请先选择基准点",
-  UnFixPoint: "请先创建固定点",
+  OK: ui18n.t("tl.OK"),
+  UnBaseLine: ui18n.t("tl.UnBaseLine"),
+  UnBasePoint: ui18n.t("tl.UnBasePoint"),
+  UnSelectBasePoint: ui18n.t("tl.UnSelectBasePoint"),
+  UnFixPoint: ui18n.t("tl.UnFixPoint"),
 };
 
 export default Msg;

+ 18 - 18
src/lang/zh-entry.ts

@@ -1,19 +1,19 @@
-
-import { langMessageFactory } from './helper'
-import coord from "./zh/coord"
-import crop from "./zh/crop"
-import dataset from "./zh/dataset"
-import epoint from "./zh/epoint"
-import err from "./zh/err"
-import fire from "./zh/fire"
-import help from "./zh/help"
-import hotspot from "./zh/hotspot"
-import measure from "./zh/measure"
-import resStatus from "./zh/resStatus"
-import scene from "./zh/scene"
-import sys from "./zh/sys"
-import tool from "./zh/tool"
-import view from "./zh/view"
+import { langMessageFactory } from "./helper";
+import coord from "./zh/coord";
+import crop from "./zh/crop";
+import dataset from "./zh/dataset";
+import epoint from "./zh/epoint";
+import err from "./zh/err";
+import fire from "./zh/fire";
+import help from "./zh/help";
+import hotspot from "./zh/hotspot";
+import measure from "./zh/measure";
+import resStatus from "./zh/resStatus";
+import scene from "./zh/scene";
+import sys from "./zh/sys";
+import tool from "./zh/tool";
+import view from "./zh/view";
+import tl from "./zh/tl";
 // const lang = langMessageFactory(import.meta.globEager('./zh/*'))
 
 export default {
@@ -31,5 +31,5 @@ export default {
   sys,
   tool,
   view,
-}
-
+  tl,
+};

+ 551 - 0
src/lang/zh/tl.ts

@@ -0,0 +1,551 @@
+export default {
+  addName: "添加名称",
+  pubName: "常用名称",
+  coption1: "轿车",
+  coption2: "客车",
+  coption3: "货车",
+  coption4: "牵引车",
+  coption5: "正三轮机动车",
+  coption6: "自行车",
+  coption7: "伤体",
+  coption8: "牲畜",
+  coption9: "散落物",
+  coption10: "岗台",
+  coption11: "桥",
+  slide1: "平面",
+  slide2: "侧面",
+  selected: "已选择{count}张",
+  fixPoint: "固定点",
+  OK: "成功",
+  UnBaseLine: "请先创建基准线",
+  UnBasePoint: "请先创建基准点",
+  UnSelectBasePoint: "请先选择基准点",
+  UnFixPoint: "请先创建固定点",
+  dtex: "文本",
+  basep: "基准点",
+  basel: "基准线",
+  draw: "绘图",
+  photos: "相册",
+  accidents: "事故照片",
+  roads: "道路照片",
+  tabulation: "制表",
+  gena4: "生成A4",
+  tables: "道路交通事故现场勘查笔录",
+  demo: "表格",
+  aptypes: ["概览照片", "中心照片", "细目照片", "方位照片"],
+
+  weather: "晴天",
+  conditions: "普通",
+  illustrate:
+    "说明:绘图比例为1:215,单位为米。车辆甲为小轿车,无车号。车辆乙为小轿车,无车号。选取道路边缘线为基准线,井盖为基准点。",
+  loaderr: "场景数据加载失败",
+  labelps: "已标注照片({length})",
+  pphotos: "全部照片({length})`",
+  proads: "现场图管理({length})",
+  upphonto: "无照片,请打开场景拍照获取。",
+  uproads: "无现场图。请点击右上角按钮绘制现场图。",
+
+  cancel: "取消",
+  select: "选择",
+  add: "新增",
+  unp: "无照片。请点击右上角按钮标注照片。",
+  edit: "修改",
+  del: "删除",
+  save: "保存",
+  cdel: "确定要删除此数据?",
+  cndel: "确定要删除这{length}项数据?",
+  savep: "已保存至相册",
+  errp: "照片生成失败",
+  r1: "现场绘图",
+  r2: "事故照片",
+  su: "完成",
+  saves: "保存成功",
+  ud: "无结果",
+  it: "图例",
+  rt: "道路结构",
+  pub: "常用",
+  icon: {
+    jg_bmx: "斑马线",
+    jg_xfsj: "消火栓井",
+    jg_ysk: "雨水口",
+    jg_lmak: "路面凹坑",
+    jg_lmtcbf: "路面凸出...",
+    jg_lmjs: "路面积水",
+    mb_sxwl: "s型弯路",
+    mb_dzlk: "丁字路口",
+    mb_wclk: "五岔路口",
+    mb_ckzd: "出口匝道",
+    mb_szlk: "十字路口",
+    mb_gdlj: "国道(路肩)",
+    mb_snld: "室内路段",
+    mb_wd: "弯道",
+    mb_jzwd: "急转弯道",
+    mb_lclk: "六岔路口",
+    mb_zjwd: "直角弯道",
+    mb_jkzd: "进口匝道",
+    mb_gssfz: "高速收费站",
+    mb_gsld: "高速路段",
+    measure_r: "直角定位法",
+    ymeasure_r: "一键测量",
+    measure_free: "自由测量",
+    road: "道路",
+    line_d: "画线",
+    legend: "图例",
+    measure: "测量",
+    text: "文字",
+    magnify_g: "放大镜",
+    setting: "设置",
+    r_template: "道路结构",
+    r_structure: "道路模板",
+    Text: "文字",
+    Circle: "圈出",
+    SingleArrow: "箭头",
+    Magnifier: "放大镜",
+    GoBack: "回退",
+    GoAhead: "前进",
+    Clear: "清除",
+    BackImageChange: "底图开关",
+
+    color: "颜色",
+    type: "类型",
+    arrows_s: "单向",
+    arrows_d: "双向",
+    copy: "复制",
+    photo: "拍照",
+    map: "相册",
+    recover: "恢复默认",
+
+    line_sf: "单实线",
+    line_sd: "单虚线",
+    line_df: "双实线",
+    line_dd: "双虚线",
+    line_broken: "折线",
+    line_dot: "点画线",
+    l_thick: "宽度",
+    control_a: "控制点",
+    stone: "路缘线",
+    addcontrol_a: "加控制点",
+    lane_a: "加车道",
+    lane_d: "减车道",
+    fontSize: "文字大小",
+    fontEdit: "修改文字",
+  },
+  defr: "默认单车道宽度",
+  unit: "单位:",
+  defw: "默认隔离带宽度",
+  basew: "基本线宽 b",
+  photograph: "相机拍照",
+  selectPhotoAlbum: "相册选择",
+  scene: "场景截图",
+
+  table: {
+    t1: "到达事故现场时间",
+    t2: "天气",
+    t3: "路面性质",
+    t4: "事故发生地点",
+    t5: "绘图时间",
+    t6: "勘察员",
+    t7: "绘图员",
+    t8: "当事人签字",
+    t9: "见证人签字",
+    t10: "未命名",
+  },
+  pnull: "点云为空,换个位置试试",
+  time: "yyyy年MM月dd日hh时mm分",
+  tip: "提示",
+  dscene: {
+    dblc: "请先绘制基准线",
+    dbpc: "请先创建基准点",
+    gdblc: "去绘制",
+    gdbpc: "创建基准点",
+    sbd: "请选择一个基准点",
+  },
+  t1: {
+    i1: "事故时间",
+    i2: "天气",
+    i3: "地点",
+    i4: "事故描述",
+    i5: "案件",
+    i6: "勘查笔录",
+    i7: "询问笔录",
+    i8: "讯问笔录",
+    i9: "事故认定",
+    i10: "血样登记表",
+    i11: "遗留物品清单",
+    i12: "授权委托书",
+    i13: "法律法规",
+  },
+  pdraw: "请绘制{name}",
+  psbasep: "请单击选择基准点位置",
+  psfixp: "请单击选择固定点位置",
+  fixg: "形状",
+  mline: "测量线",
+  pfixg: "请单击绘制固定点形状",
+  pdnull: "确认清空?该操作无法撤销",
+
+  menus: [
+    "清空",
+    "测量",
+    "水平",
+    "垂直",
+    "自由",
+    "固定点",
+    "绘制线",
+    "垂足",
+    "基准",
+    "范围",
+    "离地高度",
+    "水平缩放",
+    "水平旋转",
+    "恢复",
+  ],
+
+  t2: [
+    "道路交通事故现场勘查笔录",
+    "询问笔录",
+    "讯问笔录",
+    "道路交通事故认定书",
+    "当事人血样登记表",
+    "道路交通事故现场遗留物品清单",
+    "授权委托书",
+  ],
+
+  t3: [
+    "现场勘查",
+    "补充勘查",
+    "普通路段",
+    "高架路段",
+    "变窄路段",
+    "窄路",
+    "桥梁",
+    "隧道",
+    "路段进出处",
+    "路侧险要路段",
+    "其他特殊路段",
+    "三枝分叉口",
+    "四枝分叉口",
+    "多枝分叉口",
+    "环形交叉口",
+    "匝道口",
+
+    "城市快速路",
+    "一般城市道路",
+    "单位小区自建路",
+    "公共停车场",
+    "公共广场",
+    "其他路",
+
+    "国道",
+    "省道",
+    "乡村道",
+    "其他",
+
+    "高速",
+    "一级",
+    "二级",
+    "三级",
+    "四级",
+    "等外",
+
+    "晴",
+    "阴",
+    "多云",
+    "雨",
+    "雪",
+    "雾",
+    "冰雹",
+    "沙尘",
+    "霾",
+    "其他",
+  ],
+  t4: [
+    "影响视线或行驶的障碍物:",
+    "递路交通标志:",
+    "道路交通标线:",
+    "中央隔离设施:",
+    "路侧防护设施:",
+    "照明情况:",
+    "路面材料:",
+    "路面状况:",
+    "路表状况:",
+    "其他需要记录的情况:",
+  ],
+  t5: [
+    "无",
+    "有:",
+    "沥青",
+    "水泥",
+    "砂石",
+    "土路",
+    "其他",
+
+    "路面完好",
+    "施工",
+    "凹凸",
+    "塌陷",
+    "路障",
+    "其他",
+
+    "干燥",
+    "潮湿",
+    "积水",
+    "漫水",
+    "冰雪",
+    "泥泞",
+    "其他",
+
+    "白天 夜间路灯照明",
+    "有",
+  ],
+
+  t6: [
+    "第",
+    "页",
+    "次",
+    "共",
+    "询问",
+    "讯问",
+    "笔录",
+    "时间",
+    "至",
+    "地点",
+    "人",
+    "工作单位",
+    "记录人",
+    "被",
+    "性别",
+    "年龄",
+    "出生日期",
+    "身份证件种类及号码",
+    "人大代表",
+    "现住址",
+    "联系方式",
+    "户籍所在地",
+    "口头传唤/被扭送/自动投案的被",
+    "于",
+    "到达,",
+    "离开,",
+    "本人签名:",
+    "被询问人:",
+    "被讯问人:",
+  ],
+  t7: ["是", "否"],
+  t8: [
+    "道路交通事故现场勘查笔录(续页)",
+    "六、对车辆驾驶人进行酒精含量、国家管制的精神药品和麻醉药品测试的结果以及提取血样、",
+    "编号",
+    "姓名",
+    "身份证号码",
+    "联系电话",
+    "交通方式",
+    "酒精、 国家管制精神药品和麻醉药品测试结果",
+    "是否抽血或提取尿样",
+    "备注",
+    "七、肇事车辆驶离的方向、 车型、 车号、 车身颜色等情况",
+    "编号",
+    "牌号",
+    "车型",
+    "车身颜色",
+    "驶离路线、方向",
+    "驾乘人员情况",
+    "其他信息",
+    "八、现场采取强制措施情况",
+    "九、勘查现场的交通警察认为应当记录的其他情况",
+    "现场勘查人员签名:",
+    "记录人签名:",
+    "当事人签名:",
+    "见证人签名:",
+    "共肆页",
+  ],
+  t9: [
+    "道路交通事故现场勘查笔录 ",
+    "勘查单位",
+    "勘查时间",
+    "事故时间",
+    "事故地点",
+    "道路类型",
+    "公路",
+    "技术等级",
+    "行政等级",
+    "城市道路",
+    "路口路段类型",
+    "路口",
+    "路段",
+    "路名",
+    "路号(公路)",
+    "位置",
+    "卫星定位",
+    "经度",
+    "纬度",
+    "地点描述",
+    "天气",
+    "一、事故现场道路环境",
+    "现场勘查人员签名:",
+    "记录人签名:",
+    "当事人签名:",
+    "见证人签名:",
+    "共肆页",
+  ],
+
+  t10: [
+    "道路交通事故现场勘查笔录(续页)",
+    "(一)地面痕迹:",
+    "(二)车体痕迹:",
+    "(三)人体痕迹:",
+    "(四)物证:",
+    "(五)其他:",
+    "现场勘查人员签名:",
+    "记录人签名:",
+    "当事人签名:",
+    "见证人签名:",
+    "共肆页",
+    "五、现场痕迹物证的种类、形态、尺寸、位置以及固定或者提取情况",
+  ],
+  t11: [
+    "二、现场监控设备情况",
+    "三、现场伤亡人员基本情况及救援",
+    "(一)伤亡人员基本情况;",
+    "当场死亡:",
+    "人",
+    "急救、医疗人员签名确认:",
+    "受伤",
+    "伤亡人员去向:",
+    "其他需求说明的情况:",
+    "(二)救援简要情况:",
+    "是否涉及危险物品:",
+    "名称:",
+    "相关部门和人员到达情况:",
+    "四、现场事故车辆车型、牌号及车辆挡位转向、灯光、仪表指针位置,汽车行驶记录仪、车载事件数据记录仪、卫星定位装置等安装及使用情况",
+    "编号",
+    "牌号",
+    "车辆类型",
+    "车辆档位",
+    "灯光开启情况",
+    "车速仪表指针位置",
+    "车载设备安装使用情况(有,无)",
+
+    "汽车行驶记录仪",
+    "车载事件数据记录仪",
+    "卫星定位装置",
+
+    "现场勘查人员签名:",
+    "记录人签名:",
+    "当事人签名:",
+    "见证人签名:",
+
+    "未发现",
+    "发现",
+    "否",
+    "是",
+    "医疗",
+    "消防",
+    "清障",
+    "其他",
+  ],
+  t12: [
+    "当事人血样(尿样)提取登记表",
+    "姓名",
+    "性别",
+    "身份证号码",
+    "事故时间",
+    "地点",
+    "血样(尿样)提取时间",
+    "血样(尿样)提取地点",
+    "血样(尿样)提取人员填写",
+    "提取登记",
+    "A样本盛装容器编号",
+    "提取量",
+    "B样本盛装容器编号",
+    "消毒名称",
+    "密封方式",
+    "提取人员单位",
+    "提取人员(签名)",
+    "通知家属情况",
+    "被提取人(签名)",
+    "见证人(签名)",
+    "交通警察(签名)",
+    "办案单位",
+  ],
+  t13: [
+    "道路交通事故认定书(简易程序)",
+    "第",
+    "号",
+    "事故时间",
+    "天气",
+    "事故地点",
+    "当事人",
+    "驾驶证或身份证号码",
+    "联系方式",
+    "交通方式",
+    "机动车类型、牌号",
+    "保险公司",
+    "交强险凭证号",
+    "交通事故事实及责任",
+    "当事人:",
+    "(道路交通事故处理专用章)",
+    "交通警察:",
+    "损害赔偿调解结果",
+    "当事人:",
+    "当事人对交通事故认定有异议的,可以自道路交通事故认定书送达之日起三日内提出书面复核申请。同一事故的复核以一次为限。损害赔偿有争议的,当事人可以申诮人民调解委员会调解,或者向人民法院提起民事诉讼。",
+    "注:此文书存档一份,交付各方当事人各一份。可使用无碳复写纸制作。",
+    "财产损失事故",
+    "受伤当事人伤势轻微,各方当事人一致同意适用简易程序处理",
+  ],
+  t14: [
+    "下载",
+    "确定",
+    "保存",
+    "道路交通事故现场勘查笔录",
+    "询问笔录",
+    "讯问笔录",
+    "授权委托书",
+    "道路交通事故现场遗留物品清单",
+    "当事人血样(尿样)提取登记表",
+    "道路交通事故认定书(简易程序)",
+    "法律法规",
+  ],
+  t15: [
+    "道路交通事故现场遗留物品清单",
+    "事故时间",
+    "事故地点",
+    "编号",
+    "物品名称",
+    "数量",
+    "特征",
+    "领取人签名",
+    "领取时间",
+    "备注",
+    "当事人签名:",
+    "交通警察(签名):",
+  ],
+  t16: [
+    "授权委托书",
+    "委托人:",
+    "性别:",
+    "年龄:",
+    "身份证号:",
+    "住址:",
+    "联系方式:",
+    "受委托人姓名:",
+    "性别:",
+    "年龄:",
+    "身份证号:",
+    "工作单位:",
+    "住址及联系方式:",
+    "现委托上述受委托人参与:",
+    "一案",
+    "处理工作。",
+    "受托人:",
+    "代理权限为:",
+    "一般代理。即代理为参与诉讼、调解,提供法律帮助。",
+    "特别授权,代为起诉,陈述事实,参加辩论和调解,代为提出、承认、放弃或变更赔偿请求, 提起反诉或上诉,签收法律文书。",
+  ],
+  t17: [
+    "受托人:",
+    "代理权限为:",
+    "委托人(签名):",
+    "受委托人(签名):",
+    "一般代理。即代理为参与诉讼、调解,提供法律帮助。",
+    "特别授权,代为起诉,陈述事实,参加辩论和调解,代为提出、承认、放弃或变更赔偿请求, 提起反诉或上诉,签收法律文书。",
+  ],
+};

+ 41 - 34
src/router/constant.ts

@@ -1,31 +1,34 @@
-import { modeFlags, ModeFlag, isLogin } from '@/store/sys';
-import { computed, ComputedRef } from 'vue';
-import { ui18n } from '@/lang';
+import { modeFlags, ModeFlag, isLogin } from "@/store/sys";
+import { computed, ComputedRef } from "vue";
+import { ui18n } from "@/lang";
 
 export const readyRouteName = {
-  layout: 'layout',
-  query: 'query',
-  hotspot: 'hotspot',
-  measure: 'measure',
-  graphic: 'graphic',
-  scene: 'scene',
-  photos: 'photos',
-  accidents: 'accidents',
-  roads: 'roads',
-  tabulation: 'tabulation',
-  gena4: 'gena4',
-  tables: 'tables',
-  demo: 'demo',
+  layout: "layout",
+  query: "query",
+  hotspot: "hotspot",
+  measure: "measure",
+  graphic: "graphic",
+  scene: "scene",
+  photos: "photos",
+  accidents: "accidents",
+  roads: "roads",
+  tabulation: "tabulation",
+  gena4: "gena4",
+  tables: "tables",
+  demo: "demo",
 } as const;
 
 export const writeRouteName = {
   ...readyRouteName,
-  setup: 'setup',
+  setup: "setup",
 } as const;
 
 export const defRouteName = readyRouteName.query;
 
-export type RouteNameRaw<T extends ModeFlag = any> = T extends typeof modeFlags.LOGIN ? typeof writeRouteName : typeof readyRouteName;
+export type RouteNameRaw<T extends ModeFlag = any> =
+  T extends typeof modeFlags.LOGIN
+    ? typeof writeRouteName
+    : typeof readyRouteName;
 
 export type RouteMetaAtom = {
   title: string;
@@ -38,30 +41,34 @@ export type RouteMetaRaw<T extends ModeFlag = any> = {
 };
 
 export const readyRouteMeta: RouteMetaRaw = {
-  [readyRouteName.layout]: { title: ui18n.t('sys.title') },
-  [readyRouteName.query]: { title: ui18n.t('sys.query') },
-  [readyRouteName.hotspot]: { title: ui18n.t('hotspot.name') },
-  [readyRouteName.measure]: { title: ui18n.t('measure.name') },
-  [readyRouteName.graphic]: { title: '绘图' },
-  [readyRouteName.scene]: { title: '绘图' },
-  [readyRouteName.photos]: { title: '相册' },
-  [readyRouteName.accidents]: { title: '事故照片' },
-  [readyRouteName.roads]: { title: '道路照片' },
-  [readyRouteName.tabulation]: { title: '制表' },
-  [readyRouteName.gena4]: { title: '生成A4' },
-  [readyRouteName.tables]: { title: '道路交通事故现场勘查笔录' },
-  [readyRouteName.demo]: { title: '表格' },
+  [readyRouteName.layout]: { title: ui18n.t("sys.title") },
+  [readyRouteName.query]: { title: ui18n.t("sys.query") },
+  [readyRouteName.hotspot]: { title: ui18n.t("hotspot.name") },
+  [readyRouteName.measure]: { title: ui18n.t("measure.name") },
+  [readyRouteName.graphic]: { title: ui18n.t("tl.draw") },
+  [readyRouteName.scene]: { title: ui18n.t("tl.draw") },
+  [readyRouteName.photos]: { title: ui18n.t("tl.photos") },
+  [readyRouteName.accidents]: { title: ui18n.t("tl.accidents") },
+  [readyRouteName.roads]: { title: ui18n.t("tl.roads") },
+  [readyRouteName.tabulation]: { title: ui18n.t("tl.tabulation") },
+  [readyRouteName.gena4]: { title: ui18n.t("tl.gena4") },
+  [readyRouteName.tables]: { title: ui18n.t("tl.tables") },
+  [readyRouteName.demo]: { title: ui18n.t("tl.demo") },
 };
 
 export const writeRouteMeta: RouteMetaRaw<typeof modeFlags.LOGIN> = {
   ...readyRouteMeta,
-  [writeRouteName.setup]: { title: ui18n.t('sys.setup') },
+  [writeRouteName.setup]: { title: ui18n.t("sys.setup") },
 };
 
 export type RouteName<T extends ModeFlag = any> = ComputedRef<RouteNameRaw<T>>;
-export const routeName = computed(() => (isLogin.value ? writeRouteName : readyRouteName));
+export const routeName = computed(() =>
+  isLogin.value ? writeRouteName : readyRouteName
+);
 
 export type RouteMeta<T extends ModeFlag = any> = ComputedRef<RouteMetaRaw<T>>;
-export const routeMeta = computed(() => (isLogin.value ? writeRouteMeta : readyRouteMeta));
+export const routeMeta = computed(() =>
+  isLogin.value ? writeRouteMeta : readyRouteMeta
+);
 
 export default writeRouteName;

+ 7 - 1
src/store/accidentPhotos.ts

@@ -1,5 +1,6 @@
 import { ref, watch, watchEffect } from "vue";
 import type { PhotoRaw } from "./photos";
+import { ui18n } from "@/lang";
 
 export type AccidentPhoto = {
   id: string;
@@ -20,7 +21,12 @@ export type AccidentPhoto = {
   };
 };
 
-export const types = ["概览照片", "中心照片", "细目照片", "方位照片"];
+export const types = [
+  ui18n.t("tl.aptypes[0]"),
+  ui18n.t("tl.aptypes[1]"),
+  ui18n.t("tl.aptypes[2]"),
+  ui18n.t("tl.aptypes[3]"),
+];
 
 export const accidentPhotos = ref<AccidentPhoto[]>([]);
 

+ 4 - 4
src/store/roadPhotos.ts

@@ -1,6 +1,7 @@
 import { ref } from "vue";
 import { PhotoRaw } from "@/store/photos";
 import matruces from "@/utils/matruces";
+import { ui18n } from "@/lang";
 
 export type RoadPhotoTable = {
   arrivalTime: string;
@@ -37,13 +38,12 @@ export const getDefaultTable = (road): RoadPhotoTable => {
     ? { ...road.table }
     : {
         arrivalTime: "2020-10-12",
-        weather: "晴天",
-        conditions: "普通",
+        weather: ui18n.t("tl.weather"),
+        conditions: ui18n.t("tl.conditions"),
         location: "",
         imageTransform: matruces.translateMatrix(0, 0, 0),
         compassAngle: matruces.translateMatrix(0, 0, 0),
-        illustrate:
-          "说明:绘图比例为1:215,单位为米。车辆甲为小轿车,无车号。车辆乙为小轿车,无车号。选取道路边缘线为基准线,井盖为基准点。",
+        illustrate: ui18n.t("tl.illustrate"),
         other: "",
       };
 };

+ 2 - 1
src/store/sync.ts

@@ -16,6 +16,7 @@ import { imageRotate } from "@/utils/image-rotate";
 import { sceneSeting } from "./sceneSeting";
 import { tables } from "./tables";
 import { drawSetting } from "./drawSetting";
+import { ui18n } from "@/lang";
 
 const global = window as any;
 
@@ -320,5 +321,5 @@ const syncSceneStore = () => {
 
 loadStore().catch((e) => {
   console.error(e);
-  alert("场景数据加载失败");
+  alert(ui18n.t("tl.loaderr"));
 });

+ 10 - 9
src/views/accidents/index.vue

@@ -4,7 +4,7 @@
       <Header
         type="return_l"
         :count="selects.length"
-        :title="`已标注照片(${sortPhotos.length})`"
+        :title="$t('tl.labelps', sortPhotos)"
         :on-back="() => onBack()"
       >
         <ui-button
@@ -14,7 +14,7 @@
           style="margin-right: 16px"
           v-if="sortPhotos.length"
         >
-          {{ selectMode ? "取消" : "选择" }}
+          {{ selectMode ? $t("tl.cancel") : $t("tl.select") }}
         </ui-button>
         <ui-button
           v-if="!selectMode"
@@ -22,7 +22,7 @@
           @click="router.push({ name: writeRouteName.photos })"
           width="96px"
         >
-          新增
+          {{ $t("tl.add") }}
         </ui-button>
       </Header>
     </template>
@@ -45,7 +45,7 @@
           </Photos>
         </div>
       </template>
-      <undata v-else undata-msg="无照片。请点击右上角按钮标注照片。" />
+      <undata v-else :undata-msg="$t("tl.unp")" />
     </div>
 
     <ActionMenus
@@ -84,6 +84,7 @@ import Photos from "@/components/photos/index.vue";
 import Header from "@/components/photos/header.vue";
 import { useConfirm } from "@/hook";
 import Undata from "@/components/photos/undata.vue";
+import { ui18n } from "@/lang";
 
 const sortPhotos = computed(() => {
   const photos = [...accidentPhotos.value];
@@ -114,7 +115,7 @@ const menus = [
   {
     key: "edit",
     icon: "edit",
-    text: "修改",
+    text: ui18n.t("tl.edit"),
     onClick: () => gotoDraw(),
   },
 ];
@@ -123,7 +124,7 @@ const selectMenus = reactive([
   {
     key: "gen",
     icon: "photo",
-    text: "生成A4",
+    text: ui18n.t("tl.gena4"),
     disabled: computed(() => selects.value.length > 2),
     onClick: () => {
       const params = {
@@ -135,7 +136,7 @@ const selectMenus = reactive([
   },
   {
     key: "del",
-    text: "删除",
+    text: ui18n.t("tl.del"),
     icon: "del",
     onClick: () => delSelects(),
   },
@@ -167,12 +168,12 @@ const delPhotoRaw = (accidentPhoto = active.value) => {
 };
 
 const delPhoto = async (photo = active.value) => {
-  if (await useConfirm(`确定要删除此数据?`)) {
+  if (await useConfirm(ui18n.t("tl.cdel"))) {
     delPhotoRaw(photo);
   }
 };
 const delSelects = async () => {
-  if (await useConfirm(`确定要删除这${selects.value.length}项数据?`)) {
+  if (await useConfirm(ui18n.t("tl.cndel", selects.value))) {
     while (selects.value.length) {
       delPhotoRaw(selects.value[0]);
       selects.value.shift();

+ 49 - 43
src/views/accidents/print.vue

@@ -1,22 +1,22 @@
 <template>
   <MainPanel>
     <template v-slot:header>
-      <Header  title="生成A4" type="return" :onBack="() => router.back()">
-        <ui-button
-            type="primary"
-            @click="saveHandler"
-            width="96px"
-        >
-          保存
+      <Header :title="$t('tl.gena4')" type="return" :onBack="() => router.back()">
+        <ui-button type="primary" @click="saveHandler" width="96px">
+          {{ $t("tl.save") }}
         </ui-button>
       </Header>
     </template>
 
-    <div class="print-layout" :class="{downMode}">
-      <div class="content " ref="layoutRef" >
-        <div v-for="accidentPhoto in genAccidentPhotos" :key="accidentPhoto.id" class="item">
-<!--          <h4>{{accidentPhoto.title}}</h4>-->
-          <img :src="useStaticUrl(accidentPhoto.url).value">
+    <div class="print-layout" :class="{ downMode }">
+      <div class="content" ref="layoutRef">
+        <div
+          v-for="accidentPhoto in genAccidentPhotos"
+          :key="accidentPhoto.id"
+          class="item"
+        >
+          <!--          <h4>{{accidentPhoto.title}}</h4>-->
+          <img :src="useStaticUrl(accidentPhoto.url).value" />
         </div>
       </div>
     </div>
@@ -26,57 +26,63 @@
 import UiButton from "@/components/base/components/button/index.vue";
 import Header from "@/components/photos/header.vue";
 import MainPanel from "@/components/main-panel/index.vue";
-import {computed, nextTick, ref} from "vue";
+import { computed, nextTick, ref } from "vue";
 import html2canvas from "html2canvas";
-import {router, writeRouteName} from "@/router";
-import {AccidentPhoto, accidentPhotos} from "@/store/accidentPhotos";
-import {useStaticUrl} from "@/hook/useStaticUrl";
-import {downloadImage} from "@/store/sync";
+import { router, writeRouteName } from "@/router";
+import { AccidentPhoto, accidentPhotos } from "@/store/accidentPhotos";
+import { useStaticUrl } from "@/hook/useStaticUrl";
+import { downloadImage } from "@/store/sync";
 import Message from "@/components/base/components/message/message.vue";
+import { ui18n } from "@/lang";
 
 const back = () => {
-  router.replace({name: writeRouteName.accidents})
-}
+  router.replace({ name: writeRouteName.accidents });
+};
 
 const genAccidentPhotos = computed<AccidentPhoto[]>(() => {
-  let route, params
-  if (((route = router.currentRoute.value).name === writeRouteName.gena4)
-    && (params = route.params)
-    && params.id1
-    && params.id2) {
-    return accidentPhotos.value?.filter(data => [params.id1, params.id2].includes(data.id))
+  let route, params;
+  if (
+    (route = router.currentRoute.value).name === writeRouteName.gena4 &&
+    (params = route.params) &&
+    params.id1 &&
+    params.id2
+  ) {
+    return accidentPhotos.value?.filter((data) =>
+      [params.id1, params.id2].includes(data.id)
+    );
   }
-})
+});
 
-const layoutRef = ref<HTMLDivElement>()
-const downMode = ref(false)
+const layoutRef = ref<HTMLDivElement>();
+const downMode = ref(false);
 const saveHandler = async () => {
-  downMode.value = true
-  await nextTick()
-  const canvas = await html2canvas(layoutRef.value)
-  const blob = await new Promise<Blob>(
-    resolve => canvas.toBlob(resolve, "image/jpeg", 0.95)
-  )
-  const success = await downloadImage(blob)
-  const hide = Message.success({ msg: success  ? "已保存至相册" : "照片生成失败" })
-  downMode.value = false
+  downMode.value = true;
+  await nextTick();
+  const canvas = await html2canvas(layoutRef.value);
+  const blob = await new Promise<Blob>((resolve) =>
+    canvas.toBlob(resolve, "image/jpeg", 0.95)
+  );
+  const success = await downloadImage(blob);
+  const hide = Message.success({
+    msg: success ? ui18n.t("tl.savep") : ui18n.t("tl.errp"),
+  });
+  downMode.value = false;
   setTimeout(() => {
-    hide()
-    back()
-  }, 3000)
-}
+    hide();
+    back();
+  }, 3000);
+};
 </script>
 
 <style lang="scss" scoped>
 .print-layout {
   top: calc(var(--header-top) + var(--editor-head-height));
   position: absolute;
-  background: #16181A;
+  background: #16181a;
   bottom: 0;
   left: 0;
   right: 0;
   overflow-y: auto;
-
 }
 .content {
   width: 100%;

+ 7 - 6
src/views/graphic/geos/arrow.vue

@@ -26,6 +26,7 @@ import GeoActions from "@/graphic/enum/GeoActions";
 import { debounce } from "@/utils";
 import Color from "@/components/color/index.vue";
 import VectorCategory from "@/graphic/enum/VectorCategory";
+import { ui18n } from "@/lang";
 
 const props = defineProps<{ geo: FocusVector }>();
 const vector = computed(() => dataService.getLine(props.geo.vectorId));
@@ -50,25 +51,25 @@ const menus = ref([
   {
     key: "color",
     icon: "del",
-    text: "颜色",
+    text: ui18n.t("tl.icon.color"),
   },
   {
     key: "type",
     icon: "del",
-    text: "类型",
+    text: ui18n.t("tl.icon.color"),
     onClick: () => {
       typeMenus.value = !typeMenus.value
         ? [
             {
               key: "SingleArrowLine",
               icon: "arrows_s",
-              text: "单向",
+              text: ui18n.t("tl.icon.arrows_s"),
               onClick: () => (type.value = "SingleArrowLine"),
             },
             {
               key: "DoubleArrowLine",
               icon: "arrows_d",
-              text: "双向",
+              text: ui18n.t("tl.icon.arrows_d"),
               onClick: () => (type.value = "DoubleArrowLine"),
             },
           ]
@@ -78,7 +79,7 @@ const menus = ref([
   {
     key: "copy",
     icon: "copy",
-    text: "复制",
+    text: ui18n.t("tl.icon.copy"),
     onClick: () => {
       drawRef.value.uiControl.handleGeo(GeoActions.CopyAction);
     },
@@ -86,7 +87,7 @@ const menus = ref([
   {
     key: "del",
     icon: "del",
-    text: "删除",
+    text: ui18n.t("tl.del"),
     onClick: () => {
       drawRef.value.uiControl.handleGeo(GeoActions.DeleteAction);
     },

+ 27 - 28
src/views/graphic/geos/circle.vue

@@ -3,7 +3,7 @@
     <template v-slot="{ data }">
       <template v-if="data.key === 'color'">
         <Color v-model:color="color">
-          <span class="color" :style="{backgroundColor: color}"></span>
+          <span class="color" :style="{ backgroundColor: color }"></span>
         </Color>
       </template>
     </template>
@@ -13,44 +13,43 @@
 <script setup lang="ts">
 import GeoTeleport from "@/views/graphic/geos/geo-teleport.vue";
 import UiInput from "@/components/base/components/input/index.vue";
-import Color from '@/components/color/index.vue'
-import {drawRef, FocusVector, uiType, UIType, useChange} from '@/hook/useGraphic'
-import {computed, ref, watch, watchEffect} from "vue";
-import {dataService} from "@/graphic/Service/DataService";
-import {debounce} from "@/utils";
+import Color from "@/components/color/index.vue";
+import { drawRef, FocusVector, uiType, UIType, useChange } from "@/hook/useGraphic";
+import { computed, ref, watch, watchEffect } from "vue";
+import { dataService } from "@/graphic/Service/DataService";
+import { debounce } from "@/utils";
 import GeoActions from "@/graphic/enum/GeoActions";
+import { ui18n } from "@/lang";
 
-
-const props = defineProps<{geo: FocusVector}>()
-const vector = computed(() => dataService.getCircle(props.geo.vectorId))
-const color = ref("#000000")
+const props = defineProps<{ geo: FocusVector }>();
+const vector = computed(() => dataService.getCircle(props.geo.vectorId));
+const color = ref("#000000");
 useChange(() => {
-  color.value = vector.value.color
-})
+  color.value = vector.value.color;
+});
 
 const syncVector = ([color]) => {
-  vector.value.setColor(color)
-  drawRef.value.renderer.autoRedraw()
-  drawRef.value.history.save()
-}
+  vector.value.setColor(color);
+  drawRef.value.renderer.autoRedraw();
+  drawRef.value.history.save();
+};
 
-watch(() => [color.value], debounce(syncVector, 500))
+watch(() => [color.value], debounce(syncVector, 500));
 const menus = [
   {
-    key: 'color',
-    icon: 'del',
-    text: "颜色"
+    key: "color",
+    icon: "del",
+    text: ui18n.t("tl.icon.color"),
   },
   {
-    key: 'del',
-    text: "删除",
-    icon: 'del',
+    key: "del",
+    text: ui18n.t("tl.del"),
+    icon: "del",
     onClick: () => {
-      drawRef.value.uiControl.handleGeo(GeoActions.DeleteAction)
-    }
-  }
-]
-
+      drawRef.value.uiControl.handleGeo(GeoActions.DeleteAction);
+    },
+  },
+];
 </script>
 
 <style scoped lang="scss">

+ 2 - 1
src/views/graphic/geos/del.vue

@@ -11,6 +11,7 @@ import GeoTeleport from "@/views/graphic/geos/geo-teleport.vue";
 import { drawRef, FocusVector, VectorType } from "@/hook/useGraphic";
 import GeoActions from "@/graphic/enum/GeoActions";
 import VectorCategory from "@/graphic/enum/VectorCategory";
+import { ui18n } from "@/lang";
 
 const props = defineProps<{ geo: FocusVector }>();
 const hideTypes = [
@@ -23,7 +24,7 @@ console.log(props);
 const menus = [
   {
     key: "del",
-    text: "删除",
+    text: ui18n.t("tl.del"),
     icon: "del",
     onClick: () => {
       drawRef.value.uiControl.handleGeo(GeoActions.DeleteAction);

+ 22 - 21
src/views/graphic/geos/delAndCopu.vue

@@ -1,42 +1,43 @@
 <template>
   <GeoTeleport
-      :menus="menus"
-      class="geo-teleport-use"
-      v-if="!hideTypes.includes(geo.type) && !hideTypes.includes(geo.category)"
+    :menus="menus"
+    class="geo-teleport-use"
+    v-if="!hideTypes.includes(geo.type) && !hideTypes.includes(geo.category)"
   />
 </template>
 
 <script setup lang="ts">
 import GeoTeleport from "@/views/graphic/geos/geo-teleport.vue";
-import {drawRef, FocusVector, VectorType} from '@/hook/useGraphic'
-import GeoActions from "@/graphic/enum/GeoActions"
+import { drawRef, FocusVector, VectorType } from "@/hook/useGraphic";
+import GeoActions from "@/graphic/enum/GeoActions";
 import VectorCategory from "@/graphic/enum/VectorCategory";
+import { ui18n } from "@/lang";
 
-const props = defineProps<{geo: FocusVector}>()
+const props = defineProps<{ geo: FocusVector }>();
 const hideTypes = [
   VectorType.RoadPoint,
   VectorType.CurveRoadPoint,
-  VectorCategory.Point.NormalPoint
-]
-console.log(props)
+  VectorCategory.Point.NormalPoint,
+];
+console.log(props);
 const menus = [
   {
-    key: 'copy',
-    icon: 'copy',
-    text: "复制",
+    key: "copy",
+    icon: "copy",
+    text: ui18n.t("tl.icon.copy"),
     onClick: () => {
-      drawRef.value.uiControl.handleGeo(GeoActions.CopyAction)
-    }
+      drawRef.value.uiControl.handleGeo(GeoActions.CopyAction);
+    },
   },
   {
-    key: 'del',
-    text: "删除",
-    icon: 'del',
+    key: "del",
+    text: ui18n.t("tl.del"),
+    icon: "del",
     onClick: () => {
-      drawRef.value.uiControl.handleGeo(GeoActions.DeleteAction)
-    }
-  }
-]
+      drawRef.value.uiControl.handleGeo(GeoActions.DeleteAction);
+    },
+  },
+];
 </script>
 
 <style scoped lang="scss">

+ 6 - 5
src/views/graphic/geos/magnifier.vue

@@ -13,6 +13,7 @@ import { computed, reactive, ref, UnwrapRef, watch } from "vue";
 import { dataService } from "@/graphic/Service/DataService";
 import { api } from "@/store/sync";
 import GeoActions from "@/graphic/enum/GeoActions";
+import { ui18n } from "@/lang";
 
 const props = defineProps<{ geo: FocusVector }>();
 const vector = computed(() => dataService.getMagnifier(props.geo.vectorId));
@@ -21,7 +22,7 @@ console.log(vector.value);
 const menus = reactive([
   {
     key: "file",
-    text: "拍照",
+    text: ui18n.t("tl.icon.photo"),
     icon: "photo",
     onClick() {
       typeMenus.value = !typeMenus.value
@@ -29,7 +30,7 @@ const menus = reactive([
             {
               key: "color",
               icon: "photo",
-              text: "拍照",
+              text: ui18n.t("tl.icon.photo"),
               onClick: async () => {
                 const data = await api.photograph(false);
                 data && syncVector(data);
@@ -38,7 +39,7 @@ const menus = reactive([
             {
               key: "color",
               icon: "map",
-              text: "相册",
+              text: ui18n.t("tl.icon.map"),
               onClick: async () => {
                 const data = await api.selectPhotoAlbum(false);
                 data && syncVector(data);
@@ -51,14 +52,14 @@ const menus = reactive([
   {
     key: "reset",
     icon: "recover",
-    text: "恢复默认",
+    text: ui18n.t("tl.icon.recover"),
     disabled: !vector.value.photoUrl,
     onClick: () => syncVector(null),
   },
   {
     key: "del",
     icon: "del",
-    text: "删除",
+    text: ui18n.t("tl.del"),
     onClick: () => {
       drawRef.value.uiControl.handleGeo(GeoActions.DeleteAction);
     },

+ 12 - 11
src/views/graphic/geos/normalLine.vue

@@ -14,6 +14,7 @@ import VectorEvents from "@/graphic/enum/VectorEvents";
 import VectorStyle from "@/graphic/enum/VectorStyle";
 import VectorWeight from "@/graphic/enum/VectorWeight";
 import VectorCategory from "@/graphic/enum/VectorCategory";
+import { ui18n } from "@/lang";
 
 const props = defineProps<{ geo: FocusVector }>();
 const vector = computed(() => dataService.getGeo(props.geo.type, props.geo.vectorId));
@@ -27,7 +28,7 @@ const lineTypeMenu = [
   {
     key: VectorStyle.SingleSolidLine,
     icon: "line_sf",
-    text: "单实线",
+    text: ui18n.t("tl.icon.line_sf"),
     onClick: () => {
       clickHandlerFactory(VectorStyle.SingleSolidLine)();
       style.value = VectorStyle.SingleSolidLine;
@@ -36,7 +37,7 @@ const lineTypeMenu = [
   {
     key: VectorStyle.SingleDashedLine,
     icon: "line_sd",
-    text: "单虚线",
+    text: ui18n.t("tl.icon.line_sd"),
     onClick: () => {
       clickHandlerFactory(VectorStyle.SingleDashedLine)();
       style.value = VectorStyle.SingleDashedLine;
@@ -46,7 +47,7 @@ const lineTypeMenu = [
     hide: isCurve,
     key: VectorStyle.DoubleSolidLine,
     icon: "line_df",
-    text: "双实线",
+    text: ui18n.t("tl.icon.line_df"),
     onClick: () => {
       clickHandlerFactory(VectorStyle.DoubleSolidLine)();
       style.value = VectorStyle.DoubleSolidLine;
@@ -56,7 +57,7 @@ const lineTypeMenu = [
     hide: isCurve,
     key: VectorStyle.DoubleDashedLine,
     icon: "line_dd",
-    text: "双虚线",
+    text: ui18n.t("tl.icon.line_dd"),
     onClick: () => {
       clickHandlerFactory(VectorStyle.DoubleDashedLine)();
       style.value = VectorStyle.DoubleDashedLine;
@@ -66,7 +67,7 @@ const lineTypeMenu = [
     hide: isCurve,
     key: VectorStyle.BrokenLine,
     icon: "line_broken",
-    text: "折线",
+    text: ui18n.t("tl.icon.line_broken"),
     onClick: () => {
       clickHandlerFactory(VectorStyle.BrokenLine)();
       style.value = VectorStyle.BrokenLine;
@@ -75,7 +76,7 @@ const lineTypeMenu = [
   {
     key: VectorStyle.PointDrawLine,
     icon: "line_dot",
-    text: "点画线",
+    text: ui18n.t("tl.icon.line_dot"),
     onClick: () => {
       clickHandlerFactory(VectorStyle.PointDrawLine)();
       style.value = VectorStyle.PointDrawLine;
@@ -87,7 +88,7 @@ const lineWidthMenu = [
   {
     key: VectorWeight.Bold,
     icon: "l_thick",
-    text: "宽度",
+    text: ui18n.t("tl.icon.l_thick"),
     onClick: () => {
       clickHandlerFactory(VectorWeight.Thinning)();
       menus.value[1] = lineWidthMenu[1];
@@ -96,7 +97,7 @@ const lineWidthMenu = [
   {
     key: VectorWeight.Thinning,
     icon: "l_thin",
-    text: "宽度",
+    text: ui18n.t("tl.icon.l_thin"),
     onClick: () => {
       clickHandlerFactory(VectorWeight.Bold)();
       menus.value[1] = lineWidthMenu[0];
@@ -110,7 +111,7 @@ const appendMenus =
         {
           key: VectorEvents.AddCrossPoint,
           icon: "control_a",
-          text: "控制点",
+          text: ui18n.t("tl.icon.control_a"),
           onClick: clickHandlerFactory(VectorEvents.AddCrossPoint),
         },
         // {
@@ -136,7 +137,7 @@ const menus = ref([
   {
     key: "copy",
     icon: "copy",
-    text: "复制",
+    text: ui18n.t("tl.icon.copy"),
     onClick: () => {
       drawRef.value.uiControl.handleGeo(GeoActions.CopyAction);
     },
@@ -144,7 +145,7 @@ const menus = ref([
   {
     key: "del",
     icon: "del",
-    text: "删除",
+    text: ui18n.t("tl.del"),
     onClick: () => {
       drawRef.value.uiControl.handleGeo(GeoActions.DeleteAction);
     },

+ 6 - 5
src/views/graphic/geos/road.vue

@@ -20,6 +20,7 @@ import { dataService } from "@/graphic/Service/DataService";
 import GeoActions from "@/graphic/enum/GeoActions";
 import GraphicAction from "@/components/button-pane/index.vue";
 import VectorEvents from "@/graphic/enum/VectorEvents";
+import { ui18n } from "@/lang";
 
 const props = defineProps<{ geo: FocusVector }>();
 const vector = computed(
@@ -47,7 +48,7 @@ const appendMenus =
         {
           key: VectorEvents.AddCrossPoint,
           icon: "control_a",
-          text: "加控制点",
+          text: ui18n.t("tl.icon.control_a"),
           onClick: clickHandlerFactory(VectorEvents.AddCrossPoint),
         },
         // {
@@ -62,20 +63,20 @@ const menus = ref([
   {
     key: VectorEvents.AddLane,
     icon: "lane_a",
-    text: "加车道",
+    text: ui18n.t("tl.icon.lane_a"),
     onClick: clickHandlerFactory(VectorEvents.AddLane, true),
   },
   {
     key: VectorEvents.DelLane,
     icon: "lane_d",
-    text: "减车道",
+    text: ui18n.t("tl.icon.lane_d"),
     onClick: clickHandlerFactory(VectorEvents.DelLane, true),
   },
   ...appendMenus,
   {
     key: "copy",
     icon: "copy",
-    text: "复制",
+    text: ui18n.t("tl.icon.copy"),
     onClick: () => {
       drawRef.value.uiControl.handleGeo(GeoActions.CopyAction);
     },
@@ -83,7 +84,7 @@ const menus = ref([
   {
     key: "del",
     icon: "del",
-    text: "删除",
+    text: ui18n.t("tl.del"),
     onClick: () => {
       drawRef.value.uiControl.handleGeo(GeoActions.DeleteAction);
     },

+ 8 - 7
src/views/graphic/geos/roadEdge.vue

@@ -24,6 +24,7 @@ import VectorWeight from "@/graphic/enum/VectorWeight";
 import VRange from "@/components/vrange/index.vue";
 import VectorType from "@/graphic/enum/VectorType";
 import { debounce, throttle } from "@/utils";
+import { ui18n } from "@/lang";
 const props = defineProps<{ geo: FocusVector }>();
 const vector = computed(() => dataService.getGeo(props.geo.type, props.geo.vectorId));
 const style = ref(vector.value.style || VectorStyle.SingleSolidLine);
@@ -42,7 +43,7 @@ const lineTypeMenu = reactive([
   {
     key: VectorStyle.SingleSolidLine,
     icon: "line_sf",
-    text: "单实线",
+    text: ui18n.t("tl.icon.line_sf"),
     onClick: () => {
       clickHandlerFactory(VectorStyle.SingleSolidLine)();
       style.value = VectorStyle.SingleSolidLine;
@@ -51,7 +52,7 @@ const lineTypeMenu = reactive([
   {
     key: VectorStyle.SingleDashedLine,
     icon: "line_sd",
-    text: "单虚线",
+    text: ui18n.t("tl.icon.line_sd"),
     onClick: () => {
       clickHandlerFactory(VectorStyle.SingleDashedLine)();
       style.value = VectorStyle.SingleDashedLine;
@@ -60,7 +61,7 @@ const lineTypeMenu = reactive([
   {
     key: VectorStyle.PointDrawLine,
     icon: "line_dot",
-    text: "点画线",
+    text: ui18n.t("tl.icon.line_dot"),
     onClick: () => {
       clickHandlerFactory(VectorStyle.PointDrawLine)();
       style.value = VectorStyle.PointDrawLine;
@@ -70,7 +71,7 @@ const lineTypeMenu = reactive([
     key: VectorStyle.RoadSide,
     icon: "stone",
     hide: vector.value.geoType === VectorType.CurveRoadEdge,
-    text: "路缘线",
+    text: ui18n.t("tl.icon.stone"),
     onClick: () => {
       clickHandlerFactory(VectorStyle.RoadSide)();
       style.value = VectorStyle.RoadSide;
@@ -82,7 +83,7 @@ const lineWidthMenu = reactive([
   {
     key: VectorWeight.Bold,
     icon: "l_thick",
-    text: "宽度",
+    text: ui18n.t("tl.icon.l_thick"),
     onClick: () => {
       clickHandlerFactory(VectorWeight.Thinning)();
       menus.value[1] = lineWidthMenu[1];
@@ -91,7 +92,7 @@ const lineWidthMenu = reactive([
   {
     key: VectorWeight.Thinning,
     icon: "l_thin",
-    text: "宽度",
+    text: ui18n.t("tl.icon.l_thick"),
     onClick: () => {
       clickHandlerFactory(VectorWeight.Bold)();
       menus.value[1] = lineWidthMenu[0];
@@ -100,7 +101,7 @@ const lineWidthMenu = reactive([
   {
     key: "setRoadEdageWidth",
     icon: "l_thin",
-    text: "宽度",
+    text: ui18n.t("tl.icon.l_thick"),
     desc: -1,
     onClick: () => {
       showChange.value = !showChange.value;

+ 5 - 4
src/views/graphic/geos/text.vue

@@ -44,6 +44,7 @@ import { debounce } from "@/utils";
 import GeoActions from "@/graphic/enum/GeoActions";
 import Color from "@/components/color/index.vue";
 import VectorCategory from "@/graphic/enum/VectorCategory";
+import { ui18n } from "@/lang";
 
 const props = defineProps<{ geo: FocusVector }>();
 const inputTextRef = ref();
@@ -90,22 +91,22 @@ const menus = [
   {
     key: "color",
     icon: "del",
-    text: "颜色",
+    text: ui18n.t("tl.icon.color"),
   },
   {
     key: "fontSize",
-    text: "文字大小",
+    text: ui18n.t("tl.icon.fontSize"),
   },
   {
     key: "text",
     icon: "edit",
-    text: "修改文字",
+    text: ui18n.t("tl.icon.fontEdit"),
     onClick: () => (updateText.value = true),
   },
   {
     key: "del",
     icon: "del",
-    text: "删除",
+    text: ui18n.t("tl.del"),
     onClick: () => {
       drawRef.value.uiControl.handleGeo(GeoActions.DeleteAction);
     },

+ 6 - 5
src/views/graphic/header.vue

@@ -2,7 +2,7 @@
   <div v-if="data" class="graphic-header">
     <div class="title">
       <ui-icon class="head-icon" type="return" @click="router.back" />
-      <p>{{ isRoad ? "现场绘图" : "事故照片" }}</p>
+      <p>{{ isRoad ? $t("tl.r1") : $t("tl.r2") }}</p>
     </div>
     <div class="actions">
       <div
@@ -39,7 +39,7 @@
         width="100px"
         @click="saveHandler"
       >
-        {{ isRoad ? "保存" : "完成" }}
+        {{ isRoad ? $t("tl.save") : $t("tl.su") }}
       </ui-button>
       <ui-button
         v-if="isRoad"
@@ -48,7 +48,7 @@
         width="100px"
         @click="createTable"
       >
-        制表
+        {{ $t("tl.tabulation") }}
       </ui-button>
     </div>
     <div
@@ -76,6 +76,7 @@ import { downloadImage, uploadImage } from "@/store/sync";
 import { genUseLoading } from "@/hook";
 import { loadData, bus } from "@/hook/useGraphic";
 import { Message } from "@kankan/components/expose-common";
+import { ui18n } from "@/lang";
 
 const data = useData();
 const mode = computed(() => Number(router.currentRoute.value.params.mode) as Mode);
@@ -195,7 +196,7 @@ const saveStore = genUseLoading(async () => {
   if (!isRoad.value) {
     await downloadImage(blob);
     setTimeout(() => {
-      Message.success(`已保存至相册`);
+      Message.success(ui18n.t("tl.savep"));
     });
   }
   return newData;
@@ -205,7 +206,7 @@ const saveHandler = async () => {
   await saveStore();
   console.error("isRoad.value", isRoad.value);
   if (isRoad.value) {
-    Message.success(`保存成功`);
+    Message.success(ui18n.t("tl.saves"));
   }
   await router.push({
     name: isRoad.value ? writeRouteName.roads : writeRouteName.accidents,

+ 5 - 4
src/views/graphic/imageLabel.vue

@@ -36,7 +36,7 @@
       <div>
         <img src="@/components/photos/undata.png" v-if="params.theme === 'light'" />
         <img src="@/components/photos/undata-hei.png" v-else />
-        <p>无结果</p>
+        <p>{{ $t("tl.ud") }}</p>
       </div>
     </div>
   </div>
@@ -55,12 +55,13 @@ import { uses } from "@/store/SVGLabel";
 import { UITypeExtend } from "./menus";
 
 import { useParams } from "@/hook";
+import { ui18n } from "@/lang";
 const params = useParams();
 const props = defineProps<{ type: string }>();
 const config = computed(() =>
   props.type === UITypeExtend.image
-    ? { title: "图例", data: imageTypeKeys, enableUse: true }
-    : { title: "道路结构", data: structureTypeKeys, enableUse: false }
+    ? { title: ui18n.t("tl.it"), data: imageTypeKeys, enableUse: true }
+    : { title: ui18n.t("tl.ir"), data: structureTypeKeys, enableUse: false }
 );
 
 const typeMenusRaw = computed(() =>
@@ -87,7 +88,7 @@ const typeMenus = computed(() => {
       ? raws
       : [
           {
-            title: "常用",
+            title: ui18n.t("tl.pub"),
             children: uses.value
               .sort((item1, item2) => (item2.count || 0) - (item1.count || 0))
               .slice(0, 10)

+ 117 - 105
src/views/graphic/menus.ts

@@ -10,6 +10,7 @@ import RoadTemplate from "@/graphic/enum/RoadTemplate";
 import { computed } from "vue";
 import { mount } from "@/components/base/utils/componentHelper";
 import Setting from "@/views/graphic/setting.vue";
+import { ui18n } from "@/lang";
 
 export enum Mode {
   Road,
@@ -55,143 +56,143 @@ export const structureMenusRaw = [
   // { key: RoadStructure.Uphill, icon: "jg_sp", text: "上坡" },
   // { key: RoadStructure.RoadsideGutter, icon: "jg_lpsg", text: "路边水沟" },
   // { key: RoadStructure.RoadsAndRails, icon: "jg_dltlpjk", text: "道路与铁..." },
-  { key: RoadStructure.ZebraCrossing, icon: "jg_bmx", text: "斑马线" },
-  { key: "jg_xfsj.svg", icon: "jg_xfsj", text: "消火栓井" },
-  { key: "jg_ysk.svg", icon: "jg_ysk", text: "雨水口" },
-  { key: "jg_lmak.svg", icon: "jg_lmak", text: "路面凹坑" },
-  { key: "jg_lmtcbf.svg", icon: "jg_lmtcbf", text: "路面凸出..." },
-  { key: "jg_lmjs.svg", icon: "jg_lmjs", text: "路面积水" },
+  {
+    key: RoadStructure.ZebraCrossing,
+    icon: "jg_bmx",
+    text: ui18n.t("tl.icon.jg_bmx"),
+  },
+  { key: "jg_xfsj.svg", icon: "jg_xfsj", text: ui18n.t("tl.icon.jg_xfsj") },
+  { key: "jg_ysk.svg", icon: "jg_ysk", text: ui18n.t("tl.icon.jg_ysk") },
+  { key: "jg_lmak.svg", icon: "jg_lmak", text: ui18n.t("tl.icon.jg_lmak") },
+  {
+    key: "jg_lmtcbf.svg",
+    icon: "jg_lmtcbf",
+    text: ui18n.t("tl.icon.jg_lmtcbf"),
+  },
+  { key: "jg_lmjs.svg", icon: "jg_lmjs", text: ui18n.t("tl.icon.jg_lmjs") },
 ];
 
 export const templateMenusRaw = [
-  { key: RoadTemplate.SBend, icon: "mb_sxwl", text: "s型弯路" },
-  { key: RoadTemplate.TJunction, icon: "mb_dzlk", text: "丁字路口" },
-  { key: RoadTemplate.FiveForks, icon: "mb_wclk", text: "五岔路口" },
-  { key: RoadTemplate.ExitRamp, icon: "mb_ckzd", text: "出口匝道" },
-  { key: RoadTemplate.Crossroads, icon: "mb_szlk", text: "十字路口" },
+  {
+    key: RoadTemplate.SBend,
+    icon: "mb_sxwl",
+    text: ui18n.t("tl.icon.mb_sxwl"),
+  },
+  {
+    key: RoadTemplate.TJunction,
+    icon: "mb_dzlk",
+    text: ui18n.t("tl.icon.mb_dzlk"),
+  },
+  {
+    key: RoadTemplate.FiveForks,
+    icon: "mb_wclk",
+    text: ui18n.t("tl.icon.mb_wclk"),
+  },
+  {
+    key: RoadTemplate.ExitRamp,
+    icon: "mb_ckzd",
+    text: ui18n.t("tl.icon.mb_ckzd"),
+  },
+  {
+    key: RoadTemplate.Crossroads,
+    icon: "mb_szlk",
+    text: ui18n.t("tl.icon.mb_szlk"),
+  },
   {
     key: RoadTemplate.NationalHighwayShoulder,
     icon: "mb_gdlj",
-    text: "国道(路肩)",
+    text: ui18n.t("tl.icon.mb_gdlj"),
+  },
+  {
+    key: RoadTemplate.IndoorSection,
+    icon: "mb_snld",
+    text: ui18n.t("tl.icon.mb_snld"),
+  },
+  { key: RoadTemplate.Bend, icon: "mb_wd", text: ui18n.t("tl.icon.mb_wd") },
+  {
+    key: RoadTemplate.SharpCurve,
+    icon: "mb_jzwd",
+    text: ui18n.t("tl.icon.mb_jzwd"),
+  },
+  {
+    key: RoadTemplate.SixForkIntersection,
+    icon: "mb_lclk",
+    text: ui18n.t("tl.icon.mb_lclk"),
+  },
+  {
+    key: RoadTemplate.Corner,
+    icon: "mb_zjwd",
+    text: ui18n.t("tl.icon.mb_zjwd"),
+  },
+  {
+    key: RoadTemplate.ImportSmashedRoad,
+    icon: "mb_jkzd",
+    text: ui18n.t("tl.icon.mb_jkzd"),
   },
-  { key: RoadTemplate.IndoorSection, icon: "mb_snld", text: "室内路段" },
-  { key: RoadTemplate.Bend, icon: "mb_wd", text: "弯道" },
-  { key: RoadTemplate.SharpCurve, icon: "mb_jzwd", text: "急转弯道" },
-  { key: RoadTemplate.SixForkIntersection, icon: "mb_lclk", text: "六岔路口" },
-  // { key: RoadTemplate.WideNarrowRoad, icon: 'mb_kbzld', text: '宽变窄路段' },
-  { key: RoadTemplate.Corner, icon: "mb_zjwd", text: "直角弯道" },
-  { key: RoadTemplate.ImportSmashedRoad, icon: "mb_jkzd", text: "进口匝道" },
   {
     key: RoadTemplate.HighSpeedTollBooth,
     icon: "mb_gssfz",
-    text: "高速收费站",
+    text: ui18n.t("tl.icon.mb_gssfz"),
+  },
+  {
+    key: RoadTemplate.HighwaySection,
+    icon: "mb_gsld",
+    text: ui18n.t("tl.icon.mb_gsld"),
   },
-  // { key: RoadTemplate.HighSpeedHarbor, icon: 'mb_gsgw', text: '高速港湾' },
-  { key: RoadTemplate.HighwaySection, icon: "mb_gsld", text: "高速路段" },
 ];
 
 export const measureMenusRaw = [
   {
     key: UIType.BaseLine,
     icon: "line",
-    text: "基准线",
+    text: ui18n.t("tl.basel"),
     disabled: computed(() => graphicState.value.existsBaseLine),
   },
-  { key: UIType.BasePoint, text: "基准点", icon: "point", border: true },
-  // {
-  //   key: UIType.NormalLocationMode,
-  //   text: '垂线定位',
-  //   icon: 'measure_f',
-  //   onClick(data) {
-  //     if (graphicState.value.canVerticalMeasure) {
-  //       uiType.change(data.key);
-  //     } else {
-  //       Message.success({ msg: '请添加基准线后再执行此操作', time: 3000 });
-  //     }
-  //   },
-  // },
   {
-    desc: "一键测量",
+    key: UIType.BasePoint,
+    icon: "point",
+    text: ui18n.t("tl.basep"),
+    border: true,
+  },
+  {
+    desc: ui18n.t("tl.icon.ymeasure_r"),
     key: UIType.AngleLocationMode,
-    text: "直角定位法",
+    text: ui18n.t("tl.icon.measure_r"),
     icon: "measure_r",
-    // onClick(data) {
-    //   console.error(graphicState.value.canAllLocationMode);
-    //   if (graphicState.value.canAllLocationMode) {
-    //     uiType.change(data.key);
-    //   } else {
-    //     Message.success({
-    //       msg: "请添加基准线及基准点后再执行此操作",
-    //       time: 3000,
-    //     });
-    //   }
-    // },
   },
-  // {
-  //   key: UIType.AllLocationMode,
-  //   text: "综合定位法",
-  //   icon: "measure_c",
-  //   // onClick(data) {
-  //   //   if (graphicState.value.canAllLocationMode) {
-  //   //     uiType.change(data.key);
-  //   //   } else {
-  //   //     Message.success({
-  //   //       msg: "请添加基准线及基准点后再执行此操作",
-  //   //       time: 3000,
-  //   //     });
-  //   //   }
-  //   // },
-  //   border: true,
-  // },
   {
     key: UIType.FreeMeasureLine,
-    text: "自由测量",
     icon: "measure_free",
+    text: ui18n.t("tl.icon.measure_free"),
   },
 ];
 
 export const mainMenusRaw: MenusRaw = [
   {
     key: UIType.Line,
-    text: "画线",
+    text: ui18n.t("tl.icon.line_d"),
     icon: "line_d",
-    // children: [
-    //   {
-    //     key: UIType.Line,
-    //     text: "直线",
-    //     icon: "line_d",
-    //   },
-    //   {
-    //     key: UIType.CurveLine,
-    //     text: "曲线",
-    //     icon: "line_d",
-    //   }
-    // ]
   },
   {
     key: UITypeExtend.road,
-    text: "道路",
+    text: ui18n.t("tl.icon.road"),
     icon: "road",
     children: [
       { key: UIType.OneEdgeOneLanRoad, icon: "road_ss", text: "" },
       { key: UIType.OneEdgeTwoLanRoad, icon: "road_sd", text: "" },
-      // { key: UIType.OneEdgeThreeLanRoad, icon: "road_st", text: "" },
       { key: UIType.TwoEdgeOneLanRoad, icon: "road_ds", text: "" },
       { key: UIType.TwoEdgeTwoLanRoad, icon: "road_dd", text: "" },
-      // { key: UIType.TwoEdgeThreeLanRoad, icon: "road_dt", text: "" },
       { key: UIType.CurveRoad, icon: "road_wl", text: "" },
       {
         key: UITypeExtend.structure,
         icon: "r_template",
-        text: "道路结构",
+        text: ui18n.t("tl.icon.r_template"),
         extend: structureMenusRaw,
       },
-      // { key: 'ZebraCrossing', icon: 'r_template', text: '道路结构'},
-      // { key: 'ZebraCrossing', icon: 'r_template', text: '道路结构'},
       {
         key: UITypeExtend.template,
         icon: "r_structure",
-        text: "道路模板",
+        text: ui18n.t("tl.icon.r_structure"),
         extend: templateMenusRaw,
         disable: true,
       },
@@ -199,27 +200,26 @@ export const mainMenusRaw: MenusRaw = [
   },
   {
     key: UITypeExtend.image,
-    text: "图例",
+    text: ui18n.t("tl.icon.legend"),
     icon: "legend",
-    // children: [
-    //   { key: UIType.BusPlane, text: "客车平面图" }
-    // ]
   },
-  { key: UIType.FixPoint, text: "固定点", icon: "point_a" },
+  { key: UIType.FixPoint, text: ui18n.t("tl.fixPoint"), icon: "point_a" },
   {
     key: UITypeExtend.measure,
-    text: "测量",
+    text: ui18n.t("tl.icon.measure"),
     children: measureMenusRaw,
     icon: "measure",
   },
-  { key: UIType.Text, text: "文字", icon: "text" },
-  { key: UIType.Magnifier, text: "放大镜", icon: "magnify_g" },
-
-  // { key: UITypeExtend.photo, text: "照片库" },
+  { key: UIType.Text, text: ui18n.t("tl.icon.text"), icon: "text" },
+  {
+    key: UIType.Magnifier,
+    text: ui18n.t("tl.icon.magnify_g"),
+    icon: "magnify_g",
+  },
   {
     key: UITypeExtend.setup,
     icon: "setting",
-    text: "设置",
+    text: ui18n.t("tl.icon.setting"),
     onClick() {
       const { destroy } = mount(Setting, {
         props: {
@@ -233,17 +233,29 @@ export const mainMenusRaw: MenusRaw = [
 ];
 
 export const photoMenusRaw: MenusRaw = [
-  { key: UIType.Text, text: "文字", icon: "text" },
-  { key: UIType.Circle, text: "圈出", icon: "circle" },
-  { key: UIType.SingleArrow, text: "箭头", icon: "arrows" },
-  { key: UIType.Magnifier, text: "放大镜", icon: "magnify_g" },
+  { key: UIType.Text, text: ui18n.t("tl.icon.Text"), icon: "text" },
+  { key: UIType.Circle, text: ui18n.t("tl.icon.Circle"), icon: "circle" },
+  {
+    key: UIType.SingleArrow,
+    text: ui18n.t("tl.icon.SingleArrow"),
+    icon: "arrows",
+  },
+  {
+    key: UIType.Magnifier,
+    text: ui18n.t("tl.icon.Magnifier"),
+    icon: "magnify_g",
+  },
 ];
 
 export const headActionMenuRaw = [
-  { key: UIType.GoBack, text: "回退", icon: "backout" },
-  { key: UIType.GoAhead, text: "前进", icon: "redo" },
-  { key: UIType.Clear, text: "清除", icon: "reset" },
-  { key: UIType.BackImageChange, text: "底图开关", icon: "map" },
+  { key: UIType.GoBack, text: ui18n.t("tl.icon.GoBack"), icon: "backout" },
+  { key: UIType.GoAhead, text: ui18n.t("tl.icon.GoAhead"), icon: "redo" },
+  { key: UIType.Clear, text: ui18n.t("tl.icon.Clear"), icon: "reset" },
+  {
+    key: UIType.BackImageChange,
+    text: ui18n.t("tl.icon.BackImageChange"),
+    icon: "map",
+  },
 ];
 
 export const focusMenuRaw: { [key in string]: MenusRaw } = {};

+ 12 - 7
src/views/graphic/setting.vue

@@ -1,11 +1,16 @@
 <template>
-  <ui-confirm title="设置" ok-text="保存" :func="handler" v-if="!trackMode">
+  <ui-confirm
+    :title="$t('tl.icon.setting')"
+    :ok-text="$t('tl.save')"
+    :func="handler"
+    v-if="!trackMode"
+  >
     <template v-slot:content>
       <div class="setting-layout">
         <div>
           <p>
-            <span>默认单车道宽度</span>
-            <span>单位: mm</span>
+            <span>{{ $t("tl.defr") }}</span>
+            <span>{{ $t("tl.unit") }}: mm</span>
           </p>
           <ui-input
             :modelValue="data.singleRoadWidth * 1000"
@@ -26,8 +31,8 @@
         </div>
         <div>
           <p>
-            <span>默认隔离带宽度</span>
-            <span>单位: mm</span>
+            <span>{{ $t("tl.defw") }}</span>
+            <span>{{ $t("tl.unit") }}: mm</span>
           </p>
           <ui-input
             :modelValue="data.roadQuarantineWidth * 1000"
@@ -48,8 +53,8 @@
         </div>
         <div>
           <p>
-            <span>基本线宽 b</span>
-            <span>单位: mm</span>
+            <span>{{ $t("tl.basew") }}</span>
+            <span>{{ $t("tl.unit") }}: mm</span>
           </p>
           <div class="select-boxs">
             <span

+ 12 - 11
src/views/photos/index.vue

@@ -3,7 +3,7 @@
     <template v-slot:header>
       <Header
         :count="selects.length"
-        :title="`全部照片(${photos.length})`"
+        :title="$t('tl.pphotos', photos)"
         type="return"
         :on-back="() => router.back()"
       >
@@ -13,13 +13,13 @@
           width="96px"
           v-if="sortPhotos.length"
         >
-          {{ selectMode ? "取消" : "选择" }}
+          {{ selectMode ? $t("tl.cancel") : $t("tl.select") }}
         </ui-button>
       </Header>
     </template>
 
     <Photos
-      undata-msg="无照片,请打开场景拍照获取。"
+      :undata-msg="$t('tl.upphonto')"
       :getURL="(data) => data.urlRaw || data.url"
       v-model:active="active"
       v-model:selects="selects"
@@ -81,6 +81,7 @@ import UiInput from "@/components/base/components/input/index.vue";
 import { api, downloadImage, uploadImage } from "@/store/sync";
 import { asyncTimeout, formatDate, getId, imageToBlob } from "@/utils";
 import { genUseLoading } from "@/hook";
+import { ui18n } from "@/lang";
 
 const sortPhotos = computed(() => [...photos.value].reverse());
 const active = ref<PhotoRaw>();
@@ -89,14 +90,14 @@ const selects = ref<PhotoRaw[]>([]);
 const menus = [
   {
     key: "road",
-    text: "现场绘图",
+    text: ui18n.t("tl.r1"),
     icon: "draw_s",
     onClick: () => gotoDraw(Mode.Road),
   },
   {
     key: "accident",
     icon: "label",
-    text: "事故照片",
+    text: ui18n.t("tl.roads"),
     onClick: () => gotoDraw(Mode.Photo),
   },
 ];
@@ -122,16 +123,16 @@ const selectMenus = [
   {
     key: "del",
     icon: "del",
-    text: "删除",
+    text: ui18n.t("tl.del"),
     onClick: () => delSelects(),
   },
 ];
 
 const photoType = ref<string>();
 const photoOptions = [
-  { value: "photograph", label: "相机拍照" },
-  { value: "selectPhotoAlbum", label: "相册选择" },
-  { value: "scene", label: "场景截图" },
+  { value: "photograph", label: ui18n.t("tl.photograph") },
+  { value: "selectPhotoAlbum", label: ui18n.t("tl.selectPhotoAlbum") },
+  { value: "scene", label: ui18n.t("tl.scene") },
 ];
 
 watchEffect(() => {
@@ -185,12 +186,12 @@ const delPhotoRaw = (photo = active.value) => {
   }
 };
 const delPhoto = async (photo = active.value) => {
-  if (await useConfirm(`确定要删除此数据?`)) {
+  if (await useConfirm(ui18n.t("tl.cdel"))) {
     delPhotoRaw(photo);
   }
 };
 const delSelects = async () => {
-  if (await useConfirm(`确定要删除这${selects.value.length}项数据?`)) {
+  if (await useConfirm(ui18n.t("tl.cndel", selects.value))) {
     while (selects.value.length) {
       delPhotoRaw(selects.value[0]);
       selects.value.shift();

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

@@ -3,7 +3,7 @@
     <template v-slot:header>
       <Header
         :count="selects.length"
-        :title="`现场图管理(${sortPhotos.length})`"
+        :title="$t('tl.proads', sortPhotos)"
         type="return"
         :on-back="() => onBack()"
       >
@@ -14,7 +14,7 @@
           style="margin-right: 16px"
           v-if="sortPhotos.length"
         >
-          {{ selectMode ? "取消" : "选择" }}
+          {{ selectMode ? $t("tl.cancel") : $t("tl.select") }}
         </ui-button>
         <ui-button
           v-if="!selectMode"
@@ -22,10 +22,10 @@
           @click="router.push({ name: writeRouteName.photos })"
           width="96px"
         >
-          新增
+          {{ $t("tl.add") }}
         </ui-button>
         <template v-slot:center="{ count }">
-          <template v-if="count"> 已选择 {{ count }} 张 </template>
+          <template v-if="count"> {{ $t("tl.selected", { count }) }} </template>
           <!-- <div v-else class="filter-type">
             <span
               :class="{ active: currentType === TypeEnum.Draw }"
@@ -44,7 +44,7 @@
 
     <!-- :getURL="(data) => data?.table?.url || data.url" -->
     <Photos
-      undata-msg="无现场图。请点击右上角按钮绘制现场图。"
+      :undata-msg="$t('tl.uproads')"
       v-model:active="active"
       v-model:selects="selects"
       :select-mode="selectMode"
@@ -101,6 +101,7 @@ import { useConfirm } from "@/hook";
 import { api } from "@/store/sync";
 import { photos } from "@/store/photos";
 import { getId } from "@/utils";
+import { ui18n } from "@/lang";
 
 const enum TypeEnum {
   Draw = "draw",
@@ -143,13 +144,13 @@ const menus = computed(() => [
     key: "tabulation",
     icon: "tabulation",
     // hide: currentType.value === TypeEnum.Table,
-    text: "制表",
+    text: ui18n.t("tl.tabulation"),
     onClick: () => gotoDraw(active.value, true),
   },
   {
     key: "road",
     icon: "edit",
-    text: "修改",
+    text: ui18n.t("tl.edit"),
     onClick: () => gotoDraw(),
   },
 ]);
@@ -158,7 +159,7 @@ const selectMenus = [
   {
     key: "del",
     icon: "del",
-    text: "删除",
+    text: ui18n.t("tl.del"),
     onClick: () => delSelects(),
   },
 ];
@@ -208,13 +209,13 @@ const delPhotoRaw = (roadPhoto = active.value) => {
 };
 
 const delPhoto = async (photo = active.value) => {
-  if (await useConfirm(`确定要删除此数据?`)) {
+  if (await useConfirm(ui18n.t("tl.cdel"))) {
     console.log(photo);
     delPhotoRaw(photo);
   }
 };
 const delSelects = async () => {
-  if (await useConfirm(`确定要删除这${selects.value.length}项数据?`)) {
+  if (await useConfirm(ui18n.t("tl.cndel", selects.value))) {
     while (selects.value.length) {
       delPhotoRaw(selects.value[0]);
       selects.value.shift();

+ 20 - 13
src/views/roads/tabulation.vue

@@ -1,8 +1,14 @@
 <template>
   <MainPanel>
     <template v-slot:header>
-      <Header title="现场绘图 | 制表" :on-back="onBack" type="return">
-        <ui-button type="primary" @click="saveHandler" width="96px"> 完成 </ui-button>
+      <Header
+        :title="`${$t('tl.r1')} | ${$t('tl.tabulation')}}`"
+        :on-back="onBack"
+        type="return"
+      >
+        <ui-button type="primary" @click="saveHandler" width="96px">
+          {{ $t("tl.su") }}
+        </ui-button>
       </Header>
     </template>
 
@@ -22,7 +28,7 @@
             </td>
           </tr>
           <tr>
-            <td class="label" width="218" height="40">到达事故现场时间</td>
+            <td class="label" width="218" height="40">{{ $t("tl.table.t1") }}</td>
             <td class="value">
               <span v-if="downMode">{{ history.value.arrivalTime }}</span>
               <ui-input
@@ -33,7 +39,7 @@
                 @blur="history.push"
               />
             </td>
-            <td class="label" width="100">天气</td>
+            <td class="label" width="100">{{ $t("tl.table.t2") }}</td>
             <td class="value" width="116">
               <span v-if="downMode">{{ history.value.weather }}</span>
               <ui-input
@@ -44,7 +50,7 @@
                 @blur="history.push"
               />
             </td>
-            <td class="label" width="100">路面性质</td>
+            <td class="label" width="100">{{ $t("tl.table.t3") }}</td>
             <td class="value" width="150">
               <span v-if="downMode">{{ history.value.conditions }}</span>
               <ui-input
@@ -57,7 +63,7 @@
             </td>
           </tr>
           <tr>
-            <td class="label" height="40">事故发生地点</td>
+            <td class="label" height="40">{{ $t("tl.table.t4") }}</td>
             <td class="value" colspan="5">
               <span v-if="downMode">{{ history.value.location }}</span>
               <ui-input
@@ -106,15 +112,15 @@
           </tr>
           <tr>
             <td class="value date" colspan="6" height="44">
-              绘图时间:{{ formatDate(new Date(), "yyyy年MM月dd日hh时mm分") }}
+              {{ $t("tl.table.t5") }}:{{ formatDate(new Date(), $t("tl.time")) }}
             </td>
           </tr>
         </table>
         <div class="signatures">
-          <p class="signature">勘察员:</p>
-          <p class="signature">绘图员:</p>
-          <p class="signature">当事人签字:</p>
-          <p class="signature">见证人签字:</p>
+          <p class="signature">{{ $t("tl.table.t6") }}:</p>
+          <p class="signature">{{ $t("tl.table.t7") }}:</p>
+          <p class="signature">{{ $t("tl.table.t8") }}:</p>
+          <p class="signature">{{ $t("tl.table.t9") }}:</p>
         </div>
       </div>
     </div>
@@ -139,6 +145,7 @@ import { Mode } from "@/views/graphic/menus";
 import Message from "@/components/base/components/message/message.vue";
 import matruces from "@/utils/matruces";
 import { genUseLoading } from "@/hook";
+import { ui18n } from "@/lang";
 
 const roadPhoto = computed<RoadPhoto>(() => {
   let route, params, data;
@@ -218,7 +225,7 @@ const getLayoutImage = async () => {
   downMode.value = true;
   await nextTick();
   const canvas = await html2canvas(layoutRef.value);
-  Message.success({ msg: "已保存至相册", time: 2000 });
+  Message.success({ msg: ui18n.t("tl.savep"), time: 2000 });
   downMode.value = false;
   const blob = await new Promise<Blob>((resolve) =>
     canvas.toBlob(resolve, "image/jpeg", 0.95)
@@ -229,7 +236,7 @@ const getLayoutImage = async () => {
 
 const saveHandler = genUseLoading(async () => {
   let index = 1;
-  let prex = "未命名";
+  let prex = ui18n.t("tl.table.t10");
   while (true) {
     if (roadPhotos.value.some((road) => road.title === `${prex}${index}`)) {
       index++;

+ 2 - 1
src/views/scene/covers/basePoints.vue

@@ -30,12 +30,13 @@ import BasePoint from "./basePoint.vue";
 import { customMap, useSDK } from "@/hook";
 import ActionMenus from "@/components/group-button/index.vue";
 import { DrawStatus, drawstatus, trackBaseIng } from "../fixManage";
+import { ui18n } from "@/lang";
 
 const activeActionMenus = [
   {
     key: "delete",
     icon: "del",
-    text: "删除",
+    text: ui18n.t('tl.del'),
     color: "#FF4D4F",
     iconColor: "#fff",
     onClick() {

+ 4 - 3
src/views/scene/covers/fixPoints.vue

@@ -65,6 +65,7 @@ import {
   drawingFix3d,
   selectFix3d,
 } from "../fixManage";
+import { ui18n } from "@/lang";
 
 const edit = ref<FixPoint>();
 watchEffect(() => {
@@ -114,7 +115,7 @@ const activeActionMenus = computed(() =>
         {
           key: "delete",
           icon: "del",
-          text: "删除",
+          text: ui18n.t("tl.del"),
           color: "#FF4D4F",
           iconColor: "#fff",
           onClick() {
@@ -126,7 +127,7 @@ const activeActionMenus = computed(() =>
         {
           key: "edit",
           icon: "edit",
-          text: "编辑",
+          text: ui18n.t("tl.edit"),
           color: "#161A1A",
           iconColor: "#2F8FFF",
           onClick() {
@@ -137,7 +138,7 @@ const activeActionMenus = computed(() =>
         {
           key: "delete",
           icon: "del",
-          text: "删除",
+          text: ui18n.t("tl.del"),
           color: "#FF4D4F",
           iconColor: "#fff",
           onClick() {

+ 2 - 1
src/views/scene/covers/measures.vue

@@ -27,6 +27,7 @@ import { customMap } from "@/hook";
 import ActionMenus from "@/components/group-button/index.vue";
 import * as process from "process";
 import { drawstatus, DrawStatus } from "../fixManage";
+import { ui18n } from "@/lang";
 
 const active = ref<MeasureAtom>();
 const getStore = (item: MeasureAtom) =>
@@ -39,7 +40,7 @@ const activeActionMenus = [
   {
     key: "delete",
     icon: "del",
-    text: "删除",
+    text: ui18n.t("tl.del"),
     color: "#FF4D4F",
     iconColor: "#fff",
     onClick() {

+ 10 - 9
src/views/scene/fixManage.ts

@@ -6,6 +6,7 @@ import { FixPoint, FixType, fixPoints } from "@/store/fixPoint";
 import { Message } from "@kankan/components/expose-common";
 import { ref, nextTick, shallowRef, watch, watchEffect } from "vue";
 import { goto } from "./menus/data";
+import { ui18n } from "@/lang";
 
 const fix3ds: { [key in string]: FixPoint3D } = {};
 
@@ -16,10 +17,10 @@ export const baseCheck = () => {
   }
   if (!baseLines.value.length) {
     useConfirm({
-      title: "提示",
-      content: "请先绘制基准线",
-      okText: "去绘制",
-      noText: "取消",
+      title: ui18n.t("tl.tip"),
+      content: ui18n.t("tl.dscene.dblc"),
+      okText: ui18n.t("tl.dscene.gdblc"),
+      noText: ui18n.t("tl.cancel"),
     }).then((ok) => {
       if (ok) {
         goto(["baseLineOrPoint", "baseLine"]);
@@ -29,10 +30,10 @@ export const baseCheck = () => {
   }
   if (!basePoints.value.length) {
     useConfirm({
-      title: "提示",
-      content: "请先创建基准点",
-      okText: "创建基准点",
-      noText: "取消",
+      title: ui18n.t("tl.tip"),
+      content: ui18n.t("tl.dscene.dbpc"),
+      okText: ui18n.t("tl.dscene.gdbpc"),
+      noText: ui18n.t("tl.cancel"),
     }).then((ok) => {
       if (ok) {
         goto(["baseLineOrPoint", "basePoint"]);
@@ -56,7 +57,7 @@ export const baseCheck = () => {
     promise: new Promise<BasePoint>((resolve) => {
       stopWatch = watchEffect(() => {
         if (!customMap.activeBasePoint) {
-          hideTip = Message.success({ msg: "请选择一个基准点" });
+          hideTip = Message.success({ msg: ui18n.t("tl.dscene.sbd") });
           return;
         } else {
           resolve(customMap.activeBasePoint);

+ 18 - 15
src/views/scene/index.vue

@@ -34,7 +34,7 @@
         </div>
         <div class="info-top-right" :class="{ full: viewStatus }">
           <div class="input-item">
-            <p>事故时间:</p>
+            <p>{{ $t("tl.t1.i1") }}:</p>
             <input
               id="accidentTime"
               type="text"
@@ -43,7 +43,7 @@
             />
           </div>
           <div class="input-item">
-            <p>天气:</p>
+            <p>{{ $t("tl.t1.i2") }}:</p>
             <input
               id="weather"
               type="text"
@@ -52,7 +52,7 @@
             />
           </div>
           <div class="input-item">
-            <p>地点:</p>
+            <p>{{ $t("tl.t1.i3") }}:</p>
             <input
               id="address"
               type="text"
@@ -61,7 +61,7 @@
             />
           </div>
           <div class="text-item">
-            <p>事故描述:</p>
+            <p>{{ $t("tl.t1.i4") }}:</p>
             <textarea
               id="accidentDesc"
               class="info-textarea"
@@ -79,10 +79,10 @@
                 })
               "
             >
-              现场绘图({{ sceneSortPhotos.length }})
+              {{ $t("tl.r1") }}({{ sceneSortPhotos.length }})
             </div>
             <div class="right-btn" @click="router.push('/accidents?back=1')">
-              事故照片({{ accodentSortPhotos.length }})
+              {{ $t("tl.r2") }}({{ accodentSortPhotos.length }})
             </div>
           </div>
         </div>
@@ -109,6 +109,7 @@ import ButtonPane from "@/components/button-pane/index.vue";
 import { types, accidentPhotos } from "@/store/accidentPhotos";
 import { debounce, getQueryString } from "@/utils";
 import { tables } from "@/store/tables";
+import { ui18n } from "@/lang";
 
 const layoutRef = ref(null);
 const accodentSortPhotos = computed(() => {
@@ -118,7 +119,9 @@ const accodentSortPhotos = computed(() => {
 const sceneSortPhotos = computed(() => roadPhotos.value);
 
 const sceneTitle = ref(
-  getQueryString("title") ? decodeURIComponent(getQueryString("title")) : "案件"
+  getQueryString("title")
+    ? decodeURIComponent(getQueryString("title"))
+    : ui18n.t("tl.t1.i5")
 );
 
 const sceneInfo = ref({
@@ -139,49 +142,49 @@ const list = ref([
   {
     id: 1,
     icon: "prospect",
-    name: "勘查笔录",
+    name: ui18n.t("tl.t1.i6"),
     type: "explorate",
   },
   {
     id: 2,
     icon: "inquiry",
-    name: "询问笔录",
+    name: ui18n.t("tl.t1.i7"),
     type: "ask?type=1",
   },
   {
     id: 3,
     icon: "question",
-    name: "讯问笔录",
+    name: ui18n.t("tl.t1.i8"),
     type: "ask?type=2",
   },
   {
     id: 4,
     icon: "accident",
-    name: "事故认定",
+    name: ui18n.t("tl.t1.i9"),
     type: "identification",
   },
   {
     id: 5,
     icon: "blood",
-    name: "血样登记表",
+    name: ui18n.t("tl.t1.i10"),
     type: "extract",
   },
   {
     id: 6,
     icon: "items",
-    name: "遗留物品清单",
+    name: ui18n.t("tl.t1.i11"),
     type: "legacy",
   },
   {
     id: 7,
     icon: "authorization",
-    name: "授权委托书",
+    name: ui18n.t("tl.t1.i12"),
     type: "author",
   },
   {
     id: 8,
     icon: "law",
-    name: "法律法规",
+    name: ui18n.t("tl.t1.i13"),
     type: "law",
   },
 ]);

+ 2 - 1
src/views/scene/linkage/measure.ts

@@ -2,6 +2,7 @@ import { useSDK } from "@/hook";
 import { MeasureAtom, MeasureType, TemploraryID, unTemp } from "@/store";
 import { Measure, MeasureUnit, StartMeasure } from "@/sdk";
 import { Message } from "@/components/base";
+import { ui18n } from "@/lang";
 
 type CanvasMeasureAtom = { raw: MeasureAtom; canvas: Measure };
 type TempCanvasMeasureAtom = Omit<CanvasMeasureAtom, "canvas"> & {
@@ -56,7 +57,7 @@ export const startMeasure = (
       endMeasure();
       resolve(null);
     };
-    const invalidPointHandler = (msg = "点云为空,换个位置试试") => {
+    const invalidPointHandler = (msg = ui18n.t("tl.pnull")) => {
       Message.warning(msg);
     };
     const endMeasure = () => {

+ 12 - 11
src/views/scene/menus/actions.ts

@@ -35,6 +35,7 @@ import {
   trackBaseIng,
 } from "../fixManage";
 import { disableCover } from "../sceneStatus";
+import { ui18n } from "@/lang";
 
 const trackPosMenuAction = (
   onComplete: () => void,
@@ -80,7 +81,7 @@ const trackMeasureMenuAction = (
     disableCover.value = true;
     hide && hide();
     if (!startTipEd) {
-      hide = Message.success({ msg: `请绘制${name}` });
+      hide = Message.success({ msg: ui18n.t("tl.pdraw", { name }) });
       // 请选择一个位置单击,确定${name}的起点
       startTipEd = true;
     }
@@ -121,7 +122,7 @@ const trackMeasureMenuAction = (
 
 const menuActions = {
   [menuEnum.BASE_POINT]: (_, onComplete) => {
-    let hide = Message.success({ msg: "请单击选择基准点位置" });
+    let hide = Message.success({ msg: ui18n.t("tl.psbasep") });
     disableCover.value = true;
     const onDestroy = trackPosMenuAction(
       () => {
@@ -147,7 +148,7 @@ const menuActions = {
   },
   [menuEnum.FIX_POINT]: (_, onComplete) => {
     const add = () => {
-      hide = Message.success({ msg: "请单击选择固定点位置" });
+      hide = Message.success({ msg: ui18n.t("tl.psfixp") });
       disableCover.value = true;
       onDestroy = trackPosMenuAction(
         () => {
@@ -160,7 +161,7 @@ const menuActions = {
           const len = fixPoints.value.push({
             id: getId(),
             pos,
-            text: "固定点",
+            text: ui18n.t("tl.fixPoint"),
             type: FixType.POINT,
             measure: measureMode.value,
             lines: undefined,
@@ -209,13 +210,13 @@ const menuActions = {
   [menuEnum.FIX_GRANH]: (_, onComplete) => {
     let hide;
     const add = () => {
-      hide = Message.success({ msg: "请单击绘制固定点形状" });
+      hide = Message.success({ msg: ui18n.t("tl.pfixg") });
       disableCover.value = true;
       showMenus.value = false;
       const data: FixPoint = reactive({
         id: getId(),
         pos: { x: 0, y: 0, z: 0 },
-        text: "形状",
+        text: ui18n.t("tl.fixg"),
         type: FixType.GRAPH,
         measure: measureMode.value,
         lines: undefined,
@@ -282,7 +283,7 @@ const menuActions = {
         });
       },
       onComplete,
-      "测量线"
+      ui18n.t("tl.mline")
     );
   },
   [menuEnum.MEASURE_COLUMN]: (menu, onComplete) => {
@@ -296,7 +297,7 @@ const menuActions = {
         });
       },
       onComplete,
-      "测量线"
+      ui18n.t("tl.mline")
     );
   },
   [menuEnum.MEASURE_FREE]: (menu, onComplete) => {
@@ -310,7 +311,7 @@ const menuActions = {
         });
       },
       onComplete,
-      "测量线"
+      ui18n.t("tl.mline")
     );
   },
   [menuEnum.BASE_LINE]: (menu, onComplete) => {
@@ -319,12 +320,12 @@ const menuActions = {
       menu,
       (data) => baseLines.value.push(data),
       onComplete,
-      "基准线",
+      ui18n.t("tl.basel"),
       "#ED1C24"
     );
   },
   [menuEnum.CLEAR]: async (menu, onComplete) => {
-    if (await useConfirm("确认清空?该操作无法撤销")) {
+    if (await useConfirm(ui18n.t("tl.pdnull"))) {
       list.value = [];
       baseLines.value = [];
       basePoints.value = [];

+ 18 - 17
src/views/scene/menus/menus.ts

@@ -17,6 +17,7 @@ import {
   drawstatus,
   measureMode,
 } from "../fixManage";
+import { ui18n } from "@/lang";
 
 export type MenuRaw = {
   key: string;
@@ -61,7 +62,7 @@ export const menus: MenuRaw[] = [
   // },
   {
     icon: "clear",
-    text: "清空",
+    text: ui18n.t("tl.menus[0]"),
     key: menuEnum.CLEAR,
     disabled: () =>
       baseLines.value.length +
@@ -73,44 +74,44 @@ export const menus: MenuRaw[] = [
   },
   {
     icon: "measure",
-    text: "测量",
+    text: ui18n.t("tl.menus[1]"),
     key: "measure",
     children: [
       {
         icon: "line_h",
-        text: "水平",
+        text: ui18n.t("tl.menus[2]"),
         key: menuEnum.MEASURE_ROW,
       },
       {
         icon: "line_v",
         disabled: () => vView.value,
-        text: "垂直",
+        text: ui18n.t("tl.menus[3]"),
         key: menuEnum.MEASURE_COLUMN,
       },
       {
         icon: "line_f",
-        text: "自由",
+        text: ui18n.t("tl.menus[4]"),
         key: menuEnum.MEASURE_FREE,
       },
     ],
   },
   {
     icon: "point_f",
-    text: "固定点",
+    text: ui18n.t("tl.menus[5]"),
     key: "fixPointMenu",
     children: [
       {
         icon: "point_a",
-        text: "固定点",
+        text: ui18n.t("tl.menus[5]"),
         key: menuEnum.FIX_POINT,
       },
       {
         icon: "draw_s",
-        text: "绘制线",
+        text: ui18n.t("tl.menus[6]"),
         key: menuEnum.FIX_GRANH,
       },
       {
-        text: "垂足",
+        text: ui18n.t("tl.menus[7]"),
         disabled: () => {
           console.error(drawstatus.value !== DrawStatus.un);
           return drawstatus.value === DrawStatus.ing;
@@ -126,7 +127,7 @@ export const menus: MenuRaw[] = [
   },
   {
     icon: "standard",
-    text: "基准",
+    text: ui18n.t("tl.menus[8]"),
     key: "baseLineOrPoint",
     onClick() {
       return;
@@ -151,40 +152,40 @@ export const menus: MenuRaw[] = [
       {
         defaultSelect: () => !baseLines.value.length,
         icon: "line",
-        text: "基准线",
+        text: ui18n.t("tl.basel"),
         key: menuEnum.BASE_LINE,
         disabled: () => !!baseLines.value.length,
       },
       {
         icon: "point",
-        text: "基准点",
+        text: ui18n.t("tl.basep"),
         key: menuEnum.BASE_POINT,
       },
     ],
   },
   {
     icon: "range",
-    text: "范围",
+    text: ui18n.t("tl.menus[9]"),
     key: "range",
     children: [
       {
         icon: "height_g",
-        text: "离地高度",
+        text: ui18n.t("tl.menus[10]"),
         key: "top",
       },
       {
         icon: "scale_h",
-        text: "水平缩放",
+        text: ui18n.t("tl.menus[11]"),
         key: "scale",
       },
       {
         icon: "rotate_h",
-        text: "水平旋转",
+        text: ui18n.t("tl.menus[12]"),
         key: "rotate",
       },
       {
         icon: "recover",
-        text: "恢复",
+        text: ui18n.t("tl.menus[13]"),
         key: "reset",
         single: true,
         onClick() {

+ 76 - 36
src/views/tables/ask.vue

@@ -5,136 +5,167 @@
   <div class="ask-content" :class="{ downMode }" v-if="data">
     <!-- <Write v-if="isWrite" :text="text" :textIndex="textIndex" @onTextConfirm="onTextConfirm"> </Write> -->
     <div v-show="!isWrite" class="num-box">
-      <span></span>
+      <span>{{ $t("tl.t6[0]") }}</span>
       <div class="input-box">1</div>
-      <span style="margin-right: 30px">页</span> <span>共</span>
+      <span style="margin-right: 30px">{{ $t("tl.t6[1]") }}</span>
+      <span>{{ $t("tl.t6[3]") }}</span>
       <div class="input-box">{{ page }}</div>
-      <span></span>
+      <span>{{ $t("tl.t6[1]") }}</span>
     </div>
     <div v-show="!isWrite" class="num-box" style="padding-right: 114px">
-      <span></span>
+      <span>{{ $t("tl.t6[0]") }}</span>
       <div class="input-box">
         <input style="text-align: center; width: 100%" type="text" v-model="data.times" />
         <div class="content-box">{{ data.times }}</div>
       </div>
-      <span></span>
+      <span>{{ $t("tl.t6[2]") }}</span>
     </div>
 
-    <h2 v-show="!isWrite" class="ask-title" v-if="type == '1'">询问/<span class="through">讯问</span>笔录</h2>
-    <h2 v-show="!isWrite" class="ask-title" v-else><span class="through">询问</span>/讯问笔录</h2>
+    <h2 v-show="!isWrite" class="ask-title" v-if="type == '1'">
+      {{ $t("tl.t6[4]") }}/<span class="through">{{ $t("tl.t6[5]") }}</span
+      >{{ $t("tl.t6[6]") }}
+    </h2>
+    <h2 v-show="!isWrite" class="ask-title" v-else>
+      <span class="through">{{ $t("tl.t6[4]") }}</span
+      >/{{ $t("tl.t6[5]") }}{{ $t("tl.t6[6]") }}
+    </h2>
     <div class="container" v-show="!isWrite">
       <div class="line">
-        <span>时间</span>
+        <span>{{ $t("tl.t6[7]") }}</span>
         <div class="write-line">
           <input type="text" v-model="data.startTime" />
           <div class="content-box">{{ data.startTime }}</div>
         </div>
-        <span></span>
+        <span>{{ $t("tl.t6[8]") }}</span>
         <div class="write-line">
           <input type="text" v-model="data.endTime" />
           <div class="content-box">{{ data.endTime }}</div>
         </div>
       </div>
       <div class="line">
-        <span>地点</span>
+        <span>{{ $t("tl.t6[9]") }}</span>
         <div class="write-line left">
           <input type="text" v-model="data.address" />
           <div class="content-box">{{ data.address }}</div>
         </div>
       </div>
       <div class="line">
-        <span v-if="type == '1'">询问/<span class="through">讯问</span>人</span>
-        <span v-else><span class="through">询问</span>/讯问人</span>
+        <span v-if="type == '1'"
+          >{{ $t("tl.t6[4]") }}/<span class="through">{{ $t("tl.t6[5]") }}</span
+          >{{ $t("tl.t6[10]") }}</span
+        >
+        <span v-else
+          ><span class="through">{{ $t("tl.t6[4]") }}</span
+          >/{{ $t("tl.t6[5]") }}{{ $t("tl.t6[10]") }}</span
+        >
         <div class="write-line">
           <input type="text" v-model="data.asker" />
           <div class="content-box">{{ data.asker }}</div>
         </div>
-        <span>工作单位</span>
+        <span>{{ $t("tl.t6[11]") }}</span>
         <div class="write-line">
           <input type="text" v-model="data.askCompany" />
           <div class="content-box">{{ data.askCompany }}</div>
         </div>
       </div>
       <div class="line">
-        <span>记录人</span>
+        <span>{{ $t("tl.t6[12]") }}</span>
         <div class="write-line">
           <input type="text" v-model="data.reporter" />
           <div class="content-box">{{ data.reporter }}</div>
         </div>
-        <span>工作单位</span>
+        <span>{{ $t("tl.t6[11]") }}</span>
         <div class="write-line">
           <input type="text" v-model="data.reporterCompany" />
           <div class="content-box">{{ data.reporterCompany }}</div>
         </div>
       </div>
       <div class="line">
-        <span v-if="type == '1'">被询问/<span class="through">讯问</span>人</span>
-        <span v-else>被<span class="through">询问</span>/讯问人</span>
+        <span v-if="type == '1'"
+          >{{ $t("tl.t6[13]") }}{{ $t("tl.t6[4]") }}/<span class="through">{{
+            $t("tl.t6[5]")
+          }}</span
+          >{{ $t("tl.t6[10]") }}</span
+        >
+        <span v-else
+          >{{ $t("tl.t6[13]") }}<span class="through">{{ $t("tl.t6[4]") }}</span
+          >/{{ $t("tl.t6[5]") }}{{ $t("tl.t6[10]") }}</span
+        >
         <div style="flex: 0.5" class="write-line">
           <input type="text" v-model="data.askerBy" />
           <div class="content-box">{{ data.askerBy }}</div>
         </div>
-        <span>性别</span>
+        <span>{{ $t("tl.t6[14]") }}</span>
         <div style="flex: 0.3" class="write-line">
           <input type="text" v-model="data.sex" />
           <div class="content-box">{{ data.sex }}</div>
         </div>
-        <span>年龄</span>
+        <span>{{ $t("tl.t6[15]") }}</span>
         <div style="flex: 0.3" class="write-line">
           <input type="text" v-model="data.age" />
           <div class="content-box">{{ data.age }}</div>
         </div>
-        <span>出生日期</span>
+        <span>{{ $t("tl.t6[16]") }}</span>
         <div class="write-line">
           <input type="text" v-model="data.birth" />
           <div class="content-box">{{ data.birth }}</div>
         </div>
       </div>
       <div class="line">
-        <span>身份证件种类及号码</span>
+        <span>{{ $t("tl.t6[17]") }}</span>
         <div class="write-line">
           <input type="text" v-model="data.id" />
           <div class="content-box">{{ data.id }}</div>
         </div>
-        <div v-for="(i, index) in isnotList.options" @click="checkOptions(isnotList, index)">
+        <div
+          v-for="(i, index) in isnotList.options"
+          @click="checkOptions(isnotList, index)"
+        >
           <ui-icon :type="data.NPC.check == i.id ? 'rb_y' : 'rb_n'"></ui-icon>
           <span>{{ i.title }}</span>
         </div>
-        <span>人大代表</span>
+        <span>{{ $t("tl.t6[18]") }}</span>
       </div>
       <div class="line">
-        <span>现住址</span>
+        <span>{{ $t("tl.t6[19]") }}</span>
         <div class="write-line">
           <input type="text" v-model="data.adressNow" />
           <div class="content-box">{{ data.adressNow }}</div>
         </div>
-        <span>联系方式</span>
+        <span>{{ $t("tl.t6[20]") }}</span>
         <div style="flex: 0.3" class="write-line">
           <input type="text" v-model="data.phoneNumber" />
           <div class="content-box">{{ data.phoneNumber }}</div>
         </div>
       </div>
       <div class="line">
-        <span>户籍所在地</span>
+        <span>{{ $t("tl.t6[21]") }}</span>
         <div class="write-line left">
           <input type="text" v-model="data.residence" />
           <div class="content-box">{{ data.residence }}</div>
         </div>
       </div>
       <div class="line worap">
-        <span v-if="type == '1'" style="line-height: 40px"> (口头传唤/被扭送/自动投案的被询问/<span class="through">讯问</span>人于</span>
-        <span v-else style="line-height: 40px"> (口头传唤/被扭送/自动投案的被<span class="through">询问</span>/讯问人于</span>
+        <span v-if="type == '1'" style="line-height: 40px">
+          ({{ $t("tl.t6[22]") }}{{ $t("tl.t6[4]")
+          }}<span class="through">{{ $t("tl.t6[5]") }}</span
+          >{{ $t("tl.t6[10]") }}{{ $t("tl.t6[23]") }}</span
+        >
+        <span v-else style="line-height: 40px">
+          ({{ $t("tl.t6[22]") }}<span class="through">{{ t("tl.t6[4]") }}</span
+          >/ {{ $t("tl.t6[5]") }} {{ $t("tl.t6[10]") }}{{ $t("tl.t6[23]") }}</span
+        >
         <div class="write-line" style="width: 40%">
           <input type="text" v-model="data.reachTime" />
           <div class="content-box">{{ data.reachTime }}</div>
         </div>
-        <span style="line-height: 40px"> 到达,</span>
+        <span style="line-height: 40px"> {{ $t("tl.t6[23]") }}</span>
         <div class="write-line" style="">
           <input type="text" v-model="data.leaveTime" />
           <div class="content-box">{{ data.leaveTime }}</div>
         </div>
-        <span style="line-height: 40px"> 离开,</span>
-        <span style="line-height: 40px"> 本人签名:</span>
+        <span style="line-height: 40px"> {{ $t("tl.t6[24]") }}</span>
+        <span style="line-height: 40px"> {{ $t("tl.t6[25]") }}</span>
         <div class="write-line" style="">
           <input type="text" v-model="data.sign" />
           <div class="content-box">{{ data.sign }}</div>
@@ -152,8 +183,8 @@
       </div>
     </div>
     <div v-if="page <= 1" class="bottom-name" v-show="!isWrite">
-      <span v-if="type == '1'">被询问人:</span>
-      <span v-else>被讯问人:</span>
+      <span v-if="type == '1'">{{ $t("tl.t6[27]") }}</span>
+      <span v-else>{{ $t("tl.t6[28]") }}</span>
       <div style="flex: 1">
         <input type="text" v-model="data.askerBys" />
         <div class="content-box left">{{ data.askerBys }}</div>
@@ -163,12 +194,21 @@
 </template>
 
 <script setup>
-import { reactive, ref, toRefs, onBeforeMount, onMounted, defineProps, defineEmits } from "vue";
+import {
+  reactive,
+  ref,
+  toRefs,
+  onBeforeMount,
+  onMounted,
+  defineProps,
+  defineEmits,
+} from "vue";
 import { router } from "@/router";
 import Write from "./write/index.vue";
 import { bus } from "@/hook/useGraphic";
 import { tables } from "@/store/tables";
 import { tablesInfo, setData } from "./data";
+import { ui18n } from "@/lang";
 
 const data = ref(null);
 const props = defineProps({
@@ -193,11 +233,11 @@ const isnotList = ref({
   options: [
     {
       id: 1,
-      title: "是",
+      title: ui18n.t("tl.t7[0]"),
     },
     {
       id: 2,
-      title: "否",
+      title: ui18n.t("tl.t7[1]"),
     },
   ],
 });

+ 26 - 21
src/views/tables/author/author-one.vue

@@ -1,38 +1,38 @@
 <!--  -->
 <template>
   <div class="author" :class="{ downMode }" v-if="data">
-    <h2 class="title">授权委托书</h2>
+    <h2 class="title">{{ $t("tl.t16[0]") }}</h2>
     <div class="content">
       <template v-for="(i, index) in data.authorList">
         <div class="item">
-          <span>委托人:</span>
+          <span>{{ $t("tl.t16[1]") }}</span>
           <div class="input-box" style="min-width: 100px">
             <input style="width: 100px" v-model="i.name" />
             <div class="content-box">{{ i.name }}</div>
           </div>
-          <span>性别:</span>
+          <span>{{ $t("tl.t16[2]") }}</span>
           <div class="input-box" style="min-width: 60px">
             <input style="width: 60px" v-model="i.sex" />
             <div class="content-box">{{ i.sex }}</div>
           </div>
-          <span>年龄:</span>
+          <span>{{ $t("tl.t16[3]") }}</span>
           <div class="input-box" style="min-width: 60px">
             <input style="width: 60px" v-model="i.age" />
             <div class="content-box">{{ i.age }}</div>
           </div>
-          <span>身份证号:</span>
+          <span>{{ $t("tl.t16[4]") }}</span>
           <div class="input-box" style="flex: 1">
             <input style="width: 100%" v-model="i.id" />
             <div class="content-box">{{ i.id }}</div>
           </div>
         </div>
         <div class="item">
-          <span>住址:</span>
+          <span>{{ $t("tl.t16[5]") }}</span>
           <div style="flex: 1" class="input-box">
             <input style="width: 100%" v-model="i.address" />
             <div class="content-box">{{ i.address }}</div>
           </div>
-          <span>联系方式:</span>
+          <span>{{ $t("tl.t16[6]") }}</span>
           <div class="input-box">
             <input style="width: 100%" v-model="i.phoneNum" />
             <div class="content-box">{{ i.phoneNum }}</div>
@@ -41,34 +41,34 @@
       </template>
 
       <div class="item" style="margin-top: 100px">
-        <span>受委托人姓名:</span>
+        <span>{{ $t("tl.t16[7]") }}</span>
         <div style="flex: 1" class="input-box">
           <input style="width: 100%" v-model="data.authorByName" />
           <div class="content-box">{{ data.authorByName }}</div>
         </div>
-        <span>性别:</span>
+        <span>{{ $t("tl.t16[8]") }}</span>
         <div class="input-box" style="min-width: 60px">
           <input style="width: 60px" v-model="data.authorBySex" />
           <div class="content-box">{{ data.authorBySex }}</div>
         </div>
-        <span>年龄:</span>
+        <span>{{ $t("tl.t16[9]") }}</span>
         <div class="input-box" style="min-width: 60px">
           <input style="width: 60px" v-model="data.authorByAge" />
           <div class="content-box">{{ data.authorByAge }}</div>
         </div>
-        <span>身份证号:</span>
+        <span>{{ $t("tl.t16[10]") }}</span>
       </div>
       <div class="item">
         <div style="flex: 1" class="input-box">
           <input style="width: 100%" v-model="data.authorById" />
           <div class="content-box">{{ data.authorById }}</div>
         </div>
-        <span>工作单位:</span>
+        <span>{{ $t("tl.t16[11]") }}</span>
         <div class="input-box" style="min-width: 330px">
           <input style="width: 330px" v-model="data.authorByCompany" />
           <div class="content-box">{{ data.authorByCompany }}</div>
         </div>
-        <span>住址及联系方式:</span>
+        <span>{{ $t("tl.t16[12]") }}</span>
       </div>
       <div class="item">
         <div style="flex: 1" class="input-box">
@@ -78,26 +78,30 @@
       </div>
 
       <div class="item" style="margin-top: 120px">
-        <div style="text-indent: 2em">现委托上述受委托人参与:</div>
+        <div style="text-indent: 2em">{{ $t("tl.t16[13]") }}</div>
         <div style="flex: 1" class="input-box">
           <input style="width: 100%" v-model="data.message" />
           <div class="content-box">{{ data.message }}</div>
         </div>
-        <span>一案</span>
+        <span>{{ $t("tl.t16[14]") }}</span>
       </div>
       <div class="item">
-        <div>处理工作。</div>
+        <div>{{ $t("tl.t16[15]") }}</div>
       </div>
       <div class="item" style="margin-top: 100px">
-        <span>受托人:</span>
+        <span>{{ $t("tl.t16[16]") }}</span>
         <div class="input-box">
           <input style="width: 100%" v-model="data.authorByNameB" />
           <div class="content-box">{{ data.authorByNameB }}</div>
         </div>
-        <span>代理权限为:</span>
+        <span>{{ $t("tl.t16[17]") }}</span>
       </div>
 
-      <div class="check-item" @click="checkOptions(checkData, index)" v-for="(i, index) in checkData.options">
+      <div
+        class="check-item"
+        @click="checkOptions(checkData, index)"
+        v-for="(i, index) in checkData.options"
+      >
         <div style="display: inline-block">
           <ui-icon :type="data.options.check == i.id ? 'rb_y' : 'rb_n'"></ui-icon>
           <span>{{ i.title }}</span>
@@ -112,6 +116,7 @@ import { reactive, ref, toRefs, onBeforeMount, onMounted, watch } from "vue";
 import { tables } from "@/store/tables";
 import { tablesInfo, setData } from "../data";
 import { bus } from "@/hook/useGraphic";
+import { ui18n } from "@/lang";
 const props = defineProps({
   downMode: { type: Boolean, default: false },
   isDownloadShow: { type: Boolean, default: false },
@@ -129,11 +134,11 @@ const checkData = ref({
   options: [
     {
       id: 1,
-      title: "一般代理。即代理为参与诉讼、调解,提供法律帮助。",
+      title: ui18n.t("tl.t16[18]"),
     },
     {
       id: 2,
-      title: "特别授权,代为起诉,陈述事实,参加辩论和调解,代为提出、承认、放弃或变更赔偿请求, 提起反诉或上诉,签收法律文书。",
+      title: ui18n.t("tl.t16[19]"),
     },
   ],
 });

+ 17 - 8
src/views/tables/author/author-two.vue

@@ -12,7 +12,11 @@
         </div>
       </div> -->
 
-      <div class="check-item" @click="checkOptions(checkData1, index)" v-for="(i, index) in checkData1.options">
+      <div
+        class="check-item"
+        @click="checkOptions(checkData1, index)"
+        v-for="(i, index) in checkData1.options"
+      >
         <div class="item">
           <ui-icon :type="data.oneOptions.check == i.id ? 'rb_y' : 'rb_n'"></ui-icon>
           <span>{{ i.title }}</span>
@@ -24,14 +28,18 @@
       </div>
 
       <div class="item" style="margin-bottom: 20px">
-        <span>受托人:</span>
+        <span>{{ $t("tl.t17[0]") }}</span>
         <div class="input-box">
           <input style="width: 100%" v-model="data.authorByName" />
           <div class="content-box">{{ data.authorByName }}</div>
         </div>
-        <span>代理权限为:</span>
+        <span>{{ $t("tl.t17[1]") }}</span>
       </div>
-      <div class="check-item" @click="checkOptions(checkData, index)" v-for="(i, index) in checkData.options">
+      <div
+        class="check-item"
+        @click="checkOptions(checkData, index)"
+        v-for="(i, index) in checkData.options"
+      >
         <div class="item" :style="i.id == 3 ? '' : 'display: inline-block'">
           <ui-icon :type="data.options.check == i.id ? 'rb_y' : 'rb_n'"></ui-icon>
           <span>{{ i.title }}</span>
@@ -43,14 +51,14 @@
       </div>
 
       <div class="item" style="margin-top: 200px">
-        <span style="padding-left: 20px">委托人(签名):</span>
+        <span style="padding-left: 20px">{{ $t("tl.t17[2]") }}</span>
         <div style="flex: 1">
           <input v-model="data.authorSign" />
           <div class="content-box left" style="border: none">{{ data.authorSign }}</div>
         </div>
       </div>
       <div class="item" style="margin-top: 100px">
-        <span>受委托人(签名):</span>
+        <span>{{ $t("tl.t17[3]") }}</span>
         <div style="flex: 1">
           <input v-model="data.authorBySign" />
           <div class="content-box left" style="border: none">{{ data.authorBySign }}</div>
@@ -65,6 +73,7 @@ import { reactive, ref, toRefs, onBeforeMount, onMounted, watch } from "vue";
 import { tables } from "@/store/tables";
 import { tablesInfo, setData, resetData } from "../data";
 import { bus } from "@/hook/useGraphic";
+import { ui18n } from "@/lang";
 const props = defineProps({
   downMode: { type: Boolean, default: false },
   isDownloadShow: { type: Boolean, default: false },
@@ -98,11 +107,11 @@ const checkData = ref({
   options: [
     {
       id: 1,
-      title: "一般代理。即代理为参与诉讼、调解,提供法律帮助。",
+      title: ui18n.t("tl.t17[4]"),
     },
     {
       id: 2,
-      title: "特别授权,代为起诉,陈述事实,参加辩论和调解,代为提出、承认、放弃或变更赔偿请求, 提起反诉或上诉,签收法律文书。",
+      title: ui18n.t("tl.t17[5]"),
     },
     {
       id: 3,

+ 30 - 21
src/views/tables/demo.vue

@@ -14,28 +14,37 @@
 </template>
 
 <script setup lang="ts">
-import { reactive, ref, toRefs, onBeforeMount, onMounted, nextTick, onActivated } from 'vue';
-import html2canvas from 'html2canvas';
-import { downloadImage, uploadImage } from '@/store/sync';
-import Message from '@/components/base/components/message/message.vue';
-import Header from '@/components/photos/header.vue';
-import MainPanel from '@/components/main-panel/index.vue';
-import { router } from '@/router';
-import img_1 from '@/assets/images/demo/1.png';
-import img_2 from '@/assets/images/demo/2.png';
-import img_3 from '@/assets/images/demo/3.png';
-import img_4 from '@/assets/images/demo/4.png';
-import img_5 from '@/assets/images/demo/5.png';
-import img_6 from '@/assets/images/demo/6.png';
-import img_7 from '@/assets/images/demo/7.png';
+import {
+  reactive,
+  ref,
+  toRefs,
+  onBeforeMount,
+  onMounted,
+  nextTick,
+  onActivated,
+} from "vue";
+import html2canvas from "html2canvas";
+import { downloadImage, uploadImage } from "@/store/sync";
+import Message from "@/components/base/components/message/message.vue";
+import Header from "@/components/photos/header.vue";
+import MainPanel from "@/components/main-panel/index.vue";
+import { router } from "@/router";
+import img_1 from "@/assets/images/demo/1.png";
+import img_2 from "@/assets/images/demo/2.png";
+import img_3 from "@/assets/images/demo/3.png";
+import img_4 from "@/assets/images/demo/4.png";
+import img_5 from "@/assets/images/demo/5.png";
+import img_6 from "@/assets/images/demo/6.png";
+import img_7 from "@/assets/images/demo/7.png";
+import { ui18n } from "@/lang";
 const list = ref([
-  { title: '道路交通事故现场勘查笔录', img: img_1 },
-  { title: '询问笔录', img: img_2 },
-  { title: '讯问笔录', img: img_3 },
-  { title: '道路交通事故认定书', img: img_4 },
-  { title: '当事人血样登记表', img: img_5 },
-  { title: '道路交通事故现场遗留物品清单', img: img_6 },
-  { title: '授权委托书', img: img_7 },
+  { title: ui18n.t("tl.t2[0]"), img: img_1 },
+  { title: ui18n.t("tl.t2[1]"), img: img_2 },
+  { title: ui18n.t("tl.t2[2]"), img: img_3 },
+  { title: ui18n.t("tl.t2[3]"), img: img_4 },
+  { title: ui18n.t("tl.t2[4]"), img: img_5 },
+  { title: ui18n.t("tl.t2[5]"), img: img_6 },
+  { title: ui18n.t("tl.t2[6]"), img: img_7 },
 ]);
 let index = Number(router.currentRoute.value.params.id);
 const info = ref(list.value[index - 1]);

+ 51 - 30
src/views/tables/explorate-four.vue

@@ -2,27 +2,31 @@
 <template>
   <div class="explorate" v-if="data" :class="{ downMode: downMode }">
     <div>
-      <h2 class="title">道路交通事故现场勘查笔录(续页)</h2>
+      <h2 class="title">{{ $t("tl.t8[0]") }}</h2>
 
       <div class="container">
         <div class="table-excel">
-          <p style="margin-bottom: 10px">六、对车辆驾驶人进行酒精含量、国家管制的精神药品和麻醉药品测试的结果以及提取血样、 尿样情况</p>
+          <p style="margin-bottom: 10px">
+            {{ $t("tl.t8[1]") }}
+          </p>
           <table>
             <tr>
-              <td>编号</td>
-              <td>姓名</td>
-              <td style="width: 170px">身份证号码</td>
-              <td>联系电话</td>
-              <td>交通方式</td>
-              <td style="width: 100px">酒精、 国家管制精神药品和麻醉药品测试结果</td>
-              <td style="width: 110px">是否抽血或提取尿样</td>
-              <td>备注</td>
+              <td>{{ $t("tl.t8[2]") }}</td>
+              <td>{{ $t("tl.t8[3]") }}</td>
+              <td style="width: 170px">{{ $t("tl.t8[4]") }}</td>
+              <td>{{ $t("tl.t8[5]") }}</td>
+              <td>{{ $t("tl.t8[6]") }}</td>
+              <td style="width: 100px">{{ $t("tl.t8[7]") }}</td>
+              <td style="width: 110px">{{ $t("tl.t8[8]") }}</td>
+              <td>{{ $t("tl.t8[9]") }}</td>
             </tr>
 
             <tr v-for="(i, index) in data.driversInfoList">
               <td v-for="(j, j_index) in i">
                 <div>
-                  <div class="content-box">{{ data.driversInfoList[index][j_index] }}</div>
+                  <div class="content-box">
+                    {{ data.driversInfoList[index][j_index] }}
+                  </div>
                   <input type="text" v-model="data.driversInfoList[index][j_index]" />
                 </div>
               </td>
@@ -77,21 +81,26 @@
           </table>
         </div>
         <div class="table-excel">
-          <p style="margin-bottom: 10px">七、肇事车辆驶离的方向、 车型、 车号、 车身颜色等情况</p>
+          <p style="margin-bottom: 10px">
+            {{ $t("tl.t8[10]") }}
+          </p>
           <table>
             <tr>
-              <td>编号</td>
-              <td>牌号</td>
-              <td>车型</td>
-              <td>车身颜色</td>
-              <td>驶离路线、方向</td>
-              <td>驾乘人员情况</td>
-              <td>其他信息</td>
+              <td>{{ $t("tl.t8[11]") }}</td>
+              <td>{{ $t("tl.t8[12]") }}</td>
+              <td>{{ $t("tl.t8[13]") }}</td>
+              <td>{{ $t("tl.t8[14]") }}</td>
+              <td>{{ $t("tl.t8[15]") }}</td>
+              <td>{{ $t("tl.t8[16]") }}</td>
+              <td>{{ $t("tl.t8[17]") }}</td>
             </tr>
             <tr v-for="(i, index) in data.carsInfoList">
               <td v-for="(j, j_index) in i">
                 <div>
-                  <div class="content-box" v-html="data.carsInfoList[index][j_index]"></div>
+                  <div
+                    class="content-box"
+                    v-html="data.carsInfoList[index][j_index]"
+                  ></div>
                   <input type="text" v-model="data.carsInfoList[index][j_index]" />
                 </div>
               </td>
@@ -124,30 +133,42 @@
         </div>
         <div class="table-body">
           <div class="item column">
-            <span>八、现场采取强制措施情况</span>
+            <span>{{ $t("tl.t8[18]") }}</span>
             <div>
-              <textarea v-model="data.measureDesc" name="" id="" cols="30" rows="10"></textarea>
+              <textarea
+                v-model="data.measureDesc"
+                name=""
+                id=""
+                cols="30"
+                rows="10"
+              ></textarea>
             </div>
           </div>
         </div>
         <div class="table-body no-border">
           <div class="item column">
-            <span>九、勘查现场的交通警察认为应当记录的其他情况</span>
+            <span>{{ $t("tl.t8[19]") }}</span>
             <div>
-              <textarea v-model="data.otherDesc" name="" id="" cols="30" rows="10"></textarea>
+              <textarea
+                v-model="data.otherDesc"
+                name=""
+                id=""
+                cols="30"
+                rows="10"
+              ></textarea>
             </div>
           </div>
         </div>
         <div class="sign-box">
           <div>
-            <span>现场勘查人员签名:</span>
+            <span>{{ $t("tl.t8[20]") }}</span>
             <div>
               <input type="text" v-model="data.explorateSign" />
               <div class="content-box left">{{ data.explorateSign }}</div>
             </div>
           </div>
           <div>
-            <span>记录人签名:</span>
+            <span>{{ $t("tl.t8[21]") }}</span>
             <div>
               <input type="text" v-model="data.reportSign" />
               <div class="content-box left">{{ data.reportSign }}</div>
@@ -156,14 +177,14 @@
         </div>
         <div class="sign-box">
           <div>
-            <span>当事人签名:</span>
+            <span>{{ $t("tl.t8[22]") }}</span>
             <div>
               <input type="text" v-model="data.clientSign" />
               <div class="content-box left">{{ data.clientSign }}</div>
             </div>
           </div>
           <div>
-            <span>见证人签名:</span>
+            <span>{{ $t("tl.t8[23]") }}</span>
             <div>
               <input type="text" v-model="data.witnessSign" />
               <div class="content-box left">{{ data.witnessSign }}</div>
@@ -173,8 +194,8 @@
       </div>
 
       <div class="footer">
-        <span>共<span>肆</span>页</span>
-        <span>第<span>肆</span>页</span>
+        <!-- <span>共<span>肆</span>页</span> -->
+        {{{{ $t("tl.t8[24]") }}}}
       </div>
     </div>
   </div>

+ 224 - 184
src/views/tables/explorate-one.vue

@@ -9,65 +9,99 @@
 
   <div class="explorate" :class="{ downMode }" v-if="data">
     <div ref="layoutRef">
-      <h2 class="title">道路交通事故现场勘查笔录</h2>
+      <h2 class="title">{{ $t("tl.t9[0]") }}</h2>
 
       <div class="container">
         <div class="wrapper">
           <div class="header">
-            <div class="item" v-for="(i, index) in sceneTypes.options" @click="checkLevel(sceneTypes, index)">
+            <div
+              class="item"
+              v-for="(i, index) in sceneTypes.options"
+              @click="checkLevel(sceneTypes, index)"
+            >
               <ui-icon :type="data.explorateType == i.id ? 'rb_y' : 'rb_n'"></ui-icon>
               <span>{{ i.title }}</span>
             </div>
           </div>
           <div class="info">
-            <div>勘查单位</div>
+            <div>{{ $t("tl.t9[1]") }}</div>
             <!-- <div class="input-box" contenteditable v-html="data.explorateCompany"></div> -->
             <div class="input-box">
-              <input type="text" style="text-align: center" v-model="data.explorateCompany" />
+              <input
+                type="text"
+                style="text-align: center"
+                v-model="data.explorateCompany"
+              />
               <div class="content-box">{{ data.explorateCompany }}</div>
             </div>
           </div>
           <div class="info">
-            <div>勘查时间</div>
+            <div>{{ $t("tl.t9[2]") }}</div>
             <div class="input-box">
-              <input type="text" style="text-align: center" v-model="data.explorateTime" />
+              <input
+                type="text"
+                style="text-align: center"
+                v-model="data.explorateTime"
+              />
               <div class="content-box">{{ data.explorateTime }}</div>
             </div>
           </div>
           <div class="info">
-            <div>事故时间</div>
+            <div>{{ $t("tl.t9[3]") }}</div>
             <div class="input-box">
               <input type="text" style="text-align: center" v-model="data.accidentTime" />
               <div class="content-box">{{ data.accidentTime }}</div>
             </div>
           </div>
           <div class="time">
-            <div class="name">事故地点</div>
+            <div class="name">{{ $t("tl.t9[4]") }}</div>
             <div class="time-one">
               <div class="road-type">
-                <div class="road-type-name">道路类型</div>
+                <div class="road-type-name">{{ $t("tl.t9[5]") }}</div>
                 <div class="type-box">
                   <div class="type-item">
-                    <div class="type-item-name">公路</div>
+                    <div class="type-item-name">{{ $t("tl.t9[6]") }}</div>
                     <div class="item-msg">
                       <div class="item-info">
-                        <div class="item-info-name">技术等级</div>
+                        <div class="item-info-name">{{ $t("tl.t9[7]") }}</div>
                         <div class="item-info-box">
-                          <div class="item" v-for="(i, index) in technicalLevel.options" @click="checkLevel(technicalLevel, index)">
-                            <ui-icon :type="data.technicalLevel == i.id ? 'rb_y' : 'rb_n'"></ui-icon>
+                          <div
+                            class="item"
+                            v-for="(i, index) in technicalLevel.options"
+                            @click="checkLevel(technicalLevel, index)"
+                          >
+                            <ui-icon
+                              :type="data.technicalLevel == i.id ? 'rb_y' : 'rb_n'"
+                            ></ui-icon>
                             <span>{{ i.title }}</span>
                           </div>
                         </div>
                       </div>
                       <div class="item-info">
-                        <div class="item-info-name">行政等级</div>
+                        <div class="item-info-name">{{ $t("tl.t9[8]") }}</div>
                         <div class="item-info-box">
-                          <div class="item" v-for="(i, index) in administrativeLevel.options" @click="checkLevel(administrativeLevel, index)">
-                            <ui-icon :type="data.administrativeLevel.check == i.id ? 'rb_y' : 'rb_n'"></ui-icon>
+                          <div
+                            class="item"
+                            v-for="(i, index) in administrativeLevel.options"
+                            @click="checkLevel(administrativeLevel, index)"
+                          >
+                            <ui-icon
+                              :type="
+                                data.administrativeLevel.check == i.id ? 'rb_y' : 'rb_n'
+                              "
+                            ></ui-icon>
                             <span>{{ i.title }}</span>
                             <div class="input-box" style="flex: 1" v-if="i.id == 5">
-                              <input type="text" v-model="data.administrativeLevel.value" />
-                              <div style="height: 24px;" class="content-box left border-bottom">{{ data.administrativeLevel.value }}</div>
+                              <input
+                                type="text"
+                                v-model="data.administrativeLevel.value"
+                              />
+                              <div
+                                style="height: 24px"
+                                class="content-box left border-bottom"
+                              >
+                                {{ data.administrativeLevel.value }}
+                              </div>
                             </div>
                           </div>
                         </div>
@@ -75,12 +109,18 @@
                     </div>
                   </div>
                   <div class="type-item city">
-                    <div class="type-item-name">城市道路</div>
+                    <div class="type-item-name">{{ $t("tl.t9[9]") }}</div>
                     <div class="item-msg">
                       <div class="item-info">
                         <div class="item-info-box" style="flex-flow: row wrap">
-                          <div class="item" v-for="(i, index) in cityRoadList.options" @click="checkLevel(cityRoadList, index)">
-                            <ui-icon :type="data.cityRoad == i.id ? 'rb_y' : 'rb_n'"></ui-icon>
+                          <div
+                            class="item"
+                            v-for="(i, index) in cityRoadList.options"
+                            @click="checkLevel(cityRoadList, index)"
+                          >
+                            <ui-icon
+                              :type="data.cityRoad == i.id ? 'rb_y' : 'rb_n'"
+                            ></ui-icon>
                             <span>{{ i.title }}</span>
                           </div>
                         </div>
@@ -90,22 +130,40 @@
                 </div>
               </div>
               <div class="road-type">
-                <div class="road-type-name">路口路段类型</div>
+                <div class="road-type-name">{{ $t("tl.t9[10]") }}</div>
                 <div class="type-box">
                   <div class="type-item">
-                    <div class="type-item-name">路口</div>
-                    <div class="item-msg intersection" style="min-height: 48px; flex-flow: row wrap">
-                      <div class="item" v-for="(i, index) in roadSideList.options" @click="checkLevel(roadSideList, index)">
-                        <ui-icon :type="data.roadSide == i.id ? 'rb_y' : 'rb_n'"></ui-icon>
+                    <div class="type-item-name">{{ $t("tl.t9[11]") }}</div>
+                    <div
+                      class="item-msg intersection"
+                      style="min-height: 48px; flex-flow: row wrap"
+                    >
+                      <div
+                        class="item"
+                        v-for="(i, index) in roadSideList.options"
+                        @click="checkLevel(roadSideList, index)"
+                      >
+                        <ui-icon
+                          :type="data.roadSide == i.id ? 'rb_y' : 'rb_n'"
+                        ></ui-icon>
                         <span>{{ i.title }}</span>
                       </div>
                     </div>
                   </div>
                   <div class="type-item">
-                    <div class="type-item-name">路段</div>
-                    <div class="item-msg intersection" style="min-height: 60px; flex-flow: row wrap">
-                      <div class="item" v-for="(i, index) in roadPartList.options" @click="checkLevel(roadPartList, index)">
-                        <ui-icon :type="data.roadPart == i.id ? 'rb_y' : 'rb_n'"></ui-icon>
+                    <div class="type-item-name">{{ $t("tl.t9[12]") }}</div>
+                    <div
+                      class="item-msg intersection"
+                      style="min-height: 60px; flex-flow: row wrap"
+                    >
+                      <div
+                        class="item"
+                        v-for="(i, index) in roadPartList.options"
+                        @click="checkLevel(roadPartList, index)"
+                      >
+                        <ui-icon
+                          :type="data.roadPart == i.id ? 'rb_y' : 'rb_n'"
+                        ></ui-icon>
                         <span>{{ i.title }}</span>
                       </div>
                     </div>
@@ -113,13 +171,13 @@
                 </div>
               </div>
               <div class="road-info">
-                <div class="road-name">路名</div>
+                <div class="road-name">{{ $t("tl.t9[13]") }}</div>
                 <div class="road-msg">
                   <div class="road-name-text input-box">
                     <input type="text" v-model="data.roadName" />
                     <div class="content-box left">{{ data.roadName }}</div>
                   </div>
-                  <div class="road-num">路号(公路)</div>
+                  <div class="road-num">{{ $t("tl.t9[14]") }}</div>
                   <div class="road-num-text input-box">
                     <input type="text" v-model="data.roadNum" />
                     <div class="content-box left">{{ data.roadNum }}</div>
@@ -127,20 +185,22 @@
                 </div>
               </div>
               <div class="road-pos">
-                <div class="road-pos-name">位置</div>
+                <div class="road-pos-name">{{ $t("tl.t9[15]") }}</div>
                 <div class="pos-box">
                   <div class="pos-item">
-                    <div class="pos-item-name" style="height: 30px">卫星定位</div>
+                    <div class="pos-item-name" style="height: 30px">
+                      {{ $t("tl.t9[16]") }}
+                    </div>
                     <div class="pos-msg" style="height: 30px">
                       <div class="longitude">
-                        <span>经度:</span>
+                        <span>{{ $t("tl.t9[17]") }}:</span>
                         <div class="input-box">
                           <input type="text" v-model="data.longitude" />
                           <div class="content-box left">{{ data.longitude }}</div>
                         </div>
                       </div>
                       <div class="latitude">
-                        <span>纬度:</span>
+                        <span>{{ $t("tl.t9[18]") }}:</span>
                         <div>
                           <input type="text" v-model="data.latitude" />
                           <div class="content-box left">{{ data.latitude }}</div>
@@ -149,7 +209,9 @@
                     </div>
                   </div>
                   <div class="pos-item">
-                    <div class="pos-item-name" style="height: 54px">地点描述</div>
+                    <div class="pos-item-name" style="height: 54px">
+                      {{ $t("tl.t9[19]") }}
+                    </div>
                     <div class="pos-msg desc input-box" style="height: 54px">
                       <input type="text" v-model="data.addressDesc" />
                       <div class="content-box left">{{ data.addressDesc }}</div>
@@ -160,37 +222,61 @@
             </div>
           </div>
           <div class="weather">
-            <div class="name">天气</div>
+            <div class="name">{{ $t("tl.t9[20]") }}</div>
 
             <div style="flex-flow: row wrap">
-              <div class="item" v-for="(i, index) in weatherList.options" @click="checkLevel(weatherList, index)">
+              <div
+                class="item"
+                v-for="(i, index) in weatherList.options"
+                @click="checkLevel(weatherList, index)"
+              >
                 <ui-icon :type="data.weather.check == i.id ? 'rb_y' : 'rb_n'"></ui-icon>
                 <span>{{ i.title }}</span>
                 <div class="input-box" v-if="i.id == 10">
                   <input type="text" v-model="data.weather.value" />
-                  <div class="content-box left border-bottom">{{ data.weather.value }}</div>
+                  <div class="content-box left border-bottom">
+                    {{ data.weather.value }}
+                  </div>
                 </div>
               </div>
             </div>
           </div>
           <div class="environment">
             <div>
-              <p style="margin-bottom: 18px">一、事故现场道路环境</p>
+              <p style="margin-bottom: 18px">{{ $t("tl.t9[21]") }}</p>
               <div class="em-info-box">
                 <div class="info-item" v-for="(i, index) in environments">
                   <span class="info-title">{{ i.title }}</span>
                   <div class="check-box">
-                    <div class="check-item" :style="j_index == i.options.length - 1 ? 'flex:1;' : ''" v-for="(j, j_index) in i.options" @click="checkEnvironItem(j, index, j_index)">
-                      <ui-icon :type="data.environments[index].check == j.id ? 'rb_y' : 'rb_n'"></ui-icon>
+                    <div
+                      class="check-item"
+                      :style="j_index == i.options.length - 1 ? 'flex:1;' : ''"
+                      v-for="(j, j_index) in i.options"
+                      @click="checkEnvironItem(j, index, j_index)"
+                    >
+                      <ui-icon
+                        :type="data.environments[index].check == j.id ? 'rb_y' : 'rb_n'"
+                      ></ui-icon>
                       <span>{{ j.name }}</span>
-                      <div class="input-box" v-if="j_index == i.options.length - 1 && i.id != 9">
+                      <div
+                        class="input-box"
+                        v-if="j_index == i.options.length - 1 && i.id != 9"
+                      >
                         <input type="text" v-model="data.environments[index].value" />
-                        <div class="content-box left">{{ data.environments[index].value }}</div>
+                        <div class="content-box left">
+                          {{ data.environments[index].value }}
+                        </div>
                       </div>
                     </div>
-                    <div class="input-box" style="flex: none; width: 80%" v-if="!i.options.length">
+                    <div
+                      class="input-box"
+                      style="flex: none; width: 80%"
+                      v-if="!i.options.length"
+                    >
                       <input type="text" v-model="data.environments[index].value" />
-                      <div class="content-box left"  style="height: 24px;">{{ data.environments[index].value }}</div>
+                      <div class="content-box left" style="height: 24px">
+                        {{ data.environments[index].value }}
+                      </div>
                     </div>
                   </div>
                   <!-- <div class="input-box" v-if="index == environments.length - 1">
@@ -202,14 +288,14 @@
           </div>
           <div class="sign-box">
             <div>
-              <span>现场勘查人员签名:</span>
+              <span>{{ $t("tl.t9[22]") }}</span>
               <div>
                 <input type="text" v-model="data.explorateSign" />
                 <div class="content-box left">{{ data.explorateSign }}</div>
               </div>
             </div>
             <div>
-              <span>记录人签名:</span>
+              <span>{{ $t("tl.t9[23]") }}</span>
               <div>
                 <input type="text" v-model="data.reportSign" />
                 <div class="content-box left">{{ data.reportSign }}</div>
@@ -218,14 +304,14 @@
           </div>
           <div class="sign-box">
             <div>
-              <span>当事人签名:</span>
+              <span>{{ $t("tl.t9[24]") }}</span>
               <div>
                 <input type="text" v-model="data.clientSign" />
                 <div class="content-box left">{{ data.clientSign }}</div>
               </div>
             </div>
             <div>
-              <span>见证人签名:</span>
+              <span>{{ $t("tl.t9[25]") }}</span>
               <div>
                 <input type="text" v-model="data.witnessSign" />
                 <div class="content-box left">{{ data.witnessSign }}</div>
@@ -235,8 +321,7 @@
         </div>
       </div>
       <div class="footer">
-        <span>共<span>肆</span>页</span>
-        <span>第<span>壹</span>页</span>
+        {{ $t("tl.t9[26]") }}
       </div>
     </div>
   </div>
@@ -254,6 +339,7 @@ import UiInput from "@/components/base/components/input/index.vue";
 import { genUseLoading } from "@/hook";
 import { tables } from "@/store/tables";
 import { tablesInfo, setData } from "./data";
+import { ui18n } from "@/lang";
 
 const props = defineProps({
   downMode: { type: Boolean, default: false },
@@ -278,46 +364,46 @@ const sceneTypes = ref({
   check: 0,
   type: "explorateType",
   options: [
-    { id: 1, title: "现场勘查" },
-    { id: 2, title: "补充勘查" },
+    { id: 1, title: ui18n.t("tl.t3[0]") },
+    { id: 2, title: ui18n.t("tl.t3[1]") },
   ],
 });
 const roadPartList = ref({
   check: 0,
   type: "roadPart",
   options: [
-    { id: 1, title: "普通路段" },
-    { id: 2, title: "高架路段" },
-    { id: 3, title: "变窄路段" },
-    { id: 4, title: "窄路" },
-    { id: 5, title: "桥梁" },
-    { id: 6, title: "隧道" },
-    { id: 7, title: "路段进出处" },
-    { id: 8, title: "路侧险要路段" },
-    { id: 9, title: "其他特殊路段" },
+    { id: 1, title: ui18n.t("tl.t3[2]") },
+    { id: 2, title: ui18n.t("tl.t3[3]") },
+    { id: 3, title: ui18n.t("tl.t3[4]") },
+    { id: 4, title: ui18n.t("tl.t3[5]") },
+    { id: 5, title: ui18n.t("tl.t3[6]") },
+    { id: 6, title: ui18n.t("tl.t3[7]") },
+    { id: 7, title: ui18n.t("tl.t3[8]") },
+    { id: 8, title: ui18n.t("tl.t3[9]") },
+    { id: 9, title: ui18n.t("tl.t3[10]") },
   ],
 });
 const roadSideList = ref({
   type: "roadSide",
   check: 0,
   options: [
-    { id: 1, title: "三枝分叉口" },
-    { id: 2, title: "四枝分叉口" },
-    { id: 3, title: "多枝分叉口" },
-    { id: 4, title: "环形交叉口" },
-    { id: 5, title: "匝道口" },
+    { id: 1, title: ui18n.t("tl.t3[11]") },
+    { id: 2, title: ui18n.t("tl.t3[12]") },
+    { id: 3, title: ui18n.t("tl.t3[13]") },
+    { id: 4, title: ui18n.t("tl.t3[14]") },
+    { id: 5, title: ui18n.t("tl.t3[15]") },
   ],
 });
 const cityRoadList = ref({
   check: 0,
   type: "cityRoad",
   options: [
-    { id: 1, title: "城市快速路" },
-    { id: 2, title: "一般城市道路" },
-    { id: 3, title: "单位小区自建路" },
-    { id: 4, title: "公共停车场" },
-    { id: 5, title: "公共广场" },
-    { id: 6, title: "其他路" },
+    { id: 1, title: ui18n.t("tl.t3[16]") },
+    { id: 2, title: ui18n.t("tl.t3[17]") },
+    { id: 3, title: ui18n.t("tl.t3[18]") },
+    { id: 4, title: ui18n.t("tl.t3[19]") },
+    { id: 5, title: ui18n.t("tl.t3[20]") },
+    { id: 6, title: ui18n.t("tl.t3[21]") },
   ],
 });
 
@@ -325,20 +411,11 @@ const administrativeLevel = ref({
   check: 0,
   type: "administrativeLevel",
   options: [
-    { id: 1, title: "国道" },
-    { id: 2, title: "省道" },
-    {
-      id: 3,
-      title: "县道",
-    },
-    {
-      id: 4,
-      title: "乡村道",
-    },
-    {
-      id: 5,
-      title: "其他",
-    },
+    { id: 1, title: ui18n.t("tl.t3[22]") },
+    { id: 2, title: ui18n.t("tl.t3[23]") },
+    { id: 3, title: ui18n.t("tl.t3[24]") },
+    { id: 4, title: ui18n.t("tl.t3[25]") },
+    { id: 5, title: ui18n.t("tl.t3[26]") },
   ],
 });
 const checkLevel = (item, index) => {
@@ -354,179 +431,142 @@ const technicalLevel = ref({
   check: 0,
   type: "technicalLevel",
   options: [
-    { id: 1, title: "高速" },
-    { id: 2, title: "一级" },
-    {
-      id: 3,
-      title: "二级",
-    },
-    {
-      id: 4,
-      title: "三级",
-    },
-    {
-      id: 5,
-      title: "四级",
-    },
-    {
-      id: 6,
-      title: "等外",
-    },
+    { id: 1, title: ui18n.t("tl.t3[27]") },
+    { id: 2, title: ui18n.t("tl.t3[28]") },
+    { id: 3, title: ui18n.t("tl.t3[29]") },
+    { id: 4, title: ui18n.t("tl.t3[30]") },
+    { id: 5, title: ui18n.t("tl.t3[31]") },
   ],
 });
 const weatherList = ref({
   check: 0,
   type: "weather",
   options: [
-    { id: 1, title: "晴" },
-    { id: 2, title: "阴" },
-    {
-      id: 3,
-      title: "多云",
-    },
-    {
-      id: 4,
-      title: "雨",
-    },
-    {
-      id: 5,
-      title: "雪",
-    },
-    {
-      id: 6,
-      title: "雾",
-    },
-    {
-      id: 7,
-      title: "冰雹",
-    },
-    {
-      id: 8,
-      title: "沙尘",
-    },
-    {
-      id: 9,
-      title: "霾",
-    },
-    {
-      id: 10,
-      title: "其他",
-    },
+    { id: 1, title: ui18n.t("tl.t3[32]") },
+    { id: 2, title: ui18n.t("tl.t3[33]") },
+    { id: 3, title: ui18n.t("tl.t3[34]") },
+    { id: 4, title: ui18n.t("tl.t3[35]") },
+    { id: 5, title: ui18n.t("tl.t3[36]") },
+    { id: 6, title: ui18n.t("tl.t3[37]") },
+    { id: 7, title: ui18n.t("tl.t3[38]") },
+    { id: 8, title: ui18n.t("tl.t3[39]") },
+    { id: 9, title: ui18n.t("tl.t3[40]") },
+    { id: 10, title: ui18n.t("tl.t3[41]") },
   ],
 });
 
 const checkEnvironItem = (item, index, j_index) => {
   environments.value[index].check = item.id;
   data.value.environments[index].check = item.id;
-  console.log(item.id)
+  console.log(item.id);
 };
 const environments = ref([
   {
     id: 1,
-    title: "影响视线或行驶的障碍物:",
+    title: ui18n.t("tl.t4[0]"),
     value: "",
     check: 0,
     options: [
-      { id: 1, name: "无" },
-      { id: 2, name: "有:" },
+      { id: 1, name: ui18n.t("tl.t5[0]") },
+      { id: 2, name: ui18n.t("tl.t5[1]") },
     ],
   },
   {
     id: 2,
-    title: "递路交通标志:",
+    title: ui18n.t("tl.t4[1]"),
     value: "",
     check: 0,
     options: [
-      { id: 1, name: "无" },
-      { id: 2, name: "有:" },
+      { id: 1, name: ui18n.t("tl.t5[0]") },
+      { id: 2, name: ui18n.t("tl.t5[1]") },
     ],
   },
   {
     id: 3,
-    title: "道路交通标线:",
+    title: ui18n.t("tl.t4[2]"),
     value: "",
     check: 0,
     options: [
-      { id: 1, name: "无" },
-      { id: 2, name: "有:" },
+      { id: 1, name: ui18n.t("tl.t5[0]") },
+      { id: 2, name: ui18n.t("tl.t5[1]") },
     ],
   },
   {
     id: 4,
-    title: "中央隔离设施:",
+    title: ui18n.t("tl.t4[3]"),
     value: "",
     check: 0,
     options: [
-      { id: 1, name: "无" },
-      { id: 2, name: "有:" },
+      { id: 1, name: ui18n.t("tl.t5[0]") },
+      { id: 2, name: ui18n.t("tl.t5[1]") },
     ],
   },
   {
     id: 5,
-    title: "路侧防护设施:",
+    title: ui18n.t("tl.t4[4]"),
     value: "",
     check: 0,
     options: [
-      { id: 1, name: "无" },
-      { id: 2, name: "有:" },
+      { id: 1, name: ui18n.t("tl.t5[0]") },
+      { id: 2, name: ui18n.t("tl.t5[1]") },
     ],
   },
   {
     id: 6,
-    title: "路面材料:",
+    title: ui18n.t("tl.t4[6]"),
     value: "",
     check: 0,
     options: [
-      { id: 1, name: "沥青" },
-      { id: 2, name: "水泥" },
-      { id: 3, name: "砂石" },
-      { id: 4, name: "土路" },
-      { id: 5, name: "其他" },
+      { id: 1, name: ui18n.t("tl.t5[2]") },
+      { id: 2, name: ui18n.t("tl.t5[3]") },
+      { id: 3, name: ui18n.t("tl.t5[4]") },
+      { id: 4, name: ui18n.t("tl.t5[5]") },
+      { id: 5, name: ui18n.t("tl.t5[6]") },
     ],
   },
   {
     id: 7,
-    title: "路面状况:",
+    title: ui18n.t("tl.t4[7]"),
     value: "",
     check: 0,
     options: [
-      { id: 1, name: "路面完好" },
-      { id: 2, name: "施工" },
-      { id: 3, name: "凹凸" },
-      { id: 4, name: "塌陷" },
-      { id: 5, name: "路障" },
-      { id: 6, name: "其他" },
+      { id: 1, name: ui18n.t("tl.t5[7]") },
+      { id: 2, name: ui18n.t("tl.t5[8]") },
+      { id: 3, name: ui18n.t("tl.t5[9]") },
+      { id: 4, name: ui18n.t("tl.t5[10]") },
+      { id: 5, name: ui18n.t("tl.t5[11]") },
+      { id: 6, name: ui18n.t("tl.t5[12]") },
     ],
   },
   {
     id: 8,
-    title: "路表状况:",
+    title: ui18n.t("tl.t4[8]"),
     value: "",
     check: 0,
     options: [
-      { id: 1, name: "干燥" },
-      { id: 2, name: "潮湿" },
-      { id: 3, name: "积水" },
-      { id: 4, name: "漫水" },
-      { id: 5, name: "冰雪" },
-      { id: 6, name: "泥泞" },
-      { id: 7, name: "其他" },
+      { id: 1, name: ui18n.t("tl.t5[13]") },
+      { id: 2, name: ui18n.t("tl.t5[14]") },
+      { id: 3, name: ui18n.t("tl.t5[15]") },
+      { id: 4, name: ui18n.t("tl.t5[16]") },
+      { id: 5, name: ui18n.t("tl.t5[17]") },
+      { id: 6, name: ui18n.t("tl.t5[18]") },
+      { id: 7, name: ui18n.t("tl.t5[19]") },
     ],
   },
   {
     id: 9,
-    title: "照明情况:",
+    title: ui18n.t("tl.t4[5]"),
     value: "",
     check: 0,
     options: [
-      { id: 1, name: "白天   夜间路灯照明" },
-      { id: 2, name: "有" },
-      { id: 3, name: "无" },
+      { id: 1, name: ui18n.t("tl.t5[20]") },
+      { id: 2, name: ui18n.t("tl.t5[21]") },
+      { id: 3, name: ui18n.t("tl.t5[0]") },
     ],
   },
   {
     id: 10,
-    title: "其他需要记录的情况:",
+    title: ui18n.t("tl.t4[9]"),
     value: "",
     check: 0,
     options: [],
@@ -558,7 +598,7 @@ onMounted(() => {
 .content-box {
   width: 100%;
   height: 100%;
- 
+
   display: none;
   align-items: center;
   justify-content: center;

+ 43 - 17
src/views/tables/explorate-three.vue

@@ -2,42 +2,68 @@
 <template>
   <div class="explorate" v-if="data" :class="{ downMode }">
     <div>
-      <h2 class="title">道路交通事故现场勘查笔录(续页)</h2>
+      <h2 class="title">{{ $t("tl.t10[0]") }}</h2>
 
       <div class="container">
         <div class="table-body">
-          <p style="margin-bottom: 20px; margin-top: 10px">五、现场痕迹物证的种类、形态、尺寸、位置以及固定或者提取情况</p>
+          <p style="margin-bottom: 20px; margin-top: 10px">
+            {{ $t("tl.t10[11]") }}
+          </p>
 
           <div class="item column">
-            <span>(一)地面痕迹:</span>
+            <span>{{ $t("tl.t10[1]") }}</span>
             <div>
-              <textarea v-model="data.groundTrace" name="" id="" cols="30" rows="10"></textarea>
+              <textarea
+                v-model="data.groundTrace"
+                name=""
+                id=""
+                cols="30"
+                rows="10"
+              ></textarea>
               <div class="content-box top-left">{{ data.groundTrace }}</div>
             </div>
           </div>
           <div class="item column">
-            <span>(二)车体痕迹:</span>
+            <span>{{ $t("tl.t10[2]") }}</span>
             <div>
               <div class="content-box top-left">{{ data.carTrace }}</div>
-              <textarea v-model="data.carTrace" name="" id="" cols="30" rows="10"></textarea>
+              <textarea
+                v-model="data.carTrace"
+                name=""
+                id=""
+                cols="30"
+                rows="10"
+              ></textarea>
             </div>
           </div>
           <div class="item column">
-            <span>(三)人体痕迹:</span>
+            <span>{{ $t("tl.t10[3]") }}</span>
             <div>
               <div class="content-box top-left">{{ data.bodyTrace }}</div>
-              <textarea v-model="data.bodyTrace" name="" id="" cols="30" rows="10"></textarea>
+              <textarea
+                v-model="data.bodyTrace"
+                name=""
+                id=""
+                cols="30"
+                rows="10"
+              ></textarea>
             </div>
           </div>
           <div class="item column">
-            <span>(四)物证:</span>
+            <span>{{ $t("tl.t10[4]") }}</span>
             <div>
               <div class="content-box top-left">{{ data.meterialEvidence }}</div>
-              <textarea v-model="data.meterialEvidence" name="" id="" cols="30" rows="10"></textarea>
+              <textarea
+                v-model="data.meterialEvidence"
+                name=""
+                id=""
+                cols="30"
+                rows="10"
+              ></textarea>
             </div>
           </div>
           <div class="item column">
-            <span>(五)其他:</span>
+            <span>{{ $t("tl.t10[5]") }}</span>
             <div>
               <div class="content-box top-left">{{ data.other }}</div>
               <textarea v-model="data.other" name="" id="" cols="30" rows="10"></textarea>
@@ -47,14 +73,14 @@
 
         <div class="sign-box">
           <div>
-            <span>现场勘查人员签名:</span>
+            <span>{{ $t("tl.t10[6]") }}</span>
             <div>
               <input type="text" v-model="data.explorateSign" />
               <div class="content-box left">{{ data.explorateSign }}</div>
             </div>
           </div>
           <div>
-            <span>记录人签名:</span>
+            <span>{{ $t("tl.t10[7]") }}</span>
             <div>
               <input type="text" v-model="data.reportSign" />
               <div class="content-box left">{{ data.reportSign }}</div>
@@ -63,14 +89,14 @@
         </div>
         <div class="sign-box">
           <div>
-            <span>当事人签名:</span>
+            <span>{{ $t("tl.t10[8]") }}</span>
             <div>
               <input type="text" v-model="data.clientSign" />
               <div class="content-box left">{{ data.clientSign }}</div>
             </div>
           </div>
           <div>
-            <span>见证人签名:</span>
+            <span>{{ $t("tl.t10[9]") }}</span>
             <div>
               <input type="text" v-model="data.witnessSign" />
               <div class="content-box left">{{ data.witnessSign }}</div>
@@ -79,8 +105,8 @@
         </div>
       </div>
       <div class="footer">
-        <span>共<span>肆</span>页</span>
-        <span>第<span>叁</span>页</span>
+        {{ $t("tl.t10[10]") }}
+        <!-- <span>第<span>叁</span>页</span> -->
       </div>
     </div>
   </div>

+ 94 - 48
src/views/tables/explorate-two.vue

@@ -2,78 +2,113 @@
 <template>
   <div class="explorate" :class="{ downMode }" v-if="data">
     <div>
-      <h2 class="title">道路交通事故现场勘查笔录(续页)</h2>
+      <h2 class="title">{{ $t("tl.t10[0]") }}</h2>
 
       <div class="container">
         <div class="table-header">
-          <p style="margin-bottom: 5px">二、现场监控设备情况</p>
+          <p style="margin-bottom: 5px">{{ $t("tl.t11[0]") }}</p>
           <div class="table-header-info">
-            <div class="item" v-for="(i, index) in headerList.options" @click="checkOptions(headerList, index)">
+            <div
+              class="item"
+              v-for="(i, index) in headerList.options"
+              @click="checkOptions(headerList, index)"
+            >
               <ui-icon :type="data.cameraInfo.check == i.id ? 'rb_y' : 'rb_n'"></ui-icon>
               <span>{{ i.title }}</span>
               <div v-if="i.id == 2" style="flex: 1">
                 <input type="text" v-model="data.cameraInfo.value" />
-                <div class="content-box left" style="height: 24px; border-bottom: 1px solid #000">{{ data.cameraInfo.value }}</div>
+                <div
+                  class="content-box left"
+                  style="height: 24px; border-bottom: 1px solid #000"
+                >
+                  {{ data.cameraInfo.value }}
+                </div>
               </div>
             </div>
           </div>
         </div>
         <div class="table-body">
-          <p style="margin-bottom: 20px; margin-top: 10px">三、现场伤亡人员基本情况及救援</p>
-          <p style="margin-bottom: 10px">(一)伤亡人员基本情况;</p>
+          <p style="margin-bottom: 20px; margin-top: 10px">
+            {{ $t("tl.t11[1]") }}
+          </p>
+          <p style="margin-bottom: 10px">{{ $t("tl.t11[2]") }}</p>
           <div class="item">
-            <span>当场死亡:(</span>
+            <span>{{ $t("tl.t11[3]") }}(</span>
             <div style="min-width: 10px">
               <input style="width: 30px" type="text" v-model="data.dieNum" />
               <div class="content-box">{{ data.dieNum }}</div>
             </div>
-            <span>)人;急救、医疗人员签名确认:</span>
+            <span>){{ $t("tl.t11[4]") }};{{ $t("tl.t11[5]") }}</span>
             <div style="flex: 1">
               <input class="under-line" type="text" v-model="data.doctorSign" />
-              <div class="content-box left" style="border-bottom: 1px solid #000">{{ data.doctorSign }}</div>
+              <div class="content-box left" style="border-bottom: 1px solid #000">
+                {{ data.doctorSign }}
+              </div>
             </div>
           </div>
           <div class="item">
-            <span>受伤:(</span>
+            <span>{{ $t("tl.t11[6]") }}:(</span>
             <div style="min-width: 10px">
               <input style="width: 30px" type="text" v-model="data.hurtNum" />
               <div class="content-box">{{ data.hurtNum }}</div>
             </div>
-            <span>)。</span>
+            <span>){{ $t("tl.t11[4]") }}。</span>
           </div>
           <div class="item column">
-            <span>伤亡人员去向:</span>
+            <span>{{ $t("tl.t11[7]") }}</span>
             <div style="min-height: 60px; width: 100%">
-              <textarea style="height: 60px" v-model="data.hurtDieGo" name="" id="" cols="30" rows="10"></textarea>
+              <textarea
+                style="height: 60px"
+                v-model="data.hurtDieGo"
+                name=""
+                id=""
+                cols="30"
+                rows="10"
+              ></textarea>
               <div class="content-box top-left">{{ data.hurtDieGo }}</div>
             </div>
           </div>
           <div class="item column">
-            <span>其他需求说明的情况:</span>
+            <span>{{ $t("tl.t11[8]") }}</span>
             <div style="min-height: 60px; width: 100%">
-              <textarea style="height: 60px" v-model="data.desc" name="" id="" cols="30" rows="10"></textarea>
+              <textarea
+                style="height: 60px"
+                v-model="data.desc"
+                name=""
+                id=""
+                cols="30"
+                rows="10"
+              ></textarea>
               <div class="content-box top-left">{{ data.desc }}</div>
             </div>
           </div>
-          <p>(二)救援简要情况:</p>
+          <p>{{ $t("tl.t11[9]") }}</p>
 
           <div class="item" style="margin-top: 10px">
-            <span> 是否涉及危险物品:</span>
-            <div style="margin-right: 40px" v-for="(i, index) in isnotList.options" @click="checkOptions(isnotList, index)">
-              <ui-icon :type="data.dangerousInfo.check == i.id ? 'rb_y' : 'rb_n'"></ui-icon>
+            <span> {{ $t("tl.t11[10]") }}</span>
+            <div
+              style="margin-right: 40px"
+              v-for="(i, index) in isnotList.options"
+              @click="checkOptions(isnotList, index)"
+            >
+              <ui-icon
+                :type="data.dangerousInfo.check == i.id ? 'rb_y' : 'rb_n'"
+              ></ui-icon>
               <span>{{ i.title }}</span>
             </div>
             <!-- <div style="margin-right: 40px">
               <ui-icon type="rb_n"></ui-icon>
               <span>是</span>
             </div> -->
-            <div>名称:</div>
+            <div>{{ $t("tl.t11[11]") }}</div>
             <div style="flex: 1">
               <input class="under-line" type="text" v-model="data.dangerousInfo.value" />
-              <div class="content-box left" style="border-bottom: 1px solid #000">{{ data.dangerousInfo.value }}</div>
+              <div class="content-box left" style="border-bottom: 1px solid #000">
+                {{ data.dangerousInfo.value }}
+              </div>
             </div>
           </div>
-          <p style="margin-bottom: 5px">相关部门和人员到达情况:</p>
+          <p style="margin-bottom: 5px">{{ $t("tl.t11[12]") }}</p>
           <div class="item half">
             <template v-for="(i, index) in reachList.options">
               <div v-if="index < 2" @click="checkOptions(reachList, index)">
@@ -96,21 +131,23 @@
           </div>
         </div>
         <div class="table-excel">
-          <p style="margin-bottom: 10px">四、现场事故车辆车型、牌号及车辆挡位 转向、灯光、仪表指针位置,汽车行驶记录仪、车载 事件数据记录仪、卫星定位装置等安装及使用情况</p>
+          <p style="margin-bottom: 10px">
+            {{ $t("tl.t11[13]") }}
+          </p>
           <table>
             <tr>
-              <td rowspan="2">编号</td>
-              <td rowspan="2">牌号</td>
-              <td rowspan="2">车辆类型</td>
-              <td rowspan="2">车辆档位</td>
-              <td rowspan="2">灯光开启情况</td>
-              <td rowspan="2">车速仪表指针位置</td>
-              <td colspan="3">车载设备安装使用情况(有,无)</td>
+              <td rowspan="2">{{ $t("tl.t11[14]") }}</td>
+              <td rowspan="2">{{ $t("tl.t11[15]") }}</td>
+              <td rowspan="2">{{ $t("tl.t11[16]") }}</td>
+              <td rowspan="2">{{ $t("tl.t11[17]") }}</td>
+              <td rowspan="2">{{ $t("tl.t11[18]") }}</td>
+              <td colspan="2">{{ $t("tl.t11[19]") }}</td>
+              <td rowspan="3">{{ $t("tl.t11[20]") }}</td>
             </tr>
             <tr>
-              <td>汽车行驶记录仪</td>
-              <td>车载事件数据记录仪</td>
-              <td>卫星定位装置</td>
+              <td>{{ $t("tl.t11[21]") }}</td>
+              <td>{{ $t("tl.t11[22]") }}</td>
+              <td>{{ $t("tl.t11[23]") }}</td>
             </tr>
             <tr v-for="(i, index) in data.list">
               <td v-for="(j, j_index) in i">
@@ -122,14 +159,14 @@
         </div>
         <div class="sign-box">
           <div>
-            <span>现场勘查人员签名:</span>
+            <span>{{ $t("tl.t11[24]") }}</span>
             <div>
               <input type="text" v-model="data.explorateSign" />
               <div class="content-box left">{{ data.explorateSign }}</div>
             </div>
           </div>
           <div>
-            <span>记录人签名:</span>
+            <span>{{ $t("tl.t11[25]") }}</span>
             <div>
               <input type="text" v-model="data.reportSign" />
               <div class="content-box left">{{ data.reportSign }}</div>
@@ -138,14 +175,14 @@
         </div>
         <div class="sign-box">
           <div>
-            <span>当事人签名:</span>
+            <span>{{ $t("tl.t11[26]") }}</span>
             <div>
               <input type="text" v-model="data.clientSign" />
               <div class="content-box left">{{ data.clientSign }}</div>
             </div>
           </div>
           <div>
-            <span>见证人签名:</span>
+            <span>{{ $t("tl.t11[27]") }}</span>
             <div>
               <input type="text" v-model="data.witnessSign" />
               <div class="content-box left">{{ data.witnessSign }}</div>
@@ -154,18 +191,27 @@
         </div>
       </div>
       <div class="footer">
-        <span>共<span>肆</span>页</span>
-        <span>第<span>贰</span>页</span>
+        <!-- <span>共<span>肆</span>页</span>
+        <span>第<span>贰</span>页</span> -->
       </div>
     </div>
   </div>
 </template>
 
 <script setup lang="ts">
-import { reactive, ref, toRefs, onBeforeMount, onMounted, nextTick, defineProps } from "vue";
+import {
+  reactive,
+  ref,
+  toRefs,
+  onBeforeMount,
+  onMounted,
+  nextTick,
+  defineProps,
+} from "vue";
 
 import { tables } from "@/store/tables";
 import { tablesInfo, setData } from "./data";
+import { ui18n } from "@/lang";
 const props = defineProps({
   downMode: { type: Boolean, default: false },
   isDownloadShow: { type: Boolean, default: false },
@@ -182,11 +228,11 @@ const headerList = ref({
   options: [
     {
       id: 1,
-      title: "未发现",
+      title: ui18n.t("tl.t11[28]"),
     },
     {
       id: 2,
-      title: "发现",
+      title: ui18n.t("tl.t11[29]"),
     },
   ],
 });
@@ -196,11 +242,11 @@ const isnotList = ref({
   options: [
     {
       id: 1,
-      title: "否",
+      title: ui18n.t("tl.t11[30]"),
     },
     {
       id: 2,
-      title: "是",
+      title: ui18n.t("tl.t11[31]"),
     },
   ],
 });
@@ -210,19 +256,19 @@ const reachList = ref({
   options: [
     {
       id: 1,
-      title: "医疗",
+      title: ui18n.t("tl.t11[32]"),
     },
     {
       id: 2,
-      title: "消防",
+      title: ui18n.t("tl.t11[33]"),
     },
     {
       id: 3,
-      title: "清障",
+      title: ui18n.t("tl.t11[34]"),
     },
     {
       id: 4,
-      title: "其他",
+      title: ui18n.t("tl.t11[35]"),
     },
   ],
 });

+ 24 - 23
src/views/tables/extract.vue

@@ -1,26 +1,27 @@
 <!--  -->
 <template>
   <div class="extract" ref="layoutRef" :class="{ downMode }" v-if="data">
-    <h2 class="title">当事人血样(尿样)提取登记表</h2>
+    <h2 class="title">{{ $t("tl.t12[0]") }}</h2>
 
     <div class="container">
       <table>
         <tr>
-          <td width="12%" colspan="2">姓名</td>
+          <td width="12%" colspan="2">{{ $t("tl.t12[1]") }}</td>
           <td width="20%">
             <div style="white-space: normal; line-height: 24px">
               <input v-model="data.name" />
               <div class="content-box">{{ data.name }}</div>
             </div>
           </td>
-          <td width="10%">性别</td>
+
+          <td width="10%">{{ $t("tl.t12[2]") }}</td>
           <td width="8%">
             <div style="white-space: normal; line-height: 24px">
               <input v-model="data.sex" />
               <div class="content-box">{{ data.sex }}</div>
             </div>
           </td>
-          <td width="20%">身份证号码</td>
+          <td width="20%">{{ $t("tl.t12[3]") }}</td>
           <td width="30%" colspan="2">
             <div style="white-space: normal; line-height: 24px">
               <input v-model="data.id" />
@@ -29,14 +30,14 @@
           </td>
         </tr>
         <tr>
-          <td width="15%" colspan="2">事故时间</td>
+          <td width="15%" colspan="2">{{ $t("tl.t12[4]") }}</td>
           <td width="35%" colspan="3">
             <div style="white-space: normal; line-height: 24px">
               <input v-model="data.time" />
               <div class="content-box">{{ data.time }}</div>
             </div>
           </td>
-          <td width="20%">地点</td>
+          <td width="20%">{{ $t("tl.t12[5]") }}</td>
           <td width="30%" colspan="2">
             <div style="white-space: normal; line-height: 24px">
               <input v-model="data.address" />
@@ -45,7 +46,7 @@
           </td>
         </tr>
         <tr>
-          <td colspan="2">血样(尿样)提取时间</td>
+          <td colspan="2">{{ $t("tl.t12[6]") }}</td>
           <td colspan="6">
             <div style="white-space: normal; line-height: 24px">
               <input v-model="data.extractTime" />
@@ -54,7 +55,7 @@
           </td>
         </tr>
         <tr>
-          <td colspan="2">血样(尿样)提取地点</td>
+          <td colspan="2">{{ $t("tl.t12[7]") }}</td>
           <td colspan="6">
             <div style="white-space: normal; line-height: 24px">
               <input v-model="data.extractAdress" />
@@ -63,16 +64,16 @@
           </td>
         </tr>
         <tr>
-          <td width="10%" rowspan="4" colspan="1">血样(尿样)提取人员填写</td>
-          <td width="5%" rowspan="3">提取登记</td>
-          <td colspan="3">A样本盛装容器编号</td>
+          <td width="10%" rowspan="4" colspan="1">{{ $t("tl.t12[8]") }}</td>
+          <td width="5%" rowspan="3">{{ $t("tl.t12[9]") }}</td>
+          <td colspan="3">{{ $t("tl.t12[10]") }}</td>
           <td>
             <div style="white-space: normal; line-height: 24px">
               <input v-model="data.aNumber" />
               <div class="content-box">{{ data.aNumber }}</div>
             </div>
           </td>
-          <td width="10%">提取量</td>
+          <td width="10%">{{ $t("tl.t12[11]") }}</td>
           <td>
             <div>
               <div style="white-space: normal; line-height: 24px">
@@ -84,14 +85,14 @@
           </td>
         </tr>
         <tr>
-          <td colspan="3">B样本盛装容器编号</td>
+          <td colspan="3">{{ $t("tl.t12[12]") }}</td>
           <td>
             <div style="white-space: normal; line-height: 24px">
               <input v-model="data.bNumber" />
               <div class="content-box">{{ data.bNumber }}</div>
             </div>
           </td>
-          <td>提取量</td>
+          <td>{{ $t("tl.t12[11]") }}</td>
           <td>
             <div>
               <div style="white-space: normal; line-height: 24px">
@@ -103,14 +104,14 @@
           </td>
         </tr>
         <tr>
-          <td colspan="1">消毒名称</td>
+          <td colspan="1">{{ $t("tl.t12[13]") }}</td>
           <td colspan="2">
             <div style="white-space: normal; line-height: 24px">
               <input v-model="data.disinfect" />
               <div class="content-box">{{ data.disinfect }}</div>
             </div>
           </td>
-          <td>密封方式</td>
+          <td>{{ $t("tl.t12[14]") }}</td>
           <td colspan="2">
             <div style="white-space: normal; line-height: 24px">
               <input v-model="data.sealing" />
@@ -119,14 +120,14 @@
           </td>
         </tr>
         <tr>
-          <td width="10%" colspan="2">提取人员单位</td>
+          <td width="10%" colspan="2">{{ $t("tl.t12[15]") }}</td>
           <td colspan="2">
             <div style="white-space: normal; line-height: 24px">
               <input v-model="data.extractUnit" />
               <div class="content-box">{{ data.extractUnit }}</div>
             </div>
           </td>
-          <td>提取人员(签名)</td>
+          <td>{{ $t("tl.t12[16]") }}</td>
           <td colspan="2">
             <div style="white-space: normal; line-height: 24px">
               <input v-model="data.extractMumber" />
@@ -135,7 +136,7 @@
           </td>
         </tr>
         <tr>
-          <td>通知家属情况</td>
+          <td>{{ $t("tl.t12[17]") }}</td>
           <td colspan="7">
             <div style="white-space: normal; line-height: 24px">
               <input v-model="data.notice" />
@@ -144,21 +145,21 @@
           </td>
         </tr>
         <tr>
-          <td>被提取人(签名)</td>
+          <td>{{ $t("tl.t12[18]") }}</td>
           <td colspan="2">
             <div style="white-space: normal; line-height: 24px">
               <input v-model="data.extractBySign" />
               <div class="content-box">{{ data.extractBySign }}</div>
             </div>
           </td>
-          <td>见证人(签名)</td>
+          <td>{{ $t("tl.t12[19]") }}</td>
           <td colspan="2">
             <div style="white-space: normal; line-height: 24px">
               <input v-model="data.witnessSign" />
               <div class="content-box">{{ data.witnessSign }}</div>
             </div>
           </td>
-          <td>交通警察(签名)</td>
+          <td>{{ $t("tl.t12[20]") }}</td>
           <td colspan="2">
             <div style="white-space: normal; line-height: 24px">
               <input v-model="data.policeSign" />
@@ -167,7 +168,7 @@
           </td>
         </tr>
         <tr>
-          <td>办案单位</td>
+          <td>{{ $t("tl.t12[21]") }}</td>
           <td colspan="7">
             <div style="white-space: normal; line-height: 24px">
               <input v-model="data.company" />

+ 34 - 28
src/views/tables/identification.vue

@@ -1,29 +1,29 @@
 <template>
   <div class="identification" :class="{ downMode }" v-if="data">
-    <h2 class="title">道路交通事故认定书(简易程序)</h2>
+    <h2 class="title">{{ $t("tl.t13[0]") }}</h2>
     <div class="num">
-      
+      {{ $t("tl.t13[1]") }}
       <div>
         <input v-model="data.id" />
         <div class="content-box">{{ data.id }}</div>
       </div>
-      
+      {{ $t("tl.t13[2]") }}
     </div>
     <div class="table-layout">
       <div class="msg-box">
-        <div class="name">事故时间</div>
+        <div class="name">{{ $t("tl.t13[3]") }}</div>
         <div class="input-box" style="flex: 1">
           <input v-model="data.time" />
           <div class="content-box">{{ data.time }}</div>
         </div>
-        <div class="weather">天气</div>
+        <div class="weather">{{ $t("tl.t13[4]") }}</div>
         <div class="input-box" style="width: 128px">
           <input v-model="data.weather" />
           <div class="content-box">{{ data.weather }}</div>
         </div>
       </div>
       <div class="msg-box">
-        <div class="name">事故地点</div>
+        <div class="name">{{ $t("tl.t13[5]") }}</div>
         <div style="flex: 1" class="input-box">
           <input v-model="data.address" />
           <div class="content-box">{{ data.address }}</div>
@@ -32,13 +32,13 @@
 
       <table>
         <tr>
-          <td>当事人</td>
-          <td>驾驶证或身份证号码</td>
-          <td>联系方式</td>
-          <td>交通方式</td>
-          <td>机动车类型、牌号</td>
-          <td>保险公司</td>
-          <td>交强险凭证号</td>
+          <td>{{ $t("tl.t13[6]") }}</td>
+          <td>{{ $t("tl.t13[7]") }}</td>
+          <td>{{ $t("tl.t13[8]") }}</td>
+          <td>{{ $t("tl.t13[9]") }}</td>
+          <td>{{ $t("tl.t13[10]") }}</td>
+          <td>{{ $t("tl.t13[11]") }}</td>
+          <td>{{ $t("tl.t13[12]") }}</td>
         </tr>
         <tr v-for="(i, index) in data.list">
           <td v-for="(j, j_index) in i">
@@ -50,26 +50,30 @@
         </tr>
       </table>
       <div class="respons">
-        <div class="name" style="width: 50px">交通事故事实及责任</div>
+        <div class="name" style="width: 50px">{{ $t("tl.t13[13]") }}</div>
         <div class="info">
-          <div style="margin-bottom: 10px" v-for="(i, index) in topList.options" @click="checkOptions(topList, index)">
+          <div
+            style="margin-bottom: 10px"
+            v-for="(i, index) in topList.options"
+            @click="checkOptions(topList, index)"
+          >
             <ui-icon :type="data.optionsOne.check == i.id ? 'rb_y' : 'rb_n'"></ui-icon>
             <span>{{ i.title }}</span>
           </div>
           <div class="sign-box" style="margin-bottom: 40px">
             <div style="flex: 1">
-              <span>当事人:</span>
+              <span>{{ $t("tl.t13[14]") }}</span>
               <div style="flex: 1">
                 <input v-model="data.optionsOne.client" />
-                <div class="content-box left" >{{ data.optionsOne.client }}</div>
+                <div class="content-box left">{{ data.optionsOne.client }}</div>
               </div>
             </div>
             <div>
-              <span>(道路交通事故处理专用章)</span>
+              <span>{{ $t("tl.t13[15]") }}</span>
             </div>
           </div>
           <div class="sign-box">
-            <span>交通警察:</span>
+            <span>{{ $t("tl.t13[16]") }}</span>
             <div style="flex: 1">
               <input v-model="data.optionsOne.police" />
               <div class="content-box left">{{ data.optionsOne.police }}</div>
@@ -78,22 +82,22 @@
         </div>
       </div>
       <div class="result">
-        <div class="name">损害赔偿调解结果</div>
+        <div class="name">{{ $t("tl.t13[17]") }}</div>
         <div class="info">
           <div class="sign-box" style="margin-bottom: 40px">
             <div style="flex: 1">
-              <span>当事人:</span>
+              <span>{{ $t("tl.t13[18]") }}</span>
               <div style="flex: 1">
                 <input v-model="data.optionsTwo.client" />
                 <div class="content-box left">{{ data.optionsTwo.client }}</div>
               </div>
             </div>
             <div>
-              <span>(道路交通事故处理专用章)</span>
+              <span>{{ $t("tl.t13[15]") }}</span>
             </div>
           </div>
           <div class="sign-box">
-            <span>交通警察:</span>
+            <span>{{ $t("tl.t13[16]") }}</span>
             <div style="flex: 1">
               <input v-model="data.optionsTwo.police" />
               <div class="content-box left">{{ data.optionsTwo.police }}</div>
@@ -104,9 +108,11 @@
     </div>
     <div style="margin-top: 10px; font-size: 18px">
       <p>
-        当事人对交通事故认定有异议的,可以自道路交通事故认定书送达之日起三日内提出书面复核申请。同一事故的复核以一次为限。损害赔偿有争议的,当事人可以申诮人民调解委员会调解,或者向人民法院提起民事诉讼。
+        {{ $t("tl.t13[19]") }}
+      </p>
+      <p style="margin-top: 10px; font-size: 18px">
+        {{ $t("tl.t13[20]") }}
       </p>
-      <p style="margin-top: 10px; font-size: 18px">注:此文书存档一份,交付各方当事人各一份。可使用无碳复写纸制作。</p>
     </div>
   </div>
 </template>
@@ -117,6 +123,7 @@ import { router } from "@/router";
 
 import { tables } from "@/store/tables";
 import { tablesInfo, setData } from "./data";
+import { ui18n } from "@/lang";
 const props = defineProps({
   downMode: { type: Boolean, default: false },
   isDownloadShow: { type: Boolean, default: false },
@@ -133,16 +140,15 @@ const topList = ref({
   options: [
     {
       id: 1,
-      title: "财产损失事故",
+      title: ui18n.t("tl.t13[21]"),
     },
     {
       id: 2,
-      title: "受伤当事人伤势轻微,各方当事人一致同意适用简易程序处理",
+      title: ui18n.t("tl.t13[22]"),
     },
   ],
 });
 
-
 const saveHandler = () => {
   return { type: "identification", data: data.value };
 };

+ 72 - 17
src/views/tables/index.vue

@@ -3,15 +3,39 @@
   <MainPanel>
     <template v-slot:header>
       <Header :title="headerTitle" :on-back="onBack" type="return">
-        <ui-button v-if="!isWrite && tableType != 'law'" style="margin-right: 16px" class="download-btn" type="null" width="96px" @click="downloadHandler"> 下载 </ui-button>
-        <ui-button v-if="tableType != 'law'" type="primary" width="96px" @click="saveHandler"> {{ isWrite ? "确定" : "保存" }} </ui-button>
+        <ui-button
+          v-if="!isWrite && tableType != 'law'"
+          style="margin-right: 16px"
+          class="download-btn"
+          type="null"
+          width="96px"
+          @click="downloadHandler"
+        >
+          {{ $t("tl.t14[0]") }}
+        </ui-button>
+        <ui-button
+          v-if="tableType != 'law'"
+          type="primary"
+          width="96px"
+          @click="saveHandler"
+        >
+          {{ isWrite ? $t("tl.t14[1]") : $t("tl.t14[2]") }}
+        </ui-button>
       </Header>
     </template>
 
     <div v-show="!isWrite" class="mySwiper" v-if="loaded">
       <div class="swiper-wrapper">
-        <div class="swiper-slide tables-item" :class="{ show: downMode }" v-for="(i, index) in eleList">
-          <div class="warpper" :class="{ downMode, 'no-padding': tableType == 'law' }" :id="`layoutRef${index}`">
+        <div
+          class="swiper-slide tables-item"
+          :class="{ show: downMode }"
+          v-for="(i, index) in eleList"
+        >
+          <div
+            class="warpper"
+            :class="{ downMode, 'no-padding': tableType == 'law' }"
+            :id="`layoutRef${index}`"
+          >
             <component
               ref="content"
               :page="askPage"
@@ -25,18 +49,48 @@
             ></component>
           </div>
 
-          <div class="warpper" v-if="downMode" :class="{ show: downMode, 'no-padding': tableType == 'law' }">
-            <component :isDownloadShow="true" :page="askPage" :pageIndex="index" :text="text" @onTextChange="onTextChange" @onTextConfirm="onTextConfirm" @goWrite="goWrite" :is="i"></component>
+          <div
+            class="warpper"
+            v-if="downMode"
+            :class="{ show: downMode, 'no-padding': tableType == 'law' }"
+          >
+            <component
+              :isDownloadShow="true"
+              :page="askPage"
+              :pageIndex="index"
+              :text="text"
+              @onTextChange="onTextChange"
+              @onTextConfirm="onTextConfirm"
+              @goWrite="goWrite"
+              :is="i"
+            ></component>
           </div>
         </div>
       </div>
     </div>
-    <Write ref="com" v-if="isWrite" :text="text" :textIndex="textIndex" @onTextConfirm="onTextConfirm"> </Write>
+    <Write
+      ref="com"
+      v-if="isWrite"
+      :text="text"
+      :textIndex="textIndex"
+      @onTextConfirm="onTextConfirm"
+    >
+    </Write>
   </MainPanel>
 </template>
 
 <script setup lang="ts">
-import { reactive, ref, watch, onMounted, nextTick, onActivated, onDeactivated, provide, watchEffect } from "vue";
+import {
+  reactive,
+  ref,
+  watch,
+  onMounted,
+  nextTick,
+  onActivated,
+  onDeactivated,
+  provide,
+  watchEffect,
+} from "vue";
 import { router } from "@/router";
 import Swiper from "swiper";
 import html2canvas from "html2canvas";
@@ -70,6 +124,7 @@ import doc from "./write/doc.vue";
 
 //法规
 import law from "./law.vue";
+import { ui18n } from "@/lang";
 // const eleList = ref([one, two, three, four]);
 // const eleList = ref([authorOne, authorTwo]);
 const com = ref(null); // 通过 模板ref 绑定子组件
@@ -181,7 +236,7 @@ const getLayoutImage = async () => {
         return canvas.toBlob(resolve, "image/jpeg", 0.95);
       });
       await downloadImage(blob, `tables_${new Date().getTime()}.jpg`);
-      Message.success({ msg: "已保存至相册", time: 2000 });
+      Message.success({ msg: ui18n.t("tl.savep"), time: 2000 });
       num++;
 
       if (num == eleList.value.length) {
@@ -199,18 +254,18 @@ const initTables = () => {
   switch (tableType.value) {
     case "explorate":
       eleList.value = [one, two, three, four];
-      headerTitle.value = "道路交通事故现场勘查笔录";
+      headerTitle.value = ui18n.t("tl.t14[3]");
       break;
     case "ask":
       eleList.value = [ask];
       if (router.currentRoute.value.query.type == "1") {
-        headerTitle.value = "询问笔录";
+        headerTitle.value = ui18n.t("tl.t14[4]");
         if (tables.value.askOne) {
           text.value = tables.value.askOne.text;
           askPage.value = tables.value.askOne.page;
         }
       } else {
-        headerTitle.value = "讯问笔录";
+        headerTitle.value = ui18n.t("tl.t14[5]");
         if (tables.value.askTwo) {
           text.value = tables.value.askTwo.text;
           askPage.value = tables.value.askTwo.page;
@@ -223,24 +278,24 @@ const initTables = () => {
       break;
     case "author":
       eleList.value = [authorOne, authorTwo];
-      headerTitle.value = "授权委托书";
+      headerTitle.value = ui18n.t("tl.t14[6]");
       break;
     case "legacy":
       eleList.value = [legacy];
-      headerTitle.value = "道路交通事故现场遗留物品清单";
+      headerTitle.value = ui18n.t("tl.t14[7]");
       break;
     case "extract":
       eleList.value = [extract];
-      headerTitle.value = "当事人血样(尿样)提取登记表";
+      headerTitle.value = ui18n.t("tl.t14[8]");
       break;
     case "identification":
       eleList.value = [identification];
-      headerTitle.value = "道路交通事故认定书(简易程序)";
+      headerTitle.value = ui18n.t("tl.t14[9]");
       break;
 
     case "law":
       eleList.value = [law];
-      headerTitle.value = "法律法规";
+      headerTitle.value = ui18n.t("tl.t14[10]");
       break;
   }
 };

+ 47 - 17
src/views/tables/legacy.vue

@@ -1,15 +1,26 @@
 <!--  -->
 <template>
   <div class="legacy" :class="{ downMode }" v-if="data">
-    <h2 class="title">道路交通事故现场遗留物品清单</h2>
+    <h2 class="title">{{ $t("tl.t15[0]") }}</h2>
     <table>
       <tr>
         <td colspan="7" style="text-align: left">
-          <div style="display: flex; align-items: center; justify-content: flex-start; height: 100%">
-            <span style="height: 100%; line-height: 60px">事故时间:</span>
+          <div
+            style="
+              display: flex;
+              align-items: center;
+              justify-content: flex-start;
+              height: 100%;
+            "
+          >
+            <span style="height: 100%; line-height: 60px">{{ $t("tl.t15[1]") }}:</span>
             <div style="height: 100%; flex: 1" class="input-box">
               <div class="content-box">{{ data.accidentTime }}</div>
-              <input type="text" style="width: 100%; height: 100%" v-model="data.accidentTime" />
+              <input
+                type="text"
+                style="width: 100%; height: 100%"
+                v-model="data.accidentTime"
+              />
             </div>
           </div>
         </td>
@@ -17,23 +28,34 @@
 
       <tr>
         <td colspan="7" style="text-align: left">
-          <div style="display: flex; align-items: center; justify-content: flex-start; height: 100%">
-            <span style="height: 100%; line-height: 60px">事故地点:</span>
+          <div
+            style="
+              display: flex;
+              align-items: center;
+              justify-content: flex-start;
+              height: 100%;
+            "
+          >
+            <span style="height: 100%; line-height: 60px">{{ $t("tl.t15[3]") }}:</span>
             <div style="height: 100%; flex: 1" class="input-box">
               <div class="content-box">{{ data.accidentAddress }}</div>
-              <input type="text" style="width: 100%; height: 100%" v-model="data.accidentAddress" />
+              <input
+                type="text"
+                style="width: 100%; height: 100%"
+                v-model="data.accidentAddress"
+              />
             </div>
           </div>
         </td>
       </tr>
       <tr>
-        <td>编号</td>
-        <td>物品名称</td>
-        <td>数量</td>
-        <td>特征</td>
-        <td>领取人签名</td>
-        <td>领取时间</td>
-        <td>备注</td>
+        <td>{{ $t("tl.t15[3]") }}</td>
+        <td>{{ $t("tl.t15[4]") }}</td>
+        <td>{{ $t("tl.t15[5]") }}</td>
+        <td>{{ $t("tl.t15[6]") }}</td>
+        <td>{{ $t("tl.t15[7]") }}</td>
+        <td>{{ $t("tl.t15[8]") }}</td>
+        <td>{{ $t("tl.t15[9]") }}</td>
       </tr>
       <tr v-for="(i, index) in data.list">
         <td v-for="(j, j_index) in i">
@@ -48,14 +70,14 @@
     </table>
     <div class="sign-box">
       <div>
-        <span>当事人签名:</span>
+        <span>{{ $t("tl.t15[10]") }}</span>
         <div>
           <input type="text" v-model="data.partySign" />
           <div class="content-box left">{{ data.partySign }}</div>
         </div>
       </div>
       <div>
-        <span>交通警察(签名):</span>
+        <span>{{ $t("tl.t15[11]") }}</span>
         <div>
           <input type="text" v-model="data.policeSign" />
           <div class="content-box left">{{ data.policeSign }}</div>
@@ -66,7 +88,15 @@
 </template>
 
 <script setup>
-import { reactive, ref, toRefs, onBeforeMount, onMounted, nextTick, defineProps } from "vue";
+import {
+  reactive,
+  ref,
+  toRefs,
+  onBeforeMount,
+  onMounted,
+  nextTick,
+  defineProps,
+} from "vue";
 import { genUseLoading } from "@/hook";
 import UiInput from "@/components/base/components/input/index.vue";
 import { tables } from "@/store/tables";

+ 28 - 8
src/views/tables/write/doc.vue

@@ -1,25 +1,36 @@
 <!--  -->
 <template>
   <div class="num-box">
-    <span></span>
+    <span>{{ $t("tl.t6[0]") }}</span>
     <div class="input-box">{{ pageIndex + 1 }}</div>
-    <span style="margin-right: 30px">页</span> <span>共</span>
+    <span style="margin-right: 30px">{{ $t("tl.t6[1]") }}</span>
+    <span>{{ $t("tl.t6[3]") }}</span>
     <div class="input-box">{{ page }}</div>
-    <span></span>
+    <span>{{ $t("tl.t6[1]") }}</span>
   </div>
 
   <div class="write-box" id="view-container">
     <div class="content" :style="`height:${inputHeight}px;`" @click="goWrite">
       <!-- <div contenteditable v-html="text" :style="`height:${lineCount * 40}px;`" @keydown="hanlderWrite($event)" id="view-info"></div> -->
-      <div :style="`transform:translateY(${pageIndex == 1 ? -400 : -400 - (pageIndex - 1) * inputHeight}px);`" id="view-info" v-html="text"></div>
+      <div
+        :style="`transform:translateY(${
+          pageIndex == 1 ? -400 : -400 - (pageIndex - 1) * inputHeight
+        }px);`"
+        id="view-info"
+        v-html="text"
+      ></div>
       <div class="msg-box">{{ text }}</div>
-      <div class="item" :style="`top:${index * 40}px;`" v-for="(i, index) in lineCount"></div>
+      <div
+        class="item"
+        :style="`top:${index * 40}px;`"
+        v-for="(i, index) in lineCount"
+      ></div>
     </div>
   </div>
 
   <div class="bottom-name" :class="{ downMode }" v-if="data">
-    <span v-if="type == '1'">被询问人:</span>
-    <span v-else>被讯问人:</span>
+    <span v-if="type == '1'">{{ $t("tl.t6[27]") }}</span>
+    <span v-else>{{ $t("tl.t6[28]") }}</span>
     <div style="flex: 1">
       <input type="text" v-model="data.askerBys" />
       <div class="content-box left">{{ data.askerBys }}</div>
@@ -28,7 +39,16 @@
 </template>
 
 <script setup>
-import { reactive, ref, toRefs, onBeforeMount, onMounted, nextTick, defineProps, defineEmits } from "vue";
+import {
+  reactive,
+  ref,
+  toRefs,
+  onBeforeMount,
+  onMounted,
+  nextTick,
+  defineProps,
+  defineEmits,
+} from "vue";
 import { router } from "@/router";
 import { tables } from "@/store/tables";
 import { tablesInfo, setData } from "../data";