Upload
igor-brovchenko
View
3.422
Download
0
Embed Size (px)
DESCRIPTION
Symfony Camp UA 2010: Многоязычные сайты на Symfony. Проблемы и их решения
Citation preview
Многоязычные сайты на Symfony. Проблемы и их решения
Igor [email protected]
Интернационализация (i18n) - это процесс проектирования программного
обеспечения для потенциального использования с любым языком.
Локализация (l10n) - процесс адаптации программного обеспечения к культуре
определенного региона.
i18n и l10n в Symfony
i18n- Routing (url)- Model (content)- Form- Interface Translation
l10n- Date/Time- Number- Currency
Что надо для создания мультиязычного сайта в 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
Указываем Culture по умолчанию
# frontend/config/settings.yml all: .settings: default_culture: ru
Использование Culture в Controller
// Установить Culture$this->getUser()->setCulture('ru'); // Получить Culture$culture = $this->getUser()->getCulture();
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
Хелперы и Формы
Локализация контента# 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 }
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) }
Схемы реализации многоязычности
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/
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
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
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 − Первый вариант требует кастимизации
Работа с данными в админке
Перевод интерфейса сайта
<?php echo __("Today's date is ") ?>
<?php echo __('Welcome to our website.', null, 'navigation') ?>
<?php echo __('and %count% more...', array('%count%' => $count )) ?>
Работа со словарями локализации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>
Работа со словарями в консоли
> 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
Плагины для локализации
• mgI18nPlugin
• zxI18nRoutingPlugin
• zsI18nExtractTranslatePlugin
• tgI18nPlugin
mgI18nPlugin
tgI18nPlugin
Roadmap
• sf 1.2 - 1.4• Propel/Doctrine• работа с БД через PDO• использование текущего соединения к БД• новая структура БД для использования форм• минимизировано количество запросов к БД• импорт XLIFF файлов в БД (каталоги учитываются)• экспорт в fixtures• собственный extract (каталоги учитываются)• удобный интерфейс для работы в админке (формы)• документация
Вопросы ?
• Igor Brovchenko
• http://tigor.com.ua
• http://www.linkedin.com/in/IgorBrovchenko