2010-02-02 106 views
1

我米使用的ResourceBundle方法的getBundle(Propertyfilename,Local.languagename)類,它返回本地國際在一個網站

RB = ResourceBundle.get軟件包( 「區域設置字符串」,Locale.ARABIC)的ResourceBundle的一個對象; - 不支持

我如何使用它來支持阿拉伯語,樂隊英語。

+0

您是否正在使用任何框架? – 2010-02-02 10:30:54

+0

Oracle支持區域設置: 爲JDK 6 http://www.oracle.com/technetwork/java/javase/locales-137662.html 爲JDK 7 http://www.oracle.com/technetwork/ java/javase/javase7locales-334809.html for JDK 8 http://www.oracle.com/technetwork/java/javase/java8locales-2095355.html – 2015-01-17 17:28:54

回答

1

1)每個屬性文件必須重命名爲 .properties其中language_code是2個字符的小寫語言代碼,country_code是2個字母的大寫字母。

E.g.

MyResource_fr_FR.properties 

指定MyResource(FR爲法語,FR爲FRANCE)。

要在您的屬性文件中支持阿拉伯語,必須鍵入該語言的轉義序列。

阿拉伯語使用ISO 8859-6字符集,以便(例如)

,如果你在你的屬性文件:

char_ren=\u00631, 8859_6_CHARSET 

char_ren將代表阿拉伯字符RHEN。

PS。您的屬性文件的命名將爲

MyResource_ar.properties 

\ u00631是RHEN字符的十六進制值。

+0

來源:http://www.langbox.com/codeset /iso8859-6.html和http://java.sun.com/developer/technicalArticles/Intl/ResourceBundles/ – 2010-02-02 11:02:53

+1

要輸入轉義您的文件以使用正確的編碼,您可以使用sun jdk中包含的native2ascii工具轉換它們。 – Mike 2010-02-02 15:05:22

3

首先,java.util.Locale確實沒有Locale.ARABIC常數。但是,這不應該使用Locale構造服用語言代碼自己定義它阻止你:

public static final Locale ARABIC = new Locale("ar"); 

其次,by default屬性文件是根據ResourceBundle罩解讀爲InputStreamISO-8859-1編碼。所以你真的需要有兩個不同的屬性文件,一個是UTF-8編碼,用於維護你剛纔用來提供給Java應用程序的值(例如text_ar.properties.utf8)和ISO-8859-1編碼(如text_ar.properties)。您可以使用native2ascii工具從UTF-8文件ISO-8859-1文件轉換如下:

c:\path\to\jdk\bin\native2ascii.exe -encoding UTF-8 text_ar.properties.utf8 text_ar.properties 

這將非ISO-8859-1字符轉換爲Unicode代碼點。例如。 القيمة將變成\u0627\u0644\u0642\u064a\u0645\u0629(這因此使其不可維護,因此建議保留原件以進行編輯)。或者,如果您已經使用Java 6,則可以使用ResourceBundle.Control#newBundle()PropertyResourceBundle constructor taking an Reader默認使用UTF-8來讀取屬性文件。

這裏的一個開球例如假設有一個「純」 UTF-8編碼text_ar.properties文件中的類路徑具有以下內容:

key=القيمة 

package com.stackoverflow.q2183245; 

import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.URL; 
import java.net.URLConnection; 
import java.util.Locale; 
import java.util.PropertyResourceBundle; 
import java.util.ResourceBundle; 
import java.util.ResourceBundle.Control; 

public class Test { 

    private static final Locale ARABIC = new Locale("ar"); 
    private static final Control UTF8CONTROL = new UTF8Control(); 

    public static void main(String args[]) throws Exception { 
     ResourceBundle bundle = ResourceBundle.getBundle("text", ARABIC, UTF8CONTROL); 
     System.out.println(bundle.getString("key")); // Prints القيمة 
    } 

} 

class UTF8Control extends Control { 
    public ResourceBundle newBundle 
     (String baseName, Locale locale, String format, ClassLoader loader, boolean reload) 
      throws IllegalAccessException, InstantiationException, IOException 
    { 
     String bundleName = toBundleName(baseName, locale); 
     String resourceName = toResourceName(bundleName, "properties"); 
     ResourceBundle bundle = null; 
     InputStream stream = null; 
     if (reload) { 
      URL url = loader.getResource(resourceName); 
      if (url != null) { 
       URLConnection connection = url.openConnection(); 
       if (connection != null) { 
        connection.setUseCaches(false); 
        stream = connection.getInputStream(); 
       } 
      } 
     } else { 
      stream = loader.getResourceAsStream(resourceName); 
     } 
     if (stream != null) { 
      try { 
       // This line is changed to make it to read properties files as UTF-8. 
       bundle = new PropertyResourceBundle(new InputStreamReader(stream, "UTF-8")); 
      } finally { 
       stream.close(); 
      } 
     } 
     return bundle; 
    } 
} 

注:newBundle()方法是從原始copypasted源代碼並稍作修改,以使代碼示例不再冗長,如果您希望將其恢復爲原始狀態,只需將PropertyResourceBundle結構更改爲即可3210編碼Reader