问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

java中如何实现多语言切换

发布网友 发布时间:2022-04-23 15:16

我来回答

6个回答

热心网友 时间:2022-05-18 16:41

一、国际化开发概述

  软件的国际化:软件开发时,要使它能同时应对世界不同地区和国家的访问,并针对不同地区和国家的访问,提供相应的、符合来访者阅读习惯的页面或数据。
  国际化(internationalization)又称为 i18n(读法为i 18 n,据说是因为internationalization(国际化)这个单词从i到n之间有18个英文字母,i18n的名字由此而来)

二、合格的国际化软件

  软件实现国际化,需具备以下两个特征:
  1、对于程序中固定使用的文本元素,例如菜单栏、导航条等中使用的文本元素、或错误提示信息,状态信息等,需要根据来访者的地区和国家,选择不同语言的文本为之服务。
  2、对于程序动态产生的数据,例如(日期,货币等),软件应能根据当前所在的国家或地区的文化习惯进行显示。

三、固定文本元素的国际化

  对于软件中的菜单栏、导航条、错误提示信息,状态信息等这些固定不变的文本信息,可以把它们写在一个properties文件中,并根据不同的国家编写不同的properties文件。这一组properties文件称之为一个资源包。

3.1、创建资源包和资源文件

  一个资源包中的每个资源文件都必须拥有共同的基名。除了基名,每个资源文件的名称中还必须有标识其本地信息的附加部分。例如:一个资源包的基名是“myproperties”,则与中文、英文环境相对应的资源文件名则为: "myproperties_zh.properties"  "myproperties_en.properties"

每个资源包都应有一个默认资源文件,这个文件不带有标识本地信息的附加部分。若ResourceBundle对象在资源包中找不到与用户匹配的资源文件,它将选择该资源包中与用户最相近的资源文件,如果再找不到,则使用默认资源文件。例如:myproperties.properties

3.2、资源文件的书写格式

  资源文件的内容通常采用"关键字=值"的形式,软件根据关键字检索值显示在页面上。一个资源包中的所有资源文件的关键字必须相同,值则为相应国家的文字。
并且资源文件中采用的是properties格式文件,所以文件中的所有字符都必须是ASCII字码,属性(properties)文件是不能保存中文的,对于像中文这样的非ACSII字符,须先进行编码。

例如:

  国际化的中文环境的properties文件

国际化的英文环境的properties文件

java提供了一个native2ascII工具用于将中文字符进行编码处理,native2ascII的用法如下所示:

3.3、编程实现固定文本的国际化

  在JavaAPI中提供了一个ResourceBundle 类用于描述一个资源包,并且 ResourceBundle类提供了相应的方法getBundle,这个方法可以根据来访者的国家地区自动获取与之对应的资源文件予以显示。

  ResourceBundle类提供了一个静态方法getBundle,该方法用于装载资源文件,并创建ResourceBundle实例:

Locale currentLocale = Locale.getDefault();
ResourceBundle myResources =ResourceBundle.getBundle(basename, currentLocale);

basename为资源包基名(且必须为完整路径)。
  如果与该locale对象匹配的资源包子类找不到。一般情况下,则选用默认资源文件予以显示。 
  加载资源文件后, 程序就可以调用ResourceBundle 实例对象的 getString 方法获取指定的资源信息名称所对应的值。

String value =  myResources.getString(“key");

范例:根据国家地区自动获取与之对应的资源文件

package me.gacl.i18n;

import java.util.Locale;
import java.util.ResourceBundle;
/**
* @ClassName: I18NTest
* @Description: 编程实现固定文本的国际化
* @author: 孤傲苍狼
* @date: 2014-8-29 下午9:34:05
*
*/ 
public class I18NTest {

    public static void main(String[] args) {
        //资源包基名(包名+myproperties)
        String basename = "me.gacl.i18n.resource.myproperties";
        //设置语言环境
        Locale cn = Locale.CHINA;//中文
        Locale us = Locale.US;//英文
        //根据基名和语言环境加载对应的语言资源文件
        ResourceBundle myResourcesCN = ResourceBundle.getBundle(basename,cn);//加载myproperties_zh.properties
        ResourceBundle myResourcesUS = ResourceBundle.getBundle(basename,us);//加载myproperties_en.properties
        
        //加载资源文件后, 程序就可以调用ResourceBundle实例对象的 getString方法获取指定的资源信息名称所对应的值。
        //String value =  myResources.getString(“key");
        String usernameCN = myResourcesCN.getString("username");
        String passwordCN = myResourcesCN.getString("password");
        
        String usernameUS = myResourcesUS.getString("username");
        String passwordUS = myResourcesUS.getString("password");
        
        System.out.println(usernameCN+"--"+passwordCN);
        System.out.println(usernameUS+"--"+passwordUS);
    }
}

运行结果:

3.4、在WEB应用中实现固定文本的国际化

如下所示:

<%@ page language="java"  import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<html>
  <head>
    <title>国际化(i18n)测试</title>
  </head>
  <%
      //加载i18n资源文件,request.getLocale()获取访问用户所在的国家地区
      ResourceBundle myResourcesBundle = ResourceBundle.getBundle("me.gacl.i18n.resource.myproperties",request.getLocale());
  %>
  <body>
        <form action="" method="post">
            <%=myResourcesBundle.getString("username")%>:<input type="text" name="username"/><br/>
            <%=myResourcesBundle.getString("password")%>:<input type="password" name="password"/><br/>
            <input type="submit" value="<%=myResourcesBundle.getString("submit")%>">
        </form>
  </body>
</html>

运行结果:

  浏览器语言是中文环境下的显示效果:

 浏览器语言是英文环境下的显示效果:

同样一个页面,在不同语言环境的浏览器下显示出了不同的语言文字效果,这样就实现了固定文本的国际化。

  IE浏览器切换使用语言:工具→Internet选项

四、动态数据的国际化

  数值,货币,时间,日期等数据由于可能在程序运行时动态产生,所以无法像文字一样简单地将它们从应用程序中分离出来,而是需要特殊处理。Java 中提供了解决这些问题的 API 类(位于 java.util 包和 java.text 包中)

4.1、Locale 类

  Locale 实例对象代表一个特定的地理,*、文化区域。
  一个 Locale 对象本身不会验证它代表的语言和国家地区信息是否正确,只是向本地敏感的类提供国家地区信息,与国际化相关的格式化和解析任务由本地敏感的类去完成。(若JDK中的某个类在运行时需要根据 Locale 对象来调整其功能,这个类就称为本地敏感类)

4.2、DateFormat类(日期格式化)

  DateFormat 类可以将一个日期/时间对象格式化为表示某个国家地区的日期/时间字符串。
  DateFormat 类除了可按国家地区格式化输出日期外,它还定义了一些用于描述日期/时间的显示模式的 int 型的常量,包括FULL, LONG, MEDIUM, DEFAULT, SHORT,实例化DateFormat对象时,可以使用这些常量,控制日期/时间的显示长度。

4.2.1、实例化DateFormat类

  实例化DateFormat类有九种方式,以下三种为带参形式,下面列出的三种方式也可以分别不带参,或只带显示样式的参数。
  getDateInstance(int style, Locale aLocale):以指定的日期显示模式和本地信息来获得DateFormat实例对象,该实例对象不处理时间值部分。
  getTimeInstance(int style, Locale aLocale):以指定的时间显示模式和本地信息来获得DateFormat实例对象,该实例对象不处理日期值部分。
  getDateTimeInstance(int dateStyle, int timeStyle, Locale aLocale):以单独指定的日期显示模式、时间显示模式和本地信息来获得DateFormat实例对象。

4.2.2、DateFormat 对象的方法    

  format:将date对象格式化为符合某个本地环境习惯的字符串。
  parse:将字符串解析为日期/时间对象
  注意:parse和format完全相反,一个是把date时间转化为相应地区和国家的显示样式,一个是把相应地区的时间日期转化成date对象,该方法在使用时,解析的时间或日期要符合指定的国家、地区格式,否则会抛异常。
  DateFormat 对象通常不是线程安全的,每个线程都应该创建自己的 DateFormat  实例对象

4.2.3、DateFormat使用范例

package me.gacl.i18n;

import java.text.DateFormat;
import java.text.ParseException;
import java.util.Date;
import java.util.Locale;

/**
* @ClassName: DateFormatTest
* @Description: DateFormat类测试
* DateFormat类可以将一个日期/时间对象格式化为表示某个国家地区的日期/时间字符串
* @author: 孤傲苍狼
* @date: 2014-8-29 下午10:03:26
*
*/ 
public class DateFormatTest {

    public static void main(String[] args) throws ParseException {
        Date date = new Date(); // 当前这一刻的时间(日期、时间)

        // 输出日期部分
        DateFormat df = DateFormat.getDateInstance(DateFormat.FULL,Locale.GERMAN);
        String result = df.format(date);
        System.out.println(result);

        // 输出时间部分
        df = DateFormat.getTimeInstance(DateFormat.FULL, Locale.CHINA);
        result = df.format(date);
        System.out.println(result);

        // 输出日期和时间
        df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.LONG,Locale.CHINA);
        result = df.format(date);
        System.out.println(result);

        // 把字符串反向解析成一个date对象
        String s = "10-9-26 下午02时49分53秒";
        df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.LONG,Locale.CHINA);
        Date d = df.parse(s);
        System.out.println(d);
    }
}

4.3、NumberFormat类(数字格式化)

  NumberFormat类可以将一个数值格式化为符合某个国家地区习惯的数值字符串,也可以将符合某个国家地区习惯的数值字符串解析为对应的数值
  NumberFormat类的方法:
    format 方法:将一个数值格式化为符合某个国家地区习惯的数值字符串
    parse 方法:将符合某个国家地区习惯的数值字符串解析为对应的数值。
  实例化NumberFormat类时,可以使用locale对象作为参数,也可以不使用,下面列出的是使用参数的。

getNumberInstance(Locale locale):以参数locale对象所标识的本地信息来获得具有多种用途的NumberFormat实例对象

getIntegerInstance(Locale locale):以参数locale对象所标识的本地信息来获得处理整数的NumberFormat实例对象

getCurrencyInstance(Locale locale):以参数locale对象所标识的本地信息来获得处理货币的NumberFormat实例对象

getPercentInstance(Locale locale):以参数locale对象所标识的本地信息来获得处理百分比数值的NumberFormat实例对象

范例:

package me.gacl.i18n;

import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;

/**
* @ClassName: NumberFormatTest
* @Description: NumberFormat类测试
* @author: 孤傲苍狼
* @date: 2014-8-29 下午10:25:29
*
*/ 
public class NumberFormatTest {

    public static void main(String[] args) throws ParseException {
        int price = 89;

        NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.CHINA);
        String result = nf.format(price);
        System.out.println(result);

        String s = "¥89.00";
        nf = NumberFormat.getCurrencyInstance(Locale.CHINA);
        Number n = nf.parse(s);
        System.out.println(n.doubleValue() + 1);

        double num = 0.5;
        nf = NumberFormat.getPercentInstance();
        System.out.println(nf.format(num));
    }
}

运行结果:

4.4、MessageFormat(文本格式化)

  如果一个字符串中包含了多个与国际化相关的数据,可以使用MessageFormat类对这些数据进行批量处理。
  例如:At 12:30 pm on jul 3,1998, a hurricance destroyed 99 houses and caused $1000000 of damage
  以上字符串中包含了时间、数字、货币等多个与国际化相关的数据,对于这种字符串,可以使用MessageFormat类对其国际化相关的数据进行批量处理。
  MessageFormat 类如何进行批量处理呢?
    1.MessageFormat类允许开发人员用占位符替换掉字符串中的敏感数据(即国际化相关的数据)。
    2.MessageFormat类在格式化输出包含占位符的文本时,messageFormat类可以接收一个参数数组,以替换文本中的每一个占位符。

4.4.1、模式字符串与占位符

模式字符串:

  At {0} on {1},a destroyed {2} houses and caused {3} of damage

  字符串中的{0}、{1}、{2}、{3}就是占位符

4.4.2、格式化模式字符串

  1、实例化MessageFormat对象,并装载相应的模式字符串。

  2、使用format(object obj[])格式化输出模式字符串,参数数组中指定占位符相应的替换对象。

范例:

package me.gacl.i18n;

import java.text.MessageFormat;
import java.util.Date;
import java.util.Locale;

/**
* @ClassName: MessageFormatTest
* @Description: MessageFormat类测试
* @author: 孤傲苍狼
* @date: 2014-8-29 下午10:29:19
*
*/ 
public class MessageFormatTest {

    public static void main(String[] args) {
        //模式字符串
        String pattern = "On {0}, a hurricance destroyed {1} houses and caused {2} of damage.";
        //实例化MessageFormat对象,并装载相应的模式字符串
        MessageFormat format = new MessageFormat(pattern, Locale.CHINA);
        Object arr[] = {new Date(), 99, 100000000};
        //格式化模式字符串,参数数组中指定占位符相应的替换对象
        String result = format.format(arr);
        System.out.println(result);
    }
}

运行结果:

4.4.3、占位符的三种书写方式

  {argumentIndex}: 0-9 之间的数字,表示要格式化对象数据在参数数组中的索引号
  {argumentIndex,formatType}: 参数的格式化类型
  {argumentIndex,formatType,FormatStyle}: 格式化的样式,它的值必须是与格式化类型相匹配的合法模式、或表示合法模式的字符串。

范例:

package me.gacl.i18n;

import java.text.MessageFormat;
import java.util.Date;
import java.util.Locale;

/**
* @ClassName: MessageFormatTest
* @Description: MessageFormat类测试
*
*/ 
public class MessageFormatTest {

    public static void main(String[] args) {
        //模式字符串
        String pattern = "At {0, time, short} on {0, date}, a destroyed {1} houses and caused {2, number, currency} of damage.";
        //实例化MessageFormat对象,并装载相应的模式字符串
        MessageFormat format = new MessageFormat(pattern, Locale.US);
        Object arr[] = {new Date(), 99, 100000000};
        //格式化模式字符串,参数数组中指定占位符相应的替换对象
        String result = format.format(arr);
        System.out.println(result);
    }
}

运行结果:

热心网友 时间:2022-05-18 17:59

做两套界面,点击按钮后触发事件,窗口监听事件,并重画窗口。。。只想到这个点子。

热心网友 时间:2022-05-18 19:34

可能要用到struts的资源配置文件了 别的目前还想不到

热心网友 时间:2022-05-18 21:25

这个是国际化问题,你必须自己弄两个properties文件,里面是key-value,一个文件是英文,一个是中文,中文内容必须转码
然后用java.util.ResourceBundle的getBundle()加载资源文件。。。。

热心网友 时间:2022-05-18 23:33

使用资源文件进行配置.使用key-value值进行配置.如果不会写可以提问
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
女生多大后可以不在长身高? 如何不用软件把手机投屏到电脑上手机屏幕怎样投放到电脑上 战时拒绝、故意延误军事订货罪既遂的处罚? 战时故意延误军事订货罪处罚标准 名师1+1导读方案:汤姆·索亚历险记目录 三星sm-g7200打开微信慢,无法正常收看,网速不慢。 笔记本电脑如何调亮屏幕亮度 大伙说说洗衣机要不要带烘干好 热烘干洗衣机怎么样 ef英语哪个好 Java怎么转换c语言? java语言是由什么改造而来的? Java语言会过时吗 Java语言以后的发展方向是什么方面? HP la2306x显示器链接后无信号,怎么办 电脑开机黑屏显示器无信号输入怎么办(详细情况见补充说明) 惠普Pro 3330mt计算机 开机灯不亮,但是会开机,显示器显示无信号。 换了显卡后 电脑显示显卡信息 然后显示惠普开机界面 然后显示显示器无信号黑屏 怎么弄显卡核心有发热? HP笔记本开机后花屏,外接显示器没有信号是怎么回事? HP电脑开机正常就是显示器没反应 怎么回事? 惠普电脑主机在运行为什么显示屏不亮? hp显示器不亮怎么办? 惠普的台式机,开机显示器找不到信号,主机运行正常,就是显示器没信号为什么? 苹果换id后,之前的照片怎么找回 发面馒头蒸好之后再热的时候变成了死面馒头 馒头蒸好了,开锅之后有的馒头眼看着就缩回去成了死面,是怎么回事? 蒸馒头发面后应怎样处理面馒头才会不酸松软 蒸馍,发面发过了,如何处置? 发面馒头醒好以后硬皮是怎么回事? 想问一下做馒头,为什么面粉发好后不筋道? java语言 java语言的特点(请详细点哦)谢谢 中配的大众polo自动挡上路大概需要多少钱?月供多少钱? 【哈尔滨优惠政策】2019款大众Polo,优惠高达1.4万元 又一款合资车价格“跳水”,10万跌至6万多,买国产不如选它好 全新车标配置升级,新款Polo Plus售9.99万起,适合哪些人开? 深圳地区Polo Plus优惠0.8万元,无附加条件Beats音响带回家 名图polo报价是多少?目前值得入手么? 大众POLO把客户当“韭菜”,两厢小车10W,便宜2W买飞度不香吗? polo smart是什么牌子 POLO和雨燕,哪个内部空间大? 19款polo plus1.6买了一年能卖多少钱? 大众高尔夫和POLO买哪个好 上海大众汽车6一7万元丿大众汽车短小型,七万左右 大众热销车报价是多少?目前值得入手么? sqlserver 怎么导入sql文件 怎么在sqlserver导入数据库 怎样将sqlserver+database+data+file+导入到sqlserver数据库 sqlserver中怎么将sql文件导入数据库中? excel怎么导入sqlserver