コンテンツにスキップ

翻訳者向け

このページは、コードを書く人ではなく、カタログを編集する人のためのものです。 意図して短くしてあり、プロジェクト独自の翻訳者向け手引きへリンクしたり、 そのまま貼り付けたりできるように書かれています。

ここにPythonを読む必要のある話はありません。扱うのは1つのことだけ、 波括弧に囲まれたメッセージの部品です。

プレースホルダーとは

カタログのメッセージには、波括弧に囲まれた名前が含まれることがあります。

msgid "Hello {name}"
msgstr ""

{name}プレースホルダーです。プログラムはこのメッセージを表示するとき、 {name}を自分が用意した値 — 人の名前、ファイル名、数値 — に置き換えます。 プレースホルダーは翻訳すべき単語ではなく、値の入る枠です。

あなたの訳文はmsgstrに入り、その枠を保たなければなりません。

msgid "Hello {name}"
msgstr "こんにちは {name}"

変えてよいもの、いけないもの

変えてよいもの

  • プレースホルダーの位置を動かす。 対象言語の文法が求める場所へ、文頭へでも 移動できます。
  • プレースホルダーを繰り返す。 言語が値を2度必要とするなら繰り返せます。
  • それ以外の語をすべて書き換える。 句読点、空白の入れ方、文の順序も含めて 自由です。

してはいけないこと

  • 波括弧の中の名前を翻訳する。 ラテン文字を他に一切使わない言語であっても、 {name}{name}のままです。
  • 波括弧を外す、あるいは名前を波括弧なしで書く。
  • ASCIIの波括弧{ }を全角の に置き換える。 多くの入力メソッドが 全角の形を出します。見た目はほとんど同じですが、動きません。
  • 書式を追加する。 {name!r}{amount:.2f}のようなものです。値をどう 表示するかはカタログではなくプログラムが決めます。
  • msgidにないプレースホルダーをでっち上げる。

原文が用意していない値がメッセージに必要な場合、それは開発者が変えるべき メッセージです。回避策でしのがず、そう伝えてください。

複数形

個数を伴うメッセージは、あなたの言語の複数形の数だけmsgstrの枠を持って 届きます。いくつになるかを決めるのはあなたの言語です。日本語は1つ、ドイツ語は 2つ、ロシア語は3つ、アラビア語は6つです。カタログが渡してくる枠は、すべて 埋めてください。

つまずきやすい規則が2つあります。

  • 枠は「単数形・複数形・もっと複数形」ではありません。 各番号が何を意味するか は、あなたの言語の複数形規則が決めます。ラトビア語の3つ目はゼロ専用、 スロベニア語の2つ目はちょうど2の場合、ウェールズ語は番号0に一般形、番号1に 単数形を置きます。
  • 2つの枠が同じ文になることは正当にあり得ます。 トルコ語、ハンガリー語、 ペルシア語、ベンガル語では数詞の後で名詞が単数のままなので、個数付きメッセージ の両方の形が同じ文字列になります。これはコピー&ペーストのミスではなく、 正しい状態です。

上のプレースホルダーの規則は、それぞれの形に個別に適用されます。

fuzzyエントリ

fuzzyが付いたエントリは機械の推測です。開発者が元のメッセージを変更し、 あなたが出発点にできるように、ツールが新しい文とあなたの古い訳文を組にした ものです。

#, fuzzy
msgid "Welcome back, {name}"
msgstr "こんにちは {name}"

fuzzyエントリは、誰かが文を直してfuzzyの印を外すまで、プログラムからは 使われません — 未翻訳の原文がそのまま表示されます。ほとんどのPOエディタには、 まさにそのためのボタンがあります。

エラーメッセージを読む

ツールはカタログのコンパイル時にプレースホルダーを検査し、そのメッセージは プログラマーではなくあなたのために書かれています。画面上では文字が見えている のに{name}がないとだけ報告しても手掛かりになりません。そのため、 プレースホルダーが存在するように見えて実際には存在しない場合、理由まで示します。 原文Hello {name}に対して、次の各翻訳は translation does not match the source placeholders:に続けて報告されます。

訳文の内容 報告される理由
こんにちは {name} {name} is missing (the braces around it are not the ASCII { and })
こんにちは {{name}} {name} is missing (it is written {{name}}, which is how a literal brace is escaped)
こんにちは name {name} is missing (the name appears, but not inside braces)
こんにちは {名前} {name} is missing; {名前} is not in the source message

目に見えない文字は別に扱います。波括弧内のno-break spaceは入力メソッドが生成する ことがあり、editorでは見えません。そのため、あなたには決して見つけられない文字の 名前ではなく、code pointで表示します。

placeholder {<U+00A0>name} has a space inside the braces; write {name}

文字体系が混在した名前、たとえばLatin文字と見分けがつかないCyrillicのаを含む homoglyphの場合、読みやすい形とescapeした形の両方を示します。両者を区別できるのは 後者だけです。

translation does not match the source placeholders: {name} is missing;
{nаme} (n\u0430me) is not in the source message

同じ区別は、GreekまたはCyrillicだけで書かれた名前がASCIIのソース名と衝突する 場合にも適用されます。LatinのaとCyrillicのаという1文字の場合も同様です。

これらのどれかに出会って直し方がすぐ分からないときは、自分が入力した プレースホルダーを消してmsgidのものをコピーするのが安全な手です。

検査にできないこと

ツールが確かめるのは、プレースホルダーが無傷かどうかだけです。訳文が正確か、 自然か、その文脈に合っているかは判定できません。それは完全にあなたに委ねられて います。

どんな検査よりも役に立つことが2つあります。

  • 翻訳者向けコメントを読む。 メッセージの上にある#.で始まる行は、それが どこに現れ、何を意味するかを開発者が伝えているものです。
  • msgctxtについて尋ねる。 同じ語が異なるコンテキストで2度現れるのは、 その2つを訳し分ける必要があるからです。たとえばボタンの「Open」と状態の 「Open」です。