Help:Extension:Translate/メッセージ群の設定例

This page is a translated version of the page Help:Extension:Translate/Group configuration example and the translation is 100% complete.

このチュートリアルの対象は開発者と経験の長い翻訳管理者です。 ソフトウェアのインターフェイス メッセージ翻訳用に設定ファイルを新設する方法について、実践的な面を細かく解説します。 これは単体ではなく メッセージ群の設定のリファレンスマニュアル と共に使用するものであり、このチュートリアルをすべて読んだ後に質問があれば Translate 拡張機能の開発者が喜んで助力します。

必須条件

このチュートリアルは、Translate 拡張機能 リビジョン r97948 (2011-09-23) に基づいて作成されました。

このチュートリアルでは MyBB プロジェクトの特定の部分の翻訳を可能にするプロセスを解説します。 その他のプロジェクトやファイルを翻訳対象に追加する場合も、同様の段階をたどることができます。 translatewiki.net 固有の部分もあることから、利用者の事例に合わせて使用する部分を選ぶべきで、一言一句チュートリアルどおりにするべきではありません。

手順 1: ソースコードのチェックアウト

$wgTranslateGroupRoot を作業ディレクトリとして、MyBB のソースコードをチェックアウトしましょう。この例では、作業ディレクトリを /home/betawiki/projects/ とします。

cd /home/betawiki/projects svn co http://svn.mybboard.net/mybb/branches/1.6-stable mybb

設定内容に依りますが、あらかじめ root または別のユーザーとして実行してから、プロジェクト ファイルや設定ファイルの追加を実行するべき場合があります。 translatewiki.net では利用者は「betawiki」であるため、上記のコマンドを実際に実行する際には以下のようになります:

sudo -u betawiki svn co http://svn.mybboard.net/mybb/branches/1.6-stable mybb

次に、メッセージを含むファイル群を見つける必要がありますが、これらは下位ディレクトリ mybb/inc/languages/ で見つかり、英語の原文メッセージはさらにその下位ディレクトリ english/ にあります。

では、プロジェクトの最初のローカライズ ファイルとしてmybb/inc/languages/english/index.lang.phpから開始しましょう。

手順 2: 形式

MediaWikiのインストールディレクトリには src/FileFormatSupport/FileFormatFactory.php 内にファイル形式サポートのクラスがあり、プロジェクトごとにメッセージ群と地域化ファイルを対応付けするために用います。サポートされている形式を理解するには、もう少し掘り下げて読みこむ必要があります。そこで最初は FlatPhp 形式を使用し、PHPファイルとの整合性を試してみることにしました。

こうして対応付けするファイルとその形式のクラスが決まりました。これからグループ設定を書く必要があります。これをYAML(ヤメル、ヤムル)ファイルと呼びます。

インデックス を参照すると、メッセージ群設定 のリンクがあります。では例示された最小のファイルを使い、BASIC節から取り掛かりましょう。

BASIC:
  id: out-freecol
  label: FreeCol (open source game)
  description: "{{int:bw-desc-freecol}}"
  namespace: NS_FREECOL
  class: FileBasedMessageGroup

例文の変数は、単に自分の場合の変数に置き換えます。

BASIC:
  id: out-mybb
  label: MyBB
  description: "[[Translating:MyBB|MyBB]] is a web-based discussion forum software"
  namespace: NS_MYBB
  class: FileBasedMessageGroup

文にはウィキテキストのどの構文も使えます。元のサンプルでは、{{int:message-key}}タグを用いて文を翻訳対象に指定するスマートなコツを示しています。しかしその場合は[[MediaWiki:Message-key]]ページに既定の文を定義しなければなりません。名前空間IDが定数によって追加される点に注意し、カスタム名前空間を使う方法を参照してください。

ここでもう1点必要なのが FILES 節です。説明文書に提示されたサンプルを使います:

FILES:
  format: FlatPhp
  sourcePattern: %GROUPROOT%/inc/languages/messages_%CODE%.properties
  targetPattern: commonist/messages_%CODE%.properties

おや、%CODE% が言語コード、つまり既定では en となっています。この段階ではMyBBが使用するディレクトリ構造を変更しないでおきましょう。代わりにこの目的用に設計された機能code mapを使うことにすると、それぞれの言語に対応するコードをここで扱うプロジェクトの識別子に対応付けすることができます。

その結果、以下のようになります:

FILES:
  format: FlatPhp
  sourcePattern: %GROUPROOT%/mybb/inc/languages/%CODE%/index.lang.php
  targetPattern: mybb/inc/languages/%CODE%/index.lang.php
  codeMap:
    en: english
    "no": norwegian
言語コード no を引用符で囲む必要があることにご注意ください。これは、一部のYAML パーサーがブーリアン型と解釈してしまうのを避けるためです。

基本的に、ここではenというコードは上記の例で%CODE%englishであったように、英語版メッセージファイルのディレクトリを示します。 targetPatternキーはsourcePatternと通常は同一で、ただし接頭辞%GROUPROOT%は付きません。

ここまで来ましたね。ではこのファイルをどこかに保存するわけですが、例えばMyBB.yamlという名前にして、LocalSettings.php の保存先と同じにするか検討します。ファイル全体像は次のとおりです。

BASIC:
  id: out-mybb
  label: MyBB
  description: "[[Translating:MyBB|MyBB]] is a web-based discussion forum software"
  namespace: NS_MYBB
  class: FileBasedMessageGroup

FILES:
  format: FlatPhp
  sourcePattern: %GROUPROOT%/mybb/inc/languages/%CODE%/index.lang.php
  targetPattern: mybb/inc/languages/%CODE%/index.lang.php
  codeMap:
    en: english
    "no": norwegian

次に拡張機能にそのファイルを読ませます。LocalSettings.php に以下の各行を記入します:

$wgTranslateGroupFiles[] = "MyBB.yaml";

これを実行した後、 processMessageChanges.php スクリプトを実行するために Help:Extension:Translate/メッセージ群の保守 の手順に従ってください。

ログインして、利用者に「translate-manage」権限が適切に設定されていることを確認して、[[Special:ManageMessageGroups]] に移動しましょう。

以下のように表示される場合があります:

No valid namespace defined, got NS_MYBB.
Backtrace: <...>

説明文書を注意深く読むことで、MediaWiki に名前空間を登録するために、この例では以下の行を LocalSettings.php に追加する必要があることにお気付きかもしれません:

wfAddNamespace( 1246, 'MyBB' );

この例では 1246 を使用していますが、必要に応じて名前空間番号を自由に指定してください。Translate 拡張機能では、1200-1298 の範囲の偶数の名前空間番号を使用することをお勧めします。

特別ページ ManageMessageGroups を再読み込みすると、以下の行が表示されます:

MyBB This message group has not been imported previously.

MyBB リンクをクリックします。クリックすると、ファイル内にメッセージ一覧が現れます。その結果に問題点がない場合は、「実行」をクリックします。

「実行」をクリックすると、ファイルが処理されて以下のような内容が出力されます:

Imported new version of page MyBB:L\x5b'boardstats'\x5d/en.
Imported new version of page MyBB:L\x5b'new posts'\x5d/en.
Imported new version of page MyBB:L\x5b'no new posts'\x5d/en.
...
Cache rebuild.
All done!

ファイルが非常に大きい場合は、最初に php Translate/scripts/sync-group.php --group=out-mybb --lang=en を実行する必要があります。これは PHP のタイムアウト制限によるもので、ウェブ インターフェイスが一度に取り込めるメッセージ数に上限があるためです。この制限に遭遇した場合は、ページ下部にある、残りのメッセージを取り込むボタンをクリックしてください。

手順 3: 他のファイルの追加

MyBB に、翻訳対象の 2 つめのファイルを追加しましょう。この方法は 2 通りあります:

アプローチ 1: 新しい YAML ファイルの追加

単に、新しい YAML ファイルを追加して新しい名前で保存します。さらにそれを LocalSettings.php 内から呼び出して、上記のすべての手順を実行します。ファイルは以下のようになります:

BASIC:
  id: out-mybb-showthread
  label: MyBB
  description: "[[Translating:MyBB|MyBB]] is a web-based discussion forum software"
  namespace: NS_MYBB
  class: FileBasedMessageGroup

FILES:
  format: FlatPhp
  sourcePattern: %GROUPROOT%/mybb/inc/languages/%CODE%/showthread.lang.php
  targetPattern: mybb/inc/languages/%CODE%/showthread.lang.php
  codeMap:
    en: english
    "no": norwegian

上記の例でお分かりのように、この新しいメッセージ群には異なる ID を使用しなければなりません。

このアプローチは簡単ですが、翻訳単位が大量にある場合には適用できません (つまり、メッセージ群ごとに対応するファイルが必要です)。値の一部を更新する必要が生じた際、これらのファイルすべてを更新する必要があり、大変です。幸運なことに別の方法があるため、以下に示します:

アプローチ 2: テンプレート構文

共通の値をテンプレートに入れるという発想です。各群は足りない値をテンプレートから取得するため、群ごとに同じ記述を繰り返す必要がありません。

MyBB の例に戻りましょう。index.lang.php, showthread.lang.php, global.lang.php を include しましょう。YAML ファイルを以下のように更新する必要があります:

TEMPLATE:
  BASIC:
    description: "[[Translating:MyBB|MyBB]] is a web-based discussion forum software"
    namespace: NS_MYBB
    class: FileBasedMessageGroup

  FILES:
    format: FlatPhp
    codeMap:
      en: english
      "no": norwegian
---
BASIC:
  id: out-mybb-index
  label: MyBB - index page

FILES:
  sourcePattern: %GROUPROOT%/mybb/inc/languages/%CODE%/index.lang.php
  targetPattern: mybb/inc/languages/%CODE%/index.lang.php
---
BASIC:
  id: out-mybb-showthread
  label: MyBB - show thread

FILES:
  sourcePattern: %GROUPROOT%/mybb/inc/languages/%CODE%/showthread.lang.php
  targetPattern: mybb/inc/languages/%CODE%/showthread.lang.php
---
BASIC:
  id: out-mybb-global
  label: MyBB - global messages

FILES:
  sourcePattern: %GROUPROOT%/mybb/inc/languages/%CODE%/global.lang.php
  targetPattern: mybb/inc/languages/%CODE%/global.lang.php
メッセージ群間は前後に空白スペースがない、ダッシュ記号を3つずつ --- 含む行で区分されます。さもなければYAMLファイルは正しく解析されません。

上記の例で明らかなように、codeMap は一度だけ定義されます。ファイルの追加および除去は、上記のファイルの節の追加や削除と同じくらい簡単です。

特別ページ ManageMessageGroups に移動すると項目が表示されるようになりました。以下のような 3 つの項目です:

MyBB global messages: This message group has not been imported previously.
MyBB index page: This message group has not been imported previously.
MyBB show thread: This message group has not been imported previously.

ご自分のプロジェクトに多くのファイルを含める場合、ご自分のYAMLファイルを生成したスクリプトを書きとめておくことは良い案です。 その例はsvn:trunk/translatewiki/StatusNet/genStatusNet-plugins.phpをご参照ください。

手順 4: 集約群

集約群を追加して、その下位群としてメッセージ ファイルを定義することで、以下の 2 つの利点があります:

  • 翻訳者が他のメッセージ群を選ぶなら、特にメンテナンス目的の場合、作業量は減ります。翻訳者は単に集約群を開き、すべてのメッセージ群で更新が必要な部分を訳出したり更新したりすればよいのです。
  • 統計つまり各プロジェクトは集約群レベル、つまりプロジェクト総体で報告ができるものとします。

集約群を定義するには、TEMPLATE 節の直後かつ個別の下位群の定義の前に、以下の節を追加する必要があります:

---
BASIC:
  id: out-mybb-0-all # The id should sort before all the subgroups it has
  label: MyBB
  meta: yes
  class: AggregateMessageGroup # Not taken from template

GROUPS:
  - out-mybb-* # We could specify them one by one, but wildcard is easier

これでかなり分かりやすくなりますが、あと一段階不足しています。この時点で、Special:Translate に移動すると、MyBB 親群が表示されます (実は正しく動作します!) が、下位群も別の群として列挙されています。

これが修正方法です。LocalSettings.php に以下の行を追加します:

$wgTranslateGroupStructure['/^out-mybb/'] = array( 'mybb' );
 
展開した集約群 (折りたたんだところはこちら)

これで、指定したパターンに該当する ID を持つ群をすべて取得でき、最初の群を表示してその下のすべてを非表示にします。少し見苦しいですが正しく動作しています。集約群を別の集約群の一部にすることはできますが、この construction が対応しているのは 2 階層のみです。

[[Special:Translate]] に移動すると親群 MyBB のみが表示されるようになりました。さらに、リンク「3 下位群を表示」が表示されます。これをクリックすると下位群の名前が表示されます。

この文書では言及しなかった TAGS やその他の節についてマニュアルで確認してください。

手順 5: クリーンアップ

translatewiki.net が対応しているプロジェクトの YAML ファイルは、Git translatewiki リポジトリにコミットされています。

translatewiki.net では、LocalSettings.php の行は実際には TranslateSettings.php にあります。 translatewiki.net 上のサンドボックスウィキには TranslateSettings.php ファイルがない、というのがすべてを LocalSettings.php に追加した理由です。