plugindev:i18nm17n

プラグイン国際化の手順

メッセージなどをハードコーディングするのではなく,Nucleus本体と同じように言語ファイルを使うようにすることで、プラグインが出力するメッセージを多国語化することが出来ます。 初めから言語ファイルを意識してプラグインを開発するのではなく、安定したバージョンが出来るまでは直接ファイル内に記述しておいて、後からメッセージ部分を取り出して多国語化するほうがミスが少なくなると思われます。 Nucleus v3.40から、同梱のプラグイン開発マニュアルにも同様の記述がありますが、マニュアルの記述にいくつか追加してこちらにもページを作っておきます。

メッセージの多国語化

プラグインが生成するメッセージを多国語化する方法について。

  1. プラグインを作る
    まずはプラグインを作ります。この時、最初から多国語化を意識するよりも、プラグインが安定動作してから多国語化したほうが開発の負担が少なくてすみます。
  2. プラグインディレクトリを作る
    プラグインの独自ディレクトリを作ります。このディレクトリの名前はプラグインの名前の頭から「NP_」を取って、全て小文字にしたものになります。例えば、プラグインの名前が「NP_AbcDef」の場合、ディレクトリの名前は「abcdef」になります。実在の例で言うと、「NP_CustomURL」なら「customurl」が、「NP_MultipleCategories」なら「multiplecategories」がこれにあたります。
  3. 言語ファイルを作る
    ディレクトリの中に言語ファイルを作ります。言語ファイルの名前は Nucleus コアが使用しているものと同じにします。例えば、英語なら english.php。日本語の UTF-8 なら japanese-utf8.phpになります(UTF がお勧めです。参考までに日本語の EUC の場合は japanese-euc.php になります)。
  4. 文を定義する
    <?php
    define('_ABCDEF_MESSAGENAME',                  '実際のメッセージ');
      ・
      ・
      ・
    ?>

    のように言語ファイル内で分を定義します。
    多国語化する文字列の全てを定義する必要があります。定数は一回しか定義できないので、既に定義されているものと重複しないようにプラグインの名前をはじめにつけることが推奨されます(この例だと _ABCDEF)。

  5. init() メソッドの編集
    プラグイン内の init() メソッドを、次のように編集します(既に init() メソッドを定義している場合は init() メソッド内にコードを追記します)。
       function init() {
          // include language file for this plugin
          $language = ereg_replace( '[\\|/]', '', getLanguageName());
          if (file_exists($this->getDirectory().$language.'.php'))
             include_once($this->getDirectory().$language.'.php');
          else
             include_once($this->getDirectory().'english.php');
       }
  6. 言語ファイルの追加
    UTF-8からEUC-JPや,その逆はエディタでエンコードを変えるだけでできます。

あと,english.phpは日本語以外のデフォルトなのでなるべく作るようにします。

プラグインオプションの多国語化

プラグインAPIのPrePluginOptionsEditをフックして、オプションの名前や説明を多国語化することが出来ます。 メッセージの多国語化を完了した後に、以下の手順を実行します。

  1. プラグインオプションの生成
    メッセージの多国語化の時に、すでにプラグインオプションの説明等は定数として登録するようにコードが書かれていると思います。
    createOption('optionName', _PLUG_OPTION_DESC, ......);
    ...
    ...


    しかしこのままでは、インストール時に設定されている言語によって表示されるメッセージが決定されてしまうので、ここをオプションの説明の部分をクォートでくくって文字列として登録するように変更します。

    createOption('optionName', '_PLUG_OPTION_DESC', ......);
    ...
    ...


    もちろん、言語ファイルの定数「_PLUG_OPTION_DESC」は定義したままにしておきます。

  2. event_PrePluginOptionsEdit()メソッドを追加する
    プラグインに、event_PrePluginOptionsEdit()メソッドを追加して、次のコードを追加します。
       function event_PrePluginOptionsEdit($data)
       {
          if ($data['plugid'] === $this->getID()) {
             foreach($data['options'] as $key => $value){
                if (defined($value['description'])) {
                   $data['options'][$key]['description'] = constant($value['description']);
                }
                if (!strcmp($value['type'], 'select') && defined($value['typeinfo'])) {
                   $data['options'][$key]['typeinfo'] = constant($value['typeinfo']);
                }
             }
          }
       }
  3. getEventList()メソッドにイベントを追加
    プラグインのgetEventList()メソッドが返すarrayに、「PrePluginOptionsEdit」を追加します。
    getEventList() {
        return array('PostAddItem', 'PostUpdateItem', 'PrePluginOptionsEdit');
    }

    もちろん、プラグインにgetEventList()メソッドを再実装していない場合は、このメソッドを追加します。

 
plugindev/i18nm17n.txt · 最終更新: 2011/03/23 21:28 (外部編集)