我只是想知道默认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。