Я преподаю себе локализацию Java-программы, используя java.util.Locale и java.util.ResourceBundle. С этой целью я написал очень простое Java-приложение для тестирования языковых пакетов на английском, французском языках и по умолчанию. Программа отлично работает. Я запускаю Eclipse Kepler SR2 в Windows.
Мой вопрос связан с развертыванием файлов свойств, используемых ResourceBundle.getBundle (я расскажу об этом ниже), но сначала немного о том, что я уже пробовал, с точки зрения размещения моего демонстрационного приложения и его развертывания.
Когда я впервые вызвал ResourceBundle.getBundle (см. LocaleWrapper.java, ниже), я обнаружил, что путь, по которому он ищет по умолчанию, находится в папке bin bin.
ResourceBundle Javadoc не говорит о папках развертывания, а также о том, что я изучаю в учебнике Oracle по интернационализации Java.
Поэтому, чтобы избежать сброса моих файлов свойств в bin, я решил создать отдельный пакет (demo.locale) для моего класса оболочки locale и добавил все файлы свойств в этот пакет следующим образом:
Мой проект Eclipse с именем LocaleDemo состоит из 5 исходных файлов в 2 пакетах, а именно:
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
(Для ясности я исключал файлы информации из этих списков).
Итак, чтобы перейти к моему фактическому вопросу:
Моя проблема с этим типом развертывания заключается в том, что он смешивает файлы свойств с файлами классов.
Я попытался их разделить, создав папку данных на том же уровне, что и моя папка src в Ecipse, и я поместил туда все файлы свойств и добавил папку данных в мой путь сборки; однако, когда я развернул приложение, все файлы свойств просто попадают в папку bin на верхнем уровне над папками пакета (например, bin/MessageBundle.properties).
Это было неудовлетворительно, поэтому я вернул их в пакет demo.locale. Макет, на котором я остановился, был принят в качестве ответа в qaru.site/questions/388931/...:
Тем не менее, я согласен с другим плакатом в этом потоке, который сказал, чтобы разделять классы и данные, что я бы предпочел, но не было примера, как это сделать.
Итак, это мой вопрос: есть ли чистый способ в Eclipse создать отдельную папку данных для приложения и иметь файлы свойств, развернутые в этой папке, а не просто сбрасывать в корневую папку проекта, что и произошло, когда я попытался Это.
Я ищу некоторые конкретные примеры того, что сделали программисты, или даже лучше ссылку на какую-то официальную документацию по этому вопросу - я не мог найти ничего, что конкретно упоминало бы, как это можно было бы сделать на практике, а только общие.
В качестве приложения я включил исходный код для двух моих классов Java ниже. Файлы ресурсов, которые я использую, прямо из учебника Oracle, который я связал выше.
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 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;
}
}
Дон. Вы просто задаете длинный вопрос.
вы можете указать папку resouce, чтобы найти пакет ресурсов.
Я изучаю вопрос 10911708 И делаю примерную программу, и она работает.
Вот что я сделал:
Шаг 1: создайте папку ресурсов (здесь, я назвал ее ресурсом) на том же уровне, что и src (я использую eclipse), и поместим файл свойств в эту папку.
Не забудьте использовать native2ascii для кодирования текста для разных языков utf8, например:
native2ascii -encoding utf8 MessagesBundle_zh_CN.properties
то вы получаете:
greetings = \u4f60\u597d.(你好)
farewell = \u518d\u89c1.(再见)
inquiry = \u4f60\u597d\u5417?(你好吗?)
сохраните этот текст utf8 в файле свойств или вы получите грязный код.
Шаг 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. Посетите свой ресурсный пакет в проекте eclipse.
вы должны щелкнуть по свойствам проекта и добавить папку ресурса в путь сборки java,
и затем затмение будет автоматически копировать эти файлы в der deroryory bin, и вы должны написать путь следующим образом:
ResourceBundle messages =
ResourceBundle.getBundle("MessagesBundle",currentLocale);
без префикса "ресурс".
Мой результат теста в файле jar:
D:\>java -jar Sample.jar zh CN
你好.
你好吗?
再见.
вы можете получить эту демонстрацию от сайта oracle, надейтесь, что это поможет!