お問い合わせ
資料請求

Pandora FMSの翻訳機能を拡張

アールワークスでは Pandora FMS 本体のほかに、プラグインの開発も積極的に行っています。また、自分たちがプラグインを開発するにあたってこんな API が欲しいという場合、Pandora FMS 本体に立ち戻って開発することもあります。このたび、Pandora FMS コンソールの翻訳機能について API を追加しましたので紹介します。

Pandora FMS コンソールの翻訳機能とは、表示されるテキストをユーザの選択した言語で行うものです。表示言語で英語を選択していると `Agents` と表示される個所も、日本語を選択していれば `エージェント` と表示される仕組みのことです。

Pandora FMS コンソールのプログラムでテキストを表示する際、

echo 'Agents';

としたとします。しかし、これではどのような言語設定でも常に `Agents` としか表示されません。次のようにすると、多言語対応できます。

echo __('Agents');

Pandora FMS コンソールで言語設定で日本語を選択していると `エージェント` と表示されるようになります。もちろん、別の言語を選択していると、その言語に応じたテキストが表示されます。これは gettext というライブラリを用いて実現されています。

Pandora FMSの翻訳機能を拡張:英語表示例

Pandora FMSの翻訳機能を拡張:日本語表示例

また、 __() では引数を与えることも出来ます。

echo __('Ping to %s', 'www.example.com');

とすれば `www.example.com への ping` と表示されます。

翻訳を行う辞書は Pandora FMS コンソールの include/languages/ というディレクトリにあります。まず最初に Pandora FMS コンソールのソースコードから翻訳するべきテキストが収集されて index.pot というファイルが作られます。index.pot は各言語の *.po というファイルにコピーされ、このファイルを編集することで翻訳を行います。*.po が出来上がったら *.mo というファイルに変換することで __() 関数から使用できるようになります。

以上は Pandora FMS コンソール本体の話なのですが、コンソール拡張は Pandora FMS 本体と一体として動作しますので、コンソール拡張からも Pandora FMS 本体と同様に __() を用いて翻訳機能を利用できます。コンソール拡張から

echo __('Modules');

とすると、日本語環境では `モジュール` と表示されます。ですが、これは Pandora FMS コンソール本体に用意されているテキストに限った話になります。コンソール拡張で独自のテキストがあったとして、そのテキストを __() に渡しても翻訳は行われません。include/languages/ 以下の辞書ファイルはあくまでも Pandora FMS コンソールのソースコードの一部ですので、コンソール拡張から自分のテキストを付け加えることはできません。そこで、次のような API を追加しました。

function extensions_add_translation_string_function($translate_function_name)

コンソール拡張の翻訳関数を登録する API です。コンソール拡張で独自の翻訳関数を実装し、その関数を登録します。

function ___($string)

コンソール拡張用の翻訳関数です。Pandora FMS コンソール本体の翻訳関数は _ が二つですが、こちらは _ が三つです。使い方は __() と全く同じです。

echo ___('Original Word');

とすれば `オリジナルワード` と表示されます。

Pandora FMSの翻訳機能を拡張:コンソール拡張英語表示例

Pandora FMSの翻訳機能を拡張:コンソール拡張日本語表示例

___() は独自辞書に無いテキストの場合は Pandora FMS コンソールの辞書を使用しますので

echo ___('Alerts');

とすれば `アラート` と表示されます。コンソール拡張で、そのテキストが Pandora FMS コンソール本体のテキストかコンソール拡張のテキストか区別する必要はありません。

extensions_add_translation_string_function() に登録する独自翻訳関数は、次のように実装します。

/**
 * Extension specific translation function
 */
 function my_extensions_translation() {
   $translates = array(
     'es' => array(
       "Original Word" => "Original Word"
     ),
     'ja' => array(
       "Original Word" => "オリジナルワード"
     ),
     /*
      ... for other language's definitions.
     */
   );

   $args = func_get_args();
   $string = array_shift($args);
   $user_language = get_user_language ();
   if(isset($translates[$user_language][$string])){
     return vsprintf($translates[$user_language][$string], $args);
   }
   else{
     return false;
   }
 }

この例では独自翻訳関数内に連想配列で辞書を持っていますが、gettext など別の方法で実装しても構いません。

my_extensions_translation() で行っている処理は __() とほぼ同等です。実際、

echo my_extensions_translation('Original Word');

とすれば `オリジナルワード` と表示されます。しかし、これですとソースコード上で独自翻訳関数名とテキストが視覚的に混じって分かりにくいというデメリットがあります。__() はアンダースコアのみの関数名であるため視覚をあまり邪魔しません。コンソール拡張のプログラムでも、是非このメリットは取り入れたい。では、コンソール拡張の独自翻訳関数を ___() にした場合はどうでしょう。独自翻訳を行うコンソール拡張が一つだけなら問題ないのですが、複数存在した場合は関数名が重複してしまいます。これらのことから、独自翻訳関数を登録するという仕組みにしました。

また、複数のコンソール拡張で独自辞書を持っている場合、辞書のテキストが重複する可能性があります。

echo ___('Original Word');

というテキストに対して、あるコンソール拡張では `オリジナルワード` と翻訳し、別のコンソール拡張では `独自単語` と翻訳する場合です。非常にまれだとは思いますが、あり得ないことではありません。それぞれのコンソール拡張ではそれぞれに翻訳語が表示されることが期待されていますので、別のコンソール拡張の翻訳語は混じって欲しくありません。そこで、___() では呼び出し元のコンソール拡張を判別して独自翻訳関数を呼び分けるという仕組みにしています。これで安心して独自翻訳を行うことができるようになりました。

以上、7.0NG から使えるようになった、コンソール拡張の独自翻訳機構について紹介しました。

Pandora FMS は、世界200以上の国や地域から120万ダウンロード以上の支持を得ているオープンソースのサーバー監視ツールです。Pandora FMSの特徴は、直感的で操作性に優れたインターフェイスと豊富な機能になります。そのPandora FMSに、サーバー運用管理機能をパッケージ化した商用版が、「Pandora FMS Enterprise」です。
詳しくはは、製品紹介ページ Pandora FMS Enterprise をご参照ください。

ご相談・お問い合わせはこちらから

サービスについてのご相談、資料のご請求など、お気軽にお問い合わせください。

03-5946-8400 平日 10:00 - 18:00
page top