【问题标题】:Java EE i18n and default project structureJava EE i18n 和默认项目结构
【发布时间】:2011-07-23 22:36:26
【问题描述】:

我是 Python Django 开发者

我想尝试一下Java。

在 django 中,我曾经按如下方式进行翻译:

from django.utils.translation import ugettext_lazy as _

然后如果在 locale/en/django.po 文件中的 .po 文件中指定了翻译

_("hello world")

问题1:Java中是否有类似的东西?

我找到了那些:

但没有一个是我要找的

我按照例子做了

import java.util.ResourceBundle;
import java.util.MissingResourceException;

public class i18n {
    private static ResourceBundle myResources = ResourceBundle.getBundle("messages");

    public static String _ (String originalStr) {
        try {
            return myResources.getString(originalStr);
        } catch (MissingResourceException e) {
            return originalStr;
        }
    }

}

后来

import static i18n._;

问题 2:但是messages.properties 文件应该放在哪里?

  • 我想为这些文件创建一个单独的语言环境目录。
  • 整个包和子包的翻译

    • locale/messages_en_US.properties
    • locale/messages_en_UK.properties
    • locale/messages_en_AU.properties
    • 等等……

问题3:这部分有异常捕获好像不行,你知道为什么吗?

问题 4:i18n 是否有 JavaEE 标准?

本以为java EE应该有标准化的app目录布局,i18和war目录内容,但是玩了几天java觉得很乱。因此,我能够在 Internet 上找到的每个示例开源代码都是完全不同的。从 Google Wave 协议项目开始,到示例小应用程序结束。

问题 5:是否有 JavaEE 编码理念或最佳实践?

我找到了Strategy for Web Applications,但开发人员似乎并不关心它。测试安置,同样的事情。每个人在不同的地方都有它们。模板中的 sql 查询之类的逻辑,WTF...

【问题讨论】:

  • 有没有办法根据源代码自动生成 .properties 文件? gted.org/gettext_java_tutorial.htm 之类的东西(gettext 或 ResourceBundle)是行业标准的?

标签: java internationalization jakarta-ee enterprise directory-structure


【解决方案1】:

没有一个真正的地方可以放置资源文件;这通常是应用程序开发人员的决定。将所有文件放在一个标准位置可能不适用于所有架构,因此规范不会添加不必要的约束。

您应该如何加载和引用资源包可能会受到您使用的框架的影响。例如,在 JSTL 应用程序中,您可能会使用 bundle 标签;在 JSF 应用程序中,您可能会使用 loadBundle 标记。其他视图技术将定义自己的机制。

一般...

ResourceBundle.getBundle 从类路径加载资源,所以如果你想使用一个目录,它或其父目录之一应该在应用程序类路径上。在 WAR 中,捆绑包应位于 WEB-INF/lib 目录或 WEB-INF/classes 目录中的 JAR 文件中。

所以,对于捆绑集...

 /WEB-INF/classes/locale/messages.properties
 /WEB-INF/classes/locale/messages_fr.properties
 /WEB-INF/classes/locale/messages_de.properties

...您可以通过获取请求 Locale 并调用:

ResourceBundle.getBundle("locale.messages", locale);

将捆绑包分配给单个静态变量是一种缺陷:

//BUG! this loads the properties file for the server default locale only!
private static ResourceBundle myResources = ResourceBundle.getBundle("messages");

您必须获取用户的语言环境from the request。静态分配只适用于客户端应用程序(如 IDE)。


请注意,提供根 messages.properties 基本文件作为不受支持的语言环境的后备通常是个好主意。

除了一般的本地化,使用原始字符串作为键的方法只有在键对于包是唯一的情况下才可以。否则,如果有相同的源字符串由于上下文而被不同地翻译,则会发生冲突。

【讨论】: