`
fehly
  • 浏览: 248659 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

应用程序国际化

    博客分类:
  • java
阅读更多

基本概念

国际化(Internationalization,I18N)
本地化(Localization,L10N)
应用程序国际化的目标

编写在任何受支持的区域设置中都同样能正常运行(且外观表现本地化)的代码
国际化中的Unicode编码

 

数字、日期和时间国际化

国际化/本地化工作的焦点

ƒ 语言
ƒ 数字格式
ƒ 时间/日期格式
ƒ 货币
ƒ 身份证、社保号码和护照
ƒ 电话号码、地址和邮政编码
ƒ 度量衡
ƒ 禁忌
ƒ 名字和称谓

 国际化程序中的数据显示

import java.util.*;
import java.text.DateFormat;
import java.text.NumberFormat;

public class TestDataFormat{
	public static void main(String args[]){
		Date now = new Date();
		Locale locale = Locale.getDefault();
		System.out.println("Locale: " + locale);
		DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, locale);		
		System.out.println(df.format(now));

		double d = 1234.56;	
		NumberFormat nf1 = NumberFormat.getInstance();
		System.out.println(nf1.format(d));
		
		NumberFormat nf2 = NumberFormat.getCurrencyInstance();
		System.out.println(nf2.format(d));		
	}
}

资源包

在国际化的应用程序中,通常以资源包(Resource Bundle)的形式来保存与运行环境相关的资源,如消息文本、菜单及按钮标签等,每一个资源包对应一种用户Locale。

<包名>-<语言代码>-<国家/地区代码>   例:myRes-zh-Cn
<包名>-<语言代码>                         例:MyLabels-en

资源包的两种表现形式: 

属性文件(Property File)
资源绑定类(Resource Bundle Class)

属性文件

属性文件可用于保存要进行国际化的字符串信息,属纯文本文件,文件名前缀与资源包同名、后缀为".properties"。
属性文件的格式与先前的系统属性导出文件的格式相同。
使用java.util .ResourceBundle类可以加载属性文件并读取其中的资源。

import javax.swing.*;
import java.util.Date;
import java.util.Locale;
import java.util.ResourceBundle;
import java.text.DateFormat;

public class TestI18N{
	private static ResourceBundle bundle;
	private static Locale currentLocale;
	static{
		currentLocale = Locale.getDefault();
		bundle = ResourceBundle.getBundle("MyLabels",currentLocale);	
	}
	
	public static void main(String args[]){
		JFrame jf = new JFrame(bundle.getString("title"));
		JMenuBar jmb = new JMenuBar();
		JMenu jm1 = new JMenu(bundle.getString("menu.file"));
		JMenu jm2 = new JMenu(bundle.getString("menu.edit"));
		JMenu jm3 = new JMenu(bundle.getString("menu.help"));		
		jmb.add(jm1);
		jmb.add(jm2);
		jmb.add(jm3);
		jf.setJMenuBar(jmb);
		
		JTextArea status = new JTextArea();
		status.setText(bundle.getString("currentEnv") + currentLocale.getDisplayName());		
		JLabel time = new JLabel();
		jf.add(status,"Center");
		jf.add(time,"South");
		jf.setSize(350,200);
		jf.setLocation(400,300);
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);			
		jf.setVisible(true);
		
		MyTimer mt = new MyTimer(time);
		mt.start();
	}
}

class MyTimer extends Thread{
	JLabel status;
	public MyTimer(JLabel status){
		this.status = status;	
	}
	public void run(){
		Locale locale = Locale.getDefault();
		while(true){
			Date now = new Date();
			DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL,locale);		
			status.setText(df.format(now));
			try{
				Thread.sleep(1000);
			}catch(InterruptedException e){
				e.printStackTrace();	
			}	
		}
	}
}

为避免因文本文件在不同平台上的编码方式不一而导致乱码问题,Java国际化程序的属性文件统一采用Unicode编码格式存储
JDK中提供了专门的工具native2ascii对属性文件进行Unicode编码转化。

命令格式

native2ascii [-<options>] <inputfile> [<outputfile>]
例:D:\>native2ascii D:\p1\a.properties D:\p2\a.properties

为避免文件混杂,也可将属性文件保存在单独的子目录中,访问时则使用"."分隔其路径层次。

资源绑定类

资源绑定类(Resource Bundle Class)是资源包的另一种表现形式,和属性文件相对应,每个资源绑定类对应一种不同的用户Locale。
资源绑定类应与资源包同名,其中保存的也是国际化的“键-值对”属性信息,但信息格式并不限于字符串类型。
继承抽象类java.util.ListResourceBundle是定义资源绑定类的最便捷方法,该类中采用二维对象数组(Object[][])的形式保存所有国际化资源、并提供了按照“键”查找“值”的功能。

资源绑定类的定义格式:

public class <bundle_name> extends ListResourceBundle{
      //实现抽象方法getContents()
      public Object[][] getContents(){
      return  contents;
}
//定义资源
private static final Object[][] contents = {
          {<key1>,<value1>},
          {<key2>,<value2>},
          …
     } 
}
import java.awt.*;
import javax.swing.*;
import java.util.Date;
import java.util.Locale;
import java.util.ResourceBundle;
import java.text.DateFormat;

public class TestResourceBundle{
	private static ResourceBundle bundle;
	private static Locale currentLocale;
	static{
		currentLocale = Locale.getDefault();
		bundle = ResourceBundle.getBundle("MyLabels",currentLocale);	
	}
	
	public static void main(String args[]){
		JFrame jf = new JFrame(bundle.getString("title"));
		JMenuBar jmb = new JMenuBar();
		JMenu jm1 = new JMenu(bundle.getString("menu.file"));
		JMenu jm2 = new JMenu(bundle.getString("menu.edit"));
		JMenu jm3 = new JMenu(bundle.getString("menu.help"));		
		jmb.add(jm1);
		jmb.add(jm2);
		jmb.add(jm3);
		jf.setJMenuBar(jmb);
		
		JTextArea status = new JTextArea();
		status.setText(bundle.getString("currentEnv") + currentLocale.getDisplayName());		
		Color bg = (Color)bundle.getObject("bgColor");
		status.setBackground(bg);
		
		JLabel time = new JLabel();
		jf.add(status,"Center");
		jf.add(time,"South");		
		jf.setSize(350,200);
		jf.setLocation(400,300);
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);			
		jf.setVisible(true);
		
		MyTimer mt = new MyTimer(time);
		mt.start();
	}
}

class MyTimer extends Thread{
	JLabel status;
	public MyTimer(JLabel status){
		this.status = status;	
	}
	public void run(){
		Locale locale = Locale.getDefault();
		while(true){
			Date now = new Date();
			DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL,locale);		
			status.setText(df.format(now));
			try{
				Thread.sleep(1000);
			}catch(InterruptedException e){
				e.printStackTrace();	
			}	
		}
	}
}

消息格式化

和使用NumberFormat、DateFormat等工具类格式化数字和日期/时间信息的情况类似, JDK 中还提供了一个java.text.MessageFormat类专门用来格式化包含有可变参数的文本消息。

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

public class TestMessageFormat{
	private static int num = 10000;
	public static void main(String args[]){	
		TestMessageFormat tmf = new TestMessageFormat();
		System.out.print("请输入您的姓名:");
		String userName = new Scanner(System.in).next();
		System.out.println(tmf.formatMsg(userName));
	}
	public String formatMsg(String name){	
		String msg = "{0},欢迎您! 您是第{2}位访客,当前时间是{1}";
		Locale locale = Locale.getDefault();
		MessageFormat mf = new MessageFormat(msg,locale);
		Object[] msgArgs = {name,new Date(),++num};
		return mf.format(msgArgs);		
	}
}

相关术语:
消息模式(Message Pattern)
占位符(Placeholder)

 

占位符类型和样式

可以对消息模式串中的占位符进行可选的类型和样式设置,以获得更细致的格式化效果。

格式

{<index>,<type>,<style>}

设置占位符格式和样式

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

public class TestPlaceholder{
	private static int num = 10000;
	public static void main(String args[]){	
		TestPlaceholder tmf = new TestPlaceholder();
		System.out.print("请输入您的姓名:");
		String userName = new Scanner(System.in).next();
		System.out.println(tmf.formatMsg(userName));
	}
	public String formatMsg(String name){	
		String msg = "{0},您好! 您是第{1}位访客,今天是{2,date,medium},当前时间{2,time,short}";
		Locale locale = Locale.getDefault();
		MessageFormat mf = new MessageFormat(msg,locale);
		Object[] msgArgs = {name,++num,new Date()};
		return mf.format(msgArgs);		
	}
}

国际化程序中的消息格式化

国际化应用程序中的消息模式字符串本身也需要进行本地化处理,此时可以将之保存到资源包中,以提供对应于不同Locale的版本,其实现方式与保存普通文本资源的方式相同。

使用资源包保存消息模式字符串

import java.awt.Color;
import java.util.ListResourceBundle;
public class MyMsgs extends ListResourceBundle {
	private final Object my_data[][] = {
		{"note","Please input your name: "},
		{"msg","Welcome,{0}! Your seriation no is {1},Date: {2,date,medium},  Time:{2,time,short}"}
	};
	public Object[][] getContents() {
		return my_data;
	}	
}
 
import java.awt.Color;
import java.util.ListResourceBundle;
public class MyMsgs_zh_CN extends ListResourceBundle {
	private final Object my_data[][] = {
		{"note","请输入您的姓名: "},
		{"msg","{0},您好! 您是第{1}位访客,今天是{2,date,medium},当前时间{2,time,short}"}
	};
	public Object[][] getContents() {
		return my_data;
	}	
}
 
import java.util.*;
import java.text.*;

public class Test{
	private static int num = 10000;
	public static void main(String args[]){
		Locale defaultLocale = Locale.getDefault();
		ResourceBundle bundle = ResourceBundle.getBundle("MyMsgs",defaultLocale);
		String note = bundle.getString("note");	
		String msg = bundle.getString("msg");	
		System.out.print(note);
		String userName = new Scanner(System.in).next();
		
		MessageFormat mf = new MessageFormat(msg,defaultLocale);
		Object[] msgArgs = {userName,++num,new Date()};
		System.out.println(mf.format(msgArgs));		
	}
}

 

分享到:
评论

相关推荐

    Qt应用程序国际化步骤

    本篇将详细介绍Qt应用程序国际化的步骤,以及如何通过示例代码实现静态加载和动态切换语言。 一、Qt的国际化原理 Qt的国际化基于Qt的QTranslator类,它负责处理翻译工作。QTranslator可以从翻译文件(.qm文件)中...

    Qt应用程序国际化工程示例

    Qt应用程序国际化工程示例

    iOS应用程序国际化

    iOS应用程序的国际化是一个重要的开发环节,它涉及到将应用的内容、界面和功能适配到不同的语言和地区,以便全球用户都能方便地使用。这篇文章将深入探讨iOS国际化的基本概念、关键技术和最佳实践。 首先,我们需要...

    Struts2/应用程序 国际化

    文档中介绍了Struts2中国际化的实现原理和使用方法,同时介绍了应用程序的国际化的实现思路和方法以及示例!

    Qt程序国际化(简单实用)

    通过使用 QTranslator 类,开发者可以轻松地将 Qt 应用程序国际化,使其能够支持多种语言。 Qt 程序国际化的主要步骤: 1、在 Qt 应用程序中使用 tr 函数将中文字符串包含起来,以便 Qt 的翻译机制能够起作用。 ...

    iOS开发------程序实现国际化Localizable - iPhone手机开发技术文章 - 红黑联盟1

    2. 应用程序国际化:Localizable可以用于实现应用程序的国际化,满足全球范围内的应用需求。 3. 文本资源管理:Localizable可以用于管理应用程序的文本资源,提高开发效率和灵活性。 Localizable是一种强大且灵活...

    Shiny.i18n:轻松进行闪亮的应用程序国际化

    闪亮的应用程序国际化变得容易! 使用它非常简单:只需以一种受支持的格式准备翻译文件,然后使用用户友好的Shiny.i18n界面将其读入您的应用程序,然后将表达式括起来即可通过翻译标签进行翻译。 因此,您的应用...

    mvc-localization:显示 ASP.NET MVC 应用程序国际化本地化的(几乎)所有方面的示例应用程序

    首先,我们来看看标题中的关键点——"显示 ASP.NET MVC 应用程序国际化本地化的(几乎)所有方面"。这表明这个示例应用涵盖了多种与国际化和本地化相关的技术,如资源文件、全球化设置、视图本地化、路由本地化以及...

    Replacer:替换文件中的文本并使应用程序国际化-开源

    替换程序是用于替换文件中文本的实用程序,当您必须将此功能应用于一组文件时很有用。...* \”),应用程序国际化等。 操作的复杂性将取决于输入的标准,这样,可能性就没有限制。 该应用程序支持大多数编码。

    eclipse国际化插件

    Eclipse国际化插件是Java开发者实现应用程序国际化的重要工具,它简化了资源文件的管理,提高了翻译效率,并且能与MyEclipse这样的高级开发工具无缝集成。通过熟练掌握和应用这些工具,开发者可以创建出真正全球化...

    Golang多语言支持实现:构建国际化应用程序

    通过深入理解并应用多语言支持策略,你可以为你的应用程序增添一层国际化的竞争力。这不仅能够提升应用的用户体验,还能够扩大其在全球市场中的吸引力。随着你对Go语言和国际化开发的深入使用,你将更加熟悉如何整合...

    winform程序国际化

    WinForm程序国际化是一种技术,使得同一个应用程序可以根据用户的地区设置显示不同的语言内容,从而提供更友好的用户体验。在本文中,我们将深入探讨WinForm程序国际化的概念、实现方法以及相关工具和资源。 首先,...

    资源文件在国际化中的运用(WinForm)

    在Windows Forms应用开发中,资源文件的使用是实现应用程序国际化(Internationalization)和本地化(Localization)的关键。本文将深入探讨资源文件在WinForm应用中的作用、如何创建和管理资源文件,以及如何在代码...

    convert-excel-js:这是一个应用程序国际化助手,可以帮助你在json和excel之间完成文件类型转换。这是一个国际化帮助器,可帮助您在Json和Excel之间转换要国际化的文件。

    介绍这是一个应用程序国际化助手,可以帮助你在json和excel之间完成文件类型转换。使用npm安装npm install convert-excel-js -g使用yarn安装yarn global add convert-excel-js如何使用将json转换为excel。 excel ...

    翻译:翻译组件提供了使您的应用程序国际化的工具

    翻译组件提供了使您的应用程序国际化的工具。 入门 $ composer require symfony/translation use Symfony \ Component \ Translation \ Translator ; use Symfony \ Component \ Translation \ Loader \ ArrayLoader...

    国际化::globe_with_meridians:超级高效的应用程序国际化

    Cosmopolitan基于国际PHP扩展并且超高效所有国家/地区,语言,脚本,日历和时区的国际化产品特点大都会支持本地化货币名称和符号货币价值时间(毫秒) 号码百分比序数引用文字数字拼写持续时间单位(英制和美制) ...

    wxPython_i18n.7z

    【标题】"wxPython_i18n.7z"是一个关于使用wxPython库实现应用程序国际化的实例教程。这个压缩包包含了一系列的文件,用于演示如何利用Python内置的gettext模块为wxPython应用程序添加多语言支持。 【描述】在...

    easy_localization:轻松快速地将Flutter应用程序国际化

    Flutter应用程序的便捷国际化 为什么选择easy_localization? :rocket: 多种语言的轻松翻译 :electric_plug: 使用以JSON,CSV,Yaml,Xml格式加载翻译 :floppy_disk: 做出React并坚持进行语言环境更改 :high_...

Global site tag (gtag.js) - Google Analytics