|
趣味と実益と現実逃避で更新されるblogです.
役に立つことから無意味なことまでさまざま書いていきます.
|
| April 21st, 2006 |
PHPでメッセージカタログはgettextしかありえないでしょ(何故gettextか?編)(Read: 16314) |
参照: PHP: Gettext - Manual |
| お待たせしました? 続編です. #遅くなってすみません PHPでメッセージカタログを扱う場合,PHP文字列形式やPHP配列形式を使う場合が多いこと,そのメリットとデメリットについて以前の記事で書きました. では今回はgettext使うとどう幸せになるのかあたりを. というかあまり整理できてないですね.すみません(いきなり謝りまくりかよ |
gettextとは?gettextはGNUプロジェクトで開発されている,主にメッセージの多言語化を達成するためのライブラリとコマンド群と思ってもらえればいいと思います.gettextを用いることで,プログラムからメッセージカタログをpo(Portable Object.テキスト形式)という形式のテキストを出力し,それらを各言語用に編集し,mo(Machine object.バイナリ形式)という形式にし,最終的にmoを用いてアプリケーションのメッセージを扱います. gettextだと何がうれしい?gettextだとPHP配列形式などと比較し,どの辺りにアドバンテージがあるでしょうか?私は一番アドバンテージがあるのは周辺ツールの充実だと思っていますが,大雑把にはこの辺でしょうか? ・開発者がgettextを使うために必要な実装量は多くない - 自分で実装をすればやはりそれなりのコード量になります ・開発者が翻訳環境についての補助ツールを作成する必要がほとんどない - gettextだとメッセージのカタログ化,既存のカタログのメンテナンスツールは殆ど書く必要がありません ・翻訳者は翻訳作業に適したテキストエディタを使うことができる - 後述のとおり,gettextには既にさまざまな支援ツールが存在します. 今回は主にメッセージのカタログ化,カタログ化されたメッセージの翻訳作業やメンテナンスについてざっと書いてみます. エディタpoはプログラミング言語を問わず幅広く使用されています.ある意味書式がプログラミング言語費依存で,XMLなどと同様中立的な位置にあるともいえるかもしれません. その関係もありpoエディタなどは非常に豊富にそろっています. ・emacsのpo-mode.標準でついてるのかな? ・kbabel.X-Window System上でしか動かないかも.参考:こんなに簡単KBabel ・SunのOpen Language Tool.Javaで動くのでマルチプラットフォーム. ・pootle.Ploneで使っている模様.参考: pootle セットアップ ― takanory.net pootle 使い方 ― takanory.net - poEditor.Windows用 kbabelやSunのツール,poEditorなどは「翻訳メモリ」や「翻訳辞書」といった辞書共有の仕組みを持ってたりしますので共同作業がやりやすいかもしれません. ただしこの翻訳メモリ系は「プログラムから摘出したメッセージのライセンスは何になるんだ?」という話があり,今のところ日本では知る限り「GPL(あるいは衝突するライセンス同士)混ぜるな危険」という見解があるので扱いには注意しましょう. その他もろもろこの辺参考で: ・Placebo Effect :: オープンソースによる翻訳支援ツール メッセージカタログのメンテナンスそれではそろそろメッセージカタログのメンテナンスワークフローの辺りでも.gettextはそれ自体でメッセージカタログのメンテナンス環境を持っています. 通常はpoはpotというテンプレート(Portable Object Template)を作成し,それを元に翻訳し,moに変換して使用するという作業を行います. potの作成このpotは通常xgettextというコマンドで行います.PHPでありがちなパターン? だとこういう書き方ができます.$ xgettext --keyword=_ --language php --output message.pot \ `find $PWD -name \*.php -type f` その他詳しいオプションはオプション--helpでusageを出すかmanを引くかマニュアルを見るか諦めて気にしないか自分でどうにかしてください. 最後のfindはサフィックス(拡張子って言え?)が.phpのファイル名一覧を取得しています. これでPHPスクリプトの関数_()内の文字列がすべてmessage.potに出力されます. とりあえず今後potはは「message.po」ということにしておきます. poの編集上記アプリケーションを含め,好きなものを使って編集してください.とりあえず私はemacsのpo-modeを一番よく使っています. 編集時にはuntranslateやfuzzyについて知る必要がありますが,仮作成した原稿に入れ忘れたので後で書きます(酷 とりあえず今後翻訳したpoは「ja.po」ということにしておきます. 注意点として日本語の場合は大体ja.poというファイル名にします.jp.poってファイル名にしてる人.顔洗ってトイレ行って深呼吸してからja.poに悔い改めながらリネームしてください. 知る限りPHPアプリケーションでしか見かけませんが,poおよびmoをまれに「<LANG>/LC_MESSAGES/message.po」みたいなディレクトリとファイル名で保存をする場合もあります. その辺はケチをつけるか文化に従うか自分で選んでください. moの作成moの作成はmsgfmtというコマンドで行います.msfmtは出力ファイル名を指定しなければpoの翻訳状況を出力してそのまま終了するのでステータス確認にも使えます. とりあえずmoの作成は下記のようにやります. $ msgfmt --output ja.mo ja.po お疲れ様です. ちなみに先ほどチラッとかいたステータス確認は--outputをはずし,--verboseを追加します. $ msgfmt --verbose ja.po 1094 translated messages, 78 fuzzy translations, 40 untranslated messages. 日本語でメッセージが出てくる環境ならこんな感じで出てきます. $ LANG=ja_JP msgfmt --verbose ja.po 1094 個の翻訳メッセージ, 78 個の翻訳があいまいです, 40 個の未訳のメッセージ. potおよびpoの更新プログラムを更新したら当然メッセージの追加変更も行われます.potの更新はいつも新規作成で問題はないと思うので(問題があったらどういうことか知りたいです)「potの作成」の手順でOKです. potを更新したら次はpoに反映します.これはmsgmergeというコマンドで行うことができます. $ msgmerge ja.po message.pot --output ja.po 新しいja.poが作成されたらまた編集し,moを作成するといいでしょう. この辺は全部シェルスクリプトやMakefileで更新環境を作っておくと便利です. 気が向いたら自分でよく作るパターンを紹介したいと思います. 現在の翻訳状況を調べる多くのオープンソースでgettextを採用しているため,ステータス確認の技術がいろいろ出てきています.一番わかりやすいのはウェブベースで各言語,各アプリごとの翻訳状況の確認とかでしょうか. とりあえずこの辺でも参考にしてください. ・KDEのGUI.SVN trunk内の翻訳状況 ・同じくGNOMEのCVS HEAD内の翻訳状況.これKDEと同じの使ってる? ・Red HatのFedora Project用の独自ツールの翻訳状況 こういうページを作るのは簡単で,さっきのmsgfmtでの翻訳状況をウェブで反映させるだけです. 例えばKDEのウェブページはオープンソースで公開されているようです. メッセージカタログを使う気が早いですね.ここはまだ書かないっつってんだろ!!面倒なのでとりあえずこの辺見といてください: ・PHP de gettext - よくきたblog ・File_Gettextを使ってみる - よくきたblog 超長くなっていやになってきたので多分後で別記事として追記します. 休み時間も終わりそうなんで… とりあえずまとめ上記を踏まえた実装と環境構築をすることで下記のような恩恵を受けられます.・開発者はメッセージカタログのメンテナンスについて面倒なことを最小限に減らすことができる(まだあんまり書いてないけど ・翻訳者は自分にあった翻訳環境を選ぶことができる(いいのがなかったときは残念ですね ・翻訳状況の確認も容易に行うことができる ちゃんちゃん |
| ELF Apr 21st, 2006 15:03 / [ 編集 ]
[ コメントする ] [ トラックバック(0) ] [ ] |
| ▼ この記事へのコメント ▼ |
| The $5 Script Archive The best of PHP, MySQL, Flash and XML technologies, brought together at one low price. |
[ POST ] [ AddLink ] [ CtlPanel ]
| << | 5月 | >> | ||||
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
| * | 1 | 2 | 3 | 4 | 5 | 6 |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 | * | * | * |