【问题标题】:Swing I18N: When to load properties?Swing I18N:何时加载属性?
【发布时间】:2010-07-07 14:06:28
【问题描述】:

我正在重构现有的 Java 桌面应用程序以从 .properties 文件加载国际化的 UI 文本标签。在应用程序生命周期中,何时是加载属性文件并将字符串填充到内存中的合适时间?现有的实现将每个组件的标签定义为例如:public static final String foo = "bar"; 在构造函数中加载文本似乎效率低下(因为它将在所有实例之间共享),但是在 static {...} 块中执行所有操作似乎并不理智任何一个。这里的最佳做法是什么?

【问题讨论】:

    标签: java swing internationalization


    【解决方案1】:

    在我见过的大多数应用程序中,属性是在开始构建主 UI 之前从文件加载的。这些属性被加载到 ResourceBundle 中,这将是

    • 静态
    • 作为每个构造函数的参数给出

    【讨论】:

      【解决方案2】:

      另外一种不改变面板代码的方法是使用某种“资源注入”。

      除其他外,以下库执行此操作:

      • fuse: 就是这样做的(但我从来没有测试过,现在这个项目似乎已经死了)
      • Swing Application Framework:做了很多事情,包括资源注入。也许值得检查源代码以找出与您相关的内容。注意项目也死了,源码比较乱(可能不好提取相关代码)
      • Guts-GUI:是一个完整的GUI框架,包括资源注入,但它是基于Guice的。如果你对 Guice 有一点了解,那么资源注入的源代码应该很容易理解,并且可以从项目中提取出来。

      在大多数情况下,资源注入基于赋予每个组件的名称(这就是 Swing App Framework 和 Guts-GUI 的工作方式,对于 Fuse 我不确定)。 如果组件没有正确命名,您还可以选择自动命名它们(无需更改面板的源代码)。我已经在 Guts-GUI 包中实现了这样的方法,您可能还想看看它。

      然后通常在显示您的框架或对话框之前调用资源注入(这将是您当前源代码中唯一需要修改的代码位置,如果用于打开对话框/框架的代码已集中在一个类中而不是散布在各处)。

      【讨论】:

        【解决方案3】:

        我建议懒惰地加载资源。基本上,创建一个函数来获取您的资源包,如果它还没有加载它。而不是用它来检索你的资源。

        【讨论】:

          【解决方案4】:

          我会选择延迟加载。当您预先加载所有内容时,您只会增加应用程序的启动时间,甚至可能会冒险加载甚至不需要(不再需要)的内容。

          顺便说一句,你提到的这个静态的东西,无论如何都会有效地以延迟加载结束,因为 JVM 对类进行延迟加载。另外:当你使用 ResourceBundles 时,记住它们会做一些内部缓存,所以定义一个

          public static final String labelText= "hello world";
          

          或者,更糟糕的是,从资源包中初始化它是毫无意义的。

          进一步阅读:

          A method for handling I18N in Java

          【讨论】:

          • 链接已损坏 (404)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-31
          • 1970-01-01
          相关资源
          最近更新 更多