MFC 国际化(多国语言)

1:

原文:

http://www.cnblogs.com/xianyunhe/archive/2011/09/02/2163842.html

 

目前很多软件都是要出口到多个国家,因此,为软件提供多国语言支持就成为了一个基本条件。为软件提供多国语言的支持的具体实现方法有很多,但基本原理都差不多,就是实现代码和语言包的独立,代码根据设定的语言选择语言包。

其中,MFC的资源文件就提供了对多国不同语言的支持功能,如果使用MFC开发,直接用资源文件自带的多国语言支持,可以省去不少的麻烦。

下面就介绍给MFC程序添加中英文的支持,开发环境为VS2010。

1.  新建工程

新建了一个对话框工程,工程名称为MultiLanguages,默认语言选择是“中文”。

2.  添加多国语言的资源

在创建工程后,工程会添加默认的资源,如主对话框,都是“中文”资源。现在我们需要添加相应的英文的资源文件。

为主窗口IDD_MULTILANGUAGES添加英文资源的方法为:

(1)       打开Resource View窗口。

(2)       右键IDD_MULTILANGUAGES,点击弹出菜单中的“Insert Copy”菜单,如下图所示。

(3)       弹出窗口资源复制语言选择窗口,选择语言为“英语(美国)”,如下图所示。

(4)       点击OK,即完成英文版对话框的添加。完成添加后,IDD_MULTILANGUAGES就对应于两个不同语言版本的对话框了,如下图所示。

使用同样的方法,也可以为其他资源添加多国语言版本的支持。主要需要多国版本需要支持的有对话框、菜单和字符串。

添加多国语言的资源后,要对这些资源进行不同语言的定制,根据资源对应的语言,设置对话框和控件的标题等。

3.  Locale

程序的语言选择跟操作系统语言(System Locale)、用户设置语言(User Locale)和线程语言(Thread Locale)有关。程序运行时,是根据线程语言来选择资源的。如果程序中未对线程语言进行设置,线程语言默认采用用户设置语言。设置线程语言的函数是SetThreadLocale。

设置线程语言为“中文”的代码如下:

SetThreadLocale(MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_DEFAULT));

 

设置线程语言为“英语(美国)”的代码如下:

SetThreadLocale(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT));

 

设置线程语言要在对话框创建之前,否则无法更改对话框的资源。可以在CMultiLanguagesApp::InitInstance函数中的对话框初始化之前添加线程语言设置,分别设置为中文和英文语言,就可以查看到对话框界面的不同。

4.  字符串处理

程序的多国语言的支持,不仅包括界面的多国语言支持,也要包括各类字符串的多国语言支持,如弹出的提示信息。因此,在弹出提示信息时,也要为提示信息创建多个语言版本,并根据当前线程的语言来选择不同的提示信息。

例子:实现不同语言版本中按钮的点击次数的统计。

(1)       在String Table中分别添加中英文的IDS_STRING_SAMPLE资源,内容如下表所示。

中文

这个一个中文提示信息。\n点击次数:%d。

英文

This is a prompt message in English.\nClick Times:%d.

 

(2)       在主窗口控件中添加一个控件Button1,控件的中文名为“提示”,英文名称为“Prompt”。为该控件添加一个左键单击消息响应函数,该函数的内容如下:

void CMultiLanguagesDlg::OnBnClickedButton1()

{

         // TODO: Add your control notification handler code here

         static int s_iClickTime = 0;

         s_iClickTime++;

         CString strPrompt = _T("");

         CString strFormat = _T("");

         strFormat.LoadString(IDS_STRING_SAMPLE);

         strPrompt.Format(strFormat, s_iClickTime);

         AfxMessageBox(strPrompt);

(3)       分别在CMultiLanguagesApp::InitInstance添加设置线程语言为中文和英文的代码,然后多次点击按钮进行测试。

中文版本弹出的提示框如下图所示:

英文版本弹出的提示框如下图所示:

5.  语言切换

窗口在初始化时候就导入了资源文件,在通过SetThreadLocale更换了线程语言后,窗口的资源并不会更改,必须要通过代码来重新装载资源。因为窗口中存在多种与线程语言相关的资源,重新启动软件一种叫快捷的更新语言环境的方法。

例:通过菜单来进行语言切换,切换语言后重启软件。

(1)    为程序添加中英文菜单选项ID_LANGUAGE_SWITCH,并为该菜单添加消息响应函数,其中,m_bRestartFlag使用判断关闭窗口时是否需要重启程序的标识。代码如下。

void CMultiLanguagesDlg::OnLanguageSwitch()

{

         // TODO: Add your command handler code here

         // 读取当前线程的语言,并根据当前线程语言进行语言切换

         LCID lcidNew = GetThreadLocale();

         if (LANG_ENGLISH == PRIMARYLANGID(LANGIDFROMLCID(lcidNew)))

         {

                   lcidNew = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_DEFAULT);

         }

         else

         {

                   lcidNew = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT);

         }

 

         // 把语言设置写入配置文件

         CFile file;

         file.Open(_T("Language.ini"), CFile::modeWrite | CFile::modeCreate | CFile::typeBinary);

         file.Write(&lcidNew, sizeof(lcidNew));

         file.Close();

 

         // 关闭窗口

         m_bRestartFlag = TRUE;

         PostMessage(WM_CLOSE, 0, 0);

}

 

(2)    在关闭窗口时,重启动该程序。即在窗口响应WM_CLOSE时,重启程序。代码如下:

void CMultiLanguagesDlg::OnClose()

{

         // TODO: Add your message handler code here and/or call default

         // 判断是否需要重新启动窗口

         if (m_bRestartFlag)

         {

                   CString strFileName = _T("");

                   GetModuleFileName(NULL, strFileName.GetBuffer(MAX_PATH), MAX_PATH);

                   ShellExecute(NULL, _T(""), strFileName, NULL, NULL, SW_SHOWNORMAL);

                   strFileName.ReleaseBuffer();

         }

 

         CDialogEx::OnClose();

}

 

(3)    在启动软件时,根据当前软件的配置文件中语言来设置线程语言,即在CMultiLanguagesApp::InitInstance函数中创建对话框之前设置线程语言,代码如下:

         // 判断你是否存在配置文件,如果存在,从配置文件中读取语言设置

         CString strFileName = _T("Language.ini");

         if (PathFileExists(strFileName))

         {

                   LCID lcidThread = 0;

                   CFile file;

                   file.Open(strFileName, CFile::modeRead | CFile::typeBinary);

                   file.Read(&lcidThread, sizeof(LCID));

                   file.Close();

                   SetThreadLocale(lcidThread);

         }

 

(4)       通过点击菜单来测试软件的语言切换。

6. MessageBox的问题

由于MessageBox中的按钮的语言是跟操作系统相关的,要想实现MessageBox按钮的多语言化是很有一定难度的。我现在还没有查到好的解决方法,很多网友的建议是抛弃MessageBox,自己建立对话框。

  7. 源代码

源代码的下载链接如下:

http://files.cnblogs.com/xianyunhe/MultiLanguages.rar

 

8. 相关函数和类型

与本地化相关的函数和类型如下:

 GetSystemDefaultLCID

GetSystemDefaultLocaleName

GetUserDefaultLCID

GetUserDefaultLocaleName

SetThreadLocale

GetThreadLocale

 

MAKELCID

MAKELANGID

LCIDToLocalName

LocalNameToLCID

LANGIDFROMLCID

PRIMARYLANGID

 

LCID

LANGID

LANG_CHINESE 0x04

LANG_ENGLISH 0x09

2: 

原文:https://blog.csdn.net/changshiyzj/article/details/83086462 
第1章代码页

1 代码页

代码页也叫字符集,它有两个特点:

1、它是一个字符集合;

2、为了便于计算机处理。这个字符集合里,每个字符都有编码。

可用一个字符串表示代码页,如:GB2312、GBK、GB18030、Big5……也可以用一个整数表示代码页,如:20936表示GB2312、936表示GBK、54936表示GB18030、950表示Big5……

1.1 单字节字符集

代码页里,每个字符使用一个字节编码,这样的字符集就是单字节字符集SBCS(Single-byte Character Sets)

1.2 双字节字符集

代码页里,每个字符最多使用两个字节编码,这样的字符集就是双字节字符集DBCS(Double-byte Character Sets)

1.3 多字节字符集

代码页里,某些字符的编码超过了一个字节,这样的字符集就是多字节字符集MBCS(Multi-byte Character Sets)。显然,双字节字符集属于多字节字符集,反过来多字节字符集不一定是双字节字符集。因为,有些代码页会用两个以上的字节表示一个字符。如:UTF-7、UTF-8……。

笔者发现一个规律:Windows中,编码超过两个字节的代码页,其数值超过50000,如下图所示:

图1.1

上图中,除了代码页"51949(EUC-朝鲜语)",剩下超过50000的代码页,其编码用到的最大字节数均大于二。

1.4 ANSI代码页

ANSI代码页具有如下特点:

1、编码0至127符合ANSI(American National Standards Institute——美国国家标准学会)制定的ASCII编码标准;

2、它是由微软制定并实现的。如:GB2312也符合第1条,但它不是ANSI代码页,因为这套编码属于中国的国标,不是微软制定的。由微软实现的GBK才是ANSI代码页;

3、它是双字节字符集,亦即编码最多两个字节。

下图中,有ANSI标志的就是ANSI代码页。简体中文Windows,使用的代码页是936,即GBK。

图1.2

2 枚举代码页

可使用API函数EnumSystemCodePages,枚举系统的代码页。下面的代码枚举代码页,存入变量s_mapCodePage中:

static std::map<UINT,CString> s_mapCodePage;

 

static BOOL CALLBACK EnumCodePagesProc(LPTSTR lpString)

{

s_mapCodePage[_tcstoul(lpString,NULL,10)];

return TRUE;

}

 

{//枚举代码页,存入s_mapCodePage

s_mapCodePage.clear();

EnumSystemCodePages(EnumCodePagesProc,CP_INSTALLED);

}

3 查询代码页信息

可使用GetCPInfoEx函数获得代码页的信息。代码如下:

{//遍历s_mapCodePage,获取每个代码页的说明

CPINFOEX ci;

for(std::map<UINT,CString>::iterator it = s_mapCodePage.begin()

;it != s_mapCodePage.end();++it)

{

if(GetCPInfoEx(it->first,0,&ci))

{

it->second = ci.CodePageName;

}

}

}

结构CPINFOEX里,多字节编码的信息不全——只有首字节的范围信息,没有其它字节的范围信息。

可以通过编码找出其余字节的范围信息。思路就是:调用WideCharToMultiByte函数,将0~0xFFFF的UTF-16编码转换为指定代码页的编码,并确定各个字节的范围。如下图所示,计算出了GBK的编码范围:

图1.3

注意:

1、上图中,一字节的编码范围为[0x00,0xFF],最多只能有256个。何以有41198个之多?原因在于WideCharToMultiByte将UTF-16字符映射为GBK字符时,会有多个字符映射为同一个字符的情况;

2、上图的编码范围只显示最小值和最大值,还不足够精细;

3、实现上述功能的VC++代码已被笔者上传至git服务器,网址如下:

https://github.com/hanford77/Exercise

https://git.oschina.net/hanford/Exercise

在工程WinNLS里。

4 宽窄字符串

Windows 下,使用VC++编程。会遇到三类字符串:

1、宽字符串,即UTF-16编码的字符串。每个字符固定占用两个字节。处理宽字符串的API函数一般以W结尾,如:CreateWindowW、MessageBoxW……

2、窄字符串,即字符串中的字符均属于某个ANSI代码页。每个字符占用一至两个字节。处理窄字符串的API函数一般以A结尾,如:CreateWindowA、MessageBoxA……

3、多字节字符串,即字符串中字符编码的字节数超过了两个。如:UTF-8、GB18030……这类字符串必须转换为宽字符串或窄字符串后,才能被Windows API使用。

Windows系统中,宽字符串不会产生歧义——它总是UTF-16编码;多字节字符串(包括窄字符串)在不同的代码页下会有不同的解释,所以必须明确窄字符串所属的代码页,否则就会产生乱码。

5 字符串转换

宽窄字符串的转换由WideCharToMultiByte(宽字符串转换为多字节字符串)和MultiByteToWideChar(多字节字符串转换为宽字符串)完成。

5.1 查表

WideCharToMultiByte和MultiByteToWideChar的实质工作主要就是查表。如下面的代码转换宽字符串"编码"为窄字符串:

char szStr[64];

WideCharToMultiByte(CP_ACP,0,L"编码",-1,szStr,64,NULL,NULL);

这一行代码做了什么?查看注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage

图1.4

根据上图可知:CP_ACP表示代码页936。再根据936可以查到文件c_936.nls。nls文件其实就是UTF-16编码与ANSI编码的对照表。具体请参考博文:

http://demon.tw/copy-paste/nls-file-format.html

WideCharToMultiByte根据c_936.nls文件中的对照表,把"编码"由UTF-16编码转换为代码页为936的编码。

5.2 NlsDllCodePageTranslation

有些编码不适合查表,如:UTF-7编码与UTF-16编码的转换并不是简单的字符对应关系,无法查表完成。

编码超过两个字节的,无法查表。如:GB18030、UTF-8的编码均超过了两个字节,无法使用nls文件存储编码对照表。

这类情况下,WideCharToMultiByte和MultiByteToWideChar是如何实现的呢?查看注册表,代码页54936(GB18030)对应的文件是c_g18030.dll。

图1.5

在C:\Windows\System32和C:\Windows\SysWOW64目录下,均能找到c_g18030.dll这个文件。System32目录下是64位的,SysWOW64目录下是32位的。这个dll文件,导出了函数NlsDllCodePageTranslation。

图1.6

也就是说,对于无法查表完成的编码转换。WideCharToMultiByte和MultiByteToWideChar会LoadLibrary该代码页对应的dll文件,然后调用该dll文件里的导出函数NlsDllCodePageTranslation,完成编码的转换工作。

 

 

第2章区域

2.1 一个例子

首先看一个例子

#include <stdio.h>

void main()

{

puts ( "窄字符串");

_putws(L"宽字符串");

}

运行结果如下:

图2.1

为什么宽字符串没有被显示出来?因为调用C函数之前,没有设置C函数的代码页为GBK。为此,修改代码如下:

#include <stdio.h>

#include <locale.h>

void main()

{

setlocale(LC_ALL,".936"); //设置代码页为 GBK

puts ( "窄字符串");

_putws(L"宽字符串");

}

运行结果如下:

图2.2

2.2 setlocale

MSDN里关于setlocale函数的说明,第二个参数有些复杂,如下所示:

locale :: "lang[_country[.code_page]]"

| ".code_page"

| ""

| NULL

2.2.1 简单用法

用法

示例

说明

".code_page"

setlocale(LC_ALL,".936");

设置代码页为936

"" 

setlocale(LC_ALL,"");

设置代码页为系统默认值

对于简体中文而言就是936

NULL 

setlocale(LC_ALL,NULL);

获取设置,如:

setlocale(LC_ALL,"");之前调用setlocale(LC_ALL,NULL);将返回"C"

setlocale(LC_ALL,"");之后调用setlocale(LC_ALL,NULL);将返回"Chinese (Simplified)_People's Republic of China.936"

2.2.2 复杂用法

setlocale(LC_ALL,"");之后调用setlocale(LC_ALL,NULL);将返回"Chinese (Simplified)_People's Republic of China.936"。这个返回值就是"lang[_country[.code_page]]"——下划线之前的是语言,下划线与小数点之间的是国家或地区,小数点之后的是代码页。

语言、国家或地区这两个参数该怎么填?可使用EnumSystemLocales函数枚举Windows系统的区域,然后使用GetLocaleInfo函数获得区域的属性。如下图所示:

图2.3

上图第一列的LCID是EnumSystemLocales函数枚举出来的;LOCALE_SCOUNTRY、LOCALE_SENGLANGUAGE、LOCALE_SENGCOUNTRY……这些列是GetLocaleInfo函数获得的。

根据上图所示,使用setlocale函数设置台湾地区,可以这样设置:

setlocale(LC_ALL,"Chinese (Traditional)_Taiwan.950");

"语言_国家或地区.代码页"比较麻烦,可以使用缩写。缩写可由GetLocaleInfo(...,LOCALE_SABBREVLANGNAME)获得,如下图所示:

图2.4

根据上图所示,使用setlocale函数设置台湾地区,可以这样设置:

setlocale(LC_ALL,"CHT");

注意:

1、"Uzbek (Cyrillic)_Uzbekistan.1251"与"Uzbek (Latin)_Uzbekistan.1254"的缩写均为UZB。为防止混淆,请不要使用缩写;

2、更多的区域信息,可运行WinNLS程序获得,该程序已被笔者上传至git服务器,网址如下:

https://github.com/hanford77/Exercise

https://git.oschina.net/hanford/Exercise

2.3 #pragma setlocale

还是这段代码,在繁体中文操作系统下编译,会发生什么?

#include <stdio.h>

#include <locale.h>

void main()

{

setlocale(LC_ALL,".936"); //设置代码页为 GBK

puts ( "窄字符串");

_putws(L"宽字符串");

}

首先,这段代码是在简体中文操作系统下编写的,并保存为ANSI编码格式。因此,"窄字符串"和"宽字符串"在源文件中被存储为多字节字符串,代码页为936 GBK。

编译器在编译"窄字符串"时,保持字符串的内容,因此"窄字符串"的编码仍为GBK编码;编译器在编译"宽字符串"时,需要将窄字符串转换为宽字符串。窄字符串的代码页本来是936的,结果在繁体中文操作系统下,VC++编译器会把该字符串的代码页当做950,然后转换为宽字符串。结果就会产生乱码了。

为此,可添加一行代码,如下所示:

#include <stdio.h>

#include <locale.h>

void main()

{

setlocale(LC_ALL,".936"); //设置代码页为 GBK

puts ( "窄字符串");

#pragma setlocale(".936")

_putws(L"宽字符串");

}

#pragma setlocale(".936")的含义就是:让编译器执行一下函数setlocale(...,".936");将代码页切换为936。这样,在将"宽字符串"转换为宽字符串时,就不会产生乱码了。

#pragma setlocale的参数,可以完全按照setlocale函数第二个参数的格式进行填写。

2.4 rc 文件

资源文件(*.rc)同样需要设置区域和代码页,具体如下

LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED

#pragma code_page(936)

LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED指定区域的LCID为0x0804(十进制的2052)。参考图2.4,就是设置区域为"中华人民共和国"。

#pragma code_page(936) 就是设置代码页为936。具体就是:从这一行开始,所有的字符串均是GBK编码。

注意:VC++.NET的rc文件可以保存为Unicode(UTF-16LE)格式。此时,设置区域和代码页似乎不是必需的了。

2.5 排序

LCID里还包含了排序信息。根据这个排序设置,可使用CompareString函数比较两个字符串。

将有排序信息的LCID设置给ComboBox、ListBox,则会影响这些控件的排序功能(其内部应该是调用了CompareString函数),具体请参考WinNLS工程。
--------------------- 
作者:奔流的江 
来源:CSDN 
原文:https://blog.csdn.net/changshiyzj/article/details/83086462 
版权声明:本文为博主原创文章,转载请附上博文链接!

3:Language Identifier Constants and Strings

https://docs.microsoft.com/zh-cn/windows/desktop/Intl/language-identifier-constants-and-strings

Each language identifier is composed of a primary language identifier indicating the language, and a sublanguage identifier indicating the country/region. The language identifier corresponds to a particular locale, for example, English (United States), represented as "en-US". The language identifier is used as part of the locale identifier.

A primary or sublanguage identifier can be user-defined or predefined. The table included in this topic defines the predefined primary language identifiers with their valid sublanguage identifiers.

 备注

If there is no sublanguage identifier to use with a primary language identifier, your application should use SUBLANG_DEFAULT. It should use SUBLANG_NEUTRAL for resources that are the same for all sublanguages of a primary language.

A user-defined primary language identifier has a value in the range 0x0200 to 0x03ff. All other values are reserved for operating system use.

A user-defined sublanguage identifier has a value in the range 0x20 to 0x3f. All other values are reserved for operating system use.

Language identifierPrimary languagePrim. lang. identifierPrim. lang. symbolSublanguageSublang. identifierSublang. symbol
0x0C00Default custom locale language0x00LANG_NEUTRALDefault custom sublanguage0x03SUBLANG_CUSTOM_DEFAULT
0x1400Default custom MUI locale language0x00LANG_NEUTRALDefault custom MUI sublanguage0x05SUBLANG_UI_CUSTOM_DEFAULT
0x007FInvariant locale language0x7FLANG_INVARIANTInvariant sublanguage0x00SUBLANG_NEUTRAL
0x0000Neutral locale language0x00LANG_NEUTRALNeutral sublanguage0x00SUBLANG_NEUTRAL
0x0800System default locale language0x02LANG_SYSTEM_DEFAULTSystem default sublanguage0x02SUBLANG_SYS_DEFAULT
0x1000Unspecified custom locale language0x00LANG_NEUTRALUnspecified custom sublanguage0x04SUBLANG_CUSTOM_UNSPECIFIED
0x0400User default locale language0x00LANG_USER_DEFAULTUser default sublanguage0x01SUBLANG_DEFAULT
0x0436Afrikaans (af)0x36LANG_AFRIKAANSSouth Africa (ZA)0x01SUBLANG_AFRIKAANS_SOUTH_AFRICA
0x041CAlbanian (sq)0x1cLANG_ALBANIANAlbania (AL)0x01SUBLANG_ALBANIAN_ALBANIA
0x0484Alsatian (gsw)0x84LANG_ALSATIANFrance (FR)0x01SUBLANG_ALSATIAN_FRANCE
0x045EAmharic (am)0x5ELANG_AMHARICEthiopia (ET)0x01SUBLANG_AMHARIC_ETHIOPIA
0x1401Arabic (ar)0x01LANG_ARABICAlgeria (DZ)0x05SUBLANG_ARABIC_ALGERIA
0x3C01   Bahrain (BH)0x0fSUBLANG_ARABIC_BAHRAIN
0x0C01   Egypt (EG)0x03SUBLANG_ARABIC_EGYPT
0x0801   Iraq (IQ)0x02SUBLANG_ARABIC_IRAQ
0x2C01   Jordan (JO)0x0BSUBLANG_ARABIC_JORDAN
0x3401   Kuwait (KW)0x0DSUBLANG_ARABIC_KUWAIT
0x3001   Lebanon (LB)0x0CSUBLANG_ARABIC_LEBANON
0x1001   Libya (LY)0x04SUBLANG_ARABIC_LIBYA
0x1801   Morocco (MA)0x06SUBLANG_ARABIC_MOROCCO
0x2001   Oman (OM)0x08SUBLANG_ARABIC_OMAN
0x4001   Qatar (QA)0x10SUBLANG_ARABIC_QATAR
0x0401   Saudi Arabia (SA)0x01SUBLANG_ARABIC_SAUDI_ARABIA
0x2801   Syria (SY)0x0ASUBLANG_ARABIC_SYRIA
0x1C01   Tunisia (TN)0x07SUBLANG_ARABIC_TUNISIA
0x3801   U.A.E. (AE)0x0ESUBLANG_ARABIC_UAE
0x2401   Yemen (YE)0x09SUBLANG_ARABIC_YEMEN
0x042BArmenian (hy)0x2BLANG_ARMENIANArmenia (AM)0x01SUBLANG_ARMENIAN_ARMENIA
0x044DAssamese (as)0x4DLANG_ASSAMESEIndia (IN)0x01SUBLANG_ASSAMESE_INDIA
0x082CAzerbaijani (az)0x2CLANG_AZERIAzerbaijan, Cyrillic (AZ)0x02SUBLANG_AZERI_CYRILLIC
0x042C   Azerbaijan, Latin (AZ)0x01SUBLANG_AZERI_LATIN
0x0445Bangla (bn); see note 100x45LANG_BANGLABangladesh0x02SUBLANG_BANGLA_BANGLADESH
    India (IN)0x01SUBLANG_BANGLA_INDIA
0x046DBashkir (ba)0x6DLANG_BASHKIRRussia (RU)0x01SUBLANG_BASHKIR_RUSSIA
0x042DBasque (Basque)0x2dLANG_BASQUEBasque (Basque)0x01SUBLANG_BASQUE_BASQUE
0x0423Belarusian (be)0x23LANG_BELARUSIANBelarus (BY)0x01SUBLANG_BELARUSIAN_BELARUS
0x781ABosnian (bs) LANG_BOSNIAN_NEUTRALNeutral  
0x201ABosnian (bs); see note 20x1ALANG_BOSNIANBosnia and Herzegovina, Cyrillic (BA)0x08SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_CYRILLIC
0x141A   Bosnia and Herzegovina, Latin (BA)0x05SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_LATIN
0x047EBreton (br)0x7ELANG_BRETONFrance (FR)0x01SUBLANG_BRETON_FRANCE
0x0402Bulgarian (bg)0x02LANG_BULGARIANBulgaria (BG)0x01SUBLANG_BULGARIAN_BULGARIA
0x0492Central Kurdish (ku)0x92LANG_CENTRAL_KURDISHIraq (IQ)0x01SUBLANG_CENTRAL_KURDISH_IRAQ
0x045CCherokee (chr)0x5CLANG_CHEROKEECherokee (Cher)0x01SUBLANG_CHEROKEE_CHEROKEE
0x0403Catalan (ca)0x03LANG_CATALANSpain (ES)0x01SUBLANG_CATALAN_CATALAN
0x0C04Chinese (zh); see note 10x04LANG_CHINESEHong Kong SAR, PRC (HK)0x03SUBLANG_CHINESE_HONGKONG
0x1404   Macao SAR (MO)0x05SUBLANG_CHINESE_MACAU
0x1004   Singapore (SG)0x04SUBLANG_CHINESE_SINGAPORE
0x0004Chinese (zh)0x04LANG_CHINESE_SIMPLIFIEDSimplified (Hans)0x02SUBLANG_CHINESE_SIMPLIFIED
0x7C04Chinese (zh) LANG_CHINESE_TRADITIONALTraditional (Hant)0x01SUBLANG_CHINESE_TRADITIONAL
0x0483Corsican (co)0x83LANG_CORSICANFrance (FR)0x01SUBLANG_CORSICAN_FRANCE
0x001ACroatian (hr); see note 20x1ALANG_CROATIANNeutral  
0x101ACroatian (hr)0x1aLANG_CROATIANBosnia and Herzegovina, Latin (BA)0x04SUBLANG_CROATIAN_BOSNIA_HERZEGOVINA_LATIN
0x041A   Croatia (HR)0x01SUBLANG_CROATIAN_CROATIA
0x0405Czech (cs)0x05LANG_CZECHCzech Republic (CZ)0x01SUBLANG_CZECH_CZECH_REPUBLIC
0x0406Danish (da)0x06LANG_DANISHDenmark (DK)0x01SUBLANG_DANISH_DENMARK
0x048CDari (prs)0x8CLANG_DARIAfghanistan (AF)0x01SUBLANG_DARI_AFGHANISTAN
0x0465Divehi (dv)0x65LANG_DIVEHIMaldives (MV)0x01SUBLANG_DIVEHI_MALDIVES
0x0813Dutch (nl)0x13LANG_DUTCHBelgium (BE)0x02SUBLANG_DUTCH_BELGIAN
0x0413   Netherlands (NL)0x01SUBLANG_DUTCH
0x0C09English (en)0x09LANG_ENGLISHAustralia (AU)0x03SUBLANG_ENGLISH_AUS
0x2809   Belize (BZ)0x0ASUBLANG_ENGLISH_BELIZE
0x1009   Canada (CA)0x04SUBLANG_ENGLISH_CAN
0x2409   Caribbean (029)0x09SUBLANG_ENGLISH_CARIBBEAN
0x4009   India (IN)0x10SUBLANG_ENGLISH_INDIA
0x1809   Ireland (IE); see note 30x06SUBLANG_ENGLISH_EIRE
0x1809   Ireland (IE); see note 30x06SUBLANG_ENGLISH_IRELAND
0x2009   Jamaica (JM)0x08SUBLANG_ENGLISH_JAMAICA
0x4409   Malaysia (MY)0x11SUBLANG_ENGLISH_MALAYSIA
0x1409   New Zealand (NZ)0x05SUBLANG_ENGLISH_NZ
0x3409   Philippines (PH)0x0DSUBLANG_ENGLISH_PHILIPPINES
0x4809   Singapore (SG)0x12SUBLANG_ENGLISH_SINGAPORE
0x1c09   South Africa (ZA)0x07SUBLANG_ENGLISH_SOUTH_AFRICA
0x2C09   Trinidad and Tobago (TT)0x0BSUBLANG_ENGLISH_TRINIDAD
0x0809   United Kingdom (GB)0x02SUBLANG_ENGLISH_UK
0x0409   United States (US)0x01SUBLANG_ENGLISH_US
0x3009   Zimbabwe (ZW)0x0CSUBLANG_ENGLISH_ZIMBABWE
0x0425Estonian (et)0x25LANG_ESTONIANEstonia (EE)0x01SUBLANG_ESTONIAN_ESTONIA
0x0438Faroese (fo)0x38LANG_FAEROESEFaroe Islands (FO)0x01SUBLANG_FAEROESE_FAROE_ISLANDS
0x0464Filipino (fil)0x64LANG_FILIPINOPhilippines (PH)0x01SUBLANG_FILIPINO_PHILIPPINES
0x040BFinnish (fi)0x0BLANG_FINNISHFinland (FI)0x01SUBLANG_FINNISH_FINLAND
0x080cFrench (fr)0x0CLANG_FRENCHBelgium (BE)0x02SUBLANG_FRENCH_BELGIAN
0x0C0C   Canada (CA)0x03SUBLANG_FRENCH_CANADIAN
0x040c   France (FR)0x01SUBLANG_FRENCH
0x140C   Luxembourg (LU)0x05SUBLANG_FRENCH_LUXEMBOURG
0x180C   Monaco (MC)0x06SUBLANG_FRENCH_MONACO
0x100C   Switzerland (CH)0x04SUBLANG_FRENCH_SWISS
0x0462Frisian (fy)0x62LANG_FRISIANNetherlands (NL)0x01SUBLANG_FRISIAN_NETHERLANDS
0x0456Galician (gl)0x56LANG_GALICIANSpain (ES)0x01SUBLANG_GALICIAN_GALICIAN
0x0437Georgian (ka)0x37LANG_GEORGIANGeorgia (GE)0x01SUBLANG_GEORGIAN_GEORGIA
0x0C07German (de)0x07LANG_GERMANAustria (AT)0x03SUBLANG_GERMAN_AUSTRIAN
0x0407   Germany (DE)0x01SUBLANG_GERMAN
0x1407   Liechtenstein (LI)0x05SUBLANG_GERMAN_LIECHTENSTEIN
0x1007   Luxembourg (LU)0x04SUBLANG_GERMAN_LUXEMBOURG
0x0807   Switzerland (CH)0x02SUBLANG_GERMAN_SWISS
0x0408Greek (el)0x08LANG_GREEKGreece (GR)0x01SUBLANG_GREEK_GREECE
0x046FGreenlandic (kl)0x6FLANG_GREENLANDICGreenland (GL)0x01SUBLANG_GREENLANDIC_GREENLAND
0x0447Gujarati (gu)0x47LANG_GUJARATIIndia (IN)0x01SUBLANG_GUJARATI_INDIA
0x0468Hausa (ha)0x68LANG_HAUSANigeria (NG)0x01SUBLANG_HAUSA_NIGERIA_LATIN
0x0475Hawiian (haw)0x75LANG_HAWAIIANUnited States (US)0x01SUBLANG_HAWAIIAN_US
0x040DHebrew (he)0x0DLANG_HEBREWIsrael (IL)0x01SUBLANG_HEBREW_ISRAEL
0x0439Hindi (hi)0x39LANG_HINDIIndia (IN)0x01SUBLANG_HINDI_INDIA
0x040EHungarian (hu)0x0ELANG_HUNGARIANHungary (HU)0x01SUBLANG_HUNGARIAN_HUNGARY
0x040FIcelandic (is)0x0FLANG_ICELANDICIceland (IS)0x01SUBLANG_ICELANDIC_ICELAND
0x0470Igbo (ig)0x70LANG_IGBONigeria (NG)0x01SUBLANG_IGBO_NIGERIA
0x0421Indonesian (id)0x21LANG_INDONESIANIndonesia (ID)0x01SUBLANG_INDONESIAN_INDONESIA
0x085DInuktitut (iu)0x5DLANG_INUKTITUTCanada (CA), Latin0x02SUBLANG_INUKTITUT_CANADA_LATIN
0x045D   Canada (CA), Canadian Syllabics0x01SUBLANG_INUKTITUT_CANADA
0x083CIrish (ga); see note 40x3CLANG_IRISHIreland (IE)0x02SUBLANG_IRISH_IRELAND
0x0434isiXhosa (xh)0x34LANG_XHOSASouth Africa (ZA)0x01SUBLANG_XHOSA_SOUTH_AFRICA
0x0435isiZulu (zu)0x35LANG_ZULUSouth Africa (ZA)0x01SUBLANG_ZULU_SOUTH_AFRICA
0x0410Italian (it)0x10LANG_ITALIANItaly (IT)0x01SUBLANG_ITALIAN
0x0810   Switzerland (CH)0x02SUBLANG_ITALIAN_SWISS
0x0411Japanese (ja)0x11LANG_JAPANESEJapan (JP)0x01SUBLANG_JAPANESE_JAPAN
0x044BKannada (kn)0x4BLANG_KANNADAIndia (IN)0x01SUBLANG_KANNADA_INDIA
______(reserved)0x60LANG_KASHMIRI(reserved)0x02SUBLANG_KASHMIRI_INDIA
    (reserved)0x02SUBLANG_KASHMIRI_SASIA
0x043FKazakh (kk)0x3FLANG_KAZAKKazakhstan (KZ)0x01SUBLANG_KAZAK_KAZAKHSTAN
0x0453Khmer (kh)0x53LANG_KHMERCambodia (KH)0x01SUBLANG_KHMER_CAMBODIA
0x0486K'iche (qut)0x86LANG_KICHEGuatemala (GT)0x01SUBLANG_KICHE_GUATEMALA
0x0487Kinyarwanda (rw)0x87LANG_KINYARWANDARwanda (RW)0x01SUBLANG_KINYARWANDA_RWANDA
0x0457Konkani (kok)0x57LANG_KONKANIIndia (IN)0x01SUBLANG_KONKANI_INDIA
0x0412Korean (ko)0x12LANG_KOREANKorea (KR)0x01SUBLANG_KOREAN
0x0440Kyrgyz (ky)0x40LANG_KYRGYZKyrgyzstan (KG)0x01SUBLANG_KYRGYZ_KYRGYZSTAN
0x0454Lao (lo)0x54LANG_LAOLao PDR (LA)0x01SUBLANG_LAO_LAO
0x0426Latvian (lv)0x26LANG_LATVIANLatvia (LV)0x01SUBLANG_LATVIAN_LATVIA
0x0427Lithuanian (lt)0x27LANG_LITHUANIANLithuanian (LT); see note 50x01SUBLANG_LITHUANIAN_LITHUANIA
0x082ELower Sorbian (dsb)0x2ELANG_LOWER_SORBIANGermany (DE)0x02SUBLANG_LOWER_SORBIAN_GERMANY
0x046ELuxembourgish (lb)0x6ELANG_LUXEMBOURGISHLuxembourg (LU)0x01SUBLANG_LUXEMBOURGISH_LUXEMBOURG
0x042FMacedonian (mk)0x2FLANG_MACEDONIANMacedonia (FYROM) (MK)0x01SUBLANG_MACEDONIAN_MACEDONIA
0x083EMalay (ms)0x3ELANG_MALAYBrunei Darassalam (BN)0x02SUBLANG_MALAY_BRUNEI_DARUSSALAM
0x043e   Malaysia (MY)0x01SUBLANG_MALAY_MALAYSIA
0x044CMalayalam (ml)0x4CLANG_MALAYALAMIndia (IN)0x01SUBLANG_MALAYALAM_INDIA
0x043AMaltese (mt)0x3ALANG_MALTESEMalta (MT)0x01SUBLANG_MALTESE_MALTA
 (reserved)0x58LANG_MANIPURI   
0x0481Maori (mi)0x81LANG_MAORINew Zealand (NZ)0x01SUBLANG_MAORI_NEW_ZEALAND
0x047AMapudungun (arn)0x7ALANG_MAPUDUNGUNChile (CL)0x01SUBLANG_MAPUDUNGUN_CHILE
0x044EMarathi (mr)0x4ELANG_MARATHIIndia (IN)0x01SUBLANG_MARATHI_INDIA
0x047CMohawk (moh)0x7CLANG_MOHAWKCanada (CA)0x01SUBLANG_MOHAWK_MOHAWK
0x0450Mongolian (mn)0x50LANG_MONGOLIANMongolia, Cyrillic (MN)0x01SUBLANG_MONGOLIAN_CYRILLIC_MONGOLIA
0x0850   Mongolia, Mong (MN)0x02SUBLANG_MONGOLIAN_PRC
0x0461Nepali (ne)0x61LANG_NEPALINepal (NP)0x01SUBLANG_NEPALI_NEPAL
    India (IN)0x02SUBLANG_NEPALI_INDIA
0x0414Norwegian (no)0x14LANG_NORWEGIANBokmål, Norway (NO)0x01SUBLANG_NORWEGIAN_BOKMAL
0x0814   Nynorsk, Norway (NO)0x02SUBLANG_NORWEGIAN_NYNORSK
0x0482Occitan (oc)0x82LANG_OCCITANFrance (FR)0x01SUBLANG_OCCITAN_FRANCE
0x0448Odia (or)0x48LANG_ORIYAIndia (IN)0x01SUBLANG_ORIYA_INDIA
0x0463Pashto (ps)0x63LANG_PASHTOAfghanistan (AF)0x01SUBLANG_PASHTO_AFGHANISTAN
0x0429Persian (fa); see note 60x29LANG_PERSIANIran (IR)0x01SUBLANG_PERSIAN_IRAN
0x0415Polish (pl)0x15LANG_POLISHPoland (PL)0x01SUBLANG_POLISH_POLAND
0x0416Portuguese (pt)0x16LANG_PORTUGUESEBrazil (BR)0x01SUBLANG_PORTUGUESE_BRAZILIAN
0x0816   Portugal (PT); see note 70x02SUBLANG_PORTUGUESE
0x0867Pular (ff)0x67LANG_PULARSenegal (SN)0x02SUBLANG_PULAR_SENEGAL
0x0446Punjabi (pa)0x46LANG_PUNJABIIndia, Gurmukhi script (IN)0x01SUBLANG_PUNJABI_INDIA
0x0846   Pakistan, Arabic script(PK)0x02SUBLANG_PUNJABI_PAKISTAN
0x046BQuechua (quz)0x6BLANG_QUECHUABolivia (BO)0x01SUBLANG_QUECHUA_BOLIVIA
0x086B   Ecuador (EC)0x02SUBLANG_QUECHUA_ECUADOR
0x0C6B   Peru (PE)0x03SUBLANG_QUECHUA_PERU
0x0418Romanian (ro)0x18LANG_ROMANIANRomania (RO)0x01SUBLANG_ROMANIAN_ROMANIA
0x0417Romansh (rm)0x17LANG_ROMANSHSwitzerland (CH)0x01SUBLANG_ROMANSH_SWITZERLAND
0x0419Russian (ru)0x19LANG_RUSSIANRussia (RU)0x01SUBLANG_RUSSIAN_RUSSIA
0x0485Sakha (sah); see note 90x85LANG_SAKHARussia (RU)0x01SUBLANG_SAKHA_RUSSIA
0x243BSami (smn)0x3BLANG_SAMIInari, Finland (FI)0x09SUBLANG_SAMI_INARI_FINLAND
0x103BSami (smj)  Lule, Norway (NO)0x04SUBLANG_SAMI_LULE_NORWAY
0x143B   Lule, Sweden (SE)0x05SUBLANG_SAMI_LULE_SWEDEN
0x0C3BSami (se)  Northern, Finland (FI)0x03SUBLANG_SAMI_NORTHERN_FINLAND
0x043B   Northern, Norway (NO)0x01SUBLANG_SAMI_NORTHERN_NORWAY
0x083B   Northern, Sweden (SE)0x02SUBLANG_SAMI_NORTHERN_SWEDEN
0x203BSami (sms)  Skolt, Finland (FI)0x08SUBLANG_SAMI_SKOLT_FINLAND
0x183BSami (sma)  Southern, Norway (NO)0x06SUBLANG_SAMI_SOUTHERN_NORWAY
0x1C3B   Southern, Sweden (SE)0x07SUBLANG_SAMI_SOUTHERN_SWEDEN
0x044FSanskrit (sa)0x4FLANG_SANSKRITIndia (IN)0x01SUBLANG_SANSKRIT_INDIA
0x7C1ASerbian (sr); see note 2 LANG_SERBIAN_NEUTRALNeutral  
0x1C1A 0x1aLANG_SERBIANBosnia and Herzegovina, Cyrillic (BA)0x07SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_CYRILLIC
0x181A   Bosnia and Herzegovina, Latin (BA)0x06SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_LATIN
    Croatia (HR)0x01SUBLANG_SERBIAN_CROATIA
0x0C1A   Serbia and Montenegro (former), Cyrillic (CS)0x03SUBLANG_SERBIAN_CYRILLIC
0x081A   Serbia and Montenegro (former), Latin (CS)0x02SUBLANG_SERBIAN_LATIN
0x046CSesotho sa Leboa (nso)0x6CLANG_SOTHOSouth Africa (ZA)0x01SUBLANG_SOTHO_NORTHERN_SOUTH_AFRICA
0x0832Setswana / Tswana (tn)0x32LANG_TSWANABotswana (BW)0x02SUBLANG_TSWANA_BOTSWANA
0x0432   South Africa (ZA)0x01SUBLANG_TSWANA_SOUTH_AFRICA
 (reserved)0x59LANG_SINDHI(reserved)0x02SUBLANG_SINDHI_AFGHANISTAN
0x0459(reserved)  (reserved)0x01SUBLANG_SINDHI_INDIA
0x0859Sindhi (sd)  Pakistan (PK)0x02SUBLANG_SINDHI_PAKISTAN
0x045BSinhala (si)0x5BLANG_SINHALESESri Lanka (LK)0x01SUBLANG_SINHALESE_SRI_LANKA
0x041BSlovak (sk)0x1bLANG_SLOVAKSlovakia (SK)0x01SUBLANG_SLOVAK_SLOVAKIA
0x0424Slovenian (sl)0x24LANG_SLOVENIANSlovenia (SI)0x01SUBLANG_SLOVENIAN_SLOVENIA
0x2C0ASpanish (es)0x0ALANG_SPANISHArgentina (AR)0x0bSUBLANG_SPANISH_ARGENTINA
0x400A   Bolivia (BO)0x10SUBLANG_SPANISH_BOLIVIA
0x340A   Chile (CL)0x0DSUBLANG_SPANISH_CHILE
0x240A   Colombia (CO)0x09SUBLANG_SPANISH_COLOMBIA
0x140A   Costa Rica (CR)0x05SUBLANG_SPANISH_COSTA_RICA
0x1C0A   Dominican Republic (DO)0x07SUBLANG_SPANISH_DOMINICAN_REPUBLIC
0x300A   Ecuador (EC)0x0CSUBLANG_SPANISH_ECUADOR
0x440A   El Salvador (SV)0x11SUBLANG_SPANISH_EL_SALVADOR
0x100A   Guatemala (GT)0x04SUBLANG_SPANISH_GUATEMALA
0x480A   Honduras (HN)0x12SUBLANG_SPANISH_HONDURAS
0x080A   Mexico (MX)0x02SUBLANG_SPANISH_MEXICAN
0x4C0A   Nicaragua (NI)0x13SUBLANG_SPANISH_NICARAGUA
0x180A   Panama (PA)0x06SUBLANG_SPANISH_PANAMA
0x3C0A   Paraguay (PY)0x0FSUBLANG_SPANISH_PARAGUAY
0x280A   Peru (PE)0x0ASUBLANG_SPANISH_PERU
0x500A   Puerto Rico (PR)0x14SUBLANG_SPANISH_PUERTO_RICO
0x0C0A   Spain, Modern Sort (ES)0x03SUBLANG_SPANISH_MODERN
0x040A   Spain, Traditional Sort (ES)0x01SUBLANG_SPANISH
0x540A   United States (US)0x15SUBLANG_SPANISH_US
0x380A   Uruguay (UY)0x0ESUBLANG_SPANISH_URUGUAY
0x200A   Venezuela (VE)0x08SUBLANG_SPANISH_VENEZUELA
0x0441Swahili (sw)0x41LANG_SWAHILIKenya (KE)0x01SUBLANG_SWAHILI
0x081DSwedish (sv)0x1DLANG_SWEDISHFinland (FI)0x02SUBLANG_SWEDISH_FINLAND
0x041D   Sweden (SE); see note 80x01SUBLANG_SWEDISH
0x041D   Sweden (SE); see note 80x01SUBLANG_SWEDISH_SWEDEN
0x045ASyriac (syr)0x5ALANG_SYRIACSyria (SY)0x01SUBLANG_SYRIAC
0x0428Tajik (tg)0x28LANG_TAJIKTajikistan, Cyrillic (TJ)0x01SUBLANG_TAJIK_TAJIKISTAN
0x085FTamazight (tzm)0x5FLANG_TAMAZIGHTAlgeria, Latin (DZ)0x02SUBLANG_TAMAZIGHT_ALGERIA_LATIN
0x0449Tamil (ta)0x49LANG_TAMILIndia (IN)0x01SUBLANG_TAMIL_INDIA
0x0849   Sri Lanka (LK)0x02SUBLANG_TAMIL_SRI_LANKA
0x0444Tatar (tt)0x44LANG_TATARRussia (RU)0x01SUBLANG_TATAR_RUSSIA
0x044ATelugu (te)0x4ALANG_TELUGUIndia (IN)0x01SUBLANG_TELUGU_INDIA
0x041EThai (th)0x1ELANG_THAIThailand (TH)0x01SUBLANG_THAI_THAILAND
0x0451Tibetan (bo)0x51LANG_TIBETANPRC (CN)0x01SUBLANG_TIBETAN_PRC
0x0873Tigrinya (ti)0x73LANG_TIGRINYAEritrea (ER)0x02SUBLANG_TIGRINYA_ERITREA
0x0473   Ethiopia (ET)0x01SUBLANG_TIGRINYA_ETHIOPIA
0x0873(reserved)0x73LANG_TIGRIGNA(reserved)0x02SUBLANG_TIGRIGNA_ERITREA
0x041FTurkish (tr)0x1FLANG_TURKISHTurkey (TR)0x01SUBLANG_TURKISH_TURKEY
0x0442Turkmen (tk)0x42LANG_TURKMENTurkmenistan (TM)0x01SUBLANG_TURKMEN_TURKMENISTAN
0x0422Ukrainian (uk)0x22LANG_UKRAINIANUkraine (UA)0x01SUBLANG_UKRAINIAN_UKRAINE
0x042EUpper Sorbian (hsb)0x2ELANG_UPPER_SORBIANGermany (DE)0x01SUBLANG_UPPER_SORBIAN_GERMANY
0x0820Urdu (ur)0x20LANG_URDU(reserved)0x02SUBLANG_URDU_INDIA
0x0420   Pakistan (PK)0x01SUBLANG_URDU_PAKISTAN
0x0480Uyghur (ug)0x80LANG_UIGHURPRC (CN)0x01SUBLANG_UIGHUR_PRC
0x0843Uzbek (uz)0x43LANG_UZBEKUzbekistan, Cyrillic (UZ)0x02SUBLANG_UZBEK_CYRILLIC
0x0443   Uzbekistan, Latin (UZ)0x01SUBLANG_UZBEK_LATIN
0x0803Valencian (ca)0x03LANG_VALENCIANValencia (ES-Valencia)0x02SUBLANG_VALENCIAN_VALENCIA
0x042AVietnamese (vi)0x2ALANG_VIETNAMESEVietnam (VN)0x01SUBLANG_VIETNAMESE_VIETNAM
0x0452Welsh (cy)0x52LANG_WELSHUnited Kingdom (GB)0x01SUBLANG_WELSH_UNITED_KINGDOM
0x0488Wolof (wo)0x88LANG_WOLOFSenegal (SN)0x01SUBLANG_WOLOF_SENEGAL
0x0478Yi (ii)0x78LANG_YIPRC (CN)0x01SUBLANG_YI_PRC
0x046AYoruba (yo)0x6ALANG_YORUBANigeria (NG)0x01SUBLANG_YORUBA_NIGERIA

 

Language Identifier Notes

  1. To set a neutral language, use LANG_CHINESE_SIMPLIFIED or LANG_CHINESE_TRADITIONAL with ConvertDefaultLocale.
  2. Primary language identifiers for Bosnian, Croatian, and Serbian are numerically identical. For Bosnian, use LANG_BOSNIAN with SUBLANG_BOSNIAN_* sublanguage identifiers. For Croatian, use LANG_CROATIANwith SUBLANG_CROATIAN_* sublanguage identifiers. For Serbian, use LANG_SERBIAN with SUBLANG_SERBIAN_* sublanguage identifiers. To set a neutral language, use LANG_BOSNIAN_NEUTRALLANG_CROATIAN, or LANG_SERBIAN_NEUTRAL with ConvertDefaultLocale.
  3. Starting with Windows VistaSUBLANG_ENGLISH_IRELAND supersedes SUBLANG_ENGLISH_EIRE. The numerical values of the constants are identical.
  4. Always use the language identifier constant LANG_IRISH with SUBLANG_IRISH_IRELAND.
  5. Starting with Windows VistaSUBLANG_LITHUANIAN_LITHUANIA supersedes SUBLANG_LITHUANIAN. The numerical values of the constants are identical.
  6. The language identifiers for Farsi and Persian are numerically identical. The constant LANG_FARSI is deprecated. Use LANG_PERSIAN instead.
  7. Starting with Windows VistaSUBLANG_PORTUGUESE_PORTUGAL supersedes SUBLANG_PORTUGUESE. The numerical values of the constants are identical.
  8. Starting with Windows VistaSUBLANG_SWEDISH_SWEDEN supersedes SUBLANG_SWEDISH. The numerical values of the constants are identical.
  9. Starting with Windows 8: The language identifiers for Yakut and Sakha are numerically identical. The constants LANG_YAKUT and SUBLANG_YAKUT_RUSSIA are deprecated. Use LANG_SAKHA and SUBLANG_SAKHA_RUSSIA instead.
  10. The language identifiers for Bengali and Bangla are numerically identical. The constants LANG_BENGALISUBLANG_BENGALI_BANGLADESH, and SUBLANG_BENGALI_INDIA are deprecated. Use LANG_BANGLASUBLANG_BANGLA_BANGLADESH, and SUBLANG_BANGLA_INDIA instead.

4: microsoft  international

https://docs.microsoft.com/zh-cn/windows/desktop/Intl/international-support 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值