Многоязычные сайты на Symfony. Проблемы и их решения Igor Brovchenko Igor.Brovchenko@gmail.com

Содержание

Слайд 2

Интернационализация (i18n) - это процесс проектирования программного обеспечения для потенциального использования

Интернационализация (i18n) - это процесс проектирования программного обеспечения для потенциального использования

с любым языком.

Локализация (l10n) - процесс адаптации программного обеспечения к культуре определенного региона.

Слайд 3

i18n и l10n в Symfony

i18n и l10n в Symfony

Слайд 4

i18n Routing (url) Model (content) Form Interface Translation l10n Date/Time Number

i18n
Routing (url)
Model (content)
Form
Interface Translation

l10n
Date/Time
Number
Currency

Что

надо для создания мультиязычного сайта в Symfony?
Слайд 5

User Culture = Language + Locale Примеры локали пользователя en: английский

User Culture = Language + Locale

Примеры локали пользователя
en: английский
en_AU: английский для

Австралии
en_GB: английский для Великобритании
en_CA: английский для Канады
en_US: английский для США

en_US 12,000.1 5/15/09 May 15, 2009 9:20:02 PM EEST $1,350.00

en_GB 12,000.1 15/05/2009 15 May 2009 21:20:02 EEST US$1,350.00

Слайд 6

Указываем Culture по умолчанию # frontend/config/settings.yml all: .settings: default_culture: ru

Указываем Culture по умолчанию

# frontend/config/settings.yml
all:
.settings:
default_culture: ru

Слайд 7

Использование Culture в Controller // Установить Culture $this->getUser()->setCulture('ru'); // Получить Culture $culture = $this->getUser()->getCulture();

Использование Culture в Controller

// Установить Culture
$this->getUser()->setCulture('ru');
// Получить Culture
$culture = $this->getUser()->getCulture();

Слайд 8

Helpers (templates) DateHelper format_date() format_datetime() time_ago_in_words() distance_of_time_in_words() format_daterange() NumberHelper format_number() format_currency()

Helpers (templates)
DateHelper
format_date()
format_datetime()
time_ago_in_words()
distance_of_time_in_words()
format_daterange()
NumberHelper
format_number()
format_currency()
I18nHelper
format_number_choice()
format_country()
format_language()

Forms (i18n)
sfWidgetFormI18nDate
sfWidgetFormI18nDateTime
sfWidgetFormI18nTime
sfWidgetFormI18nChoiceCountry
sfWidgetFormI18nChoiceCurrency
sfWidgetFormI18nChoiceLanguage
sfWidgetFormI18nChoiceTimezone

Хелперы и Формы

Слайд 9

Локализация контента # config/doctrine/schema.yml JobeetCategory: actAs: Timestampable: ~ I18n: fields: [name]

Локализация контента

# config/doctrine/schema.yml
JobeetCategory:
actAs:
Timestampable: ~
I18n:
fields: [name]
actAs:
Sluggable:

{ fields: [name], uniqueBy: [lang, name] }
columns:
name: { type: string(255), notnull: true }

# config/schema.yml
jobeet_category:
_attributes: { isI18N: true, i18nTable: jobeet_category_i18n }
id: ~
jobeet_category_i18n:
id: { type: integer, required: true, primaryKey: true, foreignTable: jobeet_category, foreignReference: id }
culture: { isCulture: true, type: varchar, size: 7, required: true, primaryKey: true }
name: { type: varchar(255), required: true }
slug: { type: varchar(255), required: true }

Слайд 10

Routing page: url: /:page param: ... article: url: /:year/:month/:day/:slug param: …

Routing

page:
url: /:page
param: ...
article:
url: /:year/:month/:day/:slug
param: …

page:
url: /:sf_culture/:page

param: ...
requirements: { sf_culture: (?:fr|en|de) }
article:
url: /:sf_culture/:year/:month/:day/:slug
param: ...
requirements: { sf_culture: (?:fr|en|de) }
Слайд 11

Схемы реализации многоязычности Язык сайта не указан в URL http://site.com/?lg=ru http://site.com/?lg=uk

Схемы реализации многоязычности

Язык сайта не указан в URL http://site.com/?lg=ru http://site.com/?lg=uk
Отдельный домен/субдомен на каждую

языковую версию http://site.com http://site.ua
Многоязычность через директории http://site.com/ru/ http://site.com/en/
Слайд 12

1. Язык сайта не указан в URL http://site.com/?lg=ru http://site.com/?lg=uk # Пример,

1. Язык сайта не указан в URL
http://site.com/?lg=ru http://site.com/?lg=uk

# Пример, как можно сделать

автовыбор языка для пользователя
# apps/frontend/lib/myUser.class.php
class myUser extends sfBasicSecurityUser
{
public function initialize(sfEventDispatcher $dispatcher, sfStorage $storage, $options = array())
{

$currentCulture = $storage->read(self::CULTURE_NAMESPACE);

}
}

− Смена языка сайта – ссылка-переключатель
− Плохо для SEO
− Плохо для usability

Слайд 13

2. Отдельный домен/cубдомен на каждую языковую версию http://site.com http://site.ua # Пример:

2. Отдельный домен/cубдомен на каждую языковую версию

http://site.com http://site.ua

# Пример: изменяем значение культуры

по умолчанию
# apps/frontend/config/frontendConfiguration.class.php
class frontendConfiguration extends sfApplicationConfiguration
{
public function configure()
{
$this->dispatcher->connect('user.change_culture', array($this, 'changeUserCulture'));
}
function changeUserCulture(sfEvent $event)
{
$user = $event->getSubject();
$culture = $event['culture'];
...
$user->setCulture($newCulture);

+ Хорошо для SEO
+ Сайты можно разместить на разных серверах
− Разные БД: задача синхронизация данных

http://site.com http://en.site.com

Слайд 14

3. Многоязычность через директории Вариант 1: http://site.com (ru) http://site.com/en/ Вариант 2:

3. Многоязычность через директории

Вариант 1: http://site.com (ru) http://site.com/en/

Вариант 2: http://site.com/ru/ http://site.com/en/

routing.yml
page:

url: /:sf_culture/:page
param: ...
requirements: { sf_culture: (?:ru|en) }
article:
url: /:sf_culture/:year/:month/:day/:slug
param: ...
requirements: { sf_culture: (?:ru|en) }

+ Хорошо для SEO
− Первый вариант требует кастимизации

Слайд 15

Работа с данными в админке

Работа с данными в админке

Слайд 16

Перевод интерфейса сайта $count )) ?>

Перевод интерфейса сайта


to our website.', null, 'navigation') ?>
$count )) ?>
Слайд 17

Работа со словарями локализации sfMessageSource_gettext.class.php sfMessageSource_MySQL.class.php sfMessageSource_SQLite.class.php sfMessageSource_XLIFF.class.php # frontend/i18n/messages.fr.xml Welcome

Работа со словарями локализации

sfMessageSource_gettext.class.php
sfMessageSource_MySQL.class.php
sfMessageSource_SQLite.class.php
sfMessageSource_XLIFF.class.php

# frontend/i18n/messages.fr.xml





Welcome to our website.
Bienvenue sur notre site web.


Today's date is
La date d'aujourd'hui est




Слайд 18

Работа со словарями в консоли > php symfony i18n:extract frontend en

Работа со словарями в консоли

> php symfony i18n:extract frontend en
> php

symfony i18n:extract --auto-save frontend en
> php symfony i18n:extract --auto-save --auto-delete frontend en
Ограничения:
команды работают только с стандартным словарем messages
Слайд 19

Плагины для локализации mgI18nPlugin zxI18nRoutingPlugin zsI18nExtractTranslatePlugin tgI18nPlugin

Плагины для локализации

mgI18nPlugin
zxI18nRoutingPlugin
zsI18nExtractTranslatePlugin
tgI18nPlugin

Слайд 20

mgI18nPlugin

mgI18nPlugin

Слайд 21

tgI18nPlugin Roadmap sf 1.2 - 1.4 Propel/Doctrine работа с БД через

tgI18nPlugin

Roadmap
sf 1.2 - 1.4
Propel/Doctrine
работа с БД через PDO

использование текущего соединения к БД
новая структура БД для использования форм
минимизировано количество запросов к БД
импорт XLIFF файлов в БД (каталоги учитываются)
экспорт в fixtures
собственный extract (каталоги учитываются)
удобный интерфейс для работы в админке (формы)
документация