Pergunta

completa C ++ i18n gettext () “Olá mundo” exemplo tem o código C ++ que trabalha para uma simples corda fixa. Agora estou procurando um exemplo de programa que trabalha com plurais. Este código de exemplo exibe seis linhas. Apenas uma é correta em Inglês. Ele não lida com os plurais corretamente.

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 () para formas plurais descreve várias maneiras que as línguas lidar com plurais, por exemplo:

  • coreana - sem pluals
  • Inglês - duas formas, singular usado para uma única
  • francês - duas formas, singular usado para zero e um
  • Polish - três formas, caso especial para um e alguns números que terminam em 2, 3 ou 4

A minha expectativa é que o código será capaz de trabalho (dadas catálogos de mensagens) especificamente para todos os casos acima e vários mais variações não listadas aqui. A saída correta quando ele é executado com o Inglês seria:

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.
Foi útil?

Solução

Eu não tenho certeza do que você quer. Se for ligeira modificação do seu exemplo que dão a sua saída desejada, basta substituir a linha printf por

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

mas como é uma modificação trivial da resposta de descontrair e a documentação gettext tem o exemplo muito semelhantes,

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

Gostaria de saber se isso é realmente o que você queria. Se você quiser usar gettext com uma sintaxe mais C ++, você tem que olhar para bibliotecas como boost :: Format.

Outras dicas

Em primeiro lugar, gettext() não é mágico. Não alguma forma conter um dicionário mundial de todas as palavras em todos os idiomas.

Tudo que faz é olhar-se a tradução de uma mensagem no banco de dados de mensagem do aplicativo, de modo que este exemplo assume que há tal arquivo um (onde gettext() pode encontrá-lo, isso pode ser um pouco complicado).

Em seguida, você está usando-o errado. A página que você ligado à descreve a função ngettext(), que é o que você vai ter que usar a fim de obter uma tradução que varia de acordo com uma contagem.

A sua chamada deve ser algo como isto:

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

Isso permite que gettext decidir qual a forma de utilização, com base no parâmetro contagem.

Bem que você realmente fazer um arquivo .po para as diferentes formas plurais? Veja a do fluxo de trabalho gettext na Wikipedia . Leia também todas do gettxt documentação sobre formas plurais em particular os exemplos de .po arquivos contendo formas plurais.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top