eclipse学习(第二章:初识ssh)——13.Struts2进行本地化/国际化


国际化缩写为i18n,单词以i开头,以n结尾,是因为在第一个i和最后一个n之间有18个字符。

前言

我是参考这个文章自己写的
https://www.w3cschool.cn/struts_2/struts_localization.html

资源束

Struts2使用资源束为Web应用程序的用户提供多种语言和区域的设置选项。你不必担心需要用不同的语言编写页面,你需要做的只是为每种你想要的语言创建一个资源束。资源束将包含用户语言中的标题,消息和其他文本,是包含应用程序默认语言的一对key/value的文件。
资源文件最简单的命名格式是:

bundlename_language_country.properties

这里的bundlename可以是ActionClass,Interface,SuperClass,Model,Package,Global资源属性。下一部分language_country表示国家区域设置,例如西班牙语(西班牙)区域设置由es_ES表示,英语(美国)区域设置由en_US表示等。
当你通过key引用消息元素时,Struts框架按以下顺序搜索相应的信息束:

  • ActionClass.properties
  • Interface.properties
  • SuperClass.properties
  • model.properties
  • package.properties
  • struts.properties
  • global.properties

访问信息

有几种方法来访问信息资源,包括getText,text标签,UI标签的key属性和i18n标签。接下来让我们简要了解一下:

  1. 显示i18n文本,需在property标签或其他任何标签(如UI标签)中调用getText,如下所示:
<s:property value="getText('some.key')" />
  1. text标签从默认资源束(即struts.properties)中检索信息:
<s:text name="some.key" />
  1. i18n标签会将任意资源束推送到值栈,而i18n标签内的其他标签可以显示来自该资源束的信息:
<s:i18n name="some.package.bundle">
     <s:text name="some.key" />
</s:i18n>
  1. 大多数UI标签的key属性可用于从资源束检索信息:
<s:textfield key="some.key" name="textfieldName"/>

搭建项目

1、初始化项目以及jar包拉取

在这里插入图片描述

2、修改web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>ssh_learn_internation</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <filter>
  	<filter-name>struts2</filter-name>
  	<filter-class>
  		org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  	</filter-class>
  </filter>
  
  <filter-mapping>
  	<filter-name>struts2</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

3、新建struts.xml

这里有两个action,login这个action是用来跟提交按钮绑定的,而local是跟切换语言那几个文字绑定的,这里默认的处理都是直接通过。

<?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.devMode" value="true"></constant>
<!-- 	下面这一行是用来指定国际化对应的属性文件的 -->
 <!-- 扫描资源目录下以global开头的文件 -->
	<constant name="struts.custom.i18n.resources" value="global" />
	
	<package name="loginAll" extends="struts-default">
		<action name="login" class="com.czx.internation.LoginAction" method="execute">
			<result name="success">/success.jsp</result> 
			<result name="input">/index.jsp</result>
		</action>
		
		<action name="local" class="com.czx.internation.InternationAction" method="execute">
			<result name="success">/index.jsp</result>
		</action>
	</package>

</struts>

4、加入action

InternationAction ,这个是用来处理国际化的,SUCCESS这个是下面这个类里面的值,String com.opensymphony.xwork2.Action.SUCCESS : “success”

package com.czx.internation;

import com.opensymphony.xwork2.ActionSupport;

public class InternationAction extends ActionSupport {

	@Override
	public String execute() throws Exception {
		return SUCCESS;
	}
	
}

LoginAction,登录处理

package com.czx.internation;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport {
	@Override
	public String execute() throws Exception {
		return "success";
	}

	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	private Integer age;
	private String username;
	
}

5、国际化的文件

global_en.properties,这个是英文对应的配置

global.name=Lao wang
global.age=eighteen
global.problem=I found a problem!
global.success=Success to enter
global.submit=submit
global.heading=At the top of the situation

global_fr.properties,这个是法语对应的配置

global.name=Ils avaient
global.age=xviii
global.problem=J\u2019ai trouvé un problème!
global.success=Une entrée réussie
global.submit=Présenté par le
global.heading=Situation du sommet

global_zh_CN.properties

global.name=\u8001\u738B
global.age=18
global.problem=\u6211\u53D1\u73B0\u4E86\u4E00\u4E2A\u95EE\u9898
global.success=\u6210\u529F\u8FDB\u5165
global.submit=\u63D0\u4EA4
global.heading=\u9876\u90E8\u60C5\u51B5

6、修改页面

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<s:url id="index_EN" action="local">
		<s:param name="request_locale">en</s:param>
	</s:url>
	<s:url id="index_ZH" action="local">
		<s:param name="request_locale">zh_CN</s:param>
	</s:url>
	<s:url id="index_FR" action="local">
		<s:param name="request_locale">fr</s:param>
	</s:url>
	
	<s:a href="%{index_EN}">英文</s:a>
	<s:a href="%{index_ZH}">中文</s:a>
	<s:a href="%{index_FR}">法文</s:a>
	
<%-- 	<a href="login.action?request_locale=zh_CN"><s:text name="中文Chinese"></s:text></a>   --%>
<%-- 	<a href="login.action?request_locale=en"><s:text name="英文English"></s:text></a>  --%>
<%-- 	<a href="login.action?request_locale=fr"><s:text name="法语French"></s:text></a>  --%>
	
	<s:form action="login" method="post">
		<s:textfield name="name" key="global.name" size="20"></s:textfield>
		<s:textfield name="age" key="global.age" size="20"></s:textfield>
		<s:submit name="submit" key="global.submit"></s:submit>
	</s:form>
</body>
</html>

success.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	欢迎来到对应页面<s:property value="getText('global.success')"/>
</body>
</html>

测试

访问http://localhost:8080/ssh_learn_internation/
在这里插入图片描述
点击英文/中文/法文可以进行语言切换,不同语言点击提交的结果也有有所不同
在这里插入图片描述

可能出现的问题

1、There is no Action mapped for namespace [/] and action name [loacl] associated with context path [/ssh_learn_internation].

出现这个问题很简单,你自己设定的action名称出现了问题,改一下就可以解决问题了。index.jsp的action设置要跟struts.xml的对应上

2、警告: Missing key [global.name] in bundles [[org/apache/struts2/struts-messages, com/opensymphony/xwork2/xwork-messages]]!

解决办法:
在struts.xml中加入这个,因为这里是用来指定国际化文件源的,你不指定自然找不到这个key

<constant name="struts.custom.i18n.resources" value="global" />

3、点击之后没有相关反应

检查action跳转的页面情况,断点调试,基本上就是你action处理的问题,往那个方向找即可。

4、中文无法正确显示,显示乱码

在这里插入图片描述
问题的根本在于设置的global_zh.properties,在那里面不能够使用其他格式,我试过使用utf-8编码格式,结果中文变成上面那样,如果使用默认编码格式就没有问题了。(右键文件—》properties,然后修改即可)
在这里插入图片描述
当鼠标悬停在=后面那里可以看到真正对应的文字是啥,从而进行比对
在这里插入图片描述

5、切换默认的英文无法切换成功

解决办法:global.properties改名为global_en.properties即可。

6、默认显示语言

这里其实跟你浏览器默认的语言有关系,你浏览器默认中文,所以默认显示中文,如果你的是英文,那么就默认英文啦

项目地址

这个仓库里面的ssh_learn_internation
https://gitee.com/mrchen13427566118/ssh_learn.git

如果不会怎么弄到eclipse的话,就看这里
https://blog.csdn.net/weixin_43987277/article/details/116936221

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值