Многоязычные сайты на Symfony. Проблемы и их решения<br />Igor Brovchenko<br />Igor.Brovchenko@gmail.com<br />
Интернационализация (i18n) - это процесс проектирования программного обеспечения для потенциального использования с любым ...
i18n и l10n в Symfony<br />
Что надо для создания мультиязычного сайта в Symfony?<br />i18n<br /><ul><li> Routing  (url)
 Model  (content)
 Form
Interface Translation</li></ul>l10n<br /><ul><li> Date/Time
 Number
 Currency</li></li></ul><li>User Culture = Language + Locale<br />Примеры  локалипользователя<br />en: английский<br />en_...
Указываем Culture по умолчанию<br /># frontend/config/settings.yml<br />  all:<br />    .settings:<br />default_culture: r...
Использование Culture в Controller<br />// Установить Culture<br />$this->getUser()->setCulture('ru');<br />// Получить Cu...
Хелперы и Формы<br />Helpers (templates)<br />DateHelper<br />format_date()<br />format_datetime()<br />time_ago_in_words(...
Локализацияконтента<br /># config/doctrine/schema.yml<br />JobeetCategory:<br />actAs:<br />Timestampable: ~<br />    I18n...
Routing<br />page:<br />url: /:page<br />param: ...<br />article:<br />url: /:year/:month/:day/:slug<br />param: …<br />pa...
Схемы реализации многоязычности<br />Языксайта не указан вURLhttp://site.com/?lg=ruhttp://site.com/?lg=uk<br />Отдельный д...
1. Языксайта не указан в URL<br />http://site.com/?lg=ruhttp://site.com/?lg=uk<br />−Сменаязыкасайта – ссылка-переключател...
2. Отдельный домен/cубдомен на каждую языковую версию<br />+Хорошо для SEO <br />+Сайтыможноразместить на разных серверах<...
3. Многоязычность через директории<br />+Хорошо для SEO <br />−  Первый вариант требует кастимизации<br />Вариант 1:http:/...
Работа с данными в админке<br />
Переводинтерфейсасайта<br /><?php echo __("Today's date is ") ?><br /><?php echo __('Welcome to our website.', null, 'navi...
Работасословарямилокализации<br />sfMessageSource_gettext.class.php<br />sfMessageSource_MySQL.class.php<br />sfMessageSou...
Работа со словарями в консоли<br />> phpsymfony i18n:extract frontend en<br />> phpsymfony i18n:extract --auto-save fronte...
Upcoming SlideShare
Loading in …5
×

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

3,658
-1

Published on

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

Published in: Technology, Education
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,658
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
22
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

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

  1. 1. Многоязычные сайты на Symfony. Проблемы и их решения<br />Igor Brovchenko<br />Igor.Brovchenko@gmail.com<br />
  2. 2. Интернационализация (i18n) - это процесс проектирования программного обеспечения для потенциального использования с любым языком.<br />Локализация (l10n)- процесс адаптации программного обеспечения к культуре определенного региона.<br />
  3. 3. i18n и l10n в Symfony<br />
  4. 4. Что надо для создания мультиязычного сайта в Symfony?<br />i18n<br /><ul><li> Routing (url)
  5. 5. Model (content)
  6. 6. Form
  7. 7. Interface Translation</li></ul>l10n<br /><ul><li> Date/Time
  8. 8. Number
  9. 9. Currency</li></li></ul><li>User Culture = Language + Locale<br />Примеры локалипользователя<br />en: английский<br />en_AU: английский для Австралии<br />en_GB: английскийдляВеликобритании<br />en_CA:английский для Канады<br />en_US:английский для США<br />en_US 12,000.1 5/15/09 May 15, 2009 9:20:02 PM EEST $1,350.00<br />en_GB 12,000.1 15/05/2009 15 May 2009 21:20:02 EEST US$1,350.00<br />
  10. 10. Указываем Culture по умолчанию<br /># frontend/config/settings.yml<br /> all:<br /> .settings:<br />default_culture: ru<br />
  11. 11. Использование Culture в Controller<br />// Установить Culture<br />$this->getUser()->setCulture('ru');<br />// Получить Culture<br />$culture = $this->getUser()->getCulture();<br />
  12. 12. Хелперы и Формы<br />Helpers (templates)<br />DateHelper<br />format_date()<br />format_datetime()<br />time_ago_in_words()<br />distance_of_time_in_words()<br />format_daterange()<br />NumberHelper<br />format_number()<br />format_currency()<br />I18nHelper<br />format_number_choice()<br />format_country()<br />format_language()<br />Forms (i18n)<br />sfWidgetFormI18nDate<br />sfWidgetFormI18nDateTime<br />sfWidgetFormI18nTime<br />sfWidgetFormI18nChoiceCountry<br />sfWidgetFormI18nChoiceCurrency<br />sfWidgetFormI18nChoiceLanguage<br />sfWidgetFormI18nChoiceTimezone<br />
  13. 13. Локализацияконтента<br /># config/doctrine/schema.yml<br />JobeetCategory:<br />actAs:<br />Timestampable: ~<br /> I18n:<br /> fields: [name]<br />actAs:<br />Sluggable: { fields: [name], uniqueBy: [lang, name] }<br /> columns:<br /> name: { type: string(255), notnull: true }<br /># config/schema.yml<br />jobeet_category:<br /> _attributes: { isI18N: true, i18nTable: jobeet_category_i18n }<br /> id: ~<br />jobeet_category_i18n:<br /> id: { type: integer, required: true, primaryKey: true, foreignTable: jobeet_category, foreignReference: id }<br /> culture: { isCulture: true, type: varchar, size: 7, required: true, primaryKey: true }<br /> name: { type: varchar(255), required: true }<br /> slug: { type: varchar(255), required: true }<br />
  14. 14. Routing<br />page:<br />url: /:page<br />param: ...<br />article:<br />url: /:year/:month/:day/:slug<br />param: …<br />page:<br />url: /:sf_culture/:page<br />param: ...<br /> requirements: { sf_culture: (?:fr|en|de) }<br />article:<br />url: /:sf_culture/:year/:month/:day/:slug<br />param: ...<br /> requirements: { sf_culture: (?:fr|en|de) }<br />
  15. 15. Схемы реализации многоязычности<br />Языксайта не указан вURLhttp://site.com/?lg=ruhttp://site.com/?lg=uk<br />Отдельный домен/субдомен на каждую языковую версиюhttp://site.comhttp://site.ua<br />Многоязычность через директорииhttp://site.com/ru/http://site.com/en/<br />
  16. 16. 1. Языксайта не указан в URL<br />http://site.com/?lg=ruhttp://site.com/?lg=uk<br />−Сменаязыкасайта – ссылка-переключатель<br />−Плохо для SEO<br />−Плохо для usability<br /># Пример, какможносделатьавтовыборязыка для пользователя<br /># apps/frontend/lib/myUser.class.php<br />class myUser extends sfBasicSecurityUser<br />{<br /> public function initialize(sfEventDispatcher $dispatcher, sfStorage $storage, $options = array())<br /> {<br /> …<br /> $currentCulture = $storage->read(self::CULTURE_NAMESPACE);<br /> …<br /> }<br />}<br />
  17. 17. 2. Отдельный домен/cубдомен на каждую языковую версию<br />+Хорошо для SEO <br />+Сайтыможноразместить на разных серверах<br />− Разные БД: задача синхронизация данных<br />http://site.comhttp://site.ua<br />http://site.comhttp://en.site.com<br /># Пример: изменяемзначениекультуры по умолчанию<br /># apps/frontend/config/frontendConfiguration.class.php<br />class frontendConfiguration extends sfApplicationConfiguration<br />{<br /> public function configure()<br /> {<br /> $this->dispatcher->connect('user.change_culture', array($this, 'changeUserCulture'));<br /> }<br /> function changeUserCulture(sfEvent $event)<br /> {<br /> $user = $event->getSubject();<br /> $culture = $event['culture'];<br /> ...<br /> $user->setCulture($newCulture);<br />
  18. 18. 3. Многоязычность через директории<br />+Хорошо для SEO <br />− Первый вариант требует кастимизации<br />Вариант 1:http://site.com (ru)http://site.com/en/<br />Вариант 2:http://site.com/ru/http://site.com/en/<br />routing.yml<br />page:<br />url: /:sf_culture/:page<br />param: ...<br /> requirements: { sf_culture: (?:ru|en) }<br />article:<br />url: /:sf_culture/:year/:month/:day/:slug<br />param: ...<br /> requirements: { sf_culture: (?:ru|en) }<br />
  19. 19. Работа с данными в админке<br />
  20. 20. Переводинтерфейсасайта<br /><?php echo __("Today's date is ") ?><br /><?php echo __('Welcome to our website.', null, 'navigation') ?><br /><?php echo __('and %count% more...', array('%count%' => $count )) ?><br />
  21. 21. Работасословарямилокализации<br />sfMessageSource_gettext.class.php<br />sfMessageSource_MySQL.class.php<br />sfMessageSource_SQLite.class.php<br />sfMessageSource_XLIFF.class.php<br /> # frontend/i18n/messages.fr.xml<br /> <?xml version="1.0" ?><br /> <xliff version="1.0"><br /> <file original="global" source-language="en_US" datatype="plaintext"><br /> <body><br /> <trans-unit id="1"><br /> <source>Welcome to our website.</source><br /> <target>Bienvenuesurnotre site web.</target><br /> </trans-unit><br /> <trans-unit id="2"><br /> <source>Today's date is </source><br /> <target>La date d'aujourd'huiest </target><br /> </trans-unit><br /> </body><br /> </file><br /> </xliff><br />
  22. 22. Работа со словарями в консоли<br />> phpsymfony i18n:extract frontend en<br />> phpsymfony i18n:extract --auto-save frontend en<br />> phpsymfony i18n:extract --auto-save --auto-delete frontend en<br />Ограничения:<br />команды работают только с стандартным словарем messages<br />
  23. 23. Плагины для локализации<br /><ul><li>mgI18nPlugin
  24. 24. zxI18nRoutingPlugin
  25. 25. zsI18nExtractTranslatePlugin
  26. 26. tgI18nPlugin</li></li></ul><li>mgI18nPlugin<br />
  27. 27. tgI18nPlugin<br />Roadmap<br /><ul><li>sf 1.2 - 1.4
  28. 28. Propel/Doctrine
  29. 29. работа с БД через PDO
  30. 30. использованиетекущегосоединения к БД
  31. 31. новая структура БД для использования форм
  32. 32. минимизировано количество запросов к БД
  33. 33. импортXLIFFфайлов в БД (каталоги учитываются)
  34. 34. экспорт в fixtures
  35. 35. собственныйextract (каталоги учитываются)
  36. 36. удобный интерфейс для работы в админке (формы)
  37. 37. документация</li></li></ul><li>Вопросы ?<br /><ul><li>Igor Brovchenko
  38. 38. Igor.Brovchenko@gmail.com
  39. 39. http://tigor.com.ua
  40. 40. http://www.linkedin.com/in/IgorBrovchenko</li>
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×