'

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

Понравилась презентация – покажи это...





Слайд 0

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


Слайд 1

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


Слайд 2

i18n и l10n в Symfony


Слайд 3

i18n Routing (url) Model (content) Form Interface Translation l10n Date/Time Number Currency Что надо для создания мультиязычного сайта в Symfony?


Слайд 4

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


Слайд 5

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


Слайд 6

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


Слайд 7

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 Хелперы и Формы


Слайд 8

Локализация контента # 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 }


Слайд 9

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


Слайд 10

Схемы реализации многоязычности Язык сайта не указан в 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/


Слайд 11

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


Слайд 12

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


Слайд 13

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


Слайд 14

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


Слайд 15

Перевод интерфейса сайта <?php echo __("Today's date is ") ?> <?php echo __('Welcome to our website.', null, 'navigation') ?> <?php echo __('and %count% more...', array('%count%' => $count )) ?>


Слайд 16

Работа со словарями локализации sfMessageSource_gettext.class.php sfMessageSource_MySQL.class.php sfMessageSource_SQLite.class.php sfMessageSource_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>


Слайд 17

Работа со словарями в консоли > 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


Слайд 18

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


Слайд 19

mgI18nPlugin


Слайд 20

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


Слайд 21

Вопросы ? Igor Brovchenko Igor.Brovchenko@gmail.com http://tigor.com.ua http://www.linkedin.com/in/IgorBrovchenko


×

HTML:





Ссылка: