W tym dokumencie omawiamy sposób definiowania w formacie JSON danych wejściowych, pól (w tym etykiet) i połączeń w bloku. Jeśli nie znasz tych terminów, przeczytaj artykuł Anatomia bloku.
Dane wejściowe, pola i połączenia możesz też definiować w JavaScriptzie.
Omówienie
W formacie JSON strukturę bloku opisuje się za pomocą co najmniej jednego ciągu komunikatu (message0
, message1
, itd.) i odpowiednich tablic argumentów (args0
,
args1
, itd.). Ciągi komunikatu składają się z tekstu, który jest konwertowany na etykiety, oraz symboli zastępczych (%1
, %2
, itd.), które oznaczają lokalizacje połączeń i pól innych niż etykiety. Tablice argumentów opisują sposób obsługi tokenów interpolacji.
Na przykład ten blok:
jest zdefiniowany za pomocą tego kodu JSON:
JSON
{
"message0": "set %1 to %2",
"args0": [
{
"type": "field_variable",
"name": "VAR",
"variable": "item",
"variableTypes": [""]
},
{
"type": "input_value",
"name": "VALUE"
}
]
}
Pierwszy element zastępczy (%1
) reprezentuje zmienną (type: "field_variable"
). Jest on opisany przez pierwszy obiekt w tablicy args0
. Drugi token (%2
) reprezentuje połączenie wejściowe na końcu wejścia wartości (type: "input_value"
). Jest ono opisane przez drugi obiekt w tablicy args0
.
Wiadomości i dane wejściowe
Gdy token interpolacji oznacza połączenie, oznacza to, że zaznacza koniec danych wejściowych zawierających to połączenie. Dzieje się tak, ponieważ połączenia w wartościach i danych wejściowych instrukcji są renderowane na końcu danych wejściowych. Dane wejściowe zawierają wszystkie pola (w tym etykiety) po poprzednim wejściu i do bieżącego tokena. W następnych sekcjach znajdziesz przykładowe wiadomości i dane wejściowe, które są na ich podstawie tworzone.
Przykład 1
JSON
{
"message0": "set %1 to %2",
"args0": [
{"type": "field_variable", ...} // token %1
{"type": "input_value", ...} // token %2
],
}
Spowoduje to utworzenie pojedynczego wejścia wartości z 3 polami: etykietą ("set"
), zmiennym polem i inną etykietą ("to"
).
Przykład 2
JSON
{
"message0": "%1 + %2",
"args0": [
{"type": "input_value", ...} // token %1
{"type": "input_value", ...} // token %2
],
}
Spowoduje to utworzenie 2 wartości danych wejściowych. Pierwszy nie ma pól, a drugi ma jedno pole ("+"
).
Przykład 3
JSON
{
"message0": "%1 + %2 %3",
"args0": [
{"type": "input_value", ...} // token %1
{"type": "input_end_row", ...} // token %2
{"type": "input_value", ...} // token %3
],
}
Spowoduje to:
- wartość bez pól,
- wartość na końcu wiersza z polem etykiety (
"+"
), która powoduje, że następna wartość wejściowa jest renderowana w nowym wierszu; - Wartość bez pól.
Dummy input at end of message
Jeśli ciąg message
kończy się tekstem lub polami, nie musisz dodawać tokenu zastępczego dla danych typu dummy, które je zawierają – Blockly doda go za Ciebie. Zamiast definiowania bloku lists_isEmpty
w ten sposób:
JSON
{
"message0": "%1 is empty %2",
"args0": [
{"type": "input_value", ...} // token %1
{"type": "input_dummy", ...} // token %2
],
}
możesz pozwolić Blockly dodać fikcyjne dane wejściowe i zdefiniować je w ten sposób:
JSON
{
"message0": "%1 is empty",
"args0": [
{"type": "input_value", ...} // token %1
],
}
Automatyczne dodawanie podrzędnego fikcyjnego wejścia umożliwia tłumaczom zmianę wartości message
bez konieczności modyfikowania argumentów opisujących tokeny interpolacji. Więcej informacji znajdziesz w artykule na temat kolejności tokenów interpolacji.
implicitAlign
W rzadkich przypadkach automatycznie utworzone końcowe dane zastępcze trzeba dopasować do wartości "RIGHT"
lub "CENTRE"
. Jeśli nie podasz żadnej wartości, zostanie użyta wartość domyślna "LEFT"
.
W przykładzie poniżej message0
to "send email to %1 subject %2 secure %3"
, a Blockly automatycznie dodaje fikcyjne dane do trzeciego wiersza. Ustawienie implicitAlign0
na "RIGHT"
powoduje wyrównanie tego wiersza do prawej.
implicitAlign
dotyczy wszystkich danych wejściowych, które nie są jawnie zdefiniowane w definicji bloku JSON, w tym danych wejściowych na końcu wiersza, które zastępują znaki końca wiersza ('\n'
). Dostępna jest też przestarzała właściwość lastDummyAlign0
, która działa tak samo jak implicitAlign0
.
Podczas projektowania bloków na potrzeby języków z zapisem od prawej do lewej (arabski i hebrajski) lewo i prawo są odwrócone.
W związku z tym "RIGHT"
wyrówna pola do lewej.
Wiele wiadomości
Niektóre bloki są naturalnie podzielone na 2 lub więcej oddzielnych części. Weź pod uwagę ten blok powtórzeń, który ma 2 wiersze:
Gdyby ten blok był opisany za pomocą jednej wiadomości, właściwość message0
miałaby wartość "repeat %1 times %2 do %3"
, gdzie %2
oznaczałaby dane wejściowe na końcu wiersza. Ten ciąg tekstowy jest niewygodny dla tłumacza, ponieważ trudno wyjaśnić, co oznacza zastąpienie %2
. W niektórych językach dane w kolumnie %2
mogą być nieprzydatne. Może też być wiele bloków, które chcą udostępnić tekst drugiego wiersza. Lepszym rozwiązaniem jest użycie więcej niż 1 właściwości message
i 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
],
}
W formacie JSON można zdefiniować dowolną liczbę właściwości message
, args
i implicitAlign
, zaczynając od 0 i zwiększając kolejno o 1. Pamiętaj, że narzędzie Block Factory nie umożliwia dzielenia wiadomości na kilka części, ale można to zrobić ręcznie.
kolejność tokenów interpolacji,
Podczas lokalizacji bloków może być konieczna zmiana kolejności tokenów interpolacji w wiadomości. Jest to szczególnie ważne w przypadku języków, w których kolejność słów jest inna niż w języku angielskim. Na przykład zaczęliśmy od blokady zdefiniowanej przez wiadomość "set %1 to %2"
:
Teraz rozważ hipotetyczny język, w którym "set %1 to %2"
musi być odwrócone, aby brzmiało "put %2 in %1"
. Zmiana wiadomości (w tym kolejności symboli zastępczych) i niezmienianie tablicy argumentów powoduje powstanie tego bloku:
Blockly automatycznie zmienił kolejność pól, utworzył fikcyjne dane wejściowe i przełączył się z zewnętrznych na wewnętrzne dane wejściowe.
Możliwość zmiany kolejności tokenów interpolacji w wiadomości ułatwia lokalizację. Więcej informacji znajdziesz w artykule Interpolacja wiadomości JSON.
Obsługa tekstu
Tekst po obu stronach tokena interpolacji jest przycinany do spacji.
Tekst zawierający znak %
(np. odwołujący się do procentu) powinien zawierać znak %%
, aby nie był interpretowany jako element interpolacji.
Blockly automatycznie zastępuje też w ciągu wiadomości znak nowej linii (\n
) danymi wejściowymi końca wiersza.
JSON
{
"message0": "set %1\nto %2",
"args0": [
{"type": "field_variable", ...}, // token %1
{"type": "input_value", ...}, // token %2
]
}
Tablice argumentów
Każdy ciąg znaków jest sparowany z tablicą args
o tej samej liczbie. Na przykład message0
pasuje do args0
. Elementy zastępcze (%1
, %2
, itd.) odnoszą się do elementów tablicy args
i muszą być w pełni zgodne z tabelą args0
: bez duplikatów i pominięć. Numery tokenów odnoszą się do kolejności elementów w tablicy argumentów. Nie muszą one występować w kolejności w ciągu znaków wiadomości.
Każdy obiekt w tablicy argumentów ma ciąg znaków type
. Pozostałe parametry różnią się w zależności od typu:
- Pola:
- Dane wejściowe:
input_value
input_statement
input_dummy
input_end_row
Możesz też zdefiniować własne pola niestandardowe i niestandardowe dane wejściowe oraz przekazać je jako argumenty.
pola alt
Każdy obiekt może też mieć pole alt
. Jeśli Blockly nie rozpoznaje atrybutu type
obiektu, zamiast niego używa obiektu alt
. Jeśli na przykład do Blockly zostanie dodane nowe pole o nazwie field_time
, bloki korzystające z tego pola mogą używać wartości alt
, aby zdefiniować wartość zastępczą field_input
dla starszych wersji Blockly:
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"
}
}
]
}
Obiekt alt
może mieć własny obiekt alt
, co umożliwia łańcuchowanie.
Jeśli w ramach tablicy args0
Blockly nie może utworzyć obiektu (po próbie utworzenia obiektu alt
), to po prostu go pomija.