javalocale.us比較的簡單介紹

本文目錄一覽:

java中如何實現多語言切換

一、國際化開發概述

軟體的國際化:軟體開發時,要使它能同時應對世界不同地區和國家的訪問,並針對不同地區和國家的訪問,提供相應的、符合來訪者閱讀習慣的頁面或數據。

國際化(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);

    }

}

運行結果:

java 怎麼判斷當前時間 是否在 給定時間之間 用Calendar 行嗎

可以用Calendar類

Date now = new Date();

Calendar cal1 = Calendar.getInstance();

Calendar cal2 = Calendar.getInstance();

Calendar cal3 = Calendar.getInstance();

SimpleDateFormat sdf = new SimpleDateFormat(“yyyyMMddHHmmss”);

String time1 = “20121225080000”;

String time2 = “20121227080000”;

cal1.setTime(now);

cal2.setTime(sdf.parse(time1));

cal3.setTime(sdf.parse(time2));

if(cal2.before(cal1) cal3.after(cal1)){

//在時間段內 

}

java中 locale類 及相關方法

在項目中經常要用到將字元串解析成Locale,但是沒有一個比較好用的類。

java本身提供了3個構造函數

Locale(langugae)

locale(language,country)

Locale(String language, String country, String variant)

Apache 有個 LocaleUtils.toLocale(String language)但是不支持最後2個字元為小寫的,如:zh_CN支持, zh_cn就不支持。

[java] view plaincopyprint?

import java.util.Locale;

public class LocaleUtil

{

private final static Locale DEFAULT_LOCALE = Locale.ENGLISH;

public final static String IETF_SEPARATOR = “-“;

public final static String SEPARATOR = “_”;

public final static String EMPTY_STRING = “”;

public static Locale toLocale( String language )

{

if( !StringUtil.isNullOrEmpty( language ) )

{

return langToLocale( language, SEPARATOR );

}

return DEFAULT_LOCALE;

}

public static Locale langToLocale( String lang , String separator )

{

if( StringUtil.isNullOrEmpty( lang ) )

{

return DEFAULT_LOCALE;

}

String language = EMPTY_STRING;

String country = EMPTY_STRING;

String variant = EMPTY_STRING;

int i1 = lang.indexOf( separator );

if ( i1 0 )

{

language = lang;

} else

{

language = lang.substring(0, i1);

++i1;

int i2 = lang.indexOf( separator, i1);

if (i2 0)

{

country = lang.substring(i1);

} else

{

country = lang.substring(i1, i2);

variant = lang.substring(i2+1);

}

}

if(language.length() == 2)

{

language = language.toLowerCase();

}else

{

language = EMPTY_STRING;

}

if(country.length() == 2)

{

country = country.toUpperCase();

}else

{

country = EMPTY_STRING;

}

if( (variant.length() 0)

((language.length() == 2) ||(country.length() == 2)) )

{

variant = variant.toUpperCase();

}else

{

variant = EMPTY_STRING;

}

return new Locale(language, country, variant );

}

}

import java.util.Locale;

public class LocaleUtil

{

private final static Locale DEFAULT_LOCALE = Locale.ENGLISH;

public final static String IETF_SEPARATOR = “-“;

public final static String SEPARATOR = “_”;

public final static String EMPTY_STRING = “”;

public static Locale toLocale( String language )

{

if( !StringUtil.isNullOrEmpty( language ) )

{

return langToLocale( language, SEPARATOR );

}

return DEFAULT_LOCALE;

}

public static Locale langToLocale( String lang , String separator )

{

if( StringUtil.isNullOrEmpty( lang ) )

{

return DEFAULT_LOCALE;

}

String language = EMPTY_STRING;

String country = EMPTY_STRING;

String variant = EMPTY_STRING;

int i1 = lang.indexOf( separator );

if ( i1 0 )

{

language = lang;

} else

{

language = lang.substring(0, i1);

++i1;

int i2 = lang.indexOf( separator, i1);

if (i2 0)

{

country = lang.substring(i1);

} else

{

country = lang.substring(i1, i2);

variant = lang.substring(i2+1);

}

}

if(language.length() == 2)

{

language = language.toLowerCase();

}else

{

language = EMPTY_STRING;

}

if(country.length() == 2)

{

country = country.toUpperCase();

}else

{

country = EMPTY_STRING;

}

if( (variant.length() 0)

((language.length() == 2) ||(country.length() == 2)) )

{

variant = variant.toUpperCase();

}else

{

variant = EMPTY_STRING;

}

return new Locale(language, country, variant );

}

}

注意:

public class StringUtil

{

public static boolean isNullOrEmpty(String target) {

return target == null || “”.equals(target);

}

}

java locale

java locale是什麼,讓我們一起了解一下?

locale命令是將有關當前語言環境或全部公共語言環境的信息寫到標準輸出上,如果使用了語言環境類別名而沒有使用標誌來指定locale命令,那麼 locale命令會寫出由Name參數指定的語言環境類別中的所有關鍵字的值。

Java為什麼要設定locale?

雖然設定locale與你能否瀏覽中文的網頁沒有直接的關係,即便你把locale設置成en_US.ISO-8859-1這樣一個標準的英文locale你照樣可以瀏覽中文的網頁,只要你的系統裡面有相應的字符集(這個都不一定需要)和合適的字體(如simsun),瀏覽器就可以把網頁翻譯成中文給你看。具體的過程是網路把網頁傳送到你的機器上之後,瀏覽器會判斷相應的編碼的字符集,根據網頁採用的字符集,去字體庫裡面找合適的字體,然後由文字渲染工具把相應的文字在屏幕上顯示出來。 

但是為了讓你的Linux能夠輸入中文,就需要把系統的locale設定成中文的(嚴格說來是locale中的語言類別LC_CTYPE ),例如zh_CN.GB2312、zh_CN.GB18030或者zh_CN.UTF-8。很多人都不明白這些古里古怪的表達方式。但是只需要知道,這是locale的表達方式就可以了。 

實戰操作:

下面通過示例演示在Date中使用Locale的,參考代碼如下(LocaleTest.java): import java.util.Locale; import java.util.Date; import java.util.Calendar; import java.text.SimpleDateFormat; import java.text.DateFormat; /** * Locale 的測試程序 */ public class LocaleTest { public static void main(String[] args) { // 2種不同的Locale的創建方法 testDiffDateLocales(); // 顯示所有的Locales testAllLocales(); } /**   * 2種不同的Locale的創建方法   */ private static void testDiffDateLocales() { // date為2013-09-19 14:22:30 Date date = new Date(113, 8, 19, 14, 22, 30); // 創建「簡體中文」的Locale Locale localeCN = Locale.SIMPLIFIED_CHINESE; // 創建「英文/美國」的Locale Locale localeUS = new Locale(“en”, “US”); // 獲取「簡體中文」對應的date字元串 String cn = DateFormat.getDateInstance(DateFormat.MEDIUM, localeCN).format(date); // 獲取「英文/美國」對應的date字元串 String us = DateFormat.getDateInstance(DateFormat.MEDIUM, localeUS).format(date); System.out.printf(“cn=%s\nus=%s\n”, cn, us); } /**   * 顯示所有的Locales   */ private static void testAllLocales() { Locale[] ls = Locale.getAvailableLocales(); System.out.print(“All Locales: “); for (Locale locale:ls) { System.out.printf(locale+”, “); } System.out.println(); } }

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/160516.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-21 01:14
下一篇 2024-11-21 01:14

相關推薦

  • Python簡單數學計算

    本文將從多個方面介紹Python的簡單數學計算,包括基礎運算符、函數、庫以及實際應用場景。 一、基礎運算符 Python提供了基礎的算術運算符,包括加(+)、減(-)、乘(*)、除…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29
  • Python海龜代碼簡單畫圖

    本文將介紹如何使用Python的海龜庫進行簡單畫圖,並提供相關示例代碼。 一、基礎用法 使用Python的海龜庫,我們可以控制一個小海龜在窗口中移動,並利用它的「畫筆」在窗口中繪製…

    編程 2025-04-29
  • Python櫻花樹代碼簡單

    本文將對Python櫻花樹代碼進行詳細的闡述和講解,幫助讀者更好地理解該代碼的實現方法。 一、簡介 櫻花樹是一種圖形效果,它的實現方法比較簡單。Python中可以通過turtle這…

    編程 2025-04-28
  • Python大神作品:讓編程變得更加簡單

    Python作為一種高級的解釋性編程語言,一直被廣泛地運用於各個領域,從Web開發、遊戲開發到人工智慧,Python都扮演著重要的角色。Python的代碼簡潔明了,易於閱讀和維護,…

    編程 2025-04-28
  • 用Python實現簡單爬蟲程序

    在當今時代,互聯網上的信息量是爆炸式增長的,其中很多信息可以被利用。對於數據分析、數據挖掘或者其他一些需要大量數據的任務,我們可以使用爬蟲技術從各個網站獲取需要的信息。而Pytho…

    編程 2025-04-28
  • 如何製作一個簡單的換裝遊戲

    本文將從以下幾個方面,為大家介紹如何製作一個簡單的換裝遊戲: 1. 遊戲需求和界面設計 2. 使用HTML、CSS和JavaScript開發遊戲 3. 實現遊戲的基本功能:拖拽交互…

    編程 2025-04-27
  • Guava Limiter——限流器的簡單易用

    本文將從多個維度對Guava Limiter進行詳細闡述,介紹其定義、使用方法、工作原理和案例應用等方面,並給出完整的代碼示例,希望能夠幫助讀者更好地了解和使用該庫。 一、定義 G…

    編程 2025-04-27
  • 製作一個簡單的管理系統的成本及實現

    想要製作一個簡單的管理系統,需要進行技術選型、開發、測試等過程,那麼這個過程會花費多少錢呢?我們將從多個方面來闡述製作一個簡單的管理系統的成本及實現。 一、技術選型 當我們開始思考…

    編程 2025-04-27
  • 2的32次方-1:一個看似簡單卻又複雜的數字

    對於計算機領域的人來說,2的32次方-1(也就是十進位下的4294967295)這個數字並不陌生。它經常被用來表示IPv4地址或者無符號32位整數的最大值。但實際上,這個數字卻包含…

    編程 2025-04-27

發表回復

登錄後才能評論