Jon*_*nik 10 java windows locale lcid
我需要将Microsoft语言环境ID(例如1033(美国英语))转换为ISO 639语言代码或直接转换为Java Locale实例.(编辑:或者甚至简单地进入Microsoft表中的"语言 - 国家/地区".)
这是可能的,最简单的方法是什么?当然,最好只使用JDK标准库,但如果不可能,则使用第三方库.
由于它开始看似没有现成的Java解决方案来进行这种映射,我们花了大约20分钟来推动我们自己的东西,至少现在.
我们从马的口中获取信息,即http://msdn.microsoft.com/en-us/goglobal/bb964664.aspx,并将其(通过Excel)复制粘贴到.properties文件中,如下所示:
1078 = Afrikaans - South Africa
1052 = Albanian - Albania
1118 = Amharic - Ethiopia
1025 = Arabic - Saudi Arabia
5121 = Arabic - Algeria
...
Run Code Online (Sandbox Code Playgroud)
(如果您有类似需求,可以在此处下载文件.)
然后有一个非常简单的类,它将.properties文件中的信息读入地图,并有一个进行转换的方法.
Map<String, String> lcidToDescription;
public String getDescription(String lcid) { ... }
Run Code Online (Sandbox Code Playgroud)
是的,这实际上并没有映射到语言代码或Locale对象(这是我最初提出的问题),而是映射到Microsoft的"语言 - 国家/地区"描述.事实证明,这足以满足我们当前的需求.
免责声明:这实际上是一种在Java中自己做的简约"虚拟"方式,显然在你自己的代码库中保存(和维护)LCID映射信息的副本并不是很优雅.(另一方面,我也不想包含一个巨大的库jar或者为这个简单的映射做任何过于复杂的事情.)所以尽管有这个答案,如果你知道类似的东西,请随意发布更优雅的解决方案或现有的库.
您可以使用GetLocaleInfo来执行此操作(假设您在Windows上运行(win2k +)).
这个C++代码演示了如何使用该函数:
#include "windows.h"
int main()
{
HANDLE stdout = GetStdHandle(STD_OUTPUT_HANDLE);
if(INVALID_HANDLE_VALUE == stdout) return 1;
LCID Locale = 0x0c01; //Arabic - Egypt
int nchars = GetLocaleInfoW(Locale, LOCALE_SISO639LANGNAME, NULL, 0);
wchar_t* LanguageCode = new wchar_t[nchars];
GetLocaleInfoW(Locale, LOCALE_SISO639LANGNAME, LanguageCode, nchars);
WriteConsoleW(stdout, LanguageCode, nchars, NULL, NULL);
delete[] LanguageCode;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
把它变成JNA调用并不需要太多工作.(提示:将常量作为整数发出以查找其值.)
示例JNA代码:
使用JNI有点复杂,但可以管理一个相对简单的任务.
至少,我会考虑使用本机调用来构建转换数据库.我不确定Windows是否有办法枚举LCID,但在.Net中肯定会出现问题.作为构建级别的东西,这不是一个巨大的负担.我想避免手动维护列表.
| 归档时间: |
|
| 查看次数: |
28947 次 |
| 最近记录: |