2011-11-16 18 views
2

我想在我的grails應用程序中實現i18n功能,但不僅僅是消息(菜單,標籤等)。我正在嘗試爲我的域類的實際文本字段做到這一點。Grails中的CONTENT i18n有什麼好的做法

到目前爲止,我的解決方案包括創建一個域類是這樣的:

class LocalizedText { 
    String text 
    Locale locale 
    static hasMany=[translations : LocalizedText] 

    String getTranslation(String locale) { 
     def translation = this.translations.find(locale:locale) 
     if (translation != null) { 
      return translation 
     } else { 
      return this 
     } 
    } 
} 

然後,例如我會有這個領域類有一個翻譯領域:

class News { 
    LocalizedText contents 
    // [...] 
} 

然後,在我的控制器上,我檢查lang參數並選擇一個翻譯(如果存在),或者如果沒有翻譯可用於給定語言環境,則選擇默認語言。 例如:

class NewsController { 
    def list = { 
     def newsContents = [] 
     News.list().each { 
      newsContents << [contents : it.contents.getTranslation(params.lang)] 
     } 
     [news : newsContents] 
    } 
} 

很抱歉,如果有錯誤,但是這是我的想法編碼從我的頭在Web表單:-)

我相信有更簡潔的解決方案在那裏,所以我只是想讓你讓我開始了這個複雜的話題。

謝謝!

回答

2

你應該看看「i18n Fields」插件。

+0

令人驚歎!謝謝 ! – Philippe

+0

它與Grails 3兼容嗎? – user666

+0

恐怕我不知道答案,這是2011年,可能在Grails 1.x. – wwwclaes

2

我們有同樣的問題,並結束了與基本相同的實現:

class Translatable { 

    Map<String, String> values = [:] 

    static mapping = { 
     columns { 
      values column: 'val' 
     } 
     values type: 'text', lazy: false 
    } 

    def putAt(key, value) { 
     values[key.toString()] = value.toString() 
     return value 
    } 

    def getAt(key) { 
     return values[key.toString()] 
    } 
} 

的putAt和getAt方法可以讓你把對象作爲地圖:

Translatable translatable = new Translatable() 
translatable[Locale.ENGLISH] = "TexT" 
prinlnt translatable[Locale.ENGLISH] 
+0

由於Marijn該溶液中。爲了防止有人有其他想法,我現在不會回答這個問題。 – Philippe

0

這是我用

import org.springframework.context.i18n.LocaleContextHolder 

/** 
* ML = Multi Language 
* */ 
class MLString { 

    String english 
    String spanish 

    boolean hasLanguage(String language){ 
     switch (language){ 
      case 'en': 
       return english?.trim() 
      case 'es': 
       return spanish?.trim() 
      default: 
       return false 
     } 
    } 

    String getLanguage(String language){ 
     switch (language){ 
      case 'en': 
       return english 
      case 'es': 
       return spanish 
      default: 
       return '' 
     } 
    } 

    String toString() { 
     String language = LocaleContextHolder.getLocale().getLanguage() 
     if (hasLanguage(language)){ 
      return getLanguage(language) 
     } else { 
      return getLanguage('en') 
     } 
    } 

    static constraints = { 
     english nullable: true 
     spanish nullable: true 
    } 

} 
相關問題