EmDash の管理画面は、メッセージの抽出に Lingui を、翻訳の進捗管理に Lunaria を使用して国際化に対応しています。すべての翻訳は PO(gettext)ファイルに格納されており、ロケールごとに1ファイルです。
翻訳状況
すべてのロケールの現在の進捗は翻訳ダッシュボードで確認できます。
翻訳できる人
翻訳はネイティブスピーカーまたは流暢な話者によるものでなければなりません。機械生成の翻訳は受け付けていません。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" -
翻訳をテストします(下記参照)。
-
PR を作成して
mainに向けます。タイトルの形式:i18n(de): add/update German translations。
翻訳すべきもの
- 各エントリの
msgstrの値。
翻訳してはいけないもの
msgidの値——これらはルックアップキーです。{error}、{email}、{label}のような補間プレースホルダー——そのまま維持してください。<0>、</0>のような XML スタイルのタグ——これらはインタラクティブ要素(リンク、ボタン)をラップします。タグはそのまま残し、タグの間のテキストを翻訳してください。#:で始まるコメント——これらは 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 には擬似ロケールが組み込まれており、ラップされたすべての文字列をアクセント付きの類似文字に変換します——"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: "de", label: "Deutsch", enabled: true }, // ... { code: "ja", label: "日本語", enabled: false }, // add yours ];これが唯一の情報源です——
lingui.config.ts、lunaria.config.ts、および管理画面のランタイムはすべてこのファイルからロケールリストを取得します。翻訳のカバレッジが 100% でない限りenabledをfalseに設定してください——十分なカバレッジに達したら有効にします。 -
抽出を実行して空の PO ファイルを生成します:
pnpm run locale:extractこれにより
packages/admin/src/locales/{your-locale}/messages.poが作成され、翻訳すべきすべての文字列が含まれます。 -
上記の手順に従って翻訳とテストを行います。
翻訳の基準
正確性
翻訳は英語の原文をネイティブスピーカーのレベルで忠実に反映する必要があります。意味を追加、削除、再解釈しないでください。原文の意味が曖昧な場合は、#: コメントでソースファイルの場所を確認し、コンポーネントのコードを読んでコンテキストを理解してください。
一貫性
ロケール内で一貫した用語を使用してください。ある場所で「collection」を「Sammlung」と翻訳した場合、別の場所で「Kollektion」に変更しないでください。すでに翻訳がある言語の場合は、開始前に既存の PO ファイルを通読して、確立された用語に合わせてください。
トーン
管理画面は直接的でプロフェッショナルなトーンを使用しています。あなたの言語でもそれに合わせてください——過度にフォーマルまたは過度にカジュアルな表現は避けてください。
AI を使った翻訳
AI ツールを使って翻訳の下書きを作成することは可能ですが:
- すべての文字列を自分で確認する必要があります。AI ツールは流暢な話者にしか気づかない微妙なエラーを起こします——不適切なレジスター、不自然な表現、間違った技術用語など。
- 実行中の管理画面で結果をテストする必要があります。AI ツールはレイアウトの制約や UI のコンテキストを認識できません。
- PR の説明で AI の使用を開示してください。
- 明らかに未レビューの機械翻訳による PR はクローズされます。
部分的な翻訳
部分的な翻訳も歓迎します。1つの PR ですべての文字列を翻訳する必要はありません——どんな進捗でも助けになります。未翻訳の文字列は実行時に英語にフォールバックします。