Локализация
Для перевода приложения на разные языки в Silex используется провайдер
TranslationServiceProvider.
Этот провайдер устанавливает сервисы такие как
translator
, translator.loader
, translator.message_selector
которые
используются для локализации приложения.
Silex использует Symfony2 Translation компонент. Подробности можно посмотреть здесь.
Конфигурация
Конфигурация провайдера задается в app/Resources/Config/config.yml
файле.
Пример приведен ниже:
...
translation:
class: Silex\Provider\TranslationServiceProvider
parameters:
locale_fallbacks: [en, ru]
locale: %locale%
...
Расширение функциональности сервиса локализации задается в действии _extendServices
класса Bootstrap app/Bootstrap.php
.
Пример приведен ниже:
...
//Extend translator
if (isset($app['translator']) AND $app['translator'] instanceof \Silex\Translator) {
$app['translator'] = $app->share(
$app->extend(
'translator', function (\Silex\Translator $translator, $app) {
$translator->addLoader('yml', new Loader\YamlFileLoader());
$translator->addResource('yml', BASEPATH . '/app/Resources/translations/messages.en.yml', 'en', 'messages');
$translator->addResource('yml', BASEPATH . '/app/Resources/translations/messages.ru.yml', 'ru', 'messages');
$translator->addResource('yml', BASEPATH . '/app/Resources/translations/Validators.en.yml', 'en', 'validators');
$translator->addResource('yml', BASEPATH . '/app/Resources/translations/Validators.ru.yml', 'ru', 'validators');
if ($app['session']->has('_locale')) {
$locale = $app['session']->get('_locale');
$translator->setLocale($locale);
}
return $translator;
}
)
);
}
...
Здесь указаны какие файлы ресурсов использует переводчик. В нашем случае это yml
файлы,
которые находятся в директории app/Resources/translations/
.
В файлеparameters.yml
в параметре locale можно
установить язык локализации по умолчанию.
Использование
Дополнительные функции для локализации приложения заданы в примеси
app/Controllers/Helper/TranslateTrait
.
В приложении сервис Translation можно использовать так:
$this->addFlash('info_message', $this->trans('added_new_message', array('' => $ormPost->getTitle())));
В шаблоне сервис Translation можно использовать так:
{ { 'edit'|trans|capitalize } }