Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JSP/Servlet和HTML5/JavaScript Web应用程序中支持具有本地化字符串的多种语言_Java_Javascript_Jsp_Servlets_Localization - Fatal编程技术网

在JSP/Servlet和HTML5/JavaScript Web应用程序中支持具有本地化字符串的多种语言

在JSP/Servlet和HTML5/JavaScript Web应用程序中支持具有本地化字符串的多种语言,java,javascript,jsp,servlets,localization,Java,Javascript,Jsp,Servlets,Localization,我有一个使用JSP/Servlet框架编写的web动态项目,客户端使用HTML5/CSS和JavaScript。这意味着服务器端编程语言是Java标准语言或JSP页面的scriptlet内部语言,而客户端编程语言是JavaScript 我需要一种方法来管理翻译成多种语言(如英语、意大利语、西班牙语、法语…)的字符串,这些字符串必须根据用户使用的语言(即浏览器的语言)使用。我可以通过为每种语言定义字符串列表来实现这一点,例如,为每种语言使用XML文件,如下例所示: <!-- File: en

我有一个使用JSP/Servlet框架编写的web动态项目,客户端使用HTML5/CSS和JavaScript。这意味着服务器端编程语言是Java标准语言或JSP页面的scriptlet内部语言,而客户端编程语言是JavaScript

我需要一种方法来管理翻译成多种语言(如英语、意大利语、西班牙语、法语…)的字符串,这些字符串必须根据用户使用的语言(即浏览器的语言)使用。我可以通过为每种语言定义字符串列表来实现这一点,例如,为每种语言使用XML文件,如下例所示:

<!-- File: en-US.xml -->
<list lang="en-US">
    <string>
        <key>hello</key>
        <value>Hello!</value>
    </string>
</list>

<!-- File: es-ES.xml -->
<list lang="es-ES">
    <string>
        <key>hello</key>
        <value>¡Hola!</value>
    </string>
</list>

<!-- File: it-IT.xml -->
<list lang="it-IT">
    <string>
        <key>hello</key>
        <value>Ciao!</value>
    </string>
</list>
通过这种方式,我可以从JavaScript或JSP/Servlet使用该文件,并获取字符串。 这可能意味着我需要两个方法:第一个用于服务器端Servlet和JSP,第二个用于客户端。但我不确定是否有一种独特的方法可以做到这一点

我的问题是:

在JSP/Servlet/JavaScript web应用程序中管理本地化字符串的最佳方法是什么?是否有一些预定义的方法可以利用一些API? 有没有一种方法可以做到这一点:在一个文件中为每种语言定义字符串,并从JSP/Servlet和JavaScript中使用它们?
一个简单的解决方案是在服务器端使用。您只需将所有语言翻译文件放在类路径的同一目录中,例如/org/example/nls/ihm.properties Locale.ROOT/org/example/nls/ihm_fr.properties Locale.FRENCH/org/example/nls/ihm_de.properties Locale.derman

保持区域设置的常用方法是将其名称存储在会话属性中,例如区域设置

然后,您可以从servlet轻松访问它们:

String localeName = request.getSession().getAttribute("LOCALE");
if (localeName == null) { localeName = Locale.ROOT; }
Locale locale = new Locale(request.getSession);
ResourceBundle bundle = ResourceBundle.getBundle("org.sba.nls.ihm", locale);
String cancel = bundle.getString("CANCEL"); // gives Annuler (value from ihm_fr)
如果您请求一个没有提供翻译的区域设置,那么最终将使用JVM默认区域设置。我的建议是使用Locale.setDefaultLocale.ROOT;在初始化代码中的某个地方,以确保将ihm用于未知区域设置

使用JSTL从JSP文件中几乎同样容易:

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
...
<jsp:useBean id="LOCALE" scope="session" class="java.lang.String"/>
<fmt:setLocale value="${LOCALE}"/>
<fmt:setBundle basename="org.example.nls.ihm" var ="ihm"/>
...
<fmt:setBundle basename="org.sba.nls.ihm" var ="ihm"/>
<fmt:message key="CANCEL" bundle="${ihm}"/>
当然,由于翻译文件位于服务器端,因此不能在客户端javascript上直接使用它们。但您可以轻松使用JSP生成包含有用翻译的JSON字符串:

<%@page contentType="application/json" pageEncoding="UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<jsp:useBean id="LOCALE" scope="session" class="java.lang.String"/>
<fmt:setLocale value="${LOCALE}"/>
<fmt:setBundle basename="org.sba.nls.ihm" var ="ihm"/>
{ CANCEL: <fmt:message key="CANCEL" bundle="${ihm}"/> }

然后,您可以从客户端javascript获取它并将其用于翻译,一个简单的解决方案是在服务器端使用。您只需将所有语言翻译文件放在类路径的同一目录中,例如/org/example/nls/ihm.properties Locale.ROOT/org/example/nls/ihm_fr.properties Locale.FRENCH/org/example/nls/ihm_de.properties Locale.derman

保持区域设置的常用方法是将其名称存储在会话属性中,例如区域设置

然后,您可以从servlet轻松访问它们:

String localeName = request.getSession().getAttribute("LOCALE");
if (localeName == null) { localeName = Locale.ROOT; }
Locale locale = new Locale(request.getSession);
ResourceBundle bundle = ResourceBundle.getBundle("org.sba.nls.ihm", locale);
String cancel = bundle.getString("CANCEL"); // gives Annuler (value from ihm_fr)
如果您请求一个没有提供翻译的区域设置,那么最终将使用JVM默认区域设置。我的建议是使用Locale.setDefaultLocale.ROOT;在初始化代码中的某个地方,以确保将ihm用于未知区域设置

使用JSTL从JSP文件中几乎同样容易:

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
...
<jsp:useBean id="LOCALE" scope="session" class="java.lang.String"/>
<fmt:setLocale value="${LOCALE}"/>
<fmt:setBundle basename="org.example.nls.ihm" var ="ihm"/>
...
<fmt:setBundle basename="org.sba.nls.ihm" var ="ihm"/>
<fmt:message key="CANCEL" bundle="${ihm}"/>
当然,由于翻译文件位于服务器端,因此不能在客户端javascript上直接使用它们。但您可以轻松使用JSP生成包含有用翻译的JSON字符串:

<%@page contentType="application/json" pageEncoding="UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<jsp:useBean id="LOCALE" scope="session" class="java.lang.String"/>
<fmt:setLocale value="${LOCALE}"/>
<fmt:setBundle basename="org.sba.nls.ihm" var ="ihm"/>
{ CANCEL: <fmt:message key="CANCEL" bundle="${ihm}"/> }

然后,您可以从客户端javascript获取它并将其用于翻译

在服务器端使用您想要的任何技术。您可以按照所述使用xml文件,也可以基于ResourceBundle使用java中包含的标准i18n。在本例中,您将为每种语言创建属性文件,请参阅以了解如何执行此操作

现在,在java/servlet中,您首先通过访问request.getLocales来读取浏览器发送给您的区域设置

在浏览器中使用语言环境,在java/servlet中,您以标准方式读取翻译,所以在ResourceBundle中,您可以这样做

Locale locale = getLocaleBasingOnRequest(HttpServletRequest request); // read the locale sent by browser by accesing request.getLocales()

ResourceBundle bundle = ResourceBundle.getBundle("Translations_file", locale);
for (String key : bundle.keySet()) {
  System.out.println(key);
  System.out.println(bundle.getString(key));
}
现在,为了在javascript中获得相同的翻译,您可以将翻译动态输出到javascript文件。例如,您可以创建TranslationServlet,将javascript翻译输出到javascript数组

public class TranslationServlet extends javax.servlet.http.HttpServlet {


      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          Locale locale = getLocaleBasingOnRequest(HttpServletRequest request); // read the locale sent by browser by accesing request.getLocales()

          ResourceBundle bundle = ResourceBundle.getBundle("Translations_file", locale); // get the tranlation strings

          resp.getWriter().println("var translations = new Object();");
          for (String key : bundle.keySet()) {
              resp.getWriter().println("translations[\"" + key + "\"] = \"" +   bundle.getString(key) + "\";");
          }

      }
}
上面的servlet应该动态生成带有翻译的javascript文件,因此它应该输出如下内容:

var translations = new Object();
translations["key1"] = "Test";
translations["key2"] = "Test2";
有了这种动态翻译,您只需添加javascript脚本标记即可将其包含在每个html页面中:

<script type="text/javascript" src="/translations-servlet" />

在服务器端使用您想要的任何技术。您可以按照所述使用xml文件,也可以基于ResourceBundle使用java中包含的标准i18n。在本例中,您将为每种语言创建属性文件,请参阅以了解如何执行此操作

现在,在java/servlet中,您首先通过访问request.getLocales来读取浏览器发送给您的区域设置

在浏览器中使用语言环境,在java/servlet中,您以标准方式读取翻译,所以在ResourceBundle中,您可以这样做

Locale locale = getLocaleBasingOnRequest(HttpServletRequest request); // read the locale sent by browser by accesing request.getLocales()

ResourceBundle bundle = ResourceBundle.getBundle("Translations_file", locale);
for (String key : bundle.keySet()) {
  System.out.println(key);
  System.out.println(bundle.getString(key));
}
现在有相同的翻译 在javascript中,您可以将翻译动态输出到javascript文件。例如,您可以创建TranslationServlet,将javascript翻译输出到javascript数组

public class TranslationServlet extends javax.servlet.http.HttpServlet {


      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          Locale locale = getLocaleBasingOnRequest(HttpServletRequest request); // read the locale sent by browser by accesing request.getLocales()

          ResourceBundle bundle = ResourceBundle.getBundle("Translations_file", locale); // get the tranlation strings

          resp.getWriter().println("var translations = new Object();");
          for (String key : bundle.keySet()) {
              resp.getWriter().println("translations[\"" + key + "\"] = \"" +   bundle.getString(key) + "\";");
          }

      }
}
上面的servlet应该动态生成带有翻译的javascript文件,因此它应该输出如下内容:

var translations = new Object();
translations["key1"] = "Test";
translations["key2"] = "Test2";
有了这种动态翻译,您只需添加javascript脚本标记即可将其包含在每个html页面中:

<script type="text/javascript" src="/translations-servlet" />

将JSTL与属性文件一起用于语言翻译是一个选项吗?我不知道任何选项,我需要知道哪些选项可用。是你告诉我该怎么做;将JSTL与属性文件一起用于语言翻译是一个选项吗?我不知道任何选项,我需要知道哪些选项可用。是你告诉我该怎么做;