國際化和本地化
阿新 • • 發佈:2018-11-26
如何做到國際化的軟體,要求:
- 軟體中儲存特定的字串
- 知道瀏覽器當前使用哪種語言(Locale )
package com.loaderman.demo.f_i18n; import java.text.DateFormat; import java.text.NumberFormat; import java.util.Date; import java.util.Locale; import java.util.ResourceBundle; import org.junit.Test; public class App {// 國際化 - 靜態資料 @Test public void testI18N() throws Exception { // 中文語言環境 Locale locale = Locale.US; // 建立工具類物件ResourceBundle ResourceBundle bundle = ResourceBundle.getBundle("com.loaderman.demo.f_i18n.msg", locale); // 根據key獲取配置檔案中的值 System.out.println(bundle.getString("hello")); System.out.println(bundle.getString("username")); System.out.println(bundle.getString("pwd")); } // 國際化 - 動態文字 - 0. 概述 @Test public void testI18N2() throws Exception { // 國際化貨幣 NumberFormat.getCurrencyInstance(); // 國際化數字 NumberFormat.getNumberInstance(); // 國際化百分比 NumberFormat.getPercentInstance();// 國際化日期 //DateFormat.getDateTimeInstance(dateStyle, timeStyle, aLocale) } // 國際化 - 動態文字 - 1. 國際化貨幣 @Test public void testI18N3() throws Exception { // 模擬語言環境 Locale locale = Locale.CHINA; // 資料準備 double number = 100; // 工具類 NumberFormat nf = NumberFormat.getCurrencyInstance(locale); // 國際化貨幣 String m = nf.format(number); // 測試 System.out.println(m); } //面試題: 程式碼計算: $100 * 10 @Test public void eg() throws Exception { String str = "$100"; int num = 10; // 1. 分析str值是哪一國家的貨幣 Locale us = Locale.US; // 2. 國際化工具類 NumberFormat nf = NumberFormat.getCurrencyInstance(us); // 3. 解析str國幣 Number n = nf.parse(str); System.out.println(n.intValue() * num); } // 國際化 - 動態文字 - 2. 國際化數值 @Test public void testI18N4() throws Exception { // 模擬語言環境 Locale locale = Locale.CHINA; NumberFormat nf = NumberFormat.getNumberInstance(Locale.US); String str = nf.format(1000000000); System.out.println(str); } // 國際化 - 動態文字 - 3. 國際化日期 /* * 日期 * FULL 2015年3月4日 星期三 * LONG 2015年3月4日 * FULL 2015年3月4日 星期三 * MEDIUM 2015-3-4 * SHORT 15-3-4 * * 時間 * FULL 下午04時31分59秒 CST * LONG 下午04時32分37秒 * MEDIUM 16:33:00 * SHORT 下午4:33 * * */ @Test public void testI18N5() throws Exception { // 日期格式 int dateStyle = DateFormat.SHORT; // 時間格式 int timeStyle = DateFormat.SHORT; // 工具類 DateFormat df = DateFormat.getDateTimeInstance(dateStyle, timeStyle, Locale.CHINA); String date = df.format(new Date()); System.out.println(date); } // 面試2: 請將時間值:09-11-28 上午10時25分39秒 CST,反向解析成一個date物件。 @Test public void eg2() throws Exception { String str = "09-11-28 上午10時25分39秒 CST"; // 建立DateFormat工具類,國際化日期 DateFormat df = DateFormat.getDateTimeInstance( DateFormat.SHORT, DateFormat.FULL, Locale.getDefault()); Date d = df.parse(str); System.out.println(d); } }
msg.properties
hello=\u4F60\u597D username=\u7528\u6237\u540D pwd=\u5BC6\u7801 title=\u767B\u9646\u9875\u9762 submit=\ \u767B\u9646
msg_en_US.properties
hello=Hello username=User Name pwd=Password title=Login Page submit=Submit \!
Java提供了一個本地化的物件!封裝當前語言、國家、環境等特徵!
package com.loaderman.demo.e_locale; import java.util.Locale; import org.junit.Test; public class App { @Test //1. 本地化物件:Locale // 封裝語言、國家資訊的物件,有java.util提供 public void testLocale() throws Exception { // 模擬中國語言等環境 //Locale locale = Locale.CHINA; Locale locale = Locale.getDefault(); // 當前系統預設的語言環境 System.out.println(locale.getCountry()); // CN 國家的簡稱 System.out.println(locale.getDisplayCountry()); // 國家名稱 System.out.println(locale.getLanguage()); // zh 語言簡稱 // 模擬美國國家 Locale l_us = Locale.US; System.out.println(l_us.getCountry()); System.out.println(l_us.getDisplayCountry()); } }
Jsp頁面國際化
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <% ResourceBundle bundle = ResourceBundle.getBundle("com.loaderman.demo.f_i18n.msg",request.getLocale()); %> <title><%=bundle.getString("title") %></title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> <form name="frmLogin" action="${pageContext.request.contextPath }/admin?method=login" method="post"> <table align="center" border="1"> <tr> <td><%=bundle.getString("username") %></td> <td> <input type="text" name="userName"> </td> </tr> <tr> <td><%=bundle.getString("pwd") %></td> <td> <input type="password" name="pwd"> </td> </tr> <tr> <td> <input type="submit" value="<%=bundle.getString("submit") %>"> </td> </tr> </table> </form> </body> </html>
Jsp頁面國際化 – 使用jstl標籤
JSTL標籤:
核心標籤庫
國際化與格式化標籤庫
資料庫標籤庫(沒用)
函式庫
<fmt:setLocale value=""/> 設定本地化物件
<fmt:setBundle basename=""/> 設定工具類
<fmt:message></fmt:message> 顯示國際化文字
格式化數值<fmt:formatNumber pattern="#.##" value="100.99"></fmt:formatNumber>
格式化日期:<fmt:formatDate pattern="yyyy-MM-dd" value="${date}"/>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%--引入jstl國際化與格式化標籤庫 --%> <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <!-- 一、設定本地化物件 --> <fmt:setLocale value="${pageContext.request.locale}"/> <!-- 二、設定工具類 --> <fmt:setBundle basename="com.loaderman.demo.f_i18n.msg" var="bundle"/> <title><fmt:message key="title" bundle="${bundle}"></fmt:message></title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> <form name="frmLogin" action="${pageContext.request.contextPath }/admin?method=login" method="post"> <table align="center" border="1"> <tr> <td><fmt:message key="username" bundle="${bundle}"></fmt:message></td> <td> <input type="text" name="userName"> </td> </tr> <tr> <td><fmt:message key="pwd" bundle="${bundle}"></fmt:message></td> <td> <input type="password" name="pwd"> </td> </tr> <tr> <td> <input type="submit" value="<fmt:message key="submit" bundle="${bundle}"/>"> </td> </tr> </table> </form> </body> </html>