菜鸡的Java笔记 国际化程序实现原理
国际化程序实现原理 Lnternationalization
1. Locale 类的使用
2.国家化程序的实现,资源读取
所谓的国际化的程序指的是一谈代码,可以自动的根据当前操作系统的语言环境不同,显示不同的语言
假如说在某一个系统可能在全世界所有国家都可以使用到,那么在假设系统操作业务流程不变的情况
那么要想让不同的国家使用这个系统,最大的障碍就在于显示语言了
content (内容)
1.确定城市以及语言
在 java.util 包中提供有一个 Locale 的类,这个类的主要功能是用于定位当前的城市以及语言环境
如果要想确定语言环境必须知道城市编码已经语言的编码,zh_CN ,英文: en_US
在 Locale 类中国提供有一个城市以及语言编码,可以进行 Locale 的定义: public Locale(String language,String country)
范例:观察 Locale
package cn.mysterious.study3;
import java.util.Locale;
public class Lnternationalization {
public static void main(String[] args) {
// TODO Auto-generated method stub
Locale loc = new Locale("zh","CN");
System.out.println(loc);
}
}
但是很多时候应该根据当前的操作系统语言环境选择才对,在 Locale 类腮红提供有一个uqde当前环境的方法
取得当前环境: public static Locale getDefault()
但是使用 Locale 会牵扯到系统的变更 问题。我不想去记编码,又不想使用系统默认,那么可以使用 Locale 类定义的一堆常量:
package cn.mysterious.study3;
import java.util.Locale;
public class Lnternationalization {
public static void main(String[] args) {
System.out.println(Locale.KOREA);
System.out.println(Locale.CHINA);
System.out.println(Locale.US);
}
}
即: Locale 就是定位语言环境的
2.读取资源文件
在java中使用*。properties 定义的文件都是资源文件(后缀是固定的,不允许修改),而且资源文件的名称应该跟类名称保持一样的命名风格
例如: Message.properties ,而在资源文件中保存的都是字符串的信息,这些信息必须按照"key = value"的形式保存
随后这个资源文件必须放在 CLASSPATH 下才可以被访问到,如果有包,那么则应该加上包名称后访问
范例:定义 cn.mldn.resource.Message.properties
welcome.info = 欢迎光临!
welcome.info = \u6B22\u8FCE\u5149\u4E34\uFF01
在资源文件中不允许直接使用中文,中文信息必须自动转码
那么随后如果要想取得这个资源文件则可以依靠 java.util.ResourceBundle 类完成
这个类是一个抽象类,而这个类中会提供有一个 static 方法取得本类对象:
public static final ResourceBundle getBundle(String baseName)
这个方法上需要有一个资源文件的基本名字, Message
而后就可以i根据 key 取得对应的 value 信息: public final String getString(String key)
范例:读取资源文件
package cn.mysterious.study3;
import java.util.ResourceBundle;
public class Lnternationalization {
public static void main(String[] args) {
// 设置资源文件的名称,但是没有后缀,资源文件保存在 CLASSPATH 之中
ResourceBundle rb = ResourceBundle.getBundle("cn.mldn.resource.Message");
System.out.println(rb.getString("welcome.info"));
}
}
3.实现国际化
国际化程序的关键就在于资源文件,在定义资源文件的时候需要针对于不同国家的城市与语言编码定义不同的资源文件
例如:中文的资源: Message_zh_CN.properties 英文的资源: Message_en_US.properties
范例:定义 cn.mldn.resource.Message_zh_CN.properties
welcome.info = 您好!欢迎光临!
范例:定义 cn.mldn.resource.Message_en_US.properties
welcome.info = Hello!Welcome!
要实现资源的定位需要依靠 Locale 类完成,而同时还需要与 ResourceBundle 类集合,使用如下方法取得 ResourceBundle 类的实例化对象:
public static final ResourceBundle getBundle(String baseName,Locale locale)
范例:实现国际化切换
package cn.mysterious.study3; import java.util.Locale;
import java.util.ResourceBundle; public class Lnternationalization { public static void main(String[] args) {
// 设置资源文件的名称,但是没有后缀,资源文件保存在 CLASSPATH 之中
Locale loc = new Locale("zh","CN");
ResourceBundle rb = ResourceBundle.getBundle("cn.mldn.resource.Message",loc);
System.out.println(rb.getString("welcome.info"));
} }
英:
package cn.mysterious.study3; import java.util.Locale;
import java.util.ResourceBundle; public class Lnternationalization { public static void main(String[] args) {
// 设置资源文件的名称,但是没有后缀,资源文件保存在 CLASSPATH 之中
Locale loc = new Locale("en","US");
ResourceBundle rb = ResourceBundle.getBundle("cn.mldn.resource.Message",loc);
System.out.println(rb.getString("welcome.info"));
} }
但是这个时候会出现一个问题,假如在中文环境下说您好得有个名吧:
现在"KILLER"进入系统,那么如果要欢迎的话应该带上名字显示,可以使用占位符
范例:修改 cn.mldn.resource.Message_zh_CN.properties
welcome.info = {0},您好!欢迎光临!
范例:修改 cn.mldn.resource.Message_en_US.properties
welcome.info = {0},Hello!Welcome!
但是这个时候必须针对于读取出的数据进行一些转换,依靠 java.text.MessageFormat 类完成
文本的方法: public static String format(String pattern,Object... arguments)
范例:格式化文本
package cn.mysterious.study3; import java.text.MessageFormat;
import java.util.Locale;
import java.util.ResourceBundle; public class Lnternationalization { public static void main(String[] args) {
// 设置资源文件的名称,但是没有后缀,资源文件保存在 CLASSPATH 之中
Locale loc = new Locale("en","US");
ResourceBundle rb = ResourceBundle.getBundle("cn.mldn.resource.Message",loc);
String str = rb.getString("welcome.info");
System.out.println(MessageFormat.format(str, "KILLER"));
} }
在许多的项目开发过程之中,这样的格式化文本的操作是很常见的
总结
国际化操作虽然给了我们可以进行多语言显示的能力,但是大部分情况下,使用国际化操作都是为了方便进行资源信息的读取操作
菜鸡的Java笔记 国际化程序实现原理的更多相关文章
- 菜鸡的Java笔记 第二十八 - java 包的定义
包的主要作用以及定义 包的导入操作 系统常见的开发包 jar 程序命令 包的定义 在任何的操作系统之中都有一个统一的共识:同一个目录下不能够存在有相同的文 ...
- 菜鸡的Java笔记 第五 - java 程序逻辑控制
程序主要分为三种逻辑:顺序,分支,循环. if 分支语句 if分支语句是最为基础的分支操作,但是其有三种使用形式: if语句 if.....else 语句 if....else...if...el ...
- 菜鸡的Java笔记 - java 断言
断言:assert (了解) 所谓的断言指的是在程序编写的过程之中,确定代码执行到某行之后数据一定是某个期待的内容 范例:观察断言 public class Abnorma ...
- 菜鸡的Java笔记 - java 正则表达式
正则表达式 RegularExpression 了解正则表达式的好处 正则表达式的基础语法 正则表达式的具体操作 content (内容 ...
- 菜鸡的Java笔记 数字操作类
数字操作类 Math 类的使用 Random 类的使用 BigInteger 和 BigDecimal 类的使用 Math 是一 ...
- 菜鸡的Java笔记 - java 线程常用操作方法
线程常用操作方法 线程的命名操作,线程的休眠,线程的优先级 线程的所有操作方法几乎都在 Thread 类中定义好了 线程的命名和取得 ...
- 菜鸡的Java笔记 简单JAVA 类的开发原则以及具体实现
/* 现在要求定义一个雇员信息类 在这个类之中包含有雇员编号 姓名 职位 基本工资 佣金等信息 对于此时给定要求实际上就是描述一类事物,而这样的程序类在在java之中可以将其称为简单java类 ...
- 菜鸡的Java笔记 - java 访问控制权限
java中四种访问控制权限的使用 内容 在java里面一共定义有四个权限,按照由小到大的顺序:private<defaule<prote ...
- 菜鸡的Java笔记
1.注释 在JAVA中对于注释有三种: 单行注释:// 多行注释:/*--*/ 文档注释:/**--*/ 2.关键字和标识符 在程序中描述类名称,方法名称,变量等概念就需要使用标识符来定义.而在JAV ...
随机推荐
- TypeScript 条件类型精读与实践
在大多数程序中,我们必须根据输入做出决策.TypeScript 也不例外,使用条件类型可以描述输入类型与输出类型之间的关系. 本文同步首发在个人博客中,欢迎订阅.交流. 用于条件判断时的 extend ...
- 基于PaddleOCR实现AI发票识别的Asp.net Core应用
简要介绍 用户批量上传需要识别的照片,上传成功后,系统会启动Hangfire后台Job开始调用PaddleOCR服务返回结果,这个过程有点类似微服务的架构模型. PaddleOCR PaddleOCR ...
- iOS自动化之WDA(WebDriverAgent)安装
1.WDA介绍 WebDriverAgent 在 iOS 端实现了一个 WebDriver server ,借助这个 server 我们可以远程控制 iOS 设备.你可以启动.杀死应用,点击.滚动视图 ...
- yum源安装nginx
nginx使用yum源安装 安装步骤 使用yum源安装依赖 yum install yum-utils 配置nginx.repo的yum文件 vim /etc/yum.repos.d/nginx.re ...
- 【UE4】虚幻引擎技术直播汇总(含中英文直播)
B站虚幻引擎官方账号 中文直播 [中文直播]第35期 | 使用GIS在UE中创造真实地球风貌 | Epic 周澄清 [中文直播]第34期 | 包教包会的Epic MegaGrants申请之道 | Ep ...
- [敏捷软工团队博客]Beta阶段使用指南
软件工程教学实践平台使用指南 项目地址:http://20.185.223.195:8000/ 项目团队:the agiles 进入界面如图: 目录 软件工程教学实践平台使用指南 学生端 登录 iss ...
- 【技术博客】Flutter—使用网络请求的页面搭建流程、State生命周期、一些组件的应用
Flutter-使用网络请求的页面搭建流程.State生命周期.一些组件的应用 使用网络请求的页面搭建流程 在开发APP时,我们常常会遇到如下场景:进入一个页面后,要先进行网络调用,然后使用调用返 ...
- BUAA 2020 软件工程 结对项目作业
Author: 17373051 郭骏 3.28添加:4.计算模块接口的设计与实现过程部分,PairCore实现的细节 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) ...
- camera isp(Image Signal Processor)
1. 目标[52RD.com] 手机摄像头模组用ISP功能模块的市场走向及研发方向.为能够正确认识手机摄像模组行业提供技术及市场依据.[52RD.com] 2. ISP在模组上的应用原理[52RD.c ...
- 深入理解Linux C语言内存管理
问题不能拖,我这就来学习一下吧,争取一次搞定. 在任何程序设计环境及语言中,内存管理都十分重要. 内存管理的基本概念 分析C语言内存的分布先从Linux下可执行的C程序入手.现在有一个简单的C源程序h ...