本文將說明如何使用 JSON 定義區塊中的輸入內容、欄位 (包括標籤) 和連線。如果您不熟悉這些字詞,請先參閱「區塊剖析」,再繼續操作。
您也可以在 JavaScript 中定義輸入內容、欄位和連線。
總覽
在 JSON 中,您可以使用一或多個訊息字串 (message0、message1...) 和對應的引數陣列 (args0、args1...),描述區塊的結構。訊息字串包含文字 (會轉換為標籤) 和插補權杖 (%1、%2...),用於標示連結和非標籤欄位的位置。引數陣列說明如何處理插補權杖。
舉例來說,這個區塊:

定義如下列 JSON:
JSON
{
"message0": "set %1 to %2",
"args0": [
{
"type": "field_variable",
"name": "VAR",
"variable": "item",
"variableTypes": [""]
},
{
"type": "input_value",
"name": "VALUE"
}
]
}
第一個插補權杖 (%1) 代表變數欄位 (type: "field_variable"),由 args0 陣列中的第一個物件說明。第二個符記 (%2) 代表值輸入 (type: "input_value") 結尾的輸入連線。它是由 args0 陣列中的第二個物件描述。
訊息和輸入法
當插補權杖標記連線時,實際上是標記包含連線的輸入內容結尾。這是因為值和陳述式輸入內容中的連線會在輸入內容結尾算繪。輸入內容包含先前輸入內容之後的所有欄位 (包括標籤),以及目前的權杖。以下各節顯示範例訊息,以及從這些訊息建立的輸入內容。
範例 1
JSON
{
"message0": "set %1 to %2",
"args0": [
{"type": "field_variable", ...} // token %1
{"type": "input_value", ...} // token %2
],
}
這會建立含有三個欄位的單一值輸入內容:標籤 ("set")、變數欄位和另一個標籤 ("to")。

範例 2
JSON
{
"message0": "%1 + %2",
"args0": [
{"type": "input_value", ...} // token %1
{"type": "input_value", ...} // token %2
],
}
這會建立兩個值輸入。第一個沒有欄位,第二個則有一個欄位 ("+")。

範例 3
JSON
{
"message0": "%1 + %2 %3",
"args0": [
{"type": "input_value", ...} // token %1
{"type": "input_end_row", ...} // token %2
{"type": "input_value", ...} // token %3
],
}
這會建立:
- 輸入值,但沒有任何欄位,
- 列尾輸入
含有標籤欄位 (
"+"),導致後續的值輸入在新的資料列上算繪,以及 - 輸入值,但沒有欄位。

訊息結尾的虛擬輸入內容
如果 message 字串結尾是文字或欄位,您不需要為包含這些項目的虛擬輸入內容新增插補符記,Blockly 會為您新增。舉例來說,您不應像這樣定義 lists_isEmpty 區塊:
JSON
{
"message0": "%1 is empty %2",
"args0": [
{"type": "input_value", ...} // token %1
{"type": "input_dummy", ...} // token %2
],
}

您可以讓 Blockly 新增虛擬輸入內容,並按照下列方式定義:
JSON
{
"message0": "%1 is empty",
"args0": [
{"type": "input_value", ...} // token %1
],
}

系統會自動新增尾端虛擬輸入內容,讓譯者變更 message,不必修改描述插補權杖的引數。詳情請參閱「插補權杖順序」。
implicitAlign
在極少數情況下,自動建立的尾端虛設輸入內容需要與 "RIGHT" 或 "CENTRE" 對齊。如未指定,則預設為 "LEFT"。
在下方範例中,message0 是 "send email to %1 subject %2 secure %3",Blockly 會自動為第三列新增虛擬輸入內容。將 implicitAlign0 設為 "RIGHT",即可強制將這一列靠右對齊。

implicitAlign
適用於 JSON 區塊定義中未明確定義的所有輸入內容,包括取代換行字元 ('\n') 的列尾輸入內容。此外,已淘汰的 lastDummyAlign0 屬性與 implicitAlign0 的行為相同。
為 RTL (阿拉伯文和希伯來文) 設計區塊時,左右兩側會顛倒。因此 "RIGHT" 會將欄位靠左對齊。
多則訊息
有些方塊自然會分成兩個或多個獨立部分。 請參考這個有兩列的重複區塊:

如果以單一訊息描述這個區塊,message0 屬性會是 "repeat %1 times %2 do %3",其中 %2 代表列尾輸入內容。對譯者來說,這個字串很難處理,因為很難說明 %2 替代項的意義。在某些語言中,可能也不需要輸入 %2 列尾。且可能有多個區塊想共用第二列的文字。建議使用多個 message 和 args 屬性:
JSON
{
"message0": "repeat %1 times",
"args0": [
{"type": "input_value", ...} // token %1 in message0
],
"message1": "do %1",
"args1": [
{"type": "input_statement", ...} // token %1 in message1
],
}

JSON 格式中可定義任意數量的 message、args 和 implicitAlign 屬性,從 0 開始依序遞增。請注意,Block Factory 無法將訊息分割成多個部分,但手動分割訊息很簡單。
內插權杖順序
在本地化區塊時,您可能需要變更訊息中插補權杖的順序。如果語言的字序與英文不同,這點就格外重要。舉例來說,我們從訊息 "set %1 to %2" 定義的區塊開始:

現在假設有一種語言需要反轉 "set %1 to %2" 才能說出 "put %2 in %1"。變更訊息 (包括插補符記的順序),但保持引數陣列不變,會產生下列區塊:

Blockly 自動變更了欄位的順序、建立虛擬輸入,並從外部輸入切換為內部輸入。
您可以變更訊息中插補權杖的順序,方便進行本地化。詳情請參閱 JSON 訊息插補。
文字處理
插補權杖兩側的文字會經過空白字元修剪。
使用 % 字元的文字 (例如指稱百分比時) 應使用 %%,以免系統將其解讀為插補權杖。
Blockly 也會自動將訊息字串中的任何換行字元 (\n) 替換為列尾輸入內容。
JSON
{
"message0": "set %1\nto %2",
"args0": [
{"type": "field_variable", ...}, // token %1
{"type": "input_value", ...}, // token %2
]
}

引數陣列
每個訊息字串都會配對相同數量的 args 陣列。例如,message0 會與 args0 彙整。插補權杖 (%1、%2 等) 是指 args 陣列的項目,且必須與 args0 陣列完全相符:不得重複,也不得省略。權杖編號是指引數陣列中項目的順序,訊息字串中的權杖編號不一定要依序出現。
引數陣列中的每個物件都有 type 字串。其餘參數則視類型而異:
替代欄位
每個物件也可能會有 alt 欄位。如果 Blockly 無法辨識物件的 type,則會改用 alt 物件。舉例來說,如果將名為 field_time 的新欄位新增至 Blockly,使用這個欄位的方塊可以利用 alt,為舊版 Blockly 定義 field_input 回溯:
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"
}
}
]
}
alt 物件可能會有自己的 alt 物件,因此允許鏈結。最後,如果 Blockly 無法在 args0 陣列中建立物件 (嘗試任何 alt 物件後),系統就會略過該物件。