Spec-Zone.ru › Phalcon 2

Многоязычная поддержка

Компонент Phalcon\Translate помогает создавать многоязычные приложения. Приложения, использующие этот компонент, отображают контент на разных языках в зависимости от выбранного пользователем языка, поддерживаемого приложением.

Адаптеры

Этот компонент использует адаптеры для чтения сообщений перевода из различных источников унифицированным способом.

Адаптер Описание
NativeArray Использует массивы PHP для хранения сообщений. Это лучший вариант с точки зрения производительности.

Использование компонента

Строки перевода хранятся в файлах. Структура этих файлов может варьироваться в зависимости от используемого адаптера. Phalcon предоставляет вам свободу организации ваших строк перевода. Простая структура может быть такой:

app/messages/en.php
app/messages/es.php
app/messages/fr.php
app/messages/zh.php

Каждый файл содержит массив переводов в формате ключ/значение. Для каждого файла перевода ключи уникальны. Один и тот же массив используется в разных файлах, где ключи остаются неизменными, а значения содержат переведенные строки в зависимости от каждого языка.

//app/messages/es.php
$messages = array(
    "hi"      => "Hello",
    "bye"     => "Good Bye",
    "hi-name" => "Hello %name%",
    "song"    => "This song is %song%"
);
//app/messages/fr.php
$messages = array(
    "hi"      => "Bonjour",
    "bye"     => "Au revoir",
    "hi-name" => "Bonjour %name%",
    "song"    => "La chanson est %song%"
);

Реализация механизма перевода в вашем приложении тривиальна, но зависит от того, как вы хотите это реализовать. Вы можете использовать автоматическое определение языка из браузера пользователя или предоставить страницу настроек, где пользователь может выбрать свой язык.

Простой способ определения языка пользователя — разобрать содержимое $_SERVER[‘HTTP_ACCEPT_LANGUAGE’], или, если хотите, получить его напрямую, вызвав $this->request->getBestLanguage() из действия/контроллера:

class UserController extends \Phalcon\Mvc\Controller
{

  protected function _getTranslation()
  {

    //Ask browser what is the best language
    $language = $this->request->getBestLanguage();

    //Check if we have a translation file for that lang
    if (file_exists("app/messages/".$language.".php")) {
       require "app/messages/".$language.".php";
    } else {
       // fallback to some default
       require "app/messages/en.php";
    }

    //Return a translation object
    return new \Phalcon\Translate\Adapter\NativeArray(array(
       "content" => $messages
    ));

  }

  public function indexAction()
  {
    $this->view->setVar("name", "Mike");
    $this->view->setVar("t", $this->_getTranslation());
  }

}

Метод _getTranslation доступен для всех действий, которым требуются переводы. Переменная $t передается в представления, и с ее помощью мы можем переводить строки на этом уровне:

<!-- welcome -->
<!-- String: hi => 'Hello' -->
<p><?php echo $t->_("hi"), " ", $name; ?></p>

Функция «_» возвращает переведенную строку на основе переданного индекса. Некоторые строки должны включать заглушки для вычисляемых данных, например, Привет %name%. Эти заглушки можно заменить переданными параметрами в функции «_». Переданные параметры имеют вид массива ключ/значение, где ключ соответствует имени заглушки, а значение — фактическим данным, которые должны быть заменены:

<!-- welcome -->
<!-- String: hi-user => 'Hello %name%' -->
<p><?php echo $t->_("hi-user", array("name" => $name)); ?></p>

Некоторые приложения реализуют многоязычие в URL, например, http://www.mozilla.org/es-ES/firefox/. Phalcon может реализовать это с помощью маршрутизатора.

Реализация собственных адаптеров

Интерфейс Phalcon\Translate\AdapterInterface должен быть реализован для создания собственных адаптеров перевода или расширения существующих:

class MyTranslateAdapter implements Phalcon\Translate\AdapterInterface
{

    /**
     * Adapter constructor
     *
     * @param array $data
     */
    public function __construct($options);

    /**
     * Returns the translation string of the given key
     *
     * @param   string $translateKey
     * @param   array $placeholders
     * @return  string
     */
    public function _($translateKey, $placeholders=null);

    /**
     * Returns the translation related to the given key
     *
     * @param   string $index
     * @param   array $placeholders
     * @return  string
     */
    public function query($index, $placeholders=null);

    /**
     * Check whether is defined a translation key in the internal array
     *
     * @param   string $index
     * @return  bool
     */
    public function exists($index);

}

В Phalcon Incubator доступно больше адаптеров для этого компонента.

© 2011–2016 Phalcon Framework Team
Licensed under the Creative Commons Attribution License 3.0.
https://docs.phalconphp.com/en/2.0.0/reference/translate.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API