EmDash の管理 UI は、メッセージ抽出に Lingui、翻訳進捗の追跡に Lunaria を使用して翻訳可能です。すべての翻訳は PO (gettext) ファイルに保存されています — ロケールごとに1つです。
翻訳状況
すべてのロケールの現在の進捗状況は翻訳ダッシュボードで確認できます。
翻訳できる人
すべての翻訳はネイティブスピーカーまたは流暢な話者が監督する必要があります。AI 生成の翻訳は受け入れられますが、流暢な話者がすべての文字列をレビューし、提出前に実行中の管理パネルでプレビューした場合に限ります。監督なしの機械出力は受け入れられません。以下の AI 支援翻訳 と 翻訳のテスト を参照してください。
文字列を未翻訳のまま残す方が、誤って翻訳するよりも良いです。誤った翻訳はユーザーを誤解させます。英語へのフォールバックはユーザーに不便を与えるだけです。
ファイル構造
翻訳カタログは packages/admin/src/locales/ にあります:
packages/admin/src/locales/
├── en/
│ └── messages.po # 英語(ソース)
├── de/
│ └── messages.po # ドイツ語
└── ...
各 .po ファイルには msgid/msgstr ペアが含まれています。msgid は英語のソーステキスト、msgstr はあなたの翻訳です。空の msgstr は「まだ翻訳されていない」ことを意味します — Lingui は実行時に英語にフォールバックします。
文字列の翻訳
-
翻訳ダッシュボードを確認して、何が作業を必要としているかを確認します。重複を避けるために、オープンな PR も確認してください。
-
リポジトリをフォークしてブランチを作成します:
git checkout -b i18n/ja -
ロケールの PO ファイルを開きます(例:
packages/admin/src/locales/ja/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 "Passkey でサインイン" -
翻訳をテストします(下記参照)。
-
PR をオープンします
mainをターゲットにします。タイトル形式:i18n(ja): add/update Japanese translations。
翻訳すべきもの
- 各エントリの
msgstr値。
翻訳してはいけないもの
msgidの値 — これらは検索キーです。{error}、{email}、{label}などの補間プレースホルダー — そのまま正確に保持してください。<0>、</0>などの XML スタイルのタグ — これらはインタラクティブ要素(リンク、ボタン)をラップします。タグを保持し、その間のテキストを翻訳してください。#:で始まるコメント — これらは 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 コンポーネントをラップします。どちらもソースと同じように翻訳に表示される必要があります — 同じ名前、同じネスト構造です。
翻訳のテスト
-
コンパイルしてデモを実行します:
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: "vi", label: "Tiếng Việt", enabled: false }, // あなたのものを追加 ];これが唯一の信頼できるソースです —
lingui.config.ts、lunaria.config.ts、および管理ランタイムはすべてこのファイルからロケールリストを導出します。翻訳が進行中の間はenabled: falseに設定してください。メンテナーは、管理 UI での使用に十分なカバレッジがあれば、ロケールを有効にします。 -
抽出を実行して空の PO ファイルを生成します:
pnpm run locale:extractこれにより、すべての文字列が翻訳準備完了の状態で
packages/admin/src/locales/{あなたのロケール}/messages.poが作成されます。 -
上記の手順に従って翻訳とテストを行います。
翻訳基準
正確性
翻訳は、ネイティブスピーカーレベルで英語のソーステキストを忠実に表現する必要があります。意味を追加、削除、または再解釈しないでください。ソース文字列が曖昧な場合は、#: コメントでソースファイルの場所を確認してください — コンポーネントのコードを読んでコンテキストを理解してください。
一貫性
ロケール内で一貫した用語を使用してください。ある場所で「collection」を「コレクション」と翻訳した場合、別の場所で「収集」に変えないでください。あなたの言語にすでに翻訳がある場合は、開始前に既存の PO ファイルを読んで、確立された用語に合わせてください。
トーン
管理 UI は直接的でプロフェッショナルなトーンを使用しています。あなたの言語でもそれに合わせてください — 過度にフォーマルまたは過度にカジュアルな表現は避けてください。
AI 支援翻訳
AI ツールを使用して翻訳を生成できます(完全な初回パスを含む)が、流暢な話者が結果を監督する必要があります:
- 流暢な話者がすべての文字列を必ずレビューしなければなりません。AI ツールは流暢な話者だけが気づく微妙なエラーを犯します — 間違った敬語レベル、不自然な表現、誤った技術用語など。
- 流暢な話者が実行中の管理 UI で翻訳を必ずプレビューしなければなりません。AI ツールはレイアウトの制約や UI のコンテキストを認識しません。
- PR の説明に AI の使用を開示してください。
- 監督なしの機械翻訳を含む PR はクローズされます。
部分翻訳
部分翻訳は歓迎されます。1つの PR ですべての文字列を翻訳する必要はありません — どんな進捗でも助けになります。未翻訳の文字列は実行時に英語にフォールバックします。