2009-07-03 7 views
2

Wikipedia entry for GNU gettext montre un exemple où la locale est juste la langue, "fr". Alors que le i18n gettext() “hello world” example a la valeur locale avec la langue et le pays, "es_MX". J'ai modifié l'exemple "es_MX" pour utiliser seulement la langue, "es", mais il produit le texte anglais plutôt que l'espagnol attendu.Pourquoi la locale es_MX fonctionne-t-elle mais pas es?

cat >hellogt.cxx <<EOF 
// hellogt.cxx 
#include <libintl.h> 
#include <locale.h> 
#include <iostream> 
int main(){ 
    setlocale(LC_ALL, ""); 
    bindtextdomain("hellogt", "."); 
    textdomain("hellogt"); 
    std::cout << gettext("hello, world!") << std::endl; 
} 
EOF 
g++ -o hellogt hellogt.cxx 
xgettext --package-name hellogt --package-version 1.2 --default-domain hellogt --output hellogt.pot hellogt.cxx 
msginit --no-translator --locale es --output-file hellogt_spanish.po --input hellogt.pot 
sed --in-place hellogt_spanish.po --expression='/"hello, world!"/,/#:/s/""/"hola mundo"/' 
mkdir --parents ./es.utf8/LC_MESSAGES 
msgfmt --check --verbose --output-file ./es.utf8/LC_MESSAGES/hellogt.mo hellogt_spanish.po 
LANG=es.utf8 ./hellogt 

Selon Controlling your locale with environment variables:

variable d'environnement, la langue, qui est utilisé que par GNU gettext ... Si définie, la langue a priorité sur LC_ALL, LC_MESSAGES et LANG.

LANGUAGE=es.utf8 ./hellogt 

produit le texte espagnol devrait plutôt que l'anglais.

Mais cela n'explique pas pourquoi "LANG = es" ne fonctionne pas.

Répondre

3

Hmmm ... cela ressemble à un problème de plate-forme. J'ai fait exactement la même chose sous Mac OSX et obtenu les résultats attendus. Je soupçonne que votre version de Linux n'aime pas LANG=es.utf8. Vérifiez votre documentation système locale entourant des choses comme setlocale(3) ou xlocale(3) si ce dernier est même pris en charge. Les identificateurs de paramètres régionaux IIRC, contenant uniquement un identificateur principal qui était un code de langue ISO-639, avaient le code de pays ISO-3166 du pays de langue principale qui leur était ajouté. Ensuite, la recherche des paramètres régionaux résultants a été effectuée en regardant /usr/share/locale. J'ai regardé dans le répertoire de locale sur mon MacBook et il y a un répertoire nommé es aussi bien que es_ES. Ce peut être un simple problème de configuration du système.

Je recommande fortement d'utiliser ICU au lieu de gettext et les trucs régionaux offerts par la bibliothèque standard si vous développez une application commerciale. Gettext fonctionnera pour la recherche simple de message mais il n'offre pas presque ce dont vous avez besoin pour vraiment faire une application complètement internationalisée.

Questions connexes