0

嗨,我有语言映射问题。我希望它工作的方式是语言编码在像 /appname/de/mycontroller/whatever 这样的 url

如果您转到 /appname/mycontroller/action 它应该检查您的会话,如果没有会话,则根据浏览器偏好选择语言并重定向到语言前缀站点。如果您有会话,那么它将显示英文。英语没有 en 前缀(使其更难)。

所以我创建了这样的映射:

class UrlMappings {
    static mappings = {
        "/$lang/$controller/$action?/$id?"{
            constraints {
                lang(matches:/pl|en/)
            }
        }
        "/$lang/store/$category" {
            controller = "storeItem"
            action = "index"
            constraints {
                lang(matches:/pl|en/)
            }
        }
        "/$lang/store" {
            controller = "storeItem"
            action = "index"
            constraints {
                lang(matches:/pl|en/)
            }
        }


        "/$controller/$action?/$id?"{
            lang="en"
            constraints {
            }
        }
        "/store/$category" {
            lang="en"
            controller = "storeItem"
            action = "index"
        }
        "/store" {
            lang="en"
            controller = "storeItem"
            action = "index"
        }


      "/"(view:"/index")
      "500"(view:'/error')
    }
}

它没有完全工作,语言现在只是硬编码。我想我做错了什么。一些反向映射有效,但有些不添加语言。

如果我使用链接标签并传递 params:[lang:'pl'] 那么它可以工作,但如果我添加 params:[lang:'pl', page:2] 那么它不会。在第二种情况下,语言和页码都成为查询字符串中的参数。更糟糕的是,它们不会影响语言环境,因此页面以英文显示。

任何人都可以请我指出文档反向映射的规则是什么,或者更好地如何以一种好的方式实现这种语言前缀?

谢谢

4

2 回答 2

3

您必须处理的最大问题是英语没有前缀。您的大部分映射似乎完全没问题。我建议您使用命名映射。

但首先我建议您使用过滤器为每个用户设置语言参数。

def filters = {
    languageCheck(controller: '*', action: '*') {
        before = {
            if( params.lang == null) {
                redirect( controller: params.controller, action: params.action, params:[ "lang": request.locale.language.toString() ] + params )
            }
        }
    }
}

如果缺少语言参数的用户进入您的站点,则语言由过滤器设置,他将被重定向到带有语言参数的控制器。如果您使用的安全框架也在重定向,请小心。您只能重定向一次。在这种情况下,您必须从过滤器中排除这些 url 或控制器。

现在我们将看看您的映射问题。从 Grails 1.2 开始,就有了所谓的命名 URL 映射。例如

name storeCategory: "/$lang/store/$category" {
        controller = "storeItem"
        action = "index"
        constraints {
            lang(matches:/pl|en/)
        }
    }

在您的 GSP 中,您可以使用

<g:link mapping="storeCategory" params="[lang:'en', category:'new']">Category</g:link>

这应该可以解决您的问题。您可以在Grails 参考中找到有关命名映射的所有信息

于 2010-06-22T19:53:37.760 回答
0

我想补充一点:如果你有额外的参数应该使用 ?param=value 附加,如果你没有明确地将它们添加到你的 URL 映射中,你将会遇到麻烦。这是因为 URL 映射解析器将控制器和操作参数视为具有特殊含义的参数,并且只会匹配具有完全相同的参数集以生成链接的映射。

但是,当您使用分页时,您会遇到麻烦。

因此,除了上述之外,请执行以下操作:

class LangAwareUrlMappingsHolderFactoryBean extends UrlMappingsHolderFactoryBean {

    @Override
    public UrlMappingsHolder getObject() throws Exception {
        def obj = super.object
        obj.DEFAULT_CONTROLLER_PARAMS = [UrlMapping.CONTROLLER, UrlMapping.ACTION,     "lang"] as Set
        obj
    }   
}

并调整resources.groovy

"org.grails.internal.URL_MAPPINGS_HOLDER"(LangAwareUrlMappingsHolderFactoryBean) { bean ->
    bean.lazyInit = true
}

你会得到

/en/controller/action?offset=10

代替

/controller/action?offset=10&lang=en
于 2013-05-08T16:23:32.080 回答