国际化程序实现原理 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笔记 国际化程序实现原理的更多相关文章

  1. 菜鸡的Java笔记 第二十八 - java 包的定义

    包的主要作用以及定义    包的导入操作    系统常见的开发包    jar 程序命令        包的定义        在任何的操作系统之中都有一个统一的共识:同一个目录下不能够存在有相同的文 ...

  2. 菜鸡的Java笔记 第五 - java 程序逻辑控制

    程序主要分为三种逻辑:顺序,分支,循环. if 分支语句 if分支语句是最为基础的分支操作,但是其有三种使用形式: if语句 if.....else   语句 if....else...if...el ...

  3. 菜鸡的Java笔记 - java 断言

    断言:assert (了解)        所谓的断言指的是在程序编写的过程之中,确定代码执行到某行之后数据一定是某个期待的内容        范例:观察断言 public class Abnorma ...

  4. 菜鸡的Java笔记 - java 正则表达式

    正则表达式 RegularExpression        了解正则表达式的好处        正则表达式的基础语法        正则表达式的具体操作            content (内容 ...

  5. 菜鸡的Java笔记 数字操作类

    数字操作类        Math 类的使用        Random 类的使用        BigInteger 和 BigDecimal 类的使用                Math 是一 ...

  6. 菜鸡的Java笔记 - java 线程常用操作方法

    线程常用操作方法        线程的命名操作,线程的休眠,线程的优先级            线程的所有操作方法几乎都在 Thread 类中定义好了            线程的命名和取得      ...

  7. 菜鸡的Java笔记 简单JAVA 类的开发原则以及具体实现

    /*  现在要求定义一个雇员信息类 在这个类之中包含有雇员编号 姓名 职位 基本工资 佣金等信息    对于此时给定要求实际上就是描述一类事物,而这样的程序类在在java之中可以将其称为简单java类 ...

  8. 菜鸡的Java笔记 - java 访问控制权限

    java中四种访问控制权限的使用                内容            在java里面一共定义有四个权限,按照由小到大的顺序:private<defaule<prote ...

  9. 菜鸡的Java笔记

    1.注释 在JAVA中对于注释有三种: 单行注释:// 多行注释:/*--*/ 文档注释:/**--*/ 2.关键字和标识符 在程序中描述类名称,方法名称,变量等概念就需要使用标识符来定义.而在JAV ...

随机推荐

  1. Redis基础数据结构-基于2.8

    SDS SDS是Redis中String的底层数据结构,数据结构如下,SDS保留了传统的C字符串表达方式即数组的最后一个元素是'/0'结尾.此外还添加了两个字段len和free,其中len表示字符串长 ...

  2. heoi2020树

    _ _01trie树合并 _ _ 在考场上一直想用数据结构维护,还花了好长时间算 $(a+1)^(b+1)$,现在看来当时好像在犯傻........ 异或有个神奇的工具是 01trie 树,此题就用此 ...

  3. Java中的原子操作

    Java中的原子操作 原子性:指该操作不能再继续划分为更小的操作. Java中的原子操作包括: 除long和double之外的基本类型的赋值操作 所有引用reference的赋值操作 java.con ...

  4. 第一个Java HelloWorld

    步骤 1.在记事本或者notePad++中编写java代码 public class Hello { public static void main(String[] args){ System.ou ...

  5. JVM学习笔记——GC算法

    GC 算法 GC 即 Garbage Collection 垃圾回收.JVM 中的 GC 99%发生在堆中,而 Java 堆中采用的垃圾回收机制为分代收集算法.即将堆分为新生代和老年代,根据不同的区域 ...

  6. VS运行时 /MD、/MDd 和 /MT、/MTd之间的区别

    程序运行时出现问题,选择的是Release,win64位的模式,并且已经看到了宏定义NDEBUG,但是程序依然进入上面的部分 解决方案是将属性->C/C++->代码生成器->运行库里 ...

  7. FastAPI 学习之路(十二)接口几个额外信息和额外数据类型

    系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...

  8. 用C++实现的数独解题程序 SudokuSolver 2.2 及实例分析

    SudokuSolver 2.2 程序实现 根据 用C++实现的数独解题程序 SudokuSolver 2.1 及实例分析 里分析,对 2.1 版做了一些改进和尝试. CQuizDealer 类声明部 ...

  9. 【机器学习基础】逻辑回归——LogisticRegression

    LR算法作为一种比较经典的分类算法,在实际应用和面试中经常受到青睐,虽然在理论方面不是特别复杂,但LR所牵涉的知识点还是比较多的,同时与概率生成模型.神经网络都有着一定的联系,本节就针对这一算法及其所 ...

  10. Windows内核开发-10-监听对象

    Windows内核开发-10-监听对象 Windows内核除了可以监听进程,线程.dll还可以监听特定的对象和注册表.这里先讲一下监听对象. 监听对象 内核提供了一种可以监听对特定的对象类型的句柄进行 ...