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 Plan

    Danke



  • #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?
    Ein

    bindtextdomain( "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


Anmelden zum Antworten