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 會在執行時回退到英文。
翻譯字串
-
查看翻譯儀表板,了解哪些內容需要處理。檢查未關閉的 PR,避免重複勞動。
-
Fork 儲存庫並建立分支:
git checkout -b i18n/de -
開啟你所用語言的 PO 檔案(例如
packages/admin/src/locales/de/messages.po)。 -
填寫翻譯。 每個項目如下所示:
#: 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" -
測試你的翻譯(見下文)。
-
向
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 元件。兩者都必須在你的翻譯中與原始文字完全一致地出現,名稱和巢狀結構都不能改變。
測試你的翻譯
-
編譯並執行範例:
pnpm run locale:compile pnpm build pnpm --filter emdash-demo dev -
在管理後台的設定頁面中切換語言,並確認你的翻譯在上下文中看起來正確。
虛擬語言環境
EmDash 內建一個虛擬語言環境(pseudo locale),它會把所有被包裹的字串變成帶重音符號的相似字元,例如 "Dashboard" 會變成 "Ðàšĥƀöàřð"。在虛擬語言環境啟用時,任何仍以一般英文顯示的字串,要麼缺少 t\…“ 包裹,要麼來自目錄之外。
要啟用它,請在範例目錄的 .env 檔案中加入以下內容:
EMDASH_PSEUDO_LOCALE=1
然後重新啟動開發伺服器。虛擬語言環境會以 Pseudo 的名稱出現在登入頁面和設定中的語言選擇器裡。切換到它,就能一眼發現未被包裹的字串。
新增語言
如果你的語言還沒有 PO 檔案:
-
將該語言加入
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。當該語言的涵蓋率足以在管理後台介面中使用時,由維護者將其啟用。 -
執行擷取,產生空的 PO 檔案:
pnpm run locale:extract這會建立
packages/admin/src/locales/{your-locale}/messages.po,其中包含所有待翻譯的字串。 -
按照上述步驟翻譯並測試。
翻譯標準
準確性
翻譯應以母語者的水準忠實地呈現英文原始文字。不要增加、刪減或重新解讀含義。如果原始字串有歧義,請查看 #: 註解中的原始檔案位置,並閱讀元件程式碼以理解上下文。
一致性
在你的語言中使用一致的術語。如果你在某處把 “collection” 譯為「Sammlung」,就不要在別處改用「Kollektion」。如果你的語言已有翻譯,請在開始之前通讀現有的 PO 檔案,以符合既定術語。
語氣
管理後台介面採用直接、專業的語氣。請在你的語言中保持一致,避免過於正式或過於隨意的措辭。
AI 輔助翻譯
你可以使用 AI 工具產生翻譯,包括完整的初稿,但必須由流利的使用者監督結果:
- 流利的使用者必須審閱每一個字串。AI 工具會犯一些只有流利的使用者才能發現的細微錯誤:語體不對、措辭不自然、技術術語不正確。
- 流利的使用者必須在執行中的管理後台介面預覽翻譯。AI 工具無法感知版面限制或介面上下文。
- 在 PR 說明中註明使用了 AI。
- 包含未經監督的機器翻譯的 PR 將被關閉。
部分翻譯
歡迎提交部分翻譯。你不需要在一個 PR 中翻譯所有字串,任何進展都有幫助。未翻譯的字串會在執行時回退到英文。