четверг, 11 декабря 2008 г.

И..ция

Интернационализация (тьфу, написал без ошибок) - не только перевод всего контента на другой язык. Перевести один раз не составляет труда, сложнее потом поддерживать в нужном виде. Поделюсь своим опытом перевода на английский сайта giduv.com

Данные. Нужно как-то хранить русский и английский контент в базе данных. Для базы я принял решение в лоб - создал такие же таблицы, с другим префиксом. Некоторые таблицы, которые одинаковы в обоих версиях (пользователи, и т.д.) заменил на views. Новые статьи из русской части автоматически добавляются в английскую.
Шаблоны. Изначально была мысль использовать два каталога для шаблонов, но потом я посмотрел в сторону gettext. Очень понравилась его идеология, но к сожалению он никак не вставал на хостинге. Поэтому пришлось написать его аналог, который парсит ini файл и добавляет данные в массив. Кроме этого $I18N['новости'] == 'news', а $I18N['НОВОСТИ'] == 'NEWS'. Да, в некоторых местах сайта тексты пишутся большими буквами. Шаблон обрабатывается с помощью префильтра Smarty, поэтому данные подставляются один раз при компиляции. Это гораздо быстрее, зато приходится очищать кеш при каждом изменении языкового файла. Обработку шаблона я делал по статье Gettext and Smarty
Адрес. Особо не ломал голову над адресом английской версии сайта, сделал домены en/ru.site.com. Такой подход позволяет очень просто переходить от языка к языку, просто заменяя хост. Например, если нет такой страницы на английском, страница 404 может предложить русскую версию или перевести страницу в Google Translate.
Определение языка. Очень удобно, когда заходишь на сайт, а он сам определяет твой язык. В голове крутилось несколько способов:
  1. Разбор Accept-Language. В php можно прочитать значение переменной $_SERVER['HTTP_ACCEPT_LANGUAGE']. У Firefox3/Win это "ru,en-us;q=0.7,en;q=0.3", в IE7/XP "ru", Opera дает "ru-RU,ru;q=0.9,en;q=0.8". Все круто, осталось только распарсить и пользоваться. А не так то было. Что делать с людьми, которые сидят в английсков ОС, или под английски браузерами? Таких не так и мало. К тому-же региональные языки, вроде чувашского или татарского не будут в списке.
  2. Определение по IP. В сети есть открытые базы, по IP адресу можно сказать страну. Пришел человек с России и СНГ, получи русскую версию. Откуда-то с запада - английскую. Но базы адресов со временем устаревают, что приведет к неверным срабатываниям. Например MSN и Google уже пару месяцев считрают, что я живу в Харькове. Соответсвенно выдача идет по украинским сайтам, а Live.com вообще на украинском. Это серьезно раздражает, т.к. кроме фамилии на -ко общего с Украиной у меня мало.
  3. Выбрать вручную. Пользователь сам выбирает язык, ему нужно сделать лишнее действие. А дальше начинаются только плюсы: человек спокойно ходит по любой языковой версии. Такой вариант мне больше по душе.
Также можно сохранить выбор человека в cookies, и в следующий раз перекидывать на нужую версию.

Буду очень рад услышать ваши способы интернационализации сайта.

P.S. На первое время можно сделать версию, переведенную с помощью Google Translate. Например перевод моего блога на английский

2 комментария:

Eisenhorn комментирует...

1. Определение языка - по заголовкам, далее - по предпочтениям пользователя. Я, например, часто предпочитаю читать доки на английском.
2. Вынесения языков на субдомены не сильно хорошо скажутся при поисковой оптимизации, хотя я и не спец в этом вопросе.
3. gettext есть для указанной цели в двух вариантах - реализация всецело на php (как у wordpress), и реализация в виде модуля php-gettext.

ЗЫ: сделать текст заглавными буквами поможет css.

Денис Радченко комментирует...

1. Предпочитания пользователя хранить в coookies? Я думал на эту тему, только у части пользователей cookies может не хранится.
2. Не знал про это, поспрашиваю у знакомых сеошников
3. Про gettext на PHP не знал. Лучше использовать его, чем самописную библиотеку - не будет гемороя с поддержнкой.
Спасибо за комментарий :)