Movable Type CMSプラットフォーム Movable Type
ドキュメントサイト

Manualマニュアル

第4回】プラグインのローカライゼーションについて

最終更新日: 2011.03.28

このページは既にhttps://github.com/movabletype/Documentation/wiki/Japanese-plugin-dev-1-4に移行されています。

はじめに

シックス・アパートの上野初仁(はつひと)です。

今回はローカライズによる多言語対応について、その仕組みとプラグインでの利用についてを解説します。

ローカライズ技術

一般的にローカライズとは、使用する言語環境に合わせてプログラムを動作させるようにすることを指します。

ローカライズは英語で"Localization"といいますが長いため"L(10文字)n"、すなわち"L10N"と略表記されます。

Movable Typeの場合、以下の言語について利用できるようにローカライズされています。

  • 日本語
  • 英語
  • フランス語
  • ドイツ語
  • スペイン語
  • オランダ語

Movable Typeの管理画面にログインし、自分のユーザー情報の編集で使用言語を変更すると各言語のインターフェースで管理画面が表示されるのが確認できます。これは、各言語ごとに辞書ファイルが用意されていて、それぞれ表示を切り替えているために可能になっています。

辞書にひもづけるためのフレーズ(キーワード)はテンプレートファイルに書かれています。例えば"$MT_DIR/tmpl/cms/error.tmpl"を見ると以下のように書かれている場所があります。

<__trans phrase="Close">

これは「"Close"というフレーズに対応した文言を辞書ファイルから読み込み、<__trans>タグごと書き換えなさい」という指示になります。この"<__trans>"タグは以前は"<MT_TRANS phrase="Close">"のように書いていました。"<MT_TRANS>"タグも使えますが、MT5のお作法として"<__trans>"を使って行きましょう。

各言語用の辞書ファイルは"$MT_DIR/lib/MT/L10N"以下に配置されます。

言語辞書ファイル名
日本語ja.pm
英語en_us.pm
フランス語fr.pm
ドイツ語de.pm
スペイン語es.pm
オランダ語nl.pm

辞書の定義は、=> の左側に対象の文字列(フレーズ)を、右側に変換結果を定義するというシンプルなフォーマットです。たとえば、前述のフレーズCloseについて、閉じると表示するには、日本語を表示する辞書ファイルja.pm内に、次のように定義します。

'Close' => '閉じる',

また、機能の解説のように、変換対象の文字列が単文でない場合、"_"から始まるキーワードを利用することもできます。

Movable Typeの管理画面は、HTMLファイルのようなテンプレートファイル(TMPLファイル)を用意して、そこに表示する内容を定義します。(実際先ほど例に挙げた"$MT_DIR/tmpl/cms/error.tmpl"を見るとHTMLファイルに似た記述になっている事が分かります。)そして表示する際、テンプレートエンジンがTMPLファイルを解析し"<__trans>"タグがあれば辞書ファイルを参照して置き換えます。この際、指定されている言語の辞書ファイルに対応するフレーズが無い場合はデフォルトの英語の文言に置き換わります。また、指定した言語にも、英語辞書にも無い時はフレーズであればそのまま置き換え、"_"で始まるキーワードの場合はエラーとなります。

整理すると以下の様になります。

  1. 指定した辞書ファイルを最初に参照します。たとえば、日本語の場合、ja.pmの内容を最初に参照します。
  2. 最初の参照でフレーズがみつからない場合、英語の辞書ファイルen_us.pmの内容を参照します。
  3. 英語の辞書ファイルにもみつからない場合は、変換する対象が文字列ならば文字列を、キーワード(_から始まる文字列)の場合はエラーを表示します。

ページ数などを含んだフレーズの場合、文字列が可変なため違った指定をする必要があります。可変する場所を"[_1]"といった形でまとめます。

'Pages: from [_1] to [_2]' => '[_1]~[_2]ページ',

この指定で以下のような記述が可能になります。

<__trans phrase="Pages: from [_1] to [_2]" params='32%%64' >

これで表示は「32~64ページ」となります。"params"に可変値を記載し、可変項目が複数ある場合は"[_1]", "[_2]"と指定していき、"params"のセパレータは"%%"になります。(今回は32と64は固定値ですが、他のページや管理画面内での利用など用途が広く考えられます。)

これらの辞書機能を、テンプレート・ファイルだけではなく、スクリプト内で利用するための関数(メソッド)として、translate関数が用意されています。この関数を利用することで、エラーメッセージやログなどのスクリプトの処理結果を言語にあわせて出力できます。

言語別に処理する仕組みをプラグインにも適用する

上で説明した内容はプラグインでも利用できます。プラグインに関連する項目について辞書ファイルを用意し、config.yamlに辞書ファイルの設定("l10n_class: MyPlugin02::L10N")を記載します。

編集前のconfig.yaml

id: MyPlugin02
name: Sample plugin L10N
version: 1.0
description: Sample plugin L10N
author_name: Plugin author
author_link: http://www.example.com/about/
doc_link: http://www.example.com/docs/

編集後のconfig.yaml

id: MyPlugin02
name: <__trans phrase="Sample plugin L10N">
version: 1.0
description: <__trans phrase="_PLUGIN_DESCRIPTION">
author_name: <__trans phrase="_PLUGIN_AUTHOR">
author_link: http://www.example.com/about/
doc_link: http://www.example.com/docs/
l10n_class: MyPlugin02::L10N

L10N.pmの作成

辞書ファイルの雛形を作ります。'MT::Plugin::L10N'の継承クラスとして作成することで、細かい実装について気にする必要がなくなります。

package MyPlugin02::L10N;
use strict;
use base 'MT::Plugin::L10N';

1;

en_us.pmの作成

英語の辞書ファイルを作成します。'MyPlugin02::L10N'の継承クラスとして作成します。

package MyPlugin02::L10N::en_us;

use strict;
use base 'MyPlugin02::L10N';
use vars qw( %Lexicon );

%Lexicon = (
    '_PLUGIN_DESCRIPTION' => 'Sample plugin L10N',
    '_PLUGIN_AUTHOR' => 'Plugin author',
);

1;

ja.pmの作成

日本語の辞書ファイルを作成します。'MyPlugin02::L10N::en_us'の継承クラスとして作成します。

# Sample Plugin: Plugin L10N

package MyPlugin02::L10N::ja;

use strict;
use base 'MyPlugin02::L10N::en_us';
use vars qw( %Lexicon );

%Lexicon = (
    'Sample plugin L10N' => 'サンプルプラグイン L10N',
    '_PLUGIN_DESCRIPTION' => 'サンプルプラグイン L10N',
    '_PLUGIN_AUTHOR' => 'プラグイン作者',
);

1;

ファイルの配置

作成した辞書ファイルを配置します。

MT_DIR/
|__ plugins/
   |__ MyPlugin02/
      |__ config.yaml
      |__ lib/
         |_ MyPlugin02/
            |__ L10N.pm
            |_ L10N/
               |_ en_us.pm
               |_ ja.pm

プラグインの表示結果

ファイルを正しく配置した上で、管理画面のプラグイン設定を開くと以下の様に表示され正しく動作していることが分かります。

まとめ

今回はMovable Typeの中でローカライズの挙動と、プラグインでの利用方法を解説しました。

ローカライズはMovable Typeの動作の中で、とても重要なものの中の一つです。今回きっちりと覚えて、英語文言を用意し海外の人にも使ってもらえるプラグインを作成しましょう!!もちろんドイツ語など他の言語辞書も用意できたら、すばらしいですね!!

プラグイン開発ステップ・バイ・ステップ インデックス

目次