当前位置: 首页 > 知识库问答 >
问题:

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

翟俊名
2023-03-14

我主罐子里有一些资源包

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());
      }
}

共有3个答案

钱安和
2023-03-14

A通过列出文件来解决它。

public class JavaApplication1 {

    public static final ArrayList<String> LOCALES = new ArrayList<>();

    static {
        try {
            File f = new File(JavaApplication1.class.getResource("/l10n").toURI());
            final String bundle = "widget_";// Bundle name prefix.
            for (String s : f.list(new FilenameFilter() {
                @Override
                public boolean accept(File dir, String name) {
                    return name.startsWith(bundle);
                }
            })) {
                LOCALES.add(s.substring(bundle.length(), s.indexOf('.')));
            }
        } catch (URISyntaxException x) {
            throw new RuntimeException(x);
        }
        LOCALES.trimToSize();
    }

    ...

}
西门振
2023-03-14

我认为没有API用于此,因为可以动态创建新的有效区域设置对象:

Locale locale = new Locale("abcd");

无需在某处注册。然后你可以使用一个资源包widget\u abcd。属性无限制:

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

java.util.LocaleAPI文档:

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

要解决这个问题,您仍然可以迭代资源目录中名为“widget_u2;”的所有文件,并发现新添加的资源包。

请注意,Locale。getAvailableLocales()由于上述原因无法100%确定:有朝一日您可能会定义一个非标准区域设置。但是,如果只添加几个标准区域设置,则可以使用此静态方法在系统区域设置上迭代并获得相应的包。

史淳
2023-03-14

如果您真的将资源文件打包到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,那么您至少会得到一个包含给定basName的默认资源的集合

如果您只有名为baseName的资源_

无耻的自我插件:我写了一个资源包。控件,它以字符集作为参数,如果您想加载UTF-8编码的资源文件,您可能会对它感兴趣。它在GitHub上提供

 类似资料:
  • 环境:JSF2.1.7Seam2.3.0JBoss5.1.2 我的应用程序有一个需要本地化的字符串 “我同意WorldSite的隐私政策和Cookie通知” 斜体的隐私政策和Cookie通知是指向其他页面的超链接。 最初我们的facets是这样设置的: 注意:我们已经准备好了URL重写,需要/jsf/Notice。xhtml并重写为 这允许对各个键进行零碎的转换 但这需要一些语言的变通方法(在“i

  • 问题内容: 我需要读取代码中的文件。它实际上位于此处: 我将其放在源包中,以便在创建可运行的jar文件(导出-> Runnable JAR文件)时将其包含在jar中。最初,我将其放在项目根目录中(并尝试了一个普通的子文件夹),但导出文件并未将其包含在jar中。 如果在我的代码中,我这样做: jar文件正确地找到了该文件,但是在本地运行(运行方式-> Java Main应用程序)会引发文件未找到异常

  • 我已经尝试了很多方法,并遵循了几个在线说明,比如这个-Eclipse导出的Runnable JAR不显示图像,但到目前为止,没有成功。 我有一个非常简单的程序,读取一个文本文件(test.txt),并将其内容打印到标准输出。我正在使用Eclipse。这是我所做的- 我将文本文件放入名为“资源”的文件夹中 任何帮助都将不胜感激。 附录:这是代码。 }

  • 问题内容: 假设我的类是从压缩的.war文件加载的,或者是在其他位置加载的,那么如何发现给定包中的所有资源?枚举文件实际上是行不通的,因此无法真正枚举文件。这很可能会涉及使用当前的类加载器? 那里有一个像这样的图书馆吗?Google搜寻仅发现了一些列出文件的骇客。 问题答案: 不,您无法列出软件包中的资源,因为JVM根本不知道哪个软件包中有哪些资源。看到这个问题。

  • 问题内容: 在尝试向其添加库之前,我的应用程序运行良好。添加库后,Android Studio给我以下错误: 错误:(26)在包“ inf ..”中找不到属性“ layout_behavior”的资源标识符。 这是我的build.gradle文件: 这是导致错误的xml: 我尝试了以下方法: 删除了图书馆 重置Android Studio和我的计算机 从git恢复为我的代码的先前版本。 但是,错误