среда, 14 марта 2012 г.

Мультиязычное приложение на gcc при помощи gettext

Сделать приложение многоязычным, с неограниченным количеством поддерживаемых локалей, без изменения кода логики программы не просто, а очень просто!

Рассмотрим локализацию приложения пр помощи GNU утилит gettext на конкретном примере. В качестве препарируемого приложения я выбрал roguelike игру Cataclysm (git-hub: https://github.com/Whales/Cataclysm, forum: http://whalesdev.com/forums/). Код написан на c++ и открыт. Текстовые сообщения в ней безобразно размазаны по всему коду, так что код отлично подойдет для примера :)

Для начала немного слов о механизмах, предоставляемых gettext. Для локализации приложения необходимо все текстовые сообщения, выводимые на экран, нужно "обернуть" специальной функцией gettext. Например:

было:
printf ("The amount is %d\n", amount);
стало:
printf (gettext ("The amount is %d\n"), amount);

И этого достаточно для неограниченного количества локализаций! необходимо, только инициализировать текущую локаль ОС. Но, как и обещал, будем все рассматривать на конкретном примере.

Описание прототипа функции gettext находится в файле libintl.h поэтому его необходимо подключить в исходниках. Для Cataclysm, наилучшее место его включения, это файл будет "game.h". Добавляем в его начало (разумеется, после #define _GAME_H_):

#include <libintl.h>
#define _(String) gettext (String)
Мы также определили макрос _(String), чтобы не писать много букв gettext(...), на каждое сообщение в игре, а просто _(...). Также нам понадобятся две константы, это название нашего приложения (на самом деле это будет имя файла с локализацией приложения) и директория размещения его локализаций.
#define PACKAGE "cataclysm"
#define LOCALEDIR "locale"

в конкретном случае директория "locale" у нас находится в директории самого приложения. По умолчанию же в debian системах это "/usr/share/locale" где лежат локализации для различных языков всех приложений, поэтому, если мы будем размешать локализации в директории по умолчанию, то значение PACKAGE должно быть уникальным.

Далее инициализируем локаль и задаем значения для локализаций. Это необходимо сделать вначале функции main(), в cataclysm она описана в файле "main.cpp":

setlocale (LC_ALL, "");
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain (PACKAGE);
Теперь самая нудная часть, необходимо просмотреть ВСЕ исходники и изменить все строки с сообщениями программы. Например в файле game.cpp в строке 110.

было:
mvwprintz(w_open, 0, 1, c_blue, "Welcome to Cataclysm!");
стало:
mvwprintz(w_open, 0, 1, c_blue, _("Welcome to Cataclysm!"));

После того, как исходный код изменен, создаем директории для русской локали:

mkdir locale
mkdir locale/ru
mkdir locale/ru/LC_MESSAGES

создаем темплейтый файл для перевода:

xgettext --default-domain=cataclysm --output-dir=./locale --language=C++ --from-code=UTF8 --keyword=_ --directory=./ *.cpp *.h

В результате, в директории locale, у нас создастся файл cataclysm.po, содержащий все строки из исходного кода, которые мы обернули макросом _(String).

создаем po файл для русского перевода:

msginit -i locale/cataclysm.po -o locale/ru/LC_MESSAGES/cataclysm.po --locale=ru_RU.UTF8

Теперь нам нужно отредактировать полученный файл locale/de/LC_MESSAGES/cataclysm.po, а именно, добавить в него перевод, можно редактировать в любом текстовом редакторе, или же, воспользоваться программой poedit (http://www.poedit.net).



Пример части отредактированного po файла:

msgid ""
msgstr ""
"Project-Id-Version: cataclysm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-03-13 15:54+0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Kanstantsin Ashuika <EMAIL@ADDRESS>\n"
"Language-Team: Russian <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: game.cpp:110 game.cpp:204
msgid "Welcome to Cataclysm!"
msgstr "Добро пожаловать в Катаклизм!"

#: game.cpp:111 game.cpp:205
msgid ""
"This alpha release is highly unstable. Please report any crashes or bugs to\n"
"fivedozenwhales@gmail.com."
msgstr "Эта альфа версия очень сырая. Пожалуйста, сообщайте о всех найденных ошибках на\n"
"fivedozenwhales@gmail.com."

#: game.cpp:130
msgid "Could not make './save' directory"
msgstr "Невозможно создать директорию './save'"

#: game.cpp:155
msgid "No message today."
msgstr "Сегодня нет сообщений"

#: game.cpp:167 game.cpp:219
msgid "MOTD"
msgstr "Сообщение"

#: game.cpp:168 game.cpp:220
msgid "New Game"
msgstr "Новая Игра"

#: game.cpp:169 game.cpp:221
msgid "Load Game"
msgstr "Загрузить"

#: game.cpp:170 game.cpp:222
msgid "Tutorial"
msgstr "Обучение"

#: game.cpp:171 game.cpp:223
msgid "Help"
msgstr "Помощь"

#: game.cpp:172 game.cpp:224
msgid "Quit"
msgstr "Выход"

#: game.cpp:229 game.cpp:268
msgid "Custom Character"
msgstr "Создать персонажа"

#: game.cpp:231 game.cpp:269
msgid "Preset Character"
msgstr "Выбрать ранее созданного"

#: game.cpp:233 game.cpp:270
msgid "Random Character"
msgstr "Случайный персонаж"

#: game.cpp:285
msgid "No save games found!"
msgstr "Не найдено сохраненной игры"

После изменения po файла необходимо его скомпилировать в mo файл командой:

msgfmt locale/ru/LC_MESSAGES/cataclysm.po -o locale/ru/LC_MESSAGES/cataclysm.mo

Если вы будете редактировать файл с использованием программы poedit, то он автоматически его откомпилирует при сохранении.

теперь при запуске приложения из под локали ru_RU и наличии файла locale/ru/LC_MESSAGES/cataclysm.mo текстовые сообщения из исходников будут заменены на сообщения из mo файла. Точно также можно добавить файлы локализации для других языков. При наличии файла локализации под конкретную локаль будет вставляться соответствующий перевод.

Тут стоит упомянуть еще об одном моенте. разумеется, если выставлена по умолчанию английская локаль, то русского перевода мы не увидим. Для того чтобы из под английской локали увидеть наш перевод необходимо запустить приложение из локали ru. Например при помощи следующей команды:

LANGUAGE="ru_RU.utf8" ./cataclysm
Результат:

Что осталось за кадром

Очевидно, что при внесении изменений в исходные файлы программы, необходимо пересоздать файл темплейтов. Чтобы добавить новые строки из вновь созданного файла темплейтов в существующий вариант перевода, необходимо выполнить команду:

msgmerge -N -U locale/ru/LC_MESSAGES/cataclysm.po locale/cataclysm.po

В данном примере мы задавали константы PACKAGE и LOCALEDIR прямо в исходниках, возможно, более правильно было бы их задавать в Makefile. Для cataclysm это бы выглядело так:

Makefile
...
# добавили:
DEFS = -DLOCALEDIR=\"locale\" -DPACKAGE=\"cataclysm\"
...
# заменили строку $(CXX) $(CFLAGS) -c $< -o $@
$(CXX) $(CFLAGS) $(DEFS) -c $< -o $@
...
Также, для того чтобы ncurses нормально отображал многобайтные символы, необходимо при линковке использовать библиотеку ncursesw а не ncurses.

18 комментариев:

  1. Хороший подход

    ОтветитьУдалить
  2. Великолепно!
    Но что делать с падежами?
    Например wolf corpse при таком подходе превратится в волка труп, plastic bootle of water в пластиковая бутылка с вода и т.д.
    С этими проблемами я и столкнулся, когда пытался локализовать.
    Можно в описание класса добавить падежи, потом исправить еще много чего и получить на выходе нормальный русский текст. Или смириться и ждать финального релиза.

    ОтветитьУдалить
  3. На самом деле я тут описал самый простой способ с минимум усилий. Для качественного перевода необходимо все же править больше кода, а не просто обертывать фразы. Возможностей существует много. Но и работы больше, более подробно все описано в документации: http://www.gnu.org/software/gettext/manual/gettext.html

    ОтветитьУдалить
  4. Я немного повозился. Результат уже начинает нравиться.
    Тут https://github.com/Frolik/Cataclysm

    ОтветитьУдалить
    Ответы
    1. А скомпилированные версии есть?

      Удалить
    2. скомпилировать под линукс - одна команда. make, под винду были билды, но не играбельно из за файловой системы винды и формата хранения карты мира в катаклизме.

      Удалить
    3. То есть под винду никак? Тогда можете deb-пакет скинуть? Сам скомпилить не могу.

      Удалить
    4. Если вопросы по катаклизму, а тем более по его переводу, то лучьше сюда: http://rlgclub.ru/forum/viewtopic.php?f=6&t=724. По поводу создания деб пакета: а какой версии катаклизма деб нужен? те изменения что я вносил - почти годовой давности. версия Frolik-а еще старше, но зато с добавленным частичным переводом. По ссылке на пост форума (что выше), были еще куски переведены, но тоже давно...

      Удалить
  5. За статью спасибо, интересно.
    Вместо 3-ёх команд mkdir можно было использовать mkdir -p locale/ru/LC_MESSAGES

    ОтветитьУдалить
  6. VarangaOfficial - варанга купить спб - все, что нужно знать об этом препарате. Воспользовавшись нашим ресурсом, вы получите возможность узнать всеисчерпывающую информацию об этом лекарственном средстве. Увидеть данные о клиническом тестировании геля, прочесть отзывы реальных покупателей и медицинского персонала. Изучить инструкцию по использованию, прочитать особенности и методы работы комплекса, осмыслить, в чем заключаются особенности работы крема Варанга, где можно заказать оригинальный сертифицированный препарат и, как избежать покупки подделки. Мы скурпулезно проверяем размещаемые на сайте данные. Предоставляем пользователям нашего ресурса сведения, почерпнутые исключительно из подлинных источников. Если вы нашли у себя признаки грибкового поражения стоп или уже довольно продолжительное время, без ощутимых результатов стараетесь избавиться от этого досадного недуга, у нас на сайте вы найдете быстрый и легкий способ решения проблемы. Присоединяетесь и живите полноценной, здоровой жизнью. Теперь все ответы на самые популярные и волнующие пользователей вопросы, собраны на одном ресурсе.

    ОтветитьУдалить
  7. Мы рады приветствовать вас на странице общения с порно порно чат с девушками! В наши дни супертехнологий просмотр записанного неизвестно кем и черт знает в какой момент порно не представляет никакого интереса. Другое дело порно видео чаты, на которых все видео состоят из режима настоящего времени, например, мы видим наблюдения! Разница между порно видео чатом и сексуальным совсем невелика, но она абсолютно ощутима. Просто в историях интимного чата мы готовы получить это на все сто процентов, до последней капли или дырки, и часто совершенно бесплатно! В случае, если различные другие чаты для порно должны оплачиваться отдельно, эти видеочаты с файлами дадут нам удовлетворение бесплатно! Представленный самой правой ссылкой, международный порно чат по-своему многонациональен, в то время как существует огромная армия российских порнозвезд, настоящих мастеров в нашем деле! Они машут действительно восхитительно и просто с помощью такого факта, так много иностранцев собираются на русское интернет-интимное шоу! Заходите и наслаждайтесь лучшим порно чатом ниже!

    ОтветитьУдалить
  8. Многие мфо могут предложить взять мгновенный кредит, но требования к выплате могут существенно отличаться. Таким образом, вы можете сравнить версии из реестра ifc, чтобы выбрать наиболее оптимальную. Если существующие сервисы, скорее всего, вам не подходят - посмотрите на те, которые объявили о себе на днях, все данные созданы здесь. Оцените преимущества и недостатки представленных новых кредитов, перейдите на портал микрокредитной компании, заполните онлайн-форму и ждите решения в течение нескольких часов. Если вы хотите больше пятидесяти тысяч рублей, но вы официально находитесь на службе, не допустили серьезных задержек и можете посвятить эти часы обработке пакета документации - вам предложат банковский кредит. И чем больше многочисленных аргументов вашей добросовестности и платежеспособности вы приведете, тем более мягкими и низкими будут условия сотрудничества с банком. Но таких образцовых пользователей не так уж много. Что должны делать другие? Вы можете попробовать занять 5000 рублей у друзей. Но есть и второй способ - оформить быстрый кредит. За этот период мфо рассматривают каждого заявителя, и у каждого есть шанс зачислить небольшую сумму средств на карту на незначительный срок. Кроме того, если вы вовремя погасите долги, история финансовой состоятельности увеличится, а значит, можно будет прибегнуть к услугам банка. Вопреки новым процентам по сравнению со стандартными), ifc обладает множеством серьезных преимуществ: - Залог, поручители и медицинские документы о доходах не понадобятся; - вы можете отправить анкету через интернет из любого удобного места - дома, в офисе или на отдыхе; - вам будут предоставлены различные способы предоставления и возврата заемной суммы; - новые клиенты могут стать владельцами первого кредита бесплатно (переплата 0%). Как вы думаете, одобренный микрозайм выдается только наличными? Это не совсем так. Старые и недавние мфо, выдающие займы онлайн, постоянно расширяют список способов перевода денег. Самыми топовыми в 2021 году являются: 1. На дебетовую/банковскую карту определенного банка; 2. На ваш текущий счет; 3. На webmoney - вебмани, яндекс деньги, киви и другие; 4. При использовании практики платежных переводов (contact, юнистрим, золотая корона). Воспользуйтесь приведенным выше списком, и посетитель найдет последние варианты круглосуточных онлайн-кредитов от надежных поставщиков, заслуживающих пристального внимания. Ознакомьтесь с условиями, выберите подходящие, нажмите кнопку "оформить", заполните форму на ресурсе соответствующей организации и ждите ответа - чаще всего он приходит через несколько часов. Если у зрителя возникают неясности относительно того, как правильно использовать займ без паспорта, У вас есть возможность связаться с нами по этому адресу.

    ОтветитьУдалить
  9. Всего их 26, при этом самым солидным является атолл ольхон площадью 729 км2. Атолл ольхон великолепен удивительными пляжами и поэтому не лишен прекрасной природы. Тажеранские степи, средневековые пещеры, вечерние бухты с удивительными пляжами. Залив мандархан расположен в бухте мухор, расположенной на территории государственного байкальского парка в иркутской области. На спутниковой карте водных пространств байкала указано, что озеро расположено на стыке иркутской эпохи, давным-давно, но как насчет республики бурятия? Подробная карта кругобайкальской железной дороги - кбжд. Проехав вдоль берегов крутобайкальской железнодорожной программы, она включает в себя 39 оплаченных подземелий на скалах тогдашних пятнадцати ходов, а именно здания из камня и 248 мостов, спроектированных и также сделанных профессиональными профессионалами. Возможно, ни один посетитель не останется равнодушным к движению программ этого пути, пути, который ведет, например, к пляжу через множество мостов, но подземелий. Трудно точно указать, в каком населенном пункте находится байкал, из-за того, что на границе водоемов расположено множество административных центров, населенных пунктов и деревень. В данном случае на фотобумаге была отмечена система ручьев, которая насыщает байкал по всей длине побережья. На байкале 336 рек, но я пропустил единственную с названием ангара из своих собственных объятий. Добраться до байкальских прудов легче из городов иркутска, северобайкальска, а также улан-удэ. Семь дней в неделю. Улан-удэ. Аэродром, простая промежуточная станция, а также остановки во время поездок вдоль восточного побережья. Добраться до иркутска и улан-удэ проще прямым поездом или с минимальным количеством переездов. Особенно богатый полуостров св. Нос, который был духовным местом бурятских колдунов, до землетрясения был островом, отсюда долгое время образовывался разрыв, соединяющий его с сушей, а риск - тоже полуостров. От того места, где села максимиха, речные суда идут до самого полуострова почтенный нос. У нас сосредоточено более трех тысяч разновидностей цветов: от миниатюрных микроорганизмов до огромных кедров. На нашем сайте любой человек удивителен. Зеленая вода, приятная природа, невероятные пейзажи - все это делает байкал популярным туристическим направлением. Обилие погодных условий байкальского пруда привело к появлению обильных, разнообразных цветов. Озеро байкал - едва ли не самый/самый востребованный/самый прославленный необычный природный культурный памятник российской федерации. Существует также огромное разнообразие тканей, цветов, овощных и фруктовых культур.Розы в случае с животными в столь разнообразных ландшафтах их пациентов тогда прекрасны цветами, присутствующими только в водоемах заповедников, например, такого рода, как (байкальский тюлень, бычки, живородящая рыба голомянка, омуль, хариус и также другие). Заповедник обладает роскошной горно-таежной природой (еловые дрова, ель, кедр, липа, пихта и др.) Территория байкальского заповедника великолепна животным светом: здесь, среди прочего, водятся северный олень, изюм, бурая новая игрушка, соболь, столбики, белки, бурундук, но некоторые. На самом раннем полуострове находится горный комплекс маркова высотой около 2 км, возвращаясь под который, в хорошую погоду потрясающе заметен весь байкал с его очарованием: атолл ольхон, ушканьи острова, чивыркуйский залив, байкальская заповедная зона, и какие там еще интересные игрушки. Любые основные зоны отдыха, замечательные места и размещение собраны в схеме на 3 кругах. Обязательно загляните в листвянку, там находится заповедник тюленей описываемых пород. Песчаная бухта - в списке Когда у планшета возникнут вопросы о том, где и что там находится, а также о том, как на самом деле использовать отдохнуть на байкале, У вас есть возможность позвонить на наш адрес электронной почты.

    ОтветитьУдалить
  10. Инженерно-геодезические изыскания для строительства используют такой ценный пакет документации, как инженерные и топографические эскизы. Эксперты формируют множество приложений к результатам igdi в объектах, на кишеневе схема действует уже несколько столетий. Кроме того, геодезисты проводят конкретную топографическую оценку в значимых достопримечательностях и, возможно, в других регионах, которые внезапно застраиваются, образуют производство. Клиент становится владельцем декларации кухни с предоставлением реальных измерений, вершин, координат. Накануне начала работ на строительной площадке геодезисты проводят аналогичные проектные изыскания: - Они получают лицензию на топографическую оценку в федеральных органах власти; - Возводят пошаговые многоквартирные съемки в интернете с использованием gps-процессов; - Выполняют топографическое проектирование с выбором месторождений подземных инженерных сетей; - Обновляют типографские схемы, а также пространственные схемы территорий; - Осуществлять считывание зон и порталов; - Разрабатывать и согласовывать технические документы. Который содержит лично итоговую декларацию геодезии двора Такой сертификат вручается клиенту после прохождения различных мероприятий. Об этом, безусловно, говорит печать экспертов по архитектуре. К документам прилагаются результаты топографических съемок в течение длительного времени, а также цифровая версия проекта. Печать свидетельствует о том, что водительские права подтверждаются знанием городского планирования, а также внешним видом. Когда в планшете появятся идеи, а также то, как использовать стоимость инженерно геологических изысканий, У вас есть возможность позвонить нам, чтобы остаться на онлайн-странице.

    ОтветитьУдалить
  11. Съемка топографическая как услуга представляет собой комплекс дел, которые производятся с целью получения плана местности повторяющий плана, съёмочного оригинала, еще иной топографической информации. Выполняется этот процесс топосъемка в москве маршрутом измерения углов, высот и характеристик счет специальных инструментов с земли, воды либо воздуха. В итоге топосъёмки оформляется чертёж со схематическими обозначениями разных составляющих инфраструктуры. В зависимости от конечного предназначения топографической съёмки на данную схему могут быть нанесены также иные объекты. Наземная съёмка возможность быть сочетанной, плановой (горизонтальной), вертикальной. При данном задачей плановой топосъёмки считается получение понимания обоюдного месторасположения координат точек в горизонтальной плоскости земной поверхности.

    ОтветитьУдалить
  12. С 2014 года крауд-маркетинг начал слишком резво сколько нужно ссылок для продвижения сайта набирать популярность. Изначально он применялся для борьбы с фильтрами от машин, желая прытко стал эффектным способом получить естественные ссылки безусловно зазря.

    ОтветитьУдалить