Мультиязычность сайта

Dez

Новичок
Приветствую.
Как вы обычно предпочитаете реализовать мультиязычность на сайте?
Или какие из вариантов популярных цмс вы считаете более удобно решили эту задачу?

Ну и более конкретно:
Например текущий язык - Русский.
1) в общем случае английская версия сайта может сильно отличаться от русской?
Те же главные меню, не просто названия перевелись, а стали совсем другими меню, с другим расположением и кол-вом ссылок

2) как сами объекты, которые вводятся через админку вы сохраняли бы в мультиязычной реальности?:
2.a) Например есть статья, доступная по site/pages?id=5 , есть у нее title и body
Будете вы идентифицировать вот эту общую статью по единому id = 5 и где то сохранять языковые версии этих данных.
И в результате приходя на тот же экшен с разными указаниями &lang="язык", выводить нужную версию

2.б) Или создавать новые версии как новые страницы и где то хранить соответствие о связи по языкам между этими статьями.
site/pages?id=5 выдаст русскую версию, а site/pages?id=6 выдаст английскую версию.
 

С.

Продвинутый новичок
Не существуе ни одной ЦМС, котороя бы делала эта идеально. Нет ни одного универсального метода, который бы удовлетворял всех и во всех случаях. Делает следует так, как удобнее для данного конкретного проекта.
 

Dez

Новичок
Ну вот я и хочу узнать наиболее предпочитаемые пути решения.

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

AmdY

Пью пиво
Команда форума
я использую подход
lang передаются в урле /en/article/10 или article.html?id=10&lang=en
записи имеют поля
id, item_id, lang, кастомные поля записи.
выборка WHERE item_id = {ID} AND lang = {LANG}

при создании материала он создаются только на одном языке
$item->item_id = $item->id; // это нужно для связи
$item->lang = getCurrentLang();

если нужен материал на другом языке, то просто клонирую текузий объект
$item = Item::find()
$new = clone $item; // id сбрасывается
$new->lang = 'ru';
$new->save();

у нового объекта все поля заполены вражеским языком, связь по item_id
 

Dez

Новичок
AmdY, интересный вариант. Подумаю над ним.

А id у тебя - это же уник. номер, Primary key с auto_increment?
И получается что для операции
Код:
$item->item_id = $item->id; // это нужно для связи
надо сначала сохранить в базу, чтобы получить id, а потом еще раз сохранить уже с item_id установленным, так?
 

AmdY

Пью пиво
Команда форума
да, у меня решение было не лучшее, можно просто генерировать самому ключ
$item->item_id = uniqid();
я это решение привязывал к существующему проекту, потому использовал костыль с item_id = id
 

Dez

Новичок
Если честно то в соответствии item_id = id вижу весь смак.
Например
Код:
id  item_id lang
9    9      ru
10  10     uk
11  11      ru
12  11      en

Ситуации:
1) решил добавить новую версию для id=11, достаточно всего лишь item_id указать. Тут все окей.
13 11 fr
2) если например захотел сделать id=11 версией id=10, то по равенству id==item_id увижу что item_id надо сменить и у всех ссылающихся сейчас на id=11
3) Если где то у меня есть список из id, например прикрепленные к текущему похожие материалы, (в виде [9, 11] для русского), то мне при отображении перевода данного материала надо сгенерить новый список похожих ( для англ - [12]), для этого я специально в Списке похожих буду в фильтре для item_id указывать значения из массива id-шек
 

WMix

герр M:)ller
Партнер клуба
а уником item_id+lang сделать, слабо? при этом чувствую что item_id референс другой таблички, а там он может и автоинкрементится
 

AnrDaemon

Продвинутый новичок
Эээ... Может, я в жизни чего-то не понимаю, но локализация сайта - это не один вопрос.
У меня получается как минимум три. Или даже четыре.
1. Как определять язык показа. (Acсept-Language, geoip, выбор пользователя, ещё как-то?)
2. Менять ли структуру сайта в зависимости от языка? (Всевозможные /en/ru/ и т.д.)
3. Менять ли контент сайта в зависимости от языка? (Языки с письмом справа налево или сверху вниз могут потребовать альтернативной вёрстки (смена интерфейса). Тематика сайта может зависеть от языка (разное наполнение).)
4. Как контент соединять с интерфейсом? На одном языке? На разных?
И это только поверхностные вопросы, не затрагивающие конкретные детали реализации на том или ином движке.
На какой из этих вопросов ты хотел бы услышать ответ?
 

Dez

Новичок
AnrDaemon, я пишу свою цмс на yii2, так что там насчет языков уже порядочно всего есть.
По сути я сейчас решаю задачу - мультиязычность контента, а не мультиязычность сайта.

Естественно при переключении языка меняется и интерфейс и контент. Не вижу тут проблем, в принципе я это уже сделал, как и определение языка из урл, в том числе языка по умолчанию.

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

Dez

Новичок
AnrDaemon, насчет твоих вопросов, то я могу сказать как я сейчас делаю, а ты посмотришь что я не учел.

1) Язык определяется из url ( site.org/somepage11 - по умолчанию например русский, а если указан в урле - site.org/en/somepage1 , то указанные) . Пользователь флажком переключает на другую версию сайта
2) не понял вопроса
3) Контент должен меняться конечно(если он есть на этом языке). Про отдельные шаблоны для языков пока не думал, но это не выглядит как проблема.
4)и контент и интерфейс на фронтэнде конечно на одном языке, на текущем.
 

WMix

герр M:)ller
Партнер клуба
для какой связи? есть запись контейнер для статьи и есть референц на эту запись сама статья (перевод), которая уникальна либо по референц+lang, либо по собственному id, чтоб постоянно двойной ключик не тянуть, к примеру для изменений.
 

Dez

Новичок
для какой связи? есть запись контейнер для статьи и есть референц на эту запись сама статья (перевод), которая уникальна либо по референц+lang, либо по собственному id, чтоб постоянно двойной ключик не тянуть, к примеру для изменений.
на структуре таблиц можно показать? (только без lang как часть PK)
 
Последнее редактирование:

vasinsky

Новичок
WMix, ты говоришь про такую структуру ?

я бы сделал так скорее всего

table languages
lid (идентификатор) | language (наименование)
1 | ru
2 | en
3 | fra

table articles
aid (идентификатор) | preview (превью статьи) | text (полная статья)
1 | Здрасти | Привет мир |
2 | Hi | Hello
3 | Salut | Bonjour tout le monde

table reference

parent_aid (aid статьи на основном языке) | aid (aid сама статья) | lid (язык статьи)
1 | 2 | 2
1 | 3 | 3

мне кажется при такой структуре - расширяемость - без проблем
1. языков добавляй скока угодно
2. порядок статей в таблице article не важен (это так на всяк случай)
 

vasinsky

Новичок
и получается : язык - русский по дефолту

чтобы получить статью на пендосовском
PHP:
select * from reference r
left join articles a on a.aid = r.parent_aid
left join languages l on r.lid = l.lid
where a.aid = 1 and l.language = 'en'
 

AmdY

Пью пиво
Команда форума
vasinsky, а чего так мало таблиц, можно же ещё поля к статье через eav организовать, чтобы совсем энтерпрайзненько было.
 

vasinsky

Новичок
1. таблица с языками - управление языками update 1й строки - и имя у языка другое - вместо шуршания по таблице со связями - где язык указан по имени
2. статьи - на каком бы языке они не были - это статьи - и место им именно в этой таблице
3. связи - ну тут всё наверно понятно.

я не притендую на гения проектирования, я увидел это так. с удовольствием посмотрю на другие варианты - это всегда полезно
 
Сверху