目前我正在学习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);
...
那么解决办法是什么呢?
加载资源包时,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;
}
}
因为方法返回null
ResourceBundle
将返回默认资源。
[...]
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,它们都可能引发异常。如果他们这样做,我只想跳过这一行,移至下一行。 为了澄清起见,我不在乎它是否引发异常,并且我无法编辑引发此异常的代码的源代码。 这是我不关心例外的情况(请不要使用通用量化的语句,例如“您永远不要忽略异常”)。我正在设置某些对象的值。当我向用户提供值时,无论如何
我有一个DB中的人员列表,每个人都有一个CV字段,这是一个Spring中的多部分文件。我试图从数据库中获取所有的人,但忽略CV字段,因为我不想在使用getAllPerson函数时被下载。有可能?
问题内容: 我正在尝试为api 编写Web服务。因此,我编写了一个MyLogRecord类,该类继承自LogRecord。我用JAX- B注释对此类进行了注释,包括,因此它将忽略未注释的字段和属性。当我启动tomcat时,出现错误,并且其他类没有默认的构造函数,但是没有带注释的方法对Level类或任何其他类进行任何引用。这些由父类引用。 我的子类具有需要定义的所有内容。如何使JAX-B完全忽略父类