We apologize for untranslated text, you can use the Google Translation button to get an automatic translation of the web page in the language of your choice.

Changement de la langue par défaut

Manuel Bossant · on 1/24/19 at 6:30 PM

Si on souhaite passer le site en anglais, suffit-il de modifier les 2 propriétés comme ci-dessous ?

channel.default-lang: en
channel.languages: en

Je pose la question car le commentaire situé juste au dessus de la propriété indique:

# The default language should not be changed. Nevertheless, if it must
# be changed, the store, the types and the workflows must be updated.
10 pts
Olivier Jaquemet · on 1/25/19 at 9:39 AM

Bonjour  @Manuel Bossant ,

Le changement de langue par défaut du site est en effet une action qui ne peut être réalisée par un simple changement de propriété, des actions sur les données sont nécessaires pour garantir une traduction.
(raison pour laquelle nous ne proposons volontairement pas son changement dans l'éditeur de propriété du site) 

Sur un JCMS/JPlatform vierge cela ne posera que très peu de soucis, ainsi le choix de la langue par défaut doit se faire dès le début de la conception du site.

Mais dès qu'il y a des contenus existants, alors le changement de langue est plus délicat.
Pour essayer de résumé la problématique technique, il faut comprendre comment les données multiligues sont stockés dans JPlatform : 

  1. un champ contient la valeur dans la langue principale du site
  2. un autre champ (une map) contient les valeurs dans toutes les autres langues du site

Dans le store.xml, on retrouve ce pseudo contenu :

<type ... 
   champ="{valeur dans la langue principale}" 
   champML="{map des valeurs dans les autres langues}"
   ... 
/>

Et ce mode de stockage est également valable pour les données multilingue en base.

Ainsi, sans opération sur les données, les valeurs multilingues seront inversés pour la langue principale, et manquante pour une autre langue.

Pour le store il y a bien un outil qui permet de faire le changement : 

java com.jalios.jcms.tools.ReleaseTools -i18n "{languecible}" WEB-INF/data/store.xml WEB-INF/data/custom.prop

mais il resterait le problème des données en base.

#1

Ok  @Olivier Jaquemet ! Cela explique pourquoi la catégorie Accueil s'affichait toujours en français même après changement des propriétés.

Par contre, l'utilitaire ne veut pas traduire si je mets 'en' en paramètre:

J'ai bien rechangé les propriétés à leur valeur d'origine.

Il semble que cet utilitaire requiert la librairie Jakarta ORO mais elle n'est plus livrée avec JPlatform 10 (à ajouter dans le chapitre des librairies supprimées JPlatform 10 - Notes de migration ?)

Manuel Bossant · on 1/25/19 at 11:03 AM
#2

@Manuel Bossant j'aurais du préciser que nous n'avons pas validé l'utilisation de cet outil depuis bien longtemps. Il s'agit d'un outil interne que nous utilisions à l'époque ou nous livrions une webapp fr et une webapp en, je le suggèrais plutot comme un dépannage, mais il ne fait pas vraiment parti des outils certifiés. C'était une maladresse de ma part. 

Je vous propose de suivre la méthodologie proposée par  @Jérémy Biron qui est probablement plus à jour.

Gardez en tête que c'est une opération sensible et qu'il faudra être attentif aux résultats.

PS : Jakarta Oro est bien fourni dans JPlatform : WEB-INF/lib/oro-2.0.5.jar

Olivier Jaquemet · on 1/25/19 at 11:12 AM
#3

Désolé pour Jakarta ORA : le nom de la librairie distribuée avec JCMS 9 étant jakarta-oro.jar je n'ai pas vu que son nom avait changé.

Manuel Bossant · on 1/25/19 at 11:22 AM
2 pts
Jérémy Biron · on 1/25/19 at 9:48 AM

Bonjour,

 

Effectivement le changement des propriétés suivantes dans le custom.prop ne suffit pas :

channel.default-lang: en
channel.languages: en

 Je vous propose de mettre en place la procédure suivante :

  1. Ne pas changer la langue par défaut
  2. Copier le code suivant dans une jsp
  3. Adapter le code si besoin
  4. Exécuter la jsp
  5. Puis modifier les propriétés dans le custom.prop
  6. Redémarrer le serveur

 

Code source de changement de langue de FR en EN

 

<%@page import="java.lang.reflect.Method"%>
<%@page import="java.lang.reflect.Field"%>
<%@page import="com.jalios.io.IOUtil"%>
<%@ include file='/jcore/doInitPage.jsp' %>


<% TreeSet<Data> allDataSet = channel.getAllDataSet();
TreeSet<Publication> allPubSet = channel.getAllDataSet(Publication.class);
TreeSet<Category> allCatSet = channel.getAllDataSet(Category.class);
TreeSet<Group> allGroupSet = channel.getAllDataSet(Group.class);
TreeSet<Workspace> allWorkspaceSet = channel.getAllDataSet(Workspace.class);

# TODO - To Remove - Not use
Set<String> langs = new TreeSet<String>();
langs.add("en");
langs.add("fr");

# Liste des langues à interchanger
Set<String> contentLangs = new TreeSet<String>();
contentLangs.add("fr");
contentLangs.add("en");

for (Publication itPub : allPubSet){
   
      
		  HashMap titleML = new HashMap<String, String>();
		  Publication pubClone = (Publication)itPub.getUpdateInstance();
		  pubClone.setMainLanguage("en");
		  pubClone.setTitle(itPub.getTitle("en"));
		  
      for (String itLang : contentLangs){
       String langValue =  itPub.getTitle(itLang, true);       
       titleML.put(itLang,langValue);       
      }
      pubClone.setTitleML(titleML);

      TypeFieldEntry[] tabTypeFieldEntry = channel.getAllTypeFieldEntries(itPub.getClass());
      
      
      if (Util.notEmpty(tabTypeFieldEntry)){
        for (TypeFieldEntry itType : tabTypeFieldEntry){     
          if (itType.isFieldML()){
            
            pubClone.setFieldValue(itType.getName(), itPub.getFieldValue(itType.getName(), "en", true));
            HashMap fieldML = new HashMap<String, String>();
            for (String itLang : contentLangs){
              Object objectLangValue =  itPub.getFieldValue(itType.getName(), itLang, true);
              fieldML.put(itLang,objectLangValue);
             }
            Class[] paramTypes = {HashMap.class};        
            Method m = pubClone.getClass().getMethod("set"+itType.getName().substring(0, 1).toUpperCase().concat(itType.getName().concat("ML").substring(1)),paramTypes);
            m.invoke(pubClone,fieldML);
            
          }
        }
      }
		  ControllerStatus cs = pubClone.checkUpdate(channel.getDefaultAdmin());
		  if (cs.isOK()){
		    pubClone.performUpdate(channel.getDefaultAdmin());
		    out.println("Publication  : ["+ pubClone.getClass()+"]["+ pubClone.getId()+"] perform OK <br/>");
		  }else {
		    out.println("NEW Publication : ["+ pubClone.getClass()+"]["+ pubClone.getId()+"]"+cs.getMessage(channel.getCurrentUserLang())+"<br/>");
		  }
}

for (Category itPub : allCatSet){
  
  
  HashMap titleML = new HashMap<String, String>();
  Category pubClone = (Category)itPub.getUpdateInstance();
  
  pubClone.setName(itPub.getName("en"));
  
  for (String itLang : contentLangs){
   String langValue =  itPub.getName(itLang, true);       
   titleML.put(itLang,langValue);       
  }
  pubClone.setNameML(titleML);

  TypeFieldEntry[] tabTypeFieldEntry = channel.getAllTypeFieldEntries(itPub.getClass());
  
  if (Util.notEmpty(tabTypeFieldEntry)){
    for (TypeFieldEntry itType : tabTypeFieldEntry){     
      if (itType.isFieldML()){
        
        pubClone.setFieldValue(itType.getName(), itPub.getFieldValue(itType.getName(), "en", true));
        HashMap fieldML = new HashMap<String, String>();
        for (String itLang : contentLangs){
          Object objectLangValue =  itPub.getFieldValue(itType.getName(), itLang, true);
          fieldML.put(itLang,objectLangValue);
         }
        Class[] paramTypes = {HashMap.class};        
        Method m = pubClone.getClass().getMethod("set"+itType.getName().substring(0, 1).toUpperCase().concat(itType.getName().concat("ML").substring(1)),paramTypes);
        m.invoke(pubClone,fieldML);
        
      }
    }
  }
  ControllerStatus cs = pubClone.checkUpdate(channel.getDefaultAdmin());
  if (cs.isOK()){
    pubClone.performUpdate(channel.getDefaultAdmin());
    out.println("Publication  : ["+ pubClone.getClass()+"]["+ pubClone.getId()+"] perform OK <br/>");    
  }else {
    out.println("NEW Publication : ["+ pubClone.getClass()+"]["+ pubClone.getId()+"]"+cs.getMessage(channel.getCurrentUserLang())+"<br/>");
  }
}

for (Group itPub : allGroupSet){
  
  
  HashMap titleML = new HashMap<String, String>();
  Group pubClone = (Group)itPub.getUpdateInstance();
  
  pubClone.setName(itPub.getName("en"));
  
  for (String itLang : contentLangs){
   String langValue =  itPub.getName(itLang, true);       
   titleML.put(itLang,langValue);       
  }
  pubClone.setNameML(titleML);

  TypeFieldEntry[] tabTypeFieldEntry = channel.getAllTypeFieldEntries(itPub.getClass());
  
  if (Util.notEmpty(tabTypeFieldEntry)){
    for (TypeFieldEntry itType : tabTypeFieldEntry){     
      if (itType.isFieldML()){
        
        pubClone.setFieldValue(itType.getName(), itPub.getFieldValue(itType.getName(), "en", true));
        HashMap fieldML = new HashMap<String, String>();
        for (String itLang : contentLangs){
          Object objectLangValue =  itPub.getFieldValue(itType.getName(), itLang, true);
          fieldML.put(itLang,objectLangValue);
         }
        Class[] paramTypes = {HashMap.class};        
        Method m = pubClone.getClass().getMethod("set"+itType.getName().substring(0, 1).toUpperCase().concat(itType.getName().concat("ML").substring(1)),paramTypes);
        m.invoke(pubClone,fieldML);
        
      }
    }
  }
  ControllerStatus cs = pubClone.checkUpdate(channel.getDefaultAdmin());
  if (cs.isOK()){
    pubClone.performUpdate(channel.getDefaultAdmin());
    out.println("Publication : ["+ pubClone.getClass()+"]["+ pubClone.getId()+"] perform OK <br/>");    
  }else {
    out.println("NEW Publication : ["+ pubClone.getClass()+"]["+ pubClone.getId()+"]"+cs.getMessage(channel.getCurrentUserLang())+"<br/>");
  }
}

for (Workspace itPub : allWorkspaceSet){
  
  
  HashMap titleML = new HashMap<String, String>();
  Workspace pubClone = (Workspace)itPub.getUpdateInstance();
  
  pubClone.setTitle(itPub.getTitle("en"));
  
  for (String itLang : contentLangs){
   String langValue =  itPub.getTitle(itLang, true);       
   titleML.put(itLang,langValue);       
  }
  pubClone.setTitleML(titleML);

  TypeFieldEntry[] tabTypeFieldEntry = channel.getAllTypeFieldEntries(itPub.getClass());
  
  
  if (Util.notEmpty(tabTypeFieldEntry)){
    for (TypeFieldEntry itType : tabTypeFieldEntry){     
      if (itType.isFieldML()){
        
        pubClone.setFieldValue(itType.getName(), itPub.getFieldValue(itType.getName(), "en", true));
        HashMap fieldML = new HashMap<String, String>();
        for (String itLang : contentLangs){
          Object objectLangValue =  itPub.getFieldValue(itType.getName(), itLang, true);
          fieldML.put(itLang,objectLangValue);
         }
        Class[] paramTypes = {HashMap.class};        
        Method m = pubClone.getClass().getMethod("set"+itType.getName().substring(0, 1).toUpperCase().concat(itType.getName().concat("ML").substring(1)),paramTypes);
        m.invoke(pubClone,fieldML);
        
      }
    }
  }
  ControllerStatus cs = pubClone.checkUpdate(channel.getDefaultAdmin());
  if (cs.isOK()){
    pubClone.performUpdate(channel.getDefaultAdmin());
    out.println("Publication  : ["+ pubClone.getClass()+"]["+ pubClone.getId()+"] perform OK <br/>");
  }else {
    out.println("NEW Publication : ["+ pubClone.getClass()+"]["+ pubClone.getId()+"]"+cs.getMessage(channel.getCurrentUserLang())+"<br/>");
  }
}
%>
#2

De rien. Merci d'avoir déplacé la question dans cet espace. Cela pourra profiter à tout le monde.

Jérémy Biron · on 1/25/19 at 12:24 PM
#3

Merci @Jérémy Biron : serait-il possible de créer un "vrai" article sur cette problématique pour améliorer la visibilité de tout cela, s'il vous plait ?

Pierre MORIN · on 1/25/19 at 12:26 PM
#4
Jérémy Biron · on 1/25/19 at 12:28 PM
3 pts