什么是内容中的内容i18n的良好实践

时间:2011-11-16 10:53:02

标签: grails internationalization

我正在尝试在我的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参数并选择翻译(如果存在),或者如果没有可用于给定语言环境的翻译,则选择默认语言。 例如:

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

很抱歉,如果有错误,但这是我在网络表单中编写的想法: - )

我相信那里有更清洁的解决方案,所以我只是想让你开始讨论这个复杂的主题。

谢谢!

3 个答案:

答案 0 :(得分: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]

答案 1 :(得分:2)

你应该看看“i18n Fields”插件。

答案 2 :(得分: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
    }

}