2016-10-02 7 views
1

Mit C++ gibt es eine einfache und zuverlässige Möglichkeit zu erkennen, ob die englische oder englische englische Rechtschreibung besser zum Gebietsschema des Benutzers passt? Ich habe ein einfaches Desktop-C++ - Programm und möchte diesen ersten minimalen Internationalisierungsschritt durchführen. Meine Benutzeroberfläche verwendet das Wort Farbe/Farbe sehr viel und ich hoffe, dem Benutzer in 99% + Fällen die richtige Schreibweise ohne viel Raketenwissenschaft oder eine explizite Benutzeroption zu präsentieren.Ermitteln, ob die englische oder englische englische Rechtschreibung mit C++ kompatibel ist

Bearbeiten: Die angenommene Antwort unten ist gut. Um nur einige zusätzliche Informationen und eine vollständig nutzbare Lösung zu bieten, ist hier vielleicht die einfachste Möglichkeit zu bestimmen, ob Sie in Ihrer C++ - Anwendung amerikanisches oder britisches Englisch verwenden. Dies ist ein kleiner, aber nützlicher Schritt zur richtigen Internationalisierung. Es ist nützlich für US-Entwickler, die kulturell sensibel auf Englisch sprechende Personen außerhalb der USA reagieren möchten, und für andere englischsprachige Entwickler, die möchten, dass ihre Produkte in den USA ein wenig mehr zu Hause sind (ich bin im letzteren Lager).

Es ist keine perfekte Lösung, aber der Standardisierungsprozess hat keine perfekte und einfache Lösung geliefert. Ich gehe davon aus, dass zumindest die Verwendung dieses Codes die Farbe versus Farbe für einen kleineren Teil Ihrer Benutzer falsch erscheinen lässt, als wenn Sie einfach das eine oder andere auswählen, vorausgesetzt Ihr Produkt ist weit verbreitet.

#include <string> 
#include <clocale> 

setlocale(LC_MONETARY,""); 
struct lconv * lc; 
lc = localeconv(); 
std::string sym(lc->int_curr_symbol); 
bool us_english = (sym=="USD" || sym=="PHP"); 

ich im Grunde US English gehe davon ist die Präferenz in den USA und in britischem Englisch anderswo, obwohl ich eine Ausnahme für ein Land gemacht habe, wo ich weiß, dass nicht der Fall zu sein (Philippinen).

Auf meinem Windows-System spiegelt dieses Programm sofort eine Änderung der Standardsprache wider, die von den Windows-Einstellungen oder der Systemsteuerung gesteuert wird. Auf diese Weise vermeiden Sie das Parsen von Strings, die von Betriebssystem zu Betriebssystem variieren können, und ich erwarte, dass es tragbar ist.

Ich werde meine eigene Lösung nicht verwenden, da ich in meinem speziellen Fall wxWidgets benutze, und wxWidgets liefert einen portablen Wrapper, der genau auf dieses Problem zugeschnitten ist (ich hätte vorher nachdenken sollen).

#include "wx/intl.h" 
int lang = wxLocale::GetSystemLanguage(); 
bool us_english = (lang == wxLANGUAGE_ENGLISH_US); 
+0

Die explizite Benutzeroption könnte trotzdem nützlich sein. Wenn Sie ein Engländer in New York sind, bevorzugen Sie möglicherweise Farbe trotz des Unternehmensstandardgebiets. –

Antwort

2

Die Grenzen der Standards

Wie NeomerArcana richtig hingewiesen, der Standard-C++ Weg, dies zu tun ist:

Leider ist der Standard nicht erzwingen, wie dieser Name wie, und MSVC Umsetzung aussehen sollten gibt nur den Namen zurück, den Sie beim Erstellen des Objekts angegeben haben, dh eine leere Zeichenfolge.

Umgehungen

Zum Glück aber gibt es eine C Behelfslösung, die ein besseres Ergebnis mit MSVC produziert: std::setlocale(LC_ALL, NULL);. Diese Funktion gibt einen Zeiger auf eine mit Null beendete C-Zeichenfolge zurück, die den vollständigen Namen des Standardgebiets der Umgebung enthält.

Das Format dieser Zeichenfolge hängt jedoch möglicherweise vom Betriebssystem und der Version ab. Sie müssen es also flexibel analysieren: Es kann ein richtiger locale name sein (zB "en-US" für Windows vs. "en_US.UTF-8" auf POSIX) oder ein Windows specific format (zB "English_United States.1252", basierend auf a language table).

Alternativ können Sie, wenn Sie nur Windows als Ziel haben, das Leben mithilfe von GetSystemDefaultLangID(void) vereinfachen. Diese Funktion gibt eine binäre Sprachkennung zurück, die Sie dann mit der Sprache LANG_ENGLISH und den regionalen Varianten überprüfen können. SUBLANG_ENGLISH_UK

+1

Das ist eine viel bessere Antwort als meine eigene. Ich finde es überraschend, dass es keine echte plattformübergreifende Möglichkeit gibt, die Gebietsinformationen zu erhalten. – NeomerArcana

+1

Danke für diese ausgezeichnete Antwort, die ich jetzt akzeptieren werde. Ich habe einige zusätzliche Experimente basierend auf Ihrer Antwort gemacht, und ich werde die Ergebnisse als eine Bearbeitung meiner Frage melden, da ich dort leichter Code einbringen kann. –

+1

@BillForster Es ist in der Tat sehr traurig, dass es immer noch keine Standarddarstellung für ein Gebietsschema über OS gibt. Danke für das Update, das in Ihrer Frage gepostet wurde: Die Idee der Verwendung von Währung ist ein hervorragendes Beispiel für einen pragmatischen Ansatz! – Christophe

2

Es gibt eine ganze Lokalisierungen/Lokalisierungen Bibliothek in C++ http://en.cppreference.com/w/cpp/locale

sollten Sie in der Lage sein, es zu benutzen, indem Sie die Zeichenfolge zurückgegeben Überprüfung von

+0

Leider ist die von std :: locale (""). Name() in meinem Windows-Testprogramm (mit Visual Studio 2015) zurückgegebene Zeichenfolge nichts anderes als "". Ich hoffe, dass dies kein Bereich ist, in dem Windows und Standard-C++ beide umfangreiche, komplizierte und völlig inkompatible Einrichtungen bieten. –

+0

Ich bin unsicher, benutze es nie selbst, aber http://en.cppreference.com/w/cpp/locale/locale/name scheint mich zu denken, dass es etwas Nützliches bieten sollte. – NeomerArcana

+1

@NeomerArcana in der Theorie sollte funktionieren. Aber theoretisch gibt es keinen Unterschied zwischen Theorie und Praxis ;-) – Christophe

Verwandte Themen