• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Urwigo, Sprachauswahl

nebbiolo

Geocacher
Hallo

Nun habe ich eine Möglichkeit gefunden, wie im Urwigo relativ einfach eine zweite (oder ..) Sprache definiert werden könnte. Bevor ich aber alles "umschreibe" möchte ich mich erkundigen ob ich damit Probleme bekomme (Geschwindigkeit, verschiede Hardware etc.)

Vorgehen:
1. Alle Texte erfasse ich bei den Variablen (Standard-Variable + Sprach-Variable)
2. Dann verwende ich natürlich keine fixen Texte bei den Ereignissen, sondern "verkette" alles mit den Standard-Variablen
3. Am Anfang frage ich die gewünschte Sprache und übertrage alle Sprach-Variablen in die Standard-Variable.

So ist nur das Aufbereiten der Standard-Variablen durch die Sprach-Variablen aufwendig, muss jedoch nur bei einer Fremdsprache gemacht werden.

Was meint Ihr dazu?

Grüsse, Nebbiolo
 

bodenseepingu

Geomaster
Wie das gehen soll ist mir nicht ganz klar. Ich habe mich mit der Thematik "deutsche Umlaute und Urwigo" in http://www.das-wherigo-handbuch.de/index.php?title=Deutsche_Umlaute_mit_Urwigo
beschäftigt - die Thematik der Sprache ist eine ähnliche.

Es wird ein Originaltext in einen gewünschten Text zur Laufzeit ersetzt. Der einzige Unterschied besteht darin, dass man bei der Umlaut-Thematik die gewünschten Umlaute im Text "maskieren" kann, während man bei der Sprachwahl die Texte komplett ersetzen muss.

Die angesprochenen Variablen decken maximal das Thema Message-Boxen und Dialoge ab. Was aber ist mit den Namen und Beschreibungen von Zonen, Characteren, Items, Aufgaben sowie - Eingaben.

Die oben angegebene Cartridge gibt ein Gefühl dafür, was man alles ersetzen muss - wenn das nicht automatisch durch den Aufruf einer LUA-Funktion gemacht wird, dann ist das Erstellen jeder Multi-Sprach-Cartridge wirklich sehr sehr arbeitsintensiv - oder willst du etwa für jeden Namen und jede Description jedes Objekts per Urwigo-Anweisung eine Sprach-Variable definieren und zuweisen ? Das geht schon eleganter nach dem vorgestellten Muster - hat allerdings auch Grenzen (z.B. eindeutig Kommandos - das geht dann einfach nicht).

Mein Vorschlag: Arbeite mit Kennungen - z.B. @Parkplatz, @PARKPLATZ_DESCR usw für alle Urwigo-Objekte (Namen und Descriptions) - und für Messageboxen / Dialoge mit einer LUA-Funktion z.B. get_text("@DIALOG_MUELLER").

Nach dem angegebenen Muster für die Umlaute kannst du dann per mächtigen LUA-Funktionen wie beim Umlaute-Beispiel die entsprechenden Texte in angelegten LUA-Tables suchen und ersetzen und dabei die gewünschte Sprache berücksichtigen.
 

docfred

Geocacher
Ich mache jetzt gerade meine ersten Gehversuche mit einer viersprachigen (deutsch, französisch, italienisch und ungarisch) Cartridge und EARWIGO.
Was ich da bisher mit kleinen Testcartridges gesehen habe ist genial.
Zu Beginn frägt ein Pulldown-Menü, in welcher Sprache der WIG gespielt werden soll und stellt die entspr. Sprache ein.
Das ist aber noch nicht alles! Ich kann wärend des Spieles die Sprache wieder umschalten. Vorraussichtlich wird es im meinem WIG einen "character" oder ein "item" geben im Sinne eines Dolmetschers, "den man bitten kann, alles in die entspr. Sprache zu übersetzen". Man kann dann auch per LUA-Befehle diese "Sprachvariable" auswerten und die Mediafiles steuern. (Was ich aber vermeiden möchten, da ich eigenlich keine sprachabh. Bilder brauche).
Bin mal gespannt, werde deshalb aber die etwas aufwändigere Bedinung hinnehmen und ggf. hier mal berichten.
docfred
 

bodenseepingu

Geomaster
Ich kriege (hoffentlich) demnächst eine Cartridge eines französischen Wherigo-Programmierers, der Multi-Language implementiert hat mit Urwigo. Wenn ich die habe, kann ich zumindest eine Aussage treffen, wie er das Thema gelöst hat - ob er eher die Variablenvariante genommen hat oder ob er mit LUA noch was gemacht hat. Allerdings ist seine Beispielcartridge sehr überschaubar, so dass das vielleicht nicht unbedingt repräsentativ ist.
 
OP
nebbiolo

nebbiolo

Geocacher
@bodenseepingu

Da bin ich aber gespannt!

Nach Deinem Beitrag habe ich den Mut verloren und alle Sprachabfragen wieder "rausgerissen".
Jedoch habe ich wiederholende Texte (z.b: Richtig, Gehe weiter etc.) oder auch längere Beschreibungen in den Variablen abgelegt - nun verwende ich z.B. die Variable JA an Stelle der vorherigen Textes "ja". So ist das Übersetzten einiges einfacher - natürlich muss ich dann zwei Dateien separat verwalten.

Ich habe schon gehofft, dass urwigo einmal mit Sprachwahl kommen wüde ;-)

Grüsse an den Bodensee, Nebbiolo
 

jonny65

Geomaster
Ich würd sagen, übersichtlicher und weniger aufwendig (man muss ja eh alle Texte 2 mal definieren...auf diese oder jene Art und mit Earwigo doch auch) sind ganz einfach 2 verschiedene Cartridges. Das Argument "dann muss man ja beim Bugfix 2 mal pflegen" seh ich als eher unbedeutend an, da eine Cartridge schon so durchdacht und stabil sein sollte, daß nur minimale Updates erforderlich sind. Mal ne Zone bissl anpassen...sonst doch nix.
 

bodenseepingu

Geomaster
...warum denn so voreilig rausgeschmissen...ich hab ja nur gesagt, dass eine vollständige Sprachumstellung dann halt viel Arbeit ist...an Performance-Probleme
glaub ich noch nicht mal...

Und nicht falsch verstehen - der französische Programmierer hat entweder nach deiner oder nach meiner Methode Sprachauswahl reingebaut. Nur - er hat halt keine 15 Zonen, 10 Tasks, 5 Charaktere, 7 Items, 5 Inputs, 30 Messageboxen und 12 Kommandos....was für mich für einen Multi-WIG so in etwa die Größenordnung wäre.

Sooo viel Variablen wären das ja auch nicht -
30 für die Zonen (Name und Description)
20 für die Tasks
10 für die Charaktere
14 für die Items
für die Inputs - hmmmm - evtl. müsste man einfach die Inputs duplizieren und per Logik den richtigen nehmen
30 Texte für die Messageboxen
und für die Kommandos müsste man denke ich auch duplizieren und per Logik die richtigen aktivieren...

Also reden wir höchstens für dieses Beispiel von etwas mehr als 100 Variablen in Original und jeweils der zugehörigen Sprache..

Gehen tut das sicher - ich würde bei dieser Anzahl halt eben einiges nach LUA auslagern und lieber bisschen Gehirnschmalz in die LUA-Routinen stecken....
...bei entsprechender Namensgebung lässt sich da ungeheuer viel automatisieren...
Wie sTeamTraen das bei Earwigo gelöst hat, weiß ich nicht - aber er liest hier ja mit...

Ich schau mir mal an, was ich aus Frankreich bekomme, ob das genau nach deinem Muster ist oder eher nach meinem...
 

sTeamTraen

Geocacher
bodenseepingu schrieb:
Wie sTeamTraen das bei Earwigo gelöst hat, weiß ich nicht - aber er liest hier ja mit...
Wie einer meines Informatikprofessors sagte: "All software problems can be solved with an extra level of indirection".

Das heisst, bei Earwigo in Multi-Sprache-Modus "bestehen" (im Lua-File) alle "Strings" aus Funktionsaufrufe zum Localisation-Funktions. Ich glaube, die interne Strukturen von Earwigo (wobei alles in eine relationale Datenbank mit 26 Tabellen steht) seien mehr "abstrakt" wie bei die anderen, mehr Lua-File-orientierte Builder. Ungefähr das Gleiche gilt für die Unterstützung von umlaüte via Win-1252 (Garmin) oder verschiedene Implementation von UTF-8 (andere Player).
 

Krolock

Geocacher
In der Informatik gibt es ein eigenes Patter für das Thema Internationalisierung.
Wenn wir das Problem nach diesem Pattern angeben, benötigen wir ein Methode, à la
Code:
function getString(key)
Diese Methode schaut in einer zweidimensionalen Tabelle nach, welcher Wert für den key (zweite Dimension des Arrays) und die Sprache (erste Dimension des Arrays) definiert ist.
Die Tabelle könnte folgendermaßen aussehen:
Code:
translation["de"]["go.to.zone.1"] = "Gehe zur Zone 1"
translation["en"]["go.to.zone.1"] = "Go to zone 1"
translation["fr"]["go.to.zone.1"] = "Allez à la zone 1"
translation["de"]["bye"] = "Auf Wiedersehen"
translation["en"]["bye"] = "Bye"
translation["fr"]["bye"] = "Au revoir"

Zu Beginn des Spieles kann die Sprache gewählt werden, die in einer Variablen (language = "de" | "en" | "fr") festgehalten wird.
getString(key) liefert dann translation[language][key] zurück.

Kombiniert mit den externen lua Dateien, definiert man im eigentlichen Programm das Array translation = {} und bindet anschließend mit require die Sprachen ein, wobei für jede Sprache eine eigene Datei erstellt wird. Dies fördert die Übersichtlichkeit und Sprachen können dynamisch hinzugefügt werden.
Für den Input der angebotenen Sprachen ruft man das Array translation in erster Dimension auf.
Code:
keys = {}
for k,v in pairs(translation) do
	table.insert(keys,k)
end
myInputSelectLanguage.Choices = keys
bildet ein Array mit den möglichen Sprachen, das wiederum für den Input als MultipleChoice Möglichkeiten gesetzt werden können
 
OP
nebbiolo

nebbiolo

Geocacher
Schön, gut, interessant Krolok!

Aber für mich als Laie ein bisschen kompliziert ;-)
Ein kleines muster.urwigo wie das praktisch aussieht wäre doch super!

Grüsse, Nebbiolo
 

Krolock

Geocacher
Hi nebbiolo
ich werd das urwigo Projekt dazu bei Gelegenheit erstellen, ich muss dich aber vorwarnen.
"Laie" und Features wie Sprachauswahl stehen aber oft im reziproken Verhältnis, will heißen, wenn man per lua in den Code eingreift, sollte man schon ein wenig Erfahrung haben. :eek:ps:
*duckUndWeg*
 

sTeamTraen

Geocacher
BachgassenBande schrieb:
Die Funktion die Earwigo benutzt müsste sich doch aus einem Cartridge mit Sprachauswahl erstellt mit Earwigo extrahieren lassen?
Ja, aber das ist ganz einfach (string.sub() usw, auf Delimiter getrennt). Schwerig ist, die ganze Infrastruktur zu bauen, womit die Multisprache Strings durchsichtig im Builder aufgebaut worden.
 

bodenseepingu

Geomaster
So - ich hab jetzt mal mit der Cartridge die ich aus Frankreich von megagrozilla bekommen habe mit der Sprachwahl experimentiert.

Ich mache jetzt damit folgendes:
- Menü für die Sprachwahl am Anfang (ja klar)
- Auf LUA basierte Funktionen, die für alle Objekte, für die Übersetzungen definiert wurden, die Objekt-Felder Name und Description ersetzt
- Eingaben: kombinierte Sprachelemente (please enter a number / Gib eine Zahl ein)
- Multiple-Choice-Eingaben: dito (z.B. green/yellow) - hier ist das Problem, dass die Antwort als String ausgewertet wird und es recht ungünstig ist, wenn sich die Choices ändern - d.h. da müsste dann im Code Rücksicht genommen werden
- Kommandos: kombinierte Sprachelemente (select/waehle)
- Messageboxen und Dialogen: Entweder mehrsprachig wie bei Eingaben wenn es kurze Texte sind oder per IF-Bedingung verzweigen oder per LUA gewünschten String laden - da hier nur wenige Message-Boxen vorkamen, hab ich die IF-Bedingung und Kopie gewählt.

Hier die LUA-Routinen und Sprachkonstrukte
Code:
--
-- Created by IntelliJ IDEA.
-- User: andi
-- Date: 27.04.12
-- Time: 22:27
-- To change this template use File | Settings | File Templates.
--

--translate cartridge

var_translations = {}
var_translations[1] =
{
    name = "THE BOMB",
    name_ger = "Die Bombe",
    descr = "the bomb blows up in 5 minutes",
    descr_ger = "Die Bombe explodiert in 5 MInuten",
}
var_translations[2] =
{
    name = "The Source",
    name_ger = "Die Quelle",
    descr = "Here you could get water",
    descr_ger = "Hier bekommst Du Wasser",
}
var_translations[3] =
{
    name = "dairywoman",
    name_ger = "Die Milchfrau",
    descr = "This is a woman with milk",
    descr_ger = "Das ist die Milchfrau",
}
....usw
....

function translate_object(object, language, index)
    if language == "Deutsch" then
        object.Name = var_translations[index].name_ger
        object.Description = var_translations[index].descr_ger
        --elseif
    end
end


function translate(cartridge, language)
    local objects = cartridge.AllZObjects
    for index = 1, #objects, 1 do
        print(objects[index].Name, " no of available translations: ", #var_translations)
        for trans_index = 1, #var_translations, 1 do
            print(" translations: ", var_translations[trans_index].name, " no ", trans_index)
            if var_translations[trans_index].name == objects[index].Name then
                print(" translation found ")
                translate_object(objects[index], language, trans_index)
            end
        end
    end
end
 

bodenseepingu

Geomaster
Übrigens: Der Emulator in der neuesten Version scheint fehlerbehaftet zu sein - das obige Konstrukt ersetzt im Emulator bei mir nur die ersten 3 Sprachelemente - gehe ich jedoch auf ein Android funktioniert das so wie es soll...

Die Sprachen sind noch nicht vollständig implementiert - da würde einfach die LUA-Routine erweitert werden und die LUA-Tabellen gleichfalls.

Auf Umlaute und Sonderzeichen / Akzente hab ich im Moment verzichtet..
 

bodenseepingu

Geomaster
Für Messages mit längeren Texten habe ich jetzt auch noch ne Funktion gebaut...

Code:
var_messages = {}
var_messages[1] = {
    msg_english = "You'll see two areas. In the first, there are two cans and a bomb. You have to disarmed the bomb by ...",
   msg_german = "Du wirst zwei Zonen sehen. In der ersten findest du zwei Kanister und eine Bombe. Du musst die Bombe entschaerfen durch...",
}
var_messages[2] = {
...
}

function get_translate_msg(nr, language)
    if nr < 1 then return "var_messages out of index" end
    if nr > #var_messages then return "var_messages out of index, msg not defined"   end

    if language == var_lang_german then
        return var_messages[nr].msg_german
    elseif language == var_lang_english then
        return var_messages[nr].msg_english
    end
end
 

bodenseepingu

Geomaster
Für Kommandos habe ich eine nur eine manuelle Lösung: Kommandos duplizieren für jede Sprache
Für Inputs habe ich eine automatisierte Lösung, die können übersetzt werden.

Wer näheres wissen will, kann sich melden.
 

bodenseepingu

Geomaster
Zum Abschluss des Threads: Die fertige Cartridge in 3 Sprachen steht bei wherigo.com unter
http://www.wherigo.com/cartridge/details.aspx?CGUID=83615e99-58d2-4e55-995b-81a767a161d8

Die könnt ihr natürlich mit dem Beitrag von xxmurdockxx auch im Urwigo-Emulator spielen...

Kleine Statistik für diejenigen, die das "handisch" per Variablen machen wollen - obwohl die Cartridge sehr klein ist und nur 2 Zonen und ein paar Items und 1 Person hat existieren folgende Text-Fragmente, die in die anderen Sprachen übersetzt worden sind (d.h. in diesem Falle mal 3)
- 16 Namen und Descriptions
- 19 Messages
- ein paar kurze Messages, die 3-sprachig gehalten wurden
- 5 Auswahl-Punkte für Multi-Selekt-Eingaben (mehrfach benutzt)
- 1 Fragetext für Multi-Selekt-Eingabe (mehrfach benutzt)

Diese werden alle automatisch durch eine LUA-Funktion in die gewünschte Sprache übersetzt.

Was bleibt: ca. 40 Kommandos (insgesamt in 3 Sprachen), die durch Urwigo-Code korrekt enabled/disabled werden müssen je nach Kontext und nach ausgewählter Sprache.
 

sTeamTraen

Geocacher
bodenseepingu schrieb:
Was bleibt: ca. 40 Kommandos (insgesamt in 3 Sprachen), die durch Urwigo-Code korrekt enabled/disabled werden müssen je nach Kontext und nach ausgewählter Sprache.
Ohne deine Code zu lesen: wäre es nicht möglich, <Objekt-Luaname>.Commands.<Kommando-Luaname>.Text das gewünschte Wert zuordnen ?
 
Oben