未选择Struts(1)默认语言环境

时间:2012-01-26 15:20:00

标签: struts locale

在我的应用程序中,用户可以选择2种语言环境,EN和IT。如果浏览器使用其他语言,则必须自动选择英语,对吗?

但问题是,例如当用户附带法语浏览器时,他会尝试在那里找到法语,但没有法语区域设置,并且他在页面上没有显示内容。

所以,问题是:选择默认语言环境时,哪个库或进程正在响应?也许我的图书馆已经过时了,或者?

1 个答案:

答案 0 :(得分:0)

  

如果浏览器使用其他语言,则必须自动选择英语,对吗?

这取决于! Struts尝试查找最具体的消息包,然后回退到某些默认值(如默认的JVM语言环境或没有语言后缀的消息包)。 Normally it's something like this

base + "_" + localeLanguage + "_" + localeCountry + "_" + localeVariant
base + "_" + localeLanguage + "_" + localeCountry
base + "_" + localeLanguage
base + "_" + default locale
base
  

...没有法语区域设置,并且他在页面上没有显示任何内容。

这似乎不对;当一个消息密钥无法解决时,你会得到一个例外:“Missing message for key”...“in bundle”...“for locale ...”或者你得到一个对于像struts-config.xml中的<message-resources ... null="false" />这样的配置,像“??? fr.yourKey ???”这样的结果,所以你应该在页面上或至少在页面上看到一些东西日志。

我的建议是激活org.apache.struts.util.PropertyMessageResources的日志并查看它尝试查找的内容。还要检查你的.properties文件,也许你的密钥在默认文件中被解析,它们都是空的。

对于选择要在当前请求中使用的Locale的过程(除了PropertyMessageResources正在对其操作模式执行的操作),在某些时候 Struts请求处理器调用负责返回Locale的org.apache.struts.chain.commands.servlet.SelectLocale

此类尝试在会话中查找缓存的Locale。如果它找不到那个,它会使用请求中的那个。如果它找不到那么它最终默认为JVM Locale。您的语言环境现在已在会话中被选中并缓存。

这是一个Struts类,因此您可以在struts-core JAR中找到它。如果您可以访问所使用的特定版本的Struts源代码,您可以自己查看如何管理Locale;使用Globals.LOCALE_KEY的代码就是您将要追求的目标。