Eer*_*nen 14 javascript java ajax spring spring-mvc
我有一个使用Spring MVC的Web应用程序.我希望我的界面只包含一个页面,它通过AJAX动态检索所有数据.我的问题是国际化.当我用jsps渲染内容时,我可以使用JSTL标记来解析我的键(使用Spring MVC非常容易):
<fmt:message key="name"/>: ${name}
<fmt:message key="title"/>: ${title}
<fmt:message key="group"/>: ${group}
Run Code Online (Sandbox Code Playgroud)
正确配置后,它将在芬兰语语言环境中呈现为
Nimi: yay
Otsikko: hoopla
Ryhmä: doo
Run Code Online (Sandbox Code Playgroud)
现在,当我使用json时,我只从服务器进来:
{
name: "yay",
title: "hoopla",
group: "doo"
}
Run Code Online (Sandbox Code Playgroud)
没有键名!但我必须以某种方式提供它们.我考虑将键名更改为其本地化表单或将本地化键名添加到json输出(例如name_localized ="Nimi"),但这两个选项都是不好的做法.我正在使用jackson json自动将我的域对象解析为json,我喜欢它提供的封装.
我想出的唯一可行的解决方案是:动态创建一个javascript文件,将本地化的键名作为变量.
<script type="text/javascript">
var name="Nimi";
var title="Otsikko";
var group="Ryhmä";
</script>
Run Code Online (Sandbox Code Playgroud)
一旦我加载了这个,我现在拥有我的javascript中的所有信息来处理json!但是有一个问题:我的字段名称列表是动态的.所以jsp中的实际静态渲染看起来像这样:
<c:forEach var="field" values="${fields}">
<fmt:message key="${field.key}"/>: ${field.value}
</c:forEach>
Run Code Online (Sandbox Code Playgroud)
我需要找到我的messages.properties中指定的所有消息.Spring MessageSource接口仅支持按键检索消息.如何获取JSP中的键名列表,这些键名称会呈现本地化的javascript变量?
Eer*_*nen 13
好吧,我通过扩展ResourceBundleMessageSource"解决"了我的问题.
package org.springframework.context.support;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.Set;
public class ExposedResourceBundleMessageSource extends
ResourceBundleMessageSource {
public Set<String> getKeys(String basename, Locale locale) {
ResourceBundle bundle = getResourceBundle(basename, locale);
return bundle.keySet();
}
}
Run Code Online (Sandbox Code Playgroud)
现在我可以访问密钥了,但除了必须指定消息源basename之外,我还必须在我的控制器中执行一个丑陋的强制转换.呃,这是很多耦合.
Set<String> keys =
((ExposedResourceBundleMessageSource)
messageSource).getKeys("messages", locale);
Run Code Online (Sandbox Code Playgroud)
我不认为返回本地化值是不好的做法。您可以从控制器返回类似的内容(因此您只需解析那里的键):
\n\n{\n name: {label: "Nimi", value: "yay"},\n title: {label: "Ostikko", value: "hoopla"},\n group: {label: "Rhym\xc3\xa4", value: "doo"},\n}\nRun Code Online (Sandbox Code Playgroud)\n\n您可以创建一个保存这些值的中间对象(最简单的是Map<String, Map<String, String>>),jackson 会将其序列化为 JSON。我认为它比动态 Javascript 文件选项更好。无论如何,该解决方案最终也会执行您尝试对动态 Javascript 文件执行的操作,即将密钥与其解析值相关联。
| 归档时间: |
|
| 查看次数: |
18591 次 |
| 最近记录: |