Как настроить мультиязычный сайт с языком по умолчанию - НЕ английским?

#1 24 марта 2022 в 10:29

Уважаемые инстантоведы!

Такой вопрос, практическая задача.
Буду благодарен за ЛЮБЫЕ идеи, наводки, подсказки по решению.

— — — — - 

Я создаю с тремя языками интерфейса: русским, английским и немецким.

Саму мультиязычность я настраиваю с помощью компонента «Языки 2.0».

Вернее, частично мультиязычность зашита в движок, а данный компонент предоставляет удобный интерфейс для перевода информации на разных языках. Плюс в нём есть интеграция с Яндекс.Переводчиком и Google Translate API, и переводить можно одним кликом, а затем лишь корректировать перевод.

На мой взгляд очень удобный компонент.

— — — — - 

Но! Он работает лишь поверх функционала мультиязычности самого движка.

А в движке есть такая особенность.

Когда включаешь опцию «Разрешить смену языка пользователями (подстановкой префикса в URL)» (подробнее на скриншоте), то по сути языком по умолчанию И в админке, И на публичной части сайта — становится английский.

По адресу «названиесайта.de» — становится доступна именно английская версия.
По адресу  «названиесайта.de/ru» — русская, а по адресу «названиесайта.de/de» — немецкая.

Причём от того, какой язык на момент включения опции «Разрешить смену языка пользователями (подстановкой префикса в URL)» указан в соседнем поле «Локализация» — вообще ничего не зависит.

В локализации остаётся указанным другой язык, но раскладка по префиксам языка работает однозначно: основным языком становится английский, а все остальные — дополнительными.

— — — — - 

Скриншот настроек:

Изображение

— — — — - 

Мне нужно настроить движок сайта так, чтобы был такой расклад (при сохранении другого функционала, конечно):

По адресу «названиесайта.de» — немецкая версия.
По адресу  «названиесайта.de/ru» — русская, а по адресу «названиесайта.de/en» — английская.

Насколько я понимаю, для реализации допилов кода движка нужно копать примерно сюда.

В файле конфигурации опции «Разрешить смену языка пользователями (подстановкой префикса в URL)» настроек сайта соответствует переменная «is_user_change_lang».

Далее эта переменная используется в функции detectLanguage() в файле system/core/core.php.

Вот где-то там нужно напильником подточить код.
Но если кто-то из коллег подскажет, что именно, или альтернативные решения — буду очень признателен.

#2 24 марта 2022 в 11:19

Поставьте в админке англ. И на сайте станет анг. Или в system/core/core.php примерно стр 18

private static $language = 'ru'; Поменяйте на en или какой там вам нужен? Немецкий? Не знаю какие буквы надо)

Хотя думаю в админке в любом случае нужно сменить язык

#3 24 марта 2022 в 19:56

Поставьте в админке англ. И на сайте станет анг. Или в system/core/core.php примерно стр 18

private static $language = 'ru'; Поменяйте на en или какой там вам нужен? Немецкий? Не знаю какие буквы надо)

Хотя думаю в админке в любом случае нужно сменить язык

Lora

 Lora, спасибо за идею!!

Но блин, я не верю, что именно этот фрагмент кода как-то поможет.

По крайней мере потому, что я описал выше — язык по умолчанию становится английский.
Поэтому если эта переменная имеет значение 'ru', то замена его на 'ge' явно не поможет изменить английский как язык по умолчению.

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

Добавлено спустя 6 минут

Мне кажется, вот с этой переменной надо поработать:

  1. private static $language_href_prefix = '';

В частности — с этим участком кода:

  1. private static function detectLanguage() {
  2.  
  3. $config = cmsConfig::getInstance();
  4.  
  5. self::$language = $config->language;
  6.  
  7. if (!empty($_SERVER['REQUEST_URI']) && !empty($config->is_user_change_lang)) {
  8.  
  9. $segments = explode('/', mb_substr($_SERVER['REQUEST_URI'], mb_strlen($config->root)));
  10.  
  11. if (empty($segments[0])) { return; }
  12.  
  13. $query_str = '';
  14. // Есть ли в GET параметры
  15. $pos_que = mb_strpos($segments[0], '?');
  16. if ($pos_que !== false) {
  17. $query_str = mb_substr($segments[0], $pos_que);
  18. $segments[0] = strstr($segments[0], '?', true);
  19. }
  20.  
  21. // язык может быть только двухбуквенный, определяем его по первому сегменту
  22. if (preg_match('/^[a-z]{2}$/i', $segments[0])) {
  23. if (is_dir($config->root_path . 'system/languages/' . $segments[0] . '/')) {
  24. // язык по умолчанию без префиксов, дубли нам не нужны
  25. if ($segments[0] != $config->language) {
  26.  
  27. // включаем для моделей поддержку
  28. cmsModel::globalLocalizedOn();
  29.  
  30. self::$language = self::$language_href_prefix = $segments[0];
  31. unset($segments[0]);
  32.  
  33. $_SERVER['REQUEST_URI'] = $config->root . implode('/', $segments) . $query_str;
  34. }
  35. }
  36. }
  37. }
  38. }
  39.  
Добавлено спустя 6 часов

Попробовал поменять 'ru' на 'ge' — естественно не помогло. ))

#4 28 марта 2022 в 00:00

Узнал благодаря личной коммуникации с одним из разработчиков компонентов для Инстанта, что описанная функциональность — это именно в версии 2.15.1 такой глюк наблюдается.

В версии 2.14.3 выбор языка по умолчанию работал более корректно.

Даже не знаю, ну не переделывать же сайт заново на более старой версии из-за этого?

#5 29 марта 2022 в 09:35

Ну так подставьте в private static $language_href_prefix = 'ge';

#6 29 марта 2022 в 10:50

В версии 2.14.3 выбор языка по умолчанию работал более корректно.

Владимир Переверзев


Протестировал версию 2.14.3 — нет, абсолютно такое же поведение:
если был включён какой-то третий язык (не русский и не английский), то после включения мультиязычности языком по умолчанию, базовым, тем, который отображается без префикса — становится английский.

Увы, но этот глюк — давнишний. :(((((

#7 30 марта 2022 в 18:00

Ну так подставьте в private static $language_href_prefix = 'ge';

Lora

Lora, у Вас есть уверенность в том, что это поможет?
Или Вы просто так, на обум говорите?

#8 30 марта 2022 в 19:23

 Владимир Переверзев, а вы движокустанавливали с нуля на en или на ru локализации? Браузер у вас на какой язык настроен?

#9 3 апреля 2022 в 08:32

 Владимир Переверзев, а вы движокустанавливали с нуля на en или на ru локализации? Браузер у вас на какой язык настроен?

Loadырь

Loadырь, спасибо, что откликнулись.

И пользуясь случаем хочу поблагодарить Вас в целом за Ваш интерес и полезную информацию по теме мультиязычности Инстанта.

Я убеждён, что качественная мультиязычность Инстанту — это очень важная часть функционала данного движка.
Это именно то, что может В РАЗЫ расширить сферу применяемости движка, и соответственно — рынок использования, и соответственно — сообщество специалистов и заказчиков.

Классный движок, а по факту популярен практически только среди русскоязычных специалистов.

— — — — - 

Чтобы ответить на Ваш вопрос, мне похоже, придётся признаться.
Проект, который я сейчас реализую, не на немецком, как я указал выше для примера, а на украинском.

Вопрос политических и даже межкультурных взаимоотношений наших стран — сейчас ОЧЕНЬ заряжен.
Чтобы не уходить в деструктивные срачи, я указал в примере немецкий.

— — — — - 

Первая попытка

Сначала развернул русскую версию 2.15.2.

Добавил к ней украинскую локализацию путём установки компонента Олега Васильевича:
instantcms.ru/addons/uk.html

Затем сначала переключил настройки сайта на украинский язык — тут всё сработало корректно.
Украинский интерфейс отображался по основным URL-ам, без префиксов.

Но! После включения галочки «Разрешить смену языка пользователями (подстановкой префикса в URL)» — весь украиноязычный контент стал отображаться по префиксу /uk/, а по оснвному урлу — стала отображаться именно английская версия. Русскоязычная — по префиксу /ru/.

Хотя в настройках оставалось установленное и изменённое лишь раз значение поля «Локализация» равное UK.

— — — — - 

Вторая попытка

Далее я взял полностью украиноязычную инсталляцию движка версии 2.15.1 с сайта Олега Васильевича:
uk.instantcms.com.ua/localization/new-instalation

Во время инсталяции — СРАЗУ выбрал украинский язык.

Но! После включения галочки мультиязычности — ситуация полностью повторилась.

— — — — - 

Третья попытка

От другого опытного разработчика компонент мне поступила в личку информация, что мол это глюк в пятнадцатой версии, а вот в четырнадцатой всё было хорошо, возьми четырнадацатую — и будет тебе счастье.

Я взял украиноязычную локализацию Инстанта версии 2.14.3 также с сайта Олега Васильевича:
uk.instantcms.com.ua/localization/paket-instalyatsiyi-instantcms-versiyi-2-14-3-ukrayinskoyu-movoyu.html

Очередной раз повторил действия по разворачиванию и первичной настройке сайта.
(Честно говоря, КАЖДЫЙ РАЗ я был уверен, что мультиязычность будет работать корректно, поэтому КАЖДЫЙ РАЗ я не просто разворачивал движок, а прям очень плотно настраивал, прям вылизывал сайт — а потом херяк, оказывается, мультиязычность не работает. Мягко говоря — за… устал).

Но! Получил ровно такой же результат.

— — — — - 

 Loadырь, действительно, есть вероятность, что возможно проблема НЕ в движке, а в нюансах компонента Олега Васильевича. Поскольку я не просто копировал папку с языковым пакетом, а трижды работал с украиноязычной версией через инсталляцию — пакета или прям движка.

И насчёт браузера тоже предположения верные. Я лично предпочитаю использовать весь софт на английском. Браузер и операционная система, в которых я проводил все манипуляции — англоязычные. Но блин, я же создаю сайт НЕ для себя, а для целевой аудитории. А моей целевой аудитории нужен трёхязычный сайт (украинский, английский и русский) с языком по умолчанию — украинским. В общем, если язык браузера у того, кто включает мультиязычность на сайте — как-то влияет на язык по умолчанию (а не опция «Локализация»), то я считаю это скорее багом, чем фичей.

— — — — - 

P.S.: На всякий случай напишу заранее. Коллеги, просьба соблюдать правила сообщества, обсуждать тему по существу, в техническом плане. И не обсуждать конкретные языки и культуры.

Добавлено спустя 3 минуты

Lora, нашёл интересный топик с Вашим участием:
instantcms.ru/forum/angliiskii-po-umolchaniyu.html

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

#10 3 апреля 2022 в 10:20

И насчёт браузера тоже предположения верные.

Владимир Переверзев

Это факт.

Я лично предпочитаю использовать весь софт на английском

Владимир Переверзев

Поэтому у вас и английский по умолчанию

Но блин, я же создаю сайт НЕ для себя, а для целевой аудитории.

Владимир Переверзев

Но при этом полагаете, что вся целевая аудитория будет смотреть на ваш сайт через ваш браузер?

Нет. У каждого свой язык в браузере, удобный именно ему, а не вам. Он и будет смотреть на один и тотже сайт с вами, но читать будет на удобном ему языке, а не выбранном вами по умолчанию. И при этом УРЛ будет у него и у вас одинаковый, без постфиксов языка. А это плюс к СЕО.

Именно по этому, это не баг, а фича.

И именно поэтому при создании записи, ее надо будет обязятельно переводить на все языки предустановленные в системе. Вариант, что если заполнен только один язык, то показывать его на остальных языках или не показывать вовсе на других языках, не сработает. Если языков 50, то и переводов сразу надо 50. Иначе будет «каша».

В одной такой «каше» я принимал участие с компонентом «Translate». Только там 12 языков используется в системе. Поначалу, когда всё заполнялось, смотрелось гармонично и читабельно на всех языках, но со временем перестали заполнять все языки и теперь всё выглядит не очень читабельно.

#11 3 апреля 2022 в 12:11

Но при этом полагаете, что вся целевая аудитория будет смотреть на ваш сайт через ваш браузер?

Loadырь

Loadырь, Вы неверно поняли мою мысль.

Я читаю как раз ровно наоборот: что язык интерфейса в браузере конкретного администратора сайта, который выполняет настройку мультиязычности, никак _НЕ_ должен влиять на настройки сайта, ПОСКОЛЬКУ сайт он настраивает для целевой аудитории, а _НЕ_ для себя.
 
В остальном согласен. Я планирую использовать для этого компонент «Языки 2.0» от dwd.
К этому компоненту у меня есть много вопросов. Я считаю его скорее мощной, но ОЧЕНЬ СЫРОЙ заготовкой для реализации мультиязычности, чем готовым компонентом. Но в целом инструмент годный.

К компоненту Translate не присматривался. Вроде он устарел, менее полезен и актуальнен в сравнении с «Языки 2.0». Верно?

#12 3 апреля 2022 в 19:39

Вы неверно поняли мою мысль.

Владимир Переверзев

Возможно не так объяснил. 

Я читаю как раз ровно наоборот: что язык интерфейса в браузере конкретного администратора сайта, который выполняет настройку мультиязычности, никак _НЕ_ должен влиять на настройки сайта, ПОСКОЛЬКУ сайт он настраивает для целевой аудитории, а _НЕ_ для себя.

Владимир Переверзев

Я не знаю как работают сторонние компоненты мультиязычности, сейчас буду говорить про то, что сейчас есть в коробке InstantCMS 2.15.1:

Он и не влияет. Вид сайта будет выводится на языке браузера, для одного администратора это будет например uk, для вас он в это же время будет в en. И при этом вы оба будете сидеть на сайте в одно и тоже время.

Добавлено спустя Только что

К компоненту Translate не присматривался.

Владимир Переверзев

И не надо ))

#13 3 апреля 2022 в 20:39

Я не знаю как работают сторонние компоненты мультиязычности, сейчас буду говорить про то, что сейчас есть в коробке InstantCMS 2.15.1:

Он и не влияет. Вид сайта будет выводится на языке браузера, для одного администратора это будет например uk, для вас он в это же время будет в en. И при этом вы оба будете сидеть на сайте в одно и тоже время.

 
Loadырь

Loadырь, я правда очень признателен Вам, во-первых, за Ваш интерес и знания о мультиязычности в Инстанте, причём с фокусом именно на ядро, а не на сторонние компоненты.

А во-вторых, за то, что Вы всю эту механику — объясняете. Я читал Ваши предыдущие комментарии в разных топиках — и Ваши комментарии чаще всего самые содержательные и ценные.

— — — — -

Но! Есть предположение, что в данном случае Вы не до конца правы.

Да, безусловно есть какая-то подстройка движка под настройки браузера каждого пользователя. Но я очень внимательно изучал состояние базы данных для описанного кейса. Дело в том, что В МОМЕНТ включения мультиязычности я выбирал языком по умолчанию украинский — в базе данных для полей текстовых полей создавались дополнительные поля с префиксами _uk и _ua.

— — — — -

Хотя, возможно, и наоборот — не прав я.

Возможно, поля с префиксами создавались не в момент включения мультиязычности, а в момент срабатывания логики в настройках компонента «Языки 2.0».

#14 3 апреля 2022 в 20:52

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

Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.