JSF/Seam messages.properties不带xx的是哪种语言?

JSF/Seam messages.properties不带xx的是哪种语言?,jsf,internationalization,seam,resourcebundle,Jsf,Internationalization,Seam,Resourcebundle,我只是想知道默认messages.properties是以哪种语言读取的 我认为它是在faces-config.xml中配置的默认语言环境是: <locale-config> <default-locale>de</default-locale> <supported-locale>de</supported-locale> <supported-locale>en</supported-locale>

我只是想知道默认messages.properties是以哪种语言读取的

我认为它是在faces-config.xml中配置的默认语言环境是:

<locale-config>
  <default-locale>de</default-locale>
  <supported-locale>de</supported-locale>
  <supported-locale>en</supported-locale>
</locale-config>
在菜单中,我用它来显示(和切换)语言,什么工作正常

<h:selectOneMenu value="#{localeSelector.localeString}">
  <f:selectItems value="#{localeSelector.supportedLocales}"/>
</h:selectOneMenu>
始终包含正确的语言环境de或en,但始终使用messages.properties。如果删除此文件,则仅返回密钥,就好像未找到其他文件一样。messages*.properties位于/WEB-INF/classes文件夹中

我现在尝试获取
Map messages=org.jboss.seam.international.messages.instance()它还包含messages.properties和not _de或_en中的值

在*.xhtml文件中使用
#{messages[key.label]}
也只返回messages.properties值,而不从_de或_en返回

但是,在xyz.war文件中直接使用
的消息属性或en确实有效。(这就是我在“非Java”前端实现i18n的方式)

再尝试两次总是只返回默认属性,而不是_de或_en

resourceBundle =  context.getApplication().getResourceBundle(context, "messages");

java.util.Locale locale = new java.util.Locale("de");
resourceBundle = ResourceBundle.getBundle("messages",locale);
如果我创建一个新的messages2_de.properties和*_en*并使用上面的代码,那么一切都会正常工作

java.util.Locale locale = new java.util.Locale("de");
resourceBundle = ResourceBundle.getBundle("messages2",locale);

通常,不带_xx的bundle只是在当前语言的任何特定bundle中找不到密钥时使用的bundle

虽然我不知道SeamResourceBundle到底是做什么的,但你必须告诉它“当前”语言是什么。你说转换语言是有效的,但是你在转换语言时会做什么呢?在什么时候执行
SeamResourceBundle.getBundle()


键。在所有3个bundle中实际定义了一些东西?

通常,如果在当前语言的任何更具体的bundle中找不到键,则不带_xx的bundle就是使用的bundle

虽然我不知道SeamResourceBundle到底是做什么的,但你必须告诉它“当前”语言是什么。你说转换语言是有效的,但是你在转换语言时会做什么呢?在什么时候执行
SeamResourceBundle.getBundle()

键。在所有3个捆绑包中实际定义了一些东西?

编辑(显然JBossSeam有点不同) 如上所述,您可能不应该自己实例化捆绑包。
相反,您可以定义要使用的捆绑包,并让Seam为您读取消息:

@In("#{messages['Hello']}") private String helloMessage;

通常,如果省略
Locale
参数,任何
ResourceBundle
派生实现的
getBundle()
方法都会为您提供不变的bundle。这是故意的

如果需要访问本地化版本,则需要从UIViewRoot获取区域设置:

Locale locale = FacesContext.getCurrentInstance().getViewRoot().getLocale();
ResourceBundle resourceBundle = SeamResourceBundle.getBundle();
String bundleMessage = resourceBundle.getString("key.something");
我不知道localeSelector bean是如何编码的,但它也应该在UIViewRoot中设置Locale。

编辑(显然JBoss Seam有点不同) 如上所述,您可能不应该自己实例化捆绑包。
相反,您可以定义要使用的捆绑包,并让Seam为您读取消息:

@In("#{messages['Hello']}") private String helloMessage;

通常,如果省略
Locale
参数,任何
ResourceBundle
派生实现的
getBundle()
方法都会为您提供不变的bundle。这是故意的

如果需要访问本地化版本,则需要从UIViewRoot获取区域设置:

Locale locale = FacesContext.getCurrentInstance().getViewRoot().getLocale();
ResourceBundle resourceBundle = SeamResourceBundle.getBundle();
String bundleMessage = resourceBundle.getString("key.something");

我不知道localeSelector bean是如何编码的,但它也应该在UIViewRoot中设置Locale。

我的错。您找不到错误。该项目在/WEB-INF/classes中有一个messages.properties,在WEB内容目录中直接有一个同名的集(但没有默认属性)


因此,我猜他只从classes文件夹中获取了现有的默认messages.properties,从WebContent文件夹中获取了messages\u de/en.properties

我的错。您找不到错误。该项目在/WEB-INF/classes中有一个messages.properties,在WEB内容目录中直接有一个同名的集(但没有默认属性)


因此,我猜他只从classes文件夹中获取了现有的默认messages.properties,从WebContent文件夹中获取了messages\u de/en.properties

这个问题有些含糊不清。首先,您知道
之间的区别吗?如果是这样的话,在这里你真的是指
?您希望看到哪些本地化消息?无论如何,
messages.properties
是特定于语言的捆绑包不包含有问题的消息键或在捆绑包检索期间未指定区域设置的情况下的备用默认值。我也发现了这个问题,但我还没有读完规范。在另一个本地化示例中,他们使用了messagebundle标记。我需要在某处配置属性文件的名称吗?就因为他找到了messages.properties,我认为他也应该找到它的其余部分。
用于JSF(内置)验证/转换错误消息。
用于整个站点中的“真实”i18n内容,例如标题、标题、段落、标签等。它用于“真实”i18n,因此我必须在faces-config.xml中配置标记?至少这样,它对消息没有帮助(顺便问一下,所有的消息*.properties文件都在/WEB-INF/classes文件夹中。这个问题有点含糊不清。首先,你知道
之间的区别吗?如果知道,你真的是指
在这个上下文中吗?你希望看到哪些本地化消息?无论如何,
消息es.properties
是特定于语言的捆绑包不包含有问题的消息键或在捆绑包检索过程中未指定区域设置的情况下的回退默认值。我也发现了这个问题,但我不是