Реализация мультиязычности в проектах на PHP

Тема в разделе "PHP Pro", создана пользователем trooll, 8 июн 2010.

Статус темы:
Закрыта.
  1. trooll

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    Доброго времени суток.

    Не знаю может быть тема уже жеванная не раз, но на форуме не нашол не чего толкового.

    Вобщем интересен вопрос реализации мульти-язычности проектов реализованных на PHP. Вобщем интересно кто какие способы использует в своиз проектах.

    Мойвариант реализован на приравнивание констант (не знаю хорошо это или плохо, но пока проблем не возникало), собственно пример ниже:

    Ланг файл ru-RU.ini (в данном случае русско-язычный:(
    Код:
    LNG_HELLO=привет
    LNG_USER=пользователь
    LNG_LINK_TYPE=тип ссылки
    LNG_LINK_IS_NOT_DIRECT=ссылка не являеться прямой
    LNG_SCRIPT_EXECUTION_HAS_BEEN_STOPPED=исполнение скрипта было остановлено
    
    функция инициализации ланг-пака (языкового файла:(
    PHP:
    function initLangPack($v1)
    {
        
    $pr1 parse_ini_file($v1);
        
    $ct1 sizeof($pr1);

        foreach (
    $pr1 as $key => $value){
            if(!
    defined($key))
            {
                
    define($key$value);
            }
        }
    }
    пример вызова:
    PHP:
    initLangPack('./ru-RU.ini');

    echo 
    LNG_HELLO .' 'LNG_USER;
     
  2. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    а не проще ли стразу создавать константами в ленг фаиле ? или массив делать?
     
  3. trooll

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    Не красиво это, да и для пользователя рядового (заказчика) часто не понятно что да как менять.


    Была у меня в свое время реализация на массивах, та же песня про не понятность от пользователей (заказчиков), с дальнейшим выяснением обстоятельств и причин по которым не работает скрипт.
     
  4. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    по мне все просто массив, + в админке к нему модуль редактор
    вариантов не так много
    -константы
    -массивы
    -в СуБД табличка
    --
    ини фаил не желательно не там чего поставит и все...
    лучше всего все же любой из -3х как больше нравится и к нему админ модуль с редактором) думаю это ненужно рассказывать как сделать
     
  5. trooll

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    Да есть такое дело, были заморочки. За то при этом варианте простота, быстрота. И как вариант при использовании моего варианта с константами, нельзя пере инициализировать константу заданную выше в скрипте по иерархической лестнице.


    Да вот к этому решению медленно и плавно иду, так как начинаю подумывать что бы записывать в файл уже профильтрованные данные, да бы избежать недоразумений.
     
  6. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Я еще видел такой вариант:

    PHP:
    echo e('Invalid login');
    echo 
    e('Hello, %s'$user);
    И надо сказать, мне он понравился гораздо больше чем константы. Собственно, тремя вещами:

    1) Не надо придумывать названия для констант типа ERR_INVALID_LOGIN, сами фразы на английском уже служат идентификаторами.

    2) Легче в плане "плавности" миграции. Сначала, когда ты еще не задумывался о мультиязычности, ты везде писал просто echo "Invalid login"; потом прошелся, порасставлял везде вызов функции, а функция эта у тебя если не найдет адекватного перевода - возвращает свой аргумент без изменений, т.е. на английском. И дальше уже переводишь потихоньку.

    3) Гибче. Можно иметь дополнительные параметры, можно в эту же функцию вставить "числа строкой" и оно для разных языков будет правильно переводиться, аналогично с числительными, падежами и т.п.

    А из недостатков могу назвать только скорость работы и то, что приходится расставлять скобочки. Скорость снижается практически неощутимо, а то и вообще не снижается, а вот скобочки задалбывают.
     
  7. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    а можно пример поподробнее интересное что решеие такое?
     
  8. sympler

    sympler Постоялец

    Регистр.:
    24 окт 2008
    Сообщения:
    131
    Симпатии:
    6
    почему все пытаются языковые переменные держать именно в файлах, ведь есть более быстрая MySQL, я думаю в ней содержать все записи, да и редактировать быстрее вроде, или я не прав?
     
  9. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    И каждый раз каждую строку селектить?

    Редактировать - да, но часто ты интерфейсные сообщения собираешься редактировать? Имхо проще намертво вшить в код - и быстрее работать будет, и легче реализовать, и проще логика, без дополнительных сущностей.
     
Статус темы:
Закрыта.