有没有一种优雅的方法将ISO 639-2(3个字母)语言代码转换为Java语言环境?

例如eng,spa,ita,ger

我可以迭代所有语言环境并比较代码,但我想知道是否有更优雅和高效的方法来实现这一目标….

非常感谢任何提示:)

我不知道是否有一种简单的方法可以将3个字母转换为2个字母的版本,但在更糟糕的情况下,您可以创建它们的Map,如下所示:

String[] languages = Locale.getISOLanguages(); Map localeMap = new HashMap(languages.length); for (String language : languages) { Locale locale = new Locale(language); localeMap.put(locale.getISO3Language(), locale); } 

现在,您可以使用localeMap.get("eng")localeMap.get("eng")查找语言环境。

编辑:修改了地图的创建方式。 现在每种语言应该有一个对象。

编辑2:已经有一段时间了,但在初始化Map时更改了代码以使用languages数组的实际长度。

您可以使用构造函数Locale(String language) ,其中language是2个字母的ISO-639-1代码。 我认为将ISO-639-2转换为ISO-639-1的最简单方法是创建HashMap常量。

我的项目中的一些修改过的代码,它们有类似的要求。 我们有自己的历史时区格式,因此我们无法使用标准库。

 public class MyProjectTimeZoneFactory { private static Map timeZoneDb; /** * Set up our timezone id mappings; call this from any constructor * or static method that needs it. */ private static void init() { if(null == TimeZoneDb) { timeZoneDb = new HashMap(); // Maybe a TreeMap would be more appropriate timeZoneDb.put(" ","GMT+00"); timeZoneDb.put("EAD ","GMT+10"); timeZoneDb.put("JST ","GMT+9"); // etc. } } public static TimeZone getTimeZone(String id) throws CommandFormatException { init(); TimeZone tz; if(timeZoneDb.containsKey(id)) { tz = TimeZone.getTimeZone((String)timeZoneDb.get(id)); } else { throw new CommandFormatException("Invalid Timezone value"); } return tz; } } 

您可能会认为将映射放在配置而不是代码中会更好 – 可能在属性文件中。 这可能是真的 – 但要记住实用程序员的规则’你不需要它’。