这是通过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之类的东西?
答案 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的东西更简单:)。