Java中的gettext _()方法有一个很好的替代方法吗?

时间:2010-11-26 14:44:45

标签: java gettext

这是通过gettext一组实用程序在C / Python / PHP / etc中解耦文本消息和源代码的常用方法。根据{{​​3}},我正在尝试在我的Java项目中做类似的事情。这是最好的方式吗?或者我应该尝试一些不同且更先进的东西?

PS。我想避免复杂的初始化,理想情况下我的Java代码应该是这样的:

[...]
public String howBigIsTheFile(File f) {
  String name = f.getAbsolutePath();
  long length = f.length();
  return _("The file %s is %d bytes long", name, length);
}

可能是this instruction之类的东西?

2 个答案:

答案 0 :(得分:3)

我认为这个问题是关于独立应用程序(命令行,SWING等),而不是关于服务器端应用程序(多个用户同时访问)。

在独立应用程序中,最简单的方法是创建一个单个静态访问器类,负责加载单个资源包,然后在其中查找字符串资源包。

这样的事情:

public class ResourceUtil {

    private static ResourceBundle rb;

    static {
        //set the default locale
        setLocale(Locale.ENGLISH);
    }

    public static void setLocale(Locale locale) {
        rb = ResourceBundle.getBundle("Resources", locale);
    }

    public static String tr(String key, Object... args) {
        return MessageFormat.format(rb.getString(key), args);
    }

}

您可以使用setLocale(Locale)方法更改有效的区域设置,并使用tr(String,Object...)方法访问已翻译的字符串。

然后,你可以从你的班级中调用它:

import static ResourceUtil.tr;

public String howBigIsTheFile(File f) {
  String name = f.getAbsolutePath();
  long length = f.length();
  return tr("The file %s is %d bytes long", name, length);
}

注意静态导入。

免责声明:所有提供的代码都是伪代码级别,无法保证编译。

根据应用程序的大小,您可能会发现使用 IDE字符串外部化支持很有用(例如,请参阅Eclipse JDT help中的章节,我确定其他IDE具有一些类似的功能)。

您还可以使用多个资源包和/或多个静态类 - 这取决于您的应用程序的大小和您的个人偏好。有关此问题的进一步讨论,请参见this question

在服务器环境中使用上述静态方法会导致问题,因为不同的用户会有不同的语言环境。根据您的webapp框架,您可以采用不同的方式解决此问题(例如use MessageSource in Spring)。

答案 1 :(得分:0)

如果你考虑I18N / L10N,Java在这里有自己的机制:属性文件。您可以看到示例in the internationalization tutorials。它比gettext的东西更简单:)。