Игорь Бровченко Киев, 16 мая 2009 Интернационализация и локализация в Symfony
Что такое I18n и L10n? Интернационализа́ция (англ. internationalization) процесс адаптации продукта, такого как программное или аппаратное обеспечение, к языковым и культурным особенностям региона (регионов), отличного от того, в котором разрабатывался продукт. В английском языке для слова «internationalization» принято сокращение «i18n». При этом число 18 означает количество пропущенных между «i» и «n» букв. Локализа́ция (англ. localization) перевод и адаптация элементов интерфейса, вспомогательных файлов и документации. В английском языке для слова «localization» иногда применяется сокращение «l10n». При этом число 10 означает количество пропущенных между «l» и «n» букв. Источник: ВикипедиЯ
Предоставление региональных данных для всех языков Перевод текстов (интерфейс, данные БД) Стандарты форматирования дат и чисел в зависимости от региональных настроек Поддержка I18n и L10n в Symfony?
Все данные для интернационализации (I18n) получены из Common Locale Data Repository (CLDR).
Указываем Culture по умолчанию # frontend/config/settings.yml all:.settings: default_culture: ru
Использование Culture в Action // Установить Culture $this->getUser()->setCulture('ru'); // Получить Culture $culture = $this->getUser()->getCulture(); // => ru
Использование Culture в Template getCulture() ?>
Создание многоязычного сайта # frontend/config/routing.yml news_list: url: /:sf_culture/news param: { module: news, action: index } requirements: { sf_culture: (?:uk|ru|en) }
Демонстрация возможностей I18n (код)
en_US 12, /15/09 May 15, :20:02 PM EEST $1, en_GB 12, /05/ May :20:02 EEST US$1, ru 12, мая 2009 г. 21:20:02 EEST US$ 1, uk , травня :20:02 EEST $ 1 350,00 Результат для различных Culture
sfWidgetFormI18nDate sfWidgetFormI18nTime sfWidgetFormI18nDateTime sfWidgetFormI18nSelectCountry sfWidgetFormI18nSelectLanguage sfWidgetFormI18nSelectCurrency Widgets с поддержкой I18n
Локализация данных в БД propel: my_product: _attributes: { isI18N: true, i18nTable: my_product_i18n } id: ~ slug: { type: varchar, size: 255 } price: { type: float } my_product_i18n: name: { type: varchar, size: 255 }
Включение локализации интерфейса # frontend/config/settings.yml all:.settings: i18n: on standard_helpers: [Partial, Form, I18N ]
Пример использования локализации
Словарь в формате XLIFF # frontend/i18n/messages.fr.xml Welcome to our website. Bienvenue sur notre site web. Today's date is La date d'aujourd'hui est
Локализация с указанием словаря navigation.fr.xml terms_of_service.fr.xml search.fr.xml
Настройка локализации # frontend/config/factories.yml i18n: class: sfI18N param: source: XLIFF debug: off untranslated_prefix: "[T]" untranslated_suffix: "[/T]" cache: class: sfFileCache param: automatic_cleaning_factor: 0 cache_dir: %SF_I18N_CACHE_DIR% lifetime: prefix: %SF_APP_DIR%/i18n
Задачи (tasks) для локализации > 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
Настройка локализации для работы с БД # frontend/config/factories.yml i18n: class: sfI18N param: source: MySQL # XLIFF debug: off untranslated_prefix: "[T]" untranslated_suffix: "[/T]" cache: class: sfFileCache param: automatic_cleaning_factor: 0 cache_dir: %SF_I18N_CACHE_DIR% lifetime: prefix: %SF_APP_DIR%/i18n
Создание таблиц для локализации в БД CREATE TABLE `catalogue` ( `cat_id` int(11) NOT NULL auto_increment, `name` varchar(100) NOT NULL default '', `source_lang` varchar(100) NOT NULL default '', `target_lang` varchar(100) NOT NULL default '', `date_created` int(11) NOT NULL default '0', `date_modified` int(11) NOT NULL default '0', `author` varchar(255) NOT NULL default '', PRIMARY KEY (`cat_id`) ) TYPE=InnoDB; CREATE TABLE `trans_unit` ( `msg_id` int(11) NOT NULL auto_increment, `cat_id` int(11) NOT NULL default '1', `id` varchar(255) NOT NULL default '', `source` text NOT NULL, `target` text NOT NULL, `comments` text NOT NULL, `date_added` int(11) NOT NULL default '0', `date_modified` int(11) NOT NULL default '0', `author` varchar(255) NOT NULL default '', `translated` tinyint(1) NOT NULL default '0', PRIMARY KEY (`msg_id`) ) TYPE=InnoDB; # symfony-1.2/lib/i18n/sfMessageSource_MySQL.class.php
Проблемы при использовании БД для локализации Для работы с локализацией через источник (source) MySQL открывается ещё один коннект к БД При загрузке страницы выполняется несколько дополнительных запросов Структура таблиц крайне неудобная для работы в Админке
Образец модуля «Локализация» для Админки
Решение проблемы с БД для локализации Был написан свой класс источника (source) для sfI18N - sfMessageSource_PDO.class.php Это позволило использовать текущее соединение с БД через PDO Была переписана структура таблиц, чтобы редактировать данные в Админке стало проще использовали generate-admin и embedI18n Были устранены проблемы с лишними запросами к БД
Вопросы? Игорь Бровченко