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 la serie Hello World en este ejemplo es correcto para los usuarios que leen inglés, pero ¿qué sucede si no?

<?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:

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

Localización de Hello, world! en inglés.

# file curam/creole/example/HelloWorld_en.properties

greeting=Hello, world!

Localización de Hello, world! en 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.

Este ejemplo muestra la 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:

  • Objetos de regla (utilizando el valor del atributo description del objeto de regla
  • Fechas (utilizando curam.util.type.Date);
  • Elementos de tabla de código y
  • mensajes localizables anidados.

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