Как сделать мульти язычный движок?

Женя

Постоялец
Регистрация
8 Июл 2011
Сообщения
88
Реакции
9
Доброго времени суток!!!
Такая проблема . Есть движок на одном языке вся локализация в шаблоне в html ну и в ядре PHP и я бы хотел его сделать на нескольких языках и чтобы пользователи при входе на сайт могли менять язык !
Приведу не большой пример

Изначально
HTML:
<p class="score">Пользователи оценили:<strong>{$video.score}</strong></p>

А нужно сделать так
HTML:
<p class="score">{$lang_users_to_evaluate}<strong>{$video.score}</strong></p>

Вот этот класс {$lang_users_to_evaluate} нужно чтобы на сайте отображалось (Пользователи оценили:)

Помогите где и как прописать классы чтобы сделать мульти язычный движок?
Заранее спасибо!
 
Женечка... Я конечно понимаю Вас, но Вы правда уверены, что все пользователи нулледа знают каким движком Вы пользуетесь и какие классы в нём используются?

Глобально это делается:
1) Создаются ленг-файлы, в которых содержится перевод всех текстов из шаблонов, движка и т.д.
2) Пользователь через куку указывает язык (куку устанавливает двиг, естно)
3) В базе данных для статей создаются поля "text" - оригинал, показываем кто не выбрал язые, "text_en" - для англ версии, "text_ru" - для русской
4) Соединяем всё в месте и выводим локализированный сайт =)

Собственно, {$lang_users_to_evaluate} в шаблон подставляется точно так же, как и {$video.score}
 
  • Заблокирован
  • #3
Женечка... Я конечно понимаю Вас, но Вы правда уверены, что все пользователи нулледа знают каким движком Вы пользуетесь и какие классы в нём используются?

Глобально это делается:
1) Создаются ленг-файлы, в которых содержится перевод всех текстов из шаблонов, движка и т.д.
2) Пользователь через куку указывает язык (куку устанавливает двиг, естно)
3) В базе данных для статей создаются поля "text" - оригинал, показываем кто не выбрал язые, "text_en" - для англ версии, "text_ru" - для русской
4) Соединяем всё в месте и выводим локализированный сайт =)

Собственно, {$lang_users_to_evaluate} в шаблон подставляется точно так же, как и {$video.score}

полностью согласен кроме 3го пункта.
Обычно делается древо того что и где лежит, а после этого уже тянется нужная информация из нужной таблицы, хотя можно так же как и предложено вами.
 
полностью согласен кроме 3го пункта.
Обычно делается древо того что и где лежит, а после этого уже тянется нужная информация из нужной таблицы, хотя можно так же как и предложено вами.
Моё предложение для 100% перевода сайта на несколько языков с сохранением ссылок на страницы... Т.е. если ты русский и кидаешь немцу ссылку - он откроет тоже самое, но уже на немецком языке, что во много раз удобнее.
+ у каждого есть возможность выбрать язык в любую секунду
+ можно смотреть язык по User Agent ( Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.8.131 Version/11.10, Android-x86-1.6-r2 - Mozilla/5.0 (Linux; U; Android 1.6; en-us;)
+ Если перевода нет, он сайт должен предложить список доступных переводов и показать стандартный язык.
+ Гугл умеет индексировать сайты мультиязыковым способом, т.е. сайт на английском языке отображается при поиске с русскими запросами, правда намного ниже...
+ Можно сделать префикс /ru/ /en/ в начале или конце ссылки, чтобы отображать язык - это улучшит индексацию... Но этот пункт должен быть лишь дополнительным к пункту 2

Тут уже вопрос к сеошникам - как правильно это делать...
 
  • Заблокирован
  • #5
Моё предложение для 100% перевода сайта на несколько языков с сохранением ссылок на страницы... Т.е. если ты русский и кидаешь немцу ссылку - он откроет тоже самое, но уже на немецком языке, что во много раз удобнее.
+ у каждого есть возможность выбрать язык в любую секунду
+ можно смотреть язык по User Agent ( Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.8.131 Version/11.10, Android-x86-1.6-r2 - Mozilla/5.0 (Linux; U; Android 1.6; en-us;)
+ Если перевода нет, он сайт должен предложить список доступных переводов и показать стандартный язык.
+ Гугл умеет индексировать сайты мультиязыковым способом, т.е. сайт на английском языке отображается при поиске с русскими запросами, правда намного ниже...
+ Можно сделать префикс /ru/ /en/ в начале или конце ссылки, чтобы отображать язык - это улучшит индексацию... Но этот пункт должен быть лишь дополнительным к пункту 2

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

Приаттачить не получается, по этому вот пример
_Для просмотра ссылки Войди или Зарегистрируйся
Когда то делал как тестовое задание
 
Juri, не правда... Достаточно закинуть файлик с языком, добавить в шаблон иконку языка и через админку добавить язык в список активных.. CMS сама может изменить структуру БД...
 
Ой не знаю, сколько видел разных CMS и всяких проектов, очень мало где используются БД для мультиязычности... Как правило в базе только одна запись - язык, выбранный пользователем.
В проекте создается папка, например languages куда складываются папки, содержащие файлы разных языков, их название соответствует языку выбранному пользователем в базе (ru, en, ua). Файлы в этих папках удобнее разделить по принадлежности к странице сайта, например: index.txt, reg.txt, gallery.txt (расширение в принципе не важно, можно любое типа .lng).
В файлах хранится перевод фраз в виде массива:
PHP:
// например файл для страницы регистрации reg.lng - русский:
<?php
$lang['hello'] = "Добро пожаловать";
$lang['username'] = "Имя пользователя";
$lang['us0001'] = "Пароль";
$lang['us0002'] = "Подтверждение пароля";
$lang['send']= "Отправить";
?>
// reg.lng украинский:
<?php
$lang['hello'] = "Вітаємо вас";
$lang['username'] = "Им'я користувача";
$lang['us0001'] = "Пароль";
$lang['us0002'] = "Підтверджння паролю";
$lang['send']= "Надіслати";
?>
При верстке страниц в начале, опираясь на язык пользователя, подгружается нужный языковой файл:
include("./laguages/".$user['lang']."/reg.lng"); // для этого можно написать отдельную функцию, упрощающую запись :)
для того, чтоб его содержимое стало доступно, массив объявляется как глобальный:
global $lang;
дальше в нужном месте вставляется элемент из массива:
PHP:
<h2>{$lang['hello']}</h2>
{$lang['username']}<input type="text" name="username">
{$lang['us0001']}<input type="password" name="pass">
{$lang['us0002']}<input type="password" name="pass_conf">
<input type="submit" value="{$lang['send']}">
Для изменения языка достаточно скопировать содержимое одной из языковых папок в папку нового языка и перевести его. Ну и в профиле пользователя добавить возможность выбора нового языка.
Собственно все...
 
  • Заблокирован
  • #8
Dino, так только гавно CMS делают. Во-первых массив может какой-нить ***но-кодер в коде повредить (можно конечно константы юзать, но это вообще бред), во-вторых это может заюзать довольно много памяти, в-третьих это не совсем универсально. Идеальный на сегодняшний день вариант это Для просмотра ссылки Войди или Зарегистрируйся, к которому я полностью присоединяюсь.
 
так только гавно CMS делают.
Если это используется в интерфейсе, чем же так плох метод Dino?

Много памяти нужно?
Так можно разбить на часто используемые словари, и словари подгружаемые в зависимости от раздела.
Зато это очень удобно использовать, редактировать и не грузить базу.
А в Вашем случае, делать как минимум по 20 запросов к базе за переводом, это нормально будет? Ведь от куда мы знаем какие переводы понадобятся?

Тема на самом деле интересная, или может Вы имели ввиду более оптимизированную загрузку из базы? Тогда расскажите подробнее.
 
  • Нравится
Реакции: dino
Во-первых массив может какой-нить ***но-кодер в коде повредить
гм... можно подумать нет умельцев чтобы базу порушить или верстку снести... От криворукости никто не застрахован, для того и существуют бекапы!
 
Назад
Сверху