イベント駆動型PHPフレームワークを作る その8

猫も杓子もグローバル化である。
Simgもグローバル化が求められるのが必然でしょう。
多言語対応ですね。
もちろん考えております。
ようするに言語リソースをベタうちするな、ということでしょう。
当然定数化です。
PHPにはdefineという強力な命令があります。
SmartyにはconfigLoadという定数読込機能もあります。
ということは多言語化なんて言語リソースを定数化すれば全く問題ないですね。
以下のように言語リソースを定数化して
[language.ini]

MESSAGE=やればできる!

初期化処理で以下のようにSmartyとPHPに対して宣言します。

$smarty->configLoad('language.ini');
$ini = parse_ini_file('language.ini');
foreach($ini as $key=>$val) {
  define($key, "{$val}");
}

このようにしてSmartyのテンプレートで以下のように記述すれば多言語化なんて簡単です。
[hello.tpl]

<html>
  <body>
    <p>
      {#MESSAGE#}
    </p>
  </body>
</html>

さて英語化です。

MESSAGE=Yes we can!

はい終了!
どれどれ、

(!)Warning: syntax error, unexpected TC_CONSTANT in ・・・

な、な、な、なんですか、これ?
エラーです。
調べてみるとPHPのparse_ini_fileについてマニュアルにこんなことが書いてありました。

注意: ini ファイル上でキーとして使ってはいけない単語があります。 
null, yes, no, true, false, on, off, none などです。 
null, off, no および false は "" となり、
on, yes および true は "1" となります。 
次の文字 ?{}|&~![()^" は、キーで使ってはいけません。 
また、値の中で特別な意味を持ちます。

ちょっと使えそうもないですね。
どうやら著名なフレームワークもparse_ini_fileを利用していないみたいです。
Simgもこれに倣うべきですね。
独自のparse_ini_fileを作りましょう。

function simg_parse_ini_file($file, $process_sections=false) {
  if(!$lines = file($file, 1))
    return false;
  $res  = array();
  $curr = &$res;
  $sectionPattern = '/^[([^]]+)]/';
  $linePattern = '/^s*([^=s]*)s*=s*"?(.*?)"?s*$/';
  foreach($lines as $line) {
    if(strlen($line) > 0 && substr($line, 0, 1) != ';') {
      if($process_sections && preg_match($sectionPattern, $line, $m)) {
        $res[$m[1]] = array();
        $curr = &$res[$m[1]];
      } elseif(preg_match($linePattern, $line, $m)) {
        $curr[$m[1]] = $m[2];
      }
    }
  }
  return $res;
}

katase_nさんのコードを参考にさせていただきました。
有難うございました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です