name: dy-skill-i18n description: 處理前端國際化翻譯工作。當用戶提到需要做國際化、i18n、翻譯、多語言支援時使用此 skill。主要功能:1) 識別程式碼中的硬編碼靜態文字;2) 判斷是否應使用現有公共翻譯或需要新增;3) 將翻譯新增到對應的語言檔案中;4) 將硬編碼替換為國際化呼叫;5) 檢查翻譯完整性和正確性。
此 skill 用於處理前端專案的國際化翻譯工作。當你需要將程式碼中的硬編碼中文(或英文)文字轉換為國際化支援時使用。
前提:以實際專案結構為準,不破壞現有專案規則。
首先探索專案的國際化配置:
✅ 需要翻譯:
❌ 不需要翻譯:
根據專案實際結構判斷翻譯應該新增到哪裡:
lang/
├── common/ # 公共翻譯
│ ├── zh.ts
│ └── en.ts
├── module/ # 模組翻譯
│ ├── product/
│ ├── order/
│ └── ...
└── index.ts
決策規則:
common/lang/
├── zh_CN.ts
├── en_US.ts
└── index.ts
決策規則:
product.*, order.*, common.*根據專案實際結構靈活處理:
新增位置判斷:
IF 專案有 common/ 或類似的公共目錄 THEN
IF 翻譯是通用性質的 THEN
新增到公共目錄
ELSE
新增到對應模組目錄
ELSE
新增到主語言檔案中,使用模組字首區分
根據專案實際的呼叫方式替換。常見使用方式如下:
<!-- Template 中使用 $t -->
{{ $t("key.path") }}
<!-- 在 script 中使用 -->
<script setup>
const { t } = useI18n();
const text = t("key.path");
</script>
<!-- 屬性繫結 -->
<el-input :placeholder="t('key.path')" />
key 路徑在所有語言檔案中一致
正確性檢查:
頁面顯示正常
遺漏檢查:
通用性質 = 任何模組都可能用到
- 操作類:新增、編輯、刪除、檢視、匯入、匯出、提交、稽核
- 提示類:確定、取消、關閉,儲存、成功、失敗
- 佔位符類:請輸入、請選擇、開始日期、結束日期
- 表格類:序號、操作、狀態
模組特有 = 只有特定模組使用
- 產品名稱、產品編碼、產品分類
- 訂單號、訂單狀態
- 客戶名稱、客戶電話
直接新增到主語言檔案中,使用模組字首區分:
// zh_CN.ts
export default {
common: {
action: { add: "新增", edit: "編輯" },
},
product: {
name: "產品名稱",
code: "產品編碼",
},
order: {
no: "訂單號",
status: "訂單狀態",
},
};
如果業務確實需要獨立管理(如不同模組由不同人維護),可以在模組目錄中重複定義,但建議優先複用公共翻譯。
如果翻譯中需要動態引數(如使用者名稱、數量、時間等):
typescript
// zh_CN.ts
export default {
deleteSuccess: "刪除成功,共 {count} 條記錄",
welcome: "歡迎 {username} 登入系統",
selectedCount: "已選擇 {n} 項",
};
```vue
{{ $t("deleteSuccess", { count: deletedCount }) }}
```
{count} 或 %{count})如果專案使用 vue-i18n 的複數功能:
// zh_CN.ts(中文通常不需要複數變化,使用相同形式)
export default {
itemCount: "{n} 個專案 | {n} 個專案",
};
// en_US.ts
export default {
itemCount: "{n} item | {n} items",
};
使用方式:
{{ $t("itemCount", { n: count }, count) }}
vue-i18n 會根據 count 的值自動選擇單數或複數形式。
注意:如果專案沒有使用複數功能,將複數和單數分別定義為不同的 key,如 itemCount 和 itemCount_plural。
日期、數字、貨幣通常需要專門的格式化方法,不要使用簡單的翻譯:
如使用 dayjs, Intl.NumberFormat 等
如果確實需要翻譯日期格式:
typescript
// 僅翻譯格式說明文字,不翻譯實際日期
dateFormat: {
year: '年',
month: '月',
day: '日'
}
typescript
// 建議使用專門的格式化,不走翻譯
// 如:Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' })對於 Element Plus、Ant Design 等 UI 框架的元件:
empty-text, confirm-btn-text 等)<!-- Element Plus 示例 -->
<el-table :data="list" :empty-text="$t('common.table.empty')">
</el-table>
或讓後端支援國際化 key 返回
如果是業務性質的提示 - 可以翻譯:
typescript
// 錯誤碼對映
error: {
1001: '使用者名稱不存在',
1002: '密碼錯誤',
1003: '賬號已被鎖定'
}
專案中可能存在部分已國際化但風格不一致的程式碼:
對於 scoped slot 中的靜態文字:
<!-- 轉換前 -->
<template #default="{ row }">
<span>產品名稱:{{ row.name }}</span>
</template>
<!-- 轉換後 -->
<template #default="{ row }">
<span>{{ $t("product.name") }}:{{ row.name }}</span>
</template>
<script setup>
// useI18n 通常由專案自動匯入,無需手動 import
// 如專案無自動匯入,則需要:import { useI18n } from 'vue-i18n'
const { t } = useI18n();
// 在方法中使用
function handleClick() {
const message = t("common.message.success");
ElMessage.success(message);
}
// 在計算屬性中使用
const statusText = computed(() => {
return t(`product.status.${status.value}`);
});
</script>
謹慎使用 v-html:
<!-- 不推薦:可能有 XSS 風險 -->
<span v-html="$t('message.withHtml')"></span>
<!-- 推薦:分開處理 -->
<span>{{ $t('message.prefix') }}<a :href="url">{{ $t('message.link') }}</a></span>
如果必須使用 v-html,確保內容來自可信來源。
對於使用 render 函式或 JSX 的元件:
// 使用 this.$t(需要確保元件可訪問到 i18n 例項)
export default {
render() {
return h("span", this.$t("key.path"));
},
};
// 或者通過 provide/inject 傳遞翻譯函式
// 父元件
const { t } = useI18n();
provide("i18n", { t });
// 子元件
const { t } = inject("i18n");
return h("span", t("key.path"));
使用 keep-alive 快取的元件在切換語言後可能不會重新渲染:
<script setup>
import { watch } from "vue";
import { useI18n } from "vue-i18n";
const { locale } = useI18n();
// 監聽語言變化,強制重新整理
watch(locale, () => {
// 強制元件重新渲染
refreshData();
});
</script>
<keep-alive>
<component :is="component" :key="locale" />
</keep-alive>
非同步元件的翻譯需要在主應用或單獨載入:
// 懶載入翻譯
const messages = {
en: () => import("./locales/en.json"),
zh: () => import("./locales/zh.json"),
};
作為經驗豐富的翻譯專家,你需要遵循以下嚴格要求:
翻譯前必須理解文字的使用場景:
| 場景 | 示例 | 翻譯註意事項 |
|---|---|---|
| 按鈕文字 | "提交"、"確認"、"取消" | 簡潔有力,通常用動詞 |
| 表單標籤 | "產品名稱"、"建立時間" | 名詞短語,明確指示 |
| 佔位符 | "請輸入名稱"、"請選擇日期" | 引導性語句 |
| 提示資訊 | "操作成功"、"儲存失敗" | 結果導向,說明狀態 |
| 對話方塊標題 | "新增產品"、"編輯品牌" | 動作 + 物件 |
| 表格列 | "狀態"、"建立人"、"更新時間" | 簡潔名詞 |
同一個中文詞在不同場景可能有不同譯法:
示例:中文 "狀態"
├── 表格列標題 → "Status"
├── 業務流程中 → "State" 或 "Process Status"
├── 裝置狀態 → "Device Status"
└── 訂單狀態 → "Order Status"
示例:中文 "確認"
├── 按鈕文字 → "Confirm" 或 "Submit"
├── 二次確認提示 → "Are you sure?"
└── 確認框標題 → "Confirmation"
示例:中文 "檢視"
├── 表格操作列 → "View"
├── 檢視詳情 → "Details"
├── 檢視記錄 → "View Record"
└── 檢視圖片 → "Preview"
✅ 正確:所有"產品名稱"都翻譯為 "Product Name"
❌ 錯誤:有時翻譯為 "Product Name",有時翻譯為 "Name"
想要更強大的技能外掛,就來小蔥技能站7w4.net看看吧。
示例:
- SKU → Stock Keeping Unit(庫存單位)
- MDM → Master Data Management(主資料管理)
- CRM → Customer Relationship Management(客戶關係管理)
遵循專案的命名規範,專案沒有特殊規定時參考以下原則:
命名原則:
- 使用小寫字母
- 使用點分隔層級
- 保持簡潔但有意義
- 避免縮寫(除非是公認的縮寫)
層級結構建議:
- 動作相關:{模組}.action.{具體動作}
product.action.add, product.action.edit, product.action.delete
- 欄位相關:{模組}.{實體}.{欄位名}
product.product.name, product.product.code
- 提示相關:{模組}.message.{型別}
product.message.success, product.message.error
- 佔位符:common.placeholder.{型別}
common.placeholder.input, common.placeholder.select
公共部分:common.{型別}.{具體項}
common.action.add, common.action.edit
common.table.index, common.table.action
common.message.success, common.message.error
當遇到翻譯時,按以下流程決策:
1. 理解文字含義和用途
↓
2. 檢視專案現有翻譯庫
├── 已有相同翻譯?→ 直接複用
└── 沒有?→ 繼續
↓
3. 分析使用場景
├── 什麼型別的UI元素?
├── 在什麼上下文中使用?
└── 使用者期望什麼語氣?
↓
4. 選擇最準確的翻譯
↓
5. 判斷翻譯放哪裡
├── 通用性質?→ 公共目錄
└── 模組特有?→ 模組目錄
↓
6. 檢查一致性
├── 是否與現有術語衝突?
└── 是否需要更新術語表?
修改完成後,必須驗證:
檢查控制台是否有 missing translation 警告
程式碼檢查:
確認所有 key 都已正確新增
如果專案有 lint 工具:按專案規範執行
檢查是否影響其他使用該翻譯的地方
遺漏翻譯:
檢查是否還有其他遺漏
格式問題:
使用專案的格式化工具(如果有)
如果出現問題:
這個 Skill 質量很好,內容非常全面詳細。它把國際化翻譯的各種情況都考慮到了,包括怎麼處理特殊場景、怎麼保證翻譯準確一致,實用性很強。美中不足的是對新手來說可能有點複雜,上手需要一定時間;另外缺少自動化檢測建議,目前主要靠人工檢查。總體來說這是一個專業度高、考慮周全的 Skill。