Grails i18n URL映射
我正在处理以下问题。在我们的项目中,我们为同一个网站推出了不同的国际化域名。 问题来自不同语言的UrlMappings。 例如:Grails i18n URL映射,grails,internationalization,Grails,Internationalization,我正在处理以下问题。在我们的项目中,我们为同一个网站推出了不同的国际化域名。 问题来自不同语言的UrlMappings。 例如: 联系人姓名:“/contact”(控制器:'static',操作:'index'){id='/contact'} 德语:名称deContact:“/kontakt”(控制器:'static',操作:'index'){id='/contact'} 一次又一次地重复所有代码。是否有一种解决方案可以将两个url映射分组以使用相同的控制器、操作和逻辑 例如,拥有类似的东西
- 联系人姓名:“/contact”(控制器:'static',操作:'index'){id='/contact'}
- 德语:名称deContact:“/kontakt”(控制器:'static',操作:'index'){id='/contact'}
提前感谢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
中设置为defaultLocale
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>
不,我不这么认为,因为我们阅读的是消息源
,没有参与任何事务性
活动(或数据库
行程)。但是您可以在功能测试中很好地加载相同的测试。如果答案适合/不适合您的情景,请随时提供您的反馈、上/下投票、接受/拒绝答案。