2011-11-16 6 views
2

J'essaie de mettre en œuvre des fonctionnalités i18n dans mon application Grails, mais pas seulement pour les messages (menus, étiquettes, etc ...). J'essaye de le faire pour les champs de texte réels de mes classes de domaine.Quelles sont les bonnes pratiques pour CONTENT i18n en grails

Jusqu'à présent, ma solution consiste à créer une classe de domaine comme celui-ci:

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

Ensuite, par exemple, j'aurais cette classe de domaine avec un seul champ traduisible:

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

Ensuite, Sur mon contrôleur, je vérifie le paramètre lang et sélectionne une traduction si elle existe, ou la langue par défaut si aucune traduction n'est disponible pour les paramètres régionaux donnés. par exemple. :

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

Désolé s'il y a des erreurs, mais cela me est le codage des idées sur la tête dans un formulaire web :-)

Je crois qu'il ya des solutions beaucoup plus propres là-bas, donc je voulais juste vous commencez-moi sur ce sujet complexe.

Merci!

Répondre

2

Vous devriez jetez un oeil au plugin "i18n Fields".

+0

Incroyable! Merci ! – Philippe

+0

Est-ce que ça marche avec les grails 3? – user666

+0

Je crains de ne pas connaître la réponse à cette question, c'était en 2011 et probablement dans Grails 1.x. – wwwclaes

2

Nous avons eu le même problème et a fini avec le fond de la même mise en œuvre:

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

Les méthodes putat et getAt vous permet de traiter l'objet comme une carte:

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

Merci Marijn. Je vais laisser la question sans réponse pour le moment au cas où quelqu'un aurait d'autres idées. – Philippe

0

C'est la solution que je

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 
    } 

} 
Questions connexes