Du bist nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: dSUG - Forum der deutschsprachigen Servoy User Group. Falls dies dein erster Besuch auf dieser Seite ist, lies bitte die Hilfe durch. Dort wird dir die Bedienung dieser Seite näher erläutert. Darüber hinaus solltest du dich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutze das Registrierungsformular, um dich zu registrieren oder informiere dich ausführlich über den Registrierungsvorgang. Falls du dich bereits zu einem früheren Zeitpunkt registriert hast, kannst du dich hier anmelden.

1

Montag, 23. Januar 2012, 08:30

Laden LabelBeschreibungen (mehrsprachig)

Habe das Layout meiner FORMS nahezu fertig.
Da man sich nicht um alles gleichzeitig kümmern kann, hatte ich zunächst die Beschriftungen der Label vernachlässigt.

Nun bin ich an dem Punkt, wo ich dies tun müßte.
Ich habe natürlich wenig Lust ca 1.800 Texte von Hand in die Tabelle i18n einzutragen und noch weniger Lust diese in die FORMS zu integrieren.

Ich habe in meiner VFP-Anwendung eine Tabelle in der alle Texte vorhanden sind, mit den notwendigen infos (Tabelle, Feldname).
Die Texte in die Tabelle i18n zu integrieren ist mit einem VFP-Progrämmchen ein kleiner Akt.
Ich denke es ist eine gute Idee den Message_key aus TabellenName + FeldName zusammenszusetzen.
Hierzu brauche ich noch folgende Infos:
- Wie lauten die Einträge für die einzelnen Sprachen?
als Default Sprache möchte ich Englisch. Ich denke dies bedeutet für Englisch die Message_language auf NULL zu setzen.
- Wie lauten die Beschreibungen für die einzelnen Sprachen?
ich benötige: deutsch, englisch (default), französisch, itelienisch, spanisch, tschechisch, polnisch

Der nächste Schritt ist in die Property Text der Forms den MessageKey einzufügen.
Gibt es hierzu Hilfestellungen (vorbereitete Programme) von Servoy oder anderen Entwicklern?

Ich habe grade mal in die Dateien zu den FORMS hineingeschaut.
Ich denke es sollte kein möglich sein, die mit einem VFP-Programm in die "frm"-Dateien zu integrieren.

Falls es aber etwas gibt, könnte ich die Zeit natürlich besser nutzen.

Danke für Infos

Harro

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Harro« (23. Januar 2012, 10:02)


2

Montag, 23. Januar 2012, 11:07

- Wie lauten die Einträge für die einzelnen Sprachen:

Quellcode

1
2
3
4
var vLanguages = i18n.getLanguages();	
for (var i = 1; i <= vLanguages.getMaxRowIndex() ; i++) {	
 application.output(vLanguages.getRowAsArray(i).join(";"))	
}


liefert z.B. "da;Dansk", wobei "da" dann die Sprache ist, die Du brauchst.

- Wie lauten die Beschreibungen für die einzelnen Sprachen:

siehe oben ("Dansk")

Für das nachträgliche Eintragen der Keys musst Du Dir was "basteln", da gibt es nichts Fertiges. Da jeder seine keys benennen kann, wie er möchte, ist das schwer zu automatisieren.

3

Montag, 23. Januar 2012, 11:55

Hallo Patrick,
danke, damit habe ich die Kürzel für die Sprachen. Klappt.

Bitte noch mal eine Bestätigung ob meine Annahme richtig ist, daß ein Eintrag in die i18n mit "NULL" im Feld Message_Language, die Default-Sprache ist.
Oder wird die Default-Sprache woanders festgelegt?

Das Laden der i18n hab ich schnell mit VFP gebastelt, klar.
Auch hier würde ich gerne wissen, ob als Message_key die Kombination aus TabellenName+FeldName ein gute Idee ist.
Oder gibt es andere bessere Erfahrungen?

Dann noch mal die Frage:
Gibt es ein Rahmen-Programm mit dem man in die frm-Files die Referenz für die i18n eintragen kann?
In den frm-files steht ja "Datasource" und "labelFor" drin. Damit und mit der Regel für Message_keys läßt sich die Verknüpfung zur i18n "elektrisch" herstellen.

Dann müßte ich nur noch die Buttons von Hand eintragen. aber das ist ja überschaubar.

Danke für Infos
Harro

4

Montag, 23. Januar 2012, 12:06

Zitat

Bitte noch mal eine Bestätigung ob meine Annahme richtig ist, daß ein Eintrag in die i18n mit "NULL" im Feld Message_Language, die Default-Sprache ist.
Oder wird die Default-Sprache woanders festgelegt?


Bestätigt. Wird die eingestellte Sprache des Clients nicht gefunden, werden die Einträge mit Sprache NULL (=default) verwendet.

Zitat

Auch hier würde ich gerne wissen, ob als Message_key die Kombination aus TabellenName+FeldName ein gute Idee ist.


Gute Idee.

Zitat

Gibt es ein Rahmen-Programm mit dem man in die frm-Files die Referenz für die i18n eintragen kann?


Nicht, dass ich wüsste.

5

Dienstag, 24. Januar 2012, 13:28

Hallo Patrick,
hab ein Verständnis-Problem:
i18n-file wird unter Resources angezeigt. Hier kann ich manuell Änderungen machen.

Ich habe eine i18n-Tabelle in meiner Datenbank gefunden und dort auch Einträge gemacht.
Das sind aber wohl nicht die gleichen Tabellen.
Ich dachte die sei von Servoy angelegt.
Ich vermute die hat Joas neulich mal angelegt um mir was zu zeigen (was ich vergessen habe)

Kann ich die i18n-Tabelle aus meiner Datenbank einbinden für diese Solution?
Möchte die Tabelle gerne per Programm pflegen.

Danke für Infos Harro

6

Dienstag, 24. Januar 2012, 14:58

Die i18n-Verwaltung im Developer bezieht sich auf lokale Dateien in Deinem Workspace. Man kann die Schlüssel dort pflegen und dann beim Deployment mit übergeben (Haken in den Export- und Importeinstellungen). Die Tabelle in der Datenbank wird vom Application Server verwendet und ist diejenige, die beim Deployment im Client relevant ist. Es gibt zwei Möglichkeiten damit umzugehen:

- Pflege im Developer: wie oben beschrieben, beim Export der Solution mit übergeben und dann beim Import mit einlesen
- Pflege in der Datenbank: ein einfaches Form, das auf der i18n-Tabelle basiert kann für die Pflege angelegt werden; damit der Developer diese Einträge dann auch mitkriegt, kannst Du immer wieder mal per Rechtsklick auf "i18n files" den Befehl "Read from DB" ausführen. Damit wird die Tabelle ausgelesen und die lokalen Dateien befüllt. Diese benutzt der Debug-Client (der Client der Entwicklungsumgebung).

Ich hoffe, das hilft.

7

Dienstag, 24. Januar 2012, 15:02

... und noch eine Frage:

Sind die frm-Files in der Solution noch irgenwo "verlinkt" oder compiliert oder was weiß ich ???

Hintergrund der Frage:
Wenn ich per Programm die Referenz auf die i18n eintrage (und die Datei dabei nicht versaue) ist das ok oder muß noch anderes bedacht werden?

Habe jetzt ein Programm fertig gestellt, was mir in den frm-Files bei allen Labels - die ein Property "labelFor" haben - den Verweis auf den i18n einsetzt.
Die frm-Files sehen inhaltlich gut aus (für mich) und man kann sie auch im Projekt öffnen.

8

Dienstag, 24. Januar 2012, 15:03

Das sollte klappen. Mach doch mal ein backup, bevor Du das laufen lässt. :)

9

Dienstag, 24. Januar 2012, 16:10

Tja, das sieht insgesamt schon sehr freundlich aus.

Viel Tipperei gespart, nein nicht nur Tipperei gespart, sondern extrem lästiges rumklicken im Developer.

Jetzt noch die Buttons von Hand beschriftet und die Solution sieht schon (fast) wie gekauft aus. 8)

Vor dieser Übersetzung hatte ich schon viel Muffe, aber mit Nachdenken 1/2 Tag, geht doch.

10

Dienstag, 24. Januar 2012, 17:51

Zitat

Habe jetzt ein Programm fertig gestellt, was mir in den frm-Files bei allen Labels - die ein Property "labelFor" haben - den Verweis auf den i18n einsetzt.
Die frm-Files sehen inhaltlich gut aus (für mich) und man kann sie auch im Projekt öffnen.
Da man ja immer was lernen kann, wenn man Code-Beispiele sieht, kopiere ich hier kurz mal einen Ansatz, wie man das mit Servoy-Bordmitteln machen könnte. Das ist aber bitte nicht best practice! Aber es zeigt ein paar Dinge wie Dateizugriff, Strings/Arrays etc.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
function test() {
	var vSolutionFolder = plugins.file.showDirectorySelectDialog();
	if (!vSolutionFolder) {
		return;
	}
	var vFormsFolderPath = vSolutionFolder.getAbsolutePath() + "\\forms";
	var vFormsFolder = plugins.file.convertToJSFile(vFormsFolderPath);
	if (!vFormsFolder || !vFormsFolder.exists()) {
		return;
	}
	
	// get all files in the folder
	/** @type {Array<JSFile>} */
	var vFormFiles = vFormsFolder.listFiles();
	
	for (var i = 0; i < vFormFiles.length; i++) {
		if (utils.stringRight(vFormFiles[i].getName(),4) == ".frm") {
			// form file found
			var vFormFile = vFormFiles[i];
			var vFormFileContent = plugins.file.readTXTFile(vFormFile);
			if (!utils.stringPatternCount(vFormFileContent,"items:[")) {
				// empty form (no elements)
				continue;
			}
			
			// Create array of single lines of the file
			var vFormItemLines = vFormFileContent.split("\n");
			
			var vInsideItem = false;
			var vTableName = null;
			var vDataproviderName = null;
			var vChangesMade = false;
			
			application.output("Processing form "" + vFormFiles[i].getName() + """);			
			
			for (var j = 0; j < vFormItemLines.length; j++) {
				var vFormLine = vFormItemLines[j];
				if (j == 0 && utils.stringLeft(vFormLine,11) == "dataSource:") {
					// dataSource element found; used to find table name
					vTableName = databaseManager.getDataSourceTableName(utils.stringMiddle(vFormLine,13,vFormLine.length - 14));
					continue;
				} else if (j == 0) {
					// form has no datasource; go to next form
					application.output("\tno datasource found in form "" + vFormFiles[i].getName() + """);
					break;
				}
				if (vFormLine == "{") {
					// we have reached the beginning of an item
					vInsideItem = true;
					continue;					
				}
				if (utils.stringLeft(vFormLine,9) == "labelFor:") {
					// the labelFor property contains the name of the dataprovider
					vDataproviderName = utils.stringMiddle(vFormLine,11, vFormLine.length - 12);
					continue;					
				}
				if (vInsideItem && vDataproviderName && utils.stringLeft(vFormLine,5) == "text:") {
					// text property found inside item and labelFor present
					var vText = utils.stringMiddle(vFormLine,7,vFormLine.length - 8);
					var vNewText = ("i18n:" + vTableName + "." + vDataproviderName).toLowerCase();
					vFormItemLines[j] = utils.stringReplace(vFormItemLines[j], vText, vNewText);
					application.output("\tChanging labelFor property from "" + vText + "" to "" + vNewText + """);
					vChangesMade = true;
					continue;					
				}
				if (utils.stringLeft(vFormLine,1) == "}") {
					// End of item block reached
					vInsideItem = false;
					vDataproviderName = null;
					continue;					
				}				
			}
			if (vChangesMade) {
				// create \n separated String from Array of single lines
				vFormFileContent = vFormItemLines.join("\n");
				// Write back to file - commented to prevent damage
				// plugins.file.writeTXTFile(vFormFile,vFormFileContent);
			} else {
				application.output("\t no relevant elements found");
			}
		}
	}
}

11

Mittwoch, 25. Januar 2012, 13:43

Ja das ist gut.
Das werde ich mir verinnerlichen und mir aufheben.

Es ist gut, daß ich mir das VFP-Programm vorher gebastelt hatte.
Habe die gleiche Technik wie Du angewendet.

Von daher lassen sich die beiden Lösungen gut vergleichen.

Danke Harro

Ähnliche Themen

Social Bookmarks

Thema bewerten