使用 JSF 从资源包传递本地化的 JavaScript 消息
Passing localized javascript messages from resource bundles using JSF
我已经用JSF构建了一个应用程序,服务器发出的所有消息都使用资源包进行了本地化。
我的问题是:如何使用存储在资源包中的消息本地化 javascipt 在客户端浏览器中发出消息?
我是否必须动态生成javascript,如果是,如何做到这一点?
例如,如何让服务器在以下表单验证方法中本地化"警报"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;
}
只需让 JSF 打印所需的 JS 代码即可。
例如<script>
var message = "#{bundle['some.key']}";
</script>
您只需要考虑JS特殊字符,例如单引号和换行符。为此,您可以注册一个自定义EL函数,该函数委托给Apache Commons Lang StringEscapeUtils
,或使用OmniFaces of:escapeJS()
函数。
如果你想提供所有键,请在主模板等中使用类似的东西。
<script type="text/javascript">
var msg = new Object();
<c:forEach items="#{msg.keySet()}" var="key">
msg.#{key} = "#{msg[key]}";
</c:forEach>
</script>
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>
相关文章:
- JavaScript消息系统加密
- IE中奇怪的JavaScript消息
- 清除来自VBA的Javascript消息框
- 已启用 JavaScript 消息
- asp.net javascript 消息未显示
- 确实存在一种重定向和显示 javascript 消息的方法
- 如何从android webview获取Javascript消息
- 将 JavaScript 消息传递给 CSHARP
- IE8中的Javascript消息超出堆栈空间
- 如何对来自javascript消息的文本进行硬编码
- 将HTML放入自定义javascript消息框中
- 当使用UPDATE PANEL时,应用程序不显示javascript消息
- 如何改变javascript消息框编码器的条件
- 抑制WebBrowser JavaScript消息错误
- 如何在我的webOS应用程序中显示此JavaScript消息
- asp和javascript消息提醒不会;不起作用
- iframe中的Javascript消息
- 返回到视图以及 laravel 中的 javascript 消息
- 使用 JSF 从资源包传递本地化的 JavaScript 消息
- Rails 设置一个 Cookie 以确保只收到一次 Javascript 消息