Реализация мультиязычности на сайте

S3
На сайте с 29.03.2012
Offline
349
2639

Как вообще организовывается мультиязычность контента? Озадачился над реализацией, думаю, как лучше?
Вариант 1. Просто создать копии шаблонов страниц где захардкожен текст и выдавать его с урлом типа site.con/ru/page (/pl|en/by/ukr)

Самая простая реализация, но правки превращаются в ад.

Вариант 2. Создать языковый файл и динамически подгружать контекст в шаблон.  Тут легко править - все в одном месте. Но увеличивается количество запросов в бэк. Правда если использовать нереляционные базы данных - нагрузка будет минимальной. 

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


M3
На сайте с 09.02.2022
Offline
89
#1
есть два варианта, делай что проще:
site.con/ru/page
ru.site.con/page
P
На сайте с 20.04.2019
Offline
65
#2
Sly32 :
Создать языковый файл и динамически подгружать контекст в шаблон. 

Это если вам не нужен трафик из ПС. Иначе, как они поймут на каком языке страница?

Шаблоны сайтов на Flask: https://flask.website/templates/all
Vladimir SEO
На сайте с 19.10.2011
Offline
1952
#3

Нужен трафик

сайт/ру/

сайт/англ/

сайт/укр/

не нужен трафик - как угодно

Эксперт по продуктам Google https://support.google.com/profile/58734375 ᐈ Продвижение коммерческих сайтов https://kulinenko.com/
Александр Воробьев
На сайте с 03.02.2020
Offline
46
#4

По  вопросу домен или подкаталог не скажу - это вопрос не технический.

По реализации, чаще делают на файлах - это касается текстов интерфейса. (битрикс, symfony, yii, django)   Контент по прежнему в базе остается.  Так же это решается, на сколько я помню (но сам не пользовался локализацией), в фронтендовых UI фреймворках.

Больше тут "сложность", точнее какой вопрос надо решать где хранить перевод контента - в той же таблице отдельная колонка, или отдельная колонка.

Про динамическую подгрузку контента не понятно. Если на серваке собирается страница полностью с контентом - так и надо собирать далее, если собиралась в браузере - так и остается.

S3
На сайте с 29.03.2012
Offline
349
#5
Vladimir SEO #:

Нужен трафик

сайт/ру/

сайт/англ/

сайт/укр/

не нужен трафик - как угодно

Да, принято, спасибо, об этом не думал. 

ArbNet
На сайте с 27.10.2019
Offline
139
#6
Вариант 3 как нормальные прогеры делают

Вместо текста на конкретном языке делаются метки. Движок собирает эти метки и делает запрос в базу в зависимости от языка, потом метки подменяются на слова\фразы. Статьи хранить думаю проще целиком.
S3
На сайте с 29.03.2012
Offline
349
#7
Александр Воробьев #:

По  вопросу домен или подкаталог не скажу - это вопрос не технический.

По реализации, чаще делают на файлах - это касается текстов интерфейса. (битрикс, symfony, yii, django)   Контент по прежнему в базе остается.  Так же это решается, на сколько я помню (но сам не пользовался локализацией), в фронтендовых UI фреймворках.

Больше тут "сложность", точнее какой вопрос надо решать где хранить перевод контента - в той же таблице отдельная колонка, или отдельная колонка.

Про динамическую подгрузку контента не понятно. Если на серваке собирается страница полностью с контентом - так и надо собирать далее, если собиралась в браузере - так и остается.

На этом этапе меня интересует только интерфейс. 

В зависимости от выбранного языка  должен меняться. КАк я говорил есть два варианта - или просто хранить 1-2-3-4 шаблона с разными языками или подгружать в переменные шаблонизатора в зависимости от выбранного языка. Второй правильный но тут надо как-то избежать лишних запросов в базу. Понятно что кэширование будет. Пока идея - спользовать DynamoDb/Mongo. Вроде как самое то. Запросы очень быстрые, все храниться в json-ах:

{
        "ru": {
                "mentor": "Преподаватель",
                        ...
        }
        "by": {
                "mentor": "Настаунik"
        }

}
OS_ZP_UA
На сайте с 24.04.2018
Offline
87
#8

Да все просто для шаблонов.

1 шаблон, к которому подключается нужный файл в зависмости от нужного языка include ('../lang/ru.php'); include ('../lang/en.php'); а нужные слова в самом шаблоне в виде переменных $L['glavnaj'] и .т.д.

S3
На сайте с 29.03.2012
Offline
349
#9
ArbNet #:
Вариант 3 как нормальные прогеры делают

Вместо текста на конкретном языке делаются метки. Движок собирает эти метки и делает запрос в базу в зависимости от языка, потом метки подменяются на слова\фразы. Статьи хранить думаю проще целиком.

Ты бы прочитал сначала внимательно. Это не вариант3 а вариант 2 у меня. И я уже выразил консерн свой - это лишний запрос в базу данных.  Поэтому и планирую использовать Монгу.

OS_ZP_UA #:

Да все просто для шаблонов.

1 шаблон, к которому подключается нужный файл в зависмости от нужного языка include ('../lang/ru.php'); include ('../lang/en.php'); а нужные слова в самом шаблоне в виде переменных $L['glavnaj'] и .т.д.

зачем мне разные шаблоны? достаточно одного с разным контекстом.

<a class="nav-link {%if not context.username %}disabled {%endif%}" href="/subjects"><i class="bi bi-list-columns-reverse"></i> {{context.menu.mentor}}</a> 
And-ry
На сайте с 02.01.2008
Offline
164
#10
OS_ZP_UA #:

Да все просто для шаблонов.

1 шаблон, к которому подключается нужный файл в зависмости от нужного языка include ('../lang/ru.php'); include ('../lang/en.php'); а нужные слова в самом шаблоне в виде переменных $L['glavnaj'] и .т.д.

Именно так у меня реализовано на многих сайтах

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий