- 2009-12-14 (月) 23:10
- MovableType


- config.yamlで書いたテーマでのL10N適用
どうしても、うまくいかない事があったんで、悩んでないで書いてしまう事にしました。(後で解決したけど)
とある理由で、テーマをプラグインとして作成したいと思っています。(テーマとプラグイン・別々のインストールは避けたいだけなんですが)
それで、config.yamlでのテーマの書き方を調べて、テーマの作成までは問題なく終了しました。ただ、一箇所だけうまくいかない事があって、それがL10Nの適用です。
厳密には、プラグインやテーマにL10Nを適用させる事は出来ています。問題はそこから。適用されたテーマによって作成されたテンプレート内で、「プラグイン側のL10Nで拡張したローカライズ部分の、ローカライズ結果」が、「テンプレートの初期化を行った時に無効になる(デフォルトの英語になってしまう)」という現象です。
現象としては、以上の通りなのですが、再現性の有る現象として説明する為に、作成したプラグインの説明をします。
テーマ・プラグインのローカライズには、L10N設定を書ける箇所が2つある
ローカライズの為のL10N指定は、テーマプラグインの場合、書く場所(書ける場所)が2箇所あります。プラグイン全体について書かれている部分と、テーマについて書かれている部分です。
と、言葉で言ってみても、解りづらいでしょうから、今回試してみたプラグインのコード曝します。
name: L10N Yaml Sample Theme id: JaSample description: <__trans phrase="JaSample"> l10n_lexicon: ja: l10n_ja.yaml version: 1.0 themes: JaSample: id: JaSample label: Sample Theme description: <__trans phrase="JaSample"> version: 2.3 class: blog l10n_lexicon: ja: l10n_ja.yaml elements: template_set: component: core importer: template_set name: Template Set data: base_path: templates require: 1 templates: index: main_index: label: Main Index outfile: index.html rebuild_me: 1 module: header: label: Header
ちなみにl10n_ja.yamlとmain_index.mtmlのファイルはこんな感じの中身。header.mtmlの中身は適当に。
Header: ヘッダー JaSample: 日本語サンプル Sample Theme: さんぷる・テヱマ
<__trans phrase="Header">
2ヶ所のうち、どちらに書くかで、テーマ・プラグインのローカライズ動作が、違ってきます。なお、ローカライズが行われたかどうかは、プラグインで追加した語句についてのローカライズ結果で判断しています。これらの設定にかかわらず、MTがもともと持っている語句のローカライズは、常に行われました。
ちなみに、どうやら「l10n_lexicon:」の書き方は、プラグインでも有効みたいです。yamlで書けるので、ずいぶん簡単です。
プラグイン部分のL10Nのみ有効にする
プラグインのL10N指定(最初の方)のみ有効な状態のプラグインを作ると、予想通りプラグインの動作に関する部分(出力メッセージやプラグイン管理画面など)を日本語化する事が出来ます。
テーマ選択画面でのテーマ一覧での表示については、「テーマ名称」のローカライズは行われますが、「description」部分についてはローカライズが有効になっていません。
適用後のテンプレート名称はローカライズされています。またこの時点でのテンプレート内も問題無くローカライズが行われています。
しかし、このテンプレートに対してプルダウンアクションの「テンプレートの初期化」を行った場合には、ローカライズが無効になってしまうようです。
テーマ部分のL10Nのみ有効にする
プラグインのL10N指定をせずに、テーマ部分のL10N指定のみ書いた場合も、予想通りプラグイン絡みのメッセージは英語のままになりました。
テーマ選択画面でのテーマ一覧での表示については、さっきと逆に「description」部分のローカライズは行われますが、「テーマ名称」についてはローカライズが有効になっていません。
適用後のテンプレート名称はローカライズが行われません。またこの時点でのテンプレート内もローカライズが行われていません。
このテンプレートに対してプルダウンアクションの「テンプレートの初期化」を行った場合も、ローカライズは行われません。
両方のL10Nを有効にする
両方のL10Nを書いてみます。この場合、L10Nが適用される部分を正確に読み取って、二つのレキシコンを作成して指定してもいいのですが、管理するのが面倒になるだけなので、同じファイルを読むようにした方が良いと思います。
プラグインメッセージはローカライズされますし、テーマ表示もすべてローカライズされます。
テーマ適用後のテンプレート名称はローカライズされています。またこの時点でのテンプレート内も問題無くローカライズが行われています。
ここまでは完璧なのですが、このテンプレートに対してプルダウンアクションの「テンプレートの初期化」を行った場合には、ローカライズが無効になってしまいました。
両方有効な状態で、プラグインとテーマのidを別にする
プラグインとテーマのidを別なものにした場合でも、テーマの適用という動作自体は問題ありませんでした。
ローカライズの結果については、上のプラグイン・テーマ2つのL10Nを有効にした場合と、同じになりました。
色々実験していて解りましたが、「デザイン」>「テーマ」の「テーマの適用」と、「デザイン」>「テンプレート」での右下「アクション」内の「テンプレート初期化」リンクが同じ動作をし、「テンプレート一覧画面」でのプルダウンアクションの「テンプレートを初期化」と「テンプレート編集画面」でのプルダウンアクションの「テンプレートを初期化」が同じ結果になるようです。
config.yamlで作った時は"trans_section"
このエントリー書きながら、ふと思い付きました。もしかしたらMT4用のテンプレートセットみたく、trans_section指定するんじゃないかと。
早速main_index.mtmlの内容を以下のようにして、試してみました。
<$MTInclude module="<__trans_section component="JaSample"><__trans phrase="Header"></__trans_section>"$>
こうしてやると、テンプレートの初期化をした時も、きちんとローカライズが行われるようになります。
なんだ、そうだったんだ。
という訳で、無事解決したので、mt.Vicunaの追い込みに入ります。今週中には最初のバージョンを公開したいです。
- Newer >: mt.Vicuna Simple 2.3公開します
- < Older: Movable Type エンジニアの夕べ
ping a Trackback
- TrackBack URL for this entry.(1)




スクリプトの読み込みが完了していません。
メールフォーム(Javascriptを使用していません)や、
Twitter経由のCommentでもReplyいたします。ただし返信はブログのコメントとして行う事もあります。