java - 想要一种更好的方法来使用 Java 应用程序部署 java.util.ResourceBundle 属性文件

标签 java locale resourcebundle

我正在使用 java.util.Locale 和 java.util.ResourceBundle 自学 Java 程序本地化。为此,我编写了一个非常简单的 Java 应用程序来测试英语、法语和默认语言消息包。该程序运行良好。我在 Windows 上运行 Eclipse Kepler SR2。

我的问题与 ResourceBundle.getBundle 使用的属性文件的部署有关(我将在下面回答我的问题),但首先介绍一下我在布置演示应用程序和部署它方面已经尝试过的内容。

当我第一次调用 ResourceBundle.getBundle(请参阅下面的 LocaleWrapper.java)时,我发现它搜索的路径默认为部署 bin 文件夹。

ResourceBundle Javadoc没有讨论部署文件夹,Oracle tutorial on Java internationalization 也没有讨论我正在跟踪。

因此,为了避免将属性文件全部转储到 bin 中,我决定为我的语言环境包装类创建一个单独的包 (demo.locale),并将所有属性文件添加到该包中,如下所示:

我的名为 LocaleDemo 的 Eclipse 项目由 2 个包中的 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 中的答案。 :

但是,我确实同意该线程中另一位发帖者的观点,他说将类和数据分开,这是我更喜欢的,但没有给出如何做到这一点的示例。

这就是我的问题:Eclipse 中是否有一种干净的方法来为应用程序创建一个不同的数据文件夹,并将属性文件部署在该文件夹中,而不是仅仅转储到项目的根文件夹中,这就是发生的情况当我尝试的时候。

我正在寻找程序员所做工作的一些具体示例,或者甚至更好地引用有关此主题的一些官方文档 - 我找不到任何具体提及如何在实践中完成此操作的内容,只有一般性内容。

作为附录,我包含了下面两个 Java 类的源代码。我使用的资源文件直接来 self 上面链接的 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'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;
    }

}

最佳答案

唐.你只是提出一个很长的问题。

您可以指定一个资源文件夹来放置资源包。

我学题10911708并编写一个示例程序,它可以工作。

这是我所做的:

Step1:在src(我用的是eclipse)文件夹同级创建一个资源文件夹(这里我命名为resource),并将properties文件放入该文件夹中。

记住使用native2ascii将文本编码为不同的语言utf8,例如:

native2ascii -encoding utf8 MessagesBundle_zh_CN.properties

然后你得到:

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

将这些 utf8 文本保存到属性文件中,否则您将得到困惑的代码。

步骤2:对于两种情况:

A.访问jar文件中的资源包(将您的项目打包到可运行的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 构建路径中添加资源文件夹,

然后eclipse会自动将这些文件复制到bin目录下, 你应该这样写路径:

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

没有前缀“资源”。

我在jar文件中的测试结果是:

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

您可以从以下位置获取此演示:oracle website ,希望有帮助!

关于java - 想要一种更好的方法来使用 Java 应用程序部署 java.util.ResourceBundle 属性文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23319485/

相关文章:

java - NoClassDefFoundError : Could not initialize class org. apache.axis2.description.AxisService

java - Tomcat 多个应用程序,ehcache 无法工作

java - 单击按钮时增加和减少自动滚动文本速度

java - 使用区域设置设置自定义货币符号

Android:获取 ISO 639 alpha-2 代码中的用户语言(en、pt、jp ...)

Java 8 - 语言环境查找行为

java - 在运行时刷新 Swing 元素的语言

java - 在 Java 中,我如何找出我的资源包可用的语言

java - 在 Struts 2.x 中使用自定义资源包/属性扩展库

java - 仅适用于 S3 的 AWS 开发工具包