Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,有没有一个好的替代方法来代替gettext()方法?_Java_Gettext - Fatal编程技术网

在Java中,有没有一个好的替代方法来代替gettext()方法?

在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

在C/Python/PHP/etc中,通过一组实用程序将文本消息和源代码解耦是一种常见的方法。我正试图在我的Java项目中做一些类似的事情。这是最好的办法吗?或者我应该尝试一些不同的更高级的东西

另外,我希望避免复杂的初始化,理想情况下,我的Java代码应该如下所示:

[...]
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是初始化的一部分。