现在的位置: 首页 > 综合 > 正文

How to change software UI language

2013年09月11日 ⁄ 综合 ⁄ 共 5599字 ⁄ 字号 评论关闭

    Recently,I mastered a method on how to change software UI language such as menu,button something like that. Here,I wirte something for you and share my code with you.If you like it.we can talk about it together and exchange our mind each other.OK?

   First of all,I will introduce to you abou Menu resource and how to use it to translate language.As all of you know,Menu resource play a important role in developing software,we must master it and then we will do something that we want to do.Maybe you can understand what I just have said.

   Using Editor context to open rc file and you will see something as following description:
    // Menu
    //

IDR_MAINFRAME MENU PRELOAD DISCARDABLE
BEGIN
    POPUP "文件(&F)"
    BEGIN
        MENUITEM "新建(&N)/tCtrl+N",            ID_FILE_NEW
        MENUITEM "打开(&O).../tCtrl+O",         ID_FILE_OPEN
        MENUITEM "保存(&S)/tCtrl+S",            ID_FILE_SAVE
        MENUITEM "另存为(&A)...",               ID_FILE_SAVE_AS
        MENUITEM SEPARATOR
        MENUITEM "打印(&P).../tCtrl+P",         ID_FILE_PRINT
        MENUITEM "打印预览(&V)",                ID_FILE_PRINT_PREVIEW
        MENUITEM "打印设置(&R)...",             ID_FILE_PRINT_SETUP
        MENUITEM SEPARATOR
        MENUITEM "最近文件",                    ID_FILE_MRU_FILE1, GRAYED
        MENUITEM SEPARATOR
        MENUITEM "退出(&X)",                    ID_APP_EXIT
    END
    POPUP "编辑(&E)"
    BEGIN
        MENUITEM "撤消(&U)/tCtrl+Z",            ID_EDIT_UNDO
        MENUITEM SEPARATOR
        MENUITEM "剪切(&T)/tCtrl+X",            ID_EDIT_CUT
        MENUITEM "复制(&C)/tCtrl+C",            ID_EDIT_COPY
        MENUITEM "粘贴(&P)/tCtrl+V",            ID_EDIT_PASTE
    END
    POPUP "查看(&V)"
    BEGIN
        MENUITEM "工具栏(&T)",                  ID_VIEW_TOOLBAR
        MENUITEM "状态栏(&S)",                  ID_VIEW_STATUS_BAR
        MENUITEM "语言",                        ID_LANGUAGEMENU
    END
    POPUP "帮助(&H)"
    BEGIN
        MENUITEM "关于 MenuBGround(&A)...",     ID_APP_ABOUT
    END
END

Translate them like this:

IDR_ENGLISH MENU DISCARDABLE
BEGIN
    POPUP "file(&F)"
    BEGIN
        MENUITEM "new(&N)/tCtrl+N",             ID_FILE_NEW
        MENUITEM "open(&O).../tCtrl+O",         ID_FILE_OPEN
        MENUITEM "save(&S)/tCtrl+S",            ID_FILE_SAVE
        MENUITEM "save as(&A)...",              ID_FILE_SAVE_AS
        MENUITEM SEPARATOR
        MENUITEM "print(&P).../tCtrl+P",        ID_FILE_PRINT
        MENUITEM "printview(&V)",               ID_FILE_PRINT_PREVIEW
        MENUITEM "printset(&R)...",             ID_FILE_PRINT_SETUP
        MENUITEM SEPARATOR
        MENUITEM "Recent file",                 ID_FILE_MRU_FILE1, GRAYED
        MENUITEM SEPARATOR
        MENUITEM "exit(&X)",                    ID_APP_EXIT
    END
    POPUP "edit(&E)"
    BEGIN
        MENUITEM "undo(&U)/tCtrl+Z",            ID_EDIT_UNDO
        MENUITEM SEPARATOR
        MENUITEM "cut(&T)/tCtrl+X",             ID_EDIT_CUT
        MENUITEM "copy(&C)/tCtrl+C",            ID_EDIT_COPY
        MENUITEM "paste(&P)/tCtrl+V",           ID_EDIT_PASTE
    END
    POPUP "look(&V)"
    BEGIN
        MENUITEM "toolbar(&T)",                 ID_VIEW_TOOLBAR
        MENUITEM "statusbar(&S)",               ID_VIEW_STATUS_BAR
        MENUITEM "language",                    ID_LANGUAGEMENU
    END
    POPUP "help(&H)"
    BEGIN
        MENUITEM "about MenuBGround(&A)...",    ID_APP_ABOUT
    END
END

And then,save them.you just completed the step one.The next task is about how to associate with software UI.

  You should return resource manager and open menu item ,you will see another menu IDR_ENGLISH.Add the same ID for IDR_ENGLISH and IDR_MAINFRAME like the following picture:

   The two menus:
    Chinese:

           

   English:

    

  Pay attention to language and "语言",you must use the same ID. and then you will  response menu function such as language or "语言" as following code description:

 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
  return -1;
 
 if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
  | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
  !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
 {
  TRACE0("Failed to create toolbar/n");
  return -1;      // fail to create
 }

 if (!m_wndStatusBar.Create(this) ||
  !m_wndStatusBar.SetIndicators(indicators,
    sizeof(indicators)/sizeof(UINT)))
 {
  TRACE0("Failed to create status bar/n");
  return -1;      // fail to create
 }

 // TODO: Delete these three lines if you don't want the toolbar to
 //  be dockable
 m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
 EnableDocking(CBRS_ALIGN_ANY);
 DockControlBar(&m_wndToolBar);

 m_English.LoadMenu("IDR_ENGLISH");          //加入英文菜单资源
 HMENU hMenu = ::GetMenu(this->m_hWnd);    //获得中文菜单资源
 m_Chinese.Attach(hMenu);                  //保存中文菜单资源

 //about cmenu bar background color information

 return 0;
}

Respose function for translation language like this:

xxx.h:

  class CMainFrame : public CFrameWnd
{
 
protected: // create from serialization only
 CMainFrame();
 DECLARE_DYNCREATE(CMainFrame)

// Attributes
public:

// Operations
public:

// Overrides
 // ClassWizard generated virtual function overrides
 //{{AFX_VIRTUAL(CMainFrame)
 virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
 //}}AFX_VIRTUAL

// Implementation
public:
 virtual ~CMainFrame();
#ifdef _DEBUG
 virtual void AssertValid() const;
 virtual void Dump(CDumpContext& dc) const;
#endif

protected:  // control bar embedded members
 CStatusBar  m_wndStatusBar;
 CToolBar    m_wndToolBar;
 CBrush m_wndBrush;
 BOOL IsEnglish;
 CMenu m_Chinese;
 CMenu m_English;

// Generated message map functions
protected:
 //{{AFX_MSG(CMainFrame)
 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
 afx_msg void OnLanguagemenu();
 //}}AFX_MSG
 DECLARE_MESSAGE_MAP()
};

 

xxx.cpp:

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
 //{{AFX_MSG_MAP(CMainFrame)
    ON_WM_CREATE()
    ON_COMMAND(ID_LANGUAGEMENU, OnLanguagemenu)
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

 

   void CMainFrame::OnLanguagemenu()
{
 // TODO: Add your command handler code here
 IsEnglish = !IsEnglish;
 if (IsEnglish)
 {
  this->SetMenu(&m_English);
 }
 else
 {
  this->SetMenu(&m_Chinese);
 }
}

In the end.you have finished it.

 

 

 

抱歉!评论已关闭.