[gelöst] wxLocale auf Windows und Linux unterschiedliches Verzeichnis
-
Hallo,
ich schreibe gerade eine Anwendung in wxWidgets, die mithilfe von wxLocale unterschiedliche Sprachen unterstützen soll. Ein Freund hat mir mein Programm mit Hilfe von PO und MO auch ins Russische übersetzt. Wenn ich das Programm unter Windows Visual Studio 2008 Express C++ compelieren, dann klappt alles wunderbar.
Wenn ich jetzt mein Programm mit auf meinen Linux-Rechner ausführe und dort mit Hilfe von make-Files und g++ mein Programm compeliere, bekomme ich auch keinen Fehler. Nur beim Ausführen meines Programmes sagt er mir über ein wxLogError:
"Cannot set locale to 'ru_RU'"Erstmal hab ich dann unter Windows meine Russischen Kataloge wegverschoben und dort auch mal probiert was passiert. Leider habe ich unter Windows keine solche Fehlermeldung. Das Programm bleibt einfach in Englisch und ich bekomme bei AddCatalog einfach ein false.
Nach hin und her probieren habe ich dann festgestellt, das Windows meine russische MO im Ordner "ru" sucht und Linux im Ordner "ru_RU".
Das ist jetzt irgendwie nicht das was ich mir unter Cross-Complie vorstelle. Daher suche ich eine Möglichkeit entweder Windows zu sagen, dass er auch unter 'ru_RU' sucht oder meinem Linux zu sagen, dass er unter 'ru' sucht.
Leider finde ich jetzt keine Funktion die mir auch Auskunft darüber geben würde, welches Verzeichnis er durchsucht. Das Manual sagt ja nur das er wie folgt sucht:<DIR>/<LANG>/LC_MESSAGES <DIR>/<LANG> <DIR>
Was jetzt in <LANG> steht, darüber schweigt sich das Handbuch aus, oder ich finds nur nicht *g*.
Bitte um Hilfe,
Danke,
Stefan
-
1 Code zeigen, wo du a) die Locale setzt und b) das Verzeichnis bindest.
2 Verwendest du zum setzen der Locale die wxWidgets-Constanten?
3 Welche Verzeichnisse verwendest du unter Linux? /usr/bin für dein Programm und /usr/share/<appname> für die Daten? Hat der Nutzer Zugriffsrechte?
rya
-
machst du einen Aufruf ala:
m_Locale.Init(wxLANGUAGE_RUSSIAN, wxLOCALE_CONV_ENCODING);
(wxLocale m_Locale; //muss in myApp.h ) ?
denn ru_RU ist richtig.
-
1 Code zeigen, wo du a) die Locale setzt und b) das Verzeichnis bindest.
// Application class myApp : public wxApp { public: ~myApp(); virtual bool OnInit(); bool SetLanguage(int lang); private: wxLocale *m_locale; }; bool myApp::OnInit() { /*....*/ // Sprache Init m_locale = NULL; SetLanguage(wxLANGUAGE_DEFAULT); // Erst mal Systemsprache laden, bei mir Deutsch.... // Hauptfenster laden /*...*/ } bool myApp::SetLanguage(int lang) { delete m_locale; m_locale = new wxLocale(lang); // Dateien liegen im Hauptverzeichnis der myApp im Unterverzeichnis ./translation // z.B. ./translation/de m_locale->AddCatalogLookupPathPrefix(_T("translation")); // z.B. ./translation/de/myapp.mo return m_locale->AddCatalog(_T("myapp")); } myApp::~myApp() { delete m_locale; } // Frame zum Sprache wechseln WX_DECLARE_STRING_HASH_MAP( int, langCodes ); void Hauptfenster::initLanguage(const wxString& tocode) { langCodes mylangs; mylangs[_T("de")]=wxLANGUAGE_GERMAN; mylangs[_T("en")]=wxLANGUAGE_ENGLISH; mylangs[_T("ru")]=wxLANGUAGE_RUSSIAN; switch (mylangs[tocode]) { case wxLANGUAGE_GERMAN: case wxLANGUAGE_ENGLISH: case wxLANGUAGE_RUSSIAN: if (!wxGetApp().SetLanguage(mylangs[tocode])) { wxString s; s << tocode << _T(" - CODE: ") << mylangs[tocode] << _T(" - ") << _("Language catalog not found."); showError(s); } break; default: wxString zw; zw << _("Switch to language") << _T(": ") << tocode; doLog(zw,true); showError(_("Language not supportet.")); } } // irgendwo bei den Menu-Events: myframe.initLanguage(_T("ru"));
2 Verwendest du zum setzen der Locale die wxWidgets-Constanten?
Ja, siehe Code.
3 Welche Verzeichnisse verwendest du unter Linux? /usr/bin für dein Programm und /usr/share/<appname> für die Daten? Hat der Nutzer Zugriffsrechte?
ryaIch arbeite im Verzeichnis /usr/myapps/testprog/
Da es sich um meinen Programmier-Test-Serverhandelt bin ich root. Somit dürften die Rechte kein Problem sein.machst du einen Aufruf ala:
m_Locale.Init(wxLANGUAGE_RUSSIAN, wxLOCALE_CONV_ENCODING);
(wxLocale m_Locale; //muss in myApp.h ) ?
denn ru_RU ist richtig.
Wenn "ru_RU" richtig ist, warum ist es dann unter Linux auch "de" und nicht "de_DE". Denn auch bei Deutsch gibt es z.B. noch "de_AT" oder "de_CH", aber kein "de_DE"?!?
-
Vielleicht sollt ich noch sagen, ich arbeite unter Windows mit wxPack_v2.8.9.01.exe und unter Linux mit Debian Linux 2.6.18-6-686 und WxWidgets 2.8.9.1-0
-
Keiner eine Idee?
Ich habs derzeit folgt gelöst:Deutsch: /translation/de Russisch: /translation/ru_RU
Das klappt unter Windows und Linux.
Aber warum es nicht de_DE ist, konnte ich auch noch nicht rausfinden. Es ist halt schon wieder mal schlecht, weil man unter Linux ja auch GrOß- UnD kLeInScHrEiBuNg beachten muss.Danke an alle die sich nen Kopf gemacht haben.
Stefan