Народ, а как адекватно слепить многоязычный интерфейс в данном случае?

Asar
На сайте с 23.08.2004
Offline
334
500

Самописный сайтик.

Всяческие нединамические части (типа шапки) прописаны инклуд файлах. Каждый такой файлик состоит из кучки строк вида:

<a href="/<?=$MyAccount?>">Личный кабинет</a></span> <span><a href="/reg" title="Создать аккаунт">Зарегистрироваться</a> или <a href="/login" title="Войти">Войти</a></span>.

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

<a href="/<?=$MyAccount?>"><?=$Statics['1']?></a></span> <span><a href="/reg" title="<?=$Statics['2']?>"><?=$Statics['3']?></a> <?=$Statics['4']?> <a href="/login" title="<?=$Statics['5']?>"><?=$Statics['6']?></a></span>.

Скажите, более опытные товарищи, оно так и лепится? Если да — то тупо дергаем из БД все необходимые поля для статики определенной страницы и потом раскидываем их по массиву, проставляя в тексте руками числовые значения?

З.Ы. Не знаю, как на форуме заэкранировать квадратные скобки. ***91; и ***93; — это они.

M
На сайте с 04.12.2013
Offline
223
#1

Пытаетесь по максимуму отделить контент от представления (без фанатизма, конечно). Отдельно переводите шаблоны и встраиваемый в них контент. Лишь затем работаете с наборами строк под разные языки. Уверяю, что если все остальное вы сделаете правильно, то таких наборов будет не так уж и много.

Домены и скрипт для коротких ссылок: https://u75.ru/domains-for-shortcuts
Asar
На сайте с 23.08.2004
Offline
334
#2

Дык вот у меня вопрос именно в этом. Правильный подход-то мною озвученный или нет?

Joker-jar
На сайте с 26.08.2010
Offline
171
#3

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

<span><a href="/reg" title="<?php echo tr('Create account'); ?>"><?php echo tr('Register'); ?></a> или <a href="/login" title="<?php echo tr('Login'); ?>"><?php echo tr('Login'); ?></a></span>.

Функция tr читает откуда-то (куки, параметр URL и т.п.) текущий язык и обрабатывать строку. Языки можно хранить в отдельном файле или еще как-то примерно в таком виде:

$language['ru'] = array(
'Create account' => 'Создать аккаунт',
'Register' => 'Зарегистрироваться'
);

В итоге вполне удобно работать как с шаблонами, так и с переводами.

Asar
На сайте с 23.08.2004
Offline
334
#4

Joker-jar, спасибо за наводку, есть над чем подумать. Хотя функция, видимо, все же из БД будет это дело брать, но все равно удобнее, чем сразу массив вместо функции, хоть нагрузки на БД будет и не меньше. Хм. Или собственно из БД и сформировать массив $language просто из вашего примера, а потом из него инфу цапать, индексами или названиями — это уже как удобнее...

Резюме: в любом случае самая правильная структура таблицы в БД будет типа:

1. Create Account. Создать аккаунт. Перевод на Китайский.

2. Register. Зарегистрироваться. Перевод на Китайский.

и т.д.

А дальше отбирать по 1, 2 или по Create Account, Register. Верно?

Joker-jar
На сайте с 26.08.2010
Offline
171
#5

Я использую файлы. Есть папка languages, в ней лежат файлы ru.lng, fr.lng и так далее, внутри них - вышеописанные массивы. Функция tr определяет текущий язык, если язык en, то просто возвращает переданный параметр, иначне инклудит нужный язык и возвращает элемент массива.

SeVlad
На сайте с 03.11.2008
Offline
1609
#6
Asar:
Скажите, более опытные товарищи, оно так и лепится?

Я не опытный, но знаю, что многие опытные предпочитают gettext. (это почти стандарт для мультиязычных приложений)

Asar:
Не знаю, как на форуме заэкранировать квадратные скобки. ***91; и ***93; — это они

Используй бб-код [code][/code], а не [php][/php].

Делаю хорошие сайты хорошим людям. Предпочтение коммерческим направлениям. Связь со мной через http://wp.me/P3YHjQ-3.
Asar
На сайте с 23.08.2004
Offline
334
#7
Joker-jar:
Я использую файлы. Есть папка languages, в ней лежат файлы ru.lng, fr.lng и так далее, внутри них - вышеописанные массивы. Функция tr определяет текущий язык, если язык en, то просто возвращает переданный параметр, иначне инклудит нужный язык и возвращает элемент массива.

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

---------- Добавлено 22.11.2014 в 13:56 ----------

SeVlad:
Я не опытный, но знаю, что многие опытные предпочитают gettext. (это почти стандарт для мультиязычных приложений)
Угумс, вещь знатная, но чуть другого (высокого) уровня, чем мне нужно :--)
SeVlad:

Используй бб-код [code][/code], а не [php][/php].

Угумс, так и хотел, но протупил и кнопку с кодом не нашел. Теперь вот внимательнЕе глянул, и усё вижу. А так вообще погано все с квадратными скобками обстоит, в УРЛах же они могут вполне использоваться (для параметров со множественными значениями), в результате такую ссылку нормально в форум с ББ кодами не поставишь, только через ...

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