【问题标题】:How to create mult language web application in jsp servlet?如何在 jsp servlet 中创建多语言 Web 应用程序?
【发布时间】:2018-06-12 11:55:35
【问题描述】:

我已经创建了网络应用程序但不确定,如何实现多语言支持,如印地语等。I18N 可以解决这个问题还是谷歌翻译可以解决这个问题?

【问题讨论】:

    标签: java jsp internationalization


    【解决方案1】:

    这只是一个大概的想法:

    为每种语言制作 1 个单独的键值对文件

    • 每个单词或句子都有唯一的键(hi=Hello、hi=Hola 等)
    • 不要将硬编码文本放入 jsp 中
    • 创建一个在启动时将所有语言加载到哈希图中的单例
    • 创建 1 个标签,用于根据给定的语言环境从哈希图中获取文本 和唯一的密钥
    • 在jsp中使用标签<sp:message code="hi" />
    • 从浏览器请求(或用户偏好)中获取语言环境

    ..或者只使用 Spring 为您完成所有这些事情。

    【讨论】:

      【解决方案2】:

      在此处查看 BalusC 的答案:How to internationalize a Java web application?

      BalusC:

      对于基本的 JSP/Servlet Web 应用程序,基本方法 将使用 JSTL fmt taglibresource bundles。资源包包含键值对,其中 键是一个常数,对于所有语言都是相同的,并且 值因语言而异。资源包通常是properties files,由ResourceBundle API 加载。这个可以 但是可以自定义,以便您可以从 例如数据库。

      这是一个如何国际化您的登录表单的示例 具有基于属性文件的资源包的 web 应用程序。


      1. 创建以下文件并将它们放入某个包中,例如com.example.i18n (如果是 Maven,则将它们放入包中 src/main/resources) 中的结构。

        text.properties(包含默认语言的键值对,通常为英语)

        login.label.username = 用户名 login.label.password = 密码 login.button.submit = 登录

        text_nl.properties(包含荷兰语 (nl) 键值对)

        login.label.username = Gebruikersnaam login.label.password = Wachtwoord login.button.submit = 登录

        text_es.properties(包含西班牙语 (es) 键值对)

        login.label.username = 别名 login.label.password = Contraseña login.button.submit = 加速器

        资源包文件名应遵循以下模式name_ll_CC.properties_ll 部分应该是小写的ISO 693-1 语言代码。它是可选的,仅在 _CC 部分存在。 _CC 部分应该是大写的ISO 3166-1 Alpha-2 国家代码。它是可选的,通常只用于 区分特定国家/地区的语言方言,例如 American English (_en_US) 和 British English (_en_GB)。


      2. 如果尚未完成,请安装 JSTL。如果您在 Servlet 2.5 容器或更新版本(Tomcat 6.0 等)上运行并且您的 web.xml 是 声明符合 Servlet 2.5 规范,然后放 jstl-1.2.jar 在 webapp 的 /WEB-INF/lib 文件夹中。


      3. 创建以下示例 JSP 文件并将其放在 web 内容文件夹中。

        login.jsp

        <%@ page pageEncoding="UTF-8" %>
        <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
        <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
        <c:set var="language" value="${not empty param.language ? param.language : not empty language ? language :
        

        pageContext.request.locale}" scope="session" /> JSP/JSTL i18n 演示 英语 荷兰 西班牙文 :

        &lt;c:set var="language"&gt; 管理当前语言。如果语言作为请求参数提供(通过语言下拉菜单), 然后它将被设置。否则,如果之前已经设置了语言 在会话中,然后坚持下去。否则使用用户提供的 请求标头中的语言环境。

        &lt;fmt:setLocale&gt; 设置资源包的区域设置。重要的是,这一行位于&lt;fmt:setBundle&gt; 之前

        &lt;fmt:setBundle&gt; 通过其基本名称初始化资源包(即完整的限定包名称,直到唯一 没有_ll_CC 说明符的名称)。

        &lt;fmt:message&gt; 通过指定的捆绑键检索消息值。

        &lt;html lang="${language}"&gt; 通知搜索机器人该页面使用什么语言,这样它就不会被标记为重复 内容(因此,有利于 SEO)。

        The language dropdown will immediately submit by JavaScript when another language is chosen and the page will be refreshed with the 新选择的语言。


      但是您需要记住,属性文件是默认的 使用 ISO-8859-1 字符编码读取。你需要逃跑 它们通过 unicode 转义。这可以使用 JDK 提供的 native2ascii.exe 工具。另请参阅this article section 了解更多信息 细节。

      理论上的替代方案是为捆绑包提供自定义 Control 将这些文件加载​​为 UTF-8,但不幸的是 基本 JSTL fmt taglib 不支持。你需要管理 在Filter 的帮助下,一切都由您自己完成。有(MVC)框架 它可以以更透明的方式处理这个问题,如 JSF,另见 this article.

      【讨论】:

      • 谢谢,它工作得很好,但是如何将当前语言详细信息发布到 servlet。是否可以使用会话 setAttribute?
      • 是的,我认为会话应该是你的做法。 (除非您想继续检查每个请求用户的语言偏好是什么)
      猜你喜欢
      • 2016-02-01
      • 2015-07-21
      • 2011-05-14
      • 1970-01-01
      • 2013-07-28
      • 2012-04-20
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      相关资源
      最近更新 更多