Многоязычные сайты на Symfony. Проблемы и их решения
1. Многоязычные сайты на Symfony. Проблемы и их решения Igor Brovchenko Igor.Brovchenko@gmail.com
2. Интернационализация (i18n) - это процесс проектирования программного обеспечения для потенциального использования с любым языком. Локализация (l10n)- процесс адаптации программного обеспечения к культуре определенного региона.
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
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) }
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