php - 让Smarty支持多种语言

标签 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!]]> (所以它说你好用户名!)

我试图通过 Google 寻找我的解决方案,但我没有找到好的东西。至于我不是 PHP 专业人士,我无法自己编辑它。我希望有人可以帮助我。困扰了我好久...

您好, 巴斯蒂

最佳答案

好吧,我没有使用这个插件,但不得不做同样的事情。我发现对于我的需求,以下是最好的解决方案:

在一个 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}

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

关于php - 让Smarty支持多种语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6476558/

相关文章:

php - 从 cassandra 将完整表导出到 csv

PHP 正则表达式删除多个 ?-marks

javascript - Vue 内容在父组件之外渲染

php - Smarty:特殊字符被更改为不需要的 - utf8

javascript - 用其他语言编写 JavaScript

Drupal : how to change current language of taxonomy

php - Web 服务器和 MySQL 服务器在同一台机器上 "Error :(28000/1045) Access denied for user "

php - 特殊字符未在 TEXTBOX 中正确显示

Smarty 日期差异

haskell - 在 Haskell 实现中是否允许使用 Unicode 标识符是在哪里指定的?