سؤال

لا Facelets لديك أي ميزات أكثر إتقانا أو أكثر للقراءة تدويل واجهة المستخدم النص التسميات التي ما يمكن أن تفعل خلاف ذلك باستخدام JSF ؟

على سبيل المثال, مع عادي JSF ، وذلك باستخدام ساعة:outputFormat جدا مطول طريقة أقحم المتغيرات في الرسائل.

التوضيح: وأنا أعلم أنني يمكن أن تضيف رسالة إدخال ملف التي تبدو مثل:

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

وعرض هذا (إذا أنا باستخدام التماس) مع:

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

ولكن هناك الكثير من الفوضى إلى إخراج جملة واحدة - مجرد نوع من الشيء الذي يعطي JSF اسما سيئا.

هل كانت مفيدة؟

المحلول

يمكنك إنشاء الخاصة بك وجوه الوسم مكتبة لجعله أقل مطول ، شيء من هذا القبيل:

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

ثم خلق taglib في عرض dir:/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>

إنشاء /مكونات/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" أن وجهات النظر الخاصة بك وكنت كل مجموعة!

نصائح أخرى

منذ كنت تستخدم التماس ، يمكنك استخدام ش في رسائل الملف.

مكان الإقامة:

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

XHTML:

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

هذا لا يزال يستخدم outputFormat ، ولكن أقل مطول.

أنا لم تأتي عبر طريقة أخرى للقيام بذلك بخلاف outputFormat.فمن المؤسف جدا مطول.

الشيء الوحيد الذي أستطيع أن أقترح إنشاء رسالة في دعم الفول ثم إخراج أنه بدلا من messageFormat.

في حالتي أنا الربيع MessageSource متكاملة مع JSF (باستخدام MessageSourcePropertyResolver).ثم إنه من السهل إلى حد ما في دعم الفاصوليا للحصول على parameterised الرسائل - تحتاج فقط إلى معرفة أي لغة المستخدم الخاص بك هو في (مرة أخرى ، أنا عندي لغة لا بد أن دعم الفول الملكية بحيث يمكن الوصول إليها عن طريق JSF أو جافا).

أعتقد المعلمات - خاصة في الرسائل - هي شيء واحد JSF حقا يمكن أن نفعل ما هو أفضل!

لقد تم التفكير في هذا أكثر ، ويحدث لي أنني ربما يمكن أن يكتب بلدي JSTL وظيفة أن يأخذ رسالة مفتاح متغير عدد من المعلمات:

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

وإذا رسالتي وظيفة HTML ترميز النتيجة قبل الإخراج ، لن تحتاج حتى إلى استخدام h:outputText

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

يمكنك استخدام التماس Interpolator:

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

وقد @BypassInterceptors على ذلك من الأداء يجب أن تكون على ما يرام.

يمكنك استخدام فول مباشرة إذا كنت أقحم الرسائل.

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']} هو enougth.

هذا واحد يعمل كبيرة باستخدام الربيع:

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;
    }
}

و...

كنت بحاجة إلى تغيير EL-محلل في faces-config.xml من org.springframework.web.jsf.el.SpringBeanFacesELResolver إلى

تحياتي

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

استخدام ResourceBundle والممتلكات الملفات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top