在基本的JSP / Servlet Web应用程序的情况下,基本方法将使用
JSTL
fmt taglib与
resource bundles结合。资源束包含键值对,其中键是对于所有语言都相同的常数,并且值对于每种语言是不同的。资源束通常是
properties files,由
ResourceBundle API加载。然而,这可以是定制的,以便您可以从例如数据库加载键值对。
这里有一个例子,如何使用基于属性文件的资源束对您的Web应用程序的登录表单进行国际化。
>创建以下文件并将其放在某些包中,例如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(包含西班牙语键值对)
login.label.username = Nombre de usuario
login.label.password = Contraseña
login.button.submit = Acceder
资源束文件名应遵循以下模式name_ll_CC.properties。 _ll部分应该是小写的ISO 693-1语言代码。它是可选的,只有当_CC部分存在时才需要。 _CC部分应为大写ISO 3166-1 Alpha-2国家/地区代码。它是可选的,通常只用于区分国家/地区特定的语言方言,如American English(_en_US)和British English(_en_GB)。
>如果尚未完成,请安装JSTL。如果你运行在一个Servlet 2.5容器或更新的(Tomcat 6.0等等),并且你的web.xml被声明符合Servlet 2.5规范,那么只需把jstl-1.2.jar放在webapp的/ WEB-INF / lib文件夹中。
>创建以下示例JSP文件并将其放在Web内容文件夹中。
login.jsp
JSP/JSTL i18n demoEnglish
Nederlands
Español
:
:
< c:set var =“language”>管理当前语言。如果语言是作为请求参数提供的(通过语言下拉列表),那么它将被设置。否则,如果语言以前已在会话中设置,则坚持它。否则请在请求标头中使用用户提供的区域设置。
< fmt:setLocale>设置资源束的区域设置。重要的是,此行在< fmt:setBundle>之前。
< fmt:setBundle>通过其基本名称(即,完全限定包名称,直到具有唯一名称,而没有_ll_CC说明符)来初始化资源包。
< fmt:message>通过指定的捆绑密钥检索消息值。
< html lang =“$ {language}”>通知searchbots该页面是什么语言,以便它不会被标记为重复内容(因此,有利于SEO)。
当选择其他语言时,语言下拉列表将立即通过JavaScript提交,并且将使用新选择的语言刷新页面。
然而,您需要记住,属性文件默认情况下使用ISO-8859-1字符编码读取。你需要通过unicode转义来转义它们。这可以使用JDK提供的native2ascii.exe工具来完成。更多详细信息,请参见this article section。
一个理论选择是提供一个自定义Control捆绑,以加载这些文件作为UTF-8,但是这是不幸的是基本的JSTL fmt taglib不支持。你需要在过滤器的帮助下自己管理它。有(MVC)框架可以以更透明的方式处理这种情况,例如JSF,也参见this article。