@gradio/core 0.16.1 → 0.18.0

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.
Files changed (73) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/dist/src/Blocks.svelte +75 -4
  3. package/dist/src/Render.svelte +2 -2
  4. package/dist/src/RenderComponent.svelte +21 -1
  5. package/dist/src/api_docs/ApiDocs.svelte +6 -1
  6. package/dist/src/api_docs/Settings.svelte +74 -1
  7. package/dist/src/api_docs/Settings.svelte.d.ts +3 -0
  8. package/dist/src/api_docs/img/record-stop.svg +1 -0
  9. package/dist/src/api_docs/img/record.svg +1 -0
  10. package/dist/src/gradio_helper.d.ts +1 -11
  11. package/dist/src/gradio_helper.js +3 -19
  12. package/dist/src/i18n.d.ts +12 -5
  13. package/dist/src/i18n.js +93 -12
  14. package/dist/src/init.js +40 -20
  15. package/dist/src/lang/en.json +6 -1
  16. package/dist/src/lang/es.json +2 -1
  17. package/dist/src/lang/fr.json +2 -1
  18. package/dist/src/lang/ja.json +2 -1
  19. package/dist/src/lang/ko.json +2 -1
  20. package/dist/src/lang/lt.json +2 -1
  21. package/dist/src/lang/nb.json +2 -1
  22. package/dist/src/lang/nl.json +2 -1
  23. package/dist/src/lang/pl.json +2 -1
  24. package/dist/src/lang/pt-BR.json +1 -0
  25. package/dist/src/lang/pt.json +2 -1
  26. package/dist/src/lang/ro.json +2 -1
  27. package/dist/src/lang/ru.json +2 -1
  28. package/dist/src/lang/sv.json +2 -1
  29. package/dist/src/lang/ta.json +2 -1
  30. package/dist/src/lang/th.json +2 -1
  31. package/dist/src/lang/tr.json +2 -1
  32. package/dist/src/lang/uk.json +2 -1
  33. package/dist/src/lang/ur.json +2 -1
  34. package/dist/src/lang/uz.json +2 -1
  35. package/dist/src/lang/zh-CN.json +2 -1
  36. package/dist/src/lang/zh-TW.json +2 -1
  37. package/dist/src/screen_recorder.d.ts +16 -0
  38. package/dist/src/screen_recorder.js +255 -0
  39. package/package.json +53 -53
  40. package/src/Blocks.svelte +86 -6
  41. package/src/Render.svelte +2 -2
  42. package/src/RenderComponent.svelte +21 -1
  43. package/src/api_docs/ApiDocs.svelte +7 -1
  44. package/src/api_docs/Settings.svelte +77 -1
  45. package/src/api_docs/img/record-stop.svg +1 -0
  46. package/src/api_docs/img/record.svg +1 -0
  47. package/src/gradio_helper.ts +5 -21
  48. package/src/i18n.test.ts +120 -1
  49. package/src/i18n.ts +126 -24
  50. package/src/init.ts +48 -26
  51. package/src/lang/en.json +6 -1
  52. package/src/lang/es.json +2 -1
  53. package/src/lang/fr.json +2 -1
  54. package/src/lang/ja.json +2 -1
  55. package/src/lang/ko.json +2 -1
  56. package/src/lang/lt.json +2 -1
  57. package/src/lang/nb.json +2 -1
  58. package/src/lang/nl.json +2 -1
  59. package/src/lang/pl.json +2 -1
  60. package/src/lang/pt-BR.json +1 -0
  61. package/src/lang/pt.json +2 -1
  62. package/src/lang/ro.json +2 -1
  63. package/src/lang/ru.json +2 -1
  64. package/src/lang/sv.json +2 -1
  65. package/src/lang/ta.json +2 -1
  66. package/src/lang/th.json +2 -1
  67. package/src/lang/tr.json +2 -1
  68. package/src/lang/uk.json +2 -1
  69. package/src/lang/ur.json +2 -1
  70. package/src/lang/uz.json +2 -1
  71. package/src/lang/zh-CN.json +2 -1
  72. package/src/lang/zh-TW.json +2 -1
  73. package/src/screen_recorder.ts +361 -0
package/src/i18n.test.ts CHANGED
@@ -1,7 +1,36 @@
1
- import { describe, test, assert } from "vitest";
1
+ import {
2
+ describe,
3
+ test,
4
+ expect,
5
+ assert,
6
+ vi,
7
+ beforeEach,
8
+ afterEach
9
+ } from "vitest";
2
10
  import { process_langs } from "./i18n";
3
11
  import languagesByAnyCode from "wikidata-lang/indexes/by_any_code";
4
12
  import BCP47 from "./lang/BCP47_codes";
13
+ import {
14
+ translate_if_needed,
15
+ get_initial_locale,
16
+ load_translations,
17
+ changeLocale,
18
+ is_translation_metadata
19
+ } from "./i18n";
20
+
21
+ vi.mock("svelte-i18n", () => ({
22
+ locale: { set: vi.fn() },
23
+ _: vi.fn((key) => `translated_${key}`),
24
+ addMessages: vi.fn(),
25
+ init: vi.fn().mockResolvedValue(undefined)
26
+ }));
27
+
28
+ vi.mock("svelte/store", () => ({
29
+ get: vi.fn((store) => store),
30
+ derived: vi.fn()
31
+ }));
32
+
33
+ import { locale, init, addMessages } from "svelte-i18n";
5
34
 
6
35
  describe("i18n", () => {
7
36
  test("languages are loaded correctly", () => {
@@ -24,4 +53,94 @@ describe("i18n", () => {
24
53
  assert.ok(translation.common);
25
54
  });
26
55
  });
56
+
57
+ describe("basic functions", () => {
58
+ test("translate_if_needed handles regular strings", () => {
59
+ const regularString = "hello world";
60
+ expect(translate_if_needed(regularString)).toBe(regularString);
61
+ });
62
+ });
63
+
64
+ describe("locale management", () => {
65
+ test("get_initial_locale returns browser locale when available", () => {
66
+ const result = get_initial_locale("fr", ["en", "fr", "de"]);
67
+ expect(result).toBe("fr");
68
+ });
69
+
70
+ test("get_initial_locale falls back to fallback locale when browser locale not available", () => {
71
+ const result = get_initial_locale("es", ["en", "fr", "de"]);
72
+ expect(result).toBe("en");
73
+ });
74
+
75
+ test("get_initial_locale falls back to fallback locale when browser locale is null", () => {
76
+ const result = get_initial_locale(null, ["en", "fr", "de"]);
77
+ expect(result).toBe("en");
78
+ });
79
+
80
+ test("get_initial_locale uses custom fallback locale when provided", () => {
81
+ const result = get_initial_locale("es", ["en", "fr", "de"], "de");
82
+ expect(result).toBe("de");
83
+ });
84
+ });
85
+
86
+ describe("i18n setup and initialization", () => {
87
+ beforeEach(() => {
88
+ vi.clearAllMocks();
89
+ });
90
+
91
+ afterEach(() => {
92
+ vi.resetAllMocks();
93
+ });
94
+
95
+ test("load_translations adds messages for each language", () => {
96
+ const mockAddMessages = addMessages as unknown as ReturnType<
97
+ typeof vi.fn
98
+ >;
99
+
100
+ const custom_translations = {
101
+ en: {
102
+ greeting: "Hello"
103
+ },
104
+ fr: {
105
+ greeting: "Bonjour"
106
+ }
107
+ };
108
+
109
+ load_translations(custom_translations);
110
+
111
+ expect(mockAddMessages).toHaveBeenCalledTimes(2);
112
+ expect(mockAddMessages).toHaveBeenCalledWith(
113
+ "en",
114
+ custom_translations.en
115
+ );
116
+ expect(mockAddMessages).toHaveBeenCalledWith(
117
+ "fr",
118
+ custom_translations.fr
119
+ );
120
+ });
121
+
122
+ test("changeLocale sets the locale correctly", () => {
123
+ const mockSetLocale = locale.set as unknown as ReturnType<typeof vi.fn>;
124
+
125
+ changeLocale("fr");
126
+
127
+ expect(mockSetLocale).toHaveBeenCalledWith("fr");
128
+ });
129
+ });
130
+
131
+ describe("translation metadata handling", () => {
132
+ test("is_translation_metadata identifies valid metadata objects", () => {
133
+ expect(
134
+ is_translation_metadata({
135
+ __type__: "translation_metadata" as const,
136
+ key: "test.key"
137
+ })
138
+ ).toBe(true);
139
+ expect(is_translation_metadata({ key: "test.key" })).toBe(false);
140
+
141
+ expect(Boolean(is_translation_metadata(null))).toBe(false);
142
+ expect(Boolean(is_translation_metadata(undefined))).toBe(false);
143
+ expect(Boolean(is_translation_metadata("not an object"))).toBe(false);
144
+ });
145
+ });
27
146
  });
package/src/i18n.ts CHANGED
@@ -1,31 +1,94 @@
1
- import {
2
- addMessages,
3
- init,
4
- getLocaleFromNavigator,
5
- locale,
6
- _
7
- } from "svelte-i18n";
1
+ import { addMessages, init, getLocaleFromNavigator, locale } from "svelte-i18n";
2
+ import { formatter } from "./gradio_helper";
8
3
 
9
4
  const langs = import.meta.glob("./lang/*.json", {
10
5
  eager: true
11
6
  });
12
7
 
13
- type LangsRecord = Record<
14
- string,
15
- {
16
- [key: string]: any;
8
+ export interface I18nData {
9
+ __type__: "translation_metadata";
10
+ key: string;
11
+ }
12
+
13
+ export interface LangsRecord {
14
+ [lang: string]: any;
15
+ }
16
+
17
+ export function is_translation_metadata(obj: any): obj is I18nData {
18
+ console.log(obj);
19
+ const result =
20
+ obj &&
21
+ typeof obj === "object" &&
22
+ obj.__type__ === "translation_metadata" &&
23
+ typeof obj.key === "string";
24
+
25
+ return result;
26
+ }
27
+
28
+ // handles strings with embedded JSON metadata of shape "__i18n__{"key": "some.key"}"
29
+ export function translate_if_needed(value: any): string {
30
+ if (typeof value !== "string") {
31
+ return value;
17
32
  }
18
- >;
19
33
 
20
- export function process_langs(): LangsRecord {
21
- let _langs: LangsRecord = {};
34
+ const i18n_marker = "__i18n__";
35
+ const marker_index = value.indexOf(i18n_marker);
36
+
37
+ if (marker_index === -1) {
38
+ return value;
39
+ }
40
+
41
+ try {
42
+ const before_marker =
43
+ marker_index > 0 ? value.substring(0, marker_index) : "";
44
+
45
+ const after_marker_index = marker_index + i18n_marker.length;
46
+ const json_start = value.indexOf("{", after_marker_index);
47
+ let json_end = -1;
48
+ let bracket_count = 0;
49
+
50
+ for (let i = json_start; i < value.length; i++) {
51
+ if (value[i] === "{") bracket_count++;
52
+ if (value[i] === "}") bracket_count--;
53
+ if (bracket_count === 0) {
54
+ json_end = i + 1;
55
+ break;
56
+ }
57
+ }
58
+
59
+ if (json_end === -1) {
60
+ console.error("Could not find end of JSON in i18n string");
61
+ return value;
62
+ }
63
+
64
+ const metadata_json = value.substring(json_start, json_end);
65
+ const after_json = json_end < value.length ? value.substring(json_end) : "";
66
+
67
+ try {
68
+ const metadata = JSON.parse(metadata_json);
69
+
70
+ if (metadata && metadata.key) {
71
+ const translated = formatter(metadata.key);
72
+ return before_marker + translated + after_json;
73
+ }
74
+ } catch (jsonError) {
75
+ console.error("Error parsing i18n JSON:", jsonError);
76
+ }
22
77
 
23
- for (const lang in langs) {
24
- const code = (lang.split("/").pop() as string).split(".").shift() as string;
25
- _langs[code] = (langs[lang] as Record<string, any>).default;
78
+ return value;
79
+ } catch (e) {
80
+ console.error("Error processing translation:", e);
81
+ return value;
26
82
  }
83
+ }
27
84
 
28
- return _langs;
85
+ export function process_langs(): LangsRecord {
86
+ return Object.fromEntries(
87
+ Object.entries(langs).map(([path, module]) => [
88
+ path.split("/").pop()!.split(".")[0],
89
+ (module as Record<string, any>).default
90
+ ])
91
+ );
29
92
  }
30
93
 
31
94
  const processed_langs = process_langs();
@@ -37,17 +100,26 @@ export const language_choices: [string, string][] = Object.entries(
37
100
 
38
101
  export let all_common_keys: Set<string> = new Set();
39
102
 
40
- for (const lang in processed_langs) {
41
- addMessages(lang, processed_langs[lang]);
42
- }
43
-
44
103
  let i18n_initialized = false;
104
+ let previous_translations: Record<string, Record<string, string>> | undefined;
105
+
106
+ export async function setupi18n(
107
+ custom_translations?: Record<string, Record<string, string>>
108
+ ): Promise<void> {
109
+ const should_reinitialize =
110
+ i18n_initialized && custom_translations !== previous_translations;
45
111
 
46
- export async function setupi18n(): Promise<void> {
47
- if (i18n_initialized) {
112
+ if (i18n_initialized && !should_reinitialize) {
48
113
  return;
49
114
  }
50
115
 
116
+ previous_translations = custom_translations;
117
+
118
+ load_translations({
119
+ ...processed_langs,
120
+ ...(custom_translations ?? {})
121
+ });
122
+
51
123
  const browser_locale = getLocaleFromNavigator();
52
124
 
53
125
  let initial_locale =
@@ -88,3 +160,33 @@ export async function setupi18n(): Promise<void> {
88
160
  export function changeLocale(new_locale: string): void {
89
161
  locale.set(new_locale);
90
162
  }
163
+
164
+ export function get_initial_locale(
165
+ browser_locale: string | null,
166
+ available_locales: string[],
167
+ fallback_locale = "en"
168
+ ): string {
169
+ if (!browser_locale) return fallback_locale;
170
+
171
+ if (available_locales.includes(browser_locale)) {
172
+ return browser_locale;
173
+ }
174
+
175
+ return fallback_locale;
176
+ }
177
+
178
+ export function load_translations(
179
+ translations: LangsRecord | null | undefined
180
+ ): void {
181
+ if (!translations) {
182
+ return;
183
+ }
184
+
185
+ try {
186
+ for (const lang in translations) {
187
+ addMessages(lang, translations[lang]);
188
+ }
189
+ } catch (e) {
190
+ console.error("Error loading translations:", e);
191
+ }
192
+ }
package/src/init.ts CHANGED
@@ -70,7 +70,7 @@ export function create_components(initial_layout: ComponentMeta | undefined): {
70
70
  const layout_store: Writable<ComponentMeta> = writable(initial_layout);
71
71
  let _components: ComponentMeta[] = [];
72
72
  let app: client_return;
73
- let keyed_component_values: Record<string | number, any> = {};
73
+ let keys_per_render_id: Record<number, (string | number)[]> = {};
74
74
  let _rootNode: ComponentMeta;
75
75
 
76
76
  function set_event_specific_args(dependencies: Dependency[]): void {
@@ -106,7 +106,6 @@ export function create_components(initial_layout: ComponentMeta | undefined): {
106
106
  // make sure the state is settled before proceeding
107
107
  flush();
108
108
  app = _app;
109
- store_keyed_values(_components);
110
109
 
111
110
  _components = components;
112
111
  inputs = new Set();
@@ -180,7 +179,23 @@ export function create_components(initial_layout: ComponentMeta | undefined): {
180
179
  root: string;
181
180
  dependencies: Dependency[];
182
181
  }): void {
183
- let _constructor_map = preload_all_components(components, root);
182
+ components.forEach((c) => {
183
+ for (const prop in c.props) {
184
+ if (c.props[prop] === null) {
185
+ c.props[prop] = undefined;
186
+ }
187
+ }
188
+ });
189
+ let replacement_components: ComponentMeta[] = [];
190
+ let new_components: ComponentMeta[] = [];
191
+ components.forEach((c) => {
192
+ if (c.key == null || !keys_per_render_id[render_id]?.includes(c.key)) {
193
+ new_components.push(c);
194
+ } else {
195
+ replacement_components.push(c);
196
+ }
197
+ });
198
+ let _constructor_map = preload_all_components(new_components, root);
184
199
  _constructor_map.forEach((v, k) => {
185
200
  constructor_map.set(k, v);
186
201
  });
@@ -212,19 +227,36 @@ export function create_components(initial_layout: ComponentMeta | undefined): {
212
227
  }
213
228
  };
214
229
  add_to_current_children(current_element);
215
- store_keyed_values(all_current_children);
216
230
 
217
231
  Object.entries(instance_map).forEach(([id, component]) => {
218
232
  let _id = Number(id);
219
233
  if (component.rendered_in === render_id) {
220
- delete instance_map[_id];
221
- if (_component_map.has(_id)) {
222
- _component_map.delete(_id);
234
+ let replacement_component = replacement_components.find(
235
+ (c) => c.key === component.key
236
+ );
237
+ if (component.key != null && replacement_component !== undefined) {
238
+ const instance = instance_map[component.id];
239
+ for (const prop in replacement_component.props) {
240
+ if (
241
+ !(
242
+ replacement_component.props.preserved_by_key as
243
+ | string[]
244
+ | undefined
245
+ )?.includes(prop)
246
+ ) {
247
+ instance.props[prop] = replacement_component.props[prop];
248
+ }
249
+ }
250
+ } else {
251
+ delete instance_map[_id];
252
+ if (_component_map.has(_id)) {
253
+ _component_map.delete(_id);
254
+ }
223
255
  }
224
256
  }
225
257
  });
226
258
 
227
- components.forEach((c) => {
259
+ new_components.forEach((c) => {
228
260
  instance_map[c.id] = c;
229
261
  _component_map.set(c.id, c);
230
262
  });
@@ -241,6 +273,9 @@ export function create_components(initial_layout: ComponentMeta | undefined): {
241
273
  current_element.parent
242
274
  ).then(() => {
243
275
  layout_store.set(_rootNode);
276
+ keys_per_render_id[render_id] = components
277
+ .map((c) => c.key)
278
+ .filter((c) => c != null) as (string | number)[];
244
279
  });
245
280
 
246
281
  set_event_specific_args(dependencies);
@@ -254,9 +289,11 @@ export function create_components(initial_layout: ComponentMeta | undefined): {
254
289
  ): Promise<ComponentMeta> {
255
290
  const instance = instance_map[node.id];
256
291
 
257
- instance.component = (await constructor_map.get(
258
- instance.component_class_id || instance.type
259
- ))!?.default;
292
+ if (!instance.component) {
293
+ instance.component = (await constructor_map.get(
294
+ instance.component_class_id || instance.type
295
+ ))!?.default;
296
+ }
260
297
  instance.parent = parent;
261
298
 
262
299
  if (instance.type === "dataset") {
@@ -287,13 +324,6 @@ export function create_components(initial_layout: ComponentMeta | undefined): {
287
324
  app
288
325
  );
289
326
 
290
- if (
291
- instance.key != null &&
292
- keyed_component_values[instance.key] !== undefined
293
- ) {
294
- instance.props.value = keyed_component_values[instance.key];
295
- }
296
-
297
327
  _component_map.set(instance.id, instance);
298
328
 
299
329
  if (node.children) {
@@ -343,14 +373,6 @@ export function create_components(initial_layout: ComponentMeta | undefined): {
343
373
  let update_scheduled = false;
344
374
  let update_scheduled_store = writable(false);
345
375
 
346
- function store_keyed_values(components: ComponentMeta[]): void {
347
- components.forEach((c) => {
348
- if (c.key != null) {
349
- keyed_component_values[c.key] = c.props.value;
350
- }
351
- });
352
- }
353
-
354
376
  function flush(): void {
355
377
  layout_store.update((layout) => {
356
378
  for (let i = 0; i < pending_updates.length; i++) {
package/src/lang/en.json CHANGED
@@ -69,6 +69,10 @@
69
69
  "language": "Language",
70
70
  "display_theme": "Display Theme",
71
71
  "pwa": "Progressive Web App",
72
+ "record": "Record",
73
+ "stop_recording": "Stop Recording",
74
+ "screen_studio": "Screen Studio",
75
+ "share_gradio_tab": "[Sharing] Gradio Tab",
72
76
  "run": "Run"
73
77
  },
74
78
  "dataframe": {
@@ -98,7 +102,8 @@
98
102
  "runtime_error": "there is a runtime error",
99
103
  "space_not_working": "\"Space isn't working because\" {0}",
100
104
  "space_paused": "the space is paused",
101
- "use_via_api": "Use via API"
105
+ "use_via_api": "Use via API",
106
+ "use_via_api_or_mcp": "Use via API or MCP"
102
107
  },
103
108
  "file": {
104
109
  "uploading": "Uploading..."
package/src/lang/es.json CHANGED
@@ -88,7 +88,8 @@
88
88
  "runtime_error": "hay un error de ejecución",
89
89
  "space_not_working": "\"El Space no funciona porque\" {0}",
90
90
  "space_paused": "el space está pausado",
91
- "use_via_api": "Usar vía API"
91
+ "use_via_api": "Usar vía API",
92
+ "use_via_api_or_mcp": "Usar vía API o MCP"
92
93
  },
93
94
  "file": {
94
95
  "uploading": "Subiendo..."
package/src/lang/fr.json CHANGED
@@ -89,7 +89,8 @@
89
89
  "runtime_error": "il y a une erreur d'exécution",
90
90
  "space_not_working": "\"Le Space ne fonctionne pas car\" {0}",
91
91
  "space_paused": "le Space est en pause",
92
- "use_via_api": "Utiliser via l'API"
92
+ "use_via_api": "Utiliser via API",
93
+ "use_via_api_or_mcp": "Utiliser via API ou MCP"
93
94
  },
94
95
  "file": {
95
96
  "uploading": "Téléchargement..."
package/src/lang/ja.json CHANGED
@@ -87,7 +87,8 @@
87
87
  "runtime_error": "ランタイムエラーがあります",
88
88
  "space_not_working": "\"Spaceが動作していません。理由:\" {0}",
89
89
  "space_paused": "Spaceが一時停止されています",
90
- "use_via_api": "APIを介して使用"
90
+ "use_via_api": "APIを介して使用",
91
+ "use_via_api_or_mcp": "APIまたはMCP経由で使用"
91
92
  },
92
93
  "file": {
93
94
  "uploading": "アップロード中..."
package/src/lang/ko.json CHANGED
@@ -87,7 +87,8 @@
87
87
  "runtime_error": "런타임 오류가 있습니다",
88
88
  "space_not_working": "\"Space가 작동하지 않는 이유:\" {0}",
89
89
  "space_paused": "space가 일시 중지되었습니다",
90
- "use_via_api": "API를 통해 사용"
90
+ "use_via_api": "API를 통해 사용",
91
+ "use_via_api_or_mcp": "API 또는 MCP를 통해 사용"
91
92
  },
92
93
  "file": {
93
94
  "uploading": "업로드 중..."
package/src/lang/lt.json CHANGED
@@ -97,7 +97,8 @@
97
97
  "runtime_error": "yra vykdymo klaida",
98
98
  "space_not_working": "\"Erdvė neveikia, nes\" {0}",
99
99
  "space_paused": "erdvė yra pristabdyta",
100
- "use_via_api": "Naudoti per API"
100
+ "use_via_api": "Naudoti per API",
101
+ "use_via_api_or_mcp": "Naudoti per API arba MCP"
101
102
  },
102
103
  "file": {
103
104
  "uploading": "Įkeliama..."
package/src/lang/nb.json CHANGED
@@ -87,7 +87,8 @@
87
87
  "runtime_error": "Det er en kjøretidsfeil",
88
88
  "space_not_working": "\"Space fungerer ikke fordi\" {0}",
89
89
  "space_paused": "Space er pauset",
90
- "use_via_api": "Bruk via API"
90
+ "use_via_api": "Bruk via API",
91
+ "use_via_api_or_mcp": "Bruk via API eller MCP"
91
92
  },
92
93
  "file": {
93
94
  "uploading": "Laster opp..."
package/src/lang/nl.json CHANGED
@@ -97,7 +97,8 @@
97
97
  "runtime_error": "Er is een runtime-fout",
98
98
  "space_not_working": "\"Space werkt niet omdat\" {0}",
99
99
  "space_paused": "De Space is gepauzeerd",
100
- "use_via_api": "Gebruik via API"
100
+ "use_via_api": "Gebruik via API",
101
+ "use_via_api_or_mcp": "Gebruik via API of MCP"
101
102
  },
102
103
  "file": {
103
104
  "uploading": "Uploaden..."
package/src/lang/pl.json CHANGED
@@ -87,7 +87,8 @@
87
87
  "runtime_error": "Wystąpił błąd wykonania",
88
88
  "space_not_working": "\"Space nie działa, ponieważ\" {0}",
89
89
  "space_paused": "Space jest wstrzymany",
90
- "use_via_api": "Użyj przez API"
90
+ "use_via_api": "Użyj przez API",
91
+ "use_via_api_or_mcp": "Użyj przez API lub MCP"
91
92
  },
92
93
  "file": {
93
94
  "uploading": "Przesyłanie..."
@@ -98,6 +98,7 @@
98
98
  "space_not_working": "\"O Space não está funcionando porque\" {0}",
99
99
  "space_paused": "O Space está pausado",
100
100
  "use_via_api": "Usar via API",
101
+ "use_via_api_or_mcp": "Usar via API ou MCP",
101
102
  "runtime_error": "Houve um erro de execução"
102
103
  },
103
104
  "file": {
package/src/lang/pt.json CHANGED
@@ -87,7 +87,8 @@
87
87
  "runtime_error": "Há um erro de execução",
88
88
  "space_not_working": "\"O Space não está a funcionar porque\" {0}",
89
89
  "space_paused": "O Space está em pausa",
90
- "use_via_api": "Utilizar via API"
90
+ "use_via_api": "Usar via API",
91
+ "use_via_api_or_mcp": "Usar via API ou MCP"
91
92
  },
92
93
  "file": {
93
94
  "uploading": "A carregar..."
package/src/lang/ro.json CHANGED
@@ -87,7 +87,8 @@
87
87
  "runtime_error": "Există o eroare de execuție",
88
88
  "space_not_working": "\"Space-ul nu funcționează deoarece\" {0}",
89
89
  "space_paused": "Space-ul este în pauză",
90
- "use_via_api": "Utilizați prin API"
90
+ "use_via_api": "Utilizați prin API",
91
+ "use_via_api_or_mcp": "Utilizați prin API sau MCP"
91
92
  },
92
93
  "file": {
93
94
  "uploading": "Se încarcă..."
package/src/lang/ru.json CHANGED
@@ -87,7 +87,8 @@
87
87
  "runtime_error": "Произошла ошибка выполнения",
88
88
  "space_not_working": "\"Space не работает, потому что\" {0}",
89
89
  "space_paused": "Space приостановлен",
90
- "use_via_api": "Использовать через API"
90
+ "use_via_api": "Использовать через API",
91
+ "use_via_api_or_mcp": "Использовать через API или MCP"
91
92
  },
92
93
  "file": {
93
94
  "uploading": "Загрузка..."
package/src/lang/sv.json CHANGED
@@ -87,7 +87,8 @@
87
87
  "runtime_error": "Det finns ett körtidsfel",
88
88
  "space_not_working": "\"Space fungerar inte eftersom\" {0}",
89
89
  "space_paused": "Space är pausat",
90
- "use_via_api": "Använd via API"
90
+ "use_via_api": "Använd via API",
91
+ "use_via_api_or_mcp": "Använd via API eller MCP"
91
92
  },
92
93
  "file": {
93
94
  "uploading": "Laddar upp..."
package/src/lang/ta.json CHANGED
@@ -97,7 +97,8 @@
97
97
  "runtime_error": "இயக்க நேர பிழை உள்ளது",
98
98
  "space_not_working": "\"Space செயல்படவில்லை ஏனெனில்\" {0}",
99
99
  "space_paused": "Space இடைநிறுத்தப்பட்டுள்ளது",
100
- "use_via_api": "API மூலம் பயன்படுத்தவும்"
100
+ "use_via_api": "API மூலம் பயன்படுத்தவும்",
101
+ "use_via_api_or_mcp": "API அல்லது MCP மூலம் பயன்படுத்தவும்"
101
102
  },
102
103
  "file": {
103
104
  "uploading": "பதிவேற்றுகிறது..."
package/src/lang/th.json CHANGED
@@ -87,7 +87,8 @@
87
87
  "runtime_error": "เกิดข้อผิดพลาดขณะทำงาน",
88
88
  "space_not_working": "\"Space ใช้งานไม่ได้เนื่องจาก\" {0}",
89
89
  "space_paused": "Space ถูกหยุดชั่วคราว",
90
- "use_via_api": "ใช้งานผ่าน API"
90
+ "use_via_api": "ใช้งานผ่าน API",
91
+ "use_via_api_or_mcp": "ใช้งานผ่าน API หรือ MCP"
91
92
  },
92
93
  "file": {
93
94
  "uploading": "กำลังอัปโหลด..."
package/src/lang/tr.json CHANGED
@@ -97,7 +97,8 @@
97
97
  "runtime_error": "Bir çalışma zamanı hatası var",
98
98
  "space_not_working": "\"Space çalışmıyor çünkü\" {0}",
99
99
  "space_paused": "Space duraklatıldı",
100
- "use_via_api": "API üzerinden kullan"
100
+ "use_via_api": "API üzerinden kullan",
101
+ "use_via_api_or_mcp": "API veya MCP üzerinden kullan"
101
102
  },
102
103
  "file": {
103
104
  "uploading": "Yükleniyor..."
package/src/lang/uk.json CHANGED
@@ -97,7 +97,8 @@
97
97
  "runtime_error": "Є помилка виконання",
98
98
  "space_not_working": "\"Space не працює, оскільки\" {0}",
99
99
  "space_paused": "Space призупинено",
100
- "use_via_api": "Використовувати через API"
100
+ "use_via_api": "Використовувати через API",
101
+ "use_via_api_or_mcp": "Використовувати через API або MCP"
101
102
  },
102
103
  "file": {
103
104
  "uploading": "Завантаження..."
package/src/lang/ur.json CHANGED
@@ -97,7 +97,8 @@
97
97
  "runtime_error": "رن ٹائم میں خطا ہے",
98
98
  "space_not_working": "\"Space کام نہیں کر رہا ہے کیونکہ\" {0}",
99
99
  "space_paused": "Space موقوف ہے",
100
- "use_via_api": "API کے ذریعے استعمال کریں"
100
+ "use_via_api": "API کے ذریعے استعمال کریں",
101
+ "use_via_api_or_mcp": "API یا MCP کے ذریعے استعمال کریں"
101
102
  },
102
103
  "file": {
103
104
  "uploading": "اپلوڈ ہو رہا ہے..."