解决来自extjs文件的spring i18n消息

时间:2016-03-23 20:29:12

标签: javascript spring spring-mvc extjs internationalization

Spring的战略是通过宣布其bean来实现我们春季项目的国际化。 从我们使用的jsp文件中访问消息

<spring:message code="messages.field">

对于jsp文件可以,但是extjs(javascript)文件呢?

例如我有login.js必须使用i18n消息:

items: [ {
        fieldLabel: **// here I must get the field messages.username//**,
        name: 'j_username',
        allowBlank: false,
        listeners: {
            specialkey: function(field, e) {
                if (e.getKey() == e.ENTER) {
                    submitForm();
                }
            }
        }
    },

暂时,我创建了自己的解决方案而没有使用spring i18n bean,如果我们没有approh用extjs的spring实现i18n,那么它可能会有所帮助。但是,这并不是说我的解决方案不是提出了一些我将在本文末尾列出的缺点。

首先创建一个控制器I18nController.java,这个控制器将是具有模式/i18n.js的传入请求的目标, 它有责任创建一个javascript变量i18n并将响应作为contentType = javascript返回。

@RequestMapping(value = "/i18n.js", method = RequestMethod.GET)
public void i18n(HttpServletResponse response, Locale locale) throws JsonGenerationException, JsonMappingException,
        IOException {

    response.setContentType("application/javascript;charset=UTF-8");

    byte[] output = buildResponse(locale);
    response.setContentLength(output.length);

    ServletOutputStream out = response.getOutputStream();
    out.write(output);
    out.flush();
}
private byte[] buildResponse(Locale locale) {
    ResourceBundle rb = ResourceBundle.getBundle("i18n/messages", locale);

    Map<String, String> messages = Maps.newHashMap();
    Enumeration<String> e = rb.getKeys();
    while (e.hasMoreElements()) {
        String key = e.nextElement();
        messages.put(key, rb.getString(key));
    }

    String output =  "var i18n = "+ jsonHandler.writeValueAsString(messages) + ";";

其次,在我使用的任何jsp / html文件中:

<script src ="i18n.js"></script>

因此,我可以从任何extjs文件访问我的变量并解析i18n消息:

items: [ {
        fieldLabel: i18n.user_username,
        name: 'j_username',
        allowBlank: false,
        listeners: {
            specialkey: function(field, e) {
                if (e.getKey() == e.ENTER) {
                    submitForm();
                }
            }
        }
    }
    return output.getBytes(StandardCharsets.UTF_8);
}

缺点:

  1. 为什么使用我自己的解决方案,而spring让类实现相同的解决方案(使项目完全成为春天)
  2. 如果我的propoerties文件messages_en.preoperties有一个巨大的条目,让我们说js文件只会使用2个字段,在这里,我加载了完整的条目:( ==&gt;糟糕的表现。
  3. 那么,如何解决来自extjs的i18n消息并使用spring而不使用我的解决方案?

    感谢。

0 个答案:

没有答案