我正在处理以下问题。在我们的项目中,我们为同一网站推出了不同的国际化域名。 问题来自不同语言的UrlMappings。 例如:
一次又一次地重复所有代码。是否有解决方案将两个url映射分组以使用相同的控制器,操作和逻辑?
例如,有类似这样的东西会很好: 姓名联系人:“[/ contact = / kontakt / etc ...]”(控制器:'静态',动作:'索引'){id ='/ contact'} 提供调用相同代码的可选URL。
提前致谢
答案 0 :(得分:3)
您可以让UrlMapping
从messageSource
每Locale
读取映射名称,并在映射中使用相同的名称。类似的东西:
<强> 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>