5

我是Python Django开发人员Java EE i18n和默认项目结构

我想尝试一点Java。

在Django我用来做我的翻译,因为它遵循:

from django.utils.translation import ugettext_lazy as _ 

,然后,如果在区域.po文件中指定的翻译/ EN/django.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:这部分用Excep重捕没有效果,你知道为什么吗?

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

我认为Java EE应该有一个标准化的应用程序目录布局,i18和战争目录内容,但几天与Java鬼混我觉得它非常混乱。因此,我能够在互联网上找到的每个示例开放源代码都是完全不同的。从Google Wave协议项目开始,以示例小应用程序结束。

问题5:JavaEE编码理念还是最佳实践?

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

+0

有没有基于源代码自动生成.properties文件的方法?像http://www.gted.org/gettext_java_tutorial.htm哪一个(gettext或ResourceBundle)是行业标准? – 2011-03-27 23:19:33

回答

11

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

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

一般......从classpath

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基本文件为不支持的语言环境回退。

作为一般的本地化而言,如果密钥对于包是唯一的,那么使用原始字符串作为密钥的方法只会是确定的。否则,如果存在由于上下文而翻译得不同的相同源字符串,则会发生冲突。