Internationalisation/ja
From MediaWiki.org
このページではMediaWiki's 国際化( internationalization ) (I18N) システムの技術的な説明を行います。
Contents |
[edit] コードの構造
最初に、Language.phpにLanguageオブジェクトがあります。このオブジェクトは、別の重要な言語特有の設定とカスタムの振る舞いと同様にローカライズ可能なすべてのメッセージ文字列を含みます。 (大文字にする・小文字にする・日付を出力する、数字をフォーマットする、など。)
オブジェクトは2つのソースからコンストラクトされます: それ自身(クラス)のサブクラス化されたバージョンとMessageファイル(メッセージ)からです。
MediaWiki名前空間を通してテキストの入力を取り扱うMessageCacheクラスもあります。 GlobalFunctions.phpにwfMsg*()関数があります。GlobalFunctions.phpで大規模なメッセージ取得コードがあります。
[edit] 一般的な利用
Language::factory()関数を呼び出すことでlanguageオブジェクトをロードします。この関数はオブジェクトに対するクラスファイルを返し(フォールバックlanguageオブジェクトを使用することでフォールバック言語を考慮しますがlanguageキーをオーバーロードします)そのオブジェクトを返します。それ以外は何も起きません。
message/etcがリクエストされたとき、lazy load initializorが呼び出されます。実際の動作が始まります。最初に言語がキャッシュされていないシナリオを選びます。システムは次のコードによってMessagesファイルをロードします:
require( $filename ); $cache = compact( self::$mLocalisationKeys );
...self::$mLocalisationKeysはローカライゼーションファイルで利用可能な変数の名前です。次のように使います:
$fallback = false; $rtl = false;
...簡単にそれらを配列に流し込みます。
それから、メッセージにあるギャップを埋めるために$fallback言語(設定されていない場合、英語)をロードします。マージ可能なマップ、リストもしくはエイリアスといったリストになることが出来る、あるキーに対して特化した振る舞いがあります。
[edit] キャッシング
MediaWikiはいくぶんかコードの理解を難しくする組み込みのキャッシングメカニズムをたくさん持っています。どのローディングを行う前に、MediaWikiは我々がレイジーであるかどうかを見るために次の場所を確認します:
- $mLocalisationCache[$code] - just a variable where it may have been stashed.
- serialized/$code.ser - コンパイルされシリアライズされた言語ファイル。
- Memcachedバージョンのファイル(期限切れの確認付き)。
期限切れの確認はキャッシュされたコピーを搭載するものとマッチするfilemtime()を持つすべての依存関係を確認することによって構成されます。似たような確認はシリアライズされたバージョンのために実装され、あたかもそれらは手作業で再コンパイルされるまで更新されないようです。しかしながら、手作業の再コンパイルモデルは恐らく近いうちに削除されます。サイト管理者にとって不便だからです。キャッシングは、特に依存関係の確認を追加するときに、より万能です。唯一の問題はウェブサーバによって読み込みが速く書き込み可能であるデータストアを持つ必要があることです。そのようなストアは常に利用可能ではありません。
[edit] 振る舞い
次の内容がローカライズ可能です:
- Weekdays (and abbrev)
- Months (and abbrev)
- Bookstores
- Skin names
- Math names
- Date preferences
- Date format
- Default date format
- Date preference migration map
- Default user option overrides
- Language names
- Timezones
- Character encoding conversion via iconv
- UpperLowerCase first (needs casemaps for some)
- UpperLowerCase
- Uppercase words
- Uppercase word breaks
- Case folding
- Strip punctuation for MySQL search
- Get first character
- Alternate encoding
- Recoding for edit (and then recode input)
- RTL
- Direction mark character depending on RTL
- Arrow depending on RTL
- Languages where italics cannot be used
- Number formatting (commafy, transform digits, transform separators)
- Truncate (multibyte)
- Grammar conversions for inflected languages
- Plural transformations
- Formatting expiry times
- Segmenting for diffs (Chinese)
- Convert to variants of language
- Language specific user preference options
- Link trails, e.g.: [[foo]]bar
- Language code (RFC 3066)
素晴らしい機能:
- I18N sprintfDate
- Roman numeral formatting
[edit] パラメータの置き換え
MediaWikiは製品をよりよく見せる複数形をサポートします。例です:
'undelete_short' => 'Undelete {{PLURAL:$1|one edit|$1 edits}}',
言語特有のPLURALの実装です: LanguageFr.php (フランス語、コードはfr) もしくは LanguageCs.php (チェコ語、コードはcs)といったページで見つかります。
膠着語の文法的翻訳も利用可能です。例えばフィンランド語では、言語ファイルをサイト依存にすること、すなわちWikipediaのリファレンスを削除することが絶対に不可欠でした。フィンランド語では、"about Wikipedia"は"Tietoja Wikipediasta"になり、"you can upload it to Wikipedia"は"Voit tallentaa tiedoston Wikipediaan"になります。追加された接頭辞は単語の使われ方とベースへの微少な修正に依存しています。例外の長いリストがありますが、サイト名といったわずかな単語のみが翻訳される必要があるので、それを含める必要はありませんでした。
MediaWikiは20以上の言語に対する文法的な変換関数を持ちます。それらの中にはWikimediaのサイト名の単なる辞書でしかないものもありますが、残りは適切なアルゴリズムを持ちます。
MediaWikiが任意の文法変換機能を持つ以前は、月の名前に関する主格と所有格の識別をしました。この識別は月の名前を文に置き換えたい場合に必要です。
パラメータ置き換えに関する別の(よりシンプルな)問題はHTMLエスケーピングです。よりシンプルであるにもかかわらず、MediaWikiはとても貧弱な仕事しかしません。マルチタスクを行うwfMsgExt()を含む、みすぼらしい名前のwfMsg*()関数はたくさんありますが、ユーザーの入力の確認を失敗してエスケープせずに通してしまいます。将来のある段階でこの問題をクリーンナップする作業が行われるかもしれません。
[edit] メッセージの再利用を回避する
翻訳者は再利用の回避を推奨します。2つの概念を英語で同じ単語で表現出来る場合、それらがすべての言語で同じ単語で表現できることを意味しません。"OK"がよい例です: 英語においてこれは一般的なボタンラベルに使用されますが、別の言語の中にはボタンによって実行されるオペレーションに関連したボタンラベルを使うことが好まれます。
すべての言語にまたがってメッセージを再現する簡単な方法はメッセージを再利用するプログラマの必要性を減らすことです。保守の負担を減らすために、できればフルコピーよりも参照することです。
[edit] Keeping messages centralized and in sync
英語メッセージにコードの付随する省略形がないものはめったにありません。経験によれば同じ場所にすべての英語のメッセージがあることは便利です。英語のテキストを改訂することは、翻訳が出来るように、コードへの参照無しで行うことが出来ます。プログラマは時にデフォルトのテキストのためにとても貧弱な選択肢を作成することがあります。

