JSF/Seam messages.properties没有_xx,那是哪种语言



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

我以为它是在faces-config.xml中配置的默认区域设置是:

<locale-config>
  <default-locale>de</default-locale>
  <supported-locale>de</supported-locale>
  <supported-locale>en</supported-locale>
</locale-config>

它不包含<message-bundle>标记,我创建了messages.properties、messages_en.properties和messages_de.properties。要访问这些值,我使用以下代码

ResourceBundle resourceBundle = SeamResourceBundle.getBundle();
String bundleMessage = resourceBundle.getString("key.something");

在菜单中,我用它来显示(和切换)的语言

<h:selectOneMenu value="#{localeSelector.localeString}">
  <f:selectItems value="#{localeSelector.supportedLocales}"/>
</h:selectOneMenu>

现在不管我选择什么语言,je总是使用messages.properties,而不是_de或_en。我是否需要<message-bundle>的具体类来查找_de和_en资源包?

编辑:

ResourceBundle resourceBundle = SeamResourceBundle.getBundle();
java.util.Locale locale = resourceBundle.getLocale();

始终包含正确的区域设置de或en,但始终使用messages.properties,如果删除此文件,则只返回密钥,就像他没有找到其他文件一样。消息*.properties位于/WEB-INF/classes文件夹中。

我现在尝试使用Map<String, String> messages = org.jboss.seam.international.Messages.instance();,它还包含messages.properties中的值,而不是_de或_en

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

但是直接在xyz.war文件中使用带有<a4j:loadBundle var="i18n" basename="messages"/>的messages_de properties或_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);

EDIT(显然JBoss-Seam有点不同)正如本文所说,您可能不应该自己实例化捆绑包
相反,您可以定义要使用的捆绑包,并让Seam为您读取消息:

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

一般来说,如果省略Locale参数,ResourceBundle派生实现中的任何一个的getBundle()方法都会给您提供不变束。这是经过设计的。

如果你需要访问本地化版本,你需要从UIViewRoot:获取Locale

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

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

通常,如果在当前语言的任何特定捆绑包中都找不到密钥,那么不带_xx的捆绑包就是所使用的捆绑包。

虽然我不知道SeamResourceBundle到底是干什么的,但你必须在某个地方告诉它"当前"语言是什么。你说切换语言有效,但切换后你到底会做什么?您在什么时候执行SeamResourceBundle.getBundle()

key.something是否真的定义在所有3个束中?

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

所以我猜他从classes文件夹中获取了唯一现有的默认messages.properties,从web内容文件夹中获得了messages_de/en.properties。

相关内容

  • 没有找到相关文章

最新更新