Как организовать мультиязычность?

Platon_82

Новичок
Как организовать мультиязычность?

Мне нужно сделать 3 языковых версий сайта, но думаю в будущем проект будет расширяться.

Как организовать хранение данных в таблицах чтобы при добавлении еще одной языковой версии не лезть в код и в б.д.
Можно все поля хранить в одной таблицах, можно в разных(под каждую версию) Как лучше?

Думал сделать так:

Дя каждого модуля сайта - 3 таблицы(соотв. количеству языковых версий) Например news_ru, news_eng, news_pol
+
таблица langs
поля: id, lang_name, img_name(флажок)
1 ru ru.gif
2 eng eng.gif
.....

Теперь когда нам например надо добавить какие то данные, то мы:
делаем запрос в langs и в цикле выводим количество необходимых полей(например для новостей) И получаем ихние названия:
PHP:
<input type="text" name="news_name_<? echo $lng; ?>>
А перед циклом ставим флажки с выбором языка по ссылке.

Аналогично и другие методы(удаление, редактирование...)

Вобщем имеет ли право мой метод на жизнь или нет Как думаете.
 

bgm

&nbsp;
Право на существование имеет любой метод.

P.S. Подумай почему бы тебе, к примеру, использовать не три таблицы news_ru | news_eng | new_pol , а одну news? И что тебе для этого нужно сделать.

P.P.S. Какую кодировку ты будешь использовать в базе данных? (это тоже намёк на "поразмыслить")
 

WP

^_^
Можно ввести поле lang и заводить в одной таблице разные ряды для разных языков.
Советую сразу юзать UTF-8.
 
Как раз занимаюсь такой же фигнёй. Это отличный план, поменять структуру БД так, чтобы не надо было лезть в код ))))))) Получиться - пишите !!! ))))
Избыточность данных - это первое, что должно вас насторожить. Сделать три одинаковых клона таблиц методом INSERT... SELECT - это не вариант. Нужно выделить из исходной таблицы всю
инфу, которую можно отнести к данному языку и вывести её в новую таблицу уже с префиксом table_en. Короче весь текст нахрен и в базовой таблице оставляем только структуру данных.
А код менять всё равно придётся )).
Если вы для работы с БД используете какие-либо библиотеки, то вам надо будет переопределить лишь несколько ключевых методов - и можете работать как и прежде.
В любом случае, надо делать так, чтобы при добавлении ещё одного языка, в код уже не надо было лезть.
 

berkut

Новичок
Нужно выделить из исходной таблицы всю
инфу, которую можно отнести к данному языку и вывести её в новую таблицу уже с префиксом table_en
хреновый подход. лучше вынести всю языковую инфу в отдельную таблицу и хранить external_id | lang_id | description | name | escheOdnoTextPole
 
в принципе я так и сделал: base_table -> base_table_i18n, которая содержит данные по всем языкам и проиндексированная как минимум по полям id и lang. Я просто на каждый язык ещё сделал по представлению base_table_ru, base_table_en..., которые содержат всю совокупность инфы тех таблиц, но только конкретного языка. Так несколько удобнее мне было ))
 

kode

never knows best
вот лично я не вижу сложности доавить ещё одно поле language? Данных много? Создайте индекс.
 

melo

однажды
kode
так можно сразу на каждый язык заводить новую таблицу :)
 

octan

Новичок
Я выполняю многоязычность своих проектов другим образом. В базе данных я храню только контент который часто меняется (новости, статьи итд.) а сами подписи меню, кнопок... короче всю навигацию храню в специальных файлах (отдельный файл для каждого языка), в которых содержатся индексированные массивы с переводами, где индекс - английское слово а значение - перевод слова.
 

WP

^_^
Ага и каждый раз исполняешь файл с массивами. Жесть.
 

daevaorn

Новичок
Для статического контента gettext. Для динамического - правильная организация базы.
 

mcfalu

Новичок
octan
аналогично, для каждого языка есть отдельный файл - ассоциативный массив.
В файле хранятся константы надписей интерфейса - далее при выборе того, или иного языка просто подключается соответственный файл с языком
 

WP

^_^
mcfalu
Жжошь. А у меня компилируются шаблон отдельно для каждого языка.
 

Yarkij

Новичок
mcfalu
octan
солидарен.

WP
товарищи предлагают старый дедов метод, проверенный годами. Поучились бы им лучше, чем "олбанскому".
 
Сверху