Многоязычная поддержка
Компонент Phalcon\Translate помогает создавать многоязычные приложения. Приложения, использующие этот компонент, отображают контент на разных языках в зависимости от выбранного пользователем языка, поддерживаемого приложением.
Адаптеры
Этот компонент использует адаптеры для чтения сообщений перевода из различных источников унифицированным способом.
| Адаптер | Описание |
|---|---|
| Phalcon\Translate\Adapter\NativeArray | Использует массивы PHP для хранения сообщений. Это лучший вариант с точки зрения производительности. |
Использование компонента
Строки перевода хранятся в файлах. Структура этих файлов может варьироваться в зависимости от используемого адаптера. Phalcon предоставляет вам свободу организации строк перевода. Простая структура может быть такой:
app/messages/en.php app/messages/es.php app/messages/fr.php app/messages/zh.php
Каждый файл содержит массив переводов в формате ключ/значение. Для каждого файла перевода ключи уникальны. Один и тот же массив используется в разных файлах, где ключи остаются одинаковыми, а значения содержат переведенные строки в зависимости от каждого языка.
// app/messages/en.php
$messages = [
"hi" => "Hello",
"bye" => "Good Bye",
"hi-name" => "Hello %name%",
"song" => "This song is %song%",
];
// app/messages/fr.php
$messages = [
"hi" => "Bonjour",
"bye" => "Au revoir",
"hi-name" => "Bonjour %name%",
"song" => "La chanson est %song%",
];
Реализация механизма перевода в вашем приложении тривиальна, но зависит от того, как вы хотите ее реализовать. Вы можете использовать автоматическое определение языка из браузера пользователя или предоставить страницу настроек, где пользователь может выбрать свой язык.
Простым способом определения языка пользователя является разбор содержимого $_SERVER['HTTP_ACCEPT_LANGUAGE'], или, если хотите, вы можете получить доступ к нему напрямую, вызвав $this->request->getBestLanguage() из действия/контроллера:
use Phalcon\Mvc\Controller;
use Phalcon\Translate\Adapter\NativeArray;
class UserController extends Controller
{
protected function getTranslation()
{
// Ask browser what is the best language
$language = $this->request->getBestLanguage();
$translationFile = "app/messages/" . $language . ".php";
// Check if we have a translation file for that lang
if (file_exists($translationFile)) {
require $translationFile;
} else {
// Fallback to some default
require "app/messages/en.php";
}
// Return a translation object
return new NativeArray(
[
"content" => $messages,
]
);
}
public function indexAction()
{
$this->view->name = "Mike";
$this->view->t = $this->getTranslation();
}
}
Метод _getTranslation() доступен для всех действий, которые требуют переводов. Переменная $t передается в представления, и с ее помощью мы можем переводить строки на этом уровне:
<!-- welcome -->
<!-- String: hi => 'Hello' -->
<p><?php echo $t->_("hi"), " ", $name; ?></p>
Метод _() возвращает переведенную строку на основе переданного индекса. Некоторые строки должны включать заполнитель для вычисленных данных, например, Привет %имя%. Эти заполнители могут быть заменены переданными параметрами в методе _(). Переданные параметры представлены в виде массива ключ/значение, где ключ соответствует имени заполнителя, а значение — фактическим данным, которые нужно заменить:
<!-- welcome -->
<!-- String: hi-name => 'Hello %name%' -->
<p><?php echo $t->_("hi-name", ["name" => $name]); ?></p>
Некоторые приложения реализуют многоязычие в URL, например, http://www.mozilla.org/es-ES/firefox/. Phalcon может реализовать это, используя маршрутизатор.
Реализация собственных адаптеров
Интерфейс Phalcon\Translate\AdapterInterface должен быть реализован для создания собственных адаптеров перевода или расширения существующих:
use Phalcon\Translate\AdapterInterface;
class MyTranslateAdapter implements 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–2017 Phalcon Framework Team
Licensed under the Creative Commons Attribution License 3.0.
https://docs.phalconphp.com/en/latest/reference/translate.html