I18n C ++ привет мир с множественным числом - PullRequest
2 голосов
/ 10 июля 2009

Полный пример C ++ i18n gettext () «hello world» имеет код C ++, который работает для простой фиксированной строки. Я сейчас ищу пример программы, которая работает с множественным числом. Этот пример кода отображает шесть строк. Только один правильный на английском. Не правильно обрабатывает множественное число.

cat >helloplurals.cxx <<EOF
// hellopurals.cxx
#include <libintl.h>
#include <locale.h>
#include <iostream>
#include <stdio.h>
int main (){
    setlocale(LC_ALL, "");
    bindtextdomain("helloplurals", ".");
    textdomain( "helloplurals");
    for (int ii=0; ii<5; ii++)
        printf (gettext("Hello world with %d moon.\n"), ii);
}
EOF
g++ -o helloplurals helloplurals.cxx
./helloplurals

GNU gettext () для форм множественного числа описывает различные способы, которыми языки обрабатывают множественное число, например:

  • корейский - без плюсов
  • Английский - две формы, единственное число используется только для одной
  • Французский - две формы, единственное число используется для нуля и один
  • Польский - три формы, особый случай для одного и нескольких чисел, оканчивающихся на 2, 3 или 4

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

Hello world with 0 moons.
Hello world with 1 moon.
Hello world with 2 moons.
Hello world with 3 moons.
Hello world with 4 moons.

Ответы [ 3 ]

3 голосов
/ 10 июля 2009

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

printf(ngettext("Hello world with %d moon\n", "Hello world with %d moons\n", ii), ii);

но поскольку это тривиальное изменение ответа unwind и документация gettext имеет очень похожий пример,

printf (ngettext ("%d file removed", "%d files removed", n), n);

Интересно, действительно ли это то, что вы хотели. Если вы хотите использовать gettext с большим синтаксисом C ++, вам придется искать такие библиотеки, как Boost :: Format.

2 голосов
/ 10 июля 2009

Во-первых, gettext() не волшебно. Он не содержит глобального словаря всех слов на всех языках.

Все, что он делает, это просматривает перевод сообщения в базе данных сообщений вашего приложения, поэтому в этом примере предполагается, что такой файл существует (где gettext() может его найти, это может быть несколько сложно).

Далее, вы используете это неправильно. Страница, на которую вы ссылаетесь, описывает функцию ngettext(), которую вы должны будете использовать для получения перевода, который зависит от количества.

Ваш звонок должен выглядеть примерно так:

printf("%s", ngettext("moon", "moons", ii));

Это позволяет gettext решить, какую форму использовать, основываясь на параметре count.

0 голосов
/ 10 июля 2009

Ну, вы на самом деле сделали .po файл для разных форм множественного числа? См. описание рабочего процесса gettext в Википедии . Также прочитайте all документации gettxt о формах множественного числа , в частности примеры файлов .po, содержащих формы множественного числа.

...