-Waldmeister-
Geocacher
Ich möchte einen Wherigo in andere Sprachen übersetzen und bin dabei auf einiges Interessantes gestoßen:
1. Deutsche Umlaute
Deutsche Umlaute können auf allen meinen Playern:
durch die Kodierung string.char(228,246,252,223) (=äöüß) dargestellt werden.
Die hier erwähnten Unterschiede kann ich nicht feststellen:
2. Sonderzeichen mit Absturz
2.1.
Manchen Sonderzeichen können in Urwigo erst gar nicht kompiliert werden wenn sie in einer Variable stehen.
zB ąĆćꣳńÓóŚśŹźŻż (polnische Sonderzeichen):
satz=string.char(261,262,263,281,321,322,324,211,243,346,347,377,378,379,380)
(Für die einfache Übersetzung der Sonderzeichen habe ich mir ein kleines Java-Programm geschrieben)
2.2.
Umgeht man das ganze (durch dynamisches ersetzen der Zahlen oder durch direktes einsetzen in eine Nachricht) kommt es erst beim Aufruf im Emulator in Urwigo zu einem Fehler (Bad argument #1 to 'char').
Auch beim Garmin gibt es beim Aufruf einen Fehler.
Bei allen anderen Playern wird das richtige Sonderzeichen angezeigt.
3. Sonderzeichen im Array
Escaped man die Sonderzeichen (zb mit ##____; wobei ___ für die Zahl steht) kann man seine Übersetzungen schön in ein Array / eine Variable schreiben. (Um zB auf Krolocks Tutorial aufzubauen.)
MIt so einer Funktion könnte man sie dann während der Laufzeit zurückübersetzen:
der Aufruf (für die obigen Sonderzeichen) wäre dann:
encode_utf8("##261;##262;##263;##281;##321;##322;##324;##211;##243;##346;##347;##377;##378;##379;##380;")
-Funktioniert auf fast allen Playern
-Der Android Player zeigt hier nichts an?! -> Obwohl die Sonderzeichen gehen
-Der Garmin wirft einen Fehler jedoch wegen den Sonderzeichen nicht wegen der Funktion (getestet)
4. Sonderzeichen ohne Absturz
Da 3. nicht zuverlässig funktioniert braucht man eine Methode, um herauszufinden ob der Player das kann.
Hier ist mir nur Try und Catch eingefallen.
Mit der Funktion pcall könnte man alle Sonderzeichen während der Laufzeit testen und den Fehler abfangen und behandeln.
-> Leider kann das der Iphone Player nicht -.- (sonst ALLE unter 1 erwähnten)
5. Lösungsversuch
Durch die "DeviceID" und/oder "Platform" könnte man versuchen die Player zu unterscheiden um nur manchen Playern eine bestimmte Sprache anzubieten
6. Ich freu mich über Lösungsvorschläge und/oder Ideen
1. Deutsche Umlaute
Deutsche Umlaute können auf allen meinen Playern:
- -OpenWIG r428 (Nokia N8)
-DesktopWIG (Mac OS X 10.6.8 und Windows 8)
-WhereYouGo (Android 4.0)
-Wherigo (Ipod Touch 2G) v317
-Garmin Oregon 450
durch die Kodierung string.char(228,246,252,223) (=äöüß) dargestellt werden.
Die hier erwähnten Unterschiede kann ich nicht feststellen:
sTeamTraen schrieb:Du hast gleich. Colorado/Oregon = WIN-1252 (fast ISO-8859-1 aber mit noch ein Paar karakter dabei). PocketPC/Emulator = UTF-8. WhereYouGo (Android)/DesktopWiG = ungefähr UTF-8, aber mit speziellen Java-Unicode-bugs. iPhone = ungefähr UTF-8, aber mit (anderen) speziellen Java-Unicode-bugs.
2. Sonderzeichen mit Absturz
2.1.
Manchen Sonderzeichen können in Urwigo erst gar nicht kompiliert werden wenn sie in einer Variable stehen.
zB ąĆćꣳńÓóŚśŹźŻż (polnische Sonderzeichen):
satz=string.char(261,262,263,281,321,322,324,211,243,346,347,377,378,379,380)
(Für die einfache Übersetzung der Sonderzeichen habe ich mir ein kleines Java-Programm geschrieben)
2.2.
Umgeht man das ganze (durch dynamisches ersetzen der Zahlen oder durch direktes einsetzen in eine Nachricht) kommt es erst beim Aufruf im Emulator in Urwigo zu einem Fehler (Bad argument #1 to 'char').
Auch beim Garmin gibt es beim Aufruf einen Fehler.
Bei allen anderen Playern wird das richtige Sonderzeichen angezeigt.
3. Sonderzeichen im Array
Escaped man die Sonderzeichen (zb mit ##____; wobei ___ für die Zahl steht) kann man seine Übersetzungen schön in ein Array / eine Variable schreiben. (Um zB auf Krolocks Tutorial aufzubauen.)
MIt so einer Funktion könnte man sie dann während der Laufzeit zurückübersetzen:
Code:
function encode_utf8(s)
for w in string.gfind(s, "##%d+;") do --sucht die Folge ##____;
for w2 in string.gfind(w "%d+") do --filtert die Zahl - muss keine forschleife sein
s = string.gsub(s, "##"..w2..";", string.char(w2)) --ersetzt die sequenz
end
end
return s
end
encode_utf8("##261;##262;##263;##281;##321;##322;##324;##211;##243;##346;##347;##377;##378;##379;##380;")
-Funktioniert auf fast allen Playern
-Der Android Player zeigt hier nichts an?! -> Obwohl die Sonderzeichen gehen
-Der Garmin wirft einen Fehler jedoch wegen den Sonderzeichen nicht wegen der Funktion (getestet)
4. Sonderzeichen ohne Absturz
Da 3. nicht zuverlässig funktioniert braucht man eine Methode, um herauszufinden ob der Player das kann.
Hier ist mir nur Try und Catch eingefallen.
Mit der Funktion pcall könnte man alle Sonderzeichen während der Laufzeit testen und den Fehler abfangen und behandeln.
-> Leider kann das der Iphone Player nicht -.- (sonst ALLE unter 1 erwähnten)
Code:
function getText(value) --Player fordert Übersetzung an
status, err= pcall(encode_utf8,value) --pcall ruft die funktion encode_utf8 mit den werten in value auf
-- pcall gibt den Status zurück (true, false) obs geklappt hat
--err = die Fehlermeldung im Fehlerfall
if status == true then
return encode_utf8(value)
else
return "not available"
end
end
5. Lösungsversuch
Durch die "DeviceID" und/oder "Platform" könnte man versuchen die Player zu unterscheiden um nur manchen Playern eine bestimmte Sprache anzubieten
6. Ich freu mich über Lösungsvorschläge und/oder Ideen