Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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'
После чего расставляем данные по странице и производим кеширование шаблона с пометкой о текущем языке.
Здесь я изложил основную суть идеи. Прошу, кидайте камни, если в идее есть изъяны.
В любом случае спасибо что прочитали данный пост.
Ответить с цитированием
  #2 (permalink)  
Старый 28.09.2011, 15:29
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

я бы сделал так :


Чтобы различать языки, необходимо создать таблицу(-ы), в которой для каждого ID([lang12345]) будет храниться значение языка(ru,en), которому соответствует фраза, и сама фраза.

примерная структура таблицы. с типами уже разобрались.

Код:
|ID | фраза | язык|
|123|"hello"|"en" |
|123|"прива"|"ru" |
теперь надо разобраться, какой язык использовать

я предлагаю с помозью скрипта проверять, поддерживает ли текущий браузер Cookies, или localStorage, и использовать их по вохможности.
Если же браузер - старый осёл с выключенными куками, то придётся использовать базу.

При желании можно использовать хранилище Flash

Приоритет использования такой :
Цитата:
localStorage -> Cookies -> Data Base
в стораге всё просто, у кукисов тоже. рассмотрим базу :

конечно, должна быть ещё одна таблица.

Перед обсуждением её структуры необходимо знать, как идентифицировать пользователя, если у него нет кук.


это домашнее задание. Но как МНЕ кажется, это можно делать через IP и юзерагента.


В таблице будет чуть колонок.
у меня кончается фантазия

Код:
| IP        | lang |
| 127.0.0.1 | "ru" |
Если IP не совпадает - исп-ся язык по-умолчанию

______________
это насчёт сервака.

а чо делать с модальными окнами на сайте, сособенно, если они создаются динамически ?

В модальных окнах ставить тайтл такого вида
modal({     title : *!*lang[ 123 ]*/!*     });


то бишь, тайтл выбирается из объекта lang

а вот БД для скрипта %)
lang = {  "123" : "Hello, user"   }


Теперь надо определиться, какой файл где брать.


пусть в папке будет лежать 2 файла - lang-ru.js и lang-en.js

в зависимости от запомненного языка будет загружаться или ru, или en.


если текст внутри модалей делается так, то беспокоиться о том, "чо там, прогрузилось или нет" не надо - каждый файл языка заменит свойства у объекта на свои.


как запоминать ? Так как мы решили не использовать хранилище , потому что значение языка в хранилище надо передать php скрипту, а это - запрос, а это - время., то используем "продуманную" схему про куки и БД, описанную выше.

т.е. если есть кука - используем куку, иначе - бд. Если эже ни там, ни там нету - используем язык по умолчанию.
___________________

насчёт запоминания. При клике на кнопку "поменять язык" скрипт будет устанавливать значение в куке ( то бишь одновременно запоминает для себя и для php )и перезагружать страницу ( то бишь применять изменения. перезагрузка страницы нужна для локализации через php. можно в принципе только часть страницы перезагрузить. )
Ответить с цитированием
  #3 (permalink)  
Старый 28.09.2011, 16:40
Аватар для greatilya
Интернет-турист
Отправить личное сообщение для greatilya Посмотреть профиль Найти все сообщения от greatilya
 
Регистрация: 01.08.2008
Сообщений: 516

melky,
Спасибо за подробное описание процесса запоминания языка. Я примерно так и думал реализовать. А относительно lang-ru.js и lang-en.js, я что-то и не догадался о подобной реализации, одним словом спасибо.

Если у кого-то есть какие-то замечания относительно данной реализации, то просьба - пишите.
__________________
VPS от 175 рублей (есть скидки 15% писать в ПМ) Анализ рынка VPS серверов
Есть только две бесконечные вещи: Вселенная и глупость. Хотя насчет Вселенной я не уверен.
Альберт Эйнштейн
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сайты на ExtJS DenQ ExtJS 12 02.12.2011 11:48
Почем делаете сайты? devote Работа 11 11.08.2011 16:24
Как научится делать сайты mycoding Оффтопик 7 15.08.2010 22:46
Мои сайты SunYang Ваши сайты и скрипты 9 30.06.2008 17:02