首先,让我告诉你,我来自德国。所以我的英语不会很好。请原谅我。 = P
我即将开发一个使用PHP5的多语言网站。为了从业务逻辑中分离表示层,我使用SmartyTemplateEngine(v3.0.8)。为了使其多语言,我有时必须编辑this SmartyPlugin。但最后它对我有用。我正是这样用的:
{lang}language.string{/lang}
。
在语言文件中我有:
language.string = <![CDATA[Hello world!]]>
(所以它说的是Hello world!)
工作正常。但我想进一步扩展脚本。我想将一个变量传递给语言字符串。像这样:
{lang s=$userName}language.string{/lang}
在我想要的语言文件中:
language.string = <![CDATA[Hello %s!]]>
(所以它说的是Hello用户名!)
我试图在谷歌找到我的解决方案,但我找不到好的东西。至于我不是PHP的专业人士,我自己无法编辑它。我希望有人可以帮助我。这让我困扰了很长一段时间......
电贺, 巴斯蒂
答案 0 :(得分:9)
好吧,我没有使用这个插件,但必须做同样的事情。我发现,根据我的需要,以下是最佳解决方案:
在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它应该使用哪个功能。这可能是您的index.php
:
include('Localizer.class.php');
Localizer::init('en');
$smarty->registerPlugin('block', 'translate', array('Localizer', 'translate'), true);
要使用翻译,首先,我指定用户名:
$smarty->assign('username', $username);
在模板文件中:
{translate}hello_world{/translate}
希望这有助于奥地利的问候:)