C#:多语言用户界面函数

/* ----------------------------------------------------------
文件名称:MUI.cs

作者:秦建辉

MSN:splashcn@msn.com
QQ:36748897

博客:http://blog.csdn.net/jhqin

开发环境:
    Visual Studio V2010
    .NET Framework 4 Client Profile

版本历史:    
    V1.2    2011年12月12日
            增加GetUserDefaultLocaleName和GetSystemDefaultLocaleName函数
 
    V1.1    2011年12月09日
            完善多语言用户界面函数          

    V1.0	2011年10月10日
			获取系统语言设置

参考资料:
    http://msdn.microsoft.com/en-us/library/windows/desktop/dd319074(v=vs.85).aspx
------------------------------------------------------------ */
using System;
using System.Runtime.InteropServices;
using System.Text;

namespace Splash.Kernel32
{
    public static class MUI
    {
        #region DllImport
        [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
        private static extern Int32 GetUserDefaultLocaleName([Out] StringBuilder lpLocaleName, Int32 cchLocaleName);

        [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
        private static extern Int32 GetSystemDefaultLocaleName([Out] StringBuilder lpLocaleName, Int32 cchLocaleName);

        [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
        private static extern UInt16 GetUserDefaultUILanguage();

        [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
        private static extern UInt16 GetSystemDefaultLangID();

        [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
        private static extern UInt16 GetUserDefaultLangID();

        [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
        private static extern UInt16 GetThreadUILanguage();

        [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
        private static extern UInt16 SetThreadUILanguage(UInt16 LangId);

        [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
        private static extern Boolean GetUserPreferredUILanguages(
            UInt32 dwFlags,
            out Int32 pulNumLanguages,
            [Out] Char[] pwszLanguagesBuffer,
            ref Int32 pcchLanguagesBuffer
            );

        [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
        private static extern Boolean GetSystemPreferredUILanguages(
            UInt32 dwFlags,
            out Int32 pulNumLanguages,
            [Out] Char[] pwszLanguagesBuffer,
            ref Int32 pcchLanguagesBuffer
            );

        [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
        private static extern Boolean GetProcessPreferredUILanguages(
            UInt32 dwFlags,
            out Int32 pulNumLanguages,
            [Out] Char[] pwszLanguagesBuffer,
            ref Int32 pcchLanguagesBuffer
            );

        [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
        private static extern Boolean GetThreadPreferredUILanguages(
            UInt32 dwFlags,
            out Int32 pulNumLanguages,
            [Out] Char[] pwszLanguagesBuffer,
            ref Int32 pcchLanguagesBuffer
            );

        [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
        private static extern Boolean SetProcessPreferredUILanguages(
            UInt32 dwFlags,
            String pwszLanguagesBuffer,
            out Int32 pulNumLanguages
            );

        [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
        private static extern Boolean SetThreadPreferredUILanguages(
            UInt32 dwFlags,
            String pwszLanguagesBuffer,
            out Int32 pulNumLanguages
            );
        #endregion

        #region LOCALNAME
        public const Int32 LOCALE_NAME_MAX_LENGTH = 85;
        #endregion

        #region MUI
        public const UInt32 MUI_LANGUAGE_ID = 0x4;          // Use traditional language ID convention
        public const UInt32 MUI_LANGUAGE_NAME = 0x8;        // Use ISO language (culture) name convention
        public const UInt32 MUI_MERGE_SYSTEM_FALLBACK = 0x10;   // GetThreadPreferredUILanguages merges in parent and base languages
        public const UInt32 MUI_MERGE_USER_FALLBACK = 0x20;     // GetThreadPreferredUILanguages merges in user preferred languages
        public const UInt32 MUI_UI_FALLBACK = MUI_MERGE_SYSTEM_FALLBACK | MUI_MERGE_USER_FALLBACK;
        public const UInt32 MUI_THREAD_LANGUAGES = 0x40;    // GetThreadPreferredUILanguages merges in user preferred languages
        public const UInt32 MUI_CONSOLE_FILTER = 0x100;     // SetThreadPreferredUILanguages takes on console specific behavior
        public const UInt32 MUI_COMPLEX_SCRIPT_FILTER = 0x200;  // SetThreadPreferredUILanguages takes on complex script specific behavior
        public const UInt32 MUI_RESET_FILTERS = 0x001;      // Reset MUI_CONSOLE_FILTER and MUI_COMPLEX_SCRIPT_FILTER
        public const UInt32 MUI_USER_PREFERRED_UI_LANGUAGES = 0x10; // GetFileMUIPath returns the MUI files for the languages in the fallback list
        public const UInt32 MUI_USE_INSTALLED_LANGUAGES = 0x20;     // GetFileMUIPath returns all the MUI files installed in the machine
        public const UInt32 MUI_USE_SEARCH_ALL_LANGUAGES = 0x40;    // GetFileMUIPath returns all the MUI files irrespective of whether language is installed
        public const UInt32 MUI_LANG_NEUTRAL_PE_FILE = 0x100;   // GetFileMUIPath returns target file with .mui extension
        public const UInt32 MUI_NON_LANG_NEUTRAL_FILE = 0x200;  // GetFileMUIPath returns target file with same name as source
        public const UInt32 MUI_MACHINE_LANGUAGE_SETTINGS = 0x400;
        public const UInt32 MUI_FILETYPE_NOT_LANGUAGE_NEUTRAL = 0x001;  // GetFileMUIInfo found a non-split resource file
        public const UInt32 MUI_FILETYPE_LANGUAGE_NEUTRAL_MAIN = 0x002; // GetFileMUIInfo found a LN main module resource file
        public const UInt32 MUI_FILETYPE_LANGUAGE_NEUTRAL_MUI = 0x004;  // GetFileMUIInfo found a LN MUI module resource file
        public const UInt32 MUI_QUERY_TYPE = 0x001;     // GetFileMUIInfo will look for the type of the resource file
        public const UInt32 MUI_QUERY_CHECKSUM = 0x002; // GetFileMUIInfo will look for the checksum of the resource file
        public const UInt32 MUI_QUERY_LANGUAGE_NAME = 0x004;    // GetFileMUIInfo will look for the culture of the resource file
        public const UInt32 MUI_QUERY_RESOURCE_TYPES = 0x008;   // GetFileMUIInfo will look for the resource types of the resource file
        public const UInt32 MUI_FILEINFO_VERSION = 0x001;   // Version of FILEMUIINFO structure used with GetFileMUIInfo

        public const UInt32 MUI_FULL_LANGUAGE = 0x01;
        public const UInt32 MUI_PARTIAL_LANGUAGE = 0x02;
        public const UInt32 MUI_LIP_LANGUAGE = 0x04;
        public const UInt32 MUI_LANGUAGE_INSTALLED = 0x20;
        public const UInt32 MUI_LANGUAGE_LICENSED = 0x40;
        #endregion

        #region LANGID
        /// <summary>
        /// 用户缺省界面语言
        /// </summary>
        public static UInt16 UserDefaultUILanguage
        {
            get
            {
                return GetUserDefaultUILanguage();
            }
        }

        /// <summary>
        /// 用户缺省语言
        /// </summary>
        public static UInt16 UserDefaultLangID
        {
            get
            {
                return GetUserDefaultLangID();
            }
        }

        /// <summary>
        /// 系统缺省语言
        /// </summary>
        public static UInt16 SystemDefaultLangID
        {
            get
            {
                return GetSystemDefaultLangID();
            }
        }

        /// <summary>
        /// 线程界面语言
        /// </summary>
        public static UInt16 ThreadUILanguage
        {
            get
            {
                return GetThreadUILanguage();
            }
            set
            {
                SetThreadUILanguage(value);
            }
        }
        #endregion

        #region UILanguages
        /// <summary>
        /// 获取用户缺省本地语言名称
        /// </summary>
        /// <returns>本地语言名称</returns>
        public static String GetUserDefaultLocaleName()
        {
            StringBuilder lpLocaleName = new StringBuilder(LOCALE_NAME_MAX_LENGTH);
            if (GetUserDefaultLocaleName(lpLocaleName, LOCALE_NAME_MAX_LENGTH) > 0)
            {
                return lpLocaleName.ToString();
            }

            return null;
        }

        /// <summary>
        /// 获取系统缺省本地语言名称
        /// </summary>
        /// <returns>本地语言名称</returns>
        public static String GetSystemDefaultLocaleName()
        {
            StringBuilder lpLocaleName = new StringBuilder(LOCALE_NAME_MAX_LENGTH);
            if (GetSystemDefaultLocaleName(lpLocaleName, LOCALE_NAME_MAX_LENGTH) > 0)
            {
                return lpLocaleName.ToString();
            }

            return null;
        }

        /// <summary>
        /// 获取用户偏好的界面语言
        /// </summary>
        /// <param name="dwFlags">
        ///     MUI_LANGUAGE_ID = 4:语言ID
        ///     MUI_LANGUAGE_NAME = 8:语言名称
        /// </param>
        /// <returns>偏好的语言集合</returns>
        public static String[] GetUserPreferredUILanguages(UInt32 dwFlags = MUI_LANGUAGE_NAME)
        {
            // 计算需要的空间大小
            Int32 NumLanguages;
            Int32 cchLanguagesBuffer = 0;
            if (GetUserPreferredUILanguages(dwFlags, out NumLanguages, null, ref cchLanguagesBuffer))
            {
                if (NumLanguages > 0)
                {   // 获取实际的数据
                    Char[] LanguagesBuffer = new Char[cchLanguagesBuffer];
                    GetUserPreferredUILanguages(dwFlags, out NumLanguages, LanguagesBuffer, ref cchLanguagesBuffer);

                    // 提取所有的语言
                    return new String(LanguagesBuffer).TrimEnd('\0').Split('\0');
                }
            }

            return null;
        }

        /// <summary>
        /// 获取系统偏好的界面语言
        /// </summary>
        /// <param name="dwFlags">
        ///     MUI_LANGUAGE_ID = 4:语言ID
        ///     MUI_LANGUAGE_NAME = 8:语言名称
        ///     MUI_MACHINE_LANGUAGE_SETTINGS = 0x400
        /// </param>
        /// <returns>偏好的语言集合</returns>
        public static String[] GetSystemPreferredUILanguages(UInt32 dwFlags = MUI_LANGUAGE_NAME)
        {
            // 计算需要的空间大小
            Int32 NumLanguages;
            Int32 cchLanguagesBuffer = 0;
            if (GetSystemPreferredUILanguages(dwFlags, out NumLanguages, null, ref cchLanguagesBuffer))
            {
                if (NumLanguages > 0)
                {   // 获取实际的数据
                    Char[] LanguagesBuffer = new Char[cchLanguagesBuffer];
                    GetSystemPreferredUILanguages(dwFlags, out NumLanguages, LanguagesBuffer, ref cchLanguagesBuffer);

                    // 提取所有的语言
                    return new String(LanguagesBuffer).TrimEnd('\0').Split('\0');
                }
            }

            return null;
        }

        /// <summary>
        /// 获取进程偏好的界面语言
        /// </summary>
        /// <param name="dwFlags">
        ///     MUI_LANGUAGE_ID = 4:语言ID
        ///     MUI_LANGUAGE_NAME = 8:语言名称
        /// </param>
        /// <returns>偏好的语言集合</returns>
        public static String[] GetProcessPreferredUILanguages(UInt32 dwFlags = MUI_LANGUAGE_NAME)
        {
            // 计算需要的空间大小
            Int32 NumLanguages;
            Int32 cchLanguagesBuffer = 0;
            if (GetProcessPreferredUILanguages(dwFlags, out NumLanguages, null, ref cchLanguagesBuffer))
            {
                if (NumLanguages > 0)
                {   // 获取实际的数据
                    Char[] LanguagesBuffer = new Char[cchLanguagesBuffer];
                    GetProcessPreferredUILanguages(dwFlags, out NumLanguages, LanguagesBuffer, ref cchLanguagesBuffer);

                    // 提取所有的语言                    
                    return new String(LanguagesBuffer).TrimEnd('\0').Split('\0');
                }
            }

            return null;
        }

        /// <summary>
        /// 获取线程偏好的界面语言
        /// </summary>
        /// <param name="dwFlags">
        ///     MUI_LANGUAGE_ID = 4:语言ID
        ///     MUI_LANGUAGE_NAME = 8:语言名称
        ///     MUI_MERGE_SYSTEM_FALLBACK = 0x10
        ///     MUI_MERGE_USER_FALLBACK = 0x20
        ///     MUI_UI_FALLBACK = MUI_MERGE_SYSTEM_FALLBACK | MUI_MERGE_USER_FALLBACK
        ///     MUI_THREAD_LANGUAGES = 0x40
        /// </param>
        /// <returns>偏好的语言集合</returns>
        public static String[] GetThreadPreferredUILanguages(UInt32 dwFlags = MUI_LANGUAGE_NAME)
        {
            // 计算需要的空间大小
            Int32 NumLanguages;
            Int32 cchLanguagesBuffer = 0;
            if (GetThreadPreferredUILanguages(dwFlags, out NumLanguages, null, ref cchLanguagesBuffer))
            {
                if (NumLanguages > 0)
                {   // 获取实际的数据
                    Char[] LanguagesBuffer = new Char[cchLanguagesBuffer];
                    GetThreadPreferredUILanguages(dwFlags, out NumLanguages, LanguagesBuffer, ref cchLanguagesBuffer);

                    // 提取所有的语言
                    return new String(LanguagesBuffer).TrimEnd('\0').Split('\0');
                }
            }

            return null;
        }

        /// <summary>
        /// 设置进程偏好的界面语言
        /// </summary>
        /// <param name="dwFlags">
        ///     MUI_LANGUAGE_ID = 4:语言ID
        ///     MUI_LANGUAGE_NAME = 8:语言名称
        /// </param>
        /// <param name="LanguagesCollection">偏好的语言集合</param>
        /// <param name="NumLanguages">成功设置的语言数目</param>
        /// <returns>
        ///     true:成功
        ///     false:失败
        /// </returns>
        /// <remarks>注意:最多设置5个语言</remarks>
        public static Boolean SetProcessPreferredUILanguages(UInt32 dwFlags, String[] LanguagesCollection, out Int32 NumLanguages)
        {
            String pwszLanguagesBuffer = null;
            if (LanguagesCollection != null)
            {
                StringBuilder MultiString = new StringBuilder();
                foreach (String s in LanguagesCollection)
                {
                    if (!String.IsNullOrEmpty(s))
                    {
                        MultiString.Append(s);
                        MultiString.Append('\0');
                    }
                }

                pwszLanguagesBuffer = MultiString.ToString();
            }

            return SetProcessPreferredUILanguages(dwFlags, pwszLanguagesBuffer, out NumLanguages);
        }

        /// <summary>
        /// 设置线程偏好的界面语言
        /// </summary>
        /// <param name="dwFlags">
        ///     MUI_LANGUAGE_ID = 4:语言ID
        ///     MUI_LANGUAGE_NAME = 8:语言名称
        ///     MUI_COMPLEX_SCRIPT_FILTER = 0x200
        ///     MUI_CONSOLE_FILTER = 0x100
        ///     MUI_RESET_FILTERS = 0x001
        /// </param>
        /// <param name="LanguagesCollection">偏好的语言集合</param>
        /// <param name="NumLanguages">成功设置的语言数目</param>
        /// <returns>
        ///     true:成功
        ///     false:失败
        /// </returns>
        /// <remarks>注意:最多设置5个语言</remarks>
        public static Boolean SetThreadPreferredUILanguages(UInt32 dwFlags, String[] LanguagesCollection, out Int32 NumLanguages)
        {
            String pwszLanguagesBuffer = null;
            if (LanguagesCollection != null)
            {
                StringBuilder MultiString = new StringBuilder();
                foreach (String s in LanguagesCollection)
                {
                    if (!String.IsNullOrEmpty(s))
                    {
                        MultiString.Append(s);
                        MultiString.Append('\0');
                    }
                }

                pwszLanguagesBuffer = MultiString.ToString();
            }

            return SetThreadPreferredUILanguages(dwFlags, pwszLanguagesBuffer, out NumLanguages);
        }
        #endregion
    }
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值