i18n-localization

i18n-localization

熱門

國際化與在地化模式。偵測硬編碼字串、管理翻譯、語言環境檔案、RTL 支援。

4.4萬星標
6508分支
更新於 2026/7/30
SKILL.md
readonlyread-only
name
i18n-localization
description

國際化與在地化模式。偵測硬編碼字串、管理翻譯、語言環境檔案、RTL 支援。

i18n 與在地化

國際化 (i18n) 與在地化 (L10n) 最佳實務。


1. 核心概念

術語 意義
i18n 國際化 - 讓應用程式可翻譯
L10n 在地化 - 實際翻譯
Locale 語言 + 地區 (en-US, tr-TR)
RTL 從右到左的語言 (阿拉伯語、希伯來語)

2. 何時使用 i18n

專案類型 需要 i18n?
公開網站應用程式 ✅ 是
SaaS 產品 ✅ 是
內部工具 ⚠️ 可能
單一地區應用程式 ⚠️ 考慮未來
個人專案 ❌ 選用

3. 實作模式

React (react-i18next)

import { useTranslation } from 'react-i18next';

function Welcome() {
  const { t } = useTranslation();
  return <h1>{t('welcome.title')}</h1>;
}

Next.js (next-intl)

import { useTranslations } from 'next-intl';

export default function Page() {
  const t = useTranslations('Home');
  return <h1>{t('title')}</h1>;
}

Python (gettext)

from gettext import gettext as _

print(_("Welcome to our app"))

4. 檔案結構

locales/
├── en/
│   ├── common.json
│   ├── auth.json
│   └── errors.json
├── tr/
│   ├── common.json
│   ├── auth.json
│   └── errors.json
└── ar/          # RTL
    └── ...

5. 最佳實務

應該 ✅

  • 使用翻譯鍵,而非原始文字
  • 依功能命名空間翻譯
  • 支援複數形式
  • 依語言環境處理日期/數字格式
  • 從一開始就規劃 RTL
  • 對複雜字串使用 ICU 訊息格式

不應該 ❌

  • 在元件中硬編碼字串
  • 串接已翻譯的字串
  • 假設文字長度 (德文長 30%)
  • 忘記 RTL 版面
  • 在同一檔案中混用語言

6. 常見問題

問題 解決方案
缺少翻譯 回退到預設語言
硬編碼字串 使用 linter/檢查腳本
日期格式 使用 Intl.DateTimeFormat
數字格式 使用 Intl.NumberFormat
複數形式 使用 ICU 訊息格式

7. RTL 支援

/* CSS 邏輯屬性 */
.container {
  margin-inline-start: 1rem;  /* 不是 margin-left */
  padding-inline-end: 1rem;   /* 不是 padding-right */
}

[dir="rtl"] .icon {
  transform: scaleX(-1);
}

8. 檢查清單

發布前:

  • [ ] 所有使用者可見字串使用翻譯鍵
  • [ ] 所有支援的語言都有語言環境檔案
  • [ ] 日期/數字格式化使用 Intl API
  • [ ] RTL 版面已測試 (若適用)
  • [ ] 已設定回退語言
  • [ ] 元件中沒有硬編碼字串

腳本

腳本 用途 指令
scripts/i18n_checker.py 偵測硬編碼字串與缺少的翻譯 python scripts/i18n_checker.py <project_path>

使用時機

此技能適用於執行概述中所述的工作流程或動作。

限制

  • 僅在任務明確符合上述範圍時使用此技能。
  • 請勿將輸出視為環境特定驗證、測試或專家審查的替代品。
  • 若缺少必要輸入、權限、安全邊界或成功標準,請停止並要求澄清。