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

Тема в разделе "Как сделать...", создана пользователем Женя, 1 ноя 2012.

  1. Женя

    Женя Постоялец

    Регистр.:
    8 июл 2011
    Сообщения:
    86
    Симпатии:
    5
    Доброго времени суток!!!
    Такая проблема . Есть движок на одном языке вся локализация в шаблоне в 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} нужно чтобы на сайте отображалось (Пользователи оценили:)

    Помогите где и как прописать классы чтобы сделать мульти язычный движок?
    Заранее спасибо!
     
  2. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.211
    Симпатии:
    2.240
    Женечка... Я конечно понимаю Вас, но Вы правда уверены, что все пользователи нулледа знают каким движком Вы пользуетесь и какие классы в нём используются?

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

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

    Juri

    Заблокирован
    Регистр.:
    5 окт 2007
    Сообщения:
    1.065
    Симпатии:
    197
    полностью согласен кроме 3го пункта.
    Обычно делается древо того что и где лежит, а после этого уже тянется нужная информация из нужной таблицы, хотя можно так же как и предложено вами.
     
  4. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.211
    Симпатии:
    2.240
    Моё предложение для 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. Juri

    Juri

    Заблокирован
    Регистр.:
    5 окт 2007
    Сообщения:
    1.065
    Симпатии:
    197
    Оно конечно все хорошо, но это же все есть и в моем варианте, так же у моего варианта есть еще один большой плюс, которым ваш похвастаться не может, а именно.
    При добавлении нового языка на сайте с вашей структурой придется перелопачивать кучу кода и в каждую таблицу базы добавлять новые поля, а в моем же варианте это еще одна таблица в базе, с нужным префиксом.

    Приаттачить не получается, по этому вот пример
    _http://depositfiles.com/files/g0xhp3byc
    Когда то делал как тестовое задание
     
  6. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.211
    Симпатии:
    2.240
    Juri, не правда... Достаточно закинуть файлик с языком, добавить в шаблон иконку языка и через админку добавить язык в список активных.. CMS сама может изменить структуру БД...
     
    Extalionez нравится это.
  7. dino

    dino

    Регистр.:
    28 май 2009
    Сообщения:
    550
    Симпатии:
    204
    Ой не знаю, сколько видел разных 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. Extalionez

    Extalionez Клоун

    Заблокирован
    Регистр.:
    21 авг 2008
    Сообщения:
    368
    Симпатии:
    185
    Dino, так только гавно CMS делают. Во-первых массив может какой-нить ***но-кодер в коде повредить (можно конечно константы юзать, но это вообще бред), во-вторых это может заюзать довольно много памяти, в-третьих это не совсем универсально. Идеальный на сегодняшний день вариант это предложение Горбуши, к которому я полностью присоединяюсь.
     
  9. dazed

    dazed

    Регистр.:
    31 мар 2007
    Сообщения:
    208
    Симпатии:
    55
    Если это используется в интерфейсе, чем же так плох метод Dino?

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

    Тема на самом деле интересная, или может Вы имели ввиду более оптимизированную загрузку из базы? Тогда расскажите подробнее.
     
    dino нравится это.
  10. dino

    dino

    Регистр.:
    28 май 2009
    Сообщения:
    550
    Симпатии:
    204
    гм... можно подумать нет умельцев чтобы базу порушить или верстку снести... От криворукости никто не застрахован, для того и существуют бекапы!