2010-02-02 6 views
1

I 로컬국제화

RB = ResourceBundle.get 번들 ("로케일 문자열"Locale.ARABIC)의의 ResourceBundle의 객체를 반환 된 ResourceBundle getBundle는 방법 (Propertyfilename, Local.languagename) 클래스를 사용하고 ; 아니요 - 지원되지 않음

영어, 아랍어를 지원하려면 어떻게해야합니까?

+0

우연히 프레임 워크를 사용하고 있습니까? –

+0

오라클은 로케일 지원 : JDK 6 을 http://www.oracle.com/technetwork/java/javase/locales-137662.html JDK 7 http://www.oracle.com/technetwork/ java/javase/javase7locales-334809.html JDK 용 http://www.oracle.com/technetwork/java/javase/java8locales-2095355.html –

답변

1

1) 각 속성 파일의 이름은 .properties로 바뀌어야합니다. 여기서 language_code는 2 자의 소문자 언어 코드이고 country_code는 2 자의 대문자입니다.

예.

MyResource_fr_FR.properties 

은 MyResource (프랑스는 프랑스, ​​FR는 프랑스)를 지정합니다.

속성 파일에서 아랍어를 지원하려면 언어에 대한 이스케이프 시퀀스를 입력해야합니다.

아랍어 때문에 ISO 8859-6 문자 집합을 사용합니다 (예를 들어)

당신은 당신의 등록 정보 파일에있는 경우 :

char_ren=\u00631, 8859_6_CHARSET 

char_ren는 아랍어 CHARACTER RHEN을 나타냅니다.

추신. 당신의 특성 파일의 이름 지정

MyResource_ar.properties 

의 \ u00631가 RHEN 문자의 16 진수 값입니다 될 것입니다.

+0

출처 : http://www.langbox.com/codeset /iso8859-6.html 및 http://java.sun.com/developer/technicalArticles/Intl/ResourceBundles/ –

+1

올바른 인코딩을 사용하도록 파일을 이스케이프 처리하려면 sun jdk에 포함 된 native2ascii 도구를 사용하여 파일을 변환 할 수 있습니다. – Mike

3

먼저, java.util.Locale은 실제로는 상수를 가지고 있지 않다. 하지만 그 언어 코드를 복용 Locale 생성자를 사용하여 스스로를 정의에서 당신을 중지해서는 안 :

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

둘째, by default 특성 파일은 ISO-8859-1 인코딩으로 InputStream로 읽어 ResourceBundle 후드 받고있다. 따라서 두 개의 속성 파일이 필요합니다. 하나는 UTF-8 인코딩이고 다른 하나는 Java 응용 프로그램에 제공하는 데 사용하는 값 ​​(예 : text_ar.properties.utf8)과 ISO-8859-1 인코딩 (예 : text_ar.properties)을 유지하는 데 사용됩니다. 다음과 같이 UTF-8 파일 ISO-8859-1로 파일 변환하기 위해 native2ascii 도구를 사용할 수 있습니다 :

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

이 유니 코드 코드 포인트에 비 ISO-8859-1 문자를 변환합니다. 예 : القيمة\u0627\u0644\u0642\u064a\u0645\u0629이 될 수 있습니다 (따라서 편집 할 수 없으므로 원본을 편집 용으로 유지하는 것이 좋습니다).

또는 자바 6을 이미 사용하고 있다면을 사용하여 속성 파일을 읽으려면 ResourceBundle.Control#newBundle()PropertyResourceBundle constructor taking an Reader을 사용할 수 있습니다.

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 여기

UTF-8은 다음과 같은 내용으로 클래스 패스에 text_ar.properties 파일을 인코딩 "일반"가 있다고 가정 할 킥오프 예제 소스 코드를 약간 변경하여 코드 예제를 간결하게 만들었 으면 원한다면 원래대로 되돌려 놓고 PropertyResourceBundle 코드로 라인을 변경하여 UTF-8Reader으로 인코딩됩니다.