PHPText — простая локализация

    Для локализации программ существует много решений и конечно же gettext. Однако объяснить рядовому пользователю windows, как при помощи его перевести программу, составляет большую трудность.
    Поэтому я решил написать небольшое приложение для простой локализации.


    Написано оно на C# и умеет при помощи Google Translate переводить сообщения. Так же оно может работать с уже готовым словарем.
    Для хранения словарей я выбрал самый простой формат:
    <?php
    $_LANG = array(
        'id' => 'text'
    );
    ?>
    


    В коде вместо стандартной _(...), я решил использовать tr(...) (как в Qt), так как иначе будут проблемы с тему у кого GetText Support: enabled. В программе название функции можно заменить в настройках.

    После выбора каталога с исходниками, программа собирает все вхождения tr|_(...) в php файлах и добавляет их в таблицу. Каждой строке присваивается статус (столбец New):
    • — сообщение присутствует в исходнике и словаре.
    • — сообщение присутствует в словаре, но в исходниках не обнаружено.
    • — новое сообщение. Присутствует только в исходнике.


    Ненужные более сообщения можно удалить. Новые перевести при помощи гугла и что-то подредактировать самостоятельно.

    Свой проект, я смог перевести за 20 минут. Надеюсь что моё приложение пригодится кому-нибудь ещё.

    PHPText на Google Code: Скачать

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 32

      +24
      Приложение на C#, а словари на php. Мсье знает толк в извращениях.
        0
        По скорости как?
          0
          Сбора сообщений? Всё быстро.
          +9
          Как показала практика дефолтный poEdit легко осваивается переводчиками.
            +5
            Перевести приложение, использующее gettext, можно при помощи Pootle, а также массой прочих редакторов для десктопа и веба. Совершенно непонятно, зачем очередной велосипед.

            Опыт переизобретений велосипедов показывает, что они получаются намного менее удобными, чем gettext и утилиты для работы с ним. Был вполне конкретный опыт, когда в большой компании я предлагал gettext, но меня не послушали и написали велосипед с квадратными колесами.
              +1
              Да, переводчиков можно научить юзать gettext, а вот мои пользователей навряд ли :)
              Простое приложение с двумя кнопками — это то что им нужно.
                0
                Их много простых. Есть даже браузерные, аля переводы launchpad.
                  +1
                  GlotPress в действии элементарен. Простите за неполность перевода :)
                  К тому же основная сила gettext — это переводы всяких числительных «1 камент», «2 камента», «5 каменов».
                  У вас об этом ни слова.
                    0
                    Разве gettext может так делать?.. Мне казалось только единственное/множественное…
                      0
                      В формате словаря можно указывать формулы для каждого множественного варианта, которых может быть сколько угодно. От языка зависит.
                        0
                        Надо внимательнее глянуть… Почему-то когда программировал под cakePHP, не смог там найти функцию реализующую подобный функционал, может не очень внимателен был…
                0
                Редактировать то можно, а вот как Вы будете создавать *.mo файлы на сервере пользователя?

                Пример — CMS (форум, блог, и тд. и тп.) в которой пользователи могут сами изменять перевод, в этом случае PHP файлы будут удобнее и проще, чем объяснять простым пользователям, что делать с *.po файлами.
                  0
                  из PHP можно генерить mo файлы. Либо напрямую через пхп (формат открытый, есть даже реализации), либо с помощью сторонних средств (msgfmt, например).
                    0
                    > из PHP можно генерить mo файлы

                    А рабочим примером не поделитесь? Хотелось бы посмотреть на реализацию редактирования через админку простым пользователем — просто когда у меня возникает вопрос «что же использовать?» я вспоминаю про проблемы *.mo файлов

                    > формат открытый, есть даже реализации
                    Пока нашел только File_Gettext, последний релиз 2007 год…

                    И, кроме этого, в мануале можно найти:
                    ru2.php.net/manual/en/gettext.requirements.php:

                    The GNU gettext library works on a per-process, not per-thread basis. This means that in a multi-user setting such as the Apache web server it will only work with a prefork MPM (i.e. one process per user). Worker and other threaded MPMs will not work.

                    In addition, many users control GNU gettext by setting system environment variables such as LANG. This is not a good solution for a web server environment due to an obvious race condition.

                    ru2.php.net/manual/en/function.gettext.php#58310
                    Gettext translations are cached. If you change *.mo files your page may not be translated as expected.

                    Учитывая это, свой велосипед уже не кажется таким плохим. Числительные при желании тоже можно реализовать наподобие того, как это сделано в gettext-е.

                    ни к чему не призываю, это просто мои соображения
                      0
                      Я использовал File_Gettext для работы с po файлами — работает нормально. Правда множественное число я не проверял как работает. С генерацией mo файлов были какие-то косяки (последний перевод не всегда работал), не стал разбираться генерил с помощью вызова из шела msgfmt.

                      На счет встроенного gettext, пока проблем нет, но проект еще в тесте, поэтому говорить рано. В крайнем случае есть php реализация в Zend Framework (Zend_Translate она поддерживает кучу форматов, вся реализация на php), которая должна снять указанные ограничения, правда, она будет, конечно, медленнее и прожорливее (нативная реализация оочень быстро работает даже на больших словарях).
                        0
                        Уж простите — я снова с GlotPress-ом :)
                        В исходниках есть библиотека pomo и инструментарий для сборки po/pot.
                        Я сейчас бьюсь с ней, чтобы сделать auto-deploy утвержденных переводов прямо на сервере.
                  0
                  Кстати, формат po файлов gettext'а не слоднее чем php массив. Более того я почти уверен, что для большинства популярных языков есть написанные библиотеки для чтения/генерации po и mo файлов.
                    0
                    По меньшей мере в cakephp это дело реализовано.
                      0
                      Если говорить про php, я юзал pear класс, правда с mo файлами проблемы какие-то были.
                    –4
                    А мне нравиться, люблю c#.
                      0
                      вам нравится только потому что вы любите c#? а если бы в топике ХеллоВолрд на нём написан был бы?
                      ничего не имею против решения или автора, но аргументация, почему нравится — некорректная.
                        –4
                        Аргументация чего? Вы цензор интернета? Вы определяете когда чего кому должно нравиться и по какой причине? Для меня то что это написано на c# является причиной того, почему мне это нравиться. Корректно это или нет, к сожалению, но это факт и ничего поделать не могу.
                      0
                      Несмотря общую ненужность программы лично мне (и на то, что на моём последнем дотнете она не запустилась), программа нравится святой простотой интерфейса.
                        +1
                        «Вы еще не достигли конца»
                          0
                          «Вы еще не достигли конца», «Попробуйте еще раз», «Предел превышен», «Конец», «Поздравляем! Вы вошли в десятку!», «Поздравляем! Вы самый лучший!»

                          зы: Можно узнать что за проект?
                            0
                            Что-то вроде браузерной игры на основе чата :)
                          +1
                          > Написано оно на C# и умеет при помощи Google Translate переводить сообщения.

                          Ага, я на прошлой неделе как раз получил обратно файлы локализации для своей программы. Подключил, пробежался по меню… В традиционном пункте «Help->About...» красовалось: «Помощь->Приблизительно...»

                          А вообще спасибо, я почерпнул пару идей.
                            +1
                            Сейчас кто-то подсуетится и быстренько зарегает elfchat.ru
                              +1
                              и еще эльфчат.рф?))
                                0
                                Действительно. :)
                                +1
                                наши клиенты в упор отказываются работать с gettext, они хотят менять текст без участия людей фирмы, после сдачи проекта. Написали контент на MYSQL+memcached. Администратор\Менеджер сам решает что хранить в кеше, а что нет (к примеру большие странички), кроме того клиенты любят использовать wysiwyg редакторы, с текущим CSS. Ну и еще сделали так: переводишь сайт в development mode и пользователи определенной группы видят кнопочку на странице, по нажатию на которую можно редактировать контент, который видишь. По сути все берется из кеша, так что работает довольно быстро.
                                Реализовано на кейке, используется в коде просто: $t10n->t('links', 'Hide') где первое значени — группа, второе токен. Можно и без группы, но с группами удобно, могут быть одинаковые токены в разных группах.
                                Еще мы переделали стандартную i18n чтобы отображать данные модели дефолтного языка, если данных модели текущего языка отсутствуют.

                                Only users with full accounts can post comments. Log in, please.