Localisation des données calculées

CER prend en charge la classe Java ordinaire String.

Les chaînes peuvent être utiles dans les phases initiales de développement de votre jeu de règles ; cependant, si vos règles contiennent une sortie qui doit s'afficher pour les utilisateurs dans différents environnements locaux, vous pouvez avoir besoin de recourir à la prise en charge de la localisation proposée par CER.

La valeur de chaîne "Hello World" correspondant à l'exemple ci-dessous convient aux utilisateurs finaux qui comprennent l'anglais ; mais qu'en est-il pour ceux qui ne le comprennent pas ?

Figure 1. Sortie d'une chaîne
<?xml version="1.0" encoding="UTF-8"?>
<RuleSet name="HelloWorldRuleSet"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation=
"http://www.curamsoftware.com/CreoleRulesSchema.xsd">
  <Class name="HelloWorld">

    <Attribute name="greeting">
      <type>
        <javaclass name="String"/>
      </type>
      <derivation>
        <String value="Hello, world!"/>
      </derivation>
    </Attribute>

  </Class>

</RuleSet>

CER inclut une interface curam.creole.value.Message qui permet la conversion d'une valeur vers une chaîne spécifique à un environnement local lors de l'exécution.

Pour obtenir une liste des expressions CER capables de créer une instance de curam.creole.value.Message, voir Messages localisables.

Maintenant, nous allons réécrire l'exemple HelloWorld afin de le rendre localisable :

Figure 2. Sortie d'un message localisable
<?xml version="1.0" encoding="UTF-8"?>
<RuleSet name="LocalizableHelloWorldRuleSet"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation=
"http://www.curamsoftware.com/CreoleRulesSchema.xsd">
  <Class name="HelloWorld">

    <Attribute name="greeting">
      <type>
        <!-- Utiliser un message, non une chaîne -->
        <javaclass name="curam.creole.value.Message"/>
      </type>
      <derivation>
        <!-- Rechercher une valeur à partir d'une propriété
             localisable, au lieu de coder en dur une
             chaîne en langue unique -->
        <ResourceMessage key="greeting"
          resourceBundle="curam.creole.example.HelloWorld"/>
      </derivation>
    </Attribute>

  </Class>

</RuleSet>
Figure 3. Localisation de "Hello, world!" - anglais
# file curam/creole/example/HelloWorld_en.properties

greeting=Hello, world!
Figure 4. Localisation de "Hello, world!" - français
# file curam/creole/example/HelloWorld_fr.properties

greeting=Bonjour, monde!

Comment ce message va-t-il se comporter lors de l'exécution ? Un code qui interagit avec votre jeu de règles doit appeler la méthode toLocale sur tous types de messages, pour les convertir dans l'environnement local requis.

Figure 5. Interaction avec le jeu de règles localisé
package curam.creole.example;

import java.util.Locale;

import junit.framework.TestCase;
import curam.creole.execution.session.RecalculationsProhibited;
import curam.creole.execution.session.Session;
import curam.creole.execution.session.Session_Factory;
import
 curam.creole.execution.session.StronglyTypedRuleObjectFactory;
import
 curam.creole.ruleclass.LocalizableHelloWorldRuleSet.impl.HelloWorld;
import
 curam.creole.ruleclass.LocalizableHelloWorldRuleSet.impl.HelloWorld_Factory;
import curam.creole.storage.inmemory.InMemoryDataStorage;
import curam.creole.value.Message;

public class TestLocalizableHelloWorld extends TestCase {

  /**
   * Exécute la classe en tant qu'application Java autonome.
   */
  public static void main(final String[] args) {

    final TestLocalizableHelloWorld testLocalizableHelloWorld =
        new TestLocalizableHelloWorld();
    testLocalizableHelloWorld.testLocalizedRuleOutput();

  }

  /**
   * Scénario de test simple, affichant la sortie localisée dans différents environnements
   * locaux.
   */
  public void testLocalizedRuleOutput() {

    final Session session =
        Session_Factory.getFactory().newInstance(
            new RecalculationsProhibited(),
            new InMemoryDataStorage(
                new StronglyTypedRuleObjectFactory()));

    final HelloWorld helloWorld =
        HelloWorld_Factory.getFactory().newInstance(session);

    // renvoie un message, non une chaîne
    final Message greeting = helloWorld.greeting().getValue();

    // pour décoder le message, nous devons utiliser l'environnement local de l'utilisateur
    final String greetingEnglish =
        greeting.toLocale(Locale.ENGLISH);
    final String greetingFrench = greeting.toLocale(Locale.FRENCH);

    System.out.println(greetingEnglish);
    System.out.println(greetingFrench);

    assertEquals("Hello, world!", greetingEnglish);
    assertEquals("Bonjour, monde!", greetingFrench);
  }

}

S'ils sont utilisés dans un message localisable, les types de données suivants sont mis en forme lors de l'exécution en tenant compte de l'environnement local :

Tous les autres objets s'affichent à l'aide de leur méthode toString.