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']: ''
以上是我 运行 给定代码片段时的默认输出。
我试图了解究竟是什么影响了这个变量,所以我做了接下来的步骤:
我更改了 Chrome 的语言环境
设置 --> 显示高级设置 --> 语言和输入设置)
我更改了操作系统的区域设置 (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
默认情况下,用户区域设置是从传入的 Accept-Language HTTP header 中检测到的,此 header 是由用户使用的浏览器生成的。
每个浏览器以不同方式确定系统区域设置:
Internet Explorer 使用 O/S 区域设置。
Firefox / Chrome 让用户决定要使用的语言环境(在语言设置中)。
参见:http://www.w3.org/International/questions/qa-lang-priorities.en.php
我遇到了一个奇怪的问题,或者我没能理解 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']: ''
以上是我 运行 给定代码片段时的默认输出。
我试图了解究竟是什么影响了这个变量,所以我做了接下来的步骤:
我更改了 Chrome 的语言环境
设置 --> 显示高级设置 --> 语言和输入设置)
我更改了操作系统的区域设置 (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
默认情况下,用户区域设置是从传入的 Accept-Language HTTP header 中检测到的,此 header 是由用户使用的浏览器生成的。 每个浏览器以不同方式确定系统区域设置:
Internet Explorer 使用 O/S 区域设置。
Firefox / Chrome 让用户决定要使用的语言环境(在语言设置中)。
参见:http://www.w3.org/International/questions/qa-lang-priorities.en.php