使Smarty支持多种语言

Bas*_*sti 3 php multilingual smarty

首先,让我告诉你,我来自德国.所以我的英语不会很好.请原谅我.= P

我即将开发一个PHP5多语言网站.为了单独从业务逻辑的表示层,我使用SmartyTemplateEngine(v3.0.8).为了使它多语言我有时必须编辑这个SmartyPlugin.但最后它对我有用.我正是这样使用它:

{lang}language.string{/lang}.

在语言文件中我有:

language.string = <![CDATA[Hello world!]]> (所以它说你好世界!)

工作良好.但我想进一步扩展脚本.我想将一个变量传递给语言字符串.像这样的东西:

{lang s=$userName}language.string{/lang}

在我想要的语言文件中:

language.string = <![CDATA[Hello %s!]]> (所以它说Hello用户名!)

我试图找到谷歌的解决方案,但我找不到好的东西.至于我不是PHP的专业人士,我自己无法编辑它.我希望有人可以帮助我.这让我困扰了很久......

招呼,巴斯蒂

Sas*_*ley 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>
Run Code Online (Sandbox Code Playgroud)

在我的Localizer课程中,我初始化这些翻译并将它们保存在一个数组中.该translate函数从smarty获取ID字符串,在其翻译和任何##string##文本中搜索id .这些##...##将被已分配给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;

    }

}
Run Code Online (Sandbox Code Playgroud)

现在你必须告诉smarty它应该使用哪个功能.这可能是你的index.php:

include('Localizer.class.php');
Localizer::init('en');
$smarty->registerPlugin('block', 'translate', array('Localizer', 'translate'), true);
Run Code Online (Sandbox Code Playgroud)

要使用翻译,首先,我指定用户名:

$smarty->assign('username', $username);
Run Code Online (Sandbox Code Playgroud)

在模板文件中:

{translate}hello_world{/translate}
Run Code Online (Sandbox Code Playgroud)

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