Java web应用程序i18n
我被赋予了一项(相当艰巨的)任务,即使用2.3servlet规范将i18n引入J2EEWeb应用程序。该应用程序非常庞大,并已在超过8年的积极发展 因此,我希望第一次就把事情做好,这样我就可以限制在JSP、JavaScript文件、servlet和其他任何地方乱写的时间,用消息包中的值替换硬编码字符串 这里没有使用框架。我如何接近支持i18n。请注意,我希望每个视图都有一个从属性文件加载文本的JSP,而不是每个受支持的语言环境都有一个不同的JSP 我想我的主要问题是,我是否可以在“后端”的某个地方设置语言环境(即,登录时从用户配置文件读取语言环境,并在会话中存储值),然后期望JSP页面能够从正确的属性文件(即,当语言环境为法语时,从消息\u fr.properties)正确加载指定的字符串)与添加逻辑以在每个JSP中找到正确的语言环境相反Java web应用程序i18n,java,jsp,internationalization,Java,Jsp,Internationalization,我被赋予了一项(相当艰巨的)任务,即使用2.3servlet规范将i18n引入J2EEWeb应用程序。该应用程序非常庞大,并已在超过8年的积极发展 因此,我希望第一次就把事情做好,这样我就可以限制在JSP、JavaScript文件、servlet和其他任何地方乱写的时间,用消息包中的值替换硬编码字符串 这里没有使用框架。我如何接近支持i18n。请注意,我希望每个视图都有一个从属性文件加载文本的JSP,而不是每个受支持的语言环境都有一个不同的JSP 我想我的主要问题是,我是否可以在“后端”的某个地
有什么办法吗?您可以使用JSTL标准标记库和标记来实现这一点。获取JSTL规范的副本,阅读i8N章节,其中讨论了一般文本+日期、时间和货币。写得非常清楚,并向您展示了如何使用标记完成所有操作。您还可以通过编程方式设置区域设置之类的内容,您不需要(也不应该)为每个区域设置一个单独的JSP文件。困难的任务是找出未加密的密钥,并将它们移动到每个区域设置的文件中,例如messages\u en.properties、messages\u fr.properties等等 根据您的逻辑,区域设置计算可以在多个位置进行。我们支持存储在数据库中的用户区域设置以及浏览器区域设置。进入应用程序的每个请求都会有一个“Accept Language”(接受语言)标题,该标题指示浏览器配置的语言,并带有首选项,即先日语,然后英语。如果是这种情况,应用程序应该读取messages_ja.properties,对于不在该文件中的密钥,则返回messages_en.properties。对于存储在数据库中的用户区域设置也是如此。请注意,该标准只是在浏览器中切换语言,并希望内容是i18n-ed(我们最初在数据库中存储区域设置,然后从浏览器中转移到支持区域设置)。此外,由于翻译器无法将键和值从英语(主语言文件)复制到其他语言,因此您仍需要默认值,因此,对于其他文件中没有的值,您需要将其默认为英语
我还发现,当把翻译工作交给其他懂某种语言的人时,这非常有用,它为我们节省了很多时间 应用程序国际化时,有很多事情需要注意: 现场检测 您需要考虑的第一件事是检测最终用户的区域设置。根据您想要支持的内容,它可能很简单,也可能有点复杂
request.getLocale()
。如果你不打算支持任何幻想,你可以坚持这个方法Spring框架将允许您非常轻松地实现上述所有场景,这就是我喜欢它的原因 字符串外部化 这应该很容易,对吧?嗯,主要是-只需使用适当的标签。您可能面临的唯一问题是外部化客户端(JavaScript)文本。有几种可能的方法,但让我提一下这两种:
它更容易维护,因为您将有一个中心点来添加可翻译字符串
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">