I18N



  • Internationalisierung und C++
    Vielleicht hat sich hier einer ja schon mal mit der Internationalisierung von C++ Anwendungen befasst, einige Punkte die ich aufführe sind nicht spezielle C++ Fragen, ich stelle sie dennoch im Gesamtkontext...

    Wichtig ist das ich gerne möglichst portabel sein möchte, sprich möglichst wenig Plattformspezifischen Code nutzen würde (Wenn gleich die Plattform erstmal die Unicodefähigen Windowsversionen ab 2000 betrifft).

    Stringbehandlung
    a) In wie weit ist der std::wstring überhaupt sinnvoll verwendbar? Im nächsten Standard sollen ja weitere Varianten kommen, mich würde mal interessieren ob und wieweit std::wstring Praxistauglich ist, was für gängige Alternativen gibt es und wann reicht std::wstring, wann nicht?
    b) In wie weit ist std::string in std::wstring konvertierbar (mir ist http://www.c-plusplus.net/forum/viewtopic-var-t-is-39492.html bekannt, doch ich wundere mich das meine Websuche gänzlich unterschiedliche Ergebnisse liefert und keiner wohl wirklich sicher ist). Ist der Weg (logischerweise verlustbehaftet) auch rückgängig gangbar?

    Datum, Zeit...
    a) Gibt es hier einen Datentyp den man weitgehend empfehlen kann (Wie sieht es z.B. mit den Boost-Varianten aus)?
    b) Wie gebräuchlich sind andere Kalendersysteme (Weltweit/Europa)...

    Allgemeines
    Wo bekommt man Informationen wie folgendes am besten her:
    a) Aufbau von nationalen Adressen
    b) Welche unterschiedlichen Namenszusammensetzungen sind verbreitet
    c) Welche Regeln zum Rechnen mit Währungen gibt es
    Gibt es hierfür vielleicht eine sinnvolle Lektüre die entweder Sprachneutral (bezogen auf Computersprachen) ist, oder Richtung C++ geht ohne ausschließlich eine Plattform als Basis zu nehmen?

    cu André



  • C++ bietet dir dafür locales an. google einfach mal nach locale C++ usw.

    erstes ergebnis: http://www.cantrip.org/locale.html

    wenn dir das nicht flexibel genug ist, muss du wohl auf fremdbibliotheken zurückgreifen.



  • Das beantwortet aber keine Fragen nach Praxistauglichkeit, mich würde hier vor allem mal eine Antwort von jemanden interessieren der damit unter C++ Erfahrungen gemacht hat.

    cu André



  • Ist doch ein komplexes Thema. C++ bietet dir hier Basistechnik an, aber man muß was selber Hand anlegen oder was kaufen. Ich habe mal dazu was geschrieben.

    a) In wie weit ist der std::wstring überhaupt sinnvoll verwendbar? Im nächsten Standard sollen ja weitere Varianten kommen, mich würde mal interessieren ob und wieweit std::wstring Praxistauglich ist, was für gängige Alternativen gibt es und wann reicht std::wstring, wann nicht?

    wstring (wchar_t-String) ist ein guter Kompromiss unter C++, wenn man sich auf der Std-Libs stützen will. Windows z.B. arbeitet intern und in der API komplett mit wchar_t-Strings und es (Windows) wird weltweit eingesetzt (arabisch, hibräisch usw.). Java 1.4 hat auch wie Windows intern mit gleichwertigen Strings gearbeitet.
    Ich arbeite selbst ausschliesslcih mit wstring in meinen eigenen Projekten.

    b) In wie weit ist std::string in std::wstring konvertierbar (mir ist http://www.c-plusplus.net/forum/viewtopic-var-t-is-39492.html bekannt, doch ich wundere mich das meine Websuche gänzlich unterschiedliche Ergebnisse liefert und keiner wohl wirklich sicher ist). Ist der Weg (logischerweise verlustbehaftet) auch rückgängig gangbar?

    Konvertieren kannste immer. Manchmal verlustetbehaftet, manchmal nicht. Kommt auf die Kombination an.

    a) Gibt es hier einen Datentyp den man weitgehend empfehlen kann (Wie sieht es z.B. mit den Boost-Varianten aus)?
    b) Wie gebräuchlich sind andere Kalendersysteme (Weltweit/Europa)...

    C++ Stdlib bietet was an, ich würde aber heute was aus der Boost-Lib nehmen. Vorallem wurde Boost.Date für TR2 vorgeschlagen.

    a) Aufbau von nationalen Adressen
    b) Welche unterschiedlichen Namenszusammensetzungen sind verbreitet
    c) Welche Regeln zum Rechnen mit Währungen gibt es

    a) ??? Was für Adressen?
    b) ???
    c) Es gibt glaube ich in der C++ Stdlib was für die Darstellung von Währungen. Rechnen hängt doch vom Kurs ab...



  • Erstmal danke für die Antworten

    Artchi schrieb:

    a) Aufbau von nationalen Adressen
    b) Welche unterschiedlichen Namenszusammensetzungen sind verbreitet
    c) Welche Regeln zum Rechnen mit Währungen gibt es

    a) ??? Was für Adressen?
    b) ???
    c) Es gibt glaube ich in der C++ Stdlib was für die Darstellung von Währungen. Rechnen hängt doch vom Kurs ab...

    Vorneweg: Dies sind auch die Themen die nicht C++ spezifisch sind, und die ich in einen anderen Unterforum fragen werde, hatte nur gehofft das jemand der sich mit ersteren Beschäfftigt hat, vielleicht letzteres auch weiß.

    a) Es gibt unterschiedliche Formen eine Adresse zu schreiben, so gibt es zum Beispiel den Fall das die PLZ oder ein Teil davon hinter der Stadt steht etc.

    b) Namen können den Aufbau <Vorname> <Nachname> haben, ebenso wie dies in manchen Ländern aber verkehrt ist wo z.B. der Nachname zuerst genannt wird.

    c) Betrifft rechtliche Grundlagen wie z.B. wie werden Berechnungen innerhalb einer Währung gemacht (wann und wie ist zu runden), wie muß man einen Kurs umrechnen damit alles rechtlich in Ordnung ist etc. (Beispielsweise gab es ganz feste Regeln mit welcher Genauigkeit bei der Rechnung: Fremdwährung von/nach Euro zu rechnen ist; Bevor anschließend gerundet wird...). Zu letzteren (Euro<->Fremdwährung) habe ich auch die Informationen.

    cu André



  • Das sind alles Richtlinien, die vom Unternehmen abhängen. Bei uns hier gibt es auch Regeln, aber die betreffen Ausnahmesysteme. Die ganzen Systeme die ich bisher entwickelt habe (für einen Weltkonzern) haben praktisch keine Rücksicht genommen. Obwohl Geldbeträge und Adressen eine Rolle gespielt haben. Andere Systeme, werden wohl solche Regeln haben. Aber ich denke das wirst du nicht in C++ finden, kannst froh sein, wenn du ein Datum formatiert ausgegeben bekommst. 😉 In Java kenne ich solche APIs auch nicht.



  • Nochmal zum Thema I18N...

    Thema Zahlenformate
    Wie kann man Zahlen <=> String konvertieren mit berücksichtigungen der Systemeigenschaften. Eigentlich dachte ich ganz einfach... bis zur Umwandlung von einem String mit französischer Zahlenformatierung...

    1.000,00 (Deutsch) - Umwandlung kein Problem
    1,000.00 (Englisch) - Umwandlung kein Problem
    1 000.00 (Französisch) - Problem, schneidet immer nach 1 ab

    Welche Funktionen stehen mir in C++ sowie C zur Verfügung die auch mit letzten Fall umgehen können?

    So weiteres Problem: Die Compiler die ich hierfür verwenden kann sind beide nicht Standardkonform (VC++ 6.0 sowie Power++) daher wäre es gut wenn mir jemand mehrere Möglichkeiten nennen kann (C, C++, Win32 Api...). Auch wenn mir eine C++ Lösung am liebsten wäre (ob die dann auch läuft ist natürlich eine andere Frage).

    cu André



  • Ja, da kollidiert das Tausender-Trennzeichen ganz klar mit der Erkennung "hier ist die Eingabe zu Ende". Also Lösung würde mir nur einfallen, die Tausender-Trennzeichen vor der Umwandlung zu löschen (den findest du über use_facet<numpunct<char> >(loc).thousands_sep() ).



  • für alle deine Probleme sind locales da. Wichtig ist, dass du selbst handanlegen musst.

    wenn du addressenformatierung brauchst, musst du so ein facet in die locale Klassen integrieren. Ist allerdings ein komplexes thema, aber dafür gibts gute tutorials im internet.

    Bei der Zahlenformatierung siehts etwas besser aus. Wenn du eine Französische eingabe erwarten willst, kannst du einfach in cin(oder dem stream den du nutzt) ein französisches locale laden. der name ist zwar systemabhängig(also musst du irgendwo bei der msdn oder in irgendeiner windows docu nachschauen), aber das kann man rauskriegen. wenn der stream mit dem richtigen locale gefüttert wurde, geht alles wie von geisterhand, und das wird auch von recht alten compilern noch unterstützt.



  • otze schrieb:

    ...Bei der Zahlenformatierung siehts etwas besser aus. Wenn du eine Französische eingabe erwarten willst, kannst du einfach in cin(oder dem stream den du nutzt) ein französisches locale laden...

    Ich habe schon im Vorfeld einiges Probiert. Aber zum einen gibt es unter einen von den beiden Compilern weder die Möglichkeit einen Stream ein locale mitzugeben (imbue) noch use_facet. Aber selbst mit einem Test unter einem neuen Compiler (VC2005) scheiterte ich immer am französischen Tausendertrennzeichen.

    Die Umwandlung scheint tatsächlich wie CStoll sagt nur mit dem entfernen der Tausendertrennzeichen zu gehen. Dies ist unschön, aber wenigstens funktioniert es. Trotz allem würde ich gerne mal eine lauffähige Version sehen, wenn es jemand schafft (Anmerkung: Über Leerzeichen, der VC2005 scheint zu tricksen indem er ein festes Leerzeichen in Streams einfügt und dann tatsächlich auch rückwandeln kann; einen String der mit normalen Leerzeichen an den Stream übergeben wurde, hat er wiederum nicht ausgeben können!).

    cu André


Anmelden zum Antworten