Показать сообщение отдельно
  #1 (permalink)  
Старый 28.09.2011, 14:29
Аватар для greatilya
Интернет-турист
Отправить личное сообщение для greatilya Посмотреть профиль Найти все сообщения от greatilya
 
Регистрация: 01.08.2008
Сообщений: 516

Мультиязычные сайты
Разрабатываю сайт, в структуру которого хотел бы заложить уклон на многоязычность. Под многоязычностью я понимаю количество языков 5 и более.

Проблематика вопроса:
казалось бы, что здесь сложного, для каждого языка в каждой таблице содержащей контент создаем отдельное поле, например поля: ru, en, uk... и т.д. В итоге таблица разрастется очень стремительно в объеме при заполнении. А следовательно запросы к ней будут выполняться всё медленнее и медленнее. Исходя из своего опыта: уже набрав 1Гб данных в таблице, SELECT запросы не содержащие PRIMARY KEY будут выполняться неприлично долго.
Также вариант с большим количеством полей у таблицы весьма неудобен при работе с БД.

Выход из ситуации вижу такой:
1. создаем дополнительную таблицу
вариант 1
одну таблицу с 3 полями: id, lang, content. Где на id и lang ставим ключ UNIQUE.
вариант 2
таблицу для каждого языка с полями: id (PRIMARY KEY), content (TEXT)
Примечание: у "профи" хотел бы узнать какой вариант оптимальнее?

2. Правка текущих таблиц
В таблицах сайта где был контент за место текста проставляем значения из поля "id" из таблицы описанной в пункте 1. И следовательно поле в таблице заменяется на тип INT.
Примечание: если не останется полей типа VARCHAR, TEXT, BLOB то тогда таблицу можно перевести в static что повысит скорость запросов.
3. Правка скриптов сайта
во всех местах, где у нас раньше предполагался вывод контента, сделать вывод что-то вроде "[lang12345]", где 1234 - id из таблицы языка.
4. Работа на уровне шаблонов
Правим скрипт smarty(конечно если он используется на сайте), и регуляркой выцепляем все lang идентификаторы из страницы, и делаем запрос вида:
SELECT content FROM lang WHERE id IN (перечисление идентификаторов) AND lang = 'en'
После пробегаемся по результату и для ненайденых значений делаем догрузку данных из основного языка:
SELECT content FROM lang WHERE id IN (перечисление идентификаторов) AND lang = 'ru'
После чего расставляем данные по странице и производим кеширование шаблона с пометкой о текущем языке.
Здесь я изложил основную суть идеи. Прошу, кидайте камни, если в идее есть изъяны.
В любом случае спасибо что прочитали данный пост.
Ответить с цитированием