GTK + - 2.0 Руководство по локализации как для графического интерфейса, так и для кода

2.0 + MinGW32 + платформа Windows + IDE Netbeans для создания моего приложения. Я создал интерфейс, но теперь мне нужно добавить опцию выбора языка, и мне нужен автоматический перевод, и я новичок в GTK, поэтому мне нужна подробная помощь. Я искал в Google, но я не нашел никакой помощи для этого в Windows, поэтому, пожалуйста, помогите как можно скорее :( Я разработал свой макет с помощью gtkBuilder.

Я хочу знать, какие шаги нужно предпринять, чтобы это сделать ...

Пожалуйста, выделите, как использовать gettext () или_ () в Windows, что такое файлы .po и как с ними обращаться ...

** Извините за плохой английский...


person Waqar Ali Khan    schedule 20.11.2011    source источник


Ответы (2)


Ну, это зависит от того, какой генератор Makefile вы используете. Я не думаю, что вы используете для этого автоинструменты, поэтому вам может потребоваться реализовать для этого свою собственную логику.

Я сделал это в Windows / MinGW с помощью CMake. Рабочий процесс, которому необходимо следовать для создания файлов .po, находится в GNU Обзор gettext. По сути, xgettext анализирует ваш код, чтобы извлечь строки, которые вы хотите перевести. Вы можете передать ему ключевое слово, обычно "_", которое идентифицирует макрос _ (), используемый в вашем коде для пометки строк для перевода. Он сгенерирует файлы .pot (шаблон заказа). Затем вы можете скопировать этот файл и переименовать его в файл .po и перевести строки с помощью таких инструментов, как poedit.

Вам нужны некоторые механизмы для обновления ваших файлов po. Это использует msgmerge, который объединит ваши новые файлы .pot с существующими файлами .po. Он добавит новые строки для перевода и закомментирует исчезнувшие строки.

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

Надеюсь это поможет.

person liberforce    schedule 21.11.2011
comment
Можете ли вы использовать для этого bash, или добавление зависимости bash запрещено? - person liberforce; 23.11.2011
comment
да, я не могу использовать скрипт на bash :( - person Waqar Ali Khan; 23.11.2011
comment
Тогда, я полагаю, вам придется вызвать xgettext, msgmerge, msgfmt из сценария .bat ... - person liberforce; 24.11.2011
comment
Наконец, я сделал все это с помощью очень хорошего учебника, спасибо :) - person Waqar Ali Khan; 24.11.2011
comment
@ Вакар Али Хан, раз уж это кажется ответом, почему бы тебе не стать другом и не принять это как есть? ;) - person josephthomas; 21.01.2012

cat >hellogt.cxx <<EOF
// hellogt.cxx
#include <libintl.h>
#include <locale.h>
#include <iostream>
int main (){
    setlocale(LC_ALL, "");
    bindtextdomain("hellogt", ".");
    textdomain( "hellogt");
    std::cout << gettext("hello, world!") << std::endl;
}
EOF
g++ -o hellogt hellogt.cxx
xgettext --package-name hellogt --package-version 1.2 --default-domain hellogt --output hellogt.pot hellogt.cxx
msginit --no-translator --locale es_MX --output-file hellogt_spanish.po --input hellogt.pot
sed --in-place hellogt_spanish.po --expression='/"hello, world!"/,/#: / s/""/"hola mundo"/'
mkdir --parents ./es_MX.utf8/LC_MESSAGES
msgfmt --check --verbose --output-file ./es_MX.utf8/LC_MESSAGES/hellogt.mo hellogt_spanish.po
LANGUAGE=es_MX.utf8 ./hellogt

Вот описание файлов, созданных выше:

hellogt.cxx         C++ source file
hellogt             Executable image
hellogt.pot         Extracted text from C++ source file (portable object template)
hellogt_spanish.po  Modified text for Spanish with translations added (using sed)
es_MX.utf8/
 LC_MESSAGES/
   hellogt.mo       Binary translated text for Spanish used at run-time

ИСТОЧНИК: Полный пример C ++ i18n gettext () hello world

person Waqar Ali Khan    schedule 24.11.2011
comment
Что ж, шаг sed в основном бесполезен, переводы обычно выполняются с помощью внешнего инструмента, такого как poedit, или путем ручного редактирования файла .po. Вызов gettext в hellogt.cxx также заменяется вызовом макроса _ (), который его скрывает (и параметр --keyword = _ затем передается в xgettext для распознавания строк, отмеченных для перевода). _T () используется для строк, которые не следует переводить. - person liberforce; 24.11.2011