Blockstruktur in JSON

In diesem Dokument erfahren Sie, wie Sie mit JSON die Eingaben, Felder (einschließlich Labels) und Verbindungen in Ihrem Block definieren. Wenn Sie mit diesen Begriffen nicht vertraut sind, lesen Sie den Hilfeartikel Anatomie eines Blocks, bevor Sie fortfahren.

Sie können Eingaben, Felder und Verbindungen auch in JavaScript definieren.

Übersicht

In JSON wird die Struktur eines Blocks mit einem oder mehreren Nachrichtenstrings (message0, message1, ...) und den entsprechenden Argumentenarrays (args0, args1, ...) beschrieben. Nachrichtenstrings bestehen aus Text, der in Labels umgewandelt wird, und Interpolationstokens (%1, %2, ...), die die Positionen von Verbindungen und Feldern ohne Label markieren. In den Argumentenarrays wird beschrieben, wie mit den Interpolationstokens umgegangen werden soll.

Beispiel:

wird durch die folgende JSON-Datei definiert:

JSON

{
  "message0": "set %1 to %2",
  "args0": [
    {
      "type": "field_variable",
      "name": "VAR",
      "variable": "item",
      "variableTypes": [""]
    },
    {
      "type": "input_value",
      "name": "VALUE"
    }
  ]
}

Das erste Interpolationstoken (%1) steht für ein Variablenfeld (type: "field_variable"). Es wird durch das erste Objekt im args0-Array beschrieben. Das zweite Token (%2) steht für die Eingabeverbindung am Ende einer Werteingabe (type: "input_value"). Es wird durch das zweite Objekt im args0-Array beschrieben.

Nachrichten und Eingaben

Wenn ein Interpolationstoken eine Verbindung markiert, markiert es tatsächlich das Ende der Eingabe, die die Verbindung enthält. Das liegt daran, dass die Verbindungen in Wert- und Anweisungseingaben am Ende der Eingabe gerendert werden. Die Eingabe enthält alle Felder (einschließlich Labels) nach der vorherigen Eingabe bis zum aktuellen Token. In den folgenden Abschnitten werden Beispielnachrichten und die daraus erstellten Eingaben angezeigt.

Beispiel 1

JSON

{
  "message0": "set %1 to %2",
  "args0": [
    {"type": "field_variable", ...} // token %1
    {"type": "input_value", ...}    // token %2
  ],
}

Dadurch wird eine Eingabe für einen einzelnen Wert mit drei Feldern erstellt: ein Label ("set"), ein variables Feld und ein weiteres Label ("to").

Ordnen Sie die Nachricht „set %1 to %2“ einer Werteingabe mit drei Feldern zu.

Beispiel 2

JSON

{
  "message0": "%1 + %2",
  "args0": [
    {"type": "input_value", ...} // token %1
    {"type": "input_value", ...} // token %2
  ],
}

Dadurch werden zwei Werteingaben erstellt. Die erste hat keine Felder und die zweite ein Feld ("+").

Ordnen Sie die Nachricht „%1 + %2“ zwei Wertinputs zu.

Beispiel 3

JSON

{
  "message0": "%1 + %2 %3",
  "args0": [
    {"type": "input_value", ...}   // token %1
    {"type": "input_end_row", ...} // token %2
    {"type": "input_value", ...}   // token %3
  ],
}

Dadurch wird Folgendes erreicht:

  • Eine Werteingabe ohne Felder,
  • Eine Eingabe am Ende der Zeile mit einem Labelfeld ("+"), wodurch die folgende Werteingabe in einer neuen Zeile gerendert wird, und
  • Eine Werteingabe ohne Felder.

Ordnen Sie die Nachricht „%1 + %2 %3“ zwei Eingaben für Werte und einer Eingabe für das Ende der Zeile zu.

Dummy-Eingabe am Ende der Nachricht

Wenn Ihr message-String mit Text oder Feldern endet, müssen Sie der Dummy-Eingabe, die sie enthält, kein Interpolationstoken hinzufügen. Blockly fügt es für Sie hinzu. Anstatt einen lists_isEmpty-Block so zu definieren:

JSON

{
  "message0": "%1 is empty %2",
  "args0": [
    {"type": "input_value", ...} // token %1
    {"type": "input_dummy", ...} // token %2
  ],
}

Ordnen Sie die Meldung „%1 ist leer“ einer Werteingabe und einer automatisch erstellten Dummy-Eingabe zu.

Sie können Blockly die Dummy-Eingabe hinzufügen lassen und sie so definieren:

JSON

{
  "message0": "%1 is empty",
  "args0": [
    {"type": "input_value", ...} // token %1
  ],
}

Ordnen Sie die Meldung „%1 ist leer“ einer Werteingabe und einer automatisch erstellten Dummy-Eingabe zu.

Durch das automatische Hinzufügen einer Dummy-Eingabe am Ende können Übersetzer message ändern, ohne die Argumente ändern zu müssen, die die Interpolationstokens beschreiben. Weitere Informationen finden Sie unter Tokenreihenfolge für Interpolation.

implicitAlign

In seltenen Fällen muss die automatisch erstellte Dummy-Eingabe am Ende an "RIGHT" oder "CENTRE" ausgerichtet werden. Wenn keine Angabe erfolgt, ist der Standardwert "LEFT".

Im Beispiel unten ist message0 = "send email to %1 subject %2 secure %3" und Blockly fügt automatisch eine Dummy-Eingabe für die dritte Zeile hinzu. Wenn Sie implicitAlign0 auf "RIGHT" festlegen, wird diese Zeile rechtsbündig ausgerichtet.

implicitAlign gilt für alle Eingaben, die nicht explizit in der JSON-Blockdefinition definiert sind, einschließlich Eingaben am Ende einer Zeile, die Zeilenumbruchzeichen ('\n') ersetzen. Es gibt auch das nicht mehr unterstützte Attribut lastDummyAlign0, das sich genauso verhält wie implicitAlign0.

Wenn Sie Blöcke für RTL-Sprachen (Arabisch und Hebräisch) entwerfen, sind links und rechts umgekehrt. Mit "RIGHT" werden Felder also links ausgerichtet.

Mehrere Nachrichten

Einige Blöcke sind natürlich in zwei oder mehr separate Teile unterteilt. Betrachten Sie diesen Wiederholungsblock mit zwei Zeilen:

Wenn dieser Block mit einer einzelnen Nachricht beschrieben würde, wäre die message0-Eigenschaft "repeat %1 times %2 do %3", wobei %2 einen Eingabewert für das Ende der Zeile darstellt. Dieser String ist für einen Übersetzer schwierig, da es schwer zu erklären ist, was die %2-Ersetzung bedeutet. In einigen Sprachen ist das Eingabezeichen für das Ende einer Zeile %2 möglicherweise nicht einmal erforderlich. Es kann auch mehrere Blöcke geben, die den Text der zweiten Zeile teilen sollen. Besser ist es, mehrere message- und args-Properties zu verwenden:

JSON

{
  "message0": "repeat %1 times",
  "args0": [
    {"type": "input_value", ...} // token %1 in message0
  ],
  "message1": "do %1",
  "args1": [
    {"type": "input_statement", ...} // token %1 in message1
  ],
}

Ordnen Sie die Nachricht „%1 Mal wiederholen“ einer Werteingabe und einer automatisch erstellten Dummy-Eingabe und die Nachricht „%1 ausführen“ einer Anweisungs-Eingabe zu.

Im JSON-Format können beliebig viele message-, args- und implicitAlign-Properties definiert werden, beginnend mit 0 und fortlaufend inkrementiert. Die Block Factory kann Nachrichten nicht in mehrere Teile aufteilen. Das ist aber ganz einfach manuell möglich.

Interpolationstokenreihenfolge

Wenn Sie Blöcke lokalisieren, müssen Sie möglicherweise die Reihenfolge der Interpolationstokens in einer Nachricht ändern. Das ist besonders wichtig in Sprachen, die eine andere Wortstellung als das Englische haben. Wir haben beispielsweise mit einem Block begonnen, der durch die Nachricht "set %1 to %2" definiert ist:

Stellen Sie sich nun eine hypothetische Sprache vor, in der "set %1 to %2" umgekehrt ausgesprochen werden muss, um "put %2 in %1" zu sagen. Wenn Sie die Nachricht ändern (einschließlich der Reihenfolge der Interpolationstokens) und das Arguments-Array unverändert lassen, erhalten Sie den folgenden Block:

Blockly hat automatisch die Reihenfolge der Felder geändert, eine Dummy-Eingabe erstellt und von externen zu internen Eingaben gewechselt.

Die Möglichkeit, die Reihenfolge der Interpolationstokens in einer Nachricht zu ändern, erleichtert die Lokalisierung. Weitere Informationen finden Sie unter JSON-Nachrichteninterpolation.

Textverarbeitung

Text auf beiden Seiten eines Interpolationstokens wird an den Leerzeichen zugeschnitten. Wenn in Text das Zeichen % verwendet wird (z.B. bei einem Prozentsatz), muss %% verwendet werden, damit es nicht als Interpolationstoken interpretiert wird.

Blockly ersetzt außerdem automatisch jedes Zeilenumbruchzeichen (\n) im Nachrichtenstring durch eine Eingabe für das Ende der Zeile.

JSON

{
  "message0": "set %1\nto %2",
  "args0": [
    {"type": "field_variable", ...}, // token %1
    {"type": "input_value", ...},    // token %2
  ]
}

Ordnen Sie das Zeilenumbruchzeichen in „set %1\nto %2“ einer Eingabe für das Zeilenende zu.

Argument-Arrays

Jeder Nachrichtenstring ist mit einem args-Array mit derselben Nummer gekoppelt. Beispiel: message0 passt zu args0. Die Interpolationstokens (%1, %2, ...) beziehen sich auf die Elemente des args-Arrays und müssen genau mit dem args0-Array übereinstimmen: keine Duplikate, keine Auslassungen. Tokennummern beziehen sich auf die Reihenfolge der Elemente im Argument-Array. Sie müssen nicht in der richtigen Reihenfolge in einem Nachrichtenstring vorkommen.

Jedes Objekt im Arguments-Array hat einen type-String. Die übrigen Parameter variieren je nach Typ:

Sie können auch eigene benutzerdefinierte Felder und benutzerdefinierte Eingaben definieren und als Argumente übergeben.

Alt-Felder

Jedes Objekt kann auch ein alt-Feld haben. Wenn Blockly die type des Objekts nicht erkennt, wird an ihrer Stelle das alt-Objekt verwendet. Wenn Blockly beispielsweise ein neues Feld mit dem Namen field_time hinzugefügt wird, können Blöcke, die dieses Feld verwenden, alt verwenden, um einen field_input-Fallback für ältere Blockly-Versionen zu definieren:

JSON

{
  "message0": "sound alarm at %1",
  "args0": [
    {
      "type": "field_time",
      "name": "TEMPO",
      "hour": 9,
      "minutes": 0,
      "alt":
        {
          "type": "field_input",
          "name": "TEMPOTEXT",
          "text": "9:00"
        }
    }
  ]
}

Ein alt-Objekt kann ein eigenes alt-Objekt haben, was eine Verknüpfung ermöglicht. Wenn Blockly kein Objekt im args0-Array erstellen kann (nachdem alle alt-Objekte versucht wurden), wird dieses Objekt einfach übersprungen.