1
0
tangning 5 kuukautta sitten
vanhempi
commit
7023c9de70

+ 0 - 1
program/lang/weblate/zh.json

@@ -1095,7 +1095,6 @@
         "library": "媒体库",
         "caseView": "预览案件",
         "dyrh": "多元融合",
-        "edit": "编辑器",
         "sceneList": "场景列表",
         "yc": "移除",
         "addScene": "添加场景",

+ 8 - 0
src/assets/style/custom-element.scss

@@ -12,6 +12,8 @@ html.dark {
   --el-button-border-color: #00C8AF;
   --el-font-size-large: 16px;
   --bgColor: #1B1B1C;
+  --el-color-primary-light-9: rgb(22 36 34);
+  --el-color-primary-light-7: rgb(0 106 93);
   --topbgColor: #131313;
   .title1, .title0{
     color: #fff !important;
@@ -28,6 +30,12 @@ html.dark {
   .header-top{
     background-color: var(--topbgColor);
   }
+  .el-button{
+    &:hover{
+      background: none;
+    }
+
+  }
 }
 
 .el-pagination.is-background .btn-next.is-active,

+ 4 - 4
src/components/dialog/index.vue

@@ -12,10 +12,10 @@
           <slot />
         </div>
         <div class="floot" v-if="showFloor">
-          <el-button type="danger" v-if="showDel" @click="deleteHandle">删 除</el-button>
-          <el-button @click="closeHandle" v-if="showClose">取 消</el-button>
+          <el-button type="danger" v-if="showDel" @click="deleteHandle">{{$t('sys.delete')}}</el-button>
+          <el-button @click="closeHandle" v-if="showClose">{{$t('sys.cancel')}}</el-button>
           <el-button type="primary" :disabled="!!disabled" @click="enterHandle">
-            {{ enterText }}
+            {{ enterText ||  $t('sys.save')}}
           </el-button>
         </div>
       </div>
@@ -35,7 +35,7 @@ const props = withDefaults(defineProps<DialogProps>(), {
   hideFloor: false,
   showClose: true,
   notSubmit: false,
-  enterText: "保 存",
+  enterText: "",
 });
 
 

+ 10 - 2
src/config/locale.vue

@@ -1,9 +1,17 @@
 <template>
-  <el-config-provider :locale="zhCn" :message="{ max: 3 }">
+  <el-config-provider :locale="locale" :message="{ max: 3 }">
     <slot />
   </el-config-provider>
 </template>
 
 <script lang="ts" setup>
-import zhCn from "element-plus/dist/locale/zh-cn.mjs";
+import { ref, computed } from 'vue'
+import { ui18n } from "@/i18n";
+import zh from "element-plus/dist/locale/zh-cn.mjs";
+import en from 'element-plus/dist/locale/en.mjs';
+const lang = ui18n.locale
+const locale = computed(() => {
+  console.log('computedlang', lang);
+  return lang === "zh" ? zh : en;
+});
 </script>

+ 8 - 7
src/constant/scene.ts

@@ -1,9 +1,10 @@
 import { appConstant } from "@/app";
 import { ModelSceneStatus, QuoteSceneStatus, SceneType } from "@/store/scene";
+import { ui18n } from '@/i18n'
 
 export const SceneTypeDesc: { [key in SceneType]: string } = {
-  [SceneType.SWKK]: "点云场景",
-  [SceneType.SWKJ]: "Mesh 场景",
+  [SceneType.SWKK]: ui18n.t('program.scene.laserClo'),
+  [SceneType.SWKJ]: ui18n.t('program.scene.laserObj'),
   [SceneType.SWSS]: "激光转台点云场景",
   [SceneType.SWMX]: "三维模型",
   [SceneType.SWSSMX]: "激光转台Mesh场景",
@@ -40,11 +41,11 @@ export const SceneTypePaths: { [key in SceneType]: string[] } = {
 
 export const QuoteSceneStatusDesc: { [key in QuoteSceneStatus]: string } = {
   [QuoteSceneStatus.DEL]: "场景被删",
-  [QuoteSceneStatus.RUN]: "计算中",
-  [QuoteSceneStatus.ERR]: "计算失败",
-  [QuoteSceneStatus.SUCCESS]: "计算成功",
-  [QuoteSceneStatus.ARCHIVE]: "封存",
-  [QuoteSceneStatus.RERUN]: "重新计算中",
+  [QuoteSceneStatus.RUN]: ui18n.t('program.case.status_0') || "计算中",
+  [QuoteSceneStatus.ERR]: ui18n.t('program.case.status_-1') ||"计算失败",
+  [QuoteSceneStatus.SUCCESS]: ui18n.t('program.case.status_2') ||"计算成功",
+  [QuoteSceneStatus.ARCHIVE]: ui18n.t('program.case.status_3') || "封存",
+  [QuoteSceneStatus.RERUN]: ui18n.t('program.case.status_4') || "重新计算中",
 };
 
 export const ModelSceneStatusDesc: { [key in ModelSceneStatus]: string } = {

+ 3 - 1
src/i18n/index.ts

@@ -3,7 +3,9 @@ import { createI18n, I18n as BaseI18n } from 'vue-i18n'
 import { deflangName, langNameEum, langNames, langNameDescs } from './constant'
 import { localGetFactory, localSetFactory } from '@/util/store'
 import { paramsToStr, strToParams } from "@/util";
-
+import ElementPlus from 'element-plus';
+import zh from 'element-plus/dist/locale/zh-cn.mjs';
+import en from 'element-plus/dist/locale/en.mjs';
 // import zh from './zh'
 // import en from './en'
 // import ja from './ja'

+ 13 - 10
src/i18n/weblate/en.json

@@ -252,7 +252,7 @@
         "lackSuperPower": "Permission denied, please run as administrator",
         "the3PartyWarmTip": "The third-party app is opening, please move to the third-party app later!",
         "yes1": "OK",
-        "exit-msg": "The program will continue to run in the background after you close the page. If you need to quit the program, please quit from the system tray.",
+        "exit-msg": "The program will continue to run in the background after you close the page. To exit, please open the system tray in the lower right corner and select 'Exit Program'.",
         "lang": "language",
         "selectAll": "All",
         "cantcal": {
@@ -294,7 +294,10 @@
             "buildEndTime": "Recalculation completion time",
             "exporting": "Importing",
             "packing": "Packaging",
-            "calcing": "Calculating"
+            "calcing": "Calculating",
+            "packingFailure": "Packaging failed.",
+            "unPacking": "Not packaged",
+            "unGenerate": "Not generated"
         },
         "multiLang": "Multi-language",
         "migrateScene": {
@@ -557,7 +560,7 @@
         },
         "exitWarmTip": "Exiting the program now will interrupt the task being synchronized or calculated, are you sure to exit?",
         "sysFailAndUdriveTip": "Synchronization fails, do not pull out the USB flash drive during synchronization, or modify the synchronized directory.",
-        "noAppWarmTip": "The system cannot find the .exe.",
+        "noAppWarmTip": "The program was not detected. Please follow the operation instructions and place the program file in the following directory:",
         "noAppUnknownError": "Operation failed. Recommended to check if the following applications are authorized:"
     },
     "measure": {
@@ -1122,13 +1125,13 @@
         "statusStr": "Status",
         "createTime": "Upload Time",
         "operate": "Operation",
-        "fileType":{
-            "0":"All",
-            "1":"Picture",
-            "2":"Video",
-            "3":"Audio",
-            "4":"Model",
-            "5":"Other"
+        "fileType": {
+            "0": "All",
+            "1": "Picture",
+            "2": "Video",
+            "3": "Audio",
+            "4": "Model",
+            "5": "Other"
         },
         "tips": {
             "dictId": "Please select a group",

+ 118 - 8
src/i18n/weblate/ja.json

@@ -208,7 +208,9 @@
             "install": "状態",
             "fuse": "点群結合",
             "smart3DTitle": "ドローンでモデルを生成",
-            "irealTitle": "小型物体モデル"
+            "irealTitle": "小型物体モデル",
+            "media": "メディアライブラリ",
+            "case": "事件管理"
         },
         "scene": {
             "name": "物件名",
@@ -317,7 +319,52 @@
         "selectAll": "すべて",
         "OpenFile": {
             "directory": "ディレクトリを開く"
-        }
+        },
+        "sceneDetail": {
+            "e57_title": "E57",
+            "obj_title": "OBJ",
+            "title": "シーンデータ",
+            "upload_done_time": "アップロード完成時間",
+            "shoot_way_type_2": "slam",
+            "s_info": "シーン情報",
+            "floorplan_title": "フロアプラン",
+            "offline_title": "オフラインパッケージ",
+            "migrageS_title": "シーンを移動",
+            "generate": "生成",
+            "calc_done_time": "計算完成時間",
+            "upload_time": "計算時間",
+            "re_generate": "シーンを再生成",
+            "re_calc_done_time": "再計算時間",
+            "shoot_way": "撮影方法",
+            "shoot_device": "撮影デバイス",
+            "shoot_way_type_1": "ステーション式撮影",
+            "shoot_count": "ポイント数",
+            "export": "生成",
+            "shootStartTime": "撮影時関",
+            "shoot_time": "撮影時関",
+            "buildTime": "計算時間",
+            "buildEndTime": "再計算時間",
+            "exporting": "導入中",
+            "packing": "パッケージング中",
+            "calcing": "計算中",
+            "packingFailure": "パッケージングに失敗しました",
+            "unPacking": "パッケージングされていない",
+            "unGenerate": "未生成"
+        },
+        "case": {
+            "create": "案件を作成",
+            "title": "タイトル",
+            "sceneName": "物件名",
+            "num": "コード",
+            "sceneType": "シーンタイプ",
+            "query": "検索",
+            "caseTitle": "事件名"
+        },
+        "multiLang": "多言語",
+        "migrateScene": {
+            "fail_import": "導入に失敗しました。パッケージデータの形式を確認してください。"
+        },
+        "calcFailureTip": "再計算を確定しますか?一部の操作は取り消すことができません。\n注意:点群シーンの再計算により、マージされたデータセットやホットスポットなどの一部のデータが削除されますので、ご注意ください。"
     },
     "crop": {
         "calcConfirm": "確認して計算しますか?\n計算には時間がかかる場合があるため、この操作を実行する前に点群\nのトリミングが完了していることを確認してください。",
@@ -676,7 +723,7 @@
         "deleteConfirm": "この{type}を削除してもよろしいですか?"
     },
     "measure": {
-        "name": "測",
+        "name": "測",
         "unit": {
             "meter": "メートル(m)",
             "inch": "フィートft)"
@@ -882,22 +929,22 @@
         "update": "修正",
         "cancel": "キャンセル",
         "add": "追加",
-        "crop": "クロップ",
+        "crop": "トリミング",
         "save": "保存",
         "leave": "閉じる",
         "submit": "提出",
         "calc": "計算",
         "hide": "隠す",
         "close": "オフ",
-        "ok": "OK",
+        "ok": "了解しました",
         "reset": "リセット",
-        "enter": "定",
+        "enter": "定",
         "show": "表示",
         "delete": "削除",
         "ignore": "無視",
         "setup": "設定",
         "edit": "編集",
-        "all": "全",
+        "all": "全",
         "refer": "リフレッシュ",
         "upload": "アップロード",
         "uploadAddText": "追加",
@@ -945,7 +992,7 @@
         },
         "exitWarmTip": "退出するにはシンクロ中または計算中のプロジェクトを中止します。退出を確認しますか?",
         "sysFailAndUdriveTip": "シンクロに失敗しました。USBの連続、または保存先のルートを確保してください。",
-        "noAppWarmTip": "このexeファイルはシステムで発見できないです。",
+        "noAppWarmTip": "プログラムは検出されないです。操作説明に従って、プログラムファイルを以下のディレクトリに置いてください:",
         "noAppUnknownError": "操作に失敗しました。以下のソフトがライセンスされているかを確認することをお勧めします。"
     },
     "tool": {
@@ -1040,5 +1087,68 @@
         "Extractor": "採取人",
         "downloadsuccess": "%filename%はダウンロードに成功しました。",
         "moveFail": "ファイルの移動に失敗しました。十分なストレージを確認してください。"
+    },
+    "sceneDetail": {
+        "title": "シーンデータ"
+    },
+    "sceneHome": {
+        "sceneList": "シーンリスト",
+        "dyrh": "マルチ融合",
+        "library": "メディアライブラリ",
+        "addScene": "シーンを追加",
+        "yc": "削除",
+        "caseView": "案件をプレビュー",
+        "delTops": "キャンセルを確定しますか",
+        "ycTips": "現在のシーンを本当に削除しますか?"
+    },
+    "mediaLibrary": {
+        "Modeling": "傾斜撮影",
+        "photography": "単体モデル",
+        "upload": "アップロード",
+        "setGrouping": "グループを調整",
+        "groupingList": "グループリスト",
+        "grouping": "グループ管理",
+        "addFile": "ファイルをアップロード",
+        "createTime": "アップロード時間",
+        "fileType": {
+            "0": "すべて",
+            "1": "画像",
+            "5": "その他",
+            "4": "モデル",
+            "2": "動画",
+            "3": "オーディオ"
+        },
+        "dictName": "グループ",
+        "tips": {
+            "del": "キャンセルに成功しました",
+            "uplooad": "アップロード中",
+            "uplooadErr": "アップロードに失敗しました",
+            "edit": "調整に成功しました",
+            "objtips": "obj:zipパッケージを使用してアップロードする必要があります。ポスター、モデル、mtlファイルを含みます。パッケージ内にフォルダを含めることはできず、ファイル名には漢字を使用してはいけません。図の通りです。",
+            "uplooadSuccess": "アップロード成功",
+            "uplooadSize": "アップロードするファイルは 2G以内です。",
+            "osgbtips": "osgbのアップロード:zipパッケージを使ってアップロードする必要があります。Dataフォルダとxmlファイルを含みます。パッケージ内には別のフォルダを含めてはいけません。また、ファイル名に漢字を使用してはいけません。下記の図の通りです。",
+            "deltext": "この操作は取り消すことができないです。",
+            "dictId": "グループを選択してください",
+            "operate": "操作成功",
+            "add": "追加に成功しました",
+            "placeholderName": "タイトルを入力してください",
+            "uplooadfiletype": "形式:jpg、png、jpeg、mp4、wav、mp3 、shp、zip。",
+            "noName": "タイトルを入力してください"
+        },
+        "title": "メディアライブラリ",
+        "addFolder": "フォルダを追加",
+        "add": "ファイルを追加",
+        "addgrouping": "グループを追加",
+        "addFolderName": "フォルダ名を入力してください",
+        "addFileTip": "形式:JPG/PNG、≤1 枚",
+        "addFileErr": "ファイル名は空きができないです。",
+        "addFolderErr": "フォルダ名は空きができないです。",
+        "fileTypeStr": "ファイル形式",
+        "addFilePlace": "ファイル名を入力してください",
+        "addFolderPlace": "フォルダ名を入力してください",
+        "operate": "操作",
+        "fileFormat": "ファイル形式",
+        "statusStr": "状態"
     }
 }

+ 750 - 44
src/i18n/weblate/kr.json

@@ -1,12 +1,30 @@
 {
     "program": {
         "other": {
-            "toWinIng": "컴퓨터로 동기화하고 있어요.",
+            "toWinIng": "컴퓨터로 동기화 중입니다.",
             "syncIng": "N 개의 시나리오가 동기화됩니다",
             "usb": "USB메모리",
             "usbScene": "USB에 담긴 프로젝트",
             "gscene": "N 개의 장면",
-            "delTipPost": "삭제하시겠습니까?"
+            "delTipPost": "삭제하시겠습니까?",
+            "selected": "<span>{length}</span>개의 씬이 선택되었습니다.",
+            "existsNot": "현재 SN 코드가 일치하지 않습니다. 카메라 목록에 있는 SN 코드를 사용해 주세요.",
+            "cancelSync": "동기화 취소",
+            "syncSuccess": "동기화 완료",
+            "current": "현재 있습니다.",
+            "currentSync": "현재 {count}개의 씬이 동기화 중입니다.",
+            "currentSN": "현재 카메라 SN 코드:",
+            "sync": "동기화",
+            "syncTo": "동기화 대상",
+            "repeatTipPost": "장면",
+            "open": "열기",
+            "calcIng": "계산 중입니다.",
+            "unWin": "현재 씬 데이터가 없습니다. U드라이브에서 씬 데이터를 컴퓨터로 동기화해 주세요.",
+            "unUSB": "현재 씬 데이터가 없습니다. 먼저 앱을 통해 씬 데이터를 전용 U드라이브에 업로드해 주세요.",
+            "toUsbIng": "U드라이브로 동기화 중입니다.",
+            "win": "컴퓨터",
+            "winScene": "컴퓨터 로컬 씬",
+            "delTipPrev": "이 씬을 다음에서 삭제하시겠습니까?"
         },
         "syncHelp": {
             "step1": {
@@ -20,39 +38,253 @@
         },
         "camera": {
             "sn": "SN 코드",
-            "title": "모든 카메라"
+            "title": "모든 카메라",
+            "refesh": "새로고침",
+            "unSearch": "귀하에게는 카메라가 없습니다. 먼저 카메라 인증을 진행해 주세요.",
+            "unKeySearch": "일치하는 카메라를 찾을 수 없습니다.",
+            "localCount": "로컬 씬 수",
+            "changeAuth": "변경이 성공적으로 완료되었습니다. 카메라에서 최신 결과를 확인해 주세요.",
+            "lastTime": "마지막 동기화 시간",
+            "sync": "카메라 인증",
+            "cameraType": "카메라 유형"
         },
         "delete": "삭제",
         "auth": {
-            "use": "사용 중"
+            "use": "사용 중",
+            "timeoutDay": "남은 일수",
+            "uAuthTipTime": "귀하의 소프트웨어 인증은 {n}일 후 만료됩니다. 정상적인 소프트웨어 사용을 보장할 수 없으니, 새로운 키를 받으셔서 인증을 완료해 주세요.",
+            "timeout": [
+                "현재 소프트웨어는 아직 인증되지 않았거나 인증이 만료되었습니다. 씬 동기화 및 계산에 지장이 없도록 빠르게 인증을 진행해 주세요.",
+                "인증 절차는 사용자 매뉴얼을 참조하거나 담당자에게 문의해 주세요."
+            ],
+            "title": "현재 유효한 라이선스는 다음과 같습니다:",
+            "surplusStatus": "남은",
+            "copySuess": "복사 성공",
+            "day": "하늘",
+            "syPost": "일 후 만료됩니다.",
+            "syPrev": "에 있을 것입니다.",
+            "timeouted": "만료되었습니다.",
+            "uAuthTipOut": "귀하의 소프트웨어 인증이 만료되었습니다.",
+            "success": "인증 성공!",
+            "sn": "인증 코드",
+            "status": "상태"
         },
         "errMsg": {
-            "genObjTip": "망사 프로젝트는 계산중이니 기다려 주세요."
+            "genObjTip": "망사 프로젝트는 계산중이니 기다려 주세요.",
+            "genE57Tip": "e57 파일을 계산 중입니다. 잠시만 기다려 주세요.",
+            "resetGen": "현재 씬은 재계산 후에만 Obj 씬을 생성할 수 있습니다. 재계산을 진행하시겠습니까?",
+            "repeatGen": "계산 작업이 진행 중입니다. 계산 완료 후 오프라인 패키지를 다운로드해 주세요. 패키지 실패를 방지할 수 있습니다.",
+            "calcFree": "현재 씬이 있는 하드 드라이브의 공간이 30GB 이하입니다. 계산 실패를 방지하기 위해 공간을 정리해 주세요.",
+            "calcSync": "계산 중이므로 동기화를 진행할 수 없습니다."
         },
         "time": {
-            "minute": "분"
+            "minute": "분",
+            "mis": "초"
         },
         "sceneDown": {
             "down": "다운로드",
             "downSuccess": "성공적으로 다운로드했습니다",
             "all": "모두 선택",
             "init": "처음 생성",
-            "delMsg": "삭제한 후에는 복구할 수 없습니다.이 데이터를 삭제하시겠습니까?"
+            "delMsg": "삭제한 후에는 복구할 수 없습니다.이 데이터를 삭제하시겠습니까?",
+            "e57Down": "e57 다운로드",
+            "copy": "복사",
+            "ing": "씬 패킹 중입니다.",
+            "success": "생성 완료되었습니다.",
+            "coverStatus": {
+                "copy": "복사 중입니다.",
+                "un": "계산 대기 중",
+                "lineup": "대기 중입니다."
+            },
+            "e57Gen": "e57 생성 중입니다.",
+            "reset": "재생성 중입니다.",
+            "objGenIng": "Obj 생성 중입니다.",
+            "query": "보기",
+            "msgStatus": {
+                "ing": "일시 정지",
+                "lineup": "일시 정지",
+                "copy": "복사 중입니다."
+            },
+            "e57GenIng": "e57 생성 중입니다.",
+            "obgGen": "Obj 생성 중입니다.",
+            "recalcMsg": "재계산을 진행하시겠습니까?"
         },
         "scene": {
-            "laserObj": "망사 프로젝트"
+            "laserObj": "망사 프로젝트",
+            "delete": "씬 삭제",
+            "sync": "씬 동기화",
+            "name": "이름",
+            "photoTime": "촬영 시간",
+            "unSearch": "현재 씬이 없습니다. 먼저 씬 데이터를 동기화해 주세요~~",
+            "unKeySearch": "씬을 찾을 수 없습니다.",
+            "laserClo": "점 클라우드 씬",
+            "calcTip": "Obj 씬 생성에는 시간이 걸릴 수 있습니다. 잠시만 기다려 주세요."
         },
         "errCode": {
-            "204": "중복 전송하지 마십시오. 나중에 다시 시도하십시오"
+            "204": "중복 전송하지 마십시오. 나중에 다시 시도하십시오",
+            "8008": "장면 원본 데이터가 만료되어 이 기능을 사용할 수 없습니다.",
+            "8011": "현재 씬은 재계산 후에만 오프라인 패키지를 다운로드할 수 있습니다. 재계산을 진행하시겠습니까?",
+            "8009": "장면 복사는 재계산을 지원하지 않습니다.",
+            "8010": "当前场景需要重算后才能生成Obj场景。确定要重算吗?",
+            "3109": "구 SN 코드가 존재하지 않습니다.",
+            "3112": "변경이 성공적으로 완료되었습니다. 카메라 목록에서 확인해 주세요.",
+            "3108": "카메라 인증 키는 재사용할 수 없습니다.",
+            "3106": "카메라 인증 키가 현재 장치와 일치하지 않습니다.",
+            "3113": "카메라 인증 키가 유효하지 않습니다.",
+            "3110": "카메라 키 교체는 재사용할 수 없습니다.",
+            "3111": "카메라 키 교체가 유효하지 않습니다."
+        },
+        "exit-msg": "페이지를 닫아도 프로그램은 백그라운드에서 계속 실행됩니다. 종료하려면 우측 하단 트레이에서 프로그램 종료를 선택해 주세요.",
+        "OpenFile": {
+            "directory": "파일 디렉토리 열기"
+        },
+        "rocre": {
+            "cancel": "취소",
+            "screen": "스크린",
+            "ok": "확인"
+        },
+        "sceneDetail": {
+            "e57_title": "E57",
+            "obj_title": "OBJ",
+            "title": "씬 데이터",
+            "floorplan_title": "평면도",
+            "upload_done_time": "업로드 완료 시간",
+            "shoot_way_type_2": "slam",
+            "s_info": "장면 정보",
+            "shoot_way": "촬영 방식",
+            "shoot_device": "촬영 장비",
+            "shootStartTime": "촬영 시작 시간",
+            "shoot_time": "촬영 시간",
+            "exporting": "가져오는 중입니다.",
+            "packing": "패킹 중입니다.",
+            "packingFailure": "패킹에 실패했습니다.",
+            "generate": "생성",
+            "shoot_way_type_1": "기둥식 촬영",
+            "shoot_count": "점 개수",
+            "export": "생성",
+            "unPacking": "패킹되지 않음",
+            "unGenerate": "생성되지 않았습니다.",
+            "offline_title": "오프라인 패키지"
+        },
+        "multiLang": "다국어",
+        "menu": {
+            "media": "미디어 라이브러리",
+            "scene": "씬 관리",
+            "addSuccess": "경로가 성공적으로 추가되었습니다. 재시작 후 적용됩니다.",
+            "irealTitle": "소형 물체 모델링",
+            "edit": "씬 편집",
+            "fuse": "씬 합성",
+            "help": "도움말",
+            "case": "케이스 관리",
+            "smart3DTitle": "드론 모델링",
+            "fileManage": "파일 관리",
+            "license": "인증 라이선스",
+            "ingSelectTip": "진행 중인 작업이 있어 현재 경로 추가를 지원하지 않습니다.",
+            "about": "버전 정보",
+            "install": "상태 표시",
+            "camera": "카메라 관리"
+        },
+        "migrateScene": {
+            "fail_import": "가져오기 실패, 올바른 씬 패키지 데이터를 업로드해 주세요."
+        },
+        "case": {
+            "create": "케이스 생성",
+            "title": "이름",
+            "sceneName": "씬 제목",
+            "num": "씬 코드",
+            "sceneType": "씬 유형",
+            "query": "조회",
+            "caseTitle": "케이스 이름"
+        },
+        "cantcal": {
+            "content": {
+                "1": "2. \"Windows 보안 센터/바이러스 및 위협 방지 설정/설정 관리\"에서 실시간 보호 기능을 끕니다.",
+                "2": "3. 4D Kankan 로컬 버전을 다시 설치합니다. (설치 및 사용 과정에서 반드시 실시간 보호 기능을 계속 꺼둔 상태로 유지해 주세요.)",
+                "0": "I. 4D Kankan 로컬 버전을 삭제합니다."
+            },
+            "title": "계산할 수 없습니다.",
+            "desc": "\"Windows 바이러스 및 위협 방지\" 실시간 보호가 활성화되어 있습니다. 아래 단계를 따라 진행해 주세요:"
+        },
+        "syncStatus": {
+            "zip": "압축 중입니다.",
+            "copy": "복사 중입니다."
+        },
+        "no": "아니오",
+        "fileManage": {
+            "originTitle": "원본 자료",
+            "openDir": "파일 탐색기 열기",
+            "addStorage": "새 경로 추가"
+        },
+        "shenguang": "4DKanKan Meta",
+        "cameraAuth": {
+            "copy": "복사",
+            "systemError": "설치 키가 현재 장치와 일치하지 않습니다.",
+            "systemDiaTitle": "설치 인증",
+            "systemKey": "설치key",
+            "changeTitle": "카메라 변경",
+            "changeKey": "카메라 키 변경",
+            "code": "머신 코드",
+            "title": "카메라 인증",
+            "cameraKey": "카메라 인증 키"
+        },
+        "deskErr": "현재 자원이 있는 하드 드라이브의 공간이 부족합니다. 새로운 저장 경로를 추가하여 사용에 지장이 없도록 해 주세요.",
+        "rejectSceneSync": "현재 씬은 카메라 인증 목록에 없습니다!",
+        "sysTimeout": "현재 소프트웨어는 아직 인증되지 않았거나 인증이 만료되었습니다. 씬 동기화 및 계산에 지장이 없도록 빠르게 인증을 진행해 주세요. 인증 절차는 사용자 매뉴얼을 참조하거나 담당자에게 문의해 주세요.",
+        "yes1": "알겠습니다",
+        "selectAll": "전체",
+        "title": "4DKanKan로컬 버전",
+        "laser": "4DKanKan Mega",
+        "kankan": "4DKanKan Minion",
+        "gotoDeskSetting": "설정으로 이동",
+        "plugin": {
+            "unzip": {
+                "err": "압축 파일이 올바르지 않습니다.",
+                "err2": "치명적인 오류가 발생했습니다. 파일이 보안 소프트웨어에 의해 점유되었을 가능성이 있습니다.",
+                "err1": "일부 파일이 사용 중일 수 있습니다.",
+                "err7": "클라이언트에 기능이 누락되었습니다."
+            }
         },
-        "exit-msg": "페이지를 닫은 후에도 프로그램은 배경에서 계속 실행됩니다. 종료하려면 오른쪽 하단 트레이를 열고 오른쪽 단추를 클릭하여 종료하십시오."
+        "the3PartyOpenAlready": "현재 프로그램이 열려 있습니다!",
+        "undata": "현재 데이터가 없습니다.",
+        "serverErr": "서비스에 문제가 발생했습니다. 잠시 후 다시 시도해 주세요.",
+        "yes": "네",
+        "serviceRunIng": "서비스가 시작 중입니다…",
+        "deskRmTip": "이 작업은 경로만 삭제되며, 로컬 폴더는 삭제되지 않습니다. 그러나 폴더 내 리소스는 더 이상 접근할 수 없게 됩니다.",
+        "lackSuperPower": "권한이 부족합니다. 관리자 권한으로 실행해 주세요.",
+        "calcFailureTip": "재계산을 진행하시겠습니까? 일부 작업은 취소할 수 없습니다.  \n주의: 점 클라우드 씬의 재계산은 병합된 데이터셋, 핫스팟 등의 일부 데이터를 삭제하므로 신중하게 진행해 주세요.",
+        "the3PartyWarmTip": "제3자 애플리케이션이 열리고 있습니다. 잠시 후 제3자 애플리케이션으로 이동해 주세요!"
     },
     "common": {
         "sure": "확정",
         "downloadsuccess": "다운로드 성공",
         "cancel": "삭제",
         "addpicture": "그림 업로드",
-        "save": "저장"
+        "save": "저장",
+        "Navigationlist": "가이드 목록",
+        "tips": "저장되지 않은 작업이 있습니다. 정말로 종료하시겠습니까?",
+        "Cancel": "취소",
+        "splicing": "합치기",
+        "Startrecording": "녹화를 시작합니다.",
+        "open": "4D Kankan 로컬 버전을 엽니다.",
+        "addpictureillustrate": "JPG, PNG 이미지 형식을 지원하며, 각 이미지는 5MB를 초과할 수 없고, 최대 9장까지 업로드할 수 있습니다.",
+        "Marking": "주석",
+        "clearScreen": "화면 초기화",
+        "Extractor": "추출자",
+        "add": "추가",
+        "NoGuided": "현재 가이드가 없습니다.",
+        "NoFilesSelected": "아무 파일도 선택되지 않았습니다.",
+        "add1": "주석",
+        "ClearScreen": "화면 비우기",
+        "Extractionmethod": "추출 방법",
+        "tips1": "알림",
+        "Search": "검색",
+        "Datasize": "데이터 크기",
+        "Datasource": "데이터 출처",
+        "Displaysettings": "보기 설정",
+        "Noavailablemodels": "사용 가능한 모델을 감지할 수 없습니다.",
+        "AddPerspectives": "시점 추가",
+        "moveFail": "파일 이동에 실패했습니다. 충분한 저장 공간이 있는지 확인해 주세요.",
+        "Delete": "이 화면을 삭제하시겠습니까?"
     },
     "coord": {
         "edit": {
@@ -61,19 +293,66 @@
             "localUpdateGisUn": "로컬 좌표는 변경되었고 지리적 좌표는 변경되지 않았습니다.",
             "movePoint": "이곳으로 이동하다",
             "localPoint": "현지 좌표",
-            "whyTrapLocalPoint": "지역 좌표는 왜 설정합니까?"
-        }
+            "whyTrapLocalPoint": "지역 좌표는 왜 설정합니까?",
+            "gis": "지리 좌표",
+            "num": "도°",
+            "getGis": "지리 좌표를 어떻게 얻을 수 있나요?",
+            "noRepeat": "지리 좌표와 로컬 좌표가 일치하지 않습니다. 입력이 올바른지 확인해 주세요.",
+            "map": "지도",
+            "dms": "도°분′초″",
+            "noRepeatUpdate": "조정 방법 보기",
+            "gisDataErr": "데이터가 올바르지 않습니다. 지리 좌표 p1, p2 형식이 정확한지, 값이 동일한지 확인해 주세요!",
+            "localDataErr": "데이터가 올바르지 않습니다. 로컬 좌표 p1, p2 형식이 정확한지, 값이 동일한지 확인해 주세요!",
+            "diff": "차이"
+        },
+        "manageTitle": "지리 등록",
+        "name": "좌표",
+        "title": "좌표계",
+        "copySuccess": "좌표 복사 성공!",
+        "types": {
+            "wgs84": "WGS84",
+            "gis": "지구 좌표",
+            "pro": "투영 좌표",
+            "webMercator": "지구 좌표",
+            "screen": "스크린 좌표",
+            "local": "로컬 좌표"
+        },
+        "copy": "좌표 복사",
+        "ctrls": "제어점"
     },
     "view": {
         "scene": "3D",
         "side": "측면 보기",
         "sideRight": "측면 보기(E-W)",
         "density": {
-            "low": "낮"
+            "low": "낮",
+            "middle": "중",
+            "name": "점 클라우드 품질"
         },
         "sideLeft": "측면 보기( N-S)",
         "switchView": "보기 전환",
-        "opacity": "퍼지성"
+        "opacity": "퍼지성",
+        "switchMiniView": "{action}미니 뷰",
+        "colorMode": {
+            "translucent": "반투명",
+            "full": "컬러",
+            "altitude": "해발"
+        },
+        "strong": "엣지 강화",
+        "reset": "기본값으로 복원",
+        "shape": {
+            "circular": "원형",
+            "name": "점의 형태",
+            "rectangle": "직사각형"
+        },
+        "size": "점의 크기",
+        "showFloorpan": "평면도 표시",
+        "showPano": "탐색 포인트 표시",
+        "showGoogleMap": "구글 지도 표시",
+        "showMini": "미니 뷰 표시",
+        "showGaodeMap": "아모이 지도 표시",
+        "clound": "탐색 뷰",
+        "cloudSeting": "점 클라우드 설정"
     },
     "dataset": {
         "recalcJoinDeleteTip": "【{sceneName}】 가 다시 계산되었고 당신이 추가한 【{title}】 데이터셋은 삭제되었습니다",
@@ -83,14 +362,63 @@
         "backSearch": "검색결과로 돌아가요.",
         "upload": "업로드",
         "model": {
-            "volume": "부피 가"
-        }
+            "volume": "부피 가",
+            "delConstructTip": "건물을 삭제하면 해당 건물에 포함된 모든 공간 모델이 삭제됩니다. 그러나 데이터셋은 삭제되지 않습니다.",
+            "addFloorBottom": "하단에 층을 추가합니다.",
+            "addFloorTop": "상단에 층을 추가합니다.",
+            "resetTip": "기본 형태로 복원됩니다. 정말로 초기화하시겠습니까?",
+            "height": "층 높이",
+            "construct": "건물",
+            "room": "방",
+            "delNoconstructTip": "공간 모델을 삭제하시겠습니까?",
+            "floor": "층",
+            "name": "공간 이름",
+            "titleConfirm": "공간 이름이 비어 있어 저장할 수 없습니다.",
+            "showTitle": "공간 데이터",
+            "title": "공간 모델"
+        },
+        "refer": "참조 데이터셋",
+        "deleteJoinDeleteTip": "【{sceneName}】이(가) 삭제되었습니다. 추가하신 데이터셋 【{title}】도 함께 삭제되었습니다.",
+        "reset": {
+            "tip": "병합/업로드된 데이터셋과 그 위치에 있는 핫스팟, 측정값도 함께 삭제됩니다.",
+            "title": "기본 씬 복원을 확인하시겠습니까?"
+        },
+        "uploadName": "귀하가 업로드한",
+        "join": "병합",
+        "joinTitle": "데이터셋 병합",
+        "joinSBtn": "온라인 병합",
+        "exists": "추가 완료되었습니다.",
+        "unJoinDatasets": "귀하의 계정에는 추가할 수 있는 데이터셋이 없습니다.",
+        "backCalc": "백그라운드에서 계산 중입니다…",
+        "setting": {
+            "subtle": "미세 조정"
+        },
+        "manageTitle": "데이터셋 관리",
+        "title": "데이터셋",
+        "correctTitle": "데이터셋 보정",
+        "unsetTitle": "할당되지 않은 데이터셋",
+        "repeatUpload": "数据正在上传,请稍后再试",
+        "uploadIng": "파일 업로드 중입니다.",
+        "uploadCheck": "파일 이름에 다음과 같은 특수 문자는 포함할 수 없습니다: \" / : ? [ < + = ; , ¥ % & * 와 공백.",
+        "uploadSBtn": "로컬 업로드",
+        "format": "형식",
+        "pointNum": "점 개수",
+        "joinBtn": "지금 병합"
     },
     "crop": {
         "pointActions": {
             "intersect": "상자 내용만 남깁니다",
-            "exclude": "상자 안에서 제거"
-        }
+            "exclude": "상자 안에서 제거",
+            "rotate": "회전",
+            "clear": "비우기",
+            "move": "이동"
+        },
+        "resetConfirm": "초기 상태로 복원하려면 재계산이 필요합니다.  \n추가된 핫스팟, 측정, 공간 모델, 자른 효과, 병합/업로드된 데이터셋은 모두 삭제됩니다. 신중하게 진행해 주세요.",
+        "reset": "초기 상태로 복원",
+        "tipOper": "작업 알림",
+        "panoNotAllConnected": "끊어진 점클라우드가 감지되었습니다. 계산할 수 없습니다.",
+        "clearConfirm": "모든裁剪框을 비우시겠습니까? 이 작업은 취소할 수 없습니다.",
+        "calcConfirm": "계산을 진행하시겠습니까?\n계산에는 시간이 걸릴 수 있으니,裁剪이 완료된 후에 이 작업을 진행해 주세요."
     },
     "earthwork": {
         "unit": {
@@ -99,10 +427,88 @@
         "slamWring": "SLAM 모드에서 촬영한 장면은 당분간 토방량 측정 기능을 지원하지 않습니다.",
         "export": "보고서 다운로드",
         "downTitle": "데이터를 다운로드하다",
-        "stop": "그리기 중지"
+        "stop": "그리기 중지",
+        "calcClose": "계산 취소",
+        "calcAuthor": "보고자",
+        "baseNullTip": "기준면 유형은 비워둘 수 없습니다.",
+        "avgHeight": "평지 기준 고도",
+        "timeFormat": "YYYY년 MM월 DD일",
+        "pageMark": "총 {length}페이지 중 {index}페이지",
+        "toolTip": "포인트 전환 지점 그리기 취소.",
+        "unSave": "토사량 측정 결과가 저장되지 않아 공유 링크를 생성할 수 없습니다.",
+        "calcConfirmMsg": "토사 계산 과정에서 씬이 잠겨져 있어 조작할 수 없습니다.",
+        "name": "토사량",
+        "calcSuccess": "토사 계산이 완료되었습니다.",
+        "start": "토사량 계산",
+        "downloadName": "토사량 측정 결과",
+        "exportPDF": "PDF 내보내기",
+        "defaultTitle": "토사량",
+        "nameLabel": "토사량 명명",
+        "datLabel": "좌표점 (dat 형식 파일)",
+        "baseLabel": "기준면",
+        "heightLabel": "평지 기준 고도",
+        "wxError": "WeChat 브라우저에서는 PDF 내보내기가 지원되지 않습니다.",
+        "digAndFill": "동시에 발굴과 매립이 존재합니다.",
+        "nameNullTip": "토사량 명칭은 비워 둘 수 없습니다.",
+        "heightNullTip": "기준면 높이는 비워둘 수 없습니다.",
+        "fillOptions": [
+            "{min}~{max}m³ 입력",
+            "{min}m³보다 큰 값을 입력하세요."
+        ],
+        "fillV": "매립 부피",
+        "avgArea": "평지 면적",
+        "shareName": "보고서",
+        "calcTime": "보고 날짜",
+        "calcTitle": "토사량 계산 중",
+        "pdfTitle": "토사량 총량 계산 결과",
+        "dig": "매립량",
+        "zarea": "평지 전체 면적",
+        "zfill": "총 매립량",
+        "zdig": "총 발굴량",
+        "downFormatType": "데이터 유형",
+        "downloadTitle": "측정 보고서",
+        "invalidPoint": "점 클라우드가 비어 있어 측정할 수 없습니다.",
+        "titlePlac": "\"추가 메모\"를 클릭하세요.",
+        "repeatTitle": "다시 그리시겠습니까?",
+        "heightTypes": [
+            null,
+            "최고점 평면",
+            "최저점 평면"
+        ],
+        "unTitle": "이름 없음",
+        "uncalcs": "계산되지 않은 토사량은 {name}을(를) 할 수 없으며, 자동으로 필터링되었습니다.",
+        "repeatContent": "【확인】을 클릭하면 이미 그려진 토사 범위 선이 지워집니다.",
+        "digOptions": [
+            "발굴 {min}~{max}m³",
+            "{min}m³보다 큰 발굴"
+        ],
+        "digV": "발굴 부피",
+        "downName": "데이터",
+        "calcDefault": "알 수 없음",
+        "fill": "발굴량",
+        "maxHeight": "최대 고도",
+        "minHeight": "최소 고도",
+        "uncalc": "계산되지 않았습니다.",
+        "downIng": "다운로드 중입니다.",
+        "calcConfirmTitle": "계산을 진행하시겠습니까?"
     },
     "epoint": {
-        "closeRTK": "RTK 위치 끄기"
+        "closeRTK": "RTK 위치 끄기",
+        "pointActions": {
+            "disconnect": "연결 삭제",
+            "scale": "확대",
+            "rotate": "회전",
+            "move": "이동"
+        },
+        "openRTKTip": "RTK 파라미터를 사용하여 위치를 측정합니다.",
+        "closeRTKTip": "현재 위치를 사용하여 위치를 측정합니다.",
+        "openRTK": "RTK 위치 측정을 시작합니다.",
+        "un-select": "점클라우드를 선택하지 않으면 전체 파노라마 이미지를 표시할 수 없습니다.",
+        "title": "점위 보정",
+        "editTip": "점클라우드를 선택하지 않은 상태에서 마우스 왼쪽 버튼으로 시점을 회전하고, 오른쪽 버튼으로 시점을 이동할 수 있습니다.",
+        "panoNotAllConnected": "끊어진 점클라우드가 감지되었습니다. 계산할 수 없습니다.",
+        "calcConfirm": "계산을 진행하시겠습니까?  \n씬은 기본값으로 복원됩니다. 점 클라우드 씬에 추가된 핫스팟, 측정, 공간 모델, 병합/업로드된 데이터셋은 삭제되며, 자른 점 클라우드는 초기 상태로 복원됩니다. 또한, Obj 씬의 모델이 리셋됩니다.",
+        "calcConfirmKanKan": "계산을 진행하시겠습니까?\n씬은 기본 상태로 복원되며, 추가된 3D 모델이 삭제됩니다."
     },
     "err": {
         "serve": {
@@ -111,9 +517,15 @@
             ]
         },
         "scene": {
-            "webgl": "메모리가 부족합니다. 여러 페이지나 프로그램을 동시에 열지 마십시오. 브라우저를 다시 시작한 후 다시 여십시오."
+            "webgl": "메모리가 부족합니다. 여러 페이지나 프로그램을 동시에 열지 마십시오. 브라우저를 다시 시작한 후 다시 여십시오.",
+            "archive": "씬이 보관되었습니다.",
+            "un": "씬이 존재하지 않습니다. 씬 코드를 확인해 주세요.",
+            "del": "씬이 삭제되었습니다.",
+            "run": "씬이 계산 중입니다. 잠시만 기다려 주세요...",
+            "err": "씬 계산에 실패했습니다. 다시 시도해 주세요."
         },
-        "preset": "메모리가 부족합니다. 여러 페이지나 프로그램을 동시에 열지 마십시오. 브라우저를 다시 시작한 후 다시 여십시오."
+        "preset": "메모리가 부족합니다. 여러 페이지나 프로그램을 동시에 열지 마십시오. 브라우저를 다시 시작한 후 다시 여십시오.",
+        "sdk": "레이저 씬 열기에 실패했습니다. 브라우저를 닫고 다시 열어 주세요."
     },
     "help": {
         "prev": "이전 단계",
@@ -121,34 +533,132 @@
         "tip": "다음 번에 여기에서 자습서를 열 수 있습니다.",
         "mobile": {
             "step4": {
-                "title": "점구름/파노라마 전환"
+                "title": "점구름/파노라마 전환",
+                "content": "버튼을 클릭하여 파노라마/포인트 클라우드를 전환합니다."
+            },
+            "step3": {
+                "content": "두 손가락으로 화면을 밀거나 모아서 확대 또는 축소하세요."
+            },
+            "step2": {
+                "content": "스크린을 좌우로 슬라이드하세요.",
+                "title": "시점 회전"
+            },
+            "step1": {
+                "content": "임의의 방향을 클릭하면 이동할 수 있습니다."
             }
-        }
+        },
+        "edit": {
+            "download": [
+                "전체 씬을 다운로드하거나 씬을 자른 후 다운로드할 수 있습니다. 지원되는 다운로드 형식: las, ply, e57, obj. 포인트 클라우드 형식으로 다운로드 시 좌표를 포함할 수 있습니다."
+            ],
+            "data": [
+                "우측 목록에는 모든 데이터가 표시되며, 포인트 클라우드 모드로 진입한 후 체크박스를 클릭하여 해당 포인트 클라우드를 숨기거나 표시할 수 있습니다."
+            ],
+            "hotspot": [
+                "우측 목록에 모든 데이터가 표시되며, 포인트 클라우드 모드에 들어간 후 체크박스를 클릭하여 해당 포인트 클라우드를 숨기거나 표시할 수 있습니다."
+            ],
+            "epoint": [
+                "씬 촬영 과정에서 위치 오류가 발생한 경우, 이 모듈에서 조정할 수 있습니다."
+            ],
+            "spaceDivision": [
+                "여러 데이터셋을 씬에导入/업로드한 경우, 이 모듈에서 결합하여 씬을 정상적으로 탐색할 수 있도록 해야 합니다."
+            ],
+            "coordinate": [
+                "이 기능은 귀하의 씬을 실제로 지도에 매핑하고 정확한 지리 좌표를 가져옵니다. 씬 촬영 시 RTK 또는 관련 장비를 사용하여 제어점을 확보하고, 매개변수를 수동으로 입력해야 합니다. 만약 카메라에 RTK가 구성되어 있다면, 시스템이 제어점 데이터를 자동으로 가져와 수동 입력이 필요하지 않습니다."
+            ],
+            "query": [
+                "보기 모드는 인터페이스에 표시되는 내용을 제어할 수 있습니다. 오른쪽 하단에서 점클라우드 모드로 전환한 후, 점클라우드 표시 설정을 할 수 있습니다."
+            ],
+            "measure": [
+                "[측정 시작]을 클릭하여 길이와 면적을 측정하세요."
+            ],
+            "spaceModel": [
+                "이 모듈은 씬을 구역으로 나눠줄 수 있습니다. 구역을 나눈 후, 해당 구역을 검색하면 위치를 찾을 수 있으며, 구역별로 네비게이션도 가능합니다."
+            ],
+            "floorpan": [
+                "알고리즘이 자동으로 씬 평면도를 생성하며, 다운로드, 교체 또는 숨기기를 지원합니다."
+            ]
+        },
+        "query": {
+            "cloud": [
+                "마우스 왼쪽 버튼을 누르고 있으면, 카메라 방향을 회전할 수 있습니다.",
+                "마우스 오른쪽 버튼을 누르고 있으면, 뷰를 이동할 수 있습니다.",
+                "지면 포인트를 클릭하면 시점을 전환하여 씬에서 자유롭게 탐색할 수 있습니다.",
+                "왼쪽 하단 버튼을 클릭하여 파노라마 이미지/점 클라우드를 전환할 수 있습니다."
+            ],
+            "pano": [
+                "마우스 왼쪽 버튼을 누르고 있으면, 카메라 방향을 회전할 수 있습니다.",
+                "지면 포인트를 클릭하면 시점을 전환하여 장면을 탐색할 수 있습니다.",
+                "왼쪽 하단 버튼을 클릭하여 파노라마 이미지/점 클라우드를 전환할 수 있습니다."
+            ]
+        },
+        "title": "초보자 가이드",
+        "init": "씬 편집 플랫폼에 오신 것을 환영합니다!",
+        "link": "사용자 매뉴얼"
     },
     "hotspot": {
         "all": "모든 핫스팟",
         "meta": {
             "image": {
-                "place": "그림 업로드"
+                "place": "그림 업로드",
+                "title": "이미지",
+                "desc": "JPG, PNG 이미지 형식을 지원하며, 각 이미지는 5MB를 초과할 수 없고, 최대 9장까지 업로드할 수 있습니다."
             },
             "video": {
-                "place": "동영상 업로드"
+                "place": "동영상 업로드",
+                "desc": "MP4, MOV 비디오 형식을 지원하며, 비디오의 비트레이트는 2Mbps 이하, 파일 크기는 20MB를 초과할 수 없습니다."
             },
             "audio": {
-                "place": "오디오 업로드"
+                "place": "오디오 업로드",
+                "desc": "MP3, WAV 형식을 지원하며, 파일 크기는 5MB를 초과할 수 없습니다."
             }
-        }
+        },
+        "range": {
+            "set": "시야 범위 설정",
+            "max": "최대",
+            "min": "최소"
+        },
+        "edit": {
+            "unTitle": "핫스팟에 제목이 작성되지 않았습니다.",
+            "addLink": "링크 추가"
+        },
+        "added": "핫스팟이 추가되었습니다.",
+        "name": "핫스팟",
+        "show": "핫스팟 표시",
+        "addMenu": "핫스팟 추가",
+        "deleteConfirm": "이 {type}을(를) 삭제하시겠습니까?"
     },
     "measure": {
         "unit": {
             "meter": "미터"
         },
         "stop": "측정 중지",
-        "name": "측정하다"
+        "name": "측정하다",
+        "pageMark": "총 {length}페이지 중 제 {index}페이지",
+        "toolTip": "측정 도구 선택 해제 시 포인트 전환이 가능합니다.",
+        "exportPDF": "PDF 내보내기",
+        "export": "측정 내보내기",
+        "start": "측정을 시작합니다.",
+        "wxError": "WeChat 브라우저에서는 PDF 내보내기가 지원되지 않습니다.",
+        "downloadName": "측정 결과",
+        "unSave": "측정 결과가 저장되지 않아 공유 링크를 생성할 수 없습니다.",
+        "invalidPoint": "점 클라우드가 비어 있어 측정할 수 없습니다.",
+        "titlePlac": "\"추가 메모\"를 클릭하세요."
     },
     "record": {
         "all": "모든 비디오",
-        "start": "녹화를 시작합니다"
+        "start": "녹화를 시작합니다",
+        "countdown": "{mis}초 후 녹화를 시작합니다",
+        "backRun": "백그라운드에서 처리 중입니다.",
+        "showSettings": [
+            "핫스팟",
+            "측정하다",
+            "좌표"
+        ],
+        "fileName": "스크린 녹화",
+        "desc": "<span>{key}</span>를 눌러 녹화를 일시 정지할 수 있습니다.",
+        "showSetting": "보기 설정",
+        "delTip": "이 비디오를 삭제하시겠습니까?"
     },
     "resStatus": {
         "503": "업로드 중 이상이 발생했습니다",
@@ -158,32 +668,95 @@
         "6006": "업로드한 그림의 크기가 원본과 일치하지 않습니다",
         "6007": "업로드한 그래픽 데이터가 잘못되었습니다",
         "6000": "이 데이터셋이 존재하지 않습니다.",
-        "8005": "식별을 기다려요"
+        "8005": "식별을 기다려요",
+        "400": "매개변수 목록 오류 (누락 또는 형식 불일치)",
+        "6004": "장면 크기가 제한을 초과하여 병합 다운로드에 실패했습니다.",
+        "6011": "final_freespace 파일이 존재하지 않습니다.",
+        "3006": "fdToken 검증에 실패했습니다.",
+        "6005": "info.json 파일이 존재하지 않습니다. 확인해 주세요.",
+        "3104": "route가 존재하지 않습니다",
+        "2002": "숫자 또는 영문 대소문자만 입력 가능합니다.",
+        "8004": "백그라운드에서 처리 중입니다. 반복해서 업로드하지 마세요.",
+        "8008": "현재 씬은 이 작업을 지원하지 않습니다.",
+        "2001": "obj 다운로드에 실패했습니다",
+        "3001": "객체가 존재하지 않습니다.",
+        "3102": "씬이 존재하지 않습니다.",
+        "4004": "씬 검증에 실패했습니다.",
+        "6010": "vision.txt 파일이 존재하지 않습니다",
+        "5030": "동일 수준의 폴더 이름은 중복될 수 없습니다.",
+        "8010": "장면 원본 데이터가 만료되어 재계산을 지원하지 않습니다.",
+        "8009": "장면 복사는 재계산을 지원하지 않습니다.",
+        "8001": "기본 점클라우드 복원에 실패했습니다. 해당 점클라우드 데이터를 찾을 수 없습니다.",
+        "4008": "해당 데이터셋이 합병 중입니다. 일시적으로 작업을 진행할 수 없습니다.",
+        "304": "작업이 실패했습니다. 로그아웃되었습니다.",
+        "200": "작업이 성공적으로 완료되었습니다.",
+        "401": "패킹되지 않음",
+        "507": "파일 이름이 너무 깁니다. 수정한 후 다시 업로드해 주세요.",
+        "2006": "파일 형식이 잘못되었습니다. PNG 이미지 형식만 지원됩니다.",
+        "3007": "해당 작업을 찾을 수 없습니다.",
+        "2005": "검증 실패",
+        "2004": "검증 성공",
+        "3002": "특수 점 표 좌표에 이상이 있습니다.",
+        "3105": "제어점 계산 결과가 존재하지 않습니다. 재계산을 시도해 주세요.",
+        "4007": "데이터셋 추가에 실패했습니다.",
+        "4002": "제어점 좌표가 수정 중입니다. 일시적으로 작업을 진행할 수 없습니다.",
+        "3101": "계산 중입니다.",
+        "5027": "파일夹이 존재하지 않습니다.",
+        "5028": "해당 폴더를 수정할 권한이 없습니다.",
+        "6009": "평면도 파일이 생성되지 않았습니다. 평면도 알고리즘이 성공적으로 호출되었는지 확인해 주세요.",
+        "8002": "편집할 수 있는 포인트 클라우드를 가져올 수 없습니다.",
+        "408": "로그인 상태가 만료되어 자동으로 로그아웃되었습니다.",
+        "3009": "로그인에 실패했습니다. 잠시 후 다시 시도해 주세요.",
+        "loginErr": "로그인에 실패했습니다. 잠시 후 다시 시도해 주세요.",
+        "6008": "알고리즘으로 평면도 생성에 실패했습니다. info.json 파일이 존재하지 않습니다."
     },
     "scene": {
         "objTip": "망사 프로젝트",
         "notice": {
-            "handerSuccess": "데이터 처리가 완료되었습니다."
+            "handerSuccess": "데이터 처리가 완료되었습니다.",
+            "updateSuccess": "씬이 수정되었습니다. 시스템이 곧 페이지를 새로 고칩니다.",
+            "handerTitle": "백그라운드 처리 완료",
+            "handerIng": "씬이 잠겨 있어 편집할 수 없습니다. 계속해서 씬을 탐색할 수 있습니다.",
+            "resetSuccess": "씬이 재계산되었습니다. 시스템이 곧 페이지를 새로 고칩니다.",
+            "coordResetSuccess": "제어점 좌표가 수정되었습니다. 시스템이 곧 페이지를 새로 고칩니다.",
+            "updateTitle": "알림"
         },
         "pano": "파노라마",
         "download": {
             "format": "다운로드 형식",
-            "cloud": "포인트 클라우드 다운로드"
+            "cloud": "포인트 클라우드 다운로드",
+            "formatNotSupport": "형식을 지원하지 않습니다.",
+            "cloudSuccess": "점 클라우드 다운로드가 완료되었습니다.",
+            "btn": "지금 다운로드"
         },
         "spaceModel": {
-            "defaultFloorTitle": "건물"
+            "defaultFloorTitle": "건물",
+            "title": "공간 모델"
         },
         "floorpan": {
             "customize": {
                 "steps": [
                     null,
                     "업로드, 원본문서형식으로업로드, 크기를수정하지않습니다."
-                ]
-            }
+                ],
+                "success": "평면도 업데이트가 완료되었습니다."
+            },
+            "downsuccess": "평면도 다운로드가 완료되었습니다.",
+            "title": "평면도",
+            "un": "평면도가 업로드되지 않았습니다."
         },
         "pose": {
-            "unImage": "전경 모드에서는 위치를 설정할 수 없습니다"
-        }
+            "unImage": "전경 모드에서는 위치를 설정할 수 없습니다",
+            "unSid": "해당 panoSid를 찾을 수 없습니다."
+        },
+        "flyCurrent": "귀하는 이미 해당 위치에 있습니다.",
+        "navStart": "네비게이션 시작점",
+        "nav": "네비게이션",
+        "navEnd": "네비게이션 종점",
+        "navPath": "네비게이션 경로",
+        "cloud": "점 클라우드",
+        "cloudTip": "점 클라우드 모드로 전환하려면 클릭하세요.",
+        "getPointError": "빈 영역에서는 점위를 가져올 수 없습니다. 점 클라우드 영역으로 이동한 후 다시 시도해 주세요."
     },
     "sys": {
         "repeatPwdDiff": "두 번 입력한 비밀번호가 일치하지 않습니다",
@@ -195,28 +768,161 @@
         "upload": "업로드",
         "download": "다운로드",
         "uploadErr": {
-            "accept": "{accept} 형식만 지원합니다"
+            "accept": "{accept} 형식만 지원합니다",
+            "size": "{name}의 크기가 {size}를 초과했습니다",
+            "scale": "{name}의 비율이 {scale}와 일치하지 않습니다",
+            "len": "최대 {len}개의 파일만 지원됩니다!"
         },
         "all": "전부",
         "compatible": {
             "chrome": "Chrome",
             "edg": "Microsoft Edge",
-            "safari": "Safari"
+            "safari": "Safari",
+            "selectTip": "다음 브라우저 사용을 권장합니다.",
+            "tip": "페이지를 열 수 없습니다. 브라우저를 업그레이드하거나 변경한 후 다시 열어주세요.",
+            "ff": "파이어폭스"
         },
         "downloadSuccess": "성공적으로 다운로드했습니다",
         "downloadAndroidSuccess": "다운로드하였습니다. 파일을 가져오려면 관련 폴더를 여십시오",
         "downloadIosSuccess": "다운로드하였습니다. 파일을 가져오려면 관련 폴더를 여십시오",
         "time": {
-            "m": "분"
+            "m": "분",
+            "h": "시간",
+            "s": "초"
         },
         "setting": {
             "setName": "이름 수정",
-            "public": "공개"
+            "public": "공개",
+            "setNameErr": "장면 이름은 비워둘 수 없습니다!",
+            "pwd": "암호화",
+            "setView": "보기 설정",
+            "setOpen": "보기 설정"
         },
         "cancel": "취소하다",
         "ok": "알겠습니다",
         "enter": "확정하다",
         "edit": "편집하다",
-        "crop": "자르다"
+        "crop": "자르다",
+        "updatePwdSuccess": "비밀번호 변경이 완료되었습니다.",
+        "forgetPwd": "비밀번호를 잊으셨나요?",
+        "sysFailAndUdriveTip": "동기화 실패, 동기화 중에는 USB 드라이브를 빼거나 동기화 디렉토리를 변경하지 마세요!",
+        "resetCodeTime": "{count}초 후 다시 전송합니다",
+        "unPwdPlace": "비밀번호는 비워둘 수 없습니다.",
+        "pwdReg": "비밀번호는 영어 대소문자, 숫자를 포함해야 하며, 길이는 8~16자여야 합니다.",
+        "forceLeaveConfirm": "저장되지 않은 작업이 있습니다. 정말로 종료하시겠습니까?",
+        "pwdErr": "비밀번호가 잘못되었습니다.",
+        "unPhonePlace": "휴대폰 번호는 비워둘 수 없습니다.",
+        "qrPlace": "4D Kankan 앱을 열고 QR 코드를 스캔하여 로그인하세요.",
+        "help": "도움말 센터",
+        "retrievePwd": "비밀번호 찾기",
+        "refer": "새로고침",
+        "open": "시작",
+        "ignore": "무시",
+        "exitWarmTip": "지금 프로그램을 종료하면 진행 중인 동기화 또는 계산 작업이 중단됩니다. 종료하시겠습니까?",
+        "unSearchData": "결과를 찾을 수 없습니다.",
+        "searchAll": "검색",
+        "search": "건물\\방\\핫스팟 등을 검색하세요.",
+        "query": "보기",
+        "title": "레이저",
+        "dialogTitle": "알림",
+        "unData": "현재 데이터가 없습니다.",
+        "repeatLogin": {
+            "title": "다른 장치에서 이미 해당 계정에 로그인한 것이 감지되었습니다. 계속 진행하시겠습니까?"
+        },
+        "submit": "제출",
+        "show": "표시",
+        "add": "추가",
+        "uploadReplaceText": "교체",
+        "unset": "설정되지 않음",
+        "unUpdate": "수정되지 않았습니다.",
+        "noAppUnknownError": "작업이 실패했습니다. 다음 애플리케이션이 인증되었는지 확인해 주세요:",
+        "noAppWarmTip": "해당 프로그램을 감지할 수 없습니다. 아래 디렉토리에 프로그램 파일을 따라 설명에 맞게 배치해 주세요:",
+        "accountLoginTitle": "사용자 로그인",
+        "login": "로그인",
+        "qrLoginTitle": "카메라 로그인",
+        "unRepeatPwd": "확인 비밀번호는 비워둘 수 없습니다.",
+        "logoutConfirm": "로그아웃하시겠습니까?",
+        "resetConfirm": "초기화하시겠습니까? 이 작업은 취소할 수 없습니다."
+    },
+    "sceneDetail": {
+        "title": "씬 데이터"
+    },
+    "sceneHome": {
+        "sceneList": "장면 목록",
+        "dyrh": "다중 합성",
+        "library": "미디어 라이브러리",
+        "addScene": "씬 추가",
+        "yc": "제거",
+        "delTops": "삭제하시겠습니까?",
+        "ycTips": "현재 씬을 제거하시겠습니까?"
+    },
+    "mediaLibrary": {
+        "Modeling": "경사 촬영",
+        "photography": "단체 모델링",
+        "title": "미디어 라이브러리",
+        "upload": "업로드",
+        "setGrouping": "그룹 수정",
+        "groupingList": "그룹 목록",
+        "grouping": "그룹 관리",
+        "addFile": "파일 업로드",
+        "createTime": "업로드 시간",
+        "fileType": {
+            "0": "전체",
+            "1": "이미지",
+            "5": "기타",
+            "4": "모델"
+        },
+        "dictName": "그룹",
+        "tips": {
+            "del": "삭제 완료했습니다",
+            "uplooad": "업로드 중입니다",
+            "uplooadErr": "업로드에 실패했습니다",
+            "edit": "수정 완료했습니다",
+            "objtips": "obj: 반드시 zip 파일로 업로드해야 합니다. zip 파일에는 텍스처, 모델, mtl 파일이 포함되어야 하며, 폴더는 포함할 수 없습니다. 또한, 파일명에는 한글이나 특수 문자를 사용할 수 없습니다. 아래 예시를 참고해 주세요:",
+            "uplooadSuccess": "업로드 성공했습니다",
+            "uplooadSize": "업로드 파일은 2GB를 초과할 수 없습니다!",
+            "osgbtips": "OSGB 업로드: 반드시 zip 파일로 업로드해야 합니다. zip 파일에는 Data 폴더와 xml 파일이 포함되어야 하며, 추가적인 폴더를 포함할 수 없습니다. 또한, 파일명에는 한글이나 특수 문자를 사용할 수 없습니다. 아래 예시를 참고해 주세요:",
+            "operate": "작업이 성공적으로 완료되었습니다.",
+            "add": "추가 성공!",
+            "uplooadfiletype": "JPG, PNG, JPEG, MP4, WAV, MP3, SHP, ZIP 형식의 파일 업로드를 지원합니다.",
+            "deltext": "삭제하시겠습니까? 이 작업은 취소할 수 없습니다."
+        },
+        "addFolder": "새 폴더 만들기",
+        "add": "파일 추가",
+        "addgrouping": "새 그룹 추가",
+        "addFileTip": "JPG, PNG 이미지 형식을 지원하며, 한 장의 이미지만 가능합니다.",
+        "addFileErr": "파일 이름은 비워둘 수 없습니다!",
+        "addFolderErr": "파일夹 이름은 비워둘 수 없습니다!",
+        "fileTypeStr": "파일 유형",
+        "operate": "작업",
+        "fileFormat": "파일 형식",
+        "statusStr": "상태"
+    },
+    "fire": {
+        "effect": {
+            "listTitle": "제가 추가한",
+            "types": {
+                "fire": "불",
+                "smoke": "연기",
+                "blast": "폭발"
+            },
+            "title": "특수 효과"
+        },
+        "video": {
+            "title": "가이드"
+        },
+        "model": "모델",
+        "title": "소방 관리 플랫폼",
+        "addTip": "마우스 오른쪽 버튼을 클릭하거나 Esc 키를 눌러 추가를 취소할 수 있습니다.",
+        "deleteConfirm": "이 데이터를 삭제하시겠습니까?"
+    },
+    "tool": {
+        "vfree": "수직",
+        "area": "다각형",
+        "magnify": "돋보기",
+        "rotate": "회전",
+        "lfree": "수평",
+        "rect": "직사각형",
+        "move": "이동"
     }
 }

+ 8 - 1
src/i18n/weblate/zh.json

@@ -362,7 +362,13 @@
             "sceneType": "场景类型",
             "query": "查询",
             "sceneName": "场景标题",
-            "num": "场景码"
+            "num": "场景码",
+            "status_2": "计算成功",
+            "status_-1": "计算失败",
+            "status_0": "计算中",
+            "status_4": "重算中",
+            "status_3": "封存",
+            "updateTime": "更新时间"
         },
         "calcFailureTip": "确定重算?部分此操作无法撤销。 注意:重算点云场景会清空部分数据如合并的数据集、热点等,请谨慎操作。"
     },
@@ -1098,6 +1104,7 @@
         "sceneList": "场景列表",
         "yc": "移除",
         "addScene": "添加场景",
+        "sceneName": "场景名称",
         "delTops": "确定删除?",
         "ycTips": "确定要移除当前场景吗?"
     },

+ 1 - 1
src/store/case.ts

@@ -346,7 +346,7 @@ export const getUrlSrc = (item, caseId) => {
   param.swssUrl = `${params.swssUrl}?lang=${langKey}&serve_link=${param.laserRoot}&basePath=${param.laserRoot}&m=${item.num}`;
   param.swssmxUrl = `${params.swssUrl}?lang=${langKey}&serve_link=${param.laserRoot}&basePath=${param.laserRoot}&m=${item.num}`;
   param.swkkUrl = `${params.swkkUrl}?lang=${langKey}&app_server=${params.ip}${params.swkkPort}&m=${item.num}`;
-  param.fuse = `${params.fuse}?caseId=${caseId}&single&ip=${params.ip}&swkkPort=${params.swkkPort}&swssUrl=${params.swssUrl}&swkkUrl=${params.swkkUrl}&laserServicePort=${params.laserServicePort}&servicePort=${params.servicePort}&lang=${langKey}&app_server=${ip}${params.swkkPort}&testMap&static=&`;
+  param.fuse = `${params.fuse}?caseId=${caseId}&single&ip=${params.ip}&swkkPort=${params.swkkPort}&swssUrl=${params.swssUrl}&swkkUrl=${params.swkkUrl}&laserServicePort=${params.laserServicePort}&servicePort=${params.servicePort}&lang=${langKey}&app_server=${ip}${params.swkkPort}&testMap=1&static=&`;
   let SceneType = {
     0: params.swkkUrl,//`/spg.html?m=${item.num}`,
     1: params.swkkUrl,//`/spg.html?m=${item.num}`,

+ 3 - 3
src/store/scene.ts

@@ -50,10 +50,10 @@ export type QuoteScene = BaseScene & {
 
 // 普通场景状态
 export enum QuoteSceneStatus {
-  DEL = -2,
+  DEL = -1,
   RUN = 0,
-  ERR = -1,
-  SUCCESS = 1,
+  ERR = 1,
+  SUCCESS = 2,
   ARCHIVE = 3,
   RERUN = 4,
 }

+ 1 - 1
src/util/index.ts

@@ -378,7 +378,7 @@ export const windowOpen = (param) => {
       window.parent.postMessage(data, '*');
   } else if(param.type) {//按钮事件
     // iframe发送消息到 父页面
-    let data = JSON.stringify({type: param.type, data: data.data||'', library: param.library});
+    let data = JSON.stringify({type: param.type, data: param && param.data||'', library: param.library});
     window.parent.postMessage(data, '*');
   }else {
     let data = JSON.stringify({type:"link", data:param.url || param, library: param.library});

+ 2 - 1
src/view/case/quisk.ts

@@ -11,6 +11,7 @@ import SelectFuseImage, { FuseImage } from "./draw/selectFuseImage.vue";
 import SelectMapImage, { MapImage } from "./draw/selectMapImage.vue";
 import { quiskMountFactory } from "@/helper/mount";
 import { nextTick } from "vue";
+import { ui18n } from '@/i18n'
 
 export const addCaseFile = quiskMountFactory(AddCaseFile, {
   title: "上传附件",
@@ -28,7 +29,7 @@ export const addCaseImgFileAll = quiskMountFactory(addPhotoFileAll, {
 
 
 export const addCaseScenes = quiskMountFactory(AddScenes, {
-  title: "添加场景",
+  title: ui18n.t('sceneHome.addScene'),
   width: 800,
 });
 

+ 43 - 18
src/view/mediaLibrary/TableComponent.vue

@@ -54,9 +54,9 @@
         </div>
       </el-form-item>
       <el-form-item style="float: right; margin-right: 0">
-        <el-button  @click="windowOpen({type: 'photography', library: true})">{{$t('mediaLibrary.photography')}}</el-button>
-        <el-button  @click="windowOpen({type: 'modeling', library: true})">{{$t('mediaLibrary.Modeling')}}</el-button>
-        <!-- <el-button type="primary" @click="handleAddfz">{{$t('mediaLibrary.grouping')}}</el-button> -->
+        <el-button   @click="windowOpen({type: 'photography', library: true})">{{$t('mediaLibrary.photography')}}</el-button>
+        <el-button v-if="modeling == 1"  @click="windowOpen({type: 'modeling', library: true})">{{$t('mediaLibrary.Modeling')}}</el-button>
+        <!--v-if="photography == 1" <el-button type="primary" @click="handleAddfz">{{$t('mediaLibrary.grouping')}}</el-button> -->
         <el-button type="primary" @click="handleAdd">{{$t('mediaLibrary.upload')}}</el-button>
       </el-form-item>
     </el-form>
@@ -135,9 +135,11 @@
           <el-upload
             class="upload-demo"
             style="width: 100%"
+            ref="upload"
             :multiple="false"
             :limit="1"
             :before-upload="beforeUpload"
+            :on-exceed="handleExceed"
             :file-list="fileList"
             :http-request="() => {}"
             :on-preview="previewFile"
@@ -217,10 +219,10 @@
     </template>
   </el-dialog>
   <!-- //查看资源下载 -->
-  <el-dialog v-model="dialogDowm.show" title="资源查看" :width="dialogDowm.type == 4?800:600">
+  <el-dialog v-model="dialogDowm.show" title="资源查看" :width="dialogDowm.type == 4?800:600" @close="handleClose">
     <div class="showContent">
       <img style="width: 100%;object-fit: cover;" :src="dialogDowm.url" alt="" v-if="dialogDowm.type == 0"/>
-      <video controls style="width: 100%;object-fit: cover;" :style="{height:dialogDowm.type == 2?'50px':'auto'}":src="dialogDowm.url" alt="" v-else-if="dialogDowm.type == 1 || dialogDowm.type == 2"/>
+      <video ref="audio" controls style="width: 100%;object-fit: cover;" :style="{height:dialogDowm.type == 2?'50px':'auto'}":src="dialogDowm.url" alt="" v-else-if="dialogDowm.type == 1 || dialogDowm.type == 2"/>
       <iframe style="width: 100%; height: 400px" v-else :src="dialogDowm.url" frameborder="0"></iframe>
   </div>
     <template #footer>
@@ -242,7 +244,7 @@ import { getByKeyList, getfzdel, getdictFiledel, getaddOrUpdate, setFileaddOrUpd
 import dayjs from "dayjs";
 import obj from "@/assets/images/obj.jpg";
 import osgb from "@/assets/images/osgb.jpg";
-import { ElMessage, ElMessageBox } from "element-plus";
+import { ElMessage, ElMessageBox, genFileId } from "element-plus";
 import { ui18n } from '@/i18n'
 import { windowOpen } from "@/util";
 import { getUrlData } from "@/store/user";
@@ -288,8 +290,16 @@ const dialogData = ref({
   fzName: '',
   fzList: [],
 });
+const upload = ref(null)
 const file = ref(null);
-const accept = ".jpg,.png,.jpeg,.mp4,.wav,.mp3,.shp";
+const audio = ref(null);
+const accept = ".jpg,.png,.jpeg,.mp4,.wav,.mp3,.shp,.zip";
+const handleClose = () => {
+  console.log("handleClose", audio.value);
+  if(audio.value){
+    audio.value.pause()
+  }
+};
 const hanleFzDle = (item) => {
   ElMessageBox.confirm(ui18n.t('mediaLibrary.tips.deltext'), ui18n.t('sys.dialogTitle'), {
     confirmButtonText: ui18n.t('sys.enter'),
@@ -297,6 +307,7 @@ const hanleFzDle = (item) => {
   }).then(async () => {
     await getfzdel(item);
     dictIdList.value = dictIdList.value.filter(item1 => item1.id !== item.id)
+    initData();
     ElMessage({
       type: "success",
       message: ui18n.t('mediaLibrary.tips.del'),
@@ -325,13 +336,12 @@ const removeFile = () => {
   return true;
 };
 const handleAdd = () => {
-  addForm.value.dictId = '';
-  addForm.value.dictId = '';
   fileList.value = [];
-  dialogData.value = {
-    show: true,
-    title: ui18n.t('sys.upload')
-  };
+  addForm.value.dictId = '';
+  dialogData.value.title = ui18n.t('sys.upload');
+  setTimeout(() => {
+  dialogData.value.show = true;
+  }, 100)
 };
 const handlefzAdd = async () => {
   let params = {
@@ -343,7 +353,7 @@ const handlefzAdd = async () => {
   await getaddOrUpdate(params);
   ElMessage({
     type: "success",
-    message: ui18n.t('mediaLibrary.tips.placeholderName'),
+    message: ui18n.t('mediaLibrary.tips.add'),
   });
   getFzlist();
   dialogData.value.fzName = '';
@@ -355,6 +365,7 @@ const handleAddfz = () => {
 const handleuploadAdd = async () => {
   console.log('formData', dialogData.value.title);
   if (dialogData.value.title != ui18n.t('sys.upload')){
+    if (!addForm.value.dictId) return ElMessage.error(ui18n.t('mediaLibrary.tips.dictId'));
     await setFileaddOrUpdate({
       id: dialogData.value.data?.id,
       dictId: addForm.value.dictId,
@@ -368,17 +379,22 @@ const handleuploadAdd = async () => {
     });
   } else {
     const formData = new FormData();
-    formData.append("file", fileList.value && fileList.value[0]);
+    const file = fileList.value && fileList.value[0]
+    if (!file) return ElMessage.error(ui18n.t('mediaLibrary.tips.addUploadErr'));
+    console.log(file, "file");
+    formData.append("file", file);
     formData.append("dictId", addForm.value.dictId);
     uploadFile(formData).then((res) => {
     console.log(res);
-    if (res) {
+    if (res.status == 1) {
       initData();
       dialogData.value.show = false;
       ElMessage({
         type: "success",
         message: ui18n.t('mediaLibrary.tips.uplooadSuccess'),
       });
+    }else{
+      ElMessage.error(ui18n.t('mediaLibrary.tips.uplooadErr'));
     }
   });
     console.log(formData);
@@ -463,6 +479,15 @@ const floadileUrl = (record) => {
     // return windowOpen({url: record.fileUrl, library: true});
   }
 };
+const handleExceed = (files) => {
+  const file = files[0]
+  if(!beforeUpload(file)) {
+    return false;
+  }
+  upload.value && upload.value.clearFiles()
+  file.uid = genFileId()
+  upload.value && upload.value.handleStart(file)
+};
 const beforeUpload = (file) => {
         console.log('beforeUpload', file);
         const filetype = file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase();
@@ -470,14 +495,14 @@ const beforeUpload = (file) => {
           filetype,
         ); // 调用上面代码
         if (!isExcel) {
-          createMessage.error(ui18n.t('mediaLibrary.tips.uplooadfiletype'));
+          ElMessage.error(ui18n.t('mediaLibrary.tips.uplooadfiletype'));
           fileList.value = [];
           return false;
         }
         const isLt10M = file.size / 1024 / 1024 < 2000;
         if (!isLt10M) {
           fileList.value = [];
-          createMessage.error(ui18n.t('mediaLibrary.tips.uplooadSize'));
+          ElMessage.error(ui18n.t('mediaLibrary.tips.uplooadSize'));
           return false;
         }
         fileList.value = [file];

+ 2 - 2
src/view/vrmodel/list.vue

@@ -3,9 +3,9 @@
     <el-form label-width="84px" inline>
       <slot name="header" />
       <el-form-item class="searh-btns" style="grid-area: 1 / 4 / 2 / 4">
-        <el-button type="primary" @click="params.pagging.refresh">查询</el-button>
+        <el-button type="primary" @click="params.pagging.refresh">{{$t('program.case.query')}}</el-button>
         <el-button type="primary" plain @click="params.pagging.queryReset"
-          >重置</el-button
+          >{{$t('sys.reset')}}</el-button
         >
       </el-form-item>
     </el-form>

+ 9 - 6
src/view/vrmodel/sceneContent.vue

@@ -16,14 +16,14 @@
         {{ pagging.state.pag.size * (pagging.state.pag.currentPage - 1) + $index + 1 }}
       </div>
     </el-table-column> -->
-    <el-table-column label="场景标题" prop="sceneName"></el-table-column>
+    <el-table-column :label="$t('program.case.sceneName')" prop="sceneName"></el-table-column>
     <el-table-column label="S/N码" prop="snCode"></el-table-column>
     <!-- <el-table-column label="浏览数量" prop="viewCount"></el-table-column> -->
-    <el-table-column label="拍摄时间" prop="createTime" v-slot:default="{ row }">
-      {{ row.createTime.substr(0, 16) }}
+    <el-table-column :label="$t('program.scene.photoTime')" prop="createTime" v-slot:default="{ row }">
+      {{ row.shootTime }}
     </el-table-column>
-    <el-table-column label="状态" v-slot:default="{ row }: { row: QuoteScene }">
-      {{ row.statusString }}
+    <el-table-column :label="$t('program.auth.status')" v-slot:default="{ row }: { row: QuoteScene }">
+      {{ renderStatus(row.status) }}
     </el-table-column>
     <!-- <el-table-column label="所属架构" prop="deptName"></el-table-column> -->
     <!-- <el-table-column label="操作" v-slot:default="{ row }: { row: QuoteScene }">
@@ -151,7 +151,7 @@ console.log('propsnumList', props.numList);
 const selectable = (row) => {
   // let selectlist = selectList.find(item => item.type == params.pagging.state.query?.isObj)?.numList;
   if (row.inCase) return false;
-  return row.statusString == '计算成功'// && !selectlist.includes(row.num)
+  return row.status == 2// && !selectlist.includes(row.num)
 }
 
 // watch(()=>props.pagging.state.query.isObj, (newVal, oldVal) => {
@@ -186,6 +186,9 @@ watchEffect(() => {
   console.log(tableRef.value!.getSelectionRows())
   // console.log('watchEffect', props.pagging.state.table.rows);
 }, { flush: 'post' });
+const renderStatus = (status) => {
+  return QuoteSceneStatusDesc[status] || "未知状态";
+};
 const changeSelection = async (selectScenes) => {
   if (changIng) return;
   changIng = true

+ 2 - 2
src/view/vrmodel/tableModel.vue

@@ -1,8 +1,8 @@
 <template>
   <List :params="params">
     <template v-slot:header>
-      <el-form-item label="场景名称:" style="width: 250px">
-        <el-input v-model="params.keyword" placeholder="请输入"></el-input>
+      <el-form-item :label="$t('sceneHome.sceneName')+':'" style="width: 250px">
+        <el-input v-model="params.keyword" :placeholder="$t('sys.inputPlc')"></el-input>
       </el-form-item>
       <!-- <el-form-item label="类型:" style="width: 250px">
         <el-select

+ 0 - 26
translate.js

@@ -37,30 +37,4 @@ checkIfPhishing(
   'http://192.168.0.163:8080/download/4kankan/eletron_laster_local/ko/',
   'src/i18n/weblate',
   'kr'
-)
-
-
-
-//  zh
-checkIfPhishing(
-  'http://192.168.0.163:8080/download/4kankan/eletron_laster_local/zh_Hans/',
-  'program/lang/weblate',
-  'zh'
-)
-//  en
-checkIfPhishing(
-  'http://192.168.0.163:8080/download/4kankan/eletron_laster_local/en/',
-  'program/lang/weblate',
-  'en'
-)
-//  ja
-checkIfPhishing(
-  'http://192.168.0.163:8080/download/4kankan/eletron_laster_local/ja/',
-  'program/lang/weblate',
-  'ja'
-)
-checkIfPhishing(
-  'http://192.168.0.163:8080/download/4kankan/eletron_laster_local/ko/',
-  'program/lang/weblate',
-  'kr'
 )