Welcome to php club

PHP FAQ from PHPclub.ru: multilang ...

Начало | Каталог | Изменения | НовыеКомментарии | Вам запрещён доступПользователи | Вам запрещён доступРегистрация | Вход:  Пароль:  

Создание многоязычных приложений

О проблеме многоязычных приложений

Все чаще и чаще современный разработчик сталкивается с необходимостью поддержки разных языков в рамках одного проекта. Говоря о разных языках мы здесь имеем ввиду любой язык, в алфавите которого присутствуют символы, отличные от латинских. Латинский язык мы не считаем за отдельный язык, ибо символы этого алфавита, как правило, присутствуют всегда и нормально поддерживаются на уровне баз данных. В этом разделе мы будем говорить о по-настоящему многоязычных приложениях, в которых, наряду с латинскими символами, могут присутствовать, скажем, русские, китайские и так далее буквы.


Организация подобных приложений сложна, потому что она влечет за собой множество проблем и вопросов, которые разработчику приходится решать. Неправильное проектирование такого приложения ведет к тому, что добавление нового языка в проект сопровождается изменением таблиц, редактированием скриптов и другими всевозможными подводными камнями. В результате таких переработок проект может начать работать нестабильно или вообще перестать работать, такие переделки могут потребовать значительных временных и рабочих ресурсов.


Здесь я постараюсь собрать описание различных подходов и методов при создании подобного рода приложений.


ЗАМЕЧАНИЕ:
На правах создателя данного раздела, я нашел возможным не упоминать здесь отдельные бредовые идеи, выдвигаемые пользователями форума. Надеюсь, что подобного рода цензура никоим образом не смутит пытливого читателя.


Типы многоязычных данных

Статический контент

   Что мы отнесем к статическому контенту?   
В первую очередь – сообщения наших скриптов: это могут быть какие-то сообщения об ошибках (например, пользователь неправильно заполнил форму), также, мы можем давать пользователю какие-то подсказки, есть еще определенный набор текста, которы выводится в том или ином случае, и который не меняется.
Также, элементами статического контента можно считать тексты, которые относятся к дизайну сайта, например надписи навигации.

Динамический контент

   Что может являться динамическим контентом?   
Это те материалы вашего сайта, которые подвержены частичному или полному изменению с достаточной степенью периодичности: новости, статьи, голосования и так далее. Надо полагать, что структура этих данных неоднородна, как по объему информации, так и по степени динамичности. Также, мы не должны упускать из виду тот факт, что отдельные динамические элементы сайта могут быть общими для всех его языковых версий, а какие-то – уникальны для каждого варианта.
Таким образом, вы видите, что данная проблема очень многоплановая, а, следовательно, есть несколько путей решения.
Давайте введем, для лучшего понимания, несколько терминов (их придумал я, поэтому не ожидайте тут сверх четкой и гладкой формулировки).
Уникальный контент – этим термином мы будем называть контент, который уникален для каждой языковой версии сайта.
Общий контент – этим термином мы будем называть контент, который актуален для всех языковых версий одновременно.


Прежде чем задумываться о способах хранения контента, необходимо определить для себя, какой контент у вас является уникальным, а какой – общим.


   Давайте посмотрим, что же можно отнести к уникальному контенту?   
Как правило, языковые версии сайта редко полностью совпадают друг с другом. Дерево разделов сайта часто отличается и причем значительно. Следовательно, названия разделов будут у нас уникальны и хранить мы будем их отдельно для разных языковых версий сайта. Отдельность хранения вовсе не означае, что мы будем использовать разные базы данных, просто для хранения каждого элемента у нас будет своя запись в базе данных – сколько элементов – столько записей. И лишь двухбуквенный индекс (например, 'ru', 'en', 'pl' и др.) будет сигнализировать нам к какой языковой версии сайта эта запись относится.
Поскольку дерево разделов у нас уникально для каждого сайта, значит и страницы с контентом будут также уникальны, а, следовательно, с хранением этих данных у нас также проблем не будет.


   Что может относиться к общему контенту?   
Например, иллюстрации, на которых не нанесен никакой текст, скажем, фотографии. Ведь при выводе на разных языковых версиях сайта иллюстрациям необходимо дать какое-то описание. Это могут быть и голосования, и товары вашего магазина, и так далее. И все эти данные одновременно могут быть представлены сразу на всех языковых версиях. То есть «общим» мы называем контент, который практически без изменений показывается на всех языковых версиях сайта.
Здесь и начинаются разные трудности и разнообразие подходов, о которых мы поговорим ниже.


Бинарные файлы

Очень часто, говоря о многоязычных сайтах, мы с вами останавливаемся лишь на текстовых данных. Однако, не следует забывать, что у нас всегда есть определенное количество разноязыковых бинарных файлов, например, иллюстрации в форматах png, jpg, gif и др., на которые может быть нанесен текст на том или ином языке. Также, возможно у вас есть набор программ, для которых языковая версия выглядит в виде отдельного файла.


Для хранения подобного рода данных, а также для унификации этого хранения, предлагаю использовать следующий подход:


  1. Присваиваем каждому языку определенное короткое буквенное сочетание (например, 'en' – для английского, 'ru' – для русского, и так далее).
  2. Называем файлы для разных языковых версий одинакого, только добавляем в конец названия каждого файла ссылку на код языка:


Соответственно, обращаться к каждому файлу становится очень просто:


<?php
echo '<img src="mypicture_' . $lang . '.gif">';
?>


где $lang содержит уникальный идентификатор языка.


Кодировки


Статический контент

PHP и GetText


ЗА и ПРОТИВ

Здесь я собрал высказывания форумчан о каждом из нижеследующих методов. Возможно, оно вам поможет.

Первое мнение

  • Вариант с ini-файлами рассматривался на примере CMS ezPublish, которая использует ini-файлы для загрузки любых других установок, а не только информации о языках. С установками, записанными в виде ini-файлов удобно работать вручную, но редактировать translation файлы руками, сами понимате, – вчерашний день.
  • Вариант с константами проигрывает по времени загрузки где-то на 30%. 1000 констант грузится дольше чем массив из 1000.
  • Вариант с базой данных, в принципе подойдет. Только если прочитать фразы из базы, потом представить в виде массива, положить массив в кэш и далее читать из кэша.
  • XML, как мне кажется, имеет смысл воспользоватся когда на сайте есть ещё что-нибудь в xml. У меня нет. Если уж загружать XSLT-процессор, то нужно отказаться от html-шаблонов. Ведь когда работает XML, то что-либо похожее на Fast Templates? становится ненужным.

Второе мнение

Самый удобный вариант – Программный аналог Get Text:

  • нет надобности что-то подключать (типа Get Text);
  • нет проблемы с ключами, т.е. чтобы написать фразу, не нужно отрываться от программы и переключаться на файл языка;
  • нет проблемы с чтением ключей (по числу узнать, что это за фраза);
  • нет проблем со скоростью (можно константы, текстовый файл, массив любого вида – и изменить это в любое время);
  • перед сдачей проекта можно заменить m(фраза) на m(число) для еще большего повышения скорости (автоматически тем же парсером);
  • так же можно заменить с m() на $m[] и когда надо обратно.

Поэтому фиксированные варианты отдыхают...


Другие подходы


Применение базы данных для хранения статических данных, на мой взгляд, крайне не экономично, поскольку за каждой строкой текста вам придется лезть в базу, а значит плодить запрос за запросом. Единственный способ оптимизации – это запросить все строки сразу и сформировать массив, к которому затем и обращаться. Но, как вы понимаете, мы свами получим в результате неудачное сочетание этого способа со способом организации Ассоциированного массива.

Динамический контент

Файлы

Для хранения в файлах подходят большие объемы данных, например, контент ваших страниц. Никакой сложности в этом нет. Вам достаточно ознакомиться с такими командами PHP как fopen http://php.net/fopen, fread http://php.net/fread, fwrite http://php.net/fwrite, fclose http://php.net/fclose.

Организация сайта


Полезные ссылки

  1. Как сделать многоязычную WWW страницу (rus): http://ourworld.compuserve.com/homepages/PaulGor/mix_r.htm

 
Один комментарий. [Показать комментарии/форму]