在Java中,有没有一个好的替代方法来代替gettext()方法?
在C/Python/PHP/etc中,通过一组实用程序将文本消息和源代码解耦是一种常见的方法。我正试图在我的Java项目中做一些类似的事情。这是最好的办法吗?或者我应该尝试一些不同的更高级的东西 另外,我希望避免复杂的初始化,理想情况下,我的Java代码应该如下所示:在Java中,有没有一个好的替代方法来代替gettext()方法?,java,gettext,Java,Gettext,在C/Python/PHP/etc中,通过一组实用程序将文本消息和源代码解耦是一种常见的方法。我正试图在我的Java项目中做一些类似的事情。这是最好的办法吗?或者我应该尝试一些不同的更高级的东西 另外,我希望避免复杂的初始化,理想情况下,我的Java代码应该如下所示: [...] public String howBigIsTheFile(File f) { String name = f.getAbsolutePath(); long length = f.length(); re
[...]
public String howBigIsTheFile(File f) {
String name = f.getAbsolutePath();
long length = f.length();
return _("The file %s is %d bytes long", name, length);
}
类似于maybe?如果您考虑I18N/L10N,Java在这里有自己的机制:属性文件。你可以看到一个例子。它甚至比gettext更简单:)。我假设这个问题是关于独立应用程序(命令行、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);
}
}
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);
}
您可以使用setLocale(locale)
方法更改活动区域设置,并使用tr(String,Object…)
方法访问翻译的字符串
然后,你可以这样从你的课堂上调用它:
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);
}
}
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字符串外部化支持非常有用(例如,请参阅中的章节,我相信其他IDE也有一些类似的功能)
您还可以使用多个资源包和/或多个静态类-这取决于应用程序的大小和您的个人偏好。有关此问题的进一步讨论,请参阅
在服务器环境中,使用如上所述的静态方法会导致问题,因为不同的用户具有不同的区域设置。根据您的webapp框架,您可能会以不同的方式解决此问题(例如)。使用此标准Java方法,我必须自己加载
ResourceBundle
才能处理文本。请参阅问题中的代码(刚刚更新)。这就是我所追求的简单性。除了在主类的静态区域中初始化ResourceBundle之外,我不知道还有什么。我相信这是一个好问题。是的,在使用资源包之前先加载它。似乎您开发的任何应用程序都可能有执行初始化的代码。加载ResourceBundle是初始化的一部分。