Verschiedene Sprachstrings - gute Lösung, gute Idee gesucht.



  • hallo, wie mache ich am besten zeichenketten für mehrere sprachen? das soll unter linux und unter windows laufen! linux hat ja so ziemlich alles mit utf8 an bord und windows eiert mit wchar_t rum. ich wollt aber ungern alle ausgaben in doppelter version pflegen. wie mache ich das nun am besten:

    so: char* zk = "hallo";
    oder so: wchar_t* wzk = L"hallo";
    oder gar ganz anders? die linuxversion läuft in der konsole, die windowsversion so richtig mit fenster und so.

    mein linux kann nix mit unicode-kodierten dateien anfangen, die ich mit windows erstellt habe; utf8 ginge vllt. noch, aber windows rafft wiederum nicht wie es char* s = "سيب"; ausgeben soll-absolut keine chance auch wenn man sich auffn kopp stellt und mit den ohren schlackert. unter linux reicht ein einfaches printf(s) und das in der konsole! das finde ich sowas von supertoll, da kann sich windows einiges von abgucken! aber naja, das hilft mir ja nicht wirklich weiter, ne. mit L"سيب" ginge es zwar unter windows, aber dann müsst ich unter linux wieder alles wo printf steht, durch wprintf ersetzen und alle meine zeichenketten, die schon das format char* zk = "hallo"; haben durch wchar_t* wzk = L"hallo"; ersetzen. komm ich wohl nicht drum rum, wa.
    aber auch wenn ich alles umfummeln muss - egal, wollt mal gern 'hören' wie ihr sowas angeht.
    gruß,
    l.s.n.



  • Du kannst unter Windows mit MultiByteToWideChar von UTF-8 nach UTF-16 konvertieren.

    Für die systemunabhängige Lokalisierung eignet sich z.B. gettext (aber das hängt auch davon ab, mit welchem UI-Framework der Windows-Anteil geschrieben wurde).



  • Schon mal nach einer entsprechenden Bibliothek fuer C oder C++ gesucht, die sowohl fuer Windows und fuer Linux ausgeliefert wird?





  • Du benutzt doch sowieso eine cross-platform Bibliothek oder nicht?
    Dann schau mal in die Doku, die haben normalerweise alle so etwas fundamentales.

    Bei QT nennt sich das QLinguist.



  • Die Standardbib bietet entsprechende Funktionalität: std::message + std::codecvt

    Wobei die Funktionalität wohl etwas den Implementierungen überlassen wird. Ansonsten schau dir wie bereits gesagt gettext an.



  • Tippgeber schrieb:

    Du benutzt doch sowieso eine cross-platform Bibliothek oder nicht?
    Dann schau mal in die Doku, die haben normalerweise alle so etwas fundamentales.

    Bei QT nennt sich das QLinguist.

    ausser der c bibliothek hab ich noch die winapi für die windows-version. der rest ist mit #ifdef und co. gemacht.



  • rüdiger schrieb:

    Die Standardbib bietet entsprechende Funktionalität: std::message + std::codecvt

    WTF ist std::message? Gib mal Link zur Doku.



  • Die Klasse heisst std::messages, und Doku gibt's z.B. hier:

    http://gcc.gnu.org/onlinedocs/libstdc++/manual/messages.html
    oder hier:
    http://stdcxx.apache.org/doc/stdlibref/messages.html

    Ist Teil des offiziellen C++ Standards (1998) - siehe Abschnitt 22.2.7.

    Lustigerweise ist die Klasse in MSVC implementiert, aber nicht dokumentiert 🙂

    (Ich hab von dem Ding aber auch noch nie was gehört. Hab nur eben nachgeschaut weil's mich gewundert hätte wenn rüdiger hier totalen Unsinn verzapfen würde...)

    p.S.: was locales angeht... so ziemlich alle Implementierungen verwenden die Zwei-Buchstaben ISO-Codes für Sprachen ("de", "en", ...), bzw. die "ll_CC" Version wo ll für die Sprache steht und CC für das Land ("de_AT", "en_US", ...). MSVC nicht, MSVC will hier Drei-Buchstaben ISO-Codes haben ("deu", "eng", "deu_AUT", "eng_USA", ...). Wiedermal total plem!



  • hustbaer schrieb:

    Die Klasse heisst std::messages, und Doku gibt's z.B. hier:

    http://gcc.gnu.org/onlinedocs/libstdc++/manual/messages.html
    oder hier:
    http://stdcxx.apache.org/doc/stdlibref/messages.html

    Ist Teil des offiziellen C++ Standards (1998) - siehe Abschnitt 22.2.7.

    Lustigerweise ist die Klasse in MSVC implementiert, aber nicht dokumentiert 🙂

    (Ich hab von dem Ding aber auch noch nie was gehört. Hab nur eben nachgeschaut weil's mich gewundert hätte wenn rüdiger hier totalen Unsinn verzapfen würde...)

    Die IOStreams und Locales sind leider viel zu unbekannt. Sie sind gewiss nicht perfekt, aber bieten genügend Funktionalität zur Erweiterung. Ich kann jedem nur das Buch Standard C++ IOStreams and Locales | ISBN: 0201183951 empfehlen.



  • @Tippgeber:
    Ich hab' mich mit den Dingern nie anfreunden können.
    Und ich brauche sie gottseidank nie.

    Für "einfach nur Daten ausgeben/speichern/laden/versenden" etc. verwende ich aus verschiedensten (guten) Gründen keine C++ Streams.
    Und mit Lokalisierung hab' ich gottseidank kaum was zu tun 🙂



  • kann denn gettext auch das L"xyz" und "xyz" verarbeiten/unterscheiden?



  • Tippgeber schrieb:

    Die IOStreams und Locales sind leider viel zu unbekannt.

    Und das völlig zu recht. Die C++-Locales sind eine einzige Krankheit. Ich verstehe nicht, was sich der Standard dabei gedacht hat. Wenn man die Dinger nicht gerade komplett selbst implementieren will, sind sie praktisch unbrauchbar, weil alles absolut plattform- und compilerabhängig ist. Selbst zwischen GCC (Linux) und GCC (MinGW/Windows) kann man nicht denselben Code hernehmen. Es sei denn natürlich, man implementiert wirklich alles selbst und verlässt sich auf absolut gar nichts. Und das sagt schon alles über die Brauchbarkeit aus. Das Einzige, worauf man sich verlassen kann, ist die Verwendbarkeit des C-Locales. Super 👍



  • gettext n00b schrieb:

    kann denn gettext auch das L"xyz" und "xyz" verarbeiten/unterscheiden?

    scheinbar benutzt das zeug hier keiner!



  • Wenn man sich den Header so ansieht, dann sieht's nicht danach aus. Aber dazu ist vielleicht das hier interessant.



  • .filmor schrieb:

    Wenn man sich den Header so ansieht, dann sieht's nicht danach aus. Aber dazu ist vielleicht das hier interessant.

    ja, der link ist sehr aufschlussreich, vielen dank! habe zwar jetzt schon alles fest im source-code drin, was man laut obigem link ja nicht machen sollte. aber wenn das proggie später vielleicht mal größer werden sollte, kann ich ja immer noch umrüsten.

    ein paar zeilen weiter oben finde ich ja putzig:

    “Woe32” denotes the Windows 32-bit operating systems for x86: Windows NT/2000/XP/Vista and Windows 95/98/ME. Microsoft uses the term “Win32” to denote these; this is a psychological trick in order to make everyone believe that these OSes are a “win” for the user. However, for most users and developers, they are a source of woes, which is why I call them “Woe32”.

    gruß,
    g.n.



  • ja, schön und gut, aaaaber:

    Short answer: If you want your program to be useful to other people, then don't use accented characters (or other non-ASCII characters) in string literals in the source code. Instead, use only ASCII for string literals, and use gettext() to retrieve their display-ready form.

    was ist denn die "display-ready-form"? in welchem format wird das gespeichert? 😕



  • Das heisst, dass du in deinem Programm nur ASCII Strings wie "Text1" haben sollst, und diese dann verwendest um mittels gettext die Nachricht in der codierung zu erhalten, die du dann Ausgeben willst.

    also quasi:
    wcout<<gettext("Fehlernachricht1");


Anmelden zum Antworten