Каковы хорошие практики для CONTENT i18n в Grails - PullRequest
2 голосов
/ 16 ноября 2011

Я пытаюсь реализовать функции i18n в своем приложении grails, но не только для сообщений (меню, метки и т. Д.). Я пытаюсь сделать это для фактических текстовых полей классов моего домена.

Пока что мое решение состоит в создании класса домена, подобного этому:

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 ]

2 голосов
/ 18 ноября 2011

Вы должны взглянуть на плагин "i18n Fields".

2 голосов
/ 16 ноября 2011

У нас была та же проблема, и мы получили практически одинаковую реализацию:

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 голосов
/ 29 сентября 2017

Это решение, которое я использовал

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
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...