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
descriptiondel 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.