diff --git a/ZRCola/ZRCola.fbp b/ZRCola/ZRCola.fbp index 48bf40e..eba6b92 100644 --- a/ZRCola/ZRCola.fbp +++ b/ZRCola/ZRCola.fbp @@ -294,6 +294,25 @@ &Language m_menuDecompLanguage protected + + + 0 + 1 + Set language according to keyboard layout automatically + wxID_DECOMP_LANG_AUTO + wxITEM_CHECK + &Automatic + m_menuDecompLanguageAuto + none + + + + + + + m_separatorDecompLanguage1 + none + diff --git a/ZRCola/locale/sl_SI.po b/ZRCola/locale/sl_SI.po index cf37e1b..4cf107d 100644 --- a/ZRCola/locale/sl_SI.po +++ b/ZRCola/locale/sl_SI.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: ZRCola\n" -"POT-Creation-Date: 2016-04-29 09:43+0200\n" -"PO-Revision-Date: 2016-04-29 09:44+0200\n" +"POT-Creation-Date: 2016-04-29 12:50+0200\n" +"PO-Revision-Date: 2016-04-29 12:50+0200\n" "Last-Translator: Simon Rozman \n" "Language-Team: Amebis, d. o. o., Kamnik \n" "Language: sl_SI\n" @@ -17,12 +17,12 @@ msgstr "" "X-Poedit-KeywordsList: _\n" "X-Poedit-SearchPath-0: .\n" -#: zrcolafrm.cpp:73 +#: zrcolafrm.cpp:76 #, c-format msgid "Select %s language for decomposition" msgstr "Izberi jezik %s za razstavljanje" -#: zrcolafrm.cpp:84 +#: zrcolafrm.cpp:87 msgid "" "ZRCola keyboard shortcut Win+F5 could not be registered. Some functionality " "will not be available." @@ -30,11 +30,11 @@ msgstr "" "ZRColine bližnjice na tipkovnici Win+F5 ni mogoče registrirati. Nekaj " "funkcionalnosti ne bo na voljo." -#: zrcolafrm.cpp:84 zrcolafrm.cpp:86 +#: zrcolafrm.cpp:87 zrcolafrm.cpp:89 msgid "Warning" msgstr "Opozorilo" -#: zrcolafrm.cpp:86 +#: zrcolafrm.cpp:89 msgid "" "ZRCola keyboard shortcut Win+F6 could not be registered. Some functionality " "will not be available." @@ -42,11 +42,11 @@ msgstr "" "ZRColine bližnjice na tipkovnici Win+F6 ni mogoče registrirati. Nekaj " "funkcionalnosti ne bo na voljo." -#: zrcolafrm.cpp:123 +#: zrcolafrm.cpp:151 msgid "Start ZRCola automatically on logon" msgstr "Samodejno zaženi ZRColo ob prijavi" -#: zrcolafrm.cpp:253 +#: zrcolafrm.cpp:309 #, c-format msgid "" "ZRCola v%s\n" @@ -55,7 +55,7 @@ msgstr "" "ZRCola v%s\n" "Vse pravice pridržane 2015-%s Amebis" -#: zrcolafrm.cpp:253 +#: zrcolafrm.cpp:309 msgid "About ZRCola" msgstr "O ZRColi" @@ -91,7 +91,7 @@ msgstr "Izberi celotno besedilo" msgid "&Send Composed" msgstr "Pošlji &sestavljeno" -#: zrcolagui.cpp:80 zrcolagui.cpp:131 +#: zrcolagui.cpp:80 zrcolagui.cpp:137 msgid "Send composed text to source window" msgstr "Pošlji sestavljeno besedilo izvornemu oknu" @@ -99,7 +99,7 @@ msgstr "Pošlji sestavljeno besedilo izvornemu oknu" msgid "Send &Decomposed" msgstr "Pošlji &razstavljeno" -#: zrcolagui.cpp:89 zrcolagui.cpp:133 +#: zrcolagui.cpp:89 zrcolagui.cpp:139 msgid "Send decomposed text to source window" msgstr "Pošlji razstavljeno besedilo izvornemu oknu" @@ -115,67 +115,75 @@ msgstr "Prekini sestavljanje in vrni fokus nazaj izvornemu oknu" msgid "&Language" msgstr "&Jezik" -#: zrcolagui.cpp:110 +#: zrcolagui.cpp:109 +msgid "&Automatic" +msgstr "S&amodejno" + +#: zrcolagui.cpp:109 +msgid "Set language according to keyboard layout automatically" +msgstr "Samodejno nastavi jezik glede na izbrano tipkovnico" + +#: zrcolagui.cpp:116 msgid "&Edit" msgstr "Ur&edi" -#: zrcolagui.cpp:117 +#: zrcolagui.cpp:123 msgid "&Help" msgstr "&Pomoč" -#: zrcolagui.cpp:123 +#: zrcolagui.cpp:129 msgid "Cut" msgstr "Izreži" -#: zrcolagui.cpp:123 +#: zrcolagui.cpp:129 msgid "Cut selection" msgstr "Izreži izbor" -#: zrcolagui.cpp:125 +#: zrcolagui.cpp:131 msgid "Copy" msgstr "Kopiraj" -#: zrcolagui.cpp:125 +#: zrcolagui.cpp:131 msgid "Copy selection" msgstr "Kopiraj izbor" -#: zrcolagui.cpp:127 +#: zrcolagui.cpp:133 msgid "Paste" msgstr "Prilepi" -#: zrcolagui.cpp:127 +#: zrcolagui.cpp:133 msgid "Paste selection" msgstr "Prilepi izbor" -#: zrcolagui.cpp:131 +#: zrcolagui.cpp:137 msgid "Send Composed" msgstr "Pošlji sestavljeno" -#: zrcolagui.cpp:133 +#: zrcolagui.cpp:139 msgid "Send Decomposed" msgstr "Pošlji razstavljeno" -#: zrcolagui.cpp:135 +#: zrcolagui.cpp:141 msgid "Language:" msgstr "Jezik:" -#: zrcolagui.cpp:184 +#: zrcolagui.cpp:190 msgid "Decomposed Text" msgstr "Razstavljeno besedilo" -#: zrcolagui.cpp:204 +#: zrcolagui.cpp:210 msgid "Decomposed Unicode Dump" msgstr "Unicode razstavljenega" -#: zrcolagui.cpp:231 +#: zrcolagui.cpp:237 msgid "Composed Text" msgstr "Sestavljeno besedilo" -#: zrcolagui.cpp:251 +#: zrcolagui.cpp:257 msgid "Composed Unicode Dump" msgstr "Unicode sestavljenega" -#: zrcolagui.h:76 MSIBuild/En.Win32.Release.Feature-2.idtx:4 +#: zrcolagui.h:77 MSIBuild/En.Win32.Release.Feature-2.idtx:4 #: MSIBuild/En.Win32.Release.Shortcut-2.idtx:4 #: MSIBuild/En.x64.Release.Feature-2.idtx:4 #: MSIBuild/En.x64.Release.Shortcut-2.idtx:4 diff --git a/ZRCola/zrcolafrm.cpp b/ZRCola/zrcolafrm.cpp index 1768625..0814990 100644 --- a/ZRCola/zrcolafrm.cpp +++ b/ZRCola/zrcolafrm.cpp @@ -25,28 +25,31 @@ ////////////////////////////////////////////////////////////////////////// wxBEGIN_EVENT_TABLE(wxZRColaFrame, wxZRColaFrameBase) - EVT_UPDATE_UI (wxID_AUTOSTART , wxZRColaFrame::OnAutostartUpdate ) - EVT_MENU (wxID_AUTOSTART , wxZRColaFrame::OnAutostart ) - EVT_MENU (wxID_EXIT , wxZRColaFrame::OnExit ) + EVT_UPDATE_UI (wxID_AUTOSTART , wxZRColaFrame::OnAutostartUpdate ) + EVT_MENU (wxID_AUTOSTART , wxZRColaFrame::OnAutostart ) + EVT_MENU (wxID_EXIT , wxZRColaFrame::OnExit ) - EVT_UPDATE_UI_RANGE(wxID_CUT, wxID_CLEAR , wxZRColaFrame::OnForwardEventUpdate ) - EVT_MENU_RANGE (wxID_CUT, wxID_CLEAR , wxZRColaFrame::OnForwardEvent ) - EVT_UPDATE_UI (wxID_SELECTALL , wxZRColaFrame::OnForwardEventUpdate ) - EVT_MENU (wxID_SELECTALL , wxZRColaFrame::OnForwardEvent ) + EVT_UPDATE_UI_RANGE(wxID_CUT, wxID_CLEAR , wxZRColaFrame::OnForwardEventUpdate ) + EVT_MENU_RANGE (wxID_CUT, wxID_CLEAR , wxZRColaFrame::OnForwardEvent ) + EVT_UPDATE_UI (wxID_SELECTALL , wxZRColaFrame::OnForwardEventUpdate ) + EVT_MENU (wxID_SELECTALL , wxZRColaFrame::OnForwardEvent ) - EVT_UPDATE_UI_RANGE(wxID_SEND_COMPOSED, wxID_SEND_ABORT , wxZRColaFrame::OnSendUpdate ) - EVT_MENU (wxID_SEND_COMPOSED , wxZRColaFrame::OnSendComposed ) - EVT_MENU (wxID_SEND_DECOMPOSED , wxZRColaFrame::OnSendDecomposed ) - EVT_MENU (wxID_SEND_ABORT , wxZRColaFrame::OnSendAbort ) + EVT_UPDATE_UI_RANGE(wxID_SEND_COMPOSED, wxID_SEND_ABORT , wxZRColaFrame::OnSendUpdate ) + EVT_MENU (wxID_SEND_COMPOSED , wxZRColaFrame::OnSendComposed ) + EVT_MENU (wxID_SEND_DECOMPOSED , wxZRColaFrame::OnSendDecomposed ) + EVT_MENU (wxID_SEND_ABORT , wxZRColaFrame::OnSendAbort ) - EVT_UPDATE_UI_RANGE(wxID_DECOMP_LANGUAGE_START, wxID_DECOMP_LANGUAGE_END, wxZRColaFrame::OnDecomposedLanguageUpdate) - EVT_MENU_RANGE (wxID_DECOMP_LANGUAGE_START, wxID_DECOMP_LANGUAGE_END, wxZRColaFrame::OnDecomposedLanguage ) + EVT_UPDATE_UI (wxID_DECOMP_LANG_AUTO , wxZRColaFrame::OnDecomposedLanguageAutoUpdate) + EVT_MENU (wxID_DECOMP_LANG_AUTO , wxZRColaFrame::OnDecomposedLanguageAuto ) + EVT_UPDATE_UI_RANGE(wxID_DECOMP_LANGUAGE_START, wxID_DECOMP_LANGUAGE_END, wxZRColaFrame::OnDecomposedLanguageUpdate ) + EVT_MENU_RANGE (wxID_DECOMP_LANGUAGE_START, wxID_DECOMP_LANGUAGE_END, wxZRColaFrame::OnDecomposedLanguage ) - EVT_MENU (wxID_ABOUT , wxZRColaFrame::OnAbout ) + EVT_MENU (wxID_ABOUT , wxZRColaFrame::OnAbout ) wxEND_EVENT_TABLE() wxZRColaFrame::wxZRColaFrame() : + m_lang_auto(true), m_hWndSource(NULL), wxZRColaFrameBase(NULL) { @@ -70,7 +73,7 @@ wxZRColaFrame::wxZRColaFrame() : label(lang.name, lang.name_len), label_tran(wxGetTranslation(label)); if (i < wxID_DECOMP_LANGUAGE_END - wxID_DECOMP_LANGUAGE_START + 1) - m_menuDecompLanguage->Insert(i, wxID_DECOMP_LANGUAGE_START + i, label_tran, wxString::Format(_("Select %s language for decomposition"), (const wxStringCharType*)label_tran), wxITEM_RADIO); + m_menuDecompLanguage->AppendRadioItem(wxID_DECOMP_LANGUAGE_START + i, label_tran, wxString::Format(_("Select %s language for decomposition"), (const wxStringCharType*)label_tran)); m_toolDecompLanguage->Insert(label_tran, i); if (memcmp(m_lang, lang.id, sizeof(m_lang)) == 0) m_toolDecompLanguage->Select(i); @@ -84,11 +87,38 @@ wxZRColaFrame::wxZRColaFrame() : wxMessageBox(_("ZRCola keyboard shortcut Win+F5 could not be registered. Some functionality will not be available."), _("Warning"), wxOK | wxICON_WARNING); if (!RegisterHotKey(wxZRColaHKID_INVOKE_DECOMPOSE, wxMOD_WIN, VK_F6)) wxMessageBox(_("ZRCola keyboard shortcut Win+F6 could not be registered. Some functionality will not be available."), _("Warning"), wxOK | wxICON_WARNING); + +#if defined(__WXMSW__) + // Register notification sink for language detection. + m_ulRefCount = 1; + m_tfSource = NULL; + ITfInputProcessorProfiles *pProfiles; + HRESULT hr = CoCreateInstance(CLSID_TF_InputProcessorProfiles, NULL, CLSCTX_INPROC_SERVER, IID_ITfInputProcessorProfiles, (LPVOID*)&pProfiles); + if(SUCCEEDED(hr)) { + hr = pProfiles->QueryInterface(IID_ITfSource, (LPVOID*)&m_tfSource); + if(SUCCEEDED(hr)) { + hr = m_tfSource->AdviseSink(IID_ITfLanguageProfileNotifySink, (ITfLanguageProfileNotifySink*)this, &m_dwCookie); + if (FAILED(hr) || m_dwCookie == -1) { + m_tfSource->Release(); + m_tfSource = NULL; + } + } + + pProfiles->Release(); + } +#endif } wxZRColaFrame::~wxZRColaFrame() { +#if defined(__WXMSW__) + if (m_tfSource) { + m_tfSource->UnadviseSink(m_dwCookie); + m_tfSource->Release(); + } +#endif + // Unregister global hotkey(s). UnregisterHotKey(wxZRColaHKID_INVOKE_DECOMPOSE); UnregisterHotKey(wxZRColaHKID_INVOKE_COMPOSE); @@ -207,6 +237,32 @@ void wxZRColaFrame::OnSendAbort(wxCommandEvent& event) } +void wxZRColaFrame::OnDecomposedLanguageAutoUpdate(wxUpdateUIEvent& event) +{ +#if defined(__WXMSW__) + event.Check(m_lang_auto); +#else + event.Enable(false); +#endif +} + + +void wxZRColaFrame::OnDecomposedLanguageAuto(wxCommandEvent& event) +{ + // Toggle auto language flag. + m_lang_auto = !m_lang_auto; + + if (m_lang_auto) { +#if defined(__WXMSW__) + // Set keyboard language. + HKL hkl = ::GetKeyboardLayout(0); + ZRCola::LangConvert(LOWORD(hkl), m_lang); + UpdateDecomposedLanguage(); +#endif + } +} + + void wxZRColaFrame::OnDecomposedLanguageUpdate(wxUpdateUIEvent& event) { ZRColaApp *app = ((ZRColaApp*)wxTheApp); @@ -228,6 +284,7 @@ void wxZRColaFrame::OnDecomposedLanguage(wxCommandEvent& event) // Notify composed text something changed and should re-decompose. wxCommandEvent event2(wxEVT_COMMAND_TEXT_UPDATED); m_panel->m_composed->ProcessWindowEvent(event2); + m_lang_auto = false; } } @@ -244,6 +301,7 @@ void wxZRColaFrame::OnDecompLanguageChoice(wxCommandEvent& event) // Notify composed text something changed and should re-decompose. wxCommandEvent event2(wxEVT_COMMAND_TEXT_UPDATED); m_panel->m_composed->ProcessWindowEvent(event2); + m_lang_auto = false; } } @@ -254,6 +312,66 @@ void wxZRColaFrame::OnAbout(wxCommandEvent& event) } +#if defined(__WXMSW__) + +HRESULT STDMETHODCALLTYPE wxZRColaFrame::OnLanguageChange(LANGID langid, __RPC__out BOOL *pfAccept) +{ + if (pfAccept) *pfAccept = TRUE; + return S_OK; +} + + +HRESULT STDMETHODCALLTYPE wxZRColaFrame::OnLanguageChanged() +{ + if (m_lang_auto) { + // Set keyboard language. + HKL hkl = ::GetKeyboardLayout(0); + ZRCola::LangConvert(LOWORD(hkl), m_lang); + UpdateDecomposedLanguage(); + } + + return S_OK; +} + + +HRESULT STDMETHODCALLTYPE wxZRColaFrame::QueryInterface(REFIID riid, __RPC__deref_out void __RPC_FAR *__RPC_FAR *ppvObject) +{ + if (!ppvObject) + return E_INVALIDARG; + + if (riid == IID_IUnknown) + *ppvObject = static_cast(this); + else if (riid == IID_ITfLanguageProfileNotifySink) + *ppvObject = static_cast(this); + else { + *ppvObject = NULL; + return E_NOINTERFACE; + } + + AddRef(); + return NOERROR; +} + + +ULONG STDMETHODCALLTYPE wxZRColaFrame::AddRef() +{ + InterlockedIncrement(&m_ulRefCount); + return m_ulRefCount; +} + + +ULONG STDMETHODCALLTYPE wxZRColaFrame::Release() +{ + // Decrement the object's internal counter. + ULONG ulRefCount = InterlockedDecrement(&m_ulRefCount); + if (m_ulRefCount == 0) + delete this; + return ulRefCount; +} + +#endif + + void wxZRColaFrame::DoSend(const wxString& str) { // Prepare the INPUT table. @@ -288,6 +406,22 @@ void wxZRColaFrame::DoSend(const wxString& str) } +void wxZRColaFrame::UpdateDecomposedLanguage() +{ + ZRColaApp *app = ((ZRColaApp*)wxTheApp); + + // Find language on the language list. + ZRCola::language_db::language *l = new ZRCola::language_db::language; + memcpy(l->id, m_lang, sizeof(l->id)); + l->name_len = 0; + ZRCola::language_db::indexLang::size_type start, end; + m_toolDecompLanguage->SetSelection(app->m_lang_db.idxLng.find(*l, start, end) ? start : -1); + delete l; +} + + +#ifdef __WXMSW__ + WXLRESULT wxZRColaFrame::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) { if (message == WM_HOTKEY) { @@ -334,6 +468,8 @@ WXLRESULT wxZRColaFrame::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM return wxZRColaFrameBase::MSWWindowProc(message, wParam, lParam); } +#endif + ////////////////////////////////////////////////////////////////////////// // wxPersistentZRColaFrame @@ -349,7 +485,8 @@ void wxPersistentZRColaFrame::Save() const const wxZRColaFrame * const wnd = static_cast(GetWindow()); wxPersistentZRColaComposerPanel(wnd->m_panel).Save(); - SaveValue(wxT("lang"), wxString::FromAscii(wnd->m_lang, sizeof(wnd->m_lang))); + SaveValue(wxT("langAuto"), wnd->m_lang_auto); + SaveValue(wxT("lang" ), wxString::FromAscii(wnd->m_lang, sizeof(wnd->m_lang))); wxPersistentTLW::Save(); } @@ -362,24 +499,24 @@ bool wxPersistentZRColaFrame::Restore() ZRColaApp *app = ((ZRColaApp*)wxTheApp); wxString lang; - if (RestoreValue(wxT("lang"), &lang) && lang.Length() == 3) { - memcpy(wnd->m_lang, (const char*)lang.c_str(), sizeof(wnd->m_lang)); - ZRCola::language_db::language *lang = new ZRCola::language_db::language; - memcpy(lang->id, wnd->m_lang, sizeof(lang->id)); - lang->name_len = 0; - ZRCola::language_db::indexLang::size_type start, end; - wnd->m_toolDecompLanguage->SetSelection(app->m_lang_db.idxLng.find(*lang, start, end) ? start : -1); - delete lang; - } else { - if (!app->m_lang_db.idxLng.empty()) { - const ZRCola::language_db::language &lang = app->m_lang_db.idxLng[0]; - memcpy(wnd->m_lang, lang.id, sizeof(wnd->m_lang)); - wnd->m_toolDecompLanguage->Select(0); - } else { - memcpy(wnd->m_lang, ZRCOLA_LANG_VOID, sizeof(wnd->m_lang)); - } - } + // Restore automatic language detection setting first. + RestoreValue(wxT("langAuto"), &(wnd->m_lang_auto)); + if (wnd->m_lang_auto) { +#if defined(__WXMSW__) + // Set keyboard language. + HKL hkl = ::GetKeyboardLayout(0); + ZRCola::LangConvert(LOWORD(hkl), wnd->m_lang); +#endif + } else if (RestoreValue(wxT("lang"), &lang) && lang.Length() == 3) { + // The language was read from configuration. + memcpy(wnd->m_lang, (const char*)lang.c_str(), sizeof(wnd->m_lang)); + } else if (!app->m_lang_db.idxLng.empty()) { + const ZRCola::language_db::language &lang = app->m_lang_db.idxLng[0]; + memcpy(wnd->m_lang, lang.id, sizeof(wnd->m_lang)); + } else + memcpy(wnd->m_lang, ZRCOLA_LANG_VOID, sizeof(wnd->m_lang)); + wnd->UpdateDecomposedLanguage(); wxPersistentZRColaComposerPanel(wnd->m_panel).Restore(); diff --git a/ZRCola/zrcolafrm.h b/ZRCola/zrcolafrm.h index cc3af2c..0aba720 100644 --- a/ZRCola/zrcolafrm.h +++ b/ZRCola/zrcolafrm.h @@ -29,6 +29,9 @@ class wxZRColaFrame; #include "zrcolagui.h" #include #include +#if defined(__WXMSW__) +#include +#endif /// @@ -41,7 +44,11 @@ class wxZRColaFrame; /// /// ZRCola main frame /// -class wxZRColaFrame : public wxZRColaFrameBase +class wxZRColaFrame : + public wxZRColaFrameBase +#if defined(__WXMSW__) + , protected ITfLanguageProfileNotifySink +#endif { public: enum @@ -53,6 +60,9 @@ public: wxZRColaFrame(); virtual ~wxZRColaFrame(); + friend class wxPersistentZRColaFrame; + friend class wxZRColaComposerPanel; + protected: void OnAutostartUpdate(wxUpdateUIEvent& event); void OnAutostart(wxCommandEvent& event); @@ -63,22 +73,41 @@ protected: void OnSendComposed(wxCommandEvent& event); void OnSendDecomposed(wxCommandEvent& event); void OnSendAbort(wxCommandEvent& event); + void OnDecomposedLanguageAutoUpdate(wxUpdateUIEvent& event); + void OnDecomposedLanguageAuto(wxCommandEvent& event); void OnDecomposedLanguageUpdate(wxUpdateUIEvent& event); void OnDecomposedLanguage(wxCommandEvent& event); virtual void OnDecompLanguageChoice(wxCommandEvent& event); void OnAbout(wxCommandEvent& event); wxDECLARE_EVENT_TABLE(); - friend class wxPersistentZRColaFrame; - friend class wxZRColaComposerPanel; +protected: +#if defined(__WXMSW__) + ITfSource *m_tfSource; ///< Text Services install sink helper + DWORD m_dwCookie; ///< Text Services installed sink cookie + + // ITfLanguageProfileNotifySink implementation + virtual HRESULT STDMETHODCALLTYPE OnLanguageChange(LANGID langid, __RPC__out BOOL *pfAccept); + virtual HRESULT STDMETHODCALLTYPE OnLanguageChanged(); + + // IUnknown implementation + virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, __RPC__deref_out void __RPC_FAR *__RPC_FAR *ppvObject); + virtual ULONG STDMETHODCALLTYPE AddRef(); + virtual ULONG STDMETHODCALLTYPE Release(); + ULONG m_ulRefCount; ///< COM object reference count +#endif private: void DoSend(const wxString& str); + void UpdateDecomposedLanguage(); protected: +#ifdef __WXMSW__ virtual WXLRESULT MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam); +#endif protected: + bool m_lang_auto; ///< Automatic language selection according to keyboard layout ZRCola::langid_t m_lang; ///< Language for decomposing WXHWND m_hWndSource; ///< handle of the active window, when the ZRCola hotkey was pressed }; diff --git a/ZRCola/zrcolagui.cpp b/ZRCola/zrcolagui.cpp index dbfcada..adb8950 100644 --- a/ZRCola/zrcolagui.cpp +++ b/ZRCola/zrcolagui.cpp @@ -105,6 +105,12 @@ wxZRColaFrameBase::wxZRColaFrameBase( wxWindow* parent, wxWindowID id, const wxS m_menuDecompLanguage = new wxMenu(); wxMenuItem* m_menuDecompLanguageItem = new wxMenuItem( m_menuEdit, wxID_ANY, _("&Language"), wxEmptyString, wxITEM_NORMAL, m_menuDecompLanguage ); + wxMenuItem* m_menuDecompLanguageAuto; + m_menuDecompLanguageAuto = new wxMenuItem( m_menuDecompLanguage, wxID_DECOMP_LANG_AUTO, wxString( _("&Automatic") ) , _("Set language according to keyboard layout automatically"), wxITEM_CHECK ); + m_menuDecompLanguage->Append( m_menuDecompLanguageAuto ); + + m_menuDecompLanguage->AppendSeparator(); + m_menuEdit->Append( m_menuDecompLanguageItem ); m_menubar->Append( m_menuEdit, _("&Edit") ); diff --git a/ZRCola/zrcolagui.h b/ZRCola/zrcolagui.h index e592c58..4ef271d 100644 --- a/ZRCola/zrcolagui.h +++ b/ZRCola/zrcolagui.h @@ -48,7 +48,8 @@ class wxZRColaFrameBase : public wxFrame wxID_AUTOSTART = 1000, wxID_SEND_COMPOSED, wxID_SEND_DECOMPOSED, - wxID_SEND_ABORT + wxID_SEND_ABORT, + wxID_DECOMP_LANG_AUTO }; wxMenuBar* m_menubar;