首先,让我告诉你,我来自德国。所以我的英语不会很好。请原谅我。=P
我即将用PHP5开发一个多语言网站。为了将表示层与业务逻辑分离,我使用了SmartyTemplateEngine(v3.0.8)。为了使其成为多语言的,我有时不得不编辑这个SmartyPlugin。但最终它对我起了作用。我是这样使用它的:
CCD_ 1。
在我的语言文件中:
language.string = <![CDATA[Hello world!]]>
(所以它说你好世界!)
工作良好。但我想进一步扩充一下剧本。我想把一个变量传递给语言字符串。类似这样的东西:
{lang s=$userName}language.string{/lang}
在我想要的语言文件中:
language.string = <![CDATA[Hello %s!]]>
(所以上面写着你好用户名!)
我试着在谷歌上找到我的解决方案,但没有找到好的。由于我不是PHP专业人士,我自己也无法编辑它。我希望有人能帮我。它困扰了我很长一段时间。。。
问候,Basti
好吧,我没有使用这个插件,但不得不做同样的事情。我发现,对于我的需求,以下是最好的解决方案:
在一个XML文件中,我定义了我的字符串(这个例子是xml/en/content.xml
):
<translations>
<translation id="hello_world"><![CDATA[Hello ##username##!]]></translation>
<translation id="how_are_you"><![CDATA[How are you?]]></translation>
</translations>
在我的Localizer
类中,我初始化这些翻译并将它们保存在一个数组中。translate
函数从smarty获取ID字符串,在其翻译中搜索ID以及任何##string##
文本。这些##...##
将替换为已分配给smarty的变量。
class Localizer {
private static $translations = array();
public static function init($language) {
$temp_content = simplexml_load_file('xml/' . $language . '/content.xml');
foreach ($temp_content as $key => $value){
self::$translations[(string)$value['id']] = (string)$value;
}
}
public static function translate($params, $name, $smarty) {
$translation = '';
if( ! is_null($name) && array_key_exists($name, self::$translations)) {
// get variables in translation text
$translation = self::$translations[$name];
preg_match_all('/##([^#]+)##/i', $translation, $vars, PREG_SET_ORDER);
// replace with assigned smarty values
foreach($vars as $var) {
$translation = str_replace($var[0], $smarty->getTemplateVars($var[1]), $translation);
}
}
return $translation;
}
}
现在你必须告诉smarty它应该使用哪个功能。这可能是您的{lang}language.string{/lang}
0:
include('Localizer.class.php');
Localizer::init('en');
$smarty->registerPlugin('block', 'translate', array('Localizer', 'translate'), true);
要使用翻译,首先,我分配用户名:
$smarty->assign('username', $username);
在模板文件中:
{translate}hello_world{/translate}
希望这能有所帮助,来自奥地利的问候:)