(JavaEE-13)國際化開發.md

#JavaWeb-國際化java

##國際化開發概述編程

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

##合格的國際化軟件數組

  • 軟件實現國際化,需具有哪些特徵:
    • 對於程序中固定使用的文本元素,例如菜單欄、導航條等中使用的文本元素、或錯誤提示信息,狀態信息等,須要根據來訪者的地區和國家,選擇不一樣語言的文本爲之服務
    • 對於程序動態產生的數據,例如(日期,貨幣等),軟件應能根據當前所在的國家或地區的文化習慣進行顯示

##固定文本元素的國際化安全

  • 對於軟件中的菜單欄、導航條、錯誤提示信息,狀態信息等這些固定不變的文本信息,能夠把它們寫在一個properties文件中,並根據不一樣的國家編寫不一樣的properties文件。這一組properties文件稱之爲一個資源包
  • 在JavaAPI中提供了一個ResourceBundle 類用於描述一個資源包,而且 ResourceBundle類提供了相應的方法getBundle,這個方法能夠根據來訪者的國家地區自動獲取與之對應的資源文件予以顯示

###建立資源包和資源文件編碼

  • 一個資源包中的每一個資源文件都必須擁有共同的基名。除了基名,每一個資源文件的名稱中還必須有標識其本地信息的附加部分。例如:一個資源包的基名是「myproperties」,則與中文、英文環境相對應的資源文件名則爲:
    • 「myproperites_zh.properties」 「myproperites_en.properties」
  • 每一個資源包都應有一個默認資源文件,這個文件不帶有標識本地信息的附加部分。若ResourceBundle對象在資源包中找不到與用戶匹配的資源文件,它將選擇該資源包中與用戶最相近的資源文件,若是再找不到,則使用默認資源文件。例如:
    • myproperites.properties

###資源文件的書寫格式線程

  • 資源文件的內容一般採用「關鍵字=值」的形式,軟件根據關鍵字檢索值顯示在頁面上。一個資源包中的全部資源文件的關鍵字必須相同,值則爲相應國家的文字
  • 而且資源文件中採用的是properties格式文件,因此文件中的全部字符都必須是ASCII字碼,對於像中文這樣的非ACSII字符,須先進行編碼。(java提供了一個native2ascII命令用於編碼)。屬性文件是不能保存中文的

###編程實現固定文本的國際化code

  • ResourceBundle類提供了一個靜態方法getBundle,該方法用於裝載資源文件,並建立ResourceBundle實例:orm

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

  • basename爲資源包基名(且必須爲完整路徑)。blog

  • 若是與該locale對象匹配的資源包子類找不到。通常狀況下,則選用默認資源文件予以顯示

  • 加載資源文件後, 程序就能夠調用ResourceBundle 實例對象的 getString 方法獲取指定的資源信息名稱所對應的值:String value = myResources.getString(「key");

  • 在WEB應用中實現固定文本的國際化

##動態數據的國際化

  • 數值,貨幣,時間,日期等數據因爲可能在程序運行時動態產生,因此沒法像文字同樣簡單地將它們從應用程序中分離出來,而是須要特殊處理。Java 中提供瞭解決這些問題的 API 類(位於 java.util 包和 java.text 包中)
  • Locale 類
    • Locale 實例對象表明一個特定的地理,政治、文化區域
    • 一個 Locale 對象自己不會驗證它表明的語言和國家地區信息是否正確,只是向本地敏感的類提供國家地區信息,與國際化相關的格式化和解析任務由本地敏感的類去完成。(若JDK中的某個類在運行時須要根據 Locale 對象來調整其功能,這個類就稱爲本地敏感類)

###DateFormat類(國際化日期)

  • DateFormat 類能夠將一個日期/時間對象格式化爲表示某個國家地區的日期/時間字符串
  • DateFormat 類除了可按國家地區格式化輸出日期外,它還定義了一些用於描述日期/時間的顯示模式的 int 型的常量,包括FULL, LONG, MEDIUM, DEFAULT, SHORT,實例化DateFormat對象時,可使用這些常量,控制日期/時間的顯示長度
  • DateFormat類
    • 例如,對於日期/時間「2005年9月15日下午4時41分20秒」,如設置了DateFormat的顯示模式,則日期/時間顯示樣式分別爲:
      • SHORT模式徹底是數字的,在中文環境下顯示爲「05-9-15 下午4:41」;在英文環境下爲「9/15/05 4:41 PM」
      • MEDIUM模式比SHORT模式長些,在中文環境顯示爲「2005-9-15 16:41:20」;在英文環境下顯示爲「Sep 15, 2005 4:41:20 PM」
      • LONG模式比MEDIUM模式更長一些,在中文環境下顯示爲「2005年9月15日 下午04時41分20秒」;在英文環境下顯示爲「September 15, 2005 4:41:20 PM CST」
      • FULL模式指定日期/時間的完整格式,在中文環境下顯示爲「2005年9月15日 星期四 下午04時41分20秒 CST」;在英文環境下,這個日期/時間顯示爲「Thursday, September 15, 2005 4:41:20 PM CST」
  • 實例化DateFormat類
    • 實例化DateFormat類有九種方式,如下三種爲帶參形式,下面列出的三種方式也能夠分別不帶參,或只帶顯示樣式的參數
      • getDateInstance(int style, Locale aLocale):以指定的日期顯示模式和本地信息來得到DateFormat實例對象,該實例對象不處理時間值部分
      • getTimeInstance(int style, Locale aLocale):以指定的時間顯示模式和本地信息來得到DateFormat實例對象,該實例對象不處理日期值部分
      • getDateTimeInstance(int dateStyle, int timeStyle, Locale aLocale):以單獨指定的日期顯示模式、時間顯示模式和本地信息來得到DateFormat實例對象
  • DateFormat 對象的方法
    • format: 將date對象格式化爲符合某個本地環境習慣的字符串
    • parse:將字符串解析爲日期/時間對象
    • 注意:parse和format徹底相反,一個是把date時間轉化爲相應地區和國家的顯示樣式,一個是把相應地區的時間日期轉化成date對象,該方法在使用時,解析的時間或日期要符合指定的國家、地區格式,不然會拋異常
  • DateFormat 對象一般不是線程安全的,每一個線程都應該建立本身的 DateFormat 實例對象

###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實例對象

###練習

  • 編寫一個能國際化顯示的登錄頁面
  • 請建立一個date對象,並把date對象中表示日期部分的時間值,以及表示時間部分的時間值,分別以short、long模式進行格式化輸出(國家設置爲中國)
  • 請將時間值:09-11-28 上午10時25分39秒 CST,反向解析成一個date對象
  • 請將整數198,輸出爲貨幣形式:$198,並將$198反向解析成整數198

###MessageFormat(動態文本)

  • 若是一個字符串中包含了多個與國際化相關的數據,可使用MessageFormat類對這些數據進行批量處理
  • 例如:At 12:30 pm on jul 3,1998, a hurricance destroyed 99 houses and caused $1000000 of damage

    以上字符串中包含了時間、數字、貨幣等多個與國際化相關的數據,對於這種字符串,可使用MessageFormat類對其國際化相關的數據進行批量處理

  • MessageFormat 類如何進行批量處理呢?
    • MessageFormat類容許開發人員用佔位符替換掉字符串中的敏感數據(即國際化相關的數據)
    • MessageFormat類在格式化輸出包含佔位符的文本時,messageFormat類能夠接收一個參數數組,以替換文本中的每個佔位符

###模式字符串與佔位符

  • At 12:30 pm on jul 3,1998, a hurricance destroyed 99 houses and caused $1000000 of damage

  • 模式字符串:

    • At {0} on {1},a destroyed {2} houses and caused {3} of damage
  • 格式化模式字符串

    • On {0}, a hurricance destroyed {1} houses and caused {2} of damage
  • MessageFormat類

    • MessageFormat(String pattern)
      • 實例化MessageFormat對象,並裝載相應的模式字符串
    • format(object obj[])
      • 格式化輸出模式字符串,參數數組中指定佔位符相應的替換對象
      • format(new Object[ ]{date, new Integer(99), new Double(1E7) })

    String pattern = "On {0}, a hurricance destroyed {1} houses and caused " + "{2} of damage."; MessageFormat msgFmt = new MessageFormat(pattern,Locale.US);

    //準備參數數組 String datetime = "Jul 3, 1998 12:30 PM"; Date date = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT, Locale.US).parse(datetime); Object [] msgArgs = {date, new Integer(99),new Double(1E7)};

    //執行格式化操做 String result = msgFmt.format(msgArgs); System.out.println(result);

  • 佔位符有三種方式書寫方式:

    • {argumentIndex}: 0-9 之間的數字,表示要格式化對象數據在參數數組中的索引號
    • {argumentIndex,formatType}: 參數的格式化類型
    • {argumentIndex,formatType,FormatStyle}: 格式化的樣式,它的值必須是與格式化類型相匹配的合法模式、或表示合法模式的字符串

    String pattern = "At {0, time, short} on {0, date}, a destroyed'\n'"+ "{1} houses and caused {2, number, currency} of damage."; MessageFormat msgFmt = new MessageFormat(pattern,Locale.US);

    String datetimeString = "Jul 3, 1998 12:30 PM"; Date date = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT,Locale.US).parse(datetimeString); String event = "a hurricance"; Object []msgArgs = {date, event, new Integer(99), new Double(1E7)};

    String result = msgFmt.format(msgArgs); System.out.println(result);

http://blog.163.com/meihua_can/blog/static/18543529220114221315952/

相關文章
相關標籤/搜索