webサイトの多言語対応において、サーバーサイドスクリプトとクライアントサイド(JavaScript)の両方で行いたい場合があります。本日は「Zend_Translate+gettext.jsによる翻訳ソース一元管理型多言語対応」についてです。
こんにちは。猫ITソリューションズ広報の齊藤メイ(♀)です。 本日は、「Zend_Translate+gettext.jsによる翻訳ソース一元管理型多言語対応」についてです。
冒頭にも書いた通り、サーバーサイド(以下PHP)とクライアントサイド(以下JavaScript)の両方で多言語対応をしたいという事があるかと思います。出来れば翻訳ソースを一元化したいところですが、それはなかなか難しいようです。ですが、管理は一元管理にしないと後が大変になります。という訳で今回は「翻訳ソースの管理は一元管理」という前提での実装について説明します。
開発環境
開発環境は以下のようになります。
PHP | 5.4.12 |
Zend Framework | 1.12.3 |
Gettext.js | 0.08 |
翻訳ソースについて
多言語対応の翻訳ソースはgettext方式を採用します。
gettextはlinuxのGNUが提供するライブラリで非常に高速、かつ他開発言語でも標準的に使用されています。今回のように翻訳ソース共有を目的とするならば、このgettext方式が良かろうと考えての採用です。ただし翻訳ソースファイルは.moという形式のバイナリファイルとなるため、翻訳ソース作成時には専用のツールが必要となります。ツールについては後ほど説明します。
そして翻訳ソースは割と更新頻度が高いファイルになると思われます。今回は以下の図のような管理方法を採ります。正直少し非効率な感は否めません。これは今後の改善、またはこの記事をご覧になった皆さんでベストケースを編み出していただきたいです。その際はぜひとも猫ITソリューションズまでお知らせください。参考にさせていただきます。
また、各データはドキュメントルート以下に、下図のようなディレクトリ構成で格納する事とします。
Excelファイルの準備
言語別シートをまとめたExcelファイルは以下のような内容になります。しかしこれはあくまでサンプルであって、Excelファイルの時点では決まった書式はありません。皆さんの扱いやすいようにまとめてください。
poファイルの準備
poファイルは、まずPoeditにより元のファイルを作るところから始めます。
以下サイトの通りにまずはPoeditをインストールして、初期ファイルを生成してください。
Zend Framework入門(14): 多言語対応サイトの作成- Zend_Translate(前編)-(4/5):CodeZine
初期ファイルを用意できたら、後はExcelファイルより翻訳ソースをコピペ追記するだけです。以下のように追記してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
msgid "" msgstr "" "Project-Id-Version: juni_ja 1.0n" "POT-Creation-Date: 2013-01-09 22:33+0900n" "PO-Revision-Date: 2013-08-06 15:32+0900n" "Last-Translator: n" "Language-Team: neko-it.comn" "MIME-Version: 1.0n" "Content-Type: text/plain; charset=UTF-8n" "Content-Transfer-Encoding: 8bitn" "X-Generator: Poedit 1.5.7n" "X-Poedit-KeywordsList: _;gettext;gettext_noopn" "X-Poedit-Basepath: .n" "Language: japanesen" "X-Poedit-SourceCharset: UTF-8n" msgid "error_0000" msgstr "ダミー(エラー:汎用)" msgid "error_0001" msgstr "エラー" msgid "error_0002" msgstr "データベースエラー" |
gettextは、msgidとmsgstrの対により管理されます。
ja.poに、
1 2 |
msgid "msg0001" msgstr "こんにちわ世界!" |
と記述すれば、メッセージID「msg0001」の翻訳文は「こんにちわ世界」となり、en.poには、
1 2 |
msgid "msg0001" msgstr "hello.world!" |
と記述する事になります。
msgidとmsgstrは16行目から記述します。15行以前は「コピペの時点では」固定となりますので、あまり気にする必要はありません。なお、PO-Revision-DateなどはPoeditによる.mo生成時に自動的に更新されます。なお、上記中の「n」も記述に含めますのでご注意ください。
moファイルの準備
moファイルは上述の通りバイナリ形式となり、Poeditにより生成します。以下サイトの通りにmoファイルを生成してください。
Zend Framework入門(14): 多言語対応サイトの作成- Zend_Translate(前編)-(5/5):CodeZine
jsonファイルの準備
JavaScriptからgettext形式の翻訳ソースを扱うのはGettext.jsです。Gettext.jsパッケージにはGettext.jsで読み込むjsonファイルに変換するためのツールpo2jsonが用意されています。以下のコマンドを実行してください。
1 2 3 |
$ echo '{"message": ' > /ドキュメントルート/languages/ja/ja.json $ /ドキュメントルート/common/js/Gettext/bin/po2json /ドキュメントルート/languages/ja/ja.po >> /ドキュメントルート/languages/ja/ja.json $ echo '}' >> /ドキュメントルート/languages/ja/ja.json |
最初と最後のechoはGettext.jsでjson形式の翻訳ソースとして認識させるために必要ですが、これはそのうち改善されると思います。が、現時点では必要な追記処理になります。
PHPの準備
既にZend Frameworkが稼働している事を前提に説明します。以下はサンプルです。
1 2 3 4 5 6 7 8 |
<?php require_once("Zend/Translate.php"); //Zend_Translateオブジェクト生成(翻訳アダプタの生成) $translate = new Zend_Translate("gettext", $_SERVER["DOCUMENT_ROOT"]."/languages/ja/ja.mo", "ja"); // 翻訳された値の取得と表示 $translate->setLocale("auto"); echo "メッセージ:".$translate->_("error_0002")."<br>n"; ?> |
JavaScriptの準備
JavaScript側は以下のようになります。
1 2 3 4 5 6 |
<script type="text/javascript" src="/common/js/Gettext/lib/Gettext.js"></script> <script type="text/javascript" > var gt = new Gettext({"domain": "message"}); var _ = function(msgid) { return gt.gettext(msgid); }; console.log(_("error_database_0000")); </script> |
「_」というのはUNIXにおけるgettext界?で使われる形式に合わせるための処置です。これでイチイチ
1 |
gettext("id") |
などと記述せずに、
1 |
_("id) |
だけで呼び出せます。
よく使う関数だけに短い方がいいですよね。
多言語対応の説明は以上です。
しかし大切なのは仕組みではなく内容です。
正確な翻訳が一番大切な訳ですね、、、