gemercheung 5 месяцев назад
Родитель
Сommit
4de7855334
10 измененных файлов с 3005 добавлено и 1306 удалено
  1. 2 1
      package.json
  2. 1726 1301
      pnpm-lock.yaml
  3. 5 3
      src/lang/index.ts
  4. 312 0
      src/lang/weblate/en.json
  5. 1 0
      src/lang/weblate/ja.json
  6. 289 0
      src/lang/weblate/kr.json
  7. 312 0
      src/lang/weblate/zh.json
  8. 312 0
      src/lang/zh.json
  9. 1 1
      src/lang/zh.ts
  10. 45 0
      translate.js

+ 2 - 1
package.json

@@ -8,7 +8,8 @@
     "lang": "vite ./ lang",
     "build": "vite build",
     "build-offline": " vite build ./ offline",
-    "preview": "vite preview"
+    "preview": "vite preview",
+    "translate": "node translate.js"
   },
   "dependencies": {
     "@ant-design/icons-vue": "^7.0.1",

Разница между файлами не показана из-за своего большого размера
+ 1726 - 1301
pnpm-lock.yaml


+ 5 - 3
src/lang/index.ts

@@ -2,14 +2,16 @@ import { createI18n, I18n as BaseI18n } from 'vue-i18n'
 import { App, WritableComputedRef } from 'vue'
 import { localGetFactory, localSetFactory } from '@/utils/store'
 import { paramsToStr, strToParams } from '@/utils/params'
-import zh from './zh'
-import en from './en'
-
+import zh from './weblate/zh.json'
+import en from './weblate/en.json'
+import ja from './weblate/ja.json'
+import kr from './weblate/kr.json'
 // 语言支持
 export enum langNameEum {
   zh = 'zh',
   en = 'en',
 }
+console.log('en', JSON.stringify(en))
 
 export const langNameDescs = {
   [langNameEum.zh]: '中文',

+ 312 - 0
src/lang/weblate/en.json

@@ -0,0 +1,312 @@
+{
+    "resCode": {
+        "0": "Request successful",
+        "4008": "token has expired",
+        "4010": "You do not have access permission"
+    },
+    "sys": {
+        "download": "Download",
+        "rename": "Rename",
+        "404Page": "The resource does not exist or has been deleted",
+        "errPage": "Error page",
+        "quit": "Exit",
+        "upload": {
+            "place1": "Upload file",
+            "maxLen": "The number should not exceed {maxLen}",
+            "previewErr": "Preview loading failed!",
+            "sizeErr": "The size of {name} exceeds {sizeStr}",
+            "scaleErr": "The scaled part of {name} is not {scale}",
+            "accept": "Supports {accept} formats,",
+            "normalizeScale": "Width-to-height ratio {scale}",
+            "maxSize": "Maximum size {sizeStr}.",
+            "rep": "Replace",
+            "accErr": "Format error",
+            "conAdd": "Continue adding",
+            "lenErr": "Only a maximum of {maxLen} files are supported!",
+            "accSuperErr": "Only supports file in {accept} format."
+        },
+        "placeInput": "Please enter",
+        "placeSelect": "Please select",
+        "placPWD": "Please enter the password!",
+        "search": "Search",
+        "all": "All",
+        "create": "Create",
+        "add": "Add",
+        "edit": "Edit",
+        "unSaveMsg": "You have unsaved changes. Are you sure you want to exit?",
+        "list": "Data list",
+        "delConfrm": "Are you sure you want to delete this data?",
+        "del": "Delete",
+        "undata": "No results",
+        "save": "Save",
+        "ok": "I understand",
+        "unSearchData": "No search results found",
+        "addData": "Add data",
+        "serviceErr": "An error occurred with the service. Please try again later.",
+        "crop": "Crop",
+        "other": "Other",
+        "tip": "Prompt",
+        "cropIng": "Cropping in progress",
+        "tranCropImg": "Please upload the cropped image.",
+        "imgLoadErr": "Failed to load image",
+        "enter": "Confirm",
+        "cancel": "Cancel",
+        "unSearch": "No results found",
+        "unSelect": "No options available",
+        "jsError": "Insufficient memory. Please avoid opening multiple pages or applications simultaneously. Try restarting your browser and reopening the content.",
+        "viewPWD": "Access password",
+        "pwdErr": "Incorrect password, please try again."
+    },
+    "material": {
+        "up": "Upload from Media Library",
+        "uploadIng": "Uploading...",
+        "uploadErr": "Upload failed",
+        "uploadSuccess": "Upload successful",
+        "search": "Search by name",
+        "name": "Media Library",
+        "selectCount": "Selected data",
+        "tabs": {
+            "action": "Operation",
+            "format": "Format",
+            "status": "Status",
+            "name": "Name",
+            "size": "Size",
+            "group": "Group"
+        },
+        "selectErr": "A maximum of {count} items can be selected"
+    },
+    "guide": {
+        "name": "Path",
+        "defTitle": "Path {num}",
+        "nameErr": "Path name cannot be empty",
+        "modelErr": "The model where the path is located has been deleted and cannot be played.",
+        "pErr": "The number of path points cannot be fewer than two.",
+        "pathName": "Rout({count})",
+        "path": {
+            "title": "Path name",
+            "showDirection": "Path arrow",
+            "lineWidth": "Path thickness",
+            "lineColor": "Path color",
+            "name": "Route",
+            "preview": "Preview path",
+            "pointDesc": "Description",
+            "fontSize": "Font size",
+            "applyConfirm": "Are you sure you want to apply this attribute to all locations?",
+            "reverseDirection": "Reverse arrow",
+            "pointTitle": "Edit point",
+            "visibilityRange": "Visible range",
+            "globalVisibility": "All range visible",
+            "stop": "Stop"
+        },
+        "guide": {
+            "undata": "No navigation available",
+            "add": "Add viewpoint",
+            "clear": "Clear the view",
+            "time": "Video duration",
+            "name": "Guided tour",
+            "delConfirm": "Are you sure you want to delete this view?",
+            "clearConfirm": "Are you sure you want to clear the view?",
+            "unItems": "Unable to save empty path guide tour!"
+        },
+        "guideName": "Guided tour ({count})"
+    },
+    "measure": {
+        "free": {
+            "unit": "Length",
+            "desc": "Free"
+        },
+        "vertical": {
+            "unit": "Length",
+            "desc": "Vertical"
+        },
+        "area": {
+            "desc": "Area",
+            "unit": "Area"
+        },
+        "name": "Measurement",
+        "list": "Measurement list",
+        "nameErr": "Measurement name cannot be empty"
+    },
+    "tagging": {
+        "tabs": {
+            "part": "Residual area",
+            "principal": "Extractor",
+            "method": "Extraction Method",
+            "typeId": "Feature description"
+        },
+        "type": {
+            "3": "Footprint",
+            "2": "Handprint",
+            "7": "Physical evidence",
+            "1": "Trace",
+            "4": "Bloodstain ",
+            "6": "Other",
+            "5": "Body"
+        },
+        "plcTitle": "Please enter the tag title",
+        "plcPart": "Residual area:",
+        "mic": "Music",
+        "pleMedia": "Upload image/video",
+        "styleErr": "Please select an icon style!",
+        "posTabs": {
+            "typeVal": [
+                "Hover",
+                "Attach to Floor/Wall"
+            ],
+            "fontSize": "Font size",
+            "rotation": "Rotate icon",
+            "scale": "Icon size",
+            "type": "Icon placement method",
+            "visibilityRange": "Visible range",
+            "globalVisibility": "All range visible",
+            "lineHeight": "Wire height"
+        },
+        "name": "Tag",
+        "list": "Tag list",
+        "style": "Icon style",
+        "plcType": "Description:",
+        "plcPrincipal": "Extractor:",
+        "plcMethod": "Extraction method:",
+        "titleFex": "Title pinned",
+        "plcType1": "Feature description:",
+        "micPlc": "Supports mp3/wav formats, ≤ 30MB",
+        "plcMedia1": "Supports JPG, PNG, MP4, and other formats, with a single file size not exceeding 100MB, and a maximum of 10 files allowed for upload.",
+        "titleErr": "Tag title is required!",
+        "media": "Image/Video",
+        "pos": "Place",
+        "plcPos": "Placement location",
+        "applyConfirm": "Are you sure you want to apply this attribute to all locations?",
+        "posName": "Location",
+        "apply": "Apply to all",
+        "posErr": "Unable to add current location",
+        "posTip": "Click on the model to select the tag position."
+    },
+    "scene": {
+        "typeRaws": {
+            "0": "Mesh Scene",
+            "1": "Mesh Scene",
+            "4": "Mesh Scene",
+            "6": "Mesh Scene",
+            "7": "Mesh Scene",
+            "2": "Point cloud scene",
+            "5": "Point cloud scene"
+        },
+        "add": "Add scene",
+        "tabs": {
+            "name": "Name",
+            "createTime": "Capture/Creation Time",
+            "type": "Type"
+        },
+        "list": "Scene list",
+        "manage": "Scene management",
+        "types": {
+            "5": "4DKanKan Meta/Point cloud",
+            "4": "4DKanKan Mega/Mesh",
+            "2": "4DKanKan Mega/Point cloud",
+            "0": "4DKanKan Pro/Mesh",
+            "1": "4DKanKan Minion/Mesh",
+            "3": "Media Library",
+            "6": "4DKanKan Meta/Mesh",
+            "7": "π/Mesh"
+        }
+    },
+    "fuse": {
+        "model": "3D model",
+        "registration": "Registration",
+        "len": "Length",
+        "selectTip": "Please select two points to mark a known length, and enter the actual length",
+        "opacity1": "Transparency",
+        "reSelect": "Reselect points",
+        "join": "Stitching",
+        "unModel": "Model does not exist!",
+        "label": "Merge scene",
+        "name": "Multi-convergence",
+        "dataTime": "Capture Time",
+        "dataSize": "Data size",
+        "dataQue": "Data source",
+        "repScale": "Uniform scaling",
+        "sync": "Simultaneous screen inspection",
+        "pano": "Panorama",
+        "syncErr": "Property viewing is only supported for {types} types of scenes. Please add this type of scene.",
+        "flip": "Rotate",
+        "opacity": "Model opacity",
+        "defConfirm": "Are you sure you want to restore to default? This action cannot be undone.",
+        "move": "Move",
+        "setScale": "Set scale",
+        "def": "Restore default",
+        "hre": "Please adjust the vertical position within the current window.",
+        "vre": "Please adjust the horizontal position within the current window."
+    },
+    "security": {
+        "name": "Security"
+    },
+    "floder": {
+        "name": "Case file",
+        "record": "Inspection Record",
+        "extractList": "Extraction List",
+        "photo": "Photo roll"
+    },
+    "view": {
+        "vName": "View",
+        "name": "View extraction",
+        "defName": "View{num}",
+        "nameErr": "View name cannot be empty",
+        "all": "All views"
+    },
+    "setting": {
+        "backs": [
+            "N/A",
+            "Map",
+            "Blue sky and white clouds",
+            "The sky is overcast with dark clouds.",
+            "Nighty sky",
+            "Evening"
+        ],
+        "name": "Setting",
+        "back": "Set sky",
+        "initView": "Initial Screen"
+    },
+    "record": {
+        "tag": "Tag",
+        "delConfirm": "Are you sure you want to delete this video?",
+        "nameErr": "Video name cannot be empty",
+        "defName": "Tutorial video{num}",
+        "list": "All videos",
+        "start": "Start recording",
+        "name": "Screen recording",
+        "vName": "Screen recording",
+        "con": "Continue recording",
+        "merge": "Merge videos",
+        "backHandler": "The backend is processing.",
+        "sizeErr": "The size limit has been exceeded, and recording cannot continue. You can save and resume recording!"
+    },
+    "case": {
+        "yv": "Yes",
+        "name": "Case information",
+        "sn": "Case name",
+        "summary": "Case summary",
+        "tmName": "Inspection information",
+        "cols": {
+            "criminalCase": "Is it a criminal case?",
+            "homicideCase": "Is it a homicide case?",
+            "caseTitle": "Case name",
+            "caseCategory": "Case category",
+            "caseRegion": "Incident area",
+            "crimeTime": "Incident time",
+            "caseNum": "Case number",
+            "caseAddress": "Incident location",
+            "latAndLong": "Latitude and Longitude"
+        },
+        "nv": "No",
+        "tmCols": {
+            "alarmName": "Reporter",
+            "alarmTime": "Report Time",
+            "commandTime": "Command Center Phone Hours",
+            "assignDept": "Assigned/Reporting Unit",
+            "inquestDept": "On-site inspection unit",
+            "assignType": "Assignment Method",
+            "inquestAddress": "Inspection location",
+            "times": "Inspection time"
+        }
+    }
+}

+ 1 - 0
src/lang/weblate/ja.json

@@ -0,0 +1 @@
+{}

+ 289 - 0
src/lang/weblate/kr.json

@@ -0,0 +1,289 @@
+{
+    "resCode": {
+        "0": "요청이 성공했습니다",
+        "4008": "token만료되었습니다",
+        "4010": "당신은 접근 권한이 없습니다"
+    },
+    "floder": {
+        "name": "접수된 서류",
+        "record": "감문 비록",
+        "extractList": "추출 목록",
+        "photo": "사진을 권으로 만드는 작업"
+    },
+    "security": {
+        "name": "안전 방범"
+    },
+    "sys": {
+        "search": "수색하다",
+        "download": "다운로드",
+        "all": "전부",
+        "create": "만들다",
+        "unSaveMsg": "저장하지 않은 작업이 있습니다. 정말로 나가시겠습니까?",
+        "add": "새로 추가하다",
+        "edit": "편집하다",
+        "404Page": "자원이 존재하지 않거나 이미 삭제되었습니다",
+        "del": "삭제하다",
+        "list": "데이터 목록",
+        "delConfrm": "이 데이터를 정말로 삭제하시겠습니까?",
+        "save": "저장",
+        "undata": "아직 결과가 없습니다",
+        "ok": "알겠습니다",
+        "unSearchData": "검색 결과가 아직 없습니다",
+        "addData": "데이터 추가",
+        "other": "기타",
+        "serviceErr": "서비스에 이상이 발생했습니다. 잠시 후에 다시 시도해 주세요",
+        "crop": "자르다",
+        "imgLoadErr": "이미지 로딩에 실패했습니다",
+        "cropIng": "자르고 있습니다",
+        "tranCropImg": "잘라낸 사진을 전송해 주세요",
+        "upload": {
+            "place1": "파일 업로드",
+            "maxSize": "크기는 {sizeStr}을(를) 초과하지 않습니다,",
+            "normalizeScale": "가로세로 비율 {scale}입니다,",
+            "accept": "{accept} 등의 형식을 지원합니다",
+            "maxLen": "개수는 {maxLen}개를 초과하지 않습니다",
+            "rep": "바꾸다",
+            "accErr": "서식 오",
+            "conAdd": "계속 추가하다",
+            "sizeErr": "{name}의 크기가 {sizeStr}를 초과했습니다",
+            "scaleErr": "{name}의 비율 부위는 {scale}이 아닙니다",
+            "accSuperErr": "{accept} 형식의 파일만 지원합니다",
+            "lenErr": "최대 {maxLen}개의 파일만 지원됩니다!"
+        },
+        "cancel": "취소하다",
+        "tip": "힌트",
+        "enter": "확정하다",
+        "unSearch": "검색 결과가 없다",
+        "unSelect": "아직 옵션이 없습니다",
+        "placeInput": "입력해 주세요",
+        "placeSelect": "선택해 주세요",
+        "jsError": "메모리가 부족합니다. 여러 페이지나 애플리케이션을 동시에 열지 마시고, 브라우저를 재시작한 후 다시 열어보십시오.",
+        "pwdErr": "비밀번호가 틀렸습니다. 다시 입력해 주세요.",
+        "viewPWD": "액세스 비밀번호",
+        "placPWD": "비밀번호를 입력해 주세요"
+    },
+    "material": {
+        "up": "+미디어 라이브러리에서 업로드",
+        "uploadErr": "업로드 실패",
+        "uploadSuccess": "업로드 성공",
+        "name": "미디어 라이브러리",
+        "selectCount": "이미 선택된 데이터입니다",
+        "uploadIng": "업로드 중입니다",
+        "tabs": {
+            "group": "분류하다",
+            "name": "명칭",
+            "size": "크기",
+            "action": "조작하다",
+            "format": "서식",
+            "status": "상태"
+        },
+        "selectErr": "최대 {count}항목을 선택하세요"
+    },
+    "view": {
+        "name": "뷰 추출",
+        "all": "전체 뷰",
+        "vName": "뷰",
+        "defName": "뷰 {num}",
+        "nameErr": "뷰 이름은 비어 있을 수 없습니다"
+    },
+    "guide": {
+        "name": "경로",
+        "defTitle": "경로{num}",
+        "nameErr": "경로 이름은 비어 있을 수 없습니다",
+        "modelErr": "경로가 있는 모델이 삭제되어 재생할 수 없습니다",
+        "guide": {
+            "name": "가이드",
+            "add": "시각 추가",
+            "clear": "화면 지우기",
+            "time": "동영상 길이",
+            "unItems": "빈 경로 가이드를 저장할 수 없습니다!",
+            "undata": "아직 안내가 없습니다",
+            "delConfirm": "이 화면을 정말로 삭제하시겠습니까?",
+            "clearConfirm": "화면을 정말로 비우시겠습니까?"
+        },
+        "guideName": "가이드({count})",
+        "pErr": "경로 지점은 두 개 미만이 될 수 없습니다",
+        "path": {
+            "title": "경로 이름",
+            "showDirection": "경로 화살표",
+            "stop": "정지",
+            "globalVisibility": "전체 범위가 시야에 들어옵니다",
+            "visibilityRange": "시야 범위",
+            "pointDesc": "설명하다",
+            "fontSize": "글자 크기",
+            "applyConfirm": "이 속성을 모든 위치에 적용하시겠습니까?",
+            "reverseDirection": "화살표 방향을 반대로 하다",
+            "pointTitle": "편집하다"
+        }
+    },
+    "measure": {
+        "vertical": {
+            "desc": "수직"
+        },
+        "name": "측정하다",
+        "list": "측정 목록",
+        "free": {
+            "desc": "자유"
+        },
+        "nameErr": "측정 명칭은 공란이 될 수 없습니다"
+    },
+    "setting": {
+        "backs": [
+            "없다",
+            "지도",
+            "푸른 하늘과 흰 구름",
+            "흑운이 몰려 있다",
+            "밤하늘",
+            "저녁"
+        ],
+        "initView": "초기 화면",
+        "name": "설정하다",
+        "back": "하늘을 설정하다"
+    },
+    "record": {
+        "list": "전체 영상",
+        "name": "화면 녹화",
+        "start": "녹화를 시작합니다",
+        "vName": "화면 녹화하다",
+        "tag": "태그",
+        "delConfirm": "비디오를 정말로 삭제하시겠습니까?",
+        "nameErr": "동영상 이름은 비어 있을 수 없습니다",
+        "defName": "설명 동영상 {num}",
+        "merge": "비디오 합치기",
+        "backHandler": "백그라운드에서 처리 중입니다",
+        "sizeErr": "제한 크기를 이미 초과하여 계속 녹화할 수 없습니다. 저장한 후에 다시 녹화할 수 있습니다!",
+        "con": "녹화를 계속하다"
+    },
+    "case": {
+        "tmName": "감문 정보",
+        "name": "사건 정보",
+        "sn": "사건 명칭",
+        "summary": "사건 개요",
+        "nv": "거절",
+        "yv": "예",
+        "cols": {
+            "criminalCase": "형사 사건인지 아닌지",
+            "homicideCase": "살인 사건인지 아닌지",
+            "caseTitle": "사건 명칭",
+            "caseCategory": "사건 유형",
+            "crimeTime": "사건 발생 시간",
+            "caseNum": "입안 번호",
+            "caseRegion": "사건 발생 지역",
+            "caseAddress": "사건 발생 장소",
+            "latAndLong": "경위도"
+        },
+        "tmCols": {
+            "alarmName": "경보 신고자",
+            "alarmTime": "경보 신고 시간",
+            "commandTime": "지휘 센터 전화 시간",
+            "assignDept": "지정/보고 단위",
+            "inquestDept": "현장 감안 단위",
+            "inquestAddress": "감문 장소",
+            "times": "감문 시간",
+            "assignType": "지정 방식"
+        }
+    },
+    "tagging": {
+        "tabs": {
+            "method": "추출 방법",
+            "typeId": "특징 기술",
+            "principal": "추출자"
+        },
+        "name": "태그",
+        "list": "태그 목록",
+        "type": {
+            "6": "기타",
+            "5": "시체",
+            "2": "손인장",
+            "7": "물증",
+            "1": "흔적",
+            "4": "피 흔적 ",
+            "3": "발자국"
+        },
+        "style": "아이콘 스타일",
+        "plcType": "묘사:",
+        "plcPrincipal": "추출자:",
+        "plcMethod": "추출 방법:",
+        "titleFex": "제목이 상주됩니다",
+        "plcType1": "특징 기술:",
+        "plcTitle": "라벨 제목을 입력해 주세요",
+        "pleMedia": "사진/비디오 업로드",
+        "media": "이미지/비디오",
+        "micPlc": "mp3/wav 형식을 지원하며, 30MB 이하입니다",
+        "plcMedia1": "JPG, PNG, MP4 등의 형식을 지원하며, 개별 파일 크기는 100MB를 넘을 수 없으며, 최대 10장까지 업로드할 수 있습니다.",
+        "titleErr": "태그 제목은 필수로 기입해야 합니다!",
+        "styleErr": "아이콘 스타일을 선택해 주세요",
+        "posName": "위치",
+        "apply": "전체에 적용하다",
+        "posErr": "현재 위치에서는 추가할 수 없습니다",
+        "pos": "놓다",
+        "plcPos": "놓는 위치",
+        "applyConfirm": "이 속성을 모든 위치에 적용하시겠습니까?",
+        "posTabs": {
+            "scale": "아이콘 크기",
+            "type": "아이콘 배치 방법",
+            "typeVal": [
+                "부유하다",
+                "땅/벽에 붙이다"
+            ],
+            "fontSize": "글자 크기",
+            "rotation": "회전 아이콘",
+            "globalVisibility": "전체 범위가 시야에 들어옵니다",
+            "visibilityRange": "시야 범위",
+            "lineHeight": "리드 높이"
+        },
+        "posTip": "모델 위에서 클릭하여 라벨 위치를 선택해 주세요"
+    },
+    "scene": {
+        "list": "장면 목록",
+        "manage": "장면 관리",
+        "add": "시나리오 추가 或 장면 추가",
+        "typeRaws": {
+            "0": "Mesh장면",
+            "1": "Mesh장면",
+            "4": "Mesh장면",
+            "2": "점운 시나리오",
+            "5": "점운 시나리오",
+            "6": "Mesh장면",
+            "7": "Mesh장면"
+        },
+        "tabs": {
+            "name": "명칭",
+            "createTime": "촬영/생성 시간",
+            "type": "유형"
+        },
+        "types": {
+            "4": "4D KANKAN MEGA/Mesh",
+            "2": "4D KANKAN MEGA/점 클라우드",
+            "0": "4D KANKAN PRO/Mesh",
+            "1": "4D KANKAN MINION/Mesh",
+            "3": "미디어 라이브러리",
+            "6": "4D KANKAN META/Mesh",
+            "5": "4D KANKAN META/점 클라우드",
+            "7": "원주율/Mesh"
+        }
+    },
+    "fuse": {
+        "name": "다원 융합",
+        "join": "잇다",
+        "unModel": "모델이 존재하지 않습니다!",
+        "label": "융합 시나리오",
+        "model": "3차원 모델",
+        "pano": "전경도",
+        "sync": "동시 화면 감문",
+        "syncErr": "방문 보기는 {types} 유형의 장면만 지원합니다. 이 유형의 장면을 추가해 주세요.",
+        "dataTime": "촬영 시간",
+        "dataSize": "데이터 크기",
+        "dataQue": "데이터 소스",
+        "repScale": "등비 스케일링",
+        "def": "기본값으로 복원하다",
+        "flip": "회전하다",
+        "opacity": "모델 불투명도",
+        "defConfirm": "기본 설정으로 복구하시겠습니까? 이 작업은 철회할 수 없습니다",
+        "move": "이동",
+        "setScale": "비율을 설정하다",
+        "hre": "현재 창에서 수직 방향 위치를 조정해 주세요",
+        "vre": "현재 창에서 수평 방향 위치를 조정해 주세요",
+        "selectTip": "두 지점을 선택하여 알려진 길이를 표시하고, 실제 길이를 입력해 주세요"
+    }
+}

+ 312 - 0
src/lang/weblate/zh.json

@@ -0,0 +1,312 @@
+{
+    "resCode": {
+        "0": "请求成功",
+        "4008": "token已失效",
+        "4010": "您没有访问权限"
+    },
+    "security": {
+        "name": "安防"
+    },
+    "floder": {
+        "name": "卷宗",
+        "record": "勘验笔录",
+        "extractList": "提取清单",
+        "photo": "照片制卷"
+    },
+    "sys": {
+        "search": "搜索",
+        "all": "全部",
+        "download": "下载",
+        "create": "创建",
+        "rename": "重命名",
+        "edit": "编辑",
+        "add": "新增",
+        "unSaveMsg": "您有操作未保存,确定要退出吗?",
+        "404Page": "资源不存在或已删除",
+        "errPage": "错误页面",
+        "list": "数据列表",
+        "delConfrm": "确定要删除此数据吗?",
+        "del": "删除",
+        "quit": "退出",
+        "save": "保存",
+        "undata": "暂无结果",
+        "unSearchData": "暂无搜索结果",
+        "addData": "添加数据",
+        "ok": "我知道了",
+        "serviceErr": "服务出现异常,请稍后再试",
+        "other": "其他",
+        "crop": "裁剪",
+        "imgLoadErr": "图片加载失败",
+        "tranCropImg": "请传入裁剪图片",
+        "cropIng": "正在裁剪",
+        "tip": "提示",
+        "enter": "确定",
+        "cancel": "取消",
+        "upload": {
+            "place1": "上传文件",
+            "accept": "支持 {accept} 等格式,",
+            "normalizeScale": "宽*高比例 {scale},",
+            "maxSize": "大小不超过 {sizeStr},",
+            "maxLen": "个数不超过 {maxLen}个",
+            "conAdd": "继续添加",
+            "rep": "替换",
+            "previewErr": "预览加载失败!",
+            "accErr": "格式错误",
+            "accSuperErr": "仅支持{accept}格式文件",
+            "scaleErr": "{name}的比例部位不为{scale}",
+            "sizeErr": "{name}的大小超过{sizeStr}",
+            "lenErr": "最多仅支持{maxLen}个文件!"
+        },
+        "placeInput": "请输入",
+        "placeSelect": "请选择",
+        "unSelect": "暂无选项",
+        "unSearch": "无搜索结果",
+        "jsError": "内存不足,请勿同时打开多个页面或应用程序,尝试重启浏览器后重新打开。",
+        "viewPWD": "访问密码",
+        "placPWD": "请输入密码!",
+        "pwdErr": "密码错误,请重新输入。"
+    },
+    "material": {
+        "name": "媒体库",
+        "selectCount": "已选择数据",
+        "search": "输入名称搜索",
+        "uploadSuccess": "上传成功",
+        "uploadErr": "上传失败",
+        "up": "+从媒体库上传",
+        "uploadIng": "上传中",
+        "selectErr": "最多选择{count}项",
+        "tabs": {
+            "name": "名称",
+            "format": "格式",
+            "size": "大小",
+            "status": "状态",
+            "group": "分组",
+            "action": "操作"
+        }
+    },
+    "view": {
+        "name": "视图提取",
+        "vName": "视图",
+        "defName": "视图 {num}",
+        "nameErr": "视图名称不可为空",
+        "all": "全部视图"
+    },
+    "guide": {
+        "name": "路径",
+        "modelErr": "路径所在模型被删除,无法播放",
+        "defTitle": "路径{num}",
+        "nameErr": "路径名称不可为空",
+        "pErr": "路径点不可少于两个",
+        "pathName": "路线({count})",
+        "guideName": "导览({count})",
+        "guide": {
+            "name": "导览",
+            "add": "添加视角",
+            "time": "视频时长",
+            "clear": "清空画面",
+            "undata": "暂无导览",
+            "unItems": "无法保存空路径导览!",
+            "delConfirm": "确定要删除此画面吗?",
+            "clearConfirm": "确定要清空画面吗?"
+        },
+        "path": {
+            "name": "路线",
+            "title": "路径名称",
+            "lineWidth": "路径粗细",
+            "lineColor": "路径颜色",
+            "showDirection": "路径箭头",
+            "reverseDirection": "箭头反向",
+            "fontSize": "文字大小",
+            "visibilityRange": "可见范围",
+            "preview": "预览路径",
+            "stop": "停止",
+            "pointTitle": "编辑点",
+            "pointDesc": "描述",
+            "globalVisibility": "全部范围可视",
+            "applyConfirm": "确定要将此属性应用到所有位置?"
+        }
+    },
+    "measure": {
+        "list": "测量列表",
+        "name": "测量",
+        "area": {
+            "desc": "面积",
+            "unit": "面积"
+        },
+        "free": {
+            "desc": "自由",
+            "unit": "长度"
+        },
+        "vertical": {
+            "desc": "垂直",
+            "unit": "长度"
+        },
+        "nameErr": "测量名称不可为空"
+    },
+    "setting": {
+        "name": "设置",
+        "initView": "初始画面",
+        "back": "设置天空",
+        "backs": [
+            "无",
+            "地图",
+            "蓝天白云",
+            "乌云密布",
+            "夜空",
+            "傍晚"
+        ]
+    },
+    "record": {
+        "name": "屏幕录制",
+        "vName": "录屏",
+        "defName": "讲解视频{num}",
+        "nameErr": "视频名称不可为空",
+        "start": "开始录制",
+        "list": "全部视频",
+        "delConfirm": "确定要删除视频吗?",
+        "tag": "标签",
+        "merge": "合并视频",
+        "con": "继续录制",
+        "sizeErr": "已超出限制大小无法继续录制,可保存后继续录制!",
+        "backHandler": "后台正在处理"
+    },
+    "case": {
+        "name": "案件信息",
+        "tmName": "勘验信息",
+        "sn": "案件名称",
+        "summary": "案件概要",
+        "yv": "是",
+        "nv": "否",
+        "cols": {
+            "caseTitle": "案件名称",
+            "caseNum": "立案编号",
+            "caseCategory": "案件类别",
+            "crimeTime": "案发时间",
+            "homicideCase": "是否命案",
+            "caseRegion": "案发区域",
+            "criminalCase": "是否刑案",
+            "caseAddress": "案发地点",
+            "latAndLong": "经纬度"
+        },
+        "tmCols": {
+            "commandTime": "指挥中心电话时间",
+            "alarmTime": "报警时间",
+            "alarmName": "报警人",
+            "assignDept": "指派/报告单位",
+            "inquestDept": "现场勘验单位",
+            "assignType": "指派方式",
+            "inquestAddress": "勘验地点",
+            "times": "勘验时间"
+        }
+    },
+    "tagging": {
+        "list": "标签列表",
+        "name": "标签",
+        "tabs": {
+            "typeId": "特征描述",
+            "part": "遗留部位",
+            "method": "提取方法",
+            "principal": "提取人"
+        },
+        "style": "图标样式",
+        "type": {
+            "1": "痕迹",
+            "2": "手印",
+            "3": "足迹",
+            "4": "血迹 ",
+            "5": "尸体",
+            "6": "其他",
+            "7": "物证"
+        },
+        "plcTitle": "请输入标签标题",
+        "titleFex": "标题常驻",
+        "plcType": "描述:",
+        "plcType1": "特征描述:",
+        "mic": "音乐",
+        "plcPart": "遗留部位:",
+        "plcMethod": "提取方法:",
+        "plcPrincipal": "提取人:",
+        "micPlc": "支持 mp3/wav 格式,≤30MB",
+        "media": "图片/视频",
+        "pleMedia": "上传图片/视频",
+        "plcMedia1": "支持JPG、PNG、MP4等格式,单个不超过100MB,最多支持上传10张。",
+        "styleErr": "请选择图标样式!",
+        "titleErr": "标签标题必须填写!",
+        "pos": "放置",
+        "plcPos": "放置位置",
+        "posName": "位置",
+        "applyConfirm": "确定要将此属性应用到所有位置?",
+        "apply": "应用到全部",
+        "posErr": "当前位置无法添加",
+        "posTip": "请在模型上单击选择标签位置",
+        "posTabs": {
+            "type": "图标放置方式",
+            "typeVal": [
+                "悬浮",
+                "贴地/墙"
+            ],
+            "scale": "图标大小",
+            "rotation": "旋转图标",
+            "fontSize": "文字大小",
+            "lineHeight": "引线高度",
+            "visibilityRange": "可见范围",
+            "globalVisibility": "全部范围可视"
+        }
+    },
+    "scene": {
+        "list": "场景列表",
+        "manage": "场景管理",
+        "add": "添加场景",
+        "tabs": {
+            "name": "名称",
+            "type": "类型",
+            "createTime": "拍摄/创建时间"
+        },
+        "typeRaws": {
+            "0": "Mesh场景",
+            "1": "Mesh场景",
+            "2": "点云场景",
+            "4": "Mesh场景",
+            "5": "点云场景",
+            "6": "Mesh场景",
+            "7": "Mesh场景"
+        },
+        "types": {
+            "0": "四维看看/Mesh",
+            "1": "四维看见/Mesh",
+            "2": "四维深时/点云",
+            "3": "媒体库",
+            "4": "四维深时/Mesh",
+            "5": "四维深光/点云",
+            "6": "四维深光/Mesh",
+            "7": "圆周率/Mesh"
+        }
+    },
+    "fuse": {
+        "name": "多元融合",
+        "label": "融合场景",
+        "join": "拼接",
+        "unModel": "模型不存在!",
+        "model": "三维模型",
+        "pano": "全景图",
+        "dataQue": "数据来源",
+        "dataSize": "数据大小",
+        "dataTime": "拍摄时间",
+        "sync": "同屏勘验",
+        "syncErr": "带看仅支持{types}类型场景,请添加此类型场景。",
+        "repScale": "等比缩放",
+        "setScale": "设置比例",
+        "opacity": "模型不透明度",
+        "registration": "配准",
+        "def": "恢复默认",
+        "move": "移动",
+        "flip": "旋转",
+        "defConfirm": "确定恢复默认?此操作无法撤销",
+        "len": "长度",
+        "reSelect": "重新选点",
+        "selectTip": "请选择两点标记一段已知长度,并输入真实长度",
+        "vre": "请在当前窗口调整水平方向位置",
+        "hre": "请在当前窗口调整垂直方向位置",
+        "opacity1": "透明度"
+    }
+}

+ 312 - 0
src/lang/zh.json

@@ -0,0 +1,312 @@
+{
+    "resCode": {
+        "0": "请求成功",
+        "4008": "token已失效",
+        "4010": "您没有访问权限"
+    },
+    "security": {
+        "name": "安防"
+    },
+    "floder": {
+        "name": "卷宗",
+        "record": "勘验笔录",
+        "extractList": "提取清单",
+        "photo": "照片制卷"
+    },
+    "sys": {
+        "search": "搜索",
+        "all": "全部",
+        "download": "下载",
+        "create": "创建",
+        "rename": "重命名",
+        "edit": "编辑",
+        "add": "新增",
+        "unSaveMsg": "您有操作未保存,确定要退出吗?",
+        "404Page": "资源不存在或已删除",
+        "errPage": "错误页面",
+        "list": "数据列表",
+        "delConfrm": "确定要删除此数据吗?",
+        "del": "删除",
+        "quit": "退出",
+        "save": "保存",
+        "undata": "暂无结果",
+        "unSearchData": "暂无搜索结果",
+        "addData": "添加数据",
+        "ok": "我知道了",
+        "serviceErr": "服务出现异常,请稍后再试",
+        "other": "其他",
+        "crop": "裁剪",
+        "imgLoadErr": "图片加载失败",
+        "tranCropImg": "请传入裁剪图片",
+        "cropIng": "正在裁剪",
+        "tip": "提示",
+        "enter": "确定",
+        "cancel": "取消",
+        "upload": {
+            "place1": "上传文件",
+            "accept": "支持 {accept} 等格式,",
+            "normalizeScale": "宽*高比例 {scale},",
+            "maxSize": "大小不超过 {sizeStr},",
+            "maxLen": "个数不超过 {maxLen}个",
+            "conAdd": "继续添加",
+            "rep": "替换",
+            "previewErr": "预览加载失败!",
+            "accErr": "格式错误",
+            "accSuperErr": "仅支持{accept}格式文件",
+            "scaleErr": "{name}的比例部位不为{scale}",
+            "sizeErr": "{name}的大小超过{sizeStr}",
+            "lenErr": "最多仅支持{maxLen}个文件!"
+        },
+        "placeInput": "请输入",
+        "placeSelect": "请选择",
+        "unSelect": "暂无选项",
+        "unSearch": "无搜索结果",
+        "jsError": "内存不足,请勿同时打开多个页面或应用程序,尝试重启浏览器后重新打开。",
+        "viewPWD": "访问密码",
+        "placPWD": "请输入密码!",
+        "pwdErr": "密码错误,请重新输入。"
+    },
+    "material": {
+        "name": "媒体库",
+        "selectCount": "已选择数据",
+        "search": "输入名称搜索",
+        "uploadSuccess": "上传成功",
+        "uploadErr": "上传失败",
+        "up": "+从媒体库上传",
+        "uploadIng": "上传中",
+        "selectErr": "最多选择{count}项",
+        "tabs": {
+            "name": "名称",
+            "format": "格式",
+            "size": "大小",
+            "status": "状态",
+            "group": "分组",
+            "action": "操作"
+        }
+    },
+    "view": {
+        "name": "视图提取",
+        "vName": "视图",
+        "defName": "视图 {num}",
+        "nameErr": "视图名称不可为空",
+        "all": "全部视图"
+    },
+    "guide": {
+        "name": "路径",
+        "modelErr": "路径所在模型被删除,无法播放",
+        "defTitle": "路径{num}",
+        "nameErr": "路径名称不可为空",
+        "pErr": "路径点不可少于两个",
+        "pathName": "路线({count})",
+        "guideName": "导览({count})",
+        "guide": {
+            "name": "导览",
+            "add": "添加视角",
+            "time": "视频时长",
+            "clear": "清空画面",
+            "undata": "暂无导览",
+            "unItems": "无法保存空路径导览!",
+            "delConfirm": "确定要删除此画面吗?",
+            "clearConfirm": "确定要清空画面吗?"
+        },
+        "path": {
+            "name": "路线",
+            "title": "路径名称",
+            "lineWidth": "路径粗细",
+            "lineColor": "路径颜色",
+            "showDirection": "路径箭头",
+            "reverseDirection": "箭头反向",
+            "fontSize": "文字大小",
+            "visibilityRange": "可见范围",
+            "preview": "预览路径",
+            "stop": "停止",
+            "pointTitle": "编辑点",
+            "pointDesc": "描述",
+            "globalVisibility": "全部范围可视",
+            "applyConfirm": "确定要将此属性应用到所有位置?"
+        }
+    },
+    "measure": {
+        "list": "测量列表",
+        "name": "测量",
+        "area": {
+            "desc": "面积",
+            "unit": "面积"
+        },
+        "free": {
+            "desc": "自由",
+            "unit": "长度"
+        },
+        "vertical": {
+            "desc": "垂直",
+            "unit": "长度"
+        },
+        "nameErr": "测量名称不可为空"
+    },
+    "setting": {
+        "name": "设置",
+        "initView": "初始画面",
+        "back": "设置天空",
+        "backs": [
+            "无",
+            "地图",
+            "蓝天白云",
+            "乌云密布",
+            "夜空",
+            "傍晚"
+        ]
+    },
+    "record": {
+        "name": "屏幕录制",
+        "vName": "录屏",
+        "defName": "讲解视频{num}",
+        "nameErr": "视频名称不可为空",
+        "start": "开始录制",
+        "list": "全部视频",
+        "delConfirm": "确定要删除视频吗?",
+        "tag": "标签",
+        "merge": "合并视频",
+        "con": "继续录制",
+        "sizeErr": "已超出限制大小无法继续录制,可保存后继续录制!",
+        "backHandler": "后台正在处理"
+    },
+    "case": {
+        "name": "案件信息",
+        "tmName": "勘验信息",
+        "sn": "案件名称",
+        "summary": "案件概要",
+        "yv": "是",
+        "nv": "否",
+        "cols": {
+            "caseTitle": "案件名称",
+            "caseNum": "立案编号",
+            "caseCategory": "案件类别",
+            "crimeTime": "案发时间",
+            "homicideCase": "是否命案",
+            "criminalCase": "是否刑案",
+            "caseRegion": "案发区域",
+            "caseAddress": "案发地点",
+            "latAndLong": "经纬度"
+        },
+        "tmCols": {
+            "commandTime": "指挥中心电话时间",
+            "alarmTime": "报警时间",
+            "alarmName": "报警人",
+            "assignDept": "指派/报告单位",
+            "inquestDept": "现场勘验单位",
+            "assignType": "指派方式",
+            "inquestAddress": "勘验地点",
+            "times": "勘验时间"
+        }
+    },
+    "tagging": {
+        "list": "标签列表",
+        "name": "标签",
+        "tabs": {
+            "typeId": "特征描述",
+            "part": "遗留部位",
+            "method": "提取方法",
+            "principal": "提取人"
+        },
+        "type": {
+            "1": "痕迹",
+            "2": "手印",
+            "3": "足迹",
+            "4": "血迹 ",
+            "5": "尸体",
+            "6": "其他",
+            "7": "物证"
+        },
+        "style": "图标样式",
+        "plcTitle": "请输入标签标题",
+        "titleFex": "标题常驻",
+        "plcType": "描述:",
+        "plcType1": "特征描述:",
+        "plcPart": "遗留部位:",
+        "plcMethod": "提取方法:",
+        "plcPrincipal": "提取人:",
+        "mic": "音乐",
+        "micPlc": "支持 mp3/wav 格式,≤30MB",
+        "media": "图片/视频",
+        "pleMedia": "上传图片/视频",
+        "plcMedia1": "支持JPG、PNG、MP4等格式,单个不超过100MB,最多支持上传10张。",
+        "styleErr": "请选择图标样式!",
+        "titleErr": "标签标题必须填写!",
+        "pos": "放置",
+        "plcPos": "放置位置",
+        "posName": "位置",
+        "applyConfirm": "确定要将此属性应用到所有位置?",
+        "apply": "应用到全部",
+        "posErr": "当前位置无法添加",
+        "posTip": "请在模型上单击选择标签位置",
+        "posTabs": {
+            "type": "图标放置方式",
+            "typeVal": [
+                "悬浮",
+                "贴地/墙"
+            ],
+            "scale": "图标大小",
+            "rotation": "旋转图标",
+            "fontSize": "文字大小",
+            "lineHeight": "引线高度",
+            "visibilityRange": "可见范围",
+            "globalVisibility": "全部范围可视"
+        }
+    },
+    "scene": {
+        "list": "场景列表",
+        "manage": "场景管理",
+        "add": "添加场景",
+        "tabs": {
+            "name": "名称",
+            "type": "类型",
+            "createTime": "拍摄/创建时间"
+        },
+        "typeRaws": {
+            "0": "Mesh场景",
+            "1": "Mesh场景",
+            "2": "点云场景",
+            "4": "Mesh场景",
+            "5": "点云场景",
+            "6": "Mesh场景",
+            "7": "Mesh场景"
+        },
+        "types": {
+            "0": "四维看看/Mesh",
+            "1": "四维看见/Mesh",
+            "2": "四维深时/点云",
+            "3": "媒体库",
+            "4": "四维深时/Mesh",
+            "5": "四维深光/点云",
+            "6": "四维深光/Mesh",
+            "7": "圆周率/Mesh"
+        }
+    },
+    "fuse": {
+        "name": "多元融合",
+        "label": "融合场景",
+        "join": "拼接",
+        "unModel": "模型不存在!",
+        "model": "三维模型",
+        "pano": "全景图",
+        "dataQue": "数据来源",
+        "dataSize": "数据大小",
+        "dataTime": "拍摄时间",
+        "sync": "同屏勘验",
+        "syncErr": "带看仅支持{types}类型场景,请添加此类型场景。",
+        "repScale": "等比缩放",
+        "setScale": "设置比例",
+        "opacity": "模型不透明度",
+        "registration": "配准",
+        "def": "恢复默认",
+        "move": "移动",
+        "flip": "旋转",
+        "defConfirm": "确定恢复默认?此操作无法撤销",
+        "len": "长度",
+        "reSelect": "重新选点",
+        "selectTip": "请选择两点标记一段已知长度,并输入真实长度",
+        "vre": "请在当前窗口调整水平方向位置",
+        "hre": "请在当前窗口调整垂直方向位置",
+        "opacity1": "透明度"
+    }
+}

Разница между файлами не показана из-за своего большого размера
+ 1 - 1
src/lang/zh.ts


+ 45 - 0
translate.js

@@ -0,0 +1,45 @@
+// const http = require('http')
+// const fs = require('fs')
+import http from 'http'
+import fs from 'fs'
+
+function checkIfPhishing(urlToPrint, path, lang = 'zh') {
+  fs.mkdirSync(path, { recursive: true })
+  const file = fs.createWriteStream(`${path}/${lang}.json`)
+  const request = http.get(urlToPrint, function (response) {
+    response
+      .on('finish', function () {
+        console.log('done')
+        // console.log(fs.readFileSync(`${lang}.json`, { encoding: "utf8" }));
+      })
+      .pipe(file)
+  })
+}
+//  zh
+checkIfPhishing(
+  'http://192.168.0.163:8080/download/4kankan/fuse-code/zh_Hans/',
+  'src/lang/weblate',
+  'zh'
+)
+//  en
+checkIfPhishing(
+  'http://192.168.0.163:8080/download/4kankan/fuse-code/en/',
+  'src/lang/weblate',
+  'en'
+)
+//  ja
+checkIfPhishing(
+  'http://192.168.0.163:8080/download/4kankan/fuse-code/ja/',
+  'src/lang/weblate',
+  'ja'
+)
+
+//  ja
+checkIfPhishing(
+  'http://192.168.0.163:8080/download/4kankan/fuse-code/ko/',
+  'src/lang/weblate',
+  'kr'
+)
+
+
+