&pgid();
#contents
第7回はプラグインを国際化(多言語化)する方法を解説します。Bootstrapで呼び出される機能を多言語化の方法も解説します。今回は時間短いかもです^^;
** 動画(Ustream) [#h078a3d2]
//勉強会の模様をアップしました。
勉強会の模様をアップしました。
今回は事前にサンプルプログラムを用意できなくて準備不足だったですね、すみませんです(汗
//#htmlinsert(study/mtplugin-6.html)
#htmlinsert(study/mtplugin-7.html)
//Ustreamのチャンネルはこちら。
//http://www.ustream.tv/channel/mt%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E5%8B%89%E5%BC%B7%E4%BC%9A
Ustreamのチャンネルはこちら。
http://www.ustream.tv/channel/mt%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E5%8B%89%E5%BC%B7%E4%BC%9A
*** ご感想・ご質問など [#y7a8027b]
ご感想、ご質問などあればお気軽にどうぞ。頂けるととても励みになります。
#comment
** 勉強会で解説したプログラムコードのダウンロード [#s88262b7]
//&ref(Quote.zip);
//単に対象のファンクションタグの出力を‘’で囲むだけのプラグインです。
//グローバルフィルターの実装例としてご参考ください。
** ネタ [#bf9718df]
- [[Six Apart - 技術情報提供ブログ: ローカライズ技術の解説>http://www.sixapart.jp/pronet/developers/plugin/l10n.html]]
** 日時 [#g86debd5]
- 2008/07/4(金) 10:30〜11:00( or 10:45)
** プラグインを国際化(多言語化)する方法の基礎的なこと [#t2d739f6]
*** 翻訳の基本的な仕組み [#a5df6627]
[[Six Apart - 技術情報提供ブログ: ローカライズ技術の解説>http://www.sixapart.jp/pronet/developers/plugin/l10n.html]]より、
Movable Typeの管理画面は、表示する内容を定義した「テンプレート・ファイル」をテンプレート・エンジンが解析、処理して表示されます。テンプレート・エンジンは、テンプレート・ファイルに記述してある文字列を、現在の言語情報(ログインしている投稿者のプロフィールで指定した言語もしくは環境変数 DefaultLanguageの値)をもとに、辞書ファイルから翻訳結果を抽出して表示しています。
*** 辞書ファイルの配置 [#kb451349]
辞書ファイルは以下のように配置する慣例があります。
# 辞書ファイルを利用するためのパッケージ
MT_DIR/plugins/[プラグイン名]/lib/[プラグイン名]/L10N.pm
# 言語別の辞書ファイル
MT_DIR/plugins/[プラグイン名]/lib/[プラグイン名]/L10N/en_us.pm # 英語
MT_DIR/plugins/[プラグイン名]/lib/[プラグイン名]/L10N/ja.pm # 日本語
各ファイルの構造は以下のようになります。仮にプラグイン名をMyPluginとします。
L10N.pm
package MyPlugin::L10N;
use strict;
use base qw( MT::Plugin::L10N );
1;
L10N/en_us.pm
package MyPlugin::L10N::en_us;
use strict;
use base qw( MyPlugin::L10N );
use vars qw( %Lexicon );
%Lexicon = (
# 辞書定義
);
1;
L10N/ja.pm
package MyPlugin::L10N::ja;
use strict;
use base qw( MyPlugin::L10N::en_us );
use vars qw( %Lexicon );
%Lexicon = (
# 辞書定義
);
1;
MT::Plugin::L10N -> MyPlugin::L10N -> MyPlugin::L10N::en_us -> MyPlugin::L10N::jaと継承しています。これによって日本語の辞書定義が存在しない場合でも英語の定義が使われ、それもなければMT::Plugin::L10Nの定義が利用されます。
言語別の辞書ファイルには他にも、fr.pm(フランス語)、de.pm(ドイツ語)、es.pm(スペイン語)、nl.pm(オランダ語)が定義できます。
*** 辞書定義の書式 [#a3029073]
辞書定義の書式は%Lexiconというハッシュのキーに対象の文字列(フレーズ)を、値に変換結果を定義して並べる形になっています。
%Lexicon = (
'Close' => '閉じる',
# 文章もキーにできる。'のエスケープに注意
'Hello, MT\'s World' => 'MTの世界にようこそ',
:
);
英語(en_us.pm)以外の言語の辞書ファイルはen_us.pmを継承して定義します。こうすることで、先に述べましたが、対象のキーに対する訳がない場合でも、英語のフレーズが使われます。
*** 辞書ファイルの使い方 [#g6b5f3a2]
辞書ファイルを使うには、プラグイン本体のプラグインオブジェクトのnewで
my $plugin = new MT::Plugin::MyPlugin({
:
l10n_class => 'MyPlugin::L10N',
:
});
MT->add_plugin($plugin);
のようにl10n_classに辞書ファイルのパッケージ(MT::Plugin::L10Nを継承したパッケージ)を指定します。
また、テンプレートには
<MT_TRANS phrase="翻訳対象の文字列(フレーズ)">
または
<__trans phrase="翻訳対象の文字列(フレーズ)">
と記述します。テンプレートエンジンはphraseの値に対応する辞書定義を探し、あれば翻訳、なければphraseの値をそのまま出力します。ただし、_で始まるフレーズ((キーワードと呼ぶらしいです))は英語にも定義されていなければエラーになります。
スクリプト内でも翻訳処理を呼び出すことができます。MT::Pluginのtranslateメソッドを利用します。
[[MT::Plugin tranlate>http://www.movabletype.org/documentation/man/MT/Plugin.html#%24plugin-%3Etranslate(%24phrase_%5B%2C_%40args%5D)]]
** Bootstrapで実現される機能の国際化(多言語化) [#ue93c417]
プラグインの辞書ファイルを利用します。
Bootstrapで次のようにMyCGIというクラスが起動されるとします。
use strict;
(...)
use MT::Bootstrap App => 'MyCGI';
そして、plugins/MyCGI/MyCGI.pmでプラグインオブジェクトの参照を取得します。
package MyCGI;
(...)
$MyCGI::plugin = new MT::Plugin::MyCGI({ id => 'MyCGI', l10n_class => 'MyCGI::L10N' });
後は、このプラグインオブジェクトの参照を使って、出力を返す前にtranslateしてあげます。
# テンプレートをロードし
my $html = $app->load_tmpl('mycgi.tmpl', \%param);
# 翻訳して返す(未検証^^;)
return $MyCGI::plugin->translate($html->text));
// my $html = $app->load_tmpl('aform_confirm.tmpl', \%param);
// + $html->text($AFormEngineCGI::plugin->translate_templatized($html->text));
// return $app->build_page($html, \%param);
** 次回予定 [#r7dc84f5]
次回はregistryメソッドのリファレンスを一通り見ていきたいと思います。おそらく長くなると思いますので、2〜3回にわけると思います。
#blikifooter(進地);
tag: [[Movable Type>tag/Movable Type]]、[[MT>tag/MT]]、[[MT>tag/MT::Bootstrap]]、[[MTPlugin>tag/MTPlugin]]、[[勉強会>tag/勉強会]]、[[A-Form>tag/A-Form]]