猫も杓子もグローバル化である。
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さんのコードを参考にさせていただきました。
有難うございました。