Sprachen

Data Sources und MonoLingualObject und MultiLingualObject - Teil 2 zur Programmierung von Data Sources

In Fortsetzung des Teils 1 will ich hier die wichtigen Objekte MultiLingualObject (MUL) und MonoLingualObject (MOL) und ihre Methoden erläutern.

Im vorherigen Beitrag wurden diese Objekte mit

            
            Vector targetmonos = new Vector();
            MultiLingualObject multi = new MultiLingualObject();
            MonoLingualObject sourceMono = new MonoLingualObject();

eingeführt. Dies folgt dabei dem in der Architekturdokument beschriebenen Ansatz. Ein MUL verweist auf ein oder mehrere MOLs, die die sprachspezifischen Teile enthalten. Der Kern einer MOL ist dabei die Sprache und das Segment.


Beide befinden sich im Package de.folt.models.datamodel und sind von GeneralLinguisticObject (GOL) abgeleitet. Jedes Objekt besitzt eine eindeutige (Integer), eine eindeutige String ID - stUniqueID sowie linguisticProperties - eine Menge von Attributen.

Ein MUL beinhaltet damit eine Menge von MOLs (als Map) monoLingualObjects.

Ein MOL enthält als wichtigste Erweiterung zum GeneralLinguisticObject noch die beiden Attribute: formattedSegment (das Segment mit den xml (tmx, xliff) Format-Elementen), plainTextSegment (das Segment ohne diese Tags), language (die Sprache des Segments) sowie eine Referenz auf das ggf. vorhandene MUL (parentMultiLingualObject).

Ein MOL wird einfach über
new MonoLingualObject() ohne realen Inhalt
MonoLingualObject(formattedSegment, language) mit einem Segment und Sprache
erzeugt. Es gibt noch mehr Methoden zur Erzeugung, aber das sind die wichtigsten.

Ein MUL wird durch
new MultiLingualObject() ohne realen Inhalt erzeugt.
new MultiLingualObject(linguisticProperties, lingType) erzeugt ein MUL mist zusätzlichen Properties - Attributen, wobei lingType aus der Enumeration

    public enum LinguisticTypes 
    {
        TERM, TMX, XLIFF
    }

stammt. Wie man linguisticProperties erzeugt, wird später dargestellt.

Ein MOL wird mit addMonoLingualObject(MonoLingualObject mono) zum einem MUL hinzugefügt.
addMonoLingualObjectIfNotExist(MonoLingualObject mono) prüft zusätzlich, ob das MOL nicht schon enthalten ist.

Mit den Funktionen

getMonoLingualObjects
getMonoLingualObjectsAsVector
getMonoLingualObjectsAsVector(String language) (nur die MOLs mit dieser Sprache zurückliefern)
getMonoLingualObjectsAsVector(String[] language) (nur die MOLs mit diesen Sprachee zurückliefern)

kann man sich die MOLs einer MUL ermitteln.

removeMonoLingualObject(MonoLingualObject mono) entfernt ein MOL aus der MUL,
removeMonoLingualObjects entfernt alle Obkjkte aus der MUL.

search(MonoLingualObject searchMonoLingualObject, Hashtable searchParameters) sucht in einer MUL, ob das MOL enthalten ist und liefert das passende treffende zurück. Über die searchParameters kann die Suche gesteuert werden. Wen der Key "fuzzy" auf "true" steht, wird eine unschafte Suche auf "segment" durchgeführt. Dazu kann die Unschärfe mit dem Schlüssel "similarity" und einer Zahl als Wert definiert werden. WeitereM öglihckeiten sind: Schlüssel = "regexp" mit dem Wert eines regulären Ausdrucks oder Schlüssel = "wordbased".

Alle Bestandteile von MUL bzw. MOL können mit entsprechenden getter Methoden gelsen werden. Die wichtigsten bei MOLs sind dabei:

    public String getPlainTextSegment()
    public String getFormattedSegment()
    public String getLanguage()
    public MultiLingualObject getParentMultiLingualObject()

Anlalog gibt es dazu entsprechende setter Methoden:

    void setFormattedSegment(String formattedSegment)
    void setLanguage(String language)
    void setParentMultiLingualObject(MultiLingualObject parentMultiLingualObject)
    void setPlainTextSegment(String plainTextSegment)

Sowhl MUL als auch MOL unterstützen die getter Methoden:

    public Integer getId()
    public Long getLastAccessTime()
    public LinguisticTypes getLingType()
    public LinguisticProperties getLinguisticProperties()
    public String getStOwner()

sowie die dazu passenden setter Methoden.

    public void setLastAccessTime(long lastAccessTime)
    public void setLingType(LinguisticTypes lingType)
    public void setLinguisticProperties(LinguisticProperties linguisticProperties)
    public void setStOwner(String stOwner)s()
    public void setStUniqueID(String stUniqueID)

Nun nach diesem etwas trockenem Stoff hier ein Beipiel:

MultiLingualObject multi = new MultiLingualObject();
MonoLingualObject mono = MonoLingualObject("Mein Haus ist hier", "de");
multi.addMonoLingualObject(mono);
mono = MonoLingualObject("Mein Haus ist dort", "de");
multi.addMonoLingualObject(mono);
mono = MonoLingualObject("Mein Garten ist klein", "de");
multi.addMonoLingualObject(mono);
mono = MonoLingualObject("My house is here", "en");
multi.addMonoLingualObject(mono);

Vector germanMonos = getMonoLingualObjectsAsVector("de");
MonoLingualObject searchmono = MonoLingualObject("Mein Haus ist da", "de");
Hashtable props = new Hashtable();
props.put("similarity", "60");
props.put("fuzzy", "true");
Vector searchresult = multi.search(searchmono, props);

Sowohl MULs als auch MOLs unterstützen mit der Methode format() eine formattierte Ausgabe ihrer Inhalt.

Hier eine Beipieldarstellung einer MUL, das mit der
call sqlexportToMol p500test "c:/Program Files/OpenTMS/database/OpenTMSDataSource.config.xml"
exportiert aus der Dat Source p500test wurde. Die Kommandodatei sqlexportToMolbefindet sich übrigens als Beispiel im bat Verzeichnis der Installation. MUL 1 und die dazu gehörenden MOls stammen aus einer TMX Datei. Die Properties der MUL/MOL sind mit de.folt.models.datamodel.sql.SQLTmxProp ausgegeben.


MUL	getId -> 1
	getStUniqueID -> dbc0286a-d391-4d0b-83dc-c29f8538e3d2
	getLastAccessTime -> 1258367542694
	getStOwner -> klemens
		de.folt.models.datamodel.sql.SQLTmxProp {id: 2 type: changeid content: 11d63a436a360_klemens / lang:  o-encoding: null}
		de.folt.models.datamodel.sql.SQLTmxProp {id: 3 type: usagecount content: 0 / lang:  o-encoding: null}
		de.folt.models.datamodel.sql.SQLTmxProp {id: 4 type: datatype content: 112 / lang:  o-encoding: null}
		de.folt.models.datamodel.sql.SQLTmxProp {id: 5 type: creationid content: 11d63a436a360_klemens / lang:  o-encoding: null}
		de.folt.models.datamodel.sql.SQLTmxProp {id: 6 type: entrynumber content: 1 / lang: null o-encoding: null}
MOL	getId -> 7
	getStUniqueID -> 8c1ff7a8-f80b-4765-acd8-f604a7a3eb64
	getLastAccessTime -> 0
	getStOwner -> klemens
	getLingType -> TMX
	FormattedSegment -> Geringe Wartung durch lebensdauergeschmierte Lagerung.
	PlainTextSegment -> Geringe Wartung durch lebensdauergeschmierte Lagerung.
	Language -> de
		de.folt.models.datamodel.sql.SQLTmxProp {id: 8 type: changeid content: 11d63a436a360_klemens / lang:  o-encoding: null}
		de.folt.models.datamodel.sql.SQLTmxProp {id: 9 type: datatype content: 112 / lang:  o-encoding: null}
		de.folt.models.datamodel.sql.SQLTmxProp {id: 10 type: creationid content: 11d63a436a360_klemens.de / lang:  o-encoding: null}
		de.folt.models.datamodel.sql.SQLTmxProp {id: 11 type: usagecount content: 0 / lang:  o-encoding: null}

MOL	getId -> 12
	getStUniqueID -> 43e17d54-97b1-49f1-b54a-9aef07f0f8db
	getLastAccessTime -> 0
	getStOwner -> klemens
	getLingType -> TMX
	FormattedSegment -> Minimum maintenance due to bearings lubricated for life.
	PlainTextSegment -> Minimum maintenance due to bearings lubricated for life.
	Language -> en
		de.folt.models.datamodel.sql.SQLTmxProp {id: 13 type: datatype content: 113 / lang:  o-encoding: null}
		de.folt.models.datamodel.sql.SQLTmxProp {id: 14 type: usagecount content: 0 / lang:  o-encoding: null}
		de.folt.models.datamodel.sql.SQLTmxProp {id: 15 type: changeid content: 11d63a436a360_klemens / lang:  o-encoding: null}
		de.folt.models.datamodel.sql.SQLTmxProp {id: 16 type: creationid content: 11d63a436a360_klemens.en / lang:  o-encoding: null} 
		
MUL	getId -> 1839
	getStUniqueID -> 43727d9c-6232-483f-88b7-9356011f9142
	getLastAccessTime -> 1258367562990
	getStOwner -> klemens
MOL	getId -> 1840
	getStUniqueID -> c32885aa-6d06-4a41-9b39-b8b38c68b299
	getLastAccessTime -> 0
	getStOwner -> klemens
	getLingType -> TERM
	FormattedSegment -> Travel wheel types
	PlainTextSegment -> Travel wheel types
	Language -> en

MOL	getId -> 1841
	getStUniqueID -> 1c510704-7434-4c71-974a-ac00bd1dc5b1
	getLastAccessTime -> 0
	getStOwner -> klemens
	getLingType -> TERM
	FormattedSegment -> Laufradausführungen
	PlainTextSegment -> Laufradausführungen
	Language -> de

 

LinguisticProperties organisieren Attribut-Wertpaare für MULs bzw. MUL. Sie bauen auf LinguisticProperty auf.

Mit mono.addStringLinguisticProperty("OpenTMS", "Folt") oder multi.addStringLinguisticProperty("OpenTMS", "Folt"); wird eine neue LinguisticProperty zu einer MOL bzw. MUL hinzugefügt.

Allgemein kann eine LinguisticProperty mit new LinguisticProperty(key, value) erzeugt werden, wobei sowohl key als auch value von beliebigen Typ sein können. Normalerweise werden es aber String sein. Eine LinguisticPropert enthält vier Werte:

key - der Schlüssel - Name der Property
propStatus - eine Status;eine Wert aus

public enum PropStatus {
        OLD, CHANGED, DELETED, NEW
    }

value - einen Wert
data - einen weiteren Wert (etwa um ein ganzes Objekt aufzunehmen)

Dazu gibt es entsprechende getter und setter Methoden.

Beispiel:

LinguisticProperty prop = new LinguisticProperty("Sprache", "Deutsch");

LinguisticProperties werden mit new LinguisticProperties() erzeugt. Ein neues LinguisticProperty wird mit add(LinguisticProperty lingProp) hinzugefügt.

Im nächsten Beitrag werde ich zeigen, wie man MULs und MOLs Data Source die Fähigkeit "unscharfe Suche" durchzuführen, implementiert.

Dr. Klemens Waldhör klemens.waldhoer @ opentms.de - Heartsome Europe GmbH www.heartsome.de