/* ----------------------------------------------------------
文件名称: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
}
}