JavaWeb核心技术系列教程(32)——国际化


C语言自学完备手册(33篇)

Android多分辨率适配框架

JavaWeb核心技术系列教程

HTML5前端开发实战系列教程

MySQL数据库实操教程(35篇图文版)

推翻自己和过往——自定义View系列教程(10篇)

走出思维困境,踏上精进之路——Android开发进阶精华录

讲给Android程序员看的前端系列教程(40集免费视频教程+源码)


版权声明

  • 本文原创作者:谷哥的小弟
  • 作者博客地址:http://blog.csdn.net/lfdfhl

概述

所谓的国际化就是指软件应具备支持多种语言和地区的功能,也就是说软件能针对不同国家和地区的来访用户,提供符合来访者阅读习惯的页面和数据。由于国际化internationalization的首字母i和尾字母n之间有18个字符,因此国际化被简称为il8n。

固定文本的国际化

对于软件中的菜单栏、导航栏、错误提示信息,状态信息等这些固定不变的文本信息,可根据语言的不同将其写入不同的properties文件中从而实现国际化。不同的properties文件组合形成资源包。

资源包中使用基包作为默认的资源文件,基包的文件名常被称为基名。在资源包中,除了基包还存在其它资源文件;这些资源文件拥有共同的基名。除了基名,每个资源文件的名称中必须含有标识其本地信息的附加部分。例如:资源包i18n.properties,基名是i18n,则与中文、英文环境相对应的资源文件名则为: i18n_zh.properties和i18n_en.properties。

实现固定文本国际化常用方式如下:

  • 利用ResourceBundle在页面中实现固定文本国际化

  • 利用JSTL在页面中实现固定文本国际化

  • 利用Java语言在编程中实现固定文本的国际化

动态数据的国际化

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

示例教程

在此,以示例形式介绍JavaWeb应用与国际化相关的技术及其使用。

项目结构

本节教程中示例项目结构如下:
JavaWeb核心技术系列教程(32)——国际化_第1张图片

资源文件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ page import="java.util.ResourceBundle" %>
<!DOCTYPE>
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>i18n</title>
	</head>
	<h2 style="color: red;">本文作者:谷哥的小弟</h2>
	<h2 style="color: red;">博客地址:http://blog.csdn.net/lfdfhl</h2>
	<h2>在页面中实现固定文本的国际化</h2>
	<body>
	    <h4>利用ResourceBundle在页面中实现固定文本国际化</h4>
	    <%
           //加载与当前环境对应的资源包
           ResourceBundle resourceBundle = ResourceBundle.getBundle("cn.com.properties.i18n",request.getLocale());
        %>
		<form action="" method="post">
			<%=resourceBundle.getString("username")%><input type="text" name="username" /><br /><br />
			<%=resourceBundle.getString("password")%><input type="password" name="password" /><br /><br />
			<input type="submit" value="<%=resourceBundle.getString("submit")%>"/>
		</form>
		<br />

        <h4>利用JSTL在页面中实现固定文本国际化</h4>
		<fmt:setBundle var="bundle" basename="cn.com.properties.i18n" scope="page" />
		<form action="" method="post">
			<fmt:message key="username" bundle="${bundle}" /><input type="text" name="username"><br /><br />
			<fmt:message key="password" bundle="${bundle}" /><input type="password" name="password"><br /><br />
			<input type="submit" value="" bundle="${bundle}" />">
		</form>
        <br />
		<a href="${pageContext.request.contextPath }/I18NServlet">利用Java语言在编程中实现固定文本的国际化</a>
		<br />
		<br />
		<a href="${pageContext.request.contextPath }/DataServlet">利用Java语言在编程中实现动态数据的国际化</a>
	</body>
</html>

JavaWeb核心技术系列教程(32)——国际化_第2张图片

DataServlet

package cn.com.servlet;

import java.io.IOException;
import java.text.DateFormat;
import java.text.NumberFormat;
import java.util.Date;
import java.util.Locale;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 动态数据的国际化
 */
public class DataServlet extends HttpServlet{
	private static final long serialVersionUID = 686061395465320776L;
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doPost(request, response);
	}
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		
		try {
			//测试Local
			Locale locale = new Locale("en", "US");
			System.out.println("美国地区的ISO语言代码:" + locale.getLanguage());
			System.out.println("美国地区的ISO国家代码:" + locale.getCountry());
			System.out.println();

			//测试DateFormat
			Date date = new Date();
			DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL, Locale.GERMAN);
			String result = dateFormat.format(date);
			System.out.println(result);
			dateFormat = DateFormat.getTimeInstance(DateFormat.FULL, Locale.CHINA);
			result = dateFormat.format(date);
			System.out.println(result);
			dateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.LONG, Locale.CHINA);
			result = dateFormat.format(date);
			System.out.println(result);
			System.out.println();

			//测试NumberFormat
			int price = 99;
			NumberFormat numberFormat = NumberFormat.getCurrencyInstance(Locale.CHINA);
			String numberResult = numberFormat.format(price);
			System.out.println(numberResult);
			String s = "¥99.00";
			numberFormat = NumberFormat.getCurrencyInstance(Locale.CHINA);
			Number n = numberFormat.parse(s);
			System.out.println(n.doubleValue() + 1);
			double num = 0.5;
			numberFormat = NumberFormat.getPercentInstance();
			System.out.println(numberFormat.format(num));
		} catch (Exception e) {
			// TODO: handle exception
		}
		
		
	}
}

I18NServlet

package cn.com.servlet;

import java.io.IOException;
import java.util.Locale;
import java.util.ResourceBundle;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 编程实现固定文本的国际化
 */
public class I18NServlet extends HttpServlet{
	private static final long serialVersionUID = 3764684993748167681L;
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doPost(request, response);
	}
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
 
		//资源基包全路径
        String baseName = "cn.com.properties.i18n";
        
        //语言环境
        Locale cn = Locale.CHINA;
        Locale en = Locale.ENGLISH;
        
        //根据基包名和语言环境加载对应的语言资源包
        ResourceBundle cnResources = ResourceBundle.getBundle(baseName,cn);
        ResourceBundle usResources = ResourceBundle.getBundle(baseName,en);
        
        //从资源包中获取配置信息
        String usernameCN = cnResources.getString("username");
        String passwordCN = cnResources.getString("password");
        String submitCN =   cnResources.getString("submit");
        String usernameEN = usResources.getString("username");
        String passwordEN = usResources.getString("password");
        String submitEN =   usResources.getString("submit");
        
        //将配置信息打印至控制台
        System.out.println(usernameCN+" "+passwordCN+" "+submitCN);
        System.out.println(usernameEN+" "+passwordEN+" "+submitEN);
	}
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>I18N01</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
     <servlet-name>I18NServlet</servlet-name>
     <servlet-class>cn.com.servlet.I18NServlet</servlet-class>
  </servlet>
  <servlet-mapping>
     <servlet-name>I18NServlet</servlet-name>
     <url-pattern>/I18NServlet</url-pattern>
  </servlet-mapping>
  
  <servlet>
     <servlet-name>DataServlet</servlet-name>
     <servlet-class>cn.com.servlet.DataServlet</servlet-class>
  </servlet>
  <servlet-mapping>
     <servlet-name>DataServlet</servlet-name>
     <url-pattern>/DataServlet</url-pattern>
  </servlet-mapping>
  
</web-app>

你可能感兴趣的:(JavaWeb核心技术系列教程)