@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.
- package/CHANGELOG.md +43 -0
- package/dist/src/Blocks.svelte +75 -4
- package/dist/src/Render.svelte +2 -2
- package/dist/src/RenderComponent.svelte +21 -1
- package/dist/src/api_docs/ApiDocs.svelte +6 -1
- package/dist/src/api_docs/Settings.svelte +74 -1
- package/dist/src/api_docs/Settings.svelte.d.ts +3 -0
- package/dist/src/api_docs/img/record-stop.svg +1 -0
- package/dist/src/api_docs/img/record.svg +1 -0
- package/dist/src/gradio_helper.d.ts +1 -11
- package/dist/src/gradio_helper.js +3 -19
- package/dist/src/i18n.d.ts +12 -5
- package/dist/src/i18n.js +93 -12
- package/dist/src/init.js +40 -20
- package/dist/src/lang/en.json +6 -1
- package/dist/src/lang/es.json +2 -1
- package/dist/src/lang/fr.json +2 -1
- package/dist/src/lang/ja.json +2 -1
- package/dist/src/lang/ko.json +2 -1
- package/dist/src/lang/lt.json +2 -1
- package/dist/src/lang/nb.json +2 -1
- package/dist/src/lang/nl.json +2 -1
- package/dist/src/lang/pl.json +2 -1
- package/dist/src/lang/pt-BR.json +1 -0
- package/dist/src/lang/pt.json +2 -1
- package/dist/src/lang/ro.json +2 -1
- package/dist/src/lang/ru.json +2 -1
- package/dist/src/lang/sv.json +2 -1
- package/dist/src/lang/ta.json +2 -1
- package/dist/src/lang/th.json +2 -1
- package/dist/src/lang/tr.json +2 -1
- package/dist/src/lang/uk.json +2 -1
- package/dist/src/lang/ur.json +2 -1
- package/dist/src/lang/uz.json +2 -1
- package/dist/src/lang/zh-CN.json +2 -1
- package/dist/src/lang/zh-TW.json +2 -1
- package/dist/src/screen_recorder.d.ts +16 -0
- package/dist/src/screen_recorder.js +255 -0
- package/package.json +53 -53
- package/src/Blocks.svelte +86 -6
- package/src/Render.svelte +2 -2
- package/src/RenderComponent.svelte +21 -1
- package/src/api_docs/ApiDocs.svelte +7 -1
- package/src/api_docs/Settings.svelte +77 -1
- package/src/api_docs/img/record-stop.svg +1 -0
- package/src/api_docs/img/record.svg +1 -0
- package/src/gradio_helper.ts +5 -21
- package/src/i18n.test.ts +120 -1
- package/src/i18n.ts +126 -24
- package/src/init.ts +48 -26
- package/src/lang/en.json +6 -1
- package/src/lang/es.json +2 -1
- package/src/lang/fr.json +2 -1
- package/src/lang/ja.json +2 -1
- package/src/lang/ko.json +2 -1
- package/src/lang/lt.json +2 -1
- package/src/lang/nb.json +2 -1
- package/src/lang/nl.json +2 -1
- package/src/lang/pl.json +2 -1
- package/src/lang/pt-BR.json +1 -0
- package/src/lang/pt.json +2 -1
- package/src/lang/ro.json +2 -1
- package/src/lang/ru.json +2 -1
- package/src/lang/sv.json +2 -1
- package/src/lang/ta.json +2 -1
- package/src/lang/th.json +2 -1
- package/src/lang/tr.json +2 -1
- package/src/lang/uk.json +2 -1
- package/src/lang/ur.json +2 -1
- package/src/lang/uz.json +2 -1
- package/src/lang/zh-CN.json +2 -1
- package/src/lang/zh-TW.json +2 -1
- package/src/screen_recorder.ts +361 -0
package/src/i18n.test.ts
CHANGED
|
@@ -1,7 +1,36 @@
|
|
|
1
|
-
import {
|
|
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
|
-
|
|
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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
|
|
21
|
-
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
78
|
+
return value;
|
|
79
|
+
} catch (e) {
|
|
80
|
+
console.error("Error processing translation:", e);
|
|
81
|
+
return value;
|
|
26
82
|
}
|
|
83
|
+
}
|
|
27
84
|
|
|
28
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
221
|
-
|
|
222
|
-
|
|
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
|
-
|
|
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
|
|
258
|
-
instance.
|
|
259
|
-
|
|
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
|
|
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..."
|
package/src/lang/pt-BR.json
CHANGED
|
@@ -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": "
|
|
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": "اپلوڈ ہو رہا ہے..."
|