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

Name eines Buttons ändern

wendenzo

Geocacher
Hallo,

gibt es eine Möglichkeit in Urwigo (und wenn ja: wie?) im Ablauf der Cartridge den Namen eines Buttons einer Eingabe, Dialogbox oder einer Messagebox zu ändern?
Beispiel: wenn die Cartridge Sprachauswahl enthält und der Namen ein und deselben Buttons entweder auf "zurück" oder "back" gesetzt wird, je nach Wahl der Sprache.

Danke und Gruß
wendenzo
 

Charlenni

Geomaster
Bei Eingaben gibt es keinen Button, den man verändern könnte. Also bleiben nur Messages oder Dialoge übrig. Diese kannst über ein Lua Kommando direkt und selbst mit den gewünschten Werten aufrufen.

Code:
Wherigo.MessageBox(<Gewünschter Text>, <Gewünschtes Bild>, {<Knopf1, Knopf2>}, <Callback-Funktion>)

Wherigo.MessageBox({Text=<Gewünschter Text 1>, Media=<Gewünschtes Bild 1>}, Buttons={<Button1>, <Button2>}, Callback=<Calklback Funktion>})

Wherigo.Dialog({{Text=<Gewünschter Text 1>, Media=<Gewünschtes Bild 1>}, {Text=<Gewünschter Text 2>, Media=<Gewünschtes Bild 2>}})
Dabei dann die Werte für die Buttons mit den gewünschten belegen.
 
OP
wendenzo

wendenzo

Geocacher
Danke für die Antwort, werde das mal probieren!

Auch die Eingaben haben benannte Buttons, nämlich wenn sie als Mehrfacheingabe definiert sind. Ich denke aber auch dort kann man wohl mit direktem Aufruf etwas machen ...
 
OP
wendenzo

wendenzo

Geocacher
Ich muss zugeben, deine Antwort scheint wohl etwas "zu hoch" für meine Lua-Kenntisse zu sein, denn ich weiß da leider gar nicht wo anfangen :eek:ps:

Um es genauer zu erklären: Ich möchte die Bezeichnungen der eingekreisten Buttons (siehe Bild) je nach, beim Start des Wherigos ausgewählter Sprache, ändern (z.B "Nochmal" in "again").Buttons.jpg

Für sämtliche Übersetzungen habe ich Krolocks http://krolock.blogspot.de/2012/12/i18n-einen-wherigo-in-verschiedenen.html verwendet, was auch super klappt, bis eben auf diese Buttons.

Ich habe mir mal die lua datei einer message.box von urwigo angesehen. Der interssante Code müsste dann wohl folgende Stelle sein:
Code:
-- functions --
function _3LsAA:OnStart()
	_Urwigo.MessageBox{
		Text = _zjo7H("\086\036\004\116\041\096\127"), 
		Buttons = {
			_zjo7H("\081\096\037\025\064\098"), 
			_zjo7H("\081\096\037\025\064\065")
		}
	}
end

Also muss ich die Variable _zjo7H ändern, oder?

Was bedeutet eigentlich dieser Strich vor der Variable?

Ich hoffe, dass mir jemand einen kleinen Stupser in die richtige Richtung geben kann, um so etwas umsetzen zu können.
 

Charlenni

Geomaster
Ok. Die einfachste Möglichkeit ist es ja, in die if-Abfrage nochmals eine if-Abfrage einzubauen, die dann auf die Sprache überprüft. Das ist die einfachste Möglichkeit, aber auch die aufwendigste, da Du nicht mit Variablen arbeiten kannst.

Was Du bei Deinem zweiten Teil siehst, ist die Verschleierungsfunktion von Urwigo. In Deinem Fall heißt sie _zjo7H. Beim nächsten kompilieren heißt sie wieder anders. Die Zeichen danach sind der Text.

Ich würde es erstmal mit der Variante oben versuchen.
 
OP
wendenzo

wendenzo

Geocacher
Oje, ich glaube ich schaff es nicht so recht mein Problem hier zu erklären: Ich benutze schon Variablen für die Sprachen: für jeden Dialog und jede Messagebox, auch für Item-Bezeichnungen, Kommandobezeichnungen usw. habe ich jeweils drei Sprachen definiert, und separat in Variablen abgespeichert, die mittels einer Routine ausgewählt werden. Das Bild im meinem vorigen Beitrag habe ich etwas schnell ausgewählt, dort sieht man das nicht; besser ist dieses Bild:

Buttons Name ändern.jpg

Ich möchte nun mit einem, wie im grünen Kreis dargestellten, "Lua Benutzerdefinierter Ausdruck" die Namen der Buttons (in rot markiert) ändern. Mir ist schon klar, dass ich das auch mit einem If-Zweig lösen könnte, allerdings habe ich die Sprachwahlumsetzung im ganzen Wherigo mit diesen "Lua Benutzerdefinierten Ausdrücken" durchgezogen, und möchte dieser Linie AUCH bei den Buttons treu bleiben.

Also irgenwie muss ich an die Variable des Button-Namens kommen, und ihn mit meiner Variable ersetzen ... aber genau da weiß ich nicht wie ...

Ich hoffe das war nun etwas besser verständlich?
 

Charlenni

Geomaster
Jetzt hätte ich noch eine Idee, die ich aber erst morgen ausprobieren kann. Vielleicht kannst Du es versuchen. Gib mal

"..<Variablenname>.."

Bitte mit Anführungszeichen genau so in das Feld eingeben. <Variablenname> Durch Deinen eigenen ersetzen. Eventuell klappt es. Aber die Obfuscation-Funktion kann Schwierigkeiten machen.
 

Charlenni

Geomaster
Habe ich mir fast gedacht. Liegt an der Verschleierung der Texte.

Nun gut, hat mir aber etwas Zeit zum Schlafen eingebracht und nun hier die korrekt Lösung :roll:

Code:
urwigoMessageBox = _Urwigo.MessageBox

 _Urwigo.MessageBox = function (arg1, arg2, arg3, arg4)
  -- Define local variables
  local text, mediaObj, idxMediaObj, callback, wrapper, buttons, btn1Label, btn2Label = nil, nil, nil, nil, nil, nil, nil, nil
  -- Check, if MessageBox is called with a table or distinct arguments
  if type(arg1) == "table" then
    -- MessageBox is called with a table as argument
    text = arg1.Text or "Generic MessageBox"
    mediaObj = arg1.Media or nil
    if not arg1.Buttons or arg1.Buttons == nil then
      buttons = {Env.Ok}
    else
      buttons = arg1.Buttons
    end
    callback = arg1.Callback or nil
  else
    -- MessageBox is called with distinct arguments
    text = arg1 or "Generic MessageBox"
    mediaObj = arg2 or nil
    if not arg3 then
      buttons = {Env.Ok}
    end
    callback = arg4 or nil
  end
  -- Now we have text, media, buttons and callback
  -- Check, if there is one or more buttons
    if type(buttons) == "table" then
      -- Exists button[1]
      if buttons[1] ~= nil then
        -- Exists a variable with name button[1]
        if _G[buttons[1]] ~= nil then
          -- Yes, than text of btn1Label is content of this variable
          btn1Label = _G[buttons[1]]
        else
          -- No, than text of btn1Label is button[1]
          btn1Label = buttons[1]
        end
      end
      -- Exists button[2]
      if buttons[2] ~= nil then
        -- Exists a variable with name button[2]
        if _G[buttons[2]] ~= nil then
          -- Yes, than text of btn2Label is content of this variable
          btn2Label = _G[buttons[2]]
        else
          -- No, than text of btn1Label is button[2]
          btn2Label = buttons[2]
        end
      end
    end
    urwigoMessageBox({Text=text, Media=mediaObj, Buttons={btn1Label, btn2Label}, Callback=callback})
end
Diesen Codeschnippsel in den Bereich "Lua Benutzer Funktionen" kopieren. Dann kann im Feld "Knopf1" oder "Knopf2" der Name der Variablen angegeben werden (siehe Bild1), der den eigentlichen Text enthält (siehe Bild2). Weitere Arbeiten sind nicht nötig.

Im Anhang habe ich die GWZ-Datei hinzugefügt. Diese enthält die Lua-Datei und die Urwigo-Datei, die auf den Bildern zu sehen ist. Damit kannst Du es etwas test.

Ich hoffe, das ist so, wie Du Dir es vorgestellt hast. Ansonsten nochmals melden.
 

Anhänge

  • Image2.PNG
    Image2.PNG
    147,1 KB · Aufrufe: 1.146
  • Image1.PNG
    Image1.PNG
    143,2 KB · Aufrufe: 1.146
  • MessageBox.zip
    4,9 KB · Aufrufe: 14
OP
wendenzo

wendenzo

Geocacher
WOW! So etwas schaffst du nachdem du etwas Schlaf hattest? Ich bin beeindruckt :gott: !

Damit dein Codeschnipsel mit meiner Routine für die Sprachwahl zusammen läuft musste ich das Flussdiagramm etwas ergänzen, da ich meine Variable, die als Array daherkommt, nicht direkt bei "Knopf1" eingeben kann (siehe rote Markierung):

Flussdiagramm Buttons umbennen.jpg

mein Code für die Sprachzuweisung sieht folgendermaßen aus:

Code Buttons umbennen.jpg

wie du siehst, werden die verschiedenen Sprachen in ein Array geschrieben, die Auswahl der Sprache erfolgt über [language]. Außerdem kann ich den Text noch variabel gestalten, was für dieses Thema hier aber ohne Belange ist. Das Problem ist, dass ich meine Arrays nicht direkt bei "Knopf1" und "Knopf2" der MessageBox eingeben kann, ich denke mal, das hat wieder mit der Verschleierung zu tun, von der du sprachest.
Auch wenn ich mit der Lösung so eigentlich zufrieden bin, möchte ich doch gerne wissen, ob ich die Texte über meine Funktion, z.B, m("Code") nicht doch irgenwie direkt in den Button der MessageBox bekomme?

Viel brennender ist aber die Frage, ob (bzw. wie) diese Geschichte auch mit Dialogboxen klappt?

Und noch viel heißer wäre ich auf eine ähnliche Lösung bei den Eingabefunktionen von Urwigo, mit besonderem Augenmerk auf die Mehrfacheingabe. Auch diese lassen sich leider nicht direkt in Urwigo ansteuern.

Auf jeden Fall möchte ich mich bei dir bedanken, für die geduldige Hilfe und dem hier geposteten Codeschnipsel!
 

Anhänge

  • MessageBox mit Umbenennung.zip
    2,4 KB · Aufrufe: 17

Charlenni

Geomaster
Ja, manchmal klappt das mit dem Schlafen. Aber nicht immer. Manchmal verschläft man auch ;)

Das mit der Übersetzung ist kein Problem. Du trägst in die Felder den Key ein und änderst den Code wie folgt ab

Code:
    if type(buttons) == "table" then
      -- Exists button[1]
      if buttons[1] ~= nil then
        -- Exists a key with name button[1]
        if m([buttons[1]) ~= nil then
          -- Yes, than text of btn1Label is translation of key
          btn1Label = m(buttons[1])
        else
          -- No, than text of btn1Label is button[1]
          btn1Label = buttons[1]
        end
      end
      -- Exists button[2]
      if buttons[2] ~= nil then
        -- Exists a key with name button[2]
        if m(buttons[2]) ~= nil then
          -- Yes, than text of btn2Label is translation of key
          btn2Label = m(buttons[2])
        else
          -- No, than text of btn1Label is button[2]
          btn2Label = buttons[2]
        end
      end
    end
Damit kannst Du gleich die Übersetzung einbauen.

Nun zu den Dialogen. Was möchtest Du da denn ändern? Das Ok? Und bei den Inputs, was möchtest Du da außer den Multiple-Choice-Antworten übersetzt haben?
 

Charlenni

Geomaster
Ok, wieder eine Nacht später ;)

Anbei eine neue Version. Diese macht nun folgendes
- Übersetzung der Beschreibung von MessageBoxen mit der Funktion m(key), wenn m(key) etwas zurück liefert.
- Übersetzung der Knöpfe von MessageBoxen mit der Funktion m(key), wenn m(key) etwas zurück liefert.
- Übersetzung der Beschreibung von Dialogen mit der Funktion m(key), wenn m(key) etwas zurück liefert.
- Übersetzung der Beschreibung von Eingaben mit der Funktion m(key), wenn m(key) etwas zurück liefert.
- Übersetzung der Werte von Multiple Choice Eingaben mit der Funktion m(key), wenn m(key) etwas zurück liefert und Rückübersetzung des gewählten Wertes, so dass immer key zurückgeliefert wird.

Hier der Code und im Anhang Urwigo-Datei und Lua-Code

Code:
urwigoMessageBox = _Urwigo.MessageBox
urwigoDialog = _Urwigo.Dialog
urwigoOldDialog = _Urwigo.OldDialog
urwigoGetInput = Wherigo.GetInput

 _Urwigo.MessageBox = function (arg1, arg2, arg3, arg4)
  -- Define local variables
  local text, mediaObj, idxMediaObj, callback, wrapper, buttons, btn1Label, btn2Label = nil, nil, nil, nil, nil, nil, nil, nil
  -- Cjeck, if MessageBox is called with a table or distinct arguments
  if type(arg1) == "table" then
    -- MessageBox is called with a table as argument
    text = arg1.Text or "Generic MessageBox"
    mediaObj = arg1.Media or nil
    if not arg1.Buttons or arg1.Buttons == nil then
      buttons = {Env.Ok}
    else
      buttons = arg1.Buttons
    end
    callback = arg1.Callback or nil
  else
    -- MessageBox is called with distinct arguments
    text = arg1 or "Generic MessageBox"
    mediaObj = arg2 or nil
    if not arg3 then
      buttons = {Env.Ok}
    end
    callback = arg4 or nil
  end
  -- Now we have text, media, buttons and callback
  -- Check, if there is a translation for text
  if m(text) ~= nil then
    text = m(text)
  end
  -- Check, if there is one or more buttons
    if type(buttons) == "table" then
      -- Exists button[1]
      if buttons[1] ~= nil then
        -- Exists a variable with name button[1]
        if m(buttons[1]) ~= nil then
          -- Yes, than text of btn1Label is content of this variable
          btn1Label = m(buttons[1])
        else
          -- No, than text of btn1Label is button[1]
          btn1Label = buttons[1]
        end
      end
      -- Exists button[2]
      if buttons[2] ~= nil then
        -- Exists a variable with name button[2]
        if m(buttons[2]) ~= nil then
          -- Yes, than text of btn2Label is content of this variable
          btn2Label = m(buttons[2])
        else
          -- No, than text of btn1Label is button[2]
          btn2Label = buttons[2]
        end
      end
    end
    urwigoMessageBox({Text=text, Media=mediaObj, Buttons={btn1Label, btn2Label}, Callback=callback})
end

function _Urwigo.Dialog(buffered, tbl, callback)
  -- For each entry in dialog list
  for k, v in ipairs(tbl) do
    -- If there is a translation for the Text
    if m(v.Text) ~= nil then
      -- Replace it with the translation
      v.Text = m(v.Text)
    end
  end
  -- Call original dialog function
  urwigoDialog(buffered, tbl, callback)
end

function _Urwigo.OldDialog(tbl)
  -- For each entry in dialog list
  for k, v in ipairs(tbl) do
    -- If there is a translation for the Text
    if m(v.Text) ~= nil then
      -- Replace it with the translation
      v.Text = m(v.Text)
    end
  end
  -- Call original dialog function
  urwigoOldDialog(tbl)
end

function Wherigo.GetInput(input)
  if input ~= nil then
    -- Replace text
    if m(input.Text) ~= nil then
      input.Text = m(input.Text)
    end
    -- Replace only multiple choices
    if input.InputType == "MultipleChoice" then
      -- Create a table for the new choices
      newChoices = {}
      newTranslation = {}
      -- Go over all choices
      for k, v in ipairs(input.Choices) do
        -- If translation exists
        if m(v) ~= nil then
          -- Use translation
          table.insert(newChoices, m(v))
          newTranslation[m(v)] = v
        else
          -- Use original text 
          table.insert(newChoices, v)
          newTranslation[v] = v
        end
      end
      -- Replace old choices with new choices
      input.Choices = newChoices
      -- Save translations and original for later use
      input.Translation = newTranslation
      -- Save original OnGetInput for later use
      input.OnGetInputOld = input.OnGetInput
      -- Replace OnGetInput with a version, which back translate the result
      input.OnGetInput = function (self, input)
                           if input ~= nil then
                             input = self.Translation[input]
                           end
                           self.OnGetInputOld(self, input)
                         end
    end
  end
  -- Call original GetInput
  urwigoGetInput(input)
end

function m(text)
  return "m("..text..")="..text
end
Funktion m am Ende nur zu Testzwecken eingefügt. Muss natürlich durch die korrekte ersetzt werden.

Man kann natürlich nicht nur mit Krolocks Übersetzungs Toll nutzen, sondern auch mit anderen. Ich bevorzuge z.B. die Texte normal einzugeben und die verschiedenen Sprachen durch "@@" zu trennen. Damit bleibt alles an Ort und Stelle und man muss nicht immer hin und her springen. Dafür kann man Krlocks Variante schnelle anch außen zum Übersetzen geben.

Noch weitere Probleme? :D
 

Anhänge

  • MessageBox.zip
    7,5 KB · Aufrufe: 6
OP
wendenzo

wendenzo

Geocacher
War ich zuvor schon sehr beeindruckt, so bin ich jetzt schon fast aus dem Häuschen :D . Während ich noch versuche den letzten Codeschnipsel durchzugehen, um ihn halbwegs nachvollziehen zu können wird hier weiterer Code, quasi am Fließband produziert. Hut ab vor dieser Leistung und vielen Dank!!

Dein zuletzt geposteter Code läuft prima und setzt all meine "Wünsche" um. Ich habe noch nicht alles getestet, aber die Übersetzungen der von Mehrfacheeingaben (MultipleChoice) finde ich echt Klasse ...

Also, vielen Dank nochmal
 

Charlenni

Geomaster
Eine Frage habe ich noch abschließend: mit welchen Geräten hast Du die Cartridge getestet? Eventuell sollte man noch das eine oder andere probieren. Man weiß ja nie :roll:
 
OP
wendenzo

wendenzo

Geocacher
Ich habe bis jetzt nur mit dem Urwigo Simulator getestet. Werde das demnächst noch mit Android/WhereYouGo und einem Garmin Exoten nämlich dem Nüvi 550 testen. Sobald ich die Ergebnisse habe poste ich sie hier.
 
OP
wendenzo

wendenzo

Geocacher
Habe heute den Code etwas getestet.

Funktioniert ohne Abstürze auf Android/WhereYouGo und auf meinem GARMIN NÜVI 550.

Noch eine Kleinigkeit möchte ich erwähnen, nur weil es mir auffällt: Die Buttons von Dialogboxen werden nicht übersetzt. Ich selbst komme mit MessageBoxen gut aus, aber vielleicht willst du das zwecks Vollständigkeit noch einfügen :roll: ?

Vielen Dank nochmal von meiner Seite für deine umgehende Hilfe
 
OP
wendenzo

wendenzo

Geocacher
Ein kleiner Rückschlag: Irgendetwas in diesem Zusammenhang funktioniert wohl nicht auf dem Iphone-Player. NAch einer korrekten Eingabe des Spielers müsste eine MessageBox erscheinen, allerdings bringt das Iphone folgenden Error: Type not implemented.

Error.jpg

kann es sein, dass Iphone auch folgende Einträge nicht mag?

Befehl.Name.jpg

Task.Name.jpg

dabei liefert die funktion m einen String zurück. Simulationsschutz ist ein Gegenstand ...
während beim Simulator, WhereYouGo und Garmin der Task.Name geändert wird kommt beim Iphon "nil" zutage.

Leider besitze ich selbt kein Iphone und kann das selbst nicht intensiver testen, diese Informationen habe ich von Geocachern, die meinen letzten Wherigo mit Iphone probiert haben, und leider nicht weiter kamen.
 
OP
wendenzo

wendenzo

Geocacher
ich habe jetzt die Bestätigung, dass meine Cartride ohne den "Buttonsersetzcode" auf dem Iphone läuft. Dann muss ich die Überstzung für Iphone wohl ausklammern, oder kann man am Code noch etwas machen?
 

Charlenni

Geomaster
Hier wäre es natürlich hilfreich, den Originalquellcode zu sehen. Wäre es möglich, den Link zur Cartridge zu erhalten?

Bezüglich der Übersetzung der Buttons von Dialogen: normalerweise haben Dialoge nur einen Ok-Button. Meinst Du den?
 
OP
wendenzo

wendenzo

Geocacher
Link zur Cartdrigde: Little towers
eventuell kann ich dir auch das Urwigo-Projekt schicken, falls es hilfreich sein sollte ...


bezüglich der Buttons von Dialogboxen siehe:

Dialog mit 2 Buttons.jpg
 
Oben