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