使Smarty支持多种语言

时间:2011-06-25 07:40:41

标签: php smarty multilingual

首先,让我告诉你,我来自德国。所以我的英语不会很好。请原谅我。 = 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的专业人士,我自己无法编辑它。我希望有人可以帮助我。这让我困扰了很长一段时间......

电贺, 巴斯蒂

1 个答案:

答案 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}

希望这有助于奥地利的问候:)