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

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

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

我有一些资源包打包在我的主jar中

widget_en.properties
widget_de.properties

我基于我的默认语言环境检索资源包作为folows

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时不执行有效性检查。如果您想查看特定资源是否可用于您构建的区域设置,则必须查询这些资源。

要解决该问题,您仍然可以遍历资源目录中名为“widget_”的所有文件,并发现新添加的资源包。

请注意,由于上述原因,Locale.getAvailableLocales() 并非100%确定:您可能有一天会定义非标准区域设置。但是,如果只添加一些标准区域设置,则可以使用此静态方法遍历系统区域设置并获取相应的分区。

用户回答回答于

如果你真的将资源文件打包你的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);
}

如果你关心你的JAR,那么你至少会得到一个包含给定默认资源的集合baseName

如果你只有像baseName_<country>这样的名字的资源完美工作,因为只有那些ResourceBundles将被添加到你的JAR中存在的集合中。即使你决定需要独立baseName_en_USbaseName_en_UK资源,这也是行不通的,这是前所未闻的。

我写了ResourceBundle.Control一个Charset以它为参数的文章,如果你想加载UTF-8编码的资源文件,你可能会对它感兴趣。它在GitHub上提供。

扫码关注云+社区