Lokalizowanie bloków

Blockly obsługuje definicje bloków, które można zlokalizować na język użytkownika. Dzięki tabelom z ciągami znaków ciągi komunikatów w definicji bloku JSON mogą dostosowywać dane wejściowe, pola i etykiety do słownictwa, kolejności słów i kierunku języka.

list_Powtórz blok po angielsku listy_Powtórz blok po hiszpańsku Listy_powtarzające się blok po koreańsku Listy_powtarzające się bloki w języku arabskim od prawej do lewej

Wszystkie te przypadki mają tę samą definicję bloku JSON:

// Block for creating a list with one element repeated.
{
  "type": "lists_repeat",
  "message0": "%{BKY_LISTS_REPEAT_TITLE}",
  "args0": [
    {
      "type": "input_value",
      "name": "ITEM"
    },
    {
      "type": "input_value",
      "name": "NUM",
      "check": "Number"
    }
  ],
  "output": "Array",
  "colour": "%{BKY_LISTS_HUE}",
  "tooltip": "%{BKY_LISTS_REPEAT_TOOLTIP}",
  "helpUrl": "%{BKY_LISTS_REPEAT_HELPURL}"
}

Tabela ciągów znaków

Przykład lists_repeat zawiera kilka ciągów tekstowych "%{BKY_...}". Każdy z tych elementów jest odwołaniem do ciągu znaków w tabeli Blockly.Msg. Po utworzeniu wystąpienia blokady Blockly próbuje zastąpić ciąg wartością.

Na przykład ciąg %{BKY_LISTS_REPEAT_TITLE} jest zastępowany wartością Blockly.Msg['LISTS_REPEAT_TITLE'] (jeśli istnieje). Jeśli wartość nie istnieje, zapis %{BKY_...} pozostaje bez zmian, a blockly wyświetla ostrzeżenie o brakującym tłumaczeniu.

Jak widać na przykładzie, zapis działa w kilku lokalizacjach. Wiadomości i etykiety umożliwiają zastępowanie ciągów widocznych dla użytkowników. Podobnie pola menu mogą używać zapisu tekstowego elementu. Adres URL pomocy można zlokalizować, aby mieć pewność, że użytkownik będzie kierowany na podobnie zlokalizowaną stronę. Dodatkowo wartość colour może wykorzystać zapis do scentralizowania palety bloków.

Jeśli korzystasz z implementacji JavaScriptu i nie spodziewasz się zmiany języka użytkownika w czasie działania, łatwiejszym rozwiązaniem może być użycie bezpośredniego odwołania. Na przykład Blockly.Msg['LISTS_REPEAT_TITLE'] lub Blockly.Msg.LISTS_REPEAT_TITLE'.

Tabele z ciągami znaków są wczytywane za pomocą dowolnego z plików .js określonych dla danego języka w msg/js. Aby wczytać prawidłowe tłumaczenie blokowe, wczytaj na swojej stronie internetowej odpowiedni plik.

Interpolacja wiadomości JSON

Atrybut message0 (oraz message1, message2 itp.) określa dane wejściowe, pola i otaczający tekst etykiety. Dla pola LISTS_REPEAT_TITLE w bloku lists_repeat wartość w języku angielskim to:

Blockly.Msg.LISTS_REPEAT_TITLE = 'create list with item %1 repeated %2 times';

Dwa znaczniki interpolacji: %1 i %2, wskazują lokalizacje obu rodzajów danych wejściowych. Więcej informacji można znaleźć w tablicy args0. args1 odpowiada ciągowi znaków message1. Więcej informacji o określaniu danych wejściowych i pól bloków znajdziesz w przewodniku Tworzenie bloków niestandardowych.

Tekst między znacznikami interpolacji jest konwertowany na nienazwane pola etykiet. W ten sposób powstaje blok słów (w języku angielskim) i jak wygląda zapis:

// In Spanish
Blockly.Msg.LISTS_REPEAT_TITLE = "crear lista con el elemento %1 repetido %2 veces";
// In Korean
Blockly.Msg.LISTS_REPEAT_TITLE = "%1을 %2번 넣어, 리스트 생성";

Przy tłumaczeniu na języki pisane od prawej do lewej ciąg komunikatu jest zapisywany w kolejności wizualnej i nie powinien zawierać poleceń kierunku Unicode:

// In Arabic. Note how %2 is left of %1, since it read right to left.
Blockly.Msg.LISTS_REPEAT_TITLE = "إنشئ قائمة مع العنصر  %1 %2 مرات";

Ponowna kompilacja tabel ciągów znaków

Tworzenie plików .js tabeli z ciągami znaków jest częścią skryptu build:langfiles. Skrypt pobiera klucze identyfikatorów i tłumaczenia na język angielski z msg/messages.js, aby utworzyć nowe en.json. Następnie w połączeniu z tłumaczeniami znalezionymi w pozostałych plikach JSON utworzy ponownie zaktualizowane tabele ciągu znaków JavaScript we wszystkich językach, w tym nową en.js.

Pliki JSON w języku innym niż angielski pochodzą od partnerów z TranslateWiki. Szczegółowe informacje o tym, jak możesz pomóc, znajdziesz w uwagach na temat tłumaczenia.