[wxWidgets]Internationalosierung nur in einem Frame
-
Hallo!
Ich habe ein Problem.
Ich bin gerade dabei meine Anwendung zu internationalisieren.
Jedoch wird nur 'latein_suiteFrame' internationalisiert.
'SettingsDialog' bleibt in Englisch.
Woran könnte das liegen?Sourcecode:
latein_suiteGUI.h
/////////////////////////////////////////////////////////////////////////// // C++ code generated with wxFormBuilder (version Feb 17 2010) // http://www.wxformbuilder.org/ // // PLEASE DO "NOT" EDIT THIS FILE! /////////////////////////////////////////////////////////////////////////// #ifndef __latein_suiteGUI__ #define __latein_suiteGUI__ #include <wx/intl.h> #include <wx/statusbr.h> #include <wx/gdicmn.h> #include <wx/font.h> #include <wx/colour.h> #include <wx/settings.h> #include <wx/string.h> #include <wx/bitmap.h> #include <wx/image.h> #include <wx/icon.h> #include <wx/menu.h> #include <wx/textctrl.h> #include <wx/sizer.h> #include <wx/panel.h> #include <wx/notebook.h> #include <wx/frame.h> #include <wx/stattext.h> #include <wx/choice.h> #include <wx/dialog.h> /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /// Class latein_suiteFrame /////////////////////////////////////////////////////////////////////////////// class latein_suiteFrame : public wxFrame { private: protected: wxStatusBar* statusbarMain; wxMenuBar* menubarMain; wxMenu* menuFile; wxMenu* menuEdit; wxMenu* menuHelp; wxNotebook* notebook1; wxPanel* panelTranslate; wxTextCtrl* textCtrlInput; wxTextCtrl* textCtrlTranslation; // Virtual event handlers, overide them in your derived class virtual void OnOpenSettingsFrame( wxCommandEvent& event ) { event.Skip(); } virtual void OnQuit( wxCommandEvent& event ) { event.Skip(); } public: latein_suiteFrame( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Latein Suite"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 800,900 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL ); ~latein_suiteFrame(); }; /////////////////////////////////////////////////////////////////////////////// /// Class SettingsDialog /////////////////////////////////////////////////////////////////////////////// class SettingsDialog : public wxDialog { private: protected: wxStaticText* staticLanguage; wxChoice* choiceLanguage; // Virtual event handlers, overide them in your derived class virtual void OnInitSettingsDlg( wxInitDialogEvent& event ) { event.Skip(); } public: SettingsDialog( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 500,500 ), long style = wxDEFAULT_DIALOG_STYLE ); ~SettingsDialog(); }; #endif //__latein_suiteGUI__
latein_suiteGUI.cpp
/////////////////////////////////////////////////////////////////////////// // C++ code generated with wxFormBuilder (version Feb 17 2010) // http://www.wxformbuilder.org/ // // PLEASE DO "NOT" EDIT THIS FILE! /////////////////////////////////////////////////////////////////////////// #include <wx/wxprec.h> #include "latein_suiteGUI.h" /////////////////////////////////////////////////////////////////////////// latein_suiteFrame::latein_suiteFrame( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style ) { this->SetSizeHints( wxDefaultSize, wxDefaultSize ); statusbarMain = this->CreateStatusBar( 1, wxST_SIZEGRIP, wxID_ANY ); menubarMain = new wxMenuBar( 0 ); menuFile = new wxMenu(); wxMenuItem* menitemSettings; menitemSettings = new wxMenuItem( menuFile, wxID_ANY, wxString( _("Settings") ) , _("Opens the settings dialog"), wxITEM_NORMAL ); menuFile->Append( menitemSettings ); wxMenuItem* meniFileseperator1; meniFileseperator1 = menuFile->AppendSeparator(); wxMenuItem* menuitemQuit; menuitemQuit = new wxMenuItem( menuFile, wxID_ANY, wxString( _("Quit") ) , wxEmptyString, wxITEM_NORMAL ); menuFile->Append( menuitemQuit ); menubarMain->Append( menuFile, _("File") ); menuEdit = new wxMenu(); wxMenuItem* menuitemCut; menuitemCut = new wxMenuItem( menuEdit, wxID_ANY, wxString( _("Cut") ) , wxEmptyString, wxITEM_NORMAL ); menuEdit->Append( menuitemCut ); menuitemCut->Enable( false ); wxMenuItem* menuitemCopy; menuitemCopy = new wxMenuItem( menuEdit, wxID_ANY, wxString( _("Copy") ) , wxEmptyString, wxITEM_NORMAL ); menuEdit->Append( menuitemCopy ); menuitemCopy->Enable( false ); wxMenuItem* menuitemPaste; menuitemPaste = new wxMenuItem( menuEdit, wxID_ANY, wxString( _("Paste") ) , wxEmptyString, wxITEM_NORMAL ); menuEdit->Append( menuitemPaste ); menuitemPaste->Enable( false ); wxMenuItem* menuitemDelete; menuitemDelete = new wxMenuItem( menuEdit, wxID_ANY, wxString( _("Delete") ) , wxEmptyString, wxITEM_NORMAL ); menuEdit->Append( menuitemDelete ); menuitemDelete->Enable( false ); menubarMain->Append( menuEdit, _("Edit") ); menuHelp = new wxMenu(); menubarMain->Append( menuHelp, _("Help") ); this->SetMenuBar( menubarMain ); wxBoxSizer* boxSizer1; boxSizer1 = new wxBoxSizer( wxVERTICAL ); notebook1 = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); panelTranslate = new wxPanel( notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); wxFlexGridSizer* flexgridSizer1; flexgridSizer1 = new wxFlexGridSizer( 2, 2, 0, 0 ); flexgridSizer1->SetFlexibleDirection( wxBOTH ); flexgridSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); textCtrlInput = new wxTextCtrl( panelTranslate, wxID_ANY, _("Insert text here..."), wxDefaultPosition, wxSize( 378,482 ), wxTE_MULTILINE|wxTE_RICH ); flexgridSizer1->Add( textCtrlInput, 0, wxALL, 5 ); textCtrlTranslation = new wxTextCtrl( panelTranslate, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 378,482 ), wxTE_MULTILINE|wxTE_RICH ); flexgridSizer1->Add( textCtrlTranslation, 0, wxALL, 5 ); panelTranslate->SetSizer( flexgridSizer1 ); panelTranslate->Layout(); flexgridSizer1->Fit( panelTranslate ); notebook1->AddPage( panelTranslate, _("Translate"), true ); boxSizer1->Add( notebook1, 1, wxEXPAND, 5 ); this->SetSizer( boxSizer1 ); this->Layout(); this->Centre( wxBOTH ); // Connect Events this->Connect( menitemSettings->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( latein_suiteFrame::OnOpenSettingsFrame ) ); this->Connect( menuitemQuit->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( latein_suiteFrame::OnQuit ) ); } latein_suiteFrame::~latein_suiteFrame() { // Disconnect Events this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( latein_suiteFrame::OnOpenSettingsFrame ) ); this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( latein_suiteFrame::OnQuit ) ); } SettingsDialog::SettingsDialog( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { this->SetSizeHints( wxDefaultSize, wxDefaultSize ); wxFlexGridSizer* flexgridSizer1; flexgridSizer1 = new wxFlexGridSizer( 2, 2, 0, 200 ); flexgridSizer1->SetFlexibleDirection( wxBOTH ); flexgridSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); staticLanguage = new wxStaticText( this, wxID_ANY, _("Choose your Language:"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); staticLanguage->Wrap( -1 ); flexgridSizer1->Add( staticLanguage, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); wxString choiceLanguageChoices[] = { _("English"), _("German") }; int choiceLanguageNChoices = sizeof( choiceLanguageChoices ) / sizeof( wxString ); choiceLanguage = new wxChoice( this, wxID_ANY, wxPoint( -1,-1 ), wxSize( 128,-1 ), choiceLanguageNChoices, choiceLanguageChoices, 0 ); choiceLanguage->SetSelection( 0 ); flexgridSizer1->Add( choiceLanguage, 0, wxALL|wxEXPAND, 5 ); this->SetSizer( flexgridSizer1 ); this->Layout(); this->Centre( wxBOTH ); // Connect Events this->Connect( wxEVT_INIT_DIALOG, wxInitDialogEventHandler( SettingsDialog::OnInitSettingsDlg ) ); } SettingsDialog::~SettingsDialog() { // Disconnect Events this->Disconnect( wxEVT_INIT_DIALOG, wxInitDialogEventHandler( SettingsDialog::OnInitSettingsDlg ) ); }
latein_suiteApp.h
#ifndef LATEIN_SUITEAPP_H_INCLUDED #define LATEIN_SUITEAPP_H_INCLUDED #include <wx/wx.h> class latein_suiteApp : public wxApp { public: latein_suiteApp(); virtual ~latein_suiteApp(); virtual bool OnInit(); void SelectLanguage(int lang); private: wxLocale m_locale; }; DECLARE_APP(latein_suiteApp) #endif // LATEIN_SUITEAPP_H_INCLUDED
latein_suiteApp.cpp
#include "latein_suiteApp.h" #include "latein_suiteFunc.h" #include <wx/msgdlg.h> #include <wx/stdpaths.h> IMPLEMENT_APP(latein_suiteApp) latein_suiteApp::latein_suiteApp() { } latein_suiteApp::~latein_suiteApp() { } bool latein_suiteApp::OnInit() { SelectLanguage(wxLANGUAGE_GERMAN); latein_suite* Frame = new latein_suite(0); Frame->Show(); SetTopWindow(Frame); return true; } void latein_suiteApp::SelectLanguage(int lang) { wxString AppPath = wxStandardPathsBase::Get().GetExecutablePath(); AppPath.Remove(AppPath.Find(wxT("latein_suite.exe"))); //wxMessageBox(AppPath); wxString test; test << lang; wxMessageBox(test); //delete m_locale; m_locale.Init(lang, wxLOCALE_CONV_ENCODING); m_locale.AddCatalogLookupPathPrefix(AppPath); m_locale.AddCatalog(wxT("lang\\de_de\\de")); m_locale.AddCatalog(wxT("lang\\de_de\\de_de")); }
latein_suiteFunc.h
#ifndef __latein_suiteFunc__ #define __latein_suiteFunc__ #include "latein_suiteGUI.h" class latein_suite : public latein_suiteFrame { public: latein_suite( wxWindow* parent ); protected: void OnQuit(wxCommandEvent& event); void OnOpenSettingsFrame (wxCommandEvent& event); }; #endif
latein_suiteFunc.cpp
#include <wx/wxprec.h> #include "latein_suiteFunc.h" #include "latein_suiteApp.h" #include "latein_suiteGUI.h" #include "SettingsDialogFunc.h" #include <wx/msgdlg.h> #include <wx/app.h> #include <wx/filefn.h> #include <wx/stdpaths.h> latein_suite::latein_suite( wxWindow* parent ) : latein_suiteFrame( parent ) { } void latein_suite::OnQuit(wxCommandEvent& event) { this->Close(); } void latein_suite::OnOpenSettingsFrame(wxCommandEvent& event) { SettingsDialog *dlg = new SettingsDialog(this); dlg->ShowModal(); }
SettingsDialogFunc.h
#ifndef __SettingsDialogFunc__ #define __SettingsDialogFunc__ #include "latein_suiteGUI.h" class SettingsDialogFunc : public SettingsDialog { protected: void OnInitSettingsDlg(wxInitDialogEvent& event); public: SettingsDialogFunc(wxWindow* parent); }; #endif
SettingsDialogFunc.cpp
#include "SettingsDialogFunc.h" #include <wx/msgdlg.h> #include <wx/stdpaths.h> SettingsDialogFunc::SettingsDialogFunc( wxWindow* parent ) : SettingsDialog( parent ) { } void SettingsDialogFunc::OnInitSettingsDlg( wxInitDialogEvent& event ) { }
Wie gesagt: Der Frame, der in 'OnOpenSettingsFrame' geöffnet wird, wird nicht übersetzt.
Woran kann das liegen?
wäre nett wenn ihr mir helft.
-
void Application::ChangeLanguage(bool force) { // Get Config wxConfig * config = new wxConfig(); m_lang = static_cast<wxLanguage>(config->ReadLong("Language", wxLANGUAGE_UNKNOWN)); // This is for calling it from inside the program. So we can get rid of the "wrong" language. if (force){ m_lang = wxLANGUAGE_UNKNOWN; } // Get desired Language from user based on available Languages if ( m_lang == wxLANGUAGE_UNKNOWN ) { int choice = wxGetSingleChoiceIndex(wxT("Please select Language"), wxT("Choose Translation"), WXSIZEOF(LangNames), LangNames); m_lang = (choice == -1 ? wxLANGUAGE_DEFAULT : LangID[choice]); } // Init if ( !m_loc.Init(m_lang, wxLOCALE_CONV_ENCODING) ) { wxLogWarning(_("This language is not supported by the system.")); } // Install Catalogue const wxLanguageInfo* pInfo = wxLocale::GetLanguageInfo(m_lang); if (!m_loc.AddCatalog("internat")) { wxLogError(wxT("Couldn't find/load the 'internat' catalog for locale '%s'."), pInfo ? pInfo->GetLocaleName() : _("unknown")); } m_loc.AddCatalog("wxstd.mo"); // Modify Config config->Write("Language", static_cast<long>(m_lang)); delete config; }
So hab ich das gelöst.
m_locale.Init(lang, wxLOCALE_CONV_ENCODING); m_locale.AddCatalogLookupPathPrefix(AppPath); m_locale.AddCatalog(wxT("lang\\de_de\\de")); m_locale.AddCatalog(wxT("lang\\de_de\\de_de"));
Die Frage ist:
Warum den AppPath zum Lookup hinzufügen? Der wird automatisch durchsucht. Und was ist de und de_de?
Dann:
Ich hab einen Katalog für meine Anwendung, der von mir stammt:
internat.mo
Der sitzt im verzeichnis "de" im AppPath. Hast Du also das Verzeichnis Lang, muss du AppPath + "/lang/" zum Lookup hinzufügen und den Namen des Kataloges über AddCatalogue angeben. Das Verzeichnis "de" wird automatisch gewählt.
Siehe auch das Sample dazu.
Hoffe das war verständlich :D.EDIT:
Achja, hast Du gettext auch über die Dateien vom Formbuilder drüberlaufen lassen? Falls Du es nicht kennst, poEdit ist hervorragend zum übersetzen, ist auch mit wxWidgets gemacht.
rya.