必要なのは(非常に単純な)「テンプレートシステム」ですが、問題にはテンプレートの2つのインスタンスがあります。
- $X を設定して、
Hello $X!
" " を " Hello Jonh!
" または " " に変換します。Hello Maria!
(PHP は文字列宣言でこれを行います)。
- 適切なテンプレートを選択します:
Hello $X!
英語の場合は " ¡Hola $X!
"、スペイン語の場合は " "。
項目 1 はより単純ですが、アルゴリズムの順序は 2,1 (項目 2 と項目 1) です。この単純なタスクでは、正規表現は必要ありません (PHP の「プレースホルダー付き文字列」を再発明するため)。
説明する
項目 1 の場合、最も簡単な方法は、"Hello" と言う特殊な関数を宣言することです。
// for any PHP version.
function template1($name) { return "<p>Hello $name!</p>";}
print template1("Maria");
項目 2 については、一般化が必要です。これは、PHP がクロージャーによって行うことでもあります。
header('Content-Type: text/html; charset=utf-8'); // only for remember UTF8.
// for PHP 5.3+. Use
function generalTemplate1($K) {
// $K was a literal constant, now is a customized content.
return function($name) use ($K) {return "<p>$K $name!</p>"; };
}
// Configuring template1 (T1) for each language:
$T1_en = generalTemplate1('Hello'); // english template
$T1_es = generalTemplate1('¡Hola'); // spanish template
// using the T1 multilingual
print $T1_en('Jonh'); // Hello Jonh!
print $T1_es('Maria'); // ¡Hola Maria!
その他のテンプレートについては、generalTemplate2()、generalTemplate3() などを使用してください。$T2_en
、$T2_es
、$T2_fr
、$T3_en
、$T3_es
など
解決
さて、実際に使用するために、配列を使用するのが好きです...まあ、データ構造の問題と、さらに1レベルの一般化があります。コストは、プレースホルダーの変数名パーサーです。preg_replace_callback() で単純な正規表現を使用しました。
function expandMultilangTemplate($T,$K,$lang,$X) {
// string $T is a template, a HTML structure with $K and $X placeholders.
// array $K is a specific language constants for the template.
// array $lang is the language, a standard 2-letter code. "en", "fr", etc.
// array $X is a set of name-value (compatible with $T placeholders).
// Parsing steps:
$T = str_replace('{#K}',$K[$lang],$T); // STEP-1: expand K into T with lang.
// STEP-2: expand X into T
global $_expMultTpl_X; // need to be global for old PHP versions
$_expMultTpl_X = $X;
$T = preg_replace_callback(
'/@([a-z]+)/',
create_function(
'$m',
'global $_expMultTpl_X;
return array_key_exists($m[1],$_expMultTpl_X)?
$_expMultTpl_X[$m[1]]:
"";
'
),
$T
);
return $T;
}
// CONFIGURING YOUR TEMPLATE AND LANGUAGES:
$T = "<p>{#K} @name@surname!</p>";
$K = array('en'=>'Hello','es'=>'¡Hola');
// take care with things like "!", that is generic, and "¡" that is not.
// USING!
print expandMultilangTemplate(
$T, $K, 'en', array('name'=>'Jonh', 'surname'=>' Smith') );
print expandMultilangTemplate($T, $K, 'es', array('name'=>'Maria'));
このスクリプトは PHP5 でテストしましたが、古いバージョン (PHP 4.0.7 以降) で動作します。
「多言語ファイル」について: 翻訳がファイルに含まれている場合は、次のようなものを使用できます
$K = getTranslation('translationFile.txt');
function getTranslation($file,$sep='|') {
$K = array();
foreach (file($file) as $line) {
list($lang,$words) = explode($sep,$line);
$K[$lang]=$words;
}
}
そしてファイル
en|Hello
es|¡Hola
PHP 5.3 で最もシンプル
PHP 5.3+ を使用している場合、この「最も単純な多言語テンプレート システム」を表現するシンプルでエレガントな方法があります。
function expandMultilangTemplate($T,$K,$lang,$X) {
$T = str_replace('{#K}',$K[$lang],$T);
$T = preg_replace_callback(
'/@([a-z]+)/',
function($m,$X=NULL) use ($X) {
return array_key_exists($m[1],$X)? $X[$m[1]]: '';
},
$T
);
return $T;
}