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 statusWas 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