如何在Java中找到可用的语言资源包?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (22)

我在主JAR中打包了一些资源包。

widget_en.properties
widget_de.properties

我根据默认的区域设置检索资源包作为折页。

ResourceBundle.getBundle("widget", Locale.getDefault());

但是,我希望向用户提供支持的可用语言列表,以便可以选择与其计算机默认值不同的语言。

但是我在ResourceBundle中找不到一个方法来列出可用的地区,我不想硬编码一个列表,因为我可能忘记了在添加另一个资源包时更新它。

因为我只为不同的语言打包资源,所以我已经通过迭代所有已知的语言代码生成了一个列表,并将每一个代码作为资源进行检查。

String[]langs = Locale.getISOLanguages();
for(String lang:langs)
{
      URL rb = ClassLoader.getSystemResource("widget_"+lang+".properties");
      if(rb!=null)
      {
            System.out.println("Found:"+rb.toString());
      }
}
提问于
用户回答回答于

我不认为有这样的API,因为可以即时创建新的有效区域设置对象:

Locale locale = new Locale("abcd");

而无需在某处注册。然后你可以使用一个widget_abcd.properties没有限制的资源包 :

ResourceBundle resource= ResourceBundle.getBundle("widget", new Locale("abcd"));

java.util.LocaleAPI文档:

因为Locale对象只是区域的标识符,所以在构造Locale时不执行有效性检查。如果你想查看特定资源是否可用于您构建的区域设置,则必须查询这些资源。

用户回答回答于

如果你真的将资源文件打包你的JAR中,那么我会这样做:

public static void main(String[] args) {
  Set<ResourceBundle> resourceBundles = getResourceBundles(A.class.getName());
  if (resourceBundles.isEmpty())
    // ...
}

public static Set<ResourceBundle> getResourceBundles(String baseName) {
  Set<ResourceBundle> resourceBundles = new HashSet<>();

  for (Locale locale : Locale.getAvailableLocales()) {
    try {
      resourceBundles.add(ResourceBundle.getBundle(baseName, locale));
    } catch (MissingResourceException ex) {
      // ...
    }
  }

  return Collections.unmodifiableSet(resourceBundles);
}

扫码关注云+社区