2008-09-17 61 views
5

Facelets是否具有更整潔或更具可讀性的國際化用戶界面文本標籤的任何功能,您可以使用JSF進行其他操作?JSF/Facelets中的國際化標籤

例如,對於普通的JSF,使用h:outputFormat是在消息中插入變量的非常詳細的方式。

澄清:我知道我可以添加一個消息文件條目,看起來像:

label.widget.count = You have a total of {0} widgets. 

,並顯示該(如果我使用Seam)有:

<h:outputFormat value="#{messages['label.widget.count']}"> 
    <f:param value="#{widgetCount}"/> 
</h:outputFormat> 

但那麼輸出一個句子就會變得很混亂 - 只是給JSF一個不好名字的東西。

回答

3

你可以創建自己的面孔標籤庫,使之更簡潔,是這樣的:

<ph:i18n key="label.widget.count" p0="#{widgetCount}"/> 

然後創建在您的視圖目錄的taglib:/components/ph.taglib.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE facelet-taglib PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" "https://facelets.dev.java.net/source/browse/*checkout*/facelets/src/etc/facelet-taglib_1_0.dtd"> 

<facelet-taglib xmlns="http://java.sun.com/JSF/Facelet"> 
    <namespace>http://peterhilton.com/core</namespace> 

    <tag> 
     <tag-name>i18n</tag-name> 
     <source>i18n.xhtml</source> 
    </tag> 

</facelet-taglib> 

create/components/i18n。xhtml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:h="http://java.sun.com/jsf/html"   
    xmlns:f="http://java.sun.com/jsf/core"> 

    <h:outputFormat value="#{messages[key]}"> 
      <!-- crude but it works --> 
     <f:param value="#{p0}" /> 
     <f:param value="#{p1}" /> 
     <f:param value="#{p2}" /> 
     <f:param value="#{p3}" /> 
    </h:outputFormat> 

</ui:composition> 

您或許可以找到一種傳遞參數的優雅方式,並帶有一點研究成果。

現在註冊新的taglib在web.xml

<context-param> 
<param-name>facelets.LIBRARIES</param-name> 
<param-value> 
     /components/ph.taglib.xml 
    </param-value> 
</context-param> 

只需添加xmlns:ph="http://peterhilton.com/core"你的意見和你所有的設置!

+0

好的答案,並接近我們迄今爲止所做的。主要問題是你不能在屬性值中使用它。 – 2009-03-19 16:50:26

-1

使用ResourceBundle和屬性文件。

+0

你能再解釋一下嗎?我不知道你的意思,因爲OP已經表示他正在使用它。 – Sietse 2008-09-19 08:35:03

3

我從來沒有遇到過除outputFormat以外的其他方式。不幸的是,它很冗長。

我可以建議的唯一的其他事情是在支持bean中創建消息,然後輸出消息而不是messageFormat。

在我的情況下,我有Spring的MessageSource與JSF集成(使用MessageSourcePropertyResolver)。然後,在支持bean中獲取參數化消息相當簡單 - 您只需要知道用戶所在的Locale(再次,我已將Locale綁定到支持bean屬性,以便通過JSF或Java訪問)。

我認爲參數 - 特別是消息 - 是JSF可以做得更好的一件事!

3

我一直在思考這個多了,它發生,我認爲我大概可以寫我自己的JSTL函數,它接受一個消息密鑰和參數可變數目:

<h:outputText value="#{my:message('label.widget.count', widgetCount)}"/> 

如果我的留言功能HTML編碼輸出前的結果,我甚至不會需要使用h:的outputText

#{my:message('label.widget.count', widgetCount)} 
+0

如果你這樣做,並得到它的工作,請給我發電子郵件Codez;)認真,但如果你能夠在某個地方發佈它將是一個很好的資源。 – 2008-09-19 08:42:20

5

既然你在郵件文件中使用Seam,you can use EL

物業:

label.widget.count = You have a total of #{widgetCount} widgets. 

XHTML:

<h:outputFormat value="#{messages['label.widget.count']}" /> 

這仍然採用OUTPUTFORMAT,但更簡潔。

+0

這種方法的唯一侷限性是,您被綁定到#{widgetCount}上使用此標籤,或者您必須明確註銷「widgetCount」才能使用它。 – Damo 2009-04-07 12:10:12

3

您可以使用Seam插補:

<h:outputText value="#{interpolator.interpolate(messages['label.widget.count'], widgetCount)}"/> 

它有它@BypassInterceptors這樣的表現應該沒問題。

1

如果插入消息,則可以直接使用Bean。

label.widget.count = You have a total of #{widgetCount} widgets. 
label.welcome.message = Welcome to #{request.contextPath}! 
label.welcome.url = Your path is ${pageContext.servletContext}. 

${messages['label.widget.count']} is enougth。

這一個偉大的工程中使用Spring:

package foo; 

import javax.el.ELContext; 
import javax.el.ELException; 
import javax.el.ExpressionFactory; 
import javax.el.ResourceBundleELResolver; 
import javax.faces.context.FacesContext; 

import org.springframework.web.jsf.el.SpringBeanFacesELResolver; 

public class ELResolver extends SpringBeanFacesELResolver { 
    private static final ExpressionFactory FACTORY = FacesContext 
      .getCurrentInstance().getApplication().getExpressionFactory(); 
    private static final ResourceBundleELResolver RESOLVER = new ResourceBundleELResolver(); 

    @Override 
    public Object getValue(ELContext elContext, Object base, Object property) 
      throws ELException { 
     Object result = super.getValue(elContext, base, property); 
     if (result == null) { 
      result = RESOLVER.getValue(elContext, base, property); 
      if (result instanceof String) { 
       String el = (String) result; 
       if (el.contains("${") | el.contains("#{")) { 
        result = FACTORY.createValueExpression(elContext, el, 
          String.class).getValue(elContext); 
       } 
      } 
     } 
     return result; 
    } 
} 

而且......

你需要從org.springframework.web.jsf.el.SpringBeanFacesELResolverfaces-config.xml改變EL-解析器來

問候

<el-resolver>foo.ELResolver</el-resolver> 
+0

小心:可能導致無限循環,知道你在做什麼。 – 2014-02-16 06:54:19