22
Многоязычные сайты на Symfony. Проблемы и их решения Igor Brovchenko [email protected]

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

Embed Size (px)

DESCRIPTION

Symfony Camp UA 2010: Многоязычные сайты на Symfony. Проблемы и их решения

Citation preview

Page 1: Многоязычные сайты на Symfony. Проблемы и их решения

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

Igor [email protected]

Page 2: Многоязычные сайты на Symfony. Проблемы и их решения

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

обеспечения для потенциального использования с любым языком.

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

определенного региона.

Page 3: Многоязычные сайты на Symfony. Проблемы и их решения

i18n и l10n в Symfony

Page 4: Многоязычные сайты на Symfony. Проблемы и их решения

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

l10n- Date/Time- Number- Currency

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

Page 5: Многоязычные сайты на Symfony. Проблемы и их решения

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

Page 6: Многоязычные сайты на Symfony. Проблемы и их решения

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

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

Page 7: Многоязычные сайты на Symfony. Проблемы и их решения

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

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

Page 8: Многоязычные сайты на Symfony. Проблемы и их решения

Helpers (templates)

DateHelperformat_date()format_datetime()time_ago_in_words()distance_of_time_in_words()format_daterange()

NumberHelperformat_number()format_currency()

I18nHelperformat_number_choice()format_country()format_language()

Forms (i18n)

sfWidgetFormI18nDatesfWidgetFormI18nDateTimesfWidgetFormI18nTimesfWidgetFormI18nChoiceCountrysfWidgetFormI18nChoiceCurrencysfWidgetFormI18nChoiceLanguagesfWidgetFormI18nChoiceTimezone

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

Page 9: Многоязычные сайты на Symfony. Проблемы и их решения

Локализация контента# config/doctrine/schema.ymlJobeetCategory: actAs: Timestampable: ~ I18n: fields: [name] actAs: Sluggable: { fields: [name], uniqueBy: [lang, name] } columns: name: { type: string(255), notnull: true }

# config/schema.ymljobeet_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 }

Page 10: Многоязычные сайты на Symfony. Проблемы и их решения

Routingpage: 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) }

Page 11: Многоязычные сайты на Symfony. Проблемы и их решения

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

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

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

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

Page 12: Многоязычные сайты на Symfony. Проблемы и их решения

1. Язык сайта не указан в URL

http://site.com/?lg=ruhttp://site.com/?lg=uk

# Пример, как можно сделать автовыбор языка для пользователя# apps/frontend/lib/myUser.class.phpclass myUser extends sfBasicSecurityUser{ public function initialize(sfEventDispatcher $dispatcher, sfStorage $storage, $options = array()) { … $currentCulture = $storage->read(self::CULTURE_NAMESPACE); … }}

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

Page 13: Многоязычные сайты на Symfony. Проблемы и их решения

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

http://site.comhttp://site.ua

# Пример: изменяем значение культуры по умолчанию# apps/frontend/config/frontendConfiguration.class.phpclass 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.comhttp://en.site.com

Page 14: Многоязычные сайты на Symfony. Проблемы и их решения

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

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

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

routing.ymlpage: 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 − Первый вариант требует кастимизации

Page 15: Многоязычные сайты на Symfony. Проблемы и их решения

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

Page 16: Многоязычные сайты на Symfony. Проблемы и их решения

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

<?php echo __("Today's date is ") ?>

<?php echo __('Welcome to our website.', null, 'navigation') ?>

<?php echo __('and %count% more...', array('%count%' => $count )) ?>

Page 17: Многоязычные сайты на Symfony. Проблемы и их решения

Работа со словарями локализацииsfMessageSource_gettext.class.phpsfMessageSource_MySQL.class.phpsfMessageSource_SQLite.class.phpsfMessageSource_XLIFF.class.php

# frontend/i18n/messages.fr.xml <?xml version="1.0" ?> <xliff version="1.0"> <file original="global" source-language="en_US" datatype="plaintext"> <body> <trans-unit id="1"> <source>Welcome to our website.</source> <target>Bienvenue sur notre site web.</target> </trans-unit> <trans-unit id="2"> <source>Today's date is </source> <target>La date d'aujourd'hui est </target> </trans-unit> </body> </file> </xliff>

Page 18: Многоязычные сайты на Symfony. Проблемы и их решения

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

> 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

Page 19: Многоязычные сайты на Symfony. Проблемы и их решения

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

• mgI18nPlugin

• zxI18nRoutingPlugin

• zsI18nExtractTranslatePlugin

• tgI18nPlugin

Page 20: Многоязычные сайты на Symfony. Проблемы и их решения

mgI18nPlugin

Page 21: Многоязычные сайты на Symfony. Проблемы и их решения

tgI18nPlugin

Roadmap

• sf 1.2 - 1.4• Propel/Doctrine• работа с БД через PDO• использование текущего соединения к БД• новая структура БД для использования форм• минимизировано количество запросов к БД• импорт XLIFF файлов в БД (каталоги учитываются)• экспорт в fixtures• собственный extract (каталоги учитываются)• удобный интерфейс для работы в админке (формы)• документация