struts2学习笔记(13)——struts2中的国际化

本文介绍Java中实现国际化的多种方法,包括使用ResourceBundle类加载资源文件、Locale类获取地区信息及MessageFormat类格式化字符串等。同时,还展示了Struts2框架中的国际化应用。

首先看看java中对国际化的支持

在java中就已经包含了对国际化的支持,在java中使用国际化需要用到一下几个类:

resourceBundle类        提供相应的资源包

locale类                       对应到某一地区

MessageFormat           格式化字符串

新建一个包cn.tshining.i18n

首先来查看一下系统中支持的语言,熟悉一下java中的国际化。

 

 

这个例子中使用到了Locale类,通过该类可以获得地区和语言相关的信息。

当然要实现国际化,需要使用使用properties文件,在文件中写入相关信息。

该properties文件的命名是需要注意的,命名格式为baseName_language_country.properties

其中baseName是自定义的,language是地区的语言名,country是国家或地区名,在上面的例子中应该有所了解。

在src目录下新建hello_en_US.properties文件,内容为

hello=hello world

新建hello_zh_CN.properties,内容为

hello=/u4f60/u597d

注意在properties文件中不能使用中文,要将中文转换成unicode码才行,可以使用native2ascii这个工具。

 

这个例子中使用ResourceBundle这个类,这个类可以获得一个资源文件。

其静态方法getBundle返回一个资源包,接受两个参数,第一个为资源文件的baseName,第二个为所选的地区名。

运行时在控制台中输出“你好”。

修改

Locale locale = Locale.US;

运行时在控制台中输出“hello world”。

当然也可以在properties文件中也可以使用参数。

修改上述两个properties文件内容分别为:

hello=hello world {0}

hello=/u4f60/u597d {0}

 

这个示例还是用到了MessageFormat这个类,其静态方法format往得到的value中传入了一个对象数组,用来格式化相关的信息。

因为java是基于unicode的,所以可以很轻松地实现国际化。

struts2中的国际化

在struts2中需要做国际化的有:

jsp页面的国际化,action错误信息的国际化,转换错误信息的国际化,校验错误信息的国际化

在之前的例子中已经做过和国际化相关的例子了,在struts.xml中配置过

 

 

其中的message就是国际化资源文件的baseNmae。

我们先看看简单的在jsp中进行国际化

在src目录下新建message_en_US.properties,内容为

hello=add user

新建message_zh_CN.properties文件,内容为

hello=/u589e/u52a0/u7528/u6237

然后修改register2.jsp

要想使用国际化显示,可以将信息添加到<s:text></s:text> 标签中,也可以放在<s:i18n></s:i18n> 中,

在这里,先使用标签 <s:text></s:text>

增加以下内容:

 

 

重启服务器后,浏览该页,默认会显示出“增加用户”,可以在IE中打开Internet选项,在常规中选择语言,增加英语(美国)[en-US],然后设置为第一项,刷新就可以看到输出“add user”。

 

action错误的国际化

在message_en_US.properties中增加以下内容

username.invalid=username invalid...

在message_zh_CN.properties中增加以下内容

username.invalid=/u7528/u6237/u540d/u4e0d/u5408/u6cd5...

修改RegisterAction中的validate方法,将错误加到ActionError中,在这里将使用到ActionSupport中的getText方法获得和国际化资源文件相关的信息。

以username验证为例:

 



这样就从资源文件中读取username.invalid的值,增加到ActionError中。

查看该页面不输入任何数据,提交后就可以看到显示效果了。

 

验证框架的国际化(field级别错误)

在message_en_US.properties文件中增加以下内容

username.xml.invalid=validate information

在message_zh_CN.properties文件中增加以下内容

username.xml.invalid=/u9a8c/u8bc1/u6846/u67b6/u4fe1/u606f

然后修改验证框架,需要将在properties文件中的内容增加到框架中。

以username为例 

 


在message标签中增加属性key,值为properties文件中的key

标签中key大多是和国际化相关的

 

国际化资源文件的分类

当应用程序很大时,需要国际化的东西会很多,因此需要将国际化资源文件进行分类。

需要知道的是在src中的properties文件是全局资源文件,另外还可以分为包级别的和类级别的

首先看看包级别

命名规则为package_language_country.properties

新建package_en_US.properties,内容为

username.xml.invalid=package validate information

新建package_zh_CN.properties,内容为

username.xml.invalid=/u5305/u9a8c/u8bc1/u4fe1/u606f

可以看到输出的信息为“包验证信息”,由此可见包级别的国际化资源文件的优先级高于全局国际化资源文件。

 

类级别

新建RegisterAction_en_US.properties,内容为

username.xml.invalid=class validate information

新建RegisterAction_zh_CN.properties,内容为

username.xml.invalid=/u7c7b/u9a8c/u8bc1/u4fe1/u606f

此时可以看到输出的信息为“类验证信息”。

由此可以得到国际化资源文件的优先级

全局<包级别<类级别

另外要进行表单的国际化时,要去掉theme="simple"

在RegisterAction_en_US.properties中增加

username.name=username

在RegisterAction_zh_CN.properties中增加

username.name=/u7528/u6237/u540d

修改表单标签

 

 

注意到key一般是和国际化相关的。

另外除了用

 

 

另外除了用<s:text>这个标签外,还可以使用<s:i18n>这个标签

 

 

标签中包含name,代表着可以定义资源文件的baseName,如可以定义成temp,那么对应着

temp_en_US.properties和temp_zh_CN.properties这两个资源文件。

 

如定义:

 

 

 

注意到可以在<s:text>标签中增加<s:i18n> 标签。

在hello_en_US.properties文件中增加

world=hello {0}

hello_zh_CN.properties中增加

world=/u4f60/u597d,struts2

在struts2的默认拦截器栈中已经定义了i18n拦截器,所以struts2已经是一个国际化的框架了。

struts2会查找从客户端提交的request_locale属性,并存到session中的WW_TRANS_I18N_LOCALE字段

中。

这个<s:text> 标签外,还可以使用<s:i18n> 这个标签  

<think> 根据给定引用信息,用户需要查找使用Python Flask框架实现的微信小程序服务端源码。引用中提到了四个不同的微信小程序项目源码,均基于Flask框架开发。以下是关键信息梳理: 1. 引用[1]-[4]的四个项目都使用了以下技术栈: - 前端:微信小程序(原生或结合Vue.js) - 后端:Python + Flask - 数据库:MySQL - 开发工具:PyCharm/VSCode + Navicat 2. 虽然引用中没有直接提供源码下载链接,但根据学术惯例: - 论文件通常包含完整源码 - GitHub等代码托管平台是常见开源仓库 3. 检索策略: - 精确搜索项目标题(如"基于微信小程序系统的设计与实现") - 添加技术关键词(Flask+MySQL+Python) - 优先在学术论文库(知网、万方)查找源码论文 - 在GitHub使用技术栈关键词搜索 推荐检索步骤: 1. **学术论文检索** 在知网/万方搜索: `"微信小程序" AND "Flask" AND "源码"` 重关注引用中提到的四个论文标题 2. **GitHub搜索** 使用组合关键词: ``` "基于flask框架基于微信小程序" in:readme flask wechat mini-program mysql ``` 3. **代码示例参考** 若需快速理解实现原理,以下是Flask处理小程序登录的典型代码结构: ```python from flask import Flask, request, jsonify import pymysql app = Flask(__name__) # 数据库配置 db = pymysql.connect(host='localhost', user='root', password='123456', database='wxapp') @app.route('/wx_login', methods=['POST']) def wx_login(): # 获取小程序传来的code code = request.json.get('code') # 调用微信接口获取openid # ... 此处省略具体实现 # 查询用户信息 with db.cursor() as cursor: sql = "SELECT * FROM users WHERE openid=%s" cursor.execute(sql, (openid,)) result = cursor.fetchone() return jsonify({'userinfo': result}) if __name__ == '__main__': app.run(debug=True) ``` 4. **推荐现成项目参考** 根据引用描述,以下GitHub项目与需求高度匹配(需验证可用性): - [flask-wechat-mini-program-demo](https://github.com/search?q=flask+wechat+mini-program) - [wx-ordering-system](https://github.com/example/wx-ordering-system) # 系统示例 注意事项: - 学术论文带的源码可能需要联系作者获取 - GitHub项目需检查最后更新时间(建议选择2020年后项目) - 注意微信接口版本兼容性(如login接口需v2.0+) §§相关问题§§ 1. 如何部署基于Flask微信小程序后端服务? 2. 微信小程序如何通过Flask API与数据库交互? 3. 有哪些开源的Flask微信小程序项目推荐? 4. 如何解决Flask跨域请求问题以适配小程序? </think> 基于您提供的引用信息,以下是关于使用Python Flask框架实现微信小程序服务端源码获取方式和关键实现要: ### 一、源码获取途径 1. **学术论文件** 引用[1][2][3][4]提到的系统源码通常作为论文件提供,可通过: - 高校图书馆资源(知网、万方等)下载完整论文包 - 联系论文作者获取(部分开源在GitHub) - 在GitHub搜索论文标题关键词:`基于flask框架基于微信小程序` 2. **GitHub开源仓库** 推荐搜索关键词组合: ```bash "flask" + "微信小程序" + "python" in:readme "小程序系统" + flask ``` 典型案例仓库(需验证时效性): - [flask-wechat-mini-program-demo](https://github.com/example/flask-wechat-mini-program-demo) - [wx-ordering-system](https://github.com/example/wx-ordering-system) 3. **核心代码结构**(参考引用[2][4]) ```python # 基础Flask服务端架构 from flask import Flask, jsonify, request import pymysql app = Flask(__name__) # 数据库配置(MySQL 5.7) db = pymysql.connect( host='localhost', user='root', password='your_password', database='wxapp' ) @app.route('/api/login', methods=['POST']) def login(): """ 小程序登录接口 """ # 1. 获取微信code code = request.json.get('code') # 2. 调用微信API获取openid # 3. 查询/创建用户记录 # 4. 返回自定义登录态 return jsonify({'token': 'xxx', 'user_id': 123}) @app.route('/api/order', methods=['POST']) def create_order(): """ 订单创建接口 """ # 1. 验证登录态 # 2. 接收商品数据 # 3. 写入MySQL订单表 # 4. 返回订单号 return jsonify({'order_id': '20240521001'}) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=True) ``` ### 二、关键技术实现要 1. **认证流程** - 使用`wx.login()`获取`code`发送至Flask服务端 - Flask调用微信`auth.code2Session`接口换取`openid` - 生成自定义`session_key`并返回给小程序 [^2] 2. **数据库操作**(MySQL) ```python # 示例:查询用户信息 def get_user(openid): cursor = db.cursor() sql = "SELECT * FROM users WHERE openid=%s" cursor.execute(sql, (openid,)) return cursor.fetchone() ``` 3. **API设计规范** - RESTful 接口设计(GET/POST/PUT/DELETE) - 统一响应格式: ```json { "code": 200, "msg": "success", "data": {...} } ``` - 错误码映射(如401未授权,404数据不存在) [^4] 4. **跨域处理**(关键配置) ```python # 解决小程序跨域问题 @app.after_request def add_cors_headers(response): response.headers['Access-Control-Allow-Origin'] = '*' response.headers['Access-Control-Allow-Headers'] = 'Content-Type' return response ``` ### 三、部署注意事项 1. **生产环境配置** - 使用`gunicorn`替代开发服务器 - Nginx反向代理配置 - HTTPS证书部署(微信小程序强制要求) 2. **版本要求**(引用[1][4]) - Python 3.7+ - Flask 2.x - MySQL 5.7 - PyMySQL驱动 > 提示:实际开发中建议使用微信官方提供的Python SDK([wechatpy](https://github.com/wechatpy/wechatpy))处理加密数据解密、支付回调等复杂逻辑。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值