国际化缩写为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标签。接下来让我们简要了解一下:
- 显示i18n文本,需在property标签或其他任何标签(如UI标签)中调用getText,如下所示:
<s:property value="getText('some.key')" />
- text标签从默认资源束(即struts.properties)中检索信息:
<s:text name="some.key" />
- i18n标签会将任意资源束推送到值栈,而i18n标签内的其他标签可以显示来自该资源束的信息:
<s:i18n name="some.package.bundle">
<s:text name="some.key" />
</s:i18n>
- 大多数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