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

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

Сегодня я расскажу о том как просто перевести все тексты в Symfony на язык, установленный в конфигах.


Первым делом – проверяем какой язык у нас стоит в самой Symfony – в файле app/config/parameters.yml ищем строку

locale: ru

Отлично – язык русский, и первый описанный перевод – перевод простых текстовых сообщений с помощью Twig

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

В папке src/Acme/DemoBundle/Resources/translations/ Создаем файл messages.ru.yml. Как вы уже догадались – там и будут храниться наши переводы вида

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

Добавим туда что то вроде

Hello World: Привет Мир

Теперь для того чтобы отобразить это с помощью нашего шаблонизатора необходимо всего лишь добавить модификатор trans

{{ 'Hello World' | trans }}

Выдаст нам “Привет Мир”
Если данного текста нет в файле с переводами, то Symfony выведет необработанную строку.
Как видите – не так уж и сложно стандартными средствами Symfony и Twig реализовать переводы текстов.

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

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

<?php
/**
 * Различные места вашего города
 */
namespace AcmeDemoBundleEntity;

use DoctrineORMMapping as ORM;
use SymfonyComponentValidatorConstraints as Assert;
/**
 * @ORMEntity(repositoryClass="AcmeDemoBundleRepositoryPlaceRepository")
 */
class Place
{
    ...

    /**
     * @ORMColumn(type="integer", options={"default":0, "unsigned": true, "comment" : "ID Места вашего города})
     * @AssertNotBlank(message = "placeId.NotBlank")
     * @AssertType(type="integer", message="placeId.integer")
     * @AssertRange(
     *      min = 1,
     *      max = 4294967295,
     *      minMessage = "placeId.minMessage",
     *      maxMessage = "palceId.maxMessage"
     * )
     */
    private $placeId = 0;

    ...

Также нам потребуется файл перевода – src/Acme/DemoBundle/Resources/translations/validators.en.yml

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

С помощью переменной {{ type }} (2 строка) мы можем указывать на переменные объявленные в классе

И, наконец, пример кода с помощью которого происходит валидация

public function formAction(){
        $entity = new Place();
        $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, из коробки, позволяет нам создавать мультиязычные интерфейсы

[Всего голосов: 0    Средний: 0/5]

Добавить комментарий

Ваш e-mail не будет опубликован.