Symfony2 мультиязычность

Symfony2 предлагает нам несколько вариантов работы с переводами, но самый простой на мой взгляд, это перевод на основе доменых сообщений - это такие файлы, в которых хранится перевод.

Соглашения

Существуют соглашения именования файлов переводов:

  • messages - переводы по умолчанию, все что Вы используете в twig-шаблоне
  • validators - переводы сообщений об ошибках, которые возникают в результате валидации данных, ключи эти сообщений указаны в сущности, данные которой подвергаются проверки

Пример переводов на основе messages

Например в папке src/Acme/DemoBundle/Resources/translations/ создаем файлы messages.en.yml и messages.ru.yml

  В свою очередь переводы в этих файлах записываются так:

ключ: значение
ключ2: значение2
и т.д.

Приведу пример файла на английском:

hi: Hello World
symfony2.is.great: Symfony is great

А теперь пример файла русского перевода:

hi: Привет Мир
symfony2.is.great: Симфони велик
Symfony2 the best: Симфони лучший

Заметили, ключи одинаковые, а значения разные, вот таким обрзом и организуется перевод.

А еще, в русском переводе я добавил третий ключ, которого нет в первом, это не ошибка, просто Симфони выводит ключи у которых нет перевода. Т.е. если мы напишем:

{{ 'Symfony2 the best'|trans }} 

то в английской версии интерфейса пользователя будет выведен ключ

Symfony2 the best

а в русской

Симфони лучший

благодаря такой возможности, для основного языка можно вообще не создавать файл перевода.

Пример переводов на основе validators

Создаем файл сущности src/Acme/DemoBundle/Entity/Orgunit.php

<?php
/**
 * Справочник единиц орг. структуры
 */
namespace Acme\DemoBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
 * @ORM\Entity(repositoryClass="Acme\DemoBundle\Repository\OrgunitRepository")
 */
class Orgunit
{
    ...

    /**
     * @ORM\Column(type="integer", options={"default":0, "unsigned": true, "comment" : "ID объекта орг. единицы"})
     * @Assert\NotBlank(message = "objectId.NotBlank")
     * @Assert\Type(type="integer", message="objectId.integer")
     * @Assert\Range(
     *      min = 1,
     *      max = 4294967295,
     *      minMessage = "objectId.minMessage",
     *      maxMessage = "objectId.maxMessage"
     * )
     */
    private $objectId = 0;

    ...

Создаем файл перевода src/Acme/DemoBundle/Resources/translations/validators.en.yml

objectId.NotBlank : Укажите значение
objectId.integer : Неправильный тип данных, должен быть {{ type }}
objectId.minMessage : Минимальное значение 1
objectId.maxMessage : Максимальное значение 4294967295

Обратите внимание на вторую строчку, а именно на {{ type }}, таким образом мы можем использовать значения переменных, указанные в классе сущности.

и пример кода, в результате которого присходит проверка валидации:

    public function formAction()
    {
        $entity = new Orgunit();

        $form = $this->createFormBuilder($entity);
        
        $request = $this->get('request');
        
        if ( $request->getMethod() === 'POST' ) {// Обрабатываем форму

            $form->handleRequest($request);// обновляем сущность и данные в форме

            if ($form->isValid()) {// Валидируем (правила валидации в нотации к классу )

                // валидация прошла успешно

            }else{

                // получаем ошибки валидации, согласно файла перевода
                $form_errors = $this->get('helper_form_errors')->getArray($form);

            }
        }

        return array( 'form' => $form->createView() );
    }

Вот так просто, Symfony2 позволяет нам создавать мультиязычные интерфейсы.

Теперь о плохом

Самое ужасное, это то, что Symfony2 ищет все эти файлы во всех бандлах (даже вендорных) в папка вида Resources/translations/ И все бы ничего, и с этим можно смириться, но все найденные файлы подгружаются в память, и даже с учетом кэша - память меньше не становится. К примеру, если у Вас 123 файла переводов, и в сумме это 25 мб, то независимо от того, используете на текущей странице перевод для французского языка или нет - Symfony2 все равно подгрузит его в память. В общем на скорость форматирования страницы это может повлиять только при нехватке памяти.

Вывод

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

Источники: 1 - 2 - 3 - 4

Оцени публикацию:
  • 4,18
Оценили человек: 4
Теги : Symfony2, translation, trans, мультиязычность, переводы

Похожие статьи:

Справочники и учебники:


Комментарии посетителей:
  • Спасибо за мануал! Простые переменные и валидация, то что надо:) !
    25 августа 2014, 19:55 коммент полезен : -1 # Михаил6
  • <a href="http://24lib.ru/%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD-%D0%BD%D0%B0%D1%81%D1%82%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5-%D1%87%D0%B0%D1%81%D1%8B-%D0%BD%D0%B5%D0%B4%D0%BE%D1%80%D0%BE%D0%B3%D0%BE"&gt;онлайн настенные часы недорого</a>

    http://adcreek.ru/%D0%B1%D0%BE%D0%BB%D0%B3%D0%B0%D1%80%D0%BA%D1%83-%D0%B1%D0%BE%D1%88-20--230-%D0%BC%D0%BC - болгарку бош 20  230 мм
    18 января 2017, 08:47 коммент полезен : 0 # Bryanped (гость)
  • Официальная работа на дому с обучением.
    23 января 2017, 21:03 коммент полезен : 0 # Wegorwot (гость)
  • <a href="http://3-diablo.ru/podglyadyvanie/novinki-porno-roliki"&gt;новинки порно ролики</a>

    http://1202umc.ru/%D0%B6%D0%B5%D0%BD%D1%81%D0%BA%D0%BE%D0%B5-%D0%B1%D0%B5%D0%BB%D1%8C%D0%B5/%D1%80%D0%B0%D1%81%D1%81%D0%BA%D0%B0%D0%B7%D1%8B-%D0%B4%D0%B5%D0%B2%D1%83%D1%88%D0%BA%D0%B8-%D0%BE-%D0%BB%D0%B8%D1%88%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B4%D0%B5%D0%B2%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8 - рассказы девушки о лишение девственности
    30 января 2017, 19:59 коммент полезен : 0 # Frankfaf (гость)
Предложения и пожелания:
Ваше имя:
Ваш E-mail:
Введите изображенные цифры:
Captcha
Главная
X

youtube.com/watch?v=7hFivbgIEqk

При полном или частичном использовании материалов данного сайта, ссылка на сайт "yapro.ru" обязательна как на источник информации.
Автоматический импорт материалов и информации с сайта запрещен.
Copyrights © 2007 - 2017 YaPro.Ru

Главная » Веб-мастеру » PHP »