Olá mundo I18n C ++ com plurais
-
12-09-2019 - |
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.
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.