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

GeT

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

Эта задача довольно проста, если заранее известно сколько языков будет и какие языки.

Мне же нужно организовать поддержку неограниченного числа языков. Основная проблема в том, как организовать админку и, самое главное, БД.
Скажем, в админке есть несколько разделов (ну, например, новости, статьи, каталог и т.д.).

Единственное, что мне приходит в голову - это создавать таблицы, типа lang_ru, lang_en и т.д. со структурой:
id_элемента || id_раздела || id_поля (скажем, заголовок новости) || текст. При такой структуре, конечно, возникнут некоторые проблемы с составлением запросов, но врядли они неразрешимы.

Есть ли еще какие-нибудь способы реализовать многоязычность?
 

Romantik

TeaM PHPClub
как вариант: одна таблица и выборку делать еще и по lang
далле в админке так же выбираешь по lang и оригинальный язык, что бы удобнее было переводить
lang | value | text
rus | title | Моя страничка
eng | title | My Page
типа такого, а в шаблонизатор всталять результат функции lang('title'), а значение языка для юзера я думаю тебе не проблема реализовать =)
 

GeT

Новичок
Romantik
понял твое предложение. Думаю, так и сделаю.

Остается только одна проблема. Что если, скажем, мне надо чтобы новость была только русской или только английской и французской? Как это организовать?
 

Kelkos

Сам себе программер
Хех.. недавно столкнулся с тем, что на сайте несколько языков но у разеых версий неодинаковый набор страниц.. т.е. структура неодинакова.. долго ломал голову, потом плюнул и сделал копии сайтов на поддоменах типа site.ru - основной русскоязычный, eng.site.ru - английский.. и т.д. Ессно у каждого сайта свои таблицы и своя структура страниц. Чем то мне даже такое решение понравилось. Вообщем, не буду рекомендовать такой метод, но как идею предлагаю.
 

Romantik

TeaM PHPClub
Остается только одна проблема. Что если, скажем, мне надо чтобы новость была только русской или только английской и французской? Как это организовать?
Собственно я думаю, если она в базе будет содним вариантом, то выводить ее. Просто добавить это условие в функции.
И еще можно вообще привязаться к eng и писать так lang('My Page') Где и есть value и тогда если нет вообще переводов, то по умолчанию тест-значение выводится =)
 

Leonid

PHP? нет, не слышал...
Еще возможный вариант, хотя довольно громоздкий, и не всякий провайдер сможет это обеспечить - создать свою БД для каждого языка, в базе - структура и контент сайта.
В движке сайта и админа указываешь, к какой базе коннектится, при выборе языка.
 

Kelkos

Сам себе программер
Leonid
ну.. достаточно одной базы.. если использовать префиксы таблиц. типа eng_page или rus_page
 

Leonid

PHP? нет, не слышал...
Kelkos.
Ну, если у тебя готовая CMS, то "перебирать" ее всю, заменяя названия таблиц на вычисляемые в зависимости от выбранного языка довольно утомительно.....
Если пишешь сайт с нуля, то конечно можно использовать префиксы...
 

GeT

Новичок
Kelkos
Это непреемлемо. Говорю же, СКОЛЬКО УГОДНО языков =)Romantik
Про lang('My Page') я не понял. ЧТо б это значило? =)))
 

Romantik

TeaM PHPClub
lang | value | text
eng | My Site | My Site
rus | My Site | Мой Сайт

ru: lang('My Site') выведет "Мой Сайт"
ru: lang('My Title') выведет "My Title" так как в базе нет такого value
 

Leonid

PHP? нет, не слышал...
Romantik, т.е. ты предлагаешь сделать таблицу со всеми сообщениями сайта для каждого языка? А если на сайте туева хуча контента, разделов, публикаций.... Утонуть можно.
 

GeT

Новичок
Romantik
Это врядли подходит...
Т.к. скажем, мне для вывода списка новостей мне нужно на уровне БД доставать "перевод" заголовка. А то что ты предлагаешь - это ведь уже обработка результатов запроса?

Тем более ты не совсем понял, что именно мне нужно. Если ты имеешь в виду "сообщения сайта", то я это вообще сделаю "как все" с помощью GetText например. Мне нужна именно работа с динамическим контентом =)
 

Шамиль

Новичок
В свое время делал так:
в урле - news.php?lang=ru&news_id=1
поля в таблице news:
news_id, news_text_ru, news_text_en и т.д.
при добавлении нового языка выполняем в нужные таблицы alter .. add field
и появляется поле скажем news_de
Неограниченность количества языков при этом поддерживается.
 

SiMM

Новичок
> поля в таблице news:
> news_id, news_text_ru, news_text_en и т.д.
Достаточно попытаться сделать поиск фразы на любом языке, чтобы понять, что структура типа
news_id lang_id contnet гораздо удобнее.
Правда тут может ещё возникнуть вопрос "связки" (одна и та же статья на нескольких языках), который можно решить, например, следующим образом
id parent_id lang_id content (где parent_id - id новости на "оригинальном" языке)
 

specialist

Guest
А что если просто раскидать по соответствующим папкам языковые файлы и инклудить их в зависимости от раздела и текущего языка... админка там или новости...
languages
/ru/
/ru/admin.php
/ru/news.php
/ru/common.php
и так далее
выводить значения функцией ...lan('main_news') ?
Чем плох этот метод?..
Из плюсов пожалуй, удобство редактирования и создания "языковых значений".
Ещё кстати в одном из номеров PHPInside была статья на эту тему..советую поискать...
 

GeT

Новичок
specialist
А БД как организовать в данном случае?
Вопрос в этом. Уж как выводить контент я, думаю, сам смогу разобраться...
 

specialist

Guest
GeT
просто к таблицам с инфой добавить поле lang_id
и учитывать его при выборке
+ сделать таблицу языков
id | short_lang | lang
1 | ru | русский
 

GeT

Новичок
specialist
Понятно. А где сами переводы записывать? И как определять, есть ли у новости русская/китайская версии или нет?

И с кодировками что? Все в юникоде хранить?
 

kruglov

Новичок
GeT
Как определять наличие версий? Через select, что именно неясно. Вы подумайте, подумайте...

С кодировками - если поиск по этим таблицам не делать, то можно хранить как получится в BLOBах, а при выводе уже нужную кодировку ставить... и шаблоны...
 
Сверху