このサイトは非公式の日本語訳です。Cloudflare・EmDashプロジェクトが運営するサイトではありません。

このページで分かること

  • 管理画面の翻訳の仕組み(Lingui、Lunaria、ロケールごとのPOファイル)と、翻訳の進み具合を確かめるダッシュボード
  • 翻訳に参加する条件(母語話者または流暢な話者の監修が必要で、AIによる訳は全文の確認と画面でのプレビューが条件)と、POファイルの翻訳の手順、訳してはいけない部分
  • 動いている管理画面での確認、疑似ロケール、新しい言語の追加、翻訳の基準、一部だけの翻訳の扱い
難易度
上級
読む時間
4分
このページの目次

EmDashの管理画面は翻訳できます。メッセージの抽出には Lingui を、翻訳の進み具合の把握には Lunaria を使います。翻訳はすべて、ロケールごとに1つずつあるPO(gettext)ファイルに収められています。

翻訳の状況

すべてのロケールの現在の進み具合は、翻訳のダッシュボードで確認できます。

翻訳できる人

どの翻訳も、母語話者または流暢な話者が監修する必要があります。AIが生成した翻訳も受け付けますが、それは流暢な話者がすべての文字列を確認し、送る前に動いている管理画面でプレビューした場合に限ります。監修されていない機械の出力は受け付けません。後述のAIを使った翻訳翻訳のテストを参照してください。

文字列を未翻訳のままにするほうが、誤って翻訳するよりもましです。誤った翻訳はユーザーを誤解させますが、英語での表示は不便なだけです。

ファイルの構成

翻訳のカタログは packages/admin/src/locales/ にあります。

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

.po ファイルには、msgidmsgstr の組が入っています。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のコンポーネントを囲みます。どちらも、原文とまったく同じ形(同じ名前、同じ入れ子)で翻訳に含める必要があります。

本サイトの補足 やさしい解説

WordPressのテーマやプラグインの翻訳と同じく、EmDashの管理画面もgettextのPOファイルで翻訳します。msgid が英語の原文、msgstr がその訳で、書き換えるのは msgstr だけです。{email} のようなプレースホルダーと <0> のようなタグは、訳文にも同じ形で残します。msgstr を空のままにした文字列は、画面に英語で表示されます。

翻訳のテスト

  1. コンパイルしてデモを起動します。

    pnpm run locale:compile
    pnpm build
    pnpm --filter emdash-demo dev
    
  2. 管理画面の「設定」ページでロケールを切り替え、実際の画面で翻訳が正しく表示されることを確認します。

疑似ロケール

EmDashには、疑似ロケール(pseudo locale)が付属しています。これは、囲まれたすべての文字列を、アクセント記号の付いた似た文字に置き換えるものです。たとえば "Dashboard""Ðàšĥƀöàřð" になります。疑似ロケールが有効な状態で普通の英語のまま表示される文字列は、t`...` で囲まれていないか、カタログの外から来ているかのどちらかです。

有効にするには、デモのディレクトリの .env ファイルに次の行を追加します。

demos/simple/.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: "vi", label: "Tiếng Việt", enabled: false },  // add yours
    ];
    

    このファイルが唯一の正式な情報源です。lingui.config.tslunaria.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のツールは、レイアウトの制約やUIの文脈を把握していません。
  • PRの説明で、AIを使ったことを開示します。
  • 監修されていない機械翻訳のPRはクローズされます。

一部だけの翻訳

一部だけの翻訳も歓迎されます。1つのPRですべての文字列を翻訳する必要はありません。どんな進捗も役に立ちます。翻訳されていない文字列は、実行時に英語で表示されます。