Localización de datos calculados

CER soporta la clase Java habitual String.

Las series pueden ser útiles en las fases iniciales del desarrollo del conjunto de reglas; sin embargo, si las reglas contienen salida que debe visualizarse a los usuarios en configuraciones regionales diferentes, es posible que tenga que aprovechar el soporte de localización de CER.

El valor de serie "Hello World" en el ejemplo siguiente es adecuado para los usuarios finales que leen inglés; pero ¿qué sucede si no?

Figura 1. Salida de una serie
<?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 incluye una interfaz curam.creole.value.Message que permite la conversión de un valor en una serie específica de configuración regional en tiempo de ejecución.

Para obtener una lista de expresiones de CER que pueden crear una instancia de curam.creole.value.Message, consulte Mensajes traducibles.

Ahora vamos a reescribir el ejemplo HelloWorld de modo que sea traducible:

Figura 2. Salida de un mensaje traducible
<?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>
        <!-- Utilizar mensaje, no serie -->
        <javaclass name="curam.creole.value.Message"/>
      </type>
      <derivation>
        <!-- Buscar el valor de una propiedad
             traducible, en lugar de grabar en el código fuente
             una serie de un solo idioma -->
        <ResourceMessage key="greeting"
          resourceBundle="curam.creole.example.HelloWorld"/>
      </derivation>
    </Attribute>

  </Class>

</RuleSet>
Figura 3. Localización de "Hello, world!" - Inglés
# file curam/creole/example/HelloWorld_en.properties

greeting=Hello, world!
Figura 4. Localización de "Hello, world!" - Francés
# file curam/creole/example/HelloWorld_fr.properties

greeting=Bonjour, monde!

¿Cómo se comportará este mensaje en el tiempo de ejecución? Cualquier código que interactúa con el conjunto de reglas debe invocar el método toLocale en todos los mensajes, para convertirlos al entorno local necesario.

Figura 5. Interacción con el conjunto de reglas localizado
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 {

  /**
   * Ejecuta la clase como aplicación Java autónoma.
   */
  public static void main(final String[] args) {

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

  }

  /**
   * Un caso de prueba simple, que visualiza salida localizada en diferentes
   * entornos locales.
   */
  public void testLocalizedRuleOutput() {

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

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

    // devuelve un mensaje, no una serie
    final Message greeting = helloWorld.greeting().getValue();

    // para decodificar el mensaje, tenemos que utilizar el entorno local del usuario
    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);
  }

}

Si se utiliza en un mensaje traducible, los tipos de datos siguientes se formatean en el tiempo de ejecución de una forma que tiene en cuenta el entorno local:

Todos los demás objetos se visualizan utilizando su método toString.