@gradio/core 0.16.0 → 0.17.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 (63) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/dist/src/Blocks.svelte +6 -2
  3. package/dist/src/Render.svelte +2 -2
  4. package/dist/src/RenderComponent.svelte +21 -1
  5. package/dist/src/api_docs/ApiDocs.svelte +18 -3
  6. package/dist/src/gradio_helper.d.ts +1 -11
  7. package/dist/src/gradio_helper.js +3 -19
  8. package/dist/src/i18n.d.ts +12 -5
  9. package/dist/src/i18n.js +93 -12
  10. package/dist/src/init.js +36 -20
  11. package/dist/src/lang/en.json +2 -1
  12. package/dist/src/lang/es.json +2 -1
  13. package/dist/src/lang/fr.json +2 -1
  14. package/dist/src/lang/ja.json +2 -1
  15. package/dist/src/lang/ko.json +2 -1
  16. package/dist/src/lang/lt.json +2 -1
  17. package/dist/src/lang/nb.json +2 -1
  18. package/dist/src/lang/nl.json +2 -1
  19. package/dist/src/lang/pl.json +2 -1
  20. package/dist/src/lang/pt-BR.json +1 -0
  21. package/dist/src/lang/pt.json +2 -1
  22. package/dist/src/lang/ro.json +2 -1
  23. package/dist/src/lang/ru.json +2 -1
  24. package/dist/src/lang/sv.json +2 -1
  25. package/dist/src/lang/ta.json +2 -1
  26. package/dist/src/lang/th.json +2 -1
  27. package/dist/src/lang/tr.json +2 -1
  28. package/dist/src/lang/uk.json +2 -1
  29. package/dist/src/lang/ur.json +2 -1
  30. package/dist/src/lang/uz.json +2 -1
  31. package/dist/src/lang/zh-CN.json +2 -1
  32. package/dist/src/lang/zh-TW.json +2 -1
  33. package/package.json +53 -53
  34. package/src/Blocks.svelte +7 -3
  35. package/src/Render.svelte +2 -2
  36. package/src/RenderComponent.svelte +21 -1
  37. package/src/api_docs/ApiDocs.svelte +19 -3
  38. package/src/gradio_helper.ts +5 -21
  39. package/src/i18n.test.ts +120 -1
  40. package/src/i18n.ts +126 -24
  41. package/src/init.ts +47 -26
  42. package/src/lang/en.json +2 -1
  43. package/src/lang/es.json +2 -1
  44. package/src/lang/fr.json +2 -1
  45. package/src/lang/ja.json +2 -1
  46. package/src/lang/ko.json +2 -1
  47. package/src/lang/lt.json +2 -1
  48. package/src/lang/nb.json +2 -1
  49. package/src/lang/nl.json +2 -1
  50. package/src/lang/pl.json +2 -1
  51. package/src/lang/pt-BR.json +1 -0
  52. package/src/lang/pt.json +2 -1
  53. package/src/lang/ro.json +2 -1
  54. package/src/lang/ru.json +2 -1
  55. package/src/lang/sv.json +2 -1
  56. package/src/lang/ta.json +2 -1
  57. package/src/lang/th.json +2 -1
  58. package/src/lang/tr.json +2 -1
  59. package/src/lang/uk.json +2 -1
  60. package/src/lang/ur.json +2 -1
  61. package/src/lang/uz.json +2 -1
  62. package/src/lang/zh-CN.json +2 -1
  63. package/src/lang/zh-TW.json +2 -1
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,22 @@ 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
+ let replacement_components: ComponentMeta[] = [];
183
+ let new_components: ComponentMeta[] = [];
184
+ console.log("old_keys", keys_per_render_id[render_id]);
185
+ console.log(
186
+ "new_keys",
187
+ components.map((c) => c.key)
188
+ );
189
+ components.forEach((c) => {
190
+ if (c.key == null || !keys_per_render_id[render_id]?.includes(c.key)) {
191
+ new_components.push(c);
192
+ } else {
193
+ replacement_components.push(c);
194
+ }
195
+ });
196
+ console.log(new_components.length, replacement_components.length);
197
+ let _constructor_map = preload_all_components(new_components, root);
184
198
  _constructor_map.forEach((v, k) => {
185
199
  constructor_map.set(k, v);
186
200
  });
@@ -212,19 +226,36 @@ export function create_components(initial_layout: ComponentMeta | undefined): {
212
226
  }
213
227
  };
214
228
  add_to_current_children(current_element);
215
- store_keyed_values(all_current_children);
216
229
 
217
230
  Object.entries(instance_map).forEach(([id, component]) => {
218
231
  let _id = Number(id);
219
232
  if (component.rendered_in === render_id) {
220
- delete instance_map[_id];
221
- if (_component_map.has(_id)) {
222
- _component_map.delete(_id);
233
+ let replacement_component = replacement_components.find(
234
+ (c) => c.key === component.key
235
+ );
236
+ if (component.key != null && replacement_component !== undefined) {
237
+ const instance = instance_map[component.id];
238
+ for (const prop in replacement_component.props) {
239
+ if (
240
+ !(
241
+ replacement_component.props.preserved_by_key as
242
+ | string[]
243
+ | undefined
244
+ )?.includes(prop)
245
+ ) {
246
+ instance.props[prop] = replacement_component.props[prop];
247
+ }
248
+ }
249
+ } else {
250
+ delete instance_map[_id];
251
+ if (_component_map.has(_id)) {
252
+ _component_map.delete(_id);
253
+ }
223
254
  }
224
255
  }
225
256
  });
226
257
 
227
- components.forEach((c) => {
258
+ new_components.forEach((c) => {
228
259
  instance_map[c.id] = c;
229
260
  _component_map.set(c.id, c);
230
261
  });
@@ -241,6 +272,9 @@ export function create_components(initial_layout: ComponentMeta | undefined): {
241
272
  current_element.parent
242
273
  ).then(() => {
243
274
  layout_store.set(_rootNode);
275
+ keys_per_render_id[render_id] = components
276
+ .map((c) => c.key)
277
+ .filter((c) => c != null) as (string | number)[];
244
278
  });
245
279
 
246
280
  set_event_specific_args(dependencies);
@@ -254,9 +288,11 @@ export function create_components(initial_layout: ComponentMeta | undefined): {
254
288
  ): Promise<ComponentMeta> {
255
289
  const instance = instance_map[node.id];
256
290
 
257
- instance.component = (await constructor_map.get(
258
- instance.component_class_id || instance.type
259
- ))!?.default;
291
+ if (!instance.component) {
292
+ instance.component = (await constructor_map.get(
293
+ instance.component_class_id || instance.type
294
+ ))!?.default;
295
+ }
260
296
  instance.parent = parent;
261
297
 
262
298
  if (instance.type === "dataset") {
@@ -287,13 +323,6 @@ export function create_components(initial_layout: ComponentMeta | undefined): {
287
323
  app
288
324
  );
289
325
 
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
326
  _component_map.set(instance.id, instance);
298
327
 
299
328
  if (node.children) {
@@ -343,14 +372,6 @@ export function create_components(initial_layout: ComponentMeta | undefined): {
343
372
  let update_scheduled = false;
344
373
  let update_scheduled_store = writable(false);
345
374
 
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
375
  function flush(): void {
355
376
  layout_store.update((layout) => {
356
377
  for (let i = 0; i < pending_updates.length; i++) {
package/src/lang/en.json CHANGED
@@ -98,7 +98,8 @@
98
98
  "runtime_error": "there is a runtime error",
99
99
  "space_not_working": "\"Space isn't working because\" {0}",
100
100
  "space_paused": "the space is paused",
101
- "use_via_api": "Use via API"
101
+ "use_via_api": "Use via API",
102
+ "use_via_api_or_mcp": "Use via API or MCP"
102
103
  },
103
104
  "file": {
104
105
  "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": "اپلوڈ ہو رہا ہے..."
package/src/lang/uz.json CHANGED
@@ -97,7 +97,8 @@
97
97
  "runtime_error": "Bajarilish vaqti xatosi mavjud",
98
98
  "space_not_working": "\"Space ishlamayapti, chunki\" {0}",
99
99
  "space_paused": "Space to'xtatilgan",
100
- "use_via_api": "API orqali foydalaning"
100
+ "use_via_api": "API orqali foydalaning",
101
+ "use_via_api_or_mcp": "API yoki MCP orqali foydalaning"
101
102
  },
102
103
  "file": {
103
104
  "uploading": "Yuklanmoqda..."
@@ -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": "正在上传..."
@@ -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": "上傳中..."