grails中的内容i18n有哪些好的实践

grails中的内容i18n有哪些好的实践,grails,internationalization,Grails,Internationalization,我试图在我的grails应用程序中实现i18n功能,但不仅仅是针对消息(菜单、标签等)。我正在尝试为我的域类的实际文本字段执行此操作 到目前为止,我的解决方案包括创建如下域类: class LocalizedText { String text Locale locale static hasMany=[translations : LocalizedText] String getTranslation(String locale) { def

我试图在我的grails应用程序中实现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参数并选择一个翻译(如果它存在),或者选择默认语言(如果给定区域设置没有翻译可用)。 e、 g:

类新闻控制器{
定义列表={
def newsconts=[]
News.list()。每个{

newsContents我们遇到了同样的问题,最终得到了基本相同的实现:

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()]
    }
}

您应该看看“i18n字段”插件。

这就是我使用的解决方案

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
    }

}

谢谢Marijn。我暂时不回答这个问题,以防有人有其他想法。恐怕我不知道答案,这是2011年,可能是Grails 1.x。
Translatable translatable = new Translatable()
translatable[Locale.ENGLISH] = "TexT"
prinlnt translatable[Locale.ENGLISH]
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
    }

}