2

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

  • 英文:姓名联系人:“/contact”(控制器:'static',动作:'index'){ id = '/contact' }
  • 德语:名称 deContact:“/kontakt”(控制器:'static',动作:'index'){ id = '/contact' }

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

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

提前致谢

4

3 回答 3

4

您可以从per中UrlMapping读取映射名称并在映射中使用相同的名称。就像是:messageSourceLocale

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=联系人

messages_de.properties

app.url.mapping.contact=kontakt

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

注意:您可以通过在as 中将 默认设置Locale为 GERMANY 来进行测试resources.groovy

import org.springframework.web.servlet.i18n.FixedLocaleResolver
beans = {
    localeResolver(FixedLocaleResolver, Locale.GERMANY) {
        Locale.setDefault(Locale.GERMANY)
    }
}
于 2013-05-03T19:55:05.580 回答
1

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

您可以执行以下操作:

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

它确实创建了您要求的路由。这个例子非常简单,但你可能会挂钩到 i18n 消息包之类的东西来做类似的事情

getKeysFor( 'contact' ).each{
    ... your mapping here
}

感觉这是您的控制器应该处理的事情,因为那里的 i18n 支持可能比 url 映射级别更好。

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

于 2013-05-03T19:54:55.467 回答
1

我会建议一个类似的解决方案,但至少对我来说是一个更简单的解决方案。基本上这个想法是在 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")
}

最后在视图中,您可以通过这种方式使用映射属性:

<g:link mapping="${g.message(code:'app.url.mapping.contact', default:'enContact')}">
    <g:message code="contact" default="Contact"/>
</g:link>
于 2013-08-06T09:34:52.237 回答