Создание Smarty с поддержкой нескольких языков - PullRequest
3 голосов
/ 25 июня 2011

Прежде всего, позвольте мне сказать вам, что я из Германии. Так что мой английский будет не очень хорошо. Пожалуйста, прости меня. = 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!]]> (так говорит привет имя пользователя!)

Я пытался найти свое решение в Google, но не нашел ничего хорошего. Поскольку я не профессионал в PHP, я не способен редактировать его сам. Я надеюсь, что кто-то может помочь мне с этим. Это беспокоит меня довольно долго ...

Поздравил, Басти

1 Ответ

9 голосов
/ 25 июня 2011

Ну, я не использую этот плагин, но должен был сделать то же самое. Я выяснил, что для моих нужд лучшим решением было следующее:

В файле 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, ищет идентификатор в своих переводах и любой текст ##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}

Надеюсь, это поможет, привет из Австрии:)

...