Lokalisierung von berechneten Daten

CER unterstützt die konventionelle Java-Klasse String.

Elemente der Klasse "String" (also Zeichenfolgen) können in den Anfangsstadien bei der Entwicklung eines Regelwerks hilfreich sein. Falls Ihre Regeln jedoch Ausgabe enthalten, die für Benutzer in verschiedenen Ländereinstellungen angezeigt werden muss, müssen Sie unter Umständen die CER-Unterstützung für die Lokalisierung verwenden.

Der Zeichenfolgewert "Hello World" im nachfolgenden Beispiel ist für Benutzer, die Englisch als Spracheinstellung verwenden, hervorragend lesbar. Es gibt jedoch auch Benutzer, die eine andere Sprache verwenden.

Abbildung 1. Ausgabe einer Zeichenfolge
<?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 enthält eine Schnittstelle namens curam.creole.value.Message, die während der Laufzeit die Konvertierung eines Werts in eine ländereinstellungsspezifische Zeichenfolge ermöglicht.

Eine Liste der CER-Ausdrücke, die eine Instanz der Schnittstelle curam.creole.value.Message erstellen können, finden Sie im Abschnitt Lokalisierbare Nachrichten.

Das Beispiel HelloWorld wird nun umgeschrieben, damit es lokalisierbar ist:

Abbildung 2. Ausgabe einer lokalisierbaren Nachricht
<?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>
        <!-- Use Message, not String -->
        <javaclass name="curam.creole.value.Message"/>
      </type>
      <derivation>
        <!-- Look up the value from a localizable
             property, instead of hard-coding a
             single-language String -->
        <ResourceMessage key="greeting"
          resourceBundle="curam.creole.example.HelloWorld"/>
      </derivation>
    </Attribute>

  </Class>

</RuleSet>
Abbildung 3. Lokalisierung von "Hello, world!" - Englisch
# file curam/creole/example/HelloWorld_en.properties

greeting=Hello, world!
Abbildung 4. Lokalisierung von "Hello, world!" - Französisch
# file curam/creole/example/HelloWorld_fr.properties

greeting=Bonjour, monde!

Diese Nachricht verhält sich während der Laufzeit nun folgendermaßen: Jeder Code, der mit Ihrem Regelwerk interagiert, muss die Methode toLocale für alle Nachrichten aufrufen, um diese in die erforderliche Ländereinstellung zu konvertieren.

Abbildung 5. Interaktion mit lokalisiertem Regelwerk
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 {

  /**
   * Runs the class as a stand-alone Java application.
   */
  public static void main(final String[] args) {

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

  }

  /**
   * A simple test case, displaying output localized into different
   * 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);

    // returns a Message, not a String
    final Message greeting = helloWorld.greeting().getValue();

    // to decode the message, we need to use the user's locale
    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);
  }

}

Falls die folgenden Datentypen in einer lokalisierbaren Nachricht eingesetzt werden, werden sie während der Laufzeit so formatiert, dass sie für die Ländereinstellung verwendet werden können:

Alle anderen Objekte werden mittels ihrer eigenen Methode toString angezeigt.