Мобильная
версия

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

Дата: Категория: Symfony

Данная заметка о том, как легко и просто настроить в 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 Acme\DemoBundle\Entity;

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

    /**
     * @ORM\Column(type="integer", options={"default":0, "unsigned": true, "comment" : "ID Места вашего города})
     * @Assert\NotBlank(message = "placeId.NotBlank")
     * @Assert\Type(type="integer", message="placeId.integer")
     * @Assert\Range(
     *      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, из коробки, позволяет нам создавать мультиязычные интерфейсы

Теги: #Symfony2, #Мультиязычность, #Translation

Ваша оценка:

Рейтинг: 9.0 (Оценок: 1)

Комментарий:

Copyright © DOC_tr 2015-2017 г. Все права защищены
Яндекс.Метрика
Перейти к мобильной версии