From 50e95b985a72fcec4a93a2470e9efdfb2620148a Mon Sep 17 00:00:00 2001
From: zhou zhou <3272660260@qq.com>
Date: 星期四, 02 四月 2026 15:46:09 +0800
Subject: [PATCH] #i18n

---
 rsf-design/src/views/basic-info/warehouse-areas/warehouseAreasPage.helpers.js                  |   52 
 rsf-design/src/views/basic-info/loc/locTable.columns.js                                        |   41 
 rsf-design/src/views/system/ai-mcp-mount/index.vue                                             |   84 
 rsf-design/src/views/basic-info/companys/index.vue                                             |   60 
 rsf-design/src/views/orders/asn-order-item/asnOrderItemTable.columns.js                        |   47 
 rsf-design/src/views/orders/transfer-item/modules/transfer-item-detail-drawer.vue              |   67 
 rsf-design/src/components/core/layouts/art-page-content/index.vue                              |   11 
 rsf-design/src/views/basic-info/loc-area/locAreaTable.columns.js                               |   29 
 rsf-design/src/views/orders/wave/modules/wave-detail-drawer.vue                                |   41 
 rsf-design/src/views/orders/asn-order/asnOrderPage.helpers.js                                  |   47 
 rsf-design/src/views/manager/wave-rule/index.vue                                               |   28 
 rsf-design/src/views/orders/transfer/index.vue                                                 |   21 
 rsf-design/src/views/orders/purchase/purchaseTable.columns.js                                  |   13 
 rsf-design/src/views/orders/out-stock/index.vue                                                |  153 
 rsf-design/src/views/system/operation-record/operationRecordPage.helpers.js                    |   35 
 rsf-design/src/views/orders/out-stock/outStockPage.helpers.js                                  |  149 
 rsf-design/src/views/orders/asn-order-log/asnOrderLogTable.columns.js                          |   85 
 rsf-design/src/views/orders/wave-item/modules/wave-item-detail-drawer.vue                      |   35 
 rsf-design/src/views/orders/preparation/preparationPage.helpers.js                             |   18 
 rsf-design/src/views/orders/wave/waveTable.columns.js                                          |   63 
 rsf-design/src/views/system/menu/menuPage.helpers.js                                           |   18 
 rsf-design/src/views/system/ai-observe/index.vue                                               |   81 
 rsf-design/src/views/basic-info/wh-mat/whMatPage.helpers.js                                    |   88 
 rsf-design/src/views/manager/task-log/taskLogTable.columns.js                                  |   31 
 rsf-design/src/views/manager/task-log/taskLogPage.helpers.js                                   |   26 
 rsf-design/src/views/manager/in-statistic-item/inStatisticItemPage.helpers.js                  |    3 
 rsf-design/src/views/manager/task-log/index.vue                                                |   30 
 rsf-design/src/views/system/config/index.vue                                                   |   34 
 rsf-design/src/views/system/ai-param/modules/ai-param-runtime-summary.vue                      |   26 
 rsf-design/src/views/manager/task-log/modules/task-log-detail-drawer.vue                       |   48 
 rsf-design/src/components/core/forms/art-drag-verify/index.vue                                 |   10 
 rsf-design/src/views/basic-info/bas-container/basContainerTable.columns.js                     |   31 
 rsf-design/src/views/manager/menu-pda/menuPdaTable.columns.js                                  |   19 
 rsf-design/src/views/manager/loc-item/locItemPage.helpers.js                                   |   11 
 rsf-design/src/views/orders/transfer-item/transferItemTable.columns.js                         |   48 
 rsf-design/src/views/orders/asn-order/index.vue                                                |   19 
 rsf-design/src/views/system/config/configPage.helpers.js                                       |   36 
 rsf-design/src/views/basic-info/bas-station-area/modules/bas-station-area-dialog.vue           |   14 
 rsf-design/src/views/manager/loc-item/modules/loc-item-detail-drawer.vue                       |   45 
 rsf-design/src/views/orders/wave-item/waveItemPage.helpers.js                                  |   46 
 rsf-design/src/views/basic-info/matnr-group/matnrGroupTable.columns.js                         |   15 
 rsf-design/src/components/core/forms/art-excel-export/index.vue                                |    2 
 rsf-design/src/views/system/dict-type/dictTypeTable.columns.js                                 |   30 
 rsf-design/src/views/basic-info/loc-area-rela/locAreaRelaTable.columns.js                      |   27 
 rsf-design/src/views/orders/wave-item/waveItemTable.columns.js                                 |   61 
 rsf-design/src/views/system/config/modules/config-dialog.vue                                   |   52 
 rsf-design/src/views/basic-info/device-site/deviceSiteTable.columns.js                         |   41 
 rsf-design/src/views/manager/loc-preview/index.vue                                             |   46 
 rsf-design/src/views/manager/menu-pda/modules/menu-pda-dialog.vue                              |   85 
 rsf-design/src/views/orders/wave/modules/wave-public-task-dialog.vue                           |   19 
 rsf-design/src/views/basic-info/bas-station-area/basStationAreaTable.columns.js                |   49 
 rsf-design/src/views/manager/wave-rule/modules/wave-rule-dialog.vue                            |   38 
 rsf-design/src/views/basic-info/task-path-template-merge/taskPathTemplateMergeTable.columns.js |   52 
 rsf-design/src/views/system/ai-observe/aiObserveTable.columns.js                               |   18 
 rsf-design/src/views/system/ai-mcp-mount/modules/ai-mcp-mount-dialog.vue                       |  213 
 rsf-design/src/views/system/ai-observe/modules/ai-observe-detail-drawer.vue                    |   50 
 rsf-design/src/views/orders/out-stock-item/modules/out-stock-item-detail-drawer.vue            |   76 
 rsf-design/src/views/orders/asn-order-item-log/asnOrderItemLogPage.helpers.js                  |   51 
 rsf-design/src/views/orders/wave-item/index.vue                                                |   40 
 rsf-design/src/views/orders/asn-order-item/asnOrderItemPage.helpers.js                         |  149 
 rsf-design/src/views/system/dict-type/modules/dict-type-detail-drawer.vue                      |   26 
 rsf-design/src/components/core/banners/art-basic-banner/index.vue                              |    8 
 rsf-design/src/views/system/dept/deptTable.columns.js                                          |   30 
 rsf-design/src/views/orders/transfer-item/transferItemPage.helpers.js                          |   50 
 rsf-design/src/views/system/ai-prompt/aiPromptPage.helpers.js                                  |   28 
 rsf-design/src/views/orders/delivery-item/deliveryItemPage.helpers.js                          |   37 
 rsf-design/src/views/orders/transfer-item/index.vue                                            |  122 
 rsf-design/src/views/manager/freeze/modules/freeze-detail-drawer.vue                           |   58 
 rsf-design/src/views/system/ai-param/aiParamPage.helpers.js                                    |   46 
 rsf-design/src/views/system/ai-param/modules/ai-param-dialog.vue                               |  126 
 rsf-design/src/components/core/layouts/art-fast-enter/index.vue                                |    8 
 rsf-design/src/views/system/dict-type/index.vue                                                |   37 
 rsf-design/src/views/basic-info/bas-station-area/basStationAreaPage.helpers.js                 |  126 
 rsf-design/src/views/basic-info/loc-type/locTypeTable.columns.js                               |   31 
 rsf-design/src/views/basic-info/wh-mat/index.vue                                               |   60 
 rsf-design/src/views/basic-info/task-path-template/taskPathTemplateTable.columns.js            |   53 
 rsf-design/src/views/basic-info/wh-mat/whMatTable.columns.js                                   |   25 
 rsf-design/src/views/system/operation-record/operationRecordTable.columns.js                   |   27 
 rsf-design/src/views/orders/delivery-item/modules/delivery-item-detail-drawer.vue              |   61 
 rsf-design/src/views/basic-info/loc-area-mat-rela/locAreaMatRelaTable.columns.js               |   35 
 rsf-design/src/views/manager/loc-preview/locPreviewTable.columns.js                            |   25 
 rsf-design/src/views/manager/menu-pda/index.vue                                                |   38 
 rsf-design/src/components/core/banners/art-card-banner/index.vue                               |   10 
 rsf-design/src/views/manager/wave-rule/waveRuleTable.columns.js                                |   15 
 rsf-design/src/views/system/ai-prompt/modules/ai-prompt-dialog.vue                             |  122 
 rsf-design/src/views/manager/menu-pda/menuPdaPage.helpers.js                                   |   14 
 rsf-design/src/views/system/ai-prompt/index.vue                                                |   74 
 rsf-design/src/views/manager/freeze/index.vue                                                  |   36 
 rsf-design/src/views/orders/delivery/deliveryPage.helpers.js                                   |   73 
 rsf-design/src/views/system/config/modules/config-detail-drawer.vue                            |   30 
 rsf-design/src/views/system/user-login/index.vue                                               |   50 
 rsf-design/src/views/orders/out-stock/modules/out-stock-detail-drawer.vue                      |   56 
 rsf-design/src/views/system/operation-record/index.vue                                         |   58 
 rsf-design/src/views/basic-info/companys/companysTable.columns.js                              |   52 
 rsf-design/src/views/orders/out-stock-item/outStockItemTable.columns.js                        |   34 
 rsf-design/src/views/manager/freeze/freezeTable.columns.js                                     |   29 
 rsf-design/src/views/orders/asn-order-item/modules/asn-order-item-detail-drawer.vue            |   89 
 rsf-design/src/views/basic-info/wh-mat/modules/wh-mat-detail-drawer.vue                        |   76 
 rsf-design/src/views/basic-info/companys/modules/companys-dialog.vue                           |   74 
 rsf-design/src/components/core/layouts/art-notification/index.vue                              |   42 
 rsf-design/src/views/manager/loc-preview/locPreviewPage.helpers.js                             |    4 
 rsf-design/src/views/system/dict-type/dictTypePage.helpers.js                                  |   12 
 rsf-design/src/views/manager/wave-rule/modules/wave-rule-detail-drawer.vue                     |   22 
 rsf-design/src/views/manager/in-statistic-item/modules/in-statistic-item-detail-drawer.vue     |   60 
 rsf-design/src/locales/langs/en.json                                                           | 2398 ++++++++++++
 rsf-design/src/views/system/ai-mcp-mount/modules/ai-mcp-tools-drawer.vue                       |  101 
 rsf-design/src/views/system/ai-param/index.vue                                                 |   82 
 rsf-design/src/views/orders/wave/wavePage.helpers.js                                           |   97 
 rsf-design/src/views/basic-info/warehouse-areas/warehouseAreasTable.columns.js                 |   51 
 rsf-design/src/views/basic-info/warehouse/warehouseTable.columns.js                            |   31 
 rsf-design/src/views/manager/loc-item/index.vue                                                |   54 
 rsf-design/src/views/basic-info/task-path-template-node/taskPathTemplateNodeTable.columns.js   |   37 
 rsf-design/src/views/manager/wave-rule/waveRulePage.helpers.js                                 |    6 
 rsf-design/src/views/basic-info/device-bind/deviceBindTable.columns.js                         |   37 
 rsf-design/src/views/manager/loc-item/locItemTable.columns.js                                  |   45 
 rsf-design/src/components/core/media/art-cutter-img/index.vue                                  |   18 
 rsf-design/src/views/system/ai-mcp-mount/aiMcpMountPage.helpers.js                             |   10 
 rsf-design/src/views/manager/in-statistic-item/inStatisticItemTable.columns.js                 |   31 
 rsf-design/src/views/orders/out-stock-item/outStockItemPage.helpers.js                         |   23 
 rsf-design/src/views/basic-info/warehouse-areas/index.vue                                      |   58 
 rsf-design/src/views/orders/wave/index.vue                                                     |  115 
 rsf-design/src/views/basic-info/warehouse-areas/modules/warehouse-areas-detail-drawer.vue      |   48 
 rsf-design/src/views/stock/stock-transfer/stockTransferTable.columns.js                        |    7 
 rsf-design/src/views/manager/freeze/freezePage.helpers.js                                      |    4 
 rsf-design/src/views/basic-info/contract/contractTable.columns.js                              |   29 
 rsf-design/src/views/orders/transfer/transferPage.helpers.js                                   |   79 
 rsf-design/src/views/orders/asn-order-item-log/index.vue                                       |   42 
 rsf-design/src/views/orders/delivery/index.vue                                                 |   16 
 rsf-design/src/components/core/layouts/art-screen-lock/index.vue                               |   32 
 rsf-design/src/views/orders/delivery-item/deliveryItemTable.columns.js                         |   41 
 rsf-design/src/views/system/menu/index.vue                                                     |    3 
 rsf-design/src/views/system/dept/modules/dept-dialog.vue                                       |   42 
 rsf-design/src/views/system/dict-type/modules/dict-type-dialog.vue                             |   38 
 rsf-design/src/views/system/menu/menuTable.columns.js                                          |   33 
 rsf-design/src/views/basic-info/warehouse-areas/modules/warehouse-areas-dialog.vue             |   78 
 rsf-design/src/views/system/config/configTable.columns.js                                      |   29 
 rsf-design/src/views/system/dept/index.vue                                                     |   44 
 rsf-design/src/views/system/ai-observe/aiObservePage.helpers.js                                |   46 
 rsf-design/src/utils/sys/upgrade.js                                                            |    7 
 rsf-design/src/locales/langs/zh.json                                                           | 2398 ++++++++++++
 rsf-design/src/views/orders/out-stock-item/index.vue                                           |   65 
 rsf-design/src/views/basic-info/companys/modules/companys-detail-drawer.vue                    |   46 
 rsf-design/src/views/system/dept/deptPage.helpers.js                                           |    3 
 rsf-design/src/views/orders/out-stock/outStockTable.columns.js                                 |   36 
 rsf-design/src/views/basic-info/bas-station/basStationTable.columns.js                         |   45 
 rsf-design/src/views/basic-info/bas-station-area/index.vue                                     |   17 
 rsf-design/src/views/manager/loc-preview/modules/loc-preview-detail-drawer.vue                 |   26 
 rsf-design/src/views/basic-info/companys/companysPage.helpers.js                               |   21 
 rsf-design/src/views/orders/delivery-item/index.vue                                            |   46 
 rsf-design/src/views/manager/in-statistic-item/index.vue                                       |   20 
 rsf-design/src/views/orders/asn-order-item/index.vue                                           |   95 
 rsf-design/src/views/system/operation-record/modules/operation-record-detail-drawer.vue        |   32 
 rsf-design/src/views/basic-info/loc-area-mat/locAreaMatTable.columns.js                        |   32 
 153 files changed, 8,627 insertions(+), 3,013 deletions(-)

diff --git a/rsf-design/src/components/core/banners/art-basic-banner/index.vue b/rsf-design/src/components/core/banners/art-basic-banner/index.vue
index e38ea6e..129ef26 100644
--- a/rsf-design/src/components/core/banners/art-basic-banner/index.vue
+++ b/rsf-design/src/components/core/banners/art-basic-banner/index.vue
@@ -46,7 +46,7 @@
           }"
           @click.stop="emit('buttonClick')"
         >
-          {{ buttonConfig?.text }}
+          {{ buttonConfig?.text || t('components.banner.basic.view') }}
         </div>
       </slot>
 
@@ -60,7 +60,7 @@
         :src="imageConfig.src"
         :style="{ width: imageConfig.width, bottom: imageConfig.bottom, right: imageConfig.right }"
         loading="lazy"
-        alt="鑳屾櫙鍥剧墖"
+        :alt="t('components.banner.basic.backgroundAlt')"
       />
     </div>
   </div>
@@ -68,10 +68,12 @@
 
 <script setup>
   import { onMounted, ref, computed } from 'vue'
+  import { useI18n } from 'vue-i18n'
   import { useSettingStore } from '@/store/modules/setting'
   const settingStore = useSettingStore()
   const { isDark } = storeToRefs(settingStore)
   defineOptions({ name: 'ArtBasicBanner' })
+  const { t } = useI18n()
   const props = defineProps({
     height: { required: false, default: '11rem' },
     title: { required: false, default: '' },
@@ -84,7 +86,7 @@
       required: false,
       default: () => ({
         show: true,
-        text: '鏌ョ湅',
+        text: '',
         color: '#fff',
         textColor: '#333',
         radius: '6px'
diff --git a/rsf-design/src/components/core/banners/art-card-banner/index.vue b/rsf-design/src/components/core/banners/art-card-banner/index.vue
index 0e16579..b920a40 100644
--- a/rsf-design/src/components/core/banners/art-card-banner/index.vue
+++ b/rsf-design/src/components/core/banners/art-card-banner/index.vue
@@ -19,7 +19,7 @@
           }"
           @click="handleCancel"
         >
-          {{ cancelButton?.text }}
+          {{ cancelButton?.text || t('components.banner.card.cancel') }}
         </div>
         <div
           v-if="button?.show"
@@ -27,7 +27,7 @@
           :style="{ backgroundColor: button?.color, color: button?.textColor }"
           @click="handleClick"
         >
-          {{ button?.text }}
+          {{ button?.text || t('components.banner.card.viewDetails') }}
         </div>
       </div>
     </div>
@@ -36,7 +36,9 @@
 
 <script setup>
   import defaultIcon from '@imgs/3d/icon1.webp'
+  import { useI18n } from 'vue-i18n'
   defineOptions({ name: 'ArtCardBanner' })
+  const { t } = useI18n()
   defineProps({
     height: { required: false, default: '24rem' },
     image: { required: false, default: defaultIcon },
@@ -46,7 +48,7 @@
       required: false,
       default: () => ({
         show: true,
-        text: '鏌ョ湅璇︽儏',
+        text: '',
         color: 'var(--theme-color)',
         textColor: '#fff'
       })
@@ -55,7 +57,7 @@
       required: false,
       default: () => ({
         show: false,
-        text: '鍙栨秷',
+        text: '',
         color: '#f5f5f5',
         textColor: '#666'
       })
diff --git a/rsf-design/src/components/core/forms/art-drag-verify/index.vue b/rsf-design/src/components/core/forms/art-drag-verify/index.vue
index db85563..aa974bc 100644
--- a/rsf-design/src/components/core/forms/art-drag-verify/index.vue
+++ b/rsf-design/src/components/core/forms/art-drag-verify/index.vue
@@ -41,14 +41,16 @@
 </template>
 
 <script setup>
+  import { useI18n } from 'vue-i18n'
   defineOptions({ name: 'ArtDragVerify' })
+  const { t } = useI18n()
   const emit = defineEmits(['handlerMove', 'update:value', 'passCallback'])
   const props = defineProps({
     value: { required: false, default: false },
     width: { required: false, default: '100%' },
     height: { required: false, default: 40 },
-    text: { required: false, default: '鎸変綇婊戝潡鎷栧姩' },
-    successText: { required: false, default: 'success' },
+    text: { required: false, default: '' },
+    successText: { required: false, default: '' },
     background: { required: false, default: '#eee' },
     progressBarBg: { required: false, default: '#1385FF' },
     completedBg: { required: false, default: '#57D187' },
@@ -134,7 +136,9 @@
     fontSize: props.textSize
   }))
   const message = computed(() => {
-    return props.value ? props.successText : props.text
+    const dragText = props.text || t('components.dragVerify.dragText')
+    const successText = props.successText || t('components.dragVerify.successText')
+    return props.value ? successText : dragText
   })
   const dragStart = (e) => {
     if (!props.value) {
diff --git a/rsf-design/src/components/core/forms/art-excel-export/index.vue b/rsf-design/src/components/core/forms/art-excel-export/index.vue
index ea1d955..6fbe99a 100644
--- a/rsf-design/src/components/core/forms/art-excel-export/index.vue
+++ b/rsf-design/src/components/core/forms/art-excel-export/index.vue
@@ -206,7 +206,7 @@
           duration: 5e3
         })
       }
-      console.error('Excel 瀵煎嚭閿欒:', exportError)
+      console.error(t('message.exportExcelFailed', { message: String(exportError) }))
     } finally {
       isExporting.value = false
       emit('export-progress', 0)
diff --git a/rsf-design/src/components/core/layouts/art-fast-enter/index.vue b/rsf-design/src/components/core/layouts/art-fast-enter/index.vue
index 5272af7..ef1fe0d 100644
--- a/rsf-design/src/components/core/layouts/art-fast-enter/index.vue
+++ b/rsf-design/src/components/core/layouts/art-fast-enter/index.vue
@@ -45,7 +45,9 @@
       </div>
 
       <div class="border-l-d pl-6 pt-2">
-        <h3 class="mb-2.5 text-base font-medium text-g-800">蹇�熼摼鎺�</h3>
+        <h3 class="mb-2.5 text-base font-medium text-g-800">
+          {{ t('components.fastEnter.quickLinks') }}
+        </h3>
         <ul>
           <li
             v-for="quickLink in enabledQuickLinks"
@@ -63,14 +65,16 @@
 
 <script setup>
   import { useFastEnter } from '@/hooks/core/useFastEnter'
+  import { useI18n } from 'vue-i18n'
   defineOptions({ name: 'ArtFastEnter' })
+  const { t } = useI18n()
   const router = useRouter()
   const popoverRef = ref()
   const { enabledApplications, enabledQuickLinks } = useFastEnter()
   const handleNavigate = (routeName, link) => {
     const targetPath = routeName || link
     if (!targetPath) {
-      console.warn('瀵艰埅閰嶇疆鏃犳晥锛氱己灏戣矾鐢卞悕绉版垨閾炬帴')
+      console.warn(t('components.fastEnter.invalidNavigation'))
       return
     }
     if (targetPath.startsWith('http')) {
diff --git a/rsf-design/src/components/core/layouts/art-notification/index.vue b/rsf-design/src/components/core/layouts/art-notification/index.vue
index fdcdec0..5b86b4a 100644
--- a/rsf-design/src/components/core/layouts/art-notification/index.vue
+++ b/rsf-design/src/components/core/layouts/art-notification/index.vue
@@ -86,7 +86,7 @@
         >
           <ArtSvgIcon icon="system-uicons:inbox" class="text-5xl" />
           <p class="mt-3.5 text-xs !bg-transparent"
-            >{{ $t('notice.text[0]') }}{{ barList[barActiveIndex].name }}</p
+            >{{ $t('notice.emptyPrefix') }}{{ barList[barActiveIndex].name }}</p
           >
         </div>
       </div>
@@ -121,66 +121,66 @@
   const visible = ref(false)
   const barActiveIndex = ref(0)
   const useNotificationData = () => {
-    const noticeList2 = ref([
+    const noticeList2 = computed(() => [
       {
-        title: '鏂板鍥介檯鍖�',
+        title: t('notice.samples.notice.addI18n'),
         time: '2024-6-13 0:10',
         type: 'notice'
       },
       {
-        title: '鍐锋湀鍛嗗憜缁欎綘鍙戜簡涓�鏉℃秷鎭�',
+        title: t('notice.samples.notice.receiveMessage'),
         time: '2024-4-21 8:05',
         type: 'message'
       },
       {
-        title: '灏忚偉鐚叧娉ㄤ簡浣�',
+        title: t('notice.samples.notice.newFollower'),
         time: '2020-3-17 21:12',
         type: 'collection'
       },
       {
-        title: '鏂板浣跨敤鏂囨。',
+        title: t('notice.samples.notice.addDocs'),
         time: '2024-02-14 0:20',
         type: 'notice'
       },
       {
-        title: '灏忚偉鐚粰浣犲彂浜嗕竴灏侀偖浠�',
+        title: t('notice.samples.notice.receiveMail'),
         time: '2024-1-20 0:15',
         type: 'email'
       },
       {
-        title: '鑿滃崟mock鏈湴鐪熷疄鏁版嵁',
+        title: t('notice.samples.notice.menuMock'),
         time: '2024-1-17 22:06',
         type: 'notice'
       }
     ])
-    const msgList2 = ref([
+    const msgList2 = computed(() => [
       {
-        title: '姹犱笉鑳� 鍏虫敞浜嗕綘',
+        title: t('notice.samples.message.chibupang'),
         time: '2021-2-26 23:50',
         avatar: avatar1
       },
       {
-        title: '鍞愪笉鑻� 鍏虫敞浜嗕綘',
+        title: t('notice.samples.message.tangbuku'),
         time: '2021-2-21 8:05',
         avatar: avatar2
       },
       {
-        title: '涓皬楸� 鍏虫敞浜嗕綘',
+        title: t('notice.samples.message.zhongxiaoyu'),
         time: '2020-1-17 21:12',
         avatar: avatar3
       },
       {
-        title: '浣曞皬鑽� 鍏虫敞浜嗕綘',
+        title: t('notice.samples.message.hexiaohe'),
         time: '2021-01-14 0:20',
         avatar: avatar4
       },
       {
-        title: '瑾惰娣� 鍏虫敞浜嗕綘',
+        title: t('notice.samples.message.suixuinian'),
         time: '2020-12-20 0:15',
         avatar: avatar5
       },
       {
-        title: '鍐锋湀鍛嗗憜 鍏虫敞浜嗕綘',
+        title: t('notice.samples.message.lengyuedaidai'),
         time: '2020-12-17 22:06',
         avatar: avatar6
       }
@@ -188,15 +188,15 @@
     const pendingList2 = ref([])
     const barList2 = computed(() => [
       {
-        name: computed(() => t('notice.bar[0]')),
+        name: computed(() => t('notice.bar.notice')),
         num: noticeList2.value.length
       },
       {
-        name: computed(() => t('notice.bar[1]')),
+        name: computed(() => t('notice.bar.message')),
         num: msgList2.value.length
       },
       {
-        name: computed(() => t('notice.bar[2]')),
+        name: computed(() => t('notice.bar.todo')),
         num: pendingList2.value.length
       }
     ])
@@ -286,13 +286,13 @@
   }
   const useBusinessLogic = () => {
     const handleNoticeAll2 = () => {
-      console.log('鏌ョ湅鍏ㄩ儴閫氱煡')
+      console.log(t('notice.actions.viewAllNotice'))
     }
     const handleMsgAll2 = () => {
-      console.log('鏌ョ湅鍏ㄩ儴娑堟伅')
+      console.log(t('notice.actions.viewAllMessage'))
     }
     const handlePendingAll2 = () => {
-      console.log('鏌ョ湅鍏ㄩ儴寰呭姙')
+      console.log(t('notice.actions.viewAllTodo'))
     }
     return {
       handleNoticeAll: handleNoticeAll2,
diff --git a/rsf-design/src/components/core/layouts/art-page-content/index.vue b/rsf-design/src/components/core/layouts/art-page-content/index.vue
index 5c1c4c3..b6c9e1a 100644
--- a/rsf-design/src/components/core/layouts/art-page-content/index.vue
+++ b/rsf-design/src/components/core/layouts/art-page-content/index.vue
@@ -16,9 +16,11 @@
 
     <div v-if="routeRenderError" class="art-page-view art-route-state">
       <div class="art-route-state__panel">
-        <div class="art-route-state__title">椤甸潰鍔犺浇澶辫触</div>
+        <div class="art-route-state__title">{{ t('message.routeRenderFailedTitle') }}</div>
         <div class="art-route-state__desc">{{ routeRenderError }}</div>
-        <ElButton type="primary" @click="reloadCurrentRoute">閲嶆柊鍔犺浇</ElButton>
+        <ElButton type="primary" @click="reloadCurrentRoute">
+          {{ t('common.actions.reload') }}
+        </ElButton>
       </div>
     </div>
 
@@ -51,10 +53,12 @@
 </template>
 <script setup>
   import { useRoute } from 'vue-router'
+  import { useI18n } from 'vue-i18n'
   import { useAutoLayoutHeight } from '@/hooks/core/useLayoutHeight'
   import { useSettingStore } from '@/store/modules/setting'
   import { useWorktabStore } from '@/store/modules/worktab'
   defineOptions({ name: 'ArtPageContent' })
+  const { t } = useI18n()
   const route = useRoute()
   const { containerMinHeight } = useAutoLayoutHeight()
   const { pageTransition, containerWidth, refresh } = storeToRefs(useSettingStore())
@@ -118,7 +122,8 @@
     }
   )
   onErrorCaptured((error) => {
-    routeRenderError.value = error instanceof Error ? error.message : String(error || '椤甸潰娓叉煋寮傚父')
+    routeRenderError.value =
+      error instanceof Error ? error.message : String(error || t('message.routeRenderFailed'))
     return false
   })
   onMounted(() => {
diff --git a/rsf-design/src/components/core/layouts/art-screen-lock/index.vue b/rsf-design/src/components/core/layouts/art-screen-lock/index.vue
index 679c80e..2522cae 100644
--- a/rsf-design/src/components/core/layouts/art-screen-lock/index.vue
+++ b/rsf-design/src/components/core/layouts/art-screen-lock/index.vue
@@ -6,14 +6,16 @@
       v-if="showDevToolsWarning"
       class="fixed top-0 left-0 z-[999999] flex-cc w-full h-full text-white bg-gradient-to-br from-[#1e1e1e] to-black animate-fade-in"
     >
-      <div class="p-5 text-center select-none">
+        <div class="p-5 text-center select-none">
         <div class="mb-7.5 text-5xl">馃敀</div>
-        <h1 class="m-0 mb-5 text-3xl font-semibold text-danger">绯荤粺宸查攣瀹�</h1>
+        <h1 class="m-0 mb-5 text-3xl font-semibold text-danger">
+          {{ $t('lockScreen.devTools.title') }}
+        </h1>
         <p class="max-w-125 m-0 text-lg leading-relaxed text-white">
-          妫�娴嬪埌寮�鍙戣�呭伐鍏峰凡鎵撳紑<br />
-          涓轰簡绯荤粺瀹夊叏锛岃鍏抽棴寮�鍙戣�呭伐鍏峰悗缁х画浣跨敤
+          {{ $t('lockScreen.devTools.descriptionLine1') }}<br />
+          {{ $t('lockScreen.devTools.descriptionLine2') }}
         </p>
-        <div class="mt-7.5 text-sm text-gray-400">Security Lock Activated</div>
+        <div class="mt-7.5 text-sm text-gray-400">{{ $t('lockScreen.devTools.footer') }}</div>
       </div>
     </div>
 
@@ -21,7 +23,11 @@
     <div v-if="!isLock">
       <ElDialog v-model="visible" :width="370" :show-close="false" @open="handleDialogOpen">
         <div class="flex-c flex-col">
-          <img class="w-16 h-16 rounded-full" src="@imgs/user/avatar.webp" alt="鐢ㄦ埛澶村儚" />
+          <img
+            class="w-16 h-16 rounded-full"
+            src="@imgs/user/avatar.webp"
+            :alt="$t('lockScreen.avatarAlt')"
+          />
           <div class="mt-7.5 mb-3.5 text-base font-medium">{{ userInfo.userName }}</div>
           <ElForm
             ref="formRef"
@@ -59,7 +65,11 @@
     <!-- 瑙i攣鐣岄潰 -->
     <div v-else class="unlock-content">
       <div class="flex-c flex-col w-80">
-        <img class="w-16 h-16 mt-5 rounded-full" src="@imgs/user/avatar.webp" alt="鐢ㄦ埛澶村儚" />
+        <img
+          class="w-16 h-16 mt-5 rounded-full"
+          src="@imgs/user/avatar.webp"
+          :alt="$t('lockScreen.avatarAlt')"
+        />
         <div class="mt-3 mb-3.5 text-base font-medium">
           {{ userInfo.userName }}
         </div>
@@ -269,7 +279,7 @@
       )
       return inputPassword === decryptedPassword
     } catch (error) {
-      console.error('瀵嗙爜瑙e瘑澶辫触:', error)
+      console.error(t('lockScreen.errors.decryptFailed'), error)
       return false
     }
   }
@@ -294,7 +304,7 @@
         visible.value = false
         formData.password = ''
       } else {
-        console.error('琛ㄥ崟楠岃瘉澶辫触:', fields)
+        console.error(t('lockScreen.errors.validationFailed'), fields)
       }
     })
   }
@@ -311,7 +321,7 @@
             visible.value = false
             showDevToolsWarning.value = false
           } catch (error) {
-            console.error('鏇存柊store澶辫触:', error)
+            console.error(t('lockScreen.errors.updateStoreFailed'), error)
           }
         } else {
           const inputElement = unlockInputRef.value?.$el
@@ -325,7 +335,7 @@
           unlockForm.password = ''
         }
       } else {
-        console.error('琛ㄥ崟楠岃瘉澶辫触:', fields)
+        console.error(t('lockScreen.errors.validationFailed'), fields)
       }
     })
   }
diff --git a/rsf-design/src/components/core/media/art-cutter-img/index.vue b/rsf-design/src/components/core/media/art-cutter-img/index.vue
index f7f613d..a3b10d1 100644
--- a/rsf-design/src/components/core/media/art-cutter-img/index.vue
+++ b/rsf-design/src/components/core/media/art-cutter-img/index.vue
@@ -14,10 +14,10 @@
         class="img-cutter"
       >
         <template #choose>
-          <ElButton type="primary" plain v-ripple>閫夋嫨鍥剧墖</ElButton>
+          <ElButton type="primary" plain v-ripple>{{ t('components.cropper.chooseImage') }}</ElButton>
         </template>
         <template #cancel>
-          <ElButton type="danger" plain v-ripple>娓呴櫎</ElButton>
+          <ElButton type="danger" plain v-ripple>{{ t('components.cropper.clearImage') }}</ElButton>
         </template>
         <template #confirm>
           <!-- <ElButton type="primary" style="margin-left: 10px">纭畾</ElButton> -->
@@ -35,10 +35,10 @@
           height: `${cutterProps.cutHeight}px`
         }"
       >
-        <img class="preview-img" :src="temImgPath" alt="棰勮鍥�" v-if="temImgPath" />
+        <img class="preview-img" :src="temImgPath" :alt="t('components.cropper.previewAlt')" v-if="temImgPath" />
       </div>
       <ElButton class="download-btn" @click="downloadImg" :disabled="!temImgPath" v-ripple
-        >涓嬭浇鍥剧墖</ElButton
+        >{{ t('components.cropper.downloadImage') }}</ElButton
       >
     </div>
   </div>
@@ -46,8 +46,10 @@
 
 <script setup>
   import ImgCutter from 'vue-img-cutter'
+  import { useI18n } from 'vue-i18n'
 
   defineOptions({ name: 'ArtCutterImg' })
+  const { t } = useI18n()
   const props = defineProps({
     isModal: { required: false, default: false },
     tool: { required: false, default: true },
@@ -96,12 +98,12 @@
       try {
         await preloadImage(props.imgUrl)
         imgCutterModal.value?.handleOpen({
-          name: '灏侀潰鍥剧墖',
+          name: t('components.cropper.coverImage'),
           src: props.imgUrl
         })
       } catch (error) {
         emit('error', error)
-        console.error('鍥剧墖鍔犺浇澶辫触:', error)
+        console.error(t('components.cropper.imageLoadFailed'), error)
       }
     }
   }
@@ -137,10 +139,10 @@
     temImgPath.value = ''
   }
   function downloadImg() {
-    console.log('涓嬭浇鍥剧墖')
+    console.log(t('components.cropper.downloadLog'))
     const a = document.createElement('a')
     a.href = temImgPath.value
-    a.download = 'image.png'
+    a.download = t('components.cropper.fileName')
     a.click()
   }
 </script>
diff --git a/rsf-design/src/locales/langs/en.json b/rsf-design/src/locales/langs/en.json
index a34ec06..571d9c3 100644
--- a/rsf-design/src/locales/langs/en.json
+++ b/rsf-design/src/locales/langs/en.json
@@ -36,6 +36,7 @@
     "tips": "Prompt",
     "cancel": "Cancel",
     "confirm": "Confirm",
+    "close": "Close",
     "logOutTips": "Do you want to log out?",
     "count": "{count} items",
     "listSeparator": ", ",
@@ -43,6 +44,7 @@
       "search": "Search",
       "reset": "Reset",
       "refresh": "Refresh",
+      "reload": "Reload",
       "add": "Add",
       "batchDelete": "Batch Delete",
       "edit": "Edit",
@@ -58,7 +60,8 @@
       "collapse": "Collapse",
       "viewAll": "View All",
       "save": "Save",
-      "submit": "Submit"
+      "submit": "Submit",
+      "initialize": "Initialize"
     },
     "status": {
       "enabled": "Enabled",
@@ -113,6 +116,18 @@
     "index": "No.",
     "unit": "Unit",
     "id": "ID",
+    "name": "Name",
+    "code": "Code",
+    "status": "Status",
+    "memo": "Remark",
+    "createBy": "Created By",
+    "createTime": "Created At",
+    "updateBy": "Updated By",
+    "updateTime": "Updated At",
+    "sort": "Sort",
+    "route": "Route",
+    "authority": "Authority",
+    "operation": "Operation",
     "wcs": "WCS",
     "source": "Source",
     "supplier": "Supplier",
@@ -207,15 +222,66 @@
   "notice": {
     "title": "Notice",
     "btnRead": "Mark as read",
-    "bar": [
-      "Notice",
-      "Message",
-      "Todo"
-    ],
-    "text": [
-      "No"
-    ],
-    "viewAll": "View all"
+    "bar": {
+      "notice": "Notice",
+      "message": "Message",
+      "todo": "Todo"
+    },
+    "emptyPrefix": "No",
+    "viewAll": "View all",
+    "actions": {
+      "viewAllNotice": "View all notice",
+      "viewAllMessage": "View all message",
+      "viewAllTodo": "View all todo"
+    },
+    "samples": {
+      "notice": {
+        "addI18n": "Internationalization added",
+        "receiveMessage": "Lengyuedaidai sent you a message",
+        "newFollower": "Xiaofeizhu followed you",
+        "addDocs": "Usage documentation added",
+        "receiveMail": "Xiaofeizhu sent you an email",
+        "menuMock": "Menu mock switched to local real data"
+      },
+      "message": {
+        "chibupang": "Chibupang followed you",
+        "tangbuku": "Tangbuku followed you",
+        "zhongxiaoyu": "Zhongxiaoyu followed you",
+        "hexiaohe": "Hexiaohe followed you",
+        "suixuinian": "Suixuinian followed you",
+        "lengyuedaidai": "Lengyuedaidai followed you"
+      }
+    }
+  },
+  "components": {
+    "fastEnter": {
+      "quickLinks": "Quick Links",
+      "invalidNavigation": "Invalid navigation config: missing route name or link"
+    },
+    "dragVerify": {
+      "dragText": "Hold the slider and drag",
+      "successText": "Verified"
+    },
+    "banner": {
+      "card": {
+        "viewDetails": "View Details",
+        "cancel": "Cancel"
+      },
+      "basic": {
+        "view": "View",
+        "backgroundAlt": "Background Image"
+      }
+    },
+    "cropper": {
+      "chooseImage": "Choose Image",
+      "clearImage": "Clear",
+      "previewAlt": "Preview Image",
+      "downloadImage": "Download Image",
+      "coverImage": "Cover Image",
+      "imageLoadFailed": "Image load failed:",
+      "downloadLog": "Download image",
+      "fileName": "image.png"
+    }
   },
   "worktab": {
     "btn": {
@@ -287,6 +353,18 @@
   },
   "lockScreen": {
     "pwdError": "Password error",
+    "avatarAlt": "User avatar",
+    "devTools": {
+      "title": "System Locked",
+      "descriptionLine1": "Developer tools have been detected as open",
+      "descriptionLine2": "For system security, please close developer tools before continuing",
+      "footer": "Security Lock Activated"
+    },
+    "errors": {
+      "decryptFailed": "Password decryption failed:",
+      "validationFailed": "Form validation failed:",
+      "updateStoreFailed": "Store update failed:"
+    },
     "lock": {
       "inputPlaceholder": "Please input lock screen password",
       "btnText": "Lock"
@@ -467,7 +545,8 @@
     "subsystemFlowTemplate": "SubsystemFlowTemplate",
     "flowStepTemplate": "FlowStepTemplate",
     "taskPathTemplateMerge": "TaskPathTemplateMerge",
-    "missionFlowStepInstance": "Mission Flow Steps"
+    "missionFlowStepInstance": "Mission Flow Steps",
+    "aiManagementCenter": "AI Management Center"
   },
   "ai": {
     "drawer": {
@@ -582,13 +661,18 @@
     },
     "index": "Index",
     "id": "ID",
+    "name": "Name",
+    "code": "Code",
+    "keyword": "Keyword",
     "operation": "Operation",
     "status": "Status",
     "type": "Type",
     "source": "Source",
     "supplier": "Supplier",
     "supplierBatch": "Supplier Batch",
+    "memo": "Remark",
     "remark": "Remark",
+    "createBy": "Created By",
     "updateBy": "Updated By",
     "updateTime": "Updated At",
     "createTime": "Created At",
@@ -613,6 +697,11 @@
     "requestTimeoutStopped": "Request timed out and waiting has stopped",
     "exportTimeoutStopped": "Export request timed out and waiting has stopped",
     "printTimeoutStopped": "Print data loading timed out and waiting has stopped",
+    "routeRenderFailedTitle": "Page failed to load",
+    "routeRenderFailed": "The page failed to render. Please try again later.",
+    "systemUpgradeTitle": "System Upgrade Notice",
+    "systemUpgradeIntro": "The system has been upgraded to version {version}. Please review the following updates:",
+    "systemUpgradeRelogin": "This upgrade requires you to sign in again to apply the latest changes.",
     "exportInvalidDataType": "Data must be an array",
     "exportNoData": "No data available for export",
     "exportExceedMaxRows": "Row count exceeds the limit ({maxRows} rows)",
@@ -626,7 +715,321 @@
     "exportWorkbookComments": "Generated automatically by the system"
   },
   "pages": {
-    "system": {
+    "systemDraft": {
+      "aiParam": {
+        "title": "AI Params",
+        "subtitle": "Manage model connection parameters and default settings with cards.",
+        "entity": "AI parameter",
+        "reportTitle": "AI Parameter Report",
+        "empty": "No AI parameters",
+        "buttons": {
+          "add": "Add Parameter"
+        },
+        "actions": {
+          "setDefault": "Set Default"
+        },
+        "fields": {
+          "baseUrl": "Base URL",
+          "lastValidateTime": "Last Validation",
+          "timeoutMs": "Timeout",
+          "streamingEnabled": "Streaming",
+          "maxTokens": "Max Tokens"
+        },
+        "search": {
+          "condition": "Keyword",
+          "conditionPlaceholder": "Enter parameter name",
+          "providerType": "Provider",
+          "providerTypePlaceholder": "Enter provider type",
+          "model": "Model",
+          "modelPlaceholder": "Enter model name",
+          "status": "Default Status"
+        },
+        "status": {
+          "default": "Default",
+          "candidate": "Candidate"
+        },
+        "validation": {
+          "valid": "Validated",
+          "invalid": "Invalid",
+          "notTested": "Not Tested"
+        },
+        "streaming": {
+          "enabled": "Streaming",
+          "disabled": "Non-streaming"
+        },
+        "table": {
+          "name": "Name",
+          "providerType": "Provider Type",
+          "model": "Model",
+          "status": "Default Status",
+          "validateStatus": "Validation Status",
+          "timeoutMs": "Timeout"
+        },
+        "summary": {
+          "title": "Runtime Summary",
+          "subtitle": "Overview of the active model, prompt and MCP mounts.",
+          "refresh": "Refresh Summary",
+          "activeModel": "Active Model",
+          "activePrompt": "Active Prompt",
+          "lastPromptUpdate": "Last updated {value}",
+          "enabledMcp": "Enabled MCP",
+          "enabledMcpCount": "{count}",
+          "noMcp": "No mounts"
+        },
+        "dialog": {
+          "titleCreate": "Create AI Param",
+          "titleEdit": "Edit AI Param",
+          "titleDetail": "AI Param Detail",
+          "runtimeTitle": "Runtime Status",
+          "runtimeDescription": "Run draft validation before saving. Runtime status comes from the backend.",
+          "validateDraft": "Validate Draft",
+          "labels": {
+            "validateStatus": "Validation Status",
+            "lastValidateElapsedMs": "Last Validation Elapsed",
+            "lastValidateTime": "Last Validation Time",
+            "updateBy": "Updated By",
+            "updateTime": "Updated At",
+            "lastValidateMessage": "Last Validation Message",
+            "name": "Parameter Name",
+            "providerType": "Provider Type",
+            "baseUrl": "Base URL",
+            "apiKey": "API Key",
+            "model": "Model",
+            "temperature": "Temperature",
+            "topP": "Top P",
+            "maxTokens": "Max Tokens",
+            "timeoutMs": "Timeout (ms)",
+            "streamingEnabled": "Streaming",
+            "status": "Default Status",
+            "memo": "Remark"
+          },
+          "placeholders": {
+            "name": "Enter parameter name",
+            "providerType": "Select provider type",
+            "baseUrl": "Enter an OpenAI-compatible base URL",
+            "apiKey": "Enter API key",
+            "model": "Enter model name",
+            "temperature": "Enter temperature",
+            "topP": "Enter topP",
+            "maxTokens": "Enter max token count",
+            "timeoutMs": "Enter timeout",
+            "status": "Select default status",
+            "memo": "Enter remark"
+          },
+          "validation": {
+            "name": "Please enter a parameter name",
+            "providerType": "Please select a provider type",
+            "baseUrl": "Please enter a base URL",
+            "apiKey": "Please enter an API key",
+            "model": "Please enter a model name"
+          }
+        },
+        "messages": {
+          "setDefaultSuccess": "Default parameter updated",
+          "summaryTimeout": "Runtime summary timed out and waiting has stopped",
+          "summaryUnavailable": "Runtime summary is currently unavailable"
+        }
+      },
+      "aiPrompt": {
+        "title": "Prompt Management",
+        "subtitle": "Manage system prompts and scene-based user prompt templates with cards.",
+        "entity": "Prompt",
+        "reportTitle": "Prompt Report",
+        "empty": "No prompts",
+        "buttons": {
+          "add": "Add Prompt"
+        },
+        "fields": {
+          "sceneTag": "Scene {value}",
+          "systemPrompt": "System Prompt",
+          "userPromptTemplate": "User Prompt Template"
+        },
+        "search": {
+          "condition": "Keyword",
+          "conditionPlaceholder": "Enter prompt name",
+          "code": "Prompt Code",
+          "codePlaceholder": "Enter prompt code",
+          "scene": "Scene",
+          "scenePlaceholder": "Enter scene",
+          "status": "Status"
+        },
+        "table": {
+          "name": "Prompt Name",
+          "code": "Prompt Code",
+          "scene": "Scene",
+          "status": "Status",
+          "systemPrompt": "System Prompt",
+          "userPromptTemplate": "User Prompt Template"
+        },
+          "dialog": {
+            "titleCreate": "Create Prompt",
+            "titleEdit": "Edit Prompt",
+            "titleDetail": "Prompt Detail",
+            "defaultPreviewInput": "Please summarize the current input",
+            "previewTitle": "Render Preview",
+          "previewDescription": "Input sample content and metadata to preview the final rendering.",
+          "previewAction": "Render Preview",
+          "previewResolvedVariables": "Resolved variables: {value}",
+          "previewNoVariables": "None",
+          "runtimeTitle": "Runtime Status",
+          "labels": {
+            "updateBy": "Updated By",
+            "updateTime": "Updated At",
+            "name": "Prompt Name",
+            "code": "Prompt Code",
+            "scene": "Scene",
+            "systemPrompt": "System Prompt",
+            "userPromptTemplate": "User Prompt Template",
+            "status": "Status",
+            "memo": "Remark"
+          },
+          "placeholders": {
+            "previewInput": "Enter sample input",
+            "metadata": "Enter JSON metadata, for example {\"path\":\"/system/aiPrompt\"}",
+            "renderedSystemPrompt": "Rendered system prompt",
+            "renderedUserPrompt": "Rendered user prompt",
+            "name": "Enter prompt name",
+            "code": "Enter prompt code",
+            "scene": "Enter scene",
+            "systemPrompt": "Enter system prompt",
+            "userPromptTemplate": "Enter user prompt template",
+            "status": "Select status",
+            "memo": "Enter remark"
+          },
+          "validation": {
+            "name": "Please enter a prompt name",
+            "code": "Please enter a prompt code",
+            "scene": "Please enter a scene",
+            "systemPrompt": "Please enter the system prompt",
+            "userPromptTemplate": "Please enter the user prompt template"
+          }
+        },
+        "messages": {
+          "previewFailed": "Render preview failed"
+        }
+      },
+      "aiMcpMount": {
+        "title": "MCP Mounts",
+        "subtitle": "Manage MCP service mounts and runtime health in the current environment.",
+        "entity": "MCP mount",
+        "empty": "No MCP mounts",
+        "buttons": {
+          "add": "Add Mount"
+        },
+        "fields": {
+          "target": "Target",
+          "lastTestTime": "Last Test Time",
+          "timeoutMs": "Request Timeout",
+          "lastInitElapsedMs": "Last Init Elapsed"
+        },
+        "search": {
+          "condition": "Keyword",
+          "conditionPlaceholder": "Enter mount name",
+          "transportType": "Transport Type",
+          "status": "Status"
+        },
+        "actions": {
+          "connectivityTest": "Connectivity Test",
+          "toolsPreview": "Tools Preview"
+        },
+        "health": {
+          "healthy": "Healthy",
+          "unhealthy": "Unhealthy",
+          "notTested": "Not Tested"
+        },
+        "groups": {
+          "builtin": {
+            "title": "Built-in Mounts",
+            "description": "Platform built-in MCP capabilities."
+          },
+          "sse": {
+            "title": "SSE / HTTP Mounts",
+            "description": "Remote MCP services connected through HTTP/SSE."
+          },
+          "stdio": {
+            "title": "STDIO Mounts",
+            "description": "MCP services launched locally and communicated with through stdio."
+          }
+        },
+        "dialog": {
+          "titleCreate": "Create Mount",
+          "titleEdit": "Edit Mount",
+          "titleDetail": "Mount Detail",
+          "draftTestTitle": "Draft Connectivity Test",
+          "draftTestDescription": "Validate the current mount configuration before saving.",
+          "draftTestAction": "Test Draft Connectivity",
+          "runtimeTitle": "Runtime Status",
+          "runtimeLabels": {
+            "healthStatus": "Health Status",
+            "lastTestTime": "Last Test Time",
+            "lastInitElapsedMs": "Last Init Elapsed",
+            "updateTime": "Updated At",
+            "lastTestMessage": "Last Test Message"
+          },
+          "labels": {
+            "name": "Name",
+            "transportType": "Transport Type",
+            "builtinCode": "Built-in MCP Code",
+            "serverUrl": "Server URL",
+            "endpoint": "SSE Endpoint",
+            "headersJson": "Headers JSON",
+            "command": "Command",
+            "argsJson": "Args JSON",
+            "envJson": "Environment JSON",
+            "requestTimeoutMs": "Request Timeout (ms)",
+            "sort": "Sort",
+            "status": "Status",
+            "memo": "Remark"
+          },
+          "placeholders": {
+            "name": "Enter name",
+            "transportType": "Select transport type",
+            "builtinCode": "Enter built-in MCP code",
+            "serverUrl": "Enter server URL",
+            "endpoint": "Enter SSE endpoint",
+            "headersJson": "Enter headers JSON",
+            "command": "Enter command",
+            "argsJson": "Enter command args JSON",
+            "envJson": "Enter environment JSON",
+            "requestTimeoutMs": "Enter request timeout",
+            "sort": "Enter sort",
+            "status": "Select status",
+            "memo": "Enter remark"
+          },
+          "validation": {
+            "name": "Please enter a name",
+            "transportType": "Please select a transport type"
+          }
+        },
+        "toolsDrawer": {
+          "title": "MCP Tools Preview",
+          "currentMount": "Current Mount",
+          "description": "Preview the tool list and run debug tests for tool inputs.",
+          "refreshTools": "Refresh Tools",
+          "connectivityTest": "Connectivity Test",
+          "empty": "No tools available",
+          "toolTest": "Run Tool Test",
+          "inputJson": "Input JSON",
+          "inputJsonPlaceholder": "Enter JSON, for example {\"taskCode\":\"TK001\"}",
+          "output": "Tool Output",
+          "outputPlaceholder": "Tool output will be shown here",
+          "inputSchema": "Input Schema",
+          "toolInputRequired": "Please enter tool test input JSON",
+          "toolTestSuccess": "Tool test succeeded",
+          "toolTestFailed": "Tool test failed",
+          "toolsLoadFailed": "Failed to load tool list"
+        },
+        "messages": {
+          "connectivityTimeout": "Connectivity test timed out and waiting has stopped",
+          "connectivitySuccess": "Connectivity test succeeded",
+          "connectivityFailed": "Connectivity test failed",
+          "draftConnectivitySuccess": "Draft connectivity test succeeded",
+          "draftConnectivityFailed": "Draft connectivity test failed",
+          "toolsTimeout": "Tool list timed out and waiting has stopped",
+          "toolTestTimeout": "Tool test timed out and waiting has stopped",
+          "initElapsedMs": "Initialization elapsed {value} ms"
+        }
+      },
       "role": {
         "entity": "Role",
         "reportTitle": "Role Report",
@@ -721,6 +1124,98 @@
       }
     },
     "orders": {
+      "common": {
+        "orderCode": "Document Code",
+        "trackCode": "Track Code"
+      },
+      "asnOrderItem": {
+        "reportTitle": "Receiving Item Report",
+        "sourceTitle": "Current Source",
+        "sourceLabel": "ASN ID: {id}",
+        "orderType": {
+          "in": "Inbound",
+          "out": "Outbound"
+        },
+        "ntyStatus": {
+          "notReported": "Not Reported",
+          "reported": "Reported"
+        },
+        "search": {
+          "conditionPlaceholder": "Enter PO No./material code/material name/supplier",
+          "poCode": "PO No.",
+          "poCodePlaceholder": "Enter PO No.",
+          "orderCode": "ASN No.",
+          "orderCodePlaceholder": "Enter ASN No.",
+          "platWorkCode": "Plan Track No.",
+          "platWorkCodePlaceholder": "Enter plan track No.",
+          "platItemId": "Line No.",
+          "platItemIdPlaceholder": "Enter line No.",
+          "matnrCodePlaceholder": "Enter material code",
+          "maktxPlaceholder": "Enter material name",
+          "splrBatchPlaceholder": "Enter supplier batch",
+          "stockUnit": "Stock Unit",
+          "stockUnitPlaceholder": "Enter stock unit",
+          "ntyStatus": "Report Status",
+          "createTimeRange": "Created At",
+          "updateTimeRange": "Updated At",
+          "startTime": "Start Time",
+          "endTime": "End Time",
+          "rangeSeparator": "To"
+        },
+        "table": {
+          "poCode": "PO No.",
+          "wkType": "Business Type",
+          "type": "Document Type",
+          "purchaseOrg": "Purchase Org",
+          "purchaseUser": "Purchaser",
+          "platWorkCode": "Plan Track No.",
+          "platItemId": "Line No.",
+          "stockUnit": "Stock Unit",
+          "anfme": "Delivery Qty",
+          "qty": "Received Qty",
+          "targetWarehouseId": "Suggested Target Warehouse",
+          "businessTime": "Business Time"
+        },
+        "detail": {
+          "title": "Receiving Item Detail",
+          "baseInfo": "Basic Information",
+          "itemInfo": "Item Information",
+          "auditInfo": "Audit Information",
+          "extendFields": "Extended Fields",
+          "poCode": "PO No.",
+          "orderCode": "ASN No.",
+          "wkType": "Business Type",
+          "orderType": "Document Type",
+          "purchaseOrg": "Purchase Org",
+          "purchaseUser": "Purchaser",
+          "supplierId": "Supplier ID",
+          "supplierName": "Supplier Name",
+          "businessTime": "Business Time",
+          "targetWarehouseId": "Suggested Target Warehouse",
+          "ntyStatus": "Report Status",
+          "platItemId": "Plan Line No.",
+          "platWorkCode": "Plan Track No.",
+          "spec": "Specification",
+          "model": "Model",
+          "barcode": "Barcode",
+          "qrcode": "QR Code",
+          "packName": "Package Name",
+          "stockUnit": "Stock Unit",
+          "purUnit": "Purchase Unit",
+          "anfme": "Delivery Qty",
+          "qty": "Received Qty",
+          "purQty": "Purchase Qty",
+          "prodTime": "Production Date",
+          "isptResult": "Inspection Result",
+          "sourceWarehouseId": "Source Warehouse"
+        },
+        "messages": {
+          "detailTimeout": "Receiving item detail timed out and waiting has stopped",
+          "detailFailed": "Failed to load receiving item detail",
+          "pageTimeout": "Receiving item loading timed out and waiting has stopped",
+          "noExportData": "No data available for export"
+        }
+      },
       "asnOrder": {
         "reportTitle": "ASN Report",
         "entity": "ASN",
@@ -830,6 +1325,258 @@
           "receivedQtyTotal": "Received Qty"
         }
       },
+      "asnOrderLog": {
+        "table": {
+          "poId": "PO ID",
+          "type": "Order Type",
+          "wkType": "Business Type",
+          "anfme": "Delivery Qty",
+          "qty": "Received Qty",
+          "logisNo": "Logistics No.",
+          "arrTime": "Estimated Arrival Time",
+          "rleStatus": "Release Status",
+          "exceStatus": "Execution Status"
+        }
+      },
+      "asnOrderItemLog": {
+        "reportTitle": "ASN Item Log Report",
+        "table": {
+          "asnCode": "ASN No.",
+          "platItemId": "Platform Line No.",
+          "poDetlId": "PO Item ID",
+          "poCode": "PO No.",
+          "fieldsIndex": "Dynamic Field Index",
+          "matnrCode": "Material Code",
+          "maktx": "Material Name",
+          "anfme": "Delivery Qty",
+          "stockUnit": "Stock Unit",
+          "purQty": "Purchase Qty",
+          "purUnit": "Purchase Unit",
+          "qty": "Received Qty",
+          "splrCode": "Supplier Code",
+          "splrBatch": "Supplier Batch",
+          "splrName": "Supplier Name",
+          "qrcode": "QR Code",
+          "trackCode": "Track Code",
+          "barcode": "Barcode",
+          "packName": "Package Name",
+          "ntyStatus": "Report Status"
+        },
+        "search": {
+          "condition": "Keyword",
+          "conditionPlaceholder": "Enter ASN No./PO No./material code",
+          "logId": "Log ID",
+          "logIdPlaceholder": "Enter log ID",
+          "asnCodePlaceholder": "Enter ASN No.",
+          "poCodePlaceholder": "Enter PO No.",
+          "matnrCodePlaceholder": "Enter material code",
+          "maktxPlaceholder": "Enter material name",
+          "splrBatchPlaceholder": "Enter supplier batch"
+        },
+        "status": {
+          "notReported": "Not Reported",
+          "reported": "Reported",
+          "partialReported": "Partially Reported"
+        }
+      },
+      "outStock": {
+        "reportTitle": "Out Stock Report",
+        "entity": "Out Stock Order",
+        "type": {
+          "out": "Out Stock Order"
+        },
+        "businessType": {
+          "salesOut": "Sales Outbound",
+          "transferOut": "Transfer Outbound",
+          "stockOut": "Stock Outbound",
+          "preOut": "Preparation Outbound"
+        },
+        "search": {
+          "condition": "Keyword",
+          "conditionPlaceholder": "Enter out stock order / PO No. / customer",
+          "code": "Out Stock Order",
+          "codePlaceholder": "Enter out stock order",
+          "poCode": "PO No.",
+          "poCodePlaceholder": "Enter PO No.",
+          "wkType": "Business Type",
+          "wkTypePlaceholder": "Select business type",
+          "exceStatus": "Document Status",
+          "exceStatusPlaceholder": "Select document status",
+          "rleStatus": "Release Status",
+          "rleStatusPlaceholder": "Select release status",
+          "logisNo": "Logistics No.",
+          "logisNoPlaceholder": "Enter logistics No.",
+          "customerName": "Customer Name",
+          "customerNamePlaceholder": "Enter customer name",
+          "saleOrgName": "Sales Org",
+          "saleOrgNamePlaceholder": "Enter sales org",
+          "memo": "Remark",
+          "memoPlaceholder": "Enter remark"
+        },
+        "status": {
+          "initialized": "Initialized",
+          "pending": "Pending",
+          "generated": "Generated Work File",
+          "running": "Running",
+          "completed": "Completed",
+          "cancelled": "Cancelled",
+          "released": "Released"
+        },
+        "actions": {
+          "view": "View Detail",
+          "items": "Items",
+          "print": "Print",
+          "complete": "Complete",
+          "cancel": "Cancel",
+          "delete": "Delete"
+        },
+        "table": {
+          "code": "Out Stock Order",
+          "poCode": "PO No.",
+          "type": "Order Type",
+          "wkType": "Business Type",
+          "customerName": "Customer",
+          "saleOrgName": "Sales Org",
+          "anfme": "Required Qty",
+          "workQty": "Execution Qty",
+          "qty": "Outbound Qty",
+          "logisNo": "Logistics No.",
+          "rleStatus": "Release Status",
+          "exceStatus": "Document Status",
+          "updateTime": "Updated At"
+        },
+        "detail": {
+          "title": "Out Stock Detail",
+          "baseInfo": "Basic Information",
+          "auditInfo": "Audit Information",
+          "items": "Order Items",
+          "count": "{count} items",
+          "code": "Out Stock Order",
+          "poCode": "PO No.",
+          "type": "Order Type",
+          "wkType": "Business Type",
+          "exceStatus": "Document Status",
+          "rleStatus": "Release Status",
+          "logisNo": "Logistics No.",
+          "businessTime": "Business Time",
+          "saleOrgName": "Sales Org",
+          "saleUserName": "Sales User",
+          "customerId": "Customer Code",
+          "customerName": "Customer Name",
+          "stockOrgName": "Warehouse Org",
+          "anfme": "Required Qty",
+          "workQty": "Execution Qty",
+          "qty": "Outbound Qty",
+          "memo": "Remark",
+          "createBy": "Created By",
+          "createTime": "Created At",
+          "updateBy": "Updated By",
+          "updateTime": "Updated At"
+        },
+        "messages": {
+          "detailTimeout": "Out stock detail timed out and waiting has stopped",
+          "itemsTimeout": "Out stock items timed out and waiting has stopped",
+          "detailLoadFailed": "Failed to load out stock detail",
+          "completeTitle": "Complete Confirmation",
+          "completeConfirm": "Are you sure you want to complete out stock order {code}?",
+          "completeSuccess": "Completed successfully",
+          "cancelTitle": "Cancel Confirmation",
+          "cancelConfirm": "Are you sure you want to cancel out stock order {code}?",
+          "cancelSuccess": "Cancelled successfully",
+          "actionFailed": "Out stock action failed"
+        }
+      },
+      "outStockItem": {
+        "title": "Out Stock Item",
+        "reportTitle": "Out Stock Item Report",
+        "sourceSummary": {
+          "title": "Current Source",
+          "orderId": "Out stock order ID: {id}"
+        },
+        "search": {
+          "condition": "Keyword",
+          "conditionPlaceholder": "Enter out stock order / material code / material name",
+          "orderCode": "Out Stock Order",
+          "orderCodePlaceholder": "Enter out stock order",
+          "poCode": "PO No.",
+          "poCodePlaceholder": "Enter PO No.",
+          "platItemId": "Platform Line No.",
+          "platItemIdPlaceholder": "Enter platform line No.",
+          "matnrCode": "Material Code",
+          "matnrCodePlaceholder": "Enter material code",
+          "maktx": "Material Name",
+          "maktxPlaceholder": "Enter material name",
+          "batch": "Batch",
+          "batchPlaceholder": "Enter batch",
+          "splrBatch": "Supplier Batch",
+          "splrBatchPlaceholder": "Enter supplier batch",
+          "barcode": "Barcode",
+          "barcodePlaceholder": "Enter barcode",
+          "fieldsIndex": "Field Index",
+          "fieldsIndexPlaceholder": "Enter field index",
+          "status": "Status",
+          "statusPlaceholder": "Select status"
+        },
+        "detail": {
+          "title": "Out Stock Item Detail",
+          "orderCode": "Out Stock Order",
+          "poCode": "PO No.",
+          "platItemId": "Platform Line No.",
+          "platOrderCode": "Platform Order No.",
+          "platWorkCode": "Platform Work Order No.",
+          "projectCode": "Project No.",
+          "matnrCode": "Material Code",
+          "maktx": "Material Name",
+          "spec": "Specification",
+          "model": "Model",
+          "batch": "Batch",
+          "splrBatch": "Supplier Batch",
+          "stockUnit": "Stock Unit",
+          "purUnit": "Purchase Unit",
+          "baseUnit": "Base Unit",
+          "fieldsIndex": "Field Index",
+          "barcode": "Barcode",
+          "qrcode": "QR Code",
+          "packName": "Package Name",
+          "status": "Status",
+          "anfme": "Quantity",
+          "workQty": "Execution Qty",
+          "qty": "Outbound Qty",
+          "purQty": "Purchase Qty",
+          "demandQty": "Demand Qty",
+          "splrCode": "Supplier Code",
+          "splrName": "Supplier Name",
+          "sourceWarehouseId": "Source Warehouse",
+          "targetWarehouseId": "Target Warehouse",
+          "ownerName": "Owner",
+          "keeperName": "Keeper",
+          "memo": "Remark",
+          "createBy": "Created By",
+          "createTime": "Created At",
+          "updateBy": "Updated By",
+          "updateTime": "Updated At"
+        },
+        "table": {
+          "orderCode": "Out Stock Order",
+          "poCode": "PO No.",
+          "platItemId": "Platform Line No.",
+          "matnrCode": "Material Code",
+          "maktx": "Material Name",
+          "batch": "Batch",
+          "splrBatch": "Supplier Batch",
+          "stockUnit": "Stock Unit",
+          "anfme": "Quantity",
+          "workQty": "Execution Qty",
+          "qty": "Outbound Qty",
+          "fieldsIndex": "Field Index",
+          "status": "Status",
+          "updateTime": "Updated At"
+        },
+        "messages": {
+          "detailTimeout": "Out stock item detail timed out and waiting has stopped",
+          "detailFailed": "Failed to load out stock item detail"
+        }
+      },
       "delivery": {
         "reportTitle": "DO Report",
         "detailReportTitle": "DO Item Report",
@@ -922,6 +1669,56 @@
           "itemsTimeout": "DO items timed out and waiting has stopped",
           "detailTimeout": "DO detail timed out and waiting has stopped",
           "detailLoadFailed": "Failed to load DO detail"
+        }
+      },
+      "deliveryItem": {
+        "reportTitle": "DO Item Report",
+        "sourceTitle": "Current Source",
+        "sourceLabel": "DO ID: {id}",
+        "search": {
+          "conditionPlaceholder": "Enter DO No./material code/material name/supplier",
+          "deliveryCode": "DO No.",
+          "deliveryCodePlaceholder": "Enter DO No.",
+          "platItemId": "Platform Line No.",
+          "platItemIdPlaceholder": "Enter platform line No.",
+          "matnrCodePlaceholder": "Enter material code",
+          "maktxPlaceholder": "Enter material name",
+          "supplierName": "Supplier Name",
+          "supplierNamePlaceholder": "Enter supplier name",
+          "supplierBatchPlaceholder": "Enter supplier batch"
+        },
+        "table": {
+          "deliveryId": "DO ID",
+          "deliveryCode": "DO No.",
+          "platItemId": "Platform Line No.",
+          "fieldsIndex": "Field Index",
+          "workQty": "Execution Qty",
+          "qty": "Outbound Qty",
+          "nromQty": "Std. Pack",
+          "printQty": "Print Qty",
+          "supplierCode": "Supplier Code",
+          "supplierName": "Supplier Name"
+        },
+        "detail": {
+          "title": "DO Item Detail",
+          "baseInfo": "Basic Information",
+          "auditInfo": "Audit Information",
+          "deliveryId": "DO ID",
+          "deliveryCode": "DO No.",
+          "platItemId": "Platform Line No.",
+          "fieldsIndex": "Field Index",
+          "workQty": "Execution Qty",
+          "qty": "Outbound Qty",
+          "nromQty": "Std. Pack",
+          "printQty": "Print Qty",
+          "supplierCode": "Supplier Code",
+          "supplierName": "Supplier Name",
+          "packName": "Package Name",
+          "prodTime": "Production Date"
+        },
+        "messages": {
+          "detailTimeout": "DO item detail timed out and waiting has stopped",
+          "detailFailed": "Failed to load DO item detail"
         }
       },
       "transfer": {
@@ -1038,6 +1835,267 @@
           "publishFailed": "Dispatch failed",
           "typeOptionsTimeout": "Transfer type options timed out and waiting has stopped",
           "areaOptionsTimeout": "Area options timed out and waiting has stopped"
+        }
+      },
+      "transferItem": {
+        "reportTitle": "Transfer Item Report",
+        "sourceTitle": "Current Source",
+        "sourceLabel": "Transfer ID: {id}",
+        "search": {
+          "conditionPlaceholder": "Enter transfer No./material code/material name",
+          "transferId": "Transfer ID",
+          "transferIdPlaceholder": "Enter transfer ID",
+          "transferCode": "Transfer No.",
+          "transferCodePlaceholder": "Enter transfer No.",
+          "platItemId": "Platform Line No.",
+          "platItemIdPlaceholder": "Enter platform line No.",
+          "matnrId": "Material ID",
+          "matnrIdPlaceholder": "Enter material ID",
+          "matnrCodePlaceholder": "Enter material code",
+          "maktxPlaceholder": "Enter material name",
+          "spec": "Specification",
+          "specPlaceholder": "Enter specification",
+          "model": "Model",
+          "modelPlaceholder": "Enter model",
+          "batchPlaceholder": "Enter batch",
+          "unitPlaceholder": "Enter unit",
+          "workQty": "Execution Qty",
+          "workQtyPlaceholder": "Enter execution qty",
+          "qty": "Completed Qty",
+          "qtyPlaceholder": "Enter completed qty",
+          "anfmePlaceholder": "Enter planned qty",
+          "fieldsIndex": "Field Index",
+          "fieldsIndexPlaceholder": "Enter field index",
+          "platOrderCode": "Platform Order No.",
+          "platOrderCodePlaceholder": "Enter platform order No.",
+          "platWorkCode": "Platform Work No.",
+          "platWorkCodePlaceholder": "Enter platform work No.",
+          "projectCode": "Project Code",
+          "projectCodePlaceholder": "Enter project code",
+          "splrId": "Supplier ID",
+          "splrIdPlaceholder": "Enter supplier ID",
+          "memoPlaceholder": "Enter remark",
+          "timeStart": "Start Time",
+          "timeStartPlaceholder": "Select start time",
+          "timeEnd": "End Time",
+          "timeEndPlaceholder": "Select end time"
+        },
+        "table": {
+          "transferId": "Transfer ID",
+          "transferCode": "Transfer No.",
+          "platItemId": "Platform Line No.",
+          "fieldsIndex": "Field Index",
+          "spec": "Specification",
+          "model": "Model",
+          "workQty": "Execution Qty",
+          "qty": "Completed Qty",
+          "platOrderCode": "Platform Order No.",
+          "platWorkCode": "Platform Work No.",
+          "projectCode": "Project Code",
+          "supplierCode": "Supplier Code",
+          "supplierName": "Supplier Name"
+        },
+        "detail": {
+          "title": "Transfer Item Detail",
+          "baseInfo": "Basic Information",
+          "materialInfo": "Material Information",
+          "platformInfo": "Platform Information",
+          "auditInfo": "Audit Information",
+          "transferId": "Transfer ID",
+          "transferCode": "Transfer No.",
+          "platItemId": "Platform Line No.",
+          "fieldsIndex": "Field Index",
+          "matnrId": "Material ID",
+          "spec": "Specification",
+          "model": "Model",
+          "workQty": "Execution Qty",
+          "qty": "Completed Qty",
+          "platOrderCode": "Platform Order No.",
+          "platWorkCode": "Platform Work No.",
+          "projectCode": "Project Code",
+          "splrId": "Supplier ID",
+          "supplierCode": "Supplier Code",
+          "supplierName": "Supplier Name"
+        },
+        "messages": {
+          "detailTimeout": "Transfer item detail timed out and waiting has stopped",
+          "detailFailed": "Failed to load transfer item detail"
+        }
+      },
+      "wave": {
+        "reportTitle": "Wave Report",
+        "search": {
+          "condition": "Keyword",
+          "conditionPlaceholder": "Enter wave No./remark",
+          "code": "Wave No.",
+          "codePlaceholder": "Enter wave No.",
+          "type": "Wave Type",
+          "exceStatus": "Wave Status",
+          "status": "Status",
+          "memo": "Remark",
+          "memoPlaceholder": "Enter remark",
+          "timeStart": "Start Time",
+          "timeEnd": "End Time"
+        },
+        "status": {
+          "type": {
+            "0": "Manual",
+            "1": "Automatic"
+          },
+          "exceStatus": {
+            "0": "Pending",
+            "1": "Running",
+            "2": "Paused",
+            "3": "Completed"
+          }
+        },
+        "actions": {
+          "view": "View Detail",
+          "publicTask": "Dispatch Task",
+          "pause": "Pause",
+          "continue": "Continue",
+          "stop": "Stop",
+          "print": "Print"
+        },
+        "table": {
+          "code": "Wave No.",
+          "type": "Wave Type",
+          "exceStatus": "Wave Status",
+          "anfme": "Expected Qty",
+          "workQty": "Running Qty",
+          "qty": "Completed Qty",
+          "orderNum": "Document Count",
+          "progress": "Progress",
+          "createTime": "Created At",
+          "updateTime": "Updated At",
+          "status": "Status"
+        },
+        "preview": {
+          "waveCode": "Wave No.",
+          "orderCode": "Document Code",
+          "matnrCode": "Material Code",
+          "maktx": "Material Name",
+          "batch": "Batch",
+          "unit": "Unit",
+          "anfme": "Required Qty",
+          "workQty": "Allocated Qty",
+          "stockQty": "Stock Qty",
+          "splrBatch": "Supplier Batch",
+          "stockLocs": "Location"
+        },
+        "detail": {
+          "title": "Wave Detail",
+          "code": "Wave No.",
+          "type": "Wave Type",
+          "exceStatus": "Wave Status",
+          "status": "Status",
+          "anfme": "Expected Qty",
+          "workQty": "Running Qty",
+          "qty": "Completed Qty",
+          "orderNum": "Document Count",
+          "groupQty": "Category Count",
+          "targSite": "Target Site",
+          "stationId": "Assigned Station",
+          "locCode": "Assigned Location",
+          "createBy": "Created By",
+          "createTime": "Created At",
+          "updateBy": "Updated By",
+          "updateTime": "Updated At",
+          "memo": "Remark",
+          "previewTitle": "Wave Preview Items - Material Code"
+        },
+        "publicTask": {
+          "title": "Dispatch Wave Task",
+          "code": "Wave No.",
+          "type": "Wave Type",
+          "exceStatus": "Wave Status",
+          "workQty": "Running Qty"
+        },
+        "messages": {
+          "pauseSuccess": "Wave paused",
+          "continueSuccess": "Wave resumed",
+          "stopConfirm": "Are you sure you want to stop wave {code}?",
+          "stopTitle": "Stop Confirmation",
+          "stopSuccess": "Wave stopped",
+          "actionFailed": "Wave action failed",
+          "detailTimeout": "Wave detail timed out and waiting has stopped",
+          "previewTimeout": "Wave preview timed out and waiting has stopped",
+          "publicTaskTimeout": "Wave dispatch preview timed out and waiting has stopped",
+          "publicTaskSuccess": "Wave dispatched",
+          "publicTaskFailed": "Wave dispatch failed",
+          "publicTaskWarning": "Wave preview data is unavailable. Please check location configuration first."
+        }
+      },
+      "waveItem": {
+        "reportTitle": "Wave Item Report",
+        "search": {
+          "condition": "Keyword",
+          "conditionPlaceholder": "Enter wave No./material code/material name",
+          "waveCode": "Wave No.",
+          "waveCodePlaceholder": "Enter wave No.",
+          "orderCode": "Document Code",
+          "orderCodePlaceholder": "Enter document code",
+          "matnrCode": "Material Code",
+          "matnrCodePlaceholder": "Enter material code",
+          "maktx": "Material Name",
+          "maktxPlaceholder": "Enter material name",
+          "batch": "Batch",
+          "batchPlaceholder": "Enter batch",
+          "splrBatch": "Supplier Batch",
+          "splrBatchPlaceholder": "Enter supplier batch",
+          "fieldsIndex": "Dynamic Field Index",
+          "fieldsIndexPlaceholder": "Enter dynamic field index",
+          "timeStart": "Start Time",
+          "timeEnd": "End Time"
+        },
+        "status": {
+          "exceStatus": {
+            "0": "Pending",
+            "1": "Running",
+            "2": "Paused",
+            "3": "Dispatched",
+            "4": "Task Completed"
+          }
+        },
+        "actions": {
+          "view": "View Detail"
+        },
+        "table": {
+          "waveCode": "Wave No.",
+          "orderCode": "Document Code",
+          "matnrCode": "Material Code",
+          "maktx": "Material Name",
+          "batch": "Batch",
+          "splrBatch": "Supplier Batch",
+          "unit": "Unit",
+          "anfme": "Required Qty",
+          "workQty": "Allocated Qty",
+          "stockQty": "Stock Qty",
+          "fieldsIndex": "Dynamic Field Index",
+          "exceStatus": "Execution Status",
+          "updateTime": "Updated At",
+          "stockLocs": "Location"
+        },
+        "detail": {
+          "title": "Wave Item Detail",
+          "waveCode": "Wave No.",
+          "orderCode": "Document Code",
+          "matnrCode": "Material Code",
+          "maktx": "Material Name",
+          "batch": "Batch",
+          "splrBatch": "Supplier Batch",
+          "unit": "Unit",
+          "fieldsIndex": "Dynamic Field Index",
+          "anfme": "Required Qty",
+          "workQty": "Allocated Qty",
+          "stockQty": "Stock Qty",
+          "exceStatus": "Execution Status",
+          "createTime": "Created At",
+          "updateTime": "Updated At",
+          "stockLocs": "Location"
+        },
+        "messages": {
+          "detailTimeout": "Wave item detail timed out and waiting has stopped"
         }
       }
     },
@@ -1272,9 +2330,1325 @@
           "containerTypeTimeout": "Container type options timed out and waiting has stopped",
           "useStatusTimeout": "Usage status options timed out and waiting has stopped"
         }
+      },
+      "basContainer": {
+        "table": {
+          "containerType": "Container Type",
+          "code": "Unique Code",
+          "codeType": "Barcode Type",
+          "areas": "Inbound Areas"
+        }
+      },
+      "companys": {
+        "title": "Companies",
+        "entity": "Company",
+        "reportTitle": "Company Report",
+        "buttons": {
+          "add": "Add Company"
+        },
+        "table": {
+          "code": "Company Code",
+          "name": "Company Name",
+          "nameEn": "English Alias",
+          "briefCode": "Mnemonic Code",
+          "type": "Company Type",
+          "contact": "Contact",
+          "tel": "Phone",
+          "email": "Email",
+          "postCode": "Post Code",
+          "province": "Province",
+          "city": "City",
+          "address": "Address"
+        },
+        "search": {
+          "conditionPlaceholder": "Enter company name/code/contact/phone",
+          "codePlaceholder": "Enter company code",
+          "namePlaceholder": "Enter company name",
+          "nameEnPlaceholder": "Enter English alias",
+          "briefCodePlaceholder": "Enter mnemonic code",
+          "contactPlaceholder": "Enter contact",
+          "telPlaceholder": "Enter phone",
+          "emailPlaceholder": "Enter email",
+          "postCodePlaceholder": "Enter post code",
+          "provincePlaceholder": "Enter province",
+          "cityPlaceholder": "Enter city",
+          "addressPlaceholder": "Enter address",
+          "memoPlaceholder": "Enter remark"
+        },
+        "placeholders": {
+          "code": "Leave blank to auto-generate",
+          "name": "Enter company name",
+          "nameEn": "Enter English alias",
+          "briefCode": "Enter mnemonic code",
+          "type": "Select company type",
+          "contact": "Enter contact",
+          "tel": "Enter phone",
+          "email": "Enter email",
+          "postCode": "Enter post code",
+          "province": "Enter province",
+          "city": "Enter city",
+          "address": "Enter address",
+          "status": "Select status",
+          "memo": "Enter remark"
+        },
+        "validation": {
+          "name": "Please enter the company name",
+          "briefCode": "Please enter the mnemonic code",
+          "type": "Please select the company type"
+        },
+        "dialog": {
+          "titleCreate": "Create Company",
+          "titleEdit": "Edit Company",
+          "titleDetail": "Company Detail"
+        },
+        "detail": {
+          "sections": {
+            "basic": "Basic Information",
+            "audit": "Audit Information"
+          }
+        },
+        "messages": {
+          "detailTimeout": "Company detail loading timed out and waiting has stopped",
+          "detailFailed": "Failed to load company detail",
+          "typeOptionsTimeout": "Company type loading timed out and waiting has stopped"
+        }
+      },
+      "contract": {
+        "table": {
+          "code": "Contract Code",
+          "name": "Contract Name",
+          "projectName": "Project Name"
+        }
+      },
+      "whMat": {
+        "title": "Materials",
+        "labels": {
+          "allMaterials": "All Materials"
+        },
+        "search": {
+          "groupKeywordPlaceholder": "Search material groups",
+          "keyword": "Keyword",
+          "keywordPlaceholder": "Enter material code/name",
+          "condition": "Keyword",
+          "conditionPlaceholder": "Enter material code/name",
+          "code": "Material Code",
+          "codePlaceholder": "Enter material code",
+          "name": "Material Name",
+          "namePlaceholder": "Enter material name",
+          "spec": "Specification",
+          "specPlaceholder": "Enter specification",
+          "barcode": "Barcode",
+          "barcodePlaceholder": "Enter barcode"
+        },
+        "messages": {
+          "emptyGroups": "No material groups",
+          "groupTimeout": "Material groups loading timed out and waiting has stopped",
+          "groupLoadFailed": "Failed to load material groups",
+          "listTimeout": "Material list loading timed out and waiting has stopped",
+          "listLoadFailed": "Failed to load material list",
+          "detailTimeout": "Material detail timed out and waiting has stopped",
+          "detailLoadFailed": "Failed to load material detail"
+        },
+        "table": {
+          "code": "Material Code",
+          "name": "Material Name",
+          "groupName": "Material Group",
+          "group": "Material Group",
+          "barcode": "Barcode",
+          "spec": "Specification",
+          "model": "Model"
+        },
+        "detail": {
+          "title": "Material Detail",
+          "sections": {
+            "basic": "Basic Information",
+            "stock": "Stock Information",
+            "audit": "Audit Information",
+            "extend": "Extended Information"
+          },
+          "code": "Material Code",
+          "name": "Material Name",
+          "groupName": "Material Group",
+          "shipperName": "Shipper",
+          "shipper": "Shipper",
+          "barcode": "Barcode",
+          "spec": "Specification",
+          "model": "Model",
+          "color": "Color",
+          "size": "Size",
+          "description": "Description",
+          "unit": "Unit",
+          "purUnit": "Purchase Unit",
+          "purchaseUnit": "Purchase Unit",
+          "stockUnit": "Stock Unit",
+          "stockLevel": "Stock Level",
+          "flagLabelManage": "Label Management",
+          "flagCheck": "Review Management",
+          "safeQty": "Safety Stock",
+          "minQty": "Minimum Stock",
+          "maxQty": "Maximum Stock",
+          "stagn": "Stagnation Days",
+          "valid": "Valid",
+          "validWarn": "Validity Warning",
+          "baseUnit": "Base Unit",
+          "useOrgName": "Using Organization",
+          "erpClsId": "ERP Class"
+        }
+      },
+      "warehouse": {
+        "table": {
+          "name": "Warehouse Name",
+          "code": "Warehouse Code",
+          "factory": "Factory",
+          "address": "Warehouse Address"
+        }
+      },
+      "warehouseAreas": {
+        "title": "Warehouse Areas",
+        "entity": "Warehouse Area",
+        "reportTitle": "Warehouse Area Report",
+        "search": {
+          "conditionPlaceholder": "Enter warehouse area name/code/remark",
+          "codePlaceholder": "Enter warehouse area code",
+          "namePlaceholder": "Enter warehouse area name"
+        },
+        "placeholders": {
+          "warehouse": "Select warehouse",
+          "code": "Enter warehouse area code",
+          "name": "Enter warehouse area name",
+          "type": "Select business type",
+          "shipper": "Select shipper",
+          "supplier": "Select supplier",
+          "flagMinus": "Select negative stock option",
+          "flagLabelManage": "Select label management option",
+          "flagMix": "Select mixed storage option",
+          "status": "Select status",
+          "memo": "Enter remark"
+        },
+        "validation": {
+          "warehouse": "Please select warehouse",
+          "code": "Please enter warehouse area code",
+          "name": "Please enter warehouse area name",
+          "type": "Please select business type",
+          "flagMinus": "Please select negative stock option",
+          "flagMix": "Please select mixed storage option"
+        },
+        "dialog": {
+          "titleCreate": "Add Warehouse Area",
+          "titleEdit": "Edit Warehouse Area"
+        },
+        "detail": {
+          "title": "Warehouse Area Detail",
+          "sections": {
+            "basic": "Basic Information",
+            "audit": "Audit Information"
+          }
+        },
+        "messages": {
+          "detailTimeout": "Warehouse area detail loading timed out and has stopped waiting.",
+          "detailFailed": "Failed to get warehouse area detail",
+          "companyOptionsTimeout": "Company options loading timed out and has stopped waiting.",
+          "warehouseOptionsTimeout": "Warehouse options loading timed out and has stopped waiting.",
+          "typeOptionsTimeout": "Business type loading timed out and has stopped waiting."
+        },
+        "table": {
+          "warehouseName": "Warehouse",
+          "code": "Area Code",
+          "name": "Area Name",
+          "type": "Business Type",
+          "shipperName": "Shipper",
+          "supplierName": "Supplier",
+          "flagMix": "Mixed Storage",
+          "flagMinus": "Negative Stock",
+          "flagLabelManage": "Label Management",
+          "sort": "Sort"
+        }
+      },
+      "deviceSite": {
+        "table": {
+          "type": "Station Type",
+          "site": "Work Site",
+          "name": "Name",
+          "target": "Target Site",
+          "label": "Station Label",
+          "deviceType": "Device Type",
+          "deviceCode": "Device Code",
+          "deviceSite": "Device Site",
+          "channel": "Channel",
+          "areaStart": "Source Area",
+          "areaEnd": "Target Area"
+        }
+      },
+      "basStation": {
+        "table": {
+          "stationCode": "Station Code",
+          "stationName": "Station Name",
+          "type": "Station Type",
+          "useStatus": "Usage Status",
+          "area": "Warehouse Area",
+          "crossZoneArea": "Cross-zone Area",
+          "containerTypes": "Inbound Container Types",
+          "barcode": "Barcode",
+          "inAble": "Inbound Allowed",
+          "outAble": "Outbound Allowed",
+          "isCrossZone": "Cross Zone",
+          "isWcs": "WCS Enabled",
+          "autoTransfer": "Auto Transfer"
+        }
+      },
+      "loc": {
+        "table": {
+          "code": "Location Code",
+          "warehouseName": "Warehouse",
+          "areaName": "Area",
+          "typeIds": "Location Type",
+          "row": "Row",
+          "col": "Column",
+          "lev": "Level",
+          "channel": "Channel",
+          "useStatus": "Usage Status",
+          "flagLogic": "Virtual Location",
+          "flagLabelManage": "Label Management",
+          "barcode": "Container Code"
+        }
+      },
+      "taskPathTemplate": {
+        "actions": {
+          "flow": "Flow Diagram"
+        },
+        "table": {
+          "templateCode": "Template Code",
+          "templateName": "Template Name",
+          "sourceType": "Source Type",
+          "targetType": "Target Type",
+          "conditionDesc": "Condition Description",
+          "version": "Version",
+          "isCurrent": "Current Version",
+          "effectiveTime": "Effective Time",
+          "expireTime": "Expire Time",
+          "priority": "Priority",
+          "timeoutMinutes": "Timeout (min)",
+          "stepSize": "Step Length",
+          "maxRetryTimes": "Max Retries",
+          "retryIntervalSeconds": "Retry Interval (sec)"
+        }
+      },
+      "taskPathTemplateNode": {
+        "table": {
+          "templateId": "Template ID",
+          "templateCode": "Template Code",
+          "nodeOrder": "Node Order",
+          "nodeCode": "Node Code",
+          "nodeName": "Node Name",
+          "nodeType": "Node Type",
+          "systemCode": "System Code",
+          "systemName": "System Name",
+          "mandatory": "Mandatory Node",
+          "parallelExecutable": "Parallel",
+          "timeoutMinutes": "Timeout (min)"
+        }
+      },
+      "taskPathTemplateMerge": {
+        "table": {
+          "templateCode": "Template Code",
+          "templateName": "Template Name",
+          "sourceType": "Source Type",
+          "targetType": "Target Type",
+          "conditionExpression": "Condition Expression",
+          "conditionDesc": "Condition Description",
+          "version": "Version",
+          "isCurrent": "Current Version",
+          "effectiveTime": "Effective Time",
+          "expireTime": "Expire Time",
+          "priority": "Priority",
+          "timeoutMinutes": "Timeout (min)",
+          "maxRetryTimes": "Max Retries",
+          "retryIntervalSeconds": "Retry Interval (sec)",
+          "stepSize": "Step Length"
+        }
+      },
+      "locArea": {
+        "table": {
+          "area": "Area"
+        }
+      },
+      "locAreaMat": {
+        "table": {
+          "code": "Logical Code",
+          "warehouseName": "Warehouse",
+          "areaName": "Area",
+          "depict": "Description"
+        }
+      },
+      "locAreaRela": {
+        "table": {
+          "locAreaId": "Zone ID",
+          "locId": "Location ID"
+        }
+      },
+      "locAreaMatRela": {
+        "table": {
+          "areaMatId": "Parent Record",
+          "areaId": "Area",
+          "code": "Code",
+          "matnrId": "Material",
+          "groupId": "Material Group",
+          "locTypeId": "Location Type",
+          "locId": "Location",
+          "relationType": "Relation Type"
+        }
+      },
+      "locType": {
+        "table": {
+          "uuid": "Identifier",
+          "regex": "Barcode Rule"
+        }
+      },
+      "matnrGroup": {
+        "table": {
+          "code": "Group Code",
+          "parentCode": "Parent Code",
+          "name": "Group Name"
+        }
+      },
+      "deviceBind": {
+        "table": {
+          "currentRow": "Current Row",
+          "startRow": "Start Row",
+          "endRow": "End Row",
+          "deviceQty": "Device Qty",
+          "startDeviceNo": "Start Device No.",
+          "endDeviceNo": "End Device No.",
+          "staList": "Station List",
+          "typeId": "Area Type",
+          "beSimilar": "Material Similar",
+          "emptySimilar": "Empty Board Nearby"
+        }
+      },
+      "manager": {
+        "menuPda": {
+          "actions": {
+            "add": "Add PDA Menu"
+          },
+          "search": {
+            "name": "Menu Name",
+            "namePlaceholder": "Enter menu name",
+            "route": "Route",
+            "routePlaceholder": "Enter route"
+          },
+          "table": {
+            "name": "Menu Name",
+            "iconPreview": "Icon Preview",
+            "menuType": "Menu Type"
+          },
+          "tree": {
+            "topLevel": "Top Level Menu"
+          },
+          "type": {
+            "menu": "Menu",
+            "button": "Button",
+            "directory": "Directory"
+          },
+          "dialog": {
+            "titleAddMenu": "Add Menu",
+            "titleEditMenu": "Edit Menu",
+            "titleAddButton": "Add Button",
+            "titleEditButton": "Edit Button",
+            "menuType": "Menu Type",
+            "parentMenu": "Parent Menu",
+            "menuName": "Menu Name",
+            "permissionName": "Permission Name",
+            "route": "Route",
+            "component": "Component Key",
+            "authority": "Authority",
+            "icon": "Icon",
+            "sort": "Sort",
+            "status": "Status",
+            "placeholder": {
+              "parentMenu": "Select parent menu",
+              "menuName": "Enter menu name",
+              "permissionName": "Enter permission name",
+              "route": "Enter route",
+              "component": "Enter component key",
+              "authority": "Enter authority",
+              "icon": "Enter icon name",
+              "status": "Select status",
+              "memo": "Enter remark"
+            },
+            "validation": {
+              "menuName": "Please enter menu name",
+              "permissionName": "Please enter permission name",
+              "route": "Please enter route",
+              "authority": "Please enter authority"
+            }
+          },
+          "messages": {
+            "listTimeout": "PDA menu timed out and waiting has stopped",
+            "loadFailed": "Failed to load PDA menu",
+            "parentSelf": "Parent menu cannot be the current menu",
+            "deleteConfirm": "Are you sure you want to delete PDA menu \"{title}\"? This action cannot be undone."
+          }
+        }
+      }
+    },
+    "manager": {
+      "menuPda": {
+        "actions": {
+          "add": "Add PDA Menu"
+        },
+        "search": {
+          "name": "Menu Name",
+          "namePlaceholder": "Enter menu name",
+          "route": "Route",
+          "routePlaceholder": "Enter route"
+        },
+        "table": {
+          "name": "Menu Name",
+          "iconPreview": "Icon Preview",
+          "menuType": "Menu Type"
+        },
+        "tree": {
+          "topLevel": "Top Level Menu"
+        },
+        "type": {
+          "menu": "Menu",
+          "button": "Button",
+          "directory": "Directory"
+        },
+        "dialog": {
+          "titleAddMenu": "Add Menu",
+          "titleEditMenu": "Edit Menu",
+          "titleAddButton": "Add Button",
+          "titleEditButton": "Edit Button",
+          "menuType": "Menu Type",
+          "parentMenu": "Parent Menu",
+          "menuName": "Menu Name",
+          "permissionName": "Permission Name",
+          "route": "Route",
+          "component": "Component Key",
+          "authority": "Authority",
+          "icon": "Icon",
+          "sort": "Sort",
+          "status": "Status",
+          "placeholder": {
+            "parentMenu": "Select parent menu",
+            "menuName": "Enter menu name",
+            "permissionName": "Enter permission name",
+            "route": "Enter route",
+            "component": "Enter component key",
+            "authority": "Enter authority",
+            "icon": "Enter icon name",
+            "status": "Select status",
+            "memo": "Enter remark"
+          },
+          "validation": {
+            "menuName": "Please enter menu name",
+            "permissionName": "Please enter permission name",
+            "route": "Please enter route",
+            "authority": "Please enter authority"
+          }
+        },
+        "messages": {
+          "listTimeout": "PDA menu timed out and waiting has stopped",
+          "loadFailed": "Failed to load PDA menu",
+          "parentSelf": "Parent menu cannot be the current menu",
+          "deleteConfirm": "Are you sure you want to delete PDA menu \"{title}\"? This action cannot be undone."
+        }
+      },
+      "waveRule": {
+        "entity": "Wave Rule",
+        "reportTitle": "Wave Rule Report",
+        "actions": {
+          "add": "Add Wave Rule"
+        },
+        "table": {
+          "type": "Type"
+        },
+        "search": {
+          "conditionPlaceholder": "Enter code or name",
+          "codePlaceholder": "Enter code",
+          "namePlaceholder": "Enter rule name"
+        },
+        "dialog": {
+          "titleCreate": "Add Wave Rule",
+          "titleEdit": "Edit Wave Rule",
+          "validation": {
+            "type": "Please select a rule type",
+            "name": "Please enter a rule name"
+          },
+          "placeholder": {
+            "code": "Generated after creation",
+            "type": "Select rule type",
+            "name": "Enter rule name",
+            "status": "Select status",
+            "memo": "Enter remark"
+          }
+        },
+        "detail": {
+          "title": "Wave Rule Detail"
+        },
+        "messages": {
+          "typeTimeout": "Wave rule types timed out and waiting has stopped",
+          "detailFailed": "Failed to get wave rule detail"
+        }
+      },
+      "taskLog": {
+        "reportTitle": "Task Log Report",
+        "table": {
+          "taskCode": "Task Code",
+          "taskStatus": "Task Status",
+          "taskType": "Task Type",
+          "orgLoc": "Source Location",
+          "orgSite": "Source Station",
+          "targLoc": "Target Location",
+          "targSite": "Target Station",
+          "barcode": "Pallet Code",
+          "robotCode": "Robot Code",
+          "startTime": "Start Time",
+          "endTime": "End Time"
+        },
+        "search": {
+          "conditionPlaceholder": "Enter task code, pallet code, or robot code",
+          "taskCodePlaceholder": "Enter task code",
+          "orgLocPlaceholder": "Enter source location",
+          "targLocPlaceholder": "Enter target location",
+          "barcodePlaceholder": "Enter pallet code",
+          "robotCodePlaceholder": "Enter robot code",
+          "timeStart": "Start Date",
+          "timeEnd": "End Date"
+        },
+        "detail": {
+          "title": "Task Log Detail",
+          "taskId": "Task ID",
+          "exceStatus": "Execution Status",
+          "sort": "Priority",
+          "expDesc": "Exception Description",
+          "expCode": "Exception Code"
+        }
+      },
+      "inStatisticItem": {
+        "title": "Inbound Statistic Item",
+        "table": {
+          "dayTime": "Statistic Date",
+          "locCode": "Location",
+          "matnrCode": "Material Code",
+          "maktx": "Material Name",
+          "anfme": "Quantity",
+          "batch": "Batch",
+          "barcode": "Pallet Code"
+        },
+        "search": {
+          "condition": "Keyword",
+          "conditionPlaceholder": "Enter material name/code/batch",
+          "dayTime": "Statistic Date",
+          "maktx": "Material Name",
+          "maktxPlaceholder": "Enter material name",
+          "matnrCode": "Material Code",
+          "matnrCodePlaceholder": "Enter material code",
+          "batch": "Batch",
+          "batchPlaceholder": "Enter batch"
+        },
+        "detail": {
+          "title": "{title} Detail",
+          "taskType": "Task Type",
+          "taskStatus": "Task Status",
+          "fieldsIndex": "Field Index"
+        }
+      },
+      "freeze": {
+        "table": {
+          "locCode": "Location Code",
+          "wareArea": "Area",
+          "matnrCode": "Material Code",
+          "maktx": "Material Name",
+          "batch": "Batch",
+          "trackCode": "Track Code",
+          "anfme": "Available Qty",
+          "qty": "Stock Qty",
+          "workQty": "Working Qty"
+        },
+        "search": {
+          "condition": "Keyword",
+          "conditionPlaceholder": "Enter location code/material code",
+          "locCode": "Location Code",
+          "locCodePlaceholder": "Enter location code",
+          "matnrCode": "Material Code",
+          "matnrCodePlaceholder": "Enter material code",
+          "maktx": "Material Name",
+          "maktxPlaceholder": "Enter material name",
+          "batch": "Batch",
+          "batchPlaceholder": "Enter batch",
+          "trackCode": "Track Code",
+          "trackCodePlaceholder": "Enter track code",
+          "dynamicPlaceholder": "Enter {label}"
+        },
+        "detail": {
+          "title": "Freeze Stock Detail"
+        },
+        "messages": {
+          "fieldsTimeout": "Extended fields timed out and waiting has stopped",
+          "pageTimeout": "Frozen stock timed out and waiting has stopped",
+          "detailTimeout": "Frozen stock detail timed out and waiting has stopped"
+        }
+      },
+      "locItem": {
+        "table": {
+          "locId": "Location ID",
+          "wareArea": "Area",
+          "locCode": "Location Code",
+          "type": "Business Type",
+          "wkType": "Workstation Type",
+          "orderId": "Order ID",
+          "orderItemId": "Order Item ID",
+          "matnrId": "Material ID",
+          "matnrCode": "Material Code",
+          "maktx": "Material Name",
+          "spec": "Spec",
+          "model": "Model",
+          "batch": "Batch",
+          "trackCode": "Track Code",
+          "anfme": "Available Qty",
+          "qty": "Stock Qty",
+          "workQty": "Working Qty"
+        },
+        "search": {
+          "condition": "Keyword",
+          "conditionPlaceholder": "Enter location code/material code/track code",
+          "timeStart": "Start Date",
+          "timeEnd": "End Date",
+          "locId": "Location ID",
+          "locIdPlaceholder": "Enter location ID",
+          "orderId": "Order ID",
+          "orderIdPlaceholder": "Enter order ID",
+          "type": "Business Type",
+          "typePlaceholder": "Enter business type",
+          "wkType": "Workstation Type",
+          "wkTypePlaceholder": "Enter workstation type",
+          "matnrCode": "Material Code",
+          "matnrCodePlaceholder": "Enter material code",
+          "maktx": "Material Name",
+          "maktxPlaceholder": "Enter material name",
+          "trackCode": "Track Code",
+          "trackCodePlaceholder": "Enter track code",
+          "batch": "Batch",
+          "batchPlaceholder": "Enter batch",
+          "splrBatch": "Supplier Batch",
+          "splrBatchPlaceholder": "Enter supplier batch"
+        },
+        "detail": {
+          "title": "Stock Item Detail",
+          "extendFields": "Extended Fields",
+          "emptyExtendFields": "No extended fields"
+        },
+        "messages": {
+          "pageTimeout": "Stock item loading timed out and waiting has stopped",
+          "detailFailed": "Failed to get stock item detail",
+          "fieldsTimeout": "Extended fields timed out and waiting has stopped"
+        }
+      },
+      "locPreview": {
+        "search": {
+          "condition": "Keyword",
+          "conditionPlaceholder": "Enter location code or barcode",
+          "code": "Location Code",
+          "codePlaceholder": "Enter location code",
+          "barcode": "Barcode",
+          "barcodePlaceholder": "Enter barcode"
+        },
+        "table": {
+          "locCode": "Location Code",
+          "warehouseLabel": "Warehouse",
+          "areaLabel": "Area",
+          "typeLabel": "Location Type",
+          "barcode": "Barcode",
+          "useStatusLabel": "Usage Status",
+          "row": "Row",
+          "col": "Column",
+          "lev": "Level",
+          "channel": "Channel"
+        },
+        "detail": {
+          "title": "Location Detail",
+          "stockItems": "Stock Items"
+        },
+        "messages": {
+          "fieldsTimeout": "Loading extended fields timed out and waiting has stopped",
+          "pageTimeout": "Loading location details timed out and waiting has stopped",
+          "detailTimeout": "Loading location detail timed out and waiting has stopped",
+          "itemPageTimeout": "Loading location stock details timed out and waiting has stopped"
+        }
       }
     },
     "system": {
+      "config": {
+        "title": "Config",
+        "entity": "config",
+        "buttons": {
+          "add": "Add Config"
+        },
+        "table": {
+          "flag": "Flag",
+          "type": "Type",
+          "value": "Value",
+          "content": "Content"
+        },
+        "search": {
+          "conditionPlaceholder": "Enter config name",
+          "flagPlaceholder": "Enter config flag"
+        },
+        "types": {
+          "boolean": "Boolean",
+          "number": "Number",
+          "string": "String",
+          "json": "JSON",
+          "date": "Date"
+        },
+        "placeholders": {
+          "uuid": "Generated after creation",
+          "name": "Enter config name",
+          "flag": "Enter config flag",
+          "type": "Select type",
+          "value": "Enter config value",
+          "content": "Enter config content",
+          "status": "Select status",
+          "memo": "Enter remark"
+        },
+        "validation": {
+          "name": "Please enter config name",
+          "flag": "Please enter config flag"
+        },
+        "dialog": {
+          "titleCreate": "Create Config",
+          "titleEdit": "Edit Config",
+          "titleDetail": "Config Detail"
+        },
+        "messages": {
+          "detailFailed": "Failed to fetch config detail"
+        }
+      },
+      "dictType": {
+        "title": "Dictionary Type",
+        "entity": "Dictionary Type",
+        "buttons": {
+          "add": "Add Dictionary Type"
+        },
+        "search": {
+          "conditionPlaceholder": "Enter code or name",
+          "codePlaceholder": "Enter dictionary code",
+          "namePlaceholder": "Enter dictionary name"
+        },
+        "table": {
+          "description": "Description"
+        },
+        "placeholders": {
+          "code": "Enter dictionary code",
+          "name": "Enter dictionary name",
+          "status": "Select status",
+          "description": "Enter dictionary description",
+          "memo": "Enter remark"
+        },
+        "validation": {
+          "code": "Please enter dictionary code",
+          "name": "Please enter dictionary name"
+        },
+        "dialog": {
+          "titleCreate": "Add Dictionary Type",
+          "titleEdit": "Edit Dictionary Type",
+          "titleDetail": "Dictionary Type Detail"
+        },
+        "messages": {
+          "detailFailed": "Failed to fetch dictionary type detail"
+        }
+      },
+      "dept": {
+        "title": "Department",
+        "entity": "department",
+        "buttons": {
+          "add": "Add Department"
+        },
+        "table": {
+          "parent": "Parent Department",
+          "name": "Department Name",
+          "fullName": "Department Full Name",
+          "leader": "Leader"
+        },
+        "search": {
+          "conditionPlaceholder": "Enter department name"
+        },
+        "placeholders": {
+          "parentId": "Select parent department",
+          "name": "Enter department name",
+          "fullName": "Enter full department name",
+          "leader": "Enter leader",
+          "status": "Select status",
+          "memo": "Enter remark"
+        },
+        "validation": {
+          "name": "Please enter department name"
+        },
+        "dialog": {
+          "titleCreate": "Create Department",
+          "titleEdit": "Edit Department"
+        },
+        "messages": {
+          "pageTimeout": "Department loading timed out and waiting has stopped",
+          "detailFailed": "Failed to fetch department detail",
+          "parentSelfInvalid": "Parent department cannot be the current department"
+        }
+      },
+      "userLogin": {
+        "title": "Login Logs",
+        "search": {
+          "token": "Token",
+          "tokenPlaceholder": "Enter token",
+          "ip": "IP",
+          "ipPlaceholder": "Enter IP",
+          "system": "System",
+          "systemPlaceholder": "Enter system identifier",
+          "type": "Type",
+          "typePlaceholder": "Select type"
+        },
+        "table": {
+          "user": "User",
+          "token": "Token",
+          "ip": "IP",
+          "system": "System"
+        },
+        "types": {
+          "loginSuccess": "Login Success",
+          "loginFailed": "Login Failed",
+          "logout": "Logout",
+          "tokenRenew": "Token Renew"
+        }
+      },
+      "operationRecord": {
+        "title": "Operation Log",
+        "entity": "Operation Log",
+        "reportTitle": "Operation Log Report",
+        "search": {
+          "conditionPlaceholder": "Enter namespace",
+          "urlPlaceholder": "Enter API URL",
+          "clientIpPlaceholder": "Enter client IP",
+          "timeStart": "Start Date",
+          "timeEnd": "End Date"
+        },
+        "table": {
+          "namespace": "Namespace",
+          "url": "API URL",
+          "user": "User",
+          "clientIp": "Client IP",
+          "spendTime": "Latency (ms)",
+          "result": "Result",
+          "timestamp": "Operation Time"
+        },
+        "result": {
+          "success": "Success",
+          "failed": "Failed"
+        },
+        "detail": {
+          "appkey": "App Key",
+          "error": "Error",
+          "request": "Request Content",
+          "response": "Response Content"
+        },
+        "dialog": {
+          "titleDetail": "Operation Log Detail"
+        },
+        "messages": {
+          "detailFailed": "Failed to load operation log detail"
+        }
+      },
+      "aiParam": {
+        "title": "AI Params",
+        "subtitle": "Manage the current user's model access settings and defaults with cards.",
+        "entity": "AI Params",
+        "reportTitle": "AI Params Report",
+        "empty": "No AI parameters yet",
+        "buttons": {
+          "add": "Add Param"
+        },
+        "actions": {
+          "setDefault": "Set Default"
+        },
+        "fields": {
+          "baseUrl": "Base URL",
+          "lastValidateTime": "Last Validation",
+          "timeoutMs": "Timeout",
+          "streamingEnabled": "Streaming",
+          "maxTokens": "Max Tokens"
+        },
+        "search": {
+          "condition": "Keyword",
+          "conditionPlaceholder": "Enter parameter name",
+          "providerType": "Provider",
+          "providerTypePlaceholder": "Enter provider type",
+          "model": "Model",
+          "modelPlaceholder": "Enter model name",
+          "status": "Default Status"
+        },
+        "status": {
+          "default": "Default",
+          "candidate": "Candidate"
+        },
+        "validation": {
+          "valid": "Validated",
+          "invalid": "Invalid",
+          "notTested": "Not Tested"
+        },
+        "streaming": {
+          "enabled": "Streaming",
+          "disabled": "Non-streaming"
+        },
+        "table": {
+          "name": "Name",
+          "providerType": "Provider Type",
+          "model": "Model",
+          "status": "Default Status",
+          "validateStatus": "Validation Status",
+          "timeoutMs": "Timeout"
+        },
+        "summary": {
+          "title": "Runtime Summary",
+          "subtitle": "Overview of the active model, prompt, and MCP mounts",
+          "refresh": "Refresh Summary",
+          "activeModel": "Active Model",
+          "activePrompt": "Active Prompt",
+          "lastPromptUpdate": "Last updated {value}",
+          "enabledMcp": "Enabled MCP",
+          "enabledMcpCount": "{count} enabled",
+          "noMcp": "No mounts"
+        },
+        "dialog": {
+          "titleCreate": "Create AI Param",
+          "titleEdit": "Edit AI Param",
+          "titleDetail": "AI Param Detail",
+          "runtimeTitle": "Runtime Status",
+          "runtimeDescription": "Run a draft validation before saving. Runtime status is returned from the backend.",
+          "validateDraft": "Validate Draft",
+          "labels": {
+            "validateStatus": "Validation Status",
+            "lastValidateElapsedMs": "Validation Duration",
+            "lastValidateTime": "Last Validation Time",
+            "updateBy": "Updated By",
+            "updateTime": "Updated At",
+            "lastValidateMessage": "Validation Message",
+            "name": "Name",
+            "providerType": "Provider Type",
+            "baseUrl": "Base URL",
+            "apiKey": "API Key",
+            "model": "Model",
+            "temperature": "Temperature",
+            "topP": "Top P",
+            "maxTokens": "Max Tokens",
+            "timeoutMs": "Timeout (ms)",
+            "streamingEnabled": "Streaming",
+            "status": "Default Status",
+            "memo": "Remark"
+          },
+          "placeholders": {
+            "name": "Enter parameter name",
+            "providerType": "Select provider type",
+            "baseUrl": "Enter OpenAI-compatible base URL",
+            "apiKey": "Enter API key",
+            "model": "Enter model name",
+            "temperature": "Enter temperature",
+            "topP": "Enter topP",
+            "maxTokens": "Enter max tokens",
+            "timeoutMs": "Enter timeout",
+            "status": "Select default status",
+            "memo": "Enter remark"
+          },
+          "validation": {
+            "name": "Please enter a parameter name",
+            "providerType": "Please select a provider type",
+            "baseUrl": "Please enter a base URL",
+            "apiKey": "Please enter an API key",
+            "model": "Please enter a model name"
+          }
+        },
+        "messages": {
+          "setDefaultSuccess": "Default parameter updated",
+          "summaryTimeout": "Runtime summary timed out and waiting has stopped",
+          "summaryUnavailable": "Runtime summary is currently unavailable"
+        }
+      },
+      "aiPrompt": {
+        "title": "Prompts",
+        "subtitle": "Manage system prompts and scene-based user prompt templates with cards.",
+        "entity": "Prompt",
+        "reportTitle": "Prompt Report",
+        "empty": "No prompts yet",
+        "buttons": {
+          "add": "Add Prompt"
+        },
+        "fields": {
+          "sceneTag": "Scene {value}",
+          "systemPrompt": "System Prompt",
+          "userPromptTemplate": "User Prompt Template"
+        },
+        "search": {
+          "condition": "Keyword",
+          "conditionPlaceholder": "Enter prompt name",
+          "code": "Prompt Code",
+          "codePlaceholder": "Enter prompt code",
+          "scene": "Scene",
+          "scenePlaceholder": "Enter scene",
+          "status": "Status"
+        },
+        "table": {
+          "name": "Prompt Name",
+          "code": "Prompt Code",
+          "scene": "Scene",
+          "status": "Status",
+          "systemPrompt": "System Prompt",
+          "userPromptTemplate": "User Prompt Template"
+        },
+        "dialog": {
+          "titleCreate": "Create Prompt",
+          "titleEdit": "Edit Prompt",
+          "titleDetail": "Prompt Detail",
+          "defaultPreviewInput": "Please summarize the current input",
+          "previewTitle": "Render Preview",
+          "previewDescription": "Enter sample input and metadata to preview the rendered output.",
+          "previewAction": "Render Preview",
+          "previewResolvedVariables": "Resolved variables: {value}",
+          "previewNoVariables": "None",
+          "runtimeTitle": "Runtime Status",
+          "labels": {
+            "updateBy": "Updated By",
+            "updateTime": "Updated At",
+            "name": "Prompt Name",
+            "code": "Prompt Code",
+            "scene": "Scene",
+            "systemPrompt": "System Prompt",
+            "userPromptTemplate": "User Prompt Template",
+            "status": "Status",
+            "memo": "Remark"
+          },
+          "placeholders": {
+            "previewInput": "Enter sample input",
+            "metadata": "Enter JSON metadata, e.g. {\"path\":\"/system/aiPrompt\"}",
+            "renderedSystemPrompt": "Rendered system prompt",
+            "renderedUserPrompt": "Rendered user prompt",
+            "name": "Enter prompt name",
+            "code": "Enter prompt code",
+            "scene": "Enter scene",
+            "systemPrompt": "Enter system prompt",
+            "userPromptTemplate": "Enter user prompt template",
+            "status": "Select status",
+            "memo": "Enter remark"
+          },
+          "validation": {
+            "name": "Please enter a prompt name",
+            "code": "Please enter a prompt code",
+            "scene": "Please enter a scene",
+            "systemPrompt": "Please enter a system prompt",
+            "userPromptTemplate": "Please enter a user prompt template"
+          }
+        },
+        "messages": {
+          "previewFailed": "Failed to render preview"
+        }
+      },
+      "aiMcpMount": {
+        "title": "MCP Mounts",
+        "subtitle": "Maintain MCP mounts and health status for the current environment.",
+        "entity": "MCP Mount",
+        "empty": "No MCP mounts yet",
+        "buttons": {
+          "add": "Add Mount"
+        },
+        "fields": {
+          "target": "Target",
+          "lastTestTime": "Last Test Time",
+          "timeoutMs": "Timeout",
+          "lastInitElapsedMs": "Last Init Duration"
+        },
+        "search": {
+          "condition": "Keyword",
+          "conditionPlaceholder": "Enter mount name",
+          "transportType": "Transport Type",
+          "status": "Status"
+        },
+        "actions": {
+          "connectivityTest": "Connectivity Test",
+          "toolsPreview": "Tools Preview"
+        },
+        "health": {
+          "healthy": "Healthy",
+          "unhealthy": "Unhealthy",
+          "notTested": "Not Tested"
+        },
+        "groups": {
+          "builtin": {
+            "title": "Built-in Mount",
+            "description": "Platform built-in MCP capabilities."
+          },
+          "sse": {
+            "title": "SSE / HTTP Mount",
+            "description": "Remote MCP service connected through HTTP/SSE."
+          },
+          "stdio": {
+            "title": "STDIO Mount",
+            "description": "MCP service started and communicated through local commands."
+          }
+        },
+        "dialog": {
+          "titleCreate": "Create MCP Mount",
+          "titleEdit": "Edit MCP Mount",
+          "titleDetail": "MCP Mount Detail",
+          "runtimeTitle": "Runtime Status",
+          "draftTestTitle": "Draft Connectivity Test",
+          "draftTestDescription": "Test current draft settings before saving.",
+          "draftTestAction": "Test Current Settings",
+          "runtimeLabels": {
+            "healthStatus": "Health Status",
+            "lastTestTime": "Last Test Time",
+            "lastTestMessage": "Last Test Message",
+            "lastInitElapsedMs": "Last Init Duration",
+            "updateTime": "Updated At"
+          },
+          "labels": {
+            "name": "Mount Name",
+            "transportType": "Transport Type",
+            "status": "Status",
+            "serverUrl": "Server URL",
+            "endpoint": "SSE/HTTP Path",
+            "command": "Command",
+            "argsJson": "Command Args (JSON)",
+            "envJson": "Environment JSON",
+            "headersJson": "Headers JSON",
+            "builtinCode": "Built-in Code",
+            "requestTimeoutMs": "Request Timeout (ms)",
+            "sort": "Sort",
+            "memo": "Remark"
+          },
+          "placeholders": {
+            "name": "Enter mount name",
+            "transportType": "Select transport type",
+            "status": "Select status",
+            "serverUrl": "Enter server URL",
+            "endpoint": "Enter endpoint path",
+            "command": "Enter command",
+            "argsJson": "Enter JSON array, e.g. [\"server.js\"]",
+            "envJson": "Enter JSON object, e.g. {\"NODE_ENV\":\"production\"}",
+            "headersJson": "Enter JSON object, e.g. {\"Authorization\":\"Bearer ...\"}",
+            "builtinCode": "Enter built-in code",
+            "requestTimeoutMs": "Enter request timeout",
+            "sort": "Enter sort value",
+            "memo": "Enter remark"
+          },
+          "validation": {
+            "name": "Please enter a mount name",
+            "transportType": "Please select a transport type"
+          }
+        },
+        "toolsDrawer": {
+          "title": "MCP Tools Preview",
+          "currentMount": "Current Mount",
+          "description": "Preview tools exposed by the current mount and test them online.",
+          "refreshTools": "Refresh Tools",
+          "connectivityTest": "Connectivity Test",
+          "empty": "No tools available for the current mount",
+          "toolTest": "Test Tool",
+          "toolInputRequired": "Please enter tool input JSON",
+          "toolTestSuccess": "Tool call succeeded",
+          "toolTestFailed": "Tool call failed",
+          "toolsLoadFailed": "Failed to load tools",
+          "toolsTimeout": "Tool loading timed out and waiting has stopped",
+          "toolTestTimeout": "Tool call timed out and waiting has stopped",
+          "inputSchema": "Input Schema",
+          "inputJson": "Input JSON",
+          "inputJsonPlaceholder": "Enter JSON, e.g. {\"keyword\":\"task\"}",
+          "output": "Output",
+          "outputPlaceholder": "No output yet"
+        },
+        "messages": {
+          "connectivitySuccess": "Connectivity test succeeded",
+          "connectivityFailed": "Connectivity test failed",
+          "connectivityTimeout": "Connectivity test timed out and waiting has stopped",
+          "draftConnectivitySuccess": "Draft connectivity test succeeded",
+          "draftConnectivityFailed": "Draft connectivity test failed",
+          "toolsTimeout": "Tool list timed out and waiting has stopped",
+          "toolTestTimeout": "Tool call timed out and waiting has stopped",
+          "initElapsedMs": "Init duration {value} ms"
+        }
+      },
+      "aiObserve": {
+        "title": "AI Observe",
+        "summaryTitle": "AI Observe Summary",
+        "summaryDescription": "Observe AI call status, latency, token usage, and MCP tool execution.",
+        "reportTitle": "AI Observe Report",
+        "stats": {
+          "callCount": "Calls",
+          "avgElapsed": "Average Latency",
+          "totalTokens": "Total Tokens",
+          "toolSuccessRate": "Tool Success Rate",
+          "successFailure": "Success {success} / Failure {failure}",
+          "firstTokenLatency": "First token {value} ms",
+          "avgTokens": "Average {value} Tokens",
+          "toolCallFailure": "Calls {callCount} / Failure {failureCount}"
+        },
+        "search": {
+          "condition": "Keyword",
+          "conditionPlaceholder": "Enter request ID or prompt",
+          "requestId": "Request ID",
+          "requestIdPlaceholder": "Enter request ID",
+          "promptCode": "Prompt Code",
+          "promptCodePlaceholder": "Enter prompt code",
+          "user": "User",
+          "userPlaceholder": "Enter user ID",
+          "status": "Status",
+          "statusPlaceholder": "Select status"
+        },
+        "status": {
+          "running": "Running",
+          "completed": "Completed",
+          "failed": "Failed",
+          "aborted": "Aborted"
+        },
+        "detail": {
+          "title": "AI Observe Detail",
+          "requestId": "Request ID",
+          "sessionId": "Session ID",
+          "prompt": "Prompt",
+          "model": "Model",
+          "user": "User",
+          "status": "Status",
+          "mountedMcp": "Mounted MCP",
+          "configuredMcpCount": "Configured MCP Count",
+          "toolCallCount": "Tool Calls",
+          "toolSuccessFailure": "Success / Failure",
+          "elapsed": "Total Latency",
+          "firstTokenLatency": "First Token Latency",
+          "createTime": "Created At",
+          "updateTime": "Updated At",
+          "errorCategory": "Error Category",
+          "errorStage": "Error Stage",
+          "errorMessage": "Error Message",
+          "mcpLogs": "MCP Call Logs",
+          "inputSummary": "Input Summary",
+          "outputSummary": "Output Summary",
+          "emptyMcpLogs": "No MCP call logs"
+        },
+        "table": {
+          "requestId": "Request ID",
+          "prompt": "Prompt",
+          "model": "Model",
+          "user": "User",
+          "status": "Status",
+          "elapsed": "Latency",
+          "totalTokens": "Total Tokens",
+          "createTime": "Created At"
+        },
+        "messages": {
+          "detailTimeout": "AI observe detail timed out and waiting has stopped",
+          "mcpLogsTimeout": "MCP call logs timed out and waiting has stopped",
+          "detailFailed": "Failed to load AI observe detail",
+          "statsTimeout": "AI observe summary timed out and waiting has stopped",
+          "statsFailed": "Failed to load AI observe summary"
+        }
+      },
       "role": {
         "entity": "Role",
         "reportTitle": "Role Report",
diff --git a/rsf-design/src/locales/langs/zh.json b/rsf-design/src/locales/langs/zh.json
index f9e4972..3dd220c 100644
--- a/rsf-design/src/locales/langs/zh.json
+++ b/rsf-design/src/locales/langs/zh.json
@@ -36,6 +36,7 @@
     "tips": "鎻愮ず",
     "cancel": "鍙栨秷",
     "confirm": "纭畾",
+    "close": "鍏抽棴",
     "logOutTips": "鎮ㄦ槸鍚﹁閫�鍑虹櫥褰�?",
     "count": "鍏� {count} 鏉�",
     "listSeparator": "銆�",
@@ -43,6 +44,7 @@
       "search": "鏌ヨ",
       "reset": "閲嶇疆",
       "refresh": "鍒锋柊",
+      "reload": "閲嶆柊鍔犺浇",
       "add": "鏂板",
       "batchDelete": "鎵归噺鍒犻櫎",
       "edit": "缂栬緫",
@@ -58,7 +60,8 @@
       "collapse": "鏀惰捣",
       "viewAll": "鏌ョ湅鍏ㄩ儴",
       "save": "淇濆瓨",
-      "submit": "鎻愪氦"
+      "submit": "鎻愪氦",
+      "initialize": "鍒濆鍖�"
     },
     "status": {
       "enabled": "鍚敤",
@@ -113,6 +116,18 @@
     "index": "搴忓彿",
     "unit": "鍗曚綅",
     "id": "ID",
+    "name": "鍚嶇О",
+    "code": "缂栫爜",
+    "status": "鐘舵��",
+    "memo": "澶囨敞",
+    "createBy": "鍒涘缓浜�",
+    "createTime": "鍒涘缓鏃堕棿",
+    "updateBy": "鏇存柊浜�",
+    "updateTime": "鏇存柊鏃堕棿",
+    "sort": "鎺掑簭",
+    "route": "璺敱",
+    "authority": "鏉冮檺鏍囪瘑",
+    "operation": "鎿嶄綔",
     "wcs": "WCS",
     "source": "鏉ユ簮",
     "supplier": "渚涘簲鍟�",
@@ -207,15 +222,66 @@
   "notice": {
     "title": "閫氱煡",
     "btnRead": "鏍囦负宸茶",
-    "bar": [
-      "閫氱煡",
-      "娑堟伅",
-      "浠e姙"
-    ],
-    "text": [
-      "鏆傛棤"
-    ],
-    "viewAll": "鏌ョ湅鍏ㄩ儴"
+    "bar": {
+      "notice": "閫氱煡",
+      "message": "娑堟伅",
+      "todo": "浠e姙"
+    },
+    "emptyPrefix": "鏆傛棤",
+    "viewAll": "鏌ョ湅鍏ㄩ儴",
+    "actions": {
+      "viewAllNotice": "鏌ョ湅鍏ㄩ儴閫氱煡",
+      "viewAllMessage": "鏌ョ湅鍏ㄩ儴娑堟伅",
+      "viewAllTodo": "鏌ョ湅鍏ㄩ儴寰呭姙"
+    },
+    "samples": {
+      "notice": {
+        "addI18n": "鏂板鍥介檯鍖�",
+        "receiveMessage": "鍐锋湀鍛嗗憜缁欎綘鍙戜簡涓�鏉℃秷鎭�",
+        "newFollower": "灏忚偉鐚叧娉ㄤ簡浣�",
+        "addDocs": "鏂板浣跨敤鏂囨。",
+        "receiveMail": "灏忚偉鐚粰浣犲彂浜嗕竴灏侀偖浠�",
+        "menuMock": "鑿滃崟 mock 鏈湴鐪熷疄鏁版嵁"
+      },
+      "message": {
+        "chibupang": "姹犱笉鑳� 鍏虫敞浜嗕綘",
+        "tangbuku": "鍞愪笉鑻� 鍏虫敞浜嗕綘",
+        "zhongxiaoyu": "涓皬楸� 鍏虫敞浜嗕綘",
+        "hexiaohe": "浣曞皬鑽� 鍏虫敞浜嗕綘",
+        "suixuinian": "瑾惰娣� 鍏虫敞浜嗕綘",
+        "lengyuedaidai": "鍐锋湀鍛嗗憜 鍏虫敞浜嗕綘"
+      }
+    }
+  },
+  "components": {
+    "fastEnter": {
+      "quickLinks": "蹇�熼摼鎺�",
+      "invalidNavigation": "瀵艰埅閰嶇疆鏃犳晥锛氱己灏戣矾鐢卞悕绉版垨閾炬帴"
+    },
+    "dragVerify": {
+      "dragText": "鎸変綇婊戝潡鎷栧姩",
+      "successText": "楠岃瘉鎴愬姛"
+    },
+    "banner": {
+      "card": {
+        "viewDetails": "鏌ョ湅璇︽儏",
+        "cancel": "鍙栨秷"
+      },
+      "basic": {
+        "view": "鏌ョ湅",
+        "backgroundAlt": "鑳屾櫙鍥剧墖"
+      }
+    },
+    "cropper": {
+      "chooseImage": "閫夋嫨鍥剧墖",
+      "clearImage": "娓呴櫎",
+      "previewAlt": "棰勮鍥�",
+      "downloadImage": "涓嬭浇鍥剧墖",
+      "coverImage": "灏侀潰鍥剧墖",
+      "imageLoadFailed": "鍥剧墖鍔犺浇澶辫触锛�",
+      "downloadLog": "涓嬭浇鍥剧墖",
+      "fileName": "image.png"
+    }
   },
   "worktab": {
     "btn": {
@@ -287,6 +353,18 @@
   },
   "lockScreen": {
     "pwdError": "瀵嗙爜閿欒",
+    "avatarAlt": "鐢ㄦ埛澶村儚",
+    "devTools": {
+      "title": "绯荤粺宸查攣瀹�",
+      "descriptionLine1": "妫�娴嬪埌寮�鍙戣�呭伐鍏峰凡鎵撳紑",
+      "descriptionLine2": "涓轰簡绯荤粺瀹夊叏锛岃鍏抽棴寮�鍙戣�呭伐鍏峰悗缁х画浣跨敤",
+      "footer": "Security Lock Activated"
+    },
+    "errors": {
+      "decryptFailed": "瀵嗙爜瑙e瘑澶辫触锛�",
+      "validationFailed": "琛ㄥ崟楠岃瘉澶辫触锛�",
+      "updateStoreFailed": "鏇存柊 store 澶辫触锛�"
+    },
     "lock": {
       "inputPlaceholder": "璇疯緭鍏ラ攣灞忓瘑鐮�",
       "btnText": "閿佸畾"
@@ -469,7 +547,8 @@
     "subsystemFlowTemplate": "瀛愮郴缁熸祦绋嬫ā鏉�",
     "flowStepTemplate": "娴佺▼姝ラ妯℃澘",
     "taskPathTemplateMerge": "浠诲姟璺緞妯℃澘鍚堝苟",
-    "missionFlowStepInstance": "浠诲姟娴佺▼姝ラ"
+    "missionFlowStepInstance": "浠诲姟娴佺▼姝ラ",
+    "aiManagementCenter": "AI绠$悊涓績"
   },
   "ai": {
     "drawer": {
@@ -584,13 +663,18 @@
     },
     "index": "搴忓彿",
     "id": "ID",
+    "name": "鍚嶇О",
+    "code": "缂栫爜",
+    "keyword": "鍏抽敭瀛�",
     "operation": "鎿嶄綔",
     "status": "鐘舵��",
     "type": "绫诲瀷",
     "source": "鏉ユ簮",
     "supplier": "渚涘簲鍟�",
     "supplierBatch": "渚涘簲鍟嗘壒娆�",
+    "memo": "澶囨敞",
     "remark": "澶囨敞",
+    "createBy": "鍒涘缓浜�",
     "updateBy": "鏇存柊浜�",
     "updateTime": "鏇存柊鏃堕棿",
     "createTime": "鍒涘缓鏃堕棿",
@@ -615,6 +699,11 @@
     "requestTimeoutStopped": "璇锋眰瓒呮椂锛屽凡鍋滄绛夊緟",
     "exportTimeoutStopped": "瀵煎嚭璇锋眰瓒呮椂锛屽凡鍋滄绛夊緟",
     "printTimeoutStopped": "鎵撳嵃鏁版嵁鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+    "routeRenderFailedTitle": "椤甸潰鍔犺浇澶辫触",
+    "routeRenderFailed": "椤甸潰娓叉煋澶辫触锛岃绋嶅悗閲嶈瘯",
+    "systemUpgradeTitle": "绯荤粺鍗囩骇鎻愮ず",
+    "systemUpgradeIntro": "绯荤粺宸插崌绾у埌 {version} 鐗堟湰锛屽缓璁煡鐪嬩互涓嬫洿鏂板唴瀹癸細",
+    "systemUpgradeRelogin": "鏈鍗囩骇闇�瑕侀噸鏂扮櫥褰曚互搴旂敤鏈�鏂板彉鏇淬��",
     "exportInvalidDataType": "鏁版嵁蹇呴』鏄暟缁勬牸寮�",
     "exportNoData": "娌℃湁鍙鍑虹殑鏁版嵁",
     "exportExceedMaxRows": "鏁版嵁琛屾暟瓒呰繃闄愬埗锛坽maxRows}琛岋級",
@@ -628,7 +717,321 @@
     "exportWorkbookComments": "鐢辩郴缁熻嚜鍔ㄧ敓鎴�"
   },
   "pages": {
-    "system": {
+    "systemDraft": {
+      "aiParam": {
+        "title": "AI 鍙傛暟",
+        "subtitle": "鎸夊崱鐗囩鐞嗗綋鍓嶇敤鎴风殑妯″瀷鎺ュ叆鍙傛暟涓庨粯璁ら厤缃��",
+        "entity": "AI 鍙傛暟",
+        "reportTitle": "AI 鍙傛暟鎶ヨ〃",
+        "empty": "鏆傛棤 AI 鍙傛暟",
+        "buttons": {
+          "add": "鏂板缓鍙傛暟"
+        },
+        "actions": {
+          "setDefault": "璁句负榛樿"
+        },
+        "fields": {
+          "baseUrl": "鍩虹鍦板潃",
+          "lastValidateTime": "鏈�杩戞牎楠�",
+          "timeoutMs": "瓒呮椂鏃堕棿",
+          "streamingEnabled": "娴佸紡鍝嶅簲",
+          "maxTokens": "鏈�澶� Token"
+        },
+        "search": {
+          "condition": "鍏抽敭瀛�",
+          "conditionPlaceholder": "璇疯緭鍏ュ弬鏁板悕绉�",
+          "providerType": "鎻愪緵鏂�",
+          "providerTypePlaceholder": "璇疯緭鍏ユ彁渚涙柟绫诲瀷",
+          "model": "妯″瀷",
+          "modelPlaceholder": "璇疯緭鍏ユā鍨嬪悕绉�",
+          "status": "榛樿鐘舵��"
+        },
+        "status": {
+          "default": "榛樿",
+          "candidate": "鍊欓��"
+        },
+        "validation": {
+          "valid": "宸叉牎楠�",
+          "invalid": "寮傚父",
+          "notTested": "鏈牎楠�"
+        },
+        "streaming": {
+          "enabled": "娴佸紡鍝嶅簲",
+          "disabled": "闈炴祦寮�"
+        },
+        "table": {
+          "name": "鍙傛暟鍚嶇О",
+          "providerType": "鎻愪緵鏂圭被鍨�",
+          "model": "妯″瀷鍚嶇О",
+          "status": "榛樿鐘舵��",
+          "validateStatus": "鏍¢獙鐘舵��",
+          "timeoutMs": "瓒呮椂鏃堕棿"
+        },
+        "summary": {
+          "title": "杩愯鏃舵憳瑕�",
+          "subtitle": "褰撳墠鐢熸晥鐨勬ā鍨嬨�丳rompt 涓� MCP 鎸傝浇姒傚喌",
+          "refresh": "鍒锋柊鎽樿",
+          "activeModel": "褰撳墠妯″瀷",
+          "activePrompt": "褰撳墠 Prompt",
+          "lastPromptUpdate": "鏈�杩戞洿鏂版椂闂� {value}",
+          "enabledMcp": "宸插惎鐢� MCP",
+          "enabledMcpCount": "{count} 涓�",
+          "noMcp": "鏆傛棤鎸傝浇"
+        },
+        "dialog": {
+          "titleCreate": "鏂板缓 AI 鍙傛暟",
+          "titleEdit": "缂栬緫 AI 鍙傛暟",
+          "titleDetail": "AI 鍙傛暟璇︽儏",
+          "runtimeTitle": "杩愯鏃剁姸鎬�",
+          "runtimeDescription": "淇濆瓨鍓嶅彲鍏堟墽琛岃崏绋挎牎楠岋紝杩愯鏃剁姸鎬佺敱鍚庣鐪熷疄杩斿洖銆�",
+          "validateDraft": "鑽夌鏍¢獙",
+          "labels": {
+            "validateStatus": "鏍¢獙鐘舵��",
+            "lastValidateElapsedMs": "鏈�杩戞牎楠岃�楁椂",
+            "lastValidateTime": "鏈�杩戞牎楠屾椂闂�",
+            "updateBy": "鏈�杩戞洿鏂颁汉",
+            "updateTime": "鏈�杩戞洿鏂版椂闂�",
+            "lastValidateMessage": "鏈�杩戞牎楠屼俊鎭�",
+            "name": "鍙傛暟鍚嶇О",
+            "providerType": "鎻愪緵鏂圭被鍨�",
+            "baseUrl": "鍩虹鍦板潃",
+            "apiKey": "API Key",
+            "model": "妯″瀷鍚嶇О",
+            "temperature": "Temperature",
+            "topP": "Top P",
+            "maxTokens": "鏈�澶� Token",
+            "timeoutMs": "瓒呮椂鏃堕棿(ms)",
+            "streamingEnabled": "娴佸紡鍝嶅簲",
+            "status": "榛樿鐘舵��",
+            "memo": "澶囨敞"
+          },
+          "placeholders": {
+            "name": "璇疯緭鍏ュ弬鏁板悕绉�",
+            "providerType": "璇烽�夋嫨鎻愪緵鏂圭被鍨�",
+            "baseUrl": "璇疯緭鍏ュ吋瀹� OpenAI 鐨勫熀纭�鍦板潃",
+            "apiKey": "璇疯緭鍏� API Key",
+            "model": "璇疯緭鍏ユā鍨嬪悕绉�",
+            "temperature": "璇疯緭鍏� temperature",
+            "topP": "璇疯緭鍏� topP",
+            "maxTokens": "璇疯緭鍏ユ渶澶� token",
+            "timeoutMs": "璇疯緭鍏ヨ秴鏃舵椂闂�",
+            "status": "璇烽�夋嫨榛樿鐘舵��",
+            "memo": "璇疯緭鍏ュ娉�"
+          },
+          "validation": {
+            "name": "璇疯緭鍏ュ弬鏁板悕绉�",
+            "providerType": "璇烽�夋嫨鎻愪緵鏂圭被鍨�",
+            "baseUrl": "璇疯緭鍏ュ熀纭�鍦板潃",
+            "apiKey": "璇疯緭鍏� API Key",
+            "model": "璇疯緭鍏ユā鍨嬪悕绉�"
+          }
+        },
+        "messages": {
+          "setDefaultSuccess": "榛樿鍙傛暟宸叉洿鏂�",
+          "summaryTimeout": "杩愯鏃舵憳瑕佸姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�",
+          "summaryUnavailable": "杩愯鏃舵憳瑕佹殏涓嶅彲鐢�"
+        }
+      },
+      "aiPrompt": {
+        "title": "Prompt 绠$悊",
+        "subtitle": "鎸夊崱鐗囩淮鎶ょ郴缁熸彁绀鸿瘝妯℃澘涓庡満鏅寲鐢ㄦ埛鎻愮ず璇嶃��",
+        "entity": "Prompt",
+        "reportTitle": "Prompt 绠$悊鎶ヨ〃",
+        "empty": "鏆傛棤 Prompt",
+        "buttons": {
+          "add": "鏂板缓 Prompt"
+        },
+        "fields": {
+          "sceneTag": "鍦烘櫙 {value}",
+          "systemPrompt": "绯荤粺鎻愮ず璇�",
+          "userPromptTemplate": "鐢ㄦ埛鎻愮ず璇嶆ā鏉�"
+        },
+        "search": {
+          "condition": "鍏抽敭瀛�",
+          "conditionPlaceholder": "璇疯緭鍏� Prompt 鍚嶇О",
+          "code": "Prompt 缂栫爜",
+          "codePlaceholder": "璇疯緭鍏� Prompt 缂栫爜",
+          "scene": "鍦烘櫙鏍囪瘑",
+          "scenePlaceholder": "璇疯緭鍏ュ満鏅爣璇�",
+          "status": "鐘舵��"
+        },
+        "table": {
+          "name": "Prompt 鍚嶇О",
+          "code": "Prompt 缂栫爜",
+          "scene": "鍦烘櫙鏍囪瘑",
+          "status": "鐘舵��",
+          "systemPrompt": "绯荤粺鎻愮ず璇�",
+          "userPromptTemplate": "鐢ㄦ埛鎻愮ず璇嶆ā鏉�"
+        },
+          "dialog": {
+            "titleCreate": "鏂板缓 Prompt",
+            "titleEdit": "缂栬緫 Prompt",
+            "titleDetail": "Prompt 璇︽儏",
+            "defaultPreviewInput": "璇锋牴鎹綋鍓嶈緭鍏ョ粰鍑烘憳瑕�",
+            "previewTitle": "娓叉煋棰勮",
+          "previewDescription": "杈撳叆绀轰緥鍐呭鍜� metadata锛岀洿鎺ラ瑙堟渶缁堟覆鏌撶粨鏋溿��",
+          "previewAction": "娓叉煋棰勮",
+          "previewResolvedVariables": "宸茶В鏋愬彉閲忥細{value}",
+          "previewNoVariables": "鏃�",
+          "runtimeTitle": "杩愯鏃剁姸鎬�",
+          "labels": {
+            "updateBy": "鏈�杩戞洿鏂颁汉",
+            "updateTime": "鏈�杩戞洿鏂版椂闂�",
+            "name": "Prompt 鍚嶇О",
+            "code": "Prompt 缂栫爜",
+            "scene": "鍦烘櫙鏍囪瘑",
+            "systemPrompt": "绯荤粺鎻愮ず璇�",
+            "userPromptTemplate": "鐢ㄦ埛鎻愮ず璇嶆ā鏉�",
+            "status": "鐘舵��",
+            "memo": "澶囨敞"
+          },
+          "placeholders": {
+            "previewInput": "璇疯緭鍏ョず渚嬭緭鍏ュ唴瀹�",
+            "metadata": "璇疯緭鍏� JSON metadata锛屼緥濡� {\"path\":\"/system/aiPrompt\"}",
+            "renderedSystemPrompt": "绯荤粺鎻愮ず璇嶆覆鏌撶粨鏋�",
+            "renderedUserPrompt": "鐢ㄦ埛鎻愮ず璇嶆覆鏌撶粨鏋�",
+            "name": "璇疯緭鍏� Prompt 鍚嶇О",
+            "code": "璇疯緭鍏� Prompt 缂栫爜",
+            "scene": "璇疯緭鍏ュ満鏅爣璇�",
+            "systemPrompt": "璇疯緭鍏ョ郴缁熸彁绀鸿瘝",
+            "userPromptTemplate": "璇疯緭鍏ョ敤鎴锋彁绀鸿瘝妯℃澘",
+            "status": "璇烽�夋嫨鐘舵��",
+            "memo": "璇疯緭鍏ュ娉�"
+          },
+          "validation": {
+            "name": "璇疯緭鍏� Prompt 鍚嶇О",
+            "code": "璇疯緭鍏� Prompt 缂栫爜",
+            "scene": "璇疯緭鍏ュ満鏅爣璇�",
+            "systemPrompt": "璇疯緭鍏ョ郴缁熸彁绀鸿瘝",
+            "userPromptTemplate": "璇疯緭鍏ョ敤鎴锋彁绀鸿瘝妯℃澘"
+          }
+        },
+        "messages": {
+          "previewFailed": "娓叉煋棰勮澶辫触"
+        }
+      },
+      "aiMcpMount": {
+        "title": "MCP 鎸傝浇",
+        "subtitle": "缁存姢褰撳墠鐜鐨� MCP 鏈嶅姟鎸傝浇涓庡仴搴风姸鎬併��",
+        "entity": "MCP 鎸傝浇",
+        "empty": "鏆傛棤 MCP 鎸傝浇",
+        "buttons": {
+          "add": "鏂板鎸傝浇"
+        },
+        "fields": {
+          "target": "鐩爣",
+          "lastTestTime": "鏈�杩戞祴璇曟椂闂�",
+          "timeoutMs": "璇锋眰瓒呮椂",
+          "lastInitElapsedMs": "鏈�杩戝垵濮嬪寲鑰楁椂"
+        },
+        "search": {
+          "condition": "鍏抽敭瀛�",
+          "conditionPlaceholder": "璇疯緭鍏ユ寕杞藉悕绉�",
+          "transportType": "浼犺緭绫诲瀷",
+          "status": "鐘舵��"
+        },
+        "actions": {
+          "connectivityTest": "杩為�氭�ф祴璇�",
+          "toolsPreview": "宸ュ叿棰勮"
+        },
+        "health": {
+          "healthy": "鍋ュ悍",
+          "unhealthy": "寮傚父",
+          "notTested": "鏈祴璇�"
+        },
+        "groups": {
+          "builtin": {
+            "title": "鍐呯疆鎸傝浇",
+            "description": "骞冲彴鍐呯疆鐨� MCP 鑳藉姏闆嗗悎銆�"
+          },
+          "sse": {
+            "title": "SSE / HTTP 鎸傝浇",
+            "description": "閫氳繃 HTTP/SSE 鍗忚鎺ュ叆鐨勮繙绋� MCP 鏈嶅姟銆�"
+          },
+          "stdio": {
+            "title": "STDIO 鎸傝浇",
+            "description": "閫氳繃鏈湴鍛戒护鎷夎捣骞朵娇鐢ㄦ爣鍑嗚緭鍏ヨ緭鍑洪�氫俊鐨� MCP 鏈嶅姟銆�"
+          }
+        },
+        "dialog": {
+          "titleCreate": "鏂板缓鎸傝浇",
+          "titleEdit": "缂栬緫鎸傝浇",
+          "titleDetail": "鎸傝浇璇︽儏",
+          "draftTestTitle": "鑽夌杩為�氭�ф祴璇�",
+          "draftTestDescription": "淇濆瓨鍓嶅厛鏍¢獙褰撳墠鎸傝浇閰嶇疆鏄惁鍙繛閫氥��",
+          "draftTestAction": "鑽夌杩為�氭�ф祴璇�",
+          "runtimeTitle": "杩愯鏃剁姸鎬�",
+          "runtimeLabels": {
+            "healthStatus": "鍋ュ悍鐘舵��",
+            "lastTestTime": "鏈�杩戞祴璇曟椂闂�",
+            "lastInitElapsedMs": "鏈�杩戝垵濮嬪寲鑰楁椂",
+            "updateTime": "鏈�杩戞洿鏂版椂闂�",
+            "lastTestMessage": "鏈�杩戞祴璇曚俊鎭�"
+          },
+          "labels": {
+            "name": "鍚嶇О",
+            "transportType": "浼犺緭绫诲瀷",
+            "builtinCode": "鍐呯疆 MCP 缂栫爜",
+            "serverUrl": "鏈嶅姟鍦板潃",
+            "endpoint": "SSE 绔偣",
+            "headersJson": "璇锋眰澶� JSON",
+            "command": "鍛戒护",
+            "argsJson": "鍛戒护鍙傛暟 JSON",
+            "envJson": "鐜鍙橀噺 JSON",
+            "requestTimeoutMs": "璇锋眰瓒呮椂(ms)",
+            "sort": "鎺掑簭",
+            "status": "鐘舵��",
+            "memo": "澶囨敞"
+          },
+          "placeholders": {
+            "name": "璇疯緭鍏ュ悕绉�",
+            "transportType": "璇烽�夋嫨浼犺緭绫诲瀷",
+            "builtinCode": "璇疯緭鍏ュ唴缃� MCP 缂栫爜",
+            "serverUrl": "璇疯緭鍏ユ湇鍔″湴鍧�",
+            "endpoint": "璇疯緭鍏� SSE 绔偣",
+            "headersJson": "璇疯緭鍏ヨ姹傚ご JSON",
+            "command": "璇疯緭鍏ュ懡浠�",
+            "argsJson": "璇疯緭鍏ュ懡浠ゅ弬鏁� JSON",
+            "envJson": "璇疯緭鍏ョ幆澧冨彉閲� JSON",
+            "requestTimeoutMs": "璇疯緭鍏ヨ姹傝秴鏃�",
+            "sort": "璇疯緭鍏ユ帓搴�",
+            "status": "璇烽�夋嫨鐘舵��",
+            "memo": "璇疯緭鍏ュ娉�"
+          },
+          "validation": {
+            "name": "璇疯緭鍏ュ悕绉�",
+            "transportType": "璇烽�夋嫨浼犺緭绫诲瀷"
+          }
+        },
+        "toolsDrawer": {
+          "title": "MCP 宸ュ叿棰勮",
+          "currentMount": "褰撳墠鎸傝浇",
+          "description": "鍙瑙堝伐鍏峰垪琛紝骞跺宸ュ叿鍏ュ弬鍋氳仈璋冩祴璇曘��",
+          "refreshTools": "鍒锋柊宸ュ叿",
+          "connectivityTest": "杩為�氭�ф祴璇�",
+          "empty": "鏆傛棤宸ュ叿淇℃伅",
+          "toolTest": "宸ュ叿娴嬭瘯",
+          "inputJson": "杈撳叆鍙傛暟 JSON",
+          "inputJsonPlaceholder": "璇疯緭鍏� JSON锛屼緥濡� {\"taskCode\":\"TK001\"}",
+          "output": "宸ュ叿杈撳嚭",
+          "outputPlaceholder": "宸ュ叿杈撳嚭浼氭樉绀哄湪杩欓噷",
+          "inputSchema": "杈撳叆 Schema",
+          "toolInputRequired": "璇疯緭鍏ュ伐鍏锋祴璇曞叆鍙� JSON",
+          "toolTestSuccess": "宸ュ叿娴嬭瘯鎴愬姛",
+          "toolTestFailed": "宸ュ叿娴嬭瘯澶辫触",
+          "toolsLoadFailed": "鑾峰彇宸ュ叿鍒楄〃澶辫触"
+        },
+        "messages": {
+          "connectivityTimeout": "杩為�氭�ф祴璇曡秴鏃讹紝宸插仠姝㈢瓑寰�",
+          "connectivitySuccess": "杩為�氭�ф祴璇曟垚鍔�",
+          "connectivityFailed": "杩為�氭�ф祴璇曞け璐�",
+          "draftConnectivitySuccess": "鑽夌杩為�氭�ф祴璇曟垚鍔�",
+          "draftConnectivityFailed": "鑽夌杩為�氭�ф祴璇曞け璐�",
+          "toolsTimeout": "宸ュ叿鍒楄〃鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+          "toolTestTimeout": "宸ュ叿娴嬭瘯瓒呮椂锛屽凡鍋滄绛夊緟",
+          "initElapsedMs": "鍒濆鍖栬�楁椂 {value} ms"
+        }
+      },
       "role": {
         "entity": "瑙掕壊",
         "reportTitle": "瑙掕壊绠$悊鎶ヨ〃",
@@ -723,6 +1126,98 @@
       }
     },
     "orders": {
+      "common": {
+        "orderCode": "鍗曟嵁缂栧彿",
+        "trackCode": "杩借釜鐮�"
+      },
+      "asnOrderItem": {
+        "reportTitle": "鏀惰揣鏄庣粏鎶ヨ〃",
+        "sourceTitle": "褰撳墠鏉ユ簮",
+        "sourceLabel": "鍏ュ簱閫氱煡鍗旾D锛歿id}",
+        "orderType": {
+          "in": "鍏ュ簱",
+          "out": "鍑哄簱"
+        },
+        "ntyStatus": {
+          "notReported": "鏈笂鎶�",
+          "reported": "宸蹭笂鎶�"
+        },
+        "search": {
+          "conditionPlaceholder": "璇疯緭鍏� PO 鍗曞彿/鐗╂枡缂栫爜/鐗╂枡鍚嶇О/渚涘簲鍟�",
+          "poCode": "PO鍗曞彿",
+          "poCodePlaceholder": "璇疯緭鍏� PO 鍗曞彿",
+          "orderCode": "ASN鍗曞彿",
+          "orderCodePlaceholder": "璇疯緭鍏� ASN 鍗曞彿",
+          "platWorkCode": "璁″垝璺熻釜鍙�",
+          "platWorkCodePlaceholder": "璇疯緭鍏ヨ鍒掕窡韪彿",
+          "platItemId": "琛屽彿",
+          "platItemIdPlaceholder": "璇疯緭鍏ヨ鍙�",
+          "matnrCodePlaceholder": "璇疯緭鍏ョ墿鏂欑紪鐮�",
+          "maktxPlaceholder": "璇疯緭鍏ョ墿鏂欏悕绉�",
+          "splrBatchPlaceholder": "璇疯緭鍏ヤ緵搴斿晢鎵规",
+          "stockUnit": "搴撳瓨鍗曚綅",
+          "stockUnitPlaceholder": "璇疯緭鍏ュ簱瀛樺崟浣�",
+          "ntyStatus": "涓婃姤鐘舵��",
+          "createTimeRange": "鍒涘缓鏃堕棿",
+          "updateTimeRange": "鏇存柊鏃堕棿",
+          "startTime": "寮�濮嬫椂闂�",
+          "endTime": "缁撴潫鏃堕棿",
+          "rangeSeparator": "鑷�"
+        },
+        "table": {
+          "poCode": "PO鍗曞彿",
+          "wkType": "涓氬姟绫诲瀷",
+          "type": "鍗曟嵁绫诲瀷",
+          "purchaseOrg": "閲囪喘缁勭粐",
+          "purchaseUser": "閲囪喘鍛�",
+          "platWorkCode": "璁″垝璺熻釜鍙�",
+          "platItemId": "琛屽彿",
+          "stockUnit": "搴撳瓨鍗曚綅",
+          "anfme": "閫佽揣鏁伴噺",
+          "qty": "宸叉敹鏁伴噺",
+          "targetWarehouseId": "寤鸿鐩爣浠�",
+          "businessTime": "涓氬姟鏃堕棿"
+        },
+        "detail": {
+          "title": "鏀惰揣鏄庣粏璇︽儏",
+          "baseInfo": "鍩虹淇℃伅",
+          "itemInfo": "鏄庣粏淇℃伅",
+          "auditInfo": "瀹¤淇℃伅",
+          "extendFields": "鎵╁睍瀛楁",
+          "poCode": "PO鍗曞彿",
+          "orderCode": "ASN鍗曞彿",
+          "wkType": "涓氬姟绫诲瀷",
+          "orderType": "鍗曟嵁绫诲瀷",
+          "purchaseOrg": "閲囪喘缁勭粐",
+          "purchaseUser": "閲囪喘鍛�",
+          "supplierId": "渚涘簲鍟咺D",
+          "supplierName": "渚涘簲鍟嗗悕绉�",
+          "businessTime": "涓氬姟鏃堕棿",
+          "targetWarehouseId": "寤鸿鐩爣浠�",
+          "ntyStatus": "涓婃姤鐘舵��",
+          "platItemId": "璁″垝琛屽彿",
+          "platWorkCode": "璁″垝璺熻釜鍙�",
+          "spec": "瑙勬牸",
+          "model": "鍨嬪彿",
+          "barcode": "鏉″舰鐮�",
+          "qrcode": "浜岀淮鐮�",
+          "packName": "鍖呰鍚嶇О",
+          "stockUnit": "搴撳瓨鍗曚綅",
+          "purUnit": "閲囪喘鍗曚綅",
+          "anfme": "閫佽揣鏁伴噺",
+          "qty": "宸叉敹鏁伴噺",
+          "purQty": "閲囪喘鏁伴噺",
+          "prodTime": "鐢熶骇鏃ユ湡",
+          "isptResult": "璐ㄦ缁撴灉",
+          "sourceWarehouseId": "鏉ユ簮浠撳簱"
+        },
+        "messages": {
+          "detailTimeout": "鏀惰揣鏄庣粏璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+          "detailFailed": "鑾峰彇鏀惰揣鏄庣粏璇︽儏澶辫触",
+          "pageTimeout": "鏀惰揣鏄庣粏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+          "noExportData": "鏆傛棤鍙鍑虹殑鏁版嵁"
+        }
+      },
       "asnOrder": {
         "reportTitle": "鍏ュ簱閫氱煡鍗曟姤琛�",
         "entity": "鍏ュ簱閫氱煡鍗�",
@@ -832,6 +1327,258 @@
           "receivedQtyTotal": "鏀惰揣鏁伴噺"
         }
       },
+      "asnOrderLog": {
+        "table": {
+          "poId": "PO鍗旾D",
+          "type": "鍗曟嵁绫诲瀷",
+          "wkType": "涓氬姟绫诲瀷",
+          "anfme": "閫佽揣鏁伴噺",
+          "qty": "宸叉敹鏁伴噺",
+          "logisNo": "鐗╂祦鍗曞彿",
+          "arrTime": "棰勮鍒拌揪鏃堕棿",
+          "rleStatus": "閲婃斁鐘舵��",
+          "exceStatus": "鎵ц鐘舵��"
+        }
+      },
+      "asnOrderItemLog": {
+        "reportTitle": "鏀惰揣鍘嗗彶鏄庣粏鎶ヨ〃",
+        "table": {
+          "asnCode": "ASN鍗曞彿",
+          "platItemId": "骞冲彴琛屽彿",
+          "poDetlId": "PO鍗曟槑缁咺D",
+          "poCode": "PO鍗曞彿",
+          "fieldsIndex": "鍔ㄦ�佸瓧娈电储寮�",
+          "matnrCode": "鐗╂枡缂栫爜",
+          "maktx": "鐗╂枡鍚嶇О",
+          "anfme": "閫佽揣鏁伴噺",
+          "stockUnit": "搴撳瓨鍗曚綅",
+          "purQty": "閲囪喘鏁伴噺",
+          "purUnit": "閲囪喘鍗曚綅",
+          "qty": "宸叉敹鏁伴噺",
+          "splrCode": "渚涘簲鍟嗙紪鐮�",
+          "splrBatch": "渚涘簲鍟嗘壒娆�",
+          "splrName": "渚涘簲鍟嗗悕绉�",
+          "qrcode": "浜岀淮鐮�",
+          "trackCode": "璺熻釜鐮�",
+          "barcode": "鏉″舰鐮�",
+          "packName": "鍖呰鍚嶇О",
+          "ntyStatus": "涓婃姤鐘舵��"
+        },
+        "search": {
+          "condition": "鍏抽敭瀛�",
+          "conditionPlaceholder": "璇疯緭鍏SN鍗曞彿/PO鍗曞彿/鐗╂枡缂栫爜",
+          "logId": "鏃ュ織ID",
+          "logIdPlaceholder": "璇疯緭鍏ユ棩蹇桰D",
+          "asnCodePlaceholder": "璇疯緭鍏SN鍗曞彿",
+          "poCodePlaceholder": "璇疯緭鍏O鍗曞彿",
+          "matnrCodePlaceholder": "璇疯緭鍏ョ墿鏂欑紪鐮�",
+          "maktxPlaceholder": "璇疯緭鍏ョ墿鏂欏悕绉�",
+          "splrBatchPlaceholder": "璇疯緭鍏ヤ緵搴斿晢鎵规"
+        },
+        "status": {
+          "notReported": "鏈笂鎶�",
+          "reported": "宸蹭笂鎶�",
+          "partialReported": "閮ㄥ垎涓婃姤"
+        }
+      },
+      "outStock": {
+        "reportTitle": "鍑哄簱鍗曟姤琛�",
+        "entity": "鍑哄簱鍗�",
+        "type": {
+          "out": "鍑哄簱鍗�"
+        },
+        "businessType": {
+          "salesOut": "閿�鍞嚭搴撳崟",
+          "transferOut": "璋冩嫧鍑哄簱鍗�",
+          "stockOut": "搴撳瓨鍑哄簱鍗�",
+          "preOut": "澶囪揣鍑哄簱鍗�"
+        },
+        "search": {
+          "condition": "鍏抽敭瀛�",
+          "conditionPlaceholder": "璇疯緭鍏ュ嚭搴撳崟鍙�/PO鍗曞彿/瀹㈡埛",
+          "code": "鍑哄簱鍗曞彿",
+          "codePlaceholder": "璇疯緭鍏ュ嚭搴撳崟鍙�",
+          "poCode": "PO鍗曞彿",
+          "poCodePlaceholder": "璇疯緭鍏O鍗曞彿",
+          "wkType": "涓氬姟绫诲瀷",
+          "wkTypePlaceholder": "璇烽�夋嫨涓氬姟绫诲瀷",
+          "exceStatus": "鍗曟嵁鐘舵��",
+          "exceStatusPlaceholder": "璇烽�夋嫨鍗曟嵁鐘舵��",
+          "rleStatus": "閲婃斁鐘舵��",
+          "rleStatusPlaceholder": "璇烽�夋嫨閲婃斁鐘舵��",
+          "logisNo": "鐗╂祦鍗曞彿",
+          "logisNoPlaceholder": "璇疯緭鍏ョ墿娴佸崟鍙�",
+          "customerName": "瀹㈡埛鍚嶇О",
+          "customerNamePlaceholder": "璇疯緭鍏ュ鎴峰悕绉�",
+          "saleOrgName": "閿�鍞粍缁�",
+          "saleOrgNamePlaceholder": "璇疯緭鍏ラ攢鍞粍缁�",
+          "memo": "澶囨敞",
+          "memoPlaceholder": "璇疯緭鍏ュ娉�"
+        },
+        "status": {
+          "initialized": "鍒濆鍖�",
+          "pending": "寰呭鐞�",
+          "generated": "鐢熸垚宸ヤ綔妗�",
+          "running": "浣滀笟涓�",
+          "completed": "宸插畬鎴�",
+          "cancelled": "鍙栨秷",
+          "released": "宸查噴鏀�"
+        },
+        "actions": {
+          "view": "鏌ョ湅璇︽儏",
+          "items": "鏄庣粏",
+          "print": "鎵撳嵃",
+          "complete": "瀹屾垚",
+          "cancel": "鍙栨秷",
+          "delete": "鍒犻櫎"
+        },
+        "table": {
+          "code": "鍑哄簱鍗曞彿",
+          "poCode": "PO鍗曞彿",
+          "type": "鍑哄簱绫诲瀷",
+          "wkType": "涓氬姟绫诲瀷",
+          "customerName": "瀹㈡埛",
+          "saleOrgName": "閿�鍞粍缁�",
+          "anfme": "搴斿嚭鏁伴噺",
+          "workQty": "鎵ц鏁伴噺",
+          "qty": "宸插嚭鏁伴噺",
+          "logisNo": "鐗╂祦鍗曞彿",
+          "rleStatus": "閲婃斁鐘舵��",
+          "exceStatus": "鍗曟嵁鐘舵��",
+          "updateTime": "鏇存柊鏃堕棿"
+        },
+        "detail": {
+          "title": "鍑哄簱鍗曡鎯�",
+          "baseInfo": "鍩虹淇℃伅",
+          "auditInfo": "瀹¤淇℃伅",
+          "items": "鍗曟嵁鏄庣粏",
+          "count": "鍏� {count} 鏉�",
+          "code": "鍑哄簱鍗曞彿",
+          "poCode": "PO鍗曞彿",
+          "type": "鍗曟嵁绫诲瀷",
+          "wkType": "涓氬姟绫诲瀷",
+          "exceStatus": "鍗曟嵁鐘舵��",
+          "rleStatus": "閲婃斁鐘舵��",
+          "logisNo": "鐗╂祦鍗曞彿",
+          "businessTime": "涓氬姟鏃堕棿",
+          "saleOrgName": "閿�鍞粍缁�",
+          "saleUserName": "閿�鍞憳",
+          "customerId": "瀹㈡埛缂栫爜",
+          "customerName": "瀹㈡埛鍚嶇О",
+          "stockOrgName": "浠撳簱缁勭粐",
+          "anfme": "搴斿嚭鏁伴噺",
+          "workQty": "鎵ц鏁伴噺",
+          "qty": "宸插嚭鏁伴噺",
+          "memo": "澶囨敞",
+          "createBy": "鍒涘缓浜�",
+          "createTime": "鍒涘缓鏃堕棿",
+          "updateBy": "淇敼浜�",
+          "updateTime": "淇敼鏃堕棿"
+        },
+        "messages": {
+          "detailTimeout": "鍑哄簱鍗曡鎯呭姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�",
+          "itemsTimeout": "鍑哄簱鍗曟槑缁嗗姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�",
+          "detailLoadFailed": "鑾峰彇鍑哄簱鍗曡鎯呭け璐�",
+          "completeTitle": "瀹屾垚纭",
+          "completeConfirm": "纭畾瀹屾垚鍑哄簱鍗� {code} 鍚楋紵",
+          "completeSuccess": "瀹屾垚鎴愬姛",
+          "cancelTitle": "鍙栨秷纭",
+          "cancelConfirm": "纭畾鍙栨秷鍑哄簱鍗� {code} 鍚楋紵",
+          "cancelSuccess": "鍙栨秷鎴愬姛",
+          "actionFailed": "鍑哄簱鍗曟搷浣滃け璐�"
+        }
+      },
+      "outStockItem": {
+        "title": "鍑哄簱鍗曟槑缁�",
+        "reportTitle": "鍑哄簱鍗曟槑缁嗘姤琛�",
+        "sourceSummary": {
+          "title": "褰撳墠鏉ユ簮",
+          "orderId": "鍑哄簱鍗旾D锛歿id}"
+        },
+        "search": {
+          "condition": "鍏抽敭瀛�",
+          "conditionPlaceholder": "璇疯緭鍏ュ嚭搴撳崟鍙�/鐗╂枡缂栫爜/鐗╂枡鍚嶇О",
+          "orderCode": "鍑哄簱鍗曞彿",
+          "orderCodePlaceholder": "璇疯緭鍏ュ嚭搴撳崟鍙�",
+          "poCode": "PO鍗曞彿",
+          "poCodePlaceholder": "璇疯緭鍏O鍗曞彿",
+          "platItemId": "骞冲彴琛屽彿",
+          "platItemIdPlaceholder": "璇疯緭鍏ュ钩鍙拌鍙�",
+          "matnrCode": "鐗╂枡缂栫爜",
+          "matnrCodePlaceholder": "璇疯緭鍏ョ墿鏂欑紪鐮�",
+          "maktx": "鐗╂枡鍚嶇О",
+          "maktxPlaceholder": "璇疯緭鍏ョ墿鏂欏悕绉�",
+          "batch": "鎵规",
+          "batchPlaceholder": "璇疯緭鍏ユ壒娆�",
+          "splrBatch": "渚涘簲鍟嗘壒娆�",
+          "splrBatchPlaceholder": "璇疯緭鍏ヤ緵搴斿晢鎵规",
+          "barcode": "鏉″舰鐮�",
+          "barcodePlaceholder": "璇疯緭鍏ユ潯褰㈢爜",
+          "fieldsIndex": "瀛楁绱㈠紩",
+          "fieldsIndexPlaceholder": "璇疯緭鍏ュ瓧娈电储寮�",
+          "status": "鐘舵��",
+          "statusPlaceholder": "璇烽�夋嫨鐘舵��"
+        },
+        "detail": {
+          "title": "鍑哄簱鍗曟槑缁嗚鎯�",
+          "orderCode": "鍑哄簱鍗曞彿",
+          "poCode": "PO鍗曞彿",
+          "platItemId": "骞冲彴琛屽彿",
+          "platOrderCode": "骞冲彴璁㈠崟鍙�",
+          "platWorkCode": "骞冲彴宸ュ崟鍙�",
+          "projectCode": "椤圭洰鍙�",
+          "matnrCode": "鐗╂枡缂栫爜",
+          "maktx": "鐗╂枡鍚嶇О",
+          "spec": "瑙勬牸",
+          "model": "鍨嬪彿",
+          "batch": "鎵规",
+          "splrBatch": "渚涘簲鍟嗘壒娆�",
+          "stockUnit": "搴撳瓨鍗曚綅",
+          "purUnit": "閲囪喘鍗曚綅",
+          "baseUnit": "鍩烘湰鍗曚綅",
+          "fieldsIndex": "瀛楁绱㈠紩",
+          "barcode": "鏉″舰鐮�",
+          "qrcode": "浜岀淮鐮�",
+          "packName": "鍖呰鍚嶇О",
+          "status": "鐘舵��",
+          "anfme": "鏁伴噺",
+          "workQty": "鎵ц鏁伴噺",
+          "qty": "宸插嚭鏁伴噺",
+          "purQty": "閲囪喘鏁伴噺",
+          "demandQty": "闇�姹傛暟閲�",
+          "splrCode": "渚涘簲鍟嗙紪鐮�",
+          "splrName": "渚涘簲鍟嗗悕绉�",
+          "sourceWarehouseId": "鏉ユ簮浠撳簱",
+          "targetWarehouseId": "鐩爣浠撳簱",
+          "ownerName": "璐т富",
+          "keeperName": "淇濈鑰�",
+          "memo": "澶囨敞",
+          "createBy": "鍒涘缓浜�",
+          "createTime": "鍒涘缓鏃堕棿",
+          "updateBy": "淇敼浜�",
+          "updateTime": "淇敼鏃堕棿"
+        },
+        "table": {
+          "orderCode": "鍑哄簱鍗曞彿",
+          "poCode": "PO鍗曞彿",
+          "platItemId": "骞冲彴琛屽彿",
+          "matnrCode": "鐗╂枡缂栫爜",
+          "maktx": "鐗╂枡鍚嶇О",
+          "batch": "鎵规",
+          "splrBatch": "渚涘簲鍟嗘壒娆�",
+          "stockUnit": "搴撳瓨鍗曚綅",
+          "anfme": "鏁伴噺",
+          "workQty": "鎵ц鏁伴噺",
+          "qty": "宸插嚭鏁伴噺",
+          "fieldsIndex": "瀛楁绱㈠紩",
+          "status": "鐘舵��",
+          "updateTime": "鏇存柊鏃堕棿"
+        },
+        "messages": {
+          "detailTimeout": "鍑哄簱鍗曟槑缁嗚鎯呭姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�",
+          "detailFailed": "鑾峰彇鍑哄簱鍗曟槑缁嗚鎯呭け璐�"
+        }
+      },
       "delivery": {
         "reportTitle": "DO鍗曟姤琛�",
         "detailReportTitle": "DO鍗曟槑缁嗘姤琛�",
@@ -924,6 +1671,56 @@
           "itemsTimeout": "DO鍗曟槑缁嗗姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�",
           "detailTimeout": "DO鍗曡鎯呭姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�",
           "detailLoadFailed": "DO鍗曡鎯呭姞杞藉け璐�"
+        }
+      },
+      "deliveryItem": {
+        "reportTitle": "DO鍗曟槑缁嗘姤琛�",
+        "sourceTitle": "褰撳墠鏉ユ簮",
+        "sourceLabel": "DO鍗旾D锛歿id}",
+        "search": {
+          "conditionPlaceholder": "璇疯緭鍏O鍗曞彿/鐗╂枡缂栫爜/鐗╂枡鍚嶇О/渚涘簲鍟�",
+          "deliveryCode": "DO鍗曞彿",
+          "deliveryCodePlaceholder": "璇疯緭鍏O鍗曞彿",
+          "platItemId": "骞冲彴琛屽彿",
+          "platItemIdPlaceholder": "璇疯緭鍏ュ钩鍙拌鍙�",
+          "matnrCodePlaceholder": "璇疯緭鍏ョ墿鏂欑紪鐮�",
+          "maktxPlaceholder": "璇疯緭鍏ョ墿鏂欏悕绉�",
+          "supplierName": "渚涘簲鍟嗗悕绉�",
+          "supplierNamePlaceholder": "璇疯緭鍏ヤ緵搴斿晢鍚嶇О",
+          "supplierBatchPlaceholder": "璇疯緭鍏ヤ緵搴斿晢鎵规"
+        },
+        "table": {
+          "deliveryId": "DO鍗旾D",
+          "deliveryCode": "DO鍗曞彿",
+          "platItemId": "骞冲彴琛屽彿",
+          "fieldsIndex": "鍔ㄦ�佸瓧娈电储寮�",
+          "workQty": "鎵ц鏁伴噺",
+          "qty": "宸插嚭鏁伴噺",
+          "nromQty": "鏍囧噯鍖呰",
+          "printQty": "鎵撳嵃鏁伴噺",
+          "supplierCode": "渚涘簲鍟嗙紪鐮�",
+          "supplierName": "渚涘簲鍟嗗悕绉�"
+        },
+        "detail": {
+          "title": "DO鍗曟槑缁嗚鎯�",
+          "baseInfo": "鍩虹淇℃伅",
+          "auditInfo": "瀹¤淇℃伅",
+          "deliveryId": "DO鍗旾D",
+          "deliveryCode": "DO鍗曞彿",
+          "platItemId": "骞冲彴琛屽彿",
+          "fieldsIndex": "鍔ㄦ�佸瓧娈电储寮�",
+          "workQty": "鎵ц鏁伴噺",
+          "qty": "宸插嚭鏁伴噺",
+          "nromQty": "鏍囧噯鍖呰",
+          "printQty": "鎵撳嵃鏁伴噺",
+          "supplierCode": "渚涘簲鍟嗙紪鐮�",
+          "supplierName": "渚涘簲鍟嗗悕绉�",
+          "packName": "鍖呰鍚嶇О",
+          "prodTime": "鐢熶骇鏃ユ湡"
+        },
+        "messages": {
+          "detailTimeout": "DO鍗曟槑缁嗚鎯呭姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�",
+          "detailFailed": "鑾峰彇DO鍗曟槑缁嗚鎯呭け璐�"
         }
       },
       "transfer": {
@@ -1040,6 +1837,267 @@
           "publishFailed": "涓嬪彂鎵ц澶辫触",
           "typeOptionsTimeout": "璋冩嫧绫诲瀷閫夐」鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
           "areaOptionsTimeout": "搴撳尯閫夐」鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟"
+        }
+      },
+      "transferItem": {
+        "reportTitle": "璋冩嫧鏄庣粏鎶ヨ〃",
+        "sourceTitle": "褰撳墠鏉ユ簮",
+        "sourceLabel": "璋冩嫧鍗旾D锛歿id}",
+        "search": {
+          "conditionPlaceholder": "璇疯緭鍏ヨ皟鎷ㄥ崟鍙�/鐗╂枡缂栫爜/鐗╂枡鍚嶇О",
+          "transferId": "璋冩嫧鍗旾D",
+          "transferIdPlaceholder": "璇疯緭鍏ヨ皟鎷ㄥ崟ID",
+          "transferCode": "璋冩嫧鍗曞彿",
+          "transferCodePlaceholder": "璇疯緭鍏ヨ皟鎷ㄥ崟鍙�",
+          "platItemId": "骞冲彴琛屽彿",
+          "platItemIdPlaceholder": "璇疯緭鍏ュ钩鍙拌鍙�",
+          "matnrId": "鐗╂枡ID",
+          "matnrIdPlaceholder": "璇疯緭鍏ョ墿鏂橧D",
+          "matnrCodePlaceholder": "璇疯緭鍏ョ墿鏂欑紪鐮�",
+          "maktxPlaceholder": "璇疯緭鍏ョ墿鏂欏悕绉�",
+          "spec": "瑙勬牸",
+          "specPlaceholder": "璇疯緭鍏ヨ鏍�",
+          "model": "鍨嬪彿",
+          "modelPlaceholder": "璇疯緭鍏ュ瀷鍙�",
+          "batchPlaceholder": "璇疯緭鍏ユ壒娆�",
+          "unitPlaceholder": "璇疯緭鍏ュ崟浣�",
+          "workQty": "鎵ц鏁伴噺",
+          "workQtyPlaceholder": "璇疯緭鍏ユ墽琛屾暟閲�",
+          "qty": "瀹屾垚鏁伴噺",
+          "qtyPlaceholder": "璇疯緭鍏ュ畬鎴愭暟閲�",
+          "anfmePlaceholder": "璇疯緭鍏ヨ鍒掓暟閲�",
+          "fieldsIndex": "鍔ㄦ�佸瓧娈电储寮�",
+          "fieldsIndexPlaceholder": "璇疯緭鍏ュ姩鎬佸瓧娈电储寮�",
+          "platOrderCode": "骞冲彴鍗曞彿",
+          "platOrderCodePlaceholder": "璇疯緭鍏ュ钩鍙板崟鍙�",
+          "platWorkCode": "骞冲彴宸ュ崟鍙�",
+          "platWorkCodePlaceholder": "璇疯緭鍏ュ钩鍙板伐鍗曞彿",
+          "projectCode": "椤圭洰缂栫爜",
+          "projectCodePlaceholder": "璇疯緭鍏ラ」鐩紪鐮�",
+          "splrId": "渚涘簲鍟咺D",
+          "splrIdPlaceholder": "璇疯緭鍏ヤ緵搴斿晢ID",
+          "memoPlaceholder": "璇疯緭鍏ュ娉�",
+          "timeStart": "寮�濮嬫椂闂�",
+          "timeStartPlaceholder": "璇烽�夋嫨寮�濮嬫椂闂�",
+          "timeEnd": "缁撴潫鏃堕棿",
+          "timeEndPlaceholder": "璇烽�夋嫨缁撴潫鏃堕棿"
+        },
+        "table": {
+          "transferId": "璋冩嫧鍗旾D",
+          "transferCode": "璋冩嫧鍗曞彿",
+          "platItemId": "骞冲彴琛屽彿",
+          "fieldsIndex": "鍔ㄦ�佸瓧娈电储寮�",
+          "spec": "瑙勬牸",
+          "model": "鍨嬪彿",
+          "workQty": "鎵ц鏁伴噺",
+          "qty": "瀹屾垚鏁伴噺",
+          "platOrderCode": "骞冲彴鍗曞彿",
+          "platWorkCode": "骞冲彴宸ュ崟鍙�",
+          "projectCode": "椤圭洰缂栫爜",
+          "supplierCode": "渚涘簲鍟嗙紪鐮�",
+          "supplierName": "渚涘簲鍟嗗悕绉�"
+        },
+        "detail": {
+          "title": "璋冩嫧鏄庣粏璇︽儏",
+          "baseInfo": "鍩虹淇℃伅",
+          "materialInfo": "鐗╂枡淇℃伅",
+          "platformInfo": "骞冲彴淇℃伅",
+          "auditInfo": "瀹¤淇℃伅",
+          "transferId": "璋冩嫧鍗旾D",
+          "transferCode": "璋冩嫧鍗曞彿",
+          "platItemId": "骞冲彴琛屽彿",
+          "fieldsIndex": "鍔ㄦ�佸瓧娈电储寮�",
+          "matnrId": "鐗╂枡ID",
+          "spec": "瑙勬牸",
+          "model": "鍨嬪彿",
+          "workQty": "鎵ц鏁伴噺",
+          "qty": "瀹屾垚鏁伴噺",
+          "platOrderCode": "骞冲彴鍗曞彿",
+          "platWorkCode": "骞冲彴宸ュ崟鍙�",
+          "projectCode": "椤圭洰缂栫爜",
+          "splrId": "渚涘簲鍟咺D",
+          "supplierCode": "渚涘簲鍟嗙紪鐮�",
+          "supplierName": "渚涘簲鍟嗗悕绉�"
+        },
+        "messages": {
+          "detailTimeout": "璋冩嫧鏄庣粏璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+          "detailFailed": "鑾峰彇璋冩嫧鏄庣粏璇︽儏澶辫触"
+        }
+      },
+      "wave": {
+        "reportTitle": "娉㈡鍗曟姤琛�",
+        "search": {
+          "condition": "鍏抽敭瀛�",
+          "conditionPlaceholder": "璇疯緭鍏ユ尝娆″崟鍙�/澶囨敞",
+          "code": "娉㈡鍗曞彿",
+          "codePlaceholder": "璇疯緭鍏ユ尝娆″崟鍙�",
+          "type": "娉㈡绫诲瀷",
+          "exceStatus": "娉㈡鐘舵��",
+          "status": "鐘舵��",
+          "memo": "澶囨敞",
+          "memoPlaceholder": "璇疯緭鍏ュ娉�",
+          "timeStart": "寮�濮嬫椂闂�",
+          "timeEnd": "缁撴潫鏃堕棿"
+        },
+        "status": {
+          "type": {
+            "0": "鎵嬪姩",
+            "1": "鑷姩"
+          },
+          "exceStatus": {
+            "0": "绛夊緟鎵ц",
+            "1": "姝e湪鎵ц",
+            "2": "鏆傚仠鎵ц",
+            "3": "鎵ц瀹屾垚"
+          }
+        },
+        "actions": {
+          "view": "鏌ョ湅璇︽儏",
+          "publicTask": "涓嬪彂浠诲姟",
+          "pause": "鏆傚仠",
+          "continue": "缁х画",
+          "stop": "缁堟",
+          "print": "鎵撳嵃"
+        },
+        "table": {
+          "code": "娉㈡鍗曞彿",
+          "type": "娉㈡绫诲瀷",
+          "exceStatus": "娉㈡鐘舵��",
+          "anfme": "搴旂洏鏁伴噺",
+          "workQty": "鎵ц鏁伴噺",
+          "qty": "宸茬洏鏁伴噺",
+          "orderNum": "鍗曟嵁鏁伴噺",
+          "progress": "杩涘害",
+          "createTime": "鍒涘缓鏃堕棿",
+          "updateTime": "鏇存柊鏃堕棿",
+          "status": "鐘舵��"
+        },
+        "preview": {
+          "waveCode": "娉㈡鍙�",
+          "orderCode": "鍗曟嵁缂栫爜",
+          "matnrCode": "鐗╂枡缂栫爜",
+          "maktx": "鐗╂枡鍚嶇О",
+          "batch": "鎵规",
+          "unit": "鍗曚綅",
+          "anfme": "搴旈厤鏁伴噺",
+          "workQty": "宸查厤鏁伴噺",
+          "stockQty": "搴撳瓨鏁伴噺",
+          "splrBatch": "渚涘簲鍟嗘壒娆�",
+          "stockLocs": "搴撲綅"
+        },
+        "detail": {
+          "title": "娉㈡鍗曡鎯�",
+          "code": "娉㈡鍗曞彿",
+          "type": "娉㈡绫诲瀷",
+          "exceStatus": "娉㈡鐘舵��",
+          "status": "鐘舵��",
+          "anfme": "搴旂洏鏁伴噺",
+          "workQty": "鎵ц鏁伴噺",
+          "qty": "宸茬洏鏁伴噺",
+          "orderNum": "鍗曟嵁鏁伴噺",
+          "groupQty": "鍝佺被鏁伴噺",
+          "targSite": "鐩爣浣嶇疆",
+          "stationId": "鎸囧畾绔欑偣",
+          "locCode": "鎸囧畾搴撲綅",
+          "createBy": "鍒涘缓浜�",
+          "createTime": "鍒涘缓鏃堕棿",
+          "updateBy": "鏇存柊浜�",
+          "updateTime": "鏇存柊鏃堕棿",
+          "memo": "澶囨敞",
+          "previewTitle": "娉㈡棰勮鏄庣粏 - 鐗╂枡缂栫爜"
+        },
+        "publicTask": {
+          "title": "娉㈡涓嬪彂浠诲姟",
+          "code": "娉㈡鍗曞彿",
+          "type": "娉㈡绫诲瀷",
+          "exceStatus": "娉㈡鐘舵��",
+          "workQty": "鎵ц鏁伴噺"
+        },
+        "messages": {
+          "pauseSuccess": "娉㈡宸叉殏鍋�",
+          "continueSuccess": "娉㈡宸茬户缁�",
+          "stopConfirm": "纭畾缁堟娉㈡鍗� {code} 鍚楋紵",
+          "stopTitle": "缁堟纭",
+          "stopSuccess": "娉㈡宸茬粓姝�",
+          "actionFailed": "娉㈡鎿嶄綔澶辫触",
+          "detailTimeout": "娉㈡鍗曡鎯呭姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�",
+          "previewTimeout": "娉㈡棰勮鏄庣粏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+          "publicTaskTimeout": "娉㈡涓嬪彂棰勮鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+          "publicTaskSuccess": "娉㈡宸蹭笅鍙�",
+          "publicTaskFailed": "娉㈡涓嬪彂澶辫触",
+          "publicTaskWarning": "娉㈡棰勮鏁版嵁涓嶅彲鐢紝璇峰厛妫�鏌ュ簱浣嶉厤缃�"
+        }
+      },
+      "waveItem": {
+        "reportTitle": "娉㈡鏄庣粏鎶ヨ〃",
+        "search": {
+          "condition": "鍏抽敭瀛�",
+          "conditionPlaceholder": "璇疯緭鍏ユ尝娆″崟鍙�/鐗╂枡缂栫爜/鐗╂枡鍚嶇О",
+          "waveCode": "娉㈡鍗曞彿",
+          "waveCodePlaceholder": "璇疯緭鍏ユ尝娆″崟鍙�",
+          "orderCode": "鍗曟嵁缂栫爜",
+          "orderCodePlaceholder": "璇疯緭鍏ュ崟鎹紪鐮�",
+          "matnrCode": "鐗╂枡缂栫爜",
+          "matnrCodePlaceholder": "璇疯緭鍏ョ墿鏂欑紪鐮�",
+          "maktx": "鐗╂枡鍚嶇О",
+          "maktxPlaceholder": "璇疯緭鍏ョ墿鏂欏悕绉�",
+          "batch": "鎵规",
+          "batchPlaceholder": "璇疯緭鍏ユ壒娆�",
+          "splrBatch": "渚涘簲鍟嗘壒娆�",
+          "splrBatchPlaceholder": "璇疯緭鍏ヤ緵搴斿晢鎵规",
+          "fieldsIndex": "鍔ㄦ�佸瓧娈电储寮�",
+          "fieldsIndexPlaceholder": "璇疯緭鍏ュ姩鎬佸瓧娈电储寮�",
+          "timeStart": "寮�濮嬫椂闂�",
+          "timeEnd": "缁撴潫鏃堕棿"
+        },
+        "status": {
+          "exceStatus": {
+            "0": "鏈墽琛�",
+            "1": "鎵ц涓�",
+            "2": "鏆傚仠",
+            "3": "宸蹭笅鍙�",
+            "4": "浠诲姟瀹屾垚"
+          }
+        },
+        "actions": {
+          "view": "鏌ョ湅璇︽儏"
+        },
+        "table": {
+          "waveCode": "娉㈡鍗曞彿",
+          "orderCode": "鍗曟嵁缂栫爜",
+          "matnrCode": "鐗╂枡缂栫爜",
+          "maktx": "鐗╂枡鍚嶇О",
+          "batch": "鎵规",
+          "splrBatch": "渚涘簲鍟嗘壒娆�",
+          "unit": "鍗曚綅",
+          "anfme": "搴旈厤鏁伴噺",
+          "workQty": "宸查厤鏁伴噺",
+          "stockQty": "搴撳瓨鏁伴噺",
+          "fieldsIndex": "鍔ㄦ�佸瓧娈电储寮�",
+          "exceStatus": "鎵ц鐘舵��",
+          "updateTime": "鏇存柊鏃堕棿",
+          "stockLocs": "搴撲綅"
+        },
+        "detail": {
+          "title": "娉㈡鏄庣粏璇︽儏",
+          "waveCode": "娉㈡鍗曞彿",
+          "orderCode": "鍗曟嵁缂栫爜",
+          "matnrCode": "鐗╂枡缂栫爜",
+          "maktx": "鐗╂枡鍚嶇О",
+          "batch": "鎵规",
+          "splrBatch": "渚涘簲鍟嗘壒娆�",
+          "unit": "鍗曚綅",
+          "fieldsIndex": "鍔ㄦ�佸瓧娈电储寮�",
+          "anfme": "搴旈厤鏁伴噺",
+          "workQty": "宸查厤鏁伴噺",
+          "stockQty": "搴撳瓨鏁伴噺",
+          "exceStatus": "鎵ц鐘舵��",
+          "createTime": "鍒涘缓鏃堕棿",
+          "updateTime": "鏇存柊鏃堕棿",
+          "stockLocs": "搴撲綅"
+        },
+        "messages": {
+          "detailTimeout": "娉㈡鏄庣粏璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟"
         }
       }
     },
@@ -1274,9 +2332,1325 @@
           "containerTypeTimeout": "瀹瑰櫒绫诲瀷閫夐」鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
           "useStatusTimeout": "浣跨敤鐘舵�侀�夐」鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟"
         }
+      },
+      "basContainer": {
+        "table": {
+          "containerType": "瀹瑰櫒绫诲瀷",
+          "code": "鍞竴缂栫爜",
+          "codeType": "鏉$爜绫诲瀷",
+          "areas": "鍙叆搴撳尯"
+        }
+      },
+      "companys": {
+        "title": "寰�鏉ヤ紒涓�",
+        "entity": "寰�鏉ヤ紒涓�",
+        "reportTitle": "寰�鏉ヤ紒涓氭姤琛�",
+        "buttons": {
+          "add": "鏂板浼佷笟"
+        },
+        "table": {
+          "code": "浼佷笟缂栫爜",
+          "name": "浼佷笟鍚嶇О",
+          "nameEn": "鑻辨枃鍒悕",
+          "briefCode": "鍔╄鐮�",
+          "type": "浼佷笟绫诲瀷",
+          "contact": "鑱旂郴浜�",
+          "tel": "鑱旂郴鐢佃瘽",
+          "email": "閭",
+          "postCode": "閭紪",
+          "province": "鐪佷唤",
+          "city": "鍩庡競",
+          "address": "鍦板潃"
+        },
+        "search": {
+          "conditionPlaceholder": "璇疯緭鍏ヤ紒涓氬悕绉�/缂栫爜/鑱旂郴浜�/鐢佃瘽",
+          "codePlaceholder": "璇疯緭鍏ヤ紒涓氱紪鐮�",
+          "namePlaceholder": "璇疯緭鍏ヤ紒涓氬悕绉�",
+          "nameEnPlaceholder": "璇疯緭鍏ヨ嫳鏂囧埆鍚�",
+          "briefCodePlaceholder": "璇疯緭鍏ュ姪璁扮爜",
+          "contactPlaceholder": "璇疯緭鍏ヨ仈绯讳汉",
+          "telPlaceholder": "璇疯緭鍏ヨ仈绯荤數璇�",
+          "emailPlaceholder": "璇疯緭鍏ラ偖绠�",
+          "postCodePlaceholder": "璇疯緭鍏ラ偖缂�",
+          "provincePlaceholder": "璇疯緭鍏ョ渷浠�",
+          "cityPlaceholder": "璇疯緭鍏ュ煄甯�",
+          "addressPlaceholder": "璇疯緭鍏ュ湴鍧�",
+          "memoPlaceholder": "璇疯緭鍏ュ娉�"
+        },
+        "placeholders": {
+          "code": "鐣欑┖灏嗚嚜鍔ㄧ敓鎴�",
+          "name": "璇疯緭鍏ヤ紒涓氬悕绉�",
+          "nameEn": "璇疯緭鍏ヨ嫳鏂囧埆鍚�",
+          "briefCode": "璇疯緭鍏ュ姪璁扮爜",
+          "type": "璇烽�夋嫨浼佷笟绫诲瀷",
+          "contact": "璇疯緭鍏ヨ仈绯讳汉",
+          "tel": "璇疯緭鍏ヨ仈绯荤數璇�",
+          "email": "璇疯緭鍏ラ偖绠�",
+          "postCode": "璇疯緭鍏ラ偖缂�",
+          "province": "璇疯緭鍏ョ渷浠�",
+          "city": "璇疯緭鍏ュ煄甯�",
+          "address": "璇疯緭鍏ュ湴鍧�",
+          "status": "璇烽�夋嫨鐘舵��",
+          "memo": "璇疯緭鍏ュ娉�"
+        },
+        "validation": {
+          "name": "璇疯緭鍏ヤ紒涓氬悕绉�",
+          "briefCode": "璇疯緭鍏ュ姪璁扮爜",
+          "type": "璇烽�夋嫨浼佷笟绫诲瀷"
+        },
+        "dialog": {
+          "titleCreate": "鏂板寰�鏉ヤ紒涓�",
+          "titleEdit": "缂栬緫寰�鏉ヤ紒涓�",
+          "titleDetail": "寰�鏉ヤ紒涓氳鎯�"
+        },
+        "detail": {
+          "sections": {
+            "basic": "鍩虹淇℃伅",
+            "audit": "瀹¤淇℃伅"
+          }
+        },
+        "messages": {
+          "detailTimeout": "寰�鏉ヤ紒涓氳鎯呭姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�",
+          "detailFailed": "鑾峰彇寰�鏉ヤ紒涓氳鎯呭け璐�",
+          "typeOptionsTimeout": "浼佷笟绫诲瀷鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟"
+        }
+      },
+      "contract": {
+        "table": {
+          "code": "鍚堝悓缂栫爜",
+          "name": "鍚堝悓鍚嶇О",
+          "projectName": "椤圭洰鍚嶇О"
+        }
+      },
+      "whMat": {
+        "title": "鐗╂枡",
+        "labels": {
+          "allMaterials": "鍏ㄩ儴鐗╂枡"
+        },
+        "search": {
+          "groupKeywordPlaceholder": "鎼滅储鐗╂枡鍒嗙粍",
+          "keyword": "鍏抽敭瀛�",
+          "keywordPlaceholder": "璇疯緭鍏ョ墿鏂欑紪鐮�/鐗╂枡鍚嶇О",
+          "condition": "鍏抽敭瀛�",
+          "conditionPlaceholder": "璇疯緭鍏ョ墿鏂欑紪鐮�/鐗╂枡鍚嶇О",
+          "code": "鐗╂枡缂栫爜",
+          "codePlaceholder": "璇疯緭鍏ョ墿鏂欑紪鐮�",
+          "name": "鐗╂枡鍚嶇О",
+          "namePlaceholder": "璇疯緭鍏ョ墿鏂欏悕绉�",
+          "spec": "瑙勬牸",
+          "specPlaceholder": "璇疯緭鍏ヨ鏍�",
+          "barcode": "鏉$爜",
+          "barcodePlaceholder": "璇疯緭鍏ユ潯鐮�"
+        },
+        "messages": {
+          "emptyGroups": "鏆傛棤鐗╂枡鍒嗙粍",
+          "groupTimeout": "鐗╂枡鍒嗙粍鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+          "groupLoadFailed": "鑾峰彇鐗╂枡鍒嗙粍澶辫触",
+          "listTimeout": "鐗╂枡鍒楄〃鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+          "listLoadFailed": "鑾峰彇鐗╂枡鍒楄〃澶辫触",
+          "detailTimeout": "鐗╂枡璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+          "detailLoadFailed": "鑾峰彇鐗╂枡璇︽儏澶辫触"
+        },
+        "table": {
+          "code": "鐗╂枡缂栫爜",
+          "name": "鐗╂枡鍚嶇О",
+          "groupName": "鐗╂枡鍒嗙粍",
+          "group": "鐗╂枡鍒嗙粍",
+          "barcode": "鏉$爜",
+          "spec": "瑙勬牸",
+          "model": "鍨嬪彿"
+        },
+        "detail": {
+          "title": "鐗╂枡璇︽儏",
+          "sections": {
+            "basic": "鍩虹淇℃伅",
+            "stock": "搴撳瓨淇℃伅",
+            "audit": "瀹¤淇℃伅",
+            "extend": "鎵╁睍淇℃伅"
+          },
+          "code": "鐗╂枡缂栫爜",
+          "name": "鐗╂枡鍚嶇О",
+          "groupName": "鐗╂枡鍒嗙粍",
+          "shipperName": "璐т富",
+          "shipper": "璐т富",
+          "barcode": "鏉$爜",
+          "spec": "瑙勬牸",
+          "model": "鍨嬪彿",
+          "color": "棰滆壊",
+          "size": "灏哄",
+          "description": "鎻忚堪",
+          "unit": "鍗曚綅",
+          "purUnit": "閲囪喘鍗曚綅",
+          "purchaseUnit": "閲囪喘鍗曚綅",
+          "stockUnit": "搴撳瓨鍗曚綅",
+          "stockLevel": "搴撳瓨绾у埆",
+          "flagLabelManage": "鏍囩绠$悊",
+          "flagCheck": "澶嶆牳绠$悊",
+          "safeQty": "瀹夊叏搴撳瓨",
+          "minQty": "鏈�灏忓簱瀛�",
+          "maxQty": "鏈�澶у簱瀛�",
+          "stagn": "鍛嗘粸澶╂暟",
+          "valid": "鏄惁鏈夋晥",
+          "validWarn": "鏈夋晥鏈熼璀�",
+          "baseUnit": "鍩虹鍗曚綅",
+          "useOrgName": "浣跨敤缁勭粐",
+          "erpClsId": "ERP鍒嗙被"
+        }
+      },
+      "warehouse": {
+        "table": {
+          "name": "浠撳簱鍚嶇О",
+          "code": "浠撳簱缂栫爜",
+          "factory": "鎵�灞炲伐鍘�",
+          "address": "浠撳簱鍦板潃"
+        }
+      },
+      "warehouseAreas": {
+        "title": "搴撳尯",
+        "entity": "搴撳尯",
+        "reportTitle": "搴撳尯鎶ヨ〃",
+        "search": {
+          "conditionPlaceholder": "璇疯緭鍏ュ簱鍖哄悕绉�/缂栫爜/澶囨敞",
+          "codePlaceholder": "璇疯緭鍏ュ簱鍖虹紪鐮�",
+          "namePlaceholder": "璇疯緭鍏ュ簱鍖哄悕绉�"
+        },
+        "placeholders": {
+          "warehouse": "璇烽�夋嫨浠撳簱",
+          "code": "璇疯緭鍏ュ簱鍖虹紪鐮�",
+          "name": "璇疯緭鍏ュ簱鍖哄悕绉�",
+          "type": "璇烽�夋嫨涓氬姟绫诲瀷",
+          "shipper": "璇烽�夋嫨璐т富",
+          "supplier": "璇烽�夋嫨渚涘簲鍟�",
+          "flagMinus": "璇烽�夋嫨鍏佽璐熷簱瀛�",
+          "flagLabelManage": "璇烽�夋嫨鏍囩绠$悊",
+          "flagMix": "璇烽�夋嫨鏀寔娣锋斁",
+          "status": "璇烽�夋嫨鐘舵��",
+          "memo": "璇疯緭鍏ュ娉�"
+        },
+        "validation": {
+          "warehouse": "璇烽�夋嫨浠撳簱",
+          "code": "璇疯緭鍏ュ簱鍖虹紪鐮�",
+          "name": "璇疯緭鍏ュ簱鍖哄悕绉�",
+          "type": "璇烽�夋嫨涓氬姟绫诲瀷",
+          "flagMinus": "璇烽�夋嫨鍏佽璐熷簱瀛�",
+          "flagMix": "璇烽�夋嫨鏀寔娣锋斁"
+        },
+        "dialog": {
+          "titleCreate": "鏂板搴撳尯",
+          "titleEdit": "缂栬緫搴撳尯"
+        },
+        "detail": {
+          "title": "搴撳尯璇︽儏",
+          "sections": {
+            "basic": "鍩虹淇℃伅",
+            "audit": "瀹¤淇℃伅"
+          }
+        },
+        "messages": {
+          "detailTimeout": "搴撳尯璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+          "detailFailed": "鑾峰彇搴撳尯璇︽儏澶辫触",
+          "companyOptionsTimeout": "寰�鏉ヤ紒涓氶�夐」鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+          "warehouseOptionsTimeout": "浠撳簱閫夐」鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+          "typeOptionsTimeout": "涓氬姟绫诲瀷鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟"
+        },
+        "table": {
+          "warehouseName": "浠撳簱",
+          "code": "搴撳尯缂栫爜",
+          "name": "搴撳尯鍚嶇О",
+          "type": "涓氬姟绫诲瀷",
+          "shipperName": "璐т富",
+          "supplierName": "渚涘簲鍟�",
+          "flagMix": "鏀寔娣锋斁",
+          "flagMinus": "鍏佽璐熷簱瀛�",
+          "flagLabelManage": "鏍囩绠$悊",
+          "sort": "鎺掑簭"
+        }
+      },
+      "deviceSite": {
+        "table": {
+          "type": "绔欑偣绫诲瀷",
+          "site": "浣滀笟绔欑偣",
+          "name": "鍚嶇О",
+          "target": "鐩爣绔欑偣",
+          "label": "绔欑偣鏍囩",
+          "deviceType": "璁惧绫诲瀷",
+          "deviceCode": "璁惧缂栧彿",
+          "deviceSite": "璁惧绔欑偣",
+          "channel": "宸烽亾",
+          "areaStart": "婧愬簱鍖�",
+          "areaEnd": "鐩爣搴撳尯"
+        }
+      },
+      "basStation": {
+        "table": {
+          "stationCode": "绔欑偣缂栫爜",
+          "stationName": "绔欑偣鍚嶇О",
+          "type": "绔欑偣绫诲瀷",
+          "useStatus": "浣跨敤鐘舵��",
+          "area": "鎵�灞炲簱鍖�",
+          "crossZoneArea": "鍙法鍖哄簱鍖�",
+          "containerTypes": "鍙叆瀹瑰櫒绫诲瀷",
+          "barcode": "鏉$爜",
+          "inAble": "鍙叆",
+          "outAble": "鍙嚭",
+          "isCrossZone": "鏄惁璺ㄥ尯",
+          "isWcs": "鏄惁WCS",
+          "autoTransfer": "鑷姩璋冩嫧"
+        }
+      },
+      "loc": {
+        "table": {
+          "code": "搴撲綅鍙�",
+          "warehouseName": "浠撳簱",
+          "areaName": "搴撳尯",
+          "typeIds": "搴撲綅绫诲瀷",
+          "row": "鎺�",
+          "col": "鍒�",
+          "lev": "灞�",
+          "channel": "宸烽亾",
+          "useStatus": "浣跨敤鐘舵��",
+          "flagLogic": "铏氭嫙搴撲綅",
+          "flagLabelManage": "鏍囩绠$悊",
+          "barcode": "瀹瑰櫒缂栫爜"
+        }
+      },
+      "taskPathTemplate": {
+        "actions": {
+          "flow": "娴佺▼鍥�"
+        },
+        "table": {
+          "templateCode": "妯℃澘缂栫爜",
+          "templateName": "妯℃澘鍚嶇О",
+          "sourceType": "璧风偣绫诲瀷",
+          "targetType": "缁堢偣绫诲瀷",
+          "conditionDesc": "鏉′欢鎻忚堪",
+          "version": "鐗堟湰鍙�",
+          "isCurrent": "褰撳墠鐗堟湰",
+          "effectiveTime": "鐢熸晥鏃堕棿",
+          "expireTime": "澶辨晥鏃堕棿",
+          "priority": "浼樺厛绾�",
+          "timeoutMinutes": "瓒呮椂(鍒�)",
+          "stepSize": "姝ュ簭闀垮害",
+          "maxRetryTimes": "鏈�澶ч噸璇�",
+          "retryIntervalSeconds": "閲嶈瘯闂撮殧(绉�)"
+        }
+      },
+      "taskPathTemplateNode": {
+        "table": {
+          "templateId": "妯℃澘ID",
+          "templateCode": "妯℃澘缂栫爜",
+          "nodeOrder": "鑺傜偣椤哄簭",
+          "nodeCode": "鑺傜偣缂栫爜",
+          "nodeName": "鑺傜偣鍚嶇О",
+          "nodeType": "鑺傜偣绫诲瀷",
+          "systemCode": "绯荤粺缂栫爜",
+          "systemName": "绯荤粺鍚嶇О",
+          "mandatory": "蹇呴』鑺傜偣",
+          "parallelExecutable": "鍙苟琛�",
+          "timeoutMinutes": "瓒呮椂(鍒�)"
+        }
+      },
+      "taskPathTemplateMerge": {
+        "table": {
+          "templateCode": "妯℃澘缂栫爜",
+          "templateName": "妯℃澘鍚嶇О",
+          "sourceType": "璧风偣绫诲瀷",
+          "targetType": "缁堢偣绫诲瀷",
+          "conditionExpression": "鏉′欢琛ㄨ揪寮�",
+          "conditionDesc": "鏉′欢鎻忚堪",
+          "version": "鐗堟湰鍙�",
+          "isCurrent": "褰撳墠鐗堟湰",
+          "effectiveTime": "鐢熸晥鏃堕棿",
+          "expireTime": "澶辨晥鏃堕棿",
+          "priority": "浼樺厛绾�",
+          "timeoutMinutes": "瓒呮椂(鍒�)",
+          "maxRetryTimes": "鏈�澶ч噸璇�",
+          "retryIntervalSeconds": "閲嶈瘯闂撮殧(绉�)",
+          "stepSize": "姝ュ簭闀垮害"
+        }
+      },
+      "locArea": {
+        "table": {
+          "area": "搴撳尯"
+        }
+      },
+      "locAreaMat": {
+        "table": {
+          "code": "閫昏緫缂栧彿",
+          "warehouseName": "浠撳簱",
+          "areaName": "搴撳尯",
+          "depict": "閫昏緫鎻忚堪"
+        }
+      },
+      "locAreaRela": {
+        "table": {
+          "locAreaId": "鍒嗗尯ID",
+          "locId": "搴撲綅ID"
+        }
+      },
+      "locAreaMatRela": {
+        "table": {
+          "areaMatId": "涓诲崟",
+          "areaId": "搴撳尯",
+          "code": "缂栧彿",
+          "matnrId": "鐗╂枡",
+          "groupId": "鐗╂枡鍒嗙粍",
+          "locTypeId": "搴撲綅绫诲瀷",
+          "locId": "搴撲綅",
+          "relationType": "鍏崇郴绫诲瀷"
+        }
+      },
+      "locType": {
+        "table": {
+          "uuid": "鏍囪瘑",
+          "regex": "鏉$爜瑙勫垯"
+        }
+      },
+      "matnrGroup": {
+        "table": {
+          "code": "鍒嗙粍缂栫爜",
+          "parentCode": "涓婄骇缂栫爜",
+          "name": "鍒嗙粍鍚嶇О"
+        }
+      },
+      "deviceBind": {
+        "table": {
+          "currentRow": "褰撳墠鎺掑彿",
+          "startRow": "璧峰鎺掑彿",
+          "endRow": "缁堟鎺掑彿",
+          "deviceQty": "璁惧鏁伴噺",
+          "startDeviceNo": "璧峰璁惧鍙�",
+          "endDeviceNo": "缁堟璁惧鍙�",
+          "staList": "绔欑偣鍒楄〃",
+          "typeId": "搴撳尯绫诲瀷",
+          "beSimilar": "鐗╂枡鐩镐技",
+          "emptySimilar": "绌烘澘闈犺繎"
+        }
+      },
+      "manager": {
+        "menuPda": {
+          "actions": {
+            "add": "娣诲姞PDA鑿滃崟"
+          },
+          "search": {
+            "name": "鑿滃崟鍚嶇О",
+            "namePlaceholder": "璇疯緭鍏ヨ彍鍗曞悕绉�",
+            "route": "璺敱鍦板潃",
+            "routePlaceholder": "璇疯緭鍏ヨ矾鐢卞湴鍧�"
+          },
+          "table": {
+            "name": "鑿滃崟鍚嶇О",
+            "iconPreview": "鍥炬爣棰勮",
+            "menuType": "鑿滃崟绫诲瀷"
+          },
+          "tree": {
+            "topLevel": "椤剁骇鑿滃崟"
+          },
+          "type": {
+            "menu": "鑿滃崟",
+            "button": "鎸夐挳",
+            "directory": "鐩綍"
+          },
+          "dialog": {
+            "titleAddMenu": "鏂板缓鑿滃崟",
+            "titleEditMenu": "缂栬緫鑿滃崟",
+            "titleAddButton": "鏂板缓鎸夐挳",
+            "titleEditButton": "缂栬緫鎸夐挳",
+            "menuType": "鑿滃崟绫诲瀷",
+            "parentMenu": "涓婄骇鑿滃崟",
+            "menuName": "鑿滃崟鍚嶇О",
+            "permissionName": "鏉冮檺鍚嶇О",
+            "route": "璺敱鍦板潃",
+            "component": "缁勪欢鏍囪瘑",
+            "authority": "鏉冮檺鏍囪瘑",
+            "icon": "鍥炬爣",
+            "sort": "鎺掑簭",
+            "status": "鐘舵��",
+            "placeholder": {
+              "parentMenu": "璇烽�夋嫨涓婄骇鑿滃崟",
+              "menuName": "璇疯緭鍏ヨ彍鍗曞悕绉�",
+              "permissionName": "璇疯緭鍏ユ潈闄愬悕绉�",
+              "route": "璇疯緭鍏ヨ矾鐢卞湴鍧�",
+              "component": "璇疯緭鍏ョ粍浠舵爣璇�",
+              "authority": "璇疯緭鍏ユ潈闄愭爣璇�",
+              "icon": "璇疯緭鍏ュ浘鏍囧悕绉�",
+              "status": "璇烽�夋嫨鐘舵��",
+              "memo": "璇疯緭鍏ュ娉�"
+            },
+            "validation": {
+              "menuName": "璇疯緭鍏ヨ彍鍗曞悕绉�",
+              "permissionName": "璇疯緭鍏ユ潈闄愬悕绉�",
+              "route": "璇疯緭鍏ヨ矾鐢卞湴鍧�",
+              "authority": "璇疯緭鍏ユ潈闄愭爣璇�"
+            }
+          },
+          "messages": {
+            "listTimeout": "PDA鑿滃崟鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+            "loadFailed": "鑾峰彇PDA鑿滃崟澶辫触",
+            "parentSelf": "涓婄骇鑿滃崟涓嶈兘閫夋嫨褰撳墠鑿滃崟",
+            "deleteConfirm": "纭畾瑕佸垹闄DA鑿滃崟銆寋title}銆嶅悧锛熷垹闄ゅ悗鏃犳硶鎭㈠"
+          }
+        }
+      }
+    },
+    "manager": {
+      "menuPda": {
+        "actions": {
+          "add": "娣诲姞PDA鑿滃崟"
+        },
+        "search": {
+          "name": "鑿滃崟鍚嶇О",
+          "namePlaceholder": "璇疯緭鍏ヨ彍鍗曞悕绉�",
+          "route": "璺敱鍦板潃",
+          "routePlaceholder": "璇疯緭鍏ヨ矾鐢卞湴鍧�"
+        },
+        "table": {
+          "name": "鑿滃崟鍚嶇О",
+          "iconPreview": "鍥炬爣棰勮",
+          "menuType": "鑿滃崟绫诲瀷"
+        },
+        "tree": {
+          "topLevel": "椤剁骇鑿滃崟"
+        },
+        "type": {
+          "menu": "鑿滃崟",
+          "button": "鎸夐挳",
+          "directory": "鐩綍"
+        },
+        "dialog": {
+          "titleAddMenu": "鏂板缓鑿滃崟",
+          "titleEditMenu": "缂栬緫鑿滃崟",
+          "titleAddButton": "鏂板缓鎸夐挳",
+          "titleEditButton": "缂栬緫鎸夐挳",
+          "menuType": "鑿滃崟绫诲瀷",
+          "parentMenu": "涓婄骇鑿滃崟",
+          "menuName": "鑿滃崟鍚嶇О",
+          "permissionName": "鏉冮檺鍚嶇О",
+          "route": "璺敱鍦板潃",
+          "component": "缁勪欢鏍囪瘑",
+          "authority": "鏉冮檺鏍囪瘑",
+          "icon": "鍥炬爣",
+          "sort": "鎺掑簭",
+          "status": "鐘舵��",
+          "placeholder": {
+            "parentMenu": "璇烽�夋嫨涓婄骇鑿滃崟",
+            "menuName": "璇疯緭鍏ヨ彍鍗曞悕绉�",
+            "permissionName": "璇疯緭鍏ユ潈闄愬悕绉�",
+            "route": "璇疯緭鍏ヨ矾鐢卞湴鍧�",
+            "component": "璇疯緭鍏ョ粍浠舵爣璇�",
+            "authority": "璇疯緭鍏ユ潈闄愭爣璇�",
+            "icon": "璇疯緭鍏ュ浘鏍囧悕绉�",
+            "status": "璇烽�夋嫨鐘舵��",
+            "memo": "璇疯緭鍏ュ娉�"
+          },
+          "validation": {
+            "menuName": "璇疯緭鍏ヨ彍鍗曞悕绉�",
+            "permissionName": "璇疯緭鍏ユ潈闄愬悕绉�",
+            "route": "璇疯緭鍏ヨ矾鐢卞湴鍧�",
+            "authority": "璇疯緭鍏ユ潈闄愭爣璇�"
+          }
+        },
+        "messages": {
+          "listTimeout": "PDA鑿滃崟鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+          "loadFailed": "鑾峰彇PDA鑿滃崟澶辫触",
+          "parentSelf": "涓婄骇鑿滃崟涓嶈兘閫夋嫨褰撳墠鑿滃崟",
+          "deleteConfirm": "纭畾瑕佸垹闄DA鑿滃崟銆寋title}銆嶅悧锛熷垹闄ゅ悗鏃犳硶鎭㈠"
+        }
+      },
+      "waveRule": {
+        "entity": "娉㈡绛栫暐",
+        "reportTitle": "娉㈡绛栫暐鎶ヨ〃",
+        "actions": {
+          "add": "鏂板娉㈡绛栫暐"
+        },
+        "table": {
+          "type": "绫诲瀷"
+        },
+        "search": {
+          "conditionPlaceholder": "璇疯緭鍏ョ紪鍙锋垨鍚嶇О",
+          "codePlaceholder": "璇疯緭鍏ョ紪鍙�",
+          "namePlaceholder": "璇疯緭鍏ョ瓥鐣ュ悕绉�"
+        },
+        "dialog": {
+          "titleCreate": "鏂板娉㈡绛栫暐",
+          "titleEdit": "缂栬緫娉㈡绛栫暐",
+          "validation": {
+            "type": "璇烽�夋嫨绛栫暐绫诲瀷",
+            "name": "璇疯緭鍏ョ瓥鐣ュ悕绉�"
+          },
+          "placeholder": {
+            "code": "鏂板鍚庤嚜鍔ㄧ敓鎴�",
+            "type": "璇烽�夋嫨绛栫暐绫诲瀷",
+            "name": "璇疯緭鍏ョ瓥鐣ュ悕绉�",
+            "status": "璇烽�夋嫨鐘舵��",
+            "memo": "璇疯緭鍏ュ娉�"
+          }
+        },
+        "detail": {
+          "title": "娉㈡绛栫暐璇︽儏"
+        },
+        "messages": {
+          "typeTimeout": "娉㈡绛栫暐绫诲瀷鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+          "detailFailed": "鑾峰彇娉㈡绛栫暐璇︽儏澶辫触"
+        }
+      },
+      "taskLog": {
+        "reportTitle": "浠诲姟鍘嗗彶妗f姤琛�",
+        "table": {
+          "taskCode": "浠诲姟鍙�",
+          "taskStatus": "浠诲姟鐘舵��",
+          "taskType": "浠诲姟绫诲瀷",
+          "orgLoc": "婧愬簱浣�",
+          "orgSite": "婧愮珯鐐�",
+          "targLoc": "鐩爣搴撲綅",
+          "targSite": "鐩爣绔欑偣",
+          "barcode": "鎵樼洏鐮�",
+          "robotCode": "鏈哄櫒浜虹紪鐮�",
+          "startTime": "寮�濮嬫椂闂�",
+          "endTime": "缁撴潫鏃堕棿"
+        },
+        "search": {
+          "conditionPlaceholder": "璇疯緭鍏ヤ换鍔″彿/鎵樼洏鐮�/鏈哄櫒浜虹紪鐮�",
+          "taskCodePlaceholder": "璇疯緭鍏ヤ换鍔″彿",
+          "orgLocPlaceholder": "璇疯緭鍏ユ簮搴撲綅",
+          "targLocPlaceholder": "璇疯緭鍏ョ洰鏍囧簱浣�",
+          "barcodePlaceholder": "璇疯緭鍏ユ墭鐩樼爜",
+          "robotCodePlaceholder": "璇疯緭鍏ユ満鍣ㄤ汉缂栫爜",
+          "timeStart": "寮�濮嬫棩鏈�",
+          "timeEnd": "缁撴潫鏃ユ湡"
+        },
+        "detail": {
+          "title": "浠诲姟鍘嗗彶妗h鎯�",
+          "taskId": "浠诲姟ID",
+          "exceStatus": "鎵ц鐘舵��",
+          "sort": "浼樺厛绾�",
+          "expDesc": "寮傚父鎻忚堪",
+          "expCode": "寮傚父缂栫爜"
+        }
+      },
+      "inStatisticItem": {
+        "title": "鍏ュ簱缁熻鏄庣粏",
+        "table": {
+          "dayTime": "缁熻鏃ユ湡",
+          "locCode": "搴撲綅",
+          "matnrCode": "鐗╂枡缂栫爜",
+          "maktx": "鐗╂枡鍚嶇О",
+          "anfme": "鏁伴噺",
+          "batch": "鎵规",
+          "barcode": "鎵樼洏鐮�"
+        },
+        "search": {
+          "condition": "鍏抽敭瀛�",
+          "conditionPlaceholder": "璇疯緭鍏ョ墿鏂欏悕绉�/缂栫爜/鎵规",
+          "dayTime": "缁熻鏃ユ湡",
+          "maktx": "鐗╂枡鍚嶇О",
+          "maktxPlaceholder": "璇疯緭鍏ョ墿鏂欏悕绉�",
+          "matnrCode": "鐗╂枡缂栫爜",
+          "matnrCodePlaceholder": "璇疯緭鍏ョ墿鏂欑紪鐮�",
+          "batch": "鎵规",
+          "batchPlaceholder": "璇疯緭鍏ユ壒娆�"
+        },
+        "detail": {
+          "title": "{title}璇︽儏",
+          "taskType": "浠诲姟绫诲瀷",
+          "taskStatus": "浠诲姟鐘舵��",
+          "fieldsIndex": "绱㈠紩"
+        }
+      },
+      "freeze": {
+        "table": {
+          "locCode": "搴撲綅缂栫爜",
+          "wareArea": "搴撳尯",
+          "matnrCode": "鐗╂枡缂栫爜",
+          "maktx": "鐗╂枡鍚嶇О",
+          "batch": "鎵规",
+          "trackCode": "杩借釜鐮�",
+          "anfme": "鍙敤鏁伴噺",
+          "qty": "搴撳瓨鏁伴噺",
+          "workQty": "鎵ц涓暟閲�"
+        },
+        "search": {
+          "condition": "鍏抽敭瀛�",
+          "conditionPlaceholder": "璇疯緭鍏ュ簱浣嶇紪鐮�/鐗╂枡缂栫爜",
+          "locCode": "搴撲綅缂栫爜",
+          "locCodePlaceholder": "璇疯緭鍏ュ簱浣嶇紪鐮�",
+          "matnrCode": "鐗╂枡缂栫爜",
+          "matnrCodePlaceholder": "璇疯緭鍏ョ墿鏂欑紪鐮�",
+          "maktx": "鐗╂枡鍚嶇О",
+          "maktxPlaceholder": "璇疯緭鍏ョ墿鏂欏悕绉�",
+          "batch": "鎵规",
+          "batchPlaceholder": "璇疯緭鍏ユ壒娆�",
+          "trackCode": "杩借釜鐮�",
+          "trackCodePlaceholder": "璇疯緭鍏ヨ拷韪爜",
+          "dynamicPlaceholder": "璇疯緭鍏label}"
+        },
+        "detail": {
+          "title": "鍐荤粨搴撳瓨璇︽儏"
+        },
+        "messages": {
+          "fieldsTimeout": "鎵╁睍瀛楁鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+          "pageTimeout": "鍐荤粨搴撳瓨鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+          "detailTimeout": "鍐荤粨搴撳瓨璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟"
+        }
+      },
+      "locItem": {
+        "table": {
+          "locId": "搴撲綅ID",
+          "wareArea": "搴撳尯",
+          "locCode": "搴撲綅缂栫爜",
+          "type": "涓氬姟绫诲瀷",
+          "wkType": "宸ヤ綅绫诲瀷",
+          "orderId": "鍗曟嵁ID",
+          "orderItemId": "鍗曟嵁鏄庣粏ID",
+          "matnrId": "鐗╂枡ID",
+          "matnrCode": "鐗╂枡缂栫爜",
+          "maktx": "鐗╂枡鍚嶇О",
+          "spec": "瑙勬牸",
+          "model": "鍨嬪彿",
+          "batch": "鎵规",
+          "trackCode": "杩借釜鐮�",
+          "anfme": "鍙敤鏁伴噺",
+          "qty": "搴撳瓨鏁伴噺",
+          "workQty": "鎵ц涓暟閲�"
+        },
+        "search": {
+          "condition": "鍏抽敭瀛�",
+          "conditionPlaceholder": "璇疯緭鍏ュ簱浣嶇紪鐮�/鐗╂枡缂栫爜/杩借釜鐮�",
+          "timeStart": "寮�濮嬫棩鏈�",
+          "timeEnd": "缁撴潫鏃ユ湡",
+          "locId": "搴撲綅ID",
+          "locIdPlaceholder": "璇疯緭鍏ュ簱浣岻D",
+          "orderId": "鍗曟嵁ID",
+          "orderIdPlaceholder": "璇疯緭鍏ュ崟鎹甀D",
+          "type": "涓氬姟绫诲瀷",
+          "typePlaceholder": "璇疯緭鍏ヤ笟鍔$被鍨�",
+          "wkType": "宸ヤ綅绫诲瀷",
+          "wkTypePlaceholder": "璇疯緭鍏ュ伐浣嶇被鍨�",
+          "matnrCode": "鐗╂枡缂栫爜",
+          "matnrCodePlaceholder": "璇疯緭鍏ョ墿鏂欑紪鐮�",
+          "maktx": "鐗╂枡鍚嶇О",
+          "maktxPlaceholder": "璇疯緭鍏ョ墿鏂欏悕绉�",
+          "trackCode": "杩借釜鐮�",
+          "trackCodePlaceholder": "璇疯緭鍏ヨ拷韪爜",
+          "batch": "鎵规",
+          "batchPlaceholder": "璇疯緭鍏ユ壒娆�",
+          "splrBatch": "渚涘簲鍟嗘壒娆�",
+          "splrBatchPlaceholder": "璇疯緭鍏ヤ緵搴斿晢鎵规"
+        },
+        "detail": {
+          "title": "搴撳瓨鏄庣粏璇︽儏",
+          "extendFields": "鎵╁睍瀛楁",
+          "emptyExtendFields": "鏆傛棤鎵╁睍瀛楁"
+        },
+        "messages": {
+          "pageTimeout": "搴撳瓨鏄庣粏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+          "detailFailed": "鑾峰彇搴撳瓨鏄庣粏璇︽儏澶辫触",
+          "fieldsTimeout": "鎵╁睍瀛楁鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟"
+        }
+      },
+      "locPreview": {
+        "search": {
+          "condition": "鍏抽敭瀛�",
+          "conditionPlaceholder": "璇疯緭鍏ュ簱浣嶇紪鐮�/鏉$爜",
+          "code": "搴撲綅缂栫爜",
+          "codePlaceholder": "璇疯緭鍏ュ簱浣嶇紪鐮�",
+          "barcode": "鏉$爜",
+          "barcodePlaceholder": "璇疯緭鍏ユ潯鐮�"
+        },
+        "table": {
+          "locCode": "搴撲綅缂栫爜",
+          "warehouseLabel": "浠撳簱",
+          "areaLabel": "搴撳尯",
+          "typeLabel": "搴撲綅绫诲瀷",
+          "barcode": "鏉$爜",
+          "useStatusLabel": "浣跨敤鐘舵��",
+          "row": "鎺�",
+          "col": "鍒�",
+          "lev": "灞�",
+          "channel": "宸烽亾"
+        },
+        "detail": {
+          "title": "搴撲綅璇︽儏",
+          "stockItems": "搴撳瓨鏄庣粏"
+        },
+        "messages": {
+          "fieldsTimeout": "鎵╁睍瀛楁鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+          "pageTimeout": "搴撲綅鏄庣粏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+          "detailTimeout": "搴撲綅璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+          "itemPageTimeout": "搴撲綅搴撳瓨鏄庣粏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟"
+        }
       }
     },
     "system": {
+      "config": {
+        "title": "閰嶇疆绠$悊",
+        "entity": "閰嶇疆",
+        "buttons": {
+          "add": "鏂板閰嶇疆"
+        },
+        "table": {
+          "flag": "鏍囪瘑",
+          "type": "绫诲瀷",
+          "value": "鍊�",
+          "content": "鏂囨湰"
+        },
+        "search": {
+          "conditionPlaceholder": "璇疯緭鍏ラ厤缃悕绉�",
+          "flagPlaceholder": "璇疯緭鍏ラ厤缃爣璇�"
+        },
+        "types": {
+          "boolean": "甯冨皵鍊�",
+          "number": "鏁板瓧",
+          "string": "瀛楃涓�",
+          "json": "JSON",
+          "date": "鏃ユ湡"
+        },
+        "placeholders": {
+          "uuid": "鏂板鍚庤嚜鍔ㄧ敓鎴�",
+          "name": "璇疯緭鍏ラ厤缃悕绉�",
+          "flag": "璇疯緭鍏ラ厤缃爣璇�",
+          "type": "璇烽�夋嫨绫诲瀷",
+          "value": "璇疯緭鍏ラ厤缃��",
+          "content": "璇疯緭鍏ラ厤缃枃鏈�",
+          "status": "璇烽�夋嫨鐘舵��",
+          "memo": "璇疯緭鍏ュ娉�"
+        },
+        "validation": {
+          "name": "璇疯緭鍏ラ厤缃悕绉�",
+          "flag": "璇疯緭鍏ラ厤缃爣璇�"
+        },
+        "dialog": {
+          "titleCreate": "鏂板閰嶇疆",
+          "titleEdit": "缂栬緫閰嶇疆",
+          "titleDetail": "閰嶇疆璇︽儏"
+        },
+        "messages": {
+          "detailFailed": "鑾峰彇閰嶇疆璇︽儏澶辫触"
+        }
+      },
+      "dictType": {
+        "title": "鏁版嵁瀛楀吀",
+        "entity": "鏁版嵁瀛楀吀",
+        "buttons": {
+          "add": "鏂板鏁版嵁瀛楀吀"
+        },
+        "search": {
+          "conditionPlaceholder": "璇疯緭鍏ョ紪鐮佹垨鍚嶇О",
+          "codePlaceholder": "璇疯緭鍏ュ瓧鍏哥紪鐮�",
+          "namePlaceholder": "璇疯緭鍏ュ瓧鍏稿悕绉�"
+        },
+        "table": {
+          "description": "鎻忚堪"
+        },
+        "placeholders": {
+          "code": "璇疯緭鍏ュ瓧鍏哥紪鐮�",
+          "name": "璇疯緭鍏ュ瓧鍏稿悕绉�",
+          "status": "璇烽�夋嫨鐘舵��",
+          "description": "璇疯緭鍏ュ瓧鍏告弿杩�",
+          "memo": "璇疯緭鍏ュ娉�"
+        },
+        "validation": {
+          "code": "璇疯緭鍏ュ瓧鍏哥紪鐮�",
+          "name": "璇疯緭鍏ュ瓧鍏稿悕绉�"
+        },
+        "dialog": {
+          "titleCreate": "鏂板鏁版嵁瀛楀吀",
+          "titleEdit": "缂栬緫鏁版嵁瀛楀吀",
+          "titleDetail": "鏁版嵁瀛楀吀璇︽儏"
+        },
+        "messages": {
+          "detailFailed": "鑾峰彇鏁版嵁瀛楀吀璇︽儏澶辫触"
+        }
+      },
+      "dept": {
+        "title": "閮ㄩ棬绠$悊",
+        "entity": "閮ㄩ棬",
+        "buttons": {
+          "add": "鏂板閮ㄩ棬"
+        },
+        "table": {
+          "parent": "涓婄骇閮ㄩ棬",
+          "name": "閮ㄩ棬鍚嶇О",
+          "fullName": "閮ㄩ棬鍏ㄧО",
+          "leader": "璐熻矗浜�"
+        },
+        "search": {
+          "conditionPlaceholder": "璇疯緭鍏ラ儴闂ㄥ悕绉�"
+        },
+        "placeholders": {
+          "parentId": "璇烽�夋嫨涓婄骇閮ㄩ棬",
+          "name": "璇疯緭鍏ラ儴闂ㄥ悕绉�",
+          "fullName": "璇疯緭鍏ラ儴闂ㄥ叏绉�",
+          "leader": "璇疯緭鍏ヨ礋璐d汉",
+          "status": "璇烽�夋嫨鐘舵��",
+          "memo": "璇疯緭鍏ュ娉�"
+        },
+        "validation": {
+          "name": "璇疯緭鍏ラ儴闂ㄥ悕绉�"
+        },
+        "dialog": {
+          "titleCreate": "鏂板閮ㄩ棬",
+          "titleEdit": "缂栬緫閮ㄩ棬"
+        },
+        "messages": {
+          "pageTimeout": "閮ㄩ棬鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+          "detailFailed": "鑾峰彇閮ㄩ棬璇︽儏澶辫触",
+          "parentSelfInvalid": "涓婄骇閮ㄩ棬涓嶈兘閫夋嫨褰撳墠閮ㄩ棬"
+        }
+      },
+      "userLogin": {
+        "title": "鐧诲綍鏃ュ織",
+        "search": {
+          "token": "Token",
+          "tokenPlaceholder": "璇疯緭鍏� token",
+          "ip": "IP",
+          "ipPlaceholder": "璇疯緭鍏� IP",
+          "system": "绯荤粺",
+          "systemPlaceholder": "璇疯緭鍏ョ郴缁熸爣璇�",
+          "type": "绫诲瀷",
+          "typePlaceholder": "璇烽�夋嫨绫诲瀷"
+        },
+        "table": {
+          "user": "鐢ㄦ埛",
+          "token": "Token",
+          "ip": "IP",
+          "system": "绯荤粺"
+        },
+        "types": {
+          "loginSuccess": "鐧诲綍鎴愬姛",
+          "loginFailed": "鐧诲綍澶辫触",
+          "logout": "閫�鍑虹櫥褰�",
+          "tokenRenew": "token 缁"
+        }
+      },
+      "operationRecord": {
+        "title": "鎿嶄綔鏃ュ織",
+        "entity": "鎿嶄綔鏃ュ織",
+        "reportTitle": "鎿嶄綔鏃ュ織鎶ヨ〃",
+        "search": {
+          "conditionPlaceholder": "璇疯緭鍏ュ悕绉扮┖闂�",
+          "urlPlaceholder": "璇疯緭鍏ユ帴鍙e湴鍧�",
+          "clientIpPlaceholder": "璇疯緭鍏ュ鎴风IP",
+          "timeStart": "寮�濮嬫棩鏈�",
+          "timeEnd": "缁撴潫鏃ユ湡"
+        },
+        "table": {
+          "namespace": "鍚嶇О绌洪棿",
+          "url": "鎺ュ彛鍦板潃",
+          "user": "鎿嶄綔鐢ㄦ埛",
+          "clientIp": "瀹㈡埛绔疘P",
+          "spendTime": "鑰楁椂(ms)",
+          "result": "缁撴灉",
+          "timestamp": "鎿嶄綔鏃堕棿"
+        },
+        "result": {
+          "success": "鎴愬姛",
+          "failed": "澶辫触"
+        },
+        "detail": {
+          "appkey": "骞冲彴瀵嗛挜",
+          "error": "寮傚父淇℃伅",
+          "request": "璇锋眰鍐呭",
+          "response": "鍝嶅簲鍐呭"
+        },
+        "dialog": {
+          "titleDetail": "鎿嶄綔鏃ュ織璇︽儏"
+        },
+        "messages": {
+          "detailFailed": "鑾峰彇鎿嶄綔鏃ュ織璇︽儏澶辫触"
+        }
+      },
+      "aiParam": {
+        "title": "AI 鍙傛暟",
+        "subtitle": "鎸夊崱鐗囩鐞嗗綋鍓嶇敤鎴风殑妯″瀷鎺ュ叆鍙傛暟涓庨粯璁ら厤缃��",
+        "entity": "AI 鍙傛暟",
+        "reportTitle": "AI 鍙傛暟鎶ヨ〃",
+        "empty": "鏆傛棤 AI 鍙傛暟",
+        "buttons": {
+          "add": "鏂板缓鍙傛暟"
+        },
+        "actions": {
+          "setDefault": "璁句负榛樿"
+        },
+        "fields": {
+          "baseUrl": "鍩虹鍦板潃",
+          "lastValidateTime": "鏈�杩戞牎楠�",
+          "timeoutMs": "瓒呮椂鏃堕棿",
+          "streamingEnabled": "娴佸紡鍝嶅簲",
+          "maxTokens": "鏈�澶� Token"
+        },
+        "search": {
+          "condition": "鍏抽敭瀛�",
+          "conditionPlaceholder": "璇疯緭鍏ュ弬鏁板悕绉�",
+          "providerType": "鎻愪緵鏂�",
+          "providerTypePlaceholder": "璇疯緭鍏ユ彁渚涙柟绫诲瀷",
+          "model": "妯″瀷",
+          "modelPlaceholder": "璇疯緭鍏ユā鍨嬪悕绉�",
+          "status": "榛樿鐘舵��"
+        },
+        "status": {
+          "default": "榛樿",
+          "candidate": "鍊欓��"
+        },
+        "validation": {
+          "valid": "宸叉牎楠�",
+          "invalid": "寮傚父",
+          "notTested": "鏈牎楠�"
+        },
+        "streaming": {
+          "enabled": "娴佸紡鍝嶅簲",
+          "disabled": "闈炴祦寮�"
+        },
+        "table": {
+          "name": "鍙傛暟鍚嶇О",
+          "providerType": "鎻愪緵鏂圭被鍨�",
+          "model": "妯″瀷鍚嶇О",
+          "status": "榛樿鐘舵��",
+          "validateStatus": "鏍¢獙鐘舵��",
+          "timeoutMs": "瓒呮椂鏃堕棿"
+        },
+        "summary": {
+          "title": "杩愯鏃舵憳瑕�",
+          "subtitle": "褰撳墠鐢熸晥鐨勬ā鍨嬨�丳rompt 涓� MCP 鎸傝浇姒傚喌",
+          "refresh": "鍒锋柊鎽樿",
+          "activeModel": "褰撳墠妯″瀷",
+          "activePrompt": "褰撳墠 Prompt",
+          "lastPromptUpdate": "鏈�杩戞洿鏂版椂闂� {value}",
+          "enabledMcp": "宸插惎鐢� MCP",
+          "enabledMcpCount": "{count} 涓�",
+          "noMcp": "鏆傛棤鎸傝浇"
+        },
+        "dialog": {
+          "titleCreate": "鏂板缓 AI 鍙傛暟",
+          "titleEdit": "缂栬緫 AI 鍙傛暟",
+          "titleDetail": "AI 鍙傛暟璇︽儏",
+          "runtimeTitle": "杩愯鏃剁姸鎬�",
+          "runtimeDescription": "淇濆瓨鍓嶅彲鍏堟墽琛岃崏绋挎牎楠岋紝杩愯鏃剁姸鎬佺敱鍚庣鐪熷疄杩斿洖銆�",
+          "validateDraft": "鑽夌鏍¢獙",
+          "labels": {
+            "validateStatus": "鏍¢獙鐘舵��",
+            "lastValidateElapsedMs": "鏈�杩戞牎楠岃�楁椂",
+            "lastValidateTime": "鏈�杩戞牎楠屾椂闂�",
+            "updateBy": "鏈�杩戞洿鏂颁汉",
+            "updateTime": "鏈�杩戞洿鏂版椂闂�",
+            "lastValidateMessage": "鏈�杩戞牎楠屼俊鎭�",
+            "name": "鍙傛暟鍚嶇О",
+            "providerType": "鎻愪緵鏂圭被鍨�",
+            "baseUrl": "鍩虹鍦板潃",
+            "apiKey": "API Key",
+            "model": "妯″瀷鍚嶇О",
+            "temperature": "Temperature",
+            "topP": "Top P",
+            "maxTokens": "鏈�澶� Token",
+            "timeoutMs": "瓒呮椂鏃堕棿(ms)",
+            "streamingEnabled": "娴佸紡鍝嶅簲",
+            "status": "榛樿鐘舵��",
+            "memo": "澶囨敞"
+          },
+          "placeholders": {
+            "name": "璇疯緭鍏ュ弬鏁板悕绉�",
+            "providerType": "璇烽�夋嫨鎻愪緵鏂圭被鍨�",
+            "baseUrl": "璇疯緭鍏ュ吋瀹� OpenAI 鐨勫熀纭�鍦板潃",
+            "apiKey": "璇疯緭鍏� API Key",
+            "model": "璇疯緭鍏ユā鍨嬪悕绉�",
+            "temperature": "璇疯緭鍏� temperature",
+            "topP": "璇疯緭鍏� topP",
+            "maxTokens": "璇疯緭鍏ユ渶澶� token",
+            "timeoutMs": "璇疯緭鍏ヨ秴鏃舵椂闂�",
+            "status": "璇烽�夋嫨榛樿鐘舵��",
+            "memo": "璇疯緭鍏ュ娉�"
+          },
+          "validation": {
+            "name": "璇疯緭鍏ュ弬鏁板悕绉�",
+            "providerType": "璇烽�夋嫨鎻愪緵鏂圭被鍨�",
+            "baseUrl": "璇疯緭鍏ュ熀纭�鍦板潃",
+            "apiKey": "璇疯緭鍏� API Key",
+            "model": "璇疯緭鍏ユā鍨嬪悕绉�"
+          }
+        },
+        "messages": {
+          "setDefaultSuccess": "榛樿鍙傛暟宸叉洿鏂�",
+          "summaryTimeout": "杩愯鏃舵憳瑕佸姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�",
+          "summaryUnavailable": "杩愯鏃舵憳瑕佹殏涓嶅彲鐢�"
+        }
+      },
+      "aiPrompt": {
+        "title": "Prompt 绠$悊",
+        "subtitle": "鎸夊崱鐗囩淮鎶ょ郴缁熸彁绀鸿瘝妯℃澘涓庡満鏅寲鐢ㄦ埛鎻愮ず璇嶃��",
+        "entity": "Prompt",
+        "reportTitle": "Prompt 绠$悊鎶ヨ〃",
+        "empty": "鏆傛棤 Prompt",
+        "buttons": {
+          "add": "鏂板缓 Prompt"
+        },
+        "fields": {
+          "sceneTag": "鍦烘櫙 {value}",
+          "systemPrompt": "绯荤粺鎻愮ず璇�",
+          "userPromptTemplate": "鐢ㄦ埛鎻愮ず璇嶆ā鏉�"
+        },
+        "search": {
+          "condition": "鍏抽敭瀛�",
+          "conditionPlaceholder": "璇疯緭鍏� Prompt 鍚嶇О",
+          "code": "Prompt 缂栫爜",
+          "codePlaceholder": "璇疯緭鍏� Prompt 缂栫爜",
+          "scene": "鍦烘櫙鏍囪瘑",
+          "scenePlaceholder": "璇疯緭鍏ュ満鏅爣璇�",
+          "status": "鐘舵��"
+        },
+        "table": {
+          "name": "Prompt 鍚嶇О",
+          "code": "Prompt 缂栫爜",
+          "scene": "鍦烘櫙鏍囪瘑",
+          "status": "鐘舵��",
+          "systemPrompt": "绯荤粺鎻愮ず璇�",
+          "userPromptTemplate": "鐢ㄦ埛鎻愮ず璇嶆ā鏉�"
+        },
+        "dialog": {
+          "titleCreate": "鏂板缓 Prompt",
+          "titleEdit": "缂栬緫 Prompt",
+          "titleDetail": "Prompt 璇︽儏",
+          "defaultPreviewInput": "璇锋牴鎹綋鍓嶈緭鍏ョ粰鍑烘憳瑕�",
+          "previewTitle": "娓叉煋棰勮",
+          "previewDescription": "杈撳叆绀轰緥鍐呭鍜� metadata锛岀洿鎺ラ瑙堟渶缁堟覆鏌撶粨鏋溿��",
+          "previewAction": "娓叉煋棰勮",
+          "previewResolvedVariables": "宸茶В鏋愬彉閲忥細{value}",
+          "previewNoVariables": "鏃�",
+          "runtimeTitle": "杩愯鏃剁姸鎬�",
+          "labels": {
+            "updateBy": "鏈�杩戞洿鏂颁汉",
+            "updateTime": "鏈�杩戞洿鏂版椂闂�",
+            "name": "Prompt 鍚嶇О",
+            "code": "Prompt 缂栫爜",
+            "scene": "鍦烘櫙鏍囪瘑",
+            "systemPrompt": "绯荤粺鎻愮ず璇�",
+            "userPromptTemplate": "鐢ㄦ埛鎻愮ず璇嶆ā鏉�",
+            "status": "鐘舵��",
+            "memo": "澶囨敞"
+          },
+          "placeholders": {
+            "previewInput": "璇疯緭鍏ョず渚嬭緭鍏ュ唴瀹�",
+            "metadata": "璇疯緭鍏� JSON metadata锛屼緥濡� {\"path\":\"/system/aiPrompt\"}",
+            "renderedSystemPrompt": "绯荤粺鎻愮ず璇嶆覆鏌撶粨鏋�",
+            "renderedUserPrompt": "鐢ㄦ埛鎻愮ず璇嶆覆鏌撶粨鏋�",
+            "name": "璇疯緭鍏� Prompt 鍚嶇О",
+            "code": "璇疯緭鍏� Prompt 缂栫爜",
+            "scene": "璇疯緭鍏ュ満鏅爣璇�",
+            "systemPrompt": "璇疯緭鍏ョ郴缁熸彁绀鸿瘝",
+            "userPromptTemplate": "璇疯緭鍏ョ敤鎴锋彁绀鸿瘝妯℃澘",
+            "status": "璇烽�夋嫨鐘舵��",
+            "memo": "璇疯緭鍏ュ娉�"
+          },
+          "validation": {
+            "name": "璇疯緭鍏� Prompt 鍚嶇О",
+            "code": "璇疯緭鍏� Prompt 缂栫爜",
+            "scene": "璇疯緭鍏ュ満鏅爣璇�",
+            "systemPrompt": "璇疯緭鍏ョ郴缁熸彁绀鸿瘝",
+            "userPromptTemplate": "璇疯緭鍏ョ敤鎴锋彁绀鸿瘝妯℃澘"
+          }
+        },
+        "messages": {
+          "previewFailed": "娓叉煋棰勮澶辫触"
+        }
+      },
+      "aiMcpMount": {
+        "title": "MCP 鎸傝浇",
+        "subtitle": "缁存姢褰撳墠鐜鐨� MCP 鏈嶅姟鎸傝浇涓庡仴搴风姸鎬併��",
+        "entity": "MCP 鎸傝浇",
+        "empty": "鏆傛棤 MCP 鎸傝浇",
+        "buttons": {
+          "add": "鏂板鎸傝浇"
+        },
+        "fields": {
+          "target": "鐩爣",
+          "lastTestTime": "鏈�杩戞祴璇曟椂闂�",
+          "timeoutMs": "璇锋眰瓒呮椂",
+          "lastInitElapsedMs": "鏈�杩戝垵濮嬪寲鑰楁椂"
+        },
+        "search": {
+          "condition": "鍏抽敭瀛�",
+          "conditionPlaceholder": "璇疯緭鍏ユ寕杞藉悕绉�",
+          "transportType": "浼犺緭绫诲瀷",
+          "status": "鐘舵��"
+        },
+        "actions": {
+          "connectivityTest": "杩為�氭�ф祴璇�",
+          "toolsPreview": "宸ュ叿棰勮"
+        },
+        "health": {
+          "healthy": "鍋ュ悍",
+          "unhealthy": "寮傚父",
+          "notTested": "鏈祴璇�"
+        },
+        "groups": {
+          "builtin": {
+            "title": "鍐呯疆鎸傝浇",
+            "description": "骞冲彴鍐呯疆鐨� MCP 鑳藉姏闆嗗悎銆�"
+          },
+          "sse": {
+            "title": "SSE / HTTP 鎸傝浇",
+            "description": "閫氳繃 HTTP/SSE 鍗忚鎺ュ叆鐨勮繙绋� MCP 鏈嶅姟銆�"
+          },
+          "stdio": {
+            "title": "STDIO 鎸傝浇",
+            "description": "閫氳繃鍛戒护琛岃繘绋嬪惎鍔ㄥ苟閫氫俊鐨� MCP 鏈嶅姟銆�"
+          }
+        },
+        "dialog": {
+          "titleCreate": "鏂板 MCP 鎸傝浇",
+          "titleEdit": "缂栬緫 MCP 鎸傝浇",
+          "titleDetail": "MCP 鎸傝浇璇︽儏",
+          "runtimeTitle": "杩愯鏃剁姸鎬�",
+          "draftTestTitle": "鑽夌杩為�氭�ф祴璇�",
+          "draftTestDescription": "淇濆瓨鍓嶅彲鍏堢敤褰撳墠琛ㄥ崟閰嶇疆鍋氳崏绋胯繛閫氭�ф祴璇曘��",
+          "draftTestAction": "娴嬭瘯褰撳墠閰嶇疆",
+          "runtimeLabels": {
+            "healthStatus": "鍋ュ悍鐘舵��",
+            "lastTestTime": "鏈�杩戞祴璇曟椂闂�",
+            "lastTestMessage": "鏈�杩戞祴璇曚俊鎭�",
+            "lastInitElapsedMs": "鏈�杩戝垵濮嬪寲鑰楁椂",
+            "updateTime": "鏈�杩戞洿鏂版椂闂�"
+          },
+          "labels": {
+            "name": "鎸傝浇鍚嶇О",
+            "transportType": "浼犺緭绫诲瀷",
+            "status": "鐘舵��",
+            "serverUrl": "鏈嶅姟鍦板潃",
+            "endpoint": "SSE/HTTP 璺緞",
+            "command": "鍚姩鍛戒护",
+            "argsJson": "鍛戒护鍙傛暟(JSON)",
+            "envJson": "鐜鍙橀噺(JSON)",
+            "headersJson": "璇锋眰澶�(JSON)",
+            "builtinCode": "鍐呯疆鑳藉姏缂栫爜",
+            "requestTimeoutMs": "璇锋眰瓒呮椂(ms)",
+            "sort": "鎺掑簭",
+            "memo": "澶囨敞"
+          },
+          "placeholders": {
+            "name": "璇疯緭鍏ユ寕杞藉悕绉�",
+            "transportType": "璇烽�夋嫨浼犺緭绫诲瀷",
+            "status": "璇烽�夋嫨鐘舵��",
+            "serverUrl": "璇疯緭鍏ユ湇鍔″湴鍧�",
+            "endpoint": "璇疯緭鍏ユ帴鍙h矾寰�",
+            "command": "璇疯緭鍏ュ惎鍔ㄥ懡浠�",
+            "argsJson": "璇疯緭鍏� JSON 鏁扮粍锛屼緥濡� [\"server.js\"]",
+            "envJson": "璇疯緭鍏� JSON 瀵硅薄锛屼緥濡� {\"NODE_ENV\":\"production\"}",
+            "headersJson": "璇疯緭鍏� JSON 瀵硅薄锛屼緥濡� {\"Authorization\":\"Bearer ...\"}",
+            "builtinCode": "璇疯緭鍏ュ唴缃兘鍔涚紪鐮�",
+            "requestTimeoutMs": "璇疯緭鍏ヨ姹傝秴鏃�",
+            "sort": "璇疯緭鍏ユ帓搴忓��",
+            "memo": "璇疯緭鍏ュ娉�"
+          },
+          "validation": {
+            "name": "璇疯緭鍏ユ寕杞藉悕绉�",
+            "transportType": "璇烽�夋嫨浼犺緭绫诲瀷"
+          }
+        },
+        "toolsDrawer": {
+          "title": "MCP 宸ュ叿棰勮",
+          "currentMount": "褰撳墠鎸傝浇",
+          "description": "棰勮褰撳墠鎸傝浇鏆撮湶鐨勫伐鍏凤紝骞舵敮鎸佸湪绾挎祴璇曘��",
+          "refreshTools": "鍒锋柊宸ュ叿",
+          "connectivityTest": "杩為�氭�ф祴璇�",
+          "empty": "褰撳墠鎸傝浇娌℃湁鍙敤宸ュ叿",
+          "toolTest": "娴嬭瘯宸ュ叿",
+          "toolInputRequired": "璇疯緭鍏ュ伐鍏峰弬鏁� JSON",
+          "toolTestSuccess": "宸ュ叿璋冪敤鎴愬姛",
+          "toolTestFailed": "宸ュ叿璋冪敤澶辫触",
+          "toolsLoadFailed": "宸ュ叿鍔犺浇澶辫触",
+          "toolsTimeout": "宸ュ叿鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+          "toolTestTimeout": "宸ュ叿璋冪敤瓒呮椂锛屽凡鍋滄绛夊緟",
+          "inputSchema": "杈撳叆 Schema",
+          "inputJson": "杈撳叆鍙傛暟(JSON)",
+          "inputJsonPlaceholder": "璇疯緭鍏� JSON 鍙傛暟锛屼緥濡� {\"keyword\":\"task\"}",
+          "output": "杈撳嚭缁撴灉",
+          "outputPlaceholder": "鏆傛棤杈撳嚭缁撴灉"
+        },
+        "messages": {
+          "connectivitySuccess": "杩為�氭�ф祴璇曟垚鍔�",
+          "connectivityFailed": "杩為�氭�ф祴璇曞け璐�",
+          "connectivityTimeout": "杩為�氭�ф祴璇曡秴鏃讹紝宸插仠姝㈢瓑寰�",
+          "draftConnectivitySuccess": "鑽夌杩為�氭�ф祴璇曟垚鍔�",
+          "draftConnectivityFailed": "鑽夌杩為�氭�ф祴璇曞け璐�",
+          "toolsTimeout": "宸ュ叿鍒楄〃鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+          "toolTestTimeout": "宸ュ叿璋冪敤瓒呮椂锛屽凡鍋滄绛夊緟",
+          "initElapsedMs": "鍒濆鍖栬�楁椂 {value} ms"
+        }
+      },
+      "aiObserve": {
+        "title": "AI 瑙傛祴",
+        "summaryTitle": "AI 瑙傛祴鎽樿",
+        "summaryDescription": "瑙傚療 AI 璋冪敤鐘舵�併�佽�楁椂銆乀okens 涓� MCP 宸ュ叿鎵ц鎯呭喌銆�",
+        "reportTitle": "AI 瑙傛祴鎶ヨ〃",
+        "stats": {
+          "callCount": "璋冪敤娆℃暟",
+          "avgElapsed": "骞冲潎鑰楁椂",
+          "totalTokens": "鎬� Tokens",
+          "toolSuccessRate": "宸ュ叿鎴愬姛鐜�",
+          "successFailure": "鎴愬姛 {success} / 澶辫触 {failure}",
+          "firstTokenLatency": "棣栧寘 {value} ms",
+          "avgTokens": "骞冲潎 {value} Tokens",
+          "toolCallFailure": "璋冪敤 {callCount} / 澶辫触 {failureCount}"
+        },
+        "search": {
+          "condition": "鍏抽敭瀛�",
+          "conditionPlaceholder": "璇疯緭鍏ヨ姹侷D鎴� Prompt",
+          "requestId": "璇锋眰ID",
+          "requestIdPlaceholder": "璇疯緭鍏ヨ姹侷D",
+          "promptCode": "Prompt 缂栫爜",
+          "promptCodePlaceholder": "璇疯緭鍏� Prompt 缂栫爜",
+          "user": "鐢ㄦ埛",
+          "userPlaceholder": "璇疯緭鍏ョ敤鎴稩D",
+          "status": "鐘舵��",
+          "statusPlaceholder": "璇烽�夋嫨鐘舵��"
+        },
+        "status": {
+          "running": "鎵ц涓�",
+          "completed": "宸插畬鎴�",
+          "failed": "澶辫触",
+          "aborted": "宸蹭腑姝�"
+        },
+        "detail": {
+          "title": "AI 瑙傛祴璇︽儏",
+          "requestId": "璇锋眰ID",
+          "sessionId": "浼氳瘽ID",
+          "prompt": "Prompt",
+          "model": "妯″瀷",
+          "user": "鐢ㄦ埛",
+          "status": "鐘舵��",
+          "mountedMcp": "鎸傝浇 MCP",
+          "configuredMcpCount": "閰嶇疆 MCP 鏁�",
+          "toolCallCount": "宸ュ叿璋冪敤",
+          "toolSuccessFailure": "鎴愬姛/澶辫触",
+          "elapsed": "鎬昏�楁椂",
+          "firstTokenLatency": "棣栧寘鑰楁椂",
+          "createTime": "鍒涘缓鏃堕棿",
+          "updateTime": "鏇存柊鏃堕棿",
+          "errorCategory": "閿欒鍒嗙被",
+          "errorStage": "閿欒闃舵",
+          "errorMessage": "閿欒淇℃伅",
+          "mcpLogs": "MCP 璋冪敤鏃ュ織",
+          "inputSummary": "杈撳叆鎽樿",
+          "outputSummary": "杈撳嚭鎽樿",
+          "emptyMcpLogs": "鏆傛棤 MCP 璋冪敤鏃ュ織"
+        },
+        "table": {
+          "requestId": "璇锋眰ID",
+          "prompt": "Prompt",
+          "model": "妯″瀷",
+          "user": "鐢ㄦ埛",
+          "status": "鐘舵��",
+          "elapsed": "鎬昏�楁椂",
+          "totalTokens": "鎬� Tokens",
+          "createTime": "鍒涘缓鏃堕棿"
+        },
+        "messages": {
+          "detailTimeout": "AI 瑙傛祴璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+          "mcpLogsTimeout": "MCP 璋冪敤鏃ュ織鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+          "detailFailed": "鑾峰彇 AI 瑙傛祴璇︽儏澶辫触",
+          "statsTimeout": "AI 瑙傛祴鎽樿鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟",
+          "statsFailed": "鑾峰彇 AI 瑙傛祴鎽樿澶辫触"
+        }
+      },
       "role": {
         "entity": "瑙掕壊",
         "reportTitle": "瑙掕壊绠$悊鎶ヨ〃",
diff --git a/rsf-design/src/utils/sys/upgrade.js b/rsf-design/src/utils/sys/upgrade.js
index 6bc6974..be8a5e4 100644
--- a/rsf-design/src/utils/sys/upgrade.js
+++ b/rsf-design/src/utils/sys/upgrade.js
@@ -1,5 +1,6 @@
 import { upgradeLogList } from '@/mock/upgrade/changeLog'
 import { ElNotification } from 'element-plus'
+import { $t } from '@/locales'
 import { useUserStore } from '@/store/modules/user'
 import { StorageConfig } from '@/utils/storage/storage-config'
 class VersionManager {
@@ -78,13 +79,13 @@
     const { title: content } = upgradeLogList.value[0]
     const messageParts = [
       `<p style="color: var(--art-gray-800) !important; padding-bottom: 5px;">`,
-      `绯荤粺宸插崌绾у埌 ${StorageConfig.CURRENT_VERSION} 鐗堟湰锛屾娆℃洿鏂板甫鏉ヤ簡浠ヤ笅鏀硅繘锛歚,
+      $t('message.systemUpgradeIntro', { version: StorageConfig.CURRENT_VERSION }),
       `</p>`,
       content
     ]
     if (requireReLogin) {
       messageParts.push(
-        `<p style="color: var(--theme-color); padding-top: 5px;">鍗囩骇瀹屾垚锛岃閲嶆柊鐧诲綍鍚庣户缁娇鐢ㄣ��</p>`
+        `<p style="color: var(--theme-color); padding-top: 5px;">${$t('message.systemUpgradeRelogin')}</p>`
       )
     }
     return messageParts.join('')
@@ -94,7 +95,7 @@
    */
   showUpgradeNotification(message) {
     ElNotification({
-      title: '绯荤粺鍗囩骇鍏憡',
+      title: $t('message.systemUpgradeTitle'),
       message,
       duration: 0,
       type: 'success',
diff --git a/rsf-design/src/views/basic-info/bas-container/basContainerTable.columns.js b/rsf-design/src/views/basic-info/bas-container/basContainerTable.columns.js
index 36c2dee..7fb05d0 100644
--- a/rsf-design/src/views/basic-info/bas-container/basContainerTable.columns.js
+++ b/rsf-design/src/views/basic-info/bas-container/basContainerTable.columns.js
@@ -1,6 +1,7 @@
 import { h } from 'vue'
 import { ElTag } from 'element-plus'
 import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
+import { $t } from '@/locales'
 import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
 import { getBasContainerStatusMeta } from './basContainerPage.helpers'
 
@@ -12,14 +13,14 @@
   canEdit = true,
   canDelete = true
 }) {
-  const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+  const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
 
   if (canEdit && handleEdit) {
-    operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+    operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
   }
 
   if (canDelete && handleDelete) {
-    operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+    operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
   }
 
   return [
@@ -30,34 +31,34 @@
     },
     {
       type: 'globalIndex',
-      label: '搴忓彿',
+      label: $t('table.index'),
       width: 72,
       align: 'center'
     },
     {
       prop: 'containerTypeText',
-      label: '瀹瑰櫒绫诲瀷',
+      label: $t('pages.basicInfo.basContainer.table.containerType'),
       minWidth: 140,
       showOverflowTooltip: true,
       formatter: (row) => row.containerTypeText || row.containerType$ || '--'
     },
     {
       prop: 'code',
-      label: '鍞竴缂栫爜',
+      label: $t('pages.basicInfo.basContainer.table.code'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.code || '--'
     },
     {
       prop: 'codeType',
-      label: '鏉$爜绫诲瀷',
+      label: $t('pages.basicInfo.basContainer.table.codeType'),
       minWidth: 130,
       showOverflowTooltip: true,
       formatter: (row) => row.codeType || '--'
     },
     {
       prop: 'areasText',
-      label: '鍙叆搴撳尯',
+      label: $t('pages.basicInfo.basContainer.table.areas'),
       minWidth: 220,
       showOverflowTooltip: true,
       formatter: (row) => {
@@ -74,7 +75,7 @@
     },
     {
       prop: 'status',
-      label: '鐘舵��',
+      label: $t('table.status'),
       width: 100,
       align: 'center',
       formatter: (row) => {
@@ -84,42 +85,42 @@
     },
     {
       prop: 'updateByText',
-      label: '鏇存柊浜�',
+      label: $t('table.updateBy'),
       minWidth: 120,
       showOverflowTooltip: true,
       formatter: (row) => row.updateByText || row.updateBy$ || '--'
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: $t('table.updateTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.updateTimeText || row.updateTime$ || '--'
     },
     {
       prop: 'createByText',
-      label: '鍒涘缓浜�',
+      label: $t('table.createBy'),
       minWidth: 120,
       showOverflowTooltip: true,
       formatter: (row) => row.createByText || row.createBy$ || '--'
     },
     {
       prop: 'createTimeText',
-      label: '鍒涘缓鏃堕棿',
+      label: $t('table.createTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.createTimeText || row.createTime$ || '--'
     },
     {
       prop: 'memo',
-      label: '澶囨敞',
+      label: $t('table.remark'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.memo || '--'
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: $t('table.operation'),
       width: 120,
       align: 'center',
       fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/bas-station-area/basStationAreaPage.helpers.js b/rsf-design/src/views/basic-info/bas-station-area/basStationAreaPage.helpers.js
index d6b337f..b3046db 100644
--- a/rsf-design/src/views/basic-info/bas-station-area/basStationAreaPage.helpers.js
+++ b/rsf-design/src/views/basic-info/bas-station-area/basStationAreaPage.helpers.js
@@ -1,32 +1,21 @@
 import { $t } from '@/locales'
 
-const STATUS_META = {
-  1: { text: $t('common.status.normal'), type: 'success', bool: true },
-  0: { text: $t('common.status.frozen'), type: 'danger', bool: false }
-}
-
-const TYPE_OPTIONS = [
-  { label: $t('pages.basicInfo.basStationArea.type.smart'), value: 0 },
-  { label: $t('pages.basicInfo.basStationArea.type.normal'), value: 1 }
-]
-
-const BINARY_OPTIONS = [
-  { label: $t('common.status.no'), value: 0 },
-  { label: $t('common.status.yes'), value: 1 }
-]
-
-const STATUS_OPTIONS = [
-  { label: $t('common.status.normal'), value: 1 },
-  { label: $t('common.status.frozen'), value: 0 }
-]
-
-export const BAS_STATION_AREA_REPORT_TITLE = $t('pages.basicInfo.basStationArea.reportTitle')
 export const BAS_STATION_AREA_REPORT_STYLE = {
   titleAlign: 'center',
   titleLevel: 'strong',
   orientation: 'portrait',
   density: 'compact',
   showSequence: true
+}
+
+function getStatusMeta(status, t = $t) {
+  if (status === true || Number(status) === 1) {
+    return { text: t('common.status.normal'), type: 'success', bool: true }
+  }
+  if (status === false || Number(status) === 0) {
+    return { text: t('common.status.frozen'), type: 'danger', bool: false }
+  }
+  return { text: t('common.status.unknown'), type: 'info', bool: false }
 }
 
 function normalizeText(value) {
@@ -41,14 +30,14 @@
   return Number.isNaN(parsed) ? fallback : parsed
 }
 
-function normalizeBooleanText(value) {
-  if (value === 1 || value === '1' || value === true || value === $t('common.status.yes')) {
-    return $t('common.status.yes')
+function normalizeBooleanText(value, t = $t) {
+  if (value === 1 || value === '1' || value === true || value === t('common.status.yes')) {
+    return t('common.status.yes')
   }
-  if (value === 0 || value === '0' || value === false || value === $t('common.status.no')) {
-    return $t('common.status.no')
+  if (value === 0 || value === '0' || value === false || value === t('common.status.no')) {
+    return t('common.status.no')
   }
-  return normalizeText(value) || $t('common.placeholder.empty')
+  return normalizeText(value) || t('common.placeholder.empty')
 }
 
 function normalizeIdArray(values = []) {
@@ -94,16 +83,6 @@
     .filter(Boolean)
 
   return labels.length ? labels.join($t('common.listSeparator')) : $t('common.placeholder.empty')
-}
-
-function getStatusMeta(status) {
-  if (status === true || Number(status) === 1) {
-    return STATUS_META[1]
-  }
-  if (status === false || Number(status) === 0) {
-    return STATUS_META[0]
-  }
-  return { text: $t('common.status.unknown'), type: 'info', bool: false }
 }
 
 export function createBasStationAreaSearchState() {
@@ -161,16 +140,29 @@
   }
 }
 
-export function getBasStationAreaTypeOptions() {
-  return TYPE_OPTIONS
+export function getBasStationAreaReportTitle(t = $t) {
+  return t('pages.basicInfo.basStationArea.reportTitle')
 }
 
-export function getBasStationAreaBinaryOptions() {
-  return BINARY_OPTIONS
+export function getBasStationAreaTypeOptions(t = $t) {
+  return [
+    { label: t('pages.basicInfo.basStationArea.type.smart'), value: 0 },
+    { label: t('pages.basicInfo.basStationArea.type.normal'), value: 1 }
+  ]
 }
 
-export function getBasStationAreaStatusOptions() {
-  return STATUS_OPTIONS
+export function getBasStationAreaBinaryOptions(t = $t) {
+  return [
+    { label: t('common.status.no'), value: 0 },
+    { label: t('common.status.yes'), value: 1 }
+  ]
+}
+
+export function getBasStationAreaStatusOptions(t = $t) {
+  return [
+    { label: t('common.status.normal'), value: 1 },
+    { label: t('common.status.frozen'), value: 0 }
+  ]
 }
 
 export function resolveBasStationAreaWarehouseAreaOptions(records = []) {
@@ -417,7 +409,8 @@
 }
 
 export function normalizeBasStationAreaDetailRecord(record = {}, resolvers = {}) {
-  const statusMeta = getStatusMeta(record.statusBool ?? record.status)
+  const t = resolvers.t || $t
+  const statusMeta = getStatusMeta(record.statusBool ?? record.status, t)
   const typeValue = record.type$ ?? record.type
   const areaId = record.area ?? record.areaId ?? record.area$
   const crossZoneAreaIds = normalizeIdArray(record.crossZoneArea)
@@ -428,54 +421,54 @@
   return {
     ...record,
     id: normalizeIdValue(record.id),
-    stationAreaName: normalizeText(record.stationAreaName) || $t('common.placeholder.empty'),
-    stationAreaId: normalizeText(record.stationAreaId) || $t('common.placeholder.empty'),
+    stationAreaName: normalizeText(record.stationAreaName) || t('common.placeholder.empty'),
+    stationAreaId: normalizeText(record.stationAreaId) || t('common.placeholder.empty'),
     type: normalizeIdValue(record.type),
     typeText: normalizeText(
       record.type$ || record.typeText || resolvers.resolveTypeLabel?.(typeValue) || typeValue
-    ) || $t('common.placeholder.empty'),
+    ) || t('common.placeholder.empty'),
     inAble: normalizeIdValue(record.inAble),
-    inAbleText: normalizeBooleanText(record.inAble),
+    inAbleText: normalizeBooleanText(record.inAble, t),
     outAble: normalizeIdValue(record.outAble),
-    outAbleText: normalizeBooleanText(record.outAble),
+    outAbleText: normalizeBooleanText(record.outAble, t),
     useStatus: normalizeText(record.useStatus),
     useStatusText:
       normalizeText(record.useStatus$ || record.useStatusText || resolvers.resolveUseStatusLabel?.(record.useStatus) || record.useStatus) ||
-      $t('common.placeholder.empty'),
+      t('common.placeholder.empty'),
     area: normalizeIdValue(areaId),
-    areaText: normalizeText(record.area$ || record.areaText || resolvers.resolveAreaLabel?.(areaId) || '') || $t('common.placeholder.empty'),
+    areaText: normalizeText(record.area$ || record.areaText || resolvers.resolveAreaLabel?.(areaId) || '') || t('common.placeholder.empty'),
     isCrossZone: normalizeIdValue(record.isCrossZone),
-    isCrossZoneText: normalizeBooleanText(record.isCrossZone),
+    isCrossZoneText: normalizeBooleanText(record.isCrossZone, t),
     crossZoneArea: crossZoneAreaIds,
     crossZoneAreaText:
       resolveOptionText(crossZoneAreaIds, resolvers.resolveCrossZoneAreaLabel, record.crossZoneAreaText || []) ||
-      $t('common.placeholder.empty'),
+      t('common.placeholder.empty'),
     isWcs: normalizeIdValue(record.isWcs),
-    isWcsText: normalizeBooleanText(record.isWcs),
-    wcsData: normalizeText(record.wcsData) || $t('common.placeholder.empty'),
+    isWcsText: normalizeBooleanText(record.isWcs, t),
+    wcsData: normalizeText(record.wcsData) || t('common.placeholder.empty'),
     containerType: containerTypeIds,
     containerTypeText:
       resolveOptionText(containerTypeIds, resolvers.resolveContainerTypeLabel, record.containerTypesText || []) ||
-      $t('common.placeholder.empty'),
-    barcode: normalizeText(record.barcode) || $t('common.placeholder.empty'),
+      t('common.placeholder.empty'),
+    barcode: normalizeText(record.barcode) || t('common.placeholder.empty'),
     autoTransfer: normalizeIdValue(record.autoTransfer),
-    autoTransferText: normalizeBooleanText(record.autoTransfer),
+    autoTransferText: normalizeBooleanText(record.autoTransfer, t),
     stationAlias: stationAliasIds,
     stationAliasText:
       resolveOptionText(
         stationAliasIds,
         resolvers.resolveStationAliasLabel,
         stationAliasNames.length ? stationAliasNames : record.stationAliasText || []
-      ) || $t('common.placeholder.empty'),
+      ) || t('common.placeholder.empty'),
     status: normalizeIdValue(record.status),
     statusText: statusMeta.text,
     statusType: statusMeta.type,
     statusBool: record.statusBool !== void 0 ? Boolean(record.statusBool) : statusMeta.bool,
-    memo: normalizeText(record.memo) || $t('common.placeholder.empty'),
-    createByText: normalizeText(record.createBy$ || record.createByText || '') || $t('common.placeholder.empty'),
-    createTimeText: normalizeText(record.createTime$ || record.createTime || '') || $t('common.placeholder.empty'),
-    updateByText: normalizeText(record.updateBy$ || record.updateByText || '') || $t('common.placeholder.empty'),
-    updateTimeText: normalizeText(record.updateTime$ || record.updateTime || '') || $t('common.placeholder.empty')
+    memo: normalizeText(record.memo) || t('common.placeholder.empty'),
+    createByText: normalizeText(record.createBy$ || record.createByText || '') || t('common.placeholder.empty'),
+    createTimeText: normalizeText(record.createTime$ || record.createTime || '') || t('common.placeholder.empty'),
+    updateByText: normalizeText(record.updateBy$ || record.updateByText || '') || t('common.placeholder.empty'),
+    updateTimeText: normalizeText(record.updateTime$ || record.updateTime || '') || t('common.placeholder.empty')
   }
 }
 
@@ -493,10 +486,11 @@
 export function buildBasStationAreaReportMeta({
   previewMeta = {},
   count = 0,
-  orientation = BAS_STATION_AREA_REPORT_STYLE.orientation
+  orientation = BAS_STATION_AREA_REPORT_STYLE.orientation,
+  t = $t
 } = {}) {
   return {
-    reportTitle: BAS_STATION_AREA_REPORT_TITLE,
+    reportTitle: getBasStationAreaReportTitle(t),
     reportDate: previewMeta.reportDate,
     printedAt: previewMeta.printedAt,
     operator: previewMeta.operator,
diff --git a/rsf-design/src/views/basic-info/bas-station-area/basStationAreaTable.columns.js b/rsf-design/src/views/basic-info/bas-station-area/basStationAreaTable.columns.js
index 761091b..476dfae 100644
--- a/rsf-design/src/views/basic-info/bas-station-area/basStationAreaTable.columns.js
+++ b/rsf-design/src/views/basic-info/bas-station-area/basStationAreaTable.columns.js
@@ -9,16 +9,17 @@
   handleEdit,
   handleDelete,
   canEdit = true,
-  canDelete = true
+  canDelete = true,
+  t = $t
 } = {}) {
-  const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
+  const operations = [{ key: 'view', label: t('common.actions.detail'), icon: 'ri:eye-line' }]
 
   if (canEdit && handleEdit) {
-    operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
+    operations.push({ key: 'edit', label: t('common.actions.edit'), icon: 'ri:pencil-line' })
   }
 
   if (canDelete && handleDelete) {
-    operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+    operations.push({ key: 'delete', label: t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
   }
 
   return [
@@ -29,115 +30,115 @@
     },
     {
       type: 'globalIndex',
-      label: $t('table.index'),
+      label: t('table.index'),
       width: 72,
       align: 'center'
     },
     {
       prop: 'stationAreaId',
-      label: $t('pages.basicInfo.basStationArea.search.stationAreaId'),
+      label: t('pages.basicInfo.basStationArea.search.stationAreaId'),
       minWidth: 150,
       showOverflowTooltip: true,
       formatter: (row) => row.stationAreaId || '--'
     },
     {
       prop: 'stationAreaName',
-      label: $t('pages.basicInfo.basStationArea.search.stationAreaName'),
+      label: t('pages.basicInfo.basStationArea.search.stationAreaName'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.stationAreaName || '--'
     },
     {
       prop: 'typeText',
-      label: $t('pages.basicInfo.basStationArea.search.type'),
+      label: t('pages.basicInfo.basStationArea.search.type'),
       width: 120,
       align: 'center',
       formatter: (row) => row.typeText || '--'
     },
     {
       prop: 'areaText',
-      label: $t('pages.basicInfo.basStationArea.search.area'),
+      label: t('pages.basicInfo.basStationArea.search.area'),
       minWidth: 150,
       showOverflowTooltip: true,
       formatter: (row) => row.areaText || '--'
     },
     {
       prop: 'crossZoneAreaText',
-      label: $t('pages.basicInfo.basStationArea.table.crossZoneArea'),
+      label: t('pages.basicInfo.basStationArea.table.crossZoneArea'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.crossZoneAreaText || '--'
     },
     {
       prop: 'containerTypeText',
-      label: $t('pages.basicInfo.basStationArea.search.containerType'),
+      label: t('pages.basicInfo.basStationArea.search.containerType'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.containerTypeText || '--'
     },
     {
       prop: 'stationAliasText',
-      label: $t('pages.basicInfo.basStationArea.search.stationAlias'),
+      label: t('pages.basicInfo.basStationArea.search.stationAlias'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.stationAliasText || '--'
     },
     {
       prop: 'inAbleText',
-      label: $t('pages.basicInfo.basStationArea.table.inAble'),
+      label: t('pages.basicInfo.basStationArea.table.inAble'),
       width: 84,
       align: 'center',
       formatter: (row) => row.inAbleText || '--'
     },
     {
       prop: 'outAbleText',
-      label: $t('pages.basicInfo.basStationArea.table.outAble'),
+      label: t('pages.basicInfo.basStationArea.table.outAble'),
       width: 84,
       align: 'center',
       formatter: (row) => row.outAbleText || '--'
     },
     {
       prop: 'isCrossZoneText',
-      label: $t('pages.basicInfo.basStationArea.table.isCrossZone'),
+      label: t('pages.basicInfo.basStationArea.table.isCrossZone'),
       width: 84,
       align: 'center',
       formatter: (row) => row.isCrossZoneText || '--'
     },
     {
       prop: 'isWcsText',
-      label: $t('table.wcs'),
+      label: t('table.wcs'),
       width: 84,
       align: 'center',
       formatter: (row) => row.isWcsText || '--'
     },
     {
       prop: 'autoTransferText',
-      label: $t('pages.basicInfo.basStationArea.search.autoTransfer'),
+      label: t('pages.basicInfo.basStationArea.search.autoTransfer'),
       width: 100,
       align: 'center',
       formatter: (row) => row.autoTransferText || '--'
     },
     {
       prop: 'useStatusText',
-      label: $t('pages.basicInfo.basStationArea.search.useStatus'),
+      label: t('pages.basicInfo.basStationArea.search.useStatus'),
       minWidth: 120,
       showOverflowTooltip: true,
       formatter: (row) => row.useStatusText || '--'
     },
     {
       prop: 'barcode',
-      label: $t('pages.basicInfo.basStationArea.search.barcode'),
+      label: t('pages.basicInfo.basStationArea.search.barcode'),
       minWidth: 150,
       showOverflowTooltip: true,
       formatter: (row) => row.barcode || '--'
     },
     {
       prop: 'status',
-      label: $t('pages.basicInfo.basStationArea.search.status'),
+      label: t('pages.basicInfo.basStationArea.search.status'),
       width: 96,
       align: 'center',
       formatter: (row) => {
-        const status = getBasStationAreaStatusOptions().find((item) => Number(item.value) === Number(row.status))
+        const status = getBasStationAreaStatusOptions(t).find((item) => Number(item.value) === Number(row.status))
         const text = status?.label || row.statusText || '--'
         const type = Number(row.status) === 1 ? 'success' : Number(row.status) === 0 ? 'danger' : 'info'
         return h(ElTag, { type, effect: 'light' }, () => text)
@@ -145,21 +146,21 @@
     },
     {
       prop: 'updateTimeText',
-      label: $t('table.updateTime'),
+      label: t('table.updateTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.updateTimeText || '--'
     },
     {
       prop: 'memo',
-      label: $t('pages.basicInfo.basStationArea.search.memo'),
+      label: t('pages.basicInfo.basStationArea.search.memo'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.memo || '--'
     },
     {
       prop: 'operation',
-      label: $t('table.operation'),
+      label: t('table.operation'),
       width: 120,
       align: 'center',
       fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/bas-station-area/index.vue b/rsf-design/src/views/basic-info/bas-station-area/index.vue
index a3d8b83..562414f 100644
--- a/rsf-design/src/views/basic-info/bas-station-area/index.vue
+++ b/rsf-design/src/views/basic-info/bas-station-area/index.vue
@@ -103,7 +103,6 @@
   import { createBasStationAreaTableColumns } from './basStationAreaTable.columns'
   import {
     BAS_STATION_AREA_REPORT_STYLE,
-    BAS_STATION_AREA_REPORT_TITLE,
     buildBasStationAreaDialogModel,
     buildBasStationAreaPageQueryParams,
     buildBasStationAreaPrintRows,
@@ -113,6 +112,7 @@
     createBasStationAreaSearchState,
     getBasStationAreaBinaryOptions,
     getBasStationAreaPaginationKey,
+    getBasStationAreaReportTitle,
     getBasStationAreaStatusOptions,
     getBasStationAreaTypeOptions,
     normalizeBasStationAreaDetailRecord,
@@ -161,7 +161,7 @@
   const typeLabelMap = computed(
     () =>
       new Map(
-        getBasStationAreaTypeOptions()
+        getBasStationAreaTypeOptions(t)
           .map((item) => [String(item.value), item.label])
           .filter(([value, label]) => value && label)
       )
@@ -189,7 +189,7 @@
   const resolveTypeLabel = (value) => typeLabelMap.value.get(String(value)) || ''
   const resolveStationAliasLabel = (id) => stationLabelMap.value.get(String(id)) || ''
   const resolveUseStatusLabel = (value) => useStatusLabelMap.value.get(String(value)) || ''
-  const reportTitle = BAS_STATION_AREA_REPORT_TITLE
+  const reportTitle = computed(() => getBasStationAreaReportTitle(t))
   const reportQueryParams = computed(() => buildBasStationAreaSearchParams(searchForm.value))
 
   const searchItems = computed(() => [
@@ -248,7 +248,7 @@
       type: 'select',
       props: {
         clearable: true,
-        options: getBasStationAreaTypeOptions()
+        options: getBasStationAreaTypeOptions(t)
       }
     },
     {
@@ -367,7 +367,7 @@
       type: 'select',
       props: {
         clearable: true,
-        options: getBasStationAreaStatusOptions()
+        options: getBasStationAreaStatusOptions(t)
       }
     },
     {
@@ -393,6 +393,7 @@
         }
       )
       detailData.value = normalizeBasStationAreaDetailRecord(detail, {
+        t,
         resolveAreaLabel,
         resolveCrossZoneAreaLabel,
         resolveContainerTypeLabel,
@@ -490,6 +491,7 @@
       paginationKey: getBasStationAreaPaginationKey(),
       columnsFactory: () =>
         createBasStationAreaTableColumns({
+          t,
           handleView: openDetail,
           handleEdit: hasAuth('update') ? openEditDialog : null,
           handleDelete: hasAuth('delete') ? (row) => handleDeleteAction?.(row) : null,
@@ -504,6 +506,7 @@
         }
         return records.map((item) =>
           normalizeBasStationAreaListRow(item, {
+            t,
             resolveAreaLabel,
             resolveCrossZoneAreaLabel,
             resolveContainerTypeLabel,
@@ -577,6 +580,7 @@
       resolvePrintRecords,
       buildPreviewRows: (records) =>
         buildBasStationAreaPrintRows(records, {
+          t,
           resolveAreaLabel,
           resolveCrossZoneAreaLabel,
           resolveContainerTypeLabel,
@@ -591,7 +595,8 @@
     buildBasStationAreaReportMeta({
       previewMeta: previewMeta.value,
       count: previewRows.value.length,
-      orientation: previewMeta.value?.reportStyle?.orientation || BAS_STATION_AREA_REPORT_STYLE.orientation
+      orientation: previewMeta.value?.reportStyle?.orientation || BAS_STATION_AREA_REPORT_STYLE.orientation,
+      t
     })
   )
 
diff --git a/rsf-design/src/views/basic-info/bas-station-area/modules/bas-station-area-dialog.vue b/rsf-design/src/views/basic-info/bas-station-area/modules/bas-station-area-dialog.vue
index 03f889c..32e068a 100644
--- a/rsf-design/src/views/basic-info/bas-station-area/modules/bas-station-area-dialog.vue
+++ b/rsf-design/src/views/basic-info/bas-station-area/modules/bas-station-area-dialog.vue
@@ -96,7 +96,7 @@
       props: {
         placeholder: t('pages.basicInfo.basStationArea.search.type'),
         clearable: true,
-        options: getBasStationAreaTypeOptions()
+        options: getBasStationAreaTypeOptions(t)
       }
     },
     {
@@ -159,7 +159,7 @@
       props: {
         placeholder: t('pages.basicInfo.basStationArea.search.inAble'),
         clearable: true,
-        options: getBasStationAreaBinaryOptions()
+        options: getBasStationAreaBinaryOptions(t)
       }
     },
     {
@@ -169,7 +169,7 @@
       props: {
         placeholder: t('pages.basicInfo.basStationArea.search.outAble'),
         clearable: true,
-        options: getBasStationAreaBinaryOptions()
+        options: getBasStationAreaBinaryOptions(t)
       }
     },
     {
@@ -179,7 +179,7 @@
       props: {
         placeholder: t('pages.basicInfo.basStationArea.search.isCrossZone'),
         clearable: true,
-        options: getBasStationAreaBinaryOptions()
+        options: getBasStationAreaBinaryOptions(t)
       }
     },
     {
@@ -189,7 +189,7 @@
       props: {
         placeholder: t('pages.basicInfo.basStationArea.search.isWcs'),
         clearable: true,
-        options: getBasStationAreaBinaryOptions()
+        options: getBasStationAreaBinaryOptions(t)
       }
     },
     {
@@ -199,7 +199,7 @@
       props: {
         placeholder: t('pages.basicInfo.basStationArea.search.autoTransfer'),
         clearable: true,
-        options: getBasStationAreaBinaryOptions()
+        options: getBasStationAreaBinaryOptions(t)
       }
     },
     {
@@ -241,7 +241,7 @@
       props: {
         placeholder: t('pages.basicInfo.basStationArea.search.status'),
         clearable: true,
-        options: getBasStationAreaStatusOptions()
+        options: getBasStationAreaStatusOptions(t)
       }
     },
     {
diff --git a/rsf-design/src/views/basic-info/bas-station/basStationTable.columns.js b/rsf-design/src/views/basic-info/bas-station/basStationTable.columns.js
index 6dc12ad..6a6c46f 100644
--- a/rsf-design/src/views/basic-info/bas-station/basStationTable.columns.js
+++ b/rsf-design/src/views/basic-info/bas-station/basStationTable.columns.js
@@ -1,6 +1,7 @@
 import { h } from 'vue'
 import { ElTag } from 'element-plus'
 import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
+import { $t } from '@/locales'
 import {
   getBasStationUseStatusMeta,
   getBasStationStatusMeta,
@@ -14,36 +15,36 @@
   canEdit = true,
   canDelete = true
 } = {}) {
-  const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+  const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
 
   if (canEdit && handleEdit) {
-    operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+    operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
   }
 
   if (canDelete && handleDelete) {
-    operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+    operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
   }
 
   return [
     { type: 'selection', width: 48, align: 'center' },
-    { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+    { type: 'globalIndex', label: $t('table.index'), width: 72, align: 'center' },
     {
       prop: 'stationName',
-      label: '绔欑偣缂栫爜',
+      label: $t('pages.basicInfo.basStation.table.stationCode'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.stationName || '--'
     },
     {
       prop: 'stationId',
-      label: '绔欑偣鍚嶇О',
+      label: $t('pages.basicInfo.basStation.table.stationName'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.stationId || '--'
     },
     {
       prop: 'typeText',
-      label: '绔欑偣绫诲瀷',
+      label: $t('pages.basicInfo.basStation.table.type'),
       width: 110,
       align: 'center',
       formatter: (row) => {
@@ -53,7 +54,7 @@
     },
     {
       prop: 'useStatusText',
-      label: '浣跨敤鐘舵��',
+      label: $t('pages.basicInfo.basStation.table.useStatus'),
       width: 110,
       align: 'center',
       formatter: (row) => {
@@ -63,70 +64,70 @@
     },
     {
       prop: 'areaText',
-      label: '鎵�灞炲簱鍖�',
+      label: $t('pages.basicInfo.basStation.table.area'),
       minWidth: 150,
       showOverflowTooltip: true,
       formatter: (row) => row.areaText || row.area$ || '--'
     },
     {
       prop: 'crossZoneAreaText',
-      label: '鍙法鍖哄簱鍖�',
+      label: $t('pages.basicInfo.basStation.table.crossZoneArea'),
       minWidth: 220,
       showOverflowTooltip: true,
       formatter: (row) => row.crossZoneAreaText || '--'
     },
     {
       prop: 'containerTypesText',
-      label: '鍙叆瀹瑰櫒绫诲瀷',
+      label: $t('pages.basicInfo.basStation.table.containerTypes'),
       minWidth: 200,
       showOverflowTooltip: true,
       formatter: (row) => row.containerTypesText || '--'
     },
     {
       prop: 'barcode',
-      label: '鏉$爜',
+      label: $t('pages.basicInfo.basStation.table.barcode'),
       minWidth: 150,
       showOverflowTooltip: true,
       formatter: (row) => row.barcode || '--'
     },
     {
       prop: 'inAbleText',
-      label: '鍙叆',
+      label: $t('pages.basicInfo.basStation.table.inAble'),
       width: 90,
       align: 'center',
       formatter: (row) => row.inAbleText || '--'
     },
     {
       prop: 'outAbleText',
-      label: '鍙嚭',
+      label: $t('pages.basicInfo.basStation.table.outAble'),
       width: 90,
       align: 'center',
       formatter: (row) => row.outAbleText || '--'
     },
     {
       prop: 'isCrossZoneText',
-      label: '鏄惁璺ㄥ尯',
+      label: $t('pages.basicInfo.basStation.table.isCrossZone'),
       width: 100,
       align: 'center',
       formatter: (row) => row.isCrossZoneText || '--'
     },
     {
       prop: 'isWcsText',
-      label: '鏄惁WCS',
+      label: $t('pages.basicInfo.basStation.table.isWcs'),
       width: 100,
       align: 'center',
       formatter: (row) => row.isWcsText || '--'
     },
     {
       prop: 'autoTransferText',
-      label: '鑷姩璋冩嫧',
+      label: $t('pages.basicInfo.basStation.table.autoTransfer'),
       width: 100,
       align: 'center',
       formatter: (row) => row.autoTransferText || '--'
     },
     {
       prop: 'status',
-      label: '鐘舵��',
+      label: $t('table.status'),
       width: 100,
       align: 'center',
       formatter: (row) => {
@@ -136,28 +137,28 @@
     },
     {
       prop: 'updateByText',
-      label: '鏇存柊浜�',
+      label: $t('table.updateBy'),
       minWidth: 120,
       showOverflowTooltip: true,
       formatter: (row) => row.updateByText || row.updateBy$ || '--'
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: $t('table.updateTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.updateTimeText || row.updateTime$ || '--'
     },
     {
       prop: 'memo',
-      label: '澶囨敞',
+      label: $t('table.remark'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.memo || '--'
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: $t('table.operation'),
       width: 120,
       align: 'center',
       fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/companys/companysPage.helpers.js b/rsf-design/src/views/basic-info/companys/companysPage.helpers.js
index e375f44..63502f4 100644
--- a/rsf-design/src/views/basic-info/companys/companysPage.helpers.js
+++ b/rsf-design/src/views/basic-info/companys/companysPage.helpers.js
@@ -1,9 +1,11 @@
 const STATUS_META = {
-  1: { text: '姝e父', type: 'success', bool: true },
-  0: { text: '鍐荤粨', type: 'danger', bool: false }
+  1: { textKey: 'common.status.normal', fallback: 'Normal', type: 'success', bool: true },
+  0: { textKey: 'common.status.frozen', fallback: 'Frozen', type: 'danger', bool: false }
 }
 
-export const COMPANYS_REPORT_TITLE = '寰�鏉ヤ紒涓氭姤琛�'
+export function getCompanysReportTitle(t) {
+  return typeof t === 'function' ? t('pages.basicInfo.companys.reportTitle') : 'Company Report'
+}
 export const COMPANYS_REPORT_STYLE = {
   titleAlign: 'center',
   titleLevel: 'strong',
@@ -61,10 +63,10 @@
   }
 }
 
-export function getCompanysStatusOptions() {
+export function getCompanysStatusOptions(t) {
   return [
-    { label: '姝e父', value: 1 },
-    { label: '鍐荤粨', value: 0 }
+    { label: typeof t === 'function' ? t('common.status.normal') : 'Normal', value: 1 },
+    { label: typeof t === 'function' ? t('common.status.frozen') : 'Frozen', value: 0 }
   ]
 }
 
@@ -82,7 +84,7 @@
   if (status === false || Number(status) === 0) {
     return STATUS_META[0]
   }
-  return { text: '鏈煡', type: 'info', bool: false }
+  return { textKey: 'common.status.unknown', fallback: 'Unknown', type: 'info', bool: false }
 }
 
 export function buildCompanysTypeOptions(records = []) {
@@ -212,7 +214,8 @@
     city: normalizeText(record.city || ''),
     address: normalizeText(record.address || ''),
     memo: normalizeText(record.memo || ''),
-    statusText: statusMeta.text,
+    statusTextKey: statusMeta.textKey,
+    statusText: statusMeta.fallback,
     statusType: statusMeta.type,
     statusBool: record.statusBool !== void 0 ? Boolean(record.statusBool) : statusMeta.bool,
     createByText: normalizeText(record.createBy$ || record.createByText || ''),
@@ -239,7 +242,7 @@
   orientation = COMPANYS_REPORT_STYLE.orientation
 } = {}) {
   return {
-    reportTitle: COMPANYS_REPORT_TITLE,
+    reportTitle: previewMeta.reportTitle,
     reportDate: previewMeta.reportDate,
     printedAt: previewMeta.printedAt,
     operator: previewMeta.operator,
diff --git a/rsf-design/src/views/basic-info/companys/companysTable.columns.js b/rsf-design/src/views/basic-info/companys/companysTable.columns.js
index 01935b6..510373b 100644
--- a/rsf-design/src/views/basic-info/companys/companysTable.columns.js
+++ b/rsf-design/src/views/basic-info/companys/companysTable.columns.js
@@ -1,9 +1,11 @@
 import { h } from 'vue'
 import { ElTag } from 'element-plus'
 import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
+import { $t } from '@/locales'
 import { getCompanysStatusMeta } from './companysPage.helpers'
 
 export function createCompanysTableColumns({
+  t = $t,
   handleView,
   handleEdit,
   handleDelete,
@@ -11,80 +13,82 @@
   canDelete = true,
   resolveTypeLabel
 } = {}) {
-  const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+  const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
 
   if (canEdit && handleEdit) {
-    operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+    operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
   }
 
   if (canDelete && handleDelete) {
-    operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+    operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
   }
 
   return [
     { type: 'selection', width: 48, align: 'center' },
-    { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
-    { prop: 'code', label: '浼佷笟缂栫爜', minWidth: 140, showOverflowTooltip: true, formatter: (row) => row.code || '--' },
-    { prop: 'name', label: '浼佷笟鍚嶇О', minWidth: 170, showOverflowTooltip: true, formatter: (row) => row.name || '--' },
-    { prop: 'nameEn', label: '鑻辨枃鍒悕', minWidth: 160, showOverflowTooltip: true, formatter: (row) => row.nameEn || '--' },
-    { prop: 'breifCode', label: '鍔╄鐮�', minWidth: 120, showOverflowTooltip: true, formatter: (row) => row.breifCode || '--' },
+    { type: 'globalIndex', label: $t('table.index'), width: 72, align: 'center' },
+    { prop: 'code', label: $t('pages.basicInfo.companys.table.code'), minWidth: 140, showOverflowTooltip: true, formatter: (row) => row.code || '--' },
+    { prop: 'name', label: $t('pages.basicInfo.companys.table.name'), minWidth: 170, showOverflowTooltip: true, formatter: (row) => row.name || '--' },
+    { prop: 'nameEn', label: $t('pages.basicInfo.companys.table.nameEn'), minWidth: 160, showOverflowTooltip: true, formatter: (row) => row.nameEn || '--' },
+    { prop: 'breifCode', label: $t('pages.basicInfo.companys.table.briefCode'), minWidth: 120, showOverflowTooltip: true, formatter: (row) => row.breifCode || '--' },
     {
       prop: 'typeText',
-      label: '浼佷笟绫诲瀷',
+      label: $t('pages.basicInfo.companys.table.type'),
       minWidth: 140,
       showOverflowTooltip: true,
       formatter: (row) =>
         row.typeText || (typeof resolveTypeLabel === 'function' ? resolveTypeLabel(row.type) : '') || '--'
     },
-    { prop: 'contact', label: '鑱旂郴浜�', minWidth: 120, showOverflowTooltip: true, formatter: (row) => row.contact || '--' },
-    { prop: 'tel', label: '鑱旂郴鐢佃瘽', minWidth: 140, showOverflowTooltip: true, formatter: (row) => row.tel || '--' },
-    { prop: 'email', label: '閭', minWidth: 180, showOverflowTooltip: true, formatter: (row) => row.email || '--' },
-    { prop: 'pcode', label: '閭紪', minWidth: 120, showOverflowTooltip: true, formatter: (row) => row.pcode || '--' },
-    { prop: 'province', label: '鐪佷唤', minWidth: 120, showOverflowTooltip: true, formatter: (row) => row.province || '--' },
-    { prop: 'city', label: '鍩庡競', minWidth: 120, showOverflowTooltip: true, formatter: (row) => row.city || '--' },
-    { prop: 'address', label: '鍦板潃', minWidth: 220, showOverflowTooltip: true, formatter: (row) => row.address || '--' },
+    { prop: 'contact', label: $t('pages.basicInfo.companys.table.contact'), minWidth: 120, showOverflowTooltip: true, formatter: (row) => row.contact || '--' },
+    { prop: 'tel', label: $t('pages.basicInfo.companys.table.tel'), minWidth: 140, showOverflowTooltip: true, formatter: (row) => row.tel || '--' },
+    { prop: 'email', label: $t('pages.basicInfo.companys.table.email'), minWidth: 180, showOverflowTooltip: true, formatter: (row) => row.email || '--' },
+    { prop: 'pcode', label: $t('pages.basicInfo.companys.table.postCode'), minWidth: 120, showOverflowTooltip: true, formatter: (row) => row.pcode || '--' },
+    { prop: 'province', label: $t('pages.basicInfo.companys.table.province'), minWidth: 120, showOverflowTooltip: true, formatter: (row) => row.province || '--' },
+    { prop: 'city', label: $t('pages.basicInfo.companys.table.city'), minWidth: 120, showOverflowTooltip: true, formatter: (row) => row.city || '--' },
+    { prop: 'address', label: $t('pages.basicInfo.companys.table.address'), minWidth: 220, showOverflowTooltip: true, formatter: (row) => row.address || '--' },
     {
       prop: 'status',
-      label: '鐘舵��',
+      label: $t('table.status'),
       width: 100,
       align: 'center',
       formatter: (row) => {
         const statusMeta = getCompanysStatusMeta(row.statusBool ?? row.status)
-        return h(ElTag, { type: statusMeta.type, effect: 'light' }, () => statusMeta.text)
+        return h(ElTag, { type: statusMeta.type, effect: 'light' }, () =>
+          statusMeta.textKey ? t(statusMeta.textKey) : statusMeta.fallback
+        )
       }
     },
-    { prop: 'memo', label: '澶囨敞', minWidth: 180, showOverflowTooltip: true, formatter: (row) => row.memo || '--' },
+    { prop: 'memo', label: $t('table.remark'), minWidth: 180, showOverflowTooltip: true, formatter: (row) => row.memo || '--' },
     {
       prop: 'createByText',
-      label: '鍒涘缓浜�',
+      label: $t('table.createBy'),
       minWidth: 120,
       showOverflowTooltip: true,
       formatter: (row) => row.createByText || row.createBy$ || '--'
     },
     {
       prop: 'createTimeText',
-      label: '鍒涘缓鏃堕棿',
+      label: $t('table.createTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.createTimeText || row.createTime$ || '--'
     },
     {
       prop: 'updateByText',
-      label: '鏇存柊浜�',
+      label: $t('table.updateBy'),
       minWidth: 120,
       showOverflowTooltip: true,
       formatter: (row) => row.updateByText || row.updateBy$ || '--'
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: $t('table.updateTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.updateTimeText || row.updateTime$ || '--'
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: $t('table.operation'),
       width: 120,
       align: 'center',
       fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/companys/index.vue b/rsf-design/src/views/basic-info/companys/index.vue
index abc0bf2..7629628 100644
--- a/rsf-design/src/views/basic-info/companys/index.vue
+++ b/rsf-design/src/views/basic-info/companys/index.vue
@@ -12,7 +12,7 @@
       <ArtTableHeader v-model:columns="columnChecks" :loading="loading" @refresh="refreshData">
         <template #left>
           <ElSpace wrap>
-            <ElButton v-auth="'add'" @click="showDialog('add')" v-ripple>鏂板浼佷笟</ElButton>
+            <ElButton v-auth="'add'" @click="showDialog('add')" v-ripple>{{ t('pages.basicInfo.companys.buttons.add') }}</ElButton>
             <ElButton
               v-auth="'delete'"
               type="danger"
@@ -20,7 +20,7 @@
               @click="handleBatchDelete"
               v-ripple
             >
-              鎵归噺鍒犻櫎
+              {{ t('common.actions.batchDelete') }}
             </ElButton>
             <ListExportPrint
               class="inline-flex"
@@ -70,6 +70,7 @@
 
 <script setup>
   import { computed, onMounted, ref } from 'vue'
+  import { useI18n } from 'vue-i18n'
   import { ElMessage } from 'element-plus'
   import { useUserStore } from '@/store/modules/user'
   import { useAuth } from '@/hooks/core/useAuth'
@@ -94,7 +95,6 @@
   import { createCompanysTableColumns } from './companysTable.columns'
   import {
     COMPANYS_REPORT_STYLE,
-    COMPANYS_REPORT_TITLE,
     buildCompanysDialogModel,
     buildCompanysPageQueryParams,
     buildCompanysSavePayload,
@@ -104,11 +104,13 @@
     buildCompanysTypeOptions,
     createCompanysSearchState,
     getCompanysPaginationKey,
+    getCompanysReportTitle,
     normalizeCompanysListRow
   } from './companysPage.helpers'
 
   defineOptions({ name: 'Companys' })
 
+  const { t } = useI18n()
   const { hasAuth } = useAuth()
   const userStore = useUserStore()
 
@@ -119,7 +121,7 @@
   const detailData = ref({})
   let handleDeleteAction = null
 
-  const reportTitle = COMPANYS_REPORT_TITLE
+  const reportTitle = computed(() => getCompanysReportTitle(t))
   const reportQueryParams = computed(() => buildCompanysSearchParams(searchForm.value))
   const typeLabelMap = computed(
     () =>
@@ -136,20 +138,20 @@
 
   const searchItems = computed(() => [
     {
-      label: '鍏抽敭瀛�',
+      label: t('table.keyword'),
       key: 'condition',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ヤ紒涓氬悕绉�/缂栫爜/鑱旂郴浜�/鐢佃瘽'
+        placeholder: t('pages.basicInfo.companys.search.conditionPlaceholder')
       }
     },
-    { label: '浼佷笟缂栫爜', key: 'code', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ヤ紒涓氱紪鐮�' } },
-    { label: '浼佷笟鍚嶇О', key: 'name', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ヤ紒涓氬悕绉�' } },
-    { label: '鑻辨枃鍒悕', key: 'nameEn', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ヨ嫳鏂囧埆鍚�' } },
-    { label: '鍔╄鐮�', key: 'breifCode', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ュ姪璁扮爜' } },
+    { label: t('pages.basicInfo.companys.table.code'), key: 'code', type: 'input', props: { clearable: true, placeholder: t('pages.basicInfo.companys.search.codePlaceholder') } },
+    { label: t('pages.basicInfo.companys.table.name'), key: 'name', type: 'input', props: { clearable: true, placeholder: t('pages.basicInfo.companys.search.namePlaceholder') } },
+    { label: t('pages.basicInfo.companys.table.nameEn'), key: 'nameEn', type: 'input', props: { clearable: true, placeholder: t('pages.basicInfo.companys.search.nameEnPlaceholder') } },
+    { label: t('pages.basicInfo.companys.table.briefCode'), key: 'breifCode', type: 'input', props: { clearable: true, placeholder: t('pages.basicInfo.companys.search.briefCodePlaceholder') } },
     {
-      label: '浼佷笟绫诲瀷',
+      label: t('pages.basicInfo.companys.table.type'),
       key: 'type',
       type: 'select',
       props: {
@@ -158,26 +160,26 @@
         options: typeOptions.value
       }
     },
-    { label: '鑱旂郴浜�', key: 'contact', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ヨ仈绯讳汉' } },
-    { label: '鑱旂郴鐢佃瘽', key: 'tel', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ヨ仈绯荤數璇�' } },
-    { label: '閭', key: 'email', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ラ偖绠�' } },
-    { label: '閭紪', key: 'pcode', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ラ偖缂�' } },
-    { label: '鐪佷唤', key: 'province', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ョ渷浠�' } },
-    { label: '鍩庡競', key: 'city', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ュ煄甯�' } },
-    { label: '鍦板潃', key: 'address', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ュ湴鍧�' } },
+    { label: t('pages.basicInfo.companys.table.contact'), key: 'contact', type: 'input', props: { clearable: true, placeholder: t('pages.basicInfo.companys.search.contactPlaceholder') } },
+    { label: t('pages.basicInfo.companys.table.tel'), key: 'tel', type: 'input', props: { clearable: true, placeholder: t('pages.basicInfo.companys.search.telPlaceholder') } },
+    { label: t('pages.basicInfo.companys.table.email'), key: 'email', type: 'input', props: { clearable: true, placeholder: t('pages.basicInfo.companys.search.emailPlaceholder') } },
+    { label: t('pages.basicInfo.companys.table.postCode'), key: 'pcode', type: 'input', props: { clearable: true, placeholder: t('pages.basicInfo.companys.search.postCodePlaceholder') } },
+    { label: t('pages.basicInfo.companys.table.province'), key: 'province', type: 'input', props: { clearable: true, placeholder: t('pages.basicInfo.companys.search.provincePlaceholder') } },
+    { label: t('pages.basicInfo.companys.table.city'), key: 'city', type: 'input', props: { clearable: true, placeholder: t('pages.basicInfo.companys.search.cityPlaceholder') } },
+    { label: t('pages.basicInfo.companys.table.address'), key: 'address', type: 'input', props: { clearable: true, placeholder: t('pages.basicInfo.companys.search.addressPlaceholder') } },
     {
-      label: '鐘舵��',
+      label: t('table.status'),
       key: 'status',
       type: 'select',
       props: {
         clearable: true,
         options: [
-          { label: '姝e父', value: 1 },
-          { label: '鍐荤粨', value: 0 }
+          { label: t('common.status.normal'), value: 1 },
+          { label: t('common.status.frozen'), value: 0 }
         ]
       }
     },
-    { label: '澶囨敞', key: 'memo', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ュ娉�' } }
+    { label: t('table.remark'), key: 'memo', type: 'input', props: { clearable: true, placeholder: t('pages.basicInfo.companys.search.memoPlaceholder') } }
   ])
 
   async function openDetail(row) {
@@ -185,13 +187,13 @@
     detailLoading.value = true
     try {
       const detail = await guardRequestWithMessage(fetchGetCompanysDetail(row.id), {}, {
-        timeoutMessage: '寰�鏉ヤ紒涓氳鎯呭姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�'
+        timeoutMessage: t('pages.basicInfo.companys.messages.detailTimeout')
       })
       detailData.value = normalizeCompanysListRow(detail, resolveTypeLabel)
     } catch (error) {
       detailDrawerVisible.value = false
       detailData.value = {}
-      ElMessage.error(error?.message || '鑾峰彇寰�鏉ヤ紒涓氳鎯呭け璐�')
+      ElMessage.error(error?.message || t('pages.basicInfo.companys.messages.detailFailed'))
     } finally {
       detailLoading.value = false
     }
@@ -200,11 +202,11 @@
   async function openEditDialog(row) {
     try {
       const detail = await guardRequestWithMessage(fetchGetCompanysDetail(row.id), {}, {
-        timeoutMessage: '寰�鏉ヤ紒涓氳鎯呭姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�'
+        timeoutMessage: t('pages.basicInfo.companys.messages.detailTimeout')
       })
       showDialog('edit', detail)
     } catch (error) {
-      ElMessage.error(error?.message || '鑾峰彇寰�鏉ヤ紒涓氳鎯呭け璐�')
+      ElMessage.error(error?.message || t('pages.basicInfo.companys.messages.detailFailed'))
     }
   }
 
@@ -230,6 +232,7 @@
       paginationKey: getCompanysPaginationKey(),
       columnsFactory: () =>
         createCompanysTableColumns({
+          t,
           handleView: openDetail,
           handleEdit: hasAuth('update') ? openEditDialog : null,
           handleDelete: hasAuth('delete') ? (row) => handleDeleteAction?.(row) : null,
@@ -265,7 +268,7 @@
     saveRequest: fetchSaveCompanys,
     updateRequest: fetchUpdateCompanys,
     deleteRequest: fetchDeleteCompanys,
-    entityName: '寰�鏉ヤ紒涓�',
+    entityName: t('pages.basicInfo.companys.entity'),
     resolveRecordLabel: (record) => record?.name || record?.code || record?.id,
     refreshCreate,
     refreshUpdate,
@@ -276,6 +279,7 @@
   const buildPreviewMeta = (rows) => {
     const now = new Date()
     return {
+      reportTitle: reportTitle.value,
       reportDate: now.toLocaleDateString('zh-CN'),
       printedAt: now.toLocaleString('zh-CN', { hour12: false }),
       operator: userStore.getUserInfo?.name || userStore.getUserInfo?.username || '',
@@ -344,7 +348,7 @@
         status: 1
       }),
       { records: [] },
-      { timeoutMessage: '浼佷笟绫诲瀷鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟' }
+      { timeoutMessage: t('pages.basicInfo.companys.messages.typeOptionsTimeout') }
     )
     typeOptions.value = buildCompanysTypeOptions(defaultResponseAdapter(response).records)
   }
diff --git a/rsf-design/src/views/basic-info/companys/modules/companys-detail-drawer.vue b/rsf-design/src/views/basic-info/companys/modules/companys-detail-drawer.vue
index 3c6bb18..eaa8412 100644
--- a/rsf-design/src/views/basic-info/companys/modules/companys-detail-drawer.vue
+++ b/rsf-design/src/views/basic-info/companys/modules/companys-detail-drawer.vue
@@ -1,7 +1,7 @@
 <template>
   <ElDrawer
     :model-value="visible"
-    title="寰�鏉ヤ紒涓氳鎯�"
+    :title="t('pages.basicInfo.companys.dialog.titleDetail')"
     size="960px"
     destroy-on-close
     @update:model-value="handleVisibleChange"
@@ -11,32 +11,32 @@
         <ElSkeleton :rows="12" animated />
       </div>
       <div v-else class="space-y-4">
-        <ElDescriptions title="鍩虹淇℃伅" :column="2" border>
-          <ElDescriptionsItem label="浼佷笟缂栫爜">{{ detail.code || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="浼佷笟鍚嶇О">{{ detail.name || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鑻辨枃鍒悕">{{ detail.nameEn || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鍔╄鐮�">{{ detail.breifCode || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="浼佷笟绫诲瀷">{{ detail.typeText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鑱旂郴浜�">{{ detail.contact || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鑱旂郴鐢佃瘽">{{ detail.tel || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="閭">{{ detail.email || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="閭紪">{{ detail.pcode || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鐪佷唤">{{ detail.province || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鍩庡競">{{ detail.city || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鍦板潃" :span="2">{{ detail.address || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鐘舵��">
+        <ElDescriptions :title="t('pages.basicInfo.companys.detail.sections.basic')" :column="2" border>
+          <ElDescriptionsItem :label="t('pages.basicInfo.companys.table.code')">{{ detail.code || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.companys.table.name')">{{ detail.name || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.companys.table.nameEn')">{{ detail.nameEn || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.companys.table.briefCode')">{{ detail.breifCode || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.companys.table.type')">{{ detail.typeText || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.companys.table.contact')">{{ detail.contact || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.companys.table.tel')">{{ detail.tel || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.companys.table.email')">{{ detail.email || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.companys.table.postCode')">{{ detail.pcode || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.companys.table.province')">{{ detail.province || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.companys.table.city')">{{ detail.city || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.companys.table.address')" :span="2">{{ detail.address || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.status')">
             <ElTag :type="detail.statusType || 'info'" effect="light">
-              {{ detail.statusText || '--' }}
+              {{ detail.statusTextKey ? t(detail.statusTextKey) : detail.statusText || '--' }}
             </ElTag>
           </ElDescriptionsItem>
-          <ElDescriptionsItem label="澶囨敞" :span="2">{{ detail.memo || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.remark')" :span="2">{{ detail.memo || '--' }}</ElDescriptionsItem>
         </ElDescriptions>
 
-        <ElDescriptions title="瀹¤淇℃伅" :column="2" border>
-          <ElDescriptionsItem label="鍒涘缓浜�">{{ detail.createByText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鏇存柊浜�">{{ detail.updateByText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
+        <ElDescriptions :title="t('pages.basicInfo.companys.detail.sections.audit')" :column="2" border>
+          <ElDescriptionsItem :label="t('table.createBy')">{{ detail.createByText || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.createTime')">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.updateBy')">{{ detail.updateByText || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.updateTime')">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
         </ElDescriptions>
       </div>
     </ElScrollbar>
@@ -45,6 +45,7 @@
 
 <script setup>
   import { computed } from 'vue'
+  import { useI18n } from 'vue-i18n'
 
   const props = defineProps({
     visible: { type: Boolean, default: false },
@@ -53,6 +54,7 @@
   })
 
   const emit = defineEmits(['update:visible'])
+  const { t } = useI18n()
 
   const visible = computed({
     get: () => props.visible,
diff --git a/rsf-design/src/views/basic-info/companys/modules/companys-dialog.vue b/rsf-design/src/views/basic-info/companys/modules/companys-dialog.vue
index 02459c0..37ea9aa 100644
--- a/rsf-design/src/views/basic-info/companys/modules/companys-dialog.vue
+++ b/rsf-design/src/views/basic-info/companys/modules/companys-dialog.vue
@@ -22,8 +22,8 @@
 
     <template #footer>
       <span class="dialog-footer">
-        <ElButton @click="handleCancel">鍙栨秷</ElButton>
-        <ElButton type="primary" @click="handleSubmit">纭畾</ElButton>
+        <ElButton @click="handleCancel">{{ t('common.cancel') }}</ElButton>
+        <ElButton type="primary" @click="handleSubmit">{{ t('common.confirm') }}</ElButton>
       </span>
     </template>
   </ElDialog>
@@ -31,6 +31,7 @@
 
 <script setup>
   import { computed, nextTick, reactive, ref, watch } from 'vue'
+  import { useI18n } from 'vue-i18n'
   import ArtForm from '@/components/core/forms/art-form/index.vue'
   import {
     buildCompanysDialogModel,
@@ -48,148 +49,151 @@
   const emit = defineEmits(['update:visible', 'submit'])
   const formRef = ref()
   const form = reactive(createCompanysFormState())
+  const { t } = useI18n()
 
   const isEdit = computed(() => props.dialogType === 'edit')
-  const dialogTitle = computed(() => (isEdit.value ? '缂栬緫寰�鏉ヤ紒涓�' : '鏂板寰�鏉ヤ紒涓�'))
+  const dialogTitle = computed(() =>
+    isEdit.value ? t('pages.basicInfo.companys.dialog.titleEdit') : t('pages.basicInfo.companys.dialog.titleCreate')
+  )
 
   const rules = computed(() => ({
-    name: [{ required: true, message: '璇疯緭鍏ヤ紒涓氬悕绉�', trigger: 'blur' }],
-    breifCode: [{ required: true, message: '璇疯緭鍏ュ姪璁扮爜', trigger: 'blur' }],
-    type: [{ required: true, message: '璇烽�夋嫨浼佷笟绫诲瀷', trigger: 'change' }]
+    name: [{ required: true, message: t('pages.basicInfo.companys.validation.name'), trigger: 'blur' }],
+    breifCode: [{ required: true, message: t('pages.basicInfo.companys.validation.briefCode'), trigger: 'blur' }],
+    type: [{ required: true, message: t('pages.basicInfo.companys.validation.type'), trigger: 'change' }]
   }))
 
   const formItems = computed(() => [
     {
-      label: '浼佷笟缂栫爜',
+      label: t('pages.basicInfo.companys.table.code'),
       key: 'code',
       type: 'input',
       props: {
-        placeholder: '鐣欑┖灏嗚嚜鍔ㄧ敓鎴�',
+        placeholder: t('pages.basicInfo.companys.placeholders.code'),
         clearable: true,
         disabled: isEdit.value
       }
     },
     {
-      label: '浼佷笟鍚嶇О',
+      label: t('pages.basicInfo.companys.table.name'),
       key: 'name',
       type: 'input',
       props: {
-        placeholder: '璇疯緭鍏ヤ紒涓氬悕绉�',
+        placeholder: t('pages.basicInfo.companys.placeholders.name'),
         clearable: true
       }
     },
     {
-      label: '鑻辨枃鍒悕',
+      label: t('pages.basicInfo.companys.table.nameEn'),
       key: 'nameEn',
       type: 'input',
       props: {
-        placeholder: '璇疯緭鍏ヨ嫳鏂囧埆鍚�',
+        placeholder: t('pages.basicInfo.companys.placeholders.nameEn'),
         clearable: true
       }
     },
     {
-      label: '鍔╄鐮�',
+      label: t('pages.basicInfo.companys.table.briefCode'),
       key: 'breifCode',
       type: 'input',
       props: {
-        placeholder: '璇疯緭鍏ュ姪璁扮爜',
+        placeholder: t('pages.basicInfo.companys.placeholders.briefCode'),
         clearable: true
       }
     },
     {
-      label: '浼佷笟绫诲瀷',
+      label: t('pages.basicInfo.companys.table.type'),
       key: 'type',
       type: 'select',
       props: {
-        placeholder: '璇烽�夋嫨浼佷笟绫诲瀷',
+        placeholder: t('pages.basicInfo.companys.placeholders.type'),
         clearable: true,
         filterable: true,
         options: props.typeOptions
       }
     },
     {
-      label: '鑱旂郴浜�',
+      label: t('pages.basicInfo.companys.table.contact'),
       key: 'contact',
       type: 'input',
       props: {
-        placeholder: '璇疯緭鍏ヨ仈绯讳汉',
+        placeholder: t('pages.basicInfo.companys.placeholders.contact'),
         clearable: true
       }
     },
     {
-      label: '鑱旂郴鐢佃瘽',
+      label: t('pages.basicInfo.companys.table.tel'),
       key: 'tel',
       type: 'input',
       props: {
-        placeholder: '璇疯緭鍏ヨ仈绯荤數璇�',
+        placeholder: t('pages.basicInfo.companys.placeholders.tel'),
         clearable: true
       }
     },
     {
-      label: '閭',
+      label: t('pages.basicInfo.companys.table.email'),
       key: 'email',
       type: 'input',
       props: {
-        placeholder: '璇疯緭鍏ラ偖绠�',
+        placeholder: t('pages.basicInfo.companys.placeholders.email'),
         clearable: true
       }
     },
     {
-      label: '閭紪',
+      label: t('pages.basicInfo.companys.table.postCode'),
       key: 'pcode',
       type: 'input',
       props: {
-        placeholder: '璇疯緭鍏ラ偖缂�',
+        placeholder: t('pages.basicInfo.companys.placeholders.postCode'),
         clearable: true
       }
     },
     {
-      label: '鐪佷唤',
+      label: t('pages.basicInfo.companys.table.province'),
       key: 'province',
       type: 'input',
       props: {
-        placeholder: '璇疯緭鍏ョ渷浠�',
+        placeholder: t('pages.basicInfo.companys.placeholders.province'),
         clearable: true
       }
     },
     {
-      label: '鍩庡競',
+      label: t('pages.basicInfo.companys.table.city'),
       key: 'city',
       type: 'input',
       props: {
-        placeholder: '璇疯緭鍏ュ煄甯�',
+        placeholder: t('pages.basicInfo.companys.placeholders.city'),
         clearable: true
       }
     },
     {
-      label: '鍦板潃',
+      label: t('pages.basicInfo.companys.table.address'),
       key: 'address',
       type: 'input',
       span: 24,
       props: {
-        placeholder: '璇疯緭鍏ュ湴鍧�',
+        placeholder: t('pages.basicInfo.companys.placeholders.address'),
         clearable: true
       }
     },
     {
-      label: '鐘舵��',
+      label: t('table.status'),
       key: 'status',
       type: 'select',
       props: {
-        placeholder: '璇烽�夋嫨鐘舵��',
+        placeholder: t('pages.basicInfo.companys.placeholders.status'),
         clearable: true,
-        options: getCompanysStatusOptions()
+        options: getCompanysStatusOptions(t)
       }
     },
     {
-      label: '澶囨敞',
+      label: t('table.remark'),
       key: 'memo',
       type: 'input',
       span: 24,
       props: {
         type: 'textarea',
         rows: 3,
-        placeholder: '璇疯緭鍏ュ娉�',
+        placeholder: t('pages.basicInfo.companys.placeholders.memo'),
         clearable: true
       }
     }
diff --git a/rsf-design/src/views/basic-info/contract/contractTable.columns.js b/rsf-design/src/views/basic-info/contract/contractTable.columns.js
index df71411..ac165a6 100644
--- a/rsf-design/src/views/basic-info/contract/contractTable.columns.js
+++ b/rsf-design/src/views/basic-info/contract/contractTable.columns.js
@@ -1,16 +1,17 @@
 import { h } from 'vue'
 import { ElTag } from 'element-plus'
 import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
+import { $t } from '@/locales'
 
 export function createContractTableColumns({ handleView, handleEdit, handleDelete, canEdit = true, canDelete = true }) {
-  const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+  const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
 
   if (canEdit && handleEdit) {
-    operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+    operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
   }
 
   if (canDelete && handleDelete) {
-    operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+    operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
   }
 
   return [
@@ -21,68 +22,68 @@
     },
     {
       type: 'globalIndex',
-      label: '搴忓彿',
+      label: $t('table.index'),
       width: 72,
       align: 'center'
     },
     {
       prop: 'code',
-      label: '鍚堝悓缂栫爜',
+      label: $t('pages.basicInfo.contract.table.code'),
       minWidth: 160,
       showOverflowTooltip: true
     },
     {
       prop: 'name',
-      label: '鍚堝悓鍚嶇О',
+      label: $t('pages.basicInfo.contract.table.name'),
       minWidth: 180,
       showOverflowTooltip: true
     },
     {
       prop: 'projectName',
-      label: '椤圭洰鍚嶇О',
+      label: $t('pages.basicInfo.contract.table.projectName'),
       minWidth: 180,
       showOverflowTooltip: true
     },
     {
       prop: 'status',
-      label: '鐘舵��',
+      label: $t('table.status'),
       width: 100,
       align: 'center',
       formatter: (row) => h(ElTag, { type: row.statusType || 'info', effect: 'light' }, () => row.statusText || '--')
     },
     {
       prop: 'updateByText',
-      label: '鏇存柊浜�',
+      label: $t('table.updateBy'),
       minWidth: 120,
       showOverflowTooltip: true
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: $t('table.updateTime'),
       minWidth: 170,
       showOverflowTooltip: true
     },
     {
       prop: 'createByText',
-      label: '鍒涘缓浜�',
+      label: $t('table.createBy'),
       minWidth: 120,
       showOverflowTooltip: true
     },
     {
       prop: 'createTimeText',
-      label: '鍒涘缓鏃堕棿',
+      label: $t('table.createTime'),
       minWidth: 170,
       showOverflowTooltip: true
     },
     {
       prop: 'memo',
-      label: '澶囨敞',
+      label: $t('table.remark'),
       minWidth: 200,
       showOverflowTooltip: true
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: $t('table.operation'),
       width: 120,
       align: 'center',
       fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/device-bind/deviceBindTable.columns.js b/rsf-design/src/views/basic-info/device-bind/deviceBindTable.columns.js
index 5ffea55..6c7a1f6 100644
--- a/rsf-design/src/views/basic-info/device-bind/deviceBindTable.columns.js
+++ b/rsf-design/src/views/basic-info/device-bind/deviceBindTable.columns.js
@@ -1,4 +1,5 @@
 import { h } from 'vue'
+import { $t } from '@/locales'
 import { ElTag } from 'element-plus'
 import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
 import { getDeviceBindFlagMeta } from './deviceBindPage.helpers'
@@ -11,71 +12,71 @@
   canEdit = true,
   canDelete = true
 } = {}) {
-  const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+  const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
 
   if (canEdit && handleEdit) {
-    operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+    operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
   }
 
   if (canDelete && handleDelete) {
-    operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+    operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
   }
 
   return [
     { type: 'selection', width: 48, align: 'center' },
-    { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+    { type: 'globalIndex', label: $t('table.index'), width: 72, align: 'center' },
     {
       prop: 'currentRow',
-      label: '褰撳墠鎺掑彿',
+      label: $t('pages.basicInfo.deviceBind.table.currentRow'),
       width: 100,
       align: 'center',
       formatter: (row) => row.currentRow ?? '--'
     },
     {
       prop: 'startRow',
-      label: '璧峰鎺掑彿',
+      label: $t('pages.basicInfo.deviceBind.table.startRow'),
       width: 100,
       align: 'center',
       formatter: (row) => row.startRow ?? '--'
     },
     {
       prop: 'endRow',
-      label: '缁堟鎺掑彿',
+      label: $t('pages.basicInfo.deviceBind.table.endRow'),
       width: 100,
       align: 'center',
       formatter: (row) => row.endRow ?? '--'
     },
     {
       prop: 'deviceQty',
-      label: '璁惧鏁伴噺',
+      label: $t('pages.basicInfo.deviceBind.table.deviceQty'),
       width: 100,
       align: 'center',
       formatter: (row) => row.deviceQty ?? '--'
     },
     {
       prop: 'startDeviceNo',
-      label: '璧峰璁惧鍙�',
+      label: $t('pages.basicInfo.deviceBind.table.startDeviceNo'),
       width: 110,
       align: 'center',
       formatter: (row) => row.startDeviceNo ?? '--'
     },
     {
       prop: 'endDeviceNo',
-      label: '缁堟璁惧鍙�',
+      label: $t('pages.basicInfo.deviceBind.table.endDeviceNo'),
       width: 110,
       align: 'center',
       formatter: (row) => row.endDeviceNo ?? '--'
     },
     {
       prop: 'staList',
-      label: '绔欑偣鍒楄〃',
+      label: $t('pages.basicInfo.deviceBind.table.staList'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.staList || '--'
     },
     {
       prop: 'typeIdText',
-      label: '搴撳尯绫诲瀷',
+      label: $t('pages.basicInfo.deviceBind.table.typeId'),
       minWidth: 150,
       showOverflowTooltip: true,
       formatter: (row) =>
@@ -83,7 +84,7 @@
     },
     {
       prop: 'beSimilar',
-      label: '鐗╂枡鐩镐技',
+      label: $t('pages.basicInfo.deviceBind.table.beSimilar'),
       width: 100,
       align: 'center',
       formatter: (row) => {
@@ -93,7 +94,7 @@
     },
     {
       prop: 'emptySimilar',
-      label: '绌烘澘闈犺繎',
+      label: $t('pages.basicInfo.deviceBind.table.emptySimilar'),
       width: 100,
       align: 'center',
       formatter: (row) => {
@@ -103,28 +104,28 @@
     },
     {
       prop: 'memo',
-      label: '澶囨敞',
+      label: $t('table.memo'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.memo || '--'
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: $t('table.updateTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.updateTimeText || '--'
     },
     {
       prop: 'createTimeText',
-      label: '鍒涘缓鏃堕棿',
+      label: $t('table.createTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.createTimeText || '--'
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: $t('table.operation'),
       width: 120,
       align: 'center',
       fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/device-site/deviceSiteTable.columns.js b/rsf-design/src/views/basic-info/device-site/deviceSiteTable.columns.js
index 8e06c02..7597a25 100644
--- a/rsf-design/src/views/basic-info/device-site/deviceSiteTable.columns.js
+++ b/rsf-design/src/views/basic-info/device-site/deviceSiteTable.columns.js
@@ -1,6 +1,7 @@
 import { h } from 'vue'
 import { ElTag } from 'element-plus'
 import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
+import { $t } from '@/locales'
 import { getDeviceSiteStatusMeta } from './deviceSitePage.helpers'
 
 export function createDeviceSiteTableColumns({
@@ -11,103 +12,103 @@
   canEdit = true,
   canDelete = true
 } = {}) {
-  const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+  const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
 
   if (handleInit) {
-    operations.push({ key: 'init', label: '鍒濆鍖�', icon: 'ri:route-line' })
+    operations.push({ key: 'init', label: $t('common.actions.initialize'), icon: 'ri:route-line' })
   }
 
   if (canEdit && handleEdit) {
-    operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+    operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
   }
 
   if (canDelete && handleDelete) {
-    operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+    operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
   }
 
   return [
     { type: 'selection', width: 48, align: 'center' },
-    { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+    { type: 'globalIndex', label: $t('table.index'), width: 72, align: 'center' },
     {
       prop: 'typeText',
-      label: '绔欑偣绫诲瀷',
+      label: $t('pages.basicInfo.deviceSite.table.type'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.typeText || row.type$ || '--'
     },
     {
       prop: 'site',
-      label: '浣滀笟绔欑偣',
+      label: $t('pages.basicInfo.deviceSite.table.site'),
       minWidth: 150,
       showOverflowTooltip: true,
       formatter: (row) => row.site || '--'
     },
     {
       prop: 'name',
-      label: '鍚嶇О',
+      label: $t('pages.basicInfo.deviceSite.table.name'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.name || '--'
     },
     {
       prop: 'target',
-      label: '鐩爣绔欑偣',
+      label: $t('pages.basicInfo.deviceSite.table.target'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.target || '--'
     },
     {
       prop: 'label',
-      label: '绔欑偣鏍囩',
+      label: $t('pages.basicInfo.deviceSite.table.label'),
       minWidth: 150,
       showOverflowTooltip: true,
       formatter: (row) => row.label || '--'
     },
     {
       prop: 'deviceText',
-      label: '璁惧绫诲瀷',
+      label: $t('pages.basicInfo.deviceSite.table.deviceType'),
       minWidth: 140,
       showOverflowTooltip: true,
       formatter: (row) => row.deviceText || row.device$ || row.device || '--'
     },
     {
       prop: 'deviceCode',
-      label: '璁惧缂栧彿',
+      label: $t('pages.basicInfo.deviceSite.table.deviceCode'),
       minWidth: 140,
       showOverflowTooltip: true,
       formatter: (row) => row.deviceCode || '--'
     },
     {
       prop: 'deviceSite',
-      label: '璁惧绔欑偣',
+      label: $t('pages.basicInfo.deviceSite.table.deviceSite'),
       minWidth: 150,
       showOverflowTooltip: true,
       formatter: (row) => row.deviceSite || '--'
     },
     {
       prop: 'channel',
-      label: '宸烽亾',
+      label: $t('pages.basicInfo.deviceSite.table.channel'),
       width: 90,
       align: 'center',
       formatter: (row) => row.channel ?? '--'
     },
     {
       prop: 'areaIdStart',
-      label: '婧愬簱鍖�',
+      label: $t('pages.basicInfo.deviceSite.table.areaStart'),
       width: 100,
       align: 'center',
       formatter: (row) => row.areaIdStart ?? '--'
     },
     {
       prop: 'areaIdEnd',
-      label: '鐩爣搴撳尯',
+      label: $t('pages.basicInfo.deviceSite.table.areaEnd'),
       width: 100,
       align: 'center',
       formatter: (row) => row.areaIdEnd ?? '--'
     },
     {
       prop: 'status',
-      label: '鐘舵��',
+      label: $t('table.status'),
       width: 100,
       align: 'center',
       formatter: (row) => {
@@ -117,21 +118,21 @@
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: $t('table.updateTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.updateTimeText || row.updateTime$ || '--'
     },
     {
       prop: 'memo',
-      label: '澶囨敞',
+      label: $t('table.remark'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.memo || '--'
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: $t('table.operation'),
       width: 120,
       align: 'center',
       fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/loc-area-mat-rela/locAreaMatRelaTable.columns.js b/rsf-design/src/views/basic-info/loc-area-mat-rela/locAreaMatRelaTable.columns.js
index 6929fc1..e9c6180 100644
--- a/rsf-design/src/views/basic-info/loc-area-mat-rela/locAreaMatRelaTable.columns.js
+++ b/rsf-design/src/views/basic-info/loc-area-mat-rela/locAreaMatRelaTable.columns.js
@@ -1,4 +1,5 @@
 import { h } from 'vue'
+import { $t } from '@/locales'
 import { ElTag } from 'element-plus'
 import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
 import { getLocAreaMatRelaStatusMeta } from './locAreaMatRelaPage.helpers'
@@ -10,14 +11,14 @@
   canEdit = true,
   canDelete = true
 } = {}) {
-  const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+  const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
 
   if (canEdit && handleEdit) {
-    operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+    operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
   }
 
   if (canDelete && handleDelete) {
-    operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+    operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
   }
 
   return [
@@ -28,69 +29,69 @@
     },
     {
       type: 'globalIndex',
-      label: '搴忓彿',
+      label: $t('table.index'),
       width: 72,
       align: 'center'
     },
     {
       prop: 'areaMatIdText',
-      label: '涓诲崟',
+      label: $t('pages.basicInfo.locAreaMatRela.table.areaMatId'),
       minWidth: 200,
       showOverflowTooltip: true,
       formatter: (row) => row.areaMatIdText || row.areaMatId || '--'
     },
     {
       prop: 'areaIdText',
-      label: '搴撳尯',
+      label: $t('pages.basicInfo.locAreaMatRela.table.areaId'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.areaIdText || '--'
     },
     {
       prop: 'code',
-      label: '缂栧彿',
+      label: $t('pages.basicInfo.locAreaMatRela.table.code'),
       minWidth: 150,
       showOverflowTooltip: true,
       formatter: (row) => row.code || '--'
     },
     {
       prop: 'matnrIdText',
-      label: '鐗╂枡',
+      label: $t('pages.basicInfo.locAreaMatRela.table.matnrId'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.matnrIdText || '--'
     },
     {
       prop: 'groupIdText',
-      label: '鐗╂枡鍒嗙粍',
+      label: $t('pages.basicInfo.locAreaMatRela.table.groupId'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.groupIdText || '--'
     },
     {
       prop: 'locTypeIdText',
-      label: '搴撲綅绫诲瀷',
+      label: $t('pages.basicInfo.locAreaMatRela.table.locTypeId'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.locTypeIdText || '--'
     },
     {
       prop: 'locIdText',
-      label: '搴撲綅',
+      label: $t('pages.basicInfo.locAreaMatRela.table.locId'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.locIdText || '--'
     },
     {
       prop: 'relationTypeText',
-      label: '鍏崇郴绫诲瀷',
+      label: $t('pages.basicInfo.locAreaMatRela.table.relationType'),
       width: 110,
       align: 'center',
       formatter: (row) => row.relationTypeText || '--'
     },
     {
       prop: 'status',
-      label: '鐘舵��',
+      label: $t('table.status'),
       width: 96,
       align: 'center',
       formatter: (row) => {
@@ -100,28 +101,28 @@
     },
     {
       prop: 'memo',
-      label: '澶囨敞',
+      label: $t('table.memo'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.memo || '--'
     },
     {
       prop: 'createTimeText',
-      label: '鍒涘缓鏃堕棿',
+      label: $t('table.createTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.createTimeText || '--'
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: $t('table.updateTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.updateTimeText || '--'
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: $t('table.operation'),
       width: 120,
       align: 'center',
       fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/loc-area-mat/locAreaMatTable.columns.js b/rsf-design/src/views/basic-info/loc-area-mat/locAreaMatTable.columns.js
index 1a63162..9733761 100644
--- a/rsf-design/src/views/basic-info/loc-area-mat/locAreaMatTable.columns.js
+++ b/rsf-design/src/views/basic-info/loc-area-mat/locAreaMatTable.columns.js
@@ -1,4 +1,5 @@
 import { h } from 'vue'
+import { $t } from '@/locales'
 import { ElTag } from 'element-plus'
 import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
 import { getLocAreaMatStatusMeta } from './locAreaMatPage.helpers'
@@ -10,14 +11,14 @@
   canEdit = true,
   canDelete = true
 } = {}) {
-  const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+  const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
 
   if (canEdit && handleEdit) {
-    operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+    operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
   }
 
   if (canDelete && handleDelete) {
-    operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+    operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
   }
 
   return [
@@ -28,41 +29,41 @@
     },
     {
       type: 'globalIndex',
-      label: '搴忓彿',
+      label: $t('table.index'),
       width: 72,
       align: 'center'
     },
     {
       prop: 'code',
-      label: '閫昏緫缂栧彿',
+      label: $t('pages.basicInfo.locAreaMat.table.code'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.code || '--'
     },
     {
       prop: 'warehouseName',
-      label: '浠撳簱',
+      label: $t('pages.basicInfo.locAreaMat.table.warehouseName'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.warehouseName || row.warehouseIdText || '--'
     },
     {
       prop: 'areaName',
-      label: '搴撳尯',
+      label: $t('pages.basicInfo.locAreaMat.table.areaName'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.areaName || row.areaIdText || '--'
     },
     {
       prop: 'depict',
-      label: '閫昏緫鎻忚堪',
+      label: $t('pages.basicInfo.locAreaMat.table.depict'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.depict || '--'
     },
     {
       prop: 'status',
-      label: '鐘舵��',
+      label: $t('table.status'),
       width: 96,
       align: 'center',
       formatter: (row) => {
@@ -72,42 +73,42 @@
     },
     {
       prop: 'memo',
-      label: '澶囨敞',
+      label: $t('table.memo'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.memo || '--'
     },
     {
       prop: 'createByText',
-      label: '鍒涘缓浜�',
+      label: $t('table.createBy'),
       minWidth: 120,
       showOverflowTooltip: true,
       formatter: (row) => row.createByText || '--'
     },
     {
       prop: 'createTimeText',
-      label: '鍒涘缓鏃堕棿',
+      label: $t('table.createTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.createTimeText || '--'
     },
     {
       prop: 'updateByText',
-      label: '鏇存柊浜�',
+      label: $t('table.updateBy'),
       minWidth: 120,
       showOverflowTooltip: true,
       formatter: (row) => row.updateByText || '--'
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: $t('table.updateTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.updateTimeText || '--'
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: $t('table.operation'),
       width: 120,
       align: 'center',
       fixed: 'right',
@@ -123,4 +124,3 @@
     }
   ]
 }
-
diff --git a/rsf-design/src/views/basic-info/loc-area-rela/locAreaRelaTable.columns.js b/rsf-design/src/views/basic-info/loc-area-rela/locAreaRelaTable.columns.js
index e222e09..c2982e2 100644
--- a/rsf-design/src/views/basic-info/loc-area-rela/locAreaRelaTable.columns.js
+++ b/rsf-design/src/views/basic-info/loc-area-rela/locAreaRelaTable.columns.js
@@ -1,4 +1,5 @@
 import { h } from 'vue'
+import { $t } from '@/locales'
 import { ElTag } from 'element-plus'
 import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
 import { getLocAreaRelaStatusMeta } from './locAreaRelaPage.helpers'
@@ -10,16 +11,16 @@
   canEdit = true,
   canDelete = true
 } = {}) {
-  const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+  const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
 
   if (canEdit && handleEdit) {
-    operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+    operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
   }
 
   if (canDelete && handleDelete) {
     operations.push({
       key: 'delete',
-      label: '鍒犻櫎',
+      label: $t('common.actions.delete'),
       icon: 'ri:delete-bin-5-line',
       color: 'var(--art-error)'
     })
@@ -33,27 +34,27 @@
     },
     {
       type: 'globalIndex',
-      label: '搴忓彿',
+      label: $t('table.index'),
       width: 72,
       align: 'center'
     },
     {
       prop: 'locAreaIdText',
-      label: '鍒嗗尯ID',
+      label: $t('pages.basicInfo.locAreaRela.table.locAreaId'),
       minWidth: 140,
       showOverflowTooltip: true,
       formatter: (row) => row.locAreaIdText || row.locAreaId || '--'
     },
     {
       prop: 'locIdText',
-      label: '搴撲綅ID',
+      label: $t('pages.basicInfo.locAreaRela.table.locId'),
       minWidth: 140,
       showOverflowTooltip: true,
       formatter: (row) => row.locIdText || row.locId || '--'
     },
     {
       prop: 'status',
-      label: '鐘舵��',
+      label: $t('table.status'),
       width: 96,
       align: 'center',
       formatter: (row) => {
@@ -63,42 +64,42 @@
     },
     {
       prop: 'memo',
-      label: '澶囨敞',
+      label: $t('table.memo'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.memo || '--'
     },
     {
       prop: 'createByText',
-      label: '鍒涘缓浜�',
+      label: $t('table.createBy'),
       minWidth: 120,
       showOverflowTooltip: true,
       formatter: (row) => row.createByText || '--'
     },
     {
       prop: 'createTimeText',
-      label: '鍒涘缓鏃堕棿',
+      label: $t('table.createTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.createTimeText || '--'
     },
     {
       prop: 'updateByText',
-      label: '鏇存柊浜�',
+      label: $t('table.updateBy'),
       minWidth: 120,
       showOverflowTooltip: true,
       formatter: (row) => row.updateByText || '--'
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: $t('table.updateTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.updateTimeText || '--'
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: $t('table.operation'),
       width: 120,
       align: 'center',
       fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/loc-area/locAreaTable.columns.js b/rsf-design/src/views/basic-info/loc-area/locAreaTable.columns.js
index a6c02b3..6535b8f 100644
--- a/rsf-design/src/views/basic-info/loc-area/locAreaTable.columns.js
+++ b/rsf-design/src/views/basic-info/loc-area/locAreaTable.columns.js
@@ -1,4 +1,5 @@
 import { h } from 'vue'
+import { $t } from '@/locales'
 import { ElTag } from 'element-plus'
 import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
 import { getLocAreaStatusMeta } from './locAreaPage.helpers'
@@ -10,43 +11,43 @@
   canEdit = true,
   canDelete = true
 } = {}) {
-  const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+  const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
 
   if (canEdit && handleEdit) {
-    operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+    operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
   }
 
   if (canDelete && handleDelete) {
-    operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+    operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
   }
 
   return [
     { type: 'selection', width: 48, align: 'center' },
-    { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+    { type: 'globalIndex', label: $t('table.index'), width: 72, align: 'center' },
     {
       prop: 'areaName',
-      label: '搴撳尯',
+      label: $t('pages.basicInfo.locArea.table.area'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.areaName || row.areaId$ || row.areaId || '--'
     },
     {
       prop: 'name',
-      label: '鍚嶇О',
+      label: $t('table.name'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.name || '--'
     },
     {
       prop: 'code',
-      label: '缂栫爜',
+      label: $t('table.code'),
       minWidth: 150,
       showOverflowTooltip: true,
       formatter: (row) => row.code || '--'
     },
     {
       prop: 'status',
-      label: '鐘舵��',
+      label: $t('table.status'),
       width: 100,
       align: 'center',
       formatter: (row) => {
@@ -56,42 +57,42 @@
     },
     {
       prop: 'memo',
-      label: '澶囨敞',
+      label: $t('table.memo'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.memo || '--'
     },
     {
       prop: 'updateByText',
-      label: '鏇存柊浜�',
+      label: $t('table.updateBy'),
       minWidth: 120,
       showOverflowTooltip: true,
       formatter: (row) => row.updateByText || '--'
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: $t('table.updateTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.updateTimeText || '--'
     },
     {
       prop: 'createByText',
-      label: '鍒涘缓浜�',
+      label: $t('table.createBy'),
       minWidth: 120,
       showOverflowTooltip: true,
       formatter: (row) => row.createByText || '--'
     },
     {
       prop: 'createTimeText',
-      label: '鍒涘缓鏃堕棿',
+      label: $t('table.createTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.createTimeText || '--'
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: $t('table.operation'),
       width: 120,
       align: 'center',
       fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/loc-type/locTypeTable.columns.js b/rsf-design/src/views/basic-info/loc-type/locTypeTable.columns.js
index 87e2758..3586833 100644
--- a/rsf-design/src/views/basic-info/loc-type/locTypeTable.columns.js
+++ b/rsf-design/src/views/basic-info/loc-type/locTypeTable.columns.js
@@ -1,4 +1,5 @@
 import { h } from 'vue'
+import { $t } from '@/locales'
 import { ElTag } from 'element-plus'
 import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
 import { getLocTypeStatusMeta } from './locTypePage.helpers'
@@ -10,50 +11,50 @@
   canEdit = true,
   canDelete = true
 } = {}) {
-  const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+  const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
 
   if (canEdit && handleEdit) {
-    operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+    operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
   }
 
   if (canDelete && handleDelete) {
-    operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+    operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
   }
 
   return [
     { type: 'selection', width: 48, align: 'center' },
-    { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+    { type: 'globalIndex', label: $t('table.index'), width: 72, align: 'center' },
     {
       prop: 'uuid',
-      label: '鏍囪瘑',
+      label: $t('pages.basicInfo.locType.table.uuid'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.uuid || '--'
     },
     {
       prop: 'code',
-      label: '缂栫爜',
+      label: $t('table.code'),
       minWidth: 150,
       showOverflowTooltip: true,
       formatter: (row) => row.code || '--'
     },
     {
       prop: 'name',
-      label: '鍚嶇О',
+      label: $t('table.name'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.name || '--'
     },
     {
       prop: 'regex',
-      label: '鏉$爜瑙勫垯',
+      label: $t('pages.basicInfo.locType.table.regex'),
       minWidth: 220,
       showOverflowTooltip: true,
       formatter: (row) => row.regex || '--'
     },
     {
       prop: 'status',
-      label: '鐘舵��',
+      label: $t('table.status'),
       width: 100,
       align: 'center',
       formatter: (row) => {
@@ -63,42 +64,42 @@
     },
     {
       prop: 'memo',
-      label: '澶囨敞',
+      label: $t('table.memo'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.memo || '--'
     },
     {
       prop: 'updateByText',
-      label: '鏇存柊浜�',
+      label: $t('table.updateBy'),
       minWidth: 120,
       showOverflowTooltip: true,
       formatter: (row) => row.updateByText || '--'
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: $t('table.updateTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.updateTimeText || '--'
     },
     {
       prop: 'createByText',
-      label: '鍒涘缓浜�',
+      label: $t('table.createBy'),
       minWidth: 120,
       showOverflowTooltip: true,
       formatter: (row) => row.createByText || '--'
     },
     {
       prop: 'createTimeText',
-      label: '鍒涘缓鏃堕棿',
+      label: $t('table.createTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.createTimeText || '--'
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: $t('table.operation'),
       width: 120,
       align: 'center',
       fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/loc/locTable.columns.js b/rsf-design/src/views/basic-info/loc/locTable.columns.js
index 2ea0bcb..537eda2 100644
--- a/rsf-design/src/views/basic-info/loc/locTable.columns.js
+++ b/rsf-design/src/views/basic-info/loc/locTable.columns.js
@@ -1,6 +1,7 @@
 import { h } from 'vue'
 import { ElTag } from 'element-plus'
 import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
+import { $t } from '@/locales'
 import { getLocStatusMeta, getLocUseStatusMeta } from './locPage.helpers'
 
 function createTextColumn(prop, label, minWidth, formatter) {
@@ -43,37 +44,37 @@
   canEdit = true,
   canDelete = true
 } = {}) {
-  const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+  const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
 
   if (canEdit && handleEdit) {
-    operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+    operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
   }
 
   if (canDelete && handleDelete) {
-    operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+    operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
   }
 
   return [
     { type: 'selection', width: 48, align: 'center' },
-    { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
-    createTextColumn('code', '搴撲綅鍙�', 160),
-    createTextColumn('warehouseName', '浠撳簱', 150, (row) => row.warehouseName || row.warehouseId$ || '--'),
-    createTextColumn('areaName', '搴撳尯', 150, (row) => row.areaName || row.areaId$ || '--'),
-    createTextColumn('typeIdsText', '搴撲綅绫诲瀷', 180),
-    createNumberColumn('row', '鎺�', 80),
-    createNumberColumn('col', '鍒�', 80),
-    createNumberColumn('lev', '灞�', 80),
-    createNumberColumn('channel', '宸烽亾', 90),
-    createTagColumn('useStatus', '浣跨敤鐘舵��', 110, (row) => getLocUseStatusMeta(row.useStatus)),
-    createTextColumn('flagLogicText', '铏氭嫙搴撲綅', 110),
-    createTextColumn('flagLabelMangeText', '鏍囩绠$悊', 110),
-    createTextColumn('barcode', '瀹瑰櫒缂栫爜', 150),
-    createTagColumn('status', '鐘舵��', 100, (row) => getLocStatusMeta(row.statusBool ?? row.status)),
-    createTextColumn('updateTimeText', '鏇存柊鏃堕棿', 170, (row) => row.updateTimeText || row.updateTime$ || '--'),
-    createTextColumn('memo', '澶囨敞', 180),
+    { type: 'globalIndex', label: $t('table.index'), width: 72, align: 'center' },
+    createTextColumn('code', $t('pages.basicInfo.loc.table.code'), 160),
+    createTextColumn('warehouseName', $t('pages.basicInfo.loc.table.warehouseName'), 150, (row) => row.warehouseName || row.warehouseId$ || '--'),
+    createTextColumn('areaName', $t('pages.basicInfo.loc.table.areaName'), 150, (row) => row.areaName || row.areaId$ || '--'),
+    createTextColumn('typeIdsText', $t('pages.basicInfo.loc.table.typeIds'), 180),
+    createNumberColumn('row', $t('pages.basicInfo.loc.table.row'), 80),
+    createNumberColumn('col', $t('pages.basicInfo.loc.table.col'), 80),
+    createNumberColumn('lev', $t('pages.basicInfo.loc.table.lev'), 80),
+    createNumberColumn('channel', $t('pages.basicInfo.loc.table.channel'), 90),
+    createTagColumn('useStatus', $t('pages.basicInfo.loc.table.useStatus'), 110, (row) => getLocUseStatusMeta(row.useStatus)),
+    createTextColumn('flagLogicText', $t('pages.basicInfo.loc.table.flagLogic'), 110),
+    createTextColumn('flagLabelMangeText', $t('pages.basicInfo.loc.table.flagLabelManage'), 110),
+    createTextColumn('barcode', $t('pages.basicInfo.loc.table.barcode'), 150),
+    createTagColumn('status', $t('table.status'), 100, (row) => getLocStatusMeta(row.statusBool ?? row.status)),
+    createTextColumn('updateTimeText', $t('table.updateTime'), 170, (row) => row.updateTimeText || row.updateTime$ || '--'),
+    createTextColumn('memo', $t('table.remark'), 180),
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: $t('table.operation'),
       width: 120,
       align: 'center',
       fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/matnr-group/matnrGroupTable.columns.js b/rsf-design/src/views/basic-info/matnr-group/matnrGroupTable.columns.js
index 8720615..4e44086 100644
--- a/rsf-design/src/views/basic-info/matnr-group/matnrGroupTable.columns.js
+++ b/rsf-design/src/views/basic-info/matnr-group/matnrGroupTable.columns.js
@@ -1,4 +1,5 @@
 import { h } from 'vue'
+import { $t } from '@/locales'
 import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
 
 export function createMatnrGroupTableColumns({
@@ -8,14 +9,14 @@
   canEdit = true,
   canDelete = true
 }) {
-  const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+  const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
 
   if (canEdit && handleEdit) {
-    operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+    operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
   }
 
   if (canDelete && handleDelete) {
-    operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+    operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
   }
 
   return [
@@ -26,26 +27,26 @@
     },
     {
       prop: 'code',
-      label: '鍒嗙粍缂栫爜',
+      label: $t('pages.basicInfo.matnrGroup.table.code'),
       minWidth: 160,
       showOverflowTooltip: true
     },
     {
       prop: 'parCode',
-      label: '涓婄骇缂栫爜',
+      label: $t('pages.basicInfo.matnrGroup.table.parentCode'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.parCode || '--'
     },
     {
       prop: 'name',
-      label: '鍒嗙粍鍚嶇О',
+      label: $t('pages.basicInfo.matnrGroup.table.name'),
       minWidth: 240,
       showOverflowTooltip: true
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: $t('table.operation'),
       width: 120,
       align: 'center',
       fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/task-path-template-merge/taskPathTemplateMergeTable.columns.js b/rsf-design/src/views/basic-info/task-path-template-merge/taskPathTemplateMergeTable.columns.js
index e381790..e9f978d 100644
--- a/rsf-design/src/views/basic-info/task-path-template-merge/taskPathTemplateMergeTable.columns.js
+++ b/rsf-design/src/views/basic-info/task-path-template-merge/taskPathTemplateMergeTable.columns.js
@@ -1,6 +1,7 @@
 import { h } from 'vue'
 import { ElTag } from 'element-plus'
 import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
+import { $t } from '@/locales'
 import {
   getTaskPathTemplateMergeCurrentMeta,
   getTaskPathTemplateMergeStatusMeta
@@ -15,36 +16,36 @@
   canEdit = true,
   canDelete = true
 } = {}) {
-  const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+  const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
 
   if (canEdit && handleEdit) {
-    operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+    operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
   }
 
   if (canDelete && handleDelete) {
-    operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+    operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
   }
 
   return [
     { type: 'selection', width: 48, align: 'center' },
-    { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+    { type: 'globalIndex', label: $t('table.index'), width: 72, align: 'center' },
     {
       prop: 'templateCode',
-      label: '妯℃澘缂栫爜',
+      label: $t('pages.basicInfo.taskPathTemplateMerge.table.templateCode'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.templateCode || '--'
     },
     {
       prop: 'templateName',
-      label: '妯℃澘鍚嶇О',
+      label: $t('pages.basicInfo.taskPathTemplateMerge.table.templateName'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.templateName || '--'
     },
     {
       prop: 'sourceTypeText',
-      label: '璧风偣绫诲瀷',
+      label: $t('pages.basicInfo.taskPathTemplateMerge.table.sourceType'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) =>
@@ -52,7 +53,7 @@
     },
     {
       prop: 'targetTypeText',
-      label: '缁堢偣绫诲瀷',
+      label: $t('pages.basicInfo.taskPathTemplateMerge.table.targetType'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) =>
@@ -60,7 +61,7 @@
     },
     {
       prop: 'conditionExpressionText',
-      label: '鏉′欢琛ㄨ揪寮�',
+      label: $t('pages.basicInfo.taskPathTemplateMerge.table.conditionExpression'),
       minWidth: 220,
       showOverflowTooltip: true,
       formatter: (row) =>
@@ -70,21 +71,21 @@
     },
     {
       prop: 'conditionDesc',
-      label: '鏉′欢鎻忚堪',
+      label: $t('pages.basicInfo.taskPathTemplateMerge.table.conditionDesc'),
       minWidth: 220,
       showOverflowTooltip: true,
       formatter: (row) => row.conditionDesc || '--'
     },
     {
       prop: 'version',
-      label: '鐗堟湰鍙�',
+      label: $t('pages.basicInfo.taskPathTemplateMerge.table.version'),
       width: 90,
       align: 'center',
       formatter: (row) => row.version ?? '--'
     },
     {
       prop: 'isCurrent',
-      label: '褰撳墠鐗堟湰',
+      label: $t('pages.basicInfo.taskPathTemplateMerge.table.isCurrent'),
       width: 110,
       align: 'center',
       formatter: (row) => {
@@ -94,56 +95,56 @@
     },
     {
       prop: 'effectiveTimeText',
-      label: '鐢熸晥鏃堕棿',
+      label: $t('pages.basicInfo.taskPathTemplateMerge.table.effectiveTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.effectiveTimeText || '--'
     },
     {
       prop: 'expireTimeText',
-      label: '澶辨晥鏃堕棿',
+      label: $t('pages.basicInfo.taskPathTemplateMerge.table.expireTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.expireTimeText || '--'
     },
     {
       prop: 'priority',
-      label: '浼樺厛绾�',
+      label: $t('pages.basicInfo.taskPathTemplateMerge.table.priority'),
       width: 90,
       align: 'center',
       formatter: (row) => row.priority ?? '--'
     },
     {
       prop: 'timeoutMinutes',
-      label: '瓒呮椂(鍒�)',
+      label: $t('pages.basicInfo.taskPathTemplateMerge.table.timeoutMinutes'),
       width: 100,
       align: 'center',
       formatter: (row) => row.timeoutMinutes ?? '--'
     },
     {
       prop: 'maxRetryTimes',
-      label: '鏈�澶ч噸璇�',
+      label: $t('pages.basicInfo.taskPathTemplateMerge.table.maxRetryTimes'),
       width: 100,
       align: 'center',
       formatter: (row) => row.maxRetryTimes ?? '--'
     },
     {
       prop: 'retryIntervalSeconds',
-      label: '閲嶈瘯闂撮殧(绉�)',
+      label: $t('pages.basicInfo.taskPathTemplateMerge.table.retryIntervalSeconds'),
       minWidth: 120,
       align: 'center',
       formatter: (row) => row.retryIntervalSeconds ?? '--'
     },
     {
       prop: 'stepSize',
-      label: '姝ュ簭闀垮害',
+      label: $t('pages.basicInfo.taskPathTemplateMerge.table.stepSize'),
       width: 90,
       align: 'center',
       formatter: (row) => row.stepSize ?? '--'
     },
     {
       prop: 'status',
-      label: '鐘舵��',
+      label: $t('table.status'),
       width: 100,
       align: 'center',
       formatter: (row) => {
@@ -153,35 +154,35 @@
     },
     {
       prop: 'createByText',
-      label: '鍒涘缓浜�',
+      label: $t('table.createBy'),
       minWidth: 120,
       showOverflowTooltip: true,
       formatter: (row) => row.createByText || row.createBy$ || '--'
     },
     {
       prop: 'createTimeText',
-      label: '鍒涘缓鏃堕棿',
+      label: $t('table.createTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.createTimeText || row.createTime$ || '--'
     },
     {
       prop: 'updateByText',
-      label: '鏇存柊浜�',
+      label: $t('table.updateBy'),
       minWidth: 120,
       showOverflowTooltip: true,
       formatter: (row) => row.updateByText || row.updateBy$ || '--'
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: $t('table.updateTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.updateTimeText || row.updateTime$ || '--'
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: $t('table.operation'),
       width: 120,
       align: 'center',
       fixed: 'right',
@@ -197,4 +198,3 @@
     }
   ]
 }
-
diff --git a/rsf-design/src/views/basic-info/task-path-template-node/taskPathTemplateNodeTable.columns.js b/rsf-design/src/views/basic-info/task-path-template-node/taskPathTemplateNodeTable.columns.js
index 701ccbf..2604f03 100644
--- a/rsf-design/src/views/basic-info/task-path-template-node/taskPathTemplateNodeTable.columns.js
+++ b/rsf-design/src/views/basic-info/task-path-template-node/taskPathTemplateNodeTable.columns.js
@@ -1,6 +1,7 @@
 import { h } from 'vue'
 import { ElTag } from 'element-plus'
 import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
+import { $t } from '@/locales'
 import {
   getTaskPathTemplateNodeBooleanMeta,
   getTaskPathTemplateNodeTypeMeta
@@ -13,57 +14,57 @@
   canEdit = true,
   canDelete = true
 } = {}) {
-  const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+  const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
 
   if (canEdit && handleEdit) {
-    operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+    operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
   }
 
   if (canDelete && handleDelete) {
-    operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+    operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
   }
 
   return [
     { type: 'selection', width: 48, align: 'center' },
-    { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+    { type: 'globalIndex', label: $t('table.index'), width: 72, align: 'center' },
     {
       prop: 'templateId',
-      label: '妯℃澘ID',
+      label: $t('pages.basicInfo.taskPathTemplateNode.table.templateId'),
       width: 110,
       align: 'center',
       formatter: (row) => row.templateId ?? '--'
     },
     {
       prop: 'templateCode',
-      label: '妯℃澘缂栫爜',
+      label: $t('pages.basicInfo.taskPathTemplateNode.table.templateCode'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.templateCode || '--'
     },
     {
       prop: 'nodeOrder',
-      label: '鑺傜偣椤哄簭',
+      label: $t('pages.basicInfo.taskPathTemplateNode.table.nodeOrder'),
       width: 100,
       align: 'center',
       formatter: (row) => row.nodeOrder ?? '--'
     },
     {
       prop: 'nodeCode',
-      label: '鑺傜偣缂栫爜',
+      label: $t('pages.basicInfo.taskPathTemplateNode.table.nodeCode'),
       minWidth: 150,
       showOverflowTooltip: true,
       formatter: (row) => row.nodeCode || '--'
     },
     {
       prop: 'nodeName',
-      label: '鑺傜偣鍚嶇О',
+      label: $t('pages.basicInfo.taskPathTemplateNode.table.nodeName'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.nodeName || '--'
     },
     {
       prop: 'nodeTypeText',
-      label: '鑺傜偣绫诲瀷',
+      label: $t('pages.basicInfo.taskPathTemplateNode.table.nodeType'),
       width: 120,
       align: 'center',
       formatter: (row) => {
@@ -73,21 +74,21 @@
     },
     {
       prop: 'systemCode',
-      label: '绯荤粺缂栫爜',
+      label: $t('pages.basicInfo.taskPathTemplateNode.table.systemCode'),
       minWidth: 150,
       showOverflowTooltip: true,
       formatter: (row) => row.systemCode || '--'
     },
     {
       prop: 'systemName',
-      label: '绯荤粺鍚嶇О',
+      label: $t('pages.basicInfo.taskPathTemplateNode.table.systemName'),
       minWidth: 150,
       showOverflowTooltip: true,
       formatter: (row) => row.systemName || '--'
     },
     {
       prop: 'mandatoryText',
-      label: '蹇呴』鑺傜偣',
+      label: $t('pages.basicInfo.taskPathTemplateNode.table.mandatory'),
       width: 100,
       align: 'center',
       formatter: (row) => {
@@ -97,7 +98,7 @@
     },
     {
       prop: 'parallelExecutableText',
-      label: '鍙苟琛�',
+      label: $t('pages.basicInfo.taskPathTemplateNode.table.parallelExecutable'),
       width: 100,
       align: 'center',
       formatter: (row) => {
@@ -107,28 +108,28 @@
     },
     {
       prop: 'timeoutMinutes',
-      label: '瓒呮椂(鍒�)',
+      label: $t('pages.basicInfo.taskPathTemplateNode.table.timeoutMinutes'),
       width: 110,
       align: 'center',
       formatter: (row) => row.timeoutMinutes ?? '--'
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: $t('table.updateTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.updateTimeText || '--'
     },
     {
       prop: 'createTimeText',
-      label: '鍒涘缓鏃堕棿',
+      label: $t('table.createTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.createTimeText || '--'
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: $t('table.operation'),
       width: 120,
       align: 'center',
       fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/task-path-template/taskPathTemplateTable.columns.js b/rsf-design/src/views/basic-info/task-path-template/taskPathTemplateTable.columns.js
index fcf2266..3c7e496 100644
--- a/rsf-design/src/views/basic-info/task-path-template/taskPathTemplateTable.columns.js
+++ b/rsf-design/src/views/basic-info/task-path-template/taskPathTemplateTable.columns.js
@@ -1,6 +1,7 @@
 import { h } from 'vue'
 import { ElTag } from 'element-plus'
 import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
+import { $t } from '@/locales'
 import {
   getTaskPathTemplateCurrentMeta,
   getTaskPathTemplateStatusMeta
@@ -14,18 +15,18 @@
   canEdit = true,
   canDelete = true
 } = {}) {
-  const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+  const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
 
   if (handleFlow) {
-    operations.push({ key: 'flow', label: '娴佺▼鍥�', icon: 'ri:route-line' })
+    operations.push({ key: 'flow', label: $t('pages.basicInfo.taskPathTemplate.actions.flow'), icon: 'ri:route-line' })
   }
 
   if (canEdit && handleEdit) {
-    operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+    operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
   }
 
   if (canDelete && handleDelete) {
-    operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+    operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
   }
 
   return [
@@ -36,55 +37,55 @@
     },
     {
       type: 'globalIndex',
-      label: '搴忓彿',
+      label: $t('table.index'),
       width: 72,
       align: 'center'
     },
     {
       prop: 'templateCode',
-      label: '妯℃澘缂栫爜',
+      label: $t('pages.basicInfo.taskPathTemplate.table.templateCode'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.templateCode || '--'
     },
     {
       prop: 'templateName',
-      label: '妯℃澘鍚嶇О',
+      label: $t('pages.basicInfo.taskPathTemplate.table.templateName'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.templateName || '--'
     },
     {
       prop: 'sourceType',
-      label: '璧风偣绫诲瀷',
+      label: $t('pages.basicInfo.taskPathTemplate.table.sourceType'),
       minWidth: 140,
       showOverflowTooltip: true,
       formatter: (row) => row.sourceType || '--'
     },
     {
       prop: 'targetType',
-      label: '缁堢偣绫诲瀷',
+      label: $t('pages.basicInfo.taskPathTemplate.table.targetType'),
       minWidth: 140,
       showOverflowTooltip: true,
       formatter: (row) => row.targetType || '--'
     },
     {
       prop: 'conditionDesc',
-      label: '鏉′欢鎻忚堪',
+      label: $t('pages.basicInfo.taskPathTemplate.table.conditionDesc'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.conditionDesc || '--'
     },
     {
       prop: 'version',
-      label: '鐗堟湰鍙�',
+      label: $t('pages.basicInfo.taskPathTemplate.table.version'),
       width: 100,
       align: 'center',
       formatter: (row) => row.version ?? '--'
     },
     {
       prop: 'isCurrent',
-      label: '褰撳墠鐗堟湰',
+      label: $t('pages.basicInfo.taskPathTemplate.table.isCurrent'),
       width: 110,
       align: 'center',
       formatter: (row) => {
@@ -94,56 +95,56 @@
     },
     {
       prop: 'effectiveTimeText',
-      label: '鐢熸晥鏃堕棿',
+      label: $t('pages.basicInfo.taskPathTemplate.table.effectiveTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.effectiveTimeText || row.effectiveTime$ || '--'
     },
     {
       prop: 'expireTimeText',
-      label: '澶辨晥鏃堕棿',
+      label: $t('pages.basicInfo.taskPathTemplate.table.expireTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.expireTimeText || row.expireTime$ || '--'
     },
     {
       prop: 'priority',
-      label: '浼樺厛绾�',
+      label: $t('pages.basicInfo.taskPathTemplate.table.priority'),
       width: 90,
       align: 'center',
       formatter: (row) => row.priority ?? '--'
     },
     {
       prop: 'timeoutMinutes',
-      label: '瓒呮椂(鍒�)',
+      label: $t('pages.basicInfo.taskPathTemplate.table.timeoutMinutes'),
       width: 110,
       align: 'center',
       formatter: (row) => row.timeoutMinutes ?? '--'
     },
     {
       prop: 'stepSize',
-      label: '姝ュ簭闀垮害',
+      label: $t('pages.basicInfo.taskPathTemplate.table.stepSize'),
       width: 110,
       align: 'center',
       formatter: (row) => row.stepSize ?? '--'
     },
     {
       prop: 'maxRetryTimes',
-      label: '鏈�澶ч噸璇�',
+      label: $t('pages.basicInfo.taskPathTemplate.table.maxRetryTimes'),
       width: 100,
       align: 'center',
       formatter: (row) => row.maxRetryTimes ?? '--'
     },
     {
       prop: 'retryIntervalSeconds',
-      label: '閲嶈瘯闂撮殧(绉�)',
+      label: $t('pages.basicInfo.taskPathTemplate.table.retryIntervalSeconds'),
       width: 120,
       align: 'center',
       formatter: (row) => row.retryIntervalSeconds ?? '--'
     },
     {
       prop: 'status',
-      label: '鐘舵��',
+      label: $t('table.status'),
       width: 96,
       align: 'center',
       formatter: (row) => {
@@ -153,42 +154,42 @@
     },
     {
       prop: 'remark',
-      label: '澶囨敞',
+      label: $t('table.remark'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.remark || '--'
     },
     {
       prop: 'updateByText',
-      label: '鏇存柊浜�',
+      label: $t('table.updateBy'),
       minWidth: 120,
       showOverflowTooltip: true,
       formatter: (row) => row.updateByText || row.updateBy$ || '--'
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: $t('table.updateTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.updateTimeText || row.updateTime$ || '--'
     },
     {
       prop: 'createByText',
-      label: '鍒涘缓浜�',
+      label: $t('table.createBy'),
       minWidth: 120,
       showOverflowTooltip: true,
       formatter: (row) => row.createByText || row.createBy$ || '--'
     },
     {
       prop: 'createTimeText',
-      label: '鍒涘缓鏃堕棿',
+      label: $t('table.createTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.createTimeText || row.createTime$ || '--'
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: $t('table.operation'),
       width: 120,
       align: 'center',
       fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/warehouse-areas/index.vue b/rsf-design/src/views/basic-info/warehouse-areas/index.vue
index e9ad55b..c6fd0de 100644
--- a/rsf-design/src/views/basic-info/warehouse-areas/index.vue
+++ b/rsf-design/src/views/basic-info/warehouse-areas/index.vue
@@ -12,7 +12,9 @@
       <ArtTableHeader v-model:columns="columnChecks" :loading="loading" @refresh="refreshData">
         <template #left>
           <ElSpace wrap>
-            <ElButton v-auth="'add'" @click="openWarehouseAreasDialog('add')" v-ripple>鏂板搴撳尯</ElButton>
+            <ElButton v-auth="'add'" @click="openWarehouseAreasDialog('add')" v-ripple>
+              {{ t('common.actions.add') + t('pages.basicInfo.warehouseAreas.entity') }}
+            </ElButton>
             <ElButton
               v-auth="'delete'"
               type="danger"
@@ -20,7 +22,7 @@
               @click="handleBatchDelete"
               v-ripple
             >
-              鎵归噺鍒犻櫎
+              {{ t('common.actions.batchDelete') }}
             </ElButton>
             <ListExportPrint
               class="inline-flex"
@@ -74,6 +76,7 @@
 <script setup>
   import { computed, onMounted, ref } from 'vue'
   import { ElMessage } from 'element-plus'
+  import { useI18n } from 'vue-i18n'
   import ListExportPrint from '@/components/biz/list-export-print/index.vue'
   import { useAuth } from '@/hooks/core/useAuth'
   import { useTable } from '@/hooks/core/useTable'
@@ -105,9 +108,9 @@
     buildWarehouseAreasSavePayload,
     buildWarehouseAreasSearchParams,
     createWarehouseAreasSearchState,
+    getWarehouseAreasReportTitle,
     getWarehouseAreasPaginationKey,
     WAREHOUSE_AREAS_REPORT_STYLE,
-    WAREHOUSE_AREAS_REPORT_TITLE,
     getWarehouseAreasStatusOptions,
     normalizeWarehouseAreasDetailRecord,
     normalizeWarehouseAreasListRow
@@ -115,6 +118,7 @@
 
   defineOptions({ name: 'WarehouseAreas' })
 
+  const { t } = useI18n()
   const { hasAuth } = useAuth()
   const userStore = useUserStore()
 
@@ -132,16 +136,16 @@
 
   const searchItems = computed(() => [
     {
-      label: '鍏抽敭瀛�',
+      label: t('table.keyword'),
       key: 'condition',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ュ簱鍖哄悕绉�/缂栫爜/澶囨敞'
+        placeholder: t('pages.basicInfo.warehouseAreas.search.conditionPlaceholder')
       }
     },
     {
-      label: '浠撳簱',
+      label: t('pages.basicInfo.warehouseAreas.table.warehouseName'),
       key: 'warehouseId',
       type: 'select',
       props: {
@@ -151,25 +155,25 @@
       }
     },
     {
-      label: '搴撳尯缂栫爜',
+      label: t('pages.basicInfo.warehouseAreas.table.code'),
       key: 'code',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ュ簱鍖虹紪鐮�'
+        placeholder: t('pages.basicInfo.warehouseAreas.search.codePlaceholder')
       }
     },
     {
-      label: '搴撳尯鍚嶇О',
+      label: t('pages.basicInfo.warehouseAreas.table.name'),
       key: 'name',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ュ簱鍖哄悕绉�'
+        placeholder: t('pages.basicInfo.warehouseAreas.search.namePlaceholder')
       }
     },
     {
-      label: '涓氬姟绫诲瀷',
+      label: t('pages.basicInfo.warehouseAreas.table.type'),
       key: 'type',
       type: 'select',
       props: {
@@ -179,17 +183,17 @@
       }
     },
     {
-      label: '鐘舵��',
+      label: t('table.status'),
       key: 'status',
       type: 'select',
       props: {
         clearable: true,
-        options: getWarehouseAreasStatusOptions()
+        options: getWarehouseAreasStatusOptions(t)
       }
     }
   ])
 
-  const reportTitle = WAREHOUSE_AREAS_REPORT_TITLE
+  const reportTitle = computed(() => getWarehouseAreasReportTitle(t))
   const reportQueryParams = computed(() => buildWarehouseAreasSearchParams(searchForm.value))
 
   async function openDetail(row) {
@@ -197,13 +201,13 @@
     detailLoading.value = true
     try {
       const detail = await guardRequestWithMessage(fetchWarehouseAreasDetail(row.id), {}, {
-        timeoutMessage: '搴撳尯璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+        timeoutMessage: t('pages.basicInfo.warehouseAreas.messages.detailTimeout')
       })
       detailData.value = normalizeWarehouseAreasDetailRecord(detail)
     } catch (error) {
       detailDrawerVisible.value = false
       detailData.value = {}
-      ElMessage.error(error?.message || '鑾峰彇搴撳尯璇︽儏澶辫触')
+      ElMessage.error(error?.message || t('pages.basicInfo.warehouseAreas.messages.detailFailed'))
     } finally {
       detailLoading.value = false
     }
@@ -213,11 +217,11 @@
     try {
       await ensureCompanyOptions()
       const detail = await guardRequestWithMessage(fetchWarehouseAreasDetail(row.id), {}, {
-        timeoutMessage: '搴撳尯璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+        timeoutMessage: t('pages.basicInfo.warehouseAreas.messages.detailTimeout')
       })
       showDialog('edit', detail)
     } catch (error) {
-      ElMessage.error(error?.message || '鑾峰彇搴撳尯璇︽儏澶辫触')
+      ElMessage.error(error?.message || t('pages.basicInfo.warehouseAreas.messages.detailFailed'))
     }
   }
 
@@ -234,6 +238,7 @@
         paginationKey: getWarehouseAreasPaginationKey(),
         columnsFactory: () =>
           createWarehouseAreasTableColumns({
+            t,
             handleView: openDetail,
             handleEdit: hasAuth('update') ? openEditDialog : null,
             handleDelete: hasAuth('delete') ? (row) => handleDeleteAction?.(row) : null,
@@ -268,7 +273,7 @@
     saveRequest: fetchSaveWarehouseAreas,
     updateRequest: fetchUpdateWarehouseAreas,
     deleteRequest: fetchDeleteWarehouseAreas,
-    entityName: '搴撳尯',
+    entityName: t('pages.basicInfo.warehouseAreas.entity'),
     resolveRecordLabel: (record) => record?.name || record?.code || record?.id,
     refreshCreate,
     refreshUpdate,
@@ -283,6 +288,7 @@
       printedAt: now.toLocaleString('zh-CN', { hour12: false }),
       operator: userStore.getUserInfo?.name || userStore.getUserInfo?.username || '',
       count: rows.length,
+      reportTitle: reportTitle.value,
       reportStyle: { ...WAREHOUSE_AREAS_REPORT_STYLE }
     }
   }
@@ -322,7 +328,7 @@
 
   const resolvedPreviewMeta = computed(() => ({
     ...previewMeta.value,
-    reportTitle,
+    reportTitle: reportTitle.value,
     count: previewRows.value.length || previewMeta.value?.count || 0,
     reportStyle: {
       ...WAREHOUSE_AREAS_REPORT_STYLE,
@@ -352,19 +358,19 @@
 
     companyOptionsLoading.value = (async () => {
       const records = await guardRequestWithMessage(fetchCompanysList(), [], {
-        timeoutMessage: '寰�鏉ヤ紒涓氶�夐」鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+        timeoutMessage: t('pages.basicInfo.warehouseAreas.messages.companyOptionsTimeout')
       })
       const normalizedRecords = defaultResponseAdapter(records).records
       shipperOptions.value = normalizedRecords
         .filter((item) => item.type === 'shipper')
         .map((item) => ({
-          label: item.name || item.code || `璐т富 ${item.id}`,
+          label: item.name || item.code || `${t('pages.basicInfo.warehouseAreas.table.shipperName')} ${item.id}`,
           value: item.id
         }))
       supplierOptions.value = normalizedRecords
         .filter((item) => item.type === 'supplier')
         .map((item) => ({
-          label: item.name || item.code || `渚涘簲鍟� ${item.id}`,
+          label: item.name || item.code || `${t('pages.basicInfo.warehouseAreas.table.supplierName')} ${item.id}`,
           value: item.id
         }))
       companyOptionsLoaded.value = true
@@ -379,10 +385,10 @@
 
   async function loadWarehouseOptions() {
     const records = await guardRequestWithMessage(fetchWarehouseList(), [], {
-      timeoutMessage: '浠撳簱閫夐」鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+      timeoutMessage: t('pages.basicInfo.warehouseAreas.messages.warehouseOptionsTimeout')
     })
     warehouseOptions.value = defaultResponseAdapter(records).records.map((item) => ({
-      label: item.name || item.code || `浠撳簱 ${item.id}`,
+      label: item.name || item.code || `${t('pages.basicInfo.warehouseAreas.table.warehouseName')} ${item.id}`,
       value: item.id
     }))
   }
@@ -396,7 +402,7 @@
         status: 1
       }),
       { records: [] },
-      { timeoutMessage: '涓氬姟绫诲瀷鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟' }
+      { timeoutMessage: t('pages.basicInfo.warehouseAreas.messages.typeOptionsTimeout') }
     )
     typeOptions.value = defaultResponseAdapter(response).records.map((item) => ({
       label: item.label || item.name || item.value,
diff --git a/rsf-design/src/views/basic-info/warehouse-areas/modules/warehouse-areas-detail-drawer.vue b/rsf-design/src/views/basic-info/warehouse-areas/modules/warehouse-areas-detail-drawer.vue
index ef73bef..53ea7e2 100644
--- a/rsf-design/src/views/basic-info/warehouse-areas/modules/warehouse-areas-detail-drawer.vue
+++ b/rsf-design/src/views/basic-info/warehouse-areas/modules/warehouse-areas-detail-drawer.vue
@@ -1,7 +1,7 @@
 <template>
   <ElDrawer
     :model-value="visible"
-    title="搴撳尯璇︽儏"
+    :title="t('pages.basicInfo.warehouseAreas.detail.title')"
     size="960px"
     destroy-on-close
     @update:model-value="handleVisibleChange"
@@ -11,30 +11,36 @@
         <ElSkeleton :rows="12" animated />
       </div>
       <div v-else class="space-y-4">
-        <ElDescriptions title="鍩虹淇℃伅" :column="2" border>
-          <ElDescriptionsItem label="浠撳簱">{{ detail.warehouseName || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="搴撳尯缂栫爜">{{ detail.code || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="搴撳尯鍚嶇О">{{ detail.name || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="涓氬姟绫诲瀷">{{ detail.typeText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="璐т富">{{ detail.shipperName || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="渚涘簲鍟�">{{ detail.supplierName || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鏀寔娣锋斁">{{ detail.flagMixText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鍏佽璐熷簱瀛�">{{ detail.flagMinusText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鏍囩绠$悊">{{ detail.flagLabelMangeText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鐘舵��">
+        <ElDescriptions :title="t('pages.basicInfo.warehouseAreas.detail.sections.basic')" :column="2" border>
+          <ElDescriptionsItem :label="t('pages.basicInfo.warehouseAreas.table.warehouseName')">{{ detail.warehouseName || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.warehouseAreas.table.code')">{{ detail.code || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.warehouseAreas.table.name')">{{ detail.name || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.warehouseAreas.table.type')">{{ detail.typeText || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.warehouseAreas.table.shipperName')">{{ detail.shipperName || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.warehouseAreas.table.supplierName')">{{ detail.supplierName || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.warehouseAreas.table.flagMix')">
+            {{ detail.flagMixTextKey ? t(detail.flagMixTextKey) : detail.flagMixText || '--' }}
+          </ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.warehouseAreas.table.flagMinus')">
+            {{ detail.flagMinusTextKey ? t(detail.flagMinusTextKey) : detail.flagMinusText || '--' }}
+          </ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.warehouseAreas.table.flagLabelManage')">
+            {{ detail.flagLabelMangeTextKey ? t(detail.flagLabelMangeTextKey) : detail.flagLabelMangeText || '--' }}
+          </ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.status')">
             <ElTag :type="detail.statusType || 'info'" effect="light">
-              {{ detail.statusText || '--' }}
+              {{ detail.statusTextKey ? t(detail.statusTextKey) : detail.statusText || '--' }}
             </ElTag>
           </ElDescriptionsItem>
-          <ElDescriptionsItem label="鎺掑簭">{{ detail.sort ?? '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="澶囨敞" :span="2">{{ detail.memo || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.warehouseAreas.table.sort')">{{ detail.sort ?? '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.remark')" :span="2">{{ detail.memo || '--' }}</ElDescriptionsItem>
         </ElDescriptions>
 
-        <ElDescriptions title="瀹¤淇℃伅" :column="2" border>
-          <ElDescriptionsItem label="鍒涘缓浜�">{{ detail.createByText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鏇存柊浜�">{{ detail.updateByText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
+        <ElDescriptions :title="t('pages.basicInfo.warehouseAreas.detail.sections.audit')" :column="2" border>
+          <ElDescriptionsItem :label="t('table.createBy')">{{ detail.createByText || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.createTime')">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.updateBy')">{{ detail.updateByText || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.updateTime')">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
         </ElDescriptions>
       </div>
     </ElScrollbar>
@@ -43,6 +49,7 @@
 
 <script setup>
   import { computed } from 'vue'
+  import { useI18n } from 'vue-i18n'
 
   const props = defineProps({
     visible: { type: Boolean, default: false },
@@ -51,6 +58,7 @@
   })
 
   const emit = defineEmits(['update:visible'])
+  const { t } = useI18n()
 
   const visible = computed({
     get: () => props.visible,
diff --git a/rsf-design/src/views/basic-info/warehouse-areas/modules/warehouse-areas-dialog.vue b/rsf-design/src/views/basic-info/warehouse-areas/modules/warehouse-areas-dialog.vue
index 8e39da2..f7e3c2a 100644
--- a/rsf-design/src/views/basic-info/warehouse-areas/modules/warehouse-areas-dialog.vue
+++ b/rsf-design/src/views/basic-info/warehouse-areas/modules/warehouse-areas-dialog.vue
@@ -22,8 +22,8 @@
 
     <template #footer>
       <span class="dialog-footer">
-        <ElButton @click="handleCancel">鍙栨秷</ElButton>
-        <ElButton type="primary" @click="handleSubmit">纭畾</ElButton>
+        <ElButton @click="handleCancel">{{ t('common.cancel') }}</ElButton>
+        <ElButton type="primary" @click="handleSubmit">{{ t('common.confirm') }}</ElButton>
       </span>
     </template>
   </ElDialog>
@@ -31,6 +31,7 @@
 
 <script setup>
   import { computed, nextTick, reactive, ref, watch } from 'vue'
+  import { useI18n } from 'vue-i18n'
   import ArtForm from '@/components/core/forms/art-form/index.vue'
   import {
     buildWarehouseAreasDialogModel,
@@ -52,120 +53,125 @@
   const emit = defineEmits(['update:visible', 'submit'])
   const formRef = ref()
   const form = reactive(createWarehouseAreasFormState())
+  const { t } = useI18n()
 
   const isEdit = computed(() => props.dialogType === 'edit')
-  const dialogTitle = computed(() => (isEdit.value ? '缂栬緫搴撳尯' : '鏂板搴撳尯'))
+  const dialogTitle = computed(() =>
+    isEdit.value
+      ? t('pages.basicInfo.warehouseAreas.dialog.titleEdit')
+      : t('pages.basicInfo.warehouseAreas.dialog.titleCreate')
+  )
 
   const rules = computed(() => ({
-    warehouseId: [{ required: true, message: '璇烽�夋嫨浠撳簱', trigger: 'change' }],
-    code: [{ required: true, message: '璇疯緭鍏ュ簱鍖虹紪鐮�', trigger: 'blur' }],
-    name: [{ required: true, message: '璇疯緭鍏ュ簱鍖哄悕绉�', trigger: 'blur' }],
-    type: [{ required: true, message: '璇烽�夋嫨涓氬姟绫诲瀷', trigger: 'change' }],
-    flagMinus: [{ required: true, message: '璇烽�夋嫨鍏佽璐熷簱瀛�', trigger: 'change' }],
-    flagMix: [{ required: true, message: '璇烽�夋嫨鏀寔娣锋斁', trigger: 'change' }]
+    warehouseId: [{ required: true, message: t('pages.basicInfo.warehouseAreas.validation.warehouse'), trigger: 'change' }],
+    code: [{ required: true, message: t('pages.basicInfo.warehouseAreas.validation.code'), trigger: 'blur' }],
+    name: [{ required: true, message: t('pages.basicInfo.warehouseAreas.validation.name'), trigger: 'blur' }],
+    type: [{ required: true, message: t('pages.basicInfo.warehouseAreas.validation.type'), trigger: 'change' }],
+    flagMinus: [{ required: true, message: t('pages.basicInfo.warehouseAreas.validation.flagMinus'), trigger: 'change' }],
+    flagMix: [{ required: true, message: t('pages.basicInfo.warehouseAreas.validation.flagMix'), trigger: 'change' }]
   }))
 
   const formItems = computed(() => [
     {
-      label: '浠撳簱',
+      label: t('pages.basicInfo.warehouseAreas.table.warehouseName'),
       key: 'warehouseId',
       type: 'select',
       props: {
-        placeholder: '璇烽�夋嫨浠撳簱',
+        placeholder: t('pages.basicInfo.warehouseAreas.placeholders.warehouse'),
         clearable: true,
         filterable: true,
         options: props.warehouseOptions
       }
     },
     {
-      label: '搴撳尯缂栫爜',
+      label: t('pages.basicInfo.warehouseAreas.table.code'),
       key: 'code',
       type: 'input',
       props: {
-        placeholder: '璇疯緭鍏ュ簱鍖虹紪鐮�',
+        placeholder: t('pages.basicInfo.warehouseAreas.placeholders.code'),
         clearable: true
       }
     },
     {
-      label: '搴撳尯鍚嶇О',
+      label: t('pages.basicInfo.warehouseAreas.table.name'),
       key: 'name',
       type: 'input',
       props: {
-        placeholder: '璇疯緭鍏ュ簱鍖哄悕绉�',
+        placeholder: t('pages.basicInfo.warehouseAreas.placeholders.name'),
         clearable: true
       }
     },
     {
-      label: '涓氬姟绫诲瀷',
+      label: t('pages.basicInfo.warehouseAreas.table.type'),
       key: 'type',
       type: 'select',
       props: {
-        placeholder: '璇烽�夋嫨涓氬姟绫诲瀷',
+        placeholder: t('pages.basicInfo.warehouseAreas.placeholders.type'),
         clearable: true,
         filterable: true,
         options: props.typeOptions
       }
     },
     {
-      label: '璐т富',
+      label: t('pages.basicInfo.warehouseAreas.table.shipperName'),
       key: 'shipperId',
       type: 'select',
       props: {
-        placeholder: '璇烽�夋嫨璐т富',
+        placeholder: t('pages.basicInfo.warehouseAreas.placeholders.shipper'),
         clearable: true,
         filterable: true,
         options: props.shipperOptions
       }
     },
     {
-      label: '渚涘簲鍟�',
+      label: t('pages.basicInfo.warehouseAreas.table.supplierName'),
       key: 'supplierId',
       type: 'select',
       props: {
-        placeholder: '璇烽�夋嫨渚涘簲鍟�',
+        placeholder: t('pages.basicInfo.warehouseAreas.placeholders.supplier'),
         clearable: true,
         filterable: true,
         options: props.supplierOptions
       }
     },
     {
-      label: '鍏佽璐熷簱瀛�',
+      label: t('pages.basicInfo.warehouseAreas.table.flagMinus'),
       key: 'flagMinus',
       type: 'select',
       props: {
-        placeholder: '璇烽�夋嫨',
-        options: getWarehouseAreasFlagOptions()
+        placeholder: t('pages.basicInfo.warehouseAreas.placeholders.flagMinus'),
+        options: getWarehouseAreasFlagOptions(t)
       }
     },
     {
-      label: '鏍囩绠$悊',
+      label: t('pages.basicInfo.warehouseAreas.table.flagLabelManage'),
       key: 'flagLabelMange',
       type: 'select',
       props: {
-        placeholder: '璇烽�夋嫨',
-        options: getWarehouseAreasFlagOptions()
+        placeholder: t('pages.basicInfo.warehouseAreas.placeholders.flagLabelManage'),
+        options: getWarehouseAreasFlagOptions(t)
       }
     },
     {
-      label: '鏀寔娣锋斁',
+      label: t('pages.basicInfo.warehouseAreas.table.flagMix'),
       key: 'flagMix',
       type: 'select',
       props: {
-        placeholder: '璇烽�夋嫨',
-        options: getWarehouseAreasFlagOptions()
+        placeholder: t('pages.basicInfo.warehouseAreas.placeholders.flagMix'),
+        options: getWarehouseAreasFlagOptions(t)
       }
     },
     {
-      label: '鐘舵��',
+      label: t('table.status'),
       key: 'status',
       type: 'select',
       props: {
-        placeholder: '璇烽�夋嫨鐘舵��',
-        options: getWarehouseAreasStatusOptions()
+        placeholder: t('pages.basicInfo.warehouseAreas.placeholders.status'),
+        options: getWarehouseAreasStatusOptions(t)
       }
     },
     {
-      label: '鎺掑簭',
+      label: t('pages.basicInfo.warehouseAreas.table.sort'),
       key: 'sort',
       type: 'number',
       props: {
@@ -175,14 +181,14 @@
       }
     },
     {
-      label: '澶囨敞',
+      label: t('table.remark'),
       key: 'memo',
       type: 'input',
       span: 24,
       props: {
         type: 'textarea',
         rows: 3,
-        placeholder: '璇疯緭鍏ュ娉�',
+        placeholder: t('pages.basicInfo.warehouseAreas.placeholders.memo'),
         clearable: true
       }
     }
diff --git a/rsf-design/src/views/basic-info/warehouse-areas/warehouseAreasPage.helpers.js b/rsf-design/src/views/basic-info/warehouse-areas/warehouseAreasPage.helpers.js
index ffed312..40935e4 100644
--- a/rsf-design/src/views/basic-info/warehouse-areas/warehouseAreasPage.helpers.js
+++ b/rsf-design/src/views/basic-info/warehouse-areas/warehouseAreasPage.helpers.js
@@ -1,9 +1,11 @@
 const STATUS_META = {
-  1: { text: '姝e父', type: 'success', bool: true },
-  0: { text: '鍐荤粨', type: 'danger', bool: false }
+  1: { textKey: 'common.status.normal', fallback: 'Normal', type: 'success', bool: true },
+  0: { textKey: 'common.status.frozen', fallback: 'Frozen', type: 'danger', bool: false }
 }
 
-export const WAREHOUSE_AREAS_REPORT_TITLE = '搴撳尯鎶ヨ〃'
+export function getWarehouseAreasReportTitle(t) {
+  return t('pages.basicInfo.warehouseAreas.reportTitle')
+}
 export const WAREHOUSE_AREAS_REPORT_STYLE = {
   titleAlign: 'center',
   titleLevel: 'strong',
@@ -16,14 +18,14 @@
   return String(value ?? '').trim()
 }
 
-function normalizeFlagText(value) {
-  if (value === 1 || value === '1' || value === true || value === '鏄�') {
-    return '鏄�'
+function normalizeFlagValue(value) {
+  if (value === 1 || value === '1' || value === true || value === '\u662f') {
+    return 1
   }
-  if (value === 0 || value === '0' || value === false || value === '鍚�') {
-    return '鍚�'
+  if (value === 0 || value === '0' || value === false || value === '\u5426') {
+    return 0
   }
-  return normalizeText(value) || '-'
+  return null
 }
 
 export function createWarehouseAreasSearchState() {
@@ -65,17 +67,17 @@
   }
 }
 
-export function getWarehouseAreasStatusOptions() {
+export function getWarehouseAreasStatusOptions(t) {
   return [
-    { label: '姝e父', value: 1 },
-    { label: '鍐荤粨', value: 0 }
+    { label: t('common.status.normal'), value: 1 },
+    { label: t('common.status.frozen'), value: 0 }
   ]
 }
 
-export function getWarehouseAreasFlagOptions() {
+export function getWarehouseAreasFlagOptions(t) {
   return [
-    { label: '鍚�', value: 0 },
-    { label: '鏄�', value: 1 }
+    { label: t('common.status.no'), value: 0 },
+    { label: t('common.status.yes'), value: 1 }
   ]
 }
 
@@ -190,11 +192,14 @@
   if (status === false || Number(status) === 0) {
     return STATUS_META[0]
   }
-  return { text: '鏈煡', type: 'info', bool: false }
+  return { textKey: 'common.status.unknown', fallback: 'Unknown', type: 'info', bool: false }
 }
 
 export function normalizeWarehouseAreasDetailRecord(record = {}) {
   const statusMeta = getWarehouseAreasStatusMeta(record.statusBool ?? record.status)
+  const flagMinusValue = normalizeFlagValue(record.flagMinus$ ?? record.flagMinus)
+  const flagLabelManageValue = normalizeFlagValue(record.flagLabelMange$ ?? record.flagLabelMange)
+  const flagMixValue = normalizeFlagValue(record.flagMix$ ?? record.flagMix)
   return {
     ...record,
     warehouseName: normalizeText(record.warehouseId$ || record.warehouseName || ''),
@@ -204,10 +209,16 @@
     code: normalizeText(record.code || ''),
     name: normalizeText(record.name || ''),
     memo: normalizeText(record.memo || ''),
-    flagMinusText: normalizeFlagText(record.flagMinus$ ?? record.flagMinus),
-    flagLabelMangeText: normalizeFlagText(record.flagLabelMange$ ?? record.flagLabelMange),
-    flagMixText: normalizeFlagText(record.flagMix$ ?? record.flagMix),
-    statusText: statusMeta.text,
+    flagMinusText: normalizeText(record.flagMinus$ ?? record.flagMinus) || '-',
+    flagMinusTextKey:
+      flagMinusValue === null ? '' : flagMinusValue ? 'common.status.yes' : 'common.status.no',
+    flagLabelMangeText: normalizeText(record.flagLabelMange$ ?? record.flagLabelMange) || '-',
+    flagLabelMangeTextKey:
+      flagLabelManageValue === null ? '' : flagLabelManageValue ? 'common.status.yes' : 'common.status.no',
+    flagMixText: normalizeText(record.flagMix$ ?? record.flagMix) || '-',
+    flagMixTextKey: flagMixValue === null ? '' : flagMixValue ? 'common.status.yes' : 'common.status.no',
+    statusText: statusMeta.fallback,
+    statusTextKey: statusMeta.textKey,
     statusType: statusMeta.type,
     statusBool: record.statusBool !== void 0 ? Boolean(record.statusBool) : statusMeta.bool,
     createByText: normalizeText(record.createBy$ || record.createByText || ''),
@@ -227,4 +238,3 @@
   }
   return records.map((record) => normalizeWarehouseAreasListRow(record))
 }
-
diff --git a/rsf-design/src/views/basic-info/warehouse-areas/warehouseAreasTable.columns.js b/rsf-design/src/views/basic-info/warehouse-areas/warehouseAreasTable.columns.js
index 14e419a..7d4dd85 100644
--- a/rsf-design/src/views/basic-info/warehouse-areas/warehouseAreasTable.columns.js
+++ b/rsf-design/src/views/basic-info/warehouse-areas/warehouseAreasTable.columns.js
@@ -1,23 +1,25 @@
 import { h } from 'vue'
 import { ElTag } from 'element-plus'
 import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
+import { $t } from '@/locales'
 import { getWarehouseAreasStatusMeta } from './warehouseAreasPage.helpers'
 
 export function createWarehouseAreasTableColumns({
+  t = $t,
   handleView,
   handleEdit,
   handleDelete,
   canEdit = true,
   canDelete = true
 } = {}) {
-  const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+  const operations = [{ key: 'view', label: t('common.actions.detail'), icon: 'ri:eye-line' }]
 
   if (canEdit && handleEdit) {
-    operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+    operations.push({ key: 'edit', label: t('common.actions.edit'), icon: 'ri:pencil-line' })
   }
 
   if (canDelete && handleDelete) {
-    operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+    operations.push({ key: 'delete', label: t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
   }
 
   return [
@@ -28,107 +30,112 @@
     },
     {
       type: 'globalIndex',
-      label: '搴忓彿',
+      label: t('table.index'),
       width: 72,
       align: 'center'
     },
     {
       prop: 'warehouseName',
-      label: '浠撳簱',
+      label: t('pages.basicInfo.warehouseAreas.table.warehouseName'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.warehouseName || '--'
     },
     {
       prop: 'code',
-      label: '搴撳尯缂栫爜',
+      label: t('pages.basicInfo.warehouseAreas.table.code'),
       minWidth: 150,
       showOverflowTooltip: true,
       formatter: (row) => row.code || '--'
     },
     {
       prop: 'name',
-      label: '搴撳尯鍚嶇О',
+      label: t('pages.basicInfo.warehouseAreas.table.name'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.name || '--'
     },
     {
       prop: 'typeText',
-      label: '涓氬姟绫诲瀷',
+      label: t('pages.basicInfo.warehouseAreas.table.type'),
       minWidth: 140,
       showOverflowTooltip: true,
       formatter: (row) => row.typeText || '--'
     },
     {
       prop: 'shipperName',
-      label: '璐т富',
+      label: t('pages.basicInfo.warehouseAreas.table.shipperName'),
       minWidth: 140,
       showOverflowTooltip: true,
       formatter: (row) => row.shipperName || '--'
     },
     {
       prop: 'supplierName',
-      label: '渚涘簲鍟�',
+      label: t('pages.basicInfo.warehouseAreas.table.supplierName'),
       minWidth: 140,
       showOverflowTooltip: true,
       formatter: (row) => row.supplierName || '--'
     },
     {
       prop: 'flagMixText',
-      label: '鏀寔娣锋斁',
+      label: t('pages.basicInfo.warehouseAreas.table.flagMix'),
       width: 100,
       align: 'center',
-      formatter: (row) => row.flagMixText || '--'
+      formatter: (row) => (row.flagMixTextKey ? t(row.flagMixTextKey) : row.flagMixText || '--')
     },
     {
       prop: 'flagMinusText',
-      label: '鍏佽璐熷簱瀛�',
+      label: t('pages.basicInfo.warehouseAreas.table.flagMinus'),
       width: 100,
       align: 'center',
-      formatter: (row) => row.flagMinusText || '--'
+      formatter: (row) => (row.flagMinusTextKey ? t(row.flagMinusTextKey) : row.flagMinusText || '--')
     },
     {
       prop: 'flagLabelMangeText',
-      label: '鏍囩绠$悊',
+      label: t('pages.basicInfo.warehouseAreas.table.flagLabelManage'),
       width: 100,
       align: 'center',
-      formatter: (row) => row.flagLabelMangeText || '--'
+      formatter: (row) =>
+        row.flagLabelMangeTextKey ? t(row.flagLabelMangeTextKey) : row.flagLabelMangeText || '--'
     },
     {
       prop: 'status',
-      label: '鐘舵��',
+      label: t('table.status'),
       width: 100,
       align: 'center',
       formatter: (row) => {
         const statusMeta = getWarehouseAreasStatusMeta(row.statusBool ?? row.status)
-        return h(ElTag, { type: statusMeta.type, effect: 'light' }, () => statusMeta.text)
+        return h(
+          ElTag,
+          { type: statusMeta.type, effect: 'light' },
+          () => (statusMeta.textKey ? t(statusMeta.textKey) : statusMeta.fallback)
+        )
       }
     },
     {
       prop: 'sort',
-      label: '鎺掑簭',
+      label: t('pages.basicInfo.warehouseAreas.table.sort'),
       width: 80,
       align: 'center',
       formatter: (row) => row.sort ?? '--'
     },
     {
       prop: 'memo',
-      label: '澶囨敞',
+      label: t('table.remark'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.memo || '--'
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: t('table.updateTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.updateTimeText || '--'
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: t('table.operation'),
       width: 120,
       align: 'center',
       fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/warehouse/warehouseTable.columns.js b/rsf-design/src/views/basic-info/warehouse/warehouseTable.columns.js
index 89ed992..c82f20f 100644
--- a/rsf-design/src/views/basic-info/warehouse/warehouseTable.columns.js
+++ b/rsf-design/src/views/basic-info/warehouse/warehouseTable.columns.js
@@ -1,17 +1,18 @@
 import { h } from 'vue'
 import { ElTag } from 'element-plus'
 import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
+import { $t } from '@/locales'
 import { getWarehouseStatusMeta } from './warehousePage.helpers'
 
 export function createWarehouseTableColumns({ handleView, handleEdit, handleDelete, canEdit = true, canDelete = true } = {}) {
-  const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+  const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
 
   if (canEdit && handleEdit) {
-    operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+    operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
   }
 
   if (canDelete && handleDelete) {
-    operations.push({ key: 'delete', label: '鍒犻櫎', icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
+    operations.push({ key: 'delete', label: $t('common.actions.delete'), icon: 'ri:delete-bin-5-line', color: 'var(--art-error)' })
   }
 
   return [
@@ -22,41 +23,41 @@
     },
     {
       type: 'globalIndex',
-      label: '搴忓彿',
+      label: $t('table.index'),
       width: 72,
       align: 'center'
     },
     {
       prop: 'name',
-      label: '浠撳簱鍚嶇О',
+      label: $t('pages.basicInfo.warehouse.table.name'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.name || '--'
     },
     {
       prop: 'code',
-      label: '浠撳簱缂栫爜',
+      label: $t('pages.basicInfo.warehouse.table.code'),
       minWidth: 140,
       showOverflowTooltip: true,
       formatter: (row) => row.code || '--'
     },
     {
       prop: 'factory',
-      label: '鎵�灞炲伐鍘�',
+      label: $t('pages.basicInfo.warehouse.table.factory'),
       minWidth: 140,
       showOverflowTooltip: true,
       formatter: (row) => row.factory || '--'
     },
     {
       prop: 'address',
-      label: '浠撳簱鍦板潃',
+      label: $t('pages.basicInfo.warehouse.table.address'),
       minWidth: 220,
       showOverflowTooltip: true,
       formatter: (row) => row.address || '--'
     },
     {
       prop: 'status',
-      label: '鐘舵��',
+      label: $t('table.status'),
       width: 100,
       align: 'center',
       formatter: (row) => {
@@ -66,42 +67,42 @@
     },
     {
       prop: 'updateByText',
-      label: '鏇存柊浜�',
+      label: $t('table.updateBy'),
       minWidth: 120,
       showOverflowTooltip: true,
       formatter: (row) => row.updateByText || row.updateBy$ || '--'
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: $t('table.updateTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.updateTimeText || row.updateTime$ || '--'
     },
     {
       prop: 'createByText',
-      label: '鍒涘缓浜�',
+      label: $t('table.createBy'),
       minWidth: 120,
       showOverflowTooltip: true,
       formatter: (row) => row.createByText || row.createBy$ || '--'
     },
     {
       prop: 'createTimeText',
-      label: '鍒涘缓鏃堕棿',
+      label: $t('table.createTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.createTimeText || row.createTime$ || '--'
     },
     {
       prop: 'memo',
-      label: '澶囨敞',
+      label: $t('table.remark'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.memo || '--'
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: $t('table.operation'),
       width: 120,
       align: 'center',
       fixed: 'right',
diff --git a/rsf-design/src/views/basic-info/wh-mat/index.vue b/rsf-design/src/views/basic-info/wh-mat/index.vue
index 240aff5..fb852a1 100644
--- a/rsf-design/src/views/basic-info/wh-mat/index.vue
+++ b/rsf-design/src/views/basic-info/wh-mat/index.vue
@@ -5,30 +5,30 @@
         <ElCard class="wh-mat-page__sidebar-card">
           <div class="mb-3 flex items-center justify-between gap-3">
             <div>
-              <div class="text-base font-medium text-[var(--art-text-primary)]">鐗╂枡鍒嗙粍</div>
+              <div class="text-base font-medium text-[var(--art-text-primary)]">{{ t('pages.basicInfo.whMat.title') }}</div>
               <div class="text-xs text-[var(--art-text-secondary)]">
                 {{ selectedGroupLabel }}
               </div>
             </div>
-            <ElButton text @click="handleResetGroup">鍏ㄩ儴</ElButton>
+            <ElButton text @click="handleResetGroup">{{ t('common.actions.viewAll') }}</ElButton>
           </div>
 
           <div class="mb-3 flex items-center gap-2">
             <ElInput
               v-model.trim="groupSearch"
               clearable
-              placeholder="鎼滅储鐗╂枡鍒嗙粍"
+              :placeholder="t('pages.basicInfo.whMat.search.groupKeywordPlaceholder')"
               @clear="handleGroupSearch"
               @keyup.enter="handleGroupSearch"
             />
-            <ElButton @click="handleGroupSearch">鎼滅储</ElButton>
+            <ElButton @click="handleGroupSearch">{{ t('common.actions.search') }}</ElButton>
           </div>
 
           <ElScrollbar class="wh-mat-page__tree-scroll pr-1">
             <div v-if="groupTreeLoading" class="py-6">
               <ElSkeleton :rows="10" animated />
             </div>
-            <ElEmpty v-else-if="!groupTreeData.length" description="鏆傛棤鐗╂枡鍒嗙粍" />
+            <ElEmpty v-else-if="!groupTreeData.length" :description="t('pages.basicInfo.whMat.messages.emptyGroups')" />
             <ElTree
               v-else
               :data="groupTreeData"
@@ -41,8 +41,8 @@
             >
               <template #default="{ data }">
                 <div class="flex items-center gap-2">
-                  <span class="font-medium">{{ data.name || '--' }}</span>
-                  <span class="text-xs text-[var(--art-text-secondary)]">{{ data.code || '--' }}</span>
+                  <span class="font-medium">{{ data.name || t('common.placeholder.empty') }}</span>
+                  <span class="text-xs text-[var(--art-text-secondary)]">{{ data.code || t('common.placeholder.empty') }}</span>
                 </div>
               </template>
             </ElTree>
@@ -89,6 +89,7 @@
 <script setup>
   import { ElMessage } from 'element-plus'
   import { computed, onMounted, reactive, ref } from 'vue'
+  import { useI18n } from 'vue-i18n'
   import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
   import { useTableColumns } from '@/hooks/core/useTableColumns'
   import { guardRequestWithMessage } from '@/utils/sys/requestGuard'
@@ -106,6 +107,7 @@
   } from './whMatPage.helpers'
 
   defineOptions({ name: 'WhMat' })
+  const { t } = useI18n()
 
   const loading = ref(false)
   const groupTreeLoading = ref(false)
@@ -131,64 +133,65 @@
 
   const searchItems = computed(() => [
     {
-      label: '鍏抽敭瀛�',
+      label: t('pages.basicInfo.whMat.search.condition'),
       key: 'condition',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ョ墿鏂欑紪鐮�/鐗╂枡鍚嶇О'
+        placeholder: t('pages.basicInfo.whMat.search.conditionPlaceholder')
       }
     },
     {
-      label: '鐗╂枡缂栫爜',
+      label: t('pages.basicInfo.whMat.search.code'),
       key: 'code',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ョ墿鏂欑紪鐮�'
+        placeholder: t('pages.basicInfo.whMat.search.codePlaceholder')
       }
     },
     {
-      label: '鐗╂枡鍚嶇О',
+      label: t('pages.basicInfo.whMat.search.name'),
       key: 'name',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ョ墿鏂欏悕绉�'
+        placeholder: t('pages.basicInfo.whMat.search.namePlaceholder')
       }
     },
     {
-      label: '瑙勬牸',
+      label: t('pages.basicInfo.whMat.search.spec'),
       key: 'spec',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ヨ鏍�'
+        placeholder: t('pages.basicInfo.whMat.search.specPlaceholder')
       }
     },
     {
-      label: '鏉$爜',
+      label: t('pages.basicInfo.whMat.search.barcode'),
       key: 'barcode',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ユ潯鐮�'
+        placeholder: t('pages.basicInfo.whMat.search.barcodePlaceholder')
       }
     }
   ])
 
   const { columnChecks, columns } = useTableColumns(() =>
     createWhMatTableColumns({
+      t,
       handleViewDetail: openDetailDrawer
     })
   )
 
   const selectedGroupLabel = computed(() => {
     if (!selectedGroupId.value) {
-      return '鍏ㄩ儴鐗╂枡'
+      return t('pages.basicInfo.whMat.labels.allMaterials')
     }
     const found = findGroupNode(groupTreeData.value, selectedGroupId.value)
-    return found ? getWhMatTreeNodeLabel(found) : '鍏ㄩ儴鐗╂枡'
+    return found ? getWhMatTreeNodeLabel(found) : t('pages.basicInfo.whMat.labels.allMaterials')
   })
 
   function findGroupNode(nodes, targetId) {
@@ -219,16 +222,16 @@
       const records = await guardRequestWithMessage(
         fetchMatnrGroupTree(buildMatnrGroupTreeQueryParams({ condition: groupSearch.value })),
         [],
-        { timeoutMessage: '鐗╂枡鍒嗙粍鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟' }
+        { timeoutMessage: t('pages.basicInfo.whMat.messages.groupTimeout') }
       )
-      const normalizedTree = normalizeMatnrGroupTreeRows(Array.isArray(records) ? records : [])
+      const normalizedTree = normalizeMatnrGroupTreeRows(Array.isArray(records) ? records : [], t)
       groupTreeData.value = normalizedTree
       if (selectedGroupId.value && !findGroupNode(normalizedTree, selectedGroupId.value)) {
         selectedGroupId.value = null
       }
     } catch (error) {
       groupTreeData.value = []
-      ElMessage.error(error?.message || '鐗╂枡鍒嗙粍鍔犺浇澶辫触')
+      ElMessage.error(error?.message || t('pages.basicInfo.whMat.messages.groupLoadFailed'))
     } finally {
       groupTreeLoading.value = false
     }
@@ -252,15 +255,15 @@
           current: pagination.current,
           size: pagination.size
         },
-        { timeoutMessage: '鐗╂枡鍒楄〃鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟' }
+        { timeoutMessage: t('pages.basicInfo.whMat.messages.listTimeout') }
       )
       tableData.value = Array.isArray(response?.records)
-        ? response.records.map((record) => normalizeMatnrRow(record))
+        ? response.records.map((record) => normalizeMatnrRow(record, t))
         : []
       updatePaginationState(pagination, response, pagination.current, pagination.size)
     } catch (error) {
       tableData.value = []
-      ElMessage.error(error?.message || '鐗╂枡鍒楄〃鍔犺浇澶辫触')
+      ElMessage.error(error?.message || t('pages.basicInfo.whMat.messages.listLoadFailed'))
     } finally {
       loading.value = false
     }
@@ -272,13 +275,14 @@
     try {
       detailData.value = normalizeMatnrDetail(
         await guardRequestWithMessage(fetchMatnrDetail(row.id), {}, {
-          timeoutMessage: '鐗╂枡璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
-        })
+          timeoutMessage: t('pages.basicInfo.whMat.messages.detailTimeout')
+        }),
+        t
       )
     } catch (error) {
       detailDrawerVisible.value = false
       detailData.value = {}
-      ElMessage.error(error?.message || '鑾峰彇鐗╂枡璇︽儏澶辫触')
+      ElMessage.error(error?.message || t('pages.basicInfo.whMat.messages.detailLoadFailed'))
     } finally {
       detailLoading.value = false
     }
diff --git a/rsf-design/src/views/basic-info/wh-mat/modules/wh-mat-detail-drawer.vue b/rsf-design/src/views/basic-info/wh-mat/modules/wh-mat-detail-drawer.vue
index a5cb07e..0d3a588 100644
--- a/rsf-design/src/views/basic-info/wh-mat/modules/wh-mat-detail-drawer.vue
+++ b/rsf-design/src/views/basic-info/wh-mat/modules/wh-mat-detail-drawer.vue
@@ -1,7 +1,7 @@
 <template>
   <ElDrawer
     :model-value="visible"
-    title="鐗╂枡璇︽儏"
+    :title="t('pages.basicInfo.whMat.detail.title')"
     size="960px"
     destroy-on-close
     @update:model-value="handleVisibleChange"
@@ -11,53 +11,53 @@
         <ElSkeleton :rows="12" animated />
       </div>
       <div v-else class="space-y-4">
-        <ElDescriptions title="鍩虹淇℃伅" :column="2" border>
-          <ElDescriptionsItem label="鐗╂枡缂栫爜">{{ detail.code || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鐗╂枡鍚嶇О">{{ detail.name || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鐗╂枡鍒嗙粍">{{ detail.groupName || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="璐т富">{{ detail.shipperName || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鏉$爜">{{ detail.barcode || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="瑙勬牸">{{ detail.spec || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鍨嬪彿">{{ detail.model || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="棰滆壊">{{ detail.color || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="灏哄">{{ detail.size || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鎻忚堪">{{ detail.describle || '--' }}</ElDescriptionsItem>
+        <ElDescriptions :title="t('pages.basicInfo.whMat.detail.sections.basic')" :column="2" border>
+          <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.code')">{{ detail.code || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.name')">{{ detail.name || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.groupName')">{{ detail.groupName || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.shipperName')">{{ detail.shipperName || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.barcode')">{{ detail.barcode || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.spec')">{{ detail.spec || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.model')">{{ detail.model || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.color')">{{ detail.color || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.size')">{{ detail.size || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.description')">{{ detail.describle || t('common.placeholder.empty') }}</ElDescriptionsItem>
         </ElDescriptions>
 
-        <ElDescriptions title="搴撳瓨灞炴��" :column="2" border>
-          <ElDescriptionsItem label="鍗曚綅">{{ detail.unit || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="閲囪喘鍗曚綅">{{ detail.purUnit || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="搴撲綅鍗曚綅">{{ detail.stockUnit || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鍑哄叆搴撲紭鍏堢骇">{{ detail.stockLevelText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鏄惁鏍囩绠$悊">{{ detail.flagLabelManageText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鏄惁鍏嶆">{{ detail.flagCheckText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="瀹夊叏搴撳瓨">{{ detail.safeQty ?? '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鏈�灏忓簱瀛橀璀�">{{ detail.minQty ?? '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鏈�澶у簱瀛橀璀�">{{ detail.maxQty ?? '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鍋滄粸澶╂暟">{{ detail.stagn ?? '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="淇濊川鏈熷ぉ鏁�">{{ detail.valid ?? '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鏁堟湡棰勮闃堝��">{{ detail.validWarn ?? '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鐘舵��">{{ detail.statusText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鍩虹鍗曚綅">{{ detail.baseUnit || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="浣跨敤缁勭粐">{{ detail.useOrgName || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="ERP鍒嗙被">{{ detail.erpClsId || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="澶囨敞">{{ detail.memo || '--' }}</ElDescriptionsItem>
+        <ElDescriptions :title="t('pages.basicInfo.whMat.detail.sections.stock')" :column="2" border>
+          <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.unit')">{{ detail.unit || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.purUnit')">{{ detail.purUnit || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.stockUnit')">{{ detail.stockUnit || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.stockLevel')">{{ detail.stockLevelText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.flagLabelManage')">{{ detail.flagLabelManageText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.flagCheck')">{{ detail.flagCheckText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.safeQty')">{{ detail.safeQty ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.minQty')">{{ detail.minQty ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.maxQty')">{{ detail.maxQty ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.stagn')">{{ detail.stagn ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.valid')">{{ detail.valid ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.validWarn')">{{ detail.validWarn ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.status')">{{ detail.statusText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.baseUnit')">{{ detail.baseUnit || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.useOrgName')">{{ detail.useOrgName || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.basicInfo.whMat.detail.erpClsId')">{{ detail.erpClsId || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.memo')">{{ detail.memo || t('common.placeholder.empty') }}</ElDescriptionsItem>
         </ElDescriptions>
 
-        <ElDescriptions title="瀹¤淇℃伅" :column="2" border>
-          <ElDescriptionsItem label="鍒涘缓浜�">{{ detail.createByText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鏇存柊浜�">{{ detail.updateByText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
+        <ElDescriptions :title="t('pages.basicInfo.whMat.detail.sections.audit')" :column="2" border>
+          <ElDescriptionsItem :label="t('table.createBy')">{{ detail.createByText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.createTime')">{{ detail.createTimeText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.updateBy')">{{ detail.updateByText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.updateTime')">{{ detail.updateTimeText || t('common.placeholder.empty') }}</ElDescriptionsItem>
         </ElDescriptions>
 
-        <ElDescriptions v-if="extendFieldEntries.length" title="鎵╁睍瀛楁" :column="2" border>
+        <ElDescriptions v-if="extendFieldEntries.length" :title="t('pages.basicInfo.whMat.detail.sections.extend')" :column="2" border>
           <ElDescriptionsItem
             v-for="entry in extendFieldEntries"
             :key="entry.key"
             :label="entry.key"
           >
-            {{ entry.value || '--' }}
+            {{ entry.value || t('common.placeholder.empty') }}
           </ElDescriptionsItem>
         </ElDescriptions>
       </div>
@@ -67,6 +67,7 @@
 
 <script setup>
   import { computed } from 'vue'
+  import { useI18n } from 'vue-i18n'
 
   const props = defineProps({
     visible: { type: Boolean, default: false },
@@ -75,6 +76,7 @@
   })
 
   const emit = defineEmits(['update:visible'])
+  const { t } = useI18n()
 
   const visible = computed({
     get: () => props.visible,
diff --git a/rsf-design/src/views/basic-info/wh-mat/whMatPage.helpers.js b/rsf-design/src/views/basic-info/wh-mat/whMatPage.helpers.js
index 6675a07..5930c2f 100644
--- a/rsf-design/src/views/basic-info/wh-mat/whMatPage.helpers.js
+++ b/rsf-design/src/views/basic-info/wh-mat/whMatPage.helpers.js
@@ -1,3 +1,5 @@
+import { $t } from '@/locales'
+
 function normalizeText(value) {
   return String(value ?? '').trim()
 }
@@ -55,7 +57,7 @@
   }
 }
 
-export function normalizeWhMatGroupTreeRows(records = []) {
+export function normalizeWhMatGroupTreeRows(records = [], t = $t) {
   if (!Array.isArray(records)) {
     return []
   }
@@ -76,55 +78,61 @@
       label,
       displayLabel: label,
       status: normalizeNullableNumber(item?.status),
-      statusText: normalizeNumber(item?.status, 1) === 1 ? '姝e父' : '鍐荤粨',
+      statusText: normalizeNumber(item?.status, 1) === 1 ? t('common.status.normal') : t('common.status.frozen'),
       statusType: normalizeNumber(item?.status, 1) === 1 ? 'success' : 'danger',
-      memo: normalizeText(item?.memo) || '-',
+      memo: normalizeText(item?.memo) || t('common.placeholder.empty'),
       children
     }
   })
 }
 
-export function normalizeWhMatRow(record = {}) {
+export function normalizeWhMatRow(record = {}, t = $t) {
   const statusValue = normalizeNullableNumber(record?.status)
   return {
     ...record,
-    code: normalizeText(record?.code) || '-',
-    name: normalizeText(record?.name) || '-',
-    groupName: normalizeText(record?.groupId$ || record?.groupCode) || '-',
-    shipperName: normalizeText(record?.shipperId$ || record?.shipperName) || '-',
-    barcode: normalizeText(record?.barcode) || '-',
-    spec: normalizeText(record?.spec) || '-',
-    model: normalizeText(record?.model) || '-',
-    color: normalizeText(record?.color) || '-',
-    size: normalizeText(record?.size) || '-',
-    unit: normalizeText(record?.unit) || '-',
-    purUnit: normalizeText(record?.purUnit) || '-',
-    stockUnit: normalizeText(record?.stockUnit) || '-',
-    stockLevelText: normalizeText(record?.stockLeval$) || '-',
-    flagLabelManageText: normalizeText(record?.flagLabelMange$) || '-',
+    code: normalizeText(record?.code) || t('common.placeholder.empty'),
+    name: normalizeText(record?.name) || t('common.placeholder.empty'),
+    groupName: normalizeText(record?.groupId$ || record?.groupCode) || t('common.placeholder.empty'),
+    shipperName: normalizeText(record?.shipperId$ || record?.shipperName) || t('common.placeholder.empty'),
+    barcode: normalizeText(record?.barcode) || t('common.placeholder.empty'),
+    spec: normalizeText(record?.spec) || t('common.placeholder.empty'),
+    model: normalizeText(record?.model) || t('common.placeholder.empty'),
+    color: normalizeText(record?.color) || t('common.placeholder.empty'),
+    size: normalizeText(record?.size) || t('common.placeholder.empty'),
+    unit: normalizeText(record?.unit) || t('common.placeholder.empty'),
+    purUnit: normalizeText(record?.purUnit) || t('common.placeholder.empty'),
+    stockUnit: normalizeText(record?.stockUnit) || t('common.placeholder.empty'),
+    stockLevelText: normalizeText(record?.stockLeval$) || t('common.placeholder.empty'),
+    flagLabelManageText: normalizeText(record?.flagLabelMange$) || t('common.placeholder.empty'),
     flagCheckText:
       record?.flagCheck === 1 || record?.flagCheck === '1'
-        ? '鏄�'
+        ? t('common.status.yes')
         : record?.flagCheck === 0 || record?.flagCheck === '0'
-          ? '鍚�'
-          : '-',
-    statusText: normalizeText(record?.status$) || (statusValue === 1 ? '姝e父' : statusValue === 0 ? '鍐荤粨' : '-'),
+          ? t('common.status.no')
+          : t('common.placeholder.empty'),
+    statusText:
+      normalizeText(record?.status$) ||
+      (statusValue === 1
+        ? t('common.status.normal')
+        : statusValue === 0
+          ? t('common.status.frozen')
+          : t('common.placeholder.empty')),
     statusType: statusValue === 1 ? 'success' : statusValue === 0 ? 'danger' : 'info',
-    safeQty: record?.safeQty ?? '-',
-    minQty: record?.minQty ?? '-',
-    maxQty: record?.maxQty ?? '-',
-    valid: record?.valid ?? '-',
-    validWarn: record?.validWarn ?? '-',
-    stagn: record?.stagn ?? '-',
-    describle: normalizeText(record?.describle) || '-',
-    baseUnit: normalizeText(record?.baseUnit) || '-',
-    useOrgName: normalizeText(record?.useOrgName) || '-',
-    erpClsId: normalizeText(record?.erpClsId) || '-',
-    memo: normalizeText(record?.memo) || '-',
-    updateByText: normalizeText(record?.updateBy$) || '-',
-    createByText: normalizeText(record?.createBy$) || '-',
-    updateTimeText: normalizeText(record?.updateTime$ || record?.updateTime) || '-',
-    createTimeText: normalizeText(record?.createTime$ || record?.createTime) || '-',
+    safeQty: record?.safeQty ?? t('common.placeholder.empty'),
+    minQty: record?.minQty ?? t('common.placeholder.empty'),
+    maxQty: record?.maxQty ?? t('common.placeholder.empty'),
+    valid: record?.valid ?? t('common.placeholder.empty'),
+    validWarn: record?.validWarn ?? t('common.placeholder.empty'),
+    stagn: record?.stagn ?? t('common.placeholder.empty'),
+    describle: normalizeText(record?.describle) || t('common.placeholder.empty'),
+    baseUnit: normalizeText(record?.baseUnit) || t('common.placeholder.empty'),
+    useOrgName: normalizeText(record?.useOrgName) || t('common.placeholder.empty'),
+    erpClsId: normalizeText(record?.erpClsId) || t('common.placeholder.empty'),
+    memo: normalizeText(record?.memo) || t('common.placeholder.empty'),
+    updateByText: normalizeText(record?.updateBy$) || t('common.placeholder.empty'),
+    createByText: normalizeText(record?.createBy$) || t('common.placeholder.empty'),
+    updateTimeText: normalizeText(record?.updateTime$ || record?.updateTime) || t('common.placeholder.empty'),
+    createTimeText: normalizeText(record?.createTime$ || record?.createTime) || t('common.placeholder.empty'),
     extendFields:
       record?.extendFields && typeof record.extendFields === 'object' && !Array.isArray(record.extendFields)
         ? record.extendFields
@@ -132,14 +140,14 @@
   }
 }
 
-export function normalizeWhMatDetail(record = {}) {
-  return normalizeWhMatRow(record)
+export function normalizeWhMatDetail(record = {}, t = $t) {
+  return normalizeWhMatRow(record, t)
 }
 
 export function getWhMatTreeNodeLabel(node = {}) {
   const name = normalizeText(node?.name)
   const code = normalizeText(node?.code)
-  return [name, code].filter(Boolean).join(' 路 ') || '-'
+  return [name, code].filter(Boolean).join(' 路 ') || $t('common.placeholder.empty')
 }
 
 export const buildMatnrPageQueryParams = buildWhMatPageQueryParams
diff --git a/rsf-design/src/views/basic-info/wh-mat/whMatTable.columns.js b/rsf-design/src/views/basic-info/wh-mat/whMatTable.columns.js
index 3666937..9d4b6d4 100644
--- a/rsf-design/src/views/basic-info/wh-mat/whMatTable.columns.js
+++ b/rsf-design/src/views/basic-info/wh-mat/whMatTable.columns.js
@@ -1,66 +1,67 @@
 import { h } from 'vue'
 import { ElTag } from 'element-plus'
+import { $t } from '@/locales'
 
-export function createWhMatTableColumns({ handleViewDetail }) {
+export function createWhMatTableColumns({ handleViewDetail, t = $t }) {
   return [
     {
       prop: 'code',
-      label: '鐗╂枡缂栫爜',
+      label: t('pages.basicInfo.whMat.table.code'),
       minWidth: 150,
       showOverflowTooltip: true
     },
     {
       prop: 'name',
-      label: '鐗╂枡鍚嶇О',
+      label: t('pages.basicInfo.whMat.table.name'),
       minWidth: 220,
       showOverflowTooltip: true
     },
     {
       prop: 'groupName',
-      label: '鐗╂枡鍒嗙粍',
+      label: t('pages.basicInfo.whMat.table.groupName'),
       minWidth: 160,
       showOverflowTooltip: true
     },
     {
       prop: 'barcode',
-      label: '鏉$爜',
+      label: t('pages.basicInfo.whMat.table.barcode'),
       minWidth: 160,
       showOverflowTooltip: true
     },
     {
       prop: 'spec',
-      label: '瑙勬牸',
+      label: t('pages.basicInfo.whMat.table.spec'),
       minWidth: 150,
       showOverflowTooltip: true
     },
     {
       prop: 'model',
-      label: '鍨嬪彿',
+      label: t('pages.basicInfo.whMat.table.model'),
       minWidth: 150,
       showOverflowTooltip: true
     },
     {
       prop: 'unit',
-      label: '鍗曚綅',
+      label: t('table.unit'),
       width: 100
     },
     {
       prop: 'status',
-      label: '鐘舵��',
+      label: t('table.status'),
       width: 100,
       align: 'center',
       formatter: (row) =>
-        h(ElTag, { type: row.statusType || 'info', effect: 'light' }, () => row.statusText || '-')
+        h(ElTag, { type: row.statusType || 'info', effect: 'light' }, () => row.statusText || t('common.placeholder.empty'))
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: t('table.updateTime'),
       minWidth: 180,
       showOverflowTooltip: true
     },
     {
       prop: 'action',
-      label: '鎿嶄綔',
+      label: t('table.operation'),
       width: 100,
       fixed: 'right',
       align: 'center',
diff --git a/rsf-design/src/views/manager/freeze/freezePage.helpers.js b/rsf-design/src/views/manager/freeze/freezePage.helpers.js
index f5ece80..9d505a9 100644
--- a/rsf-design/src/views/manager/freeze/freezePage.helpers.js
+++ b/rsf-design/src/views/manager/freeze/freezePage.helpers.js
@@ -1,3 +1,5 @@
+import { $t } from '@/locales'
+
 export const FREEZE_DYNAMIC_FIELD_PREFIX = 'extendField__'
 
 function normalizeText(value) {
@@ -84,7 +86,7 @@
       qty: normalizeNumber(record.qty),
       workQty: normalizeNumber(record.workQty),
       splrName: record.splrName || '-',
-      statusText: record['status$'] || '鍐荤粨',
+      statusText: record['status$'] || $t('common.status.frozen'),
       updateTimeText: record['updateTime$'] || record.updateTime || '-',
       createTimeText: record['createTime$'] || record.createTime || '-',
       memo: record.memo || '-'
diff --git a/rsf-design/src/views/manager/freeze/freezeTable.columns.js b/rsf-design/src/views/manager/freeze/freezeTable.columns.js
index f4f7d10..918cba6 100644
--- a/rsf-design/src/views/manager/freeze/freezeTable.columns.js
+++ b/rsf-design/src/views/manager/freeze/freezeTable.columns.js
@@ -1,4 +1,5 @@
 import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
+import { $t } from '@/locales'
 
 export function createFreezeTableColumns({ enabledFields = [] }) {
   const dynamicColumns = enabledFields.map((field) => ({
@@ -12,84 +13,84 @@
   return [
     {
       type: 'globalIndex',
-      label: '搴忓彿',
+      label: $t('table.index'),
       width: 72,
       align: 'center'
     },
     {
       prop: 'locCode',
-      label: '搴撲綅缂栫爜',
+      label: $t('pages.manager.freeze.table.locCode'),
       minWidth: 150,
       showOverflowTooltip: true
     },
     {
       prop: 'wareArea',
-      label: '搴撳尯',
+      label: $t('pages.manager.freeze.table.wareArea'),
       minWidth: 150,
       showOverflowTooltip: true
     },
     {
       prop: 'matnrCode',
-      label: '鐗╂枡缂栫爜',
+      label: $t('pages.manager.freeze.table.matnrCode'),
       minWidth: 160,
       showOverflowTooltip: true
     },
     {
       prop: 'maktx',
-      label: '鐗╂枡鍚嶇О',
+      label: $t('pages.manager.freeze.table.maktx'),
       minWidth: 220,
       showOverflowTooltip: true
     },
     {
       prop: 'batch',
-      label: '鎵规',
+      label: $t('pages.manager.freeze.table.batch'),
       minWidth: 140,
       showOverflowTooltip: true
     },
     {
       prop: 'trackCode',
-      label: '杩借釜鐮�',
+      label: $t('pages.manager.freeze.table.trackCode'),
       minWidth: 150,
       showOverflowTooltip: true
     },
     {
       prop: 'unit',
-      label: '鍗曚綅',
+      label: $t('table.unit'),
       width: 100
     },
     {
       prop: 'anfme',
-      label: '鍙敤鏁伴噺',
+      label: $t('pages.manager.freeze.table.anfme'),
       width: 110,
       align: 'right'
     },
     {
       prop: 'qty',
-      label: '搴撳瓨鏁伴噺',
+      label: $t('pages.manager.freeze.table.qty'),
       width: 110,
       align: 'right'
     },
     {
       prop: 'workQty',
-      label: '鎵ц涓暟閲�',
+      label: $t('pages.manager.freeze.table.workQty'),
       width: 120,
       align: 'right'
     },
     ...dynamicColumns,
     {
       prop: 'statusText',
-      label: '鐘舵��',
+      label: $t('table.status'),
       width: 100
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: $t('table.updateTime'),
       minWidth: 180,
       showOverflowTooltip: true
     },
     {
       prop: 'action',
-      label: '璇︽儏',
+      label: $t('common.actions.detail'),
       width: 100,
       fixed: 'right',
       useSlot: true,
diff --git a/rsf-design/src/views/manager/freeze/index.vue b/rsf-design/src/views/manager/freeze/index.vue
index a7adef4..6101026 100644
--- a/rsf-design/src/views/manager/freeze/index.vue
+++ b/rsf-design/src/views/manager/freeze/index.vue
@@ -31,6 +31,7 @@
 
 <script setup>
   import { computed, onMounted, reactive, ref } from 'vue'
+  import { useI18n } from 'vue-i18n'
   import { useTableColumns } from '@/hooks/core/useTableColumns'
   import { guardRequestWithMessage } from '@/utils/sys/requestGuard'
   import { fetchEnabledFields, fetchFreezeDetail, fetchFreezePage } from '@/api/freeze'
@@ -46,6 +47,7 @@
   } from './freezePage.helpers'
 
   defineOptions({ name: 'Freeze' })
+  const { t } = useI18n()
 
   const loading = ref(false)
   const tableData = ref([])
@@ -62,57 +64,57 @@
 
   const searchItems = computed(() => [
     {
-      label: '鍏抽敭瀛�',
+      label: t('pages.manager.freeze.search.condition'),
       key: 'condition',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ュ簱浣嶇紪鐮�/鐗╂枡缂栫爜'
+        placeholder: t('pages.manager.freeze.search.conditionPlaceholder')
       }
     },
     {
-      label: '搴撲綅缂栫爜',
+      label: t('pages.manager.freeze.search.locCode'),
       key: 'locCode',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ュ簱浣嶇紪鐮�'
+        placeholder: t('pages.manager.freeze.search.locCodePlaceholder')
       }
     },
     {
-      label: '鐗╂枡缂栫爜',
+      label: t('pages.manager.freeze.search.matnrCode'),
       key: 'matnrCode',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ョ墿鏂欑紪鐮�'
+        placeholder: t('pages.manager.freeze.search.matnrCodePlaceholder')
       }
     },
     {
-      label: '鐗╂枡鍚嶇О',
+      label: t('pages.manager.freeze.search.maktx'),
       key: 'maktx',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ョ墿鏂欏悕绉�'
+        placeholder: t('pages.manager.freeze.search.maktxPlaceholder')
       }
     },
     {
-      label: '鎵规',
+      label: t('pages.manager.freeze.search.batch'),
       key: 'batch',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ユ壒娆�'
+        placeholder: t('pages.manager.freeze.search.batchPlaceholder')
       }
     },
     {
-      label: '杩借釜鐮�',
+      label: t('pages.manager.freeze.search.trackCode'),
       key: 'trackCode',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ヨ拷韪爜'
+        placeholder: t('pages.manager.freeze.search.trackCodePlaceholder')
       }
     },
     ...enabledFields.value.map((field) => ({
@@ -121,7 +123,7 @@
       type: 'input',
       props: {
         clearable: true,
-        placeholder: `璇疯緭鍏�${field.fieldsAlise}`
+        placeholder: t('pages.manager.freeze.search.dynamicPlaceholder', { label: field.fieldsAlise })
       }
     }))
   ])
@@ -140,7 +142,7 @@
 
   async function loadEnabledFieldDefinitions() {
     const fields = await guardRequestWithMessage(fetchEnabledFields(), [], {
-      timeoutMessage: '鎵╁睍瀛楁鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+      timeoutMessage: t('pages.manager.freeze.messages.fieldsTimeout')
     })
     enabledFields.value = normalizeFreezeEnabledFields(fields)
     enabledFields.value.forEach((field) => {
@@ -169,7 +171,7 @@
           current: pagination.current,
           size: pagination.size
         },
-        { timeoutMessage: '鍐荤粨搴撳瓨鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟' }
+        { timeoutMessage: t('pages.manager.freeze.messages.pageTimeout') }
       )
       tableData.value = Array.isArray(response?.records)
         ? response.records.map((record) => normalizeFreezeRow(record, enabledFields.value))
@@ -182,9 +184,9 @@
 
   async function openDetailDrawer(row) {
     detailDrawerVisible.value = true
-    detailData.value = normalizeFreezeDetail(
+      detailData.value = normalizeFreezeDetail(
       await guardRequestWithMessage(fetchFreezeDetail(row.id), {}, {
-        timeoutMessage: '鍐荤粨搴撳瓨璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+        timeoutMessage: t('pages.manager.freeze.messages.detailTimeout')
       }),
       enabledFields.value
     )
diff --git a/rsf-design/src/views/manager/freeze/modules/freeze-detail-drawer.vue b/rsf-design/src/views/manager/freeze/modules/freeze-detail-drawer.vue
index 0938e12..18d8908 100644
--- a/rsf-design/src/views/manager/freeze/modules/freeze-detail-drawer.vue
+++ b/rsf-design/src/views/manager/freeze/modules/freeze-detail-drawer.vue
@@ -1,31 +1,57 @@
 <template>
   <ElDrawer
     :model-value="visible"
-    title="鍐荤粨搴撳瓨璇︽儏"
+    :title="t('pages.manager.freeze.detail.title')"
     size="72%"
     @update:model-value="handleVisibleChange"
   >
     <ElDescriptions :column="3" border>
-      <ElDescriptionsItem label="搴撲綅缂栫爜">{{ detail.locCode || '--' }}</ElDescriptionsItem>
-      <ElDescriptionsItem label="搴撳尯">{{ detail.wareArea || '--' }}</ElDescriptionsItem>
-      <ElDescriptionsItem label="鐗╂枡缂栫爜">{{ detail.matnrCode || '--' }}</ElDescriptionsItem>
-      <ElDescriptionsItem label="鐗╂枡鍚嶇О">{{ detail.maktx || '--' }}</ElDescriptionsItem>
-      <ElDescriptionsItem label="鎵规">{{ detail.batch || '--' }}</ElDescriptionsItem>
-      <ElDescriptionsItem label="杩借釜鐮�">{{ detail.trackCode || '--' }}</ElDescriptionsItem>
-      <ElDescriptionsItem label="鍗曚綅">{{ detail.unit || '--' }}</ElDescriptionsItem>
-      <ElDescriptionsItem label="鍙敤鏁伴噺">{{ detail.anfme ?? '--' }}</ElDescriptionsItem>
-      <ElDescriptionsItem label="搴撳瓨鏁伴噺">{{ detail.qty ?? '--' }}</ElDescriptionsItem>
-      <ElDescriptionsItem label="鎵ц涓暟閲�">{{ detail.workQty ?? '--' }}</ElDescriptionsItem>
-      <ElDescriptionsItem label="鐘舵��">{{ detail.statusText || '--' }}</ElDescriptionsItem>
-      <ElDescriptionsItem label="渚涘簲鍟�">{{ detail.splrName || '--' }}</ElDescriptionsItem>
-      <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
-      <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
-      <ElDescriptionsItem label="澶囨敞" :span="3">{{ detail.memo || '--' }}</ElDescriptionsItem>
+      <ElDescriptionsItem :label="t('pages.manager.freeze.table.locCode')">{{
+        detail.locCode || '--'
+      }}</ElDescriptionsItem>
+      <ElDescriptionsItem :label="t('pages.manager.freeze.table.wareArea')">{{
+        detail.wareArea || '--'
+      }}</ElDescriptionsItem>
+      <ElDescriptionsItem :label="t('pages.manager.freeze.table.matnrCode')">{{
+        detail.matnrCode || '--'
+      }}</ElDescriptionsItem>
+      <ElDescriptionsItem :label="t('pages.manager.freeze.table.maktx')">{{
+        detail.maktx || '--'
+      }}</ElDescriptionsItem>
+      <ElDescriptionsItem :label="t('pages.manager.freeze.table.batch')">{{
+        detail.batch || '--'
+      }}</ElDescriptionsItem>
+      <ElDescriptionsItem :label="t('pages.manager.freeze.table.trackCode')">{{
+        detail.trackCode || '--'
+      }}</ElDescriptionsItem>
+      <ElDescriptionsItem :label="t('table.unit')">{{ detail.unit || '--' }}</ElDescriptionsItem>
+      <ElDescriptionsItem :label="t('pages.manager.freeze.table.anfme')">{{
+        detail.anfme ?? '--'
+      }}</ElDescriptionsItem>
+      <ElDescriptionsItem :label="t('pages.manager.freeze.table.qty')">{{
+        detail.qty ?? '--'
+      }}</ElDescriptionsItem>
+      <ElDescriptionsItem :label="t('pages.manager.freeze.table.workQty')">{{
+        detail.workQty ?? '--'
+      }}</ElDescriptionsItem>
+      <ElDescriptionsItem :label="t('table.status')">{{ detail.statusText || '--' }}</ElDescriptionsItem>
+      <ElDescriptionsItem :label="t('table.supplier')">{{ detail.splrName || '--' }}</ElDescriptionsItem>
+      <ElDescriptionsItem :label="t('table.updateTime')">{{
+        detail.updateTimeText || '--'
+      }}</ElDescriptionsItem>
+      <ElDescriptionsItem :label="t('table.createTime')">{{
+        detail.createTimeText || '--'
+      }}</ElDescriptionsItem>
+      <ElDescriptionsItem :label="t('table.memo')" :span="3">{{ detail.memo || '--' }}</ElDescriptionsItem>
     </ElDescriptions>
   </ElDrawer>
 </template>
 
 <script setup>
+  import { useI18n } from 'vue-i18n'
+
+  const { t } = useI18n()
+
   defineProps({
     visible: { type: Boolean, default: false },
     detail: { type: Object, default: () => ({}) }
diff --git a/rsf-design/src/views/manager/in-statistic-item/inStatisticItemPage.helpers.js b/rsf-design/src/views/manager/in-statistic-item/inStatisticItemPage.helpers.js
index c61ea0a..9c9a8ce 100644
--- a/rsf-design/src/views/manager/in-statistic-item/inStatisticItemPage.helpers.js
+++ b/rsf-design/src/views/manager/in-statistic-item/inStatisticItemPage.helpers.js
@@ -2,8 +2,9 @@
   getInStatisticTaskStatusMeta,
   getInStatisticTaskTypeMeta
 } from '../../statistics/in-statistic/inStatisticPage.helpers.js'
+import { $t } from '@/locales'
 
-export const IN_STATISTIC_ITEM_PAGE_TITLE = '鍏ュ簱缁熻鏄庣粏'
+export const IN_STATISTIC_ITEM_PAGE_TITLE = $t('pages.manager.inStatisticItem.title')
 
 function normalizeText(value) {
   return String(value ?? '').trim()
diff --git a/rsf-design/src/views/manager/in-statistic-item/inStatisticItemTable.columns.js b/rsf-design/src/views/manager/in-statistic-item/inStatisticItemTable.columns.js
index 4c49e25..1aa1d97 100644
--- a/rsf-design/src/views/manager/in-statistic-item/inStatisticItemTable.columns.js
+++ b/rsf-design/src/views/manager/in-statistic-item/inStatisticItemTable.columns.js
@@ -1,109 +1,110 @@
 import { h } from 'vue'
 import { ElTag } from 'element-plus'
 import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
+import { $t } from '@/locales'
 
 export function createInStatisticItemTableColumns({ handleView } = {}) {
   return [
     {
       type: 'globalIndex',
-      label: '搴忓彿',
+      label: $t('table.index'),
       width: 72,
       align: 'center'
     },
     {
       prop: 'id',
-      label: 'ID',
+      label: $t('table.id'),
       width: 90,
       align: 'center',
       formatter: (row) => row.id ?? '--'
     },
     {
       prop: 'dayTimeText',
-      label: '缁熻鏃ユ湡',
+      label: $t('pages.manager.inStatisticItem.table.dayTime'),
       minWidth: 130,
       showOverflowTooltip: true,
       formatter: (row) => row.dayTimeText || '--'
     },
     {
       prop: 'locCode',
-      label: '搴撲綅',
+      label: $t('pages.manager.inStatisticItem.table.locCode'),
       minWidth: 140,
       showOverflowTooltip: true,
       formatter: (row) => row.locCode || '--'
     },
     {
       prop: 'matnrCode',
-      label: '鐗╂枡缂栫爜',
+      label: $t('pages.manager.inStatisticItem.table.matnrCode'),
       minWidth: 150,
       showOverflowTooltip: true,
       formatter: (row) => row.matnrCode || '--'
     },
     {
       prop: 'maktx',
-      label: '鐗╂枡鍚嶇О',
+      label: $t('pages.manager.inStatisticItem.table.maktx'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.maktx || '--'
     },
     {
       prop: 'anfme',
-      label: '鏁伴噺',
+      label: $t('pages.manager.inStatisticItem.table.anfme'),
       width: 120,
       align: 'right',
       formatter: (row) => row.anfme ?? '--'
     },
     {
       prop: 'batch',
-      label: '鎵规',
+      label: $t('pages.manager.inStatisticItem.table.batch'),
       minWidth: 140,
       showOverflowTooltip: true,
       formatter: (row) => row.batch || '--'
     },
     {
       prop: 'unit',
-      label: '鍗曚綅',
+      label: $t('table.unit'),
       width: 90,
       align: 'center',
       formatter: (row) => row.unit || '--'
     },
     {
       prop: 'barcode',
-      label: '鎵樼洏鐮�',
+      label: $t('pages.manager.inStatisticItem.table.barcode'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.barcode || '--'
     },
     {
       prop: 'createByText',
-      label: '鍒涘缓浜�',
+      label: $t('table.createBy'),
       minWidth: 120,
       showOverflowTooltip: true,
       formatter: (row) => row.createByText || '--'
     },
     {
       prop: 'createTimeText',
-      label: '鍒涘缓鏃堕棿',
+      label: $t('table.createTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.createTimeText || '--'
     },
     {
       prop: 'updateByText',
-      label: '鏇存柊浜�',
+      label: $t('table.updateBy'),
       minWidth: 120,
       showOverflowTooltip: true,
       formatter: (row) => row.updateByText || '--'
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: $t('table.updateTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.updateTimeText || '--'
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: $t('table.operation'),
       width: 90,
       align: 'center',
       fixed: 'right',
diff --git a/rsf-design/src/views/manager/in-statistic-item/index.vue b/rsf-design/src/views/manager/in-statistic-item/index.vue
index 1809adb..5c49965 100644
--- a/rsf-design/src/views/manager/in-statistic-item/index.vue
+++ b/rsf-design/src/views/manager/in-statistic-item/index.vue
@@ -31,6 +31,7 @@
 
 <script setup>
   import { computed, ref } from 'vue'
+  import { useI18n } from 'vue-i18n'
   import { useTable } from '@/hooks/core/useTable'
   import { fetchGetInStatisticItemDetail, fetchInStatisticItemPage } from '@/api/in-statistic-item'
   import {
@@ -44,6 +45,7 @@
   import InStatisticItemDetailDrawer from './modules/in-statistic-item-detail-drawer.vue'
 
   defineOptions({ name: 'InStatisticItem' })
+  const { t } = useI18n()
 
   const searchForm = ref(createInStatisticItemSearchState())
   const detailDrawerVisible = ref(false)
@@ -52,16 +54,16 @@
 
   const searchItems = computed(() => [
     {
-      label: '鍏抽敭瀛�',
+      label: t('pages.manager.inStatisticItem.search.condition'),
       key: 'condition',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ョ墿鏂欏悕绉�/缂栫爜/鎵规'
+        placeholder: t('pages.manager.inStatisticItem.search.conditionPlaceholder')
       }
     },
     {
-      label: '缁熻鏃ユ湡',
+      label: t('pages.manager.inStatisticItem.search.dayTime'),
       key: 'dayTime',
       type: 'date',
       props: {
@@ -71,30 +73,30 @@
       }
     },
     {
-      label: '鐗╂枡鍚嶇О',
+      label: t('pages.manager.inStatisticItem.search.maktx'),
       key: 'maktx',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ョ墿鏂欏悕绉�'
+        placeholder: t('pages.manager.inStatisticItem.search.maktxPlaceholder')
       }
     },
     {
-      label: '鐗╂枡缂栫爜',
+      label: t('pages.manager.inStatisticItem.search.matnrCode'),
       key: 'matnrCode',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ョ墿鏂欑紪鐮�'
+        placeholder: t('pages.manager.inStatisticItem.search.matnrCodePlaceholder')
       }
     },
     {
-      label: '鎵规',
+      label: t('pages.manager.inStatisticItem.search.batch'),
       key: 'batch',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ユ壒娆�'
+        placeholder: t('pages.manager.inStatisticItem.search.batchPlaceholder')
       }
     }
   ])
diff --git a/rsf-design/src/views/manager/in-statistic-item/modules/in-statistic-item-detail-drawer.vue b/rsf-design/src/views/manager/in-statistic-item/modules/in-statistic-item-detail-drawer.vue
index 5c2afed..b5c805c 100644
--- a/rsf-design/src/views/manager/in-statistic-item/modules/in-statistic-item-detail-drawer.vue
+++ b/rsf-design/src/views/manager/in-statistic-item/modules/in-statistic-item-detail-drawer.vue
@@ -1,7 +1,7 @@
 <template>
   <ElDrawer
     :model-value="visible"
-    :title="IN_STATISTIC_ITEM_PAGE_TITLE + '璇︽儏'"
+    :title="t('pages.manager.inStatisticItem.detail.title', { title: IN_STATISTIC_ITEM_PAGE_TITLE })"
     size="72%"
     @update:model-value="handleVisibleChange"
   >
@@ -9,30 +9,54 @@
       <div class="flex min-h-full flex-col gap-4 pr-2">
         <ElSkeleton v-if="loading" :rows="10" animated />
         <ElDescriptions v-else :column="4" border>
-          <ElDescriptionsItem label="ID">{{ detail.id ?? '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="缁熻鏃ユ湡">{{ detail.dayTimeText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="浠诲姟绫诲瀷">
+          <ElDescriptionsItem :label="t('table.id')">{{ detail.id ?? '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.manager.inStatisticItem.table.dayTime')">{{
+            detail.dayTimeText || '--'
+          }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.manager.inStatisticItem.detail.taskType')">
             <ElTag :type="detail.taskTypeTagType || 'info'" effect="light">
               {{ detail.taskTypeText || '--' }}
             </ElTag>
           </ElDescriptionsItem>
-          <ElDescriptionsItem label="浠诲姟鐘舵��">
+          <ElDescriptionsItem :label="t('pages.manager.inStatisticItem.detail.taskStatus')">
             <ElTag :type="detail.taskStatusTagType || 'info'" effect="light">
               {{ detail.taskStatusText || '--' }}
             </ElTag>
           </ElDescriptionsItem>
-          <ElDescriptionsItem label="搴撲綅">{{ detail.locCode || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鐗╂枡缂栫爜">{{ detail.matnrCode || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鐗╂枡鍚嶇О">{{ detail.maktx || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鎵规">{{ detail.batch || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鏁伴噺">{{ detail.anfme ?? '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鍗曚綅">{{ detail.unit || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鎵樼洏鐮�">{{ detail.barcode || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="绱㈠紩">{{ detail.fieldsIndex || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鍒涘缓浜�">{{ detail.createByText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鏇存柊浜�">{{ detail.updateByText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.manager.inStatisticItem.table.locCode')">{{
+            detail.locCode || '--'
+          }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.manager.inStatisticItem.table.matnrCode')">{{
+            detail.matnrCode || '--'
+          }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.manager.inStatisticItem.table.maktx')">{{
+            detail.maktx || '--'
+          }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.manager.inStatisticItem.table.batch')">{{
+            detail.batch || '--'
+          }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.manager.inStatisticItem.table.anfme')">{{
+            detail.anfme ?? '--'
+          }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.unit')">{{ detail.unit || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.manager.inStatisticItem.table.barcode')">{{
+            detail.barcode || '--'
+          }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.manager.inStatisticItem.detail.fieldsIndex')">{{
+            detail.fieldsIndex || '--'
+          }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.createBy')">{{
+            detail.createByText || '--'
+          }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.createTime')">{{
+            detail.createTimeText || '--'
+          }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.updateBy')">{{
+            detail.updateByText || '--'
+          }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.updateTime')">{{
+            detail.updateTimeText || '--'
+          }}</ElDescriptionsItem>
         </ElDescriptions>
       </div>
     </ElScrollbar>
@@ -40,9 +64,11 @@
 </template>
 
 <script setup>
+  import { useI18n } from 'vue-i18n'
   import { IN_STATISTIC_ITEM_PAGE_TITLE } from '../inStatisticItemPage.helpers'
 
   defineOptions({ name: 'InStatisticItemDetailDrawer' })
+  const { t } = useI18n()
 
   defineProps({
     visible: { type: Boolean, default: false },
diff --git a/rsf-design/src/views/manager/loc-item/index.vue b/rsf-design/src/views/manager/loc-item/index.vue
index f6a40ed..7762814 100644
--- a/rsf-design/src/views/manager/loc-item/index.vue
+++ b/rsf-design/src/views/manager/loc-item/index.vue
@@ -36,6 +36,7 @@
 <script setup>
   import { computed, onMounted, ref } from 'vue'
   import { useRoute } from 'vue-router'
+  import { useI18n } from 'vue-i18n'
   import { ElMessage } from 'element-plus'
   import { useTable } from '@/hooks/core/useTable'
   import { guardRequestWithMessage } from '@/utils/sys/requestGuard'
@@ -55,6 +56,7 @@
   } from './locItemPage.helpers'
 
   defineOptions({ name: 'LocItem' })
+  const { t } = useI18n()
 
   const route = useRoute()
   const searchForm = ref(createLocItemSearchState())
@@ -64,79 +66,79 @@
 
   const searchItems = computed(() => [
     {
-      label: '鍏抽敭瀛�',
+      label: t('pages.manager.locItem.search.condition'),
       key: 'condition',
       type: 'input',
-      props: { clearable: true, placeholder: '璇疯緭鍏ュ簱浣嶇紪鐮�/鐗╂枡缂栫爜/杩借釜鐮�' }
+      props: { clearable: true, placeholder: t('pages.manager.locItem.search.conditionPlaceholder') }
     },
     {
-      label: '寮�濮嬫棩鏈�',
+      label: t('pages.manager.locItem.search.timeStart'),
       key: 'timeStart',
       type: 'date',
       props: { clearable: true, valueFormat: 'YYYY-MM-DD', type: 'date' }
     },
     {
-      label: '缁撴潫鏃ユ湡',
+      label: t('pages.manager.locItem.search.timeEnd'),
       key: 'timeEnd',
       type: 'date',
       props: { clearable: true, valueFormat: 'YYYY-MM-DD', type: 'date' }
     },
     {
-      label: '搴撲綅ID',
+      label: t('pages.manager.locItem.search.locId'),
       key: 'locId',
       type: 'inputNumber',
-      props: { min: 0, controlsPosition: 'right', placeholder: '璇疯緭鍏ュ簱浣岻D' }
+      props: { min: 0, controlsPosition: 'right', placeholder: t('pages.manager.locItem.search.locIdPlaceholder') }
     },
     {
-      label: '鍗曟嵁ID',
+      label: t('pages.manager.locItem.search.orderId'),
       key: 'orderId',
       type: 'inputNumber',
-      props: { min: 0, controlsPosition: 'right', placeholder: '璇疯緭鍏ュ崟鎹甀D' }
+      props: { min: 0, controlsPosition: 'right', placeholder: t('pages.manager.locItem.search.orderIdPlaceholder') }
     },
     {
-      label: '涓氬姟绫诲瀷',
+      label: t('pages.manager.locItem.search.type'),
       key: 'type',
       type: 'input',
-      props: { clearable: true, placeholder: '璇疯緭鍏ヤ笟鍔$被鍨�' }
+      props: { clearable: true, placeholder: t('pages.manager.locItem.search.typePlaceholder') }
     },
     {
-      label: '宸ヤ綅绫诲瀷',
+      label: t('pages.manager.locItem.search.wkType'),
       key: 'wkType',
       type: 'inputNumber',
-      props: { min: 0, controlsPosition: 'right', placeholder: '璇疯緭鍏ュ伐浣嶇被鍨�' }
+      props: { min: 0, controlsPosition: 'right', placeholder: t('pages.manager.locItem.search.wkTypePlaceholder') }
     },
     {
-      label: '鐗╂枡缂栫爜',
+      label: t('pages.manager.locItem.search.matnrCode'),
       key: 'matnrCode',
       type: 'input',
-      props: { clearable: true, placeholder: '璇疯緭鍏ョ墿鏂欑紪鐮�' }
+      props: { clearable: true, placeholder: t('pages.manager.locItem.search.matnrCodePlaceholder') }
     },
     {
-      label: '鐗╂枡鍚嶇О',
+      label: t('pages.manager.locItem.search.maktx'),
       key: 'maktx',
       type: 'input',
-      props: { clearable: true, placeholder: '璇疯緭鍏ョ墿鏂欏悕绉�' }
+      props: { clearable: true, placeholder: t('pages.manager.locItem.search.maktxPlaceholder') }
     },
     {
-      label: '杩借釜鐮�',
+      label: t('pages.manager.locItem.search.trackCode'),
       key: 'trackCode',
       type: 'input',
-      props: { clearable: true, placeholder: '璇疯緭鍏ヨ拷韪爜' }
+      props: { clearable: true, placeholder: t('pages.manager.locItem.search.trackCodePlaceholder') }
     },
     {
-      label: '鎵规',
+      label: t('pages.manager.locItem.search.batch'),
       key: 'batch',
       type: 'input',
-      props: { clearable: true, placeholder: '璇疯緭鍏ユ壒娆�' }
+      props: { clearable: true, placeholder: t('pages.manager.locItem.search.batchPlaceholder') }
     },
     {
-      label: '渚涘簲鍟嗘壒娆�',
+      label: t('pages.manager.locItem.search.splrBatch'),
       key: 'splrBatch',
       type: 'input',
-      props: { clearable: true, placeholder: '璇疯緭鍏ヤ緵搴斿晢鎵规' }
+      props: { clearable: true, placeholder: t('pages.manager.locItem.search.splrBatchPlaceholder') }
     },
     {
-      label: '鐘舵��',
+      label: t('table.status'),
       key: 'status',
       type: 'select',
       props: { clearable: true, options: getLocItemStatusOptions() }
@@ -179,7 +181,7 @@
             current: params.current || 1,
             pageSize: params.pageSize || params.size || 20
           },
-          { timeoutMessage: '搴撳瓨鏄庣粏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟' }
+          { timeoutMessage: t('pages.manager.locItem.messages.pageTimeout') }
         ),
       apiParams: buildLocItemPageQueryParams(searchForm.value),
       paginationKey: getLocItemPaginationKey()
@@ -197,13 +199,13 @@
     } catch (error) {
       detailDrawerVisible.value = false
       detailData.value = {}
-      ElMessage.error(error?.message || '鑾峰彇搴撳瓨鏄庣粏璇︽儏澶辫触')
+      ElMessage.error(error?.message || t('pages.manager.locItem.messages.detailFailed'))
     }
   }
 
   async function loadEnabledFieldDefinitions() {
     const fields = await guardRequestWithMessage(fetchEnabledFields(), [], {
-      timeoutMessage: '鎵╁睍瀛楁鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+      timeoutMessage: t('pages.manager.locItem.messages.fieldsTimeout')
     })
     enabledFields.value = normalizeLocItemEnabledFields(fields)
     resetColumns()
diff --git a/rsf-design/src/views/manager/loc-item/locItemPage.helpers.js b/rsf-design/src/views/manager/loc-item/locItemPage.helpers.js
index 0bc729d..dd411f2 100644
--- a/rsf-design/src/views/manager/loc-item/locItemPage.helpers.js
+++ b/rsf-design/src/views/manager/loc-item/locItemPage.helpers.js
@@ -1,3 +1,5 @@
+import { $t } from '@/locales'
+
 export const LOC_ITEM_DYNAMIC_FIELD_PREFIX = 'extendField__'
 
 function normalizeText(value) {
@@ -98,8 +100,8 @@
 
 export function getLocItemStatusOptions() {
   return [
-    { label: '鍚敤', value: 1 },
-    { label: '鍋滅敤', value: 0 }
+    { label: $t('common.status.enabled'), value: 1 },
+    { label: $t('common.status.disabled'), value: 0 }
   ]
 }
 
@@ -158,7 +160,10 @@
       workQty: normalizeNumber(record.workQty),
       fieldsIndex: record.fieldsIndex || '--',
       memo: record.memo || '--',
-      statusText: record.statusBool || Number(record.status) === 1 ? '鍚敤' : '鍋滅敤',
+      statusText:
+        record.statusBool || Number(record.status) === 1
+          ? $t('common.status.enabled')
+          : $t('common.status.disabled'),
       createByText: record['createBy$'] || record.createBy || '--',
       createTimeText: record['createTime$'] || record.createTime || '--',
       updateByText: record['updateBy$'] || record.updateBy || '--',
diff --git a/rsf-design/src/views/manager/loc-item/locItemTable.columns.js b/rsf-design/src/views/manager/loc-item/locItemTable.columns.js
index 4a73ded..7f415e9 100644
--- a/rsf-design/src/views/manager/loc-item/locItemTable.columns.js
+++ b/rsf-design/src/views/manager/loc-item/locItemTable.columns.js
@@ -1,113 +1,114 @@
 import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
+import { $t } from '@/locales'
 
 export function createLocItemTableColumns({ enabledFields = [], handleView }) {
   return [
     {
       prop: 'locId',
-      label: '搴撲綅ID',
+      label: $t('pages.manager.locItem.table.locId'),
       width: 110
     },
     {
       prop: 'wareArea',
-      label: '搴撳尯',
+      label: $t('pages.manager.locItem.table.wareArea'),
       minWidth: 140,
       showOverflowTooltip: true
     },
     {
       prop: 'locCode',
-      label: '搴撲綅缂栫爜',
+      label: $t('pages.manager.locItem.table.locCode'),
       minWidth: 140,
       showOverflowTooltip: true
     },
     {
       prop: 'typeText',
-      label: '涓氬姟绫诲瀷',
+      label: $t('pages.manager.locItem.table.type'),
       minWidth: 120,
       showOverflowTooltip: true
     },
     {
       prop: 'wkTypeText',
-      label: '宸ヤ綅绫诲瀷',
+      label: $t('pages.manager.locItem.table.wkType'),
       minWidth: 120,
       showOverflowTooltip: true
     },
     {
       prop: 'orderId',
-      label: '鍗曟嵁ID',
+      label: $t('pages.manager.locItem.table.orderId'),
       minWidth: 120
     },
     {
       prop: 'orderItemId',
-      label: '鍗曟嵁鏄庣粏ID',
+      label: $t('pages.manager.locItem.table.orderItemId'),
       minWidth: 130
     },
     {
       prop: 'matnrId',
-      label: '鐗╂枡ID',
+      label: $t('pages.manager.locItem.table.matnrId'),
       minWidth: 110
     },
     {
       prop: 'matnrCode',
-      label: '鐗╂枡缂栫爜',
+      label: $t('pages.manager.locItem.table.matnrCode'),
       minWidth: 160,
       showOverflowTooltip: true
     },
     {
       prop: 'maktx',
-      label: '鐗╂枡鍚嶇О',
+      label: $t('pages.manager.locItem.table.maktx'),
       minWidth: 220,
       showOverflowTooltip: true
     },
     {
       prop: 'spec',
-      label: '瑙勬牸',
+      label: $t('pages.manager.locItem.table.spec'),
       minWidth: 140,
       showOverflowTooltip: true
     },
     {
       prop: 'model',
-      label: '鍨嬪彿',
+      label: $t('pages.manager.locItem.table.model'),
       minWidth: 140,
       showOverflowTooltip: true
     },
     {
       prop: 'splrBatch',
-      label: '渚涘簲鍟嗘壒娆�',
+      label: $t('table.supplierBatch'),
       minWidth: 140,
       showOverflowTooltip: true
     },
     {
       prop: 'batch',
-      label: '鎵规',
+      label: $t('pages.manager.locItem.table.batch'),
       minWidth: 140,
       showOverflowTooltip: true
     },
     {
       prop: 'trackCode',
-      label: '杩借釜鐮�',
+      label: $t('pages.manager.locItem.table.trackCode'),
       minWidth: 150,
       showOverflowTooltip: true
     },
     {
       prop: 'unit',
-      label: '鍗曚綅',
+      label: $t('table.unit'),
       width: 100
     },
     {
       prop: 'anfme',
-      label: '鍙敤鏁伴噺',
+      label: $t('pages.manager.locItem.table.anfme'),
       width: 110,
       align: 'right'
     },
     {
       prop: 'qty',
-      label: '搴撳瓨鏁伴噺',
+      label: $t('pages.manager.locItem.table.qty'),
       width: 110,
       align: 'right'
     },
     {
       prop: 'workQty',
-      label: '鎵ц涓暟閲�',
+      label: $t('pages.manager.locItem.table.workQty'),
       width: 120,
       align: 'right'
     },
@@ -120,18 +121,18 @@
     })),
     {
       prop: 'statusText',
-      label: '鐘舵��',
+      label: $t('table.status'),
       width: 90
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: $t('table.updateTime'),
       minWidth: 180,
       showOverflowTooltip: true
     },
     {
       prop: 'action',
-      label: '璇︽儏',
+      label: $t('common.actions.detail'),
       width: 96,
       fixed: 'right',
       align: 'center',
diff --git a/rsf-design/src/views/manager/loc-item/modules/loc-item-detail-drawer.vue b/rsf-design/src/views/manager/loc-item/modules/loc-item-detail-drawer.vue
index e8a75a7..1f646f1 100644
--- a/rsf-design/src/views/manager/loc-item/modules/loc-item-detail-drawer.vue
+++ b/rsf-design/src/views/manager/loc-item/modules/loc-item-detail-drawer.vue
@@ -1,35 +1,35 @@
 <template>
   <ElDrawer
     :model-value="visible"
-    title="搴撳瓨鏄庣粏璇︽儏"
+    :title="t('pages.manager.locItem.detail.title')"
     size="72%"
     @update:model-value="handleVisibleChange"
   >
     <div class="flex h-full flex-col gap-4">
       <ElDescriptions :column="3" border>
-        <ElDescriptionsItem label="搴撲綅ID">{{ detail.locId || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="搴撲綅缂栫爜">{{ detail.locCode || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="搴撳尯">{{ detail.wareArea || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="涓氬姟绫诲瀷">{{ detail.typeText || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="宸ヤ綅绫诲瀷">{{ detail.wkTypeText || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鍗曟嵁ID">{{ detail.orderId || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鐗╂枡缂栫爜">{{ detail.matnrCode || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鐗╂枡鍚嶇О">{{ detail.maktx || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="杩借釜鐮�">{{ detail.trackCode || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鎵规">{{ detail.batch || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="渚涘簲鍟嗘壒娆�">{{ detail.splrBatch || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鍗曚綅">{{ detail.unit || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鍙敤鏁伴噺">{{ detail.anfme ?? '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="搴撳瓨鏁伴噺">{{ detail.qty ?? '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鎵ц涓暟閲�">{{ detail.workQty ?? '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鐘舵��">{{ detail.statusText || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.manager.locItem.table.locId')">{{ detail.locId || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.manager.locItem.table.locCode')">{{ detail.locCode || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.manager.locItem.table.wareArea')">{{ detail.wareArea || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.manager.locItem.table.type')">{{ detail.typeText || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.manager.locItem.table.wkType')">{{ detail.wkTypeText || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.manager.locItem.table.orderId')">{{ detail.orderId || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.manager.locItem.table.matnrCode')">{{ detail.matnrCode || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.manager.locItem.table.maktx')">{{ detail.maktx || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.manager.locItem.table.trackCode')">{{ detail.trackCode || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.manager.locItem.table.batch')">{{ detail.batch || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('table.supplierBatch')">{{ detail.splrBatch || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('table.unit')">{{ detail.unit || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.manager.locItem.table.anfme')">{{ detail.anfme ?? '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.manager.locItem.table.qty')">{{ detail.qty ?? '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.manager.locItem.table.workQty')">{{ detail.workQty ?? '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('table.status')">{{ detail.statusText || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('table.createTime')">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('table.updateTime')">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
       </ElDescriptions>
 
       <ElCard shadow="never">
         <template #header>
-          <div class="text-sm font-medium">鎵╁睍瀛楁</div>
+          <div class="text-sm font-medium">{{ t('pages.manager.locItem.detail.extendFields') }}</div>
         </template>
         <div v-if="dynamicFields.length" class="grid grid-cols-1 gap-3 md:grid-cols-2 xl:grid-cols-3">
           <div
@@ -41,7 +41,7 @@
             <div class="mt-1 text-sm text-[var(--art-text-gray-900)]">{{ field.value || '--' }}</div>
           </div>
         </div>
-        <ElEmpty v-else description="鏆傛棤鎵╁睍瀛楁" :image-size="84" />
+        <ElEmpty v-else :description="t('pages.manager.locItem.detail.emptyExtendFields')" :image-size="84" />
       </ElCard>
     </div>
   </ElDrawer>
@@ -49,6 +49,9 @@
 
 <script setup>
   import { computed } from 'vue'
+  import { useI18n } from 'vue-i18n'
+
+  const { t } = useI18n()
 
   const props = defineProps({
     visible: { type: Boolean, default: false },
diff --git a/rsf-design/src/views/manager/loc-preview/index.vue b/rsf-design/src/views/manager/loc-preview/index.vue
index c3a0bf6..fa48a2c 100644
--- a/rsf-design/src/views/manager/loc-preview/index.vue
+++ b/rsf-design/src/views/manager/loc-preview/index.vue
@@ -41,6 +41,7 @@
 
 <script setup>
   import { computed, onMounted, reactive, ref } from 'vue'
+  import { useI18n } from 'vue-i18n'
   import { useTableColumns } from '@/hooks/core/useTableColumns'
   import { guardRequestWithMessage } from '@/utils/sys/requestGuard'
   import {
@@ -62,6 +63,7 @@
   } from './locPreviewPage.helpers'
 
   defineOptions({ name: 'LocPreview' })
+  const { t } = useI18n()
 
   const loading = ref(false)
   const detailLoading = ref(false)
@@ -87,30 +89,30 @@
 
   const searchItems = computed(() => [
     {
-      label: '鍏抽敭瀛�',
+      label: t('pages.manager.locPreview.search.condition'),
       key: 'condition',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ュ簱浣嶇紪鐮�/鏉$爜'
+        placeholder: t('pages.manager.locPreview.search.conditionPlaceholder')
       }
     },
     {
-      label: '搴撲綅缂栫爜',
+      label: t('pages.manager.locPreview.search.code'),
       key: 'code',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ュ簱浣嶇紪鐮�'
+        placeholder: t('pages.manager.locPreview.search.codePlaceholder')
       }
     },
     {
-      label: '鏉$爜',
+      label: t('pages.manager.locPreview.search.barcode'),
       key: 'barcode',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ユ潯鐮�'
+        placeholder: t('pages.manager.locPreview.search.barcodePlaceholder')
       }
     }
   ])
@@ -119,64 +121,64 @@
     return [
       {
         prop: 'locCode',
-        label: '搴撲綅缂栫爜',
+        label: t('pages.manager.locPreview.table.locCode'),
         minWidth: 140,
         showOverflowTooltip: true
       },
       {
         prop: 'wareArea',
-        label: '搴撳尯',
+        label: t('pages.manager.locPreview.table.areaLabel'),
         minWidth: 140,
         showOverflowTooltip: true
       },
       {
         prop: 'orderCode',
-        label: '鍗曟嵁缂栧彿',
+        label: t('pages.orders.common.orderCode'),
         minWidth: 180,
         showOverflowTooltip: true
       },
       {
         prop: 'matnrCode',
-        label: '鐗╂枡缂栫爜',
+        label: t('table.materialCode'),
         minWidth: 160,
         showOverflowTooltip: true
       },
       {
         prop: 'maktx',
-        label: '鐗╂枡鍚嶇О',
+        label: t('table.materialName'),
         minWidth: 220,
         showOverflowTooltip: true
       },
       {
         prop: 'batch',
-        label: '鎵规',
+        label: t('table.batch'),
         minWidth: 140,
         showOverflowTooltip: true
       },
       {
         prop: 'trackCode',
-        label: '杩借釜鐮�',
+        label: t('pages.orders.common.trackCode'),
         minWidth: 150,
         showOverflowTooltip: true
       },
       {
         prop: 'unit',
-        label: '鍗曚綅',
+        label: t('table.unit'),
         width: 100
       },
       {
         prop: 'anfme',
-        label: '鍙敤鏁伴噺',
+        label: t('pages.manager.freeze.table.anfme'),
         width: 120
       },
       {
         prop: 'qty',
-        label: '搴撳瓨鏁伴噺',
+        label: t('pages.manager.freeze.table.qty'),
         width: 120
       },
       {
         prop: 'workQty',
-        label: '鎵ц涓暟閲�',
+        label: t('pages.manager.freeze.table.workQty'),
         width: 120
       },
       ...enabledFields.value.map((field) => ({
@@ -188,7 +190,7 @@
       })),
       {
         prop: 'createTimeText',
-        label: '鍒涘缓鏃堕棿',
+        label: t('table.createTime'),
         minWidth: 180,
         showOverflowTooltip: true
       }
@@ -211,7 +213,7 @@
 
   async function loadEnabledFieldDefinitions() {
     const fields = await guardRequestWithMessage(fetchEnabledFields(), [], {
-      timeoutMessage: '鎵╁睍瀛楁鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+      timeoutMessage: t('pages.manager.locPreview.messages.fieldsTimeout')
     })
     enabledFields.value = normalizeLocPreviewEnabledFields(fields)
   }
@@ -233,7 +235,7 @@
           current: pagination.current,
           size: pagination.size
         },
-        { timeoutMessage: '搴撲綅鏄庣粏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟' }
+        { timeoutMessage: t('pages.manager.locPreview.messages.pageTimeout') }
       )
       tableData.value = Array.isArray(response?.records)
         ? response.records.map((record) => normalizeLocPreviewRow(record))
@@ -253,7 +255,7 @@
     try {
       const [detailResponse, itemResponse] = await Promise.all([
         guardRequestWithMessage(fetchLocPreviewDetail(activeLocRow.value.id), {}, {
-          timeoutMessage: '搴撲綅璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+          timeoutMessage: t('pages.manager.locPreview.messages.detailTimeout')
         }),
         guardRequestWithMessage(
           fetchLocPreviewItemsPage({
@@ -267,7 +269,7 @@
             current: detailPagination.current,
             size: detailPagination.size
           },
-          { timeoutMessage: '搴撲綅搴撳瓨鏄庣粏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟' }
+          { timeoutMessage: t('pages.manager.locPreview.messages.itemPageTimeout') }
         )
       ])
 
diff --git a/rsf-design/src/views/manager/loc-preview/locPreviewPage.helpers.js b/rsf-design/src/views/manager/loc-preview/locPreviewPage.helpers.js
index 43e6b35..3ac283b 100644
--- a/rsf-design/src/views/manager/loc-preview/locPreviewPage.helpers.js
+++ b/rsf-design/src/views/manager/loc-preview/locPreviewPage.helpers.js
@@ -1,3 +1,5 @@
+import { $t } from '@/locales'
+
 export const LOC_PREVIEW_DYNAMIC_FIELD_PREFIX = 'extendField__'
 
 function normalizeText(value) {
@@ -86,7 +88,7 @@
     col: normalizeNumber(record.col),
     lev: normalizeNumber(record.lev),
     channel: normalizeNumber(record.channel),
-    statusLabel: record.statusBool ? '鍚敤' : '鍋滅敤',
+    statusLabel: record.statusBool ? $t('common.status.enabled') : $t('common.status.disabled'),
     updateTimeText: record['updateTime$'] || record.updateTime || '-',
     createTimeText: record['createTime$'] || record.createTime || '-'
   }
diff --git a/rsf-design/src/views/manager/loc-preview/locPreviewTable.columns.js b/rsf-design/src/views/manager/loc-preview/locPreviewTable.columns.js
index 7957a17..c2dfc96 100644
--- a/rsf-design/src/views/manager/loc-preview/locPreviewTable.columns.js
+++ b/rsf-design/src/views/manager/loc-preview/locPreviewTable.columns.js
@@ -1,71 +1,72 @@
 import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
+import { $t } from '@/locales'
 
 export function createLocPreviewTableColumns({ handleViewDetail }) {
   return [
     {
       prop: 'locCode',
-      label: '搴撲綅缂栫爜',
+      label: $t('pages.manager.locPreview.table.locCode'),
       minWidth: 150,
       showOverflowTooltip: true
     },
     {
       prop: 'warehouseLabel',
-      label: '浠撳簱',
+      label: $t('pages.manager.locPreview.table.warehouseLabel'),
       minWidth: 150,
       showOverflowTooltip: true
     },
     {
       prop: 'areaLabel',
-      label: '搴撳尯',
+      label: $t('pages.manager.locPreview.table.areaLabel'),
       minWidth: 150,
       showOverflowTooltip: true
     },
     {
       prop: 'typeLabel',
-      label: '搴撲綅绫诲瀷',
+      label: $t('pages.manager.locPreview.table.typeLabel'),
       minWidth: 160,
       showOverflowTooltip: true
     },
     {
       prop: 'barcode',
-      label: '鏉$爜',
+      label: $t('pages.manager.locPreview.table.barcode'),
       minWidth: 160,
       showOverflowTooltip: true
     },
     {
       prop: 'useStatusLabel',
-      label: '浣跨敤鐘舵��',
+      label: $t('pages.manager.locPreview.table.useStatusLabel'),
       width: 120
     },
     {
       prop: 'row',
-      label: '鎺�',
+      label: $t('pages.manager.locPreview.table.row'),
       width: 80
     },
     {
       prop: 'col',
-      label: '鍒�',
+      label: $t('pages.manager.locPreview.table.col'),
       width: 80
     },
     {
       prop: 'lev',
-      label: '灞�',
+      label: $t('pages.manager.locPreview.table.lev'),
       width: 80
     },
     {
       prop: 'channel',
-      label: '宸烽亾',
+      label: $t('pages.manager.locPreview.table.channel'),
       width: 90
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: $t('table.updateTime'),
       minWidth: 180,
       showOverflowTooltip: true
     },
     {
       prop: 'action',
-      label: '璇︽儏',
+      label: $t('common.actions.detail'),
       width: 100,
       fixed: 'right',
       useSlot: true,
diff --git a/rsf-design/src/views/manager/loc-preview/modules/loc-preview-detail-drawer.vue b/rsf-design/src/views/manager/loc-preview/modules/loc-preview-detail-drawer.vue
index b53a816..e2c74ba 100644
--- a/rsf-design/src/views/manager/loc-preview/modules/loc-preview-detail-drawer.vue
+++ b/rsf-design/src/views/manager/loc-preview/modules/loc-preview-detail-drawer.vue
@@ -1,27 +1,27 @@
 <template>
   <ElDrawer
     :model-value="visible"
-    title="搴撲綅璇︽儏"
+    :title="t('pages.manager.locPreview.detail.title')"
     size="85%"
     @update:model-value="handleVisibleChange"
   >
     <div class="flex h-full flex-col gap-4">
       <ElDescriptions :column="4" border>
-        <ElDescriptionsItem label="搴撲綅缂栫爜">{{ detail.locCode || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="浠撳簱">{{ detail.warehouseLabel || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="搴撳尯">{{ detail.areaLabel || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="浣跨敤鐘舵��">{{
+        <ElDescriptionsItem :label="t('pages.manager.locPreview.table.locCode')">{{ detail.locCode || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.manager.locPreview.table.warehouseLabel')">{{ detail.warehouseLabel || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.manager.locPreview.table.areaLabel')">{{ detail.areaLabel || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.manager.locPreview.table.useStatusLabel')">{{
           detail.useStatusLabel || '--'
         }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="搴撲綅绫诲瀷">{{ detail.typeLabel || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鏉$爜">{{ detail.barcode || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鎺�">{{ detail.row ?? '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鍒�">{{ detail.col ?? '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.manager.locPreview.table.typeLabel')">{{ detail.typeLabel || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.manager.locPreview.table.barcode')">{{ detail.barcode || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.manager.locPreview.table.row')">{{ detail.row ?? '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.manager.locPreview.table.col')">{{ detail.col ?? '--' }}</ElDescriptionsItem>
       </ElDescriptions>
 
       <div class="flex items-center justify-between">
-        <div class="text-sm text-[var(--art-gray-600)]">搴撳瓨鏄庣粏</div>
-        <ElButton :loading="loading" @click="$emit('refresh')">鍒锋柊</ElButton>
+        <div class="text-sm text-[var(--art-gray-600)]">{{ t('pages.manager.locPreview.detail.stockItems') }}</div>
+        <ElButton :loading="loading" @click="$emit('refresh')">{{ t('common.actions.refresh') }}</ElButton>
       </div>
 
       <ArtTable
@@ -37,6 +37,10 @@
 </template>
 
 <script setup>
+  import { useI18n } from 'vue-i18n'
+
+  const { t } = useI18n()
+
   defineProps({
     visible: { type: Boolean, default: false },
     loading: { type: Boolean, default: false },
diff --git a/rsf-design/src/views/manager/menu-pda/index.vue b/rsf-design/src/views/manager/menu-pda/index.vue
index d40a08f..88e1d33 100644
--- a/rsf-design/src/views/manager/menu-pda/index.vue
+++ b/rsf-design/src/views/manager/menu-pda/index.vue
@@ -16,9 +16,9 @@
         @refresh="handleRefresh"
       >
         <template #left>
-          <ElButton v-auth="'add'" @click="handleAddMenu" v-ripple>娣诲姞PDA鑿滃崟</ElButton>
+          <ElButton v-auth="'add'" @click="handleAddMenu" v-ripple>{{ t('pages.manager.menuPda.actions.add') }}</ElButton>
           <ElButton @click="toggleExpand" v-ripple>
-            {{ isExpanded ? '鏀惰捣' : '灞曞紑' }}
+            {{ isExpanded ? t('common.actions.collapse') : t('common.actions.expand') }}
           </ElButton>
         </template>
       </ArtTableHeader>
@@ -46,6 +46,7 @@
 </template>
 
 <script setup>
+  import { useI18n } from 'vue-i18n'
   import { guardRequestWithMessage } from '@/utils/sys/requestGuard'
   import { useTableColumns } from '@/hooks/core/useTableColumns'
   import {
@@ -66,6 +67,7 @@
   } from './menuPdaPage.helpers'
 
   defineOptions({ name: 'MenuPda' })
+  const { t } = useI18n()
 
   const loading = ref(false)
   const isExpanded = ref(false)
@@ -82,16 +84,16 @@
 
   const formItems = computed(() => [
     {
-      label: '鑿滃崟鍚嶇О',
+      label: t('pages.manager.menuPda.search.name'),
       key: 'name',
       type: 'input',
-      props: { clearable: true }
+      props: { clearable: true, placeholder: t('pages.manager.menuPda.search.namePlaceholder') }
     },
     {
-      label: '璺敱鍦板潃',
+      label: t('pages.manager.menuPda.search.route'),
       key: 'route',
       type: 'input',
-      props: { clearable: true }
+      props: { clearable: true, placeholder: t('pages.manager.menuPda.search.routePlaceholder') }
     }
   ])
 
@@ -99,7 +101,7 @@
     loading.value = true
     try {
       const list = await guardRequestWithMessage(fetchGetMenuPdaTree({ condition: appliedFilters.name || '' }), null, {
-        timeoutMessage: 'PDA鑿滃崟鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+        timeoutMessage: t('pages.manager.menuPda.messages.listTimeout')
       })
       if (list === null) {
         tableData.value = []
@@ -109,7 +111,7 @@
       tableData.value = Array.isArray(list) ? list : []
       menuTreeOptions.value = buildMenuPdaTreeOptions(tableData.value)
     } catch (error) {
-      ElMessage.error(error?.message || '鑾峰彇PDA鑿滃崟澶辫触')
+      ElMessage.error(error?.message || t('pages.manager.menuPda.messages.loadFailed'))
     } finally {
       loading.value = false
     }
@@ -148,42 +150,42 @@
   async function handleSubmit(formData) {
     const payload = buildMenuPdaSubmitPayload(formData)
     if (payload.id && payload.id === payload.parentId) {
-      ElMessage.error('涓婄骇鑿滃崟涓嶈兘閫夋嫨褰撳墠鑿滃崟')
+      ElMessage.error(t('pages.manager.menuPda.messages.parentSelf'))
       return
     }
 
     try {
       if (payload.id) {
         await fetchUpdateMenuPda(payload)
-        ElMessage.success('淇敼鎴愬姛')
+        ElMessage.success(t('crud.messages.updateSuccess'))
       } else {
         await fetchSaveMenuPda(payload)
-        ElMessage.success('鏂板鎴愬姛')
+        ElMessage.success(t('crud.messages.createSuccess'))
       }
       closeDialog()
       await loadMenuPdaResources()
     } catch (error) {
-      ElMessage.error(error?.message || '鎻愪氦澶辫触')
+      ElMessage.error(error?.message || t('crud.messages.submitFailed'))
     }
   }
 
   async function handleDeleteMenu(row) {
     try {
       await ElMessageBox.confirm(
-        `纭畾瑕佸垹闄DA鑿滃崟銆�${getMenuPdaDisplayTitle(row)}銆嶅悧锛熷垹闄ゅ悗鏃犳硶鎭㈠`,
-        '鍒犻櫎纭',
+        t('pages.manager.menuPda.messages.deleteConfirm', { title: getMenuPdaDisplayTitle(row) }),
+        t('crud.confirm.deleteTitle'),
         {
-          confirmButtonText: '纭畾',
-          cancelButtonText: '鍙栨秷',
+          confirmButtonText: t('common.confirm'),
+          cancelButtonText: t('common.cancel'),
           type: 'warning'
         }
       )
       await fetchDeleteMenuPda(row.id)
-      ElMessage.success('鍒犻櫎鎴愬姛')
+      ElMessage.success(t('crud.messages.deleteSuccess'))
       await loadMenuPdaResources()
     } catch (error) {
       if (error !== 'cancel') {
-        ElMessage.error(error?.message || '鍒犻櫎澶辫触')
+        ElMessage.error(error?.message || t('crud.messages.deleteFailed'))
       }
     }
   }
diff --git a/rsf-design/src/views/manager/menu-pda/menuPdaPage.helpers.js b/rsf-design/src/views/manager/menu-pda/menuPdaPage.helpers.js
index cc7786c..a0da2b3 100644
--- a/rsf-design/src/views/manager/menu-pda/menuPdaPage.helpers.js
+++ b/rsf-design/src/views/manager/menu-pda/menuPdaPage.helpers.js
@@ -1,3 +1,5 @@
+import { $t } from '@/locales'
+
 export function createMenuPdaSearchState() {
   return {
     name: '',
@@ -32,15 +34,15 @@
 }
 
 export function getMenuPdaTypeText(row = {}) {
-  if (Number(row.type) === 1) return '鎸夐挳'
-  if (hasNestedMenuPda(row)) return '鐩綍'
-  return '鑿滃崟'
+  if (Number(row.type) === 1) return $t('pages.manager.menuPda.type.button')
+  if (hasNestedMenuPda(row)) return $t('pages.manager.menuPda.type.directory')
+  return $t('pages.manager.menuPda.type.menu')
 }
 
 export function getMenuPdaStatusMeta(status) {
   return normalizeMenuPdaNumber(status, 1) === 1
-    ? { text: '鍚敤', type: 'success' }
-    : { text: '绂佺敤', type: 'danger' }
+    ? { text: $t('common.status.enabled'), type: 'success' }
+    : { text: $t('common.status.disabled'), type: 'danger' }
 }
 
 export function normalizeMenuPdaTreeOptions(nodes = []) {
@@ -58,7 +60,7 @@
 export function buildMenuPdaTreeOptions(tree = []) {
   return [
     {
-      label: '椤剁骇鑿滃崟',
+      label: $t('pages.manager.menuPda.tree.topLevel'),
       value: 0,
       children: normalizeMenuPdaTreeOptions(tree)
     }
diff --git a/rsf-design/src/views/manager/menu-pda/menuPdaTable.columns.js b/rsf-design/src/views/manager/menu-pda/menuPdaTable.columns.js
index 3f53904..3f386b3 100644
--- a/rsf-design/src/views/manager/menu-pda/menuPdaTable.columns.js
+++ b/rsf-design/src/views/manager/menu-pda/menuPdaTable.columns.js
@@ -1,4 +1,5 @@
 import { h } from 'vue'
+import { $t } from '@/locales'
 import { ElTag } from 'element-plus'
 import ArtSvgIcon from '@/components/core/base/art-svg-icon/index.vue'
 import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
@@ -14,13 +15,13 @@
   return [
     {
       prop: 'name',
-      label: '鑿滃崟鍚嶇О',
+      label: $t('pages.manager.menuPda.table.name'),
       minWidth: 180,
       formatter: (row) => getMenuPdaDisplayTitle(row)
     },
     {
       prop: 'icon',
-      label: '鍥炬爣棰勮',
+      label: $t('pages.manager.menuPda.table.iconPreview'),
       width: 96,
       align: 'center',
       formatter: (row) => {
@@ -38,31 +39,31 @@
     },
     {
       prop: 'type',
-      label: '鑿滃崟绫诲瀷',
+      label: $t('pages.manager.menuPda.table.menuType'),
       width: 110,
       formatter: (row) =>
         h(ElTag, { type: getMenuPdaTypeTag(row), effect: 'light' }, () => getMenuPdaTypeText(row))
     },
     {
       prop: 'route',
-      label: '璺敱',
+      label: $t('table.route'),
       minWidth: 180,
       formatter: (row) => row.route || ''
     },
     {
       prop: 'authority',
-      label: '鏉冮檺鏍囪瘑',
+      label: $t('table.authority'),
       minWidth: 180,
       formatter: (row) => row.authority || '-'
     },
     {
       prop: 'sort',
-      label: '鎺掑簭',
+      label: $t('table.sort'),
       width: 90
     },
     {
       prop: 'status',
-      label: '鐘舵��',
+      label: $t('table.status'),
       width: 100,
       formatter: (row) => {
         const statusMeta = getMenuPdaStatusMeta(row.status)
@@ -71,14 +72,14 @@
     },
     {
       prop: 'memo',
-      label: '澶囨敞',
+      label: $t('table.memo'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.memo || '-'
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: $t('table.operation'),
       width: 120,
       align: 'right',
       formatter: (row) =>
diff --git a/rsf-design/src/views/manager/menu-pda/modules/menu-pda-dialog.vue b/rsf-design/src/views/manager/menu-pda/modules/menu-pda-dialog.vue
index 05186b8..b4f7515 100644
--- a/rsf-design/src/views/manager/menu-pda/modules/menu-pda-dialog.vue
+++ b/rsf-design/src/views/manager/menu-pda/modules/menu-pda-dialog.vue
@@ -21,16 +21,16 @@
     >
       <template #menuType>
         <ElRadioGroup v-model="form.menuType" :disabled="disableMenuType">
-          <ElRadioButton value="menu">鑿滃崟</ElRadioButton>
-          <ElRadioButton value="button">鎸夐挳</ElRadioButton>
+          <ElRadioButton value="menu">{{ t('pages.manager.menuPda.type.menu') }}</ElRadioButton>
+          <ElRadioButton value="button">{{ t('pages.manager.menuPda.type.button') }}</ElRadioButton>
         </ElRadioGroup>
       </template>
     </ArtForm>
 
     <template #footer>
       <span class="dialog-footer">
-        <ElButton @click="handleCancel">鍙栨秷</ElButton>
-        <ElButton type="primary" @click="handleSubmit">纭畾</ElButton>
+        <ElButton @click="handleCancel">{{ t('common.cancel') }}</ElButton>
+        <ElButton type="primary" @click="handleSubmit">{{ t('common.confirm') }}</ElButton>
       </span>
     </template>
   </ElDialog>
@@ -38,6 +38,9 @@
 
 <script setup>
   import ArtForm from '@/components/core/forms/art-form/index.vue'
+  import { useI18n } from 'vue-i18n'
+
+  const { t } = useI18n()
 
   const createMenuPdaFormState = () => ({
     menuType: 'menu',
@@ -65,23 +68,43 @@
   const form = reactive(createMenuPdaFormState())
 
   const isEdit = computed(() => Boolean(form.id))
-  const dialogTitle = computed(() => `${isEdit.value ? '缂栬緫' : '鏂板缓'}${form.menuType === 'button' ? '鎸夐挳' : '鑿滃崟'}`)
+  const dialogTitle = computed(() =>
+    isEdit.value
+      ? form.menuType === 'button'
+        ? t('pages.manager.menuPda.dialog.titleEditButton')
+        : t('pages.manager.menuPda.dialog.titleEditMenu')
+      : form.menuType === 'button'
+        ? t('pages.manager.menuPda.dialog.titleAddButton')
+        : t('pages.manager.menuPda.dialog.titleAddMenu')
+  )
   const disableMenuType = computed(() => props.lockType || isEdit.value)
 
   const rules = computed(() => ({
-    name: [{ required: true, message: form.menuType === 'button' ? '璇疯緭鍏ユ潈闄愬悕绉�' : '璇疯緭鍏ヨ彍鍗曞悕绉�', trigger: 'blur' }],
-    route: form.menuType === 'menu' ? [{ required: true, message: '璇疯緭鍏ヨ矾鐢卞湴鍧�', trigger: 'blur' }] : [],
+    name: [
+      {
+        required: true,
+        message:
+          form.menuType === 'button'
+            ? t('pages.manager.menuPda.dialog.validation.permissionName')
+            : t('pages.manager.menuPda.dialog.validation.menuName'),
+        trigger: 'blur'
+      }
+    ],
+    route:
+      form.menuType === 'menu'
+        ? [{ required: true, message: t('pages.manager.menuPda.dialog.validation.route'), trigger: 'blur' }]
+        : [],
     authority:
       form.menuType === 'button'
-        ? [{ required: true, message: '璇疯緭鍏ユ潈闄愭爣璇�', trigger: 'blur' }]
+        ? [{ required: true, message: t('pages.manager.menuPda.dialog.validation.authority'), trigger: 'blur' }]
         : []
   }))
 
   const formItems = computed(() => {
     const items = [
-      { label: '鑿滃崟绫诲瀷', key: 'menuType', span: 24 },
+      { label: t('pages.manager.menuPda.dialog.menuType'), key: 'menuType', span: 24 },
       {
-        label: '涓婄骇鑿滃崟',
+        label: t('pages.manager.menuPda.dialog.parentMenu'),
         key: 'parentId',
         type: 'treeselect',
         span: 24,
@@ -92,19 +115,25 @@
             value: 'value',
             children: 'children'
           },
-          placeholder: '璇烽�夋嫨涓婄骇鑿滃崟',
+          placeholder: t('pages.manager.menuPda.dialog.placeholder.parentMenu'),
           checkStrictly: true,
           clearable: false,
           defaultExpandAll: true
         }
       },
       {
-        label: form.menuType === 'button' ? '鏉冮檺鍚嶇О' : '鑿滃崟鍚嶇О',
+        label:
+          form.menuType === 'button'
+            ? t('pages.manager.menuPda.dialog.permissionName')
+            : t('pages.manager.menuPda.dialog.menuName'),
         key: 'name',
         type: 'input',
         span: 24,
         props: {
-          placeholder: form.menuType === 'button' ? '璇疯緭鍏ユ潈闄愬悕绉�' : '璇疯緭鍏ヨ彍鍗曞悕绉�',
+          placeholder:
+            form.menuType === 'button'
+              ? t('pages.manager.menuPda.dialog.placeholder.permissionName')
+              : t('pages.manager.menuPda.dialog.placeholder.menuName'),
           clearable: true
         }
       }
@@ -113,22 +142,22 @@
     if (form.menuType === 'menu') {
       items.push(
         {
-          label: '璺敱鍦板潃',
+          label: t('pages.manager.menuPda.dialog.route'),
           key: 'route',
           type: 'input',
           span: 24,
           props: {
-            placeholder: '璇疯緭鍏ヨ矾鐢卞湴鍧�',
+            placeholder: t('pages.manager.menuPda.dialog.placeholder.route'),
             clearable: true
           }
         },
         {
-          label: '缁勪欢鏍囪瘑',
+          label: t('pages.manager.menuPda.dialog.component'),
           key: 'component',
           type: 'input',
           span: 24,
           props: {
-            placeholder: '璇疯緭鍏ョ粍浠舵爣璇�',
+            placeholder: t('pages.manager.menuPda.dialog.placeholder.component'),
             clearable: true
           }
         }
@@ -137,27 +166,27 @@
 
     items.push(
       {
-        label: '鏉冮檺鏍囪瘑',
+        label: t('pages.manager.menuPda.dialog.authority'),
         key: 'authority',
         type: 'input',
         span: 24,
         props: {
-          placeholder: '璇疯緭鍏ユ潈闄愭爣璇�',
+          placeholder: t('pages.manager.menuPda.dialog.placeholder.authority'),
           clearable: true
         }
       },
       {
-        label: '鍥炬爣',
+        label: t('pages.manager.menuPda.dialog.icon'),
         key: 'icon',
         type: 'input',
         span: 24,
         props: {
-          placeholder: '璇疯緭鍏ュ浘鏍囧悕绉�',
+          placeholder: t('pages.manager.menuPda.dialog.placeholder.icon'),
           clearable: true
         }
       },
       {
-        label: '鎺掑簭',
+        label: t('pages.manager.menuPda.dialog.sort'),
         key: 'sort',
         type: 'number',
         span: 24,
@@ -168,27 +197,27 @@
         }
       },
       {
-        label: '鐘舵��',
+        label: t('pages.manager.menuPda.dialog.status'),
         key: 'status',
         type: 'select',
         span: 24,
         props: {
-          placeholder: '璇烽�夋嫨鐘舵��',
+          placeholder: t('pages.manager.menuPda.dialog.placeholder.status'),
           options: [
-            { label: '鍚敤', value: 1 },
-            { label: '绂佺敤', value: 0 }
+            { label: t('common.status.enabled'), value: 1 },
+            { label: t('common.status.disabled'), value: 0 }
           ]
         }
       },
       {
-        label: '澶囨敞',
+        label: t('table.memo'),
         key: 'memo',
         type: 'input',
         span: 24,
         props: {
           type: 'textarea',
           rows: 3,
-          placeholder: '璇疯緭鍏ュ娉�',
+          placeholder: t('pages.manager.menuPda.dialog.placeholder.memo'),
           clearable: true
         }
       }
diff --git a/rsf-design/src/views/manager/task-log/index.vue b/rsf-design/src/views/manager/task-log/index.vue
index eb0a2b2..6ccb90b 100644
--- a/rsf-design/src/views/manager/task-log/index.vue
+++ b/rsf-design/src/views/manager/task-log/index.vue
@@ -46,6 +46,7 @@
 
 <script setup>
   import { computed, ref } from 'vue'
+  import { useI18n } from 'vue-i18n'
   import { useUserStore } from '@/store/modules/user'
   import { useTable } from '@/hooks/core/useTable'
   import { usePrintExportPage } from '@/views/system/common/usePrintExportPage'
@@ -73,6 +74,7 @@
   defineOptions({ name: 'TaskLog' })
 
   const userStore = useUserStore()
+  const { t } = useI18n()
   const searchForm = ref(createTaskLogSearchState())
   const detailDrawerVisible = ref(false)
   const detailData = ref({})
@@ -83,61 +85,61 @@
 
   const searchItems = computed(() => [
     {
-      label: '鍏抽敭瀛�',
+      label: t('table.keyword'),
       key: 'condition',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ヤ换鍔″彿/鎵樼洏鐮�/鏈哄櫒浜虹紪鐮�'
+        placeholder: t('pages.manager.taskLog.search.conditionPlaceholder')
       }
     },
     {
-      label: '浠诲姟鍙�',
+      label: t('pages.manager.taskLog.table.taskCode'),
       key: 'taskCode',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ヤ换鍔″彿'
+        placeholder: t('pages.manager.taskLog.search.taskCodePlaceholder')
       }
     },
     {
-      label: '婧愬簱浣�',
+      label: t('pages.manager.taskLog.table.orgLoc'),
       key: 'orgLoc',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ユ簮搴撲綅'
+        placeholder: t('pages.manager.taskLog.search.orgLocPlaceholder')
       }
     },
     {
-      label: '鐩爣搴撲綅',
+      label: t('pages.manager.taskLog.table.targLoc'),
       key: 'targLoc',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ョ洰鏍囧簱浣�'
+        placeholder: t('pages.manager.taskLog.search.targLocPlaceholder')
       }
     },
     {
-      label: '鎵樼洏鐮�',
+      label: t('pages.manager.taskLog.table.barcode'),
       key: 'barcode',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ユ墭鐩樼爜'
+        placeholder: t('pages.manager.taskLog.search.barcodePlaceholder')
       }
     },
     {
-      label: '鏈哄櫒浜虹紪鐮�',
+      label: t('pages.manager.taskLog.table.robotCode'),
       key: 'robotCode',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ユ満鍣ㄤ汉缂栫爜'
+        placeholder: t('pages.manager.taskLog.search.robotCodePlaceholder')
       }
     },
     {
-      label: '寮�濮嬫棩鏈�',
+      label: t('pages.manager.taskLog.search.timeStart'),
       key: 'timeStart',
       type: 'date',
       props: {
@@ -147,7 +149,7 @@
       }
     },
     {
-      label: '缁撴潫鏃ユ湡',
+      label: t('pages.manager.taskLog.search.timeEnd'),
       key: 'timeEnd',
       type: 'date',
       props: {
diff --git a/rsf-design/src/views/manager/task-log/modules/task-log-detail-drawer.vue b/rsf-design/src/views/manager/task-log/modules/task-log-detail-drawer.vue
index b2a5166..d92c299 100644
--- a/rsf-design/src/views/manager/task-log/modules/task-log-detail-drawer.vue
+++ b/rsf-design/src/views/manager/task-log/modules/task-log-detail-drawer.vue
@@ -1,37 +1,37 @@
 <template>
   <ElDrawer
     :model-value="visible"
-    title="浠诲姟鍘嗗彶妗h鎯�"
+    :title="t('pages.manager.taskLog.detail.title')"
     size="72%"
     @update:model-value="handleVisibleChange"
   >
     <ElScrollbar class="h-[calc(100vh-120px)]">
       <div class="flex min-h-full flex-col gap-4 pr-2">
         <ElDescriptions :column="4" border>
-          <ElDescriptionsItem label="浠诲姟ID">{{ detail.taskId ?? '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="浠诲姟鍙�">{{ detail.taskCode || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="浠诲姟鐘舵��">{{ detail.taskStatusText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="浠诲姟绫诲瀷">{{ detail.taskTypeText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="婧愬簱浣�">{{ detail.orgLoc || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="婧愮珯鐐�">{{ detail.orgSite || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鐩爣搴撲綅">{{ detail.targLoc || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鐩爣绔欑偣">{{ detail.targSite || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鎵樼洏鐮�">{{ detail.barcode || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鏈哄櫒浜虹紪鐮�">{{ detail.robotCode || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鎵ц鐘舵��">{{ detail.exceStatusText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="浼樺厛绾�">{{ detail.sort ?? '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="寮傚父鎻忚堪">{{ detail.expDesc || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="寮傚父缂栫爜">{{ detail.expCode || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="寮�濮嬫椂闂�">{{ detail.startTimeText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="缁撴潫鏃堕棿">{{ detail.endTimeText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鍒涘缓浜�">{{ detail.createByText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鏇存柊浜�">{{ detail.updateByText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鐘舵��">
+          <ElDescriptionsItem :label="t('pages.manager.taskLog.detail.taskId')">{{ detail.taskId ?? '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.manager.taskLog.table.taskCode')">{{ detail.taskCode || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.manager.taskLog.table.taskStatus')">{{ detail.taskStatusText || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.manager.taskLog.table.taskType')">{{ detail.taskTypeText || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.manager.taskLog.table.orgLoc')">{{ detail.orgLoc || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.manager.taskLog.table.orgSite')">{{ detail.orgSite || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.manager.taskLog.table.targLoc')">{{ detail.targLoc || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.manager.taskLog.table.targSite')">{{ detail.targSite || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.manager.taskLog.table.barcode')">{{ detail.barcode || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.manager.taskLog.table.robotCode')">{{ detail.robotCode || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.manager.taskLog.detail.exceStatus')">{{ detail.exceStatusText || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.manager.taskLog.detail.sort')">{{ detail.sort ?? '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.manager.taskLog.detail.expDesc')">{{ detail.expDesc || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.manager.taskLog.detail.expCode')">{{ detail.expCode || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.manager.taskLog.table.startTime')">{{ detail.startTimeText || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.manager.taskLog.table.endTime')">{{ detail.endTimeText || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.createBy')">{{ detail.createByText || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.createTime')">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.updateBy')">{{ detail.updateByText || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.updateTime')">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.status')">
             <ElTag :type="detail.statusType || 'info'" effect="light">{{ detail.statusText || '--' }}</ElTag>
           </ElDescriptionsItem>
-          <ElDescriptionsItem label="澶囨敞" :span="3">{{ detail.memo || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.memo')" :span="3">{{ detail.memo || '--' }}</ElDescriptionsItem>
         </ElDescriptions>
       </div>
     </ElScrollbar>
@@ -39,6 +39,7 @@
 </template>
 
 <script setup>
+  import { useI18n } from 'vue-i18n'
   defineOptions({ name: 'TaskLogDetailDrawer' })
 
   defineProps({
@@ -47,6 +48,7 @@
   })
 
   const emit = defineEmits(['update:visible'])
+  const { t } = useI18n()
 
   function handleVisibleChange(visible) {
     emit('update:visible', visible)
diff --git a/rsf-design/src/views/manager/task-log/taskLogPage.helpers.js b/rsf-design/src/views/manager/task-log/taskLogPage.helpers.js
index 41c7013..de00109 100644
--- a/rsf-design/src/views/manager/task-log/taskLogPage.helpers.js
+++ b/rsf-design/src/views/manager/task-log/taskLogPage.helpers.js
@@ -1,9 +1,11 @@
+import { $t } from '@/locales'
+
 const STATUS_META = {
-  1: { text: '姝e父', type: 'success' },
-  0: { text: '鍐荤粨', type: 'info' }
+  1: { text: $t('common.status.enabled'), type: 'success' },
+  0: { text: $t('common.status.disabled'), type: 'info' }
 }
 
-export const TASK_LOG_REPORT_TITLE = '浠诲姟鍘嗗彶妗f姤琛�'
+export const TASK_LOG_REPORT_TITLE = $t('pages.manager.taskLog.reportTitle')
 
 function normalizeText(value) {
   return String(value ?? '').trim()
@@ -132,15 +134,15 @@
 
 export function getTaskLogReportColumns() {
   return [
-    { prop: 'taskCode', label: '浠诲姟鍙�' },
-    { prop: 'taskStatusText', label: '浠诲姟鐘舵��' },
-    { prop: 'taskTypeText', label: '浠诲姟绫诲瀷' },
-    { prop: 'orgLoc', label: '婧愬簱浣�' },
-    { prop: 'targLoc', label: '鐩爣搴撲綅' },
-    { prop: 'barcode', label: '鎵樼洏鐮�' },
-    { prop: 'robotCode', label: '鏈哄櫒浜虹紪鐮�' },
-    { prop: 'startTimeText', label: '寮�濮嬫椂闂�' },
-    { prop: 'endTimeText', label: '缁撴潫鏃堕棿' }
+    { prop: 'taskCode', label: $t('pages.manager.taskLog.table.taskCode') },
+    { prop: 'taskStatusText', label: $t('pages.manager.taskLog.table.taskStatus') },
+    { prop: 'taskTypeText', label: $t('pages.manager.taskLog.table.taskType') },
+    { prop: 'orgLoc', label: $t('pages.manager.taskLog.table.orgLoc') },
+    { prop: 'targLoc', label: $t('pages.manager.taskLog.table.targLoc') },
+    { prop: 'barcode', label: $t('pages.manager.taskLog.table.barcode') },
+    { prop: 'robotCode', label: $t('pages.manager.taskLog.table.robotCode') },
+    { prop: 'startTimeText', label: $t('pages.manager.taskLog.table.startTime') },
+    { prop: 'endTimeText', label: $t('pages.manager.taskLog.table.endTime') }
   ]
 }
 
diff --git a/rsf-design/src/views/manager/task-log/taskLogTable.columns.js b/rsf-design/src/views/manager/task-log/taskLogTable.columns.js
index 2ece020..cb54e81 100644
--- a/rsf-design/src/views/manager/task-log/taskLogTable.columns.js
+++ b/rsf-design/src/views/manager/task-log/taskLogTable.columns.js
@@ -1,80 +1,81 @@
 import { h } from 'vue'
 import { ElTag } from 'element-plus'
+import { $t } from '@/locales'
 import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
 
 export function createTaskLogTableColumns({ handleView } = {}) {
   return [
     { type: 'selection', width: 48, align: 'center' },
-    { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+    { type: 'globalIndex', label: $t('table.index'), width: 72, align: 'center' },
     {
       prop: 'taskCode',
-      label: '浠诲姟鍙�',
+      label: $t('pages.manager.taskLog.table.taskCode'),
       minWidth: 170,
       showOverflowTooltip: true
     },
     {
       prop: 'taskStatusText',
-      label: '浠诲姟鐘舵��',
+      label: $t('pages.manager.taskLog.table.taskStatus'),
       minWidth: 120,
       showOverflowTooltip: true
     },
     {
       prop: 'taskTypeText',
-      label: '浠诲姟绫诲瀷',
+      label: $t('pages.manager.taskLog.table.taskType'),
       minWidth: 120,
       showOverflowTooltip: true
     },
     {
       prop: 'orgLoc',
-      label: '婧愬簱浣�',
+      label: $t('pages.manager.taskLog.table.orgLoc'),
       minWidth: 130,
       showOverflowTooltip: true
     },
     {
       prop: 'orgSite',
-      label: '婧愮珯鐐�',
+      label: $t('pages.manager.taskLog.table.orgSite'),
       minWidth: 130,
       showOverflowTooltip: true
     },
     {
       prop: 'targLoc',
-      label: '鐩爣搴撲綅',
+      label: $t('pages.manager.taskLog.table.targLoc'),
       minWidth: 130,
       showOverflowTooltip: true
     },
     {
       prop: 'targSite',
-      label: '鐩爣绔欑偣',
+      label: $t('pages.manager.taskLog.table.targSite'),
       minWidth: 130,
       showOverflowTooltip: true
     },
     {
       prop: 'barcode',
-      label: '鎵樼洏鐮�',
+      label: $t('pages.manager.taskLog.table.barcode'),
       minWidth: 150,
       showOverflowTooltip: true
     },
     {
       prop: 'robotCode',
-      label: '鏈哄櫒浜虹紪鐮�',
+      label: $t('pages.manager.taskLog.table.robotCode'),
       minWidth: 140,
       showOverflowTooltip: true
     },
     {
       prop: 'startTimeText',
-      label: '寮�濮嬫椂闂�',
+      label: $t('pages.manager.taskLog.table.startTime'),
       minWidth: 170,
       showOverflowTooltip: true
     },
     {
       prop: 'endTimeText',
-      label: '缁撴潫鏃堕棿',
+      label: $t('pages.manager.taskLog.table.endTime'),
       minWidth: 170,
       showOverflowTooltip: true
     },
     {
       prop: 'status',
-      label: '鐘舵��',
+      label: $t('table.status'),
       width: 100,
       align: 'center',
       formatter: (row) =>
@@ -89,13 +90,13 @@
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: $t('table.updateTime'),
       minWidth: 170,
       showOverflowTooltip: true
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: $t('table.operation'),
       width: 92,
       align: 'center',
       fixed: 'right',
diff --git a/rsf-design/src/views/manager/wave-rule/index.vue b/rsf-design/src/views/manager/wave-rule/index.vue
index 41970b2..d40733f 100644
--- a/rsf-design/src/views/manager/wave-rule/index.vue
+++ b/rsf-design/src/views/manager/wave-rule/index.vue
@@ -12,7 +12,7 @@
       <ArtTableHeader v-model:columns="columnChecks" :loading="loading" @refresh="refreshData">
         <template #left>
           <ElSpace wrap>
-            <ElButton v-auth="'add'" @click="showDialog('add')" v-ripple>鏂板娉㈡绛栫暐</ElButton>
+            <ElButton v-auth="'add'" @click="showDialog('add')" v-ripple>{{ t('pages.manager.waveRule.actions.add') }}</ElButton>
             <ElButton
               v-auth="'delete'"
               type="danger"
@@ -20,7 +20,7 @@
               @click="handleBatchDelete"
               v-ripple
             >
-              鎵归噺鍒犻櫎
+              {{ t('common.actions.batchDelete') }}
             </ElButton>
           </ElSpace>
         </template>
@@ -54,6 +54,7 @@
 
 <script setup>
   import { ElMessage } from 'element-plus'
+  import { useI18n } from 'vue-i18n'
   import { guardRequestWithMessage } from '@/utils/sys/requestGuard'
   import { useAuth } from '@/hooks/core/useAuth'
   import { useTable } from '@/hooks/core/useTable'
@@ -82,6 +83,7 @@
   } from './waveRulePage.helpers'
 
   defineOptions({ name: 'WaveRule' })
+  const { t } = useI18n()
 
   const { hasAuth } = useAuth()
   const searchForm = ref(createWaveRuleSearchState())
@@ -93,25 +95,25 @@
 
   const searchItems = computed(() => [
     {
-      label: '鍏抽敭瀛�',
+      label: t('table.keyword'),
       key: 'condition',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ョ紪鍙锋垨鍚嶇О'
+        placeholder: t('pages.manager.waveRule.search.conditionPlaceholder')
       }
     },
     {
-      label: '缂栧彿',
+      label: t('table.code'),
       key: 'code',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ョ紪鍙�'
+        placeholder: t('pages.manager.waveRule.search.codePlaceholder')
       }
     },
     {
-      label: '绫诲瀷',
+      label: t('pages.manager.waveRule.table.type'),
       key: 'type',
       type: 'select',
       props: {
@@ -120,12 +122,12 @@
       }
     },
     {
-      label: '鍚嶇О',
+      label: t('table.name'),
       key: 'name',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ョ瓥鐣ュ悕绉�'
+        placeholder: t('pages.manager.waveRule.search.namePlaceholder')
       }
     }
   ])
@@ -140,7 +142,7 @@
       }),
       [],
       {
-        timeoutMessage: '娉㈡绛栫暐绫诲瀷鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+        timeoutMessage: t('pages.manager.waveRule.messages.typeTimeout')
       }
     )
     typeOptions.value = buildWaveRuleTypeOptions(Array.isArray(records?.records) ? records.records : records?.list || records || [])
@@ -154,7 +156,7 @@
     } catch (error) {
       detailDrawerVisible.value = false
       detailData.value = {}
-      ElMessage.error(error?.message || '鑾峰彇娉㈡绛栫暐璇︽儏澶辫触')
+      ElMessage.error(error?.message || t('pages.manager.waveRule.messages.detailFailed'))
     } finally {
       detailLoading.value = false
     }
@@ -166,7 +168,7 @@
       dialogVisible.value = true
       dialogType.value = 'edit'
     } catch (error) {
-      ElMessage.error(error?.message || '鑾峰彇娉㈡绛栫暐璇︽儏澶辫触')
+      ElMessage.error(error?.message || t('pages.manager.waveRule.messages.detailFailed'))
     }
   }
 
@@ -224,7 +226,7 @@
     saveRequest: fetchSaveWaveRule,
     updateRequest: fetchUpdateWaveRule,
     deleteRequest: fetchDeleteWaveRule,
-    entityName: '娉㈡绛栫暐',
+    entityName: t('pages.manager.waveRule.entity'),
     resolveRecordLabel: (record) => record?.name || record?.code || record?.id,
     refreshCreate,
     refreshUpdate,
diff --git a/rsf-design/src/views/manager/wave-rule/modules/wave-rule-detail-drawer.vue b/rsf-design/src/views/manager/wave-rule/modules/wave-rule-detail-drawer.vue
index 1e4247e..df17ae1 100644
--- a/rsf-design/src/views/manager/wave-rule/modules/wave-rule-detail-drawer.vue
+++ b/rsf-design/src/views/manager/wave-rule/modules/wave-rule-detail-drawer.vue
@@ -1,29 +1,30 @@
 <template>
   <ElDrawer
     :model-value="visible"
-    title="娉㈡绛栫暐璇︽儏"
+    :title="t('pages.manager.waveRule.detail.title')"
     size="560px"
     @update:model-value="handleVisibleChange"
   >
     <ElSkeleton :loading="loading" animated :rows="10">
       <ElDescriptions :column="1" border>
-        <ElDescriptionsItem label="缂栧彿">{{ displayData.code || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="绫诲瀷">{{ displayData.typeText || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鍚嶇О">{{ displayData.name || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鐘舵��">
+        <ElDescriptionsItem :label="t('table.code')">{{ displayData.code || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.manager.waveRule.table.type')">{{ displayData.typeText || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('table.name')">{{ displayData.name || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('table.status')">
           <ElTag :type="displayData.statusType" effect="light">{{ displayData.statusText || '--' }}</ElTag>
         </ElDescriptionsItem>
-        <ElDescriptionsItem label="鏇存柊浜�">{{ displayData.updateByLabel || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ displayData.updateTimeText || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鍒涘缓浜�">{{ displayData.createByLabel || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ displayData.createTimeText || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="澶囨敞">{{ displayData.memo || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('table.updateBy')">{{ displayData.updateByLabel || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('table.updateTime')">{{ displayData.updateTimeText || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('table.createBy')">{{ displayData.createByLabel || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('table.createTime')">{{ displayData.createTimeText || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('table.memo')">{{ displayData.memo || '--' }}</ElDescriptionsItem>
       </ElDescriptions>
     </ElSkeleton>
   </ElDrawer>
 </template>
 
 <script setup>
+  import { useI18n } from 'vue-i18n'
   import { normalizeWaveRuleListRow } from '../waveRulePage.helpers'
 
   const props = defineProps({
@@ -34,6 +35,7 @@
 
   const emit = defineEmits(['update:visible'])
   const displayData = computed(() => normalizeWaveRuleListRow(props.detailData))
+  const { t } = useI18n()
 
   function handleVisibleChange(visible) {
     emit('update:visible', visible)
diff --git a/rsf-design/src/views/manager/wave-rule/modules/wave-rule-dialog.vue b/rsf-design/src/views/manager/wave-rule/modules/wave-rule-dialog.vue
index 5de7261..2afd6bb 100644
--- a/rsf-design/src/views/manager/wave-rule/modules/wave-rule-dialog.vue
+++ b/rsf-design/src/views/manager/wave-rule/modules/wave-rule-dialog.vue
@@ -21,14 +21,15 @@
 
     <template #footer>
       <span class="dialog-footer">
-        <ElButton @click="handleCancel">鍙栨秷</ElButton>
-        <ElButton type="primary" @click="handleSubmit">纭畾</ElButton>
+        <ElButton @click="handleCancel">{{ t('common.cancel') }}</ElButton>
+        <ElButton type="primary" @click="handleSubmit">{{ t('common.confirm') }}</ElButton>
       </span>
     </template>
   </ElDialog>
 </template>
 
 <script setup>
+  import { useI18n } from 'vue-i18n'
   import ArtForm from '@/components/core/forms/art-form/index.vue'
   import { buildWaveRuleDialogModel, createWaveRuleFormState } from '../waveRulePage.helpers'
 
@@ -41,64 +42,67 @@
   const emit = defineEmits(['update:visible', 'submit'])
   const formRef = ref()
   const form = reactive(createWaveRuleFormState())
+  const { t } = useI18n()
 
   const isEdit = computed(() => Boolean(form.id))
-  const dialogTitle = computed(() => (isEdit.value ? '缂栬緫娉㈡绛栫暐' : '鏂板娉㈡绛栫暐'))
+  const dialogTitle = computed(() =>
+    isEdit.value ? t('pages.manager.waveRule.dialog.titleEdit') : t('pages.manager.waveRule.dialog.titleCreate')
+  )
 
   const rules = computed(() => ({
-    type: [{ required: true, message: '璇烽�夋嫨绛栫暐绫诲瀷', trigger: 'change' }],
-    name: [{ required: true, message: '璇疯緭鍏ョ瓥鐣ュ悕绉�', trigger: 'blur' }]
+    type: [{ required: true, message: t('pages.manager.waveRule.dialog.validation.type'), trigger: 'change' }],
+    name: [{ required: true, message: t('pages.manager.waveRule.dialog.validation.name'), trigger: 'blur' }]
   }))
 
   const formItems = computed(() => [
     {
-      label: '缂栧彿',
+      label: t('table.code'),
       key: 'code',
       type: 'input',
       props: {
         disabled: true,
-        placeholder: '鏂板鍚庤嚜鍔ㄧ敓鎴�'
+        placeholder: t('pages.manager.waveRule.dialog.placeholder.code')
       }
     },
     {
-      label: '绫诲瀷',
+      label: t('pages.manager.waveRule.table.type'),
       key: 'type',
       type: 'select',
       props: {
         options: props.typeOptions,
-        placeholder: '璇烽�夋嫨绛栫暐绫诲瀷'
+        placeholder: t('pages.manager.waveRule.dialog.placeholder.type')
       }
     },
     {
-      label: '鍚嶇О',
+      label: t('table.name'),
       key: 'name',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ョ瓥鐣ュ悕绉�'
+        placeholder: t('pages.manager.waveRule.dialog.placeholder.name')
       }
     },
     {
-      label: '鐘舵��',
+      label: t('table.status'),
       key: 'status',
       type: 'select',
       props: {
         options: [
-          { label: '姝e父', value: 1 },
-          { label: '鍐荤粨', value: 0 }
+          { label: t('common.status.enabled'), value: 1 },
+          { label: t('common.status.disabled'), value: 0 }
         ],
-        placeholder: '璇烽�夋嫨鐘舵��'
+        placeholder: t('pages.manager.waveRule.dialog.placeholder.status')
       }
     },
     {
-      label: '澶囨敞',
+      label: t('table.memo'),
       key: 'memo',
       type: 'input',
       span: 24,
       props: {
         type: 'textarea',
         rows: 3,
-        placeholder: '璇疯緭鍏ュ娉�'
+        placeholder: t('pages.manager.waveRule.dialog.placeholder.memo')
       }
     }
   ])
diff --git a/rsf-design/src/views/manager/wave-rule/waveRulePage.helpers.js b/rsf-design/src/views/manager/wave-rule/waveRulePage.helpers.js
index d96c6ac..cb20f59 100644
--- a/rsf-design/src/views/manager/wave-rule/waveRulePage.helpers.js
+++ b/rsf-design/src/views/manager/wave-rule/waveRulePage.helpers.js
@@ -1,3 +1,5 @@
+import { $t } from '@/locales'
+
 const WAVE_RULE_DICT_TYPE_CODE = 'sys_wave_rule_code'
 
 export function getWaveRuleDictTypeCode() {
@@ -34,8 +36,8 @@
 
 export function getWaveRuleStatusMeta(status) {
   return Number(status) === 1
-    ? { text: '姝e父', type: 'success', bool: true }
-    : { text: '鍐荤粨', type: 'danger', bool: false }
+    ? { text: $t('common.status.enabled'), type: 'success', bool: true }
+    : { text: $t('common.status.disabled'), type: 'danger', bool: false }
 }
 
 export function buildWaveRuleSearchParams(params = {}) {
diff --git a/rsf-design/src/views/manager/wave-rule/waveRuleTable.columns.js b/rsf-design/src/views/manager/wave-rule/waveRuleTable.columns.js
index f2bf1fd..c37be6a 100644
--- a/rsf-design/src/views/manager/wave-rule/waveRuleTable.columns.js
+++ b/rsf-design/src/views/manager/wave-rule/waveRuleTable.columns.js
@@ -1,48 +1,49 @@
 import { h } from 'vue'
 import { ElTag } from 'element-plus'
+import { $t } from '@/locales'
 import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
 
 export function createWaveRuleTableColumns({ handleView, handleEdit, handleDelete }) {
   return [
     {
       prop: 'code',
-      label: '缂栧彿',
+      label: $t('table.code'),
       minWidth: 180,
       showOverflowTooltip: true
     },
     {
       prop: 'typeText',
-      label: '绫诲瀷',
+      label: $t('pages.manager.waveRule.table.type'),
       minWidth: 140,
       formatter: (row) => row.typeText || '-'
     },
     {
       prop: 'name',
-      label: '鍚嶇О',
+      label: $t('table.name'),
       minWidth: 180,
       showOverflowTooltip: true
     },
     {
       prop: 'status',
-      label: '鐘舵��',
+      label: $t('table.status'),
       width: 100,
       formatter: (row) => h(ElTag, { type: row.statusType, effect: 'light' }, () => row.statusText || '-')
     },
     {
       prop: 'updateByLabel',
-      label: '鏇存柊浜�',
+      label: $t('table.updateBy'),
       width: 120,
       formatter: (row) => row.updateByLabel || '-'
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: $t('table.updateTime'),
       minWidth: 180,
       formatter: (row) => row.updateTimeText || '-'
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: $t('table.operation'),
       width: handleDelete ? 160 : 120,
       align: 'right',
       formatter: (row) => {
diff --git a/rsf-design/src/views/orders/asn-order-item-log/asnOrderItemLogPage.helpers.js b/rsf-design/src/views/orders/asn-order-item-log/asnOrderItemLogPage.helpers.js
index 01469b7..22fe601 100644
--- a/rsf-design/src/views/orders/asn-order-item-log/asnOrderItemLogPage.helpers.js
+++ b/rsf-design/src/views/orders/asn-order-item-log/asnOrderItemLogPage.helpers.js
@@ -1,6 +1,7 @@
 import { normalizeAsnOrderItemLogRow } from '../asn-order-log/asnOrderLogPage.helpers.js'
+import { $t } from '@/locales'
 
-export const ASN_ORDER_ITEM_LOG_REPORT_TITLE = '鏀惰揣鍘嗗彶鏄庣粏鎶ヨ〃'
+export const ASN_ORDER_ITEM_LOG_REPORT_TITLE = $t('pages.orders.asnOrderItemLog.reportTitle')
 export const ASN_ORDER_ITEM_LOG_REPORT_STYLE = {
   titleAlign: 'center',
   titleLevel: 'strong',
@@ -116,30 +117,30 @@
 
 export function getAsnOrderItemLogReportColumns() {
   return [
-    { key: 'asnCode', label: 'ASN鍗曞彿' },
-    { key: 'platItemId', label: '骞冲彴琛屽彿' },
-    { key: 'poDetlId', label: 'PO鍗曟槑缁咺D' },
-    { key: 'poCode', label: 'PO鍗曞彿' },
-    { key: 'fieldsIndex', label: '鍔ㄦ�佸瓧娈电储寮�' },
-    { key: 'matnrCode', label: '鐗╂枡缂栫爜' },
-    { key: 'maktx', label: '鐗╂枡鍚嶇О' },
-    { key: 'anfme', label: '閫佽揣鏁伴噺' },
-    { key: 'stockUnit', label: '搴撳瓨鍗曚綅' },
-    { key: 'purQty', label: '閲囪喘鏁伴噺' },
-    { key: 'purUnit', label: '閲囪喘鍗曚綅' },
-    { key: 'qty', label: '宸叉敹鏁伴噺' },
-    { key: 'splrCode', label: '渚涘簲鍟嗙紪鐮�' },
-    { key: 'splrBatch', label: '渚涘簲鍟嗘壒娆�' },
-    { key: 'splrName', label: '渚涘簲鍟嗗悕绉�' },
-    { key: 'qrcode', label: '浜岀淮鐮�' },
-    { key: 'trackCode', label: '璺熻釜鐮�' },
-    { key: 'barcode', label: '鏉″舰鐮�' },
-    { key: 'packName', label: '鍖呰鍚嶇О' },
-    { key: 'ntyStatusText', label: '涓婃姤鐘舵��' },
-    { key: 'statusText', label: '鐘舵��' },
-    { key: 'updateByText', label: '鏇存柊浜�' },
-    { key: 'updateTimeText', label: '鏇存柊鏃堕棿' },
-    { key: 'memo', label: '澶囨敞' }
+    { key: 'asnCode', label: $t('pages.orders.asnOrderItemLog.table.asnCode') },
+    { key: 'platItemId', label: $t('pages.orders.asnOrderItemLog.table.platItemId') },
+    { key: 'poDetlId', label: $t('pages.orders.asnOrderItemLog.table.poDetlId') },
+    { key: 'poCode', label: $t('pages.orders.asnOrderItemLog.table.poCode') },
+    { key: 'fieldsIndex', label: $t('pages.orders.asnOrderItemLog.table.fieldsIndex') },
+    { key: 'matnrCode', label: $t('pages.orders.asnOrderItemLog.table.matnrCode') },
+    { key: 'maktx', label: $t('pages.orders.asnOrderItemLog.table.maktx') },
+    { key: 'anfme', label: $t('pages.orders.asnOrderItemLog.table.anfme') },
+    { key: 'stockUnit', label: $t('pages.orders.asnOrderItemLog.table.stockUnit') },
+    { key: 'purQty', label: $t('pages.orders.asnOrderItemLog.table.purQty') },
+    { key: 'purUnit', label: $t('pages.orders.asnOrderItemLog.table.purUnit') },
+    { key: 'qty', label: $t('pages.orders.asnOrderItemLog.table.qty') },
+    { key: 'splrCode', label: $t('pages.orders.asnOrderItemLog.table.splrCode') },
+    { key: 'splrBatch', label: $t('pages.orders.asnOrderItemLog.table.splrBatch') },
+    { key: 'splrName', label: $t('pages.orders.asnOrderItemLog.table.splrName') },
+    { key: 'qrcode', label: $t('pages.orders.asnOrderItemLog.table.qrcode') },
+    { key: 'trackCode', label: $t('pages.orders.asnOrderItemLog.table.trackCode') },
+    { key: 'barcode', label: $t('pages.orders.asnOrderItemLog.table.barcode') },
+    { key: 'packName', label: $t('pages.orders.asnOrderItemLog.table.packName') },
+    { key: 'ntyStatusText', label: $t('pages.orders.asnOrderItemLog.table.ntyStatus') },
+    { key: 'statusText', label: $t('table.status') },
+    { key: 'updateByText', label: $t('table.updateBy') },
+    { key: 'updateTimeText', label: $t('table.updateTime') },
+    { key: 'memo', label: $t('table.memo') }
   ]
 }
 
diff --git a/rsf-design/src/views/orders/asn-order-item-log/index.vue b/rsf-design/src/views/orders/asn-order-item-log/index.vue
index 68187eb..26a26a0 100644
--- a/rsf-design/src/views/orders/asn-order-item-log/index.vue
+++ b/rsf-design/src/views/orders/asn-order-item-log/index.vue
@@ -44,6 +44,7 @@
 <script setup>
   import { computed, ref } from 'vue'
   import { useRoute } from 'vue-router'
+  import { useI18n } from 'vue-i18n'
   import { useUserStore } from '@/store/modules/user'
   import { useTable } from '@/hooks/core/useTable'
   import { defaultResponseAdapter } from '@/utils/table/tableUtils'
@@ -69,6 +70,7 @@
   } from './asnOrderItemLogPage.helpers.js'
 
   defineOptions({ name: 'AsnOrderItemLog' })
+  const { t } = useI18n()
 
   const route = useRoute()
   const userStore = useUserStore()
@@ -85,79 +87,79 @@
 
   const searchItems = computed(() => [
     {
-      label: '鍏抽敭瀛�',
+      label: t('pages.orders.asnOrderItemLog.search.condition'),
       key: 'condition',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏SN鍗曞彿/PO鍗曞彿/鐗╂枡缂栫爜'
+        placeholder: t('pages.orders.asnOrderItemLog.search.conditionPlaceholder')
       }
     },
     {
-      label: '鏃ュ織ID',
+      label: t('pages.orders.asnOrderItemLog.search.logId'),
       key: 'logId',
       type: 'inputNumber',
       props: {
         clearable: true,
         controlsPosition: 'right',
-        placeholder: '璇疯緭鍏ユ棩蹇桰D'
+        placeholder: t('pages.orders.asnOrderItemLog.search.logIdPlaceholder')
       }
     },
     {
-      label: 'ASN鍗曞彿',
+      label: t('pages.orders.asnOrderItemLog.table.asnCode'),
       key: 'orderCode',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏SN鍗曞彿'
+        placeholder: t('pages.orders.asnOrderItemLog.search.asnCodePlaceholder')
       }
     },
     {
-      label: 'PO鍗曞彿',
+      label: t('pages.orders.asnOrderItemLog.table.poCode'),
       key: 'poCode',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏O鍗曞彿'
+        placeholder: t('pages.orders.asnOrderItemLog.search.poCodePlaceholder')
       }
     },
     {
-      label: '鐗╂枡缂栫爜',
+      label: t('pages.orders.asnOrderItemLog.table.matnrCode'),
       key: 'matnrCode',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ョ墿鏂欑紪鐮�'
+        placeholder: t('pages.orders.asnOrderItemLog.search.matnrCodePlaceholder')
       }
     },
     {
-      label: '鐗╂枡鍚嶇О',
+      label: t('pages.orders.asnOrderItemLog.table.maktx'),
       key: 'maktx',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ョ墿鏂欏悕绉�'
+        placeholder: t('pages.orders.asnOrderItemLog.search.maktxPlaceholder')
       }
     },
     {
-      label: '渚涘簲鍟嗘壒娆�',
+      label: t('pages.orders.asnOrderItemLog.table.splrBatch'),
       key: 'splrBatch',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ヤ緵搴斿晢鎵规'
+        placeholder: t('pages.orders.asnOrderItemLog.search.splrBatchPlaceholder')
       }
     },
     {
-      label: '涓婃姤鐘舵��',
+      label: t('pages.orders.asnOrderItemLog.table.ntyStatus'),
       key: 'ntyStatus',
       type: 'select',
       props: {
         clearable: true,
         options: [
-          { label: '鏈笂鎶�', value: 0 },
-          { label: '宸蹭笂鎶�', value: 1 },
-          { label: '閮ㄥ垎涓婃姤', value: 2 }
+          { label: t('pages.orders.asnOrderItemLog.status.notReported'), value: 0 },
+          { label: t('pages.orders.asnOrderItemLog.status.reported'), value: 1 },
+          { label: t('pages.orders.asnOrderItemLog.status.partialReported'), value: 2 }
         ]
       }
     }
@@ -235,8 +237,8 @@
     buildPreviewRows: (records) => buildAsnOrderItemLogPrintRows(records),
     buildPreviewMeta: (rows) => ({
       reportTitle,
-      reportDate: new Date().toLocaleDateString('zh-CN'),
-      printedAt: new Date().toLocaleString('zh-CN', { hour12: false }),
+      reportDate: new Date().toLocaleDateString(),
+      printedAt: new Date().toLocaleString([], { hour12: false }),
       operator: userStore.getUserInfo?.name || userStore.getUserInfo?.username || '',
       count: rows.length,
       reportStyle: {
diff --git a/rsf-design/src/views/orders/asn-order-item/asnOrderItemPage.helpers.js b/rsf-design/src/views/orders/asn-order-item/asnOrderItemPage.helpers.js
index dbf84a9..4491350 100644
--- a/rsf-design/src/views/orders/asn-order-item/asnOrderItemPage.helpers.js
+++ b/rsf-design/src/views/orders/asn-order-item/asnOrderItemPage.helpers.js
@@ -1,4 +1,9 @@
-export const ASN_ORDER_ITEM_REPORT_TITLE = '鏀惰揣鏄庣粏鎶ヨ〃'
+import { $t } from '@/locales'
+
+export function getAsnOrderItemReportTitle(t = $t) {
+  return t('pages.orders.asnOrderItem.reportTitle')
+}
+
 export const ASN_ORDER_ITEM_REPORT_STYLE = {
   titleAlign: 'center',
   titleLevel: 'strong',
@@ -7,17 +12,7 @@
   showSequence: true
 }
 
-const STATUS_MAP = {
-  1: { label: '姝e父', tagType: 'success' },
-  0: { label: '鍐荤粨', tagType: 'info' }
-}
-
-const NTY_STATUS_MAP = {
-  0: { label: '鏈笂鎶�', tagType: 'info' },
-  1: { label: '宸蹭笂鎶�', tagType: 'success' }
-}
-
-function normalizeText(value, fallback = '-') {
+function normalizeText(value, fallback = $t('common.placeholder.empty')) {
   if (value === null || value === undefined || value === '') {
     return fallback
   }
@@ -59,20 +54,32 @@
   }
 }
 
-function getOrderTypeLabel(type) {
-  if (type === 'in') return '鍏ュ簱'
-  if (type === 'out') return '鍑哄簱'
-  return normalizeText(type, '-')
+function getOrderTypeLabel(type, t = $t) {
+  if (type === 'in') return t('pages.orders.asnOrderItem.orderType.in')
+  if (type === 'out') return t('pages.orders.asnOrderItem.orderType.out')
+  return normalizeText(type)
 }
 
-function getStatusConfig(status) {
+function getStatusConfig(status, t = $t) {
   const numericStatus = Number(status)
-  return STATUS_MAP[numericStatus] || { label: normalizeText(status, '-'), tagType: 'info' }
+  if (numericStatus === 1) {
+    return { label: t('common.status.normal'), tagType: 'success' }
+  }
+  if (numericStatus === 0) {
+    return { label: t('common.status.frozen'), tagType: 'info' }
+  }
+  return { label: normalizeText(status), tagType: 'info' }
 }
 
-function getNtyStatusConfig(status) {
+function getNtyStatusConfig(status, t = $t) {
   const numericStatus = Number(status)
-  return NTY_STATUS_MAP[numericStatus] || { label: normalizeText(status, '-'), tagType: 'info' }
+  if (numericStatus === 0) {
+    return { label: t('pages.orders.asnOrderItem.ntyStatus.notReported'), tagType: 'info' }
+  }
+  if (numericStatus === 1) {
+    return { label: t('pages.orders.asnOrderItem.ntyStatus.reported'), tagType: 'success' }
+  }
+  return { label: normalizeText(status), tagType: 'info' }
 }
 
 export function createAsnOrderItemSearchState() {
@@ -147,76 +154,76 @@
   }
 }
 
-export function normalizeAsnOrderItemRow(record = {}) {
+export function normalizeAsnOrderItemRow(record = {}, t = $t) {
   return {
     ...record,
     id: record.id ?? null,
-    poCode: normalizeText(record.poCode, '-'),
-    typeLabel: getOrderTypeLabel(record.type),
-    wkTypeLabel: normalizeText(record['wkType$'] || record.wkType, '-'),
-    purchaseOrgName: normalizeText(record.purchaseOrgName, '-'),
-    purchaseUserName: normalizeText(record.purchaseUserName, '-'),
-    supplierId: normalizeText(record.supplierId, '-'),
-    supplierName: normalizeText(record.supplierName, '-'),
-    platWorkCode: normalizeText(record.platWorkCode, '-'),
-    platItemId: normalizeText(record.platItemId, '-'),
-    matnrCode: normalizeText(record.matnrCode, '-'),
-    maktx: normalizeText(record.maktx, '-'),
-    batch: normalizeText(record.batch, '-'),
-    stockUnit: normalizeText(record.stockUnit, '-'),
+    poCode: normalizeText(record.poCode),
+    typeLabel: getOrderTypeLabel(record.type, t),
+    wkTypeLabel: normalizeText(record['wkType$'] || record.wkType),
+    purchaseOrgName: normalizeText(record.purchaseOrgName),
+    purchaseUserName: normalizeText(record.purchaseUserName),
+    supplierId: normalizeText(record.supplierId),
+    supplierName: normalizeText(record.supplierName),
+    platWorkCode: normalizeText(record.platWorkCode),
+    platItemId: normalizeText(record.platItemId),
+    matnrCode: normalizeText(record.matnrCode),
+    maktx: normalizeText(record.maktx),
+    batch: normalizeText(record.batch),
+    stockUnit: normalizeText(record.stockUnit),
     anfme: normalizeNumber(record.anfme),
     qty: normalizeNumber(record.qty),
-    targetWarehouseId: normalizeText(record.targetWarehouseId, '-'),
-    businessTimeText: normalizeText(record.businessTime, '-'),
-    updateTimeText: normalizeText(record.updateTime, '-'),
-    memo: normalizeText(record.memo, '-')
+    targetWarehouseId: normalizeText(record.targetWarehouseId),
+    businessTimeText: normalizeText(record.businessTime),
+    updateTimeText: normalizeText(record.updateTime),
+    memo: normalizeText(record.memo)
   }
 }
 
-export function normalizeAsnOrderItemDetail(record = {}) {
-  const statusConfig = getStatusConfig(record.status)
-  const ntyStatusConfig = getNtyStatusConfig(record.ntyStatus)
+export function normalizeAsnOrderItemDetail(record = {}, t = $t) {
+  const statusConfig = getStatusConfig(record.status, t)
+  const ntyStatusConfig = getNtyStatusConfig(record.ntyStatus, t)
 
   return {
     ...record,
     id: record.id ?? null,
-    orderCode: normalizeText(record.orderCode, '-'),
-    poCode: normalizeText(record.poCode, '-'),
-    typeLabel: getOrderTypeLabel(record.type),
-    poDetlId: record.poDetlId ?? '-',
-    platWorkCode: normalizeText(record.platWorkCode, '-'),
-    platItemId: normalizeText(record.platItemId, '-'),
-    projectCode: normalizeText(record.projectCode, '-'),
-    matnrCode: normalizeText(record.matnrCode, '-'),
-    maktx: normalizeText(record.maktx, '-'),
-    spec: normalizeText(record.spec, '-'),
-    model: normalizeText(record.model, '-'),
-    batch: normalizeText(record.batch, '-'),
-    stockUnit: normalizeText(record.stockUnit, '-'),
+    orderCode: normalizeText(record.orderCode),
+    poCode: normalizeText(record.poCode),
+    typeLabel: getOrderTypeLabel(record.type, t),
+    poDetlId: record.poDetlId ?? $t('common.placeholder.empty'),
+    platWorkCode: normalizeText(record.platWorkCode),
+    platItemId: normalizeText(record.platItemId),
+    projectCode: normalizeText(record.projectCode),
+    matnrCode: normalizeText(record.matnrCode),
+    maktx: normalizeText(record.maktx),
+    spec: normalizeText(record.spec),
+    model: normalizeText(record.model),
+    batch: normalizeText(record.batch),
+    stockUnit: normalizeText(record.stockUnit),
     purQty: normalizeNumber(record.purQty),
-    purUnit: normalizeText(record.purUnit, '-'),
+    purUnit: normalizeText(record.purUnit),
     anfme: normalizeNumber(record.anfme),
     qty: normalizeNumber(record.qty),
     workQty: normalizeNumber(record.workQty),
-    splrCode: normalizeText(record.splrCode, '-'),
-    splrName: normalizeText(record.splrName, '-'),
-    splrBatch: normalizeText(record.splrBatch, '-'),
-    qrcode: normalizeText(record.qrcode, '-'),
-    barcode: normalizeText(record.barcode, '-'),
-    packName: normalizeText(record.packName, '-'),
-    prodTimeText: normalizeText(record.prodTime, '-'),
-    targetWarehouseId: normalizeText(record.targetWarehouseId, '-'),
-    sourceWarehouseId: normalizeText(record.sourceWarehouseId, '-'),
+    splrCode: normalizeText(record.splrCode),
+    splrName: normalizeText(record.splrName),
+    splrBatch: normalizeText(record.splrBatch),
+    qrcode: normalizeText(record.qrcode),
+    barcode: normalizeText(record.barcode),
+    packName: normalizeText(record.packName),
+    prodTimeText: normalizeText(record.prodTime),
+    targetWarehouseId: normalizeText(record.targetWarehouseId),
+    sourceWarehouseId: normalizeText(record.sourceWarehouseId),
     ntyStatusText: ntyStatusConfig.label,
     ntyStatusTagType: ntyStatusConfig.tagType,
     statusText: statusConfig.label,
     statusTagType: statusConfig.tagType,
-    isptResultText: normalizeText(record['isptResult$'] || record.isptResult, '-'),
-    updateByText: normalizeText(record['updateBy$'] || record.updateBy, '-'),
-    updateTimeText: normalizeText(record['updateTime$'] || record.updateTime, '-'),
-    createByText: normalizeText(record['createBy$'] || record.createBy, '-'),
-    createTimeText: normalizeText(record['createTime$'] || record.createTime, '-'),
-    memo: normalizeText(record.memo, '-'),
+    isptResultText: normalizeText(record['isptResult$'] || record.isptResult),
+    updateByText: normalizeText(record['updateBy$'] || record.updateBy),
+    updateTimeText: normalizeText(record['updateTime$'] || record.updateTime),
+    createByText: normalizeText(record['createBy$'] || record.createBy),
+    createTimeText: normalizeText(record['createTime$'] || record.createTime),
+    memo: normalizeText(record.memo),
     extendFields: record.extendFields || {}
   }
 }
@@ -234,7 +241,7 @@
   orientation = ASN_ORDER_ITEM_REPORT_STYLE.orientation
 } = {}) {
   return {
-    reportTitle: ASN_ORDER_ITEM_REPORT_TITLE,
+    reportTitle: getAsnOrderItemReportTitle(),
     reportDate: previewMeta.reportDate,
     printedAt: previewMeta.printedAt,
     operator: previewMeta.operator,
diff --git a/rsf-design/src/views/orders/asn-order-item/asnOrderItemTable.columns.js b/rsf-design/src/views/orders/asn-order-item/asnOrderItemTable.columns.js
index 3306ced..8894168 100644
--- a/rsf-design/src/views/orders/asn-order-item/asnOrderItemTable.columns.js
+++ b/rsf-design/src/views/orders/asn-order-item/asnOrderItemTable.columns.js
@@ -1,5 +1,6 @@
 import { h } from 'vue'
 import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
+import { $t } from '@/locales'
 
 function createTextColumn(prop, label, minWidth, { align, formatter } = {}) {
   return {
@@ -8,52 +9,52 @@
     minWidth,
     align,
     showOverflowTooltip: true,
-    formatter: formatter || ((row) => row?.[prop] || '-')
+    formatter: formatter || ((row) => row?.[prop] || $t('common.placeholder.empty'))
   }
 }
 
-export function createAsnOrderItemTableColumns({ handleView } = {}) {
+export function createAsnOrderItemTableColumns({ handleView, t = $t } = {}) {
   return [
-    { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
-    createTextColumn('poCode', 'PO鍗曞彿', 160),
-    createTextColumn('wkTypeLabel', '涓氬姟绫诲瀷', 120),
-    createTextColumn('typeLabel', '鍗曟嵁绫诲瀷', 110),
-    createTextColumn('purchaseOrgName', '閲囪喘缁勭粐', 150),
-    createTextColumn('purchaseUserName', '閲囪喘鍛�', 120),
-    createTextColumn('supplierName', '渚涘簲鍟�', 160),
-    createTextColumn('platWorkCode', '璁″垝璺熻釜鍙�', 150),
-    createTextColumn('platItemId', '琛屽彿', 110),
-    createTextColumn('matnrCode', '鐗╂枡缂栫爜', 160),
-    createTextColumn('maktx', '鐗╂枡鍚嶇О', 220),
-    createTextColumn('batch', '渚涘簲鍟嗘壒娆�', 140),
-    createTextColumn('stockUnit', '搴撳瓨鍗曚綅', 110),
+    { type: 'globalIndex', label: t('table.index'), width: 72, align: 'center' },
+    createTextColumn('poCode', t('pages.orders.asnOrderItem.table.poCode'), 160),
+    createTextColumn('wkTypeLabel', t('pages.orders.asnOrderItem.table.wkType'), 120),
+    createTextColumn('typeLabel', t('pages.orders.asnOrderItem.table.type'), 110),
+    createTextColumn('purchaseOrgName', t('pages.orders.asnOrderItem.table.purchaseOrg'), 150),
+    createTextColumn('purchaseUserName', t('pages.orders.asnOrderItem.table.purchaseUser'), 120),
+    createTextColumn('supplierName', t('table.supplier'), 160),
+    createTextColumn('platWorkCode', t('pages.orders.asnOrderItem.table.platWorkCode'), 150),
+    createTextColumn('platItemId', t('pages.orders.asnOrderItem.table.platItemId'), 110),
+    createTextColumn('matnrCode', t('table.materialCode'), 160),
+    createTextColumn('maktx', t('table.materialName'), 220),
+    createTextColumn('batch', t('table.supplierBatch'), 140),
+    createTextColumn('stockUnit', t('pages.orders.asnOrderItem.table.stockUnit'), 110),
     {
       prop: 'anfme',
-      label: '閫佽揣鏁伴噺',
+      label: t('pages.orders.asnOrderItem.table.anfme'),
       width: 110,
       align: 'right',
       formatter: (row) => row.anfme ?? 0
     },
     {
       prop: 'qty',
-      label: '宸叉敹鏁伴噺',
+      label: t('pages.orders.asnOrderItem.table.qty'),
       width: 110,
       align: 'right',
       formatter: (row) => row.qty ?? 0
     },
-    createTextColumn('targetWarehouseId', '寤鸿鐩爣浠�', 140),
-    createTextColumn('businessTimeText', '涓氬姟鏃堕棿', 180),
-    createTextColumn('updateTimeText', '鏇存柊鏃堕棿', 180),
+    createTextColumn('targetWarehouseId', t('pages.orders.asnOrderItem.table.targetWarehouseId'), 140),
+    createTextColumn('businessTimeText', t('pages.orders.asnOrderItem.table.businessTime'), 180),
+    createTextColumn('updateTimeText', t('table.updateTime'), 180),
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: t('table.operation'),
       width: 110,
       fixed: 'right',
-      align: 'right',
+      align: 'center',
       formatter: (row) =>
         h(
           'div',
-          { class: 'flex justify-end' },
+          { class: 'flex justify-center' },
           [
             h(ArtButtonTable, {
               type: 'view',
diff --git a/rsf-design/src/views/orders/asn-order-item/index.vue b/rsf-design/src/views/orders/asn-order-item/index.vue
index a10b8b2..91fe80f 100644
--- a/rsf-design/src/views/orders/asn-order-item/index.vue
+++ b/rsf-design/src/views/orders/asn-order-item/index.vue
@@ -3,10 +3,10 @@
     <ElCard v-if="activeSourceSummary" class="mb-3">
       <div class="flex items-center justify-between gap-3">
         <div class="flex items-center gap-2 text-sm text-[var(--art-text-gray-600)]">
-          <span class="font-medium text-[var(--art-text-gray-900)]">褰撳墠鏉ユ簮</span>
-          <span>鍏ュ簱閫氱煡鍗旾D锛歿{ activeSourceSummary.orderId }}</span>
+          <span class="font-medium text-[var(--art-text-gray-900)]">{{ t('pages.orders.asnOrderItem.sourceTitle') }}</span>
+          <span>{{ t('pages.orders.asnOrderItem.sourceLabel', { id: activeSourceSummary.orderId }) }}</span>
         </div>
-        <ElButton link type="primary" @click="handleClearSourceFilter">鏌ョ湅鍏ㄩ儴</ElButton>
+        <ElButton link type="primary" @click="handleClearSourceFilter">{{ t('common.actions.viewAll') }}</ElButton>
       </div>
     </ElCard>
 
@@ -60,6 +60,7 @@
 
 <script setup>
   import { computed, onMounted, ref, watch } from 'vue'
+  import { useI18n } from 'vue-i18n'
   import { ElButton, ElMessage } from 'element-plus'
   import { useRoute, useRouter } from 'vue-router'
   import { useUserStore } from '@/store/modules/user'
@@ -77,12 +78,12 @@
   import { createAsnOrderItemTableColumns } from './asnOrderItemTable.columns'
   import {
     ASN_ORDER_ITEM_REPORT_STYLE,
-    ASN_ORDER_ITEM_REPORT_TITLE,
     buildAsnOrderItemPageQueryParams,
     buildAsnOrderItemPrintRows,
     buildAsnOrderItemReportMeta,
     buildAsnOrderItemSearchParams,
     createAsnOrderItemSearchState,
+    getAsnOrderItemReportTitle,
     normalizeAsnOrderItemDetail,
     normalizeAsnOrderItemRow
   } from './asnOrderItemPage.helpers'
@@ -91,10 +92,11 @@
 
   const DEFAULT_PAGE_SIZE = 20
 
+  const { t } = useI18n()
   const userStore = useUserStore()
   const route = useRoute()
   const router = useRouter()
-  const reportTitle = ASN_ORDER_ITEM_REPORT_TITLE
+  const reportTitle = computed(() => getAsnOrderItemReportTitle(t))
   const searchForm = ref(createAsnOrderItemSearchState())
   const selectedRows = ref([])
   const detailDrawerVisible = ref(false)
@@ -118,130 +120,130 @@
 
   const searchItems = computed(() => [
     {
-      label: '鍏抽敭瀛�',
+      label: t('table.keyword'),
       key: 'condition',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏� PO 鍗曞彿/鐗╂枡缂栫爜/鐗╂枡鍚嶇О/渚涘簲鍟�'
+        placeholder: t('pages.orders.asnOrderItem.search.conditionPlaceholder')
       }
     },
     {
-      label: 'PO鍗曞彿',
+      label: t('pages.orders.asnOrderItem.search.poCode'),
       key: 'poCode',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏� PO 鍗曞彿'
+        placeholder: t('pages.orders.asnOrderItem.search.poCodePlaceholder')
       }
     },
     {
-      label: 'ASN鍗曞彿',
+      label: t('pages.orders.asnOrderItem.search.orderCode'),
       key: 'orderCode',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏� ASN 鍗曞彿'
+        placeholder: t('pages.orders.asnOrderItem.search.orderCodePlaceholder')
       }
     },
     {
-      label: '璁″垝璺熻釜鍙�',
+      label: t('pages.orders.asnOrderItem.search.platWorkCode'),
       key: 'platWorkCode',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ヨ鍒掕窡韪彿'
+        placeholder: t('pages.orders.asnOrderItem.search.platWorkCodePlaceholder')
       }
     },
     {
-      label: '琛屽彿',
+      label: t('pages.orders.asnOrderItem.search.platItemId'),
       key: 'platItemId',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ヨ鍙�'
+        placeholder: t('pages.orders.asnOrderItem.search.platItemIdPlaceholder')
       }
     },
     {
-      label: '鐗╂枡缂栫爜',
+      label: t('table.materialCode'),
       key: 'matnrCode',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ョ墿鏂欑紪鐮�'
+        placeholder: t('pages.orders.asnOrderItem.search.matnrCodePlaceholder')
       }
     },
     {
-      label: '鐗╂枡鍚嶇О',
+      label: t('table.materialName'),
       key: 'maktx',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ョ墿鏂欏悕绉�'
+        placeholder: t('pages.orders.asnOrderItem.search.maktxPlaceholder')
       }
     },
     {
-      label: '渚涘簲鍟嗘壒娆�',
+      label: t('table.supplierBatch'),
       key: 'splrBatch',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ヤ緵搴斿晢鎵规'
+        placeholder: t('pages.orders.asnOrderItem.search.splrBatchPlaceholder')
       }
     },
     {
-      label: '搴撳瓨鍗曚綅',
+      label: t('pages.orders.asnOrderItem.search.stockUnit'),
       key: 'stockUnit',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ュ簱瀛樺崟浣�'
+        placeholder: t('pages.orders.asnOrderItem.search.stockUnitPlaceholder')
       }
     },
     {
-      label: '鐘舵��',
+      label: t('table.status'),
       key: 'status',
       type: 'select',
       props: {
         clearable: true,
         options: [
-          { label: '姝e父', value: 1 },
-          { label: '鍐荤粨', value: 0 }
+          { label: t('common.status.normal'), value: 1 },
+          { label: t('common.status.frozen'), value: 0 }
         ]
       }
     },
     {
-      label: '涓婃姤鐘舵��',
+      label: t('pages.orders.asnOrderItem.search.ntyStatus'),
       key: 'ntyStatus',
       type: 'select',
       props: {
         clearable: true,
         options: [
-          { label: '鏈笂鎶�', value: 0 },
-          { label: '宸蹭笂鎶�', value: 1 }
+          { label: t('pages.orders.asnOrderItem.ntyStatus.notReported'), value: 0 },
+          { label: t('pages.orders.asnOrderItem.ntyStatus.reported'), value: 1 }
         ]
       }
     },
     {
-      label: '鍒涘缓鏃堕棿',
+      label: t('pages.orders.asnOrderItem.search.createTimeRange'),
       key: 'createTimeRange',
       type: 'datetimerange',
       props: {
         clearable: true,
-        startPlaceholder: '寮�濮嬫椂闂�',
-        endPlaceholder: '缁撴潫鏃堕棿',
-        rangeSeparator: '鑷�'
+        startPlaceholder: t('pages.orders.asnOrderItem.search.startTime'),
+        endPlaceholder: t('pages.orders.asnOrderItem.search.endTime'),
+        rangeSeparator: t('pages.orders.asnOrderItem.search.rangeSeparator')
       }
     },
     {
-      label: '鏇存柊鏃堕棿',
+      label: t('pages.orders.asnOrderItem.search.updateTimeRange'),
       key: 'updateTimeRange',
       type: 'datetimerange',
       props: {
         clearable: true,
-        startPlaceholder: '寮�濮嬫椂闂�',
-        endPlaceholder: '缁撴潫鏃堕棿',
-        rangeSeparator: '鑷�'
+        startPlaceholder: t('pages.orders.asnOrderItem.search.startTime'),
+        endPlaceholder: t('pages.orders.asnOrderItem.search.endTime'),
+        rangeSeparator: t('pages.orders.asnOrderItem.search.rangeSeparator')
       }
     }
   ])
@@ -268,12 +270,13 @@
       }),
       columnsFactory: () =>
         createAsnOrderItemTableColumns({
-          handleView: openDetail
+          handleView: openDetail,
+          t
         })
     },
     transform: {
       dataTransformer: (records) =>
-        Array.isArray(records) ? records.map((item) => normalizeAsnOrderItemRow(item)) : []
+        Array.isArray(records) ? records.map((item) => normalizeAsnOrderItemRow(item, t)) : []
     }
   })
 
@@ -324,7 +327,7 @@
 
   async function openDetail(row) {
     activeItemId.value = row.id
-    detailData.value = normalizeAsnOrderItemDetail(row)
+    detailData.value = normalizeAsnOrderItemDetail(row, t)
     detailDrawerVisible.value = true
     await loadDetailResource()
   }
@@ -340,18 +343,18 @@
         fetchGetAsnOrderItemDetail(activeItemId.value),
         {},
         {
-          timeoutMessage: '鏀惰揣鏄庣粏璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+          timeoutMessage: t('pages.orders.asnOrderItem.messages.detailTimeout')
         }
       )
 
       detailData.value = normalizeAsnOrderItemDetail({
         ...detailData.value,
         ...detailResponse
-      })
+      }, t)
     } catch (error) {
       detailDrawerVisible.value = false
       detailData.value = {}
-      ElMessage.error(error?.message || '鑾峰彇鏀惰揣鏄庣粏璇︽儏澶辫触')
+      ElMessage.error(error?.message || t('pages.orders.asnOrderItem.messages.detailFailed'))
     } finally {
       detailLoading.value = false
     }
@@ -370,7 +373,7 @@
       ),
       { records: [], total: 0, current: 1, size: reportPageSize },
       {
-        timeoutMessage: '鏀惰揣鏄庣粏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+        timeoutMessage: t('pages.orders.asnOrderItem.messages.pageTimeout')
       }
     )
 
@@ -393,7 +396,7 @@
         .filter((id) => id !== undefined && id !== null)
 
       if (ids.length === 0) {
-        throw new Error('鏆傛棤鍙鍑虹殑鏁版嵁')
+        throw new Error(t('pages.orders.asnOrderItem.messages.noExportData'))
       }
 
       return fetchExportAsnOrderItemReport(
@@ -410,7 +413,7 @@
     buildPreviewMeta: (rows) => {
       const now = new Date()
       return {
-        reportTitle,
+        reportTitle: reportTitle.value,
         reportDate: now.toLocaleDateString('zh-CN'),
         printedAt: now.toLocaleString('zh-CN', { hour12: false }),
         operator: userStore.getUserInfo?.name || userStore.getUserInfo?.username || '',
diff --git a/rsf-design/src/views/orders/asn-order-item/modules/asn-order-item-detail-drawer.vue b/rsf-design/src/views/orders/asn-order-item/modules/asn-order-item-detail-drawer.vue
index edd2178..48db213 100644
--- a/rsf-design/src/views/orders/asn-order-item/modules/asn-order-item-detail-drawer.vue
+++ b/rsf-design/src/views/orders/asn-order-item/modules/asn-order-item-detail-drawer.vue
@@ -1,7 +1,7 @@
 <template>
   <ElDrawer
     :model-value="visible"
-    title="鏀惰揣鏄庣粏璇︽儏"
+    :title="t('pages.orders.asnOrderItem.detail.title')"
     size="1180px"
     destroy-on-close
     @update:model-value="handleVisibleChange"
@@ -11,62 +11,62 @@
         <ElSkeleton :rows="12" animated />
       </div>
       <div v-else class="space-y-4">
-        <ElDescriptions title="鍩虹淇℃伅" :column="2" border>
-          <ElDescriptionsItem label="PO鍗曞彿">{{ detail.poCode || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="ASN鍗曞彿">{{ detail.orderCode || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="涓氬姟绫诲瀷">{{ detail.wkTypeLabel || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鍗曟嵁绫诲瀷">{{ detail.typeLabel || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="閲囪喘缁勭粐">{{ detail.purchaseOrgName || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="閲囪喘鍛�">{{ detail.purchaseUserName || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="渚涘簲鍟咺D">{{ detail.supplierId || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="渚涘簲鍟嗗悕绉�">{{ detail.supplierName || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="涓氬姟鏃堕棿">{{ detail.businessTimeText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="寤鸿鐩爣浠�">{{ detail.targetWarehouseId || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鐘舵��">
+        <ElDescriptions :title="t('pages.orders.asnOrderItem.detail.baseInfo')" :column="2" border>
+          <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.poCode')">{{ detail.poCode || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.orderCode')">{{ detail.orderCode || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.wkType')">{{ detail.wkTypeLabel || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.orderType')">{{ detail.typeLabel || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.purchaseOrg')">{{ detail.purchaseOrgName || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.purchaseUser')">{{ detail.purchaseUserName || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.supplierId')">{{ detail.supplierId || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.supplierName')">{{ detail.supplierName || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.businessTime')">{{ detail.businessTimeText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.targetWarehouseId')">{{ detail.targetWarehouseId || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.status')">
             <ElTag :type="detail.statusTagType || 'info'" effect="light">
-              {{ detail.statusText || '--' }}
+              {{ detail.statusText || t('common.placeholder.empty') }}
             </ElTag>
           </ElDescriptionsItem>
-          <ElDescriptionsItem label="涓婃姤鐘舵��">
+          <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.ntyStatus')">
             <ElTag :type="detail.ntyStatusTagType || 'info'" effect="light">
-              {{ detail.ntyStatusText || '--' }}
+              {{ detail.ntyStatusText || t('common.placeholder.empty') }}
             </ElTag>
           </ElDescriptionsItem>
-          <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="澶囨敞" :span="2">{{ detail.memo || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.updateTime')">{{ detail.updateTimeText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.memo')" :span="2">{{ detail.memo || t('common.placeholder.empty') }}</ElDescriptionsItem>
         </ElDescriptions>
 
-        <ElDescriptions title="鏄庣粏淇℃伅" :column="2" border>
-          <ElDescriptionsItem label="璁″垝琛屽彿">{{ detail.platItemId || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="璁″垝璺熻釜鍙�">{{ detail.platWorkCode || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鐗╂枡缂栫爜">{{ detail.matnrCode || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鐗╂枡鍚嶇О">{{ detail.maktx || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="瑙勬牸">{{ detail.spec || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鍨嬪彿">{{ detail.model || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="渚涘簲鍟嗘壒娆�">{{ detail.splrBatch || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鏉″舰鐮�">{{ detail.barcode || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="浜岀淮鐮�">{{ detail.qrcode || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鍖呰鍚嶇О">{{ detail.packName || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="搴撳瓨鍗曚綅">{{ detail.stockUnit || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="閲囪喘鍗曚綅">{{ detail.purUnit || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="閫佽揣鏁伴噺">{{ detail.anfme ?? 0 }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="宸叉敹鏁伴噺">{{ detail.qty ?? 0 }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="閲囪喘鏁伴噺">{{ detail.purQty ?? 0 }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鐢熶骇鏃ユ湡">{{ detail.prodTimeText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="璐ㄦ缁撴灉">{{ detail.isptResultText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鏉ユ簮浠撳簱">{{ detail.sourceWarehouseId || '--' }}</ElDescriptionsItem>
+        <ElDescriptions :title="t('pages.orders.asnOrderItem.detail.itemInfo')" :column="2" border>
+          <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.platItemId')">{{ detail.platItemId || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.platWorkCode')">{{ detail.platWorkCode || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.materialCode')">{{ detail.matnrCode || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.materialName')">{{ detail.maktx || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.spec')">{{ detail.spec || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.model')">{{ detail.model || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.supplierBatch')">{{ detail.splrBatch || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.barcode')">{{ detail.barcode || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.qrcode')">{{ detail.qrcode || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.packName')">{{ detail.packName || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.stockUnit')">{{ detail.stockUnit || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.purUnit')">{{ detail.purUnit || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.anfme')">{{ detail.anfme ?? 0 }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.qty')">{{ detail.qty ?? 0 }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.purQty')">{{ detail.purQty ?? 0 }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.prodTime')">{{ detail.prodTimeText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.isptResult')">{{ detail.isptResultText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.asnOrderItem.detail.sourceWarehouseId')">{{ detail.sourceWarehouseId || t('common.placeholder.empty') }}</ElDescriptionsItem>
         </ElDescriptions>
 
-        <ElDescriptions title="瀹¤淇℃伅" :column="2" border>
-          <ElDescriptionsItem label="鍒涘缓浜�">{{ detail.createByText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鏇存柊浜�">{{ detail.updateByText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
+        <ElDescriptions :title="t('pages.orders.asnOrderItem.detail.auditInfo')" :column="2" border>
+          <ElDescriptionsItem :label="t('table.createBy')">{{ detail.createByText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.createTime')">{{ detail.createTimeText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.updateBy')">{{ detail.updateByText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.updateTime')">{{ detail.updateTimeText || t('common.placeholder.empty') }}</ElDescriptionsItem>
         </ElDescriptions>
 
         <ElDescriptions
           v-if="Object.keys(detail.extendFields || {}).length > 0"
-          title="鎵╁睍瀛楁"
+          :title="t('pages.orders.asnOrderItem.detail.extendFields')"
           :column="2"
           border
         >
@@ -85,6 +85,9 @@
 
 <script setup>
   import { computed } from 'vue'
+  import { useI18n } from 'vue-i18n'
+
+  const { t } = useI18n()
 
   defineOptions({ name: 'AsnOrderItemDetailDrawer' })
 
diff --git a/rsf-design/src/views/orders/asn-order-log/asnOrderLogTable.columns.js b/rsf-design/src/views/orders/asn-order-log/asnOrderLogTable.columns.js
index 417d2ae..9ecb695 100644
--- a/rsf-design/src/views/orders/asn-order-log/asnOrderLogTable.columns.js
+++ b/rsf-design/src/views/orders/asn-order-log/asnOrderLogTable.columns.js
@@ -1,6 +1,7 @@
 import { h } from 'vue'
 import { ElTag } from 'element-plus'
 import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
+import { $t } from '@/locales'
 
 function buildTagRenderer(textKey, typeKey) {
   return (row) =>
@@ -17,122 +18,122 @@
 export function createAsnOrderLogTableColumns({ handleView } = {}) {
   return [
     { type: 'selection', width: 48, align: 'center' },
-    { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+    { type: 'globalIndex', label: $t('table.index'), width: 72, align: 'center' },
     {
       prop: 'code',
-      label: 'ASN鍗曞彿',
+      label: $t('pages.orders.asnOrderItemLog.table.asnCode'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.code || '--'
     },
     {
       prop: 'poCode',
-      label: 'PO鍗曞彿',
+      label: $t('pages.orders.asnOrderItemLog.table.poCode'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.poCode || '--'
     },
     {
       prop: 'poId',
-      label: 'PO鍗旾D',
+      label: $t('pages.orders.asnOrderLog.table.poId'),
       width: 110,
       align: 'right',
       formatter: (row) => row.poId ?? '--'
     },
     {
       prop: 'typeText',
-      label: '鍗曟嵁绫诲瀷',
+      label: $t('pages.orders.asnOrderLog.table.type'),
       minWidth: 120,
       showOverflowTooltip: true,
       formatter: (row) => row.typeText || '--'
     },
     {
       prop: 'wkTypeText',
-      label: '涓氬姟绫诲瀷',
+      label: $t('pages.orders.asnOrderLog.table.wkType'),
       minWidth: 120,
       showOverflowTooltip: true,
       formatter: (row) => row.wkTypeText || '--'
     },
     {
       prop: 'anfme',
-      label: '閫佽揣鏁伴噺',
+      label: $t('pages.orders.asnOrderLog.table.anfme'),
       width: 110,
       align: 'right',
       formatter: (row) => row.anfme ?? '--'
     },
     {
       prop: 'qty',
-      label: '宸叉敹鏁伴噺',
+      label: $t('pages.orders.asnOrderLog.table.qty'),
       width: 110,
       align: 'right',
       formatter: (row) => row.qty ?? '--'
     },
     {
       prop: 'logisNo',
-      label: '鐗╂祦鍗曞彿',
+      label: $t('pages.orders.asnOrderLog.table.logisNo'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.logisNo || '--'
     },
     {
       prop: 'arrTimeText',
-      label: '棰勮鍒拌揪鏃堕棿',
+      label: $t('pages.orders.asnOrderLog.table.arrTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.arrTimeText || '--'
     },
     {
       prop: 'rleStatusText',
-      label: '閲婃斁鐘舵��',
+      label: $t('pages.orders.asnOrderLog.table.rleStatus'),
       width: 110,
       align: 'center',
       formatter: buildTagRenderer('rleStatusText', 'rleStatusTagType')
     },
     {
       prop: 'ntyStatusText',
-      label: '涓婃姤鐘舵��',
+      label: $t('pages.orders.asnOrderItemLog.table.ntyStatus'),
       width: 110,
       align: 'center',
       formatter: buildTagRenderer('ntyStatusText', 'ntyStatusTagType')
     },
     {
       prop: 'exceStatusText',
-      label: '鎵ц鐘舵��',
+      label: $t('pages.orders.asnOrderLog.table.exceStatus'),
       minWidth: 120,
       showOverflowTooltip: true,
       formatter: (row) => row.exceStatusText || '--'
     },
     {
       prop: 'status',
-      label: '鐘舵��',
+      label: $t('table.status'),
       width: 96,
       align: 'center',
       formatter: buildTagRenderer('statusText', 'statusType')
     },
     {
       prop: 'updateByText',
-      label: '鏇存柊浜�',
+      label: $t('table.updateBy'),
       minWidth: 120,
       showOverflowTooltip: true,
       formatter: (row) => row.updateByText || '--'
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: $t('table.updateTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.updateTimeText || '--'
     },
     {
       prop: 'memo',
-      label: '澶囨敞',
+      label: $t('table.memo'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.memo || '--'
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: $t('table.operation'),
       width: 92,
       align: 'center',
       fixed: 'right',
@@ -147,164 +148,164 @@
 
 export function createAsnOrderItemLogColumns() {
   return [
-    { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+    { type: 'globalIndex', label: $t('table.index'), width: 72, align: 'center' },
     {
       prop: 'asnCode',
-      label: 'ASN鍗曞彿',
+      label: $t('pages.orders.asnOrderItemLog.table.asnCode'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.asnCode || '--'
     },
     {
       prop: 'platItemId',
-      label: '骞冲彴琛屽彿',
+      label: $t('pages.orders.asnOrderItemLog.table.platItemId'),
       minWidth: 120,
       showOverflowTooltip: true,
       formatter: (row) => row.platItemId || '--'
     },
     {
       prop: 'poDetlId',
-      label: 'PO鍗曟槑缁咺D',
+      label: $t('pages.orders.asnOrderItemLog.table.poDetlId'),
       width: 120,
       align: 'right',
       formatter: (row) => row.poDetlId ?? '--'
     },
     {
       prop: 'poCode',
-      label: 'PO鍗曞彿',
+      label: $t('pages.orders.asnOrderItemLog.table.poCode'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.poCode || '--'
     },
     {
       prop: 'fieldsIndex',
-      label: '鍔ㄦ�佸瓧娈电储寮�',
+      label: $t('pages.orders.asnOrderItemLog.table.fieldsIndex'),
       minWidth: 130,
       showOverflowTooltip: true,
       formatter: (row) => row.fieldsIndex || '--'
     },
     {
       prop: 'matnrCode',
-      label: '鐗╂枡缂栫爜',
+      label: $t('pages.orders.asnOrderItemLog.table.matnrCode'),
       minWidth: 140,
       showOverflowTooltip: true,
       formatter: (row) => row.matnrCode || '--'
     },
     {
       prop: 'maktx',
-      label: '鐗╂枡鍚嶇О',
+      label: $t('pages.orders.asnOrderItemLog.table.maktx'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.maktx || '--'
     },
     {
       prop: 'anfme',
-      label: '閫佽揣鏁伴噺',
+      label: $t('pages.orders.asnOrderItemLog.table.anfme'),
       width: 110,
       align: 'right',
       formatter: (row) => row.anfme ?? '--'
     },
     {
       prop: 'stockUnit',
-      label: '搴撳瓨鍗曚綅',
+      label: $t('pages.orders.asnOrderItemLog.table.stockUnit'),
       width: 100,
       align: 'center',
       formatter: (row) => row.stockUnit || '--'
     },
     {
       prop: 'purQty',
-      label: '閲囪喘鏁伴噺',
+      label: $t('pages.orders.asnOrderItemLog.table.purQty'),
       width: 110,
       align: 'right',
       formatter: (row) => row.purQty ?? '--'
     },
     {
       prop: 'purUnit',
-      label: '閲囪喘鍗曚綅',
+      label: $t('pages.orders.asnOrderItemLog.table.purUnit'),
       width: 100,
       align: 'center',
       formatter: (row) => row.purUnit || '--'
     },
     {
       prop: 'qty',
-      label: '宸叉敹鏁伴噺',
+      label: $t('pages.orders.asnOrderItemLog.table.qty'),
       width: 110,
       align: 'right',
       formatter: (row) => row.qty ?? '--'
     },
     {
       prop: 'splrCode',
-      label: '渚涘簲鍟嗙紪鐮�',
+      label: $t('pages.orders.asnOrderItemLog.table.splrCode'),
       minWidth: 140,
       showOverflowTooltip: true,
       formatter: (row) => row.splrCode || '--'
     },
     {
       prop: 'splrBatch',
-      label: '渚涘簲鍟嗘壒娆�',
+      label: $t('pages.orders.asnOrderItemLog.table.splrBatch'),
       minWidth: 140,
       showOverflowTooltip: true,
       formatter: (row) => row.splrBatch || '--'
     },
     {
       prop: 'splrName',
-      label: '渚涘簲鍟嗗悕绉�',
+      label: $t('pages.orders.asnOrderItemLog.table.splrName'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.splrName || '--'
     },
     {
       prop: 'qrcode',
-      label: '浜岀淮鐮�',
+      label: $t('pages.orders.asnOrderItemLog.table.qrcode'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.qrcode || '--'
     },
     {
       prop: 'trackCode',
-      label: '璺熻釜鐮�',
+      label: $t('pages.orders.asnOrderItemLog.table.trackCode'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.trackCode || '--'
     },
     {
       prop: 'barcode',
-      label: '鏉″舰鐮�',
+      label: $t('pages.orders.asnOrderItemLog.table.barcode'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.barcode || '--'
     },
     {
       prop: 'packName',
-      label: '鍖呰鍚嶇О',
+      label: $t('pages.orders.asnOrderItemLog.table.packName'),
       minWidth: 130,
       showOverflowTooltip: true,
       formatter: (row) => row.packName || '--'
     },
     {
       prop: 'ntyStatusText',
-      label: '涓婃姤鐘舵��',
+      label: $t('pages.orders.asnOrderItemLog.table.ntyStatus'),
       width: 110,
       align: 'center',
       formatter: (row) => row.ntyStatusText || '--'
     },
     {
       prop: 'status',
-      label: '鐘舵��',
+      label: $t('table.status'),
       width: 96,
       align: 'center',
       formatter: (row) => row.statusText || '--'
     },
     {
       prop: 'updateByText',
-      label: '鏇存柊浜�',
+      label: $t('table.updateBy'),
       minWidth: 120,
       showOverflowTooltip: true,
       formatter: (row) => row.updateByText || '--'
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: $t('table.updateTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.updateTimeText || '--'
diff --git a/rsf-design/src/views/orders/asn-order/asnOrderPage.helpers.js b/rsf-design/src/views/orders/asn-order/asnOrderPage.helpers.js
index 3c58d73..1e3063d 100644
--- a/rsf-design/src/views/orders/asn-order/asnOrderPage.helpers.js
+++ b/rsf-design/src/views/orders/asn-order/asnOrderPage.helpers.js
@@ -1,22 +1,14 @@
 import { $t } from '@/locales'
 
-export const ASN_ORDER_REPORT_TITLE = $t('pages.orders.asnOrder.reportTitle')
+export function getAsnOrderReportTitle(t = $t) {
+  return t('pages.orders.asnOrder.reportTitle')
+}
 export const ASN_ORDER_REPORT_STYLE = {
   titleAlign: 'center',
   titleLevel: 'strong',
   orientation: 'landscape',
   density: 'compact',
   showSequence: true
-}
-
-const ASN_ORDER_STATUS_MAP = {
-  0: { label: $t('pages.orders.asnOrder.status.pending'), tagType: 'info' },
-  1: { label: $t('pages.orders.asnOrder.status.running'), tagType: 'warning' },
-  2: { label: $t('pages.orders.asnOrder.status.receiving'), tagType: 'success' },
-  3: { label: $t('pages.orders.asnOrder.status.taskRunning'), tagType: 'warning' },
-  4: { label: $t('pages.orders.asnOrder.status.completed'), tagType: 'success' },
-  8: { label: $t('pages.orders.asnOrder.status.cancelled'), tagType: 'danger' },
-  9: { label: $t('pages.orders.asnOrder.status.closed'), tagType: 'info' }
 }
 
 function normalizeText(value) {
@@ -39,9 +31,21 @@
   return Number.isFinite(numericValue) ? numericValue : '-'
 }
 
-function getStatusConfig(status, statusText) {
+function getAsnOrderStatusMap(t = $t) {
+  return {
+    0: { label: t('pages.orders.asnOrder.status.pending'), tagType: 'info' },
+    1: { label: t('pages.orders.asnOrder.status.running'), tagType: 'warning' },
+    2: { label: t('pages.orders.asnOrder.status.receiving'), tagType: 'success' },
+    3: { label: t('pages.orders.asnOrder.status.taskRunning'), tagType: 'warning' },
+    4: { label: t('pages.orders.asnOrder.status.completed'), tagType: 'success' },
+    8: { label: t('pages.orders.asnOrder.status.cancelled'), tagType: 'danger' },
+    9: { label: t('pages.orders.asnOrder.status.closed'), tagType: 'info' }
+  }
+}
+
+function getStatusConfig(status, statusText, t = $t) {
   const numericStatus = Number(status)
-  const fallback = ASN_ORDER_STATUS_MAP[numericStatus] || {
+  const fallback = getAsnOrderStatusMap(t)[numericStatus] || {
     label: statusText || '-',
     tagType: 'info'
   }
@@ -123,8 +127,8 @@
   }
 }
 
-export function normalizeAsnOrderRow(record = {}) {
-  const statusConfig = getStatusConfig(record.exceStatus, record['exceStatus$'])
+export function normalizeAsnOrderRow(record = {}, t = $t) {
+  const statusConfig = getStatusConfig(record.exceStatus, record['exceStatus$'], t)
   return {
     ...record,
     id: record.id ?? null,
@@ -206,20 +210,21 @@
   }
 }
 
-export function buildAsnOrderPrintRows(records = []) {
+export function buildAsnOrderPrintRows(records = [], t = $t) {
   if (!Array.isArray(records)) {
     return []
   }
-  return records.map((record) => normalizeAsnOrderRow(record))
+  return records.map((record) => normalizeAsnOrderRow(record, t))
 }
 
 export function buildAsnOrderReportMeta({
   previewMeta = {},
   count = 0,
-  orientation = ASN_ORDER_REPORT_STYLE.orientation
+  orientation = ASN_ORDER_REPORT_STYLE.orientation,
+  t = $t
 } = {}) {
   return {
-    reportTitle: ASN_ORDER_REPORT_TITLE,
+    reportTitle: getAsnOrderReportTitle(t),
     reportDate: previewMeta.reportDate,
     printedAt: previewMeta.printedAt,
     operator: previewMeta.operator,
@@ -231,8 +236,8 @@
   }
 }
 
-export function getAsnOrderStatusOptions() {
-  return Object.entries(ASN_ORDER_STATUS_MAP).map(([value, item]) => ({
+export function getAsnOrderStatusOptions(t = $t) {
+  return Object.entries(getAsnOrderStatusMap(t)).map(([value, item]) => ({
     label: item.label,
     value: Number(value)
   }))
diff --git a/rsf-design/src/views/orders/asn-order/index.vue b/rsf-design/src/views/orders/asn-order/index.vue
index 46584e1..1a23773 100644
--- a/rsf-design/src/views/orders/asn-order/index.vue
+++ b/rsf-design/src/views/orders/asn-order/index.vue
@@ -84,13 +84,13 @@
   } from './asnOrderTable.columns'
   import {
     ASN_ORDER_REPORT_STYLE,
-    ASN_ORDER_REPORT_TITLE,
     buildAsnOrderDetailQueryParams,
     buildAsnOrderPageQueryParams,
     buildAsnOrderPrintRows,
     buildAsnOrderReportMeta,
     buildAsnOrderSearchParams,
     createAsnOrderSearchState,
+    getAsnOrderReportTitle,
     getAsnOrderStatusOptions,
     normalizeAsnOrderItemRow,
     normalizeAsnOrderRow
@@ -101,7 +101,7 @@
   const userStore = useUserStore()
   const router = useRouter()
   const { t } = useI18n()
-  const reportTitle = ASN_ORDER_REPORT_TITLE
+  const reportTitle = computed(() => getAsnOrderReportTitle(t))
   const searchForm = ref(createAsnOrderSearchState())
   const selectedRows = ref([])
   const detailDrawerVisible = ref(false)
@@ -163,7 +163,7 @@
       type: 'select',
       props: {
         clearable: true,
-        options: getAsnOrderStatusOptions()
+        options: getAsnOrderStatusOptions(t)
       }
     },
     {
@@ -189,7 +189,7 @@
   async function openDetail(row) {
     activeOrderId.value = row.id
     activeOrderRow.value = row
-    detailData.value = normalizeAsnOrderRow(row)
+    detailData.value = normalizeAsnOrderRow(row, t)
     detailPagination.current = 1
     detailDrawerVisible.value = true
     await loadDetailResources()
@@ -270,7 +270,7 @@
     },
     transform: {
       dataTransformer: (records) =>
-        Array.isArray(records) ? records.map((item) => normalizeAsnOrderRow(item)) : []
+        Array.isArray(records) ? records.map((item) => normalizeAsnOrderRow(item, t)) : []
     }
   })
 
@@ -306,7 +306,7 @@
         }
       )
 
-      detailData.value = normalizeAsnOrderRow(activeOrderRow.value || {})
+      detailData.value = normalizeAsnOrderRow(activeOrderRow.value || {}, t)
       detailTableData.value = Array.isArray(itemResponse?.records)
         ? itemResponse.records.map((item) => normalizeAsnOrderItemRow(item))
         : []
@@ -384,11 +384,11 @@
         })
       ).records
     },
-    buildPreviewRows: (records) => buildAsnOrderPrintRows(records),
+    buildPreviewRows: (records) => buildAsnOrderPrintRows(records, t),
     buildPreviewMeta: (rows) => {
       const now = new Date()
       return {
-        reportTitle,
+        reportTitle: reportTitle.value,
         reportDate: now.toLocaleDateString('zh-CN'),
         printedAt: now.toLocaleString('zh-CN', { hour12: false }),
         operator: userStore.getUserInfo?.name || userStore.getUserInfo?.username || '',
@@ -404,7 +404,8 @@
     buildAsnOrderReportMeta({
       previewMeta: previewMeta.value,
       count: previewRows.value.length,
-      orientation: previewMeta.value?.reportStyle?.orientation || ASN_ORDER_REPORT_STYLE.orientation
+      orientation: previewMeta.value?.reportStyle?.orientation || ASN_ORDER_REPORT_STYLE.orientation,
+      t
     })
   )
 </script>
diff --git a/rsf-design/src/views/orders/delivery-item/deliveryItemPage.helpers.js b/rsf-design/src/views/orders/delivery-item/deliveryItemPage.helpers.js
index afe7c69..db0887c 100644
--- a/rsf-design/src/views/orders/delivery-item/deliveryItemPage.helpers.js
+++ b/rsf-design/src/views/orders/delivery-item/deliveryItemPage.helpers.js
@@ -1,9 +1,16 @@
-const STATUS_META = {
-  1: { text: '姝e父', type: 'success', bool: true },
-  0: { text: '鍐荤粨', type: 'danger', bool: false }
+import { $t } from '@/locales'
+
+function getDeliveryItemStatusMetaMap(t = $t) {
+  return {
+    1: { text: t('common.status.normal'), type: 'success', bool: true },
+    0: { text: t('common.status.frozen'), type: 'danger', bool: false }
+  }
 }
 
-export const DELIVERY_ITEM_REPORT_TITLE = 'DO鍗曟槑缁嗘姤琛�'
+export function getDeliveryItemReportTitle(t = $t) {
+  return t('pages.orders.deliveryItem.reportTitle')
+}
+
 export const DELIVERY_ITEM_REPORT_STYLE = {
   titleAlign: 'center',
   titleLevel: 'strong',
@@ -24,14 +31,15 @@
   return Number.isNaN(parsed) ? fallback : parsed
 }
 
-function normalizeStatusMeta(status) {
+function normalizeStatusMeta(status, t = $t) {
+  const statusMetaMap = getDeliveryItemStatusMetaMap(t)
   if (status === true || Number(status) === 1) {
-    return STATUS_META[1]
+    return statusMetaMap[1]
   }
   if (status === false || Number(status) === 0) {
-    return STATUS_META[0]
+    return statusMetaMap[0]
   }
-  return { text: '鏈煡', type: 'info', bool: false }
+  return { text: t('common.status.unknown'), type: 'info', bool: false }
 }
 
 export function createDeliveryItemSearchState() {
@@ -85,8 +93,8 @@
   }
 }
 
-export function normalizeDeliveryItemRow(record = {}) {
-  const statusMeta = normalizeStatusMeta(record.statusBool ?? record.status)
+export function normalizeDeliveryItemRow(record = {}, t = $t) {
+  const statusMeta = normalizeStatusMeta(record.statusBool ?? record.status, t)
   return {
     ...record,
     id: record.id ?? null,
@@ -121,20 +129,21 @@
   }
 }
 
-export function buildDeliveryItemPrintRows(records = []) {
+export function buildDeliveryItemPrintRows(records = [], t = $t) {
   if (!Array.isArray(records)) {
     return []
   }
-  return records.map((record) => normalizeDeliveryItemRow(record))
+  return records.map((record) => normalizeDeliveryItemRow(record, t))
 }
 
 export function buildDeliveryItemReportMeta({
   previewMeta = {},
   count = 0,
-  orientation = DELIVERY_ITEM_REPORT_STYLE.orientation
+  orientation = DELIVERY_ITEM_REPORT_STYLE.orientation,
+  t = $t
 } = {}) {
   return {
-    reportTitle: DELIVERY_ITEM_REPORT_TITLE,
+    reportTitle: getDeliveryItemReportTitle(t),
     reportDate: previewMeta.reportDate,
     printedAt: previewMeta.printedAt,
     operator: previewMeta.operator,
diff --git a/rsf-design/src/views/orders/delivery-item/deliveryItemTable.columns.js b/rsf-design/src/views/orders/delivery-item/deliveryItemTable.columns.js
index 47eea48..23275c6 100644
--- a/rsf-design/src/views/orders/delivery-item/deliveryItemTable.columns.js
+++ b/rsf-design/src/views/orders/delivery-item/deliveryItemTable.columns.js
@@ -1,119 +1,120 @@
 import { h } from 'vue'
 import { ElTag } from 'element-plus'
 import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
+import { $t } from '@/locales'
 
-export function createDeliveryItemTableColumns({ handleActionClick } = {}) {
+export function createDeliveryItemTableColumns({ handleActionClick, t = $t } = {}) {
   return [
     { type: 'selection', width: 48, align: 'center' },
-    { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+    { type: 'globalIndex', label: t('table.index'), width: 72, align: 'center' },
     {
       prop: 'deliveryCode',
-      label: '浜ゆ帴鍗曞彿',
+      label: t('pages.orders.deliveryItem.table.deliveryCode'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.deliveryCode || '--'
     },
     {
       prop: 'deliveryId',
-      label: '涓诲崟ID',
+      label: t('pages.orders.deliveryItem.table.deliveryId'),
       width: 110,
       align: 'right',
       formatter: (row) => row.deliveryId ?? '--'
     },
     {
       prop: 'platItemId',
-      label: '骞冲彴琛屽彿',
+      label: t('pages.orders.deliveryItem.table.platItemId'),
       minWidth: 130,
       showOverflowTooltip: true,
       formatter: (row) => row.platItemId || '--'
     },
     {
       prop: 'matnrCode',
-      label: '鐗╂枡缂栫爜',
+      label: t('table.materialCode'),
       minWidth: 150,
       showOverflowTooltip: true,
       formatter: (row) => row.matnrCode || '--'
     },
     {
       prop: 'maktx',
-      label: '鐗╂枡鍚嶇О',
+      label: t('table.materialName'),
       minWidth: 220,
       showOverflowTooltip: true,
       formatter: (row) => row.maktx || '--'
     },
     {
       prop: 'fieldsIndex',
-      label: '鍔ㄦ�佸瓧娈电储寮�',
+      label: t('pages.orders.deliveryItem.table.fieldsIndex'),
       minWidth: 150,
       showOverflowTooltip: true,
       formatter: (row) => row.fieldsIndex || '--'
     },
     {
       prop: 'unit',
-      label: '鍗曚綅',
+      label: t('table.unit'),
       width: 90,
       align: 'center',
       formatter: (row) => row.unit || '--'
     },
     {
       prop: 'anfme',
-      label: '鏁伴噺',
+      label: t('table.quantity'),
       width: 110,
       align: 'right',
       formatter: (row) => row.anfme ?? '--'
     },
     {
       prop: 'workQty',
-      label: '鎵ц鏁伴噺',
+      label: t('pages.orders.deliveryItem.table.workQty'),
       width: 110,
       align: 'right',
       formatter: (row) => row.workQty ?? '--'
     },
     {
       prop: 'qty',
-      label: '宸插嚭鏁伴噺',
+      label: t('pages.orders.deliveryItem.table.qty'),
       width: 110,
       align: 'right',
       formatter: (row) => row.qty ?? '--'
     },
     {
       prop: 'nromQty',
-      label: '鏍囧噯鍖呰',
+      label: t('pages.orders.deliveryItem.table.nromQty'),
       width: 110,
       align: 'right',
       formatter: (row) => row.nromQty ?? '--'
     },
     {
       prop: 'printQty',
-      label: '鎵撳嵃鏁伴噺',
+      label: t('pages.orders.deliveryItem.table.printQty'),
       width: 110,
       align: 'right',
       formatter: (row) => row.printQty ?? '--'
     },
     {
       prop: 'splrName',
-      label: '渚涘簲鍟嗗悕绉�',
+      label: t('pages.orders.deliveryItem.table.supplierName'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.splrName || '--'
     },
     {
       prop: 'splrCode',
-      label: '渚涘簲鍟嗙紪鐮�',
+      label: t('pages.orders.deliveryItem.table.supplierCode'),
       minWidth: 140,
       showOverflowTooltip: true,
       formatter: (row) => row.splrCode || '--'
     },
     {
       prop: 'splrBatch',
-      label: '渚涘簲鍟嗘壒娆�',
+      label: t('table.supplierBatch'),
       minWidth: 140,
       showOverflowTooltip: true,
       formatter: (row) => row.splrBatch || '--'
     },
     {
       prop: 'status',
-      label: '鐘舵��',
+      label: t('table.status'),
       width: 96,
       align: 'center',
       formatter: (row) =>
@@ -121,14 +122,14 @@
     },
     {
       prop: 'memo',
-      label: '澶囨敞',
+      label: t('table.memo'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.memo || '--'
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: t('table.operation'),
       width: 92,
       fixed: 'right',
       formatter: (row) =>
diff --git a/rsf-design/src/views/orders/delivery-item/index.vue b/rsf-design/src/views/orders/delivery-item/index.vue
index fdd6cc6..609f5c1 100644
--- a/rsf-design/src/views/orders/delivery-item/index.vue
+++ b/rsf-design/src/views/orders/delivery-item/index.vue
@@ -3,10 +3,10 @@
     <ElCard v-if="activeSourceSummary" class="mb-3">
       <div class="flex items-center justify-between gap-3">
         <div class="flex items-center gap-2 text-sm text-[var(--art-text-gray-600)]">
-          <span class="font-medium text-[var(--art-text-gray-900)]">褰撳墠鏉ユ簮</span>
-          <span>DO鍗旾D锛歿{ activeSourceSummary.deliveryId }}</span>
+          <span class="font-medium text-[var(--art-text-gray-900)]">{{ t('pages.orders.deliveryItem.sourceTitle') }}</span>
+          <span>{{ t('pages.orders.deliveryItem.sourceLabel', { id: activeSourceSummary.deliveryId }) }}</span>
         </div>
-        <ElButton link type="primary" @click="handleClearSourceFilter">鏌ョ湅鍏ㄩ儴</ElButton>
+        <ElButton link type="primary" @click="handleClearSourceFilter">{{ t('common.actions.viewAll') }}</ElButton>
       </div>
     </ElCard>
 
@@ -41,6 +41,7 @@
 
 <script setup>
   import { computed, onMounted, ref, watch } from 'vue'
+  import { useI18n } from 'vue-i18n'
   import { ElButton, ElMessage } from 'element-plus'
   import { useRoute, useRouter } from 'vue-router'
   import { useTable } from '@/hooks/core/useTable'
@@ -56,6 +57,7 @@
 
   defineOptions({ name: 'DeliveryItem' })
 
+  const { t } = useI18n()
   const route = useRoute()
   const router = useRouter()
   const searchForm = ref(createDeliveryItemSearchState())
@@ -74,66 +76,66 @@
 
   const searchItems = computed(() => [
     {
-      label: '鍏抽敭瀛�',
+      label: t('table.keyword'),
       key: 'condition',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ヤ氦鎺ュ崟鍙�/鐗╂枡缂栫爜/鐗╂枡鍚嶇О'
+        placeholder: t('pages.orders.deliveryItem.search.conditionPlaceholder')
       }
     },
     {
-      label: '浜ゆ帴鍗曞彿',
+      label: t('pages.orders.deliveryItem.search.deliveryCode'),
       key: 'deliveryCode',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ヤ氦鎺ュ崟鍙�'
+        placeholder: t('pages.orders.deliveryItem.search.deliveryCodePlaceholder')
       }
     },
     {
-      label: '骞冲彴琛屽彿',
+      label: t('pages.orders.deliveryItem.search.platItemId'),
       key: 'platItemId',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ュ钩鍙拌鍙�'
+        placeholder: t('pages.orders.deliveryItem.search.platItemIdPlaceholder')
       }
     },
     {
-      label: '鐗╂枡缂栫爜',
+      label: t('table.materialCode'),
       key: 'matnrCode',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ョ墿鏂欑紪鐮�'
+        placeholder: t('pages.orders.deliveryItem.search.matnrCodePlaceholder')
       }
     },
     {
-      label: '鐗╂枡鍚嶇О',
+      label: t('table.materialName'),
       key: 'maktx',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ョ墿鏂欏悕绉�'
+        placeholder: t('pages.orders.deliveryItem.search.maktxPlaceholder')
       }
     },
     {
-      label: '渚涘簲鍟嗗悕绉�',
+      label: t('pages.orders.deliveryItem.search.supplierName'),
       key: 'splrName',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ヤ緵搴斿晢鍚嶇О'
+        placeholder: t('pages.orders.deliveryItem.search.supplierNamePlaceholder')
       }
     },
     {
-      label: '渚涘簲鍟嗘壒娆�',
+      label: t('table.supplierBatch'),
       key: 'splrBatch',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ヤ緵搴斿晢鎵规'
+        placeholder: t('pages.orders.deliveryItem.search.supplierBatchPlaceholder')
       }
     }
   ])
@@ -142,15 +144,15 @@
     detailDrawerVisible.value = true
     detailLoading.value = true
     guardRequestWithMessage(fetchGetDeliveryItemDetail(row.id), {}, {
-      timeoutMessage: '浜ゆ帴鍗曟槑缁嗚鎯呭姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�'
+      timeoutMessage: t('pages.orders.deliveryItem.messages.detailTimeout')
     })
       .then((detail) => {
-        detailData.value = normalizeDeliveryItemRow(detail)
+        detailData.value = normalizeDeliveryItemRow(detail, t)
       })
       .catch((error) => {
         detailDrawerVisible.value = false
         detailData.value = {}
-        ElMessage.error(error?.message || '鑾峰彇浜ゆ帴鍗曟槑缁嗚鎯呭け璐�')
+        ElMessage.error(error?.message || t('pages.orders.deliveryItem.messages.detailFailed'))
       })
       .finally(() => {
         detailLoading.value = false
@@ -176,11 +178,11 @@
         ...searchForm.value,
         pageSize: 20
       }),
-      columnsFactory: () => createDeliveryItemTableColumns({ handleActionClick: openDetail })
+      columnsFactory: () => createDeliveryItemTableColumns({ handleActionClick: openDetail, t })
     },
     transform: {
       dataTransformer: (records) =>
-        Array.isArray(records) ? records.map((item) => normalizeDeliveryItemRow(item)) : []
+        Array.isArray(records) ? records.map((item) => normalizeDeliveryItemRow(item, t)) : []
     }
   })
 
diff --git a/rsf-design/src/views/orders/delivery-item/modules/delivery-item-detail-drawer.vue b/rsf-design/src/views/orders/delivery-item/modules/delivery-item-detail-drawer.vue
index 6688dd8..06ede2f 100644
--- a/rsf-design/src/views/orders/delivery-item/modules/delivery-item-detail-drawer.vue
+++ b/rsf-design/src/views/orders/delivery-item/modules/delivery-item-detail-drawer.vue
@@ -1,7 +1,7 @@
 <template>
   <ElDrawer
     :model-value="visible"
-    title="浜ゆ帴鍗曟槑缁嗚鎯�"
+    :title="t('pages.orders.deliveryItem.detail.title')"
     size="960px"
     destroy-on-close
     @update:model-value="handleVisibleChange"
@@ -11,39 +11,39 @@
         <ElSkeleton :rows="10" animated />
       </div>
       <div v-else class="space-y-4">
-        <ElDescriptions title="鍩虹淇℃伅" :column="2" border>
-          <ElDescriptionsItem label="浜ゆ帴鍗曞彿">{{ detail.deliveryCode || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="涓诲崟ID">{{ detail.deliveryId ?? '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="骞冲彴琛屽彿">{{ detail.platItemId || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鐗╂枡缂栫爜">{{ detail.matnrCode || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鐗╂枡鍚嶇О">{{ detail.maktx || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鍔ㄦ�佸瓧娈电储寮�">{{ detail.fieldsIndex || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鍗曚綅">{{ detail.unit || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鏁伴噺">{{ detail.anfme ?? '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鎵ц鏁伴噺">{{ detail.workQty ?? '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="宸插嚭鏁伴噺">{{ detail.qty ?? '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鏍囧噯鍖呰">{{ detail.nromQty ?? '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鎵撳嵃鏁伴噺">{{ detail.printQty ?? '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="渚涘簲鍟嗗悕绉�">{{ detail.splrName || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="渚涘簲鍟嗙紪鐮�">{{ detail.splrCode || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="渚涘簲鍟嗘壒娆�">{{ detail.splrBatch || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鎵规">{{ detail.batch || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="璺熻釜鐮�">{{ detail.trackCode || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鍖呰">{{ detail.packName || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鐢熶骇鏃ユ湡">{{ detail.prodTimeText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鐘舵��">
+        <ElDescriptions :title="t('pages.orders.deliveryItem.detail.baseInfo')" :column="2" border>
+          <ElDescriptionsItem :label="t('pages.orders.deliveryItem.detail.deliveryCode')">{{ detail.deliveryCode || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.deliveryItem.detail.deliveryId')">{{ detail.deliveryId ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.deliveryItem.detail.platItemId')">{{ detail.platItemId || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.materialCode')">{{ detail.matnrCode || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.materialName')">{{ detail.maktx || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.deliveryItem.detail.fieldsIndex')">{{ detail.fieldsIndex || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.unit')">{{ detail.unit || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.quantity')">{{ detail.anfme ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.deliveryItem.detail.workQty')">{{ detail.workQty ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.deliveryItem.detail.qty')">{{ detail.qty ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.deliveryItem.detail.nromQty')">{{ detail.nromQty ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.deliveryItem.detail.printQty')">{{ detail.printQty ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.deliveryItem.detail.supplierName')">{{ detail.splrName || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.deliveryItem.detail.supplierCode')">{{ detail.splrCode || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.supplierBatch')">{{ detail.splrBatch || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.batch')">{{ detail.batch || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.common.trackCode')">{{ detail.trackCode || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.deliveryItem.detail.packName')">{{ detail.packName || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.deliveryItem.detail.prodTime')">{{ detail.prodTimeText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.status')">
             <ElTag :type="detail.statusType || 'info'" effect="light">
-              {{ detail.statusText || '--' }}
+              {{ detail.statusText || t('common.placeholder.empty') }}
             </ElTag>
           </ElDescriptionsItem>
-          <ElDescriptionsItem label="澶囨敞" :span="2">{{ detail.memo || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.memo')" :span="2">{{ detail.memo || t('common.placeholder.empty') }}</ElDescriptionsItem>
         </ElDescriptions>
 
-        <ElDescriptions title="瀹¤淇℃伅" :column="2" border>
-          <ElDescriptionsItem label="鍒涘缓浜�">{{ detail.createByText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鏇存柊浜�">{{ detail.updateByText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
+        <ElDescriptions :title="t('pages.orders.deliveryItem.detail.auditInfo')" :column="2" border>
+          <ElDescriptionsItem :label="t('table.createBy')">{{ detail.createByText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.createTime')">{{ detail.createTimeText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.updateBy')">{{ detail.updateByText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('table.updateTime')">{{ detail.updateTimeText || t('common.placeholder.empty') }}</ElDescriptionsItem>
         </ElDescriptions>
       </div>
     </ElScrollbar>
@@ -52,6 +52,9 @@
 
 <script setup>
   import { computed } from 'vue'
+  import { useI18n } from 'vue-i18n'
+
+  const { t } = useI18n()
 
   defineOptions({ name: 'DeliveryItemDetailDrawer' })
 
diff --git a/rsf-design/src/views/orders/delivery/deliveryPage.helpers.js b/rsf-design/src/views/orders/delivery/deliveryPage.helpers.js
index b6fd8a2..9b61115 100644
--- a/rsf-design/src/views/orders/delivery/deliveryPage.helpers.js
+++ b/rsf-design/src/views/orders/delivery/deliveryPage.helpers.js
@@ -1,18 +1,24 @@
 import { $t } from '@/locales'
 
-const DELIVERY_STATUS_META = {
-  1: { text: $t('pages.orders.delivery.status.normal'), type: 'success', bool: true },
-  0: { text: $t('pages.orders.delivery.status.disabled'), type: 'danger', bool: false }
+function getDeliveryStatusMetaMap(t = $t) {
+  return {
+    1: { text: t('pages.orders.delivery.status.normal'), type: 'success', bool: true },
+    0: { text: t('pages.orders.delivery.status.disabled'), type: 'danger', bool: false }
+  }
 }
 
-const DELIVERY_EXCE_STATUS_META = {
-  0: { text: $t('pages.orders.delivery.status.pending'), type: 'info' },
-  1: { text: $t('pages.orders.delivery.status.running'), type: 'warning' },
-  2: { text: $t('pages.orders.delivery.status.partial'), type: 'primary' },
-  3: { text: $t('pages.orders.delivery.status.completed'), type: 'success' }
+function getDeliveryExceStatusMetaMap(t = $t) {
+  return {
+    0: { text: t('pages.orders.delivery.status.pending'), type: 'info' },
+    1: { text: t('pages.orders.delivery.status.running'), type: 'warning' },
+    2: { text: t('pages.orders.delivery.status.partial'), type: 'primary' },
+    3: { text: t('pages.orders.delivery.status.completed'), type: 'success' }
+  }
 }
 
-export const DELIVERY_REPORT_TITLE = $t('pages.orders.delivery.reportTitle')
+export function getDeliveryReportTitle(t = $t) {
+  return t('pages.orders.delivery.reportTitle')
+}
 export const DELIVERY_REPORT_STYLE = {
   titleAlign: 'center',
   titleLevel: 'strong',
@@ -33,26 +39,28 @@
   return Number.isNaN(parsed) ? fallback : parsed
 }
 
-function normalizeStatusMeta(status) {
+function normalizeStatusMeta(status, t = $t) {
+  const deliveryStatusMeta = getDeliveryStatusMetaMap(t)
   if (status === true || Number(status) === 1) {
-    return DELIVERY_STATUS_META[1]
+    return deliveryStatusMeta[1]
   }
   if (status === false || Number(status) === 0) {
-    return DELIVERY_STATUS_META[0]
+    return deliveryStatusMeta[0]
   }
-  return { text: $t('common.status.unknown'), type: 'info', bool: false }
+  return { text: t('common.status.unknown'), type: 'info', bool: false }
 }
 
-function normalizeExceStatusMeta(exceStatus, exceStatusText) {
+function normalizeExceStatusMeta(exceStatus, exceStatusText, t = $t) {
+  const deliveryExceStatusMeta = getDeliveryExceStatusMetaMap(t)
   if (exceStatusText) {
     const numericValue = Number(exceStatus)
-    const fallback = DELIVERY_EXCE_STATUS_META[numericValue] || {
+    const fallback = deliveryExceStatusMeta[numericValue] || {
       text: exceStatusText,
       type: 'info'
     }
     return fallback
   }
-  return DELIVERY_EXCE_STATUS_META[Number(exceStatus)] || {
+  return deliveryExceStatusMeta[Number(exceStatus)] || {
     text: normalizeText(exceStatus) || '--',
     type: 'info'
   }
@@ -122,9 +130,9 @@
   }
 }
 
-export function normalizeDeliveryRow(record = {}) {
-  const statusMeta = normalizeStatusMeta(record.statusBool ?? record.status)
-  const exceStatusMeta = normalizeExceStatusMeta(record.exceStatus, record['exceStatus$'] || record.exceStatusText)
+export function normalizeDeliveryRow(record = {}, t = $t) {
+  const statusMeta = normalizeStatusMeta(record.statusBool ?? record.status, t)
+  const exceStatusMeta = normalizeExceStatusMeta(record.exceStatus, record['exceStatus$'] || record.exceStatusText, t)
   return {
     ...record,
     id: record.id ?? null,
@@ -152,7 +160,8 @@
   }
 }
 
-export function normalizeDeliveryItemRow(record = {}) {
+export function normalizeDeliveryItemRow(record = {}, t = $t) {
+  const statusMeta = normalizeStatusMeta(record.statusBool ?? record.status, t)
   return {
     ...record,
     id: record.id ?? null,
@@ -179,12 +188,12 @@
     trackCode: normalizeText(record.trackCode) || '--',
     packName: normalizeText(record.packName) || '--',
     prodTimeText: normalizeText(record['prodTime$'] || record.prodTimeText || record.prodTime) || '--',
-    statusText: normalizeStatusMeta(record.statusBool ?? record.status).text,
-    statusType: normalizeStatusMeta(record.statusBool ?? record.status).type,
+    statusText: statusMeta.text,
+    statusType: statusMeta.type,
     statusBool:
       record.statusBool !== void 0
         ? Boolean(record.statusBool)
-        : normalizeStatusMeta(record.statusBool ?? record.status).bool,
+        : statusMeta.bool,
     createByText: normalizeText(record['createBy$'] || record.createByText) || '--',
     createTimeText: normalizeText(record['createTime$'] || record.createTimeText || record.createTime) || '--',
     updateByText: normalizeText(record['updateBy$'] || record.updateByText) || '--',
@@ -193,27 +202,28 @@
   }
 }
 
-export function buildDeliveryPrintRows(records = []) {
+export function buildDeliveryPrintRows(records = [], t = $t) {
   if (!Array.isArray(records)) {
     return []
   }
-  return records.map((record) => normalizeDeliveryRow(record))
+  return records.map((record) => normalizeDeliveryRow(record, t))
 }
 
-export function buildDeliveryItemPrintRows(records = []) {
+export function buildDeliveryItemPrintRows(records = [], t = $t) {
   if (!Array.isArray(records)) {
     return []
   }
-  return records.map((record) => normalizeDeliveryItemRow(record))
+  return records.map((record) => normalizeDeliveryItemRow(record, t))
 }
 
 export function buildDeliveryReportMeta({
   previewMeta = {},
   count = 0,
-  orientation = DELIVERY_REPORT_STYLE.orientation
+  orientation = DELIVERY_REPORT_STYLE.orientation,
+  t = $t
 } = {}) {
   return {
-    reportTitle: DELIVERY_REPORT_TITLE,
+    reportTitle: getDeliveryReportTitle(t),
     reportDate: previewMeta.reportDate,
     printedAt: previewMeta.printedAt,
     operator: previewMeta.operator,
@@ -228,10 +238,11 @@
 export function buildDeliveryItemReportMeta({
   previewMeta = {},
   count = 0,
-  orientation = DELIVERY_REPORT_STYLE.orientation
+  orientation = DELIVERY_REPORT_STYLE.orientation,
+  t = $t
 } = {}) {
   return {
-    reportTitle: $t('pages.orders.delivery.detailReportTitle'),
+    reportTitle: t('pages.orders.delivery.detailReportTitle'),
     reportDate: previewMeta.reportDate,
     printedAt: previewMeta.printedAt,
     operator: previewMeta.operator,
diff --git a/rsf-design/src/views/orders/delivery/index.vue b/rsf-design/src/views/orders/delivery/index.vue
index ef9ee74..f679705 100644
--- a/rsf-design/src/views/orders/delivery/index.vue
+++ b/rsf-design/src/views/orders/delivery/index.vue
@@ -71,6 +71,7 @@
     buildDeliveryReportMeta,
     buildDeliverySearchParams,
     createDeliverySearchState,
+    getDeliveryReportTitle,
     getDeliveryPaginationKey,
     normalizeDeliveryItemRow,
     normalizeDeliveryRow
@@ -91,7 +92,7 @@
   const userStore = useUserStore()
   const router = useRouter()
   const { t } = useI18n()
-  const reportTitle = t('pages.orders.delivery.reportTitle')
+  const reportTitle = computed(() => getDeliveryReportTitle(t))
   const searchForm = ref(createDeliverySearchState())
   const selectedRows = ref([])
   const detailDrawerVisible = ref(false)
@@ -207,7 +208,7 @@
         { timeoutMessage: t('pages.orders.delivery.messages.itemsTimeout') }
       )
       const normalizedResponse = defaultResponseAdapter(response)
-      detailItemRows.value = normalizedResponse.records.map((item) => normalizeDeliveryItemRow(item))
+      detailItemRows.value = normalizedResponse.records.map((item) => normalizeDeliveryItemRow(item, t))
       detailItemPagination.total = Number(normalizedResponse.total || 0)
       detailItemPagination.current = Number(normalizedResponse.current || detailItemPagination.current || 1)
       detailItemPagination.size = Number(normalizedResponse.size || detailItemPagination.size || 20)
@@ -224,7 +225,7 @@
         {},
         { timeoutMessage: t('pages.orders.delivery.messages.detailTimeout') }
       )
-      detailData.value = normalizeDeliveryRow(detail)
+      detailData.value = normalizeDeliveryRow(detail, t)
     } finally {
       detailLoading.value = false
     }
@@ -319,7 +320,7 @@
       columnsFactory: () => createDeliveryTableColumns({ handleActionClick: handleTableActionClick })
     },
     transform: {
-      dataTransformer: (records) => (Array.isArray(records) ? records.map((item) => normalizeDeliveryRow(item)) : [])
+      dataTransformer: (records) => (Array.isArray(records) ? records.map((item) => normalizeDeliveryRow(item, t)) : [])
     }
   })
 
@@ -369,11 +370,11 @@
         }
       ),
     resolvePrintRecords,
-    buildPreviewRows: (records) => buildDeliveryPrintRows(records),
+    buildPreviewRows: (records) => buildDeliveryPrintRows(records, t),
     buildPreviewMeta: (rows) => {
       const now = new Date()
       return {
-        reportTitle,
+        reportTitle: reportTitle.value,
         reportDate: now.toLocaleDateString('zh-CN'),
         printedAt: now.toLocaleString('zh-CN', { hour12: false }),
         operator: userStore.getUserInfo?.name || userStore.getUserInfo?.username || '',
@@ -393,7 +394,8 @@
     buildDeliveryReportMeta({
       previewMeta: rawPreviewMeta.value,
       count: previewRows.value.length,
-      orientation: rawPreviewMeta.value?.reportStyle?.orientation || 'landscape'
+      orientation: rawPreviewMeta.value?.reportStyle?.orientation || 'landscape',
+      t
     })
   )
 
diff --git a/rsf-design/src/views/orders/out-stock-item/index.vue b/rsf-design/src/views/orders/out-stock-item/index.vue
index 03c29d0..555e0ae 100644
--- a/rsf-design/src/views/orders/out-stock-item/index.vue
+++ b/rsf-design/src/views/orders/out-stock-item/index.vue
@@ -3,10 +3,10 @@
     <ElCard v-if="activeSourceSummary" class="mb-3">
       <div class="flex items-center justify-between gap-3">
         <div class="flex items-center gap-2 text-sm text-[var(--art-text-gray-600)]">
-          <span class="font-medium text-[var(--art-text-gray-900)]">褰撳墠鏉ユ簮</span>
-          <span>鍑哄簱鍗旾D锛歿{ activeSourceSummary.orderId }}</span>
+          <span class="font-medium text-[var(--art-text-gray-900)]">{{ t('pages.orders.outStockItem.sourceSummary.title') }}</span>
+          <span>{{ t('pages.orders.outStockItem.sourceSummary.orderId', { id: activeSourceSummary.orderId }) }}</span>
         </div>
-        <ElButton link type="primary" @click="handleClearSourceFilter">鏌ョ湅鍏ㄩ儴</ElButton>
+        <ElButton link type="primary" @click="handleClearSourceFilter">{{ t('common.actions.viewAll') }}</ElButton>
       </div>
     </ElCard>
 
@@ -43,6 +43,7 @@
   import { computed, onMounted, ref, watch } from 'vue'
   import { ElButton, ElMessage } from 'element-plus'
   import { useRoute, useRouter } from 'vue-router'
+  import { useI18n } from 'vue-i18n'
   import { useTable } from '@/hooks/core/useTable'
   import { guardRequestWithMessage } from '@/utils/sys/requestGuard'
   import { fetchGetOutStockItemDetail, fetchOutStockItemPage } from '@/api/out-stock-item'
@@ -55,6 +56,7 @@
   } from './outStockItemPage.helpers.js'
 
   defineOptions({ name: 'OutStockItem' })
+  const { t } = useI18n()
 
   const route = useRoute()
   const router = useRouter()
@@ -77,104 +79,105 @@
 
   const searchItems = computed(() => [
     {
-      label: '鍏抽敭瀛�',
+      label: t('pages.orders.outStockItem.search.condition'),
       key: 'condition',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ュ嚭搴撳崟鍙�/鐗╂枡缂栫爜/鐗╂枡鍚嶇О'
+        placeholder: t('pages.orders.outStockItem.search.conditionPlaceholder')
       }
     },
     {
-      label: '鍑哄簱鍗曞彿',
+      label: t('pages.orders.outStockItem.search.orderCode'),
       key: 'orderCode',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ュ嚭搴撳崟鍙�'
+        placeholder: t('pages.orders.outStockItem.search.orderCodePlaceholder')
       }
     },
     {
-      label: 'PO鍗曞彿',
+      label: t('pages.orders.outStockItem.search.poCode'),
       key: 'poCode',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏O鍗曞彿'
+        placeholder: t('pages.orders.outStockItem.search.poCodePlaceholder')
       }
     },
     {
-      label: '骞冲彴琛屽彿',
+      label: t('pages.orders.outStockItem.search.platItemId'),
       key: 'platItemId',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ュ钩鍙拌鍙�'
+        placeholder: t('pages.orders.outStockItem.search.platItemIdPlaceholder')
       }
     },
     {
-      label: '鐗╂枡缂栫爜',
+      label: t('pages.orders.outStockItem.search.matnrCode'),
       key: 'matnrCode',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ョ墿鏂欑紪鐮�'
+        placeholder: t('pages.orders.outStockItem.search.matnrCodePlaceholder')
       }
     },
     {
-      label: '鐗╂枡鍚嶇О',
+      label: t('pages.orders.outStockItem.search.maktx'),
       key: 'maktx',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ョ墿鏂欏悕绉�'
+        placeholder: t('pages.orders.outStockItem.search.maktxPlaceholder')
       }
     },
     {
-      label: '鎵规',
+      label: t('pages.orders.outStockItem.search.batch'),
       key: 'batch',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ユ壒娆�'
+        placeholder: t('pages.orders.outStockItem.search.batchPlaceholder')
       }
     },
     {
-      label: '渚涘簲鍟嗘壒娆�',
+      label: t('pages.orders.outStockItem.search.splrBatch'),
       key: 'splrBatch',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ヤ緵搴斿晢鎵规'
+        placeholder: t('pages.orders.outStockItem.search.splrBatchPlaceholder')
       }
     },
     {
-      label: '鏉″舰鐮�',
+      label: t('pages.orders.outStockItem.search.barcode'),
       key: 'barcode',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ユ潯褰㈢爜'
+        placeholder: t('pages.orders.outStockItem.search.barcodePlaceholder')
       }
     },
     {
-      label: '瀛楁绱㈠紩',
+      label: t('pages.orders.outStockItem.search.fieldsIndex'),
       key: 'fieldsIndex',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ュ瓧娈电储寮�'
+        placeholder: t('pages.orders.outStockItem.search.fieldsIndexPlaceholder')
       }
     },
     {
-      label: '鐘舵��',
+      label: t('pages.orders.outStockItem.search.status'),
       key: 'status',
       type: 'select',
       props: {
         clearable: true,
+        placeholder: t('pages.orders.outStockItem.search.statusPlaceholder'),
         options: [
-          { label: '姝e父', value: 1 },
-          { label: '鍐荤粨', value: 0 }
+          { label: t('common.status.normal'), value: 1 },
+          { label: t('common.status.frozen'), value: 0 }
         ]
       }
     }
@@ -184,15 +187,15 @@
     detailDrawerVisible.value = true
     detailLoading.value = true
     guardRequestWithMessage(fetchGetOutStockItemDetail(row.id), {}, {
-      timeoutMessage: '鍑哄簱鍗曟槑缁嗚鎯呭姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�'
+      timeoutMessage: t('pages.orders.outStockItem.messages.detailTimeout')
     })
       .then((detail) => {
-        detailData.value = normalizeOutStockItemRow(detail)
+        detailData.value = normalizeOutStockItemRow(detail, t)
       })
       .catch((error) => {
         detailDrawerVisible.value = false
         detailData.value = {}
-        ElMessage.error(error?.message || '鑾峰彇鍑哄簱鍗曟槑缁嗚鎯呭け璐�')
+        ElMessage.error(error?.message || t('pages.orders.outStockItem.messages.detailFailed'))
       })
       .finally(() => {
         detailLoading.value = false
@@ -218,11 +221,11 @@
         ...searchForm.value,
         pageSize: 20
       }),
-      columnsFactory: () => createOutStockItemTableColumns({ handleActionClick: openDetail })
+      columnsFactory: () => createOutStockItemTableColumns({ handleActionClick: openDetail, t })
     },
     transform: {
       dataTransformer: (records) =>
-        Array.isArray(records) ? records.map((item) => normalizeOutStockItemRow(item)) : []
+        Array.isArray(records) ? records.map((item) => normalizeOutStockItemRow(item, t)) : []
     }
   })
 
diff --git a/rsf-design/src/views/orders/out-stock-item/modules/out-stock-item-detail-drawer.vue b/rsf-design/src/views/orders/out-stock-item/modules/out-stock-item-detail-drawer.vue
index 4829125..571f720 100644
--- a/rsf-design/src/views/orders/out-stock-item/modules/out-stock-item-detail-drawer.vue
+++ b/rsf-design/src/views/orders/out-stock-item/modules/out-stock-item-detail-drawer.vue
@@ -1,7 +1,7 @@
 <template>
   <ElDrawer
     :model-value="visible"
-    title="鍑哄簱鍗曟槑缁嗚鎯�"
+    :title="t('pages.orders.outStockItem.detail.title')"
     size="80%"
     destroy-on-close
     append-to-body
@@ -11,49 +11,49 @@
       <ElSkeleton :loading="loading" animated :rows="10">
         <div class="flex min-h-full flex-col gap-4 pr-2">
           <ElDescriptions :column="3" border>
-            <ElDescriptionsItem label="鍑哄簱鍗曞彿">{{ detail.orderCode || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="PO鍗曞彿">{{ detail.poCode || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="骞冲彴琛屽彿">{{ detail.platItemId || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="骞冲彴璁㈠崟鍙�">{{ detail.platOrderCode || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="骞冲彴宸ュ崟鍙�">{{ detail.platWorkCode || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="椤圭洰鍙�">{{ detail.projectCode || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="鐗╂枡缂栫爜">{{ detail.matnrCode || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="鐗╂枡鍚嶇О">{{ detail.maktx || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="瑙勬牸">{{ detail.spec || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="鍨嬪彿">{{ detail.model || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="鎵规">{{ detail.batch || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="渚涘簲鍟嗘壒娆�">{{ detail.splrBatch || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="搴撳瓨鍗曚綅">{{ detail.stockUnit || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="閲囪喘鍗曚綅">{{ detail.purUnit || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="鍩烘湰鍗曚綅">{{ detail.baseUnit || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="瀛楁绱㈠紩">{{ detail.fieldsIndex || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="鏉″舰鐮�">{{ detail.barcode || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="浜岀淮鐮�">{{ detail.qrcode || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="鍖呰鍚嶇О">{{ detail.packName || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="鐘舵��">
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.orderCode')">{{ detail.orderCode || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.poCode')">{{ detail.poCode || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.platItemId')">{{ detail.platItemId || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.platOrderCode')">{{ detail.platOrderCode || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.platWorkCode')">{{ detail.platWorkCode || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.projectCode')">{{ detail.projectCode || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.matnrCode')">{{ detail.matnrCode || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.maktx')">{{ detail.maktx || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.spec')">{{ detail.spec || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.model')">{{ detail.model || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.batch')">{{ detail.batch || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.splrBatch')">{{ detail.splrBatch || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.stockUnit')">{{ detail.stockUnit || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.purUnit')">{{ detail.purUnit || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.baseUnit')">{{ detail.baseUnit || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.fieldsIndex')">{{ detail.fieldsIndex || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.barcode')">{{ detail.barcode || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.qrcode')">{{ detail.qrcode || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.packName')">{{ detail.packName || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.status')">
               <ElTag :type="detail.statusTagType || 'info'" effect="light">
                 {{ detail.statusText || '--' }}
               </ElTag>
             </ElDescriptionsItem>
-            <ElDescriptionsItem label="鏁伴噺">{{ detail.anfme ?? '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="鎵ц鏁伴噺">{{ detail.workQty ?? '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="宸插嚭鏁伴噺">{{ detail.qty ?? '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="閲囪喘鏁伴噺">{{ detail.purQty ?? '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="闇�姹傛暟閲�">{{ detail.demandQty ?? '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="渚涘簲鍟嗙紪鐮�">{{ detail.splrCode || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="渚涘簲鍟嗗悕绉�">{{ detail.splrName || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="鏉ユ簮浠撳簱">{{ detail.sourceWarehouseId || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="鐩爣浠撳簱">{{ detail.targetWarehouseId || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="璐т富">{{ detail.ownerName || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="淇濈鑰�">{{ detail.keeperName || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="澶囨敞" :span="3">{{ detail.memo || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.anfme')">{{ detail.anfme ?? '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.workQty')">{{ detail.workQty ?? '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.qty')">{{ detail.qty ?? '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.purQty')">{{ detail.purQty ?? '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.demandQty')">{{ detail.demandQty ?? '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.splrCode')">{{ detail.splrCode || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.splrName')">{{ detail.splrName || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.sourceWarehouseId')">{{ detail.sourceWarehouseId || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.targetWarehouseId')">{{ detail.targetWarehouseId || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.ownerName')">{{ detail.ownerName || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.keeperName')">{{ detail.keeperName || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.memo')" :span="3">{{ detail.memo || '--' }}</ElDescriptionsItem>
           </ElDescriptions>
 
           <ElDescriptions :column="2" border>
-            <ElDescriptionsItem label="鍒涘缓浜�">{{ detail.createByText || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="淇敼浜�">{{ detail.updateByText || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="淇敼鏃堕棿">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.createBy')">{{ detail.createByText || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.createTime')">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.updateBy')">{{ detail.updateByText || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStockItem.detail.updateTime')">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
           </ElDescriptions>
         </div>
       </ElSkeleton>
@@ -62,6 +62,7 @@
 </template>
 
 <script setup>
+  import { useI18n } from 'vue-i18n'
   defineOptions({ name: 'OutStockItemDetailDrawer' })
 
   const props = defineProps({
@@ -80,6 +81,7 @@
   })
 
   const emit = defineEmits(['update:visible'])
+  const { t } = useI18n()
 
   function handleVisibleChange(visible) {
     emit('update:visible', visible)
diff --git a/rsf-design/src/views/orders/out-stock-item/outStockItemPage.helpers.js b/rsf-design/src/views/orders/out-stock-item/outStockItemPage.helpers.js
index 7f92e10..123681d 100644
--- a/rsf-design/src/views/orders/out-stock-item/outStockItemPage.helpers.js
+++ b/rsf-design/src/views/orders/out-stock-item/outStockItemPage.helpers.js
@@ -1,6 +1,10 @@
 const STATUS_META = {
-  1: { text: '姝e父', type: 'success' },
-  0: { text: '鍐荤粨', type: 'danger' }
+  1: { key: 'common.status.normal', type: 'success' },
+  0: { key: 'common.status.frozen', type: 'danger' }
+}
+
+function translate(t, key) {
+  return typeof t === 'function' ? t(key) : key
 }
 
 function normalizeText(value, fallback = '--') {
@@ -32,9 +36,16 @@
   }
 }
 
-function getStatusMeta(status, statusText) {
+function getStatusMeta(status, statusText, t) {
   const numericStatus = Number(status)
-  return STATUS_META[numericStatus] || {
+  const meta = STATUS_META[numericStatus]
+  if (meta) {
+    return {
+      text: translate(t, meta.key),
+      type: meta.type
+    }
+  }
+  return {
     text: normalizeText(statusText || status, '--'),
     type: 'info'
   }
@@ -89,8 +100,8 @@
   }
 }
 
-export function normalizeOutStockItemRow(record = {}) {
-  const statusMeta = getStatusMeta(record.status, record['status$'])
+export function normalizeOutStockItemRow(record = {}, t) {
+  const statusMeta = getStatusMeta(record.status, record['status$'], t)
 
   return {
     ...record,
diff --git a/rsf-design/src/views/orders/out-stock-item/outStockItemTable.columns.js b/rsf-design/src/views/orders/out-stock-item/outStockItemTable.columns.js
index d12747b..c5ca70f 100644
--- a/rsf-design/src/views/orders/out-stock-item/outStockItemTable.columns.js
+++ b/rsf-design/src/views/orders/out-stock-item/outStockItemTable.columns.js
@@ -2,96 +2,96 @@
 import { ElTag } from 'element-plus'
 import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
 
-export function createOutStockItemTableColumns({ handleActionClick } = {}) {
+export function createOutStockItemTableColumns({ handleActionClick, t } = {}) {
   return [
-    { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+    { type: 'globalIndex', label: t('table.index'), width: 72, align: 'center' },
     {
       prop: 'orderCode',
-      label: '鍑哄簱鍗曞彿',
+      label: t('pages.orders.outStockItem.table.orderCode'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.orderCode || '--'
     },
     {
       prop: 'poCode',
-      label: 'PO鍗曞彿',
+      label: t('pages.orders.outStockItem.table.poCode'),
       minWidth: 150,
       showOverflowTooltip: true,
       formatter: (row) => row.poCode || '--'
     },
     {
       prop: 'platItemId',
-      label: '骞冲彴琛屽彿',
+      label: t('pages.orders.outStockItem.table.platItemId'),
       minWidth: 120,
       showOverflowTooltip: true,
       formatter: (row) => row.platItemId || '--'
     },
     {
       prop: 'matnrCode',
-      label: '鐗╂枡缂栫爜',
+      label: t('pages.orders.outStockItem.table.matnrCode'),
       minWidth: 150,
       showOverflowTooltip: true,
       formatter: (row) => row.matnrCode || '--'
     },
     {
       prop: 'maktx',
-      label: '鐗╂枡鍚嶇О',
+      label: t('pages.orders.outStockItem.table.maktx'),
       minWidth: 220,
       showOverflowTooltip: true,
       formatter: (row) => row.maktx || '--'
     },
     {
       prop: 'batch',
-      label: '鎵规',
+      label: t('pages.orders.outStockItem.table.batch'),
       minWidth: 120,
       showOverflowTooltip: true,
       formatter: (row) => row.batch || '--'
     },
     {
       prop: 'splrBatch',
-      label: '渚涘簲鍟嗘壒娆�',
+      label: t('pages.orders.outStockItem.table.splrBatch'),
       minWidth: 140,
       showOverflowTooltip: true,
       formatter: (row) => row.splrBatch || '--'
     },
     {
       prop: 'stockUnit',
-      label: '搴撳瓨鍗曚綅',
+      label: t('pages.orders.outStockItem.table.stockUnit'),
       width: 100,
       align: 'center',
       formatter: (row) => row.stockUnit || '--'
     },
     {
       prop: 'anfme',
-      label: '鏁伴噺',
+      label: t('pages.orders.outStockItem.table.anfme'),
       width: 100,
       align: 'right',
       formatter: (row) => row.anfme ?? '--'
     },
     {
       prop: 'workQty',
-      label: '鎵ц鏁伴噺',
+      label: t('pages.orders.outStockItem.table.workQty'),
       width: 100,
       align: 'right',
       formatter: (row) => row.workQty ?? '--'
     },
     {
       prop: 'qty',
-      label: '宸插嚭鏁伴噺',
+      label: t('pages.orders.outStockItem.table.qty'),
       width: 100,
       align: 'right',
       formatter: (row) => row.qty ?? '--'
     },
     {
       prop: 'fieldsIndex',
-      label: '瀛楁绱㈠紩',
+      label: t('pages.orders.outStockItem.table.fieldsIndex'),
       minWidth: 150,
       showOverflowTooltip: true,
       formatter: (row) => row.fieldsIndex || '--'
     },
     {
       prop: 'statusText',
-      label: '鐘舵��',
+      label: t('pages.orders.outStockItem.table.status'),
       width: 96,
       align: 'center',
       formatter: (row) =>
@@ -99,14 +99,14 @@
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: t('pages.orders.outStockItem.table.updateTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.updateTimeText || '--'
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: t('table.operation'),
       width: 92,
       fixed: 'right',
       formatter: (row) =>
diff --git a/rsf-design/src/views/orders/out-stock/index.vue b/rsf-design/src/views/orders/out-stock/index.vue
index ab3fd34..c3d5018 100644
--- a/rsf-design/src/views/orders/out-stock/index.vue
+++ b/rsf-design/src/views/orders/out-stock/index.vue
@@ -58,6 +58,7 @@
   import { computed, reactive, ref } from 'vue'
   import { ElMessage, ElMessageBox } from 'element-plus'
   import { useRouter } from 'vue-router'
+  import { useI18n } from 'vue-i18n'
   import { useUserStore } from '@/store/modules/user'
   import { useTable } from '@/hooks/core/useTable'
   import { usePrintExportPage } from '@/views/system/common/usePrintExportPage'
@@ -76,13 +77,13 @@
   } from '@/api/out-stock'
   import OutStockDetailDrawer from './modules/out-stock-detail-drawer.vue'
   import {
-    OUT_STOCK_REPORT_TITLE,
     OUT_STOCK_REPORT_STYLE,
     buildOutStockPageQueryParams,
     buildOutStockPrintRows,
     buildOutStockReportMeta,
     buildOutStockSearchParams,
     createOutStockSearchState,
+    getOutStockReportTitle,
     normalizeOutStockRow
   } from './outStockPage.helpers'
   import { createOutStockTableColumns } from './outStockTable.columns'
@@ -90,10 +91,11 @@
   import { normalizeOutStockItemRow } from '../out-stock-item/outStockItemPage.helpers.js'
 
   defineOptions({ name: 'OutStock' })
+  const { t } = useI18n()
 
   const userStore = useUserStore()
   const router = useRouter()
-  const reportTitle = OUT_STOCK_REPORT_TITLE
+  const reportTitle = computed(() => getOutStockReportTitle(t))
   const searchForm = ref(createOutStockSearchState())
   const selectedRows = ref([])
   const detailDrawerVisible = ref(false)
@@ -108,60 +110,98 @@
     total: 0
   })
   const detailItemColumns = computed(() =>
-    createOutStockItemTableColumns().filter((column) => column.prop !== 'operation')
+    createOutStockItemTableColumns({ t }).filter((column) => column.prop !== 'operation')
   )
 
   const reportQueryParams = computed(() => buildOutStockSearchParams(searchForm.value))
   const searchItems = computed(() => [
-    { label: '鍏抽敭瀛�', key: 'condition', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ュ嚭搴撳崟鍙�/PO鍗曞彿/瀹㈡埛' } },
-    { label: '鍑哄簱鍗曞彿', key: 'code', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ュ嚭搴撳崟鍙�' } },
-    { label: 'PO鍗曞彿', key: 'poCode', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏O鍗曞彿' } },
     {
-      label: '涓氬姟绫诲瀷',
+      label: t('pages.orders.outStock.search.condition'),
+      key: 'condition',
+      type: 'input',
+      props: { clearable: true, placeholder: t('pages.orders.outStock.search.conditionPlaceholder') }
+    },
+    {
+      label: t('pages.orders.outStock.search.code'),
+      key: 'code',
+      type: 'input',
+      props: { clearable: true, placeholder: t('pages.orders.outStock.search.codePlaceholder') }
+    },
+    {
+      label: t('pages.orders.outStock.search.poCode'),
+      key: 'poCode',
+      type: 'input',
+      props: { clearable: true, placeholder: t('pages.orders.outStock.search.poCodePlaceholder') }
+    },
+    {
+      label: t('pages.orders.outStock.search.wkType'),
       key: 'wkType',
       type: 'select',
       props: {
         clearable: true,
+        placeholder: t('pages.orders.outStock.search.wkTypePlaceholder'),
         options: [
-          { label: '閿�鍞嚭搴撳崟', value: 'sales_out' },
-          { label: '璋冩嫧鍑哄簱鍗�', value: 'transfer_out' },
-          { label: '搴撳瓨鍑哄簱鍗�', value: 'stock_out' },
-          { label: '澶囪揣鍑哄簱鍗�', value: 'pre_out' }
+          { label: t('pages.orders.outStock.businessType.salesOut'), value: 'sales_out' },
+          { label: t('pages.orders.outStock.businessType.transferOut'), value: 'transfer_out' },
+          { label: t('pages.orders.outStock.businessType.stockOut'), value: 'stock_out' },
+          { label: t('pages.orders.outStock.businessType.preOut'), value: 'pre_out' }
         ]
       }
     },
     {
-      label: '鍗曟嵁鐘舵��',
+      label: t('pages.orders.outStock.search.exceStatus'),
       key: 'exceStatus',
       type: 'select',
       props: {
         clearable: true,
+        placeholder: t('pages.orders.outStock.search.exceStatusPlaceholder'),
         options: [
-          { label: '鍒濆鍖�', value: 10 },
-          { label: '寰呭鐞�', value: 11 },
-          { label: '鐢熸垚宸ヤ綔妗�', value: 13 },
-          { label: '浣滀笟涓�', value: 14 },
-          { label: '宸插畬鎴�', value: 15 },
-          { label: '鍙栨秷', value: 8 }
+          { label: t('pages.orders.outStock.status.initialized'), value: 10 },
+          { label: t('pages.orders.outStock.status.pending'), value: 11 },
+          { label: t('pages.orders.outStock.status.generated'), value: 13 },
+          { label: t('pages.orders.outStock.status.running'), value: 14 },
+          { label: t('pages.orders.outStock.status.completed'), value: 15 },
+          { label: t('pages.orders.outStock.status.cancelled'), value: 8 }
         ]
       }
     },
     {
-      label: '閲婃斁鐘舵��',
+      label: t('pages.orders.outStock.search.rleStatus'),
       key: 'rleStatus',
       type: 'select',
       props: {
         clearable: true,
+        placeholder: t('pages.orders.outStock.search.rleStatusPlaceholder'),
         options: [
-          { label: '姝e父', value: 0 },
-          { label: '宸查噴鏀�', value: 1 }
+          { label: t('common.status.normal'), value: 0 },
+          { label: t('pages.orders.outStock.status.released'), value: 1 }
         ]
       }
     },
-    { label: '鐗╂祦鍗曞彿', key: 'logisNo', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ョ墿娴佸崟鍙�' } },
-    { label: '瀹㈡埛鍚嶇О', key: 'customerName', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ュ鎴峰悕绉�' } },
-    { label: '閿�鍞粍缁�', key: 'saleOrgName', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ラ攢鍞粍缁�' } },
-    { label: '澶囨敞', key: 'memo', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ュ娉�' } }
+    {
+      label: t('pages.orders.outStock.search.logisNo'),
+      key: 'logisNo',
+      type: 'input',
+      props: { clearable: true, placeholder: t('pages.orders.outStock.search.logisNoPlaceholder') }
+    },
+    {
+      label: t('pages.orders.outStock.search.customerName'),
+      key: 'customerName',
+      type: 'input',
+      props: { clearable: true, placeholder: t('pages.orders.outStock.search.customerNamePlaceholder') }
+    },
+    {
+      label: t('pages.orders.outStock.search.saleOrgName'),
+      key: 'saleOrgName',
+      type: 'input',
+      props: { clearable: true, placeholder: t('pages.orders.outStock.search.saleOrgNamePlaceholder') }
+    },
+    {
+      label: t('pages.orders.outStock.search.memo'),
+      key: 'memo',
+      type: 'input',
+      props: { clearable: true, placeholder: t('pages.orders.outStock.search.memoPlaceholder') }
+    }
   ])
 
   async function loadDetailResources() {
@@ -173,7 +213,7 @@
     detailItemsLoading.value = true
     try {
       const [detailResponse, itemResponse] = await Promise.all([
-        guardRequestWithMessage(fetchGetOutStockDetail(activeOutStockId.value), {}, { timeoutMessage: '鍑哄簱鍗曡鎯呭姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�' }),
+        guardRequestWithMessage(fetchGetOutStockDetail(activeOutStockId.value), {}, { timeoutMessage: t('pages.orders.outStock.messages.detailTimeout') }),
         guardRequestWithMessage(
           fetchOutStockItemPage({
             orderId: activeOutStockId.value,
@@ -186,13 +226,13 @@
             current: detailItemPagination.current,
             size: detailItemPagination.size
           },
-          { timeoutMessage: '鍑哄簱鍗曟槑缁嗗姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�' }
+          { timeoutMessage: t('pages.orders.outStock.messages.itemsTimeout') }
         )
       ])
 
-      detailData.value = normalizeOutStockRow(detailResponse)
+      detailData.value = normalizeOutStockRow(detailResponse, t)
       const normalized = defaultResponseAdapter(itemResponse)
-      detailItemRows.value = normalized.records.map((item) => normalizeOutStockItemRow(item))
+      detailItemRows.value = normalized.records.map((item) => normalizeOutStockItemRow(item, t))
       detailItemPagination.total = Number(normalized.total || 0)
       detailItemPagination.current = Number(normalized.current || detailItemPagination.current || 1)
       detailItemPagination.size = Number(normalized.size || detailItemPagination.size || 20)
@@ -214,7 +254,7 @@
       detailDrawerVisible.value = false
       detailData.value = {}
       detailItemRows.value = []
-      ElMessage.error(error?.message || '鑾峰彇鍑哄簱鍗曡鎯呭け璐�')
+      ElMessage.error(error?.message || t('pages.orders.outStock.messages.detailLoadFailed'))
     }
   }
 
@@ -231,55 +271,62 @@
 
   async function handleComplete(row) {
     try {
-      await ElMessageBox.confirm(`纭畾瀹屾垚鍑哄簱鍗� ${row.code || ''} 鍚楋紵`, '瀹屾垚纭', {
-        confirmButtonText: '纭畾',
-        cancelButtonText: '鍙栨秷',
+      await ElMessageBox.confirm(t('pages.orders.outStock.messages.completeConfirm', { code: row.code || '' }), t('pages.orders.outStock.messages.completeTitle'), {
+        confirmButtonText: t('common.confirm'),
+        cancelButtonText: t('common.cancel'),
         type: 'warning'
       })
       await fetchCompleteOutStock(row.id)
-      ElMessage.success('瀹屾垚鎴愬姛')
+      ElMessage.success(t('pages.orders.outStock.messages.completeSuccess'))
       await refreshData()
       if (detailDrawerVisible.value && activeOutStockId.value === row.id) {
         await loadDetailResources()
       }
     } catch (error) {
       if (error === 'cancel' || error?.message === 'cancel') return
-      ElMessage.error(error?.message || '瀹屾垚澶辫触')
+      ElMessage.error(error?.message || t('pages.orders.outStock.messages.actionFailed'))
     }
   }
 
   async function handleCancel(row) {
     try {
-      await ElMessageBox.confirm(`纭畾鍙栨秷鍑哄簱鍗� ${row.code || ''} 鍚楋紵`, '鍙栨秷纭', {
-        confirmButtonText: '纭畾',
-        cancelButtonText: '鍙栨秷',
+      await ElMessageBox.confirm(t('pages.orders.outStock.messages.cancelConfirm', { code: row.code || '' }), t('pages.orders.outStock.messages.cancelTitle'), {
+        confirmButtonText: t('common.confirm'),
+        cancelButtonText: t('common.cancel'),
         type: 'warning'
       })
       await fetchCancelOutStock(row.id)
-      ElMessage.success('鍙栨秷鎴愬姛')
+      ElMessage.success(t('pages.orders.outStock.messages.cancelSuccess'))
       await refreshData()
       if (detailDrawerVisible.value && activeOutStockId.value === row.id) {
         await loadDetailResources()
       }
     } catch (error) {
       if (error === 'cancel' || error?.message === 'cancel') return
-      ElMessage.error(error?.message || '鍙栨秷澶辫触')
+      ElMessage.error(error?.message || t('pages.orders.outStock.messages.actionFailed'))
     }
   }
 
   async function handleDelete(row) {
     try {
-      await ElMessageBox.confirm(`纭畾鍒犻櫎鍑哄簱鍗� ${row.code || ''} 鍚楋紵`, '鍒犻櫎纭', {
-        confirmButtonText: '纭畾',
-        cancelButtonText: '鍙栨秷',
-        type: 'warning'
-      })
+      await ElMessageBox.confirm(
+        t('crud.confirm.deleteMessage', {
+          entity: t('pages.orders.outStock.entity'),
+          label: row.code || ''
+        }),
+        t('crud.confirm.deleteTitle'),
+        {
+          confirmButtonText: t('common.confirm'),
+          cancelButtonText: t('common.cancel'),
+          type: 'warning'
+        }
+      )
       await fetchDeleteOutStock(row.id)
-      ElMessage.success('鍒犻櫎鎴愬姛')
+      ElMessage.success(t('crud.messages.deleteSuccess'))
       await refreshData()
     } catch (error) {
       if (error === 'cancel' || error?.message === 'cancel') return
-      ElMessage.error(error?.message || '鍒犻櫎澶辫触')
+      ElMessage.error(error?.message || t('crud.messages.deleteFailed'))
     }
   }
 
@@ -331,10 +378,11 @@
     core: {
       apiFn: fetchOutStockPage,
       apiParams: buildOutStockPageQueryParams(searchForm.value),
-      columnsFactory: () => createOutStockTableColumns({ handleActionClick })
+      columnsFactory: () => createOutStockTableColumns({ handleActionClick, t })
     },
     transform: {
-      dataTransformer: (records) => (Array.isArray(records) ? records.map((item) => normalizeOutStockRow(item)) : [])
+      dataTransformer: (records) =>
+        Array.isArray(records) ? records.map((item) => normalizeOutStockRow(item, t)) : []
     }
   })
 
@@ -361,11 +409,11 @@
           }
         }),
       resolvePrintRecords,
-      buildPreviewRows: (records) => buildOutStockPrintRows(records),
+      buildPreviewRows: (records) => buildOutStockPrintRows(records, t),
       buildPreviewMeta: (rows) => {
         const now = new Date()
         return {
-          reportTitle,
+          reportTitle: reportTitle.value,
           reportDate: now.toLocaleDateString('zh-CN'),
           printedAt: now.toLocaleString('zh-CN', { hour12: false }),
           operator: userStore.getUserInfo?.name || userStore.getUserInfo?.username || '',
@@ -379,7 +427,8 @@
     buildOutStockReportMeta({
       previewMeta: rawPreviewMeta.value,
       count: previewRows.value.length,
-      orientation: rawPreviewMeta.value?.reportStyle?.orientation || OUT_STOCK_REPORT_STYLE.orientation
+      orientation: rawPreviewMeta.value?.reportStyle?.orientation || OUT_STOCK_REPORT_STYLE.orientation,
+      t
     })
   )
 
diff --git a/rsf-design/src/views/orders/out-stock/modules/out-stock-detail-drawer.vue b/rsf-design/src/views/orders/out-stock/modules/out-stock-detail-drawer.vue
index 98a20e1..3fe0c0c 100644
--- a/rsf-design/src/views/orders/out-stock/modules/out-stock-detail-drawer.vue
+++ b/rsf-design/src/views/orders/out-stock/modules/out-stock-detail-drawer.vue
@@ -1,7 +1,7 @@
 <template>
   <ElDrawer
     v-model="visibleProxy"
-    :title="'鍑哄簱鍗曡鎯�'"
+    :title="t('pages.orders.outStock.detail.title')"
     size="1180px"
     destroy-on-close
     append-to-body
@@ -9,43 +9,43 @@
     <ElScrollbar class="h-[calc(100vh-180px)] pr-1">
       <ElSkeleton :loading="loading" animated :rows="8">
         <div class="space-y-4">
-          <ElDescriptions title="鍩虹淇℃伅" :column="2" border>
-            <ElDescriptionsItem label="鍑哄簱鍗曞彿">{{ detail.code || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="PO鍗曞彿">{{ detail.poCode || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="鍗曟嵁绫诲瀷">{{ detail.typeLabel || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="涓氬姟绫诲瀷">{{ detail.wkTypeLabel || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="鍗曟嵁鐘舵��">
+          <ElDescriptions :title="t('pages.orders.outStock.detail.baseInfo')" :column="2" border>
+            <ElDescriptionsItem :label="t('pages.orders.outStock.detail.code')">{{ detail.code || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStock.detail.poCode')">{{ detail.poCode || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStock.detail.type')">{{ detail.typeLabel || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStock.detail.wkType')">{{ detail.wkTypeLabel || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStock.detail.exceStatus')">
               <ElTag :type="detail.exceStatusTagType || 'info'">{{ detail.exceStatusText || '--' }}</ElTag>
             </ElDescriptionsItem>
-            <ElDescriptionsItem label="閲婃斁鐘舵��">
+            <ElDescriptionsItem :label="t('pages.orders.outStock.detail.rleStatus')">
               <ElTag :type="detail.rleStatusTagType || 'info'">{{ detail.rleStatusText || '--' }}</ElTag>
             </ElDescriptionsItem>
-            <ElDescriptionsItem label="鐗╂祦鍗曞彿">{{ detail.logisNo || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="涓氬姟鏃堕棿">{{ detail.businessTimeText || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="閿�鍞粍缁�">{{ detail.saleOrgName || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="閿�鍞憳">{{ detail.saleUserName || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="瀹㈡埛缂栫爜">{{ detail.customerId || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="瀹㈡埛鍚嶇О">{{ detail.customerName || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="浠撳簱缁勭粐">{{ detail.stockOrgName || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="搴斿嚭鏁伴噺">{{ detail.anfme ?? '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="鎵ц鏁伴噺">{{ detail.workQty ?? '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="宸插嚭鏁伴噺">{{ detail.qty ?? '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="澶囨敞" :span="2">{{ detail.memo || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStock.detail.logisNo')">{{ detail.logisNo || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStock.detail.businessTime')">{{ detail.businessTimeText || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStock.detail.saleOrgName')">{{ detail.saleOrgName || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStock.detail.saleUserName')">{{ detail.saleUserName || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStock.detail.customerId')">{{ detail.customerId || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStock.detail.customerName')">{{ detail.customerName || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStock.detail.stockOrgName')">{{ detail.stockOrgName || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStock.detail.anfme')">{{ detail.anfme ?? '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStock.detail.workQty')">{{ detail.workQty ?? '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStock.detail.qty')">{{ detail.qty ?? '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStock.detail.memo')" :span="2">{{ detail.memo || '--' }}</ElDescriptionsItem>
           </ElDescriptions>
 
-          <ElDescriptions title="瀹¤淇℃伅" :column="2" border>
-            <ElDescriptionsItem label="鍒涘缓浜�">{{ detail.createByText || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="淇敼浜�">{{ detail.updateByText || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="淇敼鏃堕棿">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
+          <ElDescriptions :title="t('pages.orders.outStock.detail.auditInfo')" :column="2" border>
+            <ElDescriptionsItem :label="t('pages.orders.outStock.detail.createBy')">{{ detail.createByText || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStock.detail.createTime')">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStock.detail.updateBy')">{{ detail.updateByText || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.outStock.detail.updateTime')">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
           </ElDescriptions>
 
           <div class="space-y-3">
             <div class="flex items-center justify-between">
-              <div class="text-sm font-medium text-[var(--art-gray-900)]">鍗曟嵁鏄庣粏</div>
+              <div class="text-sm font-medium text-[var(--art-gray-900)]">{{ t('pages.orders.outStock.detail.items') }}</div>
               <div class="flex items-center gap-3">
-                <ElTag effect="plain">鍏� {{ itemRows.length }} 鏉�</ElTag>
-                <ElButton :loading="itemsLoading" @click="$emit('refresh')">鍒锋柊</ElButton>
+                <ElTag effect="plain">{{ t('pages.orders.outStock.detail.count', { count: itemRows.length }) }}</ElTag>
+                <ElButton :loading="itemsLoading" @click="$emit('refresh')">{{ t('common.actions.refresh') }}</ElButton>
               </div>
             </div>
 
@@ -66,9 +66,11 @@
 
 <script setup>
   import { computed } from 'vue'
+  import { useI18n } from 'vue-i18n'
   import ArtTable from '@/components/core/tables/art-table/index.vue'
 
   defineOptions({ name: 'OutStockDetailDrawer' })
+  const { t } = useI18n()
 
   const props = defineProps({
     visible: {
diff --git a/rsf-design/src/views/orders/out-stock/outStockPage.helpers.js b/rsf-design/src/views/orders/out-stock/outStockPage.helpers.js
index 19012d1..7e213da 100644
--- a/rsf-design/src/views/orders/out-stock/outStockPage.helpers.js
+++ b/rsf-design/src/views/orders/out-stock/outStockPage.helpers.js
@@ -1,22 +1,28 @@
+function translate(t, key, params) {
+  if (typeof t === 'function') {
+    return t(key, params)
+  }
+  return key
+}
+
 const OUT_STOCK_STATUS_META = {
-  8: { text: '鍙栨秷', type: 'danger' },
-  10: { text: '鍒濆鍖�', type: 'info' },
-  11: { text: '寰呭鐞�', type: 'warning' },
-  13: { text: '鐢熸垚宸ヤ綔妗�', type: 'primary' },
-  14: { text: '浣滀笟涓�', type: 'warning' },
-  15: { text: '宸插畬鎴�', type: 'success' }
+  8: { key: 'pages.orders.outStock.status.cancelled', type: 'danger' },
+  10: { key: 'pages.orders.outStock.status.initialized', type: 'info' },
+  11: { key: 'pages.orders.outStock.status.pending', type: 'warning' },
+  13: { key: 'pages.orders.outStock.status.generated', type: 'primary' },
+  14: { key: 'pages.orders.outStock.status.running', type: 'warning' },
+  15: { key: 'pages.orders.outStock.status.completed', type: 'success' }
 }
 
 const OUT_STOCK_RLE_STATUS_META = {
-  0: { text: '姝e父', type: 'success' },
-  1: { text: '宸查噴鏀�', type: 'warning' }
+  0: { key: 'common.status.normal', type: 'success' },
+  1: { key: 'pages.orders.outStock.status.released', type: 'warning' }
 }
 
 const OUT_STOCK_TYPE_META = {
-  out: '鍑哄簱鍗�'
+  out: 'pages.orders.outStock.type.out'
 }
 
-export const OUT_STOCK_REPORT_TITLE = '鍑哄簱鍗曟姤琛�'
 export const OUT_STOCK_REPORT_STYLE = {
   titleAlign: 'center',
   titleLevel: 'strong',
@@ -37,30 +43,60 @@
   return Number.isNaN(parsed) ? fallback : parsed
 }
 
-function normalizeStatusMeta(exceStatus, exceStatusText) {
+function normalizeStatusMeta(exceStatus, exceStatusText, t) {
   if (exceStatusText) {
     const fallback = OUT_STOCK_STATUS_META[Number(exceStatus)] || {
       text: exceStatusText,
       type: 'info'
     }
+    if (fallback.key) {
+      return {
+        text: translate(t, fallback.key),
+        type: fallback.type
+      }
+    }
     return fallback
   }
-  return OUT_STOCK_STATUS_META[Number(exceStatus)] || {
-    text: normalizeText(exceStatus) || '--',
+
+  const fallback = OUT_STOCK_STATUS_META[Number(exceStatus)]
+  if (fallback?.key) {
+    return {
+      text: translate(t, fallback.key),
+      type: fallback.type
+    }
+  }
+
+  return {
+    text: normalizeText(exceStatus) || translate(t, 'common.placeholder.empty'),
     type: 'info'
   }
 }
 
-function normalizeRleStatusMeta(rleStatus, rleStatusText) {
+function normalizeRleStatusMeta(rleStatus, rleStatusText, t) {
   if (rleStatusText) {
     const fallback = OUT_STOCK_RLE_STATUS_META[Number(rleStatus)] || {
       text: rleStatusText,
       type: 'info'
     }
+    if (fallback.key) {
+      return {
+        text: translate(t, fallback.key),
+        type: fallback.type
+      }
+    }
     return fallback
   }
-  return OUT_STOCK_RLE_STATUS_META[Number(rleStatus)] || {
-    text: normalizeText(rleStatus) || '--',
+
+  const fallback = OUT_STOCK_RLE_STATUS_META[Number(rleStatus)]
+  if (fallback?.key) {
+    return {
+      text: translate(t, fallback.key),
+      type: fallback.type
+    }
+  }
+
+  return {
+    text: normalizeText(rleStatus) || translate(t, 'common.placeholder.empty'),
     type: 'info'
   }
 }
@@ -111,78 +147,90 @@
   }
 }
 
-export function normalizeOutStockRow(record = {}) {
-  const statusMeta = normalizeStatusMeta(record.exceStatus, record['exceStatus$'] || record.exceStatusText)
-  const rleStatusMeta = normalizeRleStatusMeta(record.rleStatus, record['rleStatus$'] || record.rleStatusText)
+export function getOutStockReportTitle(t) {
+  return translate(t, 'pages.orders.outStock.reportTitle')
+}
+
+export function normalizeOutStockRow(record = {}, t) {
+  const statusMeta = normalizeStatusMeta(record.exceStatus, record['exceStatus$'] || record.exceStatusText, t)
+  const rleStatusMeta = normalizeRleStatusMeta(record.rleStatus, record['rleStatus$'] || record.rleStatusText, t)
   const typeValue = normalizeText(record['type$'] || record.type)
 
   return {
     ...record,
     id: record.id ?? null,
-    code: normalizeText(record.code) || '--',
-    poCode: normalizeText(record.poCode) || '--',
-    typeLabel: OUT_STOCK_TYPE_META[typeValue] || typeValue || '--',
-    wkTypeLabel: normalizeText(record['wkType$'] || record.wkType) || '--',
+    code: normalizeText(record.code) || translate(t, 'common.placeholder.empty'),
+    poCode: normalizeText(record.poCode) || translate(t, 'common.placeholder.empty'),
+    typeLabel: OUT_STOCK_TYPE_META[typeValue]
+      ? translate(t, OUT_STOCK_TYPE_META[typeValue])
+      : typeValue || translate(t, 'common.placeholder.empty'),
+    wkTypeLabel: normalizeText(record['wkType$'] || record.wkType) || translate(t, 'common.placeholder.empty'),
     exceStatusText: statusMeta.text,
     exceStatusTagType: statusMeta.type,
     rleStatusText: rleStatusMeta.text,
     rleStatusTagType: rleStatusMeta.type,
-    anfme: record.anfme ?? '--',
-    workQty: record.workQty ?? '--',
-    qty: record.qty ?? '--',
-    logisNo: normalizeText(record.logisNo) || '--',
-    saleOrgName: normalizeText(record.saleOrgName) || '--',
-    saleUserName: normalizeText(record.saleUserName) || '--',
-    businessTimeText: normalizeText(record['businessTime$'] || record.businessTimeText || record.businessTime) || '--',
-    customerId: normalizeText(record.customerId) || '--',
-    customerName: normalizeText(record.customerName) || '--',
-    stockOrgName: normalizeText(record.stockOrgName) || '--',
-    createByText: normalizeText(record['createBy$'] || record.createByText) || '--',
-    createTimeText: normalizeText(record['createTime$'] || record.createTimeText || record.createTime) || '--',
-    updateByText: normalizeText(record['updateBy$'] || record.updateByText) || '--',
-    updateTimeText: normalizeText(record['updateTime$'] || record.updateTimeText || record.updateTime) || '--',
-    memo: normalizeText(record.memo) || '--',
+    anfme: record.anfme ?? translate(t, 'common.placeholder.empty'),
+    workQty: record.workQty ?? translate(t, 'common.placeholder.empty'),
+    qty: record.qty ?? translate(t, 'common.placeholder.empty'),
+    logisNo: normalizeText(record.logisNo) || translate(t, 'common.placeholder.empty'),
+    saleOrgName: normalizeText(record.saleOrgName) || translate(t, 'common.placeholder.empty'),
+    saleUserName: normalizeText(record.saleUserName) || translate(t, 'common.placeholder.empty'),
+    businessTimeText:
+      normalizeText(record['businessTime$'] || record.businessTimeText || record.businessTime) ||
+      translate(t, 'common.placeholder.empty'),
+    customerId: normalizeText(record.customerId) || translate(t, 'common.placeholder.empty'),
+    customerName: normalizeText(record.customerName) || translate(t, 'common.placeholder.empty'),
+    stockOrgName: normalizeText(record.stockOrgName) || translate(t, 'common.placeholder.empty'),
+    createByText: normalizeText(record['createBy$'] || record.createByText) || translate(t, 'common.placeholder.empty'),
+    createTimeText:
+      normalizeText(record['createTime$'] || record.createTimeText || record.createTime) ||
+      translate(t, 'common.placeholder.empty'),
+    updateByText: normalizeText(record['updateBy$'] || record.updateByText) || translate(t, 'common.placeholder.empty'),
+    updateTimeText:
+      normalizeText(record['updateTime$'] || record.updateTimeText || record.updateTime) ||
+      translate(t, 'common.placeholder.empty'),
+    memo: normalizeText(record.memo) || translate(t, 'common.placeholder.empty'),
     canComplete: Number(record.exceStatus) !== 15,
     canCancel: Number(record.exceStatus) === 10,
     canDelete: Number(record.exceStatus) !== 15
   }
 }
 
-export function getOutStockActionList(row = {}) {
-  const normalizedRow = normalizeOutStockRow(row)
+export function getOutStockActionList(row = {}, t) {
+  const normalizedRow = normalizeOutStockRow(row, t)
   return [
     {
       key: 'view',
-      label: '鏌ョ湅璇︽儏',
+      label: translate(t, 'pages.orders.outStock.actions.view'),
       icon: 'ri:eye-line'
     },
     {
       key: 'items',
-      label: '鏄庣粏',
+      label: translate(t, 'pages.orders.outStock.actions.items'),
       icon: 'ri:list-check-3'
     },
     {
       key: 'print',
-      label: '鎵撳嵃',
+      label: translate(t, 'pages.orders.outStock.actions.print'),
       icon: 'ri:printer-line'
     },
     {
       key: 'complete',
-      label: '瀹屾垚',
+      label: translate(t, 'pages.orders.outStock.actions.complete'),
       icon: 'ri:check-line',
       color: 'var(--el-color-success)',
       disabled: !normalizedRow.canComplete
     },
     {
       key: 'cancel',
-      label: '鍙栨秷',
+      label: translate(t, 'pages.orders.outStock.actions.cancel'),
       icon: 'ri:close-circle-line',
       color: 'var(--el-color-danger)',
       disabled: !normalizedRow.canCancel
     },
     {
       key: 'delete',
-      label: '鍒犻櫎',
+      label: translate(t, 'pages.orders.outStock.actions.delete'),
       icon: 'ri:delete-bin-6-line',
       color: 'var(--el-color-danger)',
       disabled: !normalizedRow.canDelete
@@ -190,20 +238,21 @@
   ]
 }
 
-export function buildOutStockPrintRows(records = []) {
+export function buildOutStockPrintRows(records = [], t) {
   if (!Array.isArray(records)) {
     return []
   }
-  return records.map((record) => normalizeOutStockRow(record))
+  return records.map((record) => normalizeOutStockRow(record, t))
 }
 
 export function buildOutStockReportMeta({
   previewMeta = {},
   count = 0,
-  orientation = OUT_STOCK_REPORT_STYLE.orientation
+  orientation = OUT_STOCK_REPORT_STYLE.orientation,
+  t
 } = {}) {
   return {
-    reportTitle: OUT_STOCK_REPORT_TITLE,
+    reportTitle: getOutStockReportTitle(t),
     reportDate: previewMeta.reportDate,
     printedAt: previewMeta.printedAt,
     operator: previewMeta.operator,
diff --git a/rsf-design/src/views/orders/out-stock/outStockTable.columns.js b/rsf-design/src/views/orders/out-stock/outStockTable.columns.js
index 5fb513f..691485a 100644
--- a/rsf-design/src/views/orders/out-stock/outStockTable.columns.js
+++ b/rsf-design/src/views/orders/out-stock/outStockTable.columns.js
@@ -1,112 +1,114 @@
 import { h } from 'vue'
 import { ElTag } from 'element-plus'
+import { $t } from '@/locales'
 import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
 import { getOutStockActionList } from './outStockPage.helpers'
 
-export function createOutStockTableColumns({ handleActionClick } = {}) {
+export function createOutStockTableColumns({ handleActionClick, t } = {}) {
+  const translate = typeof t === 'function' ? t : $t
   return [
     { type: 'selection', width: 48, align: 'center' },
-    { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+    { type: 'globalIndex', label: translate('table.index'), width: 72, align: 'center' },
     {
       prop: 'code',
-      label: '鍑哄簱鍗曞彿',
+      label: translate('pages.orders.outStock.table.code'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.code || '--'
     },
     {
       prop: 'poCode',
-      label: 'PO鍗曞彿',
+      label: translate('pages.orders.outStock.table.poCode'),
       minWidth: 150,
       showOverflowTooltip: true,
       formatter: (row) => row.poCode || '--'
     },
     {
       prop: 'typeLabel',
-      label: '鍑哄簱绫诲瀷',
+      label: translate('pages.orders.outStock.table.type'),
       minWidth: 120,
       showOverflowTooltip: true,
       formatter: (row) => row.typeLabel || '--'
     },
     {
       prop: 'wkTypeLabel',
-      label: '涓氬姟绫诲瀷',
+      label: translate('pages.orders.outStock.table.wkType'),
       minWidth: 130,
       showOverflowTooltip: true,
       formatter: (row) => row.wkTypeLabel || '--'
     },
     {
       prop: 'customerName',
-      label: '瀹㈡埛',
+      label: translate('pages.orders.outStock.table.customerName'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.customerName || '--'
     },
     {
       prop: 'saleOrgName',
-      label: '閿�鍞粍缁�',
+      label: translate('pages.orders.outStock.table.saleOrgName'),
       minWidth: 150,
       showOverflowTooltip: true,
       formatter: (row) => row.saleOrgName || '--'
     },
     {
       prop: 'anfme',
-      label: '搴斿嚭鏁伴噺',
+      label: translate('pages.orders.outStock.table.anfme'),
       width: 100,
       align: 'right',
       formatter: (row) => row.anfme ?? '--'
     },
     {
       prop: 'workQty',
-      label: '鎵ц鏁伴噺',
+      label: translate('pages.orders.outStock.table.workQty'),
       width: 100,
       align: 'right',
       formatter: (row) => row.workQty ?? '--'
     },
     {
       prop: 'qty',
-      label: '宸插嚭鏁伴噺',
+      label: translate('pages.orders.outStock.table.qty'),
       width: 100,
       align: 'right',
       formatter: (row) => row.qty ?? '--'
     },
     {
       prop: 'logisNo',
-      label: '鐗╂祦鍗曞彿',
+      label: translate('pages.orders.outStock.table.logisNo'),
       minWidth: 140,
       showOverflowTooltip: true,
       formatter: (row) => row.logisNo || '--'
     },
     {
       prop: 'rleStatusText',
-      label: '閲婃斁鐘舵��',
+      label: translate('pages.orders.outStock.table.rleStatus'),
       width: 110,
       formatter: (row) =>
         h(ElTag, { type: row.rleStatusTagType || 'info', effect: 'light' }, () => row.rleStatusText || '--')
     },
     {
       prop: 'exceStatusText',
-      label: '鍗曟嵁鐘舵��',
+      label: translate('pages.orders.outStock.table.exceStatus'),
       width: 120,
       formatter: (row) =>
         h(ElTag, { type: row.exceStatusTagType || 'info', effect: 'light' }, () => row.exceStatusText || '--')
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: translate('pages.orders.outStock.table.updateTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.updateTimeText || '--'
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: translate('table.operation'),
       width: 120,
       align: 'center',
       fixed: 'right',
       formatter: (row) =>
         h(ArtButtonMore, {
-          list: getOutStockActionList(row),
+          list: getOutStockActionList(row, translate),
           onClick: (item) => handleActionClick?.(item, row)
         })
     }
diff --git a/rsf-design/src/views/orders/preparation/preparationPage.helpers.js b/rsf-design/src/views/orders/preparation/preparationPage.helpers.js
index 6278cca..53bdd34 100644
--- a/rsf-design/src/views/orders/preparation/preparationPage.helpers.js
+++ b/rsf-design/src/views/orders/preparation/preparationPage.helpers.js
@@ -1,3 +1,5 @@
+import { $t } from '@/locales'
+
 const PREPARATION_STATUS_META = {
   8: { text: '鍙栨秷', type: 'danger' },
   10: { text: '鍒濆鍖�', type: 'info' },
@@ -185,26 +187,26 @@
 export function getPreparationActionList(row = {}) {
   const normalizedRow = normalizePreparationRow(row)
   return [
-    { key: 'view', label: '鏌ョ湅璇︽儏', icon: 'ri:eye-line' },
-    { key: 'items', label: '鏄庣粏', icon: 'ri:list-check-3' },
-    { key: 'print', label: '鎵撳嵃', icon: 'ri:printer-line' },
+    { key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' },
+    { key: 'items', label: $t('common.actions.items'), icon: 'ri:list-check-3' },
+    { key: 'print', label: $t('common.actions.print'), icon: 'ri:printer-line' },
     {
       key: 'complete',
-      label: '瀹屾垚',
+      label: $t('common.actions.complete'),
       icon: 'ri:check-line',
       color: 'var(--el-color-success)',
       disabled: !normalizedRow.canComplete
     },
     {
       key: 'cancel',
-      label: '鍙栨秷',
+      label: $t('common.cancel'),
       icon: 'ri:close-circle-line',
       color: 'var(--el-color-danger)',
       disabled: !normalizedRow.canCancel
     },
     {
       key: 'delete',
-      label: '鍒犻櫎',
+      label: $t('common.actions.delete'),
       icon: 'ri:delete-bin-6-line',
       color: 'var(--el-color-danger)',
       disabled: !normalizedRow.canDelete
@@ -214,14 +216,14 @@
 
 export function createPreparationDetailItemColumns() {
   return [
-    { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+    { type: 'globalIndex', label: $t('table.index'), width: 72, align: 'center' },
     { prop: 'matnrCode', label: '鐗╂枡缂栫爜', minWidth: 160, showOverflowTooltip: true },
     { prop: 'maktx', label: '鐗╂枡鍚嶇О', minWidth: 180, showOverflowTooltip: true },
     { prop: 'splrBatch', label: '渚涘簲鍟嗘壒娆�', minWidth: 140, showOverflowTooltip: true },
     { prop: 'splrName', label: '渚涘簲鍟�', minWidth: 160, showOverflowTooltip: true },
     { prop: 'anfme', label: '搴斿嚭鏁伴噺', width: 100, align: 'right' },
     { prop: 'qty', label: '宸插嚭鏁伴噺', width: 100, align: 'right' },
-    { prop: 'memo', label: '澶囨敞', minWidth: 160, showOverflowTooltip: true }
+    { prop: 'memo', label: $t('table.remark'), minWidth: 160, showOverflowTooltip: true }
   ]
 }
 
diff --git a/rsf-design/src/views/orders/purchase/purchaseTable.columns.js b/rsf-design/src/views/orders/purchase/purchaseTable.columns.js
index 2d81a20..b0a577d 100644
--- a/rsf-design/src/views/orders/purchase/purchaseTable.columns.js
+++ b/rsf-design/src/views/orders/purchase/purchaseTable.columns.js
@@ -1,5 +1,6 @@
 import { h } from 'vue'
 import { ElTag } from 'element-plus'
+import { $t } from '@/locales'
 import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
 import { getPurchaseStatusMeta } from './purchasePage.helpers'
 
@@ -14,7 +15,7 @@
 } = {}) {
   return [
     { type: 'selection', width: 48, align: 'center' },
-    { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+    { type: 'globalIndex', label: $t('table.index'), width: 72, align: 'center' },
     {
       prop: 'code',
       label: 'PO鍗曞彿',
@@ -146,29 +147,29 @@
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: $t('table.operation'),
       width: 120,
       align: 'center',
       fixed: 'right',
       formatter: (row) => {
-        const operations = [{ key: 'view', label: '璇︽儏', icon: 'ri:eye-line' }]
+        const operations = [{ key: 'view', label: $t('common.actions.detail'), icon: 'ri:eye-line' }]
 
         if (handleViewItems) {
           operations.push({
             key: 'items',
-            label: '鏄庣粏',
+            label: $t('common.actions.items'),
             icon: 'ri:list-check-3'
           })
         }
 
         if (canEdit && handleEdit) {
-          operations.push({ key: 'edit', label: '缂栬緫', icon: 'ri:pencil-line' })
+          operations.push({ key: 'edit', label: $t('common.actions.edit'), icon: 'ri:pencil-line' })
         }
 
         if (canDelete && handleDelete && canDeleteRow(row)) {
           operations.push({
             key: 'delete',
-            label: '鍒犻櫎',
+            label: $t('common.actions.delete'),
             icon: 'ri:delete-bin-5-line',
             color: 'var(--art-error)'
           })
diff --git a/rsf-design/src/views/orders/transfer-item/index.vue b/rsf-design/src/views/orders/transfer-item/index.vue
index 4981645..3dc2aee 100644
--- a/rsf-design/src/views/orders/transfer-item/index.vue
+++ b/rsf-design/src/views/orders/transfer-item/index.vue
@@ -3,10 +3,10 @@
     <ElCard v-if="activeSourceSummary" class="mb-3">
       <div class="flex items-center justify-between gap-3">
         <div class="flex items-center gap-2 text-sm text-[var(--art-text-gray-600)]">
-          <span class="font-medium text-[var(--art-text-gray-900)]">褰撳墠鏉ユ簮</span>
-          <span>璋冩嫧鍗旾D锛歿{ activeSourceSummary.transferId }}</span>
+          <span class="font-medium text-[var(--art-text-gray-900)]">{{ t('pages.orders.transferItem.sourceTitle') }}</span>
+          <span>{{ t('pages.orders.transferItem.sourceLabel', { id: activeSourceSummary.transferId }) }}</span>
         </div>
-        <ElButton link type="primary" @click="handleClearSourceFilter">鏌ョ湅鍏ㄩ儴</ElButton>
+        <ElButton link type="primary" @click="handleClearSourceFilter">{{ t('common.actions.viewAll') }}</ElButton>
       </div>
     </ElCard>
 
@@ -59,6 +59,7 @@
 
 <script setup>
   import { computed, onMounted, ref, watch } from 'vue'
+  import { useI18n } from 'vue-i18n'
   import { ElButton, ElMessage } from 'element-plus'
   import { useRoute, useRouter } from 'vue-router'
   import { useUserStore } from '@/store/modules/user'
@@ -77,23 +78,24 @@
   import { createTransferItemTableColumns } from './transferItemTable.columns.js'
   import {
     TRANSFER_ITEM_REPORT_STYLE,
-    TRANSFER_ITEM_REPORT_TITLE,
     buildTransferItemPageQueryParams,
     buildTransferItemPrintRows,
     buildTransferItemReportMeta,
     buildTransferItemSearchParams,
     createTransferItemSearchState,
     getTransferItemPaginationKey,
+    getTransferItemReportTitle,
     getTransferItemStatusOptions,
     normalizeTransferItemRow
   } from './transferItemPage.helpers.js'
 
   defineOptions({ name: 'TransferItem' })
 
+  const { t } = useI18n()
   const userStore = useUserStore()
   const route = useRoute()
   const router = useRouter()
-  const reportTitle = TRANSFER_ITEM_REPORT_TITLE
+  const reportTitle = computed(() => getTransferItemReportTitle(t))
   const searchForm = ref(createTransferItemSearchState())
   const selectedRows = ref([])
   const detailDrawerVisible = ref(false)
@@ -111,220 +113,220 @@
 
   const searchItems = computed(() => [
     {
-      label: '鍏抽敭瀛�',
+      label: t('table.keyword'),
       key: 'condition',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ヨ皟鎷ㄥ崟鍙�/鐗╂枡缂栫爜/鐗╂枡鍚嶇О/澶囨敞'
+        placeholder: t('pages.orders.transferItem.search.conditionPlaceholder')
       }
     },
     {
-      label: '寮�濮嬫椂闂�',
+      label: t('pages.orders.transferItem.search.timeStart'),
       key: 'timeStart',
       type: 'datetime',
       props: {
         clearable: true,
         format: 'YYYY-MM-DD HH:mm:ss',
         valueFormat: 'YYYY-MM-DD HH:mm:ss',
-        placeholder: '璇烽�夋嫨寮�濮嬫椂闂�'
+        placeholder: t('pages.orders.transferItem.search.timeStartPlaceholder')
       }
     },
     {
-      label: '缁撴潫鏃堕棿',
+      label: t('pages.orders.transferItem.search.timeEnd'),
       key: 'timeEnd',
       type: 'datetime',
       props: {
         clearable: true,
         format: 'YYYY-MM-DD HH:mm:ss',
         valueFormat: 'YYYY-MM-DD HH:mm:ss',
-        placeholder: '璇烽�夋嫨缁撴潫鏃堕棿'
+        placeholder: t('pages.orders.transferItem.search.timeEndPlaceholder')
       }
     },
     {
-      label: '璋冩嫧鍗旾D',
+      label: t('pages.orders.transferItem.search.transferId'),
       key: 'transferId',
       type: 'inputNumber',
       props: {
         clearable: true,
         controlsPosition: 'right',
-        placeholder: '璇疯緭鍏ヨ皟鎷ㄥ崟ID'
+        placeholder: t('pages.orders.transferItem.search.transferIdPlaceholder')
       }
     },
     {
-      label: '璋冩嫧鍗曞彿',
+      label: t('pages.orders.transferItem.search.transferCode'),
       key: 'transferCode',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ヨ皟鎷ㄥ崟鍙�'
+        placeholder: t('pages.orders.transferItem.search.transferCodePlaceholder')
       }
     },
     {
-      label: '鐗╂枡ID',
+      label: t('pages.orders.transferItem.search.matnrId'),
       key: 'matnrId',
       type: 'inputNumber',
       props: {
         clearable: true,
         controlsPosition: 'right',
-        placeholder: '璇疯緭鍏ョ墿鏂橧D'
+        placeholder: t('pages.orders.transferItem.search.matnrIdPlaceholder')
       }
     },
     {
-      label: '鐗╂枡鍚嶇О',
+      label: t('table.materialName'),
       key: 'maktx',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ョ墿鏂欏悕绉�'
+        placeholder: t('pages.orders.transferItem.search.maktxPlaceholder')
       }
     },
     {
-      label: '鐗╂枡缂栫爜',
+      label: t('table.materialCode'),
       key: 'matnrCode',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ョ墿鏂欑紪鐮�'
+        placeholder: t('pages.orders.transferItem.search.matnrCodePlaceholder')
       }
     },
     {
-      label: '鍗曚綅',
+      label: t('table.unit'),
       key: 'unit',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ュ崟浣�'
+        placeholder: t('pages.orders.transferItem.search.unitPlaceholder')
       }
     },
     {
-      label: '鏁伴噺',
+      label: t('table.quantity'),
       key: 'anfme',
       type: 'inputNumber',
       props: {
         clearable: true,
         controlsPosition: 'right',
-        placeholder: '璇疯緭鍏ユ暟閲�'
+        placeholder: t('pages.orders.transferItem.search.anfmePlaceholder')
       }
     },
     {
-      label: '宸插畬鎴愭暟閲�',
+      label: t('pages.orders.transferItem.search.qty'),
       key: 'qty',
       type: 'inputNumber',
       props: {
         clearable: true,
         controlsPosition: 'right',
-        placeholder: '璇疯緭鍏ュ凡瀹屾垚鏁伴噺'
+        placeholder: t('pages.orders.transferItem.search.qtyPlaceholder')
       }
     },
     {
-      label: '鎵ц鏁伴噺',
+      label: t('pages.orders.transferItem.search.workQty'),
       key: 'workQty',
       type: 'inputNumber',
       props: {
         clearable: true,
         controlsPosition: 'right',
-        placeholder: '璇疯緭鍏ユ墽琛屾暟閲�'
+        placeholder: t('pages.orders.transferItem.search.workQtyPlaceholder')
       }
     },
     {
-      label: '鎵规',
+      label: t('table.batch'),
       key: 'batch',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ユ壒娆�'
+        placeholder: t('pages.orders.transferItem.search.batchPlaceholder')
       }
     },
     {
-      label: '渚涘簲鍟咺D',
+      label: t('pages.orders.transferItem.search.splrId'),
       key: 'splrId',
       type: 'inputNumber',
       props: {
         clearable: true,
         controlsPosition: 'right',
-        placeholder: '璇疯緭鍏ヤ緵搴斿晢ID'
+        placeholder: t('pages.orders.transferItem.search.splrIdPlaceholder')
       }
     },
     {
-      label: '瑙勬牸',
+      label: t('pages.orders.transferItem.search.spec'),
       key: 'spec',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ヨ鏍�'
+        placeholder: t('pages.orders.transferItem.search.specPlaceholder')
       }
     },
     {
-      label: '鍨嬪彿',
+      label: t('pages.orders.transferItem.search.model'),
       key: 'model',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ュ瀷鍙�'
+        placeholder: t('pages.orders.transferItem.search.modelPlaceholder')
       }
     },
     {
-      label: '瀛楁绱㈠紩',
+      label: t('pages.orders.transferItem.search.fieldsIndex'),
       key: 'fieldsIndex',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ュ瓧娈电储寮�'
+        placeholder: t('pages.orders.transferItem.search.fieldsIndexPlaceholder')
       }
     },
     {
-      label: '骞冲彴琛屽彿',
+      label: t('pages.orders.transferItem.search.platItemId'),
       key: 'platItemId',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ュ钩鍙拌鍙�'
+        placeholder: t('pages.orders.transferItem.search.platItemIdPlaceholder')
       }
     },
     {
-      label: '瀹㈡埛璁㈠崟鍙�',
+      label: t('pages.orders.transferItem.search.platOrderCode'),
       key: 'platOrderCode',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ュ鎴疯鍗曞彿'
+        placeholder: t('pages.orders.transferItem.search.platOrderCodePlaceholder')
       }
     },
     {
-      label: '宸ュ崟鍙�',
+      label: t('pages.orders.transferItem.search.platWorkCode'),
       key: 'platWorkCode',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ュ伐鍗曞彿'
+        placeholder: t('pages.orders.transferItem.search.platWorkCodePlaceholder')
       }
     },
     {
-      label: '椤圭洰鍙�',
+      label: t('pages.orders.transferItem.search.projectCode'),
       key: 'projectCode',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ラ」鐩彿'
+        placeholder: t('pages.orders.transferItem.search.projectCodePlaceholder')
       }
     },
     {
-      label: '澶囨敞',
+      label: t('table.memo'),
       key: 'memo',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ュ娉�'
+        placeholder: t('pages.orders.transferItem.search.memoPlaceholder')
       }
     },
     {
-      label: '鐘舵��',
+      label: t('table.status'),
       key: 'status',
       type: 'select',
       props: {
         clearable: true,
-        options: getTransferItemStatusOptions()
+        options: getTransferItemStatusOptions(t)
       }
     }
   ])
@@ -354,12 +356,13 @@
       paginationKey: getTransferItemPaginationKey(),
       columnsFactory: () =>
         createTransferItemTableColumns({
-          handleView: openDetail
+          handleView: openDetail,
+          t
         })
     },
     transform: {
       dataTransformer: (records) =>
-        Array.isArray(records) ? records.map((item) => normalizeTransferItemRow(item)) : []
+        Array.isArray(records) ? records.map((item) => normalizeTransferItemRow(item, t)) : []
     }
   })
 
@@ -368,13 +371,13 @@
     detailLoading.value = true
     try {
       const detail = await guardRequestWithMessage(fetchTransferItemDetail(row.id), {}, {
-        timeoutMessage: '璋冩嫧鏄庣粏璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+        timeoutMessage: t('pages.orders.transferItem.messages.detailTimeout')
       })
-      detailData.value = normalizeTransferItemRow(detail)
+      detailData.value = normalizeTransferItemRow(detail, t)
     } catch (error) {
       detailDrawerVisible.value = false
       detailData.value = {}
-      ElMessage.error(error?.message || '鑾峰彇璋冩嫧鏄庣粏璇︽儏澶辫触')
+      ElMessage.error(error?.message || t('pages.orders.transferItem.messages.detailFailed'))
     } finally {
       detailLoading.value = false
     }
@@ -447,11 +450,11 @@
         }
       }),
     resolvePrintRecords,
-    buildPreviewRows: (records) => buildTransferItemPrintRows(records),
+    buildPreviewRows: (records) => buildTransferItemPrintRows(records, t),
     buildPreviewMeta: (rows) => {
       const now = new Date()
       return {
-        reportTitle,
+        reportTitle: reportTitle.value,
         reportDate: now.toLocaleDateString('zh-CN'),
         printedAt: now.toLocaleString('zh-CN', { hour12: false }),
         operator: userStore.getUserInfo?.name || userStore.getUserInfo?.username || '',
@@ -467,7 +470,8 @@
     buildTransferItemReportMeta({
       previewMeta: previewMeta.value,
       count: previewRows.value.length,
-      orientation: previewMeta.value?.reportStyle?.orientation || TRANSFER_ITEM_REPORT_STYLE.orientation
+      orientation: previewMeta.value?.reportStyle?.orientation || TRANSFER_ITEM_REPORT_STYLE.orientation,
+      t
     })
   )
 
diff --git a/rsf-design/src/views/orders/transfer-item/modules/transfer-item-detail-drawer.vue b/rsf-design/src/views/orders/transfer-item/modules/transfer-item-detail-drawer.vue
index 4a824f6..0eab81b 100644
--- a/rsf-design/src/views/orders/transfer-item/modules/transfer-item-detail-drawer.vue
+++ b/rsf-design/src/views/orders/transfer-item/modules/transfer-item-detail-drawer.vue
@@ -1,7 +1,7 @@
 <template>
   <ElDrawer
     :model-value="visible"
-    title="璋冩嫧鏄庣粏璇︽儏"
+    :title="t('pages.orders.transferItem.detail.title')"
     size="72%"
     destroy-on-close
     append-to-body
@@ -10,46 +10,46 @@
     <ElScrollbar class="h-[calc(100vh-120px)]">
       <ElSkeleton :loading="loading" animated :rows="10">
         <div class="flex min-h-full flex-col gap-4 pr-2">
-          <ElDescriptions title="鍩虹淇℃伅" :column="3" border>
-            <ElDescriptionsItem label="璋冩嫧鍗旾D">{{ displayData.transferId ?? '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="璋冩嫧鍗曞彿">{{ displayData.transferCode || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="鐘舵��">
+          <ElDescriptions :title="t('pages.orders.transferItem.detail.baseInfo')" :column="3" border>
+            <ElDescriptionsItem :label="t('pages.orders.transferItem.detail.transferId')">{{ displayData.transferId ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.transferItem.detail.transferCode')">{{ displayData.transferCode || t('common.placeholder.empty') }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('table.status')">
               <ElTag :type="displayData.statusType || 'info'" effect="light">
-                {{ displayData.statusText || '--' }}
+                {{ displayData.statusText || t('common.placeholder.empty') }}
               </ElTag>
             </ElDescriptionsItem>
-            <ElDescriptionsItem label="渚涘簲鍟嗙紪鐮�">{{ displayData.splrCode || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="渚涘簲鍟咺D">{{ displayData.splrId ?? '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="渚涘簲鍟嗗悕绉�">{{ displayData.splrName || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="澶囨敞" :span="3">{{ displayData.memo || '--' }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.transferItem.detail.supplierCode')">{{ displayData.splrCode || t('common.placeholder.empty') }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.transferItem.detail.splrId')">{{ displayData.splrId ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.transferItem.detail.supplierName')">{{ displayData.splrName || t('common.placeholder.empty') }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('table.memo')" :span="3">{{ displayData.memo || t('common.placeholder.empty') }}</ElDescriptionsItem>
           </ElDescriptions>
 
-          <ElDescriptions title="鐗╂枡淇℃伅" :column="3" border>
-            <ElDescriptionsItem label="鐗╂枡ID">{{ displayData.matnrId ?? '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="鐗╂枡缂栫爜">{{ displayData.matnrCode || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="鐗╂枡鍚嶇О">{{ displayData.maktx || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="瑙勬牸">{{ displayData.spec || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="鍨嬪彿">{{ displayData.model || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="鎵规">{{ displayData.batch || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="鍗曚綅">{{ displayData.unit || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="鏁伴噺">{{ displayData.anfme ?? '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="鎵ц鏁伴噺">{{ displayData.workQty ?? '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="宸插畬鎴愭暟閲�">{{ displayData.qty ?? '--' }}</ElDescriptionsItem>
+          <ElDescriptions :title="t('pages.orders.transferItem.detail.materialInfo')" :column="3" border>
+            <ElDescriptionsItem :label="t('pages.orders.transferItem.detail.matnrId')">{{ displayData.matnrId ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('table.materialCode')">{{ displayData.matnrCode || t('common.placeholder.empty') }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('table.materialName')">{{ displayData.maktx || t('common.placeholder.empty') }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.transferItem.detail.spec')">{{ displayData.spec || t('common.placeholder.empty') }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.transferItem.detail.model')">{{ displayData.model || t('common.placeholder.empty') }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('table.batch')">{{ displayData.batch || t('common.placeholder.empty') }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('table.unit')">{{ displayData.unit || t('common.placeholder.empty') }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('table.quantity')">{{ displayData.anfme ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.transferItem.detail.workQty')">{{ displayData.workQty ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.transferItem.detail.qty')">{{ displayData.qty ?? t('common.placeholder.empty') }}</ElDescriptionsItem>
           </ElDescriptions>
 
-          <ElDescriptions title="骞冲彴淇℃伅" :column="3" border>
-            <ElDescriptionsItem label="瀛楁绱㈠紩">{{ displayData.fieldsIndex || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="骞冲彴琛屽彿">{{ displayData.platItemId || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="瀹㈡埛璁㈠崟鍙�">{{ displayData.platOrderCode || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="宸ュ崟鍙�">{{ displayData.platWorkCode || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="椤圭洰鍙�">{{ displayData.projectCode || '--' }}</ElDescriptionsItem>
+          <ElDescriptions :title="t('pages.orders.transferItem.detail.platformInfo')" :column="3" border>
+            <ElDescriptionsItem :label="t('pages.orders.transferItem.detail.fieldsIndex')">{{ displayData.fieldsIndex || t('common.placeholder.empty') }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.transferItem.detail.platItemId')">{{ displayData.platItemId || t('common.placeholder.empty') }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.transferItem.detail.platOrderCode')">{{ displayData.platOrderCode || t('common.placeholder.empty') }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.transferItem.detail.platWorkCode')">{{ displayData.platWorkCode || t('common.placeholder.empty') }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('pages.orders.transferItem.detail.projectCode')">{{ displayData.projectCode || t('common.placeholder.empty') }}</ElDescriptionsItem>
           </ElDescriptions>
 
-          <ElDescriptions title="瀹¤淇℃伅" :column="2" border>
-            <ElDescriptionsItem label="鍒涘缓浜�">{{ displayData.createByText || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ displayData.createTimeText || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="鏇存柊浜�">{{ displayData.updateByText || '--' }}</ElDescriptionsItem>
-            <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ displayData.updateTimeText || '--' }}</ElDescriptionsItem>
+          <ElDescriptions :title="t('pages.orders.transferItem.detail.auditInfo')" :column="2" border>
+            <ElDescriptionsItem :label="t('table.createBy')">{{ displayData.createByText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('table.createTime')">{{ displayData.createTimeText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('table.updateBy')">{{ displayData.updateByText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+            <ElDescriptionsItem :label="t('table.updateTime')">{{ displayData.updateTimeText || t('common.placeholder.empty') }}</ElDescriptionsItem>
           </ElDescriptions>
         </div>
       </ElSkeleton>
@@ -59,8 +59,11 @@
 
 <script setup>
   import { computed } from 'vue'
+  import { useI18n } from 'vue-i18n'
   import { normalizeTransferItemRow } from '../transferItemPage.helpers.js'
 
+  const { t } = useI18n()
+
   defineOptions({ name: 'TransferItemDetailDrawer' })
 
   const props = defineProps({
diff --git a/rsf-design/src/views/orders/transfer-item/transferItemPage.helpers.js b/rsf-design/src/views/orders/transfer-item/transferItemPage.helpers.js
index bce45e0..4209bcb 100644
--- a/rsf-design/src/views/orders/transfer-item/transferItemPage.helpers.js
+++ b/rsf-design/src/views/orders/transfer-item/transferItemPage.helpers.js
@@ -1,4 +1,8 @@
-export const TRANSFER_ITEM_REPORT_TITLE = '璋冩嫧鏄庣粏鎶ヨ〃'
+import { $t } from '@/locales'
+
+export function getTransferItemReportTitle(t = $t) {
+  return t('pages.orders.transferItem.reportTitle')
+}
 export const TRANSFER_ITEM_REPORT_STYLE = {
   titleAlign: 'center',
   titleLevel: 'strong',
@@ -8,9 +12,11 @@
   showBorder: true
 }
 
-const STATUS_META = {
-  1: { text: '姝e父', type: 'success', bool: true },
-  0: { text: '鍐荤粨', type: 'danger', bool: false }
+function getTransferItemStatusMetaMap(t = $t) {
+  return {
+    1: { text: t('common.status.normal'), type: 'success', bool: true },
+    0: { text: t('common.status.frozen'), type: 'danger', bool: false }
+  }
 }
 
 function normalizeText(value, fallback = '--') {
@@ -43,10 +49,11 @@
   }
 }
 
-function getStatusMeta(status, statusText) {
+function getStatusMeta(status, statusText, t = $t) {
   const numericStatus = Number(status)
-  return STATUS_META[numericStatus] || {
-    text: normalizeText(statusText || status || '--'),
+  const statusMetaMap = getTransferItemStatusMetaMap(t)
+  return statusMetaMap[numericStatus] || {
+    text: normalizeText(statusText || status || t('common.status.unknown')),
     type: 'info',
     bool: false
   }
@@ -87,21 +94,22 @@
   }
 }
 
-export function getTransferItemStatusOptions() {
+export function getTransferItemStatusOptions(t = $t) {
   return [
-    { label: '姝e父', value: 1 },
-    { label: '鍐荤粨', value: 0 }
+    { label: t('common.status.normal'), value: 1 },
+    { label: t('common.status.frozen'), value: 0 }
   ]
 }
 
-export function getTransferItemStatusMeta(status) {
+export function getTransferItemStatusMeta(status, t = $t) {
+  const statusMetaMap = getTransferItemStatusMetaMap(t)
   if (status === true || Number(status) === 1) {
-    return STATUS_META[1]
+    return statusMetaMap[1]
   }
   if (status === false || Number(status) === 0) {
-    return STATUS_META[0]
+    return statusMetaMap[0]
   }
-  return { text: '鏈煡', type: 'info', bool: false }
+  return { text: t('common.status.unknown'), type: 'info', bool: false }
 }
 
 export function buildTransferItemSearchParams(params = {}) {
@@ -141,8 +149,8 @@
   }
 }
 
-export function normalizeTransferItemRow(record = {}) {
-  const statusMeta = getStatusMeta(record.statusBool ?? record.status, record['status$'] || record.statusText)
+export function normalizeTransferItemRow(record = {}, t = $t) {
+  const statusMeta = getStatusMeta(record.statusBool ?? record.status, record['status$'] || record.statusText, t)
 
   return {
     ...record,
@@ -178,20 +186,21 @@
   }
 }
 
-export function buildTransferItemPrintRows(records = []) {
+export function buildTransferItemPrintRows(records = [], t = $t) {
   if (!Array.isArray(records)) {
     return []
   }
-  return records.map((record) => normalizeTransferItemRow(record))
+  return records.map((record) => normalizeTransferItemRow(record, t))
 }
 
 export function buildTransferItemReportMeta({
   previewMeta = {},
   count = 0,
-  orientation = TRANSFER_ITEM_REPORT_STYLE.orientation
+  orientation = TRANSFER_ITEM_REPORT_STYLE.orientation,
+  t = $t
 } = {}) {
   return {
-    reportTitle: TRANSFER_ITEM_REPORT_TITLE,
+    reportTitle: getTransferItemReportTitle(t),
     reportDate: previewMeta.reportDate,
     printedAt: previewMeta.printedAt,
     operator: previewMeta.operator,
@@ -202,4 +211,3 @@
     }
   }
 }
-
diff --git a/rsf-design/src/views/orders/transfer-item/transferItemTable.columns.js b/rsf-design/src/views/orders/transfer-item/transferItemTable.columns.js
index 038fdd8..367e6fc 100644
--- a/rsf-design/src/views/orders/transfer-item/transferItemTable.columns.js
+++ b/rsf-design/src/views/orders/transfer-item/transferItemTable.columns.js
@@ -1,140 +1,141 @@
 import { h } from 'vue'
 import { ElTag } from 'element-plus'
 import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
+import { $t } from '@/locales'
 
-export function createTransferItemTableColumns({ handleView } = {}) {
+export function createTransferItemTableColumns({ handleView, t = $t } = {}) {
   return [
     { type: 'selection', width: 48, align: 'center' },
-    { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+    { type: 'globalIndex', label: t('table.index'), width: 72, align: 'center' },
     {
       prop: 'transferId',
-      label: '璋冩嫧鍗旾D',
+      label: t('pages.orders.transferItem.table.transferId'),
       width: 110,
       align: 'right',
       formatter: (row) => row.transferId ?? '--'
     },
     {
       prop: 'transferCode',
-      label: '璋冩嫧鍗曞彿',
+      label: t('pages.orders.transferItem.table.transferCode'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.transferCode || '--'
     },
     {
       prop: 'matnrCode',
-      label: '鐗╂枡缂栫爜',
+      label: t('table.materialCode'),
       minWidth: 150,
       showOverflowTooltip: true,
       formatter: (row) => row.matnrCode || '--'
     },
     {
       prop: 'maktx',
-      label: '鐗╂枡鍚嶇О',
+      label: t('table.materialName'),
       minWidth: 220,
       showOverflowTooltip: true,
       formatter: (row) => row.maktx || '--'
     },
     {
       prop: 'spec',
-      label: '瑙勬牸',
+      label: t('pages.orders.transferItem.table.spec'),
       minWidth: 150,
       showOverflowTooltip: true,
       formatter: (row) => row.spec || '--'
     },
     {
       prop: 'model',
-      label: '鍨嬪彿',
+      label: t('pages.orders.transferItem.table.model'),
       minWidth: 140,
       showOverflowTooltip: true,
       formatter: (row) => row.model || '--'
     },
     {
       prop: 'batch',
-      label: '鎵规',
+      label: t('table.batch'),
       minWidth: 140,
       showOverflowTooltip: true,
       formatter: (row) => row.batch || '--'
     },
     {
       prop: 'unit',
-      label: '鍗曚綅',
+      label: t('table.unit'),
       width: 90,
       align: 'center',
       formatter: (row) => row.unit || '--'
     },
     {
       prop: 'anfme',
-      label: '鏁伴噺',
+      label: t('table.quantity'),
       width: 100,
       align: 'right',
       formatter: (row) => row.anfme ?? '--'
     },
     {
       prop: 'workQty',
-      label: '鎵ц鏁伴噺',
+      label: t('pages.orders.transferItem.table.workQty'),
       width: 110,
       align: 'right',
       formatter: (row) => row.workQty ?? '--'
     },
     {
       prop: 'qty',
-      label: '宸插畬鎴愭暟閲�',
+      label: t('pages.orders.transferItem.table.qty'),
       width: 120,
       align: 'right',
       formatter: (row) => row.qty ?? '--'
     },
     {
       prop: 'splrCode',
-      label: '渚涘簲鍟嗙紪鐮�',
+      label: t('pages.orders.transferItem.table.supplierCode'),
       minWidth: 150,
       showOverflowTooltip: true,
       formatter: (row) => row.splrCode || '--'
     },
     {
       prop: 'splrName',
-      label: '渚涘簲鍟嗗悕绉�',
+      label: t('pages.orders.transferItem.table.supplierName'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.splrName || '--'
     },
     {
       prop: 'fieldsIndex',
-      label: '瀛楁绱㈠紩',
+      label: t('pages.orders.transferItem.table.fieldsIndex'),
       minWidth: 130,
       showOverflowTooltip: true,
       formatter: (row) => row.fieldsIndex || '--'
     },
     {
       prop: 'platItemId',
-      label: '骞冲彴琛屽彿',
+      label: t('pages.orders.transferItem.table.platItemId'),
       minWidth: 130,
       showOverflowTooltip: true,
       formatter: (row) => row.platItemId || '--'
     },
     {
       prop: 'platOrderCode',
-      label: '瀹㈡埛璁㈠崟鍙�',
+      label: t('pages.orders.transferItem.table.platOrderCode'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.platOrderCode || '--'
     },
     {
       prop: 'platWorkCode',
-      label: '宸ュ崟鍙�',
+      label: t('pages.orders.transferItem.table.platWorkCode'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => row.platWorkCode || '--'
     },
     {
       prop: 'projectCode',
-      label: '椤圭洰鍙�',
+      label: t('pages.orders.transferItem.table.projectCode'),
       minWidth: 140,
       showOverflowTooltip: true,
       formatter: (row) => row.projectCode || '--'
     },
     {
       prop: 'status',
-      label: '鐘舵��',
+      label: t('table.status'),
       width: 96,
       align: 'center',
       formatter: (row) =>
@@ -142,14 +143,14 @@
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: t('table.updateTime'),
       minWidth: 170,
       showOverflowTooltip: true,
       formatter: (row) => row.updateTimeText || '--'
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: t('table.operation'),
       width: 96,
       fixed: 'right',
       align: 'center',
@@ -161,4 +162,3 @@
     }
   ]
 }
-
diff --git a/rsf-design/src/views/orders/transfer/index.vue b/rsf-design/src/views/orders/transfer/index.vue
index 618f804..2088f25 100644
--- a/rsf-design/src/views/orders/transfer/index.vue
+++ b/rsf-design/src/views/orders/transfer/index.vue
@@ -106,7 +106,6 @@
   import { createTransferTableColumns } from './transferTable.columns.js'
   import {
     TRANSFER_REPORT_STYLE,
-    TRANSFER_REPORT_TITLE,
     buildTransferDetailOrderQueryParams,
     buildTransferDialogModel,
     buildTransferPageQueryParams,
@@ -117,6 +116,7 @@
     createTransferFormState,
     createTransferSearchState,
     getTransferPaginationKey,
+    getTransferReportTitle,
     getTransferSourceOptions,
     getTransferStatusOptions,
     getTransferExceStatusOptions,
@@ -134,7 +134,7 @@
   const router = useRouter()
   const { t } = useI18n()
 
-  const reportTitle = TRANSFER_REPORT_TITLE
+  const reportTitle = computed(() => getTransferReportTitle(t))
   const searchForm = ref(createTransferSearchState())
   const typeOptions = ref([])
   const areaOptions = ref([])
@@ -177,7 +177,7 @@
       label: t('pages.orders.transfer.search.exceStatus'),
       key: 'exceStatus',
       type: 'select',
-      props: { clearable: true, options: getTransferExceStatusOptions() }
+      props: { clearable: true, options: getTransferExceStatusOptions(t) }
     },
     { label: t('pages.orders.transfer.search.orgWareName'), key: 'orgWareName', type: 'input', props: { clearable: true, placeholder: t('pages.orders.transfer.placeholder.orgWareName') } },
     { label: t('pages.orders.transfer.search.tarWareName'), key: 'tarWareName', type: 'input', props: { clearable: true, placeholder: t('pages.orders.transfer.placeholder.tarWareName') } },
@@ -187,7 +187,7 @@
       label: t('pages.orders.transfer.search.status'),
       key: 'status',
       type: 'select',
-      props: { clearable: true, options: getTransferStatusOptions() }
+      props: { clearable: true, options: getTransferStatusOptions(t) }
     },
     { label: t('pages.orders.transfer.search.memo'), key: 'memo', type: 'input', props: { clearable: true, placeholder: t('pages.orders.transfer.placeholder.memo') } }
   ])
@@ -205,7 +205,7 @@
         {},
         { timeoutMessage: t('pages.orders.transfer.messages.detailTimeout') }
       )
-      detailData.value = normalizeTransferDetailRecord(response)
+      detailData.value = normalizeTransferDetailRecord(response, t)
     } finally {
       detailLoading.value = false
     }
@@ -226,7 +226,7 @@
         { timeoutMessage: t('pages.orders.transfer.messages.ordersTimeout') }
       )
       const normalized = defaultResponseAdapter(response)
-      detailOrderRows.value = normalized.records.map((item) => normalizeTransferOrderRow(item))
+      detailOrderRows.value = normalized.records.map((item) => normalizeTransferOrderRow(item, t))
       detailOrderPagination.total = Number(normalized.total || 0)
       detailOrderPagination.current = Number(normalized.current || detailOrderPagination.current || 1)
       detailOrderPagination.size = Number(normalized.size || detailOrderPagination.size || 20)
@@ -349,7 +349,7 @@
       columnsFactory: () => createTransferTableColumns({ handleActionClick })
     },
     transform: {
-      dataTransformer: (records) => (Array.isArray(records) ? records.map((item) => normalizeTransferRow(item)) : [])
+      dataTransformer: (records) => (Array.isArray(records) ? records.map((item) => normalizeTransferRow(item, t)) : [])
     }
   })
 
@@ -454,11 +454,11 @@
         }
       }),
     resolvePrintRecords,
-    buildPreviewRows: (records) => buildTransferPrintRows(records),
+    buildPreviewRows: (records) => buildTransferPrintRows(records, t),
     buildPreviewMeta: (rows) => {
       const now = new Date()
       return {
-        reportTitle,
+        reportTitle: reportTitle.value,
         reportDate: now.toLocaleDateString('zh-CN'),
         printedAt: now.toLocaleString('zh-CN', { hour12: false }),
         operator: userStore.getUserInfo?.name || userStore.getUserInfo?.username || '',
@@ -478,7 +478,8 @@
     buildTransferReportMeta({
       previewMeta: rawPreviewMeta.value,
       count: previewRows.value.length,
-      orientation: rawPreviewMeta.value?.reportStyle?.orientation || TRANSFER_REPORT_STYLE.orientation
+      orientation: rawPreviewMeta.value?.reportStyle?.orientation || TRANSFER_REPORT_STYLE.orientation,
+      t
     })
   )
 
diff --git a/rsf-design/src/views/orders/transfer/transferPage.helpers.js b/rsf-design/src/views/orders/transfer/transferPage.helpers.js
index d3fdeb3..2b3200a 100644
--- a/rsf-design/src/views/orders/transfer/transferPage.helpers.js
+++ b/rsf-design/src/views/orders/transfer/transferPage.helpers.js
@@ -1,24 +1,32 @@
 import { $t } from '@/locales'
 
-const TRANSFER_SOURCE_META = {
-  1: { text: $t('pages.orders.transfer.status.sourceErp'), type: 'info' },
-  2: { text: $t('pages.orders.transfer.status.sourceWms'), type: 'primary' },
-  3: { text: $t('pages.orders.transfer.status.sourceExcel'), type: 'warning' },
-  4: { text: $t('pages.orders.transfer.status.sourceQms'), type: 'success' }
+function getTransferSourceMetaMap(t = $t) {
+  return {
+    1: { text: t('pages.orders.transfer.status.sourceErp'), type: 'info' },
+    2: { text: t('pages.orders.transfer.status.sourceWms'), type: 'primary' },
+    3: { text: t('pages.orders.transfer.status.sourceExcel'), type: 'warning' },
+    4: { text: t('pages.orders.transfer.status.sourceQms'), type: 'success' }
+  }
 }
 
-const TRANSFER_EXCE_STATUS_META = {
-  0: { text: $t('pages.orders.transfer.status.pending'), type: 'info' },
-  1: { text: $t('pages.orders.transfer.status.running'), type: 'warning' },
-  2: { text: $t('pages.orders.transfer.status.completed'), type: 'success' }
+function getTransferExceStatusMetaMap(t = $t) {
+  return {
+    0: { text: t('pages.orders.transfer.status.pending'), type: 'info' },
+    1: { text: t('pages.orders.transfer.status.running'), type: 'warning' },
+    2: { text: t('pages.orders.transfer.status.completed'), type: 'success' }
+  }
 }
 
-const TRANSFER_STATUS_META = {
-  1: { text: $t('pages.orders.transfer.status.normal'), type: 'success', bool: true },
-  0: { text: $t('pages.orders.transfer.status.frozen'), type: 'danger', bool: false }
+function getTransferStatusMetaMap(t = $t) {
+  return {
+    1: { text: t('pages.orders.transfer.status.normal'), type: 'success', bool: true },
+    0: { text: t('pages.orders.transfer.status.frozen'), type: 'danger', bool: false }
+  }
 }
 
-export const TRANSFER_REPORT_TITLE = $t('pages.orders.transfer.reportTitle')
+export function getTransferReportTitle(t = $t) {
+  return t('pages.orders.transfer.reportTitle')
+}
 export const TRANSFER_REPORT_STYLE = {
   titleAlign: 'center',
   titleLevel: 'strong',
@@ -111,18 +119,18 @@
   ]
 }
 
-export function getTransferStatusOptions() {
+export function getTransferStatusOptions(t = $t) {
   return [
-    { label: $t('pages.orders.transfer.status.normal'), value: 1 },
-    { label: $t('pages.orders.transfer.status.frozen'), value: 0 }
+    { label: t('pages.orders.transfer.status.normal'), value: 1 },
+    { label: t('pages.orders.transfer.status.frozen'), value: 0 }
   ]
 }
 
-export function getTransferExceStatusOptions() {
+export function getTransferExceStatusOptions(t = $t) {
   return [
-    { label: $t('pages.orders.transfer.status.pending'), value: 0 },
-    { label: $t('pages.orders.transfer.status.running'), value: 1 },
-    { label: $t('pages.orders.transfer.status.completed'), value: 2 }
+    { label: t('pages.orders.transfer.status.pending'), value: 0 },
+    { label: t('pages.orders.transfer.status.running'), value: 1 },
+    { label: t('pages.orders.transfer.status.completed'), value: 2 }
   ]
 }
 
@@ -218,10 +226,10 @@
   return normalizeText(record[`${key}WareName$`] || record[`${key}WareName`] || record[`${key}WareId$`] || record[`${key}WareId`])
 }
 
-export function normalizeTransferRow(record = {}) {
-  const statusMeta = metaByValue(record.statusBool ?? record.status, TRANSFER_STATUS_META, $t('common.status.unknown'))
-  const exceStatusMeta = metaByValue(record.exceStatus, TRANSFER_EXCE_STATUS_META, record.exceStatusText)
-  const sourceMeta = metaByValue(record.source, TRANSFER_SOURCE_META, record.sourceText)
+export function normalizeTransferRow(record = {}, t = $t) {
+  const statusMeta = metaByValue(record.statusBool ?? record.status, getTransferStatusMetaMap(t), t('common.status.unknown'))
+  const exceStatusMeta = metaByValue(record.exceStatus, getTransferExceStatusMetaMap(t), record.exceStatusText)
+  const sourceMeta = metaByValue(record.source, getTransferSourceMetaMap(t), record.sourceText)
   return {
     ...record,
     id: record.id ?? null,
@@ -246,13 +254,13 @@
   }
 }
 
-export function normalizeTransferDetailRecord(record = {}) {
-  return normalizeTransferRow(record)
+export function normalizeTransferDetailRecord(record = {}, t = $t) {
+  return normalizeTransferRow(record, t)
 }
 
-export function normalizeTransferOrderRow(record = {}) {
-  const statusMeta = metaByValue(record.statusBool ?? record.status, TRANSFER_STATUS_META, $t('common.status.unknown'))
-  const exceStatusMeta = metaByValue(record.exceStatus, TRANSFER_EXCE_STATUS_META, record.exceStatusText)
+export function normalizeTransferOrderRow(record = {}, t = $t) {
+  const statusMeta = metaByValue(record.statusBool ?? record.status, getTransferStatusMetaMap(t), t('common.status.unknown'))
+  const exceStatusMeta = metaByValue(record.exceStatus, getTransferExceStatusMetaMap(t), record.exceStatusText)
   return {
     ...record,
     id: record.id ?? null,
@@ -278,21 +286,22 @@
   }
 }
 
-export function buildTransferPrintRows(records = []) {
-  return Array.isArray(records) ? records.map((record) => normalizeTransferRow(record)) : []
+export function buildTransferPrintRows(records = [], t = $t) {
+  return Array.isArray(records) ? records.map((record) => normalizeTransferRow(record, t)) : []
 }
 
-export function buildTransferOrderPrintRows(records = []) {
-  return Array.isArray(records) ? records.map((record) => normalizeTransferOrderRow(record)) : []
+export function buildTransferOrderPrintRows(records = [], t = $t) {
+  return Array.isArray(records) ? records.map((record) => normalizeTransferOrderRow(record, t)) : []
 }
 
 export function buildTransferReportMeta({
   previewMeta = {},
   count = 0,
-  orientation = TRANSFER_REPORT_STYLE.orientation
+  orientation = TRANSFER_REPORT_STYLE.orientation,
+  t = $t
 } = {}) {
   return {
-    reportTitle: TRANSFER_REPORT_TITLE,
+    reportTitle: getTransferReportTitle(t),
     reportDate: previewMeta.reportDate,
     printedAt: previewMeta.printedAt,
     operator: previewMeta.operator,
diff --git a/rsf-design/src/views/orders/wave-item/index.vue b/rsf-design/src/views/orders/wave-item/index.vue
index 0271f9a..f41d644 100644
--- a/rsf-design/src/views/orders/wave-item/index.vue
+++ b/rsf-design/src/views/orders/wave-item/index.vue
@@ -45,6 +45,7 @@
 
 <script setup>
   import { computed, ref } from 'vue'
+  import { useI18n } from 'vue-i18n'
   import { useUserStore } from '@/store/modules/user'
   import { useTable } from '@/hooks/core/useTable'
   import { usePrintExportPage } from '@/views/system/common/usePrintExportPage'
@@ -57,6 +58,7 @@
     buildWaveItemReportMeta,
     buildWaveItemSearchParams,
     createWaveItemSearchState,
+    getWaveItemReportTitle,
     normalizeWaveItemRow
   } from './waveItemPage.helpers'
   import { createWaveItemDetailColumns, createWaveItemTableColumns } from './waveItemTable.columns'
@@ -65,8 +67,9 @@
 
   defineOptions({ name: 'WaveItemOrder' })
 
+  const { t } = useI18n()
   const userStore = useUserStore()
-  const reportTitle = '娉㈡鏄庣粏鎶ヨ〃'
+  const reportTitle = computed(() => getWaveItemReportTitle(t))
   const searchForm = ref(createWaveItemSearchState())
   const selectedRows = ref([])
   const detailDrawerVisible = ref(false)
@@ -75,16 +78,16 @@
 
   const reportQueryParams = computed(() => buildWaveItemSearchParams(searchForm.value))
   const searchItems = computed(() => [
-    { label: '鍏抽敭瀛�', key: 'condition', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ユ尝娆″崟鍙�/鐗╂枡缂栫爜/鐗╂枡鍚嶇О' } },
-    { label: '娉㈡鍗曞彿', key: 'waveCode', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ユ尝娆″崟鍙�' } },
-    { label: '鍗曟嵁缂栫爜', key: 'orderCode', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ュ崟鎹紪鐮�' } },
-    { label: '鐗╂枡缂栫爜', key: 'matnrCode', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ョ墿鏂欑紪鐮�' } },
-    { label: '鐗╂枡鍚嶇О', key: 'maktx', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ョ墿鏂欏悕绉�' } },
-    { label: '鎵规', key: 'batch', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ユ壒娆�' } },
-    { label: '渚涘簲鍟嗘壒娆�', key: 'splrBatch', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ヤ緵搴斿晢鎵规' } },
-    { label: '鍔ㄦ�佸瓧娈电储寮�', key: 'fieldsIndex', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ュ姩鎬佸瓧娈电储寮�' } },
-    { label: '寮�濮嬫椂闂�', key: 'timeStart', type: 'date', props: { clearable: true, type: 'date', valueFormat: 'YYYY-MM-DD' } },
-    { label: '缁撴潫鏃堕棿', key: 'timeEnd', type: 'date', props: { clearable: true, type: 'date', valueFormat: 'YYYY-MM-DD' } }
+    { label: t('pages.orders.waveItem.search.condition'), key: 'condition', type: 'input', props: { clearable: true, placeholder: t('pages.orders.waveItem.search.conditionPlaceholder') } },
+    { label: t('pages.orders.waveItem.search.waveCode'), key: 'waveCode', type: 'input', props: { clearable: true, placeholder: t('pages.orders.waveItem.search.waveCodePlaceholder') } },
+    { label: t('pages.orders.waveItem.search.orderCode'), key: 'orderCode', type: 'input', props: { clearable: true, placeholder: t('pages.orders.waveItem.search.orderCodePlaceholder') } },
+    { label: t('pages.orders.waveItem.search.matnrCode'), key: 'matnrCode', type: 'input', props: { clearable: true, placeholder: t('pages.orders.waveItem.search.matnrCodePlaceholder') } },
+    { label: t('pages.orders.waveItem.search.maktx'), key: 'maktx', type: 'input', props: { clearable: true, placeholder: t('pages.orders.waveItem.search.maktxPlaceholder') } },
+    { label: t('pages.orders.waveItem.search.batch'), key: 'batch', type: 'input', props: { clearable: true, placeholder: t('pages.orders.waveItem.search.batchPlaceholder') } },
+    { label: t('pages.orders.waveItem.search.splrBatch'), key: 'splrBatch', type: 'input', props: { clearable: true, placeholder: t('pages.orders.waveItem.search.splrBatchPlaceholder') } },
+    { label: t('pages.orders.waveItem.search.fieldsIndex'), key: 'fieldsIndex', type: 'input', props: { clearable: true, placeholder: t('pages.orders.waveItem.search.fieldsIndexPlaceholder') } },
+    { label: t('pages.orders.waveItem.search.timeStart'), key: 'timeStart', type: 'date', props: { clearable: true, type: 'date', valueFormat: 'YYYY-MM-DD' } },
+    { label: t('pages.orders.waveItem.search.timeEnd'), key: 'timeEnd', type: 'date', props: { clearable: true, type: 'date', valueFormat: 'YYYY-MM-DD' } }
   ])
 
   async function openDetail(row) {
@@ -112,10 +115,10 @@
         ...searchForm.value,
         pageSize: 20
       }),
-      columnsFactory: () => createWaveItemTableColumns({ handleActionClick: openDetail })
+      columnsFactory: () => createWaveItemTableColumns({ handleActionClick: openDetail, t })
     },
     transform: {
-      dataTransformer: (records) => (Array.isArray(records) ? records.map((item) => normalizeWaveItemRow(item)) : [])
+      dataTransformer: (records) => (Array.isArray(records) ? records.map((item) => normalizeWaveItemRow(item, t)) : [])
     }
   })
 
@@ -124,8 +127,8 @@
       return
     }
 
-    const detailResponse = await guardRequestWithMessage(fetchGetWaveItemDetail(activeItemId.value), {}, { timeoutMessage: '娉㈡鏄庣粏璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟' })
-    detailData.value = normalizeWaveItemRow(detailResponse)
+    const detailResponse = await guardRequestWithMessage(fetchGetWaveItemDetail(activeItemId.value), {}, { timeoutMessage: t('pages.orders.waveItem.messages.detailTimeout') })
+    detailData.value = normalizeWaveItemRow(detailResponse, t)
   }
 
   function handleSelectionChange(rows) {
@@ -172,11 +175,11 @@
         }
       }),
     resolvePrintRecords,
-    buildPreviewRows: (records) => buildWaveItemPrintRows(records),
+    buildPreviewRows: (records) => buildWaveItemPrintRows(records, t),
     buildPreviewMeta: (rows) => {
       const now = new Date()
       return {
-        reportTitle,
+        reportTitle: reportTitle.value,
         reportDate: now.toLocaleDateString('zh-CN'),
         printedAt: now.toLocaleString('zh-CN', { hour12: false }),
         operator: userStore.getUserInfo?.name || userStore.getUserInfo?.username || '',
@@ -196,7 +199,8 @@
     buildWaveItemReportMeta({
       previewMeta: rawPreviewMeta.value,
       count: previewRows.value.length,
-      orientation: rawPreviewMeta.value?.reportStyle?.orientation || 'landscape'
+      orientation: rawPreviewMeta.value?.reportStyle?.orientation || 'landscape',
+      t
     })
   )
 </script>
diff --git a/rsf-design/src/views/orders/wave-item/modules/wave-item-detail-drawer.vue b/rsf-design/src/views/orders/wave-item/modules/wave-item-detail-drawer.vue
index a065dcc..cb9063f 100644
--- a/rsf-design/src/views/orders/wave-item/modules/wave-item-detail-drawer.vue
+++ b/rsf-design/src/views/orders/wave-item/modules/wave-item-detail-drawer.vue
@@ -1,32 +1,32 @@
 <template>
   <ElDrawer
     :model-value="visible"
-    title="娉㈡鏄庣粏璇︽儏"
+    :title="t('pages.orders.waveItem.detail.title')"
     size="80%"
     @update:model-value="handleVisibleChange"
   >
     <ElScrollbar class="wave-item-detail-scroll">
       <div class="flex min-h-full flex-col gap-4 pr-2">
         <ElDescriptions :column="4" border>
-          <ElDescriptionsItem label="娉㈡鍗曞彿">{{ detail.waveCode || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鍗曟嵁缂栫爜">{{ detail.orderCode || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鐗╂枡缂栫爜">{{ detail.matnrCode || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鐗╂枡鍚嶇О">{{ detail.maktx || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鎵规">{{ detail.batch || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="渚涘簲鍟嗘壒娆�">{{ detail.splrBatch || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鍗曚綅">{{ detail.unit || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鍔ㄦ�佸瓧娈电储寮�">{{ detail.fieldsIndex || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="搴旈厤鏁伴噺">{{ detail.anfme ?? '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="宸查厤鏁伴噺">{{ detail.workQty ?? '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="搴撳瓨鏁伴噺">{{ detail.stockQty ?? '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鎵ц鐘舵��">
+          <ElDescriptionsItem :label="t('pages.orders.waveItem.detail.waveCode')">{{ detail.waveCode || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.waveItem.detail.orderCode')">{{ detail.orderCode || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.waveItem.detail.matnrCode')">{{ detail.matnrCode || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.waveItem.detail.maktx')">{{ detail.maktx || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.waveItem.detail.batch')">{{ detail.batch || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.waveItem.detail.splrBatch')">{{ detail.splrBatch || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.waveItem.detail.unit')">{{ detail.unit || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.waveItem.detail.fieldsIndex')">{{ detail.fieldsIndex || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.waveItem.detail.anfme')">{{ detail.anfme ?? '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.waveItem.detail.workQty')">{{ detail.workQty ?? '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.waveItem.detail.stockQty')">{{ detail.stockQty ?? '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.waveItem.detail.exceStatus')">
             <ElTag :type="detail.exceStatusTagType || 'info'" effect="light">
               {{ detail.exceStatusText || '--' }}
             </ElTag>
           </ElDescriptionsItem>
-          <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="搴撲綅" :span="4">{{ detail.stockLocsText || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.waveItem.detail.createTime')">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.waveItem.detail.updateTime')">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.waveItem.detail.stockLocs')" :span="4">{{ detail.stockLocsText || '--' }}</ElDescriptionsItem>
         </ElDescriptions>
       </div>
     </ElScrollbar>
@@ -34,7 +34,10 @@
 </template>
 
 <script setup>
+  import { useI18n } from 'vue-i18n'
+
   defineOptions({ name: 'WaveItemDetailDrawer' })
+  const { t } = useI18n()
 
   defineProps({
     visible: { type: Boolean, default: false },
diff --git a/rsf-design/src/views/orders/wave-item/waveItemPage.helpers.js b/rsf-design/src/views/orders/wave-item/waveItemPage.helpers.js
index a8f0500..1e12885 100644
--- a/rsf-design/src/views/orders/wave-item/waveItemPage.helpers.js
+++ b/rsf-design/src/views/orders/wave-item/waveItemPage.helpers.js
@@ -1,4 +1,12 @@
-export const WAVE_ITEM_REPORT_TITLE = '娉㈡鏄庣粏鎶ヨ〃'
+import { $t } from '@/locales'
+
+function translate(t, key, params) {
+  return (typeof t === 'function' ? t : $t)(key, params)
+}
+
+export function getWaveItemReportTitle(t) {
+  return translate(t, 'pages.orders.waveItem.reportTitle')
+}
 export const WAVE_ITEM_REPORT_STYLE = {
   titleAlign: 'center',
   titleLevel: 'strong',
@@ -19,22 +27,19 @@
   return Number.isFinite(numericValue) ? numericValue : 0
 }
 
-const WAVE_ITEM_STATUS_MAP = {
-  0: { label: '鏈墽琛�', tagType: 'info' },
-  1: { label: '鎵ц涓�', tagType: 'warning' },
-  2: { label: '鏆傚仠', tagType: 'warning' },
-  3: { label: '宸蹭笅鍙�', tagType: 'primary' },
-  4: { label: '浠诲姟瀹屾垚', tagType: 'success' }
+const WAVE_ITEM_STATUS_TAG_MAP = {
+  0: 'info',
+  1: 'warning',
+  2: 'warning',
+  3: 'primary',
+  4: 'success'
 }
 
-function getItemStatusConfig(status, statusText) {
-  const fallback = WAVE_ITEM_STATUS_MAP[Number(status)] || {
-    label: statusText || '-',
-    tagType: 'info'
-  }
+function getItemStatusConfig(status, statusText, t) {
+  const fallbackLabel = statusText || translate(t, `pages.orders.waveItem.status.exceStatus.${Number(status)}`)
   return {
-    label: statusText || fallback.label,
-    tagType: fallback.tagType
+    label: fallbackLabel || '-',
+    tagType: WAVE_ITEM_STATUS_TAG_MAP[Number(status)] || 'info'
   }
 }
 
@@ -115,8 +120,8 @@
   }
 }
 
-export function normalizeWaveItemRow(record = {}) {
-  const statusConfig = getItemStatusConfig(record.exceStatus, record['exceStatus$'])
+export function normalizeWaveItemRow(record = {}, t) {
+  const statusConfig = getItemStatusConfig(record.exceStatus, record['exceStatus$'], t)
   return {
     ...record,
     waveCode: record.waveCode || '-',
@@ -139,20 +144,21 @@
   }
 }
 
-export function buildWaveItemPrintRows(records = []) {
+export function buildWaveItemPrintRows(records = [], t) {
   if (!Array.isArray(records)) {
     return []
   }
-  return records.map((record) => normalizeWaveItemRow(record))
+  return records.map((record) => normalizeWaveItemRow(record, t))
 }
 
 export function buildWaveItemReportMeta({
   previewMeta = {},
   count = 0,
-  orientation = WAVE_ITEM_REPORT_STYLE.orientation
+  orientation = WAVE_ITEM_REPORT_STYLE.orientation,
+  t
 } = {}) {
   return {
-    reportTitle: WAVE_ITEM_REPORT_TITLE,
+    reportTitle: getWaveItemReportTitle(t),
     reportDate: previewMeta.reportDate,
     printedAt: previewMeta.printedAt,
     operator: previewMeta.operator,
diff --git a/rsf-design/src/views/orders/wave-item/waveItemTable.columns.js b/rsf-design/src/views/orders/wave-item/waveItemTable.columns.js
index 4e1a373..ca44126 100644
--- a/rsf-design/src/views/orders/wave-item/waveItemTable.columns.js
+++ b/rsf-design/src/views/orders/wave-item/waveItemTable.columns.js
@@ -1,79 +1,81 @@
 import { h } from 'vue'
 import { ElTag } from 'element-plus'
+import { $t } from '@/locales'
 import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
 
-export function createWaveItemTableColumns({ handleActionClick }) {
+export function createWaveItemTableColumns({ handleActionClick, t }) {
+  const translate = typeof t === 'function' ? t : $t
   return [
     { type: 'selection', width: 48, align: 'center' },
-    { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+    { type: 'globalIndex', label: translate('table.index'), width: 72, align: 'center' },
     {
       prop: 'waveCode',
-      label: '娉㈡鍗曞彿',
+      label: translate('pages.orders.waveItem.table.waveCode'),
       minWidth: 170,
       showOverflowTooltip: true
     },
     {
       prop: 'orderCode',
-      label: '鍗曟嵁缂栫爜',
+      label: translate('pages.orders.waveItem.table.orderCode'),
       minWidth: 170,
       showOverflowTooltip: true
     },
     {
       prop: 'matnrCode',
-      label: '鐗╂枡缂栫爜',
+      label: translate('pages.orders.waveItem.table.matnrCode'),
       minWidth: 150,
       showOverflowTooltip: true
     },
     {
       prop: 'maktx',
-      label: '鐗╂枡鍚嶇О',
+      label: translate('pages.orders.waveItem.table.maktx'),
       minWidth: 220,
       showOverflowTooltip: true
     },
     {
       prop: 'batch',
-      label: '鎵规',
+      label: translate('pages.orders.waveItem.table.batch'),
       minWidth: 130,
       showOverflowTooltip: true
     },
     {
       prop: 'splrBatch',
-      label: '渚涘簲鍟嗘壒娆�',
+      label: translate('pages.orders.waveItem.table.splrBatch'),
       minWidth: 150,
       showOverflowTooltip: true
     },
     {
       prop: 'unit',
-      label: '鍗曚綅',
+      label: translate('pages.orders.waveItem.table.unit'),
       width: 90
     },
     {
       prop: 'anfme',
-      label: '搴旈厤鏁伴噺',
+      label: translate('pages.orders.waveItem.table.anfme'),
       width: 110,
       align: 'right'
     },
     {
       prop: 'workQty',
-      label: '宸查厤鏁伴噺',
+      label: translate('pages.orders.waveItem.table.workQty'),
       width: 110,
       align: 'right'
     },
     {
       prop: 'stockQty',
-      label: '搴撳瓨鏁伴噺',
+      label: translate('pages.orders.waveItem.table.stockQty'),
       width: 110,
       align: 'right'
     },
     {
       prop: 'fieldsIndex',
-      label: '鍔ㄦ�佸瓧娈电储寮�',
+      label: translate('pages.orders.waveItem.table.fieldsIndex'),
       minWidth: 160,
       showOverflowTooltip: true
     },
     {
       prop: 'exceStatusText',
-      label: '鎵ц鐘舵��',
+      label: translate('pages.orders.waveItem.table.exceStatus'),
       width: 120,
       formatter: (row) =>
         h(
@@ -84,13 +86,13 @@
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: translate('pages.orders.waveItem.table.updateTime'),
       minWidth: 170,
       showOverflowTooltip: true
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: translate('table.operation'),
       width: 120,
       align: 'center',
       fixed: 'right',
@@ -99,7 +101,7 @@
           list: [
             {
               key: 'view',
-              label: '鏌ョ湅璇︽儏',
+              label: translate('pages.orders.waveItem.actions.view'),
               icon: 'ri:eye-line'
             }
           ],
@@ -110,70 +112,71 @@
 }
 
 export function createWaveItemDetailColumns() {
+  const translate = $t
   return [
-    { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+    { type: 'globalIndex', label: translate('table.index'), width: 72, align: 'center' },
     {
       prop: 'waveCode',
-      label: '娉㈡鍗曞彿',
+      label: translate('pages.orders.waveItem.table.waveCode'),
       minWidth: 170,
       showOverflowTooltip: true
     },
     {
       prop: 'orderCode',
-      label: '鍗曟嵁缂栫爜',
+      label: translate('pages.orders.waveItem.table.orderCode'),
       minWidth: 170,
       showOverflowTooltip: true
     },
     {
       prop: 'matnrCode',
-      label: '鐗╂枡缂栫爜',
+      label: translate('pages.orders.waveItem.table.matnrCode'),
       minWidth: 150,
       showOverflowTooltip: true
     },
     {
       prop: 'maktx',
-      label: '鐗╂枡鍚嶇О',
+      label: translate('pages.orders.waveItem.table.maktx'),
       minWidth: 220,
       showOverflowTooltip: true
     },
     {
       prop: 'batch',
-      label: '鎵规',
+      label: translate('pages.orders.waveItem.table.batch'),
       minWidth: 130,
       showOverflowTooltip: true
     },
     {
       prop: 'splrBatch',
-      label: '渚涘簲鍟嗘壒娆�',
+      label: translate('pages.orders.waveItem.table.splrBatch'),
       minWidth: 150,
       showOverflowTooltip: true
     },
     {
       prop: 'unit',
-      label: '鍗曚綅',
+      label: translate('pages.orders.waveItem.table.unit'),
       width: 90
     },
     {
       prop: 'anfme',
-      label: '搴旈厤鏁伴噺',
+      label: translate('pages.orders.waveItem.table.anfme'),
       width: 110,
       align: 'right'
     },
     {
       prop: 'workQty',
-      label: '宸查厤鏁伴噺',
+      label: translate('pages.orders.waveItem.table.workQty'),
       width: 110,
       align: 'right'
     },
     {
       prop: 'stockQty',
-      label: '搴撳瓨鏁伴噺',
+      label: translate('pages.orders.waveItem.table.stockQty'),
       width: 110,
       align: 'right'
     },
     {
       prop: 'stockLocsText',
-      label: '搴撲綅',
+      label: translate('pages.orders.waveItem.table.stockLocs'),
       minWidth: 220,
       showOverflowTooltip: true
     }
diff --git a/rsf-design/src/views/orders/wave/index.vue b/rsf-design/src/views/orders/wave/index.vue
index eaa0a3f..7b2a419 100644
--- a/rsf-design/src/views/orders/wave/index.vue
+++ b/rsf-design/src/views/orders/wave/index.vue
@@ -59,6 +59,7 @@
       :columns="publicTaskColumns"
       :pagination="publicTaskPagination"
       :can-submit="publicTaskCanSubmit"
+      :warning-text="publicTaskWarningText"
       @size-change="handlePublicTaskSizeChange"
       @current-change="handlePublicTaskCurrentChange"
       @submit="handleSubmitPublicTask"
@@ -69,6 +70,7 @@
 <script setup>
   import { computed, reactive, ref } from 'vue'
   import { ElMessage, ElMessageBox } from 'element-plus'
+  import { useI18n } from 'vue-i18n'
   import { useUserStore } from '@/store/modules/user'
   import { useTable } from '@/hooks/core/useTable'
   import { usePrintExportPage } from '@/views/system/common/usePrintExportPage'
@@ -82,6 +84,7 @@
     buildWaveReportMeta,
     buildWaveSearchParams,
     createWaveSearchState,
+    getWaveReportTitle,
     normalizeWaveItemRow,
     normalizeWaveRow,
     WAVE_REPORT_STYLE
@@ -107,8 +110,9 @@
 
   defineOptions({ name: 'WaveOrder' })
 
+  const { t } = useI18n()
   const userStore = useUserStore()
-  const reportTitle = '娉㈡鍗曟姤琛�'
+  const reportTitle = computed(() => getWaveReportTitle(t))
   const searchForm = ref(createWaveSearchState())
   const selectedRows = ref([])
   const detailDrawerVisible = ref(false)
@@ -135,43 +139,71 @@
   })
 
   const reportQueryParams = computed(() => buildWaveSearchParams(searchForm.value))
-  const detailColumns = computed(() => createWaveDetailItemColumns())
-  const publicTaskColumns = computed(() => createWavePreviewItemColumns())
+  const detailColumns = computed(() => createWaveDetailItemColumns(t))
+  const publicTaskColumns = computed(() => createWavePreviewItemColumns(t))
   const publicTaskCanSubmit = computed(
     () => publicTaskRows.value.length > 0 && publicTaskRows.value.every((row) => row.stockLocsText && row.stockLocsText !== '[]')
   )
+  const publicTaskWarningText = computed(() => t('pages.orders.wave.messages.publicTaskWarning'))
   const searchItems = computed(() => [
-    { label: '鍏抽敭瀛�', key: 'condition', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ユ尝娆″崟鍙�/澶囨敞' } },
-    { label: '娉㈡鍗曞彿', key: 'code', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ユ尝娆″崟鍙�' } },
     {
-      label: '娉㈡绫诲瀷',
-      key: 'type',
-      type: 'select',
-      props: { clearable: true, options: [{ label: '鎵嬪姩', value: 0 }, { label: '鑷姩', value: 1 }] }
+      label: t('pages.orders.wave.search.condition'),
+      key: 'condition',
+      type: 'input',
+      props: { clearable: true, placeholder: t('pages.orders.wave.search.conditionPlaceholder') }
     },
     {
-      label: '娉㈡鐘舵��',
+      label: t('pages.orders.wave.search.code'),
+      key: 'code',
+      type: 'input',
+      props: { clearable: true, placeholder: t('pages.orders.wave.search.codePlaceholder') }
+    },
+    {
+      label: t('pages.orders.wave.search.type'),
+      key: 'type',
+      type: 'select',
+      props: {
+        clearable: true,
+        options: [
+          { label: t('pages.orders.wave.status.type.0'), value: 0 },
+          { label: t('pages.orders.wave.status.type.1'), value: 1 }
+        ]
+      }
+    },
+    {
+      label: t('pages.orders.wave.search.exceStatus'),
       key: 'exceStatus',
       type: 'select',
       props: {
         clearable: true,
         options: [
-          { label: '绛夊緟鎵ц', value: 0 },
-          { label: '姝e湪鎵ц', value: 1 },
-          { label: '鏆傚仠鎵ц', value: 2 },
-          { label: '鎵ц瀹屾垚', value: 3 }
+          { label: t('pages.orders.wave.status.exceStatus.0'), value: 0 },
+          { label: t('pages.orders.wave.status.exceStatus.1'), value: 1 },
+          { label: t('pages.orders.wave.status.exceStatus.2'), value: 2 },
+          { label: t('pages.orders.wave.status.exceStatus.3'), value: 3 }
         ]
       }
     },
     {
-      label: '鐘舵��',
+      label: t('pages.orders.wave.search.status'),
       key: 'status',
       type: 'select',
-      props: { clearable: true, options: [{ label: '姝e父', value: 1 }, { label: '绂佺敤', value: 0 }] }
+      props: {
+        clearable: true,
+        options: [
+          { label: t('common.status.normal'), value: 1 },
+          { label: t('common.status.disabled'), value: 0 }
+        ]
+      }
     },
-    { label: '澶囨敞', key: 'memo', type: 'input', props: { clearable: true, placeholder: '璇疯緭鍏ュ娉�' } },
-    { label: '寮�濮嬫椂闂�', key: 'timeStart', type: 'date', props: { clearable: true, type: 'date', valueFormat: 'YYYY-MM-DD' } },
-    { label: '缁撴潫鏃堕棿', key: 'timeEnd', type: 'date', props: { clearable: true, type: 'date', valueFormat: 'YYYY-MM-DD' } }
+    {
+      label: t('pages.orders.wave.search.memo'),
+      key: 'memo',
+      type: 'input',
+      props: { clearable: true, placeholder: t('pages.orders.wave.search.memoPlaceholder') }
+    },
+    { label: t('pages.orders.wave.search.timeStart'), key: 'timeStart', type: 'date', props: { clearable: true, type: 'date', valueFormat: 'YYYY-MM-DD' } },
+    { label: t('pages.orders.wave.search.timeEnd'), key: 'timeEnd', type: 'date', props: { clearable: true, type: 'date', valueFormat: 'YYYY-MM-DD' } }
   ])
 
   function updatePaginationState(target, response, fallbackCurrent, fallbackSize) {
@@ -188,7 +220,7 @@
   }
 
   async function openPublicTask(row) {
-    publicTaskWave.value = normalizeWaveRow(row)
+    publicTaskWave.value = normalizeWaveRow(row, t)
     publicTaskPagination.current = 1
     publicTaskDialogVisible.value = true
     await loadPublicTaskResources()
@@ -211,29 +243,29 @@
       }
       if (action.key === 'pause') {
         await fetchPauseWave(row.id)
-        ElMessage.success('娉㈡宸叉殏鍋�')
+        ElMessage.success(t('pages.orders.wave.messages.pauseSuccess'))
         await refreshData()
         return
       }
       if (action.key === 'continue') {
         await fetchContinueWave(row.id)
-        ElMessage.success('娉㈡宸茬户缁�')
+        ElMessage.success(t('pages.orders.wave.messages.continueSuccess'))
         await refreshData()
         return
       }
       if (action.key === 'stop') {
-        await ElMessageBox.confirm(`纭畾缁堟娉㈡鍗� ${row.code || ''} 鍚楋紵`, '缁堟纭', {
-          confirmButtonText: '纭畾',
-          cancelButtonText: '鍙栨秷',
+        await ElMessageBox.confirm(t('pages.orders.wave.messages.stopConfirm', { code: row.code || '' }), t('pages.orders.wave.messages.stopTitle'), {
+          confirmButtonText: t('common.confirm'),
+          cancelButtonText: t('common.cancel'),
           type: 'warning'
         })
         await fetchStopWave(row.id)
-        ElMessage.success('娉㈡宸茬粓姝�')
+        ElMessage.success(t('pages.orders.wave.messages.stopSuccess'))
         await refreshData()
       }
     } catch (error) {
       if (error === 'cancel' || error?.message === 'cancel') return
-      ElMessage.error(error?.message || '娉㈡鎿嶄綔澶辫触')
+      ElMessage.error(error?.message || t('pages.orders.wave.messages.actionFailed'))
     }
   }
 
@@ -253,10 +285,10 @@
     core: {
       apiFn: fetchWavePage,
       apiParams: buildWavePageQueryParams(searchForm.value),
-      columnsFactory: () => createWaveTableColumns({ handleActionClick })
+      columnsFactory: () => createWaveTableColumns({ handleActionClick, t })
     },
     transform: {
-      dataTransformer: (records) => (Array.isArray(records) ? records.map((item) => normalizeWaveRow(item)) : [])
+      dataTransformer: (records) => (Array.isArray(records) ? records.map((item) => normalizeWaveRow(item, t)) : [])
     }
   })
 
@@ -268,15 +300,15 @@
     detailLoading.value = true
     try {
       const [detailResponse, previewResponse] = await Promise.all([
-        guardRequestWithMessage(fetchGetWaveDetail(activeWaveId.value), {}, { timeoutMessage: '娉㈡鍗曡鎯呭姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�' }),
+        guardRequestWithMessage(fetchGetWaveDetail(activeWaveId.value), {}, { timeoutMessage: t('pages.orders.wave.messages.detailTimeout') }),
         guardRequestWithMessage(
           fetchWavePreviewPage(buildWaveDetailQueryParams({ waveId: activeWaveId.value, current: detailPagination.current, pageSize: detailPagination.size })),
           { records: [], total: 0, current: detailPagination.current, size: detailPagination.size },
-          { timeoutMessage: '娉㈡棰勮鏄庣粏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟' }
+          { timeoutMessage: t('pages.orders.wave.messages.previewTimeout') }
         )
       ])
-      detailData.value = normalizeWaveRow(detailResponse)
-      detailTableData.value = Array.isArray(previewResponse?.records) ? previewResponse.records.map((item) => normalizeWaveItemRow(item)) : []
+      detailData.value = normalizeWaveRow(detailResponse, t)
+      detailTableData.value = Array.isArray(previewResponse?.records) ? previewResponse.records.map((item) => normalizeWaveItemRow(item, t)) : []
       updatePaginationState(detailPagination, previewResponse, detailPagination.current, detailPagination.size)
     } finally {
       detailLoading.value = false
@@ -293,9 +325,9 @@
       const previewResponse = await guardRequestWithMessage(
         fetchWavePreviewPage(buildWaveDetailQueryParams({ waveId: publicTaskWave.value.id, current: publicTaskPagination.current, pageSize: publicTaskPagination.size })),
         { records: [], total: 0, current: publicTaskPagination.current, size: publicTaskPagination.size },
-        { timeoutMessage: '娉㈡涓嬪彂棰勮鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟' }
+        { timeoutMessage: t('pages.orders.wave.messages.publicTaskTimeout') }
       )
-      publicTaskRows.value = Array.isArray(previewResponse?.records) ? previewResponse.records.map((item) => normalizeWaveItemRow(item)) : []
+      publicTaskRows.value = Array.isArray(previewResponse?.records) ? previewResponse.records.map((item) => normalizeWaveItemRow(item, t)) : []
       updatePaginationState(publicTaskPagination, previewResponse, publicTaskPagination.current, publicTaskPagination.size)
     } finally {
       publicTaskLoading.value = false
@@ -311,16 +343,16 @@
       })
       const result = defaultResponseAdapter(response)
       if (result?.code !== 200 && result?.success !== true) {
-        throw new Error(result?.message || '娉㈡涓嬪彂澶辫触')
+        throw new Error(result?.message || t('pages.orders.wave.messages.publicTaskFailed'))
       }
-      ElMessage.success(result?.message || '娉㈡宸蹭笅鍙�')
+      ElMessage.success(result?.message || t('pages.orders.wave.messages.publicTaskSuccess'))
       publicTaskDialogVisible.value = false
       await refreshData()
       if (detailDrawerVisible.value && activeWaveId.value === publicTaskWave.value.id) {
         await loadDetailResources()
       }
     } catch (error) {
-      ElMessage.error(error?.message || '娉㈡涓嬪彂澶辫触')
+      ElMessage.error(error?.message || t('pages.orders.wave.messages.publicTaskFailed'))
     } finally {
       publicTaskSubmitting.value = false
     }
@@ -390,11 +422,11 @@
         }
       }),
     resolvePrintRecords,
-    buildPreviewRows: (records) => buildWavePrintRows(records),
+    buildPreviewRows: (records) => buildWavePrintRows(records, t),
     buildPreviewMeta: (rows) => {
       const now = new Date()
       return {
-        reportTitle,
+        reportTitle: reportTitle.value,
         reportDate: now.toLocaleDateString('zh-CN'),
         printedAt: now.toLocaleString('zh-CN', { hour12: false }),
         operator: userStore.getUserInfo?.name || userStore.getUserInfo?.username || '',
@@ -410,7 +442,8 @@
     buildWaveReportMeta({
       previewMeta: rawPreviewMeta.value,
       count: previewRows.value.length,
-      orientation: rawPreviewMeta.value?.reportStyle?.orientation || WAVE_REPORT_STYLE.orientation
+      orientation: rawPreviewMeta.value?.reportStyle?.orientation || WAVE_REPORT_STYLE.orientation,
+      t
     })
   )
 </script>
diff --git a/rsf-design/src/views/orders/wave/modules/wave-detail-drawer.vue b/rsf-design/src/views/orders/wave/modules/wave-detail-drawer.vue
index 3009a49..c0ffe6a 100644
--- a/rsf-design/src/views/orders/wave/modules/wave-detail-drawer.vue
+++ b/rsf-design/src/views/orders/wave/modules/wave-detail-drawer.vue
@@ -1,39 +1,39 @@
 <template>
   <ElDrawer
     :model-value="visible"
-    title="娉㈡鍗曡鎯�"
+    :title="t('pages.orders.wave.detail.title')"
     size="88%"
     @update:model-value="handleVisibleChange"
   >
     <ElScrollbar class="wave-detail-scroll">
       <div class="flex min-h-full flex-col gap-4 pr-2">
         <ElDescriptions :column="4" border>
-          <ElDescriptionsItem label="娉㈡鍗曞彿">{{ detail.code || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="娉㈡绫诲瀷">{{ detail.typeLabel || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="娉㈡鐘舵��">{{ detail.exceStatusText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鐘舵��">
+          <ElDescriptionsItem :label="t('pages.orders.wave.detail.code')">{{ detail.code || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.wave.detail.type')">{{ detail.typeLabel || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.wave.detail.exceStatus')">{{ detail.exceStatusText || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.wave.detail.status')">
             <ElTag :type="Number(detail.status) === 1 ? 'success' : 'danger'" effect="light">
               {{ detail.statusLabel || '--' }}
             </ElTag>
           </ElDescriptionsItem>
-          <ElDescriptionsItem label="搴旂洏鏁伴噺">{{ detail.anfme ?? '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鎵ц鏁伴噺">{{ detail.workQty ?? '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="宸茬洏鏁伴噺">{{ detail.qty ?? '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鍗曟嵁鏁伴噺">{{ detail.orderNum ?? '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鍝佺被鏁伴噺">{{ detail.groupQty ?? '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鐩爣浣嶇疆">{{ detail.targSite || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鎸囧畾绔欑偣">{{ detail.stationId || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鎸囧畾搴撲綅">{{ detail.locCode || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鍒涘缓浜�">{{ detail.createByText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鏇存柊浜�">{{ detail.updateByText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="澶囨敞" :span="4">{{ detail.memo || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.wave.detail.anfme')">{{ detail.anfme ?? '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.wave.detail.workQty')">{{ detail.workQty ?? '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.wave.detail.qty')">{{ detail.qty ?? '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.wave.detail.orderNum')">{{ detail.orderNum ?? '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.wave.detail.groupQty')">{{ detail.groupQty ?? '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.wave.detail.targSite')">{{ detail.targSite || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.wave.detail.stationId')">{{ detail.stationId || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.wave.detail.locCode')">{{ detail.locCode || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.wave.detail.createBy')">{{ detail.createByText || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.wave.detail.createTime')">{{ detail.createTimeText || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.wave.detail.updateBy')">{{ detail.updateByText || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.wave.detail.updateTime')">{{ detail.updateTimeText || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.orders.wave.detail.memo')" :span="4">{{ detail.memo || '--' }}</ElDescriptionsItem>
         </ElDescriptions>
 
         <ElCard shadow="never" class="border border-[var(--art-border-color)]">
           <template #header>
-            <div class="text-sm font-medium text-[var(--art-text-gray-800)]">娉㈡棰勮鏄庣粏 - 鐗╂枡缂栫爜</div>
+            <div class="text-sm font-medium text-[var(--art-text-gray-800)]">{{ t('pages.orders.wave.detail.previewTitle') }}</div>
           </template>
           <ArtTable
             :loading="loading"
@@ -50,7 +50,10 @@
 </template>
 
 <script setup>
+  import { useI18n } from 'vue-i18n'
+
   defineOptions({ name: 'WaveDetailDrawer' })
+  const { t } = useI18n()
 
   defineProps({
     visible: { type: Boolean, default: false },
diff --git a/rsf-design/src/views/orders/wave/modules/wave-public-task-dialog.vue b/rsf-design/src/views/orders/wave/modules/wave-public-task-dialog.vue
index 28969a6..6e2db95 100644
--- a/rsf-design/src/views/orders/wave/modules/wave-public-task-dialog.vue
+++ b/rsf-design/src/views/orders/wave/modules/wave-public-task-dialog.vue
@@ -1,17 +1,17 @@
 <template>
   <ElDialog
     :model-value="visible"
-    title="娉㈡涓嬪彂浠诲姟"
+    :title="t('pages.orders.wave.publicTask.title')"
     width="88%"
     destroy-on-close
     @update:model-value="handleVisibleChange"
   >
     <div class="flex max-h-[calc(100vh-240px)] flex-col gap-4 overflow-hidden">
       <ElDescriptions :column="4" border>
-        <ElDescriptionsItem label="娉㈡鍗曞彿">{{ wave.code || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="娉㈡绫诲瀷">{{ wave.typeLabel || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="娉㈡鐘舵��">{{ wave.exceStatusText || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鎵ц鏁伴噺">{{ wave.workQty ?? '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.orders.wave.publicTask.code')">{{ wave.code || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.orders.wave.publicTask.type')">{{ wave.typeLabel || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.orders.wave.publicTask.exceStatus')">{{ wave.exceStatusText || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.orders.wave.publicTask.workQty')">{{ wave.workQty ?? '--' }}</ElDescriptionsItem>
       </ElDescriptions>
 
       <ElAlert
@@ -36,9 +36,9 @@
 
     <template #footer>
       <div class="flex items-center justify-end gap-3">
-        <ElButton @click="handleVisibleChange(false)">鍏抽棴</ElButton>
+        <ElButton @click="handleVisibleChange(false)">{{ t('common.close') }}</ElButton>
         <ElButton type="primary" :loading="submitLoading" :disabled="!canSubmit" @click="$emit('submit')">
-          涓嬪彂浠诲姟
+          {{ t('pages.orders.wave.actions.publicTask') }}
         </ElButton>
       </div>
     </template>
@@ -46,7 +46,10 @@
 </template>
 
 <script setup>
+  import { useI18n } from 'vue-i18n'
+
   defineOptions({ name: 'WavePublicTaskDialog' })
+  const { t } = useI18n()
 
   defineProps({
     visible: { type: Boolean, default: false },
@@ -57,7 +60,7 @@
     columns: { type: Array, default: () => [] },
     pagination: { type: Object, default: () => ({ current: 1, size: 20, total: 0 }) },
     canSubmit: { type: Boolean, default: false },
-    warningText: { type: String, default: '娉㈡棰勮鏁版嵁涓嶅彲鐢紝璇峰厛妫�鏌ュ簱浣嶉厤缃�' }
+    warningText: { type: String, default: '' }
   })
 
   const emit = defineEmits(['update:visible', 'size-change', 'current-change', 'submit'])
diff --git a/rsf-design/src/views/orders/wave/wavePage.helpers.js b/rsf-design/src/views/orders/wave/wavePage.helpers.js
index 1e3c9f6..705c383 100644
--- a/rsf-design/src/views/orders/wave/wavePage.helpers.js
+++ b/rsf-design/src/views/orders/wave/wavePage.helpers.js
@@ -1,4 +1,12 @@
-export const WAVE_REPORT_TITLE = '娉㈡鍗曟姤琛�'
+import { $t } from '@/locales'
+
+function translate(t, key, params) {
+  return (typeof t === 'function' ? t : $t)(key, params)
+}
+
+export function getWaveReportTitle(t) {
+  return translate(t, 'pages.orders.wave.reportTitle')
+}
 export const WAVE_REPORT_STYLE = {
   titleAlign: 'center',
   titleLevel: 'strong',
@@ -7,19 +15,19 @@
   showSequence: true
 }
 
-const WAVE_STATUS_MAP = {
-  0: { label: '绛夊緟鎵ц', tagType: 'info' },
-  1: { label: '姝e湪鎵ц', tagType: 'warning' },
-  2: { label: '鏆傚仠鎵ц', tagType: 'warning' },
-  3: { label: '鎵ц瀹屾垚', tagType: 'success' }
+const WAVE_STATUS_TAG_MAP = {
+  0: 'info',
+  1: 'warning',
+  2: 'warning',
+  3: 'success'
 }
 
-const WAVE_ITEM_STATUS_MAP = {
-  0: { label: '鏈墽琛�', tagType: 'info' },
-  1: { label: '鎵ц涓�', tagType: 'warning' },
-  2: { label: '鏆傚仠', tagType: 'warning' },
-  3: { label: '宸蹭笅鍙�', tagType: 'primary' },
-  4: { label: '浠诲姟瀹屾垚', tagType: 'success' }
+const WAVE_ITEM_STATUS_TAG_MAP = {
+  0: 'info',
+  1: 'warning',
+  2: 'warning',
+  3: 'primary',
+  4: 'success'
 }
 
 function normalizeText(value) {
@@ -34,25 +42,21 @@
   return Number.isFinite(numericValue) ? numericValue : 0
 }
 
-function getStatusConfig(status, statusText) {
-  const fallback = WAVE_STATUS_MAP[Number(status)] || {
-    label: statusText || '-',
-    tagType: 'info'
-  }
+function getStatusConfig(status, statusText, t) {
+  const statusKey = `pages.orders.wave.status.exceStatus.${Number(status)}`
+  const fallbackLabel = statusText || translate(t, statusKey)
   return {
-    label: statusText || fallback.label,
-    tagType: fallback.tagType
+    label: fallbackLabel || '-',
+    tagType: WAVE_STATUS_TAG_MAP[Number(status)] || 'info'
   }
 }
 
-function getItemStatusConfig(status, statusText) {
-  const fallback = WAVE_ITEM_STATUS_MAP[Number(status)] || {
-    label: statusText || '-',
-    tagType: 'info'
-  }
+function getItemStatusConfig(status, statusText, t) {
+  const statusKey = `pages.orders.waveItem.status.exceStatus.${Number(status)}`
+  const fallbackLabel = statusText || translate(t, statusKey)
   return {
-    label: statusText || fallback.label,
-    tagType: fallback.tagType
+    label: fallbackLabel || '-',
+    tagType: WAVE_ITEM_STATUS_TAG_MAP[Number(status)] || 'info'
   }
 }
 
@@ -123,8 +127,8 @@
   }
 }
 
-export function normalizeWaveRow(record = {}) {
-  const statusConfig = getStatusConfig(record.exceStatus, record['exceStatus$'])
+export function normalizeWaveRow(record = {}, t) {
+  const statusConfig = getStatusConfig(record.exceStatus, record['exceStatus$'], t)
   const progress = normalizeNumber(record.anfme) > 0
     ? Math.min(Math.round((normalizeNumber(record.workQty) / normalizeNumber(record.anfme)) * 100), 100)
     : 0
@@ -132,10 +136,14 @@
   return {
     ...record,
     code: record.code || '-',
-    typeLabel: record['type$'] || record.type || '-',
+    typeLabel: record['type$'] || translate(t, `pages.orders.wave.status.type.${record.type}`) || record.type || '-',
     exceStatusText: statusConfig.label,
     exceStatusTagType: statusConfig.tagType,
-    statusLabel: record['status$'] || record.status || '-',
+    statusLabel:
+      record['status$'] ||
+      translate(t, Number(record.status) === 1 ? 'common.status.normal' : 'common.status.disabled') ||
+      record.status ||
+      '-',
     anfme: normalizeNumber(record.anfme),
     qty: normalizeNumber(record.qty),
     workQty: normalizeNumber(record.workQty),
@@ -157,8 +165,8 @@
   }
 }
 
-export function normalizeWaveItemRow(record = {}) {
-  const statusConfig = getItemStatusConfig(record.exceStatus, record['exceStatus$'])
+export function normalizeWaveItemRow(record = {}, t) {
+  const statusConfig = getItemStatusConfig(record.exceStatus, record['exceStatus$'], t)
   return {
     ...record,
     waveCode: record.waveCode || '-',
@@ -183,20 +191,21 @@
   }
 }
 
-export function buildWavePrintRows(records = []) {
+export function buildWavePrintRows(records = [], t) {
   if (!Array.isArray(records)) {
     return []
   }
-  return records.map((record) => normalizeWaveRow(record))
+  return records.map((record) => normalizeWaveRow(record, t))
 }
 
 export function buildWaveReportMeta({
   previewMeta = {},
   count = 0,
-  orientation = WAVE_REPORT_STYLE.orientation
+  orientation = WAVE_REPORT_STYLE.orientation,
+  t
 } = {}) {
   return {
-    reportTitle: WAVE_REPORT_TITLE,
+    reportTitle: getWaveReportTitle(t),
     reportDate: previewMeta.reportDate,
     printedAt: previewMeta.printedAt,
     operator: previewMeta.operator,
@@ -208,41 +217,41 @@
   }
 }
 
-export function getWaveActionList(row = {}) {
-  const normalizedRow = normalizeWaveRow(row)
+export function getWaveActionList(row = {}, t) {
+  const normalizedRow = normalizeWaveRow(row, t)
   return [
     {
       key: 'view',
-      label: '鏌ョ湅璇︽儏',
+      label: translate(t, 'pages.orders.wave.actions.view'),
       icon: 'ri:eye-line'
     },
     {
       key: 'publicTask',
-      label: '涓嬪彂浠诲姟',
+      label: translate(t, 'pages.orders.wave.actions.publicTask'),
       icon: 'ri:play-circle-line',
       disabled: !normalizedRow.canPublicTask
     },
     {
       key: 'pause',
-      label: '鏆傚仠',
+      label: translate(t, 'pages.orders.wave.actions.pause'),
       icon: 'ri:pause-circle-line',
       disabled: !normalizedRow.canPause
     },
     {
       key: 'continue',
-      label: '缁х画',
+      label: translate(t, 'pages.orders.wave.actions.continue'),
       icon: 'ri:play-line',
       disabled: !normalizedRow.canContinue
     },
     {
       key: 'stop',
-      label: '缁堟',
+      label: translate(t, 'pages.orders.wave.actions.stop'),
       icon: 'ri:stop-circle-line',
       disabled: !normalizedRow.canStop
     },
     {
       key: 'print',
-      label: '鎵撳嵃',
+      label: translate(t, 'pages.orders.wave.actions.print'),
       icon: 'ri:printer-line'
     }
   ]
diff --git a/rsf-design/src/views/orders/wave/waveTable.columns.js b/rsf-design/src/views/orders/wave/waveTable.columns.js
index d401112..0de06b2 100644
--- a/rsf-design/src/views/orders/wave/waveTable.columns.js
+++ b/rsf-design/src/views/orders/wave/waveTable.columns.js
@@ -1,26 +1,28 @@
 import { h } from 'vue'
 import { ElProgress, ElTag } from 'element-plus'
+import { $t } from '@/locales'
 import ArtButtonMore from '@/components/core/forms/art-button-more/index.vue'
 import { getWaveActionList } from './wavePage.helpers'
 
-export function createWaveTableColumns({ handleActionClick }) {
+export function createWaveTableColumns({ handleActionClick, t }) {
+  const translate = typeof t === 'function' ? t : $t
   return [
     { type: 'selection', width: 48, align: 'center' },
-    { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+    { type: 'globalIndex', label: translate('table.index'), width: 72, align: 'center' },
     {
       prop: 'code',
-      label: '娉㈡鍗曞彿',
+      label: translate('pages.orders.wave.table.code'),
       minWidth: 170,
       showOverflowTooltip: true
     },
     {
       prop: 'typeLabel',
-      label: '娉㈡绫诲瀷',
+      label: translate('pages.orders.wave.table.type'),
       width: 110
     },
     {
       prop: 'exceStatusText',
-      label: '娉㈡鐘舵��',
+      label: translate('pages.orders.wave.table.exceStatus'),
       width: 120,
       formatter: (row) =>
         h(
@@ -31,31 +33,31 @@
     },
     {
       prop: 'anfme',
-      label: '搴旂洏鏁伴噺',
+      label: translate('pages.orders.wave.table.anfme'),
       width: 110,
       align: 'right'
     },
     {
       prop: 'workQty',
-      label: '鎵ц鏁伴噺',
+      label: translate('pages.orders.wave.table.workQty'),
       width: 110,
       align: 'right'
     },
     {
       prop: 'qty',
-      label: '宸茬洏鏁伴噺',
+      label: translate('pages.orders.wave.table.qty'),
       width: 110,
       align: 'right'
     },
     {
       prop: 'orderNum',
-      label: '鍗曟嵁鏁伴噺',
+      label: translate('pages.orders.wave.table.orderNum'),
       width: 110,
       align: 'right'
     },
     {
       prop: 'progress',
-      label: '杩涘害',
+      label: translate('pages.orders.wave.table.progress'),
       width: 160,
       formatter: (row) =>
         h(ElProgress, {
@@ -68,19 +70,19 @@
     },
     {
       prop: 'createTimeText',
-      label: '鍒涘缓鏃堕棿',
+      label: translate('pages.orders.wave.table.createTime'),
       minWidth: 170,
       showOverflowTooltip: true
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: translate('pages.orders.wave.table.updateTime'),
       minWidth: 170,
       showOverflowTooltip: true
     },
     {
       prop: 'statusLabel',
-      label: '鐘舵��',
+      label: translate('pages.orders.wave.table.status'),
       width: 100,
       formatter: (row) =>
         h(
@@ -91,90 +93,91 @@
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: translate('table.operation'),
       width: 120,
       align: 'center',
       fixed: 'right',
       formatter: (row) =>
         h(ArtButtonMore, {
-          list: getWaveActionList(row),
+          list: getWaveActionList(row, translate),
           onClick: (item) => handleActionClick(item, row)
         })
     }
   ]
 }
 
-export function createWavePreviewItemColumns() {
+export function createWavePreviewItemColumns(t) {
+  const translate = typeof t === 'function' ? t : $t
   return [
-    { type: 'globalIndex', label: '搴忓彿', width: 72, align: 'center' },
+    { type: 'globalIndex', label: translate('table.index'), width: 72, align: 'center' },
     {
       prop: 'waveCode',
-      label: '娉㈡鍙�',
+      label: translate('pages.orders.wave.preview.waveCode'),
       minWidth: 170,
       showOverflowTooltip: true
     },
     {
       prop: 'orderCode',
-      label: '鍗曟嵁缂栫爜',
+      label: translate('pages.orders.wave.preview.orderCode'),
       minWidth: 170,
       showOverflowTooltip: true
     },
     {
       prop: 'matnrCode',
-      label: '鐗╂枡缂栫爜',
+      label: translate('pages.orders.wave.preview.matnrCode'),
       minWidth: 150,
       showOverflowTooltip: true
     },
     {
       prop: 'maktx',
-      label: '鐗╂枡鍚嶇О',
+      label: translate('pages.orders.wave.preview.maktx'),
       minWidth: 220,
       showOverflowTooltip: true
     },
     {
       prop: 'batch',
-      label: '鎵规',
+      label: translate('pages.orders.wave.preview.batch'),
       minWidth: 130,
       showOverflowTooltip: true
     },
     {
       prop: 'unit',
-      label: '鍗曚綅',
+      label: translate('pages.orders.wave.preview.unit'),
       width: 90
     },
     {
       prop: 'anfme',
-      label: '搴旈厤鏁伴噺',
+      label: translate('pages.orders.wave.preview.anfme'),
       width: 110,
       align: 'right'
     },
     {
       prop: 'workQty',
-      label: '宸查厤鏁伴噺',
+      label: translate('pages.orders.wave.preview.workQty'),
       width: 110,
       align: 'right'
     },
     {
       prop: 'stockQty',
-      label: '搴撳瓨鏁伴噺',
+      label: translate('pages.orders.wave.preview.stockQty'),
       width: 110,
       align: 'right'
     },
     {
       prop: 'splrBatch',
-      label: '渚涘簲鍟嗘壒娆�',
+      label: translate('pages.orders.wave.preview.splrBatch'),
       minWidth: 150,
       showOverflowTooltip: true
     },
     {
       prop: 'stockLocsText',
-      label: '搴撲綅',
+      label: translate('pages.orders.wave.preview.stockLocs'),
       minWidth: 220,
       showOverflowTooltip: true
     }
   ]
 }
 
-export function createWaveDetailItemColumns() {
-  return createWavePreviewItemColumns()
+export function createWaveDetailItemColumns(t) {
+  return createWavePreviewItemColumns(t)
 }
diff --git a/rsf-design/src/views/stock/stock-transfer/stockTransferTable.columns.js b/rsf-design/src/views/stock/stock-transfer/stockTransferTable.columns.js
index 134b7dd..3442d17 100644
--- a/rsf-design/src/views/stock/stock-transfer/stockTransferTable.columns.js
+++ b/rsf-design/src/views/stock/stock-transfer/stockTransferTable.columns.js
@@ -1,4 +1,5 @@
 import { h } from 'vue'
+import { $t } from '@/locales'
 import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
 
 export function createStockTransferTableColumns({ enabledFields = [], handleView } = {}) {
@@ -13,7 +14,7 @@
   return [
     {
       type: 'globalIndex',
-      label: '搴忓彿',
+      label: $t('table.index'),
       width: 72,
       align: 'center'
     },
@@ -69,13 +70,13 @@
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: $t('table.operation'),
       width: 100,
       fixed: 'right',
       formatter: (row) =>
         h(ArtButtonTable, {
           type: 'view',
-          text: '璇︽儏',
+          text: $t('common.actions.detail'),
           onClick: () => handleView?.(row)
         })
     }
diff --git a/rsf-design/src/views/system/ai-mcp-mount/aiMcpMountPage.helpers.js b/rsf-design/src/views/system/ai-mcp-mount/aiMcpMountPage.helpers.js
index 182c51c..b145133 100644
--- a/rsf-design/src/views/system/ai-mcp-mount/aiMcpMountPage.helpers.js
+++ b/rsf-design/src/views/system/ai-mcp-mount/aiMcpMountPage.helpers.js
@@ -1,3 +1,5 @@
+import { $t } from '@/locales'
+
 export function createAiMcpMountSearchState() {
   return {
     condition: '',
@@ -23,12 +25,12 @@
 
 export function getAiMcpMountHealthMeta(healthStatus) {
   if (healthStatus === 'HEALTHY') {
-    return { text: '鍋ュ悍', type: 'success' }
+    return { text: $t('pages.system.aiMcpMount.health.healthy'), type: 'success' }
   }
   if (healthStatus === 'UNHEALTHY') {
-    return { text: '寮傚父', type: 'danger' }
+    return { text: $t('pages.system.aiMcpMount.health.unhealthy'), type: 'danger' }
   }
-  return { text: '鏈祴璇�', type: 'info' }
+  return { text: $t('pages.system.aiMcpMount.health.notTested'), type: 'info' }
 }
 
 export function buildAiMcpMountSearchParams(params = {}) {
@@ -110,7 +112,7 @@
     serverUrl: row.serverUrl || '',
     memo: row.memo || '',
     statusBool,
-    statusText: statusBool ? '鍚敤' : '鍋滅敤',
+    statusText: statusBool ? $t('common.status.enabled') : $t('common.status.disabled'),
     statusType: statusBool ? 'success' : 'info',
     healthText: healthMeta.text,
     healthType: healthMeta.type,
diff --git a/rsf-design/src/views/system/ai-mcp-mount/index.vue b/rsf-design/src/views/system/ai-mcp-mount/index.vue
index 66548a5..5f7e6ce 100644
--- a/rsf-design/src/views/system/ai-mcp-mount/index.vue
+++ b/rsf-design/src/views/system/ai-mcp-mount/index.vue
@@ -11,20 +11,18 @@
     <ElCard class="art-table-card">
       <div class="mb-5 flex flex-wrap items-center justify-between gap-4">
         <div>
-          <h3 class="text-lg font-semibold text-[var(--art-gray-900)]">MCP 鎸傝浇</h3>
-          <p class="mt-1 text-sm text-[var(--art-gray-500)]"
-            >鎸変紶杈撶被鍨嬬鐞� MCP 鎸傝浇銆佽繛閫氭�у拰宸ュ叿棰勮銆�</p
-          >
+          <h3 class="text-lg font-semibold text-[var(--art-gray-900)]">{{ t('pages.system.aiMcpMount.title') }}</h3>
+          <p class="mt-1 text-sm text-[var(--art-gray-500)]">{{ t('pages.system.aiMcpMount.subtitle') }}</p>
         </div>
 
         <ElSpace wrap>
-          <ElButton v-auth="'save'" @click="openCreateDialog" v-ripple>鏂板缓鎸傝浇</ElButton>
-          <ElButton :loading="loading" @click="refreshData" v-ripple>鍒锋柊</ElButton>
+          <ElButton v-auth="'save'" @click="openCreateDialog" v-ripple>{{ t('pages.system.aiMcpMount.buttons.add') }}</ElButton>
+          <ElButton :loading="loading" @click="refreshData" v-ripple>{{ t('common.actions.refresh') }}</ElButton>
         </ElSpace>
       </div>
 
       <div v-loading="loading" class="space-y-6">
-        <ElEmpty v-if="!groupedRecords.length" description="鏆傛棤 MCP 鎸傝浇鏁版嵁" :image-size="110" />
+        <ElEmpty v-if="!groupedRecords.length" :description="t('pages.system.aiMcpMount.empty')" :image-size="110" />
 
         <section v-for="group in groupedRecords" :key="group.key" class="space-y-4">
           <div>
@@ -67,7 +65,7 @@
                 <div
                   class="rounded-2xl bg-[var(--art-main-bg-color)]/70 p-3 ring-1 ring-inset ring-[var(--art-border-color)]"
                 >
-                  <p class="text-xs text-[var(--art-gray-500)]">鐩爣鍦板潃</p>
+                  <p class="text-xs text-[var(--art-gray-500)]">{{ t('pages.system.aiMcpMount.fields.target') }}</p>
                   <p class="mt-2 break-all text-[var(--art-gray-900)]">{{
                     item.targetLabel || '--'
                   }}</p>
@@ -75,26 +73,26 @@
                 <div
                   class="rounded-2xl bg-[var(--art-main-bg-color)]/70 p-3 ring-1 ring-inset ring-[var(--art-border-color)]"
                 >
-                  <p class="text-xs text-[var(--art-gray-500)]">鏈�杩戞祴璇�</p>
+                  <p class="text-xs text-[var(--art-gray-500)]">{{ t('pages.system.aiMcpMount.fields.lastTestTime') }}</p>
                   <p class="mt-2 text-[var(--art-gray-900)]">{{
-                    item['lastTestTime$'] || '鏈祴璇�'
+                    item['lastTestTime$'] || t('pages.system.aiMcpMount.health.notTested')
                   }}</p>
                 </div>
               </div>
 
               <div class="mt-4 grid gap-3 text-sm sm:grid-cols-3">
                 <div class="rounded-2xl bg-slate-50 px-3 py-2">
-                  <p class="text-xs text-[var(--art-gray-500)]">瓒呮椂</p>
+                  <p class="text-xs text-[var(--art-gray-500)]">{{ t('pages.system.aiMcpMount.fields.timeoutMs') }}</p>
                   <p class="mt-1 font-medium text-[var(--art-gray-900)]"
                     >{{ item.requestTimeoutMs ?? '--' }} ms</p
                   >
                 </div>
                 <div class="rounded-2xl bg-slate-50 px-3 py-2">
-                  <p class="text-xs text-[var(--art-gray-500)]">鎺掑簭</p>
+                  <p class="text-xs text-[var(--art-gray-500)]">{{ t('table.sort') }}</p>
                   <p class="mt-1 font-medium text-[var(--art-gray-900)]">{{ item.sort ?? '--' }}</p>
                 </div>
                 <div class="rounded-2xl bg-slate-50 px-3 py-2">
-                  <p class="text-xs text-[var(--art-gray-500)]">鍒濆鍖栬�楁椂</p>
+                  <p class="text-xs text-[var(--art-gray-500)]">{{ t('pages.system.aiMcpMount.fields.lastInitElapsedMs') }}</p>
                   <p class="mt-1 font-medium text-[var(--art-gray-900)]">{{
                     item.lastInitElapsedMs ?? '--'
                   }}</p>
@@ -102,7 +100,7 @@
               </div>
 
               <div class="mt-4 rounded-2xl bg-amber-50/80 px-4 py-3">
-                <p class="text-xs text-[var(--art-gray-500)]">澶囨敞</p>
+                <p class="text-xs text-[var(--art-gray-500)]">{{ t('table.remark') }}</p>
                 <p class="mt-2 line-clamp-3 text-sm leading-6 text-[var(--art-gray-900)]">{{
                   item.memo || '--'
                 }}</p>
@@ -116,20 +114,18 @@
                 }}</div>
 
                 <ElSpace wrap>
-                  <ElButton text @click="openDetailDialog(item)">璇︽儏</ElButton>
-                  <ElButton v-auth="'update'" text @click="openEditDialog(item)">缂栬緫</ElButton>
+                  <ElButton text @click="openDetailDialog(item)">{{ t('common.actions.detail') }}</ElButton>
+                  <ElButton v-auth="'update'" text @click="openEditDialog(item)">{{ t('common.actions.edit') }}</ElButton>
                   <ElButton
                     v-auth="'update'"
                     text
                     :loading="connectivityTestingId === item.id"
                     @click="handleConnectivityTest(item)"
                   >
-                    杩為�氭�ф祴璇�
+                    {{ t('pages.system.aiMcpMount.actions.connectivityTest') }}
                   </ElButton>
-                  <ElButton v-auth="'list'" text @click="openToolsDrawer(item)">宸ュ叿棰勮</ElButton>
-                  <ElButton v-auth="'remove'" text type="danger" @click="handleDelete(item)"
-                    >鍒犻櫎</ElButton
-                  >
+                  <ElButton v-auth="'list'" text @click="openToolsDrawer(item)">{{ t('pages.system.aiMcpMount.actions.toolsPreview') }}</ElButton>
+                  <ElButton v-auth="'remove'" text type="danger" @click="handleDelete(item)">{{ t('common.actions.delete') }}</ElButton>
                 </ElSpace>
               </div>
             </article>
@@ -168,6 +164,7 @@
 
 <script setup>
   import { ElMessage, ElMessageBox } from 'element-plus'
+  import { useI18n } from 'vue-i18n'
   import { useTable } from '@/hooks/core/useTable'
   import { guardRequestWithMessage } from '@/utils/sys/requestGuard'
   import {
@@ -191,6 +188,7 @@
 
   defineOptions({ name: 'AiMcpMount' })
 
+  const { t } = useI18n()
   const searchForm = ref(createAiMcpMountSearchState())
   const dialogVisible = ref(false)
   const dialogMode = ref('create')
@@ -201,16 +199,16 @@
 
   const searchItems = computed(() => [
     {
-      label: '鍏抽敭瀛�',
+      label: t('pages.system.aiMcpMount.search.condition'),
       key: 'condition',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ュ悕绉�'
+        placeholder: t('pages.system.aiMcpMount.search.conditionPlaceholder')
       }
     },
     {
-      label: '浼犺緭绫诲瀷',
+      label: t('pages.system.aiMcpMount.search.transportType'),
       key: 'transportType',
       type: 'select',
       props: {
@@ -223,14 +221,14 @@
       }
     },
     {
-      label: '鐘舵��',
+      label: t('pages.system.aiMcpMount.search.status'),
       key: 'status',
       type: 'select',
       props: {
         clearable: true,
         options: [
-          { label: '鍚敤', value: 1 },
-          { label: '鍋滅敤', value: 0 }
+          { label: t('common.status.enabled'), value: 1 },
+          { label: t('common.status.disabled'), value: 0 }
         ]
       }
     }
@@ -267,9 +265,9 @@
 
   const groupedRecords = computed(() => {
     const groups = [
-      { key: 'BUILTIN', title: '鍐呯疆 MCP', description: '绯荤粺鍐呯疆鐨勬爣鍑� MCP 鎸傝浇銆�' },
-      { key: 'SSE_HTTP', title: 'SSE / HTTP', description: '閫氳繃鏈嶅姟鍦板潃鍜� SSE 绔偣鎺ュ叆鐨� MCP銆�' },
-      { key: 'STDIO', title: 'STDIO', description: '閫氳繃鏈湴鍛戒护鍚姩鐨� MCP銆�' }
+      { key: 'BUILTIN', title: t('pages.system.aiMcpMount.groups.builtin.title'), description: t('pages.system.aiMcpMount.groups.builtin.description') },
+      { key: 'SSE_HTTP', title: t('pages.system.aiMcpMount.groups.sse.title'), description: t('pages.system.aiMcpMount.groups.sse.description') },
+      { key: 'STDIO', title: t('pages.system.aiMcpMount.groups.stdio.title'), description: t('pages.system.aiMcpMount.groups.stdio.description') }
     ]
     return groups
       .map((group) => ({
@@ -321,13 +319,13 @@
     try {
       if (dialogMode.value === 'edit') {
         await fetchUpdateAiMcpMount(payload)
-        ElMessage.success('淇敼鎴愬姛')
+        ElMessage.success(t('crud.messages.updateSuccess'))
         dialogVisible.value = false
         await refreshUpdate()
         return
       }
       await fetchSaveAiMcpMount(payload)
-      ElMessage.success('鏂板鎴愬姛')
+      ElMessage.success(t('crud.messages.createSuccess'))
       dialogVisible.value = false
       await refreshCreate()
     } catch {
@@ -337,17 +335,23 @@
 
   async function handleDelete(record) {
     try {
-      await ElMessageBox.confirm(`纭畾瑕佸垹闄ゆ寕杞姐��${record.name || record.id}銆嶅悧锛焋, '鍒犻櫎纭', {
-        confirmButtonText: '纭畾',
-        cancelButtonText: '鍙栨秷',
+      await ElMessageBox.confirm(
+        t('crud.confirm.deleteMessage', {
+          entity: t('pages.system.aiMcpMount.entity'),
+          label: record.name || record.id
+        }),
+        t('crud.confirm.deleteTitle'),
+        {
+        confirmButtonText: t('common.confirm'),
+        cancelButtonText: t('common.cancel'),
         type: 'warning'
       })
       await fetchDeleteAiMcpMount(record.id)
-      ElMessage.success('鍒犻櫎鎴愬姛')
+      ElMessage.success(t('crud.messages.deleteSuccess'))
       await refreshRemove()
     } catch (error) {
       if (error !== 'cancel') {
-        ElMessage.error(error?.message || '鍒犻櫎澶辫触')
+        ElMessage.error(error?.message || t('crud.messages.deleteFailed'))
       }
     }
   }
@@ -356,12 +360,12 @@
     connectivityTestingId.value = record.id
     try {
       const result = await guardRequestWithMessage(fetchTestAiMcpConnectivity(record.id), null, {
-        timeoutMessage: '杩為�氭�ф祴璇曡秴鏃讹紝宸插仠姝㈢瓑寰�'
+        timeoutMessage: t('pages.system.aiMcpMount.messages.connectivityTimeout')
       })
-      ElMessage.success(result?.message || '杩為�氭�ф祴璇曟垚鍔�')
+      ElMessage.success(result?.message || t('pages.system.aiMcpMount.messages.connectivitySuccess'))
       await refreshUpdate()
     } catch (error) {
-      ElMessage.error(error?.message || '杩為�氭�ф祴璇曞け璐�')
+      ElMessage.error(error?.message || t('pages.system.aiMcpMount.messages.connectivityFailed'))
     } finally {
       connectivityTestingId.value = null
     }
diff --git a/rsf-design/src/views/system/ai-mcp-mount/modules/ai-mcp-mount-dialog.vue b/rsf-design/src/views/system/ai-mcp-mount/modules/ai-mcp-mount-dialog.vue
index eba8b9a..7a540ff 100644
--- a/rsf-design/src/views/system/ai-mcp-mount/modules/ai-mcp-mount-dialog.vue
+++ b/rsf-design/src/views/system/ai-mcp-mount/modules/ai-mcp-mount-dialog.vue
@@ -20,63 +20,115 @@
       :disabled="isReadonly"
     />
 
-    <div v-if="!isReadonly" class="mt-4 rounded-2xl border border-[var(--art-border-color)] bg-[var(--art-main-bg-color)] p-4">
+    <div
+      v-if="!isReadonly"
+      class="mt-4 rounded-2xl border border-[var(--art-border-color)] bg-[var(--art-main-bg-color)] p-4"
+    >
       <div class="flex flex-wrap items-center justify-between gap-3">
         <div>
-          <div class="text-sm font-semibold text-[var(--art-gray-900)]">鑽夌杩為�氭�ф祴璇�</div>
-          <div class="mt-1 text-xs text-[var(--art-gray-500)]">淇濆瓨鍓嶅厛鏍¢獙褰撳墠鎸傝浇閰嶇疆鏄惁鍙繛閫氥��</div>
+          <div class="text-sm font-semibold text-[var(--art-gray-900)]">
+            {{ t('pages.system.aiMcpMount.dialog.draftTestTitle') }}
+          </div>
+          <div class="mt-1 text-xs text-[var(--art-gray-500)]">
+            {{ t('pages.system.aiMcpMount.dialog.draftTestDescription') }}
+          </div>
         </div>
-        <ElButton :loading="draftTesting" @click="handleDraftValidate">鑽夌杩為�氭�ф祴璇�</ElButton>
+        <ElButton :loading="draftTesting" @click="handleDraftValidate">
+          {{ t('pages.system.aiMcpMount.dialog.draftTestAction') }}
+        </ElButton>
       </div>
-      <ElAlert v-if="draftValidateResult" class="mt-4" :type="draftValidateResult.healthStatus === 'HEALTHY' ? 'success' : 'error'" :closable="false">
+      <ElAlert
+        v-if="draftValidateResult"
+        class="mt-4"
+        :type="draftValidateResult.healthStatus === 'HEALTHY' ? 'success' : 'error'"
+        :closable="false"
+      >
         <div class="space-y-1 text-sm">
-          <div>{{ draftValidateResult.message || '--' }}</div>
-          <div v-if="draftValidateResult.initElapsedMs !== undefined && draftValidateResult.initElapsedMs !== null">
-            鍒濆鍖栬�楁椂 {{ draftValidateResult.initElapsedMs }} ms
+          <div>{{ draftValidateResult.message || emptyText }}</div>
+          <div
+            v-if="
+              draftValidateResult.initElapsedMs !== undefined &&
+              draftValidateResult.initElapsedMs !== null
+            "
+          >
+            {{
+              t('pages.system.aiMcpMount.messages.initElapsedMs', {
+                value: draftValidateResult.initElapsedMs
+              })
+            }}
           </div>
           <div v-if="draftValidateResult.testedAt">{{ draftValidateResult.testedAt }}</div>
         </div>
       </ElAlert>
     </div>
 
-    <div class="mt-4 rounded-2xl border border-[var(--art-border-color)] bg-[var(--art-main-bg-color)] p-4">
-      <div class="text-sm font-semibold text-[var(--art-gray-900)]">杩愯鏃剁姸鎬�</div>
+    <div
+      class="mt-4 rounded-2xl border border-[var(--art-border-color)] bg-[var(--art-main-bg-color)] p-4"
+    >
+      <div class="text-sm font-semibold text-[var(--art-gray-900)]">
+        {{ t('pages.system.aiMcpMount.dialog.runtimeTitle') }}
+      </div>
       <div class="mt-4 grid gap-4 md:grid-cols-2">
         <div class="rounded-xl bg-[var(--art-main-bg-color)] p-3">
-          <div class="text-xs text-[var(--art-gray-500)]">鍋ュ悍鐘舵��</div>
-          <div class="mt-2 text-sm text-[var(--art-gray-900)]">{{ form.healthStatus || 'NOT_TESTED' }}</div>
+          <div class="text-xs text-[var(--art-gray-500)]">
+            {{ t('pages.system.aiMcpMount.dialog.runtimeLabels.healthStatus') }}
+          </div>
+          <div class="mt-2 text-sm text-[var(--art-gray-900)]">
+            {{ form.healthStatus || 'NOT_TESTED' }}
+          </div>
         </div>
         <div class="rounded-xl bg-[var(--art-main-bg-color)] p-3">
-          <div class="text-xs text-[var(--art-gray-500)]">鏈�杩戞祴璇曟椂闂�</div>
-          <div class="mt-2 text-sm text-[var(--art-gray-900)]">{{ form['lastTestTime$'] || '--' }}</div>
+          <div class="text-xs text-[var(--art-gray-500)]">
+            {{ t('pages.system.aiMcpMount.dialog.runtimeLabels.lastTestTime') }}
+          </div>
+          <div class="mt-2 text-sm text-[var(--art-gray-900)]">
+            {{ form['lastTestTime$'] || emptyText }}
+          </div>
         </div>
         <div class="rounded-xl bg-[var(--art-main-bg-color)] p-3">
-          <div class="text-xs text-[var(--art-gray-500)]">鏈�杩戝垵濮嬪寲鑰楁椂</div>
-          <div class="mt-2 text-sm text-[var(--art-gray-900)]">{{ form.lastInitElapsedMs ?? '--' }}</div>
+          <div class="text-xs text-[var(--art-gray-500)]">
+            {{ t('pages.system.aiMcpMount.dialog.runtimeLabels.lastInitElapsedMs') }}
+          </div>
+          <div class="mt-2 text-sm text-[var(--art-gray-900)]">
+            {{ form.lastInitElapsedMs ?? emptyText }}
+          </div>
         </div>
         <div class="rounded-xl bg-[var(--art-main-bg-color)] p-3">
-          <div class="text-xs text-[var(--art-gray-500)]">鏈�杩戞洿鏂版椂闂�</div>
-          <div class="mt-2 text-sm text-[var(--art-gray-900)]">{{ form['updateTime$'] || '--' }}</div>
+          <div class="text-xs text-[var(--art-gray-500)]">
+            {{ t('pages.system.aiMcpMount.dialog.runtimeLabels.updateTime') }}
+          </div>
+          <div class="mt-2 text-sm text-[var(--art-gray-900)]">
+            {{ form['updateTime$'] || emptyText }}
+          </div>
         </div>
       </div>
       <div class="mt-4 rounded-xl bg-[var(--art-main-bg-color)] p-3">
-        <div class="text-xs text-[var(--art-gray-500)]">鏈�杩戞祴璇曚俊鎭�</div>
-        <div class="mt-2 whitespace-pre-wrap break-all text-sm text-[var(--art-gray-900)]">{{ form.lastTestMessage || '--' }}</div>
+        <div class="text-xs text-[var(--art-gray-500)]">
+          {{ t('pages.system.aiMcpMount.dialog.runtimeLabels.lastTestMessage') }}
+        </div>
+        <div class="mt-2 whitespace-pre-wrap break-all text-sm text-[var(--art-gray-900)]">
+          {{ form.lastTestMessage || emptyText }}
+        </div>
       </div>
     </div>
 
     <template #footer>
       <span class="dialog-footer">
-        <ElButton @click="handleCancel">{{ isReadonly ? '鍏抽棴' : '鍙栨秷' }}</ElButton>
-        <ElButton v-if="!isReadonly" type="primary" @click="handleSubmit">纭畾</ElButton>
+        <ElButton @click="handleCancel">
+          {{ isReadonly ? t('common.actions.close') : t('common.cancel') }}
+        </ElButton>
+        <ElButton v-if="!isReadonly" type="primary" @click="handleSubmit">
+          {{ t('common.confirm') }}
+        </ElButton>
       </span>
     </template>
   </ElDialog>
 </template>
 
 <script setup>
-  import ArtForm from '@/components/core/forms/art-form/index.vue'
+  import { useI18n } from 'vue-i18n'
   import { ElMessage } from 'element-plus'
+  import ArtForm from '@/components/core/forms/art-form/index.vue'
   import { fetchValidateAiMcpDraftConnectivity } from '@/api/ai-config'
   import {
     buildAiMcpMountDialogModel,
@@ -91,73 +143,94 @@
   })
 
   const emit = defineEmits(['update:visible', 'submit'])
+  const { t } = useI18n()
   const formRef = ref()
   const form = reactive(buildAiMcpMountDialogModel())
   const draftTesting = ref(false)
   const draftValidateResult = ref(null)
 
+  const emptyText = computed(() => t('common.placeholder.empty'))
   const isReadonly = computed(() => props.mode === 'show')
   const dialogTitle = computed(() => {
-    if (props.mode === 'edit') return '缂栬緫鎸傝浇'
-    if (props.mode === 'show') return '鎸傝浇璇︽儏'
-    return '鏂板缓鎸傝浇'
+    if (props.mode === 'edit') return t('pages.system.aiMcpMount.dialog.titleEdit')
+    if (props.mode === 'show') return t('pages.system.aiMcpMount.dialog.titleDetail')
+    return t('pages.system.aiMcpMount.dialog.titleCreate')
   })
 
   const rules = computed(() => ({
-    name: [{ required: true, message: '璇疯緭鍏ュ悕绉�', trigger: 'blur' }],
-    transportType: [{ required: true, message: '璇烽�夋嫨浼犺緭绫诲瀷', trigger: 'change' }]
+    name: [{ required: true, message: t('pages.system.aiMcpMount.dialog.validation.name'), trigger: 'blur' }],
+    transportType: [
+      {
+        required: true,
+        message: t('pages.system.aiMcpMount.dialog.validation.transportType'),
+        trigger: 'change'
+      }
+    ]
   }))
 
   const formItems = computed(() => {
     const items = [
       {
-        label: '鍚嶇О',
+        label: t('pages.system.aiMcpMount.dialog.labels.name'),
         key: 'name',
         type: 'input',
-        props: { clearable: true, placeholder: '璇疯緭鍏ュ悕绉�' }
+        props: { clearable: true, placeholder: t('pages.system.aiMcpMount.dialog.placeholders.name') }
       },
       {
-        label: '浼犺緭绫诲瀷',
+        label: t('pages.system.aiMcpMount.dialog.labels.transportType'),
         key: 'transportType',
         type: 'select',
         props: {
           options: getAiMcpMountTransportOptions(),
-          placeholder: '璇烽�夋嫨浼犺緭绫诲瀷'
+          placeholder: t('pages.system.aiMcpMount.dialog.placeholders.transportType')
         }
       }
     ]
 
     if (form.transportType === 'BUILTIN') {
       items.push({
-        label: '鍐呯疆 MCP 缂栫爜',
+        label: t('pages.system.aiMcpMount.dialog.labels.builtinCode'),
         key: 'builtinCode',
         type: 'input',
         span: 24,
-        props: { clearable: true, placeholder: '璇疯緭鍏ュ唴缃� MCP 缂栫爜' }
+        props: {
+          clearable: true,
+          placeholder: t('pages.system.aiMcpMount.dialog.placeholders.builtinCode')
+        }
       })
     }
 
     if (form.transportType === 'SSE_HTTP') {
       items.push(
         {
-          label: '鏈嶅姟鍦板潃',
+          label: t('pages.system.aiMcpMount.dialog.labels.serverUrl'),
           key: 'serverUrl',
           type: 'input',
           span: 24,
-          props: { clearable: true, placeholder: '璇疯緭鍏ユ湇鍔″湴鍧�' }
+          props: {
+            clearable: true,
+            placeholder: t('pages.system.aiMcpMount.dialog.placeholders.serverUrl')
+          }
         },
         {
-          label: 'SSE 绔偣',
+          label: t('pages.system.aiMcpMount.dialog.labels.endpoint'),
           key: 'endpoint',
           type: 'input',
-          props: { clearable: true, placeholder: '璇疯緭鍏� SSE 绔偣' }
+          props: {
+            clearable: true,
+            placeholder: t('pages.system.aiMcpMount.dialog.placeholders.endpoint')
+          }
         },
         {
-          label: '璇锋眰澶� JSON',
+          label: t('pages.system.aiMcpMount.dialog.labels.headersJson'),
           key: 'headersJson',
           type: 'input',
           span: 24,
-          props: { type: 'textarea', rows: 4, placeholder: '璇疯緭鍏ヨ姹傚ご JSON' }
+          props: {
+            type: 'textarea',
+            rows: 4,
+            placeholder: t('pages.system.aiMcpMount.dialog.placeholders.headersJson')
+          }
         }
       )
     }
@@ -165,62 +238,84 @@
     if (form.transportType === 'STDIO') {
       items.push(
         {
-          label: '鍛戒护',
+          label: t('pages.system.aiMcpMount.dialog.labels.command'),
           key: 'command',
           type: 'input',
           span: 24,
-          props: { clearable: true, placeholder: '璇疯緭鍏ュ懡浠�' }
+          props: {
+            clearable: true,
+            placeholder: t('pages.system.aiMcpMount.dialog.placeholders.command')
+          }
         },
         {
-          label: '鍛戒护鍙傛暟 JSON',
+          label: t('pages.system.aiMcpMount.dialog.labels.argsJson'),
           key: 'argsJson',
           type: 'input',
           span: 24,
-          props: { type: 'textarea', rows: 4, placeholder: '璇疯緭鍏ュ懡浠ゅ弬鏁� JSON' }
+          props: {
+            type: 'textarea',
+            rows: 4,
+            placeholder: t('pages.system.aiMcpMount.dialog.placeholders.argsJson')
+          }
         },
         {
-          label: '鐜鍙橀噺 JSON',
+          label: t('pages.system.aiMcpMount.dialog.labels.envJson'),
           key: 'envJson',
           type: 'input',
           span: 24,
-          props: { type: 'textarea', rows: 4, placeholder: '璇疯緭鍏ョ幆澧冨彉閲� JSON' }
+          props: {
+            type: 'textarea',
+            rows: 4,
+            placeholder: t('pages.system.aiMcpMount.dialog.placeholders.envJson')
+          }
         }
       )
     }
 
     items.push(
       {
-        label: '璇锋眰瓒呮椂(ms)',
+        label: t('pages.system.aiMcpMount.dialog.labels.requestTimeoutMs'),
         key: 'requestTimeoutMs',
         type: 'number',
-        props: { min: 1000, placeholder: '璇疯緭鍏ヨ姹傝秴鏃�' }
+        props: {
+          min: 1000,
+          placeholder: t('pages.system.aiMcpMount.dialog.placeholders.requestTimeoutMs')
+        }
       },
       {
-        label: '鎺掑簭',
+        label: t('pages.system.aiMcpMount.dialog.labels.sort'),
         key: 'sort',
         type: 'number',
-        props: { min: 0, placeholder: '璇疯緭鍏ユ帓搴�' }
+        props: {
+          min: 0,
+          placeholder: t('pages.system.aiMcpMount.dialog.placeholders.sort')
+        }
       },
       {
-        label: '鐘舵��',
+        label: t('pages.system.aiMcpMount.dialog.labels.status'),
         key: 'status',
         type: 'select',
         props: {
           options: [
-            { label: '鍚敤', value: 1 },
-            { label: '鍋滅敤', value: 0 }
+            { label: t('common.status.enabled'), value: 1 },
+            { label: t('common.status.disabled'), value: 0 }
           ],
-          placeholder: '璇烽�夋嫨鐘舵��'
+          placeholder: t('pages.system.aiMcpMount.dialog.placeholders.status')
         }
       },
       {
-        label: '澶囨敞',
+        label: t('pages.system.aiMcpMount.dialog.labels.memo'),
         key: 'memo',
         type: 'input',
         span: 24,
-        props: { type: 'textarea', rows: 3, placeholder: '璇疯緭鍏ュ娉�' }
+        props: {
+          type: 'textarea',
+          rows: 3,
+          placeholder: t('pages.system.aiMcpMount.dialog.placeholders.memo')
+        }
       }
     )
+
     return items
   })
 
@@ -239,11 +334,13 @@
     draftTesting.value = true
     try {
       draftValidateResult.value = await fetchValidateAiMcpDraftConnectivity(buildAiMcpMountSavePayload(form))
-      ElMessage.success(draftValidateResult.value?.message || '鑽夌杩為�氭�ф祴璇曟垚鍔�')
+      ElMessage.success(
+        draftValidateResult.value?.message || t('pages.system.aiMcpMount.messages.draftConnectivitySuccess')
+      )
     } catch (error) {
       draftValidateResult.value = {
         healthStatus: 'UNHEALTHY',
-        message: error?.message || '鑽夌杩為�氭�ф祴璇曞け璐�'
+        message: error?.message || t('pages.system.aiMcpMount.messages.draftConnectivityFailed')
       }
       ElMessage.error(draftValidateResult.value.message)
     } finally {
diff --git a/rsf-design/src/views/system/ai-mcp-mount/modules/ai-mcp-tools-drawer.vue b/rsf-design/src/views/system/ai-mcp-mount/modules/ai-mcp-tools-drawer.vue
index ce571b0..bc99fcf 100644
--- a/rsf-design/src/views/system/ai-mcp-mount/modules/ai-mcp-tools-drawer.vue
+++ b/rsf-design/src/views/system/ai-mcp-mount/modules/ai-mcp-tools-drawer.vue
@@ -1,34 +1,61 @@
 <template>
   <ElDrawer
     :model-value="visible"
-    title="MCP 宸ュ叿棰勮"
+    :title="t('pages.system.aiMcpMount.toolsDrawer.title')"
     size="760px"
     @update:model-value="handleVisibleChange"
   >
     <div class="space-y-4">
-      <div class="flex flex-wrap items-center justify-between gap-3 rounded-2xl border border-[var(--art-border-color)] bg-[var(--art-main-bg-color)] p-4">
+      <div
+        class="flex flex-wrap items-center justify-between gap-3 rounded-2xl border border-[var(--art-border-color)] bg-[var(--art-main-bg-color)] p-4"
+      >
         <div>
-          <div class="text-sm font-semibold text-[var(--art-gray-900)]">{{ mountName || '褰撳墠鎸傝浇' }}</div>
-          <div class="mt-1 text-xs text-[var(--art-gray-500)]">鍙瑙堝伐鍏峰垪琛紝骞跺宸ュ叿鍏ュ弬鍋氳仈璋冩祴璇曘��</div>
+          <div class="text-sm font-semibold text-[var(--art-gray-900)]">
+            {{ mountName || t('pages.system.aiMcpMount.toolsDrawer.currentMount') }}
+          </div>
+          <div class="mt-1 text-xs text-[var(--art-gray-500)]">
+            {{ t('pages.system.aiMcpMount.toolsDrawer.description') }}
+          </div>
         </div>
         <ElSpace wrap>
-          <ElButton :loading="toolsLoading" @click="loadTools">鍒锋柊宸ュ叿</ElButton>
-          <ElButton :loading="connectivityLoading" @click="handleConnectivityTest">杩為�氭�ф祴璇�</ElButton>
+          <ElButton :loading="toolsLoading" @click="loadTools">
+            {{ t('pages.system.aiMcpMount.toolsDrawer.refreshTools') }}
+          </ElButton>
+          <ElButton :loading="connectivityLoading" @click="handleConnectivityTest">
+            {{ t('pages.system.aiMcpMount.toolsDrawer.connectivityTest') }}
+          </ElButton>
         </ElSpace>
       </div>
 
-      <ElAlert v-if="connectivityResult" :type="connectivityResult.healthStatus === 'HEALTHY' ? 'success' : 'error'" :closable="false">
+      <ElAlert
+        v-if="connectivityResult"
+        :type="connectivityResult.healthStatus === 'HEALTHY' ? 'success' : 'error'"
+        :closable="false"
+      >
         <div class="space-y-1 text-sm">
-          <div>{{ connectivityResult.message || '--' }}</div>
-          <div v-if="connectivityResult.initElapsedMs !== undefined && connectivityResult.initElapsedMs !== null">
-            鍒濆鍖栬�楁椂 {{ connectivityResult.initElapsedMs }} ms
+          <div>{{ connectivityResult.message || emptyText }}</div>
+          <div
+            v-if="
+              connectivityResult.initElapsedMs !== undefined &&
+              connectivityResult.initElapsedMs !== null
+            "
+          >
+            {{
+              t('pages.system.aiMcpMount.messages.initElapsedMs', {
+                value: connectivityResult.initElapsedMs
+              })
+            }}
           </div>
           <div v-if="connectivityResult.testedAt">{{ connectivityResult.testedAt }}</div>
         </div>
       </ElAlert>
 
       <ElSkeleton :loading="toolsLoading" animated :rows="8">
-        <ElEmpty v-if="!tools.length" description="鏆傛棤宸ュ叿淇℃伅" :image-size="100" />
+        <ElEmpty
+          v-if="!tools.length"
+          :description="t('pages.system.aiMcpMount.toolsDrawer.empty')"
+          :image-size="100"
+        />
 
         <div v-else class="space-y-4">
           <div
@@ -39,36 +66,46 @@
             <div class="flex flex-wrap items-start justify-between gap-3">
               <div>
                 <div class="text-base font-semibold text-[var(--art-gray-900)]">{{ tool.name }}</div>
-                <div class="mt-1 text-sm text-[var(--art-gray-500)]">{{ tool.description || '--' }}</div>
+                <div class="mt-1 text-sm text-[var(--art-gray-500)]">{{ tool.description || emptyText }}</div>
               </div>
-              <ElButton :loading="testingToolName === tool.name" @click="handleToolTest(tool.name)">宸ュ叿娴嬭瘯</ElButton>
+              <ElButton :loading="testingToolName === tool.name" @click="handleToolTest(tool.name)">
+                {{ t('pages.system.aiMcpMount.toolsDrawer.toolTest') }}
+              </ElButton>
             </div>
 
             <div class="mt-4 grid gap-4 md:grid-cols-2">
               <div class="space-y-2">
-                <div class="text-xs text-[var(--art-gray-500)]">杈撳叆鍙傛暟 JSON</div>
+                <div class="text-xs text-[var(--art-gray-500)]">
+                  {{ t('pages.system.aiMcpMount.toolsDrawer.inputJson') }}
+                </div>
                 <ElInput
                   v-model="toolInputs[tool.name]"
                   type="textarea"
                   :rows="8"
-                  placeholder='璇疯緭鍏� JSON锛屼緥濡� {"taskCode":"TK001"}'
+                  :placeholder="t('pages.system.aiMcpMount.toolsDrawer.inputJsonPlaceholder')"
                 />
               </div>
               <div class="space-y-2">
-                <div class="text-xs text-[var(--art-gray-500)]">宸ュ叿杈撳嚭</div>
+                <div class="text-xs text-[var(--art-gray-500)]">
+                  {{ t('pages.system.aiMcpMount.toolsDrawer.output') }}
+                </div>
                 <ElInput
                   :model-value="toolOutputs[tool.name] || ''"
                   type="textarea"
                   :rows="8"
                   readonly
-                  placeholder="宸ュ叿杈撳嚭浼氭樉绀哄湪杩欓噷"
+                  :placeholder="t('pages.system.aiMcpMount.toolsDrawer.outputPlaceholder')"
                 />
               </div>
             </div>
 
             <div v-if="tool.inputSchema" class="mt-4 rounded-xl bg-[var(--art-main-bg-color)] p-3">
-              <div class="text-xs text-[var(--art-gray-500)]">杈撳叆 Schema</div>
-              <pre class="mt-2 whitespace-pre-wrap break-all text-xs leading-6 text-[var(--art-gray-900)]">{{ formatSchema(tool.inputSchema) }}</pre>
+              <div class="text-xs text-[var(--art-gray-500)]">
+                {{ t('pages.system.aiMcpMount.toolsDrawer.inputSchema') }}
+              </div>
+              <pre class="mt-2 whitespace-pre-wrap break-all text-xs leading-6 text-[var(--art-gray-900)]">{{
+                formatSchema(tool.inputSchema)
+              }}</pre>
             </div>
           </div>
         </div>
@@ -78,6 +115,7 @@
 </template>
 
 <script setup>
+  import { useI18n } from 'vue-i18n'
   import { ElMessage } from 'element-plus'
   import { guardRequestWithMessage } from '@/utils/sys/requestGuard'
   import { fetchPreviewAiMcpTools, fetchTestAiMcpConnectivity, fetchTestAiMcpTool } from '@/api/ai-config'
@@ -89,6 +127,7 @@
   })
 
   const emit = defineEmits(['update:visible'])
+  const { t } = useI18n()
   const tools = ref([])
   const toolsLoading = ref(false)
   const connectivityLoading = ref(false)
@@ -96,6 +135,8 @@
   const toolInputs = reactive({})
   const toolOutputs = reactive({})
   const testingToolName = ref('')
+
+  const emptyText = computed(() => t('common.placeholder.empty'))
 
   function resetState() {
     tools.value = []
@@ -118,12 +159,12 @@
     toolsLoading.value = true
     try {
       const response = await guardRequestWithMessage(fetchPreviewAiMcpTools(props.mountId), [], {
-        timeoutMessage: '宸ュ叿鍒楄〃鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+        timeoutMessage: t('pages.system.aiMcpMount.messages.toolsTimeout')
       })
       tools.value = Array.isArray(response) ? response : []
     } catch (error) {
       tools.value = []
-      ElMessage.error(error?.message || '鑾峰彇宸ュ叿鍒楄〃澶辫触')
+      ElMessage.error(error?.message || t('pages.system.aiMcpMount.toolsDrawer.toolsLoadFailed'))
     } finally {
       toolsLoading.value = false
     }
@@ -134,11 +175,13 @@
     connectivityLoading.value = true
     try {
       connectivityResult.value = await guardRequestWithMessage(fetchTestAiMcpConnectivity(props.mountId), null, {
-        timeoutMessage: '杩為�氭�ф祴璇曡秴鏃讹紝宸插仠姝㈢瓑寰�'
+        timeoutMessage: t('pages.system.aiMcpMount.messages.connectivityTimeout')
       })
-      ElMessage.success(connectivityResult.value?.message || '杩為�氭�ф祴璇曟垚鍔�')
+      ElMessage.success(
+        connectivityResult.value?.message || t('pages.system.aiMcpMount.messages.connectivitySuccess')
+      )
     } catch (error) {
-      ElMessage.error(error?.message || '杩為�氭�ф祴璇曞け璐�')
+      ElMessage.error(error?.message || t('pages.system.aiMcpMount.messages.connectivityFailed'))
     } finally {
       connectivityLoading.value = false
     }
@@ -148,7 +191,7 @@
     if (!props.mountId) return
     const inputJson = toolInputs[toolName]?.trim?.() || ''
     if (!inputJson) {
-      ElMessage.warning('璇疯緭鍏ュ伐鍏锋祴璇曞叆鍙� JSON')
+      ElMessage.warning(t('pages.system.aiMcpMount.toolsDrawer.toolInputRequired'))
       return
     }
     testingToolName.value = toolName
@@ -160,14 +203,14 @@
         }),
         null,
         {
-          timeoutMessage: '宸ュ叿娴嬭瘯瓒呮椂锛屽凡鍋滄绛夊緟'
+          timeoutMessage: t('pages.system.aiMcpMount.messages.toolTestTimeout')
         }
       )
       toolOutputs[toolName] = result?.output || JSON.stringify(result || {}, null, 2)
-      ElMessage.success('宸ュ叿娴嬭瘯鎴愬姛')
+      ElMessage.success(t('pages.system.aiMcpMount.toolsDrawer.toolTestSuccess'))
     } catch (error) {
-      toolOutputs[toolName] = error?.message || '宸ュ叿娴嬭瘯澶辫触'
-      ElMessage.error(error?.message || '宸ュ叿娴嬭瘯澶辫触')
+      toolOutputs[toolName] = error?.message || t('pages.system.aiMcpMount.toolsDrawer.toolTestFailed')
+      ElMessage.error(error?.message || t('pages.system.aiMcpMount.toolsDrawer.toolTestFailed'))
     } finally {
       testingToolName.value = ''
     }
diff --git a/rsf-design/src/views/system/ai-observe/aiObservePage.helpers.js b/rsf-design/src/views/system/ai-observe/aiObservePage.helpers.js
index e3a6320..7fdbe04 100644
--- a/rsf-design/src/views/system/ai-observe/aiObservePage.helpers.js
+++ b/rsf-design/src/views/system/ai-observe/aiObservePage.helpers.js
@@ -1,4 +1,10 @@
-export const AI_OBSERVE_REPORT_TITLE = 'AI 瑙傛祴鎶ヨ〃'
+export function getAiObserveReportTitle(t) {
+  return t('pages.system.aiObserve.reportTitle')
+}
+
+function translate(t, key) {
+  return typeof t === 'function' ? t(key) : key
+}
 
 export function createAiObserveSearchState() {
   return {
@@ -40,18 +46,18 @@
   }
 }
 
-export function getAiObserveStatusMeta(status) {
+export function getAiObserveStatusMeta(status, t) {
   if (status === 'COMPLETED') {
-    return { text: '宸插畬鎴�', type: 'success' }
+    return { text: translate(t, 'pages.system.aiObserve.status.completed'), type: 'success' }
   }
   if (status === 'FAILED') {
-    return { text: '澶辫触', type: 'danger' }
+    return { text: translate(t, 'pages.system.aiObserve.status.failed'), type: 'danger' }
   }
   if (status === 'ABORTED') {
-    return { text: '宸蹭腑姝�', type: 'warning' }
+    return { text: translate(t, 'pages.system.aiObserve.status.aborted'), type: 'warning' }
   }
   if (status === 'RUNNING') {
-    return { text: '鎵ц涓�', type: 'primary' }
+    return { text: translate(t, 'pages.system.aiObserve.status.running'), type: 'primary' }
   }
   return { text: status || '--', type: 'info' }
 }
@@ -76,8 +82,8 @@
   }
 }
 
-export function normalizeAiObserveRow(row = {}) {
-  const statusMeta = getAiObserveStatusMeta(row.status)
+export function normalizeAiObserveRow(row = {}, t) {
+  const statusMeta = getAiObserveStatusMeta(row.status, t)
   const userLabel = row.userLabel || row.userId$ || row.userName || (row.userId ?? '')
   return {
     ...row,
@@ -97,12 +103,12 @@
   }
 }
 
-export function buildAiObserveDetail(detail = {}, fallback = {}) {
+export function buildAiObserveDetail(detail = {}, fallback = {}, t) {
   const merged = {
     ...fallback,
     ...detail
   }
-  const statusMeta = getAiObserveStatusMeta(merged.status)
+  const statusMeta = getAiObserveStatusMeta(merged.status, t)
   return {
     requestId: merged.requestId || '',
     sessionId: merged.sessionId ?? '',
@@ -135,22 +141,22 @@
   }
 }
 
-export function getAiObserveReportColumns() {
+export function getAiObserveReportColumns(t) {
   return [
-    { prop: 'requestId', label: '璇锋眰ID' },
+    { prop: 'requestId', label: t('pages.system.aiObserve.table.requestId') },
     { prop: 'promptLabel', label: 'Prompt' },
-    { prop: 'model', label: '妯″瀷' },
-    { prop: 'userLabel', label: '鐢ㄦ埛' },
-    { prop: 'statusText', label: '鐘舵��' },
-    { prop: 'elapsedText', label: '鎬昏�楁椂(ms)' },
-    { prop: 'totalTokensText', label: '鎬� Tokens' },
-    { prop: 'createTimeText', label: '鍒涘缓鏃堕棿' }
+    { prop: 'model', label: t('pages.system.aiObserve.table.model') },
+    { prop: 'userLabel', label: t('pages.system.aiObserve.table.user') },
+    { prop: 'statusText', label: t('pages.system.aiObserve.table.status') },
+    { prop: 'elapsedText', label: t('pages.system.aiObserve.table.elapsed') },
+    { prop: 'totalTokensText', label: t('pages.system.aiObserve.table.totalTokens') },
+    { prop: 'createTimeText', label: t('pages.system.aiObserve.table.createTime') }
   ]
 }
 
-export function buildAiObservePrintRows(rows = []) {
+export function buildAiObservePrintRows(rows = [], t) {
   return rows.map((item) => {
-    const normalized = normalizeAiObserveRow(item)
+    const normalized = normalizeAiObserveRow(item, t)
     return {
       requestId: normalized.requestId || '--',
       promptLabel: [normalized.promptName || '--', normalized.promptCode || '--'].join(' / '),
diff --git a/rsf-design/src/views/system/ai-observe/aiObserveTable.columns.js b/rsf-design/src/views/system/ai-observe/aiObserveTable.columns.js
index b8b3674..d4c5ef2 100644
--- a/rsf-design/src/views/system/ai-observe/aiObserveTable.columns.js
+++ b/rsf-design/src/views/system/ai-observe/aiObserveTable.columns.js
@@ -2,12 +2,12 @@
 import { ElTag } from 'element-plus'
 import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
 
-export function createAiObserveTableColumns({ handleView }) {
+export function createAiObserveTableColumns({ handleView, t }) {
   return [
     { type: 'selection', width: 52, fixed: 'left' },
     {
       prop: 'requestId',
-      label: '璇锋眰ID',
+      label: t('pages.system.aiObserve.table.requestId'),
       minWidth: 210,
       showOverflowTooltip: true,
       formatter: (row) => row.requestId || '-'
@@ -25,44 +25,44 @@
     },
     {
       prop: 'model',
-      label: '妯″瀷',
+      label: t('pages.system.aiObserve.table.model'),
       minWidth: 150,
       showOverflowTooltip: true,
       formatter: (row) => row.model || '-'
     },
     {
       prop: 'userLabel',
-      label: '鐢ㄦ埛',
+      label: t('pages.system.aiObserve.table.user'),
       width: 110,
       formatter: (row) => row.userLabel || '-'
     },
     {
       prop: 'status',
-      label: '鐘舵��',
+      label: t('pages.system.aiObserve.table.status'),
       width: 100,
       formatter: (row) => h(ElTag, { type: row.statusType, effect: 'light' }, () => row.statusText)
     },
     {
       prop: 'elapsedText',
-      label: '鎬昏�楁椂',
+      label: t('pages.system.aiObserve.table.elapsed'),
       width: 110,
       formatter: (row) => row.elapsedText || '--'
     },
     {
       prop: 'totalTokens',
-      label: '鎬� Tokens',
+      label: t('pages.system.aiObserve.table.totalTokens'),
       width: 110,
       formatter: (row) => row.totalTokens ?? '--'
     },
     {
       prop: 'createTime$',
-      label: '鍒涘缓鏃堕棿',
+      label: t('pages.system.aiObserve.table.createTime'),
       minWidth: 170,
       formatter: (row) => row['createTime$'] || '-'
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: t('table.operation'),
       width: 70,
       align: 'right',
       fixed: 'right',
diff --git a/rsf-design/src/views/system/ai-observe/index.vue b/rsf-design/src/views/system/ai-observe/index.vue
index 5833dbe..03c3338 100644
--- a/rsf-design/src/views/system/ai-observe/index.vue
+++ b/rsf-design/src/views/system/ai-observe/index.vue
@@ -30,14 +30,14 @@
 
     <ElCard class="art-table-card">
       <div class="mb-4">
-        <h3 class="text-lg font-semibold text-[var(--art-gray-900)]">AI 瑙傛祴鎽樿</h3>
-        <p class="mt-1 text-sm text-[var(--art-gray-500)]">瑙傚療 AI 璋冪敤鐘舵�併�佽�楁椂銆乀okens 涓� MCP 宸ュ叿鎵ц鎯呭喌銆�</p>
+        <h3 class="text-lg font-semibold text-[var(--art-gray-900)]">{{ t('pages.system.aiObserve.summaryTitle') }}</h3>
+        <p class="mt-1 text-sm text-[var(--art-gray-500)]">{{ t('pages.system.aiObserve.summaryDescription') }}</p>
       </div>
 
       <ArtTableHeader v-model:columns="columnChecks" :loading="loading" @refresh="refreshAll">
         <template #left>
           <ElSpace wrap>
-            <ElTag effect="plain" type="info">鏈�杩戝叡 {{ pagination.total || 0 }} 鏉¤皟鐢ㄨ褰�</ElTag>
+            <ElTag effect="plain" type="info">{{ t('common.count', { count: pagination.total || 0 }) }}</ElTag>
           </ElSpace>
         </template>
       </ArtTableHeader>
@@ -63,6 +63,7 @@
 
 <script setup>
   import { ElMessage } from 'element-plus'
+  import { useI18n } from 'vue-i18n'
   import { useTable } from '@/hooks/core/useTable'
   import { guardRequestWithMessage } from '@/utils/sys/requestGuard'
   import {
@@ -72,11 +73,11 @@
     fetchGetAiObserveStats
   } from '@/api/ai-config'
   import {
-    AI_OBSERVE_REPORT_TITLE,
     buildAiObserveDetail,
     buildAiObservePageQueryParams,
     buildAiObserveSearchParams,
     createAiObserveSearchState,
+    getAiObserveReportTitle,
     getAiObservePaginationKey,
     normalizeAiObserveRow,
     normalizeAiObserveStats
@@ -85,6 +86,7 @@
   import AiObserveDetailDrawer from './modules/ai-observe-detail-drawer.vue'
 
   defineOptions({ name: 'AiObserve' })
+  const { t } = useI18n()
 
   const searchForm = ref(createAiObserveSearchState())
   const selectedRows = ref([])
@@ -96,52 +98,53 @@
 
   const searchItems = computed(() => [
     {
-      label: '鍏抽敭瀛�',
+      label: t('pages.system.aiObserve.search.condition'),
       key: 'condition',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ヨ姹侷D鎴� Prompt'
+        placeholder: t('pages.system.aiObserve.search.conditionPlaceholder')
       }
     },
     {
-      label: '璇锋眰ID',
+      label: t('pages.system.aiObserve.search.requestId'),
       key: 'requestId',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ヨ姹侷D'
+        placeholder: t('pages.system.aiObserve.search.requestIdPlaceholder')
       }
     },
     {
-      label: 'Prompt 缂栫爜',
+      label: t('pages.system.aiObserve.search.promptCode'),
       key: 'promptCode',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏� Prompt 缂栫爜'
+        placeholder: t('pages.system.aiObserve.search.promptCodePlaceholder')
       }
     },
     {
-      label: '鐢ㄦ埛',
+      label: t('pages.system.aiObserve.search.user'),
       key: 'userId',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ョ敤鎴稩D'
+        placeholder: t('pages.system.aiObserve.search.userPlaceholder')
       }
     },
     {
-      label: '鐘舵��',
+      label: t('pages.system.aiObserve.search.status'),
       key: 'status',
       type: 'select',
       props: {
         clearable: true,
+        placeholder: t('pages.system.aiObserve.search.statusPlaceholder'),
         options: [
-          { label: '鎵ц涓�', value: 'RUNNING' },
-          { label: '宸插畬鎴�', value: 'COMPLETED' },
-          { label: '澶辫触', value: 'FAILED' },
-          { label: '宸蹭腑姝�', value: 'ABORTED' }
+          { label: t('pages.system.aiObserve.status.running'), value: 'RUNNING' },
+          { label: t('pages.system.aiObserve.status.completed'), value: 'COMPLETED' },
+          { label: t('pages.system.aiObserve.status.failed'), value: 'FAILED' },
+          { label: t('pages.system.aiObserve.status.aborted'), value: 'ABORTED' }
         ]
       }
     }
@@ -149,33 +152,43 @@
 
   const summaryCards = computed(() => [
     {
-      label: '璋冪敤娆℃暟',
+      label: t('pages.system.aiObserve.stats.callCount'),
       value: stats.value.callCount,
-      description: `鎴愬姛 ${stats.value.successCount} / 澶辫触 ${stats.value.failureCount}`,
+      description: t('pages.system.aiObserve.stats.successFailure', {
+        success: stats.value.successCount,
+        failure: stats.value.failureCount
+      }),
       icon: 'ri:pulse-line',
       iconWrapClass: 'bg-sky-50',
       iconClass: 'text-sky-600'
     },
     {
-      label: '骞冲潎鑰楁椂',
+      label: t('pages.system.aiObserve.stats.avgElapsed'),
       value: `${stats.value.avgElapsedMs} ms`,
-      description: `棣栧寘 ${stats.value.avgFirstTokenLatencyMs} ms`,
+      description: t('pages.system.aiObserve.stats.firstTokenLatency', {
+        value: stats.value.avgFirstTokenLatencyMs
+      }),
       icon: 'ri:timer-flash-line',
       iconWrapClass: 'bg-amber-50',
       iconClass: 'text-amber-600'
     },
     {
-      label: '鎬� Tokens',
+      label: t('pages.system.aiObserve.stats.totalTokens'),
       value: stats.value.totalTokens,
-      description: `骞冲潎 ${stats.value.avgTotalTokens.toFixed(1)} Tokens`,
+      description: t('pages.system.aiObserve.stats.avgTokens', {
+        value: stats.value.avgTotalTokens.toFixed(1)
+      }),
       icon: 'ri:coin-line',
       iconWrapClass: 'bg-emerald-50',
       iconClass: 'text-emerald-600'
     },
     {
-      label: '宸ュ叿鎴愬姛鐜�',
+      label: t('pages.system.aiObserve.stats.toolSuccessRate'),
       value: `${stats.value.toolSuccessRate.toFixed(2)}%`,
-      description: `璋冪敤 ${stats.value.toolCallCount} / 澶辫触 ${stats.value.toolFailureCount}`,
+      description: t('pages.system.aiObserve.stats.toolCallFailure', {
+        callCount: stats.value.toolCallCount,
+        failureCount: stats.value.toolFailureCount
+      }),
       icon: 'ri:service-line',
       iconWrapClass: 'bg-violet-50',
       iconClass: 'text-violet-600'
@@ -188,10 +201,10 @@
     try {
       const [detail, mcpLogs] = await Promise.all([
         guardRequestWithMessage(fetchGetAiCallLogDetail(row.id), null, {
-          timeoutMessage: 'AI 瑙傛祴璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+          timeoutMessage: t('pages.system.aiObserve.messages.detailTimeout')
         }),
         guardRequestWithMessage(fetchGetAiCallLogMcpLogs(row.id), [], {
-          timeoutMessage: 'MCP 璋冪敤鏃ュ織鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+          timeoutMessage: t('pages.system.aiObserve.messages.mcpLogsTimeout')
         })
       ])
       detailData.value = buildAiObserveDetail(
@@ -199,12 +212,13 @@
           ...detail,
           mcpLogs: Array.isArray(mcpLogs) ? mcpLogs : []
         },
-        row
+        row,
+        t
       )
     } catch (error) {
       detailDrawerVisible.value = false
       detailData.value = {}
-      ElMessage.error(error?.message || '鑾峰彇 AI 瑙傛祴璇︽儏澶辫触')
+      ElMessage.error(error?.message || t('pages.system.aiObserve.messages.detailFailed'))
     } finally {
       detailLoading.value = false
     }
@@ -229,7 +243,8 @@
       paginationKey: getAiObservePaginationKey(),
       columnsFactory: () =>
         createAiObserveTableColumns({
-          handleView: openDetail
+          handleView: openDetail,
+          t
         })
     },
     transform: {
@@ -237,7 +252,7 @@
         if (!Array.isArray(records)) {
           return []
         }
-        return records.map((item) => normalizeAiObserveRow(item))
+        return records.map((item) => normalizeAiObserveRow(item, t))
       }
     }
   })
@@ -246,12 +261,12 @@
     statsLoading.value = true
     try {
       const response = await guardRequestWithMessage(fetchGetAiObserveStats(), normalizeAiObserveStats(), {
-        timeoutMessage: 'AI 瑙傛祴鎽樿鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+        timeoutMessage: t('pages.system.aiObserve.messages.statsTimeout')
       })
       stats.value = normalizeAiObserveStats(response)
     } catch (error) {
       stats.value = normalizeAiObserveStats()
-      ElMessage.error(error?.message || '鑾峰彇 AI 瑙傛祴鎽樿澶辫触')
+      ElMessage.error(error?.message || t('pages.system.aiObserve.messages.statsFailed'))
     } finally {
       statsLoading.value = false
     }
diff --git a/rsf-design/src/views/system/ai-observe/modules/ai-observe-detail-drawer.vue b/rsf-design/src/views/system/ai-observe/modules/ai-observe-detail-drawer.vue
index c1ed6fd..93f62a3 100644
--- a/rsf-design/src/views/system/ai-observe/modules/ai-observe-detail-drawer.vue
+++ b/rsf-design/src/views/system/ai-observe/modules/ai-observe-detail-drawer.vue
@@ -1,50 +1,50 @@
 <template>
   <ElDrawer
     :model-value="visible"
-    title="AI 瑙傛祴璇︽儏"
+    :title="t('pages.system.aiObserve.detail.title')"
     size="720px"
     @update:model-value="handleVisibleChange"
   >
     <ElSkeleton :loading="loading" animated :rows="14">
       <div class="space-y-5">
         <ElDescriptions :column="2" border>
-          <ElDescriptionsItem label="璇锋眰ID">{{ displayData.requestId || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="浼氳瘽ID">{{ displayData.sessionId || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="Prompt">{{ displayPrompt }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="妯″瀷">{{ displayData.model || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鐢ㄦ埛">{{ displayData.userId || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鐘舵��">
+          <ElDescriptionsItem :label="t('pages.system.aiObserve.detail.requestId')">{{ displayData.requestId || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.system.aiObserve.detail.sessionId')">{{ displayData.sessionId || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.system.aiObserve.detail.prompt')">{{ displayPrompt }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.system.aiObserve.detail.model')">{{ displayData.model || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.system.aiObserve.detail.user')">{{ displayData.userId || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.system.aiObserve.detail.status')">
             <ElTag :type="displayData.statusType" effect="light">{{ displayData.statusText || '--' }}</ElTag>
           </ElDescriptionsItem>
-          <ElDescriptionsItem label="鎸傝浇 MCP">{{ displayData.mountedMcpNames || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="閰嶇疆 MCP 鏁�">{{ displayData.configuredMcpCount ?? '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="宸ュ叿璋冪敤">{{ displayData.toolCallCount ?? '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鎴愬姛/澶辫触">
+          <ElDescriptionsItem :label="t('pages.system.aiObserve.detail.mountedMcp')">{{ displayData.mountedMcpNames || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.system.aiObserve.detail.configuredMcpCount')">{{ displayData.configuredMcpCount ?? '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.system.aiObserve.detail.toolCallCount')">{{ displayData.toolCallCount ?? '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.system.aiObserve.detail.toolSuccessFailure')">
             {{ displayData.toolSuccessCount ?? '--' }} / {{ displayData.toolFailureCount ?? '--' }}
           </ElDescriptionsItem>
-          <ElDescriptionsItem label="鎬昏�楁椂">{{ displayData.elapsedText }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="棣栧寘鑰楁椂">{{ displayData.firstTokenLatencyText }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.system.aiObserve.detail.elapsed')">{{ displayData.elapsedText }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.system.aiObserve.detail.firstTokenLatency')">{{ displayData.firstTokenLatencyText }}</ElDescriptionsItem>
           <ElDescriptionsItem label="Prompt Tokens">{{ displayData.promptTokens ?? '--' }}</ElDescriptionsItem>
           <ElDescriptionsItem label="Completion Tokens">{{ displayData.completionTokens ?? '--' }}</ElDescriptionsItem>
           <ElDescriptionsItem label="Total Tokens">{{ displayData.totalTokens ?? '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ displayData.createTimeText }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ displayData.updateTimeText }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="閿欒鍒嗙被">{{ displayData.errorCategory || '--' }}</ElDescriptionsItem>
-          <ElDescriptionsItem label="閿欒闃舵">{{ displayData.errorStage || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.system.aiObserve.detail.createTime')">{{ displayData.createTimeText }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.system.aiObserve.detail.updateTime')">{{ displayData.updateTimeText }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.system.aiObserve.detail.errorCategory')">{{ displayData.errorCategory || '--' }}</ElDescriptionsItem>
+          <ElDescriptionsItem :label="t('pages.system.aiObserve.detail.errorStage')">{{ displayData.errorStage || '--' }}</ElDescriptionsItem>
         </ElDescriptions>
 
         <ElAlert v-if="displayData.errorMessage" type="error" :closable="false" show-icon>
-          <template #title>閿欒淇℃伅</template>
+          <template #title>{{ t('pages.system.aiObserve.detail.errorMessage') }}</template>
           <div class="whitespace-pre-wrap break-all text-sm">{{ displayData.errorMessage }}</div>
         </ElAlert>
 
         <div class="space-y-3">
           <div class="flex items-center justify-between">
-            <h4 class="text-base font-semibold text-[var(--art-gray-900)]">MCP 璋冪敤鏃ュ織</h4>
-            <span class="text-sm text-[var(--art-gray-500)]">{{ displayData.mcpLogs.length }} 鏉�</span>
+            <h4 class="text-base font-semibold text-[var(--art-gray-900)]">{{ t('pages.system.aiObserve.detail.mcpLogs') }}</h4>
+            <span class="text-sm text-[var(--art-gray-500)]">{{ t('common.count', { count: displayData.mcpLogs.length }) }}</span>
           </div>
 
-          <ElEmpty v-if="!displayData.mcpLogs.length" description="鏆傛棤 MCP 璋冪敤鏃ュ織" :image-size="100" />
+          <ElEmpty v-if="!displayData.mcpLogs.length" :description="t('pages.system.aiObserve.detail.emptyMcpLogs')" :image-size="100" />
 
           <div v-else class="space-y-3">
             <div
@@ -66,13 +66,13 @@
 
               <div class="mt-4 grid gap-3 md:grid-cols-2">
                 <div class="rounded-xl bg-[var(--art-main-bg-color)] p-3">
-                  <div class="text-xs text-[var(--art-gray-500)]">杈撳叆鎽樿</div>
+                  <div class="text-xs text-[var(--art-gray-500)]">{{ t('pages.system.aiObserve.detail.inputSummary') }}</div>
                   <div class="mt-2 whitespace-pre-wrap break-all text-sm text-[var(--art-gray-900)]">
                     {{ item.inputSummary || '--' }}
                   </div>
                 </div>
                 <div class="rounded-xl bg-[var(--art-main-bg-color)] p-3">
-                  <div class="text-xs text-[var(--art-gray-500)]">杈撳嚭鎽樿</div>
+                  <div class="text-xs text-[var(--art-gray-500)]">{{ t('pages.system.aiObserve.detail.outputSummary') }}</div>
                   <div class="mt-2 whitespace-pre-wrap break-all text-sm text-[var(--art-gray-900)]">
                     {{ item.outputSummary || item.errorMessage || '--' }}
                   </div>
@@ -87,6 +87,7 @@
 </template>
 
 <script setup>
+  import { useI18n } from 'vue-i18n'
   import { buildAiObserveDetail } from '../aiObservePage.helpers'
 
   const props = defineProps({
@@ -96,8 +97,9 @@
   })
 
   const emit = defineEmits(['update:visible'])
+  const { t } = useI18n()
 
-  const displayData = computed(() => buildAiObserveDetail(props.detailData))
+  const displayData = computed(() => buildAiObserveDetail(props.detailData, {}, t))
   const displayPrompt = computed(() => {
     const name = displayData.value.promptName || '--'
     const code = displayData.value.promptCode || '--'
diff --git a/rsf-design/src/views/system/ai-param/aiParamPage.helpers.js b/rsf-design/src/views/system/ai-param/aiParamPage.helpers.js
index f04e148..87622b6 100644
--- a/rsf-design/src/views/system/ai-param/aiParamPage.helpers.js
+++ b/rsf-design/src/views/system/ai-param/aiParamPage.helpers.js
@@ -1,16 +1,18 @@
-const AI_PARAM_REPORT_TITLE = 'AI 鍙傛暟鎶ヨ〃'
+import { $t } from '@/locales'
+
+const AI_PARAM_REPORT_TITLE = () => $t('pages.system.aiParam.reportTitle')
 
 const PROVIDER_OPTIONS = [{ label: 'OPENAI_COMPATIBLE', value: 'OPENAI_COMPATIBLE' }]
 
 const STATUS_OPTIONS = [
-  { label: '榛樿', value: 1 },
-  { label: '鍊欓��', value: 0 }
+  { label: () => $t('pages.system.aiParam.status.default'), value: 1 },
+  { label: () => $t('pages.system.aiParam.status.candidate'), value: 0 }
 ]
 
 const VALIDATE_STATUS_META = {
-  VALID: { text: '宸叉牎楠�', type: 'success' },
-  INVALID: { text: '鏍¢獙澶辫触', type: 'danger' },
-  NOT_TESTED: { text: '鏈牎楠�', type: 'info' }
+  VALID: { text: () => $t('pages.system.aiParam.validation.valid'), type: 'success' },
+  INVALID: { text: () => $t('pages.system.aiParam.validation.invalid'), type: 'danger' },
+  NOT_TESTED: { text: () => $t('pages.system.aiParam.validation.notTested'), type: 'info' }
 }
 
 function createAiParamSearchState() {
@@ -58,17 +60,21 @@
 }
 
 function getAiParamStatusOptions() {
-  return STATUS_OPTIONS
+  return STATUS_OPTIONS.map((item) => ({ ...item, label: item.label() }))
 }
 
 function getAiParamStatusMeta(status) {
   return Number(status) === 1
-    ? { text: '榛樿', type: 'success' }
-    : { text: '鍊欓��', type: 'info' }
+    ? { text: $t('pages.system.aiParam.status.default'), type: 'success' }
+    : { text: $t('pages.system.aiParam.status.candidate'), type: 'info' }
 }
 
 function getAiParamValidateStatusMeta(status) {
-  return VALIDATE_STATUS_META[String(status || '').trim()] || { text: status || '鏈煡', type: 'info' }
+  const meta = VALIDATE_STATUS_META[String(status || '').trim()]
+  if (meta) {
+    return { text: meta.text(), type: meta.type }
+  }
+  return { text: status || $t('common.status.unknown'), type: 'info' }
 }
 
 function buildAiParamSearchParams(params = {}) {
@@ -150,7 +156,9 @@
     validateStatusText: validateMeta.text,
     validateStatusType: validateMeta.type,
     streamingEnabled: Boolean(record.streamingEnabled),
-    streamingText: record.streamingEnabled ? '娴佸紡鍝嶅簲' : '鏍囧噯鍝嶅簲',
+    streamingText: record.streamingEnabled
+      ? $t('pages.system.aiParam.streaming.enabled')
+      : $t('pages.system.aiParam.streaming.disabled'),
     'createTime$': normalizeText(record['createTime$']),
     'updateTime$': normalizeText(record['updateTime$']),
     'lastValidateTime$': normalizeText(record['lastValidateTime$'])
@@ -175,14 +183,14 @@
 
 function getAiParamReportColumns() {
   return [
-    { label: '鍚嶇О', prop: 'name' },
-    { label: '鎻愪緵鏂�', prop: 'providerType' },
-    { label: '妯″瀷', prop: 'model' },
-    { label: '榛樿鐘舵��', prop: 'statusText' },
-    { label: '鏍¢獙鐘舵��', prop: 'validateStatusText' },
-    { label: '瓒呮椂鏃堕棿(ms)', prop: 'timeoutMs' },
-    { label: '鏇存柊鏃堕棿', prop: 'updateTime' },
-    { label: '澶囨敞', prop: 'memo' }
+    { label: $t('pages.system.aiParam.table.name'), prop: 'name' },
+    { label: $t('pages.system.aiParam.table.providerType'), prop: 'providerType' },
+    { label: $t('pages.system.aiParam.table.model'), prop: 'model' },
+    { label: $t('pages.system.aiParam.table.status'), prop: 'statusText' },
+    { label: $t('pages.system.aiParam.table.validateStatus'), prop: 'validateStatusText' },
+    { label: $t('pages.system.aiParam.table.timeoutMs'), prop: 'timeoutMs' },
+    { label: $t('table.updateTime'), prop: 'updateTime' },
+    { label: $t('table.remark'), prop: 'memo' }
   ]
 }
 
diff --git a/rsf-design/src/views/system/ai-param/index.vue b/rsf-design/src/views/system/ai-param/index.vue
index 972e5ba..245d427 100644
--- a/rsf-design/src/views/system/ai-param/index.vue
+++ b/rsf-design/src/views/system/ai-param/index.vue
@@ -13,14 +13,14 @@
     <ElCard class="art-table-card ai-param-list-card">
       <div class="mb-5 flex flex-wrap items-center justify-between gap-4">
         <div>
-          <h3 class="text-lg font-semibold text-[var(--art-gray-900)]">AI 鍙傛暟</h3>
-          <p class="mt-1 text-sm text-[var(--art-gray-500)]">鎸夊崱鐗囩鐞嗗綋鍓嶇鎴风殑妯″瀷鎺ュ叆鍙傛暟涓庨粯璁ら厤缃��</p>
+          <h3 class="text-lg font-semibold text-[var(--art-gray-900)]">{{ t('pages.system.aiParam.title') }}</h3>
+          <p class="mt-1 text-sm text-[var(--art-gray-500)]">{{ t('pages.system.aiParam.subtitle') }}</p>
         </div>
 
         <ElSpace wrap>
-          <ElButton v-auth="'add'" @click="openCreateDialog" v-ripple>鏂板缓鍙傛暟</ElButton>
-          <ElButton :loading="exportLoading" @click="handleExport" v-ripple>瀵煎嚭</ElButton>
-          <ElButton :loading="loading" @click="refreshData" v-ripple>鍒锋柊</ElButton>
+          <ElButton v-auth="'add'" @click="openCreateDialog" v-ripple>{{ t('pages.system.aiParam.buttons.add') }}</ElButton>
+          <ElButton :loading="exportLoading" @click="handleExport" v-ripple>{{ t('common.actions.export') }}</ElButton>
+          <ElButton :loading="loading" @click="refreshData" v-ripple>{{ t('common.actions.refresh') }}</ElButton>
         </ElSpace>
       </div>
 
@@ -59,14 +59,14 @@
               <div
                 class="min-w-0 rounded-2xl bg-slate-50 px-3 py-2.5"
               >
-                <p class="text-xs text-[var(--art-gray-500)]">鍩虹鍦板潃</p>
+                <p class="text-xs text-[var(--art-gray-500)]">{{ t('pages.system.aiParam.fields.baseUrl') }}</p>
                 <p class="mt-1.5 break-all text-sm leading-6 text-[var(--art-gray-900)]">{{ item.baseUrl || '--' }}</p>
               </div>
               <div
                 class="min-w-0 rounded-2xl bg-slate-50 px-3 py-2.5"
               >
-                <p class="text-xs text-[var(--art-gray-500)]">鏈�杩戞牎楠�</p>
-                <p class="mt-1.5 text-sm text-[var(--art-gray-900)]">{{ item['lastValidateTime$'] || '鏈牎楠�' }}</p>
+                <p class="text-xs text-[var(--art-gray-500)]">{{ t('pages.system.aiParam.fields.lastValidateTime') }}</p>
+                <p class="mt-1.5 text-sm text-[var(--art-gray-900)]">{{ item['lastValidateTime$'] || t('pages.system.aiParam.validation.notTested') }}</p>
               </div>
             </div>
 
@@ -84,25 +84,25 @@
                 <p class="mt-1 text-sm font-medium text-[var(--art-gray-900)]">{{ item.maxTokens ?? '--' }}</p>
               </div>
               <div class="min-w-0 rounded-2xl bg-slate-50 px-3 py-2">
-                <p class="text-xs text-[var(--art-gray-500)]">瓒呮椂鏃堕棿</p>
+                <p class="text-xs text-[var(--art-gray-500)]">{{ t('pages.system.aiParam.fields.timeoutMs') }}</p>
                 <p class="mt-1 text-sm font-medium text-[var(--art-gray-900)]">{{ item.timeoutMs ?? '--' }} ms</p>
               </div>
             </div>
 
             <div class="mt-4 rounded-2xl bg-amber-50/70 px-3 py-2.5">
-              <p class="text-xs text-[var(--art-gray-500)]">澶囨敞</p>
+              <p class="text-xs text-[var(--art-gray-500)]">{{ t('table.remark') }}</p>
               <p class="mt-1.5 line-clamp-2 text-sm leading-6 text-[var(--art-gray-900)]">{{ item.memo || '--' }}</p>
             </div>
 
             <div class="mt-4 flex flex-wrap items-center justify-between gap-3 border-t border-[var(--art-border-color)] pt-3">
               <div class="flex items-center gap-2 text-xs text-[var(--art-gray-500)]">
-                <span>鏇存柊鏃堕棿</span>
+                <span>{{ t('table.updateTime') }}</span>
                 <span>{{ item['updateTime$'] || '--' }}</span>
               </div>
 
               <ElSpace wrap>
-                <ElButton text @click="openDetailDialog(item)">璇︽儏</ElButton>
-                <ElButton v-auth="'edit'" text @click="openEditDialog(item)">缂栬緫</ElButton>
+                <ElButton text @click="openDetailDialog(item)">{{ t('common.actions.detail') }}</ElButton>
+                <ElButton v-auth="'edit'" text @click="openEditDialog(item)">{{ t('common.actions.edit') }}</ElButton>
                 <ElButton
                   v-auth="'edit'"
                   text
@@ -110,15 +110,15 @@
                   :loading="defaultUpdatingId === item.id"
                   @click="handleSetDefault(item)"
                 >
-                  璁句负榛樿
+                  {{ t('pages.system.aiParam.actions.setDefault') }}
                 </ElButton>
-                <ElButton v-auth="'delete'" text type="danger" @click="handleDelete(item)">鍒犻櫎</ElButton>
+                <ElButton v-auth="'delete'" text type="danger" @click="handleDelete(item)">{{ t('common.actions.delete') }}</ElButton>
               </ElSpace>
             </div>
           </article>
         </div>
 
-        <ElEmpty v-else description="鏆傛棤 AI 鍙傛暟鏁版嵁" :image-size="110" />
+        <ElEmpty v-else :description="t('pages.system.aiParam.empty')" :image-size="110" />
       </div>
 
       <div class="mt-6 flex justify-end">
@@ -146,6 +146,7 @@
 
 <script setup>
   import { ElMessage, ElMessageBox } from 'element-plus'
+  import { useI18n } from 'vue-i18n'
   import { useUserStore } from '@/store/modules/user'
   import { useTable } from '@/hooks/core/useTable'
   import { guardRequestWithMessage } from '@/utils/sys/requestGuard'
@@ -172,6 +173,7 @@
 
   defineOptions({ name: 'AiParam' })
 
+  const { t } = useI18n()
   const userStore = useUserStore()
   const searchForm = ref(createAiParamSearchState())
   const dialogVisible = ref(false)
@@ -183,41 +185,41 @@
 
   const searchItems = computed(() => [
     {
-      label: '鍏抽敭瀛�',
+      label: t('pages.system.aiParam.search.condition'),
       key: 'condition',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ュ弬鏁板悕绉�'
+        placeholder: t('pages.system.aiParam.search.conditionPlaceholder')
       }
     },
     {
-      label: '鎻愪緵鏂�',
+      label: t('pages.system.aiParam.search.providerType'),
       key: 'providerType',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ユ彁渚涙柟绫诲瀷'
+        placeholder: t('pages.system.aiParam.search.providerTypePlaceholder')
       }
     },
     {
-      label: '妯″瀷',
+      label: t('pages.system.aiParam.search.model'),
       key: 'model',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ユā鍨嬪悕绉�'
+        placeholder: t('pages.system.aiParam.search.modelPlaceholder')
       }
     },
     {
-      label: '榛樿鐘舵��',
+      label: t('pages.system.aiParam.search.status'),
       key: 'status',
       type: 'select',
       props: {
         clearable: true,
         options: [
-          { label: '榛樿', value: 1 },
-          { label: '鍊欓��', value: 0 }
+          { label: t('pages.system.aiParam.status.default'), value: 1 },
+          { label: t('pages.system.aiParam.status.candidate'), value: 0 }
         ]
       }
     }
@@ -282,14 +284,14 @@
     try {
       if (dialogMode.value === 'edit') {
         await fetchUpdateAiParam(buildAiParamSavePayload(payload))
-        ElMessage.success('淇敼鎴愬姛')
+        ElMessage.success(t('crud.messages.updateSuccess'))
         dialogVisible.value = false
         summaryRefreshSeed.value += 1
         await refreshUpdate()
         return
       }
       await fetchSaveAiParam(buildAiParamSavePayload(payload))
-      ElMessage.success('鏂板鎴愬姛')
+      ElMessage.success(t('crud.messages.createSuccess'))
       dialogVisible.value = false
       summaryRefreshSeed.value += 1
       await refreshCreate()
@@ -303,7 +305,7 @@
     defaultUpdatingId.value = record.id
     try {
       await fetchSetAiParamDefault(record.id)
-      ElMessage.success('榛樿鍙傛暟宸插垏鎹�')
+      ElMessage.success(t('pages.system.aiParam.messages.setDefaultSuccess'))
       summaryRefreshSeed.value += 1
       await refreshUpdate()
     } catch {
@@ -315,17 +317,23 @@
 
   async function handleDelete(record) {
     try {
-      await ElMessageBox.confirm(`纭畾瑕佸垹闄� AI 鍙傛暟銆�${record?.name || record?.id}銆嶅悧锛焋, '鍒犻櫎纭', {
-        confirmButtonText: '纭畾',
-        cancelButtonText: '鍙栨秷',
+      await ElMessageBox.confirm(
+        t('crud.confirm.deleteMessage', {
+          entity: t('pages.system.aiParam.entity'),
+          label: record?.name || record?.id
+        }),
+        t('crud.confirm.deleteTitle'),
+        {
+        confirmButtonText: t('common.confirm'),
+        cancelButtonText: t('common.cancel'),
         type: 'warning'
       })
       await fetchDeleteAiParam(record.id)
-      ElMessage.success('鍒犻櫎鎴愬姛')
+      ElMessage.success(t('crud.messages.deleteSuccess'))
       await refreshRemove()
     } catch (error) {
       if (error !== 'cancel') {
-        ElMessage.error(error?.message || '鍒犻櫎澶辫触')
+        ElMessage.error(error?.message || t('crud.messages.deleteFailed'))
       }
     }
   }
@@ -341,12 +349,12 @@
         }),
         null,
         {
-          timeoutMessage: '瀵煎嚭璇锋眰瓒呮椂锛屽凡鍋滄绛夊緟'
+          timeoutMessage: t('message.exportTimeoutStopped')
         }
       )
       if (!response) return
       if (!response.ok) {
-        throw new Error(`瀵煎嚭澶辫触 (${response.status})`)
+        throw new Error(t('crud.messages.exportFailedWithStatus', { status: response.status }))
       }
       const blob = await response.blob()
       const url = window.URL.createObjectURL(blob)
@@ -357,9 +365,9 @@
       link.click()
       link.remove()
       window.URL.revokeObjectURL(url)
-      ElMessage.success('瀵煎嚭鎴愬姛')
+      ElMessage.success(t('crud.messages.exportSuccess'))
     } catch (error) {
-      ElMessage.error(error?.message || '瀵煎嚭澶辫触')
+      ElMessage.error(error?.message || t('crud.messages.exportFailed'))
     } finally {
       exportLoading.value = false
     }
diff --git a/rsf-design/src/views/system/ai-param/modules/ai-param-dialog.vue b/rsf-design/src/views/system/ai-param/modules/ai-param-dialog.vue
index e48a405..67d71ef 100644
--- a/rsf-design/src/views/system/ai-param/modules/ai-param-dialog.vue
+++ b/rsf-design/src/views/system/ai-param/modules/ai-param-dialog.vue
@@ -19,14 +19,21 @@
       :show-submit="false"
     />
 
-    <div v-if="showRuntimeSection" class="mt-2 rounded-2xl border border-[var(--art-border-color)] px-5 py-4">
+    <div
+      v-if="showRuntimeSection"
+      class="mt-2 rounded-2xl border border-[var(--art-border-color)] px-5 py-4"
+    >
       <div class="mb-3 flex items-center justify-between gap-4">
         <div>
-          <h4 class="text-base font-semibold text-[var(--art-gray-900)]">杩愯鏃剁姸鎬�</h4>
-          <p class="mt-1 text-sm text-[var(--art-gray-500)]">淇濆瓨鍓嶅彲鍏堟墽琛岃崏绋挎牎楠岋紝杩愯鏃剁姸鎬佺敱鍚庣鐪熷疄杩斿洖銆�</p>
+          <h4 class="text-base font-semibold text-[var(--art-gray-900)]">
+            {{ t('pages.system.aiParam.dialog.runtimeTitle') }}
+          </h4>
+          <p class="mt-1 text-sm text-[var(--art-gray-500)]">
+            {{ t('pages.system.aiParam.dialog.runtimeDescription') }}
+          </p>
         </div>
         <ElButton v-if="!isReadonly" :loading="validateLoading" @click="handleValidateDraft">
-          鑽夌鏍¢獙
+          {{ t('pages.system.aiParam.dialog.validateDraft') }}
         </ElButton>
       </div>
 
@@ -39,14 +46,29 @@
       />
 
       <ElDescriptions :column="2" border>
-        <ElDescriptionsItem label="鏍¢獙鐘舵��">{{ form.validateStatus || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鏈�杩戞牎楠岃�楁椂">
-          {{ form.lastValidateElapsedMs !== null && form.lastValidateElapsedMs !== undefined ? `${form.lastValidateElapsedMs} ms` : '--' }}
+        <ElDescriptionsItem :label="t('pages.system.aiParam.dialog.labels.validateStatus')">
+          {{ form.validateStatus || '--' }}
         </ElDescriptionsItem>
-        <ElDescriptionsItem label="鏈�杩戞牎楠屾椂闂�">{{ form['lastValidateTime$'] || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鏈�杩戞洿鏂颁汉">{{ form.updateBy || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鏈�杩戞洿鏂版椂闂�" :span="2">{{ form['updateTime$'] || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鏈�杩戞牎楠屼俊鎭�" :span="2">
+        <ElDescriptionsItem :label="t('pages.system.aiParam.dialog.labels.lastValidateElapsedMs')">
+          {{
+            form.lastValidateElapsedMs !== null && form.lastValidateElapsedMs !== undefined
+              ? `${form.lastValidateElapsedMs} ms`
+              : '--'
+          }}
+        </ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.system.aiParam.dialog.labels.lastValidateTime')">
+          {{ form['lastValidateTime$'] || '--' }}
+        </ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.system.aiParam.dialog.labels.updateBy')">
+          {{ form.updateBy || '--' }}
+        </ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.system.aiParam.dialog.labels.updateTime')" :span="2">
+          {{ form['updateTime$'] || '--' }}
+        </ElDescriptionsItem>
+        <ElDescriptionsItem
+          :label="t('pages.system.aiParam.dialog.labels.lastValidateMessage')"
+          :span="2"
+        >
           <div class="whitespace-pre-wrap break-all text-sm leading-6 text-[var(--art-gray-700)]">
             {{ form.lastValidateMessage || '--' }}
           </div>
@@ -56,14 +78,19 @@
 
     <template #footer>
       <span class="dialog-footer">
-        <ElButton @click="handleCancel">{{ isReadonly ? '鍏抽棴' : '鍙栨秷' }}</ElButton>
-        <ElButton v-if="!isReadonly" type="primary" @click="handleSubmit">纭畾</ElButton>
+        <ElButton @click="handleCancel">
+          {{ isReadonly ? t('common.actions.close') : t('common.cancel') }}
+        </ElButton>
+        <ElButton v-if="!isReadonly" type="primary" @click="handleSubmit">
+          {{ t('common.confirm') }}
+        </ElButton>
       </span>
     </template>
   </ElDialog>
 </template>
 
 <script setup>
+  import { useI18n } from 'vue-i18n'
   import ArtForm from '@/components/core/forms/art-form/index.vue'
   import { fetchValidateAiParamDraft } from '@/api/ai-config'
   import {
@@ -81,6 +108,7 @@
   })
 
   const emit = defineEmits(['submit', 'update:visible'])
+  const { t } = useI18n()
   const formRef = ref()
   const form = reactive(createAiParamFormState())
   const validateLoading = ref(false)
@@ -89,9 +117,9 @@
   const isReadonly = computed(() => props.mode === 'show')
   const showRuntimeSection = computed(() => Boolean(form.id) || props.mode !== 'create')
   const dialogTitle = computed(() => {
-    if (props.mode === 'edit') return '缂栬緫 AI 鍙傛暟'
-    if (props.mode === 'show') return 'AI 鍙傛暟璇︽儏'
-    return '鏂板缓 AI 鍙傛暟'
+    if (props.mode === 'edit') return t('pages.system.aiParam.dialog.titleEdit')
+    if (props.mode === 'show') return t('pages.system.aiParam.dialog.titleDetail')
+    return t('pages.system.aiParam.dialog.titleCreate')
   })
 
   const validateAlertType = computed(() =>
@@ -112,69 +140,75 @@
   })
 
   const rules = computed(() => ({
-    name: [{ required: true, message: '璇疯緭鍏ュ弬鏁板悕绉�', trigger: 'blur' }],
-    providerType: [{ required: true, message: '璇烽�夋嫨鎻愪緵鏂圭被鍨�', trigger: 'change' }],
-    baseUrl: [{ required: true, message: '璇疯緭鍏ュ熀纭�鍦板潃', trigger: 'blur' }],
-    apiKey: [{ required: true, message: '璇疯緭鍏� API Key', trigger: 'blur' }],
-    model: [{ required: true, message: '璇疯緭鍏ユā鍨嬪悕绉�', trigger: 'blur' }]
+    name: [{ required: true, message: t('pages.system.aiParam.dialog.validation.name'), trigger: 'blur' }],
+    providerType: [
+      {
+        required: true,
+        message: t('pages.system.aiParam.dialog.validation.providerType'),
+        trigger: 'change'
+      }
+    ],
+    baseUrl: [{ required: true, message: t('pages.system.aiParam.dialog.validation.baseUrl'), trigger: 'blur' }],
+    apiKey: [{ required: true, message: t('pages.system.aiParam.dialog.validation.apiKey'), trigger: 'blur' }],
+    model: [{ required: true, message: t('pages.system.aiParam.dialog.validation.model'), trigger: 'blur' }]
   }))
 
   const formItems = computed(() => [
     {
-      label: '鍙傛暟鍚嶇О',
+      label: t('pages.system.aiParam.dialog.labels.name'),
       key: 'name',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ュ弬鏁板悕绉�',
+        placeholder: t('pages.system.aiParam.dialog.placeholders.name'),
         disabled: isReadonly.value
       }
     },
     {
-      label: '鎻愪緵鏂圭被鍨�',
+      label: t('pages.system.aiParam.dialog.labels.providerType'),
       key: 'providerType',
       type: 'select',
       props: {
         options: getAiParamProviderOptions(),
         disabled: isReadonly.value,
-        placeholder: '璇烽�夋嫨鎻愪緵鏂圭被鍨�'
+        placeholder: t('pages.system.aiParam.dialog.placeholders.providerType')
       }
     },
     {
-      label: '鍩虹鍦板潃',
+      label: t('pages.system.aiParam.dialog.labels.baseUrl'),
       key: 'baseUrl',
       type: 'input',
       span: 24,
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ュ吋瀹� OpenAI 鐨勫熀纭�鍦板潃',
+        placeholder: t('pages.system.aiParam.dialog.placeholders.baseUrl'),
         disabled: isReadonly.value
       }
     },
     {
-      label: 'API Key',
+      label: t('pages.system.aiParam.dialog.labels.apiKey'),
       key: 'apiKey',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏� API Key',
+        placeholder: t('pages.system.aiParam.dialog.placeholders.apiKey'),
         disabled: isReadonly.value,
         type: isReadonly.value ? 'text' : 'password',
         showPassword: !isReadonly.value
       }
     },
     {
-      label: '妯″瀷鍚嶇О',
+      label: t('pages.system.aiParam.dialog.labels.model'),
       key: 'model',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ユā鍨嬪悕绉�',
+        placeholder: t('pages.system.aiParam.dialog.placeholders.model'),
         disabled: isReadonly.value
       }
     },
     {
-      label: 'Temperature',
+      label: t('pages.system.aiParam.dialog.labels.temperature'),
       key: 'temperature',
       type: 'number',
       props: {
@@ -182,12 +216,12 @@
         max: 2,
         step: 0.1,
         precision: 2,
-        placeholder: '璇疯緭鍏� temperature',
+        placeholder: t('pages.system.aiParam.dialog.placeholders.temperature'),
         disabled: isReadonly.value
       }
     },
     {
-      label: 'Top P',
+      label: t('pages.system.aiParam.dialog.labels.topP'),
       key: 'topP',
       type: 'number',
       props: {
@@ -195,54 +229,54 @@
         max: 1,
         step: 0.1,
         precision: 2,
-        placeholder: '璇疯緭鍏� topP',
+        placeholder: t('pages.system.aiParam.dialog.placeholders.topP'),
         disabled: isReadonly.value
       }
     },
     {
-      label: '鏈�澶� Token',
+      label: t('pages.system.aiParam.dialog.labels.maxTokens'),
       key: 'maxTokens',
       type: 'number',
       props: {
         min: 1,
         step: 1,
-        placeholder: '璇疯緭鍏ユ渶澶� token',
+        placeholder: t('pages.system.aiParam.dialog.placeholders.maxTokens'),
         disabled: isReadonly.value
       }
     },
     {
-      label: '瓒呮椂鏃堕棿(ms)',
+      label: t('pages.system.aiParam.dialog.labels.timeoutMs'),
       key: 'timeoutMs',
       type: 'number',
       props: {
         min: 1000,
         step: 1000,
-        placeholder: '璇疯緭鍏ヨ秴鏃舵椂闂�',
+        placeholder: t('pages.system.aiParam.dialog.placeholders.timeoutMs'),
         disabled: isReadonly.value
       }
     },
     {
-      label: '娴佸紡鍝嶅簲',
+      label: t('pages.system.aiParam.dialog.labels.streamingEnabled'),
       key: 'streamingEnabled',
       type: 'switch',
       props: {
         disabled: isReadonly.value,
-        activeText: '寮�鍚�',
-        inactiveText: '鍏抽棴'
+        activeText: t('common.status.enabled'),
+        inactiveText: t('common.status.disabled')
       }
     },
     {
-      label: '榛樿鐘舵��',
+      label: t('pages.system.aiParam.dialog.labels.status'),
       key: 'status',
       type: 'select',
       props: {
         disabled: isReadonly.value,
         options: getAiParamStatusOptions(),
-        placeholder: '璇烽�夋嫨榛樿鐘舵��'
+        placeholder: t('pages.system.aiParam.dialog.placeholders.status')
       }
     },
     {
-      label: '澶囨敞',
+      label: t('pages.system.aiParam.dialog.labels.memo'),
       key: 'memo',
       type: 'input',
       span: 24,
@@ -250,7 +284,7 @@
         disabled: isReadonly.value,
         type: 'textarea',
         rows: 3,
-        placeholder: '璇疯緭鍏ュ娉�'
+        placeholder: t('pages.system.aiParam.dialog.placeholders.memo')
       }
     }
   ])
diff --git a/rsf-design/src/views/system/ai-param/modules/ai-param-runtime-summary.vue b/rsf-design/src/views/system/ai-param/modules/ai-param-runtime-summary.vue
index cf200ff..66e616f 100644
--- a/rsf-design/src/views/system/ai-param/modules/ai-param-runtime-summary.vue
+++ b/rsf-design/src/views/system/ai-param/modules/ai-param-runtime-summary.vue
@@ -2,10 +2,10 @@
   <ElCard class="art-table-card ai-param-runtime-summary-card !mb-5" shadow="never">
     <div class="mb-3 flex items-start justify-between gap-4">
       <div>
-        <h3 class="text-base font-semibold text-[var(--art-gray-900)]">杩愯鏃舵憳瑕�</h3>
-        <p class="mt-0.5 text-xs text-[var(--art-gray-500)]">褰撳墠鐢熸晥鐨勬ā鍨嬨�丳rompt 涓� MCP 鎸傝浇姒傚喌</p>
+        <h3 class="text-base font-semibold text-[var(--art-gray-900)]">{{ t('pages.system.aiParam.summary.title') }}</h3>
+        <p class="mt-0.5 text-xs text-[var(--art-gray-500)]">{{ t('pages.system.aiParam.summary.subtitle') }}</p>
       </div>
-      <ElButton text :loading="loading" @click="loadSummary">鍒锋柊鎽樿</ElButton>
+      <ElButton text :loading="loading" @click="loadSummary">{{ t('pages.system.aiParam.summary.refresh') }}</ElButton>
     </div>
 
     <ElAlert
@@ -23,7 +23,7 @@
             <ArtSvgIcon icon="ri:robot-2-line" class="text-base" />
           </div>
           <div class="min-w-0 flex-1">
-            <p class="text-[11px] text-[var(--art-gray-500)]">褰撳墠妯″瀷</p>
+            <p class="text-[11px] text-[var(--art-gray-500)]">{{ t('pages.system.aiParam.summary.activeModel') }}</p>
             <h4 class="truncate text-sm font-semibold text-[var(--art-gray-900)]">
               {{ summary.activeModel || '--' }}
             </h4>
@@ -35,7 +35,7 @@
             {{ validateMeta.text }}
           </ElTag>
         </div>
-        <p class="mt-1 text-[11px] text-[var(--art-gray-500)]">{{ summary.activeParamValidatedAt || '鏈牎楠�' }}</p>
+        <p class="mt-1 text-[11px] text-[var(--art-gray-500)]">{{ summary.activeParamValidatedAt || t('pages.system.aiParam.validation.notTested') }}</p>
       </div>
 
       <div class="rounded-2xl border border-[var(--art-border-color)] bg-[var(--art-main-bg-color)] px-3 py-3">
@@ -44,7 +44,7 @@
             <ArtSvgIcon icon="ri:lightbulb-flash-line" class="text-base" />
           </div>
           <div class="min-w-0 flex-1">
-            <p class="text-[11px] text-[var(--art-gray-500)]">褰撳墠 Prompt</p>
+            <p class="text-[11px] text-[var(--art-gray-500)]">{{ t('pages.system.aiParam.summary.activePrompt') }}</p>
             <h4 class="truncate text-sm font-semibold text-[var(--art-gray-900)]">
               {{ summary.promptName || '--' }}
             </h4>
@@ -54,7 +54,7 @@
           {{ [summary.promptCode, summary.promptScene].filter(Boolean).join(' / ') || '--' }}
         </p>
         <p class="mt-1 text-[11px] text-[var(--art-gray-500)]">
-          鏈�杩戞洿鏂版椂闂� {{ summary.activePromptUpdatedAt || '--' }}
+          {{ t('pages.system.aiParam.summary.lastPromptUpdate', { value: summary.activePromptUpdatedAt || '--' }) }}
         </p>
       </div>
 
@@ -64,9 +64,9 @@
             <ArtSvgIcon icon="ri:plug-2-line" class="text-base" />
           </div>
           <div class="min-w-0 flex-1">
-            <p class="text-[11px] text-[var(--art-gray-500)]">宸插惎鐢� MCP</p>
+            <p class="text-[11px] text-[var(--art-gray-500)]">{{ t('pages.system.aiParam.summary.enabledMcp') }}</p>
             <h4 class="text-sm font-semibold text-[var(--art-gray-900)]">
-              {{ summary.enabledMcpCount ?? 0 }} 涓�
+              {{ t('pages.system.aiParam.summary.enabledMcpCount', { count: summary.enabledMcpCount ?? 0 }) }}
             </h4>
           </div>
         </div>
@@ -79,7 +79,7 @@
           >
             {{ name }}
           </ElTag>
-          <span v-if="!enabledMcpNames.length" class="text-xs text-[var(--art-gray-500)]">鏆傛棤鎸傝浇</span>
+          <span v-if="!enabledMcpNames.length" class="text-xs text-[var(--art-gray-500)]">{{ t('pages.system.aiParam.summary.noMcp') }}</span>
         </div>
       </div>
     </div>
@@ -88,6 +88,7 @@
 
 <script setup>
   import { guardRequestWithMessage } from '@/utils/sys/requestGuard'
+  import { useI18n } from 'vue-i18n'
   import { fetchGetAiConfigSummary } from '@/api/ai-config'
   import { getAiParamValidateStatusMeta } from '../aiParamPage.helpers'
 
@@ -98,6 +99,7 @@
   const loading = ref(false)
   const summary = ref({})
   const errorMessage = ref('')
+  const { t } = useI18n()
 
   const validateMeta = computed(() =>
     getAiParamValidateStatusMeta(summary.value?.activeParamValidateStatus)
@@ -114,12 +116,12 @@
       fetchGetAiConfigSummary(props.promptCode),
       null,
       {
-        timeoutMessage: '杩愯鏃舵憳瑕佸姞杞借秴鏃讹紝宸插仠姝㈢瓑寰�'
+        timeoutMessage: t('pages.system.aiParam.messages.summaryTimeout')
       }
     )
     loading.value = false
     if (!data) {
-      errorMessage.value = '杩愯鏃舵憳瑕佹殏鏃朵笉鍙敤'
+      errorMessage.value = t('pages.system.aiParam.messages.summaryUnavailable')
       summary.value = {}
       return
     }
diff --git a/rsf-design/src/views/system/ai-prompt/aiPromptPage.helpers.js b/rsf-design/src/views/system/ai-prompt/aiPromptPage.helpers.js
index 5f22a4c..888f588 100644
--- a/rsf-design/src/views/system/ai-prompt/aiPromptPage.helpers.js
+++ b/rsf-design/src/views/system/ai-prompt/aiPromptPage.helpers.js
@@ -1,8 +1,10 @@
-const AI_PROMPT_REPORT_TITLE = 'Prompt 绠$悊鎶ヨ〃'
+import { $t } from '@/locales'
+
+const AI_PROMPT_REPORT_TITLE = () => $t('pages.system.aiPrompt.reportTitle')
 
 const STATUS_OPTIONS = [
-  { label: '鍚敤', value: 1 },
-  { label: '鍋滅敤', value: 0 }
+  { label: () => $t('common.status.enabled'), value: 1 },
+  { label: () => $t('common.status.disabled'), value: 0 }
 ]
 
 function createAiPromptSearchState() {
@@ -37,13 +39,13 @@
 }
 
 function getAiPromptStatusOptions() {
-  return STATUS_OPTIONS
+  return STATUS_OPTIONS.map((item) => ({ ...item, label: item.label() }))
 }
 
 function getAiPromptStatusMeta(status) {
   return Number(status) === 1
-    ? { text: '鍚敤', type: 'success' }
-    : { text: '鍋滅敤', type: 'info' }
+    ? { text: $t('common.status.enabled'), type: 'success' }
+    : { text: $t('common.status.disabled'), type: 'info' }
 }
 
 function buildAiPromptSearchParams(params = {}) {
@@ -138,13 +140,13 @@
 
 function getAiPromptReportColumns() {
   return [
-    { label: '鍚嶇О', prop: 'name' },
-    { label: '缂栫爜', prop: 'code' },
-    { label: '鍦烘櫙', prop: 'scene' },
-    { label: '鐘舵��', prop: 'statusText' },
-    { label: '绯荤粺鎻愮ず璇�', prop: 'systemPrompt' },
-    { label: '鐢ㄦ埛鎻愮ず璇嶆ā鏉�', prop: 'userPromptTemplate' },
-    { label: '鏇存柊鏃堕棿', prop: 'updateTime' }
+    { label: $t('pages.system.aiPrompt.table.name'), prop: 'name' },
+    { label: $t('pages.system.aiPrompt.table.code'), prop: 'code' },
+    { label: $t('pages.system.aiPrompt.table.scene'), prop: 'scene' },
+    { label: $t('pages.system.aiPrompt.table.status'), prop: 'statusText' },
+    { label: $t('pages.system.aiPrompt.table.systemPrompt'), prop: 'systemPrompt' },
+    { label: $t('pages.system.aiPrompt.table.userPromptTemplate'), prop: 'userPromptTemplate' },
+    { label: $t('table.updateTime'), prop: 'updateTime' }
   ]
 }
 
diff --git a/rsf-design/src/views/system/ai-prompt/index.vue b/rsf-design/src/views/system/ai-prompt/index.vue
index aa0ab7e..747d64a 100644
--- a/rsf-design/src/views/system/ai-prompt/index.vue
+++ b/rsf-design/src/views/system/ai-prompt/index.vue
@@ -11,14 +11,14 @@
     <ElCard class="art-table-card">
       <div class="mb-5 flex flex-wrap items-center justify-between gap-4">
         <div>
-          <h3 class="text-lg font-semibold text-[var(--art-gray-900)]">Prompt 绠$悊</h3>
-          <p class="mt-1 text-sm text-[var(--art-gray-500)]">鎸夊崱鐗囩淮鎶� Prompt 妯℃澘銆佸満鏅紪鐮佸拰杩愯鏃堕瑙堛��</p>
+          <h3 class="text-lg font-semibold text-[var(--art-gray-900)]">{{ t('pages.system.aiPrompt.title') }}</h3>
+          <p class="mt-1 text-sm text-[var(--art-gray-500)]">{{ t('pages.system.aiPrompt.subtitle') }}</p>
         </div>
 
         <ElSpace wrap>
-          <ElButton v-auth="'add'" @click="openCreateDialog" v-ripple>鏂板缓 Prompt</ElButton>
-          <ElButton :loading="exportLoading" @click="handleExport" v-ripple>瀵煎嚭</ElButton>
-          <ElButton :loading="loading" @click="refreshData" v-ripple>鍒锋柊</ElButton>
+          <ElButton v-auth="'add'" @click="openCreateDialog" v-ripple>{{ t('pages.system.aiPrompt.buttons.add') }}</ElButton>
+          <ElButton :loading="exportLoading" @click="handleExport" v-ripple>{{ t('common.actions.export') }}</ElButton>
+          <ElButton :loading="loading" @click="refreshData" v-ripple>{{ t('common.actions.refresh') }}</ElButton>
         </ElSpace>
       </div>
 
@@ -46,18 +46,18 @@
             </div>
 
             <div class="mt-4 flex flex-wrap gap-2">
-              <ElTag size="small" effect="plain">鍦烘櫙 {{ item.scene || '--' }}</ElTag>
+              <ElTag size="small" effect="plain">{{ t('pages.system.aiPrompt.fields.sceneTag', { value: item.scene || '--' }) }}</ElTag>
             </div>
 
             <div class="mt-5 rounded-2xl bg-[var(--art-main-bg-color)]/70 p-4 ring-1 ring-inset ring-[var(--art-border-color)]">
-              <p class="text-xs text-[var(--art-gray-500)]">绯荤粺鎻愮ず璇�</p>
+              <p class="text-xs text-[var(--art-gray-500)]">{{ t('pages.system.aiPrompt.fields.systemPrompt') }}</p>
               <p class="mt-2 line-clamp-4 whitespace-pre-wrap text-sm leading-6 text-[var(--art-gray-900)]">
                 {{ item.systemPrompt || '--' }}
               </p>
             </div>
 
             <div class="mt-4 rounded-2xl bg-amber-50/80 px-4 py-3">
-              <p class="text-xs text-[var(--art-gray-500)]">鐢ㄦ埛鎻愮ず璇嶆ā鏉�</p>
+              <p class="text-xs text-[var(--art-gray-500)]">{{ t('pages.system.aiPrompt.fields.userPromptTemplate') }}</p>
               <p class="mt-2 line-clamp-4 whitespace-pre-wrap text-sm leading-6 text-[var(--art-gray-900)]">
                 {{ item.userPromptTemplate || '--' }}
               </p>
@@ -65,20 +65,20 @@
 
             <div class="mt-5 flex flex-wrap items-center justify-between gap-3 border-t border-[var(--art-border-color)] pt-4">
               <div class="flex items-center gap-2 text-xs text-[var(--art-gray-500)]">
-                <span>鏇存柊鏃堕棿</span>
+                <span>{{ t('table.updateTime') }}</span>
                 <span>{{ item['updateTime$'] || '--' }}</span>
               </div>
 
               <ElSpace wrap>
-                <ElButton text @click="openDetailDialog(item)">璇︽儏</ElButton>
-                <ElButton v-auth="'edit'" text @click="openEditDialog(item)">缂栬緫</ElButton>
-                <ElButton v-auth="'delete'" text type="danger" @click="handleDelete(item)">鍒犻櫎</ElButton>
+                <ElButton text @click="openDetailDialog(item)">{{ t('common.actions.detail') }}</ElButton>
+                <ElButton v-auth="'edit'" text @click="openEditDialog(item)">{{ t('common.actions.edit') }}</ElButton>
+                <ElButton v-auth="'delete'" text type="danger" @click="handleDelete(item)">{{ t('common.actions.delete') }}</ElButton>
               </ElSpace>
             </div>
           </article>
         </div>
 
-        <ElEmpty v-else description="鏆傛棤 Prompt 鏁版嵁" :image-size="110" />
+        <ElEmpty v-else :description="t('pages.system.aiPrompt.empty')" :image-size="110" />
       </div>
 
       <div class="mt-6 flex justify-end">
@@ -106,6 +106,7 @@
 
 <script setup>
   import { ElMessage, ElMessageBox } from 'element-plus'
+  import { useI18n } from 'vue-i18n'
   import { useUserStore } from '@/store/modules/user'
   import { useTable } from '@/hooks/core/useTable'
   import { guardRequestWithMessage } from '@/utils/sys/requestGuard'
@@ -130,6 +131,7 @@
 
   defineOptions({ name: 'AiPrompt' })
 
+  const { t } = useI18n()
   const userStore = useUserStore()
   const searchForm = ref(createAiPromptSearchState())
   const dialogVisible = ref(false)
@@ -139,41 +141,41 @@
 
   const searchItems = computed(() => [
     {
-      label: '鍏抽敭瀛�',
+      label: t('pages.system.aiPrompt.search.condition'),
       key: 'condition',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏� Prompt 鍚嶇О'
+        placeholder: t('pages.system.aiPrompt.search.conditionPlaceholder')
       }
     },
     {
-      label: '缂栫爜',
+      label: t('pages.system.aiPrompt.search.code'),
       key: 'code',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏� Prompt 缂栫爜'
+        placeholder: t('pages.system.aiPrompt.search.codePlaceholder')
       }
     },
     {
-      label: '鍦烘櫙',
+      label: t('pages.system.aiPrompt.search.scene'),
       key: 'scene',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ュ満鏅爣璇�'
+        placeholder: t('pages.system.aiPrompt.search.scenePlaceholder')
       }
     },
     {
-      label: '鐘舵��',
+      label: t('pages.system.aiPrompt.search.status'),
       key: 'status',
       type: 'select',
       props: {
         clearable: true,
         options: [
-          { label: '鍚敤', value: 1 },
-          { label: '鍋滅敤', value: 0 }
+          { label: t('common.status.enabled'), value: 1 },
+          { label: t('common.status.disabled'), value: 0 }
         ]
       }
     }
@@ -238,13 +240,13 @@
     try {
       if (dialogMode.value === 'edit') {
         await fetchUpdateAiPrompt(buildAiPromptSavePayload(payload))
-        ElMessage.success('淇敼鎴愬姛')
+        ElMessage.success(t('crud.messages.updateSuccess'))
         dialogVisible.value = false
         await refreshUpdate()
         return
       }
       await fetchSaveAiPrompt(buildAiPromptSavePayload(payload))
-      ElMessage.success('鏂板鎴愬姛')
+      ElMessage.success(t('crud.messages.createSuccess'))
       dialogVisible.value = false
       await refreshCreate()
     } catch {
@@ -254,17 +256,23 @@
 
   async function handleDelete(record) {
     try {
-      await ElMessageBox.confirm(`纭畾瑕佸垹闄� Prompt銆�${record?.name || record?.id}銆嶅悧锛焋, '鍒犻櫎纭', {
-        confirmButtonText: '纭畾',
-        cancelButtonText: '鍙栨秷',
+      await ElMessageBox.confirm(
+        t('crud.confirm.deleteMessage', {
+          entity: t('pages.system.aiPrompt.entity'),
+          label: record?.name || record?.id
+        }),
+        t('crud.confirm.deleteTitle'),
+        {
+        confirmButtonText: t('common.confirm'),
+        cancelButtonText: t('common.cancel'),
         type: 'warning'
       })
       await fetchDeleteAiPrompt(record.id)
-      ElMessage.success('鍒犻櫎鎴愬姛')
+      ElMessage.success(t('crud.messages.deleteSuccess'))
       await refreshRemove()
     } catch (error) {
       if (error !== 'cancel') {
-        ElMessage.error(error?.message || '鍒犻櫎澶辫触')
+        ElMessage.error(error?.message || t('crud.messages.deleteFailed'))
       }
     }
   }
@@ -280,12 +288,12 @@
         }),
         null,
         {
-          timeoutMessage: '瀵煎嚭璇锋眰瓒呮椂锛屽凡鍋滄绛夊緟'
+          timeoutMessage: t('message.exportTimeoutStopped')
         }
       )
       if (!response) return
       if (!response.ok) {
-        throw new Error(`瀵煎嚭澶辫触 (${response.status})`)
+        throw new Error(t('crud.messages.exportFailedWithStatus', { status: response.status }))
       }
       const blob = await response.blob()
       const url = window.URL.createObjectURL(blob)
@@ -296,9 +304,9 @@
       link.click()
       link.remove()
       window.URL.revokeObjectURL(url)
-      ElMessage.success('瀵煎嚭鎴愬姛')
+      ElMessage.success(t('crud.messages.exportSuccess'))
     } catch (error) {
-      ElMessage.error(error?.message || '瀵煎嚭澶辫触')
+      ElMessage.error(error?.message || t('crud.messages.exportFailed'))
     } finally {
       exportLoading.value = false
     }
diff --git a/rsf-design/src/views/system/ai-prompt/modules/ai-prompt-dialog.vue b/rsf-design/src/views/system/ai-prompt/modules/ai-prompt-dialog.vue
index 67211b6..bb45774 100644
--- a/rsf-design/src/views/system/ai-prompt/modules/ai-prompt-dialog.vue
+++ b/rsf-design/src/views/system/ai-prompt/modules/ai-prompt-dialog.vue
@@ -22,10 +22,16 @@
     <div class="mt-2 rounded-2xl border border-[var(--art-border-color)] px-5 py-4">
       <div class="mb-3 flex items-center justify-between gap-4">
         <div>
-          <h4 class="text-base font-semibold text-[var(--art-gray-900)]">娓叉煋棰勮</h4>
-          <p class="mt-1 text-sm text-[var(--art-gray-500)]">杈撳叆绀轰緥鍐呭鍜� metadata锛岀洿鎺ラ瑙堟渶缁堟覆鏌撶粨鏋溿��</p>
+          <h4 class="text-base font-semibold text-[var(--art-gray-900)]">
+            {{ t('pages.system.aiPrompt.dialog.previewTitle') }}
+          </h4>
+          <p class="mt-1 text-sm text-[var(--art-gray-500)]">
+            {{ t('pages.system.aiPrompt.dialog.previewDescription') }}
+          </p>
         </div>
-        <ElButton v-if="!isReadonly" :loading="previewLoading" @click="handlePreview">娓叉煋棰勮</ElButton>
+        <ElButton v-if="!isReadonly" :loading="previewLoading" @click="handlePreview">
+          {{ t('pages.system.aiPrompt.dialog.previewAction') }}
+        </ElButton>
       </div>
 
       <div class="grid gap-4 lg:grid-cols-2">
@@ -35,14 +41,14 @@
             type="textarea"
             :rows="4"
             :disabled="isReadonly"
-            placeholder="璇疯緭鍏ョず渚嬭緭鍏ュ唴瀹�"
+            :placeholder="t('pages.system.aiPrompt.dialog.placeholders.previewInput')"
           />
           <ElInput
             v-model="metadataText"
             type="textarea"
             :rows="4"
             :disabled="isReadonly"
-            placeholder='璇疯緭鍏� JSON metadata锛屼緥濡� {"path":"/system/aiPrompt"}'
+            :placeholder="t('pages.system.aiPrompt.dialog.placeholders.metadata')"
           />
         </div>
 
@@ -57,44 +63,59 @@
             v-else-if="previewResult"
             type="success"
             :closable="false"
-            :title="`宸茶В鏋愬彉閲忥細${resolvedVariablesText}`"
+            :title="
+              t('pages.system.aiPrompt.dialog.previewResolvedVariables', {
+                value: resolvedVariablesText
+              })
+            "
           />
           <ElInput
             :model-value="previewResult?.renderedSystemPrompt || ''"
             type="textarea"
             :rows="5"
             readonly
-            placeholder="绯荤粺鎻愮ず璇嶆覆鏌撶粨鏋�"
+            :placeholder="t('pages.system.aiPrompt.dialog.placeholders.renderedSystemPrompt')"
           />
           <ElInput
             :model-value="previewResult?.renderedUserPrompt || ''"
             type="textarea"
             :rows="5"
             readonly
-            placeholder="鐢ㄦ埛鎻愮ず璇嶆覆鏌撶粨鏋�"
+            :placeholder="t('pages.system.aiPrompt.dialog.placeholders.renderedUserPrompt')"
           />
         </div>
       </div>
     </div>
 
     <div v-if="showRuntimeSection" class="mt-5 rounded-2xl border border-[var(--art-border-color)] px-5 py-4">
-      <h4 class="text-base font-semibold text-[var(--art-gray-900)]">杩愯鏃剁姸鎬�</h4>
+      <h4 class="text-base font-semibold text-[var(--art-gray-900)]">
+        {{ t('pages.system.aiPrompt.dialog.runtimeTitle') }}
+      </h4>
       <ElDescriptions class="mt-4" :column="2" border>
-        <ElDescriptionsItem label="鏈�杩戞洿鏂颁汉">{{ form.updateBy || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鏈�杩戞洿鏂版椂闂�">{{ form['updateTime$'] || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.system.aiPrompt.dialog.labels.updateBy')">
+          {{ form.updateBy || emptyText }}
+        </ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.system.aiPrompt.dialog.labels.updateTime')">
+          {{ form['updateTime$'] || emptyText }}
+        </ElDescriptionsItem>
       </ElDescriptions>
     </div>
 
     <template #footer>
       <span class="dialog-footer">
-        <ElButton @click="handleCancel">{{ isReadonly ? '鍏抽棴' : '鍙栨秷' }}</ElButton>
-        <ElButton v-if="!isReadonly" type="primary" @click="handleSubmit">纭畾</ElButton>
+        <ElButton @click="handleCancel">
+          {{ isReadonly ? t('common.actions.close') : t('common.cancel') }}
+        </ElButton>
+        <ElButton v-if="!isReadonly" type="primary" @click="handleSubmit">
+          {{ t('common.confirm') }}
+        </ElButton>
       </span>
     </template>
   </ElDialog>
 </template>
 
 <script setup>
+  import { useI18n } from 'vue-i18n'
   import ArtForm from '@/components/core/forms/art-form/index.vue'
   import { fetchRenderAiPromptPreview } from '@/api/ai-config'
   import {
@@ -105,9 +126,6 @@
     getAiPromptStatusOptions
   } from '../aiPromptPage.helpers'
 
-  const DEFAULT_PREVIEW_INPUT = '璇锋牴鎹綋鍓嶈緭鍏ョ粰鍑烘憳瑕�'
-  const DEFAULT_METADATA_TEXT = '{"path":"/system/aiPrompt"}'
-
   const props = defineProps({
     visible: { type: Boolean, default: false },
     mode: { type: String, default: 'create' },
@@ -115,112 +133,124 @@
   })
 
   const emit = defineEmits(['submit', 'update:visible'])
+  const { t } = useI18n()
   const formRef = ref()
   const form = reactive(createAiPromptFormState())
-  const previewInput = ref(DEFAULT_PREVIEW_INPUT)
-  const metadataText = ref(DEFAULT_METADATA_TEXT)
+  const previewInput = ref('')
+  const metadataText = ref('')
   const previewLoading = ref(false)
   const previewResult = ref(null)
   const previewErrorMessage = ref('')
 
+  const emptyText = computed(() => t('common.placeholder.empty'))
+  const defaultPreviewInput = computed(() => t('pages.system.aiPrompt.dialog.defaultPreviewInput'))
+  const defaultMetadataText = computed(() => '{"path":"/system/aiPrompt"}')
   const isReadonly = computed(() => props.mode === 'show')
   const showRuntimeSection = computed(() => Boolean(form.id) || props.mode !== 'create')
   const dialogTitle = computed(() => {
-    if (props.mode === 'edit') return '缂栬緫 Prompt'
-    if (props.mode === 'show') return 'Prompt 璇︽儏'
-    return '鏂板缓 Prompt'
+    if (props.mode === 'edit') return t('pages.system.aiPrompt.dialog.titleEdit')
+    if (props.mode === 'show') return t('pages.system.aiPrompt.dialog.titleDetail')
+    return t('pages.system.aiPrompt.dialog.titleCreate')
   })
 
   const resolvedVariablesText = computed(() => {
     if (!Array.isArray(previewResult.value?.resolvedVariables) || !previewResult.value.resolvedVariables.length) {
-      return '鏃�'
+      return t('pages.system.aiPrompt.dialog.previewNoVariables')
     }
-    return previewResult.value.resolvedVariables.join('銆�')
+    return previewResult.value.resolvedVariables.join(t('common.listSeparator'))
   })
 
   const rules = computed(() => ({
-    name: [{ required: true, message: '璇疯緭鍏� Prompt 鍚嶇О', trigger: 'blur' }],
-    code: [{ required: true, message: '璇疯緭鍏� Prompt 缂栫爜', trigger: 'blur' }],
-    scene: [{ required: true, message: '璇疯緭鍏ュ満鏅爣璇�', trigger: 'blur' }],
-    systemPrompt: [{ required: true, message: '璇疯緭鍏ョ郴缁熸彁绀鸿瘝', trigger: 'blur' }],
-    userPromptTemplate: [{ required: true, message: '璇疯緭鍏ョ敤鎴锋彁绀鸿瘝妯℃澘', trigger: 'blur' }]
+    name: [{ required: true, message: t('pages.system.aiPrompt.dialog.validation.name'), trigger: 'blur' }],
+    code: [{ required: true, message: t('pages.system.aiPrompt.dialog.validation.code'), trigger: 'blur' }],
+    scene: [{ required: true, message: t('pages.system.aiPrompt.dialog.validation.scene'), trigger: 'blur' }],
+    systemPrompt: [
+      { required: true, message: t('pages.system.aiPrompt.dialog.validation.systemPrompt'), trigger: 'blur' }
+    ],
+    userPromptTemplate: [
+      {
+        required: true,
+        message: t('pages.system.aiPrompt.dialog.validation.userPromptTemplate'),
+        trigger: 'blur'
+      }
+    ]
   }))
 
   const formItems = computed(() => [
     {
-      label: 'Prompt 鍚嶇О',
+      label: t('pages.system.aiPrompt.dialog.labels.name'),
       key: 'name',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏� Prompt 鍚嶇О',
+        placeholder: t('pages.system.aiPrompt.dialog.placeholders.name'),
         disabled: isReadonly.value
       }
     },
     {
-      label: 'Prompt 缂栫爜',
+      label: t('pages.system.aiPrompt.dialog.labels.code'),
       key: 'code',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏� Prompt 缂栫爜',
+        placeholder: t('pages.system.aiPrompt.dialog.placeholders.code'),
         disabled: isReadonly.value
       }
     },
     {
-      label: '鍦烘櫙鏍囪瘑',
+      label: t('pages.system.aiPrompt.dialog.labels.scene'),
       key: 'scene',
       type: 'input',
       span: 24,
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ュ満鏅爣璇�',
+        placeholder: t('pages.system.aiPrompt.dialog.placeholders.scene'),
         disabled: isReadonly.value
       }
     },
     {
-      label: '绯荤粺鎻愮ず璇�',
+      label: t('pages.system.aiPrompt.dialog.labels.systemPrompt'),
       key: 'systemPrompt',
       type: 'input',
       span: 24,
       props: {
         type: 'textarea',
         rows: 6,
-        placeholder: '璇疯緭鍏ョ郴缁熸彁绀鸿瘝',
+        placeholder: t('pages.system.aiPrompt.dialog.placeholders.systemPrompt'),
         disabled: isReadonly.value
       }
     },
     {
-      label: '鐢ㄦ埛鎻愮ず璇嶆ā鏉�',
+      label: t('pages.system.aiPrompt.dialog.labels.userPromptTemplate'),
       key: 'userPromptTemplate',
       type: 'input',
       span: 24,
       props: {
         type: 'textarea',
         rows: 5,
-        placeholder: '璇疯緭鍏ョ敤鎴锋彁绀鸿瘝妯℃澘',
+        placeholder: t('pages.system.aiPrompt.dialog.placeholders.userPromptTemplate'),
         disabled: isReadonly.value
       }
     },
     {
-      label: '鐘舵��',
+      label: t('pages.system.aiPrompt.dialog.labels.status'),
       key: 'status',
       type: 'select',
       props: {
         options: getAiPromptStatusOptions(),
-        placeholder: '璇烽�夋嫨鐘舵��',
+        placeholder: t('pages.system.aiPrompt.dialog.placeholders.status'),
         disabled: isReadonly.value
       }
     },
     {
-      label: '澶囨敞',
+      label: t('pages.system.aiPrompt.dialog.labels.memo'),
       key: 'memo',
       type: 'input',
       span: 24,
       props: {
         type: 'textarea',
         rows: 3,
-        placeholder: '璇疯緭鍏ュ娉�',
+        placeholder: t('pages.system.aiPrompt.dialog.placeholders.memo'),
         disabled: isReadonly.value
       }
     }
@@ -228,8 +258,8 @@
 
   function resetForm() {
     Object.assign(form, createAiPromptFormState())
-    previewInput.value = DEFAULT_PREVIEW_INPUT
-    metadataText.value = DEFAULT_METADATA_TEXT
+    previewInput.value = defaultPreviewInput.value
+    metadataText.value = defaultMetadataText.value
     previewResult.value = null
     previewErrorMessage.value = ''
     formRef.value?.clearValidate?.()
@@ -237,6 +267,8 @@
 
   function loadFormData() {
     Object.assign(form, buildAiPromptDialogModel(props.aiPromptData))
+    previewInput.value = defaultPreviewInput.value
+    metadataText.value = defaultMetadataText.value
     previewResult.value = null
     previewErrorMessage.value = ''
   }
@@ -256,7 +288,7 @@
       )
     } catch (error) {
       previewResult.value = null
-      previewErrorMessage.value = error?.message || '娓叉煋棰勮澶辫触'
+      previewErrorMessage.value = error?.message || t('pages.system.aiPrompt.messages.previewFailed')
     } finally {
       previewLoading.value = false
     }
diff --git a/rsf-design/src/views/system/config/configPage.helpers.js b/rsf-design/src/views/system/config/configPage.helpers.js
index 4564433..02c3ff6 100644
--- a/rsf-design/src/views/system/config/configPage.helpers.js
+++ b/rsf-design/src/views/system/config/configPage.helpers.js
@@ -1,9 +1,9 @@
 const CONFIG_TYPE_OPTIONS = [
-  { label: 'boolean', value: 1 },
-  { label: 'number', value: 2 },
-  { label: 'string', value: 3 },
-  { label: 'json', value: 4 },
-  { label: 'date', value: 5 }
+  { labelKey: 'pages.system.config.types.boolean', fallback: 'boolean', value: 1 },
+  { labelKey: 'pages.system.config.types.number', fallback: 'number', value: 2 },
+  { labelKey: 'pages.system.config.types.string', fallback: 'string', value: 3 },
+  { labelKey: 'pages.system.config.types.json', fallback: 'json', value: 4 },
+  { labelKey: 'pages.system.config.types.date', fallback: 'date', value: 5 }
 ]
 
 export function createConfigSearchState() {
@@ -36,19 +36,28 @@
   }
 }
 
-export function getConfigTypeOptions() {
-  return CONFIG_TYPE_OPTIONS
+export function getConfigTypeOptions(t) {
+  return CONFIG_TYPE_OPTIONS.map((item) => ({
+    label: typeof t === 'function' ? t(item.labelKey) : item.fallback,
+    value: item.value
+  }))
 }
 
 export function getConfigTypeMeta(type) {
   const normalizedType = Number(type)
-  return CONFIG_TYPE_OPTIONS.find((item) => item.value === normalizedType) || { label: '-', value: normalizedType || '' }
+  return (
+    CONFIG_TYPE_OPTIONS.find((item) => item.value === normalizedType) || {
+      labelKey: 'common.placeholder.empty',
+      fallback: '--',
+      value: normalizedType || ''
+    }
+  )
 }
 
 export function getConfigStatusMeta(status) {
   return Number(status) === 1
-    ? { text: '姝e父', type: 'success', bool: true }
-    : { text: '鍐荤粨', type: 'danger', bool: false }
+    ? { textKey: 'common.status.normal', fallback: 'Normal', type: 'success', bool: true }
+    : { textKey: 'common.status.frozen', fallback: 'Frozen', type: 'danger', bool: false }
 }
 
 export function buildConfigSearchParams(params = {}) {
@@ -100,6 +109,7 @@
 }
 
 export function normalizeConfigListRow(record = {}) {
+  const typeMeta = getConfigTypeMeta(record.type)
   const statusMeta = getConfigStatusMeta(record.status)
   return {
     ...record,
@@ -109,8 +119,10 @@
     val: record.val || '',
     content: record.content || '',
     memo: record.memo || '',
-    typeText: record['type$'] || getConfigTypeMeta(record.type).label,
-    statusText: record['status$'] || statusMeta.text,
+    typeTextKey: typeMeta.labelKey,
+    typeText: typeMeta.fallback,
+    statusTextKey: statusMeta.textKey,
+    statusText: statusMeta.fallback,
     statusType: statusMeta.type,
     statusBool: record.statusBool ?? statusMeta.bool,
     updateTimeText: record['updateTime$'] || record.updateTime || '',
diff --git a/rsf-design/src/views/system/config/configTable.columns.js b/rsf-design/src/views/system/config/configTable.columns.js
index f61a9e4..aef347a 100644
--- a/rsf-design/src/views/system/config/configTable.columns.js
+++ b/rsf-design/src/views/system/config/configTable.columns.js
@@ -2,54 +2,57 @@
 import { ElTag } from 'element-plus'
 import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
 
-export function createConfigTableColumns({ handleView, handleEdit, handleDelete }) {
+export function createConfigTableColumns({ t, handleView, handleEdit, handleDelete }) {
   return [
     {
       prop: 'uuid',
-      label: '缂栧彿',
+      label: t('table.code'),
       minWidth: 140,
       showOverflowTooltip: true
     },
     {
       prop: 'name',
-      label: '鍚嶇О',
+      label: t('table.name'),
       minWidth: 180,
       showOverflowTooltip: true
     },
     {
       prop: 'flag',
-      label: '鏍囪瘑',
+      label: t('pages.system.config.table.flag'),
       minWidth: 180,
       showOverflowTooltip: true
     },
     {
       prop: 'typeText',
-      label: '绫诲瀷',
+      label: t('pages.system.config.table.type'),
       width: 110,
-      formatter: (row) => row.typeText || '-'
+      formatter: (row) => t(row.typeTextKey || 'common.placeholder.empty')
     },
     {
       prop: 'val',
-      label: '鍊�',
+      label: t('pages.system.config.table.value'),
       minWidth: 180,
       showOverflowTooltip: true,
-      formatter: (row) => row.val || '-'
+      formatter: (row) => row.val || t('common.placeholder.empty')
     },
     {
       prop: 'status',
-      label: '鐘舵��',
+      label: t('table.status'),
       width: 100,
-      formatter: (row) => h(ElTag, { type: row.statusType, effect: 'light' }, () => row.statusText || '-')
+      formatter: (row) =>
+        h(ElTag, { type: row.statusType, effect: 'light' }, () =>
+          t(row.statusTextKey || 'common.placeholder.empty')
+        )
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: t('table.updateTime'),
       minWidth: 180,
-      formatter: (row) => row.updateTimeText || '-'
+      formatter: (row) => row.updateTimeText || t('common.placeholder.empty')
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: t('table.operation'),
       width: handleDelete ? 160 : 120,
       align: 'right',
       formatter: (row) => {
diff --git a/rsf-design/src/views/system/config/index.vue b/rsf-design/src/views/system/config/index.vue
index a879fe6..9d591b9 100644
--- a/rsf-design/src/views/system/config/index.vue
+++ b/rsf-design/src/views/system/config/index.vue
@@ -12,7 +12,9 @@
       <ArtTableHeader v-model:columns="columnChecks" :loading="loading" @refresh="refreshData">
         <template #left>
           <ElSpace wrap>
-            <ElButton v-auth="'add'" @click="showDialog('add')" v-ripple>鏂板閰嶇疆</ElButton>
+            <ElButton v-auth="'add'" @click="showDialog('add')" v-ripple>
+              {{ t('pages.system.config.buttons.add') }}
+            </ElButton>
             <ElButton
               v-auth="'delete'"
               type="danger"
@@ -20,7 +22,7 @@
               @click="handleBatchDelete"
               v-ripple
             >
-              鎵归噺鍒犻櫎
+              {{ t('common.actions.batchDelete') }}
             </ElButton>
           </ElSpace>
         </template>
@@ -53,6 +55,7 @@
 
 <script setup>
   import { ElMessage } from 'element-plus'
+  import { useI18n } from 'vue-i18n'
   import { useAuth } from '@/hooks/core/useAuth'
   import { useTable } from '@/hooks/core/useTable'
   import { useCrudPage } from '@/views/system/common/useCrudPage'
@@ -79,6 +82,7 @@
 
   defineOptions({ name: 'Config' })
 
+  const { t } = useI18n()
   const { hasAuth } = useAuth()
   const searchForm = ref(createConfigSearchState())
   const detailDrawerVisible = ref(false)
@@ -88,41 +92,42 @@
 
   const searchItems = computed(() => [
     {
-      label: '鍏抽敭瀛�',
+      label: t('table.keyword'),
       key: 'condition',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ラ厤缃悕绉�'
+        placeholder: t('pages.system.config.search.conditionPlaceholder')
       }
     },
     {
-      label: '鏍囪瘑',
+      label: t('pages.system.config.table.flag'),
       key: 'flag',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ラ厤缃爣璇�'
+        placeholder: t('pages.system.config.search.flagPlaceholder')
       }
     },
     {
-      label: '绫诲瀷',
+      label: t('pages.system.config.table.type'),
       key: 'type',
       type: 'select',
       props: {
         clearable: true,
-        options: getConfigTypeOptions()
+        placeholder: t('pages.system.config.placeholders.type'),
+        options: getConfigTypeOptions(t)
       }
     },
     {
-      label: '鐘舵��',
+      label: t('table.status'),
       key: 'status',
       type: 'select',
       props: {
         clearable: true,
         options: [
-          { label: '姝e父', value: 1 },
-          { label: '鍐荤粨', value: 0 }
+          { label: t('common.status.normal'), value: 1 },
+          { label: t('common.status.frozen'), value: 0 }
         ]
       }
     }
@@ -136,7 +141,7 @@
     } catch (error) {
       detailDrawerVisible.value = false
       detailData.value = {}
-      ElMessage.error(error?.message || '鑾峰彇閰嶇疆璇︽儏澶辫触')
+      ElMessage.error(error?.message || t('pages.system.config.messages.detailFailed'))
     } finally {
       detailLoading.value = false
     }
@@ -148,7 +153,7 @@
       dialogVisible.value = true
       dialogType.value = 'edit'
     } catch (error) {
-      ElMessage.error(error?.message || '鑾峰彇閰嶇疆璇︽儏澶辫触')
+      ElMessage.error(error?.message || t('pages.system.config.messages.detailFailed'))
     }
   }
 
@@ -174,6 +179,7 @@
       paginationKey: getConfigPaginationKey(),
       columnsFactory: () =>
         createConfigTableColumns({
+          t,
           handleView: openDetail,
           handleEdit: openEditDialog,
           handleDelete: hasAuth('delete') ? (row) => handleDeleteAction?.(row) : null
@@ -206,7 +212,7 @@
     saveRequest: fetchSaveConfig,
     updateRequest: fetchUpdateConfig,
     deleteRequest: fetchDeleteConfig,
-    entityName: '閰嶇疆',
+    entityName: t('pages.system.config.entity'),
     resolveRecordLabel: (record) => record?.name || record?.flag || record?.id,
     refreshCreate,
     refreshUpdate,
diff --git a/rsf-design/src/views/system/config/modules/config-detail-drawer.vue b/rsf-design/src/views/system/config/modules/config-detail-drawer.vue
index 0e7105d..af86445 100644
--- a/rsf-design/src/views/system/config/modules/config-detail-drawer.vue
+++ b/rsf-design/src/views/system/config/modules/config-detail-drawer.vue
@@ -1,30 +1,35 @@
 <template>
   <ElDrawer
     :model-value="visible"
-    title="閰嶇疆璇︽儏"
+    :title="t('pages.system.config.dialog.titleDetail')"
     size="560px"
     @update:model-value="handleVisibleChange"
   >
     <ElSkeleton :loading="loading" animated :rows="10">
       <ElDescriptions :column="1" border>
-        <ElDescriptionsItem label="缂栧彿">{{ displayData.uuid || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鍚嶇О">{{ displayData.name || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鏍囪瘑">{{ displayData.flag || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="绫诲瀷">{{ displayData.typeText || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鍊�">{{ displayData.val || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鏂囨湰">{{ displayData.content || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鐘舵��">
-          <ElTag :type="displayData.statusType" effect="light">{{ displayData.statusText || '--' }}</ElTag>
+        <ElDescriptionsItem :label="t('table.code')">{{ displayData.uuid || t('common.placeholder.empty') }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('table.name')">{{ displayData.name || t('common.placeholder.empty') }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.system.config.table.flag')">{{ displayData.flag || t('common.placeholder.empty') }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.system.config.table.type')">
+          {{ t(displayData.typeTextKey || 'common.placeholder.empty') }}
         </ElDescriptionsItem>
-        <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ displayData.updateTimeText || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ displayData.createTimeText || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="澶囨敞">{{ displayData.memo || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.system.config.table.value')">{{ displayData.val || t('common.placeholder.empty') }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.system.config.table.content')">{{ displayData.content || t('common.placeholder.empty') }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('table.status')">
+          <ElTag :type="displayData.statusType" effect="light">
+            {{ t(displayData.statusTextKey || 'common.placeholder.empty') }}
+          </ElTag>
+        </ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('table.updateTime')">{{ displayData.updateTimeText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('table.createTime')">{{ displayData.createTimeText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('table.memo')">{{ displayData.memo || t('common.placeholder.empty') }}</ElDescriptionsItem>
       </ElDescriptions>
     </ElSkeleton>
   </ElDrawer>
 </template>
 
 <script setup>
+  import { useI18n } from 'vue-i18n'
   import { normalizeConfigListRow } from '../configPage.helpers'
 
   const props = defineProps({
@@ -34,6 +39,7 @@
   })
 
   const emit = defineEmits(['update:visible'])
+  const { t } = useI18n()
   const displayData = computed(() => normalizeConfigListRow(props.detailData))
 
   function handleVisibleChange(visible) {
diff --git a/rsf-design/src/views/system/config/modules/config-dialog.vue b/rsf-design/src/views/system/config/modules/config-dialog.vue
index bb56df3..535f503 100644
--- a/rsf-design/src/views/system/config/modules/config-dialog.vue
+++ b/rsf-design/src/views/system/config/modules/config-dialog.vue
@@ -21,8 +21,8 @@
 
     <template #footer>
       <span class="dialog-footer">
-        <ElButton @click="handleCancel">鍙栨秷</ElButton>
-        <ElButton type="primary" @click="handleSubmit">纭畾</ElButton>
+        <ElButton @click="handleCancel">{{ t('common.cancel') }}</ElButton>
+        <ElButton type="primary" @click="handleSubmit">{{ t('common.confirm') }}</ElButton>
       </span>
     </template>
   </ElDialog>
@@ -30,6 +30,7 @@
 
 <script setup>
   import ArtForm from '@/components/core/forms/art-form/index.vue'
+  import { useI18n } from 'vue-i18n'
   import { buildConfigDialogModel, createConfigFormState, getConfigTypeOptions } from '../configPage.helpers'
 
   const props = defineProps({
@@ -38,95 +39,98 @@
   })
 
   const emit = defineEmits(['update:visible', 'submit'])
+  const { t } = useI18n()
   const formRef = ref()
   const form = reactive(createConfigFormState())
 
   const isEdit = computed(() => Boolean(form.id))
-  const dialogTitle = computed(() => (isEdit.value ? '缂栬緫閰嶇疆' : '鏂板閰嶇疆'))
+  const dialogTitle = computed(() =>
+    isEdit.value ? t('pages.system.config.dialog.titleEdit') : t('pages.system.config.dialog.titleCreate')
+  )
 
   const rules = computed(() => ({
-    name: [{ required: true, message: '璇疯緭鍏ラ厤缃悕绉�', trigger: 'blur' }],
-    flag: [{ required: true, message: '璇疯緭鍏ラ厤缃爣璇�', trigger: 'blur' }]
+    name: [{ required: true, message: t('pages.system.config.validation.name'), trigger: 'blur' }],
+    flag: [{ required: true, message: t('pages.system.config.validation.flag'), trigger: 'blur' }]
   }))
 
   const formItems = computed(() => [
     {
-      label: '缂栧彿',
+      label: t('table.code'),
       key: 'uuid',
       type: 'input',
       props: {
         disabled: true,
-        placeholder: '鏂板鍚庤嚜鍔ㄧ敓鎴�'
+        placeholder: t('pages.system.config.placeholders.uuid')
       }
     },
     {
-      label: '鍚嶇О',
+      label: t('table.name'),
       key: 'name',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ラ厤缃悕绉�'
+        placeholder: t('pages.system.config.placeholders.name')
       }
     },
     {
-      label: '鏍囪瘑',
+      label: t('pages.system.config.table.flag'),
       key: 'flag',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ラ厤缃爣璇�'
+        placeholder: t('pages.system.config.placeholders.flag')
       }
     },
     {
-      label: '绫诲瀷',
+      label: t('pages.system.config.table.type'),
       key: 'type',
       type: 'select',
       props: {
-        options: getConfigTypeOptions(),
-        placeholder: '璇烽�夋嫨绫诲瀷'
+        options: getConfigTypeOptions(t),
+        placeholder: t('pages.system.config.placeholders.type')
       }
     },
     {
-      label: '鍊�',
+      label: t('pages.system.config.table.value'),
       key: 'val',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ラ厤缃��'
+        placeholder: t('pages.system.config.placeholders.value')
       }
     },
     {
-      label: '鐘舵��',
+      label: t('table.status'),
       key: 'status',
       type: 'select',
       props: {
         options: [
-          { label: '姝e父', value: 1 },
-          { label: '鍐荤粨', value: 0 }
+          { label: t('common.status.normal'), value: 1 },
+          { label: t('common.status.frozen'), value: 0 }
         ],
-        placeholder: '璇烽�夋嫨鐘舵��'
+        placeholder: t('pages.system.config.placeholders.status')
       }
     },
     {
-      label: '鏂囨湰',
+      label: t('pages.system.config.table.content'),
       key: 'content',
       type: 'input',
       span: 24,
       props: {
         type: 'textarea',
         rows: 3,
-        placeholder: '璇疯緭鍏ラ厤缃枃鏈�'
+        placeholder: t('pages.system.config.placeholders.content')
       }
     },
     {
-      label: '澶囨敞',
+      label: t('table.memo'),
       key: 'memo',
       type: 'input',
       span: 24,
       props: {
         type: 'textarea',
         rows: 3,
-        placeholder: '璇疯緭鍏ュ娉�'
+        placeholder: t('pages.system.config.placeholders.memo')
       }
     }
   ])
diff --git a/rsf-design/src/views/system/dept/deptPage.helpers.js b/rsf-design/src/views/system/dept/deptPage.helpers.js
index 47fad23..de51afe 100644
--- a/rsf-design/src/views/system/dept/deptPage.helpers.js
+++ b/rsf-design/src/views/system/dept/deptPage.helpers.js
@@ -35,7 +35,8 @@
       sort: normalizeDeptNumber(item?.sort, 0),
       status: normalizeDeptNumber(item?.status, 1),
       statusBool: normalizeDeptNumber(item?.status, 1) === 1,
-      statusText: normalizeDeptNumber(item?.status, 1) === 1 ? '姝e父' : '绂佺敤',
+      statusTextKey: normalizeDeptNumber(item?.status, 1) === 1 ? 'common.status.normal' : 'common.status.disabled',
+      statusText: normalizeDeptNumber(item?.status, 1) === 1 ? 'Normal' : 'Disabled',
       statusType: normalizeDeptNumber(item?.status, 1) === 1 ? 'success' : 'danger',
       updateTimeText: item?.updateTime$ || item?.updateTime || '-',
       createTimeText: item?.createTime$ || item?.createTime || '-',
diff --git a/rsf-design/src/views/system/dept/deptTable.columns.js b/rsf-design/src/views/system/dept/deptTable.columns.js
index 001815e..266df24 100644
--- a/rsf-design/src/views/system/dept/deptTable.columns.js
+++ b/rsf-design/src/views/system/dept/deptTable.columns.js
@@ -2,55 +2,57 @@
 import { ElTag } from 'element-plus'
 import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
 
-export function createDeptTableColumns({ handleEdit, handleDelete }) {
+export function createDeptTableColumns({ t, handleEdit, handleDelete }) {
   return [
     {
       prop: 'name',
-      label: '閮ㄩ棬鍚嶇О',
+      label: t('pages.system.dept.table.name'),
       minWidth: 220,
       showOverflowTooltip: true
     },
     {
       prop: 'fullName',
-      label: '閮ㄩ棬鍏ㄧО',
+      label: t('pages.system.dept.table.fullName'),
       minWidth: 220,
       showOverflowTooltip: true,
-      formatter: (row) => row.fullName || '-'
+      formatter: (row) => row.fullName || t('common.placeholder.empty')
     },
     {
       prop: 'leader',
-      label: '璐熻矗浜�',
+      label: t('pages.system.dept.table.leader'),
       minWidth: 140,
-      formatter: (row) => row.leader || '-'
+      formatter: (row) => row.leader || t('common.placeholder.empty')
     },
     {
       prop: 'sort',
-      label: '鎺掑簭',
+      label: t('table.sort'),
       width: 90
     },
     {
       prop: 'status',
-      label: '鐘舵��',
+      label: t('table.status'),
       width: 100,
       formatter: (row) =>
-        h(ElTag, { type: row.statusType, effect: 'light' }, () => row.statusText || '-')
+        h(ElTag, { type: row.statusType, effect: 'light' }, () =>
+          t(row.statusTextKey || 'common.placeholder.empty')
+        )
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: t('table.updateTime'),
       minWidth: 180,
-      formatter: (row) => row.updateTimeText || '-'
+      formatter: (row) => row.updateTimeText || t('common.placeholder.empty')
     },
     {
       prop: 'memo',
-      label: '澶囨敞',
+      label: t('table.memo'),
       minWidth: 180,
       showOverflowTooltip: true,
-      formatter: (row) => row.memo || '-'
+      formatter: (row) => row.memo || t('common.placeholder.empty')
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: t('table.operation'),
       width: 140,
       align: 'right',
       formatter: (row) =>
diff --git a/rsf-design/src/views/system/dept/index.vue b/rsf-design/src/views/system/dept/index.vue
index 2dbb5b6..d77b852 100644
--- a/rsf-design/src/views/system/dept/index.vue
+++ b/rsf-design/src/views/system/dept/index.vue
@@ -17,9 +17,9 @@
       >
         <template #left>
           <ElSpace wrap>
-            <ElButton v-auth="'add'" @click="handleAdd" v-ripple>鏂板閮ㄩ棬</ElButton>
+            <ElButton v-auth="'add'" @click="handleAdd" v-ripple>{{ t('pages.system.dept.buttons.add') }}</ElButton>
             <ElButton @click="toggleExpand" v-ripple>
-              {{ isExpanded ? '鏀惰捣' : '灞曞紑' }}
+              {{ isExpanded ? t('common.actions.collapse') : t('common.actions.expand') }}
             </ElButton>
           </ElSpace>
         </template>
@@ -48,6 +48,7 @@
 
 <script setup>
   import { ElMessage, ElMessageBox } from 'element-plus'
+  import { useI18n } from 'vue-i18n'
   import { guardRequestWithMessage } from '@/utils/sys/requestGuard'
   import { useTableColumns } from '@/hooks/core/useTableColumns'
   import {
@@ -70,6 +71,7 @@
 
   defineOptions({ name: 'Dept' })
 
+  const { t } = useI18n()
   const loading = ref(false)
   const isExpanded = ref(false)
   const tableRef = ref()
@@ -83,18 +85,19 @@
 
   const searchItems = computed(() => [
     {
-      label: '閮ㄩ棬鍚嶇О',
+      label: t('pages.system.dept.table.name'),
       key: 'condition',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ラ儴闂ㄥ悕绉�'
+        placeholder: t('pages.system.dept.search.conditionPlaceholder')
       }
     }
   ])
 
   const { columnChecks, columns } = useTableColumns(() =>
     createDeptTableColumns({
+      t,
       handleEdit: handleEdit,
       handleDelete: handleDelete
     })
@@ -111,7 +114,7 @@
         fetchGetDeptTree(buildDeptSearchParams(searchForm)),
         [],
         {
-          timeoutMessage: '閮ㄩ棬鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+          timeoutMessage: t('pages.system.dept.messages.pageTimeout')
         }
       )
       const normalizedRows = normalizeDeptTreeRows(tree || [])
@@ -148,23 +151,30 @@
       deptTreeOptions.value = buildDeptTreeOptions(tableData.value, row.id)
       dialogVisible.value = true
     } catch (error) {
-      ElMessage.error(error?.message || '鑾峰彇閮ㄩ棬璇︽儏澶辫触')
+      ElMessage.error(error?.message || t('pages.system.dept.messages.detailFailed'))
     }
   }
 
   async function handleDelete(row) {
     try {
-      await ElMessageBox.confirm(`纭畾瑕佸垹闄ら儴闂ㄣ��${row.name || row.id}銆嶅悧锛焋, '鍒犻櫎纭', {
-        confirmButtonText: '纭畾',
-        cancelButtonText: '鍙栨秷',
-        type: 'warning'
-      })
+      await ElMessageBox.confirm(
+        t('crud.confirm.deleteMessage', {
+          entity: t('pages.system.dept.entity'),
+          label: row.name || row.id
+        }),
+        t('crud.confirm.deleteTitle'),
+        {
+          confirmButtonText: t('common.confirm'),
+          cancelButtonText: t('common.cancel'),
+          type: 'warning'
+        }
+      )
       await fetchDeleteDept(row.id)
-      ElMessage.success('鍒犻櫎鎴愬姛')
+      ElMessage.success(t('crud.messages.deleteSuccess'))
       await loadDeptTree()
     } catch (error) {
       if (error !== 'cancel') {
-        ElMessage.error(error?.message || '鍒犻櫎澶辫触')
+        ElMessage.error(error?.message || t('crud.messages.deleteFailed'))
       }
     }
   }
@@ -172,23 +182,23 @@
   async function handleDialogSubmit(formData) {
     const payload = buildDeptSavePayload(formData)
     if (payload.id && payload.id === payload.parentId) {
-      ElMessage.error('涓婄骇閮ㄩ棬涓嶈兘閫夋嫨褰撳墠閮ㄩ棬')
+      ElMessage.error(t('pages.system.dept.messages.parentSelfInvalid'))
       return
     }
 
     try {
       if (payload.id) {
         await fetchUpdateDept(payload)
-        ElMessage.success('淇敼鎴愬姛')
+        ElMessage.success(t('crud.messages.updateSuccess'))
       } else {
         await fetchSaveDept(payload)
-        ElMessage.success('鏂板鎴愬姛')
+        ElMessage.success(t('crud.messages.createSuccess'))
       }
       dialogVisible.value = false
       currentDeptData.value = buildDeptDialogModel()
       await loadDeptTree()
     } catch (error) {
-      ElMessage.error(error?.message || '鎻愪氦澶辫触')
+      ElMessage.error(error?.message || t('crud.messages.submitFailed'))
     }
   }
 
diff --git a/rsf-design/src/views/system/dept/modules/dept-dialog.vue b/rsf-design/src/views/system/dept/modules/dept-dialog.vue
index 650083b..3504d51 100644
--- a/rsf-design/src/views/system/dept/modules/dept-dialog.vue
+++ b/rsf-design/src/views/system/dept/modules/dept-dialog.vue
@@ -21,8 +21,8 @@
 
     <template #footer>
       <span class="dialog-footer">
-        <ElButton @click="handleCancel">鍙栨秷</ElButton>
-        <ElButton type="primary" @click="handleSubmit">纭畾</ElButton>
+        <ElButton @click="handleCancel">{{ t('common.cancel') }}</ElButton>
+        <ElButton type="primary" @click="handleSubmit">{{ t('common.confirm') }}</ElButton>
       </span>
     </template>
   </ElDialog>
@@ -30,6 +30,7 @@
 
 <script setup>
   import ArtForm from '@/components/core/forms/art-form/index.vue'
+  import { useI18n } from 'vue-i18n'
   import { buildDeptDialogModel, createDeptFormState } from '../deptPage.helpers'
 
   const props = defineProps({
@@ -39,19 +40,22 @@
   })
 
   const emit = defineEmits(['update:visible', 'submit'])
+  const { t } = useI18n()
   const formRef = ref()
   const form = reactive(createDeptFormState())
 
   const isEdit = computed(() => Boolean(form.id))
-  const dialogTitle = computed(() => (isEdit.value ? '缂栬緫閮ㄩ棬' : '鏂板閮ㄩ棬'))
+  const dialogTitle = computed(() =>
+    isEdit.value ? t('pages.system.dept.dialog.titleEdit') : t('pages.system.dept.dialog.titleCreate')
+  )
 
   const rules = computed(() => ({
-    name: [{ required: true, message: '璇疯緭鍏ラ儴闂ㄥ悕绉�', trigger: 'blur' }]
+    name: [{ required: true, message: t('pages.system.dept.validation.name'), trigger: 'blur' }]
   }))
 
   const formItems = computed(() => [
     {
-      label: '涓婄骇閮ㄩ棬',
+      label: t('pages.system.dept.table.parent'),
       key: 'parentId',
       type: 'treeselect',
       span: 24,
@@ -62,41 +66,41 @@
           value: 'value',
           children: 'children'
         },
-        placeholder: '璇烽�夋嫨涓婄骇閮ㄩ棬',
+        placeholder: t('pages.system.dept.placeholders.parentId'),
         clearable: false,
         checkStrictly: true,
         defaultExpandAll: true
       }
     },
     {
-      label: '閮ㄩ棬鍚嶇О',
+      label: t('pages.system.dept.table.name'),
       key: 'name',
       type: 'input',
       props: {
-        placeholder: '璇疯緭鍏ラ儴闂ㄥ悕绉�',
+        placeholder: t('pages.system.dept.placeholders.name'),
         clearable: true
       }
     },
     {
-      label: '閮ㄩ棬鍏ㄧО',
+      label: t('pages.system.dept.table.fullName'),
       key: 'fullName',
       type: 'input',
       props: {
-        placeholder: '璇疯緭鍏ラ儴闂ㄥ叏绉�',
+        placeholder: t('pages.system.dept.placeholders.fullName'),
         clearable: true
       }
     },
     {
-      label: '璐熻矗浜�',
+      label: t('pages.system.dept.table.leader'),
       key: 'leader',
       type: 'input',
       props: {
-        placeholder: '璇疯緭鍏ヨ礋璐d汉',
+        placeholder: t('pages.system.dept.placeholders.leader'),
         clearable: true
       }
     },
     {
-      label: '鎺掑簭',
+      label: t('table.sort'),
       key: 'sort',
       type: 'number',
       props: {
@@ -106,26 +110,26 @@
       }
     },
     {
-      label: '鐘舵��',
+      label: t('table.status'),
       key: 'status',
       type: 'select',
       props: {
-        placeholder: '璇烽�夋嫨鐘舵��',
+        placeholder: t('pages.system.dept.placeholders.status'),
         options: [
-          { label: '姝e父', value: 1 },
-          { label: '绂佺敤', value: 0 }
+          { label: t('common.status.normal'), value: 1 },
+          { label: t('common.status.disabled'), value: 0 }
         ]
       }
     },
     {
-      label: '澶囨敞',
+      label: t('table.memo'),
       key: 'memo',
       type: 'input',
       span: 24,
       props: {
         type: 'textarea',
         rows: 3,
-        placeholder: '璇疯緭鍏ュ娉�',
+        placeholder: t('pages.system.dept.placeholders.memo'),
         clearable: true
       }
     }
diff --git a/rsf-design/src/views/system/dict-type/dictTypePage.helpers.js b/rsf-design/src/views/system/dict-type/dictTypePage.helpers.js
index a141bdc..752260e 100644
--- a/rsf-design/src/views/system/dict-type/dictTypePage.helpers.js
+++ b/rsf-design/src/views/system/dict-type/dictTypePage.helpers.js
@@ -1,3 +1,5 @@
+import { $t } from '@/locales'
+
 export function createDictTypeSearchState() {
   return {
     condition: '',
@@ -25,10 +27,10 @@
   }
 }
 
-export function getDictTypeStatusMeta(status) {
+export function getDictTypeStatusMeta(status, t = $t) {
   return Number(status) === 1
-    ? { text: '姝e父', type: 'success', bool: true }
-    : { text: '鍐荤粨', type: 'danger', bool: false }
+    ? { text: t('common.status.normal'), type: 'success', bool: true }
+    : { text: t('common.status.frozen'), type: 'danger', bool: false }
 }
 
 export function buildDictTypeSearchParams(params = {}) {
@@ -73,8 +75,8 @@
   }
 }
 
-export function normalizeDictTypeListRow(record = {}) {
-  const statusMeta = getDictTypeStatusMeta(record.status)
+export function normalizeDictTypeListRow(record = {}, t = $t) {
+  const statusMeta = getDictTypeStatusMeta(record.status, t)
   return {
     ...record,
     code: record.code || '',
diff --git a/rsf-design/src/views/system/dict-type/dictTypeTable.columns.js b/rsf-design/src/views/system/dict-type/dictTypeTable.columns.js
index 5426adc..a0c5190 100644
--- a/rsf-design/src/views/system/dict-type/dictTypeTable.columns.js
+++ b/rsf-design/src/views/system/dict-type/dictTypeTable.columns.js
@@ -1,51 +1,53 @@
 import { h } from 'vue'
 import { ElTag } from 'element-plus'
 import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
+import { $t } from '@/locales'
 
-export function createDictTypeTableColumns({ handleView, handleEdit, handleDelete }) {
+export function createDictTypeTableColumns({ handleView, handleEdit, handleDelete, t = $t }) {
   return [
     {
       prop: 'code',
-      label: '缂栫爜',
+      label: t('table.code'),
       minWidth: 180,
       showOverflowTooltip: true
     },
     {
       prop: 'name',
-      label: '鍚嶇О',
+      label: t('table.name'),
       minWidth: 180,
       showOverflowTooltip: true
     },
     {
       prop: 'description',
-      label: '鎻忚堪',
+      label: t('pages.system.dictType.table.description'),
       minWidth: 220,
       showOverflowTooltip: true,
-      formatter: (row) => row.description || '-'
+      formatter: (row) => row.description || t('common.placeholder.empty')
     },
     {
       prop: 'status',
-      label: '鐘舵��',
+      label: t('table.status'),
       width: 100,
-      formatter: (row) => h(ElTag, { type: row.statusType, effect: 'light' }, () => row.statusText || '-')
+      formatter: (row) =>
+        h(ElTag, { type: row.statusType, effect: 'light' }, () => row.statusText || t('common.placeholder.empty'))
     },
     {
       prop: 'updateByLabel',
-      label: '鏇存柊浜�',
+      label: t('table.updateBy'),
       width: 120,
-      formatter: (row) => row.updateByLabel || '-'
+      formatter: (row) => row.updateByLabel || t('common.placeholder.empty')
     },
     {
       prop: 'updateTimeText',
-      label: '鏇存柊鏃堕棿',
+      label: t('table.updateTime'),
       minWidth: 180,
-      formatter: (row) => row.updateTimeText || '-'
+      formatter: (row) => row.updateTimeText || t('common.placeholder.empty')
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: t('table.operation'),
       width: handleDelete ? 160 : 120,
-      align: 'right',
+      align: 'center',
       formatter: (row) => {
         const buttons = [
           h(ArtButtonTable, {
@@ -67,7 +69,7 @@
           )
         }
 
-        return h('div', { class: 'flex justify-end' }, buttons)
+        return h('div', { class: 'flex justify-center' }, buttons)
       }
     }
   ]
diff --git a/rsf-design/src/views/system/dict-type/index.vue b/rsf-design/src/views/system/dict-type/index.vue
index b346aad..cdba2f6 100644
--- a/rsf-design/src/views/system/dict-type/index.vue
+++ b/rsf-design/src/views/system/dict-type/index.vue
@@ -12,7 +12,7 @@
       <ArtTableHeader v-model:columns="columnChecks" :loading="loading" @refresh="refreshData">
         <template #left>
           <ElSpace wrap>
-            <ElButton v-auth="'add'" @click="showDialog('add')" v-ripple>鏂板鏁版嵁瀛楀吀</ElButton>
+            <ElButton v-auth="'add'" @click="showDialog('add')" v-ripple>{{ t('pages.system.dictType.buttons.add') }}</ElButton>
             <ElButton
               v-auth="'delete'"
               type="danger"
@@ -20,7 +20,7 @@
               @click="handleBatchDelete"
               v-ripple
             >
-              鎵归噺鍒犻櫎
+              {{ t('common.actions.batchDelete') }}
             </ElButton>
           </ElSpace>
         </template>
@@ -52,6 +52,7 @@
 </template>
 
 <script setup>
+  import { useI18n } from 'vue-i18n'
   import { ElMessage } from 'element-plus'
   import { useAuth } from '@/hooks/core/useAuth'
   import { useTable } from '@/hooks/core/useTable'
@@ -78,6 +79,7 @@
 
   defineOptions({ name: 'DictType' })
 
+  const { t } = useI18n()
   const { hasAuth } = useAuth()
   const searchForm = ref(createDictTypeSearchState())
   const detailDrawerVisible = ref(false)
@@ -87,41 +89,41 @@
 
   const searchItems = computed(() => [
     {
-      label: '鍏抽敭瀛�',
+      label: t('table.keyword'),
       key: 'condition',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ョ紪鐮佹垨鍚嶇О'
+        placeholder: t('pages.system.dictType.search.conditionPlaceholder')
       }
     },
     {
-      label: '缂栫爜',
+      label: t('table.code'),
       key: 'code',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ュ瓧鍏哥紪鐮�'
+        placeholder: t('pages.system.dictType.search.codePlaceholder')
       }
     },
     {
-      label: '鍚嶇О',
+      label: t('table.name'),
       key: 'name',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ュ瓧鍏稿悕绉�'
+        placeholder: t('pages.system.dictType.search.namePlaceholder')
       }
     },
     {
-      label: '鐘舵��',
+      label: t('table.status'),
       key: 'status',
       type: 'select',
       props: {
         clearable: true,
         options: [
-          { label: '姝e父', value: 1 },
-          { label: '鍐荤粨', value: 0 }
+          { label: t('common.status.normal'), value: 1 },
+          { label: t('common.status.frozen'), value: 0 }
         ]
       }
     }
@@ -131,11 +133,11 @@
     detailDrawerVisible.value = true
     detailLoading.value = true
     try {
-      detailData.value = normalizeDictTypeListRow(await fetchGetDictTypeDetail(row.id))
+      detailData.value = normalizeDictTypeListRow(await fetchGetDictTypeDetail(row.id), t)
     } catch (error) {
       detailDrawerVisible.value = false
       detailData.value = {}
-      ElMessage.error(error?.message || '鑾峰彇鏁版嵁瀛楀吀璇︽儏澶辫触')
+      ElMessage.error(error?.message || t('pages.system.dictType.messages.detailFailed'))
     } finally {
       detailLoading.value = false
     }
@@ -147,7 +149,7 @@
       dialogVisible.value = true
       dialogType.value = 'edit'
     } catch (error) {
-      ElMessage.error(error?.message || '鑾峰彇鏁版嵁瀛楀吀璇︽儏澶辫触')
+      ElMessage.error(error?.message || t('pages.system.dictType.messages.detailFailed'))
     }
   }
 
@@ -175,7 +177,8 @@
         createDictTypeTableColumns({
           handleView: openDetail,
           handleEdit: openEditDialog,
-          handleDelete: hasAuth('delete') ? (row) => handleDeleteAction?.(row) : null
+          handleDelete: hasAuth('delete') ? (row) => handleDeleteAction?.(row) : null,
+          t
         })
     },
     transform: {
@@ -183,7 +186,7 @@
         if (!Array.isArray(records)) {
           return []
         }
-        return records.map((item) => normalizeDictTypeListRow(item))
+        return records.map((item) => normalizeDictTypeListRow(item, t))
       }
     }
   })
@@ -205,7 +208,7 @@
     saveRequest: fetchSaveDictType,
     updateRequest: fetchUpdateDictType,
     deleteRequest: fetchDeleteDictType,
-    entityName: '鏁版嵁瀛楀吀',
+    entityName: t('pages.system.dictType.entity'),
     resolveRecordLabel: (record) => record?.name || record?.code || record?.id,
     refreshCreate,
     refreshUpdate,
diff --git a/rsf-design/src/views/system/dict-type/modules/dict-type-detail-drawer.vue b/rsf-design/src/views/system/dict-type/modules/dict-type-detail-drawer.vue
index 9863bb3..06f6f09 100644
--- a/rsf-design/src/views/system/dict-type/modules/dict-type-detail-drawer.vue
+++ b/rsf-design/src/views/system/dict-type/modules/dict-type-detail-drawer.vue
@@ -1,29 +1,30 @@
 <template>
   <ElDrawer
     :model-value="visible"
-    title="鏁版嵁瀛楀吀璇︽儏"
+    :title="t('pages.system.dictType.dialog.titleDetail')"
     size="560px"
     @update:model-value="handleVisibleChange"
   >
     <ElSkeleton :loading="loading" animated :rows="10">
       <ElDescriptions :column="1" border>
-        <ElDescriptionsItem label="缂栫爜">{{ displayData.code || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鍚嶇О">{{ displayData.name || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鎻忚堪">{{ displayData.description || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鐘舵��">
-          <ElTag :type="displayData.statusType" effect="light">{{ displayData.statusText || '--' }}</ElTag>
+        <ElDescriptionsItem :label="t('table.code')">{{ displayData.code || t('common.placeholder.empty') }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('table.name')">{{ displayData.name || t('common.placeholder.empty') }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.system.dictType.table.description')">{{ displayData.description || t('common.placeholder.empty') }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('table.status')">
+          <ElTag :type="displayData.statusType" effect="light">{{ displayData.statusText || t('common.placeholder.empty') }}</ElTag>
         </ElDescriptionsItem>
-        <ElDescriptionsItem label="鏇存柊浜�">{{ displayData.updateByLabel || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鏇存柊鏃堕棿">{{ displayData.updateTimeText || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鍒涘缓浜�">{{ displayData.createByLabel || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鍒涘缓鏃堕棿">{{ displayData.createTimeText || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="澶囨敞">{{ displayData.memo || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('table.updateBy')">{{ displayData.updateByLabel || t('common.placeholder.empty') }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('table.updateTime')">{{ displayData.updateTimeText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('table.createBy')">{{ displayData.createByLabel || t('common.placeholder.empty') }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('table.createTime')">{{ displayData.createTimeText || t('common.placeholder.empty') }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('table.memo')">{{ displayData.memo || t('common.placeholder.empty') }}</ElDescriptionsItem>
       </ElDescriptions>
     </ElSkeleton>
   </ElDrawer>
 </template>
 
 <script setup>
+  import { useI18n } from 'vue-i18n'
   import { normalizeDictTypeListRow } from '../dictTypePage.helpers'
 
   const props = defineProps({
@@ -33,7 +34,8 @@
   })
 
   const emit = defineEmits(['update:visible'])
-  const displayData = computed(() => normalizeDictTypeListRow(props.detailData))
+  const { t } = useI18n()
+  const displayData = computed(() => normalizeDictTypeListRow(props.detailData, t))
 
   function handleVisibleChange(visible) {
     emit('update:visible', visible)
diff --git a/rsf-design/src/views/system/dict-type/modules/dict-type-dialog.vue b/rsf-design/src/views/system/dict-type/modules/dict-type-dialog.vue
index 22abb74..178ddc0 100644
--- a/rsf-design/src/views/system/dict-type/modules/dict-type-dialog.vue
+++ b/rsf-design/src/views/system/dict-type/modules/dict-type-dialog.vue
@@ -21,14 +21,15 @@
 
     <template #footer>
       <span class="dialog-footer">
-        <ElButton @click="handleCancel">鍙栨秷</ElButton>
-        <ElButton type="primary" @click="handleSubmit">纭畾</ElButton>
+        <ElButton @click="handleCancel">{{ t('common.cancel') }}</ElButton>
+        <ElButton type="primary" @click="handleSubmit">{{ t('common.confirm') }}</ElButton>
       </span>
     </template>
   </ElDialog>
 </template>
 
 <script setup>
+  import { useI18n } from 'vue-i18n'
   import ArtForm from '@/components/core/forms/art-form/index.vue'
   import { buildDictTypeDialogModel, createDictTypeFormState } from '../dictTypePage.helpers'
 
@@ -40,66 +41,69 @@
   const emit = defineEmits(['update:visible', 'submit'])
   const formRef = ref()
   const form = reactive(createDictTypeFormState())
+  const { t } = useI18n()
 
   const isEdit = computed(() => Boolean(form.id))
-  const dialogTitle = computed(() => (isEdit.value ? '缂栬緫鏁版嵁瀛楀吀' : '鏂板鏁版嵁瀛楀吀'))
+  const dialogTitle = computed(() =>
+    isEdit.value ? t('pages.system.dictType.dialog.titleEdit') : t('pages.system.dictType.dialog.titleCreate')
+  )
 
   const rules = computed(() => ({
-    code: [{ required: true, message: '璇疯緭鍏ュ瓧鍏哥紪鐮�', trigger: 'blur' }],
-    name: [{ required: true, message: '璇疯緭鍏ュ瓧鍏稿悕绉�', trigger: 'blur' }]
+    code: [{ required: true, message: t('pages.system.dictType.validation.code'), trigger: 'blur' }],
+    name: [{ required: true, message: t('pages.system.dictType.validation.name'), trigger: 'blur' }]
   }))
 
   const formItems = computed(() => [
     {
-      label: '缂栫爜',
+      label: t('table.code'),
       key: 'code',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ュ瓧鍏哥紪鐮�'
+        placeholder: t('pages.system.dictType.placeholders.code')
       }
     },
     {
-      label: '鍚嶇О',
+      label: t('table.name'),
       key: 'name',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ュ瓧鍏稿悕绉�'
+        placeholder: t('pages.system.dictType.placeholders.name')
       }
     },
     {
-      label: '鐘舵��',
+      label: t('table.status'),
       key: 'status',
       type: 'select',
       props: {
         options: [
-          { label: '姝e父', value: 1 },
-          { label: '鍐荤粨', value: 0 }
+          { label: t('common.status.normal'), value: 1 },
+          { label: t('common.status.frozen'), value: 0 }
         ],
-        placeholder: '璇烽�夋嫨鐘舵��'
+        placeholder: t('pages.system.dictType.placeholders.status')
       }
     },
     {
-      label: '鎻忚堪',
+      label: t('pages.system.dictType.table.description'),
       key: 'description',
       type: 'input',
       span: 24,
       props: {
         type: 'textarea',
         rows: 3,
-        placeholder: '璇疯緭鍏ュ瓧鍏告弿杩�'
+        placeholder: t('pages.system.dictType.placeholders.description')
       }
     },
     {
-      label: '澶囨敞',
+      label: t('table.memo'),
       key: 'memo',
       type: 'input',
       span: 24,
       props: {
         type: 'textarea',
         rows: 3,
-        placeholder: '璇疯緭鍏ュ娉�'
+        placeholder: t('pages.system.dictType.placeholders.memo')
       }
     }
   ])
diff --git a/rsf-design/src/views/system/menu/index.vue b/rsf-design/src/views/system/menu/index.vue
index 3a06c1b..ea98983 100644
--- a/rsf-design/src/views/system/menu/index.vue
+++ b/rsf-design/src/views/system/menu/index.vue
@@ -116,7 +116,7 @@
         return
       }
       tableData.value = Array.isArray(list) ? list : []
-      menuTreeOptions.value = buildMenuTreeOptions(tableData.value, formatMenuTitle)
+      menuTreeOptions.value = buildMenuTreeOptions(tableData.value, formatMenuTitle, t)
     } catch (error) {
       ElMessage.error(error?.message || t('pages.system.menu.messages.loadFailed'))
     } finally {
@@ -130,6 +130,7 @@
 
   const { columnChecks, columns } = useTableColumns(() =>
     createMenuTableColumns({
+      t,
       titleFormatter: formatMenuTitle,
       handleAddAuth,
       handleEditAuth,
diff --git a/rsf-design/src/views/system/menu/menuPage.helpers.js b/rsf-design/src/views/system/menu/menuPage.helpers.js
index 642991e..03d60e3 100644
--- a/rsf-design/src/views/system/menu/menuPage.helpers.js
+++ b/rsf-design/src/views/system/menu/menuPage.helpers.js
@@ -45,16 +45,16 @@
   return 'primary'
 }
 
-export function getMenuTypeText(row = {}) {
-  if (row.meta?.isAuthButton || Number(row.type) === 1) return $t('pages.system.menu.types.button')
-  if (hasNestedMenus(row)) return $t('pages.system.menu.types.directory')
-  return $t('pages.system.menu.types.menu')
+export function getMenuTypeText(row = {}, t = $t) {
+  if (row.meta?.isAuthButton || Number(row.type) === 1) return t('pages.system.menu.types.button')
+  if (hasNestedMenus(row)) return t('pages.system.menu.types.directory')
+  return t('pages.system.menu.types.menu')
 }
 
-export function getMenuStatusMeta(status) {
+export function getMenuStatusMeta(status, t = $t) {
   return normalizeMenuNumber(status, 1) === 1
-    ? { text: $t('common.status.enabled'), type: 'success' }
-    : { text: $t('common.status.disabled'), type: 'danger' }
+    ? { text: t('common.status.enabled'), type: 'success' }
+    : { text: t('common.status.disabled'), type: 'danger' }
 }
 
 export function normalizeMenuTreeOptions(nodes = [], titleFormatter = defaultMenuTitleFormatter) {
@@ -69,10 +69,10 @@
   }))
 }
 
-export function buildMenuTreeOptions(tree = [], titleFormatter = defaultMenuTitleFormatter) {
+export function buildMenuTreeOptions(tree = [], titleFormatter = defaultMenuTitleFormatter, t = $t) {
   return [
     {
-      label: $t('table.topLevelMenu'),
+      label: t('table.topLevelMenu'),
       value: 0,
       children: normalizeMenuTreeOptions(tree, titleFormatter)
     }
diff --git a/rsf-design/src/views/system/menu/menuTable.columns.js b/rsf-design/src/views/system/menu/menuTable.columns.js
index 74ee2bc..e038694 100644
--- a/rsf-design/src/views/system/menu/menuTable.columns.js
+++ b/rsf-design/src/views/system/menu/menuTable.columns.js
@@ -17,18 +17,19 @@
   handleEditAuth,
   handleDeleteAuth,
   handleEditMenu,
-  handleDeleteMenu
+  handleDeleteMenu,
+  t = $t
 }) {
   return [
     {
       prop: 'meta.title',
-      label: $t('pages.system.menu.search.name'),
+      label: t('pages.system.menu.search.name'),
       minWidth: 180,
       formatter: (row) => getMenuDisplayTitle(row, titleFormatter)
     },
     {
       prop: 'meta.icon',
-      label: $t('table.iconPreview'),
+      label: t('table.iconPreview'),
       width: 96,
       align: 'center',
       formatter: (row) => {
@@ -48,14 +49,14 @@
     },
     {
       prop: 'type',
-      label: $t('table.menuType'),
+      label: t('table.menuType'),
       width: 110,
       formatter: (row) =>
-        h(ElTag, { type: getMenuTypeTag(row), effect: 'light' }, () => getMenuTypeText(row))
+        h(ElTag, { type: getMenuTypeTag(row), effect: 'light' }, () => getMenuTypeText(row, t))
     },
     {
       prop: 'route',
-      label: $t('pages.system.menu.search.route'),
+      label: t('pages.system.menu.search.route'),
       minWidth: 180,
       formatter: (row) => {
         if (row.meta?.isAuthButton) return ''
@@ -64,7 +65,7 @@
     },
     {
       prop: 'component',
-      label: $t('table.componentKey'),
+      label: t('table.componentKey'),
       minWidth: 160,
       showOverflowTooltip: true,
       formatter: (row) => {
@@ -74,48 +75,48 @@
     },
     {
       prop: 'authority',
-      label: $t('table.permissionKey'),
+      label: t('table.permissionKey'),
       minWidth: 180,
       formatter: (row) => {
         if (row.meta?.isAuthButton) {
           return row.authority || row.meta?.authMark || ''
         }
         if (!row.meta?.authList?.length) return row.authority || ''
-        return $t('pages.system.menu.messages.authCount', {
+        return t('pages.system.menu.messages.authCount', {
           count: row.meta.authList.length
         })
       }
     },
     {
       prop: 'sort',
-      label: $t('table.sort'),
+      label: t('table.sort'),
       width: 90
     },
     {
       prop: 'id',
-      label: $t('table.id'),
+      label: t('table.id'),
       width: 96,
       align: 'center'
     },
     {
       prop: 'status',
-      label: $t('table.status'),
+      label: t('table.status'),
       width: 100,
       formatter: (row) => {
-        const statusMeta = getMenuStatusMeta(row.status)
+        const statusMeta = getMenuStatusMeta(row.status, t)
         return h(ElTag, { type: statusMeta.type, effect: 'light' }, () => statusMeta.text)
       }
     },
     {
       prop: 'memo',
-      label: $t('table.remark'),
+      label: t('table.remark'),
       minWidth: 180,
       showOverflowTooltip: true,
       formatter: (row) => row.memo || '-'
     },
     {
       prop: 'operation',
-      label: $t('table.operation'),
+      label: t('table.operation'),
       width: 180,
       align: 'center',
       formatter: (row) => {
@@ -136,7 +137,7 @@
           h(ArtButtonTable, {
             type: 'add',
             onClick: () => handleAddAuth(row),
-            title: $t('pages.system.menu.actions.addAuth')
+            title: t('pages.system.menu.actions.addAuth')
           }),
           h(ArtButtonTable, {
             type: 'edit',
diff --git a/rsf-design/src/views/system/operation-record/index.vue b/rsf-design/src/views/system/operation-record/index.vue
index b8005c6..5103f6b 100644
--- a/rsf-design/src/views/system/operation-record/index.vue
+++ b/rsf-design/src/views/system/operation-record/index.vue
@@ -52,6 +52,7 @@
 </template>
 
 <script setup>
+  import { useI18n } from 'vue-i18n'
   import { ElMessage, ElMessageBox } from 'element-plus'
   import { useUserStore } from '@/store/modules/user'
   import { useAuth } from '@/hooks/core/useAuth'
@@ -73,15 +74,16 @@
     createOperationRecordSearchState,
     getOperationRecordPaginationKey,
     getOperationRecordReportColumns,
+    getOperationRecordReportTitle,
     mergeOperationRecordDetail,
-    normalizeOperationRecordRow,
-    OPERATION_RECORD_REPORT_TITLE
+    normalizeOperationRecordRow
   } from './operationRecordPage.helpers'
   import { createOperationRecordTableColumns } from './operationRecordTable.columns'
   import OperationRecordDetailDrawer from './modules/operation-record-detail-drawer.vue'
 
   defineOptions({ name: 'OperationRecord' })
 
+  const { t } = useI18n()
   const userStore = useUserStore()
   const { hasAuth } = useAuth()
 
@@ -90,52 +92,52 @@
   const detailLoading = ref(false)
   const detailData = ref({})
   const selectedRows = ref([])
-  const reportTitle = OPERATION_RECORD_REPORT_TITLE
+  const reportTitle = computed(() => getOperationRecordReportTitle(t))
   const reportQueryParams = computed(() => buildOperationRecordSearchParams(searchForm.value))
-  const reportColumns = getOperationRecordReportColumns()
+  const reportColumns = computed(() => getOperationRecordReportColumns(t))
 
   const searchItems = computed(() => [
     {
-      label: '鍏抽敭瀛�',
+      label: t('table.keyword'),
       key: 'condition',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ュ悕绉扮┖闂�'
+        placeholder: t('pages.system.operationRecord.search.conditionPlaceholder')
       }
     },
     {
-      label: '鎺ュ彛鍦板潃',
+      label: t('pages.system.operationRecord.table.url'),
       key: 'url',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ユ帴鍙e湴鍧�'
+        placeholder: t('pages.system.operationRecord.search.urlPlaceholder')
       }
     },
     {
-      label: '瀹㈡埛绔疘P',
+      label: t('pages.system.operationRecord.table.clientIp'),
       key: 'clientIp',
       type: 'input',
       props: {
         clearable: true,
-        placeholder: '璇疯緭鍏ュ鎴风IP'
+        placeholder: t('pages.system.operationRecord.search.clientIpPlaceholder')
       }
     },
     {
-      label: '缁撴灉',
+      label: t('pages.system.operationRecord.table.result'),
       key: 'result',
       type: 'select',
       props: {
         clearable: true,
         options: [
-          { label: '鎴愬姛', value: 1 },
-          { label: '澶辫触', value: 0 }
+          { label: t('pages.system.operationRecord.result.success'), value: 1 },
+          { label: t('pages.system.operationRecord.result.failed'), value: 0 }
         ]
       }
     },
     {
-      label: '寮�濮嬫棩鏈�',
+      label: t('pages.system.operationRecord.search.timeStart'),
       key: 'timeStart',
       type: 'date',
       props: {
@@ -145,7 +147,7 @@
       }
     },
     {
-      label: '缁撴潫鏃ユ湡',
+      label: t('pages.system.operationRecord.search.timeEnd'),
       key: 'timeEnd',
       type: 'date',
       props: {
@@ -163,17 +165,24 @@
 
   async function handleDelete(row) {
     try {
-      await ElMessageBox.confirm(`纭畾瑕佸垹闄ゆ搷浣滄棩蹇椼��${row.namespace || row.id}銆嶅悧锛焋, '鍒犻櫎纭', {
-        confirmButtonText: '纭畾',
-        cancelButtonText: '鍙栨秷',
-        type: 'warning'
-      })
+      await ElMessageBox.confirm(
+        t('crud.confirm.deleteMessage', {
+          entity: t('pages.system.operationRecord.entity'),
+          label: row.namespace || row.id
+        }),
+        t('crud.confirm.deleteTitle'),
+        {
+          confirmButtonText: t('common.confirm'),
+          cancelButtonText: t('common.cancel'),
+          type: 'warning'
+        }
+      )
       await fetchDeleteOperationRecord(row.id)
-      ElMessage.success('鍒犻櫎鎴愬姛')
+      ElMessage.success(t('crud.messages.deleteSuccess'))
       await refreshRemove()
     } catch (error) {
       if (error !== 'cancel') {
-        ElMessage.error(error?.message || '鍒犻櫎澶辫触')
+        ElMessage.error(error?.message || t('crud.messages.deleteFailed'))
       }
     }
   }
@@ -198,6 +207,7 @@
       paginationKey: getOperationRecordPaginationKey(),
       columnsFactory: () =>
         createOperationRecordTableColumns({
+          t,
           handleView: openDetail,
           handleDelete: hasAuth('delete') ? handleDelete : null
         })
@@ -243,7 +253,7 @@
     resolvePrintRecords,
     buildPreviewRows: (records) => buildOperationRecordPrintRows(records),
     buildPreviewMeta: (rows) => ({
-      reportTitle,
+      reportTitle: reportTitle.value,
       reportDate: new Date().toLocaleDateString('zh-CN'),
       printedAt: new Date().toLocaleString('zh-CN', { hour12: false }),
       operator: userStore.getUserInfo?.name || userStore.getUserInfo?.username || '',
@@ -259,7 +269,7 @@
     } catch (error) {
       detailDrawerVisible.value = false
       detailData.value = {}
-      ElMessage.error(error?.message || '鑾峰彇鎿嶄綔鏃ュ織璇︽儏澶辫触')
+      ElMessage.error(error?.message || t('pages.system.operationRecord.messages.detailFailed'))
     } finally {
       detailLoading.value = false
     }
diff --git a/rsf-design/src/views/system/operation-record/modules/operation-record-detail-drawer.vue b/rsf-design/src/views/system/operation-record/modules/operation-record-detail-drawer.vue
index 98ab2c1..1f1d29b 100644
--- a/rsf-design/src/views/system/operation-record/modules/operation-record-detail-drawer.vue
+++ b/rsf-design/src/views/system/operation-record/modules/operation-record-detail-drawer.vue
@@ -1,40 +1,43 @@
 <template>
   <ElDrawer
     :model-value="visible"
-    title="鎿嶄綔鏃ュ織璇︽儏"
+    :title="t('pages.system.operationRecord.dialog.titleDetail')"
     size="640px"
     @update:model-value="handleVisibleChange"
   >
     <ElSkeleton :loading="loading" animated :rows="12">
       <ElDescriptions :column="1" border>
-        <ElDescriptionsItem label="鍚嶇О绌洪棿">{{ displayData.namespace || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鎺ュ彛鍦板潃">{{ displayData.url || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="骞冲彴瀵嗛挜">{{ displayData.appkey || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鎿嶄綔鐢ㄦ埛">{{ displayData.userLabel || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="瀹㈡埛绔疘P">{{ displayData.clientIp || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="缁撴灉">
-          <ElTag :type="displayData.resultType" effect="light">{{ displayData.resultText || '--' }}</ElTag>
+        <ElDescriptionsItem :label="t('pages.system.operationRecord.table.namespace')">{{ displayData.namespace || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.system.operationRecord.table.url')">{{ displayData.url || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.system.operationRecord.detail.appkey')">{{ displayData.appkey || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.system.operationRecord.table.user')">{{ displayData.userLabel || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.system.operationRecord.table.clientIp')">{{ displayData.clientIp || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.system.operationRecord.table.result')">
+          <ElTag :type="displayData.resultType" effect="light">
+            {{ displayData.resultTextKey ? t(displayData.resultTextKey) : displayData.resultText || '--' }}
+          </ElTag>
         </ElDescriptionsItem>
-        <ElDescriptionsItem label="鑰楁椂(ms)">{{ displayData.spendTime ?? '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="鎿嶄綔鏃堕棿">{{ displayData.timestampText || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="寮傚父淇℃伅">{{ displayData.err || '--' }}</ElDescriptionsItem>
-        <ElDescriptionsItem label="璇锋眰鍐呭">
+        <ElDescriptionsItem :label="t('pages.system.operationRecord.table.spendTime')">{{ displayData.spendTime ?? '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.system.operationRecord.table.timestamp')">{{ displayData.timestampText || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.system.operationRecord.detail.error')">{{ displayData.err || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('pages.system.operationRecord.detail.request')">
           <pre class="whitespace-pre-wrap break-all rounded-lg bg-[var(--art-main-bg-color)] p-3 text-xs leading-6 text-g-700">{{
             displayData.request || '--'
           }}</pre>
         </ElDescriptionsItem>
-        <ElDescriptionsItem label="鍝嶅簲鍐呭">
+        <ElDescriptionsItem :label="t('pages.system.operationRecord.detail.response')">
           <pre class="whitespace-pre-wrap break-all rounded-lg bg-[var(--art-main-bg-color)] p-3 text-xs leading-6 text-g-700">{{
             displayData.response || '--'
           }}</pre>
         </ElDescriptionsItem>
-        <ElDescriptionsItem label="澶囨敞">{{ displayData.memo || '--' }}</ElDescriptionsItem>
+        <ElDescriptionsItem :label="t('table.remark')">{{ displayData.memo || '--' }}</ElDescriptionsItem>
       </ElDescriptions>
     </ElSkeleton>
   </ElDrawer>
 </template>
 
 <script setup>
+  import { useI18n } from 'vue-i18n'
   import { mergeOperationRecordDetail } from '../operationRecordPage.helpers'
 
   const props = defineProps({
@@ -44,6 +47,7 @@
   })
 
   const emit = defineEmits(['update:visible'])
+  const { t } = useI18n()
 
   const displayData = computed(() => mergeOperationRecordDetail(props.detailData))
 
diff --git a/rsf-design/src/views/system/operation-record/operationRecordPage.helpers.js b/rsf-design/src/views/system/operation-record/operationRecordPage.helpers.js
index fb55e27..b891ab2 100644
--- a/rsf-design/src/views/system/operation-record/operationRecordPage.helpers.js
+++ b/rsf-design/src/views/system/operation-record/operationRecordPage.helpers.js
@@ -1,9 +1,11 @@
 const OPERATION_RESULT_META = {
-  1: { text: '鎴愬姛', type: 'success' },
-  0: { text: '澶辫触', type: 'danger' }
+  1: { textKey: 'pages.system.operationRecord.result.success', fallback: 'Success', type: 'success' },
+  0: { textKey: 'pages.system.operationRecord.result.failed', fallback: 'Failed', type: 'danger' }
 }
 
-export const OPERATION_RECORD_REPORT_TITLE = '鎿嶄綔鏃ュ織鎶ヨ〃'
+export function getOperationRecordReportTitle(t) {
+  return typeof t === 'function' ? t('pages.system.operationRecord.reportTitle') : 'Operation Record Report'
+}
 
 export function createOperationRecordSearchState() {
   return {
@@ -47,7 +49,13 @@
 }
 
 export function getOperationResultMeta(value) {
-  return OPERATION_RESULT_META[Number(value)] || { text: '-', type: 'info' }
+  return (
+    OPERATION_RESULT_META[Number(value)] || {
+      textKey: 'common.placeholder.empty',
+      fallback: '--',
+      type: 'info'
+    }
+  )
 }
 
 export function formatOperationTimestamp(value) {
@@ -83,7 +91,8 @@
     userLabel: record['userId$'] || record.userLabel || (record.userId ? String(record.userId) : ''),
     timestampText: formatOperationTimestamp(record.timestamp),
     createTimeText: record['createTime$'] || record.createTime || '',
-    resultText: resultMeta.text,
+    resultTextKey: resultMeta.textKey,
+    resultText: resultMeta.fallback,
     resultType: resultMeta.type
   }
 }
@@ -95,15 +104,15 @@
   })
 }
 
-export function getOperationRecordReportColumns() {
+export function getOperationRecordReportColumns(t) {
   return [
-    { prop: 'namespace', label: '鍚嶇О绌洪棿' },
-    { prop: 'url', label: '鎺ュ彛鍦板潃' },
-    { prop: 'userLabel', label: '鎿嶄綔鐢ㄦ埛' },
-    { prop: 'clientIp', label: '瀹㈡埛绔疘P' },
-    { prop: 'spendTimeText', label: '鑰楁椂(ms)' },
-    { prop: 'resultText', label: '缁撴灉' },
-    { prop: 'timestampText', label: '鎿嶄綔鏃堕棿' }
+    { prop: 'namespace', label: typeof t === 'function' ? t('pages.system.operationRecord.table.namespace') : 'Namespace' },
+    { prop: 'url', label: typeof t === 'function' ? t('pages.system.operationRecord.table.url') : 'API URL' },
+    { prop: 'userLabel', label: typeof t === 'function' ? t('pages.system.operationRecord.table.user') : 'User' },
+    { prop: 'clientIp', label: typeof t === 'function' ? t('pages.system.operationRecord.table.clientIp') : 'Client IP' },
+    { prop: 'spendTimeText', label: typeof t === 'function' ? t('pages.system.operationRecord.table.spendTime') : 'Latency (ms)' },
+    { prop: 'resultText', label: typeof t === 'function' ? t('pages.system.operationRecord.table.result') : 'Result' },
+    { prop: 'timestampText', label: typeof t === 'function' ? t('pages.system.operationRecord.table.timestamp') : 'Operation Time' }
   ]
 }
 
diff --git a/rsf-design/src/views/system/operation-record/operationRecordTable.columns.js b/rsf-design/src/views/system/operation-record/operationRecordTable.columns.js
index 24f270f..1e7799a 100644
--- a/rsf-design/src/views/system/operation-record/operationRecordTable.columns.js
+++ b/rsf-design/src/views/system/operation-record/operationRecordTable.columns.js
@@ -2,56 +2,59 @@
 import { ElTag } from 'element-plus'
 import ArtButtonTable from '@/components/core/forms/art-button-table/index.vue'
 
-export function createOperationRecordTableColumns({ handleView, handleDelete }) {
+export function createOperationRecordTableColumns({ t, handleView, handleDelete }) {
   return [
     {
       prop: 'namespace',
-      label: '鍚嶇О绌洪棿',
+      label: t('pages.system.operationRecord.table.namespace'),
       minWidth: 180,
       showOverflowTooltip: true
     },
     {
       prop: 'url',
-      label: '鎺ュ彛鍦板潃',
+      label: t('pages.system.operationRecord.table.url'),
       minWidth: 240,
       showOverflowTooltip: true,
       formatter: (row) => row.url || '-'
     },
     {
       prop: 'userLabel',
-      label: '鎿嶄綔鐢ㄦ埛',
+      label: t('pages.system.operationRecord.table.user'),
       minWidth: 140,
       formatter: (row) => row.userLabel || '-'
     },
     {
       prop: 'clientIp',
-      label: '瀹㈡埛绔疘P',
+      label: t('pages.system.operationRecord.table.clientIp'),
       minWidth: 140,
       formatter: (row) => row.clientIp || '-'
     },
     {
       prop: 'spendTime',
-      label: '鑰楁椂(ms)',
+      label: t('pages.system.operationRecord.table.spendTime'),
       width: 110,
       formatter: (row) => row.spendTime ?? '-'
     },
     {
       prop: 'result',
-      label: '缁撴灉',
+      label: t('pages.system.operationRecord.table.result'),
       width: 100,
-      formatter: (row) => h(ElTag, { type: row.resultType, effect: 'light' }, () => row.resultText || '-')
+      formatter: (row) =>
+        h(ElTag, { type: row.resultType, effect: 'light' }, () =>
+          row.resultTextKey ? t(row.resultTextKey) : row.resultText || '-'
+        )
     },
     {
       prop: 'timestampText',
-      label: '鎿嶄綔鏃堕棿',
+      label: t('pages.system.operationRecord.table.timestamp'),
       minWidth: 180,
       formatter: (row) => row.timestampText || '-'
     },
     {
       prop: 'operation',
-      label: '鎿嶄綔',
+      label: t('table.operation'),
       width: handleDelete ? 120 : 70,
-      align: 'right',
+      align: 'center',
       formatter: (row) => {
         const buttons = [
           h(ArtButtonTable, {
@@ -69,7 +72,7 @@
           )
         }
 
-        return h('div', { class: 'flex justify-end' }, buttons)
+        return h('div', { class: 'flex justify-center' }, buttons)
       }
     }
   ]
diff --git a/rsf-design/src/views/system/user-login/index.vue b/rsf-design/src/views/system/user-login/index.vue
index 140143d..f571cd8 100644
--- a/rsf-design/src/views/system/user-login/index.vue
+++ b/rsf-design/src/views/system/user-login/index.vue
@@ -27,15 +27,17 @@
   import { fetchGetUserLoginList } from '@/api/system-manage'
   import { useTable } from '@/hooks/core/useTable'
   import { ElTag } from 'element-plus'
+  import { useI18n } from 'vue-i18n'
   import { createUserLoginApiParams, userLoginPaginationKey } from './userLoginTable.config'
 
   defineOptions({ name: 'UserLogin' })
+  const { t } = useI18n()
 
   const LOGIN_TYPE_MAP = {
-    0: { label: '鐧诲綍鎴愬姛', type: 'success' },
-    1: { label: '鐧诲綍澶辫触', type: 'danger' },
-    2: { label: '閫�鍑虹櫥褰�', type: 'info' },
-    3: { label: 'token 缁', type: 'warning' }
+    0: { labelKey: 'pages.system.userLogin.types.loginSuccess', type: 'success' },
+    1: { labelKey: 'pages.system.userLogin.types.loginFailed', type: 'danger' },
+    2: { labelKey: 'pages.system.userLogin.types.logout', type: 'info' },
+    3: { labelKey: 'pages.system.userLogin.types.tokenRenew', type: 'warning' }
   }
 
   const initialSearchForm = {
@@ -49,41 +51,41 @@
 
   const searchItems = computed(() => [
     {
-      label: 'Token',
+      label: t('pages.system.userLogin.search.token'),
       key: 'token',
       type: 'input',
       props: {
-        placeholder: '璇疯緭鍏� token',
+        placeholder: t('pages.system.userLogin.search.tokenPlaceholder'),
         clearable: true
       }
     },
     {
-      label: 'IP',
+      label: t('pages.system.userLogin.search.ip'),
       key: 'ip',
       type: 'input',
       props: {
-        placeholder: '璇疯緭鍏� IP',
+        placeholder: t('pages.system.userLogin.search.ipPlaceholder'),
         clearable: true
       }
     },
     {
-      label: '绯荤粺',
+      label: t('pages.system.userLogin.search.system'),
       key: 'system',
       type: 'input',
       props: {
-        placeholder: '璇疯緭鍏ョ郴缁熸爣璇�',
+        placeholder: t('pages.system.userLogin.search.systemPlaceholder'),
         clearable: true
       }
     },
     {
-      label: '绫诲瀷',
+      label: t('pages.system.userLogin.search.type'),
       key: 'type',
       type: 'select',
       props: {
-        placeholder: '璇烽�夋嫨绫诲瀷',
+        placeholder: t('pages.system.userLogin.search.typePlaceholder'),
         clearable: true,
         options: Object.entries(LOGIN_TYPE_MAP).map(([value, item]) => ({
-          label: item.label,
+          label: t(item.labelKey),
           value: Number(value)
         }))
       }
@@ -93,7 +95,7 @@
   const getLoginTypeConfig = (type) => {
     return (
       LOGIN_TYPE_MAP[type] || {
-        label: type ?? '-',
+        label: type ?? t('common.placeholder.empty'),
         type: 'info'
       }
     )
@@ -121,32 +123,32 @@
       apiParams: createUserLoginApiParams(searchForm.value),
       paginationKey: userLoginPaginationKey,
       columnsFactory: () => [
-        { type: 'index', width: 60, label: '搴忓彿' },
-        { prop: 'id', label: 'ID', minWidth: 90 },
+        { type: 'index', width: 60, label: t('table.index') },
+        { prop: 'id', label: t('table.id'), minWidth: 90 },
         {
           prop: 'userDisplayName',
-          label: '鐢ㄦ埛',
+          label: t('pages.system.userLogin.table.user'),
           minWidth: 140,
           formatter: (row) => getUserDisplayName(row)
         },
-        { prop: 'token', label: 'Token', minWidth: 260, showOverflowTooltip: true },
-        { prop: 'ip', label: 'IP', minWidth: 140 },
+        { prop: 'token', label: t('pages.system.userLogin.table.token'), minWidth: 260, showOverflowTooltip: true },
+        { prop: 'ip', label: t('pages.system.userLogin.table.ip'), minWidth: 140 },
         {
           prop: 'type',
-          label: '绫诲瀷',
+          label: t('pages.system.userLogin.search.type'),
           width: 120,
           formatter: (row) => {
             const config = getLoginTypeConfig(row.type)
-            return h(ElTag, { type: config.type }, () => config.label)
+            return h(ElTag, { type: config.type }, () => config.labelKey ? t(config.labelKey) : config.label)
           }
         },
-        { prop: 'system', label: '绯荤粺', minWidth: 140 },
+        { prop: 'system', label: t('pages.system.userLogin.table.system'), minWidth: 140 },
         {
           prop: 'createTime',
-          label: '鍒涘缓鏃堕棿',
+          label: t('table.createTime'),
           minWidth: 180,
           sortable: true,
-          formatter: (row) => row.createTime$ || row.createTime || '-'
+          formatter: (row) => row.createTime$ || row.createTime || t('common.placeholder.empty')
         }
       ]
     }

--
Gitblit v1.9.1