2

gettext -tutorial指出

创建 I18n 对象的最佳方法是通过 I18nFactory。工厂使用提供的类对象的包名在内部缓存 I18n 对象,并将其注册到 I18nManager。因此,同一个包的所有类都将使用同一个 I18n 实例。

但是在 HttpServlet(在我的特定情况下实际上是 VelocityViewServlet)中运行,在我看来,如果我更改缓存对象上的语言环境,对于后续请求,它可能会保持这种状态,这是不可取的,因为每个请求都必须使用特定的语言环境提供服务.

所以问题是,我是否应该在每个请求的基础上使用该请求的特定语言环境创建临时 i18n 对象?我认为这会降低性能,所以我应该创建自己的管理器并根据请求的语言环境选择适当的实例吗?

任何评论都非常感谢。除了教程和 Javadoc 之外,似乎没有太多文档或示例。

更新:我尝试过一件事并且似乎有效。我没有像教程所说的那样声明一个私有静态成员,而是使用这个特殊版本的 I18nFactory 对每个请求调用工厂方法:

getI18n(java.lang.Class clazz, java.lang.String bundleName, java.util.Locale locale)

这应该获得该特定语言环境的缓存实例(或强制在该语言环境的第一个请求上加载),避免对同一语言环境的后续请求的性能损失。如果有人可以确认这是有道理的:

public class Foo extends VelocityViewServlet {
  @Override
  public void doGet(HttpServletRequest request, HttpServletResponse response) {
    Locale reqLocale = request.getLocale();
    I18n i18n = I18nFactory.getI18n(Foo.class, "app.i18n.Messages", reqLocale);
    String localized = i18n.tr("Bar"); 
    ...
  }
...
}

同样,我已经对此进行了测试并且它正在工作,但我想知道它是否是此类应用程序的 gettext-commons 的正确实现。

提前致谢,

——亚历杭德罗·伊马斯

4

0 回答 0