2009-07-10 3 views
2

Complete C++ i18n gettext() “hello world” example имеет код C++, который работает для простой фиксированной строки. Теперь я ищу примерную программу, которая работает с множественными числами. Этот пример кода отображает шесть строк. На английском только один правильный. Он не обрабатывает множественные числа правильно.I18n C++ hello world with multipleals

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() for plural forms описывает различные способы, которыми языки обработка множественном, например:

  • корейских - нет pluals
  • английского - две формы, единственное число используемого для одного только
  • французских - две формы, особый используется для нулевого и одного
  • Polish - три формы, специальный чехол для одного и некоторых номеров, заканчивающийся на 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. 
+0

Цитата JS: «Downvoters: просьба предоставить комментарии. - Jon Skeet May 8 at 9:25» –

ответ

3

Я не уверен, что вы хотите. Если это небольшая модификация вашего примера, которые дают свой разыскиваемый выход, просто замените 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.

+0

Как это поддерживает языки, которые имеют три или более формы, например, польский? –

+0

В каталоге содержатся правила языка; правила по умолчанию, применяемые ngettext, если у вас нет каталога, являются английским (и поэтому вы пытаетесь использовать его с французским или польским текстом, у вас будет неправильный вывод). – AProgrammer

+0

Если вы используете только gettext(), для пропуска каталога не передается число. Если используется ngettext(), передается число, которое может использоваться с правилами и сообщениями каталога. Несколько английских сообщений передаются только для случая, когда каталог не используется, который отлично подходит для английского языка. Спасибо. Не могли бы вы расширить свой ответ, чтобы покрыть все это? –

0

Ну вы на самом деле сделать файл .po для различных форм множественного числа? См. description of the gettext workflow on Wikipedia. Также читайте все из gettxt documentation about plural forms, в частности примеры файлов .po, содержащие множественные формы.

+0

Первая ссылка в вопросе имеет последовательность для создания каталогов сообщений. Здесь я ищу пример кода на C++. –

2

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

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

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

Ваш вызов должен выглядеть следующим образом:

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

Это позволяет Gettext решить, какую форму использовать, на основе параметра подсчета.

+0

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

+1

Обратите внимание: это нехорошо взять слово из контекста и перевести его, особенно для множественных форм. Вы должны принять сообщение о дыре, потому что другие формы могут зависеть от «количества лун» – Artyom