EmDashの翻訳に参加する
このページで分かること
- 管理画面の翻訳の仕組み(Lingui、Lunaria、ロケールごとのPOファイル)と、翻訳の進み具合を確かめるダッシュボード
- 翻訳に参加する条件(母語話者または流暢な話者の監修が必要で、AIによる訳は全文の確認と画面でのプレビューが条件)と、POファイルの翻訳の手順、訳してはいけない部分
- 動いている管理画面での確認、疑似ロケール、新しい言語の追加、翻訳の基準、一部だけの翻訳の扱い
このページの目次
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 ファイルには、msgid/msgstr の組が入っています。msgid は英語の原文で、msgstr が翻訳です。msgstr が空の場合は「まだ翻訳されていない」ことを意味し、実行時にLinguiが英語を代わりに表示します。
文字列の翻訳
-
翻訳のダッシュボードを確認し、どこに作業が必要かを調べます。作業の重複を避けるため、オープンになっているPRも確認します。
-
リポジトリをフォークし、ブランチを作成します。
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です。
翻訳するもの
- 各項目の
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 を空のままにした文字列は、画面に英語で表示されます。
翻訳のテスト
-
コンパイルしてデモを起動します。
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: "de", label: "Deutsch", enabled: true }, // ... { code: "vi", label: "Tiếng Việt", enabled: false }, // add yours ];このファイルが唯一の正式な情報源です。
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のツールは、レイアウトの制約やUIの文脈を把握していません。
- PRの説明で、AIを使ったことを開示します。
- 監修されていない機械翻訳のPRはクローズされます。
一部だけの翻訳
一部だけの翻訳も歓迎されます。1つのPRですべての文字列を翻訳する必要はありません。どんな進捗も役に立ちます。翻訳されていない文字列は、実行時に英語で表示されます。