2016-05-16 7 views
2

I following an official i8n example für lokalen Katalog Repositorys mit gettext am:Mit gettext mit lokalem Katalog hat keine Auswirkung

#include <libintl.h> 
#include <iostream> 
#define _(str) gettext(str) 

int 
main() 
{ 
    setlocale (LC_ALL, "pt_PT"); 
    bindtextdomain ("messages", "/home/pasousa/temp/i18n_test/lang/"); 
    textdomain ("messages"); 

    std::cout << _("Hello world!") << std::endl; 
    return 0; 
} 

Die portugiesischen Übersetzungs-Strings in ./lang/pt_PT/LC_MESSAGES/messages.mo enthalten sind. Aber wenn ich diesen ganzen Code benutze, bekomme ich die Hello World Nachricht nicht übersetzt.

+0

Willkommen bei StackOverflow! Stellen Sie sicher, dass alle Informationen enthalten sind, so dass der Inhalt Ihrer 'messages.mo' Datei * gemeint ist (die wegen des Beispiels auf" Hello World! "Reduziert werden sollte) *. Es könnte auch hilfreich sein, wenn Sie nachsehen, wie die Ergebnisse der Aufrufe aussehen ... Ich stelle fest, dass 'bindtextdomain' einen Zeiger auf ein' char * 'für ein Verzeichnis oder NULL - zum Beispiel - zurückgeben kann 'errno' wenn es ein Problem gibt. – HostileFork

Antwort

0

Sie müssen sicherstellen, dass das Gebietsschema Sie setzen gültig ist - Wenn Sie keine gültige Locale in setlocale gesetzt haben, dann wird glibc nehme an, Sie in der C oder POSIX locale ausgeführt und die Werte ignorieren, die angegeben wurden in der bindtextdomain und einfach die nicht lokalisierten Werte zurückgeben. Dies scheint ein etwas undokumentiertes Verhalten von gettext zu sein.

Sie möchten wahrscheinlich das Gebietsschema auf pt_PT.UTF-8 anstelle von einfach pt_PT setzen.

in meinem Fall, als ich versuchte, bekam ich:

char *from_setlocale = setlocale(LC_ALL, "pt_PT"); 
char *checked_setlocale = setlocale(LC_ALL, NULL); 
std::cout << (from_setlocale ? from_setlocale : "NULL") << std::endl << (checked_setlocale ? checked_setlocale : "NULL") << std::endl; 

aber das ist, weil ich nicht installiert ist die portugiesischen locale hat. Wenn ich ein Gebietsschema festgelegt, die ich installiert haben (en_IE.UTF-8) dann bekomme ich einige nützliche Ausgabe:

char *from_setlocale = setlocale(LC_ALL, "en_IE.UTF-8"); 
char *checked_setlocale = setlocale(LC_ALL, NULL); 
std::cout << (from_setlocale ? from_setlocale : "NULL") << std::endl << (checked_setlocale ? checked_setlocale : "NULL") << std::endl; 

Und außerdem habe ich einen lokalisierten Wert aus der Nachrichtendatei erhalten, die ich erzeugt hatte.

Verwandte Themen