Xtranslation
Inhaltsverzeichnis
xtranslation - Übersetzung
Mit dem Kommando xtranslation ruft man das Übersetzungstool auf.
Sprachen
In der ausgelieferten Datenbank sind bereits die Sprachen Englisch und Deutsch angelegt. Sollen weitere Sprachen hinzugefügt werden, so wird der entsprechende Button verwendet.
Auf derselben Seite kann auch die Sprache gesetzt werden, mit der die Texte im BAF-Client angezeigt werden. Damit werden auch die Übersetzungen aktualisiert, wenn zwischenzeitlich Änderungen daran vorgenommen wurden.
Übersetzungen
Unter Alle Worte findet man eine Liste der Worte (und Phrasen), die im System angelegt sind. Im Gegensatz dazu findet man unter Zu übersetzen diejenigen, die nicht oder nicht vollständig übersetzt sind. (Üblicherweise verwendet man Zu übersetzen, um neue Worte zu übersetzen und Alle Worte, um bestehende Übersetzungen zu verbessern.)
Üblicherweise enthalten Worte (z.B. Add_group) keine Leerzeichen, damit im Quelltext die entsprechenden Parameter nicht in Anführungszeichen gesetzt werden müssen. Das Grid Übersetzung enthält eine Zeile pro angelegter Sprache.
In den Anmerkungen kann zum Beispiel dargelegt werden, warum diese und nicht jene Formulierung verwendet wurde. Im Regelfall bleibt das Anmerkungsfeld jedoch leer.
Tabellen
create table translate_language ( translate_language_id varchar(40) not null primary key, name varchar(40) not null unique, sort number(1), datechg date, usrchg char(40), progchg varchar2(40) );
create table translate_word ( translate_word_id varchar(40) not null primary key, word varchar(40) not null unique, datechg date, usrchg char(40), progchg varchar2(40) );
create table translate_translation ( translate_translation_id varchar(40) not null primary key, translate_word_id varchar(40) not null, translate_language_id varchar(40) not null, translation varchar(250), datechg date, usrchg char(40), progchg varchar2(40) );
create table translate_list_item ( translate_list_item_id varchar(40) not null primary key, data_list_item_id varchar(40) not null, translate_language_id varchar(40) not null, value varchar(80), datechg date, usrchg char(40), progchg varchar2(40) );
Die Tabelle translate_list_item dient der Übersetzung der Listeneinträge in den Nachschlagelisten (xlookup).
Code
xtranslation
#frm y=treepage c=xtranslation flt=xtranslation_flt w=400 #btn y=save s=#save se=c #btn y=cancel s=#cancel se=cp #btn y=back s=#treeback se=b #btn y=backback s=#treebackback se=b #btn y=export s=xtranslation_eximport(ex) se=b #btn y=import s=xtranslation_eximport(im) se=b #btn c=$T(Refresh) se=b s=#filter w=100 #filter
Das Kommando xtranslation ist völlig ein Standard-Formular-Kommando.
xtranslation_exec
~ $ICP(0,setlang) #set_language z=$PVAL(lang,1,sel) #page_fill d=$CP(1) ~~
Mit der Prozedur #set_language wird die Sprache des BAF-Clients gesetzt. Anschließend wird die Seite neu aufgerufen. Da das Kommando xtranslation_exec von verschiedenen Seiten aus aufgerufen wird, wird der Parameter d von #page_fill als Parameter des Kommandos übergeben.
xtranslation_eximport
~ $ICP(0,ex) #val_set n=1 z=$FILEDIALOG(save,$T(filter_baf),baf) #sql_exporttables fn=$VAL(1) t=translate_language t2=translate_word t3=translate_translation t4=translate_list_item ~ $ICP(0,im) #val_set n=1 z=$FILEDIALOG(open,$T(filter_baf),baf) #sql_importdefs t=translate_language #sql_importdefs t=translate_word #sql_importdefs t=translate_translation #sql_importdefs t=translate_list_item #sql_importtables fn=$VAL(1) t=translate_language t2=translate_word t3=translate_translation t4=translate_list_item ~~
Beim Ex- und Import werden "geradeaus" die vier beteiligten Tabellen ex- oder importiert.
xtranslation_flt
#tree_clear #tree_add u=root c=$T(Languages) s="#page_fill d=xtranslation_page_languages" #tree_add u=root c=$T(All_words) s="#page_fill d=xtranslation_page_allwords" o=xtranslation_open(allwords) #tree_add u=root c=$T(to_translate) s="#page_fill d=xtranslation_page_to_translate" o=xtranslation_open(to_translate)
Im Baum haben wir erst mal nur die drei Oberpunkte, alles andere wird bei Bedarf geladen.
xtranslation_open
~ $ICP(0,allwords) #sql select * from translate_word order by upper(word) #tree_node u=exp t=translate_word c1=word s="#page_fill d=xtranslation_page_translate" #tree_fillsql ~ #sql select w.translate_word_id, w.word, count(t1.translate_translation_id) #sql from translate_word w #sql inner join translate_language l on 1 = 1 #sql left outer join translate_translation t1 on t1.translate_word_id = w.translate_word_id #sql and t1.translate_language_id = l.translate_language_id #sql group by w.translate_word_id, w.word #sql having count(t1.translate_translation_id) < (select count(*) from translate_language) order by l.csort #tree_node u=exp t=translate_word c1=word s="#page_fill d=xtranslation_page_translate" #tree_fillsql ~~
Mit dem Parameter allwords werden alle Worte in den Baum geladen, andernfalls nur die zu übersetzenden. Die zu übersetzenden Wörter sind definiert als diejenigen, die weniger Übersetzungen haben als Sprachen definiert sind.
xtranslation_page_allwords
#page #prim as=Y #cat as=N sz=360 c=$T(All_words) #btns_seg #btns_btn c=$T(Add_word) w=150 cmd="#grd_add i=grid f_translate_word_id=$GUID() " #grd_seg frc=0 fcc=1 clt=ss n=grid #grd_col f=translate_word_id c1="ID" w=30 y=guid ro=Y #grd_col f=word c1=$T(Word) w=300 l=40 #sql select * from translate_word order by word #grd_data q=sql t=translate_word
Auf der Seite xtranslation_page_allwords werden alle definierten Worte angezeigt. Die Möglichkeit, ein neues Wort hinzuzufügen, ist in der Praxis ziemlich bedeutungslos: Neue Worte werden durch Verwendung in der Funktion $T() hinzugefügt und erscheinen dann automatisch in der Liste der noch zu übersetzenden Worte.
xtranslation_page_languages
#page #prim as=Y #cat as=N sz=360 c=$T(Languages) #btns_seg #btns_btn c=$T(Add_language) w=150 cmd="#grd_add i=lang " #btns_btn c=$T(Set_language) w=150 cmd=xtranslation_exec(setlang,xtranslation_page_languages) #grd_seg frc=0 fcc=1 clt=ss n=lang c="$T(selected): $LANGUAGE()" b=H #grd_col f=translate_language_id c1=ID w=30 y=guid ro=Y nvi=$GUID() #grd_col f=name c1="Name" w=200 wst=300 l=40 #grd_col f=csort c1="Sort" w=50 l=1 y=int a=r a1=l #sql select * from translate_language order by csort #grd_data q=sql t=translate_language #memo_seg q=data i=xtranslation_languages c=$T(Notes) --#memo_seg q=file fn=i:\temp\test.txt c=$T(Notes)
Auf dieser Seite werden die verwendeten Sprachen dargestellt und können neue Sprachen hinzugefügt werden. Beim Setzen einer (anderen) Sprache wird dem Kommando xtranslation_exec als zweiter Parameter der Name des Kommandos übergeben, damit die Seite korrekt refresht werden kann (xtranslation_exec wird von verschiedenen Kommandos aus aufgerufen).
In der Überschrift des Grid-Segments wird die eingestellte Sprache angezeigt, diese wird mit der Funktion $LANGUAGE() ermittelt.
Das Bemerkungsfeld hat als Datenquelle data, wird also in der Tabelle data_memo gespeichert. Alternativ, als Kommantar dargestellt, die Speicherung der Anmerkung in einer Datei.
xtranslation_page_translate
#page #prim as=Y #cat as=Y c=$T(Word) #grd_seg frc=0 fcc=1 clt=ss n=grid #grd_col f=translate_word_id c1=ID w=30 y=guid ro=Y #grd_col f=word c1=$T(Word) w=300 wst=300 #sql select * from translate_word where translate_word_id = :kid #grd_data q=sql t=translate_word kid=$FND(s,translate_word_id) #prim as=Y #cat as=Y c=$T(Translation) #grd_seg frc=0 fcc=1 clt=ss n=grid c=" " b=H #grd_col f=translate_translation_id c1="ID" w=30 y=guid ro=Y nvi=$GUID() #grd_col f=translate_word_id c1="Translate Word Id" w=0 #grd_col f=translate_language_id c1="Translate Language Id" w=0 #grd_col f=name c1=$T(Language) w=100 nd=Y ro=Y #grd_col f=csort c1="Sort" w=0 nd=Y #grd_col f=translation c1=$T(Translation) w=300 wst=300 l=200 #sql select t.translate_translation_id, w.translate_word_id, l.translate_language_id, l.name, l.csort, #sql t.translation #sql from translate_word w #sql inner join translate_language l on 1 = 1 #sql left outer join translate_translation t #sql on t.translate_language_id = l.translate_language_id and t.translate_word_id = w.translate_word_id #sql where w.translate_word_id = :kid order by l.csort; #grd_data q=sql t=translate_translation kid=$FND(s,translate_word_id) #memo_seg q=data i=xtranslation_word c=$T(Notes) k=$FND(s,translate_word_id)
Bemerkenswert ist hier zunächst, dass das Segment in der Kategorie Wort, obwohl es nur einen Datensatz anzeigt, als Grid-Segment ausgeführt ist. So etwas wird üblicherweise nur dann gemacht, wenn damit Platz gespart werden soll (was mit zwei Spalten hier nicht möglich ist, aber die grundsätzliche Vorgehensweise zeigt).
Das Statement für die Übersetzungen joint zunächst kartesisch die Worte und die Sprachen und fügt die Tabelle translate_translation hinzu, in der die eigentliche Übersetzung steht. Die IDs für die Sprache und das Wort sind in Spalten mit der Breite 0. Der Name der Sprache wird im Klartext angezeigt, kann aber nicht in die Tabelle translate_translation gespeichert werden, darum ist hier der Parameter nd=Y ("no data") zu setzen.
Die Anmerkungen kommen wieder in ein Memo-Segment mit der Quelle q=data. Das Item ist hier translation_word, das für alle Worte gleich ist. Daher muss auch noch der Parameter k ("key") gesetzt werden, und zwar auf die ID des Wortes.