【问题标题】:Get String out of ResourceBundle in javascript and HTML在 JavaScript 和 HTML 中从 ResourceBundle 中获取字符串
【发布时间】:2016-02-18 07:54:20
【问题描述】:

我在我们的网站上将它用于不同的语言:

Locale locale2 = (Locale)session.getAttribute("org.apache.struts.action.LOCALE");
ResourceBundle bundle = ResourceBundle.getBundle("content.test.Language", locale2);

我可以通过以下方式轻松访问 HTML 中 ResourceBundle 的字符串值以将其包含在网站上:

<%= bundle.getString("line1") %>

但在某些情况下,我需要从 javascript 中访问字符串值。 到目前为止,我还没有找到方法。

我只发现了一个丑陋的解决方法来获取字符串值。

在 HTML 部分我包括:

<input type="hidden" name="hiddenLine2" id="hiddenLine2" value=<%= bundle.getString("line2") %>>

我对我可能需要的所有字符串都这样做。 要从 javascript 中访问其中一个,我这样做:

var line2 = document.getElementById("hiddenLine2").value;

到目前为止这是有效的,但我不喜欢它。

我相信会有更好的解决方案。

【问题讨论】:

  • Javascript 运行在客户端,Java 运行在服务器端。如果您需要访问客户端上的捆绑内容,您必须将它们嵌入到生成的 HTML 中并发送到 Javascript 可以使用它们的客户端。

标签: javascript java html jsp


【解决方案1】:

一些可能的解决方案。

  1. 使用 ajax 方法通过传递密钥来获取资源。
  2. 使用隐藏的输入字段并加载值。
  3. 使用专门的jsp页面来声明js变量甚至是js函数根据key取值。

    像这样。

<script type="text/javascript">

    var messageOne = '<%=bundle.getString("line1") %>';
    var messageTwo = '<%=bundle.getString("line2") %>';

</script>

【讨论】:

    【解决方案2】:

    jsp 文件中使用脚本&lt;% %&gt; 通常是不好的做法。

    您可以使用 jstl 核心库中的 fmt 标记从资源包中获取信息。

    <fmt:bundle basename="bundle">
        <fmt:message var="variableName" key="bundleKey" />
    </fmt:bundle>
    
    <input type="hidden" name="hiddenLine2" id="hiddenLine2" value="${variableName}">
    

    应该工作

    其实,我想你也可以直接用EL把它嵌入到javascript中

    var line2 = ${variableName}; //instead of getting it from document.getElement(...)
    

    【讨论】:

      【解决方案3】:

      根据我的尝试,您可以使用 jstl 库将翻译后的消息直接打印到 JavaScript 中,例如:

      alert("<fmt:message key='line1'/>");
      

      如果您使用 struts2 处理语言环境,您可以轻松定义您的 Bundle,获取 struts2 语言环境(由默认堆栈上的 i18nInterceptor 保存)或用户请求语言环境(客户端的浏览器之一)

      <!-- //Import the requierd libraries -->
      <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
      <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      
      <!-- //Take the Locale from struts if it's present and from the user request if not -->
      <c:set var="locale" value="${not empty sessionScope.WW_TRANS_I18N_LOCALE 
      ? sessionScope.WW_TRANS_I18N_LOCALE : pageContext.request.locale}"/>
      
      <!-- //Get the bundle based on the Locale -->
      <fmt:setLocale value="${locale}"/>
      <fmt:setBundle basename="content.test.Language"/>
      

      但是如果您希望将来能够将该 JavaScript 代码提取到外部 .js 文件中,我建议您使用一些可用于 JavaScript 的内部化库,例如 Globalize(这是我唯一使用过的,但网上有很多)。

      使用外部 JavaScript 库进行国际化的缺点是您必须直接在 .js 文件上定义翻译资源,无法通过 JavaScript 等基于客户端的语言访问服务器上的 .properties。

      【讨论】:

        【解决方案4】:

        这是一个不同的解决方案。

        1. 像 OP 一样加载包,方法是 getBundle()
        2. 使用 Arun 回答中的第三个选项,创建一个单独的 JSP 文件来创建自定义 JavaScript 对象。

        这是上述JSP的内容:

        <%@page import="com.tenea.intranet.conf.Conf" %>
        <%@page import="java.util.ResourceBundle,
                        java.util.Enumeration" %>
        
        <script type="text/javascript">
            var _get = function(ID){
                if (this.hasOwnProperty(ID))    return this[ID];
                else {
                    console.warn("[Resources] Error al obtener clave <"+ ID +">");
                    return "[ERROR]";
                }
            };
            var _search = function(text){
                var elems = { }
                Object.keys(this).map(e => {
                    if (typeof (this[e]) !== "function" && this[e].includes(text)) { elems[e] = this[e]; }
                });
                return elems;
            };
        
            var Resources = {
                <% 
                    ResourceBundle labels = ResourceBundle.getBundle("content.test.Language", locale2);
                    Enumeration<String> e = labels.getKeys();
                    while (e.hasMoreElements()) {
                        String param = e.nextElement();
        
                        out.print(param +":\""+ labels.getString(param) +"\"");
                        if (e.hasMoreElements())    out.println(",");
                    }
                %>
            };
            Resources._get = _get;
            Resources._search = _search;
        
        </script>
        

        这个 JSP 的作用是:

        • 创建对象资源
        • 使用一些 sn-ps(抱歉 Martin :p),并在 resourceBundle 中的键列表上进行迭代,对于每个键,我使用 out.println() 打印出类似“key: value”的行。

        生成的对象是这样的:

        Resources {
            abrilAbrText: "Apr"
            abrilText: "April"
            ...
        }
        

        为了实现一些额外的功能,我还在 Resources 中添加了 2 个函数。

        _get() 返回与作为参数传递的键相关的文本。如果该键不存在,则返回文本“[ERROR]”。

        _search() 是我为开发目的添加的一个函数。它使用每个键搜索并返回一个自定义对象,其对应的文本包含作为参数传递的文本。注意:由于它使用“e => {}”,因此在 IE 或 Safari 上无法使用,因此最好在开发阶段结束后对其进行评论。

        一旦你创建了这个 JSP,要使用它,你只需要将它导入到任何你想要的 JSP 中:

        <%@include file="[relative_path]" %>
        

        希望对您有所帮助! :)

        【讨论】:

          猜你喜欢
          • 2013-11-07
          • 2019-02-10
          • 2018-09-15
          • 1970-01-01
          • 2012-01-19
          • 2011-04-12
          • 1970-01-01
          • 1970-01-01
          • 2022-10-21
          相关资源
          最近更新 更多