mirror of
https://github.com/scratchfoundation/scratch-blocks.git
synced 2025-08-28 22:10:31 -04:00
Update scratch-l10n
* update to latest scratch-l10n, and use new script to push source files to transifex (removing unneeded local script) * update to latest translations.
This commit is contained in:
parent
2dae2f158a
commit
d78e2f750f
3 changed files with 34 additions and 85 deletions
|
@ -1,51 +0,0 @@
|
|||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* @fileoverview
|
||||
* Script to upload a source en.json file to a particular transifex project resource.
|
||||
* Expects that the project and resource have already been defined in Transifex, and that
|
||||
* the person running the script has the the TX_TOKEN environment variable set to an api
|
||||
* token that has developer access.
|
||||
*/
|
||||
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const transifex = require('transifex');
|
||||
|
||||
const args = process.argv.slice(2);
|
||||
|
||||
const usage = `
|
||||
Sync English source strings with Transifex. Usage:
|
||||
node sync_tx_src.js tx-project tx-resource english-json-file
|
||||
tx-project: the project slug on transifex
|
||||
tx-resource: the resource slug on transifex
|
||||
english-json-file: path to the en.json source
|
||||
NOTE: TX_TOKEN environment variable needs to be set with a Transifex API token. See
|
||||
the Localization page on the GUI wiki for information about setting up Transifex.
|
||||
`;
|
||||
|
||||
// Exit if missing arguments or TX_TOKEN
|
||||
if (args.length < 3 || !process.env.TX_TOKEN) {
|
||||
process.stdout.write(usage);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// Globals
|
||||
const PROJECT = args[0];
|
||||
const RESOURCE = args[1];
|
||||
const TX = new transifex({
|
||||
project_slug: PROJECT,
|
||||
credential: 'api:' + process.env.TX_TOKEN
|
||||
});
|
||||
|
||||
let en = fs.readFileSync(path.resolve(args[2]));
|
||||
en = JSON.parse(en);
|
||||
|
||||
// update Transifex with English source
|
||||
TX.uploadSourceLanguageMethod(PROJECT, RESOURCE, {content: JSON.stringify(en)}, (err, status) => {
|
||||
if (err) {
|
||||
console.error(err);
|
||||
process.exit(1);
|
||||
}
|
||||
process.exit(0);
|
||||
});
|
|
@ -2116,7 +2116,7 @@ Blockly.ScratchMsgs.locales["cy"] =
|
|||
"MOTION_POINTINDIRECTION": "pwyntio i gyfeiriad %1",
|
||||
"MOTION_POINTTOWARDS": "pwyntio tuag at %1",
|
||||
"MOTION_POINTTOWARDS_POINTER": "pwyntydd llygoden",
|
||||
"MOTION_POINTTOWARDS_RANDOM": "random direction",
|
||||
"MOTION_POINTTOWARDS_RANDOM": "cyfeiriad ar hap",
|
||||
"MOTION_GOTO": "mynd i %1",
|
||||
"MOTION_GOTO_POINTER": "pwyntydd llygoden",
|
||||
"MOTION_GOTO_RANDOM": "safle ar hap",
|
||||
|
@ -2402,7 +2402,7 @@ Blockly.ScratchMsgs.locales["da"] =
|
|||
"MOTION_POINTINDIRECTION": "peg i retning %1",
|
||||
"MOTION_POINTTOWARDS": "peg mod %1",
|
||||
"MOTION_POINTTOWARDS_POINTER": "musepil",
|
||||
"MOTION_POINTTOWARDS_RANDOM": "random direction",
|
||||
"MOTION_POINTTOWARDS_RANDOM": "tilfældig retning",
|
||||
"MOTION_GOTO": "gå til %1",
|
||||
"MOTION_GOTO_POINTER": "musepil",
|
||||
"MOTION_GOTO_RANDOM": "tilfældig position",
|
||||
|
@ -2688,7 +2688,7 @@ Blockly.ScratchMsgs.locales["de"] =
|
|||
"MOTION_POINTINDIRECTION": "setze Richtung auf %1 Grad",
|
||||
"MOTION_POINTTOWARDS": "drehe dich zu %1",
|
||||
"MOTION_POINTTOWARDS_POINTER": "Mauszeiger",
|
||||
"MOTION_POINTTOWARDS_RANDOM": "random direction",
|
||||
"MOTION_POINTTOWARDS_RANDOM": "zufällige Richtung",
|
||||
"MOTION_GOTO": "gehe zu %1",
|
||||
"MOTION_GOTO_POINTER": "Mauszeiger",
|
||||
"MOTION_GOTO_RANDOM": "Zufallsposition",
|
||||
|
@ -5452,8 +5452,8 @@ Blockly.ScratchMsgs.locales["gl"] =
|
|||
"CONTROL_STOP_THIS": "este programa",
|
||||
"CONTROL_STOP_OTHER": "outros programas na figura",
|
||||
"CONTROL_WAIT": "agardar %1 segundos",
|
||||
"CONTROL_WAITUNTIL": "agardar até %1",
|
||||
"CONTROL_REPEATUNTIL": "repetir até %1",
|
||||
"CONTROL_WAITUNTIL": "agardar ata %1",
|
||||
"CONTROL_REPEATUNTIL": "repetir ata %1",
|
||||
"CONTROL_WHILE": "mentres %1",
|
||||
"CONTROL_FOREACH": "para cada %1 en %2",
|
||||
"CONTROL_STARTASCLONE": "ao comezar como clon",
|
||||
|
@ -5464,8 +5464,8 @@ Blockly.ScratchMsgs.locales["gl"] =
|
|||
"CONTROL_INCRCOUNTER": "incrementar o contador",
|
||||
"CONTROL_CLEARCOUNTER": "limpar o contador",
|
||||
"CONTROL_ALLATONCE": "todo de vez",
|
||||
"DATA_SETVARIABLETO": "asignar a %1 o valor %2",
|
||||
"DATA_CHANGEVARIABLEBY": "sumarlle a %1 %2",
|
||||
"DATA_SETVARIABLETO": "asignar %2 a %1",
|
||||
"DATA_CHANGEVARIABLEBY": "sumarlle %2 a %1",
|
||||
"DATA_SHOWVARIABLE": "amosar a variábel %1",
|
||||
"DATA_HIDEVARIABLE": "agochar a variábel %1",
|
||||
"DATA_ADDTOLIST": "engadir %1 a %2",
|
||||
|
@ -5476,7 +5476,7 @@ Blockly.ScratchMsgs.locales["gl"] =
|
|||
"DATA_ITEMOFLIST": "elemento %1 de %2",
|
||||
"DATA_ITEMNUMOFLIST": "posición de %2 que contén %1",
|
||||
"DATA_LENGTHOFLIST": "lonxitude de %1",
|
||||
"DATA_LISTCONTAINSITEM": "Contén %1 o texto %2?",
|
||||
"DATA_LISTCONTAINSITEM": "%1 contén %2?",
|
||||
"DATA_SHOWLIST": "amosar a lista %1",
|
||||
"DATA_HIDELIST": "agochar a lista %1",
|
||||
"DATA_INDEX_ALL": "todos",
|
||||
|
@ -5486,7 +5486,7 @@ Blockly.ScratchMsgs.locales["gl"] =
|
|||
"EVENT_WHENTHISSPRITECLICKED": "ao premer nesta figura",
|
||||
"EVENT_WHENSTAGECLICKED": "ao premer no escenario",
|
||||
"EVENT_WHENTOUCHINGOBJECT": "cando esta figura toque %1",
|
||||
"EVENT_WHENBROADCASTRECEIVED": "cando eu reciba %1",
|
||||
"EVENT_WHENBROADCASTRECEIVED": "ao recibir %1",
|
||||
"EVENT_WHENBACKDROPSWITCHESTO": "ao mudar o fondo a %1",
|
||||
"EVENT_WHENGREATERTHAN": "cando %1 > %2",
|
||||
"EVENT_WHENGREATERTHAN_TIMER": "cronómetro",
|
||||
|
@ -5664,11 +5664,11 @@ Blockly.ScratchMsgs.locales["gl"] =
|
|||
"SOUND_STOPALLSOUNDS": "deter todos os sons",
|
||||
"SOUND_SETEFFECTO": "aplicar efecto %1 como %2",
|
||||
"SOUND_CHANGEEFFECTBY": "sumar ao efecto %1 o valor %2",
|
||||
"SOUND_CLEAREFFECTS": "limpar efectos de son",
|
||||
"SOUND_CLEAREFFECTS": "limpar os efectos de son",
|
||||
"SOUND_EFFECTS_PITCH": "ton",
|
||||
"SOUND_EFFECTS_PAN": "canle esquerda/dereita",
|
||||
"SOUND_CHANGEVOLUMEBY": "subir o volume en %1",
|
||||
"SOUND_SETVOLUMETO": "pór o volume no %1 %",
|
||||
"SOUND_SETVOLUMETO": "pór o volume no %1%",
|
||||
"SOUND_VOLUME": "volume",
|
||||
"SOUND_RECORD": "gravar...",
|
||||
"CATEGORY_MOTION": "Movemento",
|
||||
|
@ -5699,7 +5699,7 @@ Blockly.ScratchMsgs.locales["gl"] =
|
|||
"COLOUR_BRIGHTNESS_LABEL": "Luminosidade",
|
||||
"CHANGE_VALUE_TITLE": "Cambiar valor:",
|
||||
"RENAME_VARIABLE": "Renomear variábel",
|
||||
"RENAME_VARIABLE_TITLE": "Renomear a variábel «%1» como:",
|
||||
"RENAME_VARIABLE_TITLE": "Renomear as variábeis «%1» como:",
|
||||
"RENAME_VARIABLE_MODAL_TITLE": "Renomear variábel",
|
||||
"NEW_VARIABLE": "Crear unha variábel",
|
||||
"NEW_VARIABLE_TITLE": "Nome da nova variábel:",
|
||||
|
@ -5716,7 +5716,7 @@ Blockly.ScratchMsgs.locales["gl"] =
|
|||
"NEW_LIST_TITLE": "Nome da nova lista:",
|
||||
"LIST_MODAL_TITLE": "Nova lista",
|
||||
"LIST_ALREADY_EXISTS": "Xa existe unha lista chamada «%1».",
|
||||
"RENAME_LIST_TITLE": "Renomear a lista «%1» como:",
|
||||
"RENAME_LIST_TITLE": "Renomear as listas «%1» como:",
|
||||
"RENAME_LIST_MODAL_TITLE": "Renomear lista",
|
||||
"DEFAULT_LIST_ITEM": "cousa",
|
||||
"DELETE_LIST": "Eliminar a lista «%1»",
|
||||
|
@ -6309,7 +6309,7 @@ Blockly.ScratchMsgs.locales["hr"] =
|
|||
"CONTROL_STOP_ALL": "sve",
|
||||
"CONTROL_STOP_THIS": "ovaj program",
|
||||
"CONTROL_STOP_OTHER": "druge programe lika",
|
||||
"CONTROL_WAIT": "čekaj %1 sekundu",
|
||||
"CONTROL_WAIT": "čekaj %1 sekundi",
|
||||
"CONTROL_WAITUNTIL": "čekaj do %1",
|
||||
"CONTROL_REPEATUNTIL": "ponavljaj dok nije %1",
|
||||
"CONTROL_WHILE": "dok je %1",
|
||||
|
@ -6322,7 +6322,7 @@ Blockly.ScratchMsgs.locales["hr"] =
|
|||
"CONTROL_INCRCOUNTER": "uvečaj brojač",
|
||||
"CONTROL_CLEARCOUNTER": "obriši brojač",
|
||||
"CONTROL_ALLATONCE": "sve odjednom",
|
||||
"DATA_SETVARIABLETO": "neka %1 bude %2",
|
||||
"DATA_SETVARIABLETO": "postavi %1 na %2",
|
||||
"DATA_CHANGEVARIABLEBY": "promijeni %1 za %2",
|
||||
"DATA_SHOWVARIABLE": "prikaži varijablu %1",
|
||||
"DATA_HIDEVARIABLE": "sakrij varijablu %1",
|
||||
|
@ -6349,8 +6349,8 @@ Blockly.ScratchMsgs.locales["hr"] =
|
|||
"EVENT_WHENGREATERTHAN": "kada je %1 > %2",
|
||||
"EVENT_WHENGREATERTHAN_TIMER": "štoperica",
|
||||
"EVENT_WHENGREATERTHAN_LOUDNESS": "glasnoća",
|
||||
"EVENT_BROADCAST": "sviraj zvuk %1",
|
||||
"EVENT_BROADCASTANDWAIT": "sviraj zvuk %1 i čekaj",
|
||||
"EVENT_BROADCAST": "pošalji %1",
|
||||
"EVENT_BROADCASTANDWAIT": "pošalji %1 i čekaj",
|
||||
"EVENT_WHENKEYPRESSED": "kada je tipka %1 pritisnuta",
|
||||
"EVENT_WHENKEYPRESSED_SPACE": "razmaknica",
|
||||
"EVENT_WHENKEYPRESSED_LEFT": "strelica lijevo",
|
||||
|
@ -6406,7 +6406,7 @@ Blockly.ScratchMsgs.locales["hr"] =
|
|||
"MOTION_POINTINDIRECTION": "okreni se u smjeru %1",
|
||||
"MOTION_POINTTOWARDS": "okreni se prema %1",
|
||||
"MOTION_POINTTOWARDS_POINTER": "pokazivač miša",
|
||||
"MOTION_POINTTOWARDS_RANDOM": "random direction",
|
||||
"MOTION_POINTTOWARDS_RANDOM": "nasumičan smjer",
|
||||
"MOTION_GOTO": "idi do %1",
|
||||
"MOTION_GOTO_POINTER": "pokazivač miša",
|
||||
"MOTION_GOTO_RANDOM": "nasumična pozicija",
|
||||
|
@ -6419,7 +6419,7 @@ Blockly.ScratchMsgs.locales["hr"] =
|
|||
"MOTION_SETX": "postavi x na %1",
|
||||
"MOTION_CHANGEYBY": "promijeni y za %1",
|
||||
"MOTION_SETY": "postavi y na %1",
|
||||
"MOTION_IFONEDGEBOUNCE": "ako sina rubu, okreni se",
|
||||
"MOTION_IFONEDGEBOUNCE": "ako si na rubu, okreni se",
|
||||
"MOTION_SETROTATIONSTYLE": "postavi stil rotacije %1",
|
||||
"MOTION_SETROTATIONSTYLE_LEFTRIGHT": "lijevo-desno",
|
||||
"MOTION_SETROTATIONSTYLE_DONTROTATE": "ne rotiraj",
|
||||
|
@ -7264,7 +7264,7 @@ Blockly.ScratchMsgs.locales["lv"] =
|
|||
"MOTION_POINTINDIRECTION": "pagriezt virzienā %1",
|
||||
"MOTION_POINTTOWARDS": "pagriezt uz %1",
|
||||
"MOTION_POINTTOWARDS_POINTER": "peles kursors",
|
||||
"MOTION_POINTTOWARDS_RANDOM": "random direction",
|
||||
"MOTION_POINTTOWARDS_RANDOM": "nejaušs virziens",
|
||||
"MOTION_GOTO": "iet uz %1",
|
||||
"MOTION_GOTO_POINTER": "peles kursors",
|
||||
"MOTION_GOTO_RANDOM": "nejauša pozīcija",
|
||||
|
@ -7550,7 +7550,7 @@ Blockly.ScratchMsgs.locales["lt"] =
|
|||
"MOTION_POINTINDIRECTION": "žiūrėk kryptimi %1",
|
||||
"MOTION_POINTTOWARDS": "žiūrėk į %1",
|
||||
"MOTION_POINTTOWARDS_POINTER": "pelės žymeklis",
|
||||
"MOTION_POINTTOWARDS_RANDOM": "random direction",
|
||||
"MOTION_POINTTOWARDS_RANDOM": "atsitiktinė kryptis",
|
||||
"MOTION_GOTO": "eik į %1",
|
||||
"MOTION_GOTO_POINTER": "pelės žymeklis",
|
||||
"MOTION_GOTO_RANDOM": "atsitiktinė pozicija",
|
||||
|
@ -9838,7 +9838,7 @@ Blockly.ScratchMsgs.locales["th"] =
|
|||
"MOTION_POINTINDIRECTION": "หันในทิศทาง %1",
|
||||
"MOTION_POINTTOWARDS": "หันไปทาง %1",
|
||||
"MOTION_POINTTOWARDS_POINTER": "ตัวชี้เมาส์",
|
||||
"MOTION_POINTTOWARDS_RANDOM": "random direction",
|
||||
"MOTION_POINTTOWARDS_RANDOM": "สุ่มทิศทาง",
|
||||
"MOTION_GOTO": "ไปที่ %1",
|
||||
"MOTION_GOTO_POINTER": "ตัวชี้เมาส์",
|
||||
"MOTION_GOTO_RANDOM": "ตำแหน่งสุ่ม",
|
||||
|
@ -10009,8 +10009,8 @@ Blockly.ScratchMsgs.locales["th"] =
|
|||
"RENAME_LIST_TITLE": "เปลี่ยนชื่อรายการ \"%1\" ทั้งหมดเป็น:",
|
||||
"RENAME_LIST_MODAL_TITLE": "เปลี่ยนชื่อรายการ",
|
||||
"DEFAULT_LIST_ITEM": "สิ่ง",
|
||||
"DELETE_LIST": "Delete the \"%1\" list",
|
||||
"RENAME_LIST": "Rename list",
|
||||
"DELETE_LIST": "ลบรายชื่อ \"%1\"",
|
||||
"RENAME_LIST": "เปลี่ยนชื่อรายชื่อ",
|
||||
"NEW_BROADCAST_MESSAGE": "ข้อความใหม่",
|
||||
"NEW_BROADCAST_MESSAGE_TITLE": "ชื่อข้อความใหม่:",
|
||||
"BROADCAST_MODAL_TITLE": "ข้อความใหม่",
|
||||
|
@ -10124,7 +10124,7 @@ Blockly.ScratchMsgs.locales["pl"] =
|
|||
"MOTION_POINTINDIRECTION": "Ustaw w kierunku %1",
|
||||
"MOTION_POINTTOWARDS": "Ustaw w kierunku duszka %1",
|
||||
"MOTION_POINTTOWARDS_POINTER": "Wskaźnik myszy",
|
||||
"MOTION_POINTTOWARDS_RANDOM": "random direction",
|
||||
"MOTION_POINTTOWARDS_RANDOM": "losowy kierunek",
|
||||
"MOTION_GOTO": "Idź do %1",
|
||||
"MOTION_GOTO_POINTER": "Wskaźnik myszy",
|
||||
"MOTION_GOTO_RANDOM": "Losowa pozycja",
|
||||
|
@ -10982,7 +10982,7 @@ Blockly.ScratchMsgs.locales["ro"] =
|
|||
"MOTION_POINTINDIRECTION": "îndreaptă-te către direcția %1",
|
||||
"MOTION_POINTTOWARDS": "mergi înainte %1",
|
||||
"MOTION_POINTTOWARDS_POINTER": "cursorul mouse-ului",
|
||||
"MOTION_POINTTOWARDS_RANDOM": "random direction",
|
||||
"MOTION_POINTTOWARDS_RANDOM": "direcție aleatoare",
|
||||
"MOTION_GOTO": "mergi la %1",
|
||||
"MOTION_GOTO_POINTER": "cursorul mouse-ului",
|
||||
"MOTION_GOTO_RANDOM": "poziție aleatoare",
|
||||
|
@ -12052,7 +12052,7 @@ Blockly.ScratchMsgs.locales["sl"] =
|
|||
"DATA_INSERTATLIST": "vstavi %1 na %2 v %3",
|
||||
"DATA_REPLACEITEMOFLIST": "zamenjaj %1 v %2 z %3",
|
||||
"DATA_ITEMOFLIST": "element %1 v %2",
|
||||
"DATA_ITEMNUMOFLIST": "item # of %1 in %2",
|
||||
"DATA_ITEMNUMOFLIST": "predmet # od %1 v %2",
|
||||
"DATA_LENGTHOFLIST": "dolžina %1",
|
||||
"DATA_LISTCONTAINSITEM": "Ali %1 vsebuje %2?",
|
||||
"DATA_SHOWLIST": "pokaži seznam %1",
|
||||
|
@ -12126,7 +12126,7 @@ Blockly.ScratchMsgs.locales["sl"] =
|
|||
"MOTION_POINTINDIRECTION": "obrni se v smer %1",
|
||||
"MOTION_POINTTOWARDS": "obrni se proti %1",
|
||||
"MOTION_POINTTOWARDS_POINTER": "kazalcu miške",
|
||||
"MOTION_POINTTOWARDS_RANDOM": "random direction",
|
||||
"MOTION_POINTTOWARDS_RANDOM": "naključna smer",
|
||||
"MOTION_GOTO": "pojdi na %1",
|
||||
"MOTION_GOTO_POINTER": "kazalcu miške",
|
||||
"MOTION_GOTO_RANDOM": "naključno mesto",
|
||||
|
@ -12297,8 +12297,8 @@ Blockly.ScratchMsgs.locales["sl"] =
|
|||
"RENAME_LIST_TITLE": "Preimenuj seznam \"%1\" v:",
|
||||
"RENAME_LIST_MODAL_TITLE": "Preimenuj seznam",
|
||||
"DEFAULT_LIST_ITEM": "stvar",
|
||||
"DELETE_LIST": "Delete the \"%1\" list",
|
||||
"RENAME_LIST": "Rename list",
|
||||
"DELETE_LIST": "Izbriši \"%1\" seznam",
|
||||
"RENAME_LIST": "Preimenuj seznam",
|
||||
"NEW_BROADCAST_MESSAGE": "Novo sporočilo",
|
||||
"NEW_BROADCAST_MESSAGE_TITLE": "Ime novega sporočila:",
|
||||
"BROADCAST_MODAL_TITLE": "Novo sporočilo",
|
||||
|
@ -12412,7 +12412,7 @@ Blockly.ScratchMsgs.locales["fi"] =
|
|||
"MOTION_POINTINDIRECTION": "osoita suuntaan %1",
|
||||
"MOTION_POINTTOWARDS": "osoita kohti %1",
|
||||
"MOTION_POINTTOWARDS_POINTER": "hiiren osoitin",
|
||||
"MOTION_POINTTOWARDS_RANDOM": "random direction",
|
||||
"MOTION_POINTTOWARDS_RANDOM": "satunnainen suunta",
|
||||
"MOTION_GOTO": "mene sijaintiin %1",
|
||||
"MOTION_GOTO_POINTER": "hiiren osoitin",
|
||||
"MOTION_GOTO_RANDOM": "satunnainen sijainti",
|
||||
|
@ -13842,7 +13842,7 @@ Blockly.ScratchMsgs.locales["zh-cn"] =
|
|||
"MOTION_POINTINDIRECTION": "面向 %1 方向",
|
||||
"MOTION_POINTTOWARDS": "面向 %1",
|
||||
"MOTION_POINTTOWARDS_POINTER": "鼠标指针",
|
||||
"MOTION_POINTTOWARDS_RANDOM": "random direction",
|
||||
"MOTION_POINTTOWARDS_RANDOM": "随机方向",
|
||||
"MOTION_GOTO": "移到 %1",
|
||||
"MOTION_GOTO_POINTER": "鼠标指针",
|
||||
"MOTION_GOTO_RANDOM": "随机位置",
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
"test": "npm run test:lint && npm run test:messages && npm run test:setup && npm run test:unit",
|
||||
"version": "json -f package.json -I -e \"this.repository.sha = '$(git log -n1 --pretty=format:%H)'\"",
|
||||
"translate": "node i18n/js_to_json.js && node i18n/json_to_js.js",
|
||||
"translate:sync:src": "node i18n/sync_tx_src.js scratch-editor blocks msg/json/en.json",
|
||||
"translate:sync:src": "tx-push-src scratch-editor blocks msg/json/en.json",
|
||||
"translate:sync:translations": "node i18n/sync_tx_translations.js",
|
||||
"translate:update": "npm run translate:sync:src && npm run translate:sync:translations"
|
||||
},
|
||||
|
@ -41,7 +41,7 @@
|
|||
"graceful-fs": "4.1.11",
|
||||
"json": "9.0.4",
|
||||
"rimraf": "2.6.2",
|
||||
"scratch-l10n": "3.0.20181115134359",
|
||||
"scratch-l10n": "3.1.20181129204552",
|
||||
"transifex": "1.5.0",
|
||||
"travis-after-all": "1.4.4",
|
||||
"uglifyjs-webpack-plugin": "^1.2.5",
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue