我需要将一个Microsoft locale ID,比如1033(美国英语),翻译成ISO 639 language code或者直接翻译成Java Locale示例。或者甚至简单地输入Microsoft表中的“语言-国家/地区”。)
这可能吗?最简单的方法是什么?当然,最好只使用JDK标准库,但如果不可能,也可以使用第三方库。
我需要将一个Microsoft locale ID,比如1033(美国英语),翻译成ISO 639 language code或者直接翻译成Java Locale示例。或者甚至简单地输入Microsoft表中的“语言-国家/地区”。)
这可能吗?最简单的方法是什么?当然,最好只使用JDK标准库,但如果不可能,也可以使用第三方库。
6条答案
按热度按时间63lcw9qa1#
您可以使用GetLocaleInfo来完成此操作(假设您运行的是Windows(win2k+))。
以下C++代码演示了如何使用函数:
将其转换为JNA调用并不需要太多的工作。将常量作为整型数发出以查找它们的值。)
JNA代码示例:
使用JNI稍微复杂一些,但是对于一个相对琐碎的任务来说是可以管理的。
至少,我会考虑使用本地调用来构建转换数据库。我不确定Windows是否有枚举LCID的方法,但. Net中肯定有。作为构建级的东西,这不是一个巨大的负担。我希望避免手动维护列表。
1aaf6o9v2#
由于开始看起来没有现成的Java解决方案来完成这种Map,我们花了大约20分钟来推出我们自己的东西,至少现在是这样。
我们从马嘴里得到信息,即http://msdn.microsoft.com/en-us/goglobal/bb964664.aspx,并将其复制粘贴(通过Excel)到一个.properties文件中,如下所示:
(You如果您有类似的需求,可以下载文件here。)
然后是一个非常简单的类,它将.properties文件中的信息读入Map,并有一个进行转换的方法。
是的,这实际上并没有Map到 * 语言代码 * 或 *Locale对象 *(这是我最初问的),而是Map到微软的“语言-国家/地区”描述。
免责声明:这确实是一种最小化的、“虚拟的”方法,可以自己在Java中完成,而且显然在您自己的代码库中(和维护)LCIDMap信息的副本并不是很优雅。(另一方面,我也不想仅仅为了这个简单的Map而包含一个巨大的库jar或做任何过于复杂的事情。)所以尽管有这个答案,如果您知道类似的内容,请随时发布更优雅的解决方案或现有库。
tquggr8v3#
以下代码将以编程方式创建Microsoft LCID代码和Java语言环境之间的Map,从而更容易保持Map为最新:
Maven依赖项:
用法:
将打印“语言:英语”。
也就是说,LCID 1033Map到英语。
注意:这只会为运行时JVM上可用的语言环境生成Map。也就是说,您只会得到所有可能的语言环境的子集。也就是说,我认为示例化JVM不支持的语言环境在技术上是不可能的,所以这可能是我们所能做的最好的...
stszievb4#
The was the first hit on google表示“Java LCID”,它是以下javadoc:
私有静态java.util.Locale获取Windows区域设置(int lcid)
我不知道从哪里下载这个库,但它是GNU,所以应该不难找到。
o0lyfsai5#
下面是一个脚本,可以粘贴到F12控制台中,并提取当前273种语言到其lcid的Map(将在https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/a9eac961-e77d-41a6-90a5-ce1a8b0cdb9c上使用):
sbdsn5lh6#
使用org.apache.poi.util.LocaleID类的Apache POI很容易做到这一点。
Java区域设置到LCID:
LCID到Java区域设置: