Хотите лучший способ развернуть файлы свойств java.util.ResourceBundle с помощью приложения Java

1

Я преподаю себе локализацию 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;
    }

}
Теги:
locale
resourcebundle

1 ответ

2
Лучший ответ

Дон. Вы просто задаете длинный вопрос.

вы можете указать папку 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, надейтесь, что это поможет!

  • 0
    Я принимаю ваш ответ, мне это кажется довольно очевидным, поскольку приложения развертываются в виде файлов JAR. Я вижу, что некоторые люди указывали имя пакета, а не путь в своем вызове getBundle, но я не понимал почему, пока не прочитал ваш и другой пост.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню