35. Struts2_国际化&通过超链接动态加载国际化资源文件

主要笔记:
1. 国际化的目标

1). 如何配置国际化资源文件

I. Action 范围资源文件: 在Action类文件所在的路径建立名为 ActionName_language_country.properties 的文件
II. 包范围资源文件: 在包的根路径下建立文件名为 package_language_country.properties 的属性文件,
一旦建立,处于该包下的所有 Action 都可以访问该资源文件。注意:包范围资源文件的 baseName 就是package,不是Action所在的包名。
III. 全局资源文件

命名方式: basename_language_country.properties
struts.xml

IV. 国际化资源文件加载的顺序如何呢 ? 离当前 Action 较近的将被优先加载.

假设我们在某个 ChildAction 中调用了getText(“username”):

(1) 加载和 ChildAction 的类文件在同一个包下的系列资源文件 ChildAction.properties
(2) 加载 ChildAction 实现的接口 IChild,且和 IChildn 在同一个包下 IChild.properties 系列资源文件。
(3) 加载 ChildAction 父类 Parent,且和 Parent 在同一个包下的 baseName 为 Parent.properties 系列资源文件。
(4) 若 ChildAction 实现 ModelDriven 接口,则对于getModel()方法返回的model 对象,重新执行第(1)步操作。
(5) 查找当前包下 package.properties 系列资源文件。
(6) 沿着当前包上溯,直到最顶层包来查找 package.properties 的系列资源文件。
(7) 查找 struts.custom.i18n.resources 常量指定 baseName 的系列资源文件。
(8) 直接输出该key的字符串值。

2). 如何在页面上 和 Action 类中访问国际化资源文件的 value 值

I. 在 Action 类中. 若 Action 实现了 TextProvider 接口, 则可以调用其 getText() 方法获取 value 值

通过继承 ActionSupport 的方式。

II. 页面上可以使用 s:text 标签; 对于表单标签可以使用表单标签的 key 属性值

若有占位符, 则可以使用 s:text 标签的 s:param 子标签来填充占位符
可以利用标签和 OGNL 表达式直接访问值栈中的属性值(对象栈 和 Map 栈)

time=Time:{0}

<s:text name="time">
    <s:param value="date"></s:param>
</s:text>

------------------------------------

time2=Time:${date}

<s:text name="time2"></s:text>

3). 实现通过超链接切换语言.

I. 关键之处在于知道 Struts2 框架是如何确定 Local 对象的 !
II. 可以通过阅读 I18N 拦截器知道.
III. 具体确定 Locale 对象的过程:

> Struts2 使用 i18n 拦截器 处理国际化,并且将其注册在默认的拦截器栈中
> i18n拦截器在执行Action方法前,自动查找请求中一个名为 request_locale 的参数。
      如果该参数存在,拦截器就将其作为参数,转换成Locale对象,并将其设为用户默认的Locale(代表国家/语言环境)。
      并把其设置为 session 的 WW_TRANS_I18N_LOCALE 属性
> 若 request 没有名为request_locale 的参数,则 i18n 拦截器会从 Session 中获取 WW_TRANS_I18N_LOCALE 的属性值,
     若该值不为空,则将该属性值设置为浏览者的默认Locale 
> 若 session 中的 WW_TRANS_I18N_LOCALE 的属性值为空,则从 ActionContext 中获取 Locale 对象。

IV. 具体实现: 只需要在超连接的后面附着 request_locale 的请求参数, 值是 语言国家 代码.
English
中文

> 注意: 超链接必须是一个 Struts2 的请求, 即使 i18n 拦截器工作!

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <constant name="struts.ui.theme" value="xhtml"></constant>
    <!-- 配置 Struts 可以受理的请求的扩展名 -->
    <constant name="struts.action.extension" value="action,do"></constant>

    <!-- 配置 <constant name="struts.custom.i18n.resources" value="i18n"></constant>-->
    <constant name="struts.custom.i18n.resources" value="i18n"></constant>
    <package name="i18ninput" extends="struts-default">
        <action name="i18ninput" class="com.hgh.struts2.i18n.I18nTestAction">
            <result>/i18ninput.jsp</result>
        </action>
    </package>

</struts>

I18nTestAction

package com.hgh.struts2.i18n;

import com.opensymphony.xwork2.ActionSupport;

public class I18nTestAction extends ActionSupport{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private String userName;
    private String passWord;


    public String getUserName() {
        return userName;
    }


    @Override
    public String toString() {
        return "I18nTestAction [userName=" + userName + ", passWord="
                + passWord + "]";
    }


    public void setUserName(String userName) {
        this.userName = userName;
    }


    public String getPassWord() {
        return passWord;
    }


    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }


    @Override
    public String execute() throws Exception {
        // TODO Auto-generated method stub
        return SUCCESS;
    }
}

I18nTestAction_en_US.properties


userName=~username
passWord=~password

I18nTestAction_zh_CN.properties

userName=\u7528\u6236\u540D
passWord=\u5BC6\u78BC

i18n.properties
error.int=i18n Age needs to be between minand {max}

i18ninput.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <s:debug></s:debug>
        <a href="i18ninput.action?request_locale=en_US">English</a>
        <br>
    <a href="i18ninput.action?request_locale=zh_CN">中文</a>
    <s:form action="">
        <s:text name="userName" /><s:textfield name="userName" lable="UserName"></s:textfield>
        <s:text name="passWord" /><s:textfield name="passWord" lable="Password"></s:textfield>
        <s:submit name="submit" lable="submit"></s:submit>
    </s:form>
</body>
</html>

I18N 拦截器确定 Locale 对象流程分析

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值