Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Advanced Developers Conference     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: Linux/Unix ::  Lokalisierung mit gettext     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
andy89
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.11.2008
Beiträge: 20
Beitrag andy89 Mitglied 17:19:56 04.10.2009   Titel:   Lokalisierung mit gettext            Zitieren

Hallo,

ich möchte meine (Konsolen-)Programme übersetzen und bin auf gettext gestoßen.

Zum Beispiel nehme ich jetzt mal dieses einfache Programm:

C/C++ Code:
#include <stdio.h>


void main()
{
    printf (_("Hello World\n"));
}
C/C++ Code:
#include <stdio.h>


void main()
{
printf (_("Hello World\n"));
}
C/C++ Code:
#include <stdio.h>


void main()
{
    printf (_("Hello World\n"));
}


Das (gekürzte) po-File sieht so aus:

Code:
#: /tmp/hello/hello.c:5
#, c-format
msgid "Hello World\n"
msgstr "Hallo, Welt\n"
Code:
#: /tmp/hello/hello.c:5
#, c-format
msgid "Hello World\n"
msgstr "Hallo, Welt\n"
Code:
#: /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 :confused:

Wenn ich die hello.c durch den gcc jage beschwert er sich
Code:
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
Code:
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
Code:
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
lagalopex
Mitglied

Benutzerprofil
Anmeldungsdatum: 21.01.2008
Beiträge: 299
Beitrag lagalopex Mitglied 17:34:24 04.10.2009   Titel:              Zitieren

C/C++ Code:
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include
<libintl.h>

#define
_(Text) gettext(Text)

int main()
{
    printf (_("Hello World\n"));
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include
<libintl.h>

#define
_(Text) gettext(Text)

int main()
{
printf (_("Hello World\n"));
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include
<libintl.h>

#define
_(Text) gettext(Text)

int main()
{
    printf (_("Hello World\n"));
}
andy89
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.11.2008
Beiträge: 20
Beitrag andy89 Mitglied 14:31:05 07.11.2009   Titel:              Zitieren

Sorry, das hilft mir immer noch nicht weiter, die Ausgabe des kompilierten Programmes ist immer auf Englisch.
dooooomi
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.01.2007
Beiträge: 268
Beitrag dooooomi Mitglied 18:53:22 07.11.2009   Titel:              Zitieren

Du muß gettext zu Beginn des Programms erst noch initialisieren. Ein Tutorial inkl. Beispielcode gibt's hier.

_________________
It's not a feature, it's a bug!
andy89
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.11.2008
Beiträge: 20
Beitrag andy89 Mitglied 18:33:55 25.11.2009   Titel:              Zitieren

Ah, danke. Genau so etwas habe ich gesucht. :)

Nur noch einmal eine frage zur hello.c:

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#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"));
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#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"));
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#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
C/C++ Code:
setlocale( LC_ALL, "C" );
C/C++ Code:
setlocale( LC_ALL, "C" );
C/C++ Code:
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
C/C++ Code:
bindtextdomain( "hello", "." );
C/C++ Code:
bindtextdomain( "hello", "." );
C/C++ Code:
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:

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#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;
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#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;
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#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?


Zuletzt bearbeitet von andy89 am 18:47:57 25.11.2009, insgesamt 3-mal bearbeitet
Gruuuu
Unregistrierter




Beitrag Gruuuu Unregistrierter 16:04:11 01.09.2010   Titel:   Linux/Unix :: Lokalisierung mit gettext            Zitieren

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
C/C++ Forum :: Linux/Unix ::  Lokalisierung mit gettext   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.