2014-04-27 2 views
1

java.util.Locale 및 java.util.ResourceBundle을 사용하여 Java 프로그램 현지화를 가르칩니다. 이를 위해 영어, 프랑스어 및 기본 언어 메시지 묶음을 테스트하는 매우 간단한 Java 응용 프로그램을 작성했습니다. 프로그램은 잘 작동합니다. Windows에서 Eclipse Kepler SR2를 실행하고 있습니다.Java 응용 프로그램과 함께 java.util.ResourceBundle 등록 정보 파일을 배포하는 더 좋은 방법을 원합니다.

내 질문은 ResourceBundle.getBundle에서 사용하는 등록 정보 파일의 배포와 관련이 있습니다. 아래 질문에 대한 답을 얻을 것입니다.하지만 처음에는 데모 응용 프로그램을 배치하고 배포 할 때 이미 시도한 내용이 있습니다.

ResourceBundle.getBundle (아래 LocaleWrapper.java 참조)을 처음 호출했을 때 검색 할 경로가 배포 bin 폴더의 기본값을 발견했습니다.

ResourceBundle Javadoc은 배포 폴더에 대해 이야기하지 않으며, 내가 따르고 있었던 Oracle tutorial on Java internationalization도 아닙니다. 다음과 같이

그래서, 모든 빈에서 파일 내 속성을 덤핑 방지하기 위해, 나는 나의 로케일 래퍼 클래스에 대한 별도의 패키지 (demo.locale)을 생성에 정착하고 패키지 특성 파일을 모두 추가 :

다음과 같이 LocaleDemo 이름

내 이클립스 프로젝트는,이 개 패키지로 5 개 소스 파일로 구성

src/demo/DemoApp.java 
src/demo.locale/LocaleWrapper.java (wraps java.util.Locale, java.util.ResourceBundle) 
src/demo.locale/MessageBundle.properties (default messages, same as English/US) 
src/demo.locale/MessageBundle_en_US.properties (English/US messages) 
src/demo.locale/MessageBundle_fr_FR.properties (French/France messages) 

응용 프로그램은 다음과 같이가, bin 폴더 아래에 종료 배포하는 경우 :

bin/demo/DemoApp.class 
bin/demo/locale/LocaleWrapper.class 
bin/demo/locale/MessageBundle.properties 
bin/demo/locale/MessageBundle_en_US.properties 
bin/demo/locale/MessageBundle_fr_FR.properties 

(나는 명확성을 위해이 목록에서 패키지 정보 파일을 제외.)

그래서 내 실제 질문에 도착 : 이러한 유형의 배포와 나의 관심사는 특성 파일을 혼합한다는 것입니다

클래스 파일.

Ecipse에서 내 src 폴더와 동일한 수준의 데이터 폴더를 만들어 분리하려고 시도했으며 거기에 모든 속성 파일을 넣고 데이터 폴더를 빌드 경로에 추가했습니다. 그러나 앱을 배포하면 모든 속성 파일이 패키지 폴더 위의 최상위 수준 인 bin 폴더 (예 : bin/MessageBundle.properties)로 끝납니다.

이 작업은 만족스럽지 않으므로 demo.locale 패키지로 되돌려 놓았습니다. 내가 정한 레이아웃은 this stackoverflow question의 대답으로 받아 들여졌다.

그러나 나는 내가 선호하는 클래스와 데이터를 분리한다고 말한 그 스레드의 다른 포스터에 동의한다. 하기 위해서.

그래서 내 질문입니다 : 이클립스에서 응용 프로그램에 대한 고유 한 데이터 폴더를 만들고 해당 프로젝트 파일의 루트 폴더에 덤프되지 않은 속성 파일을 배포하는 방법이 있습니까? 내가 그것을 시도했을 때 일어났다.

프로그래머가 수행 한 작업에 대한 몇 가지 구체적인 예를 찾고 있는데,이 주제에 대한 공식 문서를 참조하는 것이 더 좋습니다. 실용 상 이것이 실제로 어떻게 수행 될 수 있는지를 일반적으로 만 언급 할 수는 없습니다.

부록으로 아래 두 개의 Java 클래스에 대한 소스 코드를 포함 시켰습니다. 내가 사용하는 리소스 파일은 위에서 링크 된 오라클 튜토리얼에서 직접 작성되었습니다.

DemoApp.java

package demo; 

import demo.locale.LocaleWrapper; 

public class DemoApp { 

    public static void main(String[] args) { 

     LocaleWrapper intl = null; 

     // English/USA 
     intl = new LocaleWrapper("en", "US"); 
     doTest(intl); 

     // French/France 
     intl.changeLocale("fr", "FR"); 
     doTest(intl); 

     // non-existent language/country will use default 
     intl.changeLocale("sp", "MX"); 
     doTest(intl); 

    } 

    private static void doTest(LocaleWrapper intl) { 
     System.out.println("Testing: " + intl.getLanguage() + "_" + intl.getCountry()); 
     System.out.println(" " + intl.getString("greetings")); 
     System.out.println(" " + intl.getString("farewell")); 
     System.out.println(" " + intl.getString("inquiry")); 
     System.out.println(); 
    } 
} 

LocaleWrapper.java

package demo.locale; 

import java.util.Locale; 
import java.util.ResourceBundle; 

/** 
* Internationalization using java.util.Locale and java.util.ResourceBundle. 
*/ 
public class LocaleWrapper { 

    private static final String PATH = "demo/locale/MessageBundle"; 

    private String language = null; 
    private String country = null; 
    private Locale locale = null; 
    private ResourceBundle messages = null; 

    public LocaleWrapper(String language, String country) { 
     super(); 
     this.language = language; 
     this.country = country; 
     this.locale = new Locale(language, country); 
     messages = ResourceBundle.getBundle(PATH, this.locale); 
    } 

    public void changeLocale(String language, String country) { 
     this.language = language; 
     this.country = country; 
     this.locale = new Locale(language, country); 
     messages = ResourceBundle.getBundle(PATH, this.locale); 
    } 

    /** 
    * Get an internationalized string based on it's key. 
    * 
    * @param key 
    *   Message key. 
    * @return Internationalized message string. 
    */ 
    public String getString(String key) { 
     return messages.getString(key); 
    } 

    // getters 

    public String getLanguage() { 
     return language; 
    } 

    public String getCountry() { 
     return country; 
    } 

} 

답변

2

돈. 방금 긴 질문을 드리겠습니다.

자원 번들을 표시하도록 자원 폴더를 지정할 수 있습니다.

내가 공부하는 질문 10911708 그리고 예제 프로그램을 실행하면 효과가있다. 여기

내가 무슨 짓을 :

1 단계 :은 SRC와 같은 수준의 (I 자원을 이름, 여기) 자원 폴더를 생성 (I 이클립스 사용) 폴더를 속성이에 파일을 넣어 폴더. 등록 정보 파일에

greetings = \u4f60\u597d.(你好) 
farewell = \u518d\u89c1.(再见) 
inquiry = \u4f60\u597d\u5417?(你好吗?) 

이 UTF8 텍스트를 저장하거나 지저분한 코드를 얻을 것이다 :

native2ascii -encoding utf8 MessagesBundle_zh_CN.properties 

는 당신이 얻을 :

처럼 다른 languange의 UTF8로 텍스트를 인코딩하는 데에 native2ascii 사용해야합니다.

2 단계 :

A. 방문 자원 번들 jar 파일 (실행 가능한 단지로 프로젝트를 패키징) 코드에서 , 같은 소스 번들을 방문하십시오 :

Locale currentLocale = new Locale(language, country); 

    ResourceBundle messages = 
    ResourceBundle.getBundle("resource.MessagesBundle",currentLocale); 

    System.out.println(messages.getString("greetings")); 
    System.out.println(messages.getString("inquiry")); 
    System.out.println(messages.getString("farewell")); 
이가지 경우에 대한

B. 이클립스 프로젝트에서 자원 번들을 방문하십시오. 다음

프로젝트 속성을 클릭하고 자바 빌드 경로에서 자원 폴더를 추가해야

자동, 빈 derectory에 이러한 파일을 복사합니다 일식과 같은 경로를 작성해야 :

ResourceBundle messages = 
     ResourceBundle.getBundle("MessagesBundle",currentLocale); 

접두사 "자원"없음. jar 파일에

내 테스트 결과는 다음과 같습니다

D:\>java -jar Sample.jar zh CN 
你好. 
你好吗? 
再见. 

당신은이 데모를 얻을 수 있습니다 : oracle website, 그것은 도움이 희망!

+0

답안을 수락합니다. 앱이 JAR 파일로 배포되었으므로 이제는 분명히 나에게 맞는 것처럼 보입니다.어떤 사람들은 getBundle을 호출 할 때 경로 이름 대신 패키지 이름을 지정하고있는 것을 볼 수 있습니다. 그러나 나는 당신과 다른 게시물을 읽을 때까지 왜 그런지 알지 못합니다. – Don