SlideShare une entreprise Scribd logo
1  sur  22
Многоязычные сайты на Symfony. Проблемы и их решения Igor Brovchenko Igor.Brovchenko@gmail.com
Интернационализация (i18n) - это процесс проектирования программного обеспечения для потенциального использования с любым языком. Локализация (l10n)- процесс адаптации программного обеспечения к культуре определенного региона.
i18n и l10n в Symfony
Что надо для создания мультиязычного сайта в Symfony? i18n ,[object Object]
 Model  (content)
 Form
Interface Translationl10n ,[object Object]
 Number
 Currency,[object Object]
Указываем 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) }
Схемы реализации многоязычности Языксайта не указан вURLhttp://site.com/?lg=ruhttp://site.com/?lg=uk Отдельный домен/субдомен на каждую языковую версиюhttp://site.comhttp://site.ua Многоязычность через директорииhttp://site.com/ru/http://site.com/en/
1. Языксайта не указан в URL http://site.com/?lg=ruhttp://site.com/?lg=uk −Сменаязыкасайта – ссылка-переключатель −Плохо для SEO −Плохо для usability # Пример, какможносделатьавтовыборязыка для пользователя # 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);        …      } }
2. Отдельный домен/cубдомен на каждую языковую версию +Хорошо для SEO  +Сайтыможноразместить на разных серверах −  Разные БД: задача синхронизация данных http://site.comhttp://site.ua http://site.comhttp://en.site.com # Пример: изменяемзначениекультуры по умолчанию # 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);
3. Многоязычность через директории +Хорошо для SEO  −  Первый вариант требует кастимизации Вариант 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) }
Работа с данными в админке
Переводинтерфейсасайта <?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.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>Bienvenuesurnotre site web.</target>         </trans-unit>         <trans-unit id="2">           <source>Today's date is </source>           <target>La date d'aujourd'huiest </target>         </trans-unit>       </body>     </file>   </xliff>
Работа со словарями в консоли > phpsymfony i18n:extract frontend en > phpsymfony i18n:extract --auto-save frontend en > phpsymfony i18n:extract --auto-save --auto-delete frontend en Ограничения: команды работают только с стандартным словарем messages

Contenu connexe

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

Office development tips and tricks
Office development tips and tricksOffice development tips and tricks
Office development tips and tricksEugene Agafonov
 
Silverlight 4, есть ли жизнь на десктопе?
Silverlight 4, есть ли жизнь на десктопе?Silverlight 4, есть ли жизнь на десктопе?
Silverlight 4, есть ли жизнь на десктопе?Eugene Zharkov
 
Js Http Request дмитрий котеров
Js Http Request   дмитрий котеровJs Http Request   дмитрий котеров
Js Http Request дмитрий котеровMedia Gorod
 
Sphinx: распределяя индексы.
Sphinx: распределяя индексы.Sphinx: распределяя индексы.
Sphinx: распределяя индексы.MageCloud
 
06 net saturday eugene zharkov ''silverlight. to oob or not to oob''
06 net saturday eugene zharkov ''silverlight. to oob or not to oob''06 net saturday eugene zharkov ''silverlight. to oob or not to oob''
06 net saturday eugene zharkov ''silverlight. to oob or not to oob''DneprCiklumEvents
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demomegakott
 
Павел Федотовский «Как мы разрабатывали приложение для DotNetRu на Xamarin.Fo...
Павел Федотовский «Как мы разрабатывали приложение для DotNetRu на Xamarin.Fo...Павел Федотовский «Как мы разрабатывали приложение для DotNetRu на Xamarin.Fo...
Павел Федотовский «Как мы разрабатывали приложение для DotNetRu на Xamarin.Fo...SpbDotNet Community
 
Zend Framework и мультиязычность
Zend Framework и мультиязычностьZend Framework и мультиязычность
Zend Framework и мультиязычностьStepan Tanasiychuk
 
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the BeastAlexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the BeastAlexander Dymo
 
Оксана Заболотная - презентация с конференции NaZapad
Оксана Заболотная - презентация с конференции NaZapadОксана Заболотная - презентация с конференции NaZapad
Оксана Заболотная - презентация с конференции NaZapadNaZapad
 
Catalyst – MVC framework на Perl (RIT 2008)
Catalyst – MVC framework на Perl  (RIT 2008)Catalyst – MVC framework на Perl  (RIT 2008)
Catalyst – MVC framework на Perl (RIT 2008)Sergey Skvortsov
 
Phalcon - самый быстрый PHP Framework
Phalcon - самый быстрый PHP FrameworkPhalcon - самый быстрый PHP Framework
Phalcon - самый быстрый PHP FrameworkOleksandr Torosh
 
Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Ontico
 
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)Александр Егурцов
 
Компиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей РоманенкоКомпиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей РоманенкоFuenteovejuna
 
Rich UI on Dojo Toolkit and Zend Framework
Rich UI on Dojo Toolkit and Zend FrameworkRich UI on Dojo Toolkit and Zend Framework
Rich UI on Dojo Toolkit and Zend FrameworkGeorgy Turevich
 

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

R18n
R18nR18n
R18n
 
Office development tips and tricks
Office development tips and tricksOffice development tips and tricks
Office development tips and tricks
 
Silverlight 4, есть ли жизнь на десктопе?
Silverlight 4, есть ли жизнь на десктопе?Silverlight 4, есть ли жизнь на десктопе?
Silverlight 4, есть ли жизнь на десктопе?
 
Js Http Request дмитрий котеров
Js Http Request   дмитрий котеровJs Http Request   дмитрий котеров
Js Http Request дмитрий котеров
 
JPHP
JPHPJPHP
JPHP
 
Sphinx: распределяя индексы.
Sphinx: распределяя индексы.Sphinx: распределяя индексы.
Sphinx: распределяя индексы.
 
06 net saturday eugene zharkov ''silverlight. to oob or not to oob''
06 net saturday eugene zharkov ''silverlight. to oob or not to oob''06 net saturday eugene zharkov ''silverlight. to oob or not to oob''
06 net saturday eugene zharkov ''silverlight. to oob or not to oob''
 
Perl in practice
Perl in practicePerl in practice
Perl in practice
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demo
 
Павел Федотовский «Как мы разрабатывали приложение для DotNetRu на Xamarin.Fo...
Павел Федотовский «Как мы разрабатывали приложение для DotNetRu на Xamarin.Fo...Павел Федотовский «Как мы разрабатывали приложение для DotNetRu на Xamarin.Fo...
Павел Федотовский «Как мы разрабатывали приложение для DotNetRu на Xamarin.Fo...
 
Perl & Unicode
Perl & UnicodePerl & Unicode
Perl & Unicode
 
Zend Framework и мультиязычность
Zend Framework и мультиязычностьZend Framework и мультиязычность
Zend Framework и мультиязычность
 
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the BeastAlexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
 
Оксана Заболотная - презентация с конференции NaZapad
Оксана Заболотная - презентация с конференции NaZapadОксана Заболотная - презентация с конференции NaZapad
Оксана Заболотная - презентация с конференции NaZapad
 
Catalyst – MVC framework на Perl (RIT 2008)
Catalyst – MVC framework на Perl  (RIT 2008)Catalyst – MVC framework на Perl  (RIT 2008)
Catalyst – MVC framework на Perl (RIT 2008)
 
Phalcon - самый быстрый PHP Framework
Phalcon - самый быстрый PHP FrameworkPhalcon - самый быстрый PHP Framework
Phalcon - самый быстрый PHP Framework
 
Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)
 
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
 
Компиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей РоманенкоКомпиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей Романенко
 
Rich UI on Dojo Toolkit and Zend Framework
Rich UI on Dojo Toolkit and Zend FrameworkRich UI on Dojo Toolkit and Zend Framework
Rich UI on Dojo Toolkit and Zend Framework
 

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

  • 1. Многоязычные сайты на Symfony. Проблемы и их решения Igor Brovchenko Igor.Brovchenko@gmail.com
  • 2. Интернационализация (i18n) - это процесс проектирования программного обеспечения для потенциального использования с любым языком. Локализация (l10n)- процесс адаптации программного обеспечения к культуре определенного региона.
  • 3. i18n и l10n в Symfony
  • 4.
  • 5. Model (content)
  • 7.
  • 9.
  • 10. Указываем Culture по умолчанию # frontend/config/settings.yml all: .settings: default_culture: ru
  • 11. Использование Culture в Controller // Установить Culture $this->getUser()->setCulture('ru'); // Получить Culture $culture = $this->getUser()->getCulture();
  • 12. Хелперы и Формы 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
  • 13. Локализацияконтента # 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 }
  • 14. 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) }
  • 15. Схемы реализации многоязычности Языксайта не указан вURLhttp://site.com/?lg=ruhttp://site.com/?lg=uk Отдельный домен/субдомен на каждую языковую версиюhttp://site.comhttp://site.ua Многоязычность через директорииhttp://site.com/ru/http://site.com/en/
  • 16. 1. Языксайта не указан в URL http://site.com/?lg=ruhttp://site.com/?lg=uk −Сменаязыкасайта – ссылка-переключатель −Плохо для SEO −Плохо для usability # Пример, какможносделатьавтовыборязыка для пользователя # 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); … } }
  • 17. 2. Отдельный домен/cубдомен на каждую языковую версию +Хорошо для SEO +Сайтыможноразместить на разных серверах − Разные БД: задача синхронизация данных http://site.comhttp://site.ua http://site.comhttp://en.site.com # Пример: изменяемзначениекультуры по умолчанию # 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);
  • 18. 3. Многоязычность через директории +Хорошо для SEO − Первый вариант требует кастимизации Вариант 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) }
  • 19. Работа с данными в админке
  • 20. Переводинтерфейсасайта <?php echo __("Today's date is ") ?> <?php echo __('Welcome to our website.', null, 'navigation') ?> <?php echo __('and %count% more...', array('%count%' => $count )) ?>
  • 21. Работасословарямилокализации 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>Bienvenuesurnotre site web.</target> </trans-unit> <trans-unit id="2"> <source>Today's date is </source> <target>La date d'aujourd'huiest </target> </trans-unit> </body> </file> </xliff>
  • 22. Работа со словарями в консоли > phpsymfony i18n:extract frontend en > phpsymfony i18n:extract --auto-save frontend en > phpsymfony i18n:extract --auto-save --auto-delete frontend en Ограничения: команды работают только с стандартным словарем messages
  • 23.
  • 26.
  • 27.
  • 29. работа с БД через PDO
  • 31. новая структура БД для использования форм
  • 33. импортXLIFFфайлов в БД (каталоги учитываются)
  • 36. удобный интерфейс для работы в админке (формы)
  • 37.