MFC实现多语言版本

来源:https://www.cnblogs.com/qijicxl/p/3840157.html

 

如何使MFC程序界面支持多国语言?这次使用后给自己做一个总结。

我们使用vc6.0的版本来试验

 

1. 切换到资源视图,右键Dialog->Insert Copy

 

2. ok后,会出来一个语言的选项,这里可以根据需要选择语言

 

3. 点击ok后,出现一份copy,不过里面是英文的。这时,如果你源对话框中带中文的话在英文界面中就会显示乱码了。需要手动改为英文的。

注意:如果资源中有Neural语言,则不管启动时指定哪种语言,都只会显示Neural资源

①源对话框

② copy的对话框,手动修改成英文的就ok了。

    

 

4. 如何让程序显示正确的语言呢?

我这边是通过写到ini文件里面去,比对是哪种语言,然后显示为哪种语言的。

在InitInstance()函数里面添加判断。用到的函数有SetThreadUILanguage和SetThreadLocale,但SetThreadLocale不支持win7及以上版本,所以须做判断,是否为win7及以上版本,再决定用什么函数来设置相应的语言。

CString strValue,strCpyFile,strtemp,strLanguage;
    char itemVal[256];
    int len;
    GetModuleFileName(NULL,strValue.GetBuffer(MAX_PATH),MAX_PATH);
    strValue.ReleaseBuffer();
    len=strValue.ReverseFind('\\');
    strValue=strValue.Left(len);
    strtemp=strValue;
    strtemp += "\\TestDll\\copyfiles.ini";
    // 找到我写入的配置文件,copyfile.ini文件。
    ::GetPrivateProfileString("TestSequence","Language","",itemVal,256,strtemp);
        strtemp = itemVal;
    strLanguage = strtemp;
  // 这里区分了两种语言,我写入ini文件的是ENGLISH 和 CHINESE
    if("ENGLISH" == strLanguage)
    {
        //SetThreadUILanguage();
        if (IsWin7())
        {
            SetThreadUILanguage(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_UK));
        }else
        {
            SetThreadLocale(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_UK), SORT_DEFAULT));//若IDE为vc6,貌似此语句无效
        }
        
    }else
  {
        if (IsWin7())
        {
            SetThreadUILanguage(MAKELANGID(LANG_CHINESE, SUBLANG_ENGLISH_UK));
        }else
        {
            SetThreadLocale(MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_ENGLISH_UK), SORT_DEFAULT));//若IDE为vc6,貌似此语句无效
        }
    }

这里贴下IsWin7()函数的判断,其实是判断了win7及以上的版本。

bool IsWin7()  
{  
    OSVERSIONINFOEX osvi;  
    BOOL bOsVersionInfoEx;  
    
    ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));  
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);  
    bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO*) &osvi);  
    
    // win7的系统版本为NT6.1 
    if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT && osvi.dwMajorVersion >= 6 && osvi.dwMinorVersion >= 0)  
    {  
        return true;      
    }  
    else  
    {  
        return false;  
    }  
}

这里又有一个问题,SetThreadUILanguage该函数在vc6.0中不认识,在vs2008中是可以认识这个函数的,(vc6.0差不多是该被替换啦- -!)我们就采取动态获取的方式来操作。

typedef LANGID (WINAPI *FP_SetThreadUILanguage)(LANGID LangId);
LANGID SetThreadUILanguage(LANGID lcid)
{
    HMODULE hKernel32 = GetModuleHandle(_T("Kernel32.dll"));
    FARPROC pFn = GetProcAddress(hKernel32, "SetThreadUILanguage");
    
    FP_SetThreadUILanguage pSetThreadUILanguage = (FP_SetThreadUILanguage)pFn;

    if (pSetThreadUILanguage)
    {
        return pSetThreadUILanguage(lcid);
    }
    return 0;
}

5. 在设置切换语言的时候,可以设置一个combobox,点击哪个语言就进行语言切换,设置一个全局变量,然后PostMessage,关闭,在WM_ONCLOSE函数中再做一次打开操作。

 

大致就是这个过程。大家也可以自己发挥。

 

 

附:

在程序中的字符串修改为多语言的方法:

1、在StringTable中添加字符串对应的语言资源:字符串ID=IDS_TEST,Value="测试"

2、在使用的地方引用字符串资源:

CString str;
str.LoadStringW(IDS_STRING145);
AfxMessageBox(str);

3、右键StringTable -> 插入副本 -> 选择对应的国际化语言。

对该StringTable的所有项进行翻译后替代中文。

 

 

 

 

 

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MFC(Microsoft Foundation Class)多语言切换可以通过以下几种方法实现。 1. 使用资源文件:MFC支持使用不同的资源文件来存储不同语言的文本、图像等资源。首先,创建一个基本语言的资源文件(例如英文),然后创建其他语言的资源文件,并将其命名为相应的语言代码(例如中文为zh-CN)。接下来,在代码中通过加载对应的资源文件来实现语言切换。 2. 使用多语言库:使用第三方多语言库可以更方便地实现语言切换。这些库可以根据当前系统的语言设置自动加载对应的语言资源,并在界面上显示正确的文本。常见的多语言库包括GetText、Qt Linguist等。 3. 使用资源文件字符串表:在资源文件中创建一个字符串表,其中包含所有需要多语言切换的文本。然后,在代码中根据用户设置的语言代码来加载对应的字符串,并在界面上显示。 4. 动态加载语言资源:通过编写一段代码来动态加载语言资源,将对应语言的文本赋值给相应的控件,并刷新界面。这种方法需要提前准备好不同语言的文本资源,并通过代码控制切换。 无论使用哪种方法,都需要在代码中添加逻辑来切换语言,可以通过用户界面设置、系统语言设置或其他方式来确定使用哪种语言。在切换语言后,需要重新加载相应的语言资源,并刷新界面以显示新的语言。 ### 回答2: MFC语言切换实现方法主要有以下几种: 1. 使用资源文件:在MFC应用程序中,可以将不同语言的文本信息存储在不同的资源文件中,然后通过加载不同的资源文件来实现语言切换。每个资源文件都对应一种语言,通过读取不同的资源文件,可以获取相应语言的文本信息,并将其显示在界面上。 2. 使用国际化库:可以使用一些开源的国际化库,如gettext等,来实现MFC应用程序的多语言切换。这些库提供了一些函数和接口,可以根据当前的语言设置,从对应的语言文件中获取文本信息,并将其显示在界面上。 3. 手动切换语言:可以在代码中手动实现语言切换的逻辑。通过在程序中定义一些全局变量来表示当前的语言设置,然后根据不同的语言设置,从相应的语言文件中获取对应的文本信息,并将其显示在界面上。当需要切换语言时,可以通过用户的操作或者设置来改变当前的语言设置。 无论使用何种方法,都需要在应用程序的各个界面和对话框中统一使用资源文件或者函数来获取文本信息,从而实现整个应用程序的多语言切换。同时,还需要注意对齐文本的布局和调整控件的大小,以适应不同语言的文本长度和字符宽度的差异。 ### 回答3: MFC(Microsoft Foundation Classes)多语言切换可以通过以下几个步骤实现: 1. 提前准备好多语言的资源文件:对于每一种语言,创建对应的字符串表和对话框资源文件,并为每个控件提供相应的文字和提示信息。 2. 在MFC应用程序的初始化过程中,根据用户所选语言加载对应的资源文件。可以通过读取系统的语言设置或者用户自定义选择来确定加载哪种语言的资源文件。 3. 在应用程序的实例化和初始化完成之后,在每一个窗口的初始化过程中,调用相应的函数来切换语言。例如,可以使用 AfxSetResourceHandle 函数来设置当前语言的资源句柄。 4. 在对话框或窗口类中重写虚函数 OnIniDialog 或 OnInitInstance,在函数中调用对应的语言切换函数,例如 SetWindowText 或 SetDlgItemText 来更新窗口中控件的文本。 5. 如果需要切换界面语言而不需要重启应用程序,可以在对话框的响应事件中或者菜单项的点击事件中调用相应的语言切换函数。例如,可以使用 SetWindowText 或 SetDlgItemText 来更新当前对话框中控件的文本。 6. 使用资源编辑器,为每个对话框和控件设置唯一的资源ID。然后,在代码中使用相应的ID来获取和设置对应的文本。可以通过调用 GetDlgItemText 或 SetDlgItemText 函数来实现。 通过以上步骤,我们可以在MFC应用程序中实现语言切换,让用户能够根据自己的需求选择使用不同的语言界面。这样可以提高用户体验,使应用程序更具国际化和多元化特色。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值