【问题标题】:Ubuntu/Spring 3 - Strange issue with localeUbuntu/Spring 3 - 语言环境的奇怪问题
【发布时间】:2010-10-07 07:58:02
【问题描述】:

我在使用 Ubuntu 10.04.1 LTS x86_64 时遇到了一个奇怪的问题,当系统区域设置为 en_US 时,一切似乎都运行良好。但是,当系统区域设置为 en_GB 时,Spring 会尝试将默认资源包查找为 en_us 而不是 en_US。

例外:

06-Oct-2010 23:35:12 org.springframework.context.support.ResourceBundleMessageSource getResourceBundle
WARNING: ResourceBundle [messages] not found for MessageSource: Can't find bundle for base name messages, locale en_us

系统区域设置:

taylor@taylor-laptop:~$ locale
LANG=en_GB.utf8
LC_CTYPE="en_GB.utf8"
LC_NUMERIC="en_GB.utf8"
LC_TIME="en_GB.utf8"
LC_COLLATE="en_GB.utf8"
LC_MONETARY="en_GB.utf8"
LC_MESSAGES="en_GB.utf8"
LC_PAPER="en_GB.utf8"
LC_NAME="en_GB.utf8"
LC_ADDRESS="en_GB.utf8"
LC_TELEPHONE="en_GB.utf8"
LC_MEASUREMENT="en_GB.utf8"
LC_IDENTIFICATION="en_GB.utf8"
LC_ALL=
taylor@taylor-laptop:~$

默认的 Spring 语言环境设置如下:

<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
    <property name="cookieName" value="USER_LOCALE" />
    <property name="cookieMaxAge" value="1209600" />
    <property name="defaultLocale" value="en_US" />
</bean>

【问题讨论】:

  • 不知道这是否有帮助,但我相信语言环境字符串的格式应该是“en_GB.UTF-8”而不是“en_GB.utf8”。
  • @schot - 在 /etc/default/locale 中设置为 LANG="en_GB.UTF-8"。
  • 你的消息解析器 bean 是什么样的?你有什么“消息”文件?
  • @matt - 这里有 Spring 配置文件 (github.com/tleese22/google-app-engine-jappstart/tree/master/src/…) -- 查看 dispatcher-servlet.xml 和 applicationContext-service.xml。
  • 我查看了您的资源,并在 maven-gae-plugin 的配置中添加了 &lt;jvmFlag&gt;-Duser.country=GB&lt;/jvmFlag&gt;。我还在 index.jsp 中添加了一些调试文本以打印出默认的 java.util.Locale 对象(显示 en_GB)——恐怕我没有从 Spring 中得到任何与 ResourceBundle 相关的错误。

标签: java linux spring ubuntu internationalization


【解决方案1】:

我已经在 Ubuntu 虚拟机上查看了您上面的 github 链接中的代码,即使我的语言环境已更改为与您的匹配:

matt@ubuntu-vm:~/google-app-engine-jappstart$ locale
LANG=en_GB.utf8
LANGUAGE=en_GB:en
LC_CTYPE="en_GB.utf8"
LC_NUMERIC="en_GB.utf8"
LC_TIME="en_GB.utf8"
LC_COLLATE="en_GB.utf8"
LC_MONETARY="en_GB.utf8"
LC_MESSAGES="en_GB.utf8"
LC_PAPER="en_GB.utf8"
LC_NAME="en_GB.utf8"
LC_ADDRESS="en_GB.utf8"
LC_TELEPHONE="en_GB.utf8"
LC_MEASUREMENT="en_GB.utf8"
LC_IDENTIFICATION="en_GB.utf8"
LC_ALL=

当我运行mvn gae:run 时,我可以很好地打开你的webapp 的索引页面。我什至验证过,如果我从 index.jsp 中打印出 java.util.Locale.getDefault() 的值,则该值为 en_GB

您确定没有其他设置会导致此问题吗?我是否试图错误地重现它?

【讨论】:

  • @matt - 感谢您的回复。实际上,在您创建帐户并尝试发送激活电子邮件之前,您不会看到错误。这是 Google 代码问题的链接:code.google.com/p/jappstart/issues/detail?id=3
  • 我得到一个不同的错误:org.springframework.context.NoSuchMessageException: No message found under code 'mail.subject' for locale 'en_us'.。我建议为 MessageSource 创建一个默认的 messages.properties 以回退到无法解析当前语言环境时 - 如果我将您的 messages_en_US.properties 复制到 messages.properties 并创建一个帐户,则不会生成错误。无论如何,为用户可能拥有(或选择)您没有翻译字符串的任何语言环境提供默认 ResourceBundle 是一个好主意。
  • 我认为错误在于您的 MailTask​​ 方法接受 @RequestParam String locale 作为参数。我不确定这个值是从哪里来的——我没有看到它在 JSP 上传递了它。如果您查看the Spring docs,您的处理程序可以接受Locale 对象作为参数,Spring 将自动使用您的 LocaleResolver 来查找要使用的正确 Locale - 或者您的 MailService 应该查找 Locale 而不是传入它
  • @matt - 这不是问题所在。看看 RegisterController (github.com/tleese22/google-app-engine-jappstart/blob/master/src/…) 和 UserDetailsS​​erviceImple (github.com/tleese22/google-app-engine-jappstart/blob/master/src/…)。我通过“localeResolver.resolveLocale(request)”获取语言环境,然后将其传递给邮件任务。它接收语言环境很好,只是在 en_GB 系统语言环境下它寻找 en_us.properties 而不是 en_US.properties。
  • 我认为真正的错误是 Spring 正在尝试解决 en_us.properties 而不是 en_US.properties 应该的。它在非 Ubuntu 环境中解析为 en_US.properties。我不应该创建 messages.properties,因为 en_US 被设置为 localeResolver 中的默认语言环境。
猜你喜欢
  • 2019-12-28
  • 2023-03-27
  • 1970-01-01
  • 2020-06-10
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多