Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.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
Java web应用程序i18n_Java_Jsp_Internationalization - Fatal编程技术网

Java web应用程序i18n

Java web应用程序i18n,java,jsp,internationalization,Java,Jsp,Internationalization,我被赋予了一项(相当艰巨的)任务,即使用2.3servlet规范将i18n引入J2EEWeb应用程序。该应用程序非常庞大,并已在超过8年的积极发展 因此,我希望第一次就把事情做好,这样我就可以限制在JSP、JavaScript文件、servlet和其他任何地方乱写的时间,用消息包中的值替换硬编码字符串 这里没有使用框架。我如何接近支持i18n。请注意,我希望每个视图都有一个从属性文件加载文本的JSP,而不是每个受支持的语言环境都有一个不同的JSP 我想我的主要问题是,我是否可以在“后端”的某个地

我被赋予了一项(相当艰巨的)任务,即使用2.3servlet规范将i18n引入J2EEWeb应用程序。该应用程序非常庞大,并已在超过8年的积极发展

因此,我希望第一次就把事情做好,这样我就可以限制在JSP、JavaScript文件、servlet和其他任何地方乱写的时间,用消息包中的值替换硬编码字符串

这里没有使用框架。我如何接近支持i18n。请注意,我希望每个视图都有一个从属性文件加载文本的JSP,而不是每个受支持的语言环境都有一个不同的JSP

我想我的主要问题是,我是否可以在“后端”的某个地方设置语言环境(即,登录时从用户配置文件读取语言环境,并在会话中存储值),然后期望JSP页面能够从正确的属性文件(即,当语言环境为法语时,从消息\u fr.properties)正确加载指定的字符串)与添加逻辑以在每个JSP中找到正确的语言环境相反


有什么办法吗?

您可以使用JSTL标准标记库和标记来实现这一点。获取JSTL规范的副本,阅读i8N章节,其中讨论了一般文本+日期、时间和货币。写得非常清楚,并向您展示了如何使用标记完成所有操作。您还可以通过编程方式设置区域设置之类的内容,您不需要(也不应该)为每个区域设置一个单独的JSP文件。困难的任务是找出未加密的密钥,并将它们移动到每个区域设置的文件中,例如messages\u en.properties、messages\u fr.properties等等

根据您的逻辑,区域设置计算可以在多个位置进行。我们支持存储在数据库中的用户区域设置以及浏览器区域设置。进入应用程序的每个请求都会有一个“Accept Language”(接受语言)标题,该标题指示浏览器配置的语言,并带有首选项,即先日语,然后英语。如果是这种情况,应用程序应该读取messages_ja.properties,对于不在该文件中的密钥,则返回messages_en.properties。对于存储在数据库中的用户区域设置也是如此。请注意,该标准只是在浏览器中切换语言,并希望内容是i18n-ed(我们最初在数据库中存储区域设置,然后从浏览器中转移到支持区域设置)。此外,由于翻译器无法将键和值从英语(主语言文件)复制到其他语言,因此您仍需要默认值,因此,对于其他文件中没有的值,您需要将其默认为英语


我还发现,当把翻译工作交给其他懂某种语言的人时,这非常有用,它为我们节省了很多时间

应用程序国际化时,有很多事情需要注意:

现场检测

您需要考虑的第一件事是检测最终用户的区域设置。根据您想要支持的内容,它可能很简单,也可能有点复杂

  • 您肯定知道,web浏览器倾向于通过HTTP Accept language标头发送最终用户的首选语言。在Servlet中访问此信息可能很简单,只需调用
    request.getLocale()
    。如果你不打算支持任何幻想,你可以坚持这个方法
  • 如果您的应用程序中有用户配置文件,则可能需要向其中添加首选语言和首选格式语言环境。在这种情况下,您需要在用户登录后切换区域设置
  • 您可能希望支持基于URL的语言切换(例如:或)。您需要根据URL信息设置有效的区域设置-这可以通过多种方式完成(例如URL过滤器)
  • 您可能希望支持语言切换(从下拉菜单中选择),但我不推荐它(除非它与第3点结合使用)
  • JSTL如果您只想支持第一种方法,或者不打算添加任何其他依赖项(如Spring框架),那么这种方法就足够了

    虽然我们在Spring Framework中,但它有很多很好的特性,您可以使用它们来检测区域设置(如和),并将字符串和格式化消息外部化(请参阅)。
    Spring框架将允许您非常轻松地实现上述所有场景,这就是我喜欢它的原因

    字符串外部化

    这应该很容易,对吧?嗯,主要是-只需使用适当的标签。您可能面临的唯一问题是外部化客户端(JavaScript)文本。有几种可能的方法,但让我提一下这两种:

  • 让每个JSP编写翻译字符串的数组(带有消息标记),并在客户机代码中简单地访问该数组。这是一种更简单的方法,但可维护性较差——您需要从有效页面(实际引用客户端脚本的页面)中编写有效字符串。我以前做过,相信我,在大型应用程序中,这不是您想要做的事情(但对于小型应用程序来说,这可能是最好的解决方案)
  • 另一种方法在原则上可能听起来很难,但实际上在将来更容易处理。其思想是将字符串集中在客户端(将它们移动到一些常见的JavaScript文件)。之后,您需要实现自己的Servlet,该Servlet将根据请求返回该脚本——内容应该被翻译。您将无法在此处使用JSTL,您需要直接从资源束中获取字符串。
    它更容易维护,因为您将有一个中心点来添加可翻译字符串
  • 串联

    我不想这么说,但是从本地化的角度来看,连接确实很痛苦
    String securityPolicy = "Security " + "policy";
    
    <p><span style="font-weight:bold">Security</span> policy</p>
    
    <fmt:formatDate value="${someController.somedate}" 
        timeZone="${someController.detectedTimeZone}"
        dateStyle="default" 
        timeStyle="default" />
    
    <fmt:formatNumber value="1.21" type="currency"/> 
    
    // Multiple plural forms
    English: 4 viruses found.
    Polish: Znaleziono 4 wirusy. **OR** Znaleziono 5 wirusów.
    
    // Conjugation
    English: Program encountered incorrect character | Application encountered incorrect character.
    Polish: Program napotkał nieznaną literę | Aplikacja napotkała nieznaną literę.
    
    <%@ page contentType="text/html; charset=UTF-8" %>
    
    <%@page pageEncoding="UTF-8" %>
    
    <META http-equiv="Content-Type" content="text/html;charset=UTF-8">