Xtranslation

Aus bafbal.de
Version vom 23. Mai 2021, 18:06 Uhr von Michaelebner (Diskussion | Beiträge) (→‎xtranslation_page_translate)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

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.

Sprache auswählen

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

Eine Übersetzung

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