如何国际化/本地化 JSP/Servlet Web 应用程序?

2023-12-06

我从谷歌了解到,国际化是我可以使自己的 Web 应用程序使用所有语言。我想了解Unicode国际化的过程,所以我从here and there.

我能够理解 Unicode,即字符集如何编码为字节,然后又如何将字节解码为字符集。但我不知道如何继续前进。我想学习如何比较字符串,并且需要知道如何在我的 Web 应用程序中实现国际化。有什么建议吗?请指导我。

我的目标:

我的主要目标是开发一个用于翻译的网络应用程序(英语到阿拉伯语,反之亦然)。我想遵循国际化。我希望在所有三种浏览器(FF、Chrome、IE)中运行我的网络应用程序进行翻译。我该如何实现这一目标?


对于基本的 JSP/Servlet Web 应用程序,基本方法是使用JSTL fmt taglib结合资源包。资源包包含键值对,其中键是一个常量,对于所有语言都相同,而值因语言而异。资源包通常是属性文件哪些是由加载的ResourceBundleAPI。但是,这可以自定义,以便您可以从数据库等加载键值对。

以下是如何使用基于属性文件的资源包国际化 Web 应用程序的登录表单的示例。


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

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

    
    
     login.label.username = Username
     login.label.password = Password
     login.button.submit = Sign in
       

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

    
    
     login.label.username = Gebruikersnaam
     login.label.password = Wachtwoord
     login.button.submit = Inloggen
       

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

    
    
     login.label.username = Nombre de usuario
     login.label.password = Contraseña
     login.button.submit = Acceder
       

    资源包文件名应遵循以下模式name_ll_CC.properties. The _ll部分应该是小写ISO 693-1语言代码。它是可选的,并且仅在以下情况下才需要_CC部分存在。这_CC部分应该是大写ISO 3166-1 Alpha-2国家代码。它是可选的,通常仅用于区分特定国家/地区的语言方言,例如美式英语 (_en_US) and 英式英语 (_en_GB).


  2. 如果尚未完成,请按照此答案中的说明安装 JSTL:如何安装JSTL?绝对uri:http://java.sun.com/jstl/core无法解析.


  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" />
     <fmt:setLocale value="${language}" />
     <fmt:setBundle basename="com.example.i18n.text" />
     <!DOCTYPE html>
     <html lang="${language}">
         <head>
             <title>JSP/JSTL i18n demo</title>
         </head>
         <body>
             <form>
                 <select id="language" name="language" onchange="submit()">
                     <option value="en" ${language == 'en' ? 'selected' : ''}>English</option>
                     <option value="nl" ${language == 'nl' ? 'selected' : ''}>Nederlands</option>
                     <option value="es" ${language == 'es' ? 'selected' : ''}>Español</option>
                 </select>
             </form>
             <form method="post">
                 <label for="username"><fmt:message key="login.label.username" />:</label>
                 <input type="text" id="username" name="username">
                 <br>
                 <label for="password"><fmt:message key="login.label.password" />:</label>
                 <input type="password" id="password" name="password">
                 <br>
                 <fmt:message key="login.button.submit" var="buttonValue" />
                 <input type="submit" name="submit" value="${buttonValue}">
             </form>
         </body>
     </html>
    

    The <c:set var="language">管理当前语言。如果语言作为请求参数提供(通过语言下拉列表),那么它将被设置。否则,如果先前已在会话中设置语言,则坚持使用它。否则,请在请求标头中使用用户提供的区域设置。

    The <fmt:setLocale>设置资源包的区域设置。重要的是这条线是before the <fmt:setBundle>.

    The <fmt:setBundle>通过资源包的基本名称(即完全限定的包名称)初始化资源包,直到使用不带唯一名称的名称_ll_CC说明符)。

    The <fmt:message>通过指定的捆绑密钥检索消息值。

    The <html lang="${language}">通知搜索机器人页面使用的语言,这样就不会被标记为重复内容(因此,有利于 SEO)。

    当选择另一种语言时,语言下拉列表将立即由 JavaScript 提交,并且页面将使用新选择的语言刷新。


但是,您需要记住,默认情况下,属性文件是使用 ISO-8859-1 字符编码读取的。您需要通过 unicode 转义来转义它们。这可以使用 JDK 提供的native2ascii.exe工具。也可以看看本文部分了解更多详情。

理论上的替代方案是提供一个带有自定义的捆绑包Control将这些文件加载​​为 UTF-8,但不幸的是基本 JSTL 不支持fmt标签库。您需要在某人的帮助下自行管理这一切Filter。有(MVC)框架可以以更透明的方式处理这个问题,例如 JSF,另请参阅本文.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何国际化/本地化 JSP/Servlet Web 应用程序? 的相关文章

  • 是否允许在 URL 中使用非英语 (ASCII) 字符以进行 SEO?

    我有很多 UTF 8 内容 我想将它们插入到 URL 中以用于 SEO 目的 例如 我想要包含在 URI 中的帖子标签 site com tags id TAG NAME 但是 标准仅允许 ASCII 字符 URI 中允许的字符 但没有保留
  • $(印度卢比符号)符号打印为? (问号)使用 Apache PDFBOX 生成 pdf

    我正在尝试在使用 apache pdfbox 创建的 pdf 文件中写入一个字符串 我使用 ISO 8859 1 作为 UTF 8 编码 但它仍然在打印问号 尝试了很多并在互联网上寻找解决方案 StackOverflow 有人可以帮忙吗 提
  • Xcode 6.3 和 Swift:Unicode 实用程序(例如 UCKeyTranslate)不可用?

    我有以下测试代码 import Cocoa import Carbon let x kUCKeyActionDisplay 在 Xcode 6 2 中没有问题 但在 Xcode 6 3 中此代码会引发错误 错误信息是 Use of unre
  • 在Python中清理属于不同语言的文本

    我有一个文本集合 其中的句子要么完全是英语 印地语或马拉地语 每个句子附加的 id 为 0 1 2 分别代表文本的语言 无论任何语言的文本都可能有 HTML 标签 标点符号等 我可以使用下面的代码清理英语句子 import HTMLPars
  • JSP重定向和传值

    我有一个 JSP 其中我重定向到另一个 jsp 例如 我在该jsp中没有任何其他数据 我想将值从该jsp index jsp 传递到重定向jsp login jsp 我将如何做到这一点 这里的 logonInput 是在struts con
  • 在 Portlet 环境中使用 jsp:param / c:param

    我正在尝试包含 JSP 页面jsp param在 Portlet 环境中 使用Pluto http portals apache org pluto Portlet 容器 例如
  • FAT-32 上的 Unicode 文件名?

    据我了解 NTFS 支持 Unicode 文件名 正如 Microsoft 声称的那样 UTF 16 但官方 MSDN 文档对于使用什么代码页在 FAT 32 上存储文件名 文件路径 非常模糊 这里说的是OEM 代码页 我假设是CP437
  • 标准化 Unicode

    在Python中是否有一种标准方法来规范化unicode字符串 以便它只理解可用于表示它的最简单的unicode实体 我的意思是 可以翻译类似序列的东西 LATIN SMALL LETTER A COMBINING ACUTE ACCENT
  • 正则表达式匹配埃及象形文字[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想知道一个匹配埃及象形文字的正则表达式 我完全一无所知 需要你的帮助 我无法发布这些字母 因为堆栈溢出似乎无法识别它 那么谁能告诉我这些
  • 注释非法 Unicode 序列

    我曾经在一个处理 unicode 处理的 Java 应用程序上工作 像往常一样 我首先编写一些代码并测试它 然后注释掉工作代码并添加一些新行 这个过程一直持续到我找到解决方案 我遇到的确切问题是注释掉非法的 Unicode 字符串 有些 u
  • 如何在java script/jsp中查找客户端计算机名称?

    我的打印应用程序必须获取客户名称 然后打印文档 如何在java脚本或jsp中找到它 我在这里搜索过 有些人正在讨论 PHP 等等 关于运行安全小程序来获取客户端计算机名称的讨论 如果是这样 请给我一个例子来做到这一点 谢谢大家 你不能用 J
  • Spring mvc 添加多行

    我需要你的帮助 因为标题说我在从 jsp 表单插入多行时遇到问题 该代码来自该网站的答案 控制器 ModelAttribute programform public ProgramForm populatePojos Don t forge
  • 检测日语字符输入和“Romajis”(ASCII)

    我希望能够检测到用户何时 输入日语字符 汉字或假名 输入罗马字符 仅限 目前我正在使用这样的 ASCII 范围 C 语法 string searchKeyWord Console ReadLine var romajis from c in
  • 自定义 JSP 标记 - 检测其他实例的存在

    自定义 JSP 标记是否可以检测页面中是否存在其自身的其他实例 如果是这样 首选的方法是什么 我的标签的输出需要有条件地取决于它是否是唯一的实例 请注意 我的页面出现了三次标签 其中两个具有与第三个不同的属性集 因此我知道从资源池分配了两个
  • 当将utf-8编码的字符串从字节转换为字符时,计算机如何知道字符在哪里结束?

    给定一个以 UTF 8 编码的 Unicode 字符串 它只是内存中的字节 如果计算机想要将这些字节转换为其相应的 Unicode 代码点 数字 它如何知道一个字符在哪里结束 另一个字符在哪里开始 有些字符用 1 个字节表示 有些字符最多用
  • 字符串与长整型比较在 Tomcat 7 中抛出“ELException:无法转换”,在 Tomcat 6 中有效

    以下代码片段在 Tomcat 6 中运行良好
  • Spring 3 集合绑定

    如何将集合绑定到输入数据的表单 不用于显示 例如为一个Set
  • 澳大利亚的 Facebook Open Graph 区域设置

    我正在尝试为澳大利亚网站添加 og locale 标签 但 Facebook 的 linter 告诉我有一个错误 根据文档 并假设正确的内容应该是什么 我已将其添加到我的页面标题中 Facebook 的 linter http develo
  • 无法在 Python 2.4 中解码 unicode 字符串

    这是Python 2 4 中的 这是我的情况 我从数据库中提取一个字符串 它包含一个变音的 o xf6 此时 如果我运行 type value 它会返回 str 然后我尝试运行 decode utf 8 但收到错误 utf8 编解码器无法解
  • 为什么我的jsp页面显示源代码而不是页面?

    因此 jsp 页面是一个动画广告 它将执行动画 然后等待两秒钟并将用户重定向到另一个页面 使用我的本地主机似乎一切都工作正常 但是当我们将项目推送到阶段 测试 环境时 jsp 页面只会显示源代码而不是我想要的动画 关于为什么会发生这种情况有

随机推荐

  • 访问VBA:查找列中的最大数字并加1

    在我的 Access 数据库中 我有一个名为 Demande 的表 我想读取 Numero de Commande 列中的所有记录并读取该列中最大的数字 以便我可以将该数字用于下一个新记录 这是我的桌子 关键索引是针对 Numero de
  • Windows Azure 与.NET 2.0 框架兼容吗?

    我有一个在 NET 2 0 框架中开发的服务 它安装在多个站点中并与我的应用程序一起使用 我希望该服务能够向我 报告 有关该应用程序的某些信息 我想看看 Windows Azure 是否可以让我将报告存储在云数据库中 并在需要时提取它们 我
  • 重写 WinForm ListView 控件上的 Drawitem 事件

    我希望 ListView 的所选项目在焦点丢失时保持清晰可见 在 Windows 7 上为暗灰色 我确实将 HideSelection 属性设置为 False 我想对列表视图执行某人对 TreeView 控件所做的操作 即重写 Drawno
  • Kubernetes 中具有子域重定向的通配符 SSL 证书

    我已将 Kubernetes 配置为使用 cert manager 和 LetsEncrypt 对我的所有应用程序使用一个通配符 SSL 证书 现在的问题是我无法配置子域重定向 因为 Ingress 有点 僵硬 以下是我试图实现这一目标的方
  • 将 char 存储到 int 变量中

    我正在学习 C 中的隐式转换 我读了下面的例子 char a std cin gt gt a I can enter an integer like 56 here std cout lt
  • 当我尝试使用最新的依赖项构建 Maven 空手道项目时出现编译错误

    I m new to Karate API automation tool and just try to set up the tool I m getting Compilation errors when I try to compi
  • 使用 setRepeating() 方法了解下一个闹钟时间

    我有时会在上午 9 00 下午 1 00 晚上 7 00 等时间设置 3 个待处理意图 这些意图每天使用 setRepeating 方法递归触发 这里我将所有这些待处理的意图唯一请求代码保存在本地 SQLite 数据库中 在这里 每当触发警
  • FFREE ST(i) 修改 x87 标记字中的哪些位?

    这个例子是用 NASM 编写的 section bss var28 resb 28 section text main Initialize finit fldpi Read Tag Word fstenv var28 mov ax var
  • 闭包中引用的生命周期

    我需要一个闭包来引用其封闭环境中的对象的一部分 该对象是在环境中创建的 并且范围仅限于该环境 但一旦创建 它就可以安全地移动到闭包中 用例是一个函数 它执行一些准备工作并返回一个将完成其余工作的闭包 这种设计的原因是执行限制 第一部分工作涉
  • 向量的数值导数

    我遇到一个向量 x Nx1 相对 于另一个与 x 大小相同的向量 t 时间 的数值导数的问题 我执行以下操作 以 x 被选为正弦函数为例 t t0 ts tf x sin t xd diff x ts 但答案 xd 是 N 1 x1 并且我
  • 删除名称以特定字符串开头的所有表

    如何删除名称以给定字符串开头的所有表 我认为这可以通过一些动态 SQL 来完成INFORMATION SCHEMA tables 如果数据库中有多个所有者 您可能需要修改查询以包含所有者 DECLARE cmd varchar 4000 D
  • 为 WebGL 示例嵌入 ChakraHost (c#)

    我研究了涉及嵌入 javascript 框架 paper js 的示例 用于通过 ChakraHost 的 JsBridge 实现将输出绘制到 XAML 的 CanvasControl 要包含 paper js 框架和调用该框架的 java
  • ValueError: check_hostname 需要使用 Fiddler 4 的 server_hostname

    This question最近刚刚发布的有一些有用的答案 但与我的不一样 我正在从 ArcGIS Pro Notebook 运行 urllib3 1 26 4 和 Python 3 7 我还打开了 Fiddler 4 因为我想在对脚本进行故
  • 当我的编译器不符合标准时如何将数组成员归零

    我的编译器 C Builder6 在语法上允许数组成员初始化 至少为零 但实际上它并没有真正做到这一点 因此 下面给出的示例中的断言会失败 具体取决于上下文 include
  • 导航到新页面并显示警告框

    我正在使用 ASP Net WebForm 开发一个应用程序 一旦用户单击按钮 应用程序将导航到新页面并提示对话框 欢迎来到 JackiesGame 但是 我能够导航到新页面 但不显示警报对话框 以下是我的示例代码 void cmdCanc
  • PHP 中简单干净的 xml 操作

    我正在尝试寻找一种在 php 中轻松修改 xml 的方法 PHP 文档对于如何轻松操作 xml 非常令人困惑 我喜欢 SimpleXml 如何轻松查找标签 属性 但它似乎不允许您轻松添加子树或替换现有的子树 关于使用什么有什么建议吗 我的用
  • 为什么jstl的formatNumber货币符号区域设置在设置currencyCode时是特定的

    我使用 formatNumber 如下
  • ViewChild 和 ContentChild 的有效选择器是什么?

    我正在寻找可用于访问子组件 DOM 元素的有效选择器的完整列表 ViewChild and ContentChild 说我有孩子HelloComponent 我知道我可以添加模板 ref并查询它 如下所示
  • chrome webrequest api url 数组?

    这是一个非常简单的 Chrome 扩展程序的代码 该扩展程序可以阻止手动指定的网站 chrome webRequest onBeforeRequest addListener function details return cancel t
  • 如何国际化/本地化 JSP/Servlet Web 应用程序?

    我从谷歌了解到 国际化是我可以使自己的 Web 应用程序使用所有语言 我想了解Unicode国际化的过程 所以我从here and there 我能够理解 Unicode 即字符集如何编码为字节 然后又如何将字节解码为字符集 但我不知道如何