MyMiniCity踏んでください!!

ただいま絶賛MyMiniCity参加中です.是非リンクを踏んでください!!(笑
April 21st, 2006

PHPでメッセージカタログはgettextしかありえないでしょ(何故gettextか?編)

(Read: 62716)
Add to Hatena Bookmark

参照: 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`
--keywordはキーワードになる文字列を,--languageは言語を,--outputは出力ファイル名を指定します.
その他詳しいオプションはオプション--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
ja.poに問題がなければこれでja.moが作成できます.
お疲れ様です.
ちなみに先ほどチラッとかいたステータス確認は--outputをはずし,--verboseを追加します.


$ msgfmt --verbose ja.po
1094 translated messages, 78 fuzzy translations, 40 untranslated messages.
これは翻訳済メッセージ1094,あいまい翻訳(余裕があれば後述.ようするに未訳に近い)が78,未訳が40ということをあらわします.
日本語でメッセージが出てくる環境ならこんな感じで出てきます.


$ 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にmessage.potを適用した新しい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

超長くなっていやになってきたので多分後で別記事として追記します.
休み時間も終わりそうなんで…

とりあえずまとめ

上記を踏まえた実装と環境構築をすることで下記のような恩恵を受けられます.

・開発者はメッセージカタログのメンテナンスについて面倒なことを最小限に減らすことができる(まだあんまり書いてないけど
・翻訳者は自分にあった翻訳環境を選ぶことができる(いいのがなかったときは残念ですね
・翻訳状況の確認も容易に行うことができる

ちゃんちゃん


▼ この記事へのコメント ▼
gettextはイイですね〜
phpのみでwebアプリつくるより、deploymentが少々複雑になりますが、逆にメッセージの更新でparse error起こして本番がコケるようなことはなくなります

po-mode.elはFCのパッケージングでは
emacsだとemacs-common
xemacsだとxemacs-sumo
ですね(何故か俺は未だにxemacsを使っている)

vimにpo.vimってのもある模様です(未体験)

トピックの参照元

▼最近のトピック

▼ 人気のトピック


< 過去の記事 [ 5All Categories ] 新しい記事 >
Powered by gsblog (customize)

[ POST ] [ AddLink ] [ CtlPanel ]

Subscribe blog

Bookmark blog

About me

about me

応援しています

我が息子が産まれたアクア・バースハウス(東京都世田谷区にある助産院)を応援しています.

翻訳のお仕事

腕に自信がある方,修行をしたい方はこちらをどうぞ.

2006 calendar

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
| Day | Month | Year |

Powered by RRDTOOL.

Archives

Categories

Links


Mail to admin

人気ブログランキングへ RSS feed meter for http://blog.poyo.jp/ Search Engine Optimization
blogpeople.netに登録!! スカウター : よくきたblog

My Google news

My Google News

Related site

ころんころん♪ べびぽよ フォト蔵Wiki
string(40) "/categ-1/year-2006/month-5/id-1145599387"