翻譯 EmDash

本頁內容

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

翻譯狀態

請查看翻譯儀表板,了解所有語言的目前進度。

誰可以翻譯

每一份翻譯都必須由母語者或流利的使用者監督。接受 AI 產生的翻譯,但前提是有流利的使用者審閱每一個字串,並在提交前於執行中的管理後台預覽。不接受未經監督的機器輸出。請參閱下方的 AI 輔助翻譯和測試你的翻譯。

寧可不翻譯某個字串,也不要把它翻譯錯。錯誤的翻譯會誤導使用者;英文回退只會給他們帶來不便。

檔案結構

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

packages/admin/src/locales/
├── en/
│   └── messages.po    # English (source)
├── de/
│   └── messages.po    # German
└── ...

每個 .po 檔案包含 msgid/msgstr 對。msgid 是英文原始文字;msgstr 是你的翻譯。msgstr 為空表示「尚未翻譯」,Lingui 會在執行時回退到英文。

翻譯字串

  1. 查看翻譯儀表板,了解哪些內容需要處理。檢查未關閉的 PR,避免重複勞動。

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

    git checkout -b i18n/de
  3. 開啟你所用語言的 PO 檔案(例如 packages/admin/src/locales/de/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 "Mit Passkey anmelden"
  5. 測試你的翻譯(見下文)。

  6. 向 main 提交 PR。 標題格式:i18n(de): add/update German translations。

    請將 PR 限定為 PO 檔案、一個 changeset,以及新增語言中描述的語言檔案。如果翻譯 PR 修改了其他任何內容,自動化機器人會留下留言。

需要翻譯的內容

  • 每個項目的 msgstr 值。

不需要翻譯的內容

  • msgid 值,它們是查找鍵。
  • 插值預留位置,如 {error}、{email}、{label},請保持原樣。
  • XML 風格標籤,如 <0>、</0>,它們包裹互動元素(連結、按鈕)。請保留標籤,並翻譯標籤之間的文字。
  • 以 #: 開頭的註解,它們是 Lingui 加入的原始碼參照。

插值和標籤

某些字串包含預留位置和標籤:

msgid "Authentication error: {error}"
msgstr "Authentifizierungsfehler: {error}"

msgid "Don't have an account? <0>Sign up</0>"
msgstr "Noch kein Konto? <0>Registrieren</0>"

msgid "If an account exists for <0>{email}</0>, we've sent a sign-in link."
msgstr "Falls ein Konto für <0>{email}</0> existiert, haben wir einen Anmeldelink gesendet."

預留位置({error}、{email})會在執行時被取代為動態值。標籤(<0>...</0>)包裹 React 元件。兩者都必須在你的翻譯中與原始文字完全一致地出現,名稱和巢狀結構都不能改變。

測試你的翻譯

  1. 編譯並執行範例:

    pnpm run locale:compile
    pnpm build
    pnpm --filter emdash-demo dev
  2. 在管理後台的設定頁面中切換語言,並確認你的翻譯在上下文中看起來正確。

虛擬語言環境

EmDash 內建一個虛擬語言環境(pseudo locale),它會把所有被包裹的字串變成帶重音符號的相似字元,例如 "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: "vi",
        label: "Tiếng Việt",
        enabled: false,
        dateLocale: () => import("react-day-picker/locale/vi").then((m) => m.vi),
      },
    ];

    dateLocale 會載入你所用語言的日曆和日期格式在地化。請在 react-day-picker/locale 中選擇最接近的檔案,例如用 pt 對應 pt-PT,並使用該檔案中命名的匯出。只有當你的語言使用美式英語日曆時才可以省略它。

    這是唯一的事實來源:lingui.config.ts、lunaria.config.ts 和管理後台執行階段都從這個檔案衍生語言清單。翻譯進行期間請設定 enabled: false。當該語言的涵蓋率足以在管理後台介面中使用時,由維護者將其啟用。

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

    pnpm run locale:extract

    這會建立 packages/admin/src/locales/{your-locale}/messages.po,其中包含所有待翻譯的字串。

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

翻譯標準

準確性

翻譯應以母語者的水準忠實地呈現英文原始文字。不要增加、刪減或重新解讀含義。如果原始字串有歧義,請查看 #: 註解中的原始檔案位置,並閱讀元件程式碼以理解上下文。

一致性

在你的語言中使用一致的術語。如果你在某處把 “collection” 譯為「Sammlung」,就不要在別處改用「Kollektion」。如果你的語言已有翻譯,請在開始之前通讀現有的 PO 檔案,以符合既定術語。

語氣

管理後台介面採用直接、專業的語氣。請在你的語言中保持一致,避免過於正式或過於隨意的措辭。

AI 輔助翻譯

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

  • 流利的使用者必須審閱每一個字串。AI 工具會犯一些只有流利的使用者才能發現的細微錯誤:語體不對、措辭不自然、技術術語不正確。
  • 流利的使用者必須在執行中的管理後台介面預覽翻譯。AI 工具無法感知版面限制或介面上下文。
  • 在 PR 說明中註明使用了 AI。
  • 包含未經監督的機器翻譯的 PR 將被關閉。

部分翻譯

歡迎提交部分翻譯。你不需要在一個 PR 中翻譯所有字串,任何進展都有幫助。未翻譯的字串會在執行時回退到英文。