【问题标题】:Grails - computer/browser locale doesn't affects i18n mechanismGrails - 计算机/浏览器区域设置不影响 i18n 机制
【发布时间】:2015-10-21 08:50:11
【问题描述】:

我遇到了一个奇怪的问题,或者我无法理解 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']}'

这段代码 sn-p 应该打印语言环境,它是这样的:

LocaleContextHolder.locale: 'iw'

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

RequestContextUtils.getLocale(request): 'iw'

会话['SessionLocaleResolver.LOCALE']: ''

以上是我运行给定代码 sn-p 时的默认输出。

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: grails browser internationalization operating-system locale


    【解决方案1】:

    15.2 更改语言环境

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

    从这里: 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
    

    【讨论】:

    • 我知道我可以通过 lang 参数和代码来操作语言环境。但是i18n不应该检测到机器的Locale并选择相关的吗?
    • 可以设置tomcat/jetty服务器的locale
    • 我正在使用 IntelliJ IDEA14,它在 tomcat 上运行。您能解释一下如何更改此设置吗?
    • 哦,您的答案中没有看到!
    • 这个文件在我的项目中到底在哪里?
    【解决方案2】:

    我认为当您在 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

    【讨论】:

      【解决方案3】:

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

      1. Internet Explorer 使用操作系统区域设置。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多