Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Programm multilangual auwahl

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
07.08.2005, 19:48 Uhr
Skippy



ich möchte gern ein programm mit mehreren sprachen ausstatten hab aber leider bis jetzt nichts dazu gefunden bis auf ein klasse für ne dll wofür aber leider die mfc benötigt wird .

wobei mir lieber wäre dies auf basis von textdateien zu machen anstatt ne lanuage dll

daher ne frage hat da jemand ideen oder beispielcode dazu
die zu ersetzenden texte sind leider chars für consolennachrichten und strings für die weboberfläche



hätte aber auch ne generelle frage:
es gibt ja drei hauptmethoden

reine textdatei,
textdatei mit xml format und
ne dll

haben die methoden jeweils vor und nachteile .
gibt es einen großen geschwindigkeitsunterschied zwischen text und dll?

danke schonmal im vorraus
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.08.2005, 14:26 Uhr
~rene1
Gast


ich denke auch eine einfache textdatei zu verwenden wäre sinnvoll
am besten speicherst du deine messages in einem const char * messages[] ab,
definierst dir eine enum mit englischen kurzbezeichnungen
z.b enum {BAD_FILE_REQUEST,...} und greifst auf das array über diese
bezeichungen zu: fprintf(stdout, "%s", messages[BAD_FILE_REQUEST]) usw.
;-)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.08.2005, 09:52 Uhr
RHBaum



Kommt drauf an, was genau du haben willst ....

Bei mehrspachigkeit gibts eigentlich 2 Mainstreams:

1. statische Variante. Deine Texte sind in dem binary fest einkompiliert, beim Compielieren wird entschieden, welche Version erstellt wird. Also gibt es dann nen binary fuer deutsch, englisch ... etc

2. dynamische variante. Das binary iss immer gleich, der user entscheidet durch einstellungen, welche sprache er sieht. Also wird dynamisch entweder eine dll / so geladen, wo das Programm die Texte abrufen kann, oder es gibt ne schnittstelle zu nem textfile, was dynamisch zugeladen wird und sich das programm da die texte rausholt.

Zur variante 1.
kann man mit constanten machen (aehlich wie windows ressourcen). in ner h deklarierst deine textkonstanten, in mehreren cpp dateien definierst die Texte zu. Je nach Sprache linkst dann die entsprechende cpp zum binary.
unter unix systemen gibts ne menge tools die Dir da helfen wollen. Kannst alle const zeichenketten rausparsen lassen , in ne datei spulen, die datei uebersetzen lassen , und die uebersetzten texte zurueckspulen ....
QT/KDE bietet da extra makros an, wo man das auch sehr gut automatisieren kann ...

Variante 2 iss etwas , aber nur etwas aufwendiger ....
unter windows benutzt man nen oft nen "Trick" ... Man legt alle ressourcen in ne Dll, die dll beinhaltet meist nur diese ressourcen. Das hauptprogramm kann die texte direkt aus dem von der dll ueberblendeten speicher laden .... das geht mit den standard API befehlen fuer die Ressourcen (LoadString )
so muss man nur die dll aussuchen die man bei programmstart dynamisch laed, und das eigentliche programm holt sich da die ressourcen draus.
Sowas kenn ich unter Linux / Unix nich. Weiss nich ob es da tools fuer gibt ...
Dort wurd ichs haendisch machen ... also ne so schreiben die mir nur txte nach nem schluessel leifert, und am anfang der so nen parameter welche sprache ... dann die so sich nach nem namensschema ne Sprachdatei laden lassen ....

Wobei unter Linux / KDE es ne gut ausgebaute i18n schnittstelle gibt, da muesst man auch drauf kommen, und die sollt texte auch automatisch laden koennen ....

Ciao ...

P.S. so = shared object - die dll unter unix sozusagen ...

Dieser Post wurde am 09.08.2005 um 09:54 Uhr von RHBaum editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.08.2005, 14:07 Uhr
Skippy



so hier ein paar infos

-programm ist ein webserver und ich möchte dort soviel wie möglich anpassbar machen
daher auch fehlermeldungen und vorallem die internen seiten z.b. die vom Gästebuch was ich reinprogrammiere

-dadurch eine hohe anzahl an textstellen komme auf min 200-300 stück

mein problem ist wenn ich das jetzt über die mir bekannte art mache muss ich jedes einzelne deklarieren und dann und dann so wie ich es im netz überhaupt gesehen habe immer einzeln zuordnen

problem dabei selbst mit der mir besten bekannten methode brauche ich für jede zuordnung 3 zeilen code das macht dann 900zeilen nur für die strings

mir wäre ja lieb etwas in der art zu haben

(PSEUDOCODE)

lege 300 strings(oder änliches) an


initialisiere i=0
dann eine schleife mit getline

dann überprüfen ob es sich um gültigen zeichenfoleg handelt (z.b. 001= fehler beim seden)
packe den text in string nummer i
erhöhe i um eins


jedenfalls so etwas in der art schwebt mir vor aber ich stehe selbst dort auf den schlauch und hab leider keine ahnung onach ich googlen könnte
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.08.2005, 23:12 Uhr
Hans
Library Walker
(Operator)


Hi,

es gibt (zumindest bei Borland) eine internationale API, die dafür da ist, Software so zu entwickeln, das sie an verschiedene Sprachen angepasst werden kann. Diese Funktionen arbeiten mit Unicode, weil man dort die Zeichensätze zur Verfügung hat, die sprachspezifische Sonderzeichen enthalten. In wie weit das dem ANSI-Standard entspricht, weis ich nicht, vermute aber, das es ANSI-konform ist.

Ansonsten denke ich auch, das es am sinnvollsten ist, die einzelnen Sprachenversionen in jeweils einzelnen Textdateien zu halten. Also für jede Sprache eine separate Datei. XML-Dateien wären auch noch eine gute Möglichkeit, aber wahrscheinlich erstmal aufwändiger zu realisieren. Wenn das Programm startet, wertet es erstmal eine ini-Datei aus, in der unter anderem die Information steht, in welcher Sprache die Dialoge und Texte des Programms angezeigt werden sollen. Anhand dieser Information wird anschliessend die Datei mit den entsprechenden Texten nachgeladen.
Im Programm selbst greifst Du über ein Array darauf zu. Dazu musst Du "nur" jeden Text, den das Programm jemals ausgeben soll, in diesem Array speichern. Das ist die Variante 2 von dem, was RHBaum oben beschrieben hat.
Entsprechender Programmcode könnte so aussehen, wie in Deinem Pseudocode oben, nur das die Textstrings, die Du den Variablen zuweist, eben aus der Datei kommen, die Du eingelesen hast.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 09.08.2005 um 23:17 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
10.08.2005, 14:32 Uhr
Skippy



ja nur wie gesagt komme ich da nicht weiter ertsens dll fällt flach weil ich mich erstens noch nicht damit beschäftigt habe dlls in dev c++ zu programmieren und ich möchte eigentlich auch das jeder die texte ändern kann öhne etwas zu kompilieren

mit der textvariante komme ich auch nicht weiter

da mein code bisher in der art aussieht:


C++:
char WARNING_MESSAGE[255] = "Fehler im server";
char WELCOME[255];
int NO_DESPASS = 0;
char SERVERNAME[255] = "SKIPPSerV";
char SERVERDESKRIPTION[255] = "SKIPPSerV alpha webserver ";
char ADMIN[255] = "Administrator";
.
.
.



.
.
.
    while(!feof(in))
    {
        getfileline(tempstring, in);

        if(feof(in)) break;
        ptr1 = strtok(tempstring, "\"\t ");
        ptr2 = strtok(NULL, "\"\t ");
        
        if(!ptr1) continue;
        if(ptr1[0]!='<' && !ptr2) continue;
        if(ptr1[0] == '#') continue;
    
        if(!gstricmp(ptr1, "WarningMessage"))
            strcpy(WARNING_MESSAGE, ptr2);
        else if(!gstricmp(ptr1, "Welcome"))
            strcpy(WELCOME, ptr2);
        else if(!gstricmp(ptr1, "No_Despass"))
            NO_DESPASS = atoi(ptr2);
        else if(!gstricmp(ptr1, "ServerName"))
            strcpy(SERVERNAME, ptr2);
        else if(!gstricmp(ptr1, "ServerDeskription"))
            strcpy(SERVERDESKRIPTION, ptr2);
        else if(!gstricmp(ptr1, "Admin"))
            strcpy(ADMIN, ptr2);



.
.
.



hoffe mir kann da jemand weiterhelfen da dies bei 300 texten ziehmlich viel code ist

mir geht es in die richtung

-in der textdatei muss nicht unbedingt admin= Administrator stehen
kann auch 104=Administrator sein
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
11.08.2005, 13:27 Uhr
RHBaum



Wo holst du deine daten fuer die webseite her ?
Wenn aus ner DB, dann kannst deine Texte/Fehlermeldungen da auch einpflegen ...


Zitat:

und ich möchte eigentlich auch das jeder die texte ändern kann öhne etwas zu kompilieren


entweder du trennst statische (von dir vorgegeb, Titel, Fehlermeldungen, GUI Beschriftungen) Texte von den dynamischen(Das was der Gast in dein Gaestebuch tippert) ... weil den text von Gast willst ja nich unbedingt uebersetzen oder ?

Oder soll der user wirklich in der Lage sein, von generierten Seiten die Textelemente , welche mehrsprachig vorliegen, aendern zu koennen ?


Zitat:

mir wäre ja lieb etwas in der art zu haben

(PSEUDOCODE)

lege 300 strings(oder änliches) an


initialisiere i=0
dann eine schleife mit getline

dann überprüfen ob es sich um gültigen zeichenfoleg handelt (z.b. 001= fehler beim seden)
packe den text in string nummer i
erhöhe i um eins



Sowas in der Art muesste man sich unter windows erst mal selber bauen (oder googeln, ob da wer ne lib / klassen schon hat)

Waer auch kein thema, ich wuerd es so schreiben, das ich ne TextTranslator klasse habe, die nur 2 Funktionen nach aussen geben braucht ...
1. man setzt eine Laender/Sprache ID (nimmt man meist die Vorwahl fuer, oder ne internationale kennung , sowas wie "de")
2. man holt sich den text mit ner ID. Existiert die ID nich, gibts ne STandard Fehlermeldung (in Englisch, in der Art "String for ID 0815 not faund!" )
gibt es den string fuer ne spezielle ID nicht, dann schaltet der auf die mainsprache (englisch) zurueck ....

Implementieren koennt man das, in dem man die ganzen strings in files (streams) haelt ... und gepuffert einliesst (Cache map) ...
man sollt immer das main-Sprachfile haben ... (englisch) und ueber das Setzen der ALender/Sprach ID ein Sprachversion-spezifisches File estzen koennen ("translation_de.txt" z.B.)
dort sucht er nach der ID, wenn er die nicht findet, sucht er im main-Sprachfile, findet er es da, macht er nen eintrag in ner Missing (MissingTranslation_de.txt z.B.) bzw schreibt nur die ID da rein, und gibt den englischen text zrueck ...
findet er es auch da nich, macht er nen eintrag in nem generellen Missing file (MissingIDs.txt) ...

So hasst immer den ueberblick, was mit deinen uebersetzungen los ist, in dem nur die textfiles auswerten brauchst ...

Sowas in der Art gibt es fuer windows glaub ich noch nicht (Such ma bei google) .
Windows / MS finden ihre ressourcen toll ... das funktioniert statisch und auch dynamisch (dll) wie oben beschrieben.
Das wer dlls, Microsofts innovatives Zugpferd fuer windows (16 und 32 bit), nicht kann / mag, da ham die glaub ich wenig verstaendniss fuer :-)
Wenn du weitergehend programmieren willst, kommst frueher oder spaeter am konzept der Dll's (so's unter Linux) und deren vorteile nicht vorbei (plugin konzept, z.b. auch fuer sprachen, binaerunabhaengige module fuern besseren verteilungs / updateprozess )
bovor da eigenes zeug baust, solltest dich vielleicht mal damit beschaeftigen, irgendwann brauchst es soweiso .... nich das jetzt was schreibst, und spaeter wuerdest sowieso wieder alles anders machen.

Andere Biblotheken unterstuetzen mehrsprachigkeit auf anderer Ebene ....
QT macht es zum beispiel statisch und dynamsich.
Man baut ne Exe und schreibt alle Texte in nen Makro ....
QString test = tr("Mytext");
nun laesst man nen prozessor drueber laufen, der erzeugt nen translation file ....
das translation file laesst man uebersetzen ... und erzeugt daraus auch spezielle files.
Diese kann man dann statisch zum programm linken lassen, sogar mehrsprachig durch mehrere Versionen, wird das binary dann allerdings recht gross.
oder dynamisch uber ne funktion (LoadTranslation oder so) laden, die die Texte dann aus dem spezifizieren file anzieht .... das tr makro wird je nach (compiler einstellung fuer dynamsche oder statische aufloesung) anders umgesetzt ....
du brauchst fuer deine texte dann eigene files.

KDE bietet zum beispiel programmuebergreifende uebersetzungstabellen an ... (i18n schnittstelle) , gaengige begriffe wie Datei, laden speichern ... etc sind alle schon uebersetzt. brauchst nur noch drauf zuzugreifen ... und deine Spracheinstellung kannst global fuern ganzen desktop (KDE) festlegen ...

Gibt also verschiedene moeglichkeiten ...

Ciao ...

Dieser Post wurde am 11.08.2005 um 13:31 Uhr von RHBaum editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
11.08.2005, 14:16 Uhr
Skippy



1 es geht nur um texte wie fehlermeldungen oder die webooberflächen die der server anbieten soll texte wie der user sie im gästebuch eingibt sollen nicht übersetzt werden

2 so kompliziert das er suchen muss ob es in der eingestellten oder main sprache ist brauche ich auch nicht
es soll nur eine die man vorher eingestellt hat geladen werden

3 gegen dlls habe ich ja im prinzip nichts, für viele sachen sollen die ja auch verwendung finden z.b. das eingebaute forum soll ne eigenständige dll werden, weil ich so unterschiedliche version davon bauen kann bzw ein update dadurch leichter fällt und wenn der user das nicht braucht wird die funktion einfach nicht geladen(performancegründen).
muss nur rausbekommen wie man das bei dev c++ macht und vorallem wie das ohne MFC klasse geht

aber für di sprache möchte ich einfache textdateien verwenden da jeder user die einfach ändern kann ohne das er nen kompiler brauch

kann man wenigsten die auslesefunktion so optimieren das die nicht mit jedem string um 2zeilen wächst?
sprich dort auch noch schleifenbasiert?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
11.08.2005, 15:21 Uhr
Th



Also die Einleseschleife ist ... naja...

Besser ist es einfach die Texte in ein String-Array einzulesen und mittels eines Indizes (kann auch ein anderer String sein) auf das Array zugreifen.

Wenn du C++ programmierst, kannst du dafür "std::map<std::string, std::string>" verwenden. In C kannst du dir ein dynamisches Array mit einer Struktur (char*, char *) definieren und dann mittels einer Find(char *) auf den Inhalt zugreifen.

Wenn du doch deine Routine behalten willst, dann mach doch ein Makro bzw. besser noch eine Funktion, z.B.


C++:
static char *ptr1, *ptr2;

bool is_text(const char *a, char *b)
{
   if(gstricmp(ptr1, a) == 0)
   {
       strcpy(b, ptr2);
       return true;
   }
   return false;
}

void read()
{
   //...  die obige Schleife

   if(is_text("WarningMessage", WARNING_MESSAGE)) ;
   else if(is_text("Welcome", WELCOME)) ;
   //...
}



Für Zahlen kannst du ja eine ähnliche Funktion "is_int" schreiben, ist dir als Hausaufgabe gegeben -)

Dieser Post wurde am 11.08.2005 um 15:23 Uhr von Th editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
11.08.2005, 16:37 Uhr
Skippy



weil du std::map erwähnst gibt es ne möglichkeit einfach sämtliche sachen der reihe nach aus der datei auslesen und ins map speichern? (also in ner schleife)

und dann einfach immer im map das element auslesen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: