美文网首页
Windows程序多语言支持

Windows程序多语言支持

作者: Virtualer | 来源:发表于2019-08-27 16:52 被阅读0次

    Windows程序多语言场景及其原理

    • 因个人项目接触面的问题,目前仅在Windows桌面应用开发中,使用MFC框架结合GDI+中使用过多语言。
    • 其本质其实是根据系统语言,拿到对应语言的参数,设置读取不同的配置文件中的字符串。

    多语言文件

    多语言文件就是一个ini文件(配置文件)。例如:

    • 中文简体
      语言文件例如是”SimplifiedChinese.ini“,那么其中就是这样的:
    IDS_LANGUAGE_TEXT1 = 中文字符串1
    IDS_LANGUAGE_TEXT2 = 中文字符串2
    IDS_LANGUAGE_TEXT3 = 中文字符串3
    
    • 英文
      语言文件为"English.ini":
    IDS_LANGUAGE_TEXT1 = English String 1
    IDS_LANGUAGE_TEXT2 = English String 2
    IDS_LANGUAGE_TEXT3 = English String 3
    
    • 日文
      ......日本电影看的少,没有学习日语环境,就不赘述了。

    使用流程

    - 获取当前系统语言

    主要使用GetUserDefaultUILanguage()这个API,用法是这样的:

    CString GetSysCurLangLanguage()
    {// 系统语言ID与相应字串映射
        WORD lcid_tmp = GetUserDefaultUILanguage();
        CString tmp(L"SimplifiedChinese");
        switch (lcid_tmp)
        {
        case 0x804:
            tmp = L"SimplifiedChinese";  //SimplifiedChinese
            break;
        case 0x411:
            tmp = L"Japanese";  //Japanese
            break;
        case 0x40C:
            tmp = L"French";    //French
            break;
        case 0x407:
            tmp = L"German";    //"German" ;
            break;
        case 0x410:
            tmp = L"Italian";   //"Italian" ;
            break;
        case 0x419:
            tmp = L"Russian";   //Russian
            break;
        case 0xC0A:
            tmp = L"Spanish";    //Spanish
            break;
        case 0x409:
            tmp = L"English";    //English
            break;
        case 0x7C04:
            tmp = L"TraditionalChinese"; //Traditional Chinese
            break;
        default:
            tmp = L"English";  //English
            break;
        }
        return tmp;
    }
    
    - 查找相应的语言文件

    根据上一步的tmp找到相应的语言文件tmp + _T(".ini")

    void GetLangFileName()
    {//获取当前系统的语言对应的配置文件
        CString strLangFileName;
        strLangFileName = GetSysCurLangLanguage();
    
        g_strLangPath = _T("Language\\") + strLangFileName + _T(".ini");
    
        g_bInitialized = TRUE;
    }
    
    - 加载文件

    找到了文件那么就简单了,只需要从文件种将想要的字符串用GetPrivateProfileString引入就可以了

    CString ExGetResString(CString strSection, CString strID)
    {
        if (g_bInitialized == FALSE)
        { // 如果没有初始化语言,那么先获取系统语言
            GetLangFileName();
        }
    
        CString strFileName = GetCurrentPath() + g_strLangPath;
    
        if (_waccess_s(strFileName, 0) == -1)
        { // 判断文件是否可以读写
            return _T("");
        }
        //判断语言文件是否从在,如果不存在使用默认英语,如果英语配置文件还是不从在,再显示Unknow
        if (PathFileExists(strFileName) == FALSE)
        {
            CString strLangFileName = _T("English");
            g_strLangPath = _T("Language\\") + strLangFileName + _T(".ini");
            strFileName = GetCurrentPath() + g_strLangPath;
        }
    
        CString szValue;
        DWORD dwSize = 1000;
        GetPrivateProfileString(strSection, strID, _T("Unknown"), szValue.GetBuffer(dwSize), dwSize, strFileName);
    
        szValue.ReleaseBuffer();
        szValue.Replace(_T("\\n"), _T("\n"));   //替换回换行符号
        szValue.Replace(_T("\\t"), _T("\t"));
    
        return szValue;
    }
    

    只需将待要引入的字符串所在的单元和ID填充给ExGetResString即可,参考GetPrivateProfileString函数。

    相关文章

      网友评论

          本文标题:Windows程序多语言支持

          本文链接:https://www.haomeiwen.com/subject/dqneectx.html