创建I18n对象的最佳方法是通过I18nFactory。工厂使用提供的类对象的包名称在内部缓存I18n对象,并将其注册到I18nManager。因此,同一个包的所有类都将使用相同的I18n实例。
但是在HttpServlet中运行(在我的特定情况下实际上是一个VelocityViewServlet),在我看来,如果我更改缓存对象上的语言环境,它可以保持对后续请求的类似,这是不可取的,因为每个请求都必须提供特定区域设置。
所以问题是,我应该在每个请求的基础上使用该请求的特定区域设置创建ad-hoc 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。
提前致谢,
- 亚历杭德罗·伊马斯