faces-config.xml
:
<application>
<locale-config>
<default-locale>ru</default-locale>
<supported-locale>ua</supported-locale>
</locale-config>
</application>
Run Code Online (Sandbox Code Playgroud)
在bean操作方法中,我正在更改当前视图中的语言环境,如下所示:
FacesContext.getCurrentInstance().getViewRoot().setLocale(new Locale("ua"));
Run Code Online (Sandbox Code Playgroud)
问题是应用了ua
Locale,但仅适用于每个请求/视图而不适用于会话.同一会话中的另一个请求/视图将语言环境重置为默认ru
值.
如何应用会话的区域设置?
我正在使用一个依赖于JSF的库.
当我尝试运行我的项目时,它显示以下异常按摩..
java.util.MissingResourceException: Can't find bundle for base name /Bundle, locale en_US
at java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:1427)
at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1250)
at java.util.ResourceBundle.getBundle(ResourceBundle.java:705)
Run Code Online (Sandbox Code Playgroud)
有任何想法吗 ?
我希望能够从JSF 2托管bean内部的消息包中检索字符串.这可以在将字符串用作FacesMessage
抛出异常中的消息中的摘要或详细信息参数的情况下完成.
我想确保托管bean为用户的语言环境加载正确的消息包.我不清楚如何使用JSF API调用从托管bean执行此操作.
我的配置是:
注意:我确实看到了类似的问题,但这取决于我的配置中不可用的功能
编辑:我在原来的问题上犯了一个错误.我想要问的是"如何从托管bean中获取资源包字符串"?BalusC给了我正确的答案.我实际要问的解决方案非常相似:
public static String getResourceBundleString(
String resourceBundleName,
String resourceBundleKey)
throws MissingResourceException {
FacesContext facesContext = FacesContext.getCurrentInstance();
ResourceBundle bundle =
facesContext.getApplication().getResourceBundle(
facesContext, resourceBundleName);
return bundle.getString(resourceBundleKey);
}
Run Code Online (Sandbox Code Playgroud)
此外,这里还有一个链接到另一个问题,解释了"消息"包和"资源"包之间的区别.
我想为不同的输入字段的每个验证器提供不同的验证消息.
在JSF中是否可以<f:validateLongRange>
为每个输入字段的单个验证器(例如)提供不同的验证消息?
我创建了验证消息(ValidationMessages.properties)文件,以便在我的项目中实现i18n.
看起来像:
pwtNumber.error=PWT Number error..
Run Code Online (Sandbox Code Playgroud)
我在faces-config.xml中定义它:
<message-bundle>com.mycompany.web.i18n.ValidationMessages</message-bundle>
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我以这种方式使用它:
@Null(message = "{pwtNumber.error}")
public String getPwtNummer() {
return pwtNummer;
}
Run Code Online (Sandbox Code Playgroud)
但问题是我没有收到错误消息,而是来自属性文件的密钥.这是我得到的错误消息:
myForm:pwtNummer: {pwtNumber.error}
Run Code Online (Sandbox Code Playgroud)
我怎么解决呢?
我的faces-config.xml喜欢下面的内容.
<?xml version="1.0" encoding="UTF-8"?>
<faces-config
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-
facesconfig_2_0.xsd"
version="2.0">
<application>
<message-bundle>resources.application</message-bundle>
<locale-config>
<default-locale>en</default-locale>
</locale-config>
</application>
</faces-config>
Run Code Online (Sandbox Code Playgroud)
Xhtml文件
<f:loadBundle basename="resources.application" var="msg"/>
Run Code Online (Sandbox Code Playgroud)
我得到以下例外
javax.faces.view.facelets.TagAttributeException: //D:/12c_Workspace/VNPO/WebContent/login.xhtml @9,59 <f:loadBundle basename="resources.application"> Can't find bundle for base name resources.application, locale en
at com.sun.faces.facelets.tag.jsf.core.LoadBundleHandler.apply(LoadBundleHandler.java:233)
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98)
at com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:93)
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98)
at com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:86)
at com.sun.faces.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:152)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.buildView(FaceletViewHandlingStrategy.java:774)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:100)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:242)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:216)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:132)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:338)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:25)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:74)
at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:27)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:74)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3288)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3254)
at …
Run Code Online (Sandbox Code Playgroud) 由于某种原因,以下代码不起作用,我不明白为什么。
@PostConstruct
private void init()
{
facesContext = FacesContext.getCurrentInstance();
locale = facesContext.getExternalContext().getRequestLocale();
messageBundle =
ResourceBundle.getBundle(
facesContext.getApplication().getMessageBundle(),
locale);
}
Run Code Online (Sandbox Code Playgroud)
当我打电话时getMessageBundle
,我得到了一个null
导致ResourceBundle.getBundle()
抛出的问题NullPointerException
。如何将 Messages.properties 链接到调用getMessageBundle()
,或者我应该将其翻译为getResourceBundle("bundle")
?
<message-bundle>
我通过在 faces-config.xml 中设置来让它工作。除了将其声明为 a 之外,还有什么方法可以包含它而不加载到每个 .xhtml 文件中<resource-bundle>
?
在我的应用程序中,我有一个键(字符串)列表,用户可以在其中选择其中一个.在用户界面中,将根据当前区域设置输出密钥:
<h:selectOneMenu value="#{bean.selectedKey}">
<f:selectItems value="#{bean.allKeys}" var="_key" itemLabel="#{msgs[_key]}" />
</h:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)
我的设置使用配置的标准资源包,faces-config.xml
如BalusC 在本回答中所述.msgs
在上面的示例中是资源包变量的名称.
我现在selectOneMenu
想要的是,要按字母顺序排序的项目.当然,顺序取决于使用的区域设置.问题是,我不能/不会在backing-bean中进行排序,因为我不知道JSF页面将如何输出密钥.
这个问题对我来说似乎很通用,所以我想知道解决这类问题的最佳做法是什么.
(当然问题不仅适用于selectOneMenu
.任何将在用户界面中输出的列表/集合都会遇到同样的问题.)
I am trying to use JSR-303 bean validation.
I added the maven dependency
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
I put ValidationMessages_es.properties
and ValidationMessages_en.properties
in /WEB-INF/classes
.
This is the model:
@Pattern(regexp="[0-9]", message="{not.a.valid.number}")
private Double price;
Run Code Online (Sandbox Code Playgroud)
And this is the view:
<p:inputText id="price"
value="#{inventoryMB.product.price}">
<f:convertNumber type="number" maxFractionDigits="0" />
</p:inputText>
<p:message for="price" />
Run Code Online (Sandbox Code Playgroud)
当我输入无效数字时,我从验证器收到此消息:
form:price: 'ss' is not a number. Example: 99
Run Code Online (Sandbox Code Playgroud)
来自属性的我的自定义消息不起作用.怎么了?
jsf ×8
jsf-2 ×3
java ×2
localization ×2
faces-config ×1
java-ee ×1
managed-bean ×1
message ×1
session ×1
sorting ×1
validation ×1