【问题标题】:Grails i18n UrlMappingsGrails i18n UrlMappings
【发布时间】:2013-05-03 15:23:43
【问题描述】:

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

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

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

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

提前致谢

【问题讨论】:

    标签: grails internationalization


    【解决方案1】:

    您可以让UrlMapping 根据LocalemessageSource 读取映射名称,并在映射中使用相同名称。比如:

    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=contact

    messages_de.properties

    app.url.mapping.contact=kontakt

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

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

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

    【讨论】:

    • 不,我不这么认为,因为我们正在阅读来自messageSource 的内容,并且没有参与任何transactional 活动(或database 行程)。但是您可以很好地在功能测试中进行相同的负载测试。请随时提供您的反馈、赞成/反对票、接受/拒绝适合/不适合您的方案的答案。
    【解决方案2】:

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

    你可以这样做:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      最后在视图中你可以这样使用映射属性:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-11
        • 1970-01-01
        相关资源
        最近更新 更多