代码之家  ›  专栏  ›  技术社区  ›  yegor256

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

  •  4
  • yegor256  · 技术社区  · 14 年前

    在C/Python/PHP/etc中,通过 gettext 一套实用程序。根据 this instruction . 这是最好的办法吗?或者我应该试试其他更先进的东西?

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

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

    有点像 gettext-commons 也许 吧?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Community CDub    7 年前

    我想这个问题是关于 独立应用程序 (命令行、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 ).

        2
  •  0
  •   Gilles 'SO- stop being evil'    13 年前

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