让它看起来更复杂一点,展望未来可能会很明智。如果您将实现部件移除到单独的类中,则可以将实际使用情况和翻译的实现分开。如果您计划稍后使用gettext
(po/mo文件),则可以更轻松地进行切换。
一个简单的,但未经检验,例如将
class translate{
private $translations = [
'hello' => "Wellcome %s to our website!",
]
public function trans($key, $value)
{
return sprintf($this->translations[$key], $value);
}
}
你要知道,这是一个简单的例子,而且可能需要一些工作 - >例如,它总是假定一个变量,等等等等,但这个想法是你创建了一个具有内部实现的类和一个你调用的函数。如果你可以保持函数调用的脚印不变,你可以改变你的翻译系统的工作!
你会打电话给这个像这样
$trans = new Translate();
echo $trans->trans('hello', 'Amir');
(再说一次,我在回答框中键入这一点,没有检查语法,测试等已经做了,所以这可能是不是复制粘贴准备就绪类,但它是关于这个想法)
编辑:按要求,多一点例子。同样,没有测试过,可能是一些语法错误等,而是帮助你的想法:
class translate{
private $translations = [
'hello' => array('test' =>"Welcome %s to our website!", 'vars' => 1),
'greet' => array('test' =>"I'd like to say $s to %s ", 'vars' => 2),
]
public function trans($key, array $values)
{
// no translation
if(!isset($this->translations[$key])){
return false; // or exception if you want
}
// translation needs more (or less) variables
if($this->translations[$key][vars] !== count($values)){
return false; // or exception if you want
}
// note: now using vsprintf
return vsprintf($this->translations[$key], $values);
}
}
'欢迎'$ useName'到我们的网站' –
你在找[sprintf()](http://php.net/manual/en/function.sprintf.php) – Saty
或'str_replace '。 –