Esta seção descreve como implementar suporte a idioma nativo em um programa ou biblioteca que faça parte da distribuição do PostgreSQL. Atualmente somente se aplica a programas C.
Adicionar suporte a idioma nacional ao programa
#ifdef ENABLE_NLS #include <locale.h> #endif ... #ifdef ENABLE_NLS setlocale(LC_ALL, ""); bindtextdomain("nome_do_programa", LOCALEDIR); textdomain("nome_do_programa"); #endif(Na verdade o nome_do_programa pode ser escolhido livremente)
gettext()
. Por exemplo,
fprintf(stderr, "panic level %d\n", lvl);deve ser alterada para
fprintf(stderr, gettext("panic level %d\n"), lvl);(gettext é definida como nenhuma operação se não for configurado suporte a idioma nacional) Isto tende a tornar o código confuso. Uma forma abreviada comum é:
#define _(x) gettext(x)Quando o programa faz grande parte da sua comunicação através de uma ou de poucas funções, tal como
ereport()
no servidor, existe uma outra solução possível. Neste caso faz-se a função chamar gettext
internamente para todas as cadeias de caracteres.
textdomain()
.
gettext
ou por uma solução alternativa. No final esta lista acaba incluindo praticamente todos os arquivos fonte do programa. Se esta lista ficar muito longa, pode ser feito com que o primeiro "arquivo" seja um +, e a segunda palavra seja um arquivo que contém um nome de arquivo por linha.
gettext()
. Se for utilizado _
ou outros identificadores estes devem ser listados aqui. Se a cadeia de caracteres traduzível não for o primeiro argumento, o item deve estar na forma func:2 (para o segundo argumento).
O sistema de construção toma conta automaticamente da construção e da instalação dos catálogos de mensagem.
Abaixo estão algumas diretrizes para escrever mensagens facilmente traduzíveis.
printf("Files were %s.\n", flag ? "copied" : "removed");A ordem das palavras na frase pode ser diferente em outro idioma. Também, mesmo que seja chamado gettext() para cada fragmento, os fragmentos separados podem não ficar com uma tradução boa. É melhor duplicar um pequeno código para que cada mensagem traduzida se torne um todo coerente. Somente devem ser inseridos no texto da mensagem em tempo de execução números, nomes de arquivos, e variáveis em tempo de execução deste tipo.
printf("copied %d file%s", n, n!=1 ? "s" : "");porque assume uma regra de formação de plural. Se houver numeração pode ser resolvido desta maneira
if (n==1) printf("copied 1 file"); else printf("copied %d files", n);e depois ficar desapontado. Alguns idiomas possuem mais de duas formas, com algumas regras peculiares. Pode ser encontrada uma solução para este caso no futuro, mas no momento é melhor evitar este problema. Pode ser escrito:
printf("number of copied files: %d", n);
/* translator: This message is not what it seems to be. */Estes comentários são copiados para os arquivos de catálogo de mensagens para que os tradutores possam vê-los.