кодировка символов gettext - PullRequest
7 голосов
/ 31 мая 2011

У меня есть следующий gettext .po файл, который был переведен из файла .pot.Я работаю в системе Linux ( openSUSE , если это имеет значение), запускаю gettext 0.17.

# 
#   <translate@transme.de>, 2011
# transer <translate@transme.de>, 2011
msgid ""
msgstr ""
"Project-Id-Version: transtest\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-05-24 22:47+0100\n"
"PO-Revision-Date: 2011-05-30 23:03+0100\n"
"Last-Translator: \n"
"Language-Team: German (Germany)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: de_DE\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"

#: transtest.cpp:12
msgid "Min Size"
msgstr "Min Größe"

Теперь, когда я создаю .mo файл через

msgfmt -c transtest_de_DE.po -o transtest.mo

Затем я проверяю кодировку с помощью команды «file»,

file --mime transtest_de_DE.po
transtest_de_DE.po: text/x-po; charset=utf-8

, а затем устанавливаю ее в папку с локалью и запускаю программу после экспорта LANG и LC_CTYPE, в результате получается мусоргде два не-ASCII-символа.

Если я установлю кодирование своего терминала на ISO-8859-2 , а не UTF-8 , тогда я правильно вижу эти два символа.

Заглянув внутрь сгенерированного .mo-файла с помощью текстового редактора, файл, по-видимому, также находится в формате UTF-8 (я вижу символы, если установить кодировку редактора в UTF-8).

Программаочень просто, и это выглядит так:

#include <iostream>
#include <locale>
const char *PROGRAM_NAME="transtest";

using namespace std;

int main()
{
    setlocale (LC_ALL, "");
    bindtextdomain( PROGRAM_NAME, "/usr/share/locale" );
    textdomain( PROGRAM_NAME );
    cerr << gettext("Min Size") << endl;
}

Я устанавливаю файл .mo в /usr/share/locale/de_DE/LC_MESSAGES/transstest.mo, и я экспортировал LC_CTYPE и LANG как "de_DE".

$ echo $LC_CTYPE; echo $LANG
de_DE
de_DE

Куда я иду?Почему gettext дает мне неправильную кодировку (ISO-8859-2) для моих строк, а не запрашиваемую (в файле .po) UTF-8?

Редактировать:

Решениебыл в вопросе переполнения стека Невозможно заставить (UTF-8) традиционный китайский символ работать с расширением gettext в PHP (файлы .po и .mo, созданные в poEdit) , и кажется, чтоМне нужно было явно вызвать

bind_textdomain_codeset(PROGRAM_NAME, "utf-8");

Окончательная программа выглядит так:

#include <iostream>
#include <locale>
const char *PROGRAM_NAME="transtest";

using namespace std;

int main()
{
    setlocale (LC_ALL, "");
    bindtextdomain( PROGRAM_NAME, "/usr/share/locale" );
    bind_textdomain_codeset(PROGRAM_NAME, "utf-8");
    textdomain( PROGRAM_NAME );
    cerr << gettext("Min Size") << endl;
}

Никаких изменений ни в одном из моих файлов gettext не требовалось.

1 Ответ

4 голосов
/ 31 мая 2011

Если у вас есть LC_CTYPE=de_DE (или LANG), программы предполагают для вывода ISO-8859-1 (примечание 1, а не 2), поэтому, если у вас это есть, и ваш терминал установить в utf-8, это просто неправильно. Правильный языковой стандарт для utf-8: de_DE.utf-8.

Использование bind_textdomain_codeset неправильно в вашем случае. bind_textdomain_codeset используется, если вы хотите работать с фиксированной кодировкой внутри, например, например. GNOME делает, но вывод всегда должен быть в том, что указывает локаль (полученная путем вызова nl_langinfo(CODESET), что также делает gettext по умолчанию).

...