2013-05-03 67 views
2

我正在處理以下問題。在我們的項目中,我們爲同一個網站推出了不同的國際化域名。 對於不同的語言,UrlMappings帶有問題。 例如:Grails i18n UrlMappings

  • 英文:名稱接觸: 「/接觸」(控制器: '靜止',動作: '索引'){ID = '/' 接觸}
  • 德語:名稱deContact:「/ kontakt「(控制器:'靜態',動作:'索引'){id ='/ contact'}

重複所有的代碼。有沒有解決方案將兩個url映射分組以使用相同的控制器,動作和邏輯?

例如它會很高興有類似這樣的內容: name contact:「[/contact|/kontakt/etc..]"(controller:'static',action:'index'){id = '/ contact'} 給予調用相同代碼的可選URL。

在此先感謝

回答

1

的urlMapping中塊是DSL,但你可以使用Groovy它裏面。

你可以這樣做:

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

這也創造你所要求的路線。這個例子很簡單,但你可能鉤到東西,如國際化消息包做這樣的事情

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

感覺這東西,你的控制器應處理,因爲i18n支持很可能是比在URL映射級別更好。

我很肯定這會破壞你使用命名的URL映射的能力。

3

您可以讓UrlMappingmessageSourceLocale中讀取映射名稱,並在映射中使用相同的名稱。類似:

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) 
    } 
} 
+0

尼斯的感謝,你認爲它會影響性能? – user2047354 2013-05-04 03:53:25

+0

不,我不這麼認爲,因爲我們正在閱讀'messageSource'並且沒有涉及任何'transactional'活動(或''''旅行)。但是你可以很好地在你的功能測試中加載測試。請隨時提供您的反饋,向上/向下投票,接受/拒絕答案,如果它適合/不適合您的情況。 – dmahapatro 2013-05-04 04:08:31

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") 
} 

終於在視圖中,您可以通過這種方式使用映射屬性:

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