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

如何忽略ResourceBundle中的defaultLocale。获得捆绑?

尉迟哲瀚
2023-03-14

目前我正在学习i18n,发现

Locale.getDefault()

影响资源的查找过程。该示例摘自Java™教程-快速示例稍作修改:

组织。i18n。I18N示例

package org.i18n;

import java.util.*;

public class I18NSample {

    static public void main(String[] args) {

        String language;
        String country;

        if (args.length != 2) {
            language = new String("en");
            country = new String("US");
        } else {
            language = new String(args[0]);
            country = new String(args[1]);
        }

        Locale defaultLocale = Locale.getDefault();
        System.out.println("default language = " + defaultLocale.getLanguage()
                  + "; default country = " + defaultLocale.getCountry());

        Locale inputLocale = new Locale(language, country);
        System.out.println("input language = " + inputLocale.getLanguage()
                  + "; input country = " + inputLocale.getCountry());

        ResourceBundle messages = ResourceBundle.getBundle("MessagesBundle", inputLocale);
        Locale bundleLocale = messages.getLocale();
        System.out.println("bundle language = " + bundleLocale.getLanguage()
                  + "; bundle country = " + bundleLocale.getCountry());

        System.out.println(messages.getString("greetings"));
        System.out.println(messages.getString("inquiry"));
        System.out.println(messages.getString("farewell"));
    }
}

已定义的默认资源消息绑定。性质

greetings = Hello.
farewell = Goodbye.
inquiry = How are you?

和3个附加资源文件

MessagesBundle_de_de.properties

greetings = Hallo.
farewell = Tschüß.
inquiry = Wie geht's?

MessagesBundle_en_US属性

greetings = Hi.
farewell = Bye-bye.

MessagesBundle_fr_FR属性

greetings = Bonjour.
farewell = Au revoir.
inquiry = Comment allez-vous?

到目前为止,一切都很好。java-jari18nfirsttest。jar fr fr给出:

default language = pl; default country = PL
input language = fr; input country = FR
bundle language = fr; bundle country = FR
Bonjour.
Comment allez-vous?
Au revoir.

java-jar I18nFirstTest.jarnl NL给出:

default language = pl; default country = PL
input language = nl; input country = NL
bundle language = ; bundle country =
Hello.
How are you?
Goodbye.

现在,我添加以下资源文件MessagesBundle_pl_PL。属性

farewell = Do widzenia.
greetings = Dzie\u0144 dobry.
inquiry = \u0104\u0105\u0106\u0107\u0118\u0119\u0141\u0142\u0143\u0144Óó\u015A\u015B\u0179\u017A\u017B\u017C

然后问题出现了java-jar I18nFirstTest.jarnl NL给出:

default language = pl; default country = PL
input language = nl; input country = NL
bundle language = pl; bundle country = PL
Dzień dobry.
ĄąĆćĘꣳŃńÓ󌜏źŻż
Do widzenia.

在bundle中设置pl_pl的原因如下所述:publicstaticresourcebundle getBundle(stringbasename、Locale、ClassLoader-loader)-提取:

If no matching resource bundle is found, the default control's
getFallbackLocale method is called, which returns the current
default locale. A new sequence of candidate locale names is
generated using this locale and and searched again, as above. 

默认的语言环境确实是pl_pl,但这不是我希望通过设计得到的--

问题:
如何删除getBundle方法的功能,该方法使用默认语言环境处理第二次查找?

我不想将我的区域设置更改为locale。setDefault(新语言环境(“en”、“GB”)),因为它会影响其他模块的功能

在区域设置之间切换也可能不是线程安全操作(对吗?)

...
    Locale defaultLocale = Locale.getDefault();
    Locale.setDefault(new Locale("en", "GB"));
    ResourceBundle messages = ResourceBundle.getBundle("MessagesBundle", inputLocale);
    Locale.setDefault(defaultLocale);
...

那么解决办法是什么呢?

共有1个答案

韦锦程
2023-03-14

加载资源包时,Java基本上首先检查请求的语言环境是否有包,然后检查默认语言环境是否有包,如果两者都不存在,则返回基本包(语言环境的包(“”)。

正如您引用的文档片段中所述,默认语言环境由getFallbackLocale()控制方法提供ResourceBundle提供一个静态控件类来控制流程。默认情况下,在加载ResourceBundle时使用它,但您也可以提供自己的控件的实现。

在你的情况下,什么应该足够:

public class ModifiedControl extends ResourceBundle.Control {

    @Override
    public Locale getFallbackLocale( String aBaseName, Locale aLocale ) {
        if( aBaseName == null || aLocale == null ) {
            throw new NullPointerException();
        }
        return null;
    }
}

因为方法返回nullResourceBundle将返回默认资源。

[...]
5。控制。调用getFallbackLocale方法以获取回退区域设置(当前目标区域设置的替代方案),以尝试进一步查找资源包。如果该方法返回非空区域设置,它将成为下一个目标区域设置,加载过程将从步骤3开始。否则,如果在前面的步骤5中找到了一个基本捆绑包并将其挂起,那么它现在将返回给调用者。否则,将引发MissingResourceException
[…]
来源:https://docs.oracle.com/javase/7/docs/api/java/util/ResourceBundle.html#getBundle(java.lang.String、java.util.Locale、java.lang.ClassLoader、java.util.ResourceBundle.Control)

然后,在加载资源包时,必须简单地提供修改后的控件的实例。

ResourceBundle messages = ResourceBundle.getBundle("MessagesBundle", inputLocale, new ModifiedControl() );

 类似资料:
  • 问题内容: 在python中,如何指示它忽略提供给method的未定义选项? 例如 我只为我的实例定义了选项,但是我用list调用 编辑: 我不在乎是否将其从原始列表中筛选出来。我只想忽略未定义的选项。 我这样做的原因是因为我正在使用SCons的AddOption接口添加自定义生成选项。但是,其中一些选项指导目标的声明。因此,我需要在脚本的不同位置将它们从sys.argv中解析出来,而无需访问所有

  • 我希望得到h3的内部文本,但我想忽略嵌套的跨度。 示例: 以下是我当前的代码: 它返回 也尝试了innerText没有成功,我不能设法从DOM删除跨度。

  • 问题内容: 我有以下代码: 我想执行:即使(上面的行)抛出异常。除了: 我连续有很多test.setSomething,它们都可能引发异常。如果他们这样做,我只想跳过这一行,移至下一行。 为了澄清起见,我不在乎它是否引发异常,并且我无法编辑引发此异常的代码的源代码。 这是我不关心例外的情况(请不要使用通用量化的语句,例如“您永远不要忽略异常”)。我正在设置某些对象的值。当我向用户提供值时,无论如何

  • 问题内容: 我正在尝试为api 编写Web服务。因此,我编写了一个MyLogRecord类,该类继承自LogRecord。我用JAX- B注释对此类进行了注释,包括,因此它将忽略未注释的字段和属性。当我启动tomcat时,出现错误,并且其他类没有默认的构造函数,但是没有带注释的方法对Level类或任何其他类进行任何引用。这些由父类引用。 我的子类具有需要定义的所有内容。如何使JAX-B完全忽略父类

  • 我有一个DB中的人员列表,每个人都有一个CV字段,这是一个Spring中的多部分文件。我试图从数据库中获取所有的人,但忽略CV字段,因为我不想在使用getAllPerson函数时被下载。有可能?