Многоязычные сайты на Symfony. Проблемы и их решения Igor Brovchenko
Интернационализация (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, /15/09 May 15, :20:02 PM EEST $1, en_GB 12, /05/ May :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) 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 Хелперы и Формы
Локализация контента # 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 }
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) }
Схемы реализации многоязычности 1.Язык сайта не указан в URL Отдельный домен/субдомен на каждую языковую версию Многоязычность через директории
1. Язык сайта не указан в URL # Пример, как можно сделать автовыбор языка для пользователя # 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
2. Отдельный домен/cубдомен на каждую языковую версию # Пример: изменяем значение культуры по умолчанию # 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 + Сайты можно разместить на разных серверах Разные БД: задача синхронизация данных
3. Многоязычность через директории Вариант 1: (ru) Вариант 2: 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 Первый вариант требует кастимизации
Работа с данными в админке
Перевод интерфейса сайта $count )) ?>
Работа со словарями локализации 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
Работа со словарями в консоли > 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 Propel/Doctrine работа с БД через PDO использование текущего соединения к БД новая структура БД для использования форм минимизировано количество запросов к БД импорт XLIFF файлов в БД (каталоги учитываются) экспорт в fixtures собственный extract (каталоги учитываются) удобный интерфейс для работы в админке (формы) документация
Вопросы ? Igor Brovchenko