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