Lokalisierung mit gettext
-
Hallo,
ich möchte meine (Konsolen-)Programme übersetzen und bin auf gettext gestoßen.
Zum Beispiel nehme ich jetzt mal dieses einfache Programm:
#include <stdio.h> void main() { printf (_("Hello World\n")); }
Das (gekürzte) po-File sieht so aus:
#: /tmp/hello/hello.c:5 #, c-format msgid "Hello World\n" msgstr "Hallo, Welt\n"
Nun, jetzt habe ich keine Ahnung wie ich das Programm kompilieren soll
Wenn ich die hello.c durch den gcc jage beschwert er sich
hello.c: In function 'main': hello.c:6: warning: passing argument 1 of 'printf' makes pointer from integer without a cast /usr/include/stdio.h:339: note: expected 'const char * __restrict__' but argument is of type 'int' /tmp/ccHcEGGd.o: In function `main': hello.c:(.text+0x11): undefined reference to `_' collect2: ld returned 1 exit status
Was natürlich an dem _() liegt.
Kann mir jemand sagen, was ich da noch machen muss?
(Mit dem Thema Lokalisierung hab ich mich noch nicht beschäftigt, davon hab ich überhaupt keinen PlanDanke
-
#include <stdio.h> #include <libintl.h> #define _(Text) gettext(Text) int main() { printf (_("Hello World\n")); }
-
Sorry, das hilft mir immer noch nicht weiter, die Ausgabe des kompilierten Programmes ist immer auf Englisch.
-
Du muß gettext zu Beginn des Programms erst noch initialisieren. Ein Tutorial inkl. Beispielcode gibt's hier.
-
Ah, danke. Genau so etwas habe ich gesucht.
Nur noch einmal eine frage zur hello.c:
#include <stdio.h> #include <libintl.h> #include <locale.h> #include <stdlib.h> #define _(Text) gettext(Text) // Makro um Tipparbeit zu ersparen void main() { setlocale( LC_ALL, "" ); bindtextdomain( "hello", "/usr/share/locale" ); textdomain( "hello" ); printf (_("Hello World\n")); }
Zu was muss ich setlocale setzen.
Soweit ich gelesen habe, setzt der Compiler (?) beim leerem String ja die aktuelle Locale ein, was eigentlich hieße, dass die locale auf de_DE gesetzt wird.
Der String den ich mit printf ausgebe, ist aber englisch...
Das scheint mir ein Widerspruch zu sein... Oder kann mir das jemand erklären.Wenn ich
setlocale( LC_ALL, "C" );
schreibe, wird der Text immer auf Englisch angegeben...
Und kann ich das Verzeichnis in dem die Locales sind eigentlich auch auf das Arbeitsverzeichnis setzen?
Einbindtextdomain( "hello", "." );
funltioniert nämlich nicht (Ausgabe immer Englisch)
Noch eine Frage:
Kann ich auch C++-Programme lokalisieren?
Nehme ich dazu die gleichen Headerdateien?Ich nehme an, dass eine Lokalisierung eines C++-Programmes prinzipiell so aussehen würde:
#include <iostream> #include <libintl.h> #include <locale.h> #include <stdlib.h> #define _(Text) gettext(Text) // Makro um Tipparbeit zu ersparen int main() { setlocale( LC_ALL, "" ); bindtextdomain( "hello", "/usr/share/locale" ); textdomain( "hello" ); cout << _("Hello World\n") << endl; return 0; }
Liege ich da richtig?
edit:
Noch was:Wie (falls überhaupt) funktioniert gettext unter Windows.
Ich kann zwar das Programm mit dem mingw Compiler kompilieren, aber wo kommen dann die Sprachdateien hin?
-
Hi,
leder reicht es einfach nicht aus, mit setlocale zu arbeiten!
Dabei musst du drauf achten, dass die Sprache (Umgebungsvariable) richtig gesetzt ist.setenv("LANG","de_DE",1); //lang is now de_DE
setlocale(LC_MESSAGES,"");
//text domain = /dein/ordner/sprachen/
bindtextdomain( "messages", BIND_TEXT_DOMAIN );
// das *.mo-File nach /dein/ordner/sprachen/de_DE/LC_MESSAGES/ kopieren.
//use the for the translation-MO's
textdomain( "messages" );Schöne Grüße