На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Serafim, fatalist
  
    > Многоязычие на сайте
      Необходимо написать сайт с поддержкой 2-ух языков. Сайт намечается большой, поэтому переписывать каждую страницу на другой язык - это изврат, тем более, что второй язык, похоже, будет китайским. Каким образом можно реализовать эту затею?

      Планировал чтение из файлов с выбранным языком.
      Я не знаю как это обычно делается :unsure: ...поэтому прошу помощи.
        Скорее всего, это вопрос по серверной части.

        Логика такова:
        Создаешь два файла (для каждого языка) с массивами, элементы которых соответсвуют отдельным словам или предложениям. Например:

        russian.php
        ExpandedWrap disabled
           
          <?
          $_WORDS = Array();
          $_WORDS["ERROR"] = "Ошибка";
          $_WORDS["HELLO"] = "Здравствуйте";
          ?>


        И, в зависимости от того, на какой язык переключился пользователь, запрашиваешь в начале страницы тот или иной файл языка.
          самый просто вариант всегда самый длинный .... всмысле дубляж.

          тебе все равно придеться их дублировать. всмысле текст на страницах.


          Дальще вопрос. какие скрипны тебе доступны ???

          Если только java script и html //// то тяжко хотя можно тот же мтод но придеться постараться.

          а вот на php или cgi
          то чтение можно организовать ....

          две странички для меню , полный дубляж.

          внутри нее станичку открытия станичек самого сайта ....

          А вот она читает в зависимости от того как сначала просили ....

          (всмысле при первом открытии она выдает только два языка на выбор , и выбранную в переменную запоминает )

          и при дальнейших открытиях брет или из файла одного языка или из другого.


          (java тоже только там придеться фреймы делать ... и странички всетаки дублировать..)
            советую почитать про GNU Gettext.
            сам с ним не работал, но слышал, что эта библиотека специально для интернационализации.

            p.s. самый простой вариант через массивы(как было уже описано до меня)
              Спасибо всем откликнувшимся. Вывод такой: два файла с разным текстом. писать на php.
                M
                Тема перенесена из WWW Masters -> HTML, CSS, Flash, JavaScript ...
                  Цитата
                  rebel, 6.09.04, 18:27
                  Вывод такой: два файла с разным текстом. писать на php.

                  Решительно нет! Т.к. писал мультиязычный проэкт и сталкивался с геммороем. ИМХО - один файл, набор шаблонов, языковые файлы. Для каждого языка своя папка
                    Rom@nych,
                    ну зачем своя - достаточно одного файла - а шаблоны вабще от языка отделить
                      Цитата
                      SergeS, 7.09.04, 12:22
                      достаточно одного файла

                      ИМХО - нет. Идём по примитиву. Админу - свой языковый файл. Сайту - свой. А если система модульная, то уууууууу!! Модулю - по файлу!
                      Цитата
                      SergeS, 7.09.04, 12:22
                      шаблоны вабще от языка отделить

                      А кто их объединял??? {$L_LOGIN} и туда вставится Логин на необходиом языке...
                        гораздо легче всё ето загнать в один и там просто отделить пустой строкой - потом легче работать в скрипте - тк не надо проверять подгружен ли файл итд ИМО - вобщем ето удобнее когда все скрипты обращаются к одному файлу + когда каждая часть является модулем ИМП :)
                          SergeS, тема может превратится в бесконечный спор, но! При установке модуля он будет дописывать свои переменный в общие языковые файлы??? А при унисталле, будет их оттуда удалять? Корявее тяжело придумать;)) Да и каждый модуль должен сам заботиться о подключении языковых файлов.
                            Rom@nych,
                            да не сложно ето :)
                              SergeS, не буду спорить. Приведу пример.
                              Есть трёхязычный сайт.
                              Ставим модуль, у которого один язык (пока)
                              Вопрос №1: куда что добавлять инсталятору???
                              Вопрос №2: кто будет контролировать язык модуля?

                              Предложение:
                              Создать прикреплённую тему, в которой будем обсуждать создание модульных/многоязычный/шаблонных супер-сайтов;))
                                Rom@nych,
                                создавай в прочим :) - может прибью к верху :)
                                хотя думаю на ето дока найдётся
                                  Тоже столкнулся с проблемой многоязычности.
                                  Специально для этих целей сделал свой движок.

                                  Суть вот в чем.
                                  Есть язычно не зависимые шаблоны, и переменные в них на замену нужной фразой нужного языка.
                                  Все это дело хранится в БД и за этим присматривает сам движок. Т.е. телодвижения программера сведены к минимуму.

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

                                  Для ускорения работы, система управления при обновлении шаблона за спиной создает шаблоны для каждого языка (т.е. уже проставляет текст).

                                  Сам движок во время работы (генерации страницы пользователю) уже вытягивает готовый языковый шаблон.
                                  Т.е. программеру в процессе создания сайта нужно пользоваться методами этого самого движка.
                                    Zipo, я твоего движка не видел, но мне кажется, что нечто подобное уже существует. Решил я с этой технологией поразбираться и вот, что я узнал(надеюсь кому-ниюудь эта информация будет полезна). Итак, GNU Gettext

                                    Основы
                                    Основа библиотеки Gettext состоит в использовании метода gettext(). Идея gettext() заключается в том, что если есть строка, которую нужно перевести, то перевод строки ищется в базе данных(файл .po) Если gettext() находит перевод, то считывает его, иначе берет оригинальную строку. Строку для перевода надо передать методу как аргумент.
                                    ExpandedWrap disabled
                                      print(gettext("Phrase for translation"))

                                    также можно использовать сокращенный вариант с подчеркиваним
                                    ExpandedWrap disabled
                                      print(_("Phrase for translation"))


                                    xgettext
                                    Когда вы создали программу и пометили в ней строки с помощью функции gettext() или _(), необходимо эти строки извлечь программы для дальнейшего перевода. Делается это следующим образом:
                                    ExpandedWrap disabled
                                      xgettext --keyword=_ -o trans_file.po my_script.php

                                    Важная особенность! xgettext извлекает только строки, заключенные в двойне кавычки. В итоге получается файл trans_file.po, который является обычным текстовым файлом, но построенным определенным образом. Этот файл отдается переводчикам на обработку(то есть на перевод). Переводчики возвращают готовый вариант и приходит пора msgfmt

                                    msgfmt
                                    Переведенный файл должен быть конвертирован в двоичный формат.
                                    ExpandedWrap disabled
                                      sgfrm trans_file.po -o trans_file.mo

                                    Затем необходимо обспечить дерево каталогов для локалей. Надо создать каталог locale, а внутри этого каталога создать каталоги для каждого языка. Внутри каждого каталога создаем еще один каталог LC_MESSAGES, куда и помещаем trans_file.po и trans_file.mo
                                    Итого, структура каталогов будет примерно такой:
                                    ExpandedWrap disabled
                                       
                                      locale/en/LC_MESSAGES/trans_file.po
                                                           /trans_file.mo
                                            /ru/LC_MESSAGES/trans_file.po
                                                           /trans_file.mo


                                    bindtextdomain()
                                    Чтобы сценарий мог читать строки из этих каталогов, надо настроить textdomain.
                                    ExpandedWrap disabled
                                      bindtextdomain("trans_file","./locale");

                                    Теперь gettext() знает, где, что искать.

                                    putenv()
                                    дело близится к концу. осталось установить переменную окружения LC_ALL, чтобы указать язык по умолчанию.
                                    ExpandedWrap disabled
                                      putenv("LC_ALL=ru")


                                    Итого, окончательный вид программы:
                                    ExpandedWrap disabled
                                       
                                      <?php
                                        putenv("LC_ALL=ru");
                                        bindtextdomain("trans_file", "./locale");
                                        print(_("phrase for translation"));
                                      ?>

                                    Готово! Сложно, но надежно. и удобно, так как переводом занимается переводчик и программист от него никак не зависит. Также предусмотрена функция msgmerge, для обновления перевода, то есть если в код добавлены новые строки.

                                    Для полноты изложенного следует отметить некоторые недостатки(они всегда есть).
                                    1. в php нет поддержки Gettext по умолчанию
                                    2. не очень хорошая переносимость с сервера на сервер - не всегда все хорошо

                                    вот вроде все для начала... надеюсь кому-нибудь эта технология поможет и облегчит жизнь

                                    при написании пользовался материалом книги "Professional PHP 4" издательства Wrox
                                      Да-м, вот почитал ответы... два файла на php это будет геморойно... <_<
                                      Тут оказалось, что нужен будет еще один язык, итого уже 3.
                                      Есть вариант сделать отдельную базу данных для всего этого переведенного и оригинального текста.
                                      Судя по ответам все равно нужно будет иметь три файла.
                                      Судя по ответу shipbrother, есть библиотека для таких целей. Я так понял это оптимальный вариант?!?! :unsure:

                                      Объясню в общем свою цель.
                                      Сайт будет педставлять продукцию двух стран. Вся продукция будет находиться в базе данных.Каждый продукт нужно будет иметь на трех разных языках.
                                      Вот тут опять вопрос:
                                      делать одну базу, но с полями, например, name_ru, name_en ... для трех языков. Или делать три базы для каждого языка отдельно? Получатся идентичные базы, но с разными названиями баз. Тогда при выборе языка в переменную записал бы имя базы, а потом подставлял бы его в запросе. Это был бы один алгоритм, а если все в одной базе, это нужно будет писать три алгоритма для одного, второго и третьего языка, т.к. имена полей разные.

                                      Меня волнует удобство использования и дальнейшей модификации.
                                      Сообщение отредактировано: rebel -
                                        2rebel
                                        Мой совет, используй именно 3 поля. Это гораздо удобнее, ты можешь попутно генерировать строку select'а и просто в зависимостри от языка будешь делать следующее "select name_".$lang.", что на много удобнее. Я работаю в компании, где разрабатываются глобальные решения с многоязыковой поддержкой и используется именно этот метод.
                                          скачать GNU Gettext можно с - http://www.gnu.org/software/gettext
                                          оригинальный мануал есть там же - http://www.gnu.org/software/gettext/manual/gettext.html
                                          The Purpose of GNU gettext - http://www.gnu.org/software/gettext/manual...ext_1.html#SEC2

                                          на сколько я понимаю GNU Gettext больше рассчитан на сообщения, выводимые пользователю посредством php-скрипта(то есть перевод частей html, который php генерит на лету). но возможно, что он может работать и с информациией, хранимой в базах данных продуктов(например) - в подробности я не вдавался.

                                          p.s. по-моему с 3 разными базами удобнее. представь, что у тебя одна комбинированная база и надо на сайт добавить еще один язык - это тебе перелопапить всю структуру базы надо. А если у тебя на каждый язык по базе, да еще и с одинаковой структурой - то просто создал еще одну базу и все.
                                          единственный минус - не все хостинги дают создавать более одной базы
                                          Сообщение отредактировано: shipbrother -
                                            А кто тогда мешает сделать так, создаем табличку товар + табличку описания + табличку языков. И все связка many-to-many.
                                            В табличке товар у нас id товара, цена, что угодно.
                                            В табличке языков, id языка, назнание если надо, например: 1 Русский 2 English 3 Deutsch
                                            В табличке описания id товара, id языка, текст.

                                            И в итоге простая связка:

                                            SELECT a.id, a.цена, с.текст FROM товар a, язык b, описание с WHERE a.id=с.id_товара AND с.id_языка=b.id AND b.название='Русский' (ну или по ID)
                                            А ID определять в зависимости от того, на каком языке пользователь смотрит страничку.
                                              To SER-Gun
                                              Серж, хватит раскрывать наши корпоративные секреты! ;)
                                              А вообще-то я согласен, верно говорит. И уж с чем, а с языками геморроя не возникает!
                                                rebel,
                                                shipbrother,
                                                есть таковая - тока она хороша пашет под Линуксом :) не под виндой ( вобщем я пока не видел нормально работающюю ) - тут хватает мороки с установкой а потом с настройкой
                                                  Хорошо, делам по три поля для товаров и прочего, определились.

                                                  А многоязыность интерфейса сайта, тоже отдельную табличку с тремя полями под языки?
                                                    А чем интерфейс отличается от всего остального? Ничем! Те же яйца, вид сбоку, так что и поступай аналогичным образом.
                                                      Что ты подразумеваешь под интерфесом? Если ты хочешь менюшки, то тут есть 2 варианта, создаешь либо столько файликов сколько тебе нужно языков, например text_ru, text_en, text_fr и забиваешь в них одни и теже переменные, только на разных языках, например:
                                                      text_ru
                                                      $menu1="Тест1";
                                                      $menu2="Тест2";
                                                      $menu3="Тест3";
                                                      text_en
                                                      $menu1="Test1";
                                                      $menu2="Test2";
                                                      $menu3="Test3";

                                                      А потом делаешь следующий include("text_".$lang), где
                                                      $lang равно либо ru, либо en, либо fr в зависимости от того в какой версии сайта находится пользователь.
                                                        Спасибо всем большое! Все понял, буду заниматься. :rolleyes:
                                                          Потом ссылочку хоть кинь на творение ;)
                                                            Цитата
                                                            Потом ссылочку хоть кинь на творение

                                                            Обязательно, но боюсь это будет не скоро <_< , т.к. только начал изучать скрипты, базы и т.п.
                                                              Никто никогда не смторел eGroupWare? Там есть такая фияа, как TranslationTools - Очень интересный подход к переводу. Вообще в eGroupWare есть много интересных вещей.
                                                              http://egroupware.org
                                                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                              0 пользователей:


                                                              Рейтинг@Mail.ru
                                                              [ Script execution time: 0,4386 ]   [ 15 queries used ]   [ Generated: 28.04.24, 12:28 GMT ]