趣味と実益と現実逃避で更新されるblogです.
役に立つことから無意味なことまでさまざま書いていきます.
|
April 17th, 2006 |
PHPでメッセージカタログはgettextしかありえないでしょ(Read: 264268) |
参照: Benchmarking PHP Localization - Is gettext fast enough? ?? Pablo’s Development Blog |
いわゆるPHP配列なメッセージカタログとgettext拡張モジュール拡張モジュール,gettextのpo形式を扱うPHPスクリプトの3つを用いたベンチマーク. 「the PHP gettext extension is the fastest solution.」 だそうで,結果gettext拡張モジュールが一番早い. |
当然の結果です.まぁPHPスクリプトでのメッセージカタログも配列より「$message = "メッセージ";」の方がさらに早いだろうけどそんな形式メンテナンス性悪すぎるのでステでそ.define()も等価.
理由は使用している全メッセージの取得が著しく行いづらい. とりあえず第10回PHP勉強会でもでてきたのですが, 下記は「私がなぜgettextにこだわるか」ってところです. gettextってそんなにいいのか?ぶっちゃけgettextが完璧だ!!というわけではないです.現時点消去法で一番マシなのです.理由は下記のとおり. ・英語メッセージカタログ(以後カタログ)の更新がほとんど確実に追跡できる ・カタログテンプレートの作成は当然更新と最新カタログと既存の翻訳カタログのマージが簡単. ・各種ユーティリティが豊富にそろっている gettextでなければカタログの追跡は難しいのか?答えは「yes」です.とりあずありがちなPHPスクリプトでカタログを扱う例を出してみます.とりあえず英語のカタログは便宜上「en.php」というファイル名ということにしましょう. $what_is_foo = "What is foo"; では翻訳しましょう. $what_is_foo = "foo って何ぞや"; ここでen.phpで「?」を付け忘れていることに気づきました. ってことで,変更します. $what_is_foo = "What is foo?"; 基本的に「変更したよ!!」って明言されないと気づきません.あるいはカンで気づいて見るかもしれません. でも1000とかメッセージあるとわかりませんよね. この原因は翻訳元と翻訳先のメッセージに関連付けがまったくないことから起こります. PHPスクリプト的には echo $what_is_foo; 余談になりますが,私はCVSやsvnが使用できる環境の場合,翻訳作業で下記のように擬似タグを挿入します. // EN-Revision: <en-revision> $what_is_foo = "What is foo?"; そうすれば下記のようにすることで最新と最終翻訳の差分を取得することができます. $ cvs diff <en-revision> en.php しかし正直diff読みながら作業は面倒です. こういう仕組みが作れないときは,旧バージョンのアーカイブと新バージョンのアーカイブの比較になります. まぁ結局やることは似たようなもんですね.リポジトリが公開されてアクセスできると一度に一気に作業しなくていいので負担が少ないってのはメリットですが. じゃー単なる変数じゃなく配列にすればいいじゃん!! えらい!!よく気づきました. $messages = array( "What is foo"=>"What is foo" ); echo $message[ "What is foo"]; function mes( $string) { return isset( $GLOBALS[ "message"][ $string])? $GLOBALS[ "message"][ $string]: $string; } echo mes( $message); $messages = array( "What is foo?"=>"What is foo?" ); これでカタログキーが変わるので,何らかのユーティリティを自作できそうです. en.phpの連想キーとja.phpの連想キーの差分を取るとか. でもこのen.phpの変更をja.phpに反映させ,「英文があれば未翻訳だよー」とか「連想キーと値が同じなら未翻訳ですよー」位したくないですか? しかしそこまでツール作るとなるとちょっと面倒ですよね. 大体「英文のまま」イコール「未翻訳」ではないですし.「連想キーと値が同じなら未翻訳」ではありません. $messages = array( "SQL"=>"SQL" ); そんなことを配列でやってるとそもそもメッセージ自体の可読性が落ち,翻訳どころではありません. ついでに忘れてませんか? プログラミングをしているときにわざわざ手動でカタログを作り直すんですか? メッセージ摘出ツールが欲しいですよね.自作するんですか? 厳密にはgettextの摘出ツール(xgettext)を利用したり,「摘出するだけ」なら何らかの手段はあると思います. 結論この辺で大体まとめてみます.・ただのPHP変数で定義する「$message = "message";」という形式はメッセージ文(ここでは「message」)が変化しても追跡することが難しい ・配列にすると追跡できるが,翻訳の更新をすることが難しい ・どのみち未翻訳管理などができない ・カタログ作成ツールがない ・カタログを実際の各言語のカタログへの反映ツールがない ということになります. さて長くなったので一旦終わり. 次にgettextならどうなるのか辺りを. |
ELF Apr 17th, 2006 12:32 / [ 編集 ]
[ コメントする ] [ トラックバック(1) ] [ ] |
[ POST ] [ AddLink ] [ CtlPanel ]
<< | 4月 | >> | ||||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
* | * | * | * | * | * | 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 | * | * | * | * | * | * |