// MultiLangRibbon.cpp // // (c)1998-2025 Codejock Software, All Rights Reserved. // // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN // CONSENT OF CODEJOCK SOFTWARE. // // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A // SINGLE COMPUTER. // // CONTACT INFORMATION: // support@codejock.com // http://www.codejock.com // ///////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "MultiLangRibbon.h" #include #include "MainFrm.h" #include "MultiLangRibbonDoc.h" #include "WorkspaceView.h" #ifdef _DEBUG # define new DEBUG_NEW # undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CMultiLangRibbonApp BEGIN_MESSAGE_MAP(CMultiLangRibbonApp, CWinApp) //{{AFX_MSG_MAP(CMultiLangRibbonApp) ON_COMMAND(ID_APP_ABOUT, OnAppAbout) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSG_MAP // Standard file based document commands ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen) // Standard print setup command ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup) ON_COMMAND(ID_LANGUAGE_ENGLISH, OnLanguageEnglish) ON_COMMAND(ID_LANGUAGE_RUSSIAN, OnLanguageRussian) ON_COMMAND(ID_LANGUAGE_GERMAN, OnLanguageGerman) ON_COMMAND(ID_LANGUAGE_JAPANESE, OnLanguageJapanese) ON_COMMAND(ID_LANGUAGE_ARABIC, OnLanguageArabic) ON_UPDATE_COMMAND_UI(ID_LANGUAGE_ENGLISH, OnUpdateLanguageEnglish) ON_UPDATE_COMMAND_UI(ID_LANGUAGE_RUSSIAN, OnUpdateLanguageRussian) ON_UPDATE_COMMAND_UI(ID_LANGUAGE_GERMAN, OnUpdateLanguageGerman) ON_UPDATE_COMMAND_UI(ID_LANGUAGE_JAPANESE, OnUpdateLanguageJapanese) ON_UPDATE_COMMAND_UI(ID_LANGUAGE_ARABIC, OnUpdateLanguageArabic) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMultiLangRibbonApp construction CMultiLangRibbonApp::CMultiLangRibbonApp() { m_bIsWinNT = XTPSystemVersion()->IsWinNT4OrGreater(); m_bIsWin2000OrLater = XTPSystemVersion()->IsWin2KOrGreater(); } ///////////////////////////////////////////////////////////////////////////// // The one and only CMultiLangRibbonApp object CMultiLangRibbonApp theApp; // This identifier was generated to be statistically unique for your app. // You may change it if you prefer to choose a specific identifier. // {7559FD90-9B93-11CE-B0F0-00AA006C28B3} static const CLSID clsid = { 0x7559fd90, 0x9b93, 0x11ce, { 0xb0, 0xf0, 0x0, 0xaa, 0x0, 0x6c, 0x28, 0xb3 } }; #define LANGID_ENGLISH MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US) #define LANGID_GERMAN MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN) #define LANGID_JAPANESE MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT) #define LANGID_ARABIC MAKELANGID(LANG_ARABIC, SUBLANG_ARABIC_SAUDI_ARABIA) #define LANGID_RUSSIAN MAKELANGID(LANG_RUSSIAN, SUBLANG_DEFAULT) ///////////////////////////////////////////////////////////////////////////// // CMultiLangRibbonApp initialization BOOL CMultiLangRibbonApp::InitInstance() { AfxEnableControlContainer(); // Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need. #if _MSC_VER <= 1200 // MFC 6.0 or earlier # ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL # else Enable3dControlsStatic(); // Call this when linking to MFC statically # endif #endif // MFC 6.0 or earlier // Change the registry key under which our settings are stored. // TODO: You should modify this string to be something appropriate // such as the name of your company or organization. CString ver; ver.Format(_T("Codejock %s v%d.%d.%d"), _XTP_PACKAGE_NAME, _XTPLIB_VERSION_MAJOR, _XTPLIB_VERSION_MINOR, _XTPLIB_VERSION_REVISION); SetRegistryKey(ver); LoadStdProfileSettings(); // Load standard INI file options (including MRU) // Register the application's document templates. Document templates // serve as the connection between documents, frame windows and views. CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME, RUNTIME_CLASS(CMultiLangRibbonDoc), RUNTIME_CLASS(CMainFrame), // main SDI frame window RUNTIME_CLASS(CWorkspaceView)); pDocTemplate->SetContainerInfo(IDR_CNTR_INPLACE); AddDocTemplate(pDocTemplate); // Parse command line for standard shell commands, DDE, file open CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); // Dispatch commands specified on the command line if (!ProcessShellCommand(cmdInfo)) return FALSE; // The one and only window has been initialized, so show and update it. m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); #ifndef UNICODE ::MessageBox(m_pMainWnd->GetSafeHwnd(), _T("Compile the sample using UNICODE to see Japanese, Arabic and Russian ") _T("translations."), _T("Some Translations Not Available"), MB_ICONWARNING); #endif return TRUE; } ///////////////////////////////////////////////////////////////////////////// // CMultiLangRibbonApp message handlers void CMultiLangRibbonApp::OnAppAbout() { CAboutDlg aboutDlg; aboutDlg.SetAxialisCredits(); aboutDlg.DoModal(); } BOOL CMultiLangRibbonApp::SetLocale(LCID Locale, LPCTSTR szLocale, LPCTSTR szFileName, BOOL bIsRTL) { if (szFileName) { if (CXTPPropExchangeXMLNode::IsXMLSupported()) // Try to load from XML. Needs IE 4.0 // installed { CString strPath; VERIFY(::GetModuleFileName(AfxGetApp()->m_hInstance, strPath.GetBufferSetLength(_MAX_PATH), _MAX_PATH)); strPath.ReleaseBuffer(); int nIndex = strPath.ReverseFind(_T('\\')); if (nIndex > 0) strPath = strPath.Left(nIndex + 1); else strPath.Empty(); strPath = strPath + _T("Translations\\") + szFileName + _T(".xml"); if (!XTPResourceManager()->SetResourceManager(new CXTPResourceManagerXML(strPath))) return FALSE; } else { CString strPath; VERIFY(::GetModuleFileName(AfxGetApp()->m_hInstance, strPath.GetBufferSetLength(_MAX_PATH), _MAX_PATH)); strPath.ReleaseBuffer(); int nIndex = strPath.ReverseFind(_T('\\')); if (nIndex > 0) strPath = strPath.Left(nIndex + 1); else strPath.Empty(); strPath = strPath + _T("Translations\\") + szFileName + _T(".dll"); XTPResourceManager()->SetResourceManager(new CXTPResourceManager()); XTPResourceManager()->SetResourceFile(strPath); } } else { if (!XTPResourceManager()->SetResourceManager(new CXTPResourceManager())) return FALSE; } ::SetThreadLocale(MAKELCID(Locale, SORT_DEFAULT)); ::_tsetlocale(LC_ALL, szLocale); // m_curLanguage = Locale; // SetRTLLayout(bIsRTL); ReloadDefaultMenu(); return TRUE; } void CMultiLangRibbonApp::ReloadDefaultMenu() { CMainFrame* pMainFrame = DYNAMIC_DOWNCAST(CMainFrame, m_pMainWnd); if (pMainFrame) { pMainFrame->CreateRibbonBar(); } } void CMultiLangRibbonApp::OnLanguageEnglish() { if (::IsValidLocale(LANGID_ENGLISH, LCID_INSTALLED)) { SetLocale(LANGID_ENGLISH, _T("English.1252"), NULL, FALSE); CMainFrame* pMainFrame = DYNAMIC_DOWNCAST(CMainFrame, m_pMainWnd); if (pMainFrame) pMainFrame->SetRightToLeft(FALSE); } else { AfxMessageBox(_T("English language support is not installed on your operating system.")); } } void CMultiLangRibbonApp::OnLanguageRussian() { if (::IsValidLocale(LANGID_RUSSIAN, LCID_INSTALLED)) { SetLocale(LANGID_RUSSIAN, _T("Russian"), _T("MultiLangRibbon.ResourceRu"), FALSE); CMainFrame* pMainFrame = DYNAMIC_DOWNCAST(CMainFrame, m_pMainWnd); if (pMainFrame) pMainFrame->SetRightToLeft(FALSE); } else { AfxMessageBox(_T("Russian language support is not installed on your operating system.")); } } void CMultiLangRibbonApp::OnLanguageGerman() { if (::IsValidLocale(LANGID_GERMAN, LCID_INSTALLED)) { SetLocale(LANGID_GERMAN, _T("German.1252"), _T("MultiLangRibbon.ResourceDe"), FALSE); CMainFrame* pMainFrame = DYNAMIC_DOWNCAST(CMainFrame, m_pMainWnd); if (pMainFrame) pMainFrame->SetRightToLeft(FALSE); } else { AfxMessageBox(_T("German language support is not installed on your operating system.")); } } void CMultiLangRibbonApp::OnLanguageJapanese() { if (::IsValidLocale(LANGID_JAPANESE, LCID_INSTALLED)) { SetLocale(LANGID_JAPANESE, _T("Japanese.932"), _T("MultiLangRibbon.ResourceJa"), FALSE); CMainFrame* pMainFrame = DYNAMIC_DOWNCAST(CMainFrame, m_pMainWnd); if (pMainFrame) pMainFrame->SetRightToLeft(FALSE); } else { AfxMessageBox(_T("Japanese language support is not installed on your operating system.")); } } void CMultiLangRibbonApp::OnLanguageArabic() { if (::IsValidLocale(LANGID_ARABIC, LCID_INSTALLED)) { SetLocale(LANGID_ARABIC, _T("Arabic.1256"), _T("MultiLangRibbon.ResourceArSa"), TRUE); CMainFrame* pMainFrame = DYNAMIC_DOWNCAST(CMainFrame, m_pMainWnd); if (pMainFrame) pMainFrame->SetRightToLeft(); } else { AfxMessageBox(_T("Arabic language support is not installed on your operating system.")); } } void CMultiLangRibbonApp::OnUpdateLanguageEnglish(CCmdUI* pCmdUI) { } void CMultiLangRibbonApp::OnUpdateLanguageGerman(CCmdUI* pCmdUI) { } void CMultiLangRibbonApp::OnUpdateLanguageRussian(CCmdUI* pCmdUI) { pCmdUI->Enable(IsUnicodeAndLayoutSupported() || (GetSystemDefaultLangID() == 0x419)); } void CMultiLangRibbonApp::OnUpdateLanguageJapanese(CCmdUI* pCmdUI) { pCmdUI->Enable((IsUnicodeAndLayoutSupported() && m_bIsWinNT) || (GetSystemDefaultLangID() == 0x411)); } void CMultiLangRibbonApp::OnUpdateLanguageArabic(CCmdUI* pCmdUI) { pCmdUI->Enable((IsUnicodeAndLayoutSupported() && m_bIsWinNT) || (GetSystemDefaultLangID() == 0x401)); } BOOL CMultiLangRibbonApp::IsUnicodeAndLayoutSupported() { #ifdef _UNICODE return m_bIsWin2000OrLater; #else return FALSE; #endif }