WMLxGettext2.0_forPOT

Last-modified: 2023-06-25 (日) 22:43:37

WMLxGettext 2.x エンドユーザー向けドキュメント
 WMLxGettext 2.x Documentation for End-Users


[前書]
このドキュメントは、著者(Nobunさん)の許可を得て、ドキュメントサイト WMLxGettext 2.x の中の End-User documentation を簡単に翻訳したものです。PDFファイルはWMLxGettext Documentationに公開されています。
 ここで解説しているPython版wmlxgettext スクリプトは、"The Battle for Wesnoth" に付属するファイルと同じもので、新たにインストールする必要はありません。
 なお、このドキュメントは、2022年2月時点で配布されている WMLxGettext のバージョンよりも多少古いそうです(著者談)。若干の差異があるそうなので、そこら辺はご勘弁ください。個人的には基本的機能は問題なく使えることを確認しています。でも、いつかドキュメントが更新されるといいなぁ、と期待はしてます。
 [注意:Wesnoth本体に付属する上記の wmlxgettext は、v1.16.x以降 も更新が続いています。最新のものを使用しましょう。]

Windows環境も意識して作られており、Python3(Python ver.3.xx)をインストールすれば実行可能です。Python3 はMicrosoft Store でも入手可能で、通常のアプリと同様のインストール手順だけで、すぐに使用可能になります。

 - - - * * * - - - 
 

contents index




WMLxGettext 2.x エンドユーザー向けドキュメント
WMLxGettext 2.x Documentation for End-Users

(original English version © Copyright 2016, Nobun. Revision 8c214fd7. )



wmlxgettext は python 3.x でゼロから書き直した新しいリリースです。wmlxgettext は .cfg (WML) と .lua ファイルのリストをスキャンし、ファイル内で見つかった翻訳可能な文字列をすべてキャプチャして .pot (.po) ファイルを作成する python 3 スクリプトです。
以下、(古い)pelr版を "wmlxgettext 1.0"と、新python3版を "wmlxgettext 2.x" と書きます。

  • 1. WML/Luaファイルでサポートされているオプション
    • 1.1. #textdomain <new_current_domain>
    • 1.2. # wmlxgettext: <WML_CODE>
    • 1.3. # po: <addedinfo>
    • 1.4. # po-override <override-info>
    • 1.5. Luaコードでのドメイン変更
    • 1.6. Luaに関する特別なコメント
  • 2. wmlxgettext: 実行方法
    • 2.1. wmlxgettextと暗黙のファイルリスト
    • 2.2. wmlxgettextと明示的ファイルリスト
    • 2.3. wmlxgettextと明示的ファイルリストと出力リダイレクト
    • 2.4. オプションパラメータ
  • 3. perl版とpython版の比較
    • 3.1. エラー/警告メッセージがより理解しやすくなっています
    • 3.2. 翻訳者用追加コメントは適切なセンテンスのみに追加されます

1. WML/Luaファイルでサポートされているオプション

アドオンを作成する際、複数の言語で翻訳されたものを見たい場合があります。その場合、独自の .po ファイルを作成する必要があります。この短いページは、あなたがすでに WML ファイルの書き方を知っていることを前提としています (Official WML Reference も参照してください)。

ここでは、wmlxgettext の上手な使い方に役立つ、いくつかの追加情報を提供します。

Note: 1.1~1.4はWMLのコードについて、1.5と1.6はLuaのコードについて説明します。

1.1. #textdomain <new_current_domain>.

wesnothアドオンには、必ず textdomain(テキストドメイン)が必要です。textdomain は _main.cfg ファイルで定義されます。

[textdomain]
   name="wesnoth-xyz"
   path="data/add-ons/xyz/translations"
[/textdomain]

Note: xyzは何でもかまいません。ここでは一例してxyzを使用しています。

ただ、wmlxgettextにとって実際に重要なのは、すべてのアドオンファイルの中に次の行が明示されていることです。

#textdomain wesnoth-xyz

 これは、current_domainを変更します。これは便利で、wmlxgettextは正しいtextdomain以降の文章だけを取り込みます(textdomain以降の文章だけを取り込めるため、望んでいない文章は避けることができます)。

1.2. # wmlxgettext: <WML_CODE>

WMLコアファイル上で定義されたABILITY_FEEDINGマクロのように、アンバランス・タグを使用するマクロ定義を宣言する必要がある場合があります。

#define ABILITY_FEEDING
# comment omissed
[dummy]
    id=feeding
    name= _ "feeding"
    female_name= _ "female^feeding"
    description=_ " (description omissed)"
[/dummy]
# wmlxgettext: [abilities]
[/abilities]

 この例では、終了タグ [/abilities] があり、開始タグ [abilities] がないため、タグがアンバランスなマクロを表示しています。
 通常、アンバランス・タグに遭遇した場合、wmlxgettextはエラーを返しますが、今回は意図的にアンバランス・タグを使用しています。そこで、特別なコメント # wmlxgettext: <WML_CODE> が役に立ちます。

 上の例に戻ると、 # wmlxgettext: [abilties] というコメントは WML コードでは無視されます(そのため、WMLコードは意図通り、アンバランス・タグとして扱われます)。 しかし、wmlxgettext は # wmlxgettext: という特殊コメントがあるため、 [abilities] を実際の開始タグと解釈します。

 このように、wmlxgettext は # wmlxgettext: [abilities] を読み込むと [abilities] タグを開き、[/abilities] タグを見つけると正常に閉じます。

1.3. # po: <addedinfo>

もう一つの特別なコメント(実際のWMLコード上では無意味でも、wmlxgettextの目的として有用)は # po: です。ここでは、そのフェイクの例を示します。

# po: The speaker is still unknown for the player, but he is a male
[message]
   speaker=unknown_speaker
   message= _ "(翻訳可能なメッセージ)"
[/message]

特別なコメント# po:は、次のような翻訳者情報を追加します。これは、potファイルに表示されるコメントです。

[message]: speaker=unknown_speaker
# The speaker is still unknown for the player, but he is a male

翻訳者に表示される最初の行は、wmlxgettext(標準ヘルプメッセージ)によって自動生成されたものです。

翻訳者に表示される2行目は、特別なコメント# po:の後に入力されたものです。

1.4. # po-override: <override-info>

# po-override: は、先に説明した# po:と同様の特殊コメントです。

# po-override: [message]: speaker=FinalBoss
[message]
   speaker=unknown_speaker
   message= _ "translatable message"
[/message]

 今度は、特別なコメント# po-override:が、翻訳者へのデフォルト(自動生成の)メッセージに置き換わります。これは、実際には翻訳者が見ることになるコメントです。

[message]: speaker=FinalBoss

 この文字列は、デフォルトの文字列の代わりに表示されます(この例では、オーバーライドされたデフォルトのメッセージは[message]: speaker=unknown_speakerですが、# po-override:で置き換えられるので、実際には表示されません)。

Note: # po:とは異なり、# po-override:が使用できるのは1つの文章(sentence)には1回だけです。ただし、1つ以上の # po:と 1つの # po-override:を一緒に使うことは可能です。

1.5. Luaのコードでドメインを変更する

Luaでの現在のドメイン値の変更方法は、WMLでの場合とは全く違います。

  • WMLでは、#textdomainディレクティブを使用して現在のドメイン値を変更します。
  • Luaのコードでは、代わりに次のコードを使って、同じ動作をまったく異なる方法で行います。
local _ = wesnoth.textdomain('wesnoth-xyz')

Note: xyzは何でもかまいません。ここでは一例としてxyzを使用しています。

上記の例では、Lua コードで現在のドメイン値をwesnoth-xyzに変更しています。

1.6. Luaの特殊コメント

luaのコードでは、翻訳可能な文字列の前に、追加または置換された情報を必要とする、特別なコメントを使用することもできます。

  • -- # po: <additional info for translator>
  • -- # po-override: <info that overrides the default info>

Note: また、-- # po:-- # po-override: の代わりに、-- po:-- po-override: を使用することもできます。どちらの形式も使用できます。

 これらの特別なコメントは、WMLのコードでサポートされている # po:# po-override: と同じように動作します(1.3と1.4を参照)。

Note: その代わりに、WMLの特別なコメント # wmlxgettext:は lua のコードではサポートされていません
(これは、WMLのコードで意図的にアンバランス・タグとしてある場合のエラー回避に必要なものであって、Lua では不要だからです。Lua は手続き型言語であり、タグ型言語ではないのです)。




2. wmlxgettext: 実行方法

前章では、WMLとLuaファイルの正しい書き方について説明しました。

  • アンバランス・タグを使用する必要がある場合、WMLコードに# wmlxgettext:という特殊なコメントを付けて、不要なエラーを回避する
  • 特別なコメント # po:} と &color(#f33,#dee){# po-override を使って、翻訳者に表示されるメッセージ情報をカスタマイズする
  • #textdomain ディレクティブの使い方を忘れない

要するに、すべての .cfg と .lua ファイルは wmlxgettext によって解析される準備が整っていると考えてよいでしょう。しかし、どのように wmlxgettext を実行するのでしょうか。

wmlxgettext はコマンドラインオプションを使って呼び出す必要があります (wesnoth GUI ツールに含まれる場合を除く。その場合は GUI を代わりに使用することができます)。

wmlxgettext 1.0 (Perl版) とは異なり、このバージョンは3つの方法で使用することが可能です。以下、最も推奨されるものから説明が始まり、推奨されないもので終了します。

最後の段落では、前の段落で説明した3つの使い方のいずれでも使用できるオプションのパラメータを説明します。

 

2.1. wmlxgettext と暗黙のファイルリスト

Note: Windowsで100%動作するのはこの方法だけです。

wmlxgettext で解析するファイルを明示的に指定する必要はありません。これはWindowsでできる方法です。

c:\<pythondir>\python wmlxgettext --domain=DOMAIN_NAME --directory=YOUR_ADDON_DIRECTORY --recursive -o ./FILENAME.po

(訳者注:通常はパスの通る場所に実行ファイルを置くので、先頭にpythonのフルパスを書くことはありません。)

linux/macでは、シンプルに使用できます。

./wmlxgettext --domain=DOMAIN_NAME --directory=YOUR_ADDON_DIRECTORY --recursive -o ./FILENAME.po

Python 3.x インタープリタを明示的に呼び出す必要はありません。

2.1.1. --domain=DOMAIN_NAME

オプション --domain を指定すると、wmlxgettext は wesnoth アドオンで使用される # textdomain を知ることができます。例えば、_main.cfg に以下のような記述がある場合です。

[textdomain]
  name="wesnoth-xyz"
  path="data/add-ons/xyz/translations"
[/textdomain]

これを -domain パラメータに記述するのです。

 --domain=wesnoth-xyz


2.1.2. --directory=ADDON_DIRECTORY

オプション --directory をつけると、 wmlxgettext は検索対象となるファイル/ディレクトリのパスを知ることができます。以下は、Windows 用の仮想的な例です。

 --directory=c:\games\wesnoth\userdata\data\add-ons\YOUR_ADDON_DIRECTORY


2.1.3. --recursive

--recursive オプションを指定すると、--directory オプションで指定したディレクトリを再帰的にスキャンして、すべての.cfgと.luaファイルを自動的に収集します。

./wmlxgettext --domain=domain_name --directory=/home/user/games/wesnoth/userdata/add-ons/Invasion_from_the_Unknown --recursive -o ./file.po

上記の例では、wmlxgettext はディレクトリの

/home/user/games/wesnoth/userdata/add-ons/Invasion_from_the_Unknown

をチェックし、そのディレクトリ(およびサブディレクトリ)内のすべての .cfg と .lua ファイルを再帰的に収集します。

2.1.4. -o [OUTPUT_FILE]

このオプションを使うと wmlxgettext は、作成した .po ファイルを [OUTPUT_FILE] で指定した名前で保存します。

-o オプションは、以下のものを受け付けます。

  • 絶対パスで指定したファイル名
  • または相対パスによるファイル名(例:./output.po)
  • または、"-"(wmlxgettext -o - ...)にセットして標準出力に書き出すこともできます。

また,--directory には,絶対パスと現在の作業ディレクトリからの相対パスの両方が指定できます
(例: --directory=. は,--directory オプションに現在の作業ディレクトリのパスが指定されます)。

2.2. wmlxgettextと明示的ファイルリスト

Note: この方法は、列挙するファイル名の文字列( = ファイルリスト)があまり長くない場合にのみ、Windows上で動作します(Windowsはあまり長いコマンドラインを読み取ることができません)。Windows環境では、前の段落で説明した方法wmlxgettext と暗黙のファイルリスト)を使うことが強く推奨されます。
(訳者注:Windows7以降、コマンドプロンプトで使用できる文字列の最大長は8191文字です。)

wmlxgettext に仕事を任せる代わりに、 wmlxgettext に解析させたいファイルの完全なリストを、あなた自身の手で明示的に指定することができます。

./wmlxgettext --domain=domain_name --directory=/home/user/wesnoth/userdata/add-ons -o ./file.po Invasion_from_the_Unknown/_main.cfg Invasion_from_the_Unknown/other.cfg [...]

この例のように、ファイル名の列挙文字列は他のすべてのオプションの後に置くことが強く推奨されます。このため、この例では、ファイルリストを列挙する前に -o ./file.po というオプションが書かれています。
リストで指定されたファイルは、--directory ディレクトリを起点とする相対パスで記述されなければなりません。

もう一度、上の例を見てみましょう。

  • --directory/home/user/wesnoth/userdata/add-ons です。
  • ファイル n.1 は Invasion_from_the_Unknown/_main.cfg です。
  • ファイル n.2 は Invasion_from_the_Unknown/other.cfg です。

つまり、この2つのファイルが検索・解析されることになります。

  • /home/user/wesnoth/userdata/add-ons/Invasion_from_the_Unknown/_main.cfg
  • /home/user/wesnoth/userdata/add-ons/Invasion_from_the_Unknown/other.cfg

Note: 解析するファイルのリストを明示的に指定したい場合は、--recursive オプションを使用しないでください。もし --recursive オプションが使われた場合、ファイルのリストを明示的に指定しても無視されます。

2.3. wmlxgettextと明示的なファイルリストと出力リダイレクト

出力リダイレクトは問題を引き起こす可能性があるため、これはwmlxgettextを使用するための推奨されない方法です。標準出力(strout)に書き込む場合、実際、コンソールは期待できるUTF-8コードの代わりに、独自の文字コード(システムの規定コード)を使用します。

このため、バージョン 2017.06.25.py3 からは -o パラメータが必須となり、カジュアルな使い方で標準出力に出力することを抑制しています。そのため、wmlxgettext 1.x (perl版)で使われていた古い構文はもうサポートされません。

そのため、以下のような wmlxgettext の呼び出しはもうできません。

./wmlxgettext --domain=domain_name --directory=/home/user/wesnoth/userdata/add-ons Invasion_from_the_Unknown/_main.cfg Invasion_from_the_Unknown/other.cfg [...] > ./file.po

しかし、本当に必要であれば、実際のファイルを書く代わりに標準出力に出力することも可能です。

./wmlxgettext -o - --domain=domain_name --directory=/home/user/wesnoth/userdata/add-ons Invasion_from_the_Unknown/_main.cfg Invasion_from_the_Unknown/other.cfg [...] | Application_accepting_wmlxgettext_stout_as_input_pipe

もし、-oパラメータに特別な値"-"を使用した場合(上記のように)、出力は望みどおり標準出力に出力されます。

この方法での標準出力への出力は、明示的に要求された場合のみ、かつ、実際にユーザが意図的に要求した場合のみ可能となります。

もちろん、ファイルを標準出力に出力し、その出力をファイルにリダイレクトすることも可能ですが、これは全く推奨されません。標準的な使用例(wesnothアドオン用のpotファイルの作成)では、2段落前に説明した方法1を使用することを検討すべきです。

./wmlxgettext --domain=DOMAIN_NAME --directory=YOUR_ADDON_DIRECTORY --recursive -o ./FILENAME.po


2.4. オプションパラメータ

wmlxgettext 2.0は、前の段落で説明しなかった他のオプションパラメータもサポートしています。

  • --warnall: wmlxgettext は任意の警告を表示します。
  • --fuzzy: .po ファイルに格納されている全ての文章を fuzzy としてマークします。(デフォルトでは fuzzy としてマークされません)。
  • --package-version:パッケージのバージョン番号を .po のヘッダ情報に自動付加します。通常、この情報は手動で追加することになるので、機能というよりは「イースターエッグ」的なものです。
    ^--no-text-colors:警告やエラーメッセージが発生したときにコンソールに表示される色を無効にすることができます。このオプションは wmlxgettext が wesnoth ツール用の python GUI に追加される場合に有用です (wmlxgettext が GUI から起動されたときに「色を塗る」ために必要なコードは実行されない必要があります)。

最後に、エンドユーザが決して使ってはいけないオプションがあります。

^--initialdomain=INIT_DOMAIN:.cfg/.lua ファイルに #textdomain がない場合に、現在のドメインの名前を指定します。デフォルトでは wesnoth となっています(変更する必要はありません)。



3. perl版とpython版の比較

wmlxgettext 2.x (このバージョン) は wmlxgettext 1.0 (古い perl スクリプト) と比較して、以下の長所があります。

  • より柔軟なコマンドライン(ただし、旧来のものもサポートされています。)
  • エンドユーザーへの警告/エラーメッセージがより明確(より理解しやすい)
  • 翻訳可能な文字列の中にWMLマクロがある場合、警告メッセージを表示可(WMLマクロがある翻訳可能な文字列は、決して翻訳されない)
  • luaのブラケット付き文字列を認識し、キャプチャします。
  • .luaファイル上でキャプチャされた文字列は、そのコードの正しい行に報告されます。
  • 翻訳者向けの追加コメントは、本来表示されるべきでない箇所への表示を回避して、正しい位置に追加されます。
  • ファイル参照はすべて一行で記述されます(.po ファイルで期待されるような)。
  • Windowsでも使用可能(python3.xが必要)
  • パース対象のファイルを全て列挙することは強制されず、代わりに新しい --recursive オプションを使うことで、wmlxgettext は以下に含まれる全ての .lua .cfg ファイルを再帰的に見つけ出します。
  • python GUI に追加することができます (他の全ての wesnoth ツールで使用可能)。
  • コードはより複雑で長くなっていますが、よりモジュール化されており、より簡単な方法で修正/変更/フォークすることができます。
  • wmlxgettext 2.xのソースは、ソースコードドキュメンテーション( Source Code Documentation)で、非常に深く掘り下げて文書化されています。
  • もうひとつのカスタムディレクティブ "# po-override:" をサポート。"# po-override:" は、WML/Lua の自動的な情報リストを上書きし、あなた独自のメッセージに置き換えることができます。 "# po:" ディレクティブは、自動生成された WML/Lua の情報リストに手を加えることなく、翻訳者に向けた情報を追加することができるため、まだ利用可能です。"# po:" と "# po-override:" ディレクティブは、同じ翻訳可能な文字列で同時に使用することができます。ただし、"#po-override:" は翻訳可能な文字列に対して1回だけ定義することができます。

しかし、短所もあります。

  • Perl版は300-400行のコードであるのに対し、より巨大なコード(複数のファイルに分割された約1400行のコード)になっている。
  • 実行速度が少し遅くなる。
  • wmlxgettext 2.x が作成する出力は wmlxgettext 1.0 が作成する出力と全く同じではありません (非常に小さな違いですが、本当に重要なものはありません)。

次の節では、この書き換えられたバージョンの wmlxgettext (2.x) と古いバージョンの wmlxgettext (1.0) の上記の違い (結果の .po ファイルに影響を与える最も重要なもののみ) のいくつかを詳細に紹介します。

3.1. エラー/警告メッセージが理解しやすくなっています

wmlxgettext 2.xで表示されるすべてのタイプのエラーメッセージは、 perl wmlxgettext (1.0) で表示されるエラーメッセージとは異なり、明確で直感的なものです。ここでは、perl wmlxgettext (1.0) と python wmlxgettext (2.x) でアンバランス・タグを見つけたときの例だけを示します。
このWMLファイル(ztest.cfg)を使用します。

#textdomain wesnoth-mytest

# WML with unbalanced tag [scenario] ---> parsing this file will return an error

[scenario]

id=my_scenario

見てのとおり [scenario] タグが閉じられていないので、 perl wmlxgettext (1.0) と python wmlxgettext (2.x) の両方がエラーを返します。以下は、perl wmlxgettext (1.0)が表示するエラーメッセージです。

non-empty node stack at end of ztest.cfg at ./wmlxgettext line 203, <FILE> line 5.

WML seems invalid for ztest.cfg, node info extraction forfeited past the error point at ./wmlxgettext line 210.

(訳者注:以下は和訳ですが、残念ながらエラーメッセージは英文のみ。以下同様。)

./wmlxgettext ztest.cfg の最後、203 行目 <FILE> 5 行目に、空でないノードスタック。

WMLはztest.cfgに対して無効のようです。ノード情報の抽出は./wmlxgettextの210行目でエラーポイントを過ぎて中止されました。)

一方、python wmlxgettext (2.x) が表示する最もユーザーフレンドリーなエラーメッセージを紹介します。

error: ztest.cfg:5: End of WML file reached, but some tags were not properly closed.
(nearest unclosed tag is: [scenario])

(以下は和訳)

:error: ztest.cfg:5: WML ファイルの最後に到達しましたが、いくつかのタグが適切に閉じられていません。

(最も近いタグは、[scenario]です。)


3.2. 翻訳者用追加コメントは適切なセンテンスのみに追加されます

翻訳者用の追加コメントは、特定の文章をより良く翻訳するために有用な追加情報です。ここでは、メインラインのキャンペーン Liberty の _main.cfg ファイルを分析します(22 行目から 27 行目に注目してください)。

 1  #textdomain wesnoth-l
 2  # This version forked from 1.2, 2/10/2007, and prepared for mainline by ESR
 3  [textdomain]
 4     name="wesnoth-l"
 5  [/textdomain]
 6
 7  # wmlscope: set export=no
 8  [campaign]
 9    id=Liberty
10    name= _ "Liberty"
11    abbrev= _ "Liberty"
12    rank=110
13    first_scenario=01_The_Raid
14    define=CAMPAIGN_LIBERTY
15    icon="units/human-outlaws/fugitive.png~RC(magenta>red)"
16    image="data/campaigns/Liberty/images/campaign_image.png"
17
18    {CAMPAIGN_DIFFICULTY EASY   "units/human-peasants/peasant.png~RC(magenta>red)" ( _ "Peasant") ( _ "Easy")} {DEFAULT_DIFFICULTY}
19    {CAMPAIGN_DIFFICULTY NORMAL "units/human-outlaws/outlaw.png~RC(magenta>red)" ( _ "Outlaw") ( _ "Normal")}
20    {CAMPAIGN_DIFFICULTY HARD   "units/human-outlaws/fugitive.png~RC(magenta>red)" ( _ "Fugitive") ( _ "Difficult")}
21
22    #po: Yes, that is "marchlanders", not "marshlanders".
23    #po: "marchlander" is archaic English for an inhabitant of a border region.
24    # wmllint: local spelling marchlanders
25    description= _ "As the shadow of civil war lengthens across Wesnoth, a band of hardy marchlanders revolts against the tyranny of Queen Asheviere. To win their way to freedom, they must defeat n ot just the trained blades of Wesnothian troops but darker foes including orcs and undead.
26
27  " + _"(Intermediate level, 8 scenarios.)"
28
29    [about]
30        title = _ "Campaign Design"
31        [entry]
32            name = "Scott Klempner"
33        [/entry]
34    [/about]
35    [about]
36        title = _ "Prose-doctoring and preparation for mainline"
37        [entry]
38            name = "Eric S. Raymond (ESR)"
39        [/entry]
40    [/about]
41    [about]
42        title = _ "Campaign Maintenance"
43        [entry]
44            name = "Eric S. Raymond (ESR)"
45            comment = "current maintainer"
46        [/entry]
47        [entry]
48            name = "Lari Nieminen (zookeeper)"
49            comment = "current maintainer"
50        [/entry]
51    [/about]
52    [about]
53        title = _ "Artwork and Graphics Design"
54        [entry]
55            name = "Brendan Sellner"
56        [/entry]
57        [entry]
58            name = "Kathrin Polikeit (Kitty)"
59            comment = "portraits"
60        [/entry]
61        [entry]
62            name = "Shadow"
63        [/entry]
64        [entry]
65            name = "Blarumyrran"
66            comment = "story images, Rogue Mage line sprites"
67        [/entry]
68        [entry]
69            name = "Sonny T Yamada (SkyOne)"
70            comment = "Sprite animations (defense and attack) of Rogue Mage line"
71        [/entry]
72    [/about]
73  [/campaign]
74
75  #ifdef CAMPAIGN_LIBERTY
76
77  [binary_path]
78     path=data/campaigns/Liberty
79  [/binary_path]
80
81  {campaigns/Liberty/utils}
82  {campaigns/Liberty/scenarios}
83
84  [+units]
85      {campaigns/Liberty/units}
86  [/units]
87
88  #endif
89
90  # wmllint: directory spelling Grey Relana Helicrom Fal Khag

ご覧のように、22行目と23行目に "# po:" があり、"marchlanders "という単語の使い方について、翻訳者のための追加情報を付加しています。これは、キャンペーンの説明で実際に "marchlanders "という単語が使われている文に関連した説明です。
 つまり、この場合、説明の文字列のところだけに追加されることになります。

"As the shadow of civil war lengthens across Wesnoth, a band of hardy marchlanders revolts against the tyranny of Queen Asheviere. To win their way to freedom, they must defeat not just the trained blades of Wesnothian troops but darker foes including orcs and undead."
(和訳)
"Wesnothに内戦の影が長く続く中、Asheviere女王の専制政治に反旗を翻す、たくましい行軍の一団がいた。自由への道を勝ち取るために、彼らはWesnoth軍の鍛えられた刃だけでなく、オークやアンデッドを含む闇の敵も倒さなければならないのだ。"

さて...perl wmlxgettext (1.0) は、ここで示したように、あまりにも多くの追加情報を付加します。

 1  #. [campaign]: id=Liberty
 2  #. Yes, that is "marchlanders", not "marshlanders".
 3  #. "marchlander" is archaic English for an inhabitant of a border region.
 4  #. Yes, that is "marchlanders", not "marshlanders".
 5  #. "marchlander" is archaic English for an inhabitant of a border region.
 6  #: _main.cfg:10 _main.cfg:11
 7  msgid "Liberty"
 8  msgstr ""
 9
10  #. [campaign]: id=Liberty
11  #. Yes, that is "marchlanders", not "marshlanders".
12  #. "marchlander" is archaic English for an inhabitant of a border region.
13  #: _main.cfg:18
14  msgid "Easy"
15  msgstr ""
16
17  #. [campaign]: id=Liberty
18  #. Yes, that is "marchlanders", not "marshlanders".
19  #. "marchlander" is archaic English for an inhabitant of a border region.
20  #: _main.cfg:18
21  msgid "Peasant"
22  msgstr ""
23
24  #. [campaign]: id=Liberty
25  #. Yes, that is "marchlanders", not "marshlanders".
26  #. "marchlander" is archaic English for an inhabitant of a border region.
27  #: _main.cfg:19
28  msgid "Normal"
29  msgstr ""
30
31  #. [campaign]: id=Liberty
32  #. Yes, that is "marchlanders", not "marshlanders".
33  #. "marchlander" is archaic English for an inhabitant of a border region.
34  #: _main.cfg:19
35  msgid "Outlaw"
36  msgstr ""
37
38  #. [campaign]: id=Liberty
39  #. Yes, that is "marchlanders", not "marshlanders".
40  #. "marchlander" is archaic English for an inhabitant of a border region.
41  #: _main.cfg:20
42  msgid "Fugitive"
43  msgstr ""
44
45  #. [campaign]: id=Liberty
46  #. Yes, that is "marchlanders", not "marshlanders".
47  #. "marchlander" is archaic English for an inhabitant of a border region.
48  #: _main.cfg:20
49  msgid "Difficult"
50  msgstr ""
51
52  #. [campaign]: id=Liberty
53  #. Yes, that is "marchlanders", not "marshlanders".
54  #. "marchlander" is archaic English for an inhabitant of a border region.
55  #: _main.cfg:25
56  msgid ""
57  "As the shadow of civil war lengthens across Wesnoth, a band of hardy marchlanders revolts against the tyranny of Queen Asheviere. To win their way to freedom, they must defeat not just the train ed blades of Wesnothian troops but darker foes including orcs and undead.\n"
58  "\n"
59  ""
60  msgstr ""
61
62  #. [campaign]: id=Liberty
63  #. Yes, that is "marchlanders", not "marshlanders".
64  #. "marchlander" is archaic English for an inhabitant of a border region.
65  #: _main.cfg:27
66  msgid "(Intermediate level, 8 scenarios.)"
67  msgstr ""

perl wmlxgettext は追加情報を適切な箇所([line: 52-59]: 追加情報が付加されるべき唯一の箇所 )だけでなく、意味のない箇所、例えば msgid "Difficult" (where the detail about the usage of "marchlanders" word is useless) にも追加情報を出力しています。
 この機能は、python wmlxgettext (2.x) で正しく動作します。

 1  #. [campaign]: id=Liberty
 2  #: _main.cfg:10
 3  #: _main.cfg:11
 4  msgid "Liberty"
 5  msgstr ""
 6
 7  #. [campaign]: id=Liberty
 8  #: _main.cfg:18
 9  msgid "Peasant"
10  msgstr ""
11
12  #. [campaign]: id=Liberty
13  #: _main.cfg:18
14  msgid "Easy"
15  msgstr ""
16
17  #. [campaign]: id=Liberty
18  #: _main.cfg:19
19  msgid "Outlaw"
20  msgstr ""
21
22  #. [campaign]: id=Liberty
23  #: _main.cfg:19
24  msgid "Normal"
25  msgstr ""
26
27  #. [campaign]: id=Liberty
28  #: _main.cfg:20
29  msgid "Fugitive"
30  msgstr ""
31
32  #. [campaign]: id=Liberty
33  #: _main.cfg:20
34  msgid "Difficult"
35  msgstr ""
36
37  #. [campaign]: id=Liberty
38  #. Yes, that is "marchlanders", not "marshlanders".
39  #. "marchlander" is archaic English for an inhabitant of a border region.
40  #: _main.cfg:25
41  msgid ""
42  "As the shadow of civil war lengthens across Wesnoth, a band of hardy marchlanders revolts against the tyranny of Queen Asheviere. To win their way to freedom, they must defeat not just the trained blades of Wesnothian troops but darker foes including orcs and undead.\n"
43  "\n"
44  ""
45  msgstr ""
46
47  #. [campaign]: id=Liberty
48  #: _main.cfg:27
49  msgid "(Intermediate level, 8 scenarios.)"
50  msgstr ""

このように、今回は格納されることが予想される場合のみ(「marchlanders」という単語が使われている文の上)、付加情報が追加されています。



 - - - - お疲れさまでした - - - - :)