使Smarty支持多种语言



首先,让我告诉你,我来自德国。所以我的英语不会很好。请原谅我。=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}

希望这能有所帮助,来自奥地利的问候:)

最新更新