本文將說明如何使用 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
物件後),系統就會略過該物件。