Help:Extension:Translate/メッセージ群の設定例
このチュートリアルの対象は開発者と経験の長い翻訳管理者です。 ソフトウェアのインターフェイス メッセージ翻訳用に設定ファイルを新設する方法について、実践的な面を細かく解説します。 これは単体ではなく メッセージ群の設定のリファレンスマニュアル と共に使用するものであり、このチュートリアルをすべて読んだ後に質問があれば Translate 拡張機能の開発者が喜んで助力します。
必須条件
- MediaWiki をインストール
- 翻訳拡張機能をインストール し
- 拡張機能の設定を構成 。
このチュートリアルは、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
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
---
含む行で区分されます。さもなければ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
に追加した理由です。