4

我已经使用 JSF 构建了一个应用程序,并且服务器发出的所有消息都使用资源包进行了本地化。

我的问题是:如何使用存储在资源包中的消息本地化 javascipt 在客户端浏览器中发出消息?

我是否必须动态生成 javascript,如果是这样,该怎么做?

例如,如何让服务器在以下表单验证方法中本地化 «alert» javascript 消息:

function valider() {
    typeActionRadio = document.getElementById("membres_editer_creer:typeActionAdr");
    if (typeActionRadio.style.display == "block") {
        var boutonsRadio = document.forms["membres_editer_creer"]["membres_editer_creer:typeActionAdr"];
        for ( var i = 0; i < boutonsRadio.length; i++)
             if (boutonsRadio.item(i).checked) return true;
    }
     alert ("Vous devez indiquer la raison du changement d'adresse (bouton radio à sélectionner).");
    return false;
}
4

3 回答 3

10

只需让 JSF 打印所需的 JS 代码即可。例如

<script>
    var message = "#{bundle['some.key']}";
</script>

您只需要考虑 JS 特殊字符,例如单引号和换行符。为此,您可以注册一个委托给Apache Commons Lang的自定义 EL 函数,或者使用OmniFaces函数。 StringEscapeUtils of:escapeJS()

于 2013-01-29T03:25:29.590 回答
3

如果您想提供所有密钥,请在您的主模板等中使用类似的东西。

<script type="text/javascript">
    var msg = new Object();
    <c:forEach items="#{msg.keySet()}" var="key">
        msg.#{key} = "#{msg[key]}";
    </c:forEach>
</script>
于 2013-07-22T12:39:31.790 回答
0

wutzebaer 的答案是正确的,但是当文字的变量有任何点时,它就会出现问题,例如“person.name”

<script type="text/javascript">
    var msg = new Object();
    <c:forEach items="#{msg.keySet()}" var="key">
    try{ 
        //msgTempl.#{key} = "#{msg[key]}";
        msg['#{key}'] = "#{msg[key]}";  //works better than msgTempl.#{key} = "#{msg[key]}"; when the key contains dots like 'fields.name'
    }catch(e){ 
        console.log("error fullfilling the msgForms resource from bundle " +e);
    }
    </c:forEach>
</script>  

这对我有用,但 netbeans 显示此错误:

Error: The prefix "c" for the "c: forEach" element is not linked.

因为它在脚本中放置了一个 JSTL 标记,但它工作正常,但是

还有另一种方法可以做到这一点

@ManagedBean(name = "ResouceBundle")
@ApplicationScoped
public class ResouceBundle implements Serializable {

    private static final long serialVersionUID = 1L; //needed because the bean is application|session|view and it needs to be Serializable
    public String msg;

    @PostConstruct
    public void init() {
        this.msg = createResourceBundleJSON("resourceName");
    }

    public String createResourceBundleJSON(String resourceName) {

        FacesContext context = FacesContext.getCurrentInstance();
        ResourceBundle bundle = context.getApplication().getResourceBundle(context, resourceName);
        JSONObject jsonObj = new JSONObject();
        Set<String> keys = bundle.keySet();
        for (String key : keys) {
            jsonObj.put(key, JSONObject.wrap(bundle.getString(key)));
        }
        return jsonObj.toString(); 
    }

    public String getMsg() {
        return msg;
    }

    public static long getSerialVersionUID() {
        return serialVersionUID;
    }

}

然后,在 XHTML 中,只写:

<script type="text/javascript">   
    var msg =  #{ResouceBundle.msg}
</script>
于 2017-08-27T11:36:24.867 回答