Hallo an alle!
Ich hab´ mal wieder ein Problem mit C...
Und zwar möchte ich gerne mein Proggie mit 2 Sprachen ausstatten. Das soll dann so ähnlich wie mit den po-Dateien funktionieren, leider weiss ich nicht wie und ob überhaupt sowas mit C funktioniert, ware ja toll.
Ich bin jedenfalls erstmal davon ausgegangen, das es nicht geht :-( und hab selber versucht, sowas in der Art zu realisieren. Bis jetzt bin ich soweit, das das Prog erstmal fragt, welche Sprache denn gewünscht ist. Ist das erledigt, wird´s in eine Datei geschrieben (options.txt). So, jetzt kommt das eigentliche Problem: In zwei Dateien (de.h(de.c), en.h(en.c)) stehen die Strings mit der Bezeichnung test_s. Nun beschwert der Compiler sich allerdingens das test_s zweimal definiert ist. Für mich eher unverständlich, denn immerhin soll ja, je nach Fall, nur eine Datei included werden.
Ich schreibe mal die main.c mit hier rein(... und hoffe nebenbei das das nicht nervt).
main.c:
#include <stdio.h> #include <stdlib.h> #include <string.h> #ifndef DATNAME #define DATNAME "options.txt" #endif
extern const char test_s[30]; /* Das ist der String */
void de(); void en(); void lesen();
void de(void) { printf("%s\n",test_s); }
void en(void) { printf("%s\n",test_s); }
void lesen(void) { char s[16]; FILE *fhd;
char s3[8]="lang=en"; char s4[8]="lang=de"; int a=0; fhd=fopen(DATNAME,"r"); fgets(s,8,fhd); do{ if(strstr(s,s3)){ printf("%s\n",s); a=1; break; } if(strstr(s,s4)){ printf("%s\n",s); a=2; break; } fgets(s,8,fhd); }while(!feof(fhd)); fclose(fhd); #if a==1 /* kann ich mit Hilfe des PP Variablen ordentlich auslesen? */ #include "en.h" en(); #endif
#if a==2 #include "de.h" de(); #endif
#if a==0 printf("Haha! Nix eingegeben...\n"); #endif }
void main(void) { FILE *fhd; char s[3]; char s2[6]="lang="; fhd=fopen(DATNAME,"w"); if(!fhd){ printf("Nix mit Datei!!\n"); }else{ printf("Deutsch (de)\nEnglish (en)\n"); printf("> "); scanf("%s",s); /* Für Ulf: %c funzt nicht. Ich kann nix eingeben, der macht einfach weiter */ } if(strcmp(s,"de")){ fputs(s2,fhd); fputs(s,fhd); fputs("\n",fhd); } if(strcmp(s,"en")){ fputs(s2,fhd); fputs(s,fhd); fputs("\n",fhd); }else{ printf("Please enter en or de!\n"); } fclose(fhd); lesen(); }
Meine Theorie: Den Präprozessor interessiert das garnicht, was im Programm abgeht. Der will einfach nur einbinden. Hmm, hab mal was ausprobiert.
main2.c
#include <stdio.h> #include <stdlib.h> void main (void) { int a=0; printf("Eingabe > "); #if a==1 printf(" Eingabe: 1\n"); #define _T 1 #endif #if a==2 printf(" Eingabe: 2\n"); #define _T 2 #endif printf("%i\n",_T); }
Genau! Es geht nicht richtig! Gebe ich 1 ein: kommt auch 1 wieder raus! Gebe ich aber nun 2 ein, was kommt dann unlogischerweise raus??? 1!
Was nun? Bin ich zu doof dafür? Ok das wars, könnt ihr mir bitte einen Tipp geben was ich da wieder falsch mache?
Bye und danke, Sebastian, der nun vor Frust Gothic angemacht hat...
On Mon, Aug 13, 2001 at 08:15:51PM +0200, Sebastian Roth wrote:
Hallo an alle!
Ich hab´ mal wieder ein Problem mit C...
Und zwar möchte ich gerne mein Proggie mit 2 Sprachen ausstatten. Das soll dann so ähnlich wie mit den po-Dateien funktionieren, leider weiss ich nicht wie und ob überhaupt sowas mit C funktioniert, ware ja toll.
Spontan fällt mir folgende Lösung ein, das heißt aber, dass du zur Compile-Zeit angibst welche Sprache verwendet werden soll:
deutsch.h: #define GREETING "Guten Tag!"
bayern.h: #define GREETING "Gruess Gott!"
im Quelltext bindest du dann die entsprechende Sprache ein und verwendest das Makro:
printf(GREETING);
Und zwar möchte ich gerne mein Proggie mit 2 Sprachen ausstatten. Das soll dann so ähnlich wie mit den po-Dateien funktionieren, leider weiss ich nicht wie und ob überhaupt sowas mit C funktioniert, ware ja toll.
Spontan fällt mir folgende Lösung ein, das heißt aber, dass du zur Compile-Zeit angibst welche Sprache verwendet werden soll:
deutsch.h: #define GREETING "Guten Tag!"
bayern.h: #define GREETING "Gruess Gott!"
im Quelltext bindest du dann die entsprechende Sprache ein und verwendest das Makro:
printf(GREETING);
Wäre eine Lösung, jedoch nicht mein Ziel. Hmm, vielleicht müsste man zwei Programme schreiben. Naja, ich les mir die anderen Mails erst noch mal durch.
Trotzdem danke für den Tipp, Bye, Sebastian
Sebastian Roth schrieb:
Hallo an alle!
Ich hab´ mal wieder ein Problem mit C...
Und zwar möchte ich gerne mein Proggie mit 2 Sprachen ausstatten. Das soll dann so ähnlich wie mit den po-Dateien funktionieren, leider weiss ich nicht wie und ob überhaupt sowas mit C funktioniert, ware ja toll.
info gettext man xgettext man msgmerge man msgfmt
:-)
also
8<------ #include <libintl.h>
bindtextdomain("meinproggi", "pfad_zu_den_translations"); settextdomain("meinproggi");
printf(_("%s and more"), blafasel); ------>8
dann mit xgettext --keyword=_ das po file erzeugen mit msgmerge alte Übersetzungen übernehmen dann mit Editor deiner Wahl übersetzen und mit msgfmt ein .mo file erzeugen, wie man das alles richtig kombiniert steht in den info pages zu gettext.
Alles nur erinnert, also erstmal nachlesen bevor du's probierst.
Jan
Hallo Jan,
[Problem]
info gettext man xgettext man msgmerge man msgfmt
:-)
*zum lesen+drucken vormerk* Huuui, ist ja doch schon einiges.. auch sehr vieles interessantes, was in der Info-Seite steht. Werde ich mir anschauen. oh oh oh oh, 88 [44Blätter] Seiten! Das wird ´ne Weile dauern.
also
8<------ #include <libintl.h>
bindtextdomain("meinproggi", "pfad_zu_den_translations"); settextdomain("meinproggi");
printf(_("%s and more"), blafasel); ------>8
hmm, was du da geschrieben hast, verstehe ich sicher erst, wenn ich das Material gelesen habe... denn was diese Funktionen im einzelnen genau machen, weiss ich nicht.
dann mit xgettext --keyword=_ das po file erzeugen mit msgmerge alte Übersetzungen übernehmen dann mit Editor deiner Wahl übersetzen und mit msgfmt ein .mo file erzeugen, wie man das alles richtig kombiniert steht in den info pages zu gettext.
Es wird Zeut, das ich die Seiten lese... :-)
Alles nur erinnert, also erstmal nachlesen bevor du's probierst.
Natürlich, das mache ich.
Jan
Danke erstmal für die Hilfe! Bye, Sebastian
On Monday 13 August 2001 20:15, Sebastian Roth wrote:
Und zwar möchte ich gerne mein Proggie mit 2 Sprachen ausstatten. Das soll dann so ähnlich wie mit den po-Dateien funktionieren, leider weiss ich nicht wie und ob überhaupt sowas mit C funktioniert, ware ja toll.
Unser Chatbot ist multinational, der hat das auch drin, allerdings erst experimentell: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/ggz/utils/guru/src/i18n.c?rev... Der läßt sich dann direkt ferngesteuert einstellen - z.B. "grubby i am from germany" setzt die Sprache auf de_DE. Dort ist auch gleich ein Beispiel und zwei po-Dateien mit dabei.
Josef Spillner
Hi Josef,
Unser Chatbot ist multinational, der hat das auch drin, allerdings erst experimentell: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/ggz/utils/guru/src/i18n.c?re v=1.1&content-type=text/vnd.viewcvs-markup Der läßt sich dann direkt ferngesteuert einstellen - z.B. "grubby i am from germany" setzt die Sprache auf de_DE. Dort ist auch gleich ein Beispiel und zwei po-Dateien mit dabei.
Könntest du mir diese Dateien bitte mal schicken? Ich find jene irgendwie nicht finden...
Josef Spillner
Danke und Bye, Sebastian
Sebastian Roth wrote:
Hallo an alle!
Ich hab´ mal wieder ein Problem mit C...
Und zwar möchte ich gerne mein Proggie mit 2 Sprachen ausstatten. Das soll dann so ähnlich wie mit den po-Dateien funktionieren, leider weiss ich nicht wie und ob überhaupt sowas mit C funktioniert, ware ja toll.
Ich bin jedenfalls erstmal davon ausgegangen, das es nicht geht :-( und hab selber versucht, sowas in der Art zu realisieren. Bis jetzt bin ich soweit, das das Prog erstmal fragt, welche Sprache denn gewünscht ist. Ist das erledigt, wird´s in eine Datei geschrieben (options.txt). So, jetzt kommt das eigentliche Problem: In zwei Dateien (de.h(de.c), en.h(en.c)) stehen die Strings mit der Bezeichnung test_s. Nun beschwert der Compiler sich allerdingens das test_s zweimal definiert ist. Für mich eher unverständlich, denn immerhin soll ja, je nach Fall, nur eine Datei included werden.
Ich schreibe mal die main.c mit hier rein(... und hoffe nebenbei das das nicht nervt).
Hy, könnte dieses Problem nicht daran liegen das der Präprozessor einfach nur seine Funktion erfült? Seine Aufgabe ist es schließlich vorbereitende Aufgaben am Quelltext durchzuführen und erst dann den verarbeiteten Quelltext an den Compiler weiterzureichen. Diese Arbeiten sind das entfernen von Kommentaren, die Quelltextersetzung, kopieren von Header- und Quelldatein, symbolische Konstanten einführen u.s.w.!
Das Problem bei dieser Aufgabe ist das der Präprozessor zur LAUFZEIT des Programms (also wenn das Ding schon fertig compiliert und in Maschinencode übersetzt ist) erst entscheiden soll was gelinkt werden soll!
I hope I helped you!
Wenn das jetzt alles Mist war was ich erzählt hab und nen Präprozessor ist doch zu so was fähig, dann schreibt es mir bitte!
Robi
Lug-dd maillist - Lug-dd@schlittermann.de http://mailman.schlittermann.de/mailman/listinfo/lug-dd
Wenn das jetzt alles Mist war was ich erzählt hab und nen Präprozessor ist doch zu so was fähig, dann schreibt es mir bitte!
Nein, du hast recht. Ein Präprozessor kann nichts zur Laufzeit ausführen. Der cpp erstezt die Zeilen die mit "#..." anfangen, dann wird das Ergebnis kompiliert. Man kann sich auch davon überzeugen indem man den cpp mal von der Kommandozeile aufruft.
Am Dienstag, 14. August 2001 13:17 schrieb Thomas Guettler:
Wenn das jetzt alles Mist war was ich erzählt hab und nen Präprozessor ist doch zu so was fähig, dann schreibt es mir bitte!
Nein, du hast recht. Ein Präprozessor kann nichts zur Laufzeit ausführen. Der cpp erstezt die Zeilen die mit "#..." anfangen, dann wird das Ergebnis kompiliert. Man kann sich auch davon überzeugen indem man den cpp mal von der Kommandozeile aufruft.
Tja, da bleibt also alles in allem nur die Arbeit mit den po-Dateien übrig. Der Präprozessor ist für diesen einen Zweck also nicht verwendbar, schade, aber egal, Doku hab´ ich ja nun genug. :-)
Trotzdem danke an euch beide für die Tipps.
Bye, Sebastian
lug-dd@mailman.schlittermann.de