Grails i18n UrlMappings

时间:2013-05-03 15:23:44

标签: grails internationalization

我正在处理以下问题。在我们的项目中,我们为同一网站推出了不同的国际化域名。 问题来自不同语言的UrlMappings。 例如:

  • 英文:name contact:“/ contact”(控制器:'静态',动作:'索引'){id ='/ contact'}
  • 德语:name deContact:“/ kontakt”(控制器:'静态',动作:'索引'){id ='/ contact'}

一次又一次地重复所有代码。是否有解决方案将两个url映射分组以使用相同的控制器,操作和逻辑?

例如,有类似这样的东西会很好: 姓名联系人:“[/ contact = / kontakt / etc ...]”(控制器:'静态',动作:'索引'){id ='/ contact'} 提供调用相同代码的可选URL。

提前致谢

3 个答案:

答案 0 :(得分:3)

您可以让UrlMappingmessageSourceLocale读取映射名称,并在映射中使用相同的名称。类似的东西:

<强> UrlMapping.groovy

    import org.springframework.context.i18n.LocaleContextHolder as LCH
    class UrlMappings {
        static mappings = {
            def i18nContact = getGrailsApplication().getMainContext().getMessage('app.url.mapping.contact', [] as Object[], 'contact', LCH.getLocale())

            "/${i18nContact}"(controller: 'static', action: 'index') { id = '/contact' }
        }
    }

<强> messages.properties

app.url.mapping.contact =接触

<强> messages_de.properties

app.url.mapping.contact = KONTAKT

您只需要在相应的消息来源中继续添加其他locales的条目。

注意: 您可以通过在Locale中设置为默认resources.groovy到德国来测试相同内容

import org.springframework.web.servlet.i18n.FixedLocaleResolver
beans = {
    localeResolver(FixedLocaleResolver, Locale.GERMANY) {
        Locale.setDefault(Locale.GERMANY)
    }
}

答案 1 :(得分:1)

URLMapping块是dsl,但您可以在其中使用Groovy。

您可以执行以下操作:

['contact', 'kontact'].each{
    "/${it}"( view: "/blah")
}

确实会创建您要求的路线。这个例子非常简单,但你可能会像i18n消息包那样挂钩来做类似

的事情。
getKeysFor( 'contact' ).each{
    ... your mapping here
}

感觉这是你的控制器应该处理的东西,因为i18n支持可能比在url映射级别更好。

我很确定这会破坏你使用命名url映射的能力。

答案 2 :(得分:1)

我会建议一个类似的解决方案,但至少对我来说更容易。基本上,我们的想法是在messages.properties

中使用映射名称

<强> messages.properties

app.url.mapping.contact = enContact

<强> messages_es.properties

app.url.mapping.contact = esContact

然后我们可以使用此UrlMappings配置

static mappings = {
    name enContact: "/contact"(view:"/static/contact")
    name esContact: "/contacto"(view:"/static/contact")
}

最后在视图中,您可以通过以下方式使用mapping属性:

<g:link mapping="${g.message(code:'app.url.mapping.contact', default:'enContact')}">
    <g:message code="contact" default="Contact"/>
</g:link>