EmDash の翻訳

このページ

EmDash の管理画面は、メッセージ抽出に Lingui を使用し、翻訳の進捗追跡に Lunaria を使用して翻訳可能です。すべての翻訳は PO (gettext) ファイルに保存されます — ロケールごとに1つです。

翻訳ステータス

すべてのロケールの現在の進捗状況については、翻訳ダッシュボード をご覧ください。

誰が翻訳できるか

すべての翻訳は、ネイティブスピーカーまたは流暢な話者 によって監督される必要があります。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. リポジトリをフォークしてブランチを作成します:

    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

翻訳すべきもの

  • 各エントリの 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 コンポーネントをラップします。両方とも、ソースに表示されているのとまったく同じように翻訳に表示される必要があります — 同じ名前、同じネスト。

翻訳のテスト

  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: "ja", label: "日本語", enabled: false },  // add yours
    ];

    これは唯一の真実の情報源です — lingui.config.tslunaria.config.ts、および管理ランタイムはすべて、このファイルからロケールリストを派生させます。翻訳が 100% カバーしていない限り、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 ツールは、レイアウトの制約や UI コンテキストを認識していません。
  • PR の説明で AI の使用を開示してください。
  • 監督されていない機械翻訳の PR は閉じられます。

部分的な翻訳

部分的な翻訳は歓迎されます。1つの PR ですべての文字列を翻訳する必要はありません — どんな進歩も役立ちます。未翻訳の文字列は、実行時に英語にフォールバックします。