翻譯 EmDash

本頁內容

EmDash 的管理介面使用 Lingui 進行訊息擷取,使用 Lunaria 追蹤翻譯進度,支援翻譯。所有翻譯存放在 PO (gettext) 檔案中——每個語言環境一個。

翻譯狀態

查看翻譯儀表板了解所有語言環境的當前進度。

誰可以翻譯

每個翻譯都必須由母語使用者或流利使用者監督。AI 生成的翻譯可以接受,但僅限於流利使用者在提交前審查每個字串並在執行中的管理面板中預覽的情況下。未經監督的機器輸出不被接受。請參閱下方的 AI 輔助翻譯和測試你的翻譯。

留下未翻譯的字串比翻譯錯誤更好。錯誤的翻譯會誤導使用者;英語回退只會給他們帶來不便。

檔案結構

翻譯目錄位於 packages/admin/src/locales/:

packages/admin/src/locales/
├── en/
│   └── messages.po    # 英語(來源)
├── de/
│   └── messages.po    # 德語
└── ...

每個 .po 檔案包含 msgid/msgstr 對。msgid 是英語來源文字;msgstr 是你的翻譯。空的 msgstr 意味著「尚未翻譯」——Lingui 將在執行時回退到英語。

翻譯字串

  1. **查看翻譯儀表板**了解哪些需要工作。檢查未關閉的 PR 以避免重複工作。

  2. Fork 儲存庫並建立分支:

    git checkout -b i18n/zh-tw
  3. 開啟你的語言環境的 PO 檔案(例如,packages/admin/src/locales/zh-tw/messages.po)。

  4. 填寫翻譯。 每個條目如下所示:

    #: packages/admin/src/components/LoginPage.tsx:304
    msgid "Sign in with Passkey"
    msgstr ""

    填寫 msgstr:

    #: packages/admin/src/components/LoginPage.tsx:304
    msgid "Sign in with Passkey"
    msgstr "使用 Passkey 登入"
  5. 測試你的翻譯(見下文)。

  6. 提交 PR 目標為 main。標題格式:i18n(zh-tw): add/update Chinese (Traditional) translations。

需要翻譯的內容

  • 每個條目的 msgstr 值。

不需要翻譯的內容

  • msgid 值——這些是查找鍵。
  • 插值佔位符如 {error}、{email}、{label}——保持原樣不變。
  • XML 樣式標籤如 <0>、</0>——這些包裹互動元素(連結、按鈕)。保留標籤並翻譯它們之間的文字。
  • 以 #: 開頭的註解——這些是 Lingui 新增的原始碼參考。

插值和標籤

一些字串包含佔位符和標籤:

msgid "Authentication error: {error}"
msgstr "驗證錯誤:{error}"

msgid "Don't have an account? <0>Sign up</0>"
msgstr "還沒有帳戶?<0>註冊</0>"

msgid "If an account exists for <0>{email}</0>, we've sent a sign-in link."
msgstr "如果 <0>{email}</0> 對應的帳戶存在,我們已發送登入連結。"

佔位符({error}、{email})在執行時被動態值取代。標籤(<0>...</0>)包裹 React 元件。兩者都必須在你的翻譯中與來源文字完全一致地出現——相同的名稱、相同的巢狀結構。

測試你的翻譯

  1. 編譯並執行範例:

    pnpm run locale:compile
    pnpm build
    pnpm --filter emdash-demo dev
  2. 在管理設定頁面切換語言環境,驗證你的翻譯在上下文中顯示正確。

虛擬語言環境

EmDash 附帶了一個虛擬語言環境,它將所有包裹的字串轉換為帶重音的仿製字元——"Dashboard" 變成 "Ðàšĥƀöàřð",以此類推。在虛擬語言環境啟用時以正常英語顯示的任何字串要麼缺少 t\…“ 包裹,要麼來自目錄之外。

要啟用它,在範例目錄的 .env 檔案中新增以下內容:

EMDASH_PSEUDO_LOCALE=1

然後重新啟動開發伺服器。虛擬語言環境在登入頁面和設定的語言選擇器中顯示為 Pseudo。切換到它可以一目了然地發現未包裹的字串。

新增語言

如果你的語言還沒有 PO 檔案:

  1. 在 packages/admin/src/locales/locales.ts 中新增語言環境:

    export const LOCALES: LocaleDefinition[] = [
      { code: "en", label: "English", enabled: true },
      { code: "de", label: "Deutsch", enabled: true },
      // ...
      { code: "vi", label: "Tiếng Việt", enabled: false },  // 新增你的
    ];

    這是唯一的事實來源——lingui.config.ts、lunaria.config.ts 和管理執行時都從這個檔案衍生其語言環境列表。在翻譯進行中時設定 enabled: false。維護者會在語言環境有足夠的覆蓋率用於管理介面時啟用它。

  2. 執行擷取以產生空的 PO 檔案:

    pnpm run locale:extract

    這會建立 packages/admin/src/locales/{你的語言環境}/messages.po,其中所有字串已準備好翻譯。

  3. 按照上述步驟翻譯和測試。

翻譯標準

準確性

翻譯應在母語者水準上忠實地表達英語來源文字。不要新增、刪除或重新詮釋含義。如果來源字串有歧義,檢查 #: 註解了解原始檔案位置——閱讀元件程式碼以理解上下文。

一致性

在你的語言環境內使用一致的術語。如果你在一個地方將「collection」翻譯為「集合」,不要在另一個地方改為「收藏」。如果你的語言已有翻譯,在開始之前閱讀現有的 PO 檔案以配合已建立的術語。

語氣

管理介面使用直接、專業的語氣。在你的語言中配合這種語氣——避免過於正式或過於隨意的措辭。

AI 輔助翻譯

你可以使用 AI 工具產生翻譯,包括完整的首次翻譯,但流利使用者必須監督結果:

  • 流利使用者必須審查每個字串。AI 工具會犯只有流利使用者才能發現的微妙錯誤——錯誤的語域、不自然的措辭、不正確的技術術語。
  • 流利使用者必須在執行中的管理介面中預覽翻譯。AI 工具不了解版面配置限制或 UI 上下文。
  • 在 PR 描述中說明 AI 的使用。
  • 包含未經監督的機器翻譯的 PR 將被關閉。

部分翻譯

歡迎部分翻譯。你不需要在一個 PR 中翻譯每個字串——任何進展都有幫助。未翻譯的字串將在執行時回退到英語。