Grails i18n URL映射

Grails i18n URL映射,grails,internationalization,Grails,Internationalization,我正在处理以下问题。在我们的项目中,我们为同一个网站推出了不同的国际化域名。 问题来自不同语言的UrlMappings。 例如: 联系人姓名:“/contact”(控制器:'static',操作:'index'){id='/contact'} 德语:名称deContact:“/kontakt”(控制器:'static',操作:'index'){id='/contact'} 一次又一次地重复所有代码。是否有一种解决方案可以将两个url映射分组以使用相同的控制器、操作和逻辑 例如,拥有类似的东西

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

  • 联系人姓名:“/contact”(控制器:'static',操作:'index'){id='/contact'}
  • 德语:名称deContact:“/kontakt”(控制器:'static',操作:'index'){id='/contact'}
一次又一次地重复所有代码。是否有一种解决方案可以将两个url映射分组以使用相同的控制器、操作和逻辑

例如,拥有类似的东西会很好: 姓名联系人:“[/contact |/kontakt/etc..”(控制器:'static',操作:'index'){id='/contact'} 提供调用相同代码的可选URL


提前感谢

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

你可以这样做:

['contact', 'kontact'].each{
    "/${it}"( view: "/blah")
}
这确实创建了您要求的路线。这个示例非常简单,但是您可以潜在地连接到i18n消息包之类的东西来执行以下操作

getKeysFor( 'contact' ).each{
    ... your mapping here
}
感觉这是您的控制器应该处理的事情,因为i18n支持可能比url映射级别更好


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

您可以让
UrlMapping
messageSource
中按照
Locale
读取映射名称,并在映射中使用相同的名称。比如:

['contact', 'kontact'].each{
    "/${it}"( view: "/blah")
}
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' }
        }
    }
消息.属性

app.url.mapping.contact = enContact
app.url.mapping.contact = esContact
app.url.mapping.contact=contact

消息属性

app.url.mapping.contact = enContact
app.url.mapping.contact = esContact
app.url.mapping.contact=kontakt

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

注意: 您可以通过在
参考资料.groovy
中设置为default
Locale
to GERMANY来进行相同的测试

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

我会建议一个类似的解决方案,但至少对我来说是一个更简单的方案。基本上,我们的想法是在messages.properties中使用映射名称

消息.属性

app.url.mapping.contact = enContact
app.url.mapping.contact = esContact
消息属性

app.url.mapping.contact = enContact
app.url.mapping.contact = esContact
然后我们就可以有这个UrlMappings配置了

static mappings = {
    name enContact: "/contact"(view:"/static/contact")
    name esContact: "/contacto"(view:"/static/contact")
}
最后,在视图中,可以通过以下方式使用映射属性:

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

不,我不这么认为,因为我们阅读的是
消息源
,没有参与任何
事务性
活动(或
数据库
行程)。但是您可以在功能测试中很好地加载相同的测试。如果答案适合/不适合您的情景,请随时提供您的反馈、上/下投票、接受/拒绝答案。