From 5fcfb6cf095d5641153688008ee5f88e3d2a737b Mon Sep 17 00:00:00 2001
From: zhou zhou <3272660260@qq.com>
Date: 星期四, 26 二月 2026 16:51:37 +0800
Subject: [PATCH] #

---
 locale/zh-Hant.json                                       |   89 +++++
 pages/home/home.vue                                       |   32 +-
 pages/mat/matSelected.vue                                 |   20 
 locale/zh-Hans.json                                       |  188 ++++++++----
 pages.json                                                |    6 
 locale/ja.json                                            |  117 ++++++-
 locale/en.json                                            |  169 +++++++---
 locale/uni-app.ja.json                                    |    2 
 update_locales.js                                         |  138 +++++++++
 unflatten.js                                              |   55 +++
 pages/InManagement/ContainerBinding/Container_Binding.vue |   74 ++--
 11 files changed, 681 insertions(+), 209 deletions(-)

diff --git a/locale/en.json b/locale/en.json
index 0499039..aedb32c 100644
--- a/locale/en.json
+++ b/locale/en.json
@@ -1,59 +1,126 @@
 {
-  "app.name": "ZoneYung WMS",
-  "locale.auto": "System",
-  "locale.en": "English",
-  "locale.zh-hans": "绠�浣撲腑鏂�",
-  "locale.zh-hant": "绻佷綋涓枃",
-  "locale.ja": "鏃ヨ",
-  "index.title": "Hello i18n", 
-  "page.login":"Login",
-  "page.index":"Index",
-  "login":{
-  	"login": "login",
-  	"loging": "loging",
-  	"user": "username",
-  	"pwd": "password",
-  	"inputUser": "Please enter your account",
-  	"inputPwd":"Please enter your password",
-	"remPwd":"remember password"
+  "app": {
+    "name": "ZoneYung WMS"
   },
-  "index":{
-  	"GR": "Goods Receipt",
-  	"palletizing": "Palletizing",
-	"palletBuilding":"Pallet Building",
-	"inspectionRequest":"Inspection Request",
-	"qualityInspection":"Quality Inspection",
-	"defectiveMarking":"Defective Marking",
-	"manualPutaway":"Manual Putaway",
-	"stationBinding":"Station Binding",
-	"inboundInitiation":"Inbound Initiation",
-	"stationUnbinding":"Station Unbinding",
-	"bindAndInbound":"Binding And Inbound",
-	"quickPicking":"Quick Picking",
-	"wavePick":"Wave Picking",
-	"outLogin":"Login Out",
-	"language-change-confirm":"chenge",
-	"hello":"Hello, welcome to log in to the WMS system!",
-	"intro":"Make manufacturing and logistics more efficient",
-	"checkOrder":"checkOrder"
-  	
-  	
+  "locale": {
+    "auto": "System",
+    "en": "English",
+    "zh-hans": "绠�浣撲腑鏂�",
+    "zh-hant": "绻佷綋涓枃",
+    "ja": "鏃ヨ"
   },
-  "other":{
-	  
+  "index": {
+    "title": "Hello i18n",
+    "GR": "Goods Receipt",
+    "palletizing": "Palletizing",
+    "palletBuilding": "Pallet Building",
+    "inspectionRequest": "Inspection Request",
+    "qualityInspection": "Quality Inspection",
+    "defectiveMarking": "Defective Marking",
+    "manualPutaway": "Manual Putaway",
+    "stationBinding": "Station Binding",
+    "inboundInitiation": "Inbound Initiation",
+    "stationUnbinding": "Station Unbinding",
+    "bindAndInbound": "Binding And Inbound",
+    "quickPicking": "Quick Picking",
+    "wavePick": "Wave Picking",
+    "outLogin": "Login Out",
+    "language-change-confirm": "chenge",
+    "hello": "Hello, welcome to log in to the WMS system!",
+    "intro": "Make manufacturing and logistics more efficient",
+    "checkOrder": "checkOrder",
+    "workplace": "Zoneyung Workspace",
+    "welcomeBack": "Welcome Back",
+    "systemName": "Zoneyung AS/RS WMS System",
+    "pakin": "Palletizing",
+    "orderPakin": "Order Inbound",
+    "agv_start": "AGV Container Inbound",
+    "agv_back": "AGV Container Return",
+    "stockQuery": "Stock Query",
+    "logOut": "Logout",
+    "copyright": "Copyright 漏 2022 Zhejiang Zoneyung AS/RS Co., Ltd. All rights reserved.",
+    "noAuth": "No permissions or login expired"
   },
+  "page": {
+    "login": "Login",
+    "index": "Index"
+  },
+  "login": {
+    "login": "login",
+    "loging": "loging",
+    "user": "username",
+    "pwd": "password",
+    "inputUser": "Please enter your account",
+    "inputPwd": "Please enter your password",
+    "remPwd": "remember password"
+  },
+  "other": {},
   "settings": {
-  	"title": "Settings",
-  	"ip": "IP Address",
-  	"port": "Port",
-  	"project": "Project Name",
-  	"saved": "Settings Saved",
-  	"authTitle": "Authentication",
-  	"inputAuthPwd": "Enter Admin Password",
-  	"authError": "Incorrect Password"
+    "title": "Settings",
+    "ip": "IP Address",
+    "port": "Port",
+    "project": "Project Name",
+    "saved": "Settings Saved",
+    "authTitle": "Authentication",
+    "inputAuthPwd": "Enter Admin Password",
+    "authError": "Incorrect Password"
   },
   "common": {
-  	"confirm": "Confirm",
-  	"cancel": "Cancel"
+    "confirm": "Confirm",
+    "cancel": "Cancel"
+  },
+  "category": {
+    "inbound": "Inbound Management",
+    "agv": "AGV Management",
+    "stock": "Stock Management",
+    "other": "Other Operations"
+  },
+  "container": {
+    "title": "Palletizing",
+    "palletCode": "Pallet Code",
+    "matCode": "Material Code",
+    "scanPallet": "Scan / Enter Pallet Code",
+    "scanMat": "Scan / Enter Material Code",
+    "matList": "Material List",
+    "matName": "Name",
+    "matSpec": "Spec",
+    "matBatch": "Batch",
+    "matQty": "Quantity",
+    "modify": "Modify",
+    "remove": "Remove",
+    "reset": "Reset",
+    "confirmComb": "Confirm Combin.",
+    "emptyList": "No materials, please scan material code to add",
+    "modifyInfo": "Modify Info",
+    "code": "Code",
+    "confirmRemove": "Confirm Remove",
+    "removeMsg": "Remove this material?",
+    "confirmReset": "Confirm Reset",
+    "resetMsg": "Clear all materials?",
+    "combMsg": "Confirm to palletize and inbound?"
+  },
+  "toast": {
+    "palletError": "Pallet code error, please try again",
+    "queryFail": "Query failed",
+    "modifySuccess": "Modification successful",
+    "removeSuccess": "Removal successful",
+    "scanPalletCode": "Please scan pallet code",
+    "qtyNotZero": "Palletizing quantity cannot be 0",
+    "qtyNotZeroMat": "{0} palletizing quantity cannot be 0",
+    "combSuccess": "Palletizing successful",
+    "combFail": "Palletizing failed",
+    "resetComplete": "Reset complete",
+    "inputQty": "Please enter quantity"
+  },
+  "matSelected": {
+    "title": "Material Info",
+    "matDetail": "Material Details",
+    "matCode": "Material Code",
+    "matName": "Material Name",
+    "spec": "Spec",
+    "batch": "Batch",
+    "inputBatch": "Please enter batch",
+    "qty": "Quantity",
+    "confirmExtract": "Confirm Extract"
   }
-}
+}
\ No newline at end of file
diff --git a/locale/ja.json b/locale/ja.json
index b2fa1b8..6b5494f 100644
--- a/locale/ja.json
+++ b/locale/ja.json
@@ -1,23 +1,96 @@
 {
-  "locale.auto": "銈枫偣銉嗐儬",
-  "locale.en": "鑻辫獮",
-  "locale.zh-hans": "绠�浣撲腑鏂�",
-  "locale.zh-hant": "绻佷綋涓枃",
-  "locale.ja": "鏃ヨ",
-  "index.title": "Hello i18n",
-  "index.home": "銉涖兗銉�",
-  "index.component": "銈炽兂銉濄兗銉嶃兂銉�",
-  "index.api": "API",
-  "index.schema": "Schema",
-  "index.demo": "uni-app globalization",
-  "index.demo-description": "銉︺儖銉曘儸銉笺儬銉兗銈�乵anifest.json銆乸ages.json銆併偪銉栥儛銉笺�併儦銉笺偢銆併偝銉炽儩銉笺儘銉炽儓銆丄PI銈掑惈銈併倠銆丼chema",
-  "index.detail": "瑭崇窗",
-  "index.language": "瑷�瑾�",
-  "index.language-info": "瑷畾",
-  "index.system-language": "銈枫偣銉嗐儬瑷�瑾�",
-  "index.application-language": "銈€儣銉偙銉笺偡銉с兂瑷�瑾�",
-  "index.language-change-confirm": "銇撱伄瑷畾銈掗仼鐢ㄣ仚銈嬨仺銆併偄銉椼儶銇屽啀璧峰嫊銇椼伨銇�",
-  "api.message": "銉°儍銈汇兗銈�",
-  "schema.add": "杩藉姞",
-  "schema.add-success": "鎴愬姛銈掕拷鍔�"
-}
+  "locale": {
+    "auto": "銈枫偣銉嗐儬",
+    "en": "鑻辫獮",
+    "zh-hans": "绠�浣撲腑鏂�",
+    "zh-hant": "绻佷綋涓枃",
+    "ja": "鏃ヨ"
+  },
+  "index": {
+    "title": "Hello i18n",
+    "home": "銉涖兗銉�",
+    "component": "銈炽兂銉濄兗銉嶃兂銉�",
+    "api": "API",
+    "schema": "Schema",
+    "demo": "uni-app globalization",
+    "demo-description": "銉︺儖銉曘儸銉笺儬銉兗銈�乵anifest.json銆乸ages.json銆併偪銉栥儛銉笺�併儦銉笺偢銆併偝銉炽儩銉笺儘銉炽儓銆丄PI銈掑惈銈併倠銆丼chema",
+    "detail": "瑭崇窗",
+    "language": "瑷�瑾�",
+    "language-info": "瑷畾",
+    "system-language": "銈枫偣銉嗐儬瑷�瑾�",
+    "application-language": "銈€儣銉偙銉笺偡銉с兂瑷�瑾�",
+    "language-change-confirm": "銇撱伄瑷畾銈掗仼鐢ㄣ仚銈嬨仺銆併偄銉椼儶銇屽啀璧峰嫊銇椼伨銇�",
+    "workplace": "Zoneyung 宸ヤ綔鍙�",
+    "welcomeBack": "娆㈣繋鍥炴潵",
+    "systemName": "涓壃绔嬪簱 WMS 浠撳偍绠$悊绯荤粺",
+    "pakin": "缁勬墭",
+    "orderPakin": "璁㈠崟鍏ュ簱",
+    "agv_start": "AGV瀹瑰櫒鍏ュ簱",
+    "agv_back": "AGV瀹瑰櫒鍥炲簱",
+    "stockQuery": "搴撳瓨鏌ヨ",
+    "logOut": "閫�鍑虹櫥褰�",
+    "copyright": "copyright 漏 2022 娴欐睙涓壃绔嬪簱鏈夐檺鍏徃 all rights reserved.",
+    "noAuth": "鏃犳潈闄愭垨鐧诲綍杩囨湡"
+  },
+  "api": {
+    "message": "銉°儍銈汇兗銈�"
+  },
+  "schema": {
+    "add": "杩藉姞",
+    "add-success": "鎴愬姛銈掕拷鍔�"
+  },
+  "category": {
+    "inbound": "鍏ュ簱绠$悊",
+    "agv": "AGV绠$悊",
+    "stock": "搴撳瓨绠$悊",
+    "other": "鍏朵粬鎿嶄綔"
+  },
+  "container": {
+    "title": "缁勬墭",
+    "palletCode": "鎵樼洏鐮�",
+    "matCode": "鐗╂枡鐮�",
+    "scanPallet": "鎵爜 / 杈撳叆鎵樼洏鐮�",
+    "scanMat": "鎵爜 / 杈撳叆鐗╂枡鐮�",
+    "matList": "鍟嗗搧鍒楄〃",
+    "matName": "鍝佸悕",
+    "matSpec": "瑙勬牸",
+    "matBatch": "鎵瑰彿",
+    "matQty": "鏁伴噺",
+    "modify": "淇敼",
+    "remove": "绉婚櫎",
+    "reset": "閲嶇疆",
+    "confirmComb": "纭缁勬墭",
+    "emptyList": "鏆傛棤鍟嗗搧锛岃鎵弿鐗╂枡鐮佹坊鍔�",
+    "modifyInfo": "淇敼淇℃伅",
+    "code": "缂栫爜",
+    "confirmRemove": "纭绉婚櫎",
+    "removeMsg": "鏄惁绉婚櫎璇ュ晢鍝侊紵",
+    "confirmReset": "纭閲嶇疆",
+    "resetMsg": "鏄惁娓呯┖鎵�鏈夊晢鍝侊紵",
+    "combMsg": "纭灏嗗晢鍝佺粍鎵樺叆搴擄紵"
+  },
+  "toast": {
+    "palletError": "鎵樼洏鐮佹湁璇閲嶈瘯",
+    "queryFail": "鏌ヨ澶辫触",
+    "modifySuccess": "淇敼鎴愬姛",
+    "removeSuccess": "绉婚櫎鎴愬姛",
+    "scanPalletCode": "璇锋壂鎻忔墭鐩樻潯鐮�",
+    "qtyNotZero": "缁勬墭鏁伴噺涓嶈兘涓�0",
+    "qtyNotZeroMat": "{0}缁勬墭鏁伴噺涓嶈兘涓�0",
+    "combSuccess": "缁勬墭鎴愬姛",
+    "combFail": "缁勬墭澶辫触",
+    "resetComplete": "閲嶇疆瀹屾垚",
+    "inputQty": "璇疯緭鍏ユ暟閲�"
+  },
+  "matSelected": {
+    "title": "鍟嗗搧淇℃伅",
+    "matDetail": "鐗╂枡璇︽儏",
+    "matCode": "鍟嗗搧缂栫爜",
+    "matName": "鍟嗗搧鍚嶇О",
+    "spec": "瑙勬牸",
+    "batch": "鎵瑰彿",
+    "inputBatch": "璇疯緭鍏ユ壒鍙�",
+    "qty": "鏁伴噺",
+    "confirmExtract": "纭鎻愬彇"
+  }
+}
\ No newline at end of file
diff --git a/locale/uni-app.ja.json b/locale/uni-app.ja.json
index 41cef76..010c3fd 100644
--- a/locale/uni-app.ja.json
+++ b/locale/uni-app.ja.json
@@ -33,4 +33,4 @@
   },
   "ios": {},
   "android": {}
-}
+}
\ No newline at end of file
diff --git a/locale/zh-Hans.json b/locale/zh-Hans.json
index 05d1cd3..97c7b29 100644
--- a/locale/zh-Hans.json
+++ b/locale/zh-Hans.json
@@ -1,61 +1,129 @@
 {
-	"app.name": "涓壃 WMS",
-	"locale.auto": "绯荤粺",
-	"locale.en": "English",
-	"locale.zh-hans": "绠�浣撲腑鏂�",
-	"locale.zh-hant": "绻佷綋涓枃",
-	"locale.ja": "鏃ヨ",
-	"index.title": "Hello i18n",
-	"index.home": "涓婚〉",
-	"page.login":"鐧诲綍",
-	"page.index":"棣栭〉",
-	"login":{
-		"login": "鐧诲綍",
-		"loging": "鐧诲綍涓�",
-		"user": "璐﹀彿",
-		"pwd": "瀵嗙爜",
-		"inputUser": "璇疯緭鍏ヨ处鍙�",
-		"inputPwd":"璇疯緭鍏ュ瘑鐮�",
-		"remPwd":"璁颁綇瀵嗙爜"
-	},
-	"index":{
-		"GR": "鍗曟嵁鏀惰揣", 
-		"palletizing": "鍗曟嵁缁勬墭",
-		"palletBuilding":"缁勬墭瑙g粦",
-		"inspectionRequest":"鎶ユ",
-		"qualityInspection":"璐ㄦ",
-		"defectiveMarking":"涓嶈壇鏍囪",
-		"manualPutaway":"浜哄伐涓婃灦",
-		"stationBinding":"绔欑偣缁戝畾",
-		"inboundInitiation":"鍚姩鍏ュ簱",
-		"stationUnbinding":"绔欑偣瑙g粦",
-		"bindAndInbound":"缁戝畾&鍏ュ簱",
-		"quickPicking":"蹇�熸嫞璐�",
-		"wavePick":"娉㈡鎷h揣",
-		"outLogin":"閫�鍑虹櫥褰�",
-		"language-change-confirm":"纭畾鍒囨崲?",
-		"hello":"鎮ㄥソ锛屾杩庣櫥褰昗MS绯荤粺锛�",
-		"intro":"璁╁埗閫犱笌鐗╂祦鏇撮珮鏁�",
-		"checkOrder":"鐩樼偣"
-		
-		
-	},
-	"other":{
-		"asnNo":"ASN鍗曞彿"
-		
-	},
-	"settings": {
-		"title": "璁剧疆",
-		"ip": "IP鍦板潃",
-		"port": "绔彛",
-		"project": "椤圭洰鍚�",
-		"saved": "璁剧疆宸蹭繚瀛�",
-		"authTitle": "韬唤楠岃瘉",
-		"inputAuthPwd": "璇疯緭鍏ョ鐞嗗憳瀵嗙爜",
-		"authError": "瀵嗙爜閿欒"
-	},
-	"common": {
-		"confirm": "纭",
-		"cancel": "鍙栨秷"
-	}
-}
+  "app": {
+    "name": "涓壃 WMS"
+  },
+  "locale": {
+    "auto": "绯荤粺",
+    "en": "English",
+    "zh-hans": "绠�浣撲腑鏂�",
+    "zh-hant": "绻佷綋涓枃",
+    "ja": "鏃ヨ"
+  },
+  "index": {
+    "title": "Hello i18n",
+    "home": "涓婚〉",
+    "GR": "鍗曟嵁鏀惰揣",
+    "palletizing": "鍗曟嵁缁勬墭",
+    "palletBuilding": "缁勬墭瑙g粦",
+    "inspectionRequest": "鎶ユ",
+    "qualityInspection": "璐ㄦ",
+    "defectiveMarking": "涓嶈壇鏍囪",
+    "manualPutaway": "浜哄伐涓婃灦",
+    "stationBinding": "绔欑偣缁戝畾",
+    "inboundInitiation": "鍚姩鍏ュ簱",
+    "stationUnbinding": "绔欑偣瑙g粦",
+    "bindAndInbound": "缁戝畾&鍏ュ簱",
+    "quickPicking": "蹇�熸嫞璐�",
+    "wavePick": "娉㈡鎷h揣",
+    "outLogin": "閫�鍑虹櫥褰�",
+    "language-change-confirm": "纭畾鍒囨崲?",
+    "hello": "鎮ㄥソ锛屾杩庣櫥褰昗MS绯荤粺锛�",
+    "intro": "璁╁埗閫犱笌鐗╂祦鏇撮珮鏁�",
+    "checkOrder": "鐩樼偣",
+    "workplace": "Zoneyung 宸ヤ綔鍙�",
+    "welcomeBack": "娆㈣繋鍥炴潵",
+    "systemName": "涓壃绔嬪簱 WMS 浠撳偍绠$悊绯荤粺",
+    "pakin": "缁勬墭",
+    "orderPakin": "璁㈠崟鍏ュ簱",
+    "agv_start": "AGV瀹瑰櫒鍏ュ簱",
+    "agv_back": "AGV瀹瑰櫒鍥炲簱",
+    "stockQuery": "搴撳瓨鏌ヨ",
+    "logOut": "閫�鍑虹櫥褰�",
+    "copyright": "copyright 漏 2022 娴欐睙涓壃绔嬪簱鏈夐檺鍏徃 all rights reserved.",
+    "noAuth": "鏃犳潈闄愭垨鐧诲綍杩囨湡"
+  },
+  "page": {
+    "login": "鐧诲綍",
+    "index": "棣栭〉"
+  },
+  "login": {
+    "login": "鐧诲綍",
+    "loging": "鐧诲綍涓�",
+    "user": "璐﹀彿",
+    "pwd": "瀵嗙爜",
+    "inputUser": "璇疯緭鍏ヨ处鍙�",
+    "inputPwd": "璇疯緭鍏ュ瘑鐮�",
+    "remPwd": "璁颁綇瀵嗙爜"
+  },
+  "other": {
+    "asnNo": "ASN鍗曞彿"
+  },
+  "settings": {
+    "title": "璁剧疆",
+    "ip": "IP鍦板潃",
+    "port": "绔彛",
+    "project": "椤圭洰鍚�",
+    "saved": "璁剧疆宸蹭繚瀛�",
+    "authTitle": "韬唤楠岃瘉",
+    "inputAuthPwd": "璇疯緭鍏ョ鐞嗗憳瀵嗙爜",
+    "authError": "瀵嗙爜閿欒"
+  },
+  "common": {
+    "confirm": "纭",
+    "cancel": "鍙栨秷"
+  },
+  "category": {
+    "inbound": "鍏ュ簱绠$悊",
+    "agv": "AGV绠$悊",
+    "stock": "搴撳瓨绠$悊",
+    "other": "鍏朵粬鎿嶄綔"
+  },
+  "container": {
+    "title": "缁勬墭",
+    "palletCode": "鎵樼洏鐮�",
+    "matCode": "鐗╂枡鐮�",
+    "scanPallet": "鎵爜 / 杈撳叆鎵樼洏鐮�",
+    "scanMat": "鎵爜 / 杈撳叆鐗╂枡鐮�",
+    "matList": "鍟嗗搧鍒楄〃",
+    "matName": "鍝佸悕",
+    "matSpec": "瑙勬牸",
+    "matBatch": "鎵瑰彿",
+    "matQty": "鏁伴噺",
+    "modify": "淇敼",
+    "remove": "绉婚櫎",
+    "reset": "閲嶇疆",
+    "confirmComb": "纭缁勬墭",
+    "emptyList": "鏆傛棤鍟嗗搧锛岃鎵弿鐗╂枡鐮佹坊鍔�",
+    "modifyInfo": "淇敼淇℃伅",
+    "code": "缂栫爜",
+    "confirmRemove": "纭绉婚櫎",
+    "removeMsg": "鏄惁绉婚櫎璇ュ晢鍝侊紵",
+    "confirmReset": "纭閲嶇疆",
+    "resetMsg": "鏄惁娓呯┖鎵�鏈夊晢鍝侊紵",
+    "combMsg": "纭灏嗗晢鍝佺粍鎵樺叆搴擄紵"
+  },
+  "toast": {
+    "palletError": "鎵樼洏鐮佹湁璇閲嶈瘯",
+    "queryFail": "鏌ヨ澶辫触",
+    "modifySuccess": "淇敼鎴愬姛",
+    "removeSuccess": "绉婚櫎鎴愬姛",
+    "scanPalletCode": "璇锋壂鎻忔墭鐩樻潯鐮�",
+    "qtyNotZero": "缁勬墭鏁伴噺涓嶈兘涓�0",
+    "qtyNotZeroMat": "{0}缁勬墭鏁伴噺涓嶈兘涓�0",
+    "combSuccess": "缁勬墭鎴愬姛",
+    "combFail": "缁勬墭澶辫触",
+    "resetComplete": "閲嶇疆瀹屾垚",
+    "inputQty": "璇疯緭鍏ユ暟閲�"
+  },
+  "matSelected": {
+    "title": "鍟嗗搧淇℃伅",
+    "matDetail": "鐗╂枡璇︽儏",
+    "matCode": "鍟嗗搧缂栫爜",
+    "matName": "鍟嗗搧鍚嶇О",
+    "spec": "瑙勬牸",
+    "batch": "鎵瑰彿",
+    "inputBatch": "璇疯緭鍏ユ壒鍙�",
+    "qty": "鏁伴噺",
+    "confirmExtract": "纭鎻愬彇"
+  }
+}
\ No newline at end of file
diff --git a/locale/zh-Hant.json b/locale/zh-Hant.json
index 9e1a418..ba2dcf4 100644
--- a/locale/zh-Hant.json
+++ b/locale/zh-Hant.json
@@ -1,10 +1,81 @@
 {
-  "locale.auto": "绯荤当",
-  "locale.en": "English",
-  "locale.zh-hans": "绠�浣撲腑鏂�",
-  "locale.zh-hant": "绻侀珨涓枃",
-  "locale.ja": "鏃ヨ",
-  "index.title": "Hello i18n",
-  "index.home": "涓婚爜",
-  "login.login": "鐧诲綍"
-}
+  "locale": {
+    "auto": "绯荤当",
+    "en": "English",
+    "zh-hans": "绠�浣撲腑鏂�",
+    "zh-hant": "绻侀珨涓枃",
+    "ja": "鏃ヨ"
+  },
+  "index": {
+    "title": "Hello i18n",
+    "home": "涓婚爜",
+    "workplace": "Zoneyung 宸ヤ綔鍙�",
+    "welcomeBack": "娆㈣繋鍥炴潵",
+    "systemName": "涓壃绔嬪簱 WMS 浠撳偍绠$悊绯荤粺",
+    "pakin": "缁勬墭",
+    "orderPakin": "璁㈠崟鍏ュ簱",
+    "agv_start": "AGV瀹瑰櫒鍏ュ簱",
+    "agv_back": "AGV瀹瑰櫒鍥炲簱",
+    "stockQuery": "搴撳瓨鏌ヨ",
+    "logOut": "閫�鍑虹櫥褰�",
+    "copyright": "copyright 漏 2022 娴欐睙涓壃绔嬪簱鏈夐檺鍏徃 all rights reserved.",
+    "noAuth": "鏃犳潈闄愭垨鐧诲綍杩囨湡"
+  },
+  "login": {
+    "login": "鐧诲綍"
+  },
+  "category": {
+    "inbound": "鍏ュ簱绠$悊",
+    "agv": "AGV绠$悊",
+    "stock": "搴撳瓨绠$悊",
+    "other": "鍏朵粬鎿嶄綔"
+  },
+  "container": {
+    "title": "缁勬墭",
+    "palletCode": "鎵樼洏鐮�",
+    "matCode": "鐗╂枡鐮�",
+    "scanPallet": "鎵爜 / 杈撳叆鎵樼洏鐮�",
+    "scanMat": "鎵爜 / 杈撳叆鐗╂枡鐮�",
+    "matList": "鍟嗗搧鍒楄〃",
+    "matName": "鍝佸悕",
+    "matSpec": "瑙勬牸",
+    "matBatch": "鎵瑰彿",
+    "matQty": "鏁伴噺",
+    "modify": "淇敼",
+    "remove": "绉婚櫎",
+    "reset": "閲嶇疆",
+    "confirmComb": "纭缁勬墭",
+    "emptyList": "鏆傛棤鍟嗗搧锛岃鎵弿鐗╂枡鐮佹坊鍔�",
+    "modifyInfo": "淇敼淇℃伅",
+    "code": "缂栫爜",
+    "confirmRemove": "纭绉婚櫎",
+    "removeMsg": "鏄惁绉婚櫎璇ュ晢鍝侊紵",
+    "confirmReset": "纭閲嶇疆",
+    "resetMsg": "鏄惁娓呯┖鎵�鏈夊晢鍝侊紵",
+    "combMsg": "纭灏嗗晢鍝佺粍鎵樺叆搴擄紵"
+  },
+  "toast": {
+    "palletError": "鎵樼洏鐮佹湁璇閲嶈瘯",
+    "queryFail": "鏌ヨ澶辫触",
+    "modifySuccess": "淇敼鎴愬姛",
+    "removeSuccess": "绉婚櫎鎴愬姛",
+    "scanPalletCode": "璇锋壂鎻忔墭鐩樻潯鐮�",
+    "qtyNotZero": "缁勬墭鏁伴噺涓嶈兘涓�0",
+    "qtyNotZeroMat": "{0}缁勬墭鏁伴噺涓嶈兘涓�0",
+    "combSuccess": "缁勬墭鎴愬姛",
+    "combFail": "缁勬墭澶辫触",
+    "resetComplete": "閲嶇疆瀹屾垚",
+    "inputQty": "璇疯緭鍏ユ暟閲�"
+  },
+  "matSelected": {
+    "title": "鍟嗗搧淇℃伅",
+    "matDetail": "鐗╂枡璇︽儏",
+    "matCode": "鍟嗗搧缂栫爜",
+    "matName": "鍟嗗搧鍚嶇О",
+    "spec": "瑙勬牸",
+    "batch": "鎵瑰彿",
+    "inputBatch": "璇疯緭鍏ユ壒鍙�",
+    "qty": "鏁伴噺",
+    "confirmExtract": "纭鎻愬彇"
+  }
+}
\ No newline at end of file
diff --git a/pages.json b/pages.json
index a38cf72..5e72bb3 100644
--- a/pages.json
+++ b/pages.json
@@ -10,21 +10,21 @@
 		{
 			"path": "pages/home/home",
 			"style": {
-				"navigationBarTitleText": "棣栭〉",
+				"navigationBarTitleText": "%index.home%",
 				"navigationStyle": "custom"
 			}
 		},
 		{
 			"path": "pages/InManagement/ContainerBinding/Container_Binding",
 			"style": {
-				"navigationBarTitleText": "瀹瑰櫒缁戝畾",
+				"navigationBarTitleText": "%container.title%",
 				"navigationStyle": "custom"
 			}
 		},
 		{
 			"path": "pages/mat/matSelected",
 			"style": {
-				"navigationBarTitleText": "鐗╂枡缂栬緫",
+				"navigationBarTitleText": "%matSelected.title%",
 				"navigationStyle": "custom"
 			}
 		},
diff --git a/pages/InManagement/ContainerBinding/Container_Binding.vue b/pages/InManagement/ContainerBinding/Container_Binding.vue
index 5124566..d69421b 100644
--- a/pages/InManagement/ContainerBinding/Container_Binding.vue
+++ b/pages/InManagement/ContainerBinding/Container_Binding.vue
@@ -2,7 +2,7 @@
 	<view class="page-container">
 		<!-- 澶撮儴瀵艰埅 -->
 		<u-navbar
-			title="缁勬墭"
+			:title="$t('container.title')"
 			:fixed="true"
 			:placeholder="true"
 			bgColor="#ffffff"
@@ -25,13 +25,13 @@
 									color="#409eff"
 									customStyle="margin-right: 10rpx;"
 								></u-icon>
-								<text class="label-text">鎵樼洏鐮�</text>
+								<text class="label-text">{{ $t('container.palletCode') }}</text>
 							</view>
 						</template>
 						<view class="input-wrap">
 							<u--input
 								v-model="barcode"
-								placeholder="鎵爜 / 杈撳叆鎵樼洏鐮�"
+								:placeholder="$t('container.scanPallet')"
 								clearable
 								border="none"
 								:focus="barcodeFocus"
@@ -47,13 +47,13 @@
 									color="#409eff"
 									customStyle="margin-right: 10rpx;"
 								></u-icon>
-								<text class="label-text">鐗╂枡鐮�</text>
+								<text class="label-text">{{ $t('container.matCode') }}</text>
 							</view>
 						</template>
 						<view class="input-wrap">
 							<u--input
 								v-model="matnr"
-								placeholder="鎵爜 / 杈撳叆鐗╂枡鐮�"
+								:placeholder="$t('container.scanMat')"
 								clearable
 								border="none"
 								:focus="matFocus"
@@ -70,7 +70,7 @@
 			<view class="list-header">
 				<view class="title-indicator"></view>
 				<text class="header-title">
-					鍟嗗搧鍒楄〃 ({{ dataList.length }})
+					{{ $t('container.matList') }} ({{ dataList.length }})
 				</text>
 			</view>
 
@@ -87,20 +87,20 @@
 
 					<view class="card-content">
 						<view class="info-row">
-							<text class="info-label">鍝佸悕</text>
+							<text class="info-label">{{ $t('container.matName') }}</text>
 							<text class="info-value">
 								{{ item.maktx || '-' }}
 							</text>
 						</view>
 						<view class="info-row">
 							<view class="info-col">
-								<text class="info-label">瑙勬牸</text>
+								<text class="info-label">{{ $t('container.matSpec') }}</text>
 								<text class="info-value">
 									{{ item.specs || '-' }}
 								</text>
 							</view>
 							<view class="info-col">
-								<text class="info-label">鎵瑰彿</text>
+								<text class="info-label">{{ $t('container.matBatch') }}</text>
 								<text class="info-value highlight">
 									{{ item.batch || '-' }}
 								</text>
@@ -108,7 +108,7 @@
 						</view>
 						<view class="info-row">
 							<view class="info-col">
-								<text class="info-label">鏁伴噺</text>
+								<text class="info-label">{{ $t('container.matQty') }}</text>
 								<text class="info-value qty">
 									{{ item.anfme }}
 								</text>
@@ -121,7 +121,7 @@
 							type="primary"
 							size="small"
 							plain
-							text="淇敼"
+							:text="$t('container.modify')"
 							@click="revise(item, i)"
 							customStyle="width: 140rpx; margin: 0;"
 						></u-button>
@@ -130,7 +130,7 @@
 							type="error"
 							size="small"
 							plain
-							text="绉婚櫎"
+							:text="$t('container.remove')"
 							@click="remove(item, i)"
 							customStyle="width: 140rpx; margin: 0;"
 						></u-button>
@@ -140,7 +140,7 @@
 				<u-empty
 					v-if="dataList.length === 0"
 					mode="list"
-					text="鏆傛棤鍟嗗搧锛岃鎵弿鐗╂枡鐮佹坊鍔�"
+					:text="$t('container.emptyList')"
 					marginTop="40"
 				></u-empty>
 			</view>
@@ -151,7 +151,7 @@
 			<view class="btn-wrap">
 				<u-button
 					type="info"
-					text="閲嶇疆"
+					:text="$t('container.reset')"
 					@click="resetConfirmBtn"
 				></u-button>
 			</view>
@@ -161,7 +161,7 @@
 			>
 				<u-button
 					type="primary"
-					text="纭缁勬墭"
+					:text="$t('container.confirmComb')"
 					@click="combConfirmBtn"
 					:disabled="dataList.length === 0"
 					:throttleTime="1500"
@@ -177,23 +177,23 @@
 			@close="showRevise = false"
 		>
 			<view class="popup-card">
-				<view class="popup-header"><text>淇敼淇℃伅</text></view>
+				<view class="popup-header"><text>{{ $t('container.modifyInfo') }}</text></view>
 				<view class="popup-body">
 					<u--form
 						labelWidth="80"
 						labelPosition="left"
 					>
-						<u-form-item label="缂栫爜">
+						<u-form-item :label="$t('container.code')">
 							<text class="popup-text-val">{{ editMatnr }}</text>
 						</u-form-item>
-						<u-form-item label="鎵瑰彿">
+						<u-form-item :label="$t('container.matBatch')">
 							<u--input
 								v-model="batch"
-								placeholder="杈撳叆鎵瑰彿"
+								:placeholder="$t('matSelected.inputBatch')"
 								border="surround"
 							></u--input>
 						</u-form-item>
-						<u-form-item label="鏁伴噺">
+						<u-form-item :label="$t('container.matQty')">
 							<u-number-box
 								v-model="count"
 								:step="0.01"
@@ -205,13 +205,13 @@
 				</view>
 				<view class="popup-footer">
 					<u-button
-						text="鍙栨秷"
+						:text="$t('common.cancel')"
 						@click="showRevise = false"
 						customStyle="margin-right: 20rpx; flex: 1;"
 					></u-button>
 					<u-button
 						type="primary"
-						text="纭"
+						:text="$t('common.confirm')"
 						@click="reviseConfirm"
 						customStyle="flex: 1;"
 					></u-button>
@@ -222,24 +222,24 @@
 		<!-- 妯℃�佹 -->
 		<u-modal
 			:show="showRemove"
-			title="纭绉婚櫎"
-			content="鏄惁绉婚櫎璇ュ晢鍝侊紵"
+			:title="$t('container.confirmRemove')"
+			:content="$t('container.removeMsg')"
 			showCancelButton
 			@confirm="removeConfirm"
 			@cancel="showRemove = false"
 		></u-modal>
 		<u-modal
 			:show="showComb"
-			title="纭缁勬墭"
-			content="纭灏嗗晢鍝佺粍鎵樺叆搴擄紵"
+			:title="$t('container.confirmComb')"
+			:content="$t('container.combMsg')"
 			showCancelButton
 			@confirm="comb"
 			@cancel="showComb = false"
 		></u-modal>
 		<u-modal
 			:show="showReset"
-			title="纭閲嶇疆"
-			content="鏄惁娓呯┖鎵�鏈夊晢鍝侊紵"
+			:title="$t('container.confirmReset')"
+			:content="$t('container.resetMsg')"
 			showCancelButton
 			@confirm="resetConfirm"
 			@cancel="showReset = false"
@@ -281,7 +281,7 @@
 				if (len > 0 && len !== 8 && len !== 9) {
 					this.$showToast({
 						type: 'error',
-						message: '鎵樼洏鐮佹湁璇閲嶈瘯'
+						message: this.$t('toast.palletError')
 					})
 					this.barcodeFocuss()
 					return
@@ -339,7 +339,7 @@
 					if (!data && data !== null) {
 						this.$showToast({
 							type: 'error',
-							message: msg || '鏌ヨ澶辫触'
+							message: msg || this.$t('toast.queryFail')
 						})
 					}
 				}
@@ -392,7 +392,7 @@
 			this.dataList[this.rowNum].batch = this.batch
 			this.dataList[this.rowNum].weight = this.weight
 			this.editMatnr = ''
-			this.$showToast({ type: 'success', message: '淇敼鎴愬姛' })
+			this.$showToast({ type: 'success', message: this.$t('toast.modifySuccess') })
 			this.showRevise = false
 		},
 		remove(item, i) {
@@ -401,7 +401,7 @@
 		},
 		removeConfirm() {
 			this.dataList.splice(this.removeNum, 1)
-			this.$showToast({ type: 'success', message: '绉婚櫎鎴愬姛' })
+			this.$showToast({ type: 'success', message: this.$t('toast.removeSuccess') })
 			this.showRemove = false
 		},
 		combConfirmBtn() {
@@ -410,7 +410,7 @@
 		},
 		async comb() {
 			if (this.barcode === '') {
-				this.$showToast({ type: 'error', message: '璇锋壂鎻忔墭鐩樻潯鐮�' })
+				this.$showToast({ type: 'error', message: this.$t('toast.scanPalletCode') })
 				this.showComb = false
 				return
 			}
@@ -421,7 +421,7 @@
 				) {
 					this.$showToast({
 						type: 'error',
-						message: this.dataList[i].matnr + '缁勬墭鏁伴噺涓嶈兘涓�0'
+						message: this.$t('toast.qtyNotZeroMat').replace('{0}', this.dataList[i].matnr)
 					})
 					this.showComb = false
 					return
@@ -442,7 +442,7 @@
 
 				if (code === 200) {
 					this.resst()
-					this.$showToast({ type: 'success', message: '缁勬墭鎴愬姛' })
+					this.$showToast({ type: 'success', message: this.$t('toast.combSuccess') })
 				} else if (code === 403) {
 					this.$showToast({ type: 'error', message: msg })
 					setTimeout(() => {
@@ -451,7 +451,7 @@
 				} else {
 					this.$showToast({
 						type: 'error',
-						message: msg || '缁勬墭澶辫触'
+						message: msg || this.$t('toast.combFail')
 					})
 				}
 			} catch (err) {
@@ -464,7 +464,7 @@
 		resetConfirm() {
 			this.dataList = []
 			this.barcode = ''
-			this.$showToast({ type: 'success', message: '閲嶇疆瀹屾垚' })
+			this.$showToast({ type: 'success', message: this.$t('toast.resetComplete') })
 			this.showReset = false
 		},
 		resst() {
diff --git a/pages/home/home.vue b/pages/home/home.vue
index c920025..6326cfd 100644
--- a/pages/home/home.vue
+++ b/pages/home/home.vue
@@ -2,7 +2,7 @@
 	<view class="page-container">
 		<!-- 澶撮儴瀵艰埅 -->
 		<u-navbar
-			title="Zoneyung 宸ヤ綔鍙�"
+			:title="$t('index.workplace')"
 			:fixed="true"
 			:placeholder="true"
 			bgColor="#ffffff"
@@ -13,8 +13,8 @@
 		<!-- 娆㈣繋淇℃伅 / 鐢ㄦ埛淇℃伅 -->
 		<view class="welcome-box">
 			<view class="welcome-info">
-				<text class="greeting">娆㈣繋鍥炴潵</text>
-				<text class="date-text">涓壃绔嬪簱 WMS 浠撳偍绠$悊绯荤粺</text>
+				<text class="greeting">{{ $t('index.welcomeBack') }}</text>
+				<text class="date-text">{{ $t('index.systemName') }}</text>
 			</view>
 			<view class="welcome-avatar">
 				<!-- 鍙浛鎹负鐪熷疄澶村儚 -->
@@ -99,7 +99,7 @@
 					<view class="category-header">
 						<view class="category-title-wrapper">
 							<view class="title-indicator"></view>
-							<text class="category-title">鍏朵粬鎿嶄綔</text>
+							<text class="category-title">{{ $t('category.other') }}</text>
 						</view>
 					</view>
 					<view class="category-body">
@@ -169,7 +169,7 @@
 		<!-- 搴曢儴鐗堟潈 -->
 		<view class="footer">
 			<text class="footer-text">
-				copyright 漏 2022 娴欐睙涓壃绔嬪簱鏈夐檺鍏徃 all rights reserved.
+				{{ $t('index.copyright') }}
 			</text>
 		</view>
 		<u-toast ref="uToast"></u-toast>
@@ -191,42 +191,42 @@
 			// 榛樿鑿滃崟鏁版嵁锛堢敤浜庡悗绔棤杩斿洖鏃讹級
 			elements2: [
 				{
-					title: '缁勬墭',
+					title: this.$t('index.pakin'),
 					name: 'pakin',
 					color: 'cyan',
 					cuIcon: 'pullup',
 					url: '/InManagement/ContainerBinding/Container_Binding'
 				},
 				{
-					title: '璁㈠崟鍏ュ簱',
+					title: this.$t('index.orderPakin'),
 					name: 'orderPakin',
 					color: 'purple',
 					cuIcon: '',
 					url: '/order/orderList'
 				},
 				{
-					title: 'AGV瀹瑰櫒鍏ュ簱',
+					title: this.$t('index.agv_start'),
 					name: 'agv_start',
 					color: 'blue',
 					cuIcon: '',
 					url: '/AGV/agv_start'
 				},
 				{
-					title: 'AGV瀹瑰櫒鍥炲簱',
+					title: this.$t('index.agv_back'),
 					name: 'agv_back',
 					color: 'orange',
 					cuIcon: '',
 					url: '/AGV/agv_back'
 				},
 				{
-					title: '搴撳瓨鏌ヨ',
+					title: this.$t('index.stockQuery'),
 					name: 'stockQuery',
 					color: 'green',
 					cuIcon: '',
 					url: '/stock/stockQuery'
 				},
 				{
-					title: '閫�鍑虹櫥褰�',
+					title: this.$t('index.logOut'),
 					name: 'logOut',
 					color: 'grey',
 					cuIcon: 'exit',
@@ -269,21 +269,21 @@
 			categoryConfig: [
 				{
 					key: 'pakin_category',
-					name: '鍏ュ簱绠$悊',
+					name: this.$t('category.inbound'),
 					color: 'cyan',
 					icon: 'upload',
 					menuNames: ['pakin', 'orderPakin']
 				},
 				{
 					key: 'agv_category',
-					name: 'AGV绠$悊',
+					name: this.$t('category.agv'),
 					color: 'blue',
 					icon: 'navigate',
 					menuNames: ['agv_start', 'agv_back']
 				},
 				{
 					key: 'stock_category',
-					name: '搴撳瓨绠$悊',
+					name: this.$t('category.stock'),
 					color: 'green',
 					icon: 'search',
 					menuNames: ['stockQuery']
@@ -407,7 +407,7 @@
 				}
 
 				this.elements.push({
-					title: '閫�鍑虹櫥褰�',
+					title: this.$t('index.logOut'),
 					name: 'logOut',
 					color: 'grey',
 					cuIcon: 'exit',
@@ -425,7 +425,7 @@
 
 				if (errCode === 403) {
 					uni.showToast({
-						title: errMsg || '鏃犳潈闄愭垨鐧诲綍杩囨湡',
+						title: errMsg || this.$t('index.noAuth'),
 						icon: 'none',
 						position: 'top'
 					})
diff --git a/pages/mat/matSelected.vue b/pages/mat/matSelected.vue
index 8360dcd..fa33cbc 100644
--- a/pages/mat/matSelected.vue
+++ b/pages/mat/matSelected.vue
@@ -2,7 +2,7 @@
 	<view class="page-container">
 		<!-- 澶撮儴瀵艰埅 -->
 		<u-navbar
-			title="鍟嗗搧淇℃伅"
+			:title="$t('matSelected.title')"
 			:fixed="true"
 			:placeholder="true"
 			bgColor="#ffffff"
@@ -19,7 +19,7 @@
 						size="24"
 						color="#409eff"
 					></u-icon>
-					<text class="panel-title">鐗╂枡璇︽儏</text>
+					<text class="panel-title">{{ $t('matSelected.matDetail') }}</text>
 				</view>
 
 				<u--form
@@ -27,39 +27,39 @@
 					labelWidth="80"
 				>
 					<u-form-item
-						label="鍟嗗搧缂栫爜"
+						:label="$t('matSelected.matCode')"
 						borderBottom
 					>
 						<text class="value-text code">{{ mat.matnr }}</text>
 					</u-form-item>
 
 					<u-form-item
-						label="鍟嗗搧鍚嶇О"
+						:label="$t('matSelected.matName')"
 						borderBottom
 					>
 						<text class="value-text name">{{ mat.maktx }}</text>
 					</u-form-item>
 
 					<u-form-item
-						label="瑙勬牸"
+						:label="$t('matSelected.spec')"
 						borderBottom
 					>
 						<text class="value-text">{{ mat.specs || '-' }}</text>
 					</u-form-item>
 
 					<u-form-item
-						label="鎵瑰彿"
+						:label="$t('matSelected.batch')"
 						borderBottom
 					>
 						<u--input
 							v-model="mat.batch"
-							placeholder="璇疯緭鍏ユ壒鍙�"
+							:placeholder="$t('matSelected.inputBatch')"
 							border="none"
 							clearable
 						></u--input>
 					</u-form-item>
 
-					<u-form-item label="鏁伴噺">
+					<u-form-item :label="$t('matSelected.qty')">
 						<u-number-box
 							v-model="mat.anfme"
 							:max="99999999"
@@ -75,7 +75,7 @@
 		<view class="bottom-bar">
 			<u-button
 				type="primary"
-				text="纭鎻愬彇"
+				:text="$t('matSelected.confirmExtract')"
 				icon="checkbox-mark"
 				@click="back"
 				customStyle="width: 100%; border-radius: 40rpx;"
@@ -119,7 +119,7 @@
 		},
 		back() {
 			if (this.mat.anfme === 0) {
-				this.$showToast({ type: 'error', message: '璇疯緭鍏ユ暟閲�' })
+				this.$showToast({ type: 'error', message: this.$t('toast.inputQty') })
 				return
 			}
 			this.getOpenerEventChannel().emit('matList', { data: this.mat })
diff --git a/unflatten.js b/unflatten.js
new file mode 100644
index 0000000..b281101
--- /dev/null
+++ b/unflatten.js
@@ -0,0 +1,55 @@
+const fs = require('fs');
+const path = require('path');
+
+function unflatten(data) {
+    const result = {};
+
+    // Sort keys so that base objects are created before properties are added
+    const keys = Object.keys(data);
+
+    for (const key of keys) {
+        const value = data[key];
+
+        // If it's already an object, merge its keys
+        if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
+            if (!result[key] || typeof result[key] !== 'object') {
+                result[key] = result[key] || {};
+            }
+            Object.assign(result[key], value);
+        } else {
+            // Split by dot and nest
+            const parts = key.split('.');
+            let current = result;
+
+            for (let i = 0; i < parts.length - 1; i++) {
+                const part = parts[i];
+                if (!current[part] || typeof current[part] !== 'object') {
+                    current[part] = {};
+                }
+                current = current[part];
+            }
+            current[parts[parts.length - 1]] = value;
+        }
+    }
+
+    return result;
+}
+
+const dir = path.join(__dirname, 'locale');
+const files = fs.readdirSync(dir).filter(f => f.endsWith('.json'));
+
+files.forEach(file => {
+    const filePath = path.join(dir, file);
+    let content = fs.readFileSync(filePath, 'utf8');
+    let data;
+    try {
+        data = JSON.parse(content);
+    } catch (e) {
+        console.log(`Error parsing ${file}`);
+        return;
+    }
+
+    const nestedData = unflatten(data);
+    fs.writeFileSync(filePath, JSON.stringify(nestedData, null, 2), 'utf8');
+    console.log(`Updated ${file}`);
+});
diff --git a/update_locales.js b/update_locales.js
new file mode 100644
index 0000000..d127d60
--- /dev/null
+++ b/update_locales.js
@@ -0,0 +1,138 @@
+const fs = require('fs');
+
+const zhHans = {
+    'index.workplace': 'Zoneyung 宸ヤ綔鍙�',
+    'index.welcomeBack': '娆㈣繋鍥炴潵',
+    'index.systemName': '涓壃绔嬪簱 WMS 浠撳偍绠$悊绯荤粺',
+    'category.inbound': '鍏ュ簱绠$悊',
+    'category.agv': 'AGV绠$悊',
+    'category.stock': '搴撳瓨绠$悊',
+    'category.other': '鍏朵粬鎿嶄綔',
+    'index.pakin': '缁勬墭',
+    'index.orderPakin': '璁㈠崟鍏ュ簱',
+    'index.agv_start': 'AGV瀹瑰櫒鍏ュ簱',
+    'index.agv_back': 'AGV瀹瑰櫒鍥炲簱',
+    'index.stockQuery': '搴撳瓨鏌ヨ',
+    'index.logOut': '閫�鍑虹櫥褰�',
+    'index.copyright': 'copyright 漏 2022 娴欐睙涓壃绔嬪簱鏈夐檺鍏徃 all rights reserved.',
+    'index.noAuth': '鏃犳潈闄愭垨鐧诲綍杩囨湡',
+    'container.title': '缁勬墭',
+    'container.palletCode': '鎵樼洏鐮�',
+    'container.matCode': '鐗╂枡鐮�',
+    'container.scanPallet': '鎵爜 / 杈撳叆鎵樼洏鐮�',
+    'container.scanMat': '鎵爜 / 杈撳叆鐗╂枡鐮�',
+    'container.matList': '鍟嗗搧鍒楄〃',
+    'container.matName': '鍝佸悕',
+    'container.matSpec': '瑙勬牸',
+    'container.matBatch': '鎵瑰彿',
+    'container.matQty': '鏁伴噺',
+    'container.modify': '淇敼',
+    'container.remove': '绉婚櫎',
+    'container.reset': '閲嶇疆',
+    'container.confirmComb': '纭缁勬墭',
+    'container.emptyList': '鏆傛棤鍟嗗搧锛岃鎵弿鐗╂枡鐮佹坊鍔�',
+    'container.modifyInfo': '淇敼淇℃伅',
+    'container.code': '缂栫爜',
+    'container.confirmRemove': '纭绉婚櫎',
+    'container.removeMsg': '鏄惁绉婚櫎璇ュ晢鍝侊紵',
+    'container.confirmReset': '纭閲嶇疆',
+    'container.resetMsg': '鏄惁娓呯┖鎵�鏈夊晢鍝侊紵',
+    'container.combMsg': '纭灏嗗晢鍝佺粍鎵樺叆搴擄紵',
+    'toast.palletError': '鎵樼洏鐮佹湁璇閲嶈瘯',
+    'toast.queryFail': '鏌ヨ澶辫触',
+    'toast.modifySuccess': '淇敼鎴愬姛',
+    'toast.removeSuccess': '绉婚櫎鎴愬姛',
+    'toast.scanPalletCode': '璇锋壂鎻忔墭鐩樻潯鐮�',
+    'toast.qtyNotZero': '缁勬墭鏁伴噺涓嶈兘涓�0',
+    'toast.qtyNotZeroMat': '{0}缁勬墭鏁伴噺涓嶈兘涓�0',
+    'toast.combSuccess': '缁勬墭鎴愬姛',
+    'toast.combFail': '缁勬墭澶辫触',
+    'toast.resetComplete': '閲嶇疆瀹屾垚',
+    'matSelected.title': '鍟嗗搧淇℃伅',
+    'matSelected.matDetail': '鐗╂枡璇︽儏',
+    'matSelected.matCode': '鍟嗗搧缂栫爜',
+    'matSelected.matName': '鍟嗗搧鍚嶇О',
+    'matSelected.spec': '瑙勬牸',
+    'matSelected.batch': '鎵瑰彿',
+    'matSelected.inputBatch': '璇疯緭鍏ユ壒鍙�',
+    'matSelected.qty': '鏁伴噺',
+    'matSelected.confirmExtract': '纭鎻愬彇',
+    'toast.inputQty': '璇疯緭鍏ユ暟閲�'
+};
+
+const en = {
+    'index.workplace': 'Zoneyung Workspace',
+    'index.welcomeBack': 'Welcome Back',
+    'index.systemName': 'Zoneyung AS/RS WMS System',
+    'category.inbound': 'Inbound Management',
+    'category.agv': 'AGV Management',
+    'category.stock': 'Stock Management',
+    'category.other': 'Other Operations',
+    'index.pakin': 'Palletizing',
+    'index.orderPakin': 'Order Inbound',
+    'index.agv_start': 'AGV Container Inbound',
+    'index.agv_back': 'AGV Container Return',
+    'index.stockQuery': 'Stock Query',
+    'index.logOut': 'Logout',
+    'index.copyright': 'Copyright 漏 2022 Zhejiang Zoneyung AS/RS Co., Ltd. All rights reserved.',
+    'index.noAuth': 'No permissions or login expired',
+    'container.title': 'Palletizing',
+    'container.palletCode': 'Pallet Code',
+    'container.matCode': 'Material Code',
+    'container.scanPallet': 'Scan / Enter Pallet Code',
+    'container.scanMat': 'Scan / Enter Material Code',
+    'container.matList': 'Material List',
+    'container.matName': 'Name',
+    'container.matSpec': 'Spec',
+    'container.matBatch': 'Batch',
+    'container.matQty': 'Quantity',
+    'container.modify': 'Modify',
+    'container.remove': 'Remove',
+    'container.reset': 'Reset',
+    'container.confirmComb': 'Confirm Combin.',
+    'container.emptyList': 'No materials, please scan material code to add',
+    'container.modifyInfo': 'Modify Info',
+    'container.code': 'Code',
+    'container.confirmRemove': 'Confirm Remove',
+    'container.removeMsg': 'Remove this material?',
+    'container.confirmReset': 'Confirm Reset',
+    'container.resetMsg': 'Clear all materials?',
+    'container.combMsg': 'Confirm to palletize and inbound?',
+    'toast.palletError': 'Pallet code error, please try again',
+    'toast.queryFail': 'Query failed',
+    'toast.modifySuccess': 'Modification successful',
+    'toast.removeSuccess': 'Removal successful',
+    'toast.scanPalletCode': 'Please scan pallet code',
+    'toast.qtyNotZero': 'Palletizing quantity cannot be 0',
+    'toast.qtyNotZeroMat': '{0} palletizing quantity cannot be 0',
+    'toast.combSuccess': 'Palletizing successful',
+    'toast.combFail': 'Palletizing failed',
+    'toast.resetComplete': 'Reset complete',
+    'matSelected.title': 'Material Info',
+    'matSelected.matDetail': 'Material Details',
+    'matSelected.matCode': 'Material Code',
+    'matSelected.matName': 'Material Name',
+    'matSelected.spec': 'Spec',
+    'matSelected.batch': 'Batch',
+    'matSelected.inputBatch': 'Please enter batch',
+    'matSelected.qty': 'Quantity',
+    'matSelected.confirmExtract': 'Confirm Extract',
+    'toast.inputQty': 'Please enter quantity'
+};
+
+const zhHant = Object.assign({}, zhHans);
+const ja = Object.assign({}, zhHans);
+
+const files = [
+    { path: 'locale/zh-Hans.json', extract: zhHans },
+    { path: 'locale/en.json', extract: en },
+    { path: 'locale/zh-Hant.json', extract: zhHant },
+    { path: 'locale/ja.json', extract: ja }
+];
+
+files.forEach(f => {
+    const content = JSON.parse(fs.readFileSync(f.path, 'utf8'));
+    Object.assign(content, f.extract);
+    fs.writeFileSync(f.path, JSON.stringify(content, null, 2), 'utf8');
+});
+console.log('Update success');

--
Gitblit v1.9.1