За последние 24 часа нас посетили 16822 программиста и 1635 роботов. Сейчас ищут 911 программистов ...

Интернационализация и с чем ее едят...

Тема в разделе "Прочие вопросы по PHP", создана пользователем kostyl, 8 сен 2008.

  1. kostyl

    kostyl Guest

    Привет всем. Долго думал куда написать - решил сюда.
    Такой каверзный вопро. Я думаю не стоит объяснять, что такое интернационализация (I18N).
    Так вот, работая над ней первый раз, начал разбираться в кодировках, чарсэтах и тому подобному.
    Что почем
    Пошарил я и в phpBB и в MyAdnmin и насчупал, что например русский перевод сохранен в ANSI. При этом есть гдето в настройках крутой массив доступных языков, чтобы при подключении какогото языка например ru типа отправлять header CHARSET=windows-1251.
    И только в одной книге по PHP4 нашел освещение этого вопроса. Там такая же ситуация - принимаем HTTP_ACCEPT_LANGUAGE (или как оно там пишеться) отправляем хедэр соответственно, не забыв при этом подключить соответственный перевод из файла например ru.php c "русской кодировкой"
    Как сделал я
    Значит подумал, что надо при вышесказанном мочить везде динамичный set names $GLOBALS['accept_language'] в зависимости от того кто заше немец или русский или китаец... Думаю ну его в баню... Прописал в классе db жестко set names utf8 и остальное тоже utf8. посохранял все переводы подключаемых языков в utf8 -все : и русский и английский и немецкий и польский предположим :wink: ну и скрипты тоже в этой кодировке. Теперь также принимаю HTTP_ACCEPT_LANGUAGE подключаю соответсвующий файл перевода и отправляю хедер везде и в мету charset utf8. тоже сделал крутой массив для функции mb_convert_encoding() которая работает в крутой процедуре для preg_mach - ей. Вот такие блины получаются...
    Внимание вопрос
    Зачем тогда в phpBB и в MyAdnmin понавыдумывали эту кучу кодировок и все равно в MyAdnmin у меня все в UTF-8 покаызывает и зачем в книжке так написано, если можно проще как я. Просто я впервые с этим столкнулся, и хотелось бы узнать Ваши мнения, кто как делае... за | против... и все такое...
    Заранее благодарю.
     
  2. QQQ

    QQQ Активный пользователь

    С нами с:
    21 ноя 2007
    Сообщения:
    538
    Симпатии:
    0
    думаю дело в том, что win-1251 в два раза короче - читай в два раза меньше трафа )
    нахрен эта UTF8, пусть китайцы с ней паряться ))
    ну не нравится мне движение в сторону тотального использования UTF8
    помоему большим бредом являются только домены на национальных языках
    чисто ИМХО
     
  3. kostyl

    kostyl Guest

    Привет еще раз. Тема затрагивает интернационализацию, но все равно отдельная, но все рвано затрагивает.
    Подскажите пожалуйста, как шаблонизировать подключаемые по link в шаблоны html джаваскрипты с учетом разных языков, тоест сообщения из javascript должны быть на разных языках - или не париться и создать кудч файлов типа например для регистрации register_ru.js register_en.js и подключать их в шаблонах в зависимости от языка заменя {U_JAVASCRIPT} в шаблоне html?
     
  4. kostyl

    kostyl Guest

    я думаю китайцу приятно будет на русском сайте увидет знакомые иероглифы :wink: если он вообще туда зайдет!
     
  5. QQQ

    QQQ Активный пользователь

    С нами с:
    21 ноя 2007
    Сообщения:
    538
    Симпатии:
    0
    kostyl
    по JS - думаю да. типа:
    1) создаёшь кучу файлов *.js содержащих только данные с языком
    2) а в основном js файле (с функциями) используешь их
    3) в html подкулючаешь нужный язык и стандартный js с функциями


    =))
     
  6. kostyl

    kostyl Guest

    Ага - я так сначала и попробывал - подключил основной а перед этим "языковый" c чисто строковыми переменными, но у меня не получилось не знаю почему
    Вот например в первом написал, допустим:
    [js]LOGIN_ERROR = 'Неверный логин';[/js]
    Во втором :
    [js]
    function ShowtError()
    {
    var mess = '&nbps;'; /*не помню как точно знак пробела*/
    if ('траляля') {
    mess = LOGIN_ERROR ;
    }
    document.getElementbyId('message_location').innerHTML = mess.fontcolor(#FF0000); /*не помню точно как раскрашивается*/
    }
    [/js]
    Если то что в первом написать во второй - работает... Тут чтото с областью видимости - но я не знаю...
     
  7. QQQ

    QQQ Активный пользователь

    С нами с:
    21 ноя 2007
    Сообщения:
    538
    Симпатии:
    0
    kostyl
    странно.. некогда к сожалению доки по JS перелопачивать сейчас..

    как временный выход - можно генерить динамически JS с помощью PHP составляя его из двух файлов
    но лучше по JS документацию почитать конечно
     
  8. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    kostyl

    попробуй покопать в сторону заголовка запроса Accept-Language.

    у мну FF3 например шлет такое:

    Код (Text):
    1. Accept-Language ru,en-us;q=0.7,en;q=0.3
    IE 6.0 такое:

    Код (Text):
    1. Accept-Language: ru
    оперу, извини, не проверял)
     
  9. kostyl

    kostyl Guest

    Это ответ на какой вопрос? Че тут копать читаешьпервые два символа с HTTP_ACCEPT_LANGUAGE и вот тебе язык ! :wink:
     
  10. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
  11. kostyl

    kostyl Guest

    не все провайдеры поддерживают (
     
  12. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Есть реализация на PHP, правда не знаю насколько она медленнее нативного gettext.
     
  13. kostyl

    kostyl Guest

    ага в той же книге говориться что можно и своими силами сделать gettext даже типа назвать одинаково как то что если php скомпилен с поддержкой gettext то будет работать расширение а если нет то своя реализация. Вот только книгу не помню как зовут, автор на А фамилия иностранная ) А как лично вам то как я сделал? А поповоду джавы скрипт знаете?
     
  14. kostyl

    kostyl Guest

    Ну ладно с кодировками - подскажите хотябы по области видимости в JavaScript...
     
  15. kostyl

    kostyl Guest

    Значит кому интересно: Получается так что LOGIN ERROR в области видимости функции ShowtError() не видитсья как глобальная и даже как локальная так, как она не создана и при попытке прочитать ее появляется ошибка. Я не разобрался как данным способом сделать ее локальной. При таком разнесении переменных вроде даже если передавать их в функции то все равно не будет работать... ну это уже кому надо тот и разберется.
    Я сделел проще - объявил в head файла шаблона переменные скрипта в виде:
    HTML:
    1.  
    2. <script tupe="text/javascript">
    3. LOGIN_ERROR = {JM_ERROR_MESSAGE}
    4.  
    и все работает, и заменяется и необходимым языком :D
    Причем аттачить фунцкии можно перед объявление переменных, но объявить переменные желательно в head-е, чтобы проинициализировать до загрузки. А ранее приатаченные функции - всего лишь функции - так что вот так ребятки :wink:
     
  16. QQQ

    QQQ Активный пользователь

    С нами с:
    21 ноя 2007
    Сообщения:
    538
    Симпатии:
    0
    kostyl
    один минус - подключаемые JS файлы кэшируются браузером, а так каждая страница длиннее на язык ))
     
  17. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Я у себя как делал......

    Записывал идентификатор языка в сессию.
    index.php проверяет идентификатор.
    в папке /lang/ лежат языковые файлы в виде архива.
    lang-файл представляет собой классический языковой массив.

    Я использовал смарти...
    В зависимости от идентификатора загружался lang-файл...

    Кста, кодировку я сразу поставил utf-8
     
  18. kostyl

    kostyl Guest

    мдя... но другого пути пока ай доунт ноу...
     
  19. kostyl

    kostyl Guest

    да сессии это круто - они пригодяться если браузер случайно посылает не тот язык доступа или пользователь хочет переключиться на другой язык, например если я вдруг захочу почитать тоже самое но на китайском, правильно, а это перевод с китайского на русском, который мой браузер запросил и послал HTTP_ACCEPT_LANGUAGE ru, но на китайском же оригинал ГЫ ...
     
  20. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    В зависимости от идентификатора, из папки я зыком requirим ланг-файл.
    Как браузер ошибиться-то сможет?

    А если utf8, то по барабану, какой там язык))) Китайский, не китайский......

    p.s. Кста, а чем utf-16 отличается от utf-8?
    Какие-то еще мифические языки поддерживает? Клинопись?))))
     
  21. kostyl

    kostyl Guest

    Обычно, откуда он знает какой язык вы умеете читать?
    Или вы ему призапуске говорите в микрофон? :wink:
    естественно нет если определять язык из запроса браузера...
    без понятия.... наверно каждый символ повторяется для уверенности... :wink:
     
  22. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Хмм... ну для этого, можно исходить из IP-адреса, и устанавливать соотв. идентификатор сессии.
    Или делать defaultный английский.....

    Ага, и выводится тоже так же))
     
  23. kostyl

    kostyl Guest

    admyx
    это то все можно, но предоставить пользователю самому выбрать язык тоже думаю не помешает....
     
  24. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Ну разумеется.

    Как сделано у меня в lilium-group.com

    Там снизу два языка
    index.php?setlanguage=ru
    index.php?setlanguage=en

    В завис-ти от того, что выбрано, $_SESSION['lang'] = $_GET['setlanguage'];

    И далее
    if($_SESSION['lang'] == 'ru')
    require('./lang/ru.php');
    else
    require('./lang/en.php');

    Ну, это я дла примера.

    А изначально $_SESSION['lang'] == 'ru'
     
  25. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург