Grails - computer/browser locale 不影响 i18n 机制

Grails - computer/browser locale doesn't affects i18n mechanism

我遇到了一个奇怪的问题,或者我没能理解 Grails i18n 机制的工作原理。

我在 index.gsp 文件中插入了以下内容:

LocaleContextHolder.locale:              '${org.springframework.context.i18n.LocaleContextHolder.locale}'
java.util.Locale.getDefault():           '${java.util.Locale.getDefault()}'
RequestContextUtils.getLocale(request):  '${org.springframework.web.servlet.support.RequestContextUtils.getLocale(request)}'
session['SessionLocaleResolver.LOCALE']: '${session['org.springframework.web.servlet.i18n.SessionLocaleResolver.LOCALE']}'

此代码片段应打印语言环境,它确实是这样的:

LocaleContextHolder.locale: 'iw'

java.util.Locale.getDefault(): 'en_US'

RequestContextUtils.getLocale(request): 'iw'

session['SessionLocaleResolver.LOCALE']: ''

以上是我 运行 给定代码片段时的默认输出。

我试图了解究竟是什么影响了这个变量,所以我做了接下来的步骤:

  1. 我更改了 Chrome 的语言环境

    设置 --> 显示高级设置 --> 语言和输入设置)

  2. 我更改了操作系统的区域设置 (Windows 7)

    控制面板 --> 区域和语言 --> 格式 + 位置 + 系统区域设置

在这些更改之后,我重新启动了我的计算机并期望语言环境变量的值发生变化,但它们仍然保持不变。

我知道我可以使用 ?lang 参数和一些代码更改语言环境,但我想让 Grails 决定选择哪个语言环境。

究竟是什么影响了这些变量? Grails 如何决定机器的语言环境?

15.2 更改语言环境

默认情况下,从传入的 Accept-Language header 中检测用户区域设置。但是,您可以通过简单地将名为 lang 的参数作为请求参数传递给 Grails 来为用户提供切换语言环境的能力: /book/list?lang=es Grails 将自动切换用户的语言环境并将其存储在 cookie 中,因此后续请求将具有新的 header.

从这里开始: https://grails.github.io/grails-doc/2.4.3/guide/i18n.html

如果您在 tomcat 中部署,您可以在 catalina.sh 脚本中设置语言环境:

if [ -z "$LOGGING_MANAGER" ]; then
JAVA_OPTS="$JAVA_OPTS -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Duser.language=en -Duser.region=US"
else 
JAVA_OPTS="$JAVA_OPTS $LOGGING_MANAGER -Duser.language=en -Duser.region=US"
fi

我认为当您在 URL 中传递 lang 参数时,国际化会起作用。它在文档中提到

By default the user locale is detected from the incoming Accept-Language header. 
However, you can provide users the capability to switch locales by simply passing
       a parameter called lang to Grails as a request parameter:
                /book/list?lang=es

http://grails.github.io/grails-doc/latest/guide/i18n.html

默认情况下,用户区域设置是从传入的 Accept-Language HTTP header 中检测到的,此 header 是由用户使用的浏览器生成的。 每个浏览器以不同方式确定系统区域设置:

  1. Internet Explorer 使用 O/S 区域设置。

  2. Firefox / Chrome 让用户决定要使用的语言环境(在语言设置中)。

参见:http://www.w3.org/International/questions/qa-lang-priorities.en.php