@gradio/core 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,51 @@
1
1
  # @gradio/core
2
2
 
3
+ ## 0.2.1
4
+
5
+ ### Fixes
6
+
7
+ - [#9653](https://github.com/gradio-app/gradio/pull/9653) [`61cd768`](https://github.com/gradio-app/gradio/commit/61cd768490a12f5d63101d5434092bcd1cfc43a8) - Ensures tabs with visible set to false are not visible. Thanks @hannahblair!
8
+
9
+ ### Dependency updates
10
+
11
+ - @gradio/button@0.3.4
12
+ - @gradio/video@0.11.5
13
+ - @gradio/statustracker@0.9.2
14
+ - @gradio/atoms@0.10.0
15
+ - @gradio/icons@0.8.1
16
+ - @gradio/upload@0.13.4
17
+ - @gradio/plot@0.8.0
18
+ - @gradio/gallery@0.13.5
19
+ - @gradio/tabs@0.3.2
20
+ - @gradio/column@0.2.0
21
+ - @gradio/tabitem@0.3.2
22
+ - @gradio/code@0.10.5
23
+ - @gradio/paramviewer@0.5.4
24
+ - @gradio/textbox@0.8.3
25
+ - @gradio/file@0.10.5
26
+ - @gradio/checkbox@0.4.4
27
+ - @gradio/image@0.16.5
28
+
29
+ ## 0.2.0
30
+
31
+ ### Dependency updates
32
+
33
+ - @gradio/markdown@0.10.3
34
+ - @gradio/code@0.10.4
35
+ - @gradio/paramviewer@0.5.3
36
+ - @gradio/statustracker@0.9.1
37
+ - @gradio/upload@0.13.3
38
+ - @gradio/button@0.3.3
39
+ - @gradio/video@0.11.4
40
+ - @gradio/atoms@0.9.2
41
+ - @gradio/gallery@0.13.4
42
+ - @gradio/plot@0.7.3
43
+ - @gradio/column@0.2.0
44
+ - @gradio/textbox@0.8.2
45
+ - @gradio/checkbox@0.4.3
46
+ - @gradio/file@0.10.4
47
+ - @gradio/image@0.16.4
48
+
3
49
  ## 0.2.0
4
50
 
5
51
  ### Features
@@ -7,10 +7,6 @@ export interface UpdateTransaction {
7
7
  value: any;
8
8
  prop: string;
9
9
  }
10
- /**
11
- * Create a store with the layout and a map of targets
12
- * @returns A store with the layout and a map of targets
13
- */
14
10
  export declare function create_components(initial_layout: ComponentMeta | undefined): {
15
11
  layout: Writable<ComponentMeta>;
16
12
  targets: Writable<TargetMap>;
package/dist/src/init.js CHANGED
@@ -11,6 +11,7 @@ const raf = is_browser
11
11
  * Create a store with the layout and a map of targets
12
12
  * @returns A store with the layout and a map of targets
13
13
  */
14
+ let has_run = new Set();
14
15
  export function create_components(initial_layout) {
15
16
  let _component_map;
16
17
  let target_map = writable({});
@@ -145,17 +146,22 @@ export function create_components(initial_layout) {
145
146
  if (node.children) {
146
147
  instance.children = await Promise.all(node.children.map((v) => walk_layout(v, root, instance)));
147
148
  }
148
- if (instance.type === "tabs") {
149
- instance.children =
150
- instance?.children?.map((c) => ({
151
- ...c,
149
+ if (instance.type === "tabs" && !instance.props.initial_tabs) {
150
+ const tab_items_props = node.children?.map((c) => {
151
+ var _a;
152
+ const instance = instance_map[c.id];
153
+ // console.log("tabs", JSON.stringify(instance.props, null, 2));
154
+ (_a = instance.props).id ?? (_a.id = c.id);
155
+ return {
156
+ type: instance.type,
152
157
  props: {
153
- ...c.props,
154
- id: c.props.id || c.id
158
+ ...instance.props,
159
+ id: instance.props.id
155
160
  }
156
- })) || [];
157
- const child_tab_items = instance.children?.filter((child) => child.type === "tabitem");
158
- instance.props.inital_tabs = child_tab_items?.map((child) => ({
161
+ };
162
+ }) || [];
163
+ const child_tab_items = tab_items_props.filter((child) => child.type === "tabitem");
164
+ instance.props.initial_tabs = child_tab_items?.map((child) => ({
159
165
  label: child.props.label,
160
166
  id: child.props.id,
161
167
  visible: child.props.visible,
@@ -190,7 +196,7 @@ export function create_components(initial_layout) {
190
196
  new_value = new Set(update.value);
191
197
  else if (Array.isArray(update.value))
192
198
  new_value = [...update.value];
193
- else if (update.value === null)
199
+ else if (update.value == null)
194
200
  new_value = null;
195
201
  else if (typeof update.value === "object")
196
202
  new_value = { ...update.value };
@@ -0,0 +1,124 @@
1
+ {
2
+ "3D_model": {
3
+ "3d_model": "3D-malli"
4
+ },
5
+ "annotated_image": {
6
+ "annotated_image": "Annotoitu kuva"
7
+ },
8
+ "audio": {
9
+ "allow_recording_access": "Ole hyvä ja anna selaimelle ja sivustolle pääsy mikrofoniin.",
10
+ "audio": "Audio",
11
+ "record_from_microphone": "Äänitä mikrofonia",
12
+ "stop_recording": "Lopeta äänitys",
13
+ "no_device_support": "Medialaitteita ei voitu käyttää. Tarkista, että yhteys on salattu (https), paikallinen (localhost), tai ssl_verify on saanut voimassa olevan SSL-sertifikaatin. Tarkista, että olet antanut selaimelle pääsyn medialaitteeseen.",
14
+ "stop": "Stop",
15
+ "resume": "Jatka",
16
+ "record": "Äänitä",
17
+ "no_microphone": "Ei mikrofonia käytössä",
18
+ "pause": "Pause",
19
+ "play": "Play",
20
+ "waiting": "Odotetaan"
21
+ },
22
+ "blocks": {
23
+ "connection_can_break": "Mobiililaitteella yhteys voi katketa, jos vaihdat välilehteä tai laite menee lepotilaa. Tällöin menetät paikkasi jonossa.",
24
+ "long_requests_queue": "Spacessa on ruuhkaa ja jono on pitkä. Kopioi tämä Space hypätäksesi jonon ohi.",
25
+ "lost_connection": "Yhteys katkesi sivulta poistumisen seurauksena. Liitytään takaisin jonoon...",
26
+ "waiting_for_inputs": "Odotetaan latauksen valmistumista, ole hyvä ja yritä uudelleen."
27
+ },
28
+ "checkbox": {
29
+ "checkbox": "Valintaruutu",
30
+ "checkbox_group": "Valintaruuturyhmä"
31
+ },
32
+ "code": {
33
+ "code": "Koodi"
34
+ },
35
+ "color_picker": {
36
+ "color_picker": "Värivalitsin"
37
+ },
38
+ "common": {
39
+ "built_with": "tehty",
40
+ "built_with_gradio": "tehty Gradiolla",
41
+ "clear": "Poista",
42
+ "download": "Lataa",
43
+ "edit": "Muokkaa",
44
+ "empty": "Tyhjennä",
45
+ "error": "Virhe",
46
+ "hosted_on": "Hostattu",
47
+ "loading": "Ladataan",
48
+ "logo": "logo",
49
+ "or": "tai",
50
+ "remove": "Poista",
51
+ "share": "Jaa",
52
+ "submit": "Suorita",
53
+ "undo": "Kumoa",
54
+ "no_devices": "Laitetta ei löytynyt"
55
+ },
56
+ "dataframe": {
57
+ "incorrect_format": "Yhteensopimaton tiedostomuoto, vain CSV- ja TSV-tiedostoja tuetaan.",
58
+ "new_column": "Lisää sarake",
59
+ "new_row": "Lisää rivi",
60
+ "add_row_above": "Lisää rivi yläpuolelle",
61
+ "add_row_below": "Lisää rivi alle",
62
+ "add_column_left": "Lisää sarake vasemmalle",
63
+ "add_column_right": "Lisää sarake oikealle"
64
+ },
65
+ "dropdown": {
66
+ "dropdown": "Pudotusvalikko"
67
+ },
68
+ "errors": {
69
+ "build_error": "tapahtui virhe",
70
+ "config_error": "virhe asetuksissa",
71
+ "contact_page_author": "Kerro ylläpitäjälle virheestä.",
72
+ "no_app_file": "sovellustiedosto puuttuu",
73
+ "runtime_error": "ohjelman suorituksen aikana tapahtui virhe",
74
+ "space_not_working": "\"Space ei toimi, koska\" {0}",
75
+ "space_paused": "tila on tauolla",
76
+ "use_via_api": "Käytä rajapinnan kautta"
77
+ },
78
+ "file": {
79
+ "uploading": "Ladataan..."
80
+ },
81
+ "highlighted_text": {
82
+ "highlighted_text": "Korostettu teksti"
83
+ },
84
+ "image": {
85
+ "allow_webcam_access": "Ole hyvä ja anna lupa web-kameran käyttöön.",
86
+ "brush_color": "Siveltimen väri",
87
+ "brush_radius": "Siveltimen koko",
88
+ "image": "Kuva",
89
+ "remove_image": "Poista kuva",
90
+ "select_brush_color": "Valitse siveltimen väri",
91
+ "start_drawing": "Aloita piirtäminen",
92
+ "use_brush": "Käytä sivellintä"
93
+ },
94
+ "label": {
95
+ "label": "Tunniste"
96
+ },
97
+ "login": {
98
+ "enable_cookies": "Jos käytät Hugging Face Spacea Incognito-tilassa, sinun on otettava käyttöön kolmansien osapuolten evästeet..",
99
+ "incorrect_credentials": "Käyttäjätietoja ei löytynyt",
100
+ "login": "Kirjaudu sisään"
101
+ },
102
+ "number": {
103
+ "number": "Numero"
104
+ },
105
+ "plot": {
106
+ "plot": "Kuvaaja"
107
+ },
108
+ "radio": {
109
+ "radio": "Radio"
110
+ },
111
+ "slider": {
112
+ "slider": "Säädin"
113
+ },
114
+ "upload_text": {
115
+ "click_to_upload": "Lataa palvelimelle",
116
+ "drop_audio": "Vedä audiotiedosto tähän",
117
+ "drop_csv": "Vedä CSV tähän",
118
+ "drop_file": "Vedä tiedosto tähän",
119
+ "drop_image": "Vedä kuva tähän",
120
+ "drop_video": "Vedä video tähän",
121
+ "drop_gallery": "Vedä media tähän",
122
+ "paste_clipboard": "Liitä leikepöydältä"
123
+ }
124
+ }
package/package.json CHANGED
@@ -1,63 +1,63 @@
1
1
  {
2
2
  "name": "@gradio/core",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "type": "module",
5
5
  "devDependencies": {
6
- "@gradio/annotatedimage": "^0.8.3",
7
- "@gradio/accordion": "^0.4.2",
8
- "@gradio/atoms": "^0.9.1",
9
- "@gradio/box": "^0.2.1",
10
- "@gradio/button": "^0.3.2",
11
- "@gradio/audio": "^0.14.3",
12
- "@gradio/chatbot": "^0.15.1",
13
- "@gradio/checkbox": "^0.4.2",
14
- "@gradio/checkboxgroup": "^0.6.2",
6
+ "@gradio/accordion": "^0.4.4",
7
+ "@gradio/annotatedimage": "^0.8.5",
8
+ "@gradio/audio": "^0.14.5",
9
+ "@gradio/button": "^0.3.4",
10
+ "@gradio/box": "^0.2.3",
11
+ "@gradio/atoms": "^0.10.0",
12
+ "@gradio/chatbot": "^0.16.0",
13
+ "@gradio/checkboxgroup": "^0.6.4",
14
+ "@gradio/checkbox": "^0.4.4",
15
15
  "@gradio/client": "^1.7.0",
16
- "@gradio/code": "^0.10.3",
17
- "@gradio/colorpicker": "^0.4.2",
18
16
  "@gradio/column": "^0.2.0",
19
- "@gradio/dataframe": "^0.11.3",
20
- "@gradio/datetime": "^0.2.2",
21
- "@gradio/downloadbutton": "^0.2.2",
22
- "@gradio/dataset": "^0.3.4",
23
- "@gradio/dropdown": "^0.9.0",
24
- "@gradio/fileexplorer": "^0.5.3",
25
- "@gradio/fallback": "^0.4.2",
26
- "@gradio/file": "^0.10.3",
27
- "@gradio/form": "^0.2.1",
28
- "@gradio/gallery": "^0.13.3",
29
- "@gradio/highlightedtext": "^0.8.2",
17
+ "@gradio/colorpicker": "^0.4.4",
18
+ "@gradio/code": "^0.10.5",
19
+ "@gradio/dataframe": "^0.12.0",
20
+ "@gradio/dataset": "^0.3.6",
21
+ "@gradio/datetime": "^0.2.4",
22
+ "@gradio/downloadbutton": "^0.2.4",
23
+ "@gradio/dropdown": "^0.9.2",
24
+ "@gradio/fallback": "^0.4.4",
25
+ "@gradio/fileexplorer": "^0.5.5",
26
+ "@gradio/file": "^0.10.5",
27
+ "@gradio/form": "^0.2.3",
28
+ "@gradio/gallery": "^0.13.5",
30
29
  "@gradio/group": "^0.2.0",
31
- "@gradio/icons": "^0.8.0",
32
- "@gradio/html": "^0.4.2",
33
- "@gradio/image": "^0.16.3",
34
- "@gradio/imageeditor": "^0.11.3",
35
- "@gradio/json": "^0.5.2",
36
- "@gradio/label": "^0.4.2",
37
- "@gradio/model3d": "^0.13.3",
38
- "@gradio/markdown": "^0.10.2",
39
- "@gradio/multimodaltextbox": "^0.7.1",
40
- "@gradio/nativeplot": "^0.4.2",
41
- "@gradio/number": "^0.5.2",
42
- "@gradio/paramviewer": "^0.5.2",
43
- "@gradio/plot": "^0.7.2",
44
- "@gradio/radio": "^0.6.2",
30
+ "@gradio/highlightedtext": "^0.8.4",
31
+ "@gradio/html": "^0.4.4",
32
+ "@gradio/image": "^0.16.5",
33
+ "@gradio/icons": "^0.8.1",
34
+ "@gradio/json": "^0.5.4",
35
+ "@gradio/imageeditor": "^0.11.5",
36
+ "@gradio/label": "^0.4.4",
37
+ "@gradio/model3d": "^0.13.5",
38
+ "@gradio/multimodaltextbox": "^0.7.3",
39
+ "@gradio/nativeplot": "^0.4.4",
40
+ "@gradio/number": "^0.5.4",
41
+ "@gradio/markdown": "^0.11.0",
42
+ "@gradio/paramviewer": "^0.5.4",
45
43
  "@gradio/row": "^0.2.0",
46
- "@gradio/simpleimage": "^0.8.3",
47
- "@gradio/simpletextbox": "^0.3.2",
48
- "@gradio/simpledropdown": "^0.3.2",
49
- "@gradio/slider": "^0.5.2",
50
- "@gradio/statustracker": "^0.9.0",
44
+ "@gradio/radio": "^0.6.4",
45
+ "@gradio/plot": "^0.8.0",
46
+ "@gradio/simpledropdown": "^0.3.4",
47
+ "@gradio/simpleimage": "^0.8.5",
48
+ "@gradio/simpletextbox": "^0.3.4",
49
+ "@gradio/slider": "^0.5.4",
51
50
  "@gradio/state": "^0.1.2",
52
- "@gradio/tabitem": "^0.3.1",
53
- "@gradio/tabs": "^0.3.1",
54
- "@gradio/textbox": "^0.8.1",
51
+ "@gradio/tabitem": "^0.3.2",
52
+ "@gradio/tabs": "^0.3.2",
53
+ "@gradio/textbox": "^0.8.3",
55
54
  "@gradio/theme": "^0.3.0",
56
55
  "@gradio/timer": "^0.4.0",
57
- "@gradio/uploadbutton": "^0.7.2",
58
- "@gradio/upload": "^0.13.2",
59
- "@gradio/video": "^0.11.3",
56
+ "@gradio/uploadbutton": "^0.7.4",
57
+ "@gradio/statustracker": "^0.9.2",
58
+ "@gradio/upload": "^0.13.4",
60
59
  "@gradio/utils": "^0.7.0",
60
+ "@gradio/video": "^0.11.5",
61
61
  "@gradio/wasm": "^0.14.2"
62
62
  },
63
63
  "msw": {
package/src/init.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { writable, type Writable, get } from "svelte/store";
2
+
2
3
  import type {
3
4
  ComponentMeta,
4
5
  Dependency,
@@ -27,6 +28,7 @@ const raf = is_browser
27
28
  * Create a store with the layout and a map of targets
28
29
  * @returns A store with the layout and a map of targets
29
30
  */
31
+ let has_run = new Set<number>();
30
32
  export function create_components(initial_layout: ComponentMeta | undefined): {
31
33
  layout: Writable<ComponentMeta>;
32
34
  targets: Writable<TargetMap>;
@@ -290,19 +292,26 @@ export function create_components(initial_layout: ComponentMeta | undefined): {
290
292
  );
291
293
  }
292
294
 
293
- if (instance.type === "tabs") {
294
- instance.children =
295
- instance?.children?.map((c) => ({
296
- ...c,
297
- props: {
298
- ...c.props,
299
- id: c.props.id || c.id
300
- }
301
- })) || [];
302
- const child_tab_items = instance.children?.filter(
295
+ if (instance.type === "tabs" && !instance.props.initial_tabs) {
296
+ const tab_items_props =
297
+ node.children?.map((c) => {
298
+ const instance = instance_map[c.id];
299
+ // console.log("tabs", JSON.stringify(instance.props, null, 2));
300
+ instance.props.id ??= c.id;
301
+ return {
302
+ type: instance.type,
303
+ props: {
304
+ ...(instance.props as any),
305
+ id: instance.props.id
306
+ }
307
+ };
308
+ }) || [];
309
+
310
+ const child_tab_items = tab_items_props.filter(
303
311
  (child) => child.type === "tabitem"
304
312
  );
305
- instance.props.inital_tabs = child_tab_items?.map((child) => ({
313
+
314
+ instance.props.initial_tabs = child_tab_items?.map((child) => ({
306
315
  label: child.props.label,
307
316
  id: child.props.id,
308
317
  visible: child.props.visible,
@@ -337,7 +346,7 @@ export function create_components(initial_layout: ComponentMeta | undefined): {
337
346
  else if (update.value instanceof Set)
338
347
  new_value = new Set(update.value);
339
348
  else if (Array.isArray(update.value)) new_value = [...update.value];
340
- else if (update.value === null) new_value = null;
349
+ else if (update.value == null) new_value = null;
341
350
  else if (typeof update.value === "object")
342
351
  new_value = { ...update.value };
343
352
  else new_value = update.value;
@@ -0,0 +1,124 @@
1
+ {
2
+ "3D_model": {
3
+ "3d_model": "3D-malli"
4
+ },
5
+ "annotated_image": {
6
+ "annotated_image": "Annotoitu kuva"
7
+ },
8
+ "audio": {
9
+ "allow_recording_access": "Ole hyvä ja anna selaimelle ja sivustolle pääsy mikrofoniin.",
10
+ "audio": "Audio",
11
+ "record_from_microphone": "Äänitä mikrofonia",
12
+ "stop_recording": "Lopeta äänitys",
13
+ "no_device_support": "Medialaitteita ei voitu käyttää. Tarkista, että yhteys on salattu (https), paikallinen (localhost), tai ssl_verify on saanut voimassa olevan SSL-sertifikaatin. Tarkista, että olet antanut selaimelle pääsyn medialaitteeseen.",
14
+ "stop": "Stop",
15
+ "resume": "Jatka",
16
+ "record": "Äänitä",
17
+ "no_microphone": "Ei mikrofonia käytössä",
18
+ "pause": "Pause",
19
+ "play": "Play",
20
+ "waiting": "Odotetaan"
21
+ },
22
+ "blocks": {
23
+ "connection_can_break": "Mobiililaitteella yhteys voi katketa, jos vaihdat välilehteä tai laite menee lepotilaa. Tällöin menetät paikkasi jonossa.",
24
+ "long_requests_queue": "Spacessa on ruuhkaa ja jono on pitkä. Kopioi tämä Space hypätäksesi jonon ohi.",
25
+ "lost_connection": "Yhteys katkesi sivulta poistumisen seurauksena. Liitytään takaisin jonoon...",
26
+ "waiting_for_inputs": "Odotetaan latauksen valmistumista, ole hyvä ja yritä uudelleen."
27
+ },
28
+ "checkbox": {
29
+ "checkbox": "Valintaruutu",
30
+ "checkbox_group": "Valintaruuturyhmä"
31
+ },
32
+ "code": {
33
+ "code": "Koodi"
34
+ },
35
+ "color_picker": {
36
+ "color_picker": "Värivalitsin"
37
+ },
38
+ "common": {
39
+ "built_with": "tehty",
40
+ "built_with_gradio": "tehty Gradiolla",
41
+ "clear": "Poista",
42
+ "download": "Lataa",
43
+ "edit": "Muokkaa",
44
+ "empty": "Tyhjennä",
45
+ "error": "Virhe",
46
+ "hosted_on": "Hostattu",
47
+ "loading": "Ladataan",
48
+ "logo": "logo",
49
+ "or": "tai",
50
+ "remove": "Poista",
51
+ "share": "Jaa",
52
+ "submit": "Suorita",
53
+ "undo": "Kumoa",
54
+ "no_devices": "Laitetta ei löytynyt"
55
+ },
56
+ "dataframe": {
57
+ "incorrect_format": "Yhteensopimaton tiedostomuoto, vain CSV- ja TSV-tiedostoja tuetaan.",
58
+ "new_column": "Lisää sarake",
59
+ "new_row": "Lisää rivi",
60
+ "add_row_above": "Lisää rivi yläpuolelle",
61
+ "add_row_below": "Lisää rivi alle",
62
+ "add_column_left": "Lisää sarake vasemmalle",
63
+ "add_column_right": "Lisää sarake oikealle"
64
+ },
65
+ "dropdown": {
66
+ "dropdown": "Pudotusvalikko"
67
+ },
68
+ "errors": {
69
+ "build_error": "tapahtui virhe",
70
+ "config_error": "virhe asetuksissa",
71
+ "contact_page_author": "Kerro ylläpitäjälle virheestä.",
72
+ "no_app_file": "sovellustiedosto puuttuu",
73
+ "runtime_error": "ohjelman suorituksen aikana tapahtui virhe",
74
+ "space_not_working": "\"Space ei toimi, koska\" {0}",
75
+ "space_paused": "tila on tauolla",
76
+ "use_via_api": "Käytä rajapinnan kautta"
77
+ },
78
+ "file": {
79
+ "uploading": "Ladataan..."
80
+ },
81
+ "highlighted_text": {
82
+ "highlighted_text": "Korostettu teksti"
83
+ },
84
+ "image": {
85
+ "allow_webcam_access": "Ole hyvä ja anna lupa web-kameran käyttöön.",
86
+ "brush_color": "Siveltimen väri",
87
+ "brush_radius": "Siveltimen koko",
88
+ "image": "Kuva",
89
+ "remove_image": "Poista kuva",
90
+ "select_brush_color": "Valitse siveltimen väri",
91
+ "start_drawing": "Aloita piirtäminen",
92
+ "use_brush": "Käytä sivellintä"
93
+ },
94
+ "label": {
95
+ "label": "Tunniste"
96
+ },
97
+ "login": {
98
+ "enable_cookies": "Jos käytät Hugging Face Spacea Incognito-tilassa, sinun on otettava käyttöön kolmansien osapuolten evästeet..",
99
+ "incorrect_credentials": "Käyttäjätietoja ei löytynyt",
100
+ "login": "Kirjaudu sisään"
101
+ },
102
+ "number": {
103
+ "number": "Numero"
104
+ },
105
+ "plot": {
106
+ "plot": "Kuvaaja"
107
+ },
108
+ "radio": {
109
+ "radio": "Radio"
110
+ },
111
+ "slider": {
112
+ "slider": "Säädin"
113
+ },
114
+ "upload_text": {
115
+ "click_to_upload": "Lataa palvelimelle",
116
+ "drop_audio": "Vedä audiotiedosto tähän",
117
+ "drop_csv": "Vedä CSV tähän",
118
+ "drop_file": "Vedä tiedosto tähän",
119
+ "drop_image": "Vedä kuva tähän",
120
+ "drop_video": "Vedä video tähän",
121
+ "drop_gallery": "Vedä media tähän",
122
+ "paste_clipboard": "Liitä leikepöydältä"
123
+ }
124
+ }