Java EE i18n和默认项目结构

时间:2011-03-27 15:36:20

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

我是Python Django devel

我想尝试一下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文件?

  • 我想在这些文件中有一个单独的语言环境目录。
  • 整个软件包和子软件包的翻译

    • 区域设置/ messages_en_US.properties
    • 区域设置/ messages_en_UK.properties
    • 区域设置/ messages_en_AU.properties
    • 等......

问题3:这部分异常捕获似乎不起作用,你知道为什么吗?

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

我认为java EE应该有一个标准化的app目录布局,i18和war目录内容,但是几天和java一起玩弄我发现它非常混乱。因此,我能够在Internet上找到的每个示例开源代码都是完全不同的。从Google Wave Protocol项目开始,以示例小应用程序结束。

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

我发现Strategy for Web Applications但开发人员似乎并不关心它。测试放置,同样的事情。每个人都有不同的地方。逻辑就像模板中的sql查询一样,WTF ......

1 个答案:

答案 0 :(得分:11)

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

您应该如何加载和引用资源包可能会受到您使用的框架的影响。例如,在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基本文件作为不支持的区域设置的后备文件通常是个好主意。

除了一般的本地化之外,如果密钥对于捆绑包是唯一的,那么使用原始字符串作为密钥的方法将是正常的。否则,如果由于上下文而导致相同的源字符串被翻译,则会发生冲突。