@green-on-grey/ui-kit 1.9.0 → 1.10.3

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/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
- import { a as e, c as t, d as n, i as r, l as i, n as a, o, r as s, s as c, t as l, u } from "./ui-DvmjcG-d.js";
2
- import { n as d, t as f } from "./i18n-BJ8rsBp6.js";
3
- import { jsx as p, jsxs as m } from "react/jsx-runtime";
4
- import { useCallback as h, useEffect as g, useRef as _, useState as v } from "react";
1
+ import { a as e, c as t, d as n, f as r, i, l as a, n as o, o as s, r as c, s as l, t as u, u as d } from "./ui-sV5t0cp1.js";
2
+ import { n as f, t as p } from "./i18n-BJ8rsBp6.js";
3
+ import { jsx as m, jsxs as h } from "react/jsx-runtime";
4
+ import { useCallback as g, useEffect as _, useState as v } from "react";
5
5
  //#region src/components/Button.tsx
6
6
  function y({ variant: e, size: t, className: n, type: r = "button", ...i }) {
7
7
  let a = [
@@ -10,7 +10,7 @@ function y({ variant: e, size: t, className: n, type: r = "button", ...i }) {
10
10
  t,
11
11
  n
12
12
  ].filter(Boolean).join(" ");
13
- return /* @__PURE__ */ p("button", {
13
+ return /* @__PURE__ */ m("button", {
14
14
  type: r,
15
15
  className: a,
16
16
  ...i
@@ -23,7 +23,7 @@ function b({ label: e, fill: t, on: n, className: r, type: i = "button", ...a })
23
23
  n && "on",
24
24
  r
25
25
  ].filter(Boolean).join(" ");
26
- return /* @__PURE__ */ p("button", {
26
+ return /* @__PURE__ */ m("button", {
27
27
  type: i,
28
28
  className: o,
29
29
  "aria-label": e,
@@ -31,37 +31,13 @@ function b({ label: e, fill: t, on: n, className: r, type: i = "button", ...a })
31
31
  });
32
32
  }
33
33
  //#endregion
34
- //#region src/components/Tabs.tsx
35
- function x({ items: e, value: t, onChange: n, label: r }) {
36
- let i = _(null);
37
- return /* @__PURE__ */ p("div", {
38
- className: "tabs",
39
- role: "tablist",
40
- "aria-label": r,
41
- ref: i,
42
- onKeyDown: (r) => {
43
- let a = e.findIndex((e) => e.key === t), o = r.key === "ArrowRight" ? (a + 1) % e.length : r.key === "ArrowLeft" ? (a - 1 + e.length) % e.length : r.key === "Home" ? 0 : r.key === "End" ? e.length - 1 : -1;
44
- o < 0 || (r.preventDefault(), n(e[o].key), i.current?.querySelectorAll("[role=\"tab\"]")[o]?.focus());
45
- },
46
- children: e.map((e) => /* @__PURE__ */ p("button", {
47
- type: "button",
48
- role: "tab",
49
- "aria-selected": e.key === t,
50
- tabIndex: e.key === t ? 0 : -1,
51
- className: e.key === t ? "on" : void 0,
52
- onClick: () => n(e.key),
53
- children: e.label
54
- }, e.key))
55
- });
56
- }
57
- //#endregion
58
34
  //#region src/components/Menu.tsx
59
- function S({ onClose: e, label: t, className: n, children: r }) {
60
- let i = c(!0, e);
61
- return g(() => {
35
+ function x({ onClose: e, label: t, className: n, children: r }) {
36
+ let i = l(!0, e);
37
+ return _(() => {
62
38
  let e = document.activeElement;
63
39
  return () => e?.focus?.();
64
- }, []), /* @__PURE__ */ p("div", {
40
+ }, []), /* @__PURE__ */ m("div", {
65
41
  className: `menu${n ? ` ${n}` : ""}`,
66
42
  role: "dialog",
67
43
  "aria-label": t,
@@ -71,68 +47,68 @@ function S({ onClose: e, label: t, className: n, children: r }) {
71
47
  }
72
48
  //#endregion
73
49
  //#region src/components/TopBar.tsx
74
- function C({ logo: e, name: t, home: r = "/", sections: i, Link: a, center: o, actions: s, avatar: l, profileMenu: u, menu: f }) {
75
- let g = d(), [_, y] = v(!1), [b, x] = v(!1), S = h(() => x(!1), []), C = h(() => y(!1), []), w = c(b, S), T = i.map((e) => /* @__PURE__ */ p(a, {
50
+ function S({ logo: e, name: t, home: n = "/", sections: i, Link: a, center: o, actions: s, avatar: c, profileMenu: u, menu: d }) {
51
+ let p = f(), [_, y] = v(!1), [b, x] = v(!1), S = g(() => x(!1), []), C = g(() => y(!1), []), w = l(b, S), T = i.map((e) => /* @__PURE__ */ m(a, {
76
52
  href: e.href,
77
53
  className: e.active ? "on" : void 0,
78
54
  "aria-current": e.active ? "page" : void 0,
79
55
  onClick: S,
80
56
  children: e.label
81
57
  }, e.key));
82
- return /* @__PURE__ */ m("div", {
58
+ return /* @__PURE__ */ h("div", {
83
59
  className: "topbar",
84
60
  children: [
85
- /* @__PURE__ */ m(a, {
86
- href: r,
61
+ /* @__PURE__ */ h(a, {
62
+ href: n,
87
63
  className: "brand",
88
- children: [/* @__PURE__ */ p("img", {
64
+ children: [/* @__PURE__ */ m("img", {
89
65
  src: e,
90
66
  alt: ""
91
- }), /* @__PURE__ */ p("span", {
67
+ }), /* @__PURE__ */ m("span", {
92
68
  className: "hide-m",
93
69
  children: t
94
70
  })]
95
71
  }),
96
- /* @__PURE__ */ p("nav", {
72
+ /* @__PURE__ */ m("nav", {
97
73
  className: "nav hide-m",
98
- "aria-label": g("topbar.sections"),
74
+ "aria-label": p("topbar.sections"),
99
75
  children: T
100
76
  }),
101
77
  o,
102
- /* @__PURE__ */ m("div", {
78
+ /* @__PURE__ */ h("div", {
103
79
  className: "top-actions",
104
80
  children: [
105
81
  s,
106
- /* @__PURE__ */ p("button", {
82
+ /* @__PURE__ */ m("button", {
107
83
  className: "avatar",
108
84
  style: _ ? { boxShadow: "0 0 0 2px var(--violet)" } : void 0,
109
85
  onClick: () => {
110
86
  x(!1), y((e) => !e);
111
87
  },
112
- "aria-label": g("topbar.profile"),
88
+ "aria-label": p("topbar.profile"),
113
89
  "aria-expanded": _,
114
- children: l
90
+ children: c
115
91
  }),
116
- /* @__PURE__ */ m("div", {
92
+ /* @__PURE__ */ h("div", {
117
93
  className: "burger",
118
94
  ref: w,
119
- children: [/* @__PURE__ */ p("button", {
95
+ children: [/* @__PURE__ */ m("button", {
120
96
  className: `iconbtn${b ? " on" : ""}`,
121
97
  onClick: () => {
122
98
  y(!1), x((e) => !e);
123
99
  },
124
- "aria-label": f?.label ?? g("topbar.sections"),
100
+ "aria-label": d?.label ?? p("topbar.sections"),
125
101
  "aria-expanded": b,
126
102
  "aria-controls": "nav-sections",
127
- children: /* @__PURE__ */ p(n, { name: b ? "x" : "menu" })
128
- }), b && (f ? /* @__PURE__ */ p("div", {
103
+ children: /* @__PURE__ */ m(r, { name: b ? "x" : "menu" })
104
+ }), b && (d ? /* @__PURE__ */ m("div", {
129
105
  id: "nav-sections",
130
106
  className: "navmenu",
131
- children: f.render(S)
132
- }) : /* @__PURE__ */ p("nav", {
107
+ children: d.render(S)
108
+ }) : /* @__PURE__ */ m("nav", {
133
109
  id: "nav-sections",
134
110
  className: "navmenu",
135
- "aria-label": g("topbar.sections"),
111
+ "aria-label": p("topbar.sections"),
136
112
  children: T
137
113
  }))]
138
114
  })
@@ -143,6 +119,6 @@ function C({ logo: e, name: t, home: r = "/", sections: i, Link: a, center: o, a
143
119
  });
144
120
  }
145
121
  //#endregion
146
- export { l as Avatar, y as Button, a as Empty, u as GitHubIcon, n as Icon, b as IconButton, s as Loading, i as Markdown, S as Menu, r as Modal, e as Switch, x as Tabs, o as ToastProvider, C as TopBar, f as UIKIT_NS, c as useOutside, t as useToast };
122
+ export { u as Avatar, y as Button, o as Empty, n as GitHubIcon, r as Icon, b as IconButton, c as Loading, d as Markdown, x as Menu, i as Modal, e as Switch, a as Tabs, s as ToastProvider, S as TopBar, p as UIKIT_NS, l as useOutside, t as useToast };
147
123
 
148
124
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Switch","useToast","Icon","Modal","Markdown","Empty","Loading","useOutside","Avatar","useKitT","UIKIT_NS","Button","rest","cls","variant","size","className","IconButton","fill","on","label","Tabs","ref","useRef","i","items","it","value","to","e","onChange","Menu","onClose","useEffect","opener","TopBar","t","profileOpen","setProfileOpen","useState","sectionsOpen","setSectionsOpen","closeSections","useCallback","closeProfile","links","sections","Link","s","home","logo","name","center","actions","v","avatar","menu","profileMenu","GitHubIcon","ToastProvider"],"sources":["../src/components/Button.tsx","../src/components/Tabs.tsx","../src/components/Menu.tsx","../src/components/TopBar.tsx"],"sourcesContent":["import type { ButtonHTMLAttributes } from \"react\";\n\ntype Native = ButtonHTMLAttributes<HTMLButtonElement>;\n\n/** `button.btn` with its variants. The classes stay a legitimate way to use a\n * button (FTR.NAB.CMN-0005 tech, decision 1); the component is for new code. */\nexport function Button({ variant, size, className, type = \"button\", ...rest }: Native & {\n variant?: \"primary\" | \"ghost\" | \"danger\"; size?: \"sm\";\n}) {\n const cls = [\"btn\", variant, size, className].filter(Boolean).join(\" \");\n return <button type={type} className={cls} {...rest} />;\n}\n\n/** `button.iconbtn`: a button with an icon only, so the label is required. */\nexport function IconButton({ label, fill, on, className, type = \"button\", ...rest }: Omit<Native, \"aria-label\"> & {\n label: string; fill?: boolean; on?: boolean;\n}) {\n const cls = [\"iconbtn\", fill && \"fill\", on && \"on\", className].filter(Boolean).join(\" \");\n return <button type={type} className={cls} aria-label={label} {...rest} />;\n}\n","import { useRef, type KeyboardEvent, type ReactNode } from \"react\";\n\n/** `.tabs` with the keyboard of a tab list: arrows, Home and End move the choice. */\nexport function Tabs<K extends string>({ items, value, onChange, label }: {\n items: { key: K; label: ReactNode }[]; value: K; onChange: (key: K) => void; label?: string;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const onKey = (e: KeyboardEvent) => {\n const i = items.findIndex((it) => it.key === value);\n const to = e.key === \"ArrowRight\" ? (i + 1) % items.length\n : e.key === \"ArrowLeft\" ? (i - 1 + items.length) % items.length\n : e.key === \"Home\" ? 0 : e.key === \"End\" ? items.length - 1 : -1;\n if (to < 0) return;\n e.preventDefault();\n onChange(items[to].key);\n ref.current?.querySelectorAll<HTMLElement>('[role=\"tab\"]')[to]?.focus();\n };\n return (\n <div className=\"tabs\" role=\"tablist\" aria-label={label} ref={ref} onKeyDown={onKey}>\n {items.map((it) => (\n <button key={it.key} type=\"button\" role=\"tab\" aria-selected={it.key === value} tabIndex={it.key === value ? 0 : -1}\n className={it.key === value ? \"on\" : undefined} onClick={() => onChange(it.key)}>\n {it.label}\n </button>\n ))}\n </div>\n );\n}\n","import { useEffect, type ReactNode } from \"react\";\nimport { useOutside } from \"./ui\";\n\n/** `.menu`: a popover closed by Escape and by a click outside; it is mounted while\n * open. `onClose` must keep its identity between renders. What is inside\n * (sections `.sec`, lines `.line`, actions `.action`) belongs to the product. */\nexport function Menu({ onClose, label, className, children }: {\n onClose: () => void; label?: string; className?: string; children: ReactNode;\n}) {\n const ref = useOutside<HTMLDivElement>(true, onClose);\n // the focus returns to what opened the menu (CMP-05)\n useEffect(() => {\n const opener = document.activeElement as HTMLElement | null;\n return () => opener?.focus?.();\n }, []);\n return (\n <div className={`menu${className ? ` ${className}` : \"\"}`} role=\"dialog\" aria-label={label} ref={ref}>\n {children}\n </div>\n );\n}\n","import { useCallback, useState, type ReactNode } from \"react\";\nimport { useKitT } from \"../i18n\";\nimport { Icon } from \"./Icon\";\nimport { useOutside } from \"./ui\";\n\n/** The link of the product: the kit does not depend on a router (arch §4.2). */\nexport type LinkComponent = (props: {\n href: string; className?: string; onClick?: () => void; \"aria-current\"?: \"page\"; children: ReactNode;\n}) => ReactNode;\n\nexport interface TopBarSection { key: string; label: ReactNode; href: string; active: boolean }\n\n/** The top bar (FTR.NAB.CMN-0005 R5, design §4): the logo and the name, the\n * sections in a row and behind the burger on a phone, the actions of the product,\n * the avatar that opens the profile menu. The profile menu and the list of\n * sections are never open together. A part of the product with its own\n * navigation (the administration) puts it behind the burger in place of the\n * sections: `menu`, with the side panel marked `in-burger`, hidden on a phone. */\nexport function TopBar({ logo, name, home = \"/\", sections, Link, center, actions, avatar, profileMenu, menu }: {\n logo: string; name: string; home?: string; sections: TopBarSection[]; Link: LinkComponent;\n /** Between the sections and the actions: the search of Hammurapi. */\n center?: ReactNode;\n /** Before the avatar. */\n actions?: ReactNode;\n avatar: ReactNode;\n profileMenu: (close: () => void) => ReactNode;\n /** The burger of a phone in place of the sections: the navigation of the current part of the product and\n * its name, which the burger is called by. */\n menu?: { label: string; render: (close: () => void) => ReactNode };\n}) {\n const t = useKitT();\n const [profileOpen, setProfileOpen] = useState(false);\n const [sectionsOpen, setSectionsOpen] = useState(false);\n const closeSections = useCallback(() => setSectionsOpen(false), []);\n const closeProfile = useCallback(() => setProfileOpen(false), []);\n const ref = useOutside<HTMLDivElement>(sectionsOpen, closeSections);\n const links = sections.map((s) => (\n <Link key={s.key} href={s.href} className={s.active ? \"on\" : undefined} aria-current={s.active ? \"page\" : undefined} onClick={closeSections}>\n {s.label}\n </Link>\n ));\n return (\n <div className=\"topbar\">\n <Link href={home} className=\"brand\">\n <img src={logo} alt=\"\" />\n <span className=\"hide-m\">{name}</span>\n </Link>\n <nav className=\"nav hide-m\" aria-label={t(\"topbar.sections\")}>{links}</nav>\n {center}\n <div className=\"top-actions\">\n {actions}\n <button className=\"avatar\" style={profileOpen ? { boxShadow: \"0 0 0 2px var(--violet)\" } : undefined}\n onClick={() => { setSectionsOpen(false); setProfileOpen((v) => !v); }} aria-label={t(\"topbar.profile\")} aria-expanded={profileOpen}>\n {avatar}\n </button>\n <div className=\"burger\" ref={ref}>\n <button className={`iconbtn${sectionsOpen ? \" on\" : \"\"}`} onClick={() => { setProfileOpen(false); setSectionsOpen((v) => !v); }}\n aria-label={menu?.label ?? t(\"topbar.sections\")} aria-expanded={sectionsOpen} aria-controls=\"nav-sections\">\n <Icon name={sectionsOpen ? \"x\" : \"menu\"} />\n </button>\n {sectionsOpen && (menu\n ? <div id=\"nav-sections\" className=\"navmenu\">{menu.render(closeSections)}</div>\n : <nav id=\"nav-sections\" className=\"navmenu\" aria-label={t(\"topbar.sections\")}>{links}</nav>)}\n </div>\n </div>\n {profileOpen && profileMenu(closeProfile)}\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["Switch","useToast","GitHubIcon","Icon","Tabs","Empty","ToastProvider","Loading","useOutside","Avatar","Markdown","useKitT","UIKIT_NS","Button","rest","cls","variant","size","className","IconButton","fill","on","label","Menu","ref","onClose","useEffect","opener","TopBar","t","profileOpen","setProfileOpen","useState","sectionsOpen","setSectionsOpen","closeSections","useCallback","closeProfile","links","sections","Link","s","home","logo","name","center","actions","v","avatar","menu","profileMenu","Modal"],"sources":["../src/components/Button.tsx","../src/components/Menu.tsx","../src/components/TopBar.tsx"],"sourcesContent":["import type { ButtonHTMLAttributes } from \"react\";\n\ntype Native = ButtonHTMLAttributes<HTMLButtonElement>;\n\n/** `button.btn` with its variants. The classes stay a legitimate way to use a\n * button (FTR.NAB.CMN-0005 tech, decision 1); the component is for new code. */\nexport function Button({ variant, size, className, type = \"button\", ...rest }: Native & {\n variant?: \"primary\" | \"ghost\" | \"danger\"; size?: \"sm\";\n}) {\n const cls = [\"btn\", variant, size, className].filter(Boolean).join(\" \");\n return <button type={type} className={cls} {...rest} />;\n}\n\n/** `button.iconbtn`: a button with an icon only, so the label is required. */\nexport function IconButton({ label, fill, on, className, type = \"button\", ...rest }: Omit<Native, \"aria-label\"> & {\n label: string; fill?: boolean; on?: boolean;\n}) {\n const cls = [\"iconbtn\", fill && \"fill\", on && \"on\", className].filter(Boolean).join(\" \");\n return <button type={type} className={cls} aria-label={label} {...rest} />;\n}\n","import { useEffect, type ReactNode } from \"react\";\nimport { useOutside } from \"./ui\";\n\n/** `.menu`: a popover closed by Escape and by a click outside; it is mounted while\n * open. `onClose` must keep its identity between renders. What is inside\n * (sections `.sec`, lines `.line`, actions `.action`) belongs to the product. */\nexport function Menu({ onClose, label, className, children }: {\n onClose: () => void; label?: string; className?: string; children: ReactNode;\n}) {\n const ref = useOutside<HTMLDivElement>(true, onClose);\n // the focus returns to what opened the menu (CMP-05)\n useEffect(() => {\n const opener = document.activeElement as HTMLElement | null;\n return () => opener?.focus?.();\n }, []);\n return (\n <div className={`menu${className ? ` ${className}` : \"\"}`} role=\"dialog\" aria-label={label} ref={ref}>\n {children}\n </div>\n );\n}\n","import { useCallback, useState, type ReactNode } from \"react\";\nimport { useKitT } from \"../i18n\";\nimport { Icon } from \"./Icon\";\nimport { useOutside } from \"./ui\";\n\n/** The link of the product: the kit does not depend on a router (arch §4.2). */\nexport type LinkComponent = (props: {\n href: string; className?: string; onClick?: () => void; \"aria-current\"?: \"page\"; children: ReactNode;\n}) => ReactNode;\n\nexport interface TopBarSection { key: string; label: ReactNode; href: string; active: boolean }\n\n/** The top bar (FTR.NAB.CMN-0005 R5, design §4): the logo and the name, the\n * sections in a row and behind the burger on a phone, the actions of the product,\n * the avatar that opens the profile menu. The profile menu and the list of\n * sections are never open together. A part of the product with its own\n * navigation (the administration) puts it behind the burger in place of the\n * sections: `menu`, with the side panel marked `in-burger`, hidden on a phone. */\nexport function TopBar({ logo, name, home = \"/\", sections, Link, center, actions, avatar, profileMenu, menu }: {\n logo: string; name: string; home?: string; sections: TopBarSection[]; Link: LinkComponent;\n /** Between the sections and the actions: the search of Hammurapi. */\n center?: ReactNode;\n /** Before the avatar. */\n actions?: ReactNode;\n avatar: ReactNode;\n profileMenu: (close: () => void) => ReactNode;\n /** The burger of a phone in place of the sections: the navigation of the current part of the product and\n * its name, which the burger is called by. */\n menu?: { label: string; render: (close: () => void) => ReactNode };\n}) {\n const t = useKitT();\n const [profileOpen, setProfileOpen] = useState(false);\n const [sectionsOpen, setSectionsOpen] = useState(false);\n const closeSections = useCallback(() => setSectionsOpen(false), []);\n const closeProfile = useCallback(() => setProfileOpen(false), []);\n const ref = useOutside<HTMLDivElement>(sectionsOpen, closeSections);\n const links = sections.map((s) => (\n <Link key={s.key} href={s.href} className={s.active ? \"on\" : undefined} aria-current={s.active ? \"page\" : undefined} onClick={closeSections}>\n {s.label}\n </Link>\n ));\n return (\n <div className=\"topbar\">\n <Link href={home} className=\"brand\">\n <img src={logo} alt=\"\" />\n <span className=\"hide-m\">{name}</span>\n </Link>\n <nav className=\"nav hide-m\" aria-label={t(\"topbar.sections\")}>{links}</nav>\n {center}\n <div className=\"top-actions\">\n {actions}\n <button className=\"avatar\" style={profileOpen ? { boxShadow: \"0 0 0 2px var(--violet)\" } : undefined}\n onClick={() => { setSectionsOpen(false); setProfileOpen((v) => !v); }} aria-label={t(\"topbar.profile\")} aria-expanded={profileOpen}>\n {avatar}\n </button>\n <div className=\"burger\" ref={ref}>\n <button className={`iconbtn${sectionsOpen ? \" on\" : \"\"}`} onClick={() => { setProfileOpen(false); setSectionsOpen((v) => !v); }}\n aria-label={menu?.label ?? t(\"topbar.sections\")} aria-expanded={sectionsOpen} aria-controls=\"nav-sections\">\n <Icon name={sectionsOpen ? \"x\" : \"menu\"} />\n </button>\n {sectionsOpen && (menu\n ? <div id=\"nav-sections\" className=\"navmenu\">{menu.render(closeSections)}</div>\n : <nav id=\"nav-sections\" className=\"navmenu\" aria-label={t(\"topbar.sections\")}>{links}</nav>)}\n </div>\n </div>\n {profileOpen && profileMenu(closeProfile)}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -90,6 +90,21 @@ export declare const resources: {
90
90
  rows: string;
91
91
  source: string;
92
92
  page: string;
93
+ converted: string;
94
+ pagesShown: string;
95
+ firstPages: string;
96
+ cols: string;
97
+ preparing: string;
98
+ preparingHint: string;
99
+ unavailable: string;
100
+ formulaHint: string;
101
+ sheets: string;
102
+ reasons: {
103
+ too_large: string;
104
+ timeout: string;
105
+ broken: string;
106
+ busy: string;
107
+ };
93
108
  };
94
109
  notice: {
95
110
  more: string;
@@ -197,6 +212,21 @@ export declare const resources: {
197
212
  rows: string;
198
213
  source: string;
199
214
  page: string;
215
+ converted: string;
216
+ pagesShown: string;
217
+ firstPages: string;
218
+ cols: string;
219
+ preparing: string;
220
+ preparingHint: string;
221
+ unavailable: string;
222
+ formulaHint: string;
223
+ sheets: string;
224
+ reasons: {
225
+ too_large: string;
226
+ timeout: string;
227
+ broken: string;
228
+ busy: string;
229
+ };
200
230
  };
201
231
  notice: {
202
232
  more: string;
@@ -304,6 +334,21 @@ export declare const resources: {
304
334
  rows: string;
305
335
  source: string;
306
336
  page: string;
337
+ converted: string;
338
+ pagesShown: string;
339
+ firstPages: string;
340
+ cols: string;
341
+ preparing: string;
342
+ preparingHint: string;
343
+ unavailable: string;
344
+ formulaHint: string;
345
+ sheets: string;
346
+ reasons: {
347
+ too_large: string;
348
+ timeout: string;
349
+ broken: string;
350
+ busy: string;
351
+ };
307
352
  };
308
353
  notice: {
309
354
  more: string;
@@ -411,6 +456,21 @@ export declare const resources: {
411
456
  rows: string;
412
457
  source: string;
413
458
  page: string;
459
+ converted: string;
460
+ pagesShown: string;
461
+ firstPages: string;
462
+ cols: string;
463
+ preparing: string;
464
+ preparingHint: string;
465
+ unavailable: string;
466
+ formulaHint: string;
467
+ sheets: string;
468
+ reasons: {
469
+ too_large: string;
470
+ timeout: string;
471
+ broken: string;
472
+ busy: string;
473
+ };
414
474
  };
415
475
  notice: {
416
476
  more: string;
@@ -518,6 +578,21 @@ export declare const resources: {
518
578
  rows: string;
519
579
  source: string;
520
580
  page: string;
581
+ converted: string;
582
+ pagesShown: string;
583
+ firstPages: string;
584
+ cols: string;
585
+ preparing: string;
586
+ preparingHint: string;
587
+ unavailable: string;
588
+ formulaHint: string;
589
+ sheets: string;
590
+ reasons: {
591
+ too_large: string;
592
+ timeout: string;
593
+ broken: string;
594
+ busy: string;
595
+ };
521
596
  };
522
597
  notice: {
523
598
  more: string;
package/dist/locales.js CHANGED
@@ -88,7 +88,22 @@ var t = {
88
88
  notUtf8: "The file is not in UTF-8 — download it",
89
89
  rows: "Showing {shown} of {total, plural, one {# row} other {# rows}}",
90
90
  source: "Code",
91
- page: "Page"
91
+ page: "Page",
92
+ converted: "Preview · converted from {format}",
93
+ pagesShown: "Showing {shown} of {total} pages",
94
+ firstPages: "Showing the first {shown} pages",
95
+ cols: "and {shown} of {total} columns",
96
+ preparing: "Preparing the preview…",
97
+ preparingHint: "Usually a few seconds",
98
+ unavailable: "Preview unavailable",
99
+ formulaHint: "The value is calculated when opened in Excel",
100
+ sheets: "Sheets",
101
+ reasons: {
102
+ too_large: "The file is over {limit} MB",
103
+ timeout: "Took longer than 30 seconds",
104
+ broken: "The file is damaged or the format is not supported",
105
+ busy: "The service is busy, try again later"
106
+ }
92
107
  },
93
108
  notice: {
94
109
  more: "Show in full",
@@ -193,7 +208,22 @@ var t = {
193
208
  notUtf8: "Файл не в кодировке UTF-8 — скачайте его",
194
209
  rows: "Показаны {shown} из {total, plural, one {# строки} other {# строк}}",
195
210
  source: "Код",
196
- page: "Страница"
211
+ page: "Страница",
212
+ converted: "Предпросмотр · сконвертировано из {format}",
213
+ pagesShown: "Показаны {shown} из {total} страниц",
214
+ firstPages: "Показаны первые {shown} страниц",
215
+ cols: "и {shown} из {total} столбцов",
216
+ preparing: "Готовим предпросмотр…",
217
+ preparingHint: "Обычно несколько секунд",
218
+ unavailable: "Предпросмотр недоступен",
219
+ formulaHint: "Значение посчитается при открытии в Excel",
220
+ sheets: "Листы",
221
+ reasons: {
222
+ too_large: "Файл больше {limit} МБ",
223
+ timeout: "Не успели за 30 секунд",
224
+ broken: "Файл повреждён или формат не поддерживается",
225
+ busy: "Сервис занят, попробуйте позже"
226
+ }
197
227
  },
198
228
  notice: {
199
229
  more: "Показать полностью",
@@ -298,7 +328,22 @@ var t = {
298
328
  notUtf8: "Die Datei ist nicht in UTF-8 — bitte herunterladen",
299
329
  rows: "{shown} von {total, plural, one {# Zeile} other {# Zeilen}} angezeigt",
300
330
  source: "Code",
301
- page: "Seite"
331
+ page: "Seite",
332
+ converted: "Vorschau · konvertiert aus {format}",
333
+ pagesShown: "{shown} von {total} Seiten werden angezeigt",
334
+ firstPages: "Die ersten {shown} Seiten werden angezeigt",
335
+ cols: "und {shown} von {total} Spalten",
336
+ preparing: "Vorschau wird vorbereitet…",
337
+ preparingHint: "Meist nur wenige Sekunden",
338
+ unavailable: "Vorschau nicht verfügbar",
339
+ formulaHint: "Der Wert wird beim Öffnen in Excel berechnet",
340
+ sheets: "Blätter",
341
+ reasons: {
342
+ too_large: "Die Datei ist größer als {limit} MB",
343
+ timeout: "Hat länger als 30 Sekunden gedauert",
344
+ broken: "Die Datei ist beschädigt oder das Format wird nicht unterstützt",
345
+ busy: "Der Dienst ist ausgelastet, versuchen Sie es später erneut"
346
+ }
302
347
  },
303
348
  notice: {
304
349
  more: "Vollständig anzeigen",
@@ -403,7 +448,22 @@ var t = {
403
448
  notUtf8: "El archivo no está en UTF-8: descárguelo",
404
449
  rows: "Se muestran {shown} de {total, plural, one {# fila} other {# filas}}",
405
450
  source: "Código",
406
- page: "Página"
451
+ page: "Página",
452
+ converted: "Vista previa · convertido desde {format}",
453
+ pagesShown: "Se muestran {shown} de {total} páginas",
454
+ firstPages: "Se muestran las primeras {shown} páginas",
455
+ cols: "y {shown} de {total} columnas",
456
+ preparing: "Preparando la vista previa…",
457
+ preparingHint: "Suele tardar unos segundos",
458
+ unavailable: "Vista previa no disponible",
459
+ formulaHint: "El valor se calcula al abrir el archivo en Excel",
460
+ sheets: "Hojas",
461
+ reasons: {
462
+ too_large: "El archivo supera {limit} MB",
463
+ timeout: "Tardó más de 30 segundos",
464
+ broken: "El archivo está dañado o el formato no es compatible",
465
+ busy: "El servicio está ocupado, inténtalo más tarde"
466
+ }
407
467
  },
408
468
  notice: {
409
469
  more: "Mostrar completo",
@@ -508,7 +568,22 @@ var t = {
508
568
  notUtf8: "文件不是 UTF-8 编码,请下载",
509
569
  rows: "显示 {total} 行中的 {shown} 行",
510
570
  source: "代码",
511
- page: "页面"
571
+ page: "页面",
572
+ converted: "预览 · 由 {format} 转换",
573
+ pagesShown: "显示 {shown} / {total} 页",
574
+ firstPages: "显示前 {shown} 页",
575
+ cols: "以及 {shown} / {total} 列",
576
+ preparing: "正在准备预览…",
577
+ preparingHint: "通常只需几秒",
578
+ unavailable: "无法预览",
579
+ formulaHint: "在 Excel 中打开时计算该值",
580
+ sheets: "工作表",
581
+ reasons: {
582
+ too_large: "文件大于 {limit} MB",
583
+ timeout: "超过 30 秒未完成",
584
+ broken: "文件已损坏或格式不受支持",
585
+ busy: "服务繁忙,请稍后重试"
586
+ }
512
587
  },
513
588
  notice: {
514
589
  more: "显示全部",
@@ -1 +1 @@
1
- {"version":3,"file":"locales.js","names":["loading","cancel","create","close","remove","agentName","topbar","chat","agent","loading","cancel","create","close","remove","agentName","topbar","chat","agent","loading","cancel","create","close","remove","agentName","topbar","chat","agent","loading","cancel","create","close","remove","agentName","topbar","chat","agent","UIKIT_NS","resources","\"delete\"","\"sections\"","\"profile\"","\"title\"","\"conversations\"","\"conversation\"","\"topics\"","\"archive\"","\"noTopics\"","\"newTopic\"","\"topicTitle\"","\"topicHint\"","\"loadOlder\"","\"emptyTitle\"","\"placeholder\"","\"send\"","\"attach\"","\"typing\"","\"moreSteps\"","\"hideSteps\"","\"unread\"","\"retry\"","\"tooLarge\"","\"stop\"","\"voice\"","\"hold\"","\"recording\"","\"review\"","\"notRecognized\"","\"micDenied\"","\"unsupported\"","\"start\"","\"done\"","\"recognizing\"","\"recordingNow\"","\"failed\"","\"confirm\"","\"text\"","\"approve\"","\"reject\"","\"wait\"","\"starting\"","\"queued\"","\"palette\"","\"commands\"","\"skills\"","\"noSkills\"","\"empty\"","\"unknownCommand\"","\"sendAsText\"","\"skillPlaceholder\"","\"context\"","\"meter\"","\"full\"","\"compact\"","\"reset\"","\"waitTurn\"","\"event\"","\"details\"","\"files\"","\"open\"","\"download\"","\"save\"","\"notUtf8\"","\"rows\"","\"source\"","\"page\"","\"notice\"","\"more\"","\"less\"","\"menu\"","\"options\"","\"model\"","\"modelDefault\"","\"noModels\"","\"modelCompactWarn\"","\"everywhere\"","\"capImage\"","\"capReasoning\""],"sources":["../src/locales/en.json","../src/locales/ru.json","../src/locales/de.json","../src/locales/es.json","../src/locales/zh.json","../src/locales/index.ts"],"sourcesContent":["{\n \"loading\": \"Loading…\",\n \"cancel\": \"Cancel\",\n \"create\": \"Create\",\n \"close\": \"Close\",\n \"delete\": \"Delete\",\n \"remove\": \"Remove\",\n \"agentName\": \"Agent name\",\n \"topbar\": {\n \"sections\": \"Sections\",\n \"profile\": \"Profile\"\n },\n \"chat\": {\n \"title\": \"Chat\",\n \"conversations\": \"Conversations\",\n \"conversation\": \"Conversation\",\n \"topics\": \"Topics\",\n \"archive\": \"Archive\",\n \"noTopics\": \"No topics yet\",\n \"newTopic\": \"New topic\",\n \"topicTitle\": \"Topic\",\n \"topicHint\": \"A topic has its own history and the same memory and space.\",\n \"loadOlder\": \"Earlier messages\",\n \"emptyTitle\": \"Hi, I am {name}\",\n \"placeholder\": \"Message {name}…\",\n \"send\": \"Send\",\n \"attach\": \"Attach files\",\n \"typing\": \"The agent is typing\",\n \"moreSteps\": \"{count, plural, one {# more step} other {# more steps}}\",\n \"hideSteps\": \"Hide steps\",\n \"unread\": \"{count, plural, one {# unread answer} other {# unread answers}}\",\n \"retry\": \"Retry\",\n \"tooLarge\": \"The file is too large.\",\n \"stop\": \"Stop\",\n \"voice\": {\n \"hold\": \"Hold to record\",\n \"stop\": \"Stop recording\",\n \"recording\": \"Recording… {seconds} s\",\n \"review\": \"Check the transcript before sending\",\n \"notRecognized\": \"The speech was not recognized\",\n \"micDenied\": \"No access to the microphone\",\n \"unsupported\": \"Voice input is not supported in this browser\",\n \"start\": \"Record a voice message\",\n \"done\": \"Stop\",\n \"recognizing\": \"Recognizing…\",\n \"recordingNow\": \"Recording\",\n \"failed\": \"The voice message could not be recognized\",\n \"retry\": \"Retry\"\n },\n \"confirm\": {\n \"title\": \"Confirm the action\",\n \"text\": \"The agent wants to perform: {action}\",\n \"approve\": \"Execute\",\n \"reject\": \"Reject\"\n },\n \"wait\": {\n \"starting\": \"The agent is starting…\",\n \"queued\": \"{count, plural, =0 {In the queue · you are next} one {In the queue · # ahead of you} other {In the queue · # ahead of you}}\"\n },\n \"palette\": {\n \"title\": \"Commands and skills\",\n \"commands\": \"Commands\",\n \"skills\": \"Skills\",\n \"noSkills\": \"No skills are granted to you\",\n \"empty\": \"Nothing found\"\n },\n \"unknownCommand\": \"Unknown command {name}\",\n \"sendAsText\": \"Send as text\",\n \"skillPlaceholder\": \"What to do with the skill?\",\n \"context\": {\n \"meter\": \"Context: {used} of {total} tokens ({pct}%)\",\n \"full\": \"Answers get more expensive and the agent may get confused.\",\n \"compact\": \"Compact\",\n \"reset\": \"Start over\",\n \"waitTurn\": \"Wait for the answer or stop it\"\n },\n \"event\": {\n \"details\": \"Summary\"\n },\n \"files\": {\n \"open\": \"Open {name}\",\n \"download\": \"Download\",\n \"failed\": \"Could not open the file\",\n \"tooLarge\": \"The file is too large to preview — download it\",\n \"save\": \"Download {name}\",\n \"notUtf8\": \"The file is not in UTF-8 — download it\",\n \"rows\": \"Showing {shown} of {total, plural, one {# row} other {# rows}}\",\n \"source\": \"Code\",\n \"page\": \"Page\"\n },\n \"notice\": {\n \"more\": \"Show in full\",\n \"less\": \"Collapse\"\n }\n },\n \"agent\": {\n \"menu\": \"Agent\",\n \"options\": \"Tone\",\n \"model\": \"Model\",\n \"modelDefault\": \"Default\",\n \"noModels\": \"No models granted — ask an administrator\",\n \"modelCompactWarn\": \"The context will be compacted before the next answer\",\n \"everywhere\": \"The change applies in every channel and connected service.\",\n \"capImage\": \"images\",\n \"capReasoning\": \"reasoning\"\n }\n}\n","{\n \"loading\": \"Загрузка…\",\n \"cancel\": \"Отмена\",\n \"create\": \"Создать\",\n \"close\": \"Закрыть\",\n \"delete\": \"Удалить\",\n \"remove\": \"Убрать\",\n \"agentName\": \"Имя агента\",\n \"topbar\": {\n \"sections\": \"Разделы\",\n \"profile\": \"Профиль\"\n },\n \"chat\": {\n \"title\": \"Чат\",\n \"conversations\": \"Разговоры\",\n \"conversation\": \"Разговор\",\n \"topics\": \"Темы\",\n \"archive\": \"Архив\",\n \"noTopics\": \"Тем пока нет\",\n \"newTopic\": \"Новая тема\",\n \"topicTitle\": \"Тема\",\n \"topicHint\": \"У темы своя история, а память и пространство — те же.\",\n \"loadOlder\": \"Более ранние сообщения\",\n \"emptyTitle\": \"Привет, я {name}\",\n \"placeholder\": \"Сообщение для {name}…\",\n \"send\": \"Отправить\",\n \"attach\": \"Прикрепить файлы\",\n \"typing\": \"Агент печатает\",\n \"moreSteps\": \"{count, plural, one {ещё # шаг} few {ещё # шага} many {ещё # шагов} other {ещё # шага}}\",\n \"hideSteps\": \"Скрыть шаги\",\n \"unread\": \"{count, plural, one {# непрочитанный ответ} few {# непрочитанных ответа} many {# непрочитанных ответов} other {# непрочитанных ответа}}\",\n \"retry\": \"Повторить\",\n \"tooLarge\": \"Файл слишком большой.\",\n \"stop\": \"Остановить\",\n \"voice\": {\n \"hold\": \"Удерживайте для записи\",\n \"stop\": \"Остановить запись\",\n \"recording\": \"Запись… {seconds} с\",\n \"review\": \"Проверьте расшифровку перед отправкой\",\n \"notRecognized\": \"Речь не распознана\",\n \"micDenied\": \"Нет доступа к микрофону\",\n \"unsupported\": \"Голосовой ввод не поддерживается этим браузером\",\n \"start\": \"Записать голосом\",\n \"done\": \"Стоп\",\n \"recognizing\": \"Распознаём…\",\n \"recordingNow\": \"Запись\",\n \"failed\": \"Не удалось распознать голосовое сообщение\",\n \"retry\": \"Повторить\"\n },\n \"confirm\": {\n \"title\": \"Подтвердите действие\",\n \"text\": \"Агент хочет выполнить: {action}\",\n \"approve\": \"Выполнить\",\n \"reject\": \"Отклонить\"\n },\n \"wait\": {\n \"starting\": \"Агент запускается…\",\n \"queued\": \"{count, plural, =0 {В очереди · вы следующий} other {В очереди · перед вами #}}\"\n },\n \"palette\": {\n \"title\": \"Команды и скиллы\",\n \"commands\": \"Команды\",\n \"skills\": \"Скиллы\",\n \"noSkills\": \"Вам не выдан ни один скилл\",\n \"empty\": \"Ничего не найдено\"\n },\n \"unknownCommand\": \"Неизвестная команда {name}\",\n \"sendAsText\": \"Отправить как текст\",\n \"skillPlaceholder\": \"Что сделать по скиллу?\",\n \"context\": {\n \"meter\": \"Контекст: {used} из {total} токенов ({pct} %)\",\n \"full\": \"Ответы дорожают, агент может путаться.\",\n \"compact\": \"Сжать\",\n \"reset\": \"Начать заново\",\n \"waitTurn\": \"Дождитесь ответа или остановите его\"\n },\n \"event\": {\n \"details\": \"Изложение\"\n },\n \"files\": {\n \"open\": \"Открыть {name}\",\n \"download\": \"Скачать\",\n \"failed\": \"Не удалось открыть файл\",\n \"tooLarge\": \"Файл слишком большой для просмотра — скачайте его\",\n \"save\": \"Скачать {name}\",\n \"notUtf8\": \"Файл не в кодировке UTF-8 — скачайте его\",\n \"rows\": \"Показаны {shown} из {total, plural, one {# строки} other {# строк}}\",\n \"source\": \"Код\",\n \"page\": \"Страница\"\n },\n \"notice\": {\n \"more\": \"Показать полностью\",\n \"less\": \"Свернуть\"\n }\n },\n \"agent\": {\n \"menu\": \"Агент\",\n \"options\": \"Тон\",\n \"model\": \"Модель\",\n \"modelDefault\": \"По умолчанию\",\n \"noModels\": \"Модели не выданы — обратитесь к администратору\",\n \"modelCompactWarn\": \"Контекст будет сжат перед следующим ответом\",\n \"everywhere\": \"Изменение действует во всех каналах и подключённых сервисах.\",\n \"capImage\": \"изображения\",\n \"capReasoning\": \"рассуждение\"\n }\n}\n","{\n \"loading\": \"Wird geladen…\",\n \"cancel\": \"Abbrechen\",\n \"create\": \"Erstellen\",\n \"close\": \"Schließen\",\n \"delete\": \"Löschen\",\n \"remove\": \"Entfernen\",\n \"agentName\": \"Name des Agenten\",\n \"topbar\": {\n \"sections\": \"Bereiche\",\n \"profile\": \"Profil\"\n },\n \"chat\": {\n \"title\": \"Chat\",\n \"conversations\": \"Gespräche\",\n \"conversation\": \"Gespräch\",\n \"topics\": \"Themen\",\n \"archive\": \"Archiv\",\n \"noTopics\": \"Noch keine Themen\",\n \"newTopic\": \"Neues Thema\",\n \"topicTitle\": \"Thema\",\n \"topicHint\": \"Ein Thema hat einen eigenen Verlauf, aber dasselbe Gedächtnis und denselben Arbeitsbereich.\",\n \"loadOlder\": \"Frühere Nachrichten\",\n \"emptyTitle\": \"Hallo, ich bin {name}\",\n \"placeholder\": \"Nachricht an {name}…\",\n \"send\": \"Senden\",\n \"attach\": \"Dateien anhängen\",\n \"typing\": \"Der Agent schreibt\",\n \"moreSteps\": \"{count, plural, one {# weiterer Schritt} other {# weitere Schritte}}\",\n \"hideSteps\": \"Schritte ausblenden\",\n \"unread\": \"{count, plural, one {# ungelesene Antwort} other {# ungelesene Antworten}}\",\n \"retry\": \"Wiederholen\",\n \"tooLarge\": \"Die Datei ist zu groß.\",\n \"stop\": \"Stoppen\",\n \"voice\": {\n \"hold\": \"Zum Aufnehmen gedrückt halten\",\n \"stop\": \"Aufnahme beenden\",\n \"recording\": \"Aufnahme… {seconds} s\",\n \"review\": \"Prüfen Sie die Transkription vor dem Senden\",\n \"notRecognized\": \"Die Sprache wurde nicht erkannt\",\n \"micDenied\": \"Kein Zugriff auf das Mikrofon\",\n \"unsupported\": \"Spracheingabe wird von diesem Browser nicht unterstützt\",\n \"start\": \"Sprachnachricht aufnehmen\",\n \"done\": \"Stopp\",\n \"recognizing\": \"Wird erkannt…\",\n \"recordingNow\": \"Aufnahme\",\n \"failed\": \"Die Sprachnachricht konnte nicht erkannt werden\",\n \"retry\": \"Wiederholen\"\n },\n \"confirm\": {\n \"title\": \"Aktion bestätigen\",\n \"text\": \"Der Agent möchte ausführen: {action}\",\n \"approve\": \"Ausführen\",\n \"reject\": \"Ablehnen\"\n },\n \"wait\": {\n \"starting\": \"Der Agent startet…\",\n \"queued\": \"{count, plural, =0 {In der Warteschlange · Sie sind als Nächstes dran} other {In der Warteschlange · # vor Ihnen}}\"\n },\n \"palette\": {\n \"title\": \"Befehle und Skills\",\n \"commands\": \"Befehle\",\n \"skills\": \"Skills\",\n \"noSkills\": \"Ihnen ist kein Skill freigegeben\",\n \"empty\": \"Nichts gefunden\"\n },\n \"unknownCommand\": \"Unbekannter Befehl {name}\",\n \"sendAsText\": \"Als Text senden\",\n \"skillPlaceholder\": \"Was soll mit dem Skill getan werden?\",\n \"context\": {\n \"meter\": \"Kontext: {used} von {total} Tokens ({pct} %)\",\n \"full\": \"Antworten werden teurer, der Agent kann durcheinanderkommen.\",\n \"compact\": \"Komprimieren\",\n \"reset\": \"Neu beginnen\",\n \"waitTurn\": \"Warten Sie auf die Antwort oder stoppen Sie sie\"\n },\n \"event\": {\n \"details\": \"Zusammenfassung\"\n },\n \"files\": {\n \"open\": \"{name} öffnen\",\n \"download\": \"Herunterladen\",\n \"failed\": \"Die Datei konnte nicht geöffnet werden\",\n \"tooLarge\": \"Die Datei ist zu groß für die Vorschau — bitte herunterladen\",\n \"save\": \"{name} herunterladen\",\n \"notUtf8\": \"Die Datei ist nicht in UTF-8 — bitte herunterladen\",\n \"rows\": \"{shown} von {total, plural, one {# Zeile} other {# Zeilen}} angezeigt\",\n \"source\": \"Code\",\n \"page\": \"Seite\"\n },\n \"notice\": {\n \"more\": \"Vollständig anzeigen\",\n \"less\": \"Einklappen\"\n }\n },\n \"agent\": {\n \"menu\": \"Agent\",\n \"options\": \"Ton\",\n \"model\": \"Modell\",\n \"modelDefault\": \"Standard\",\n \"noModels\": \"Keine Modelle freigegeben — wenden Sie sich an einen Administrator\",\n \"modelCompactWarn\": \"Der Kontext wird vor der nächsten Antwort komprimiert\",\n \"everywhere\": \"Die Änderung gilt in allen Kanälen und verbundenen Diensten.\",\n \"capImage\": \"Bilder\",\n \"capReasoning\": \"Reasoning\"\n }\n}\n","{\n \"loading\": \"Cargando…\",\n \"cancel\": \"Cancelar\",\n \"create\": \"Crear\",\n \"close\": \"Cerrar\",\n \"delete\": \"Eliminar\",\n \"remove\": \"Quitar\",\n \"agentName\": \"Nombre del agente\",\n \"topbar\": {\n \"sections\": \"Secciones\",\n \"profile\": \"Perfil\"\n },\n \"chat\": {\n \"title\": \"Chat\",\n \"conversations\": \"Conversaciones\",\n \"conversation\": \"Conversación\",\n \"topics\": \"Temas\",\n \"archive\": \"Archivo\",\n \"noTopics\": \"Aún no hay temas\",\n \"newTopic\": \"Nuevo tema\",\n \"topicTitle\": \"Tema\",\n \"topicHint\": \"Un tema tiene su propio historial y la misma memoria y espacio.\",\n \"loadOlder\": \"Mensajes anteriores\",\n \"emptyTitle\": \"Hola, soy {name}\",\n \"placeholder\": \"Mensaje para {name}…\",\n \"send\": \"Enviar\",\n \"attach\": \"Adjuntar archivos\",\n \"typing\": \"El agente está escribiendo\",\n \"moreSteps\": \"{count, plural, one {# paso más} other {# pasos más}}\",\n \"hideSteps\": \"Ocultar pasos\",\n \"unread\": \"{count, plural, one {# respuesta sin leer} other {# respuestas sin leer}}\",\n \"retry\": \"Reintentar\",\n \"tooLarge\": \"El archivo es demasiado grande.\",\n \"stop\": \"Detener\",\n \"voice\": {\n \"hold\": \"Mantenga pulsado para grabar\",\n \"stop\": \"Detener la grabación\",\n \"recording\": \"Grabando… {seconds} s\",\n \"review\": \"Revise la transcripción antes de enviar\",\n \"notRecognized\": \"No se reconoció la voz\",\n \"micDenied\": \"Sin acceso al micrófono\",\n \"unsupported\": \"Este navegador no admite la entrada de voz\",\n \"start\": \"Grabar un mensaje de voz\",\n \"done\": \"Detener\",\n \"recognizing\": \"Reconociendo…\",\n \"recordingNow\": \"Grabando\",\n \"failed\": \"No se pudo reconocer el mensaje de voz\",\n \"retry\": \"Reintentar\"\n },\n \"confirm\": {\n \"title\": \"Confirme la acción\",\n \"text\": \"El agente quiere ejecutar: {action}\",\n \"approve\": \"Ejecutar\",\n \"reject\": \"Rechazar\"\n },\n \"wait\": {\n \"starting\": \"El agente se está iniciando…\",\n \"queued\": \"{count, plural, =0 {En cola · usted es el siguiente} other {En cola · # por delante}}\"\n },\n \"palette\": {\n \"title\": \"Comandos y skills\",\n \"commands\": \"Comandos\",\n \"skills\": \"Skills\",\n \"noSkills\": \"No tiene skills disponibles\",\n \"empty\": \"No se encontró nada\"\n },\n \"unknownCommand\": \"Comando desconocido {name}\",\n \"sendAsText\": \"Enviar como texto\",\n \"skillPlaceholder\": \"¿Qué hacer con el skill?\",\n \"context\": {\n \"meter\": \"Contexto: {used} de {total} tokens ({pct} %)\",\n \"full\": \"Las respuestas se encarecen y el agente puede confundirse.\",\n \"compact\": \"Compactar\",\n \"reset\": \"Empezar de nuevo\",\n \"waitTurn\": \"Espere la respuesta o deténgala\"\n },\n \"event\": {\n \"details\": \"Resumen\"\n },\n \"files\": {\n \"open\": \"Abrir {name}\",\n \"download\": \"Descargar\",\n \"failed\": \"No se pudo abrir el archivo\",\n \"tooLarge\": \"El archivo es demasiado grande para la vista previa: descárguelo\",\n \"save\": \"Descargar {name}\",\n \"notUtf8\": \"El archivo no está en UTF-8: descárguelo\",\n \"rows\": \"Se muestran {shown} de {total, plural, one {# fila} other {# filas}}\",\n \"source\": \"Código\",\n \"page\": \"Página\"\n },\n \"notice\": {\n \"more\": \"Mostrar completo\",\n \"less\": \"Contraer\"\n }\n },\n \"agent\": {\n \"menu\": \"Agente\",\n \"options\": \"Tono\",\n \"model\": \"Modelo\",\n \"modelDefault\": \"Predeterminado\",\n \"noModels\": \"No hay modelos disponibles: consulte a un administrador\",\n \"modelCompactWarn\": \"El contexto se compactará antes de la próxima respuesta\",\n \"everywhere\": \"El cambio se aplica en todos los canales y servicios conectados.\",\n \"capImage\": \"imágenes\",\n \"capReasoning\": \"razonamiento\"\n }\n}\n","{\n \"loading\": \"加载中…\",\n \"cancel\": \"取消\",\n \"create\": \"创建\",\n \"close\": \"关闭\",\n \"delete\": \"删除\",\n \"remove\": \"移除\",\n \"agentName\": \"智能体名称\",\n \"topbar\": {\n \"sections\": \"栏目\",\n \"profile\": \"个人资料\"\n },\n \"chat\": {\n \"title\": \"聊天\",\n \"conversations\": \"对话\",\n \"conversation\": \"对话\",\n \"topics\": \"话题\",\n \"archive\": \"归档\",\n \"noTopics\": \"暂无话题\",\n \"newTopic\": \"新话题\",\n \"topicTitle\": \"话题\",\n \"topicHint\": \"话题有独立的历史记录,记忆和空间与主对话相同。\",\n \"loadOlder\": \"更早的消息\",\n \"emptyTitle\": \"你好,我是 {name}\",\n \"placeholder\": \"给 {name} 发消息…\",\n \"send\": \"发送\",\n \"attach\": \"附加文件\",\n \"typing\": \"智能体正在输入\",\n \"moreSteps\": \"{count, plural, other {另外 # 个步骤}}\",\n \"hideSteps\": \"隐藏步骤\",\n \"unread\": \"{count} 条未读回复\",\n \"retry\": \"重试\",\n \"tooLarge\": \"文件太大。\",\n \"stop\": \"停止\",\n \"voice\": {\n \"hold\": \"按住录音\",\n \"stop\": \"停止录音\",\n \"recording\": \"录音中… {seconds} 秒\",\n \"review\": \"发送前请检查转写文本\",\n \"notRecognized\": \"未能识别语音\",\n \"micDenied\": \"无法访问麦克风\",\n \"unsupported\": \"此浏览器不支持语音输入\",\n \"start\": \"录制语音\",\n \"done\": \"停止\",\n \"recognizing\": \"正在识别…\",\n \"recordingNow\": \"录音中\",\n \"failed\": \"无法识别语音消息\",\n \"retry\": \"重试\"\n },\n \"confirm\": {\n \"title\": \"确认操作\",\n \"text\": \"代理想要执行:{action}\",\n \"approve\": \"执行\",\n \"reject\": \"拒绝\"\n },\n \"wait\": {\n \"starting\": \"代理正在启动…\",\n \"queued\": \"{count, plural, =0 {排队中 · 您是下一位} other {排队中 · 前面还有 # 位}}\"\n },\n \"palette\": {\n \"title\": \"命令和技能\",\n \"commands\": \"命令\",\n \"skills\": \"技能\",\n \"noSkills\": \"您没有可用的技能\",\n \"empty\": \"未找到\"\n },\n \"unknownCommand\": \"未知命令 {name}\",\n \"sendAsText\": \"作为文本发送\",\n \"skillPlaceholder\": \"用这个技能做什么?\",\n \"context\": {\n \"meter\": \"上下文:{used} / {total} 个令牌({pct}%)\",\n \"full\": \"回答变得更贵,代理可能会混淆。\",\n \"compact\": \"压缩\",\n \"reset\": \"重新开始\",\n \"waitTurn\": \"请等待回答或停止它\"\n },\n \"event\": {\n \"details\": \"摘要\"\n },\n \"files\": {\n \"open\": \"打开 {name}\",\n \"download\": \"下载\",\n \"failed\": \"无法打开文件\",\n \"tooLarge\": \"文件太大,无法预览,请下载\",\n \"save\": \"下载 {name}\",\n \"notUtf8\": \"文件不是 UTF-8 编码,请下载\",\n \"rows\": \"显示 {total} 行中的 {shown} 行\",\n \"source\": \"代码\",\n \"page\": \"页面\"\n },\n \"notice\": {\n \"more\": \"显示全部\",\n \"less\": \"收起\"\n }\n },\n \"agent\": {\n \"menu\": \"智能体\",\n \"options\": \"语气\",\n \"model\": \"模型\",\n \"modelDefault\": \"默认\",\n \"noModels\": \"没有可用的模型——请联系管理员\",\n \"modelCompactWarn\": \"下次回答前将压缩上下文\",\n \"everywhere\": \"更改在所有渠道和已连接的服务中生效。\",\n \"capImage\": \"图片\",\n \"capReasoning\": \"推理\"\n }\n}\n","import en from \"./en.json\";\nimport ru from \"./ru.json\";\nimport de from \"./de.json\";\nimport es from \"./es.json\";\nimport zh from \"./zh.json\";\n\n/** Strings of the components in the five languages of the products. A product adds\n * them to its i18next instance under the namespace `uikit`. */\nexport const resources = { en, ru, de, es, zh };\nexport type KitLanguage = keyof typeof resources;\nexport { UIKIT_NS } from \"../i18n\";\n"],"mappings":";;;AKQA,IAAaqC,IAAY;CAAE,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAA;CAAI,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAA;CAAI,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAA;CAAI,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAA;CAAI,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAA;AAAG"}
1
+ {"version":3,"file":"locales.js","names":["loading","cancel","create","close","remove","agentName","topbar","chat","agent","loading","cancel","create","close","remove","agentName","topbar","chat","agent","loading","cancel","create","close","remove","agentName","topbar","chat","agent","loading","cancel","create","close","remove","agentName","topbar","chat","agent","UIKIT_NS","resources","\"delete\"","\"sections\"","\"profile\"","\"title\"","\"conversations\"","\"conversation\"","\"topics\"","\"archive\"","\"noTopics\"","\"newTopic\"","\"topicTitle\"","\"topicHint\"","\"loadOlder\"","\"emptyTitle\"","\"placeholder\"","\"send\"","\"attach\"","\"typing\"","\"moreSteps\"","\"hideSteps\"","\"unread\"","\"retry\"","\"tooLarge\"","\"stop\"","\"voice\"","\"hold\"","\"recording\"","\"review\"","\"notRecognized\"","\"micDenied\"","\"unsupported\"","\"start\"","\"done\"","\"recognizing\"","\"recordingNow\"","\"failed\"","\"confirm\"","\"text\"","\"approve\"","\"reject\"","\"wait\"","\"starting\"","\"queued\"","\"palette\"","\"commands\"","\"skills\"","\"noSkills\"","\"empty\"","\"unknownCommand\"","\"sendAsText\"","\"skillPlaceholder\"","\"context\"","\"meter\"","\"full\"","\"compact\"","\"reset\"","\"waitTurn\"","\"event\"","\"details\"","\"files\"","\"open\"","\"download\"","\"save\"","\"notUtf8\"","\"rows\"","\"source\"","\"page\"","\"converted\"","\"pagesShown\"","\"firstPages\"","\"cols\"","\"preparing\"","\"preparingHint\"","\"unavailable\"","\"formulaHint\"","\"sheets\"","\"reasons\"","\"too_large\"","\"timeout\"","\"broken\"","\"busy\"","\"notice\"","\"more\"","\"less\"","\"menu\"","\"options\"","\"model\"","\"modelDefault\"","\"noModels\"","\"modelCompactWarn\"","\"everywhere\"","\"capImage\"","\"capReasoning\""],"sources":["../src/locales/en.json","../src/locales/ru.json","../src/locales/de.json","../src/locales/es.json","../src/locales/zh.json","../src/locales/index.ts"],"sourcesContent":["{\n \"loading\": \"Loading…\",\n \"cancel\": \"Cancel\",\n \"create\": \"Create\",\n \"close\": \"Close\",\n \"delete\": \"Delete\",\n \"remove\": \"Remove\",\n \"agentName\": \"Agent name\",\n \"topbar\": {\n \"sections\": \"Sections\",\n \"profile\": \"Profile\"\n },\n \"chat\": {\n \"title\": \"Chat\",\n \"conversations\": \"Conversations\",\n \"conversation\": \"Conversation\",\n \"topics\": \"Topics\",\n \"archive\": \"Archive\",\n \"noTopics\": \"No topics yet\",\n \"newTopic\": \"New topic\",\n \"topicTitle\": \"Topic\",\n \"topicHint\": \"A topic has its own history and the same memory and space.\",\n \"loadOlder\": \"Earlier messages\",\n \"emptyTitle\": \"Hi, I am {name}\",\n \"placeholder\": \"Message {name}…\",\n \"send\": \"Send\",\n \"attach\": \"Attach files\",\n \"typing\": \"The agent is typing\",\n \"moreSteps\": \"{count, plural, one {# more step} other {# more steps}}\",\n \"hideSteps\": \"Hide steps\",\n \"unread\": \"{count, plural, one {# unread answer} other {# unread answers}}\",\n \"retry\": \"Retry\",\n \"tooLarge\": \"The file is too large.\",\n \"stop\": \"Stop\",\n \"voice\": {\n \"hold\": \"Hold to record\",\n \"stop\": \"Stop recording\",\n \"recording\": \"Recording… {seconds} s\",\n \"review\": \"Check the transcript before sending\",\n \"notRecognized\": \"The speech was not recognized\",\n \"micDenied\": \"No access to the microphone\",\n \"unsupported\": \"Voice input is not supported in this browser\",\n \"start\": \"Record a voice message\",\n \"done\": \"Stop\",\n \"recognizing\": \"Recognizing…\",\n \"recordingNow\": \"Recording\",\n \"failed\": \"The voice message could not be recognized\",\n \"retry\": \"Retry\"\n },\n \"confirm\": {\n \"title\": \"Confirm the action\",\n \"text\": \"The agent wants to perform: {action}\",\n \"approve\": \"Execute\",\n \"reject\": \"Reject\"\n },\n \"wait\": {\n \"starting\": \"The agent is starting…\",\n \"queued\": \"{count, plural, =0 {In the queue · you are next} one {In the queue · # ahead of you} other {In the queue · # ahead of you}}\"\n },\n \"palette\": {\n \"title\": \"Commands and skills\",\n \"commands\": \"Commands\",\n \"skills\": \"Skills\",\n \"noSkills\": \"No skills are granted to you\",\n \"empty\": \"Nothing found\"\n },\n \"unknownCommand\": \"Unknown command {name}\",\n \"sendAsText\": \"Send as text\",\n \"skillPlaceholder\": \"What to do with the skill?\",\n \"context\": {\n \"meter\": \"Context: {used} of {total} tokens ({pct}%)\",\n \"full\": \"Answers get more expensive and the agent may get confused.\",\n \"compact\": \"Compact\",\n \"reset\": \"Start over\",\n \"waitTurn\": \"Wait for the answer or stop it\"\n },\n \"event\": {\n \"details\": \"Summary\"\n },\n \"files\": {\n \"open\": \"Open {name}\",\n \"download\": \"Download\",\n \"failed\": \"Could not open the file\",\n \"tooLarge\": \"The file is too large to preview — download it\",\n \"save\": \"Download {name}\",\n \"notUtf8\": \"The file is not in UTF-8 — download it\",\n \"rows\": \"Showing {shown} of {total, plural, one {# row} other {# rows}}\",\n \"source\": \"Code\",\n \"page\": \"Page\",\n \"converted\": \"Preview · converted from {format}\",\n \"pagesShown\": \"Showing {shown} of {total} pages\",\n \"firstPages\": \"Showing the first {shown} pages\",\n \"cols\": \"and {shown} of {total} columns\",\n \"preparing\": \"Preparing the preview…\",\n \"preparingHint\": \"Usually a few seconds\",\n \"unavailable\": \"Preview unavailable\",\n \"formulaHint\": \"The value is calculated when opened in Excel\",\n \"sheets\": \"Sheets\",\n \"reasons\": {\n \"too_large\": \"The file is over {limit} MB\",\n \"timeout\": \"Took longer than 30 seconds\",\n \"broken\": \"The file is damaged or the format is not supported\",\n \"busy\": \"The service is busy, try again later\"\n }\n },\n \"notice\": {\n \"more\": \"Show in full\",\n \"less\": \"Collapse\"\n }\n },\n \"agent\": {\n \"menu\": \"Agent\",\n \"options\": \"Tone\",\n \"model\": \"Model\",\n \"modelDefault\": \"Default\",\n \"noModels\": \"No models granted — ask an administrator\",\n \"modelCompactWarn\": \"The context will be compacted before the next answer\",\n \"everywhere\": \"The change applies in every channel and connected service.\",\n \"capImage\": \"images\",\n \"capReasoning\": \"reasoning\"\n }\n}\n","{\n \"loading\": \"Загрузка…\",\n \"cancel\": \"Отмена\",\n \"create\": \"Создать\",\n \"close\": \"Закрыть\",\n \"delete\": \"Удалить\",\n \"remove\": \"Убрать\",\n \"agentName\": \"Имя агента\",\n \"topbar\": {\n \"sections\": \"Разделы\",\n \"profile\": \"Профиль\"\n },\n \"chat\": {\n \"title\": \"Чат\",\n \"conversations\": \"Разговоры\",\n \"conversation\": \"Разговор\",\n \"topics\": \"Темы\",\n \"archive\": \"Архив\",\n \"noTopics\": \"Тем пока нет\",\n \"newTopic\": \"Новая тема\",\n \"topicTitle\": \"Тема\",\n \"topicHint\": \"У темы своя история, а память и пространство — те же.\",\n \"loadOlder\": \"Более ранние сообщения\",\n \"emptyTitle\": \"Привет, я {name}\",\n \"placeholder\": \"Сообщение для {name}…\",\n \"send\": \"Отправить\",\n \"attach\": \"Прикрепить файлы\",\n \"typing\": \"Агент печатает\",\n \"moreSteps\": \"{count, plural, one {ещё # шаг} few {ещё # шага} many {ещё # шагов} other {ещё # шага}}\",\n \"hideSteps\": \"Скрыть шаги\",\n \"unread\": \"{count, plural, one {# непрочитанный ответ} few {# непрочитанных ответа} many {# непрочитанных ответов} other {# непрочитанных ответа}}\",\n \"retry\": \"Повторить\",\n \"tooLarge\": \"Файл слишком большой.\",\n \"stop\": \"Остановить\",\n \"voice\": {\n \"hold\": \"Удерживайте для записи\",\n \"stop\": \"Остановить запись\",\n \"recording\": \"Запись… {seconds} с\",\n \"review\": \"Проверьте расшифровку перед отправкой\",\n \"notRecognized\": \"Речь не распознана\",\n \"micDenied\": \"Нет доступа к микрофону\",\n \"unsupported\": \"Голосовой ввод не поддерживается этим браузером\",\n \"start\": \"Записать голосом\",\n \"done\": \"Стоп\",\n \"recognizing\": \"Распознаём…\",\n \"recordingNow\": \"Запись\",\n \"failed\": \"Не удалось распознать голосовое сообщение\",\n \"retry\": \"Повторить\"\n },\n \"confirm\": {\n \"title\": \"Подтвердите действие\",\n \"text\": \"Агент хочет выполнить: {action}\",\n \"approve\": \"Выполнить\",\n \"reject\": \"Отклонить\"\n },\n \"wait\": {\n \"starting\": \"Агент запускается…\",\n \"queued\": \"{count, plural, =0 {В очереди · вы следующий} other {В очереди · перед вами #}}\"\n },\n \"palette\": {\n \"title\": \"Команды и скиллы\",\n \"commands\": \"Команды\",\n \"skills\": \"Скиллы\",\n \"noSkills\": \"Вам не выдан ни один скилл\",\n \"empty\": \"Ничего не найдено\"\n },\n \"unknownCommand\": \"Неизвестная команда {name}\",\n \"sendAsText\": \"Отправить как текст\",\n \"skillPlaceholder\": \"Что сделать по скиллу?\",\n \"context\": {\n \"meter\": \"Контекст: {used} из {total} токенов ({pct} %)\",\n \"full\": \"Ответы дорожают, агент может путаться.\",\n \"compact\": \"Сжать\",\n \"reset\": \"Начать заново\",\n \"waitTurn\": \"Дождитесь ответа или остановите его\"\n },\n \"event\": {\n \"details\": \"Изложение\"\n },\n \"files\": {\n \"open\": \"Открыть {name}\",\n \"download\": \"Скачать\",\n \"failed\": \"Не удалось открыть файл\",\n \"tooLarge\": \"Файл слишком большой для просмотра — скачайте его\",\n \"save\": \"Скачать {name}\",\n \"notUtf8\": \"Файл не в кодировке UTF-8 — скачайте его\",\n \"rows\": \"Показаны {shown} из {total, plural, one {# строки} other {# строк}}\",\n \"source\": \"Код\",\n \"page\": \"Страница\",\n \"converted\": \"Предпросмотр · сконвертировано из {format}\",\n \"pagesShown\": \"Показаны {shown} из {total} страниц\",\n \"firstPages\": \"Показаны первые {shown} страниц\",\n \"cols\": \"и {shown} из {total} столбцов\",\n \"preparing\": \"Готовим предпросмотр…\",\n \"preparingHint\": \"Обычно несколько секунд\",\n \"unavailable\": \"Предпросмотр недоступен\",\n \"formulaHint\": \"Значение посчитается при открытии в Excel\",\n \"sheets\": \"Листы\",\n \"reasons\": {\n \"too_large\": \"Файл больше {limit} МБ\",\n \"timeout\": \"Не успели за 30 секунд\",\n \"broken\": \"Файл повреждён или формат не поддерживается\",\n \"busy\": \"Сервис занят, попробуйте позже\"\n }\n },\n \"notice\": {\n \"more\": \"Показать полностью\",\n \"less\": \"Свернуть\"\n }\n },\n \"agent\": {\n \"menu\": \"Агент\",\n \"options\": \"Тон\",\n \"model\": \"Модель\",\n \"modelDefault\": \"По умолчанию\",\n \"noModels\": \"Модели не выданы — обратитесь к администратору\",\n \"modelCompactWarn\": \"Контекст будет сжат перед следующим ответом\",\n \"everywhere\": \"Изменение действует во всех каналах и подключённых сервисах.\",\n \"capImage\": \"изображения\",\n \"capReasoning\": \"рассуждение\"\n }\n}\n","{\n \"loading\": \"Wird geladen…\",\n \"cancel\": \"Abbrechen\",\n \"create\": \"Erstellen\",\n \"close\": \"Schließen\",\n \"delete\": \"Löschen\",\n \"remove\": \"Entfernen\",\n \"agentName\": \"Name des Agenten\",\n \"topbar\": {\n \"sections\": \"Bereiche\",\n \"profile\": \"Profil\"\n },\n \"chat\": {\n \"title\": \"Chat\",\n \"conversations\": \"Gespräche\",\n \"conversation\": \"Gespräch\",\n \"topics\": \"Themen\",\n \"archive\": \"Archiv\",\n \"noTopics\": \"Noch keine Themen\",\n \"newTopic\": \"Neues Thema\",\n \"topicTitle\": \"Thema\",\n \"topicHint\": \"Ein Thema hat einen eigenen Verlauf, aber dasselbe Gedächtnis und denselben Arbeitsbereich.\",\n \"loadOlder\": \"Frühere Nachrichten\",\n \"emptyTitle\": \"Hallo, ich bin {name}\",\n \"placeholder\": \"Nachricht an {name}…\",\n \"send\": \"Senden\",\n \"attach\": \"Dateien anhängen\",\n \"typing\": \"Der Agent schreibt\",\n \"moreSteps\": \"{count, plural, one {# weiterer Schritt} other {# weitere Schritte}}\",\n \"hideSteps\": \"Schritte ausblenden\",\n \"unread\": \"{count, plural, one {# ungelesene Antwort} other {# ungelesene Antworten}}\",\n \"retry\": \"Wiederholen\",\n \"tooLarge\": \"Die Datei ist zu groß.\",\n \"stop\": \"Stoppen\",\n \"voice\": {\n \"hold\": \"Zum Aufnehmen gedrückt halten\",\n \"stop\": \"Aufnahme beenden\",\n \"recording\": \"Aufnahme… {seconds} s\",\n \"review\": \"Prüfen Sie die Transkription vor dem Senden\",\n \"notRecognized\": \"Die Sprache wurde nicht erkannt\",\n \"micDenied\": \"Kein Zugriff auf das Mikrofon\",\n \"unsupported\": \"Spracheingabe wird von diesem Browser nicht unterstützt\",\n \"start\": \"Sprachnachricht aufnehmen\",\n \"done\": \"Stopp\",\n \"recognizing\": \"Wird erkannt…\",\n \"recordingNow\": \"Aufnahme\",\n \"failed\": \"Die Sprachnachricht konnte nicht erkannt werden\",\n \"retry\": \"Wiederholen\"\n },\n \"confirm\": {\n \"title\": \"Aktion bestätigen\",\n \"text\": \"Der Agent möchte ausführen: {action}\",\n \"approve\": \"Ausführen\",\n \"reject\": \"Ablehnen\"\n },\n \"wait\": {\n \"starting\": \"Der Agent startet…\",\n \"queued\": \"{count, plural, =0 {In der Warteschlange · Sie sind als Nächstes dran} other {In der Warteschlange · # vor Ihnen}}\"\n },\n \"palette\": {\n \"title\": \"Befehle und Skills\",\n \"commands\": \"Befehle\",\n \"skills\": \"Skills\",\n \"noSkills\": \"Ihnen ist kein Skill freigegeben\",\n \"empty\": \"Nichts gefunden\"\n },\n \"unknownCommand\": \"Unbekannter Befehl {name}\",\n \"sendAsText\": \"Als Text senden\",\n \"skillPlaceholder\": \"Was soll mit dem Skill getan werden?\",\n \"context\": {\n \"meter\": \"Kontext: {used} von {total} Tokens ({pct} %)\",\n \"full\": \"Antworten werden teurer, der Agent kann durcheinanderkommen.\",\n \"compact\": \"Komprimieren\",\n \"reset\": \"Neu beginnen\",\n \"waitTurn\": \"Warten Sie auf die Antwort oder stoppen Sie sie\"\n },\n \"event\": {\n \"details\": \"Zusammenfassung\"\n },\n \"files\": {\n \"open\": \"{name} öffnen\",\n \"download\": \"Herunterladen\",\n \"failed\": \"Die Datei konnte nicht geöffnet werden\",\n \"tooLarge\": \"Die Datei ist zu groß für die Vorschau — bitte herunterladen\",\n \"save\": \"{name} herunterladen\",\n \"notUtf8\": \"Die Datei ist nicht in UTF-8 — bitte herunterladen\",\n \"rows\": \"{shown} von {total, plural, one {# Zeile} other {# Zeilen}} angezeigt\",\n \"source\": \"Code\",\n \"page\": \"Seite\",\n \"converted\": \"Vorschau · konvertiert aus {format}\",\n \"pagesShown\": \"{shown} von {total} Seiten werden angezeigt\",\n \"firstPages\": \"Die ersten {shown} Seiten werden angezeigt\",\n \"cols\": \"und {shown} von {total} Spalten\",\n \"preparing\": \"Vorschau wird vorbereitet…\",\n \"preparingHint\": \"Meist nur wenige Sekunden\",\n \"unavailable\": \"Vorschau nicht verfügbar\",\n \"formulaHint\": \"Der Wert wird beim Öffnen in Excel berechnet\",\n \"sheets\": \"Blätter\",\n \"reasons\": {\n \"too_large\": \"Die Datei ist größer als {limit} MB\",\n \"timeout\": \"Hat länger als 30 Sekunden gedauert\",\n \"broken\": \"Die Datei ist beschädigt oder das Format wird nicht unterstützt\",\n \"busy\": \"Der Dienst ist ausgelastet, versuchen Sie es später erneut\"\n }\n },\n \"notice\": {\n \"more\": \"Vollständig anzeigen\",\n \"less\": \"Einklappen\"\n }\n },\n \"agent\": {\n \"menu\": \"Agent\",\n \"options\": \"Ton\",\n \"model\": \"Modell\",\n \"modelDefault\": \"Standard\",\n \"noModels\": \"Keine Modelle freigegeben — wenden Sie sich an einen Administrator\",\n \"modelCompactWarn\": \"Der Kontext wird vor der nächsten Antwort komprimiert\",\n \"everywhere\": \"Die Änderung gilt in allen Kanälen und verbundenen Diensten.\",\n \"capImage\": \"Bilder\",\n \"capReasoning\": \"Reasoning\"\n }\n}\n","{\n \"loading\": \"Cargando…\",\n \"cancel\": \"Cancelar\",\n \"create\": \"Crear\",\n \"close\": \"Cerrar\",\n \"delete\": \"Eliminar\",\n \"remove\": \"Quitar\",\n \"agentName\": \"Nombre del agente\",\n \"topbar\": {\n \"sections\": \"Secciones\",\n \"profile\": \"Perfil\"\n },\n \"chat\": {\n \"title\": \"Chat\",\n \"conversations\": \"Conversaciones\",\n \"conversation\": \"Conversación\",\n \"topics\": \"Temas\",\n \"archive\": \"Archivo\",\n \"noTopics\": \"Aún no hay temas\",\n \"newTopic\": \"Nuevo tema\",\n \"topicTitle\": \"Tema\",\n \"topicHint\": \"Un tema tiene su propio historial y la misma memoria y espacio.\",\n \"loadOlder\": \"Mensajes anteriores\",\n \"emptyTitle\": \"Hola, soy {name}\",\n \"placeholder\": \"Mensaje para {name}…\",\n \"send\": \"Enviar\",\n \"attach\": \"Adjuntar archivos\",\n \"typing\": \"El agente está escribiendo\",\n \"moreSteps\": \"{count, plural, one {# paso más} other {# pasos más}}\",\n \"hideSteps\": \"Ocultar pasos\",\n \"unread\": \"{count, plural, one {# respuesta sin leer} other {# respuestas sin leer}}\",\n \"retry\": \"Reintentar\",\n \"tooLarge\": \"El archivo es demasiado grande.\",\n \"stop\": \"Detener\",\n \"voice\": {\n \"hold\": \"Mantenga pulsado para grabar\",\n \"stop\": \"Detener la grabación\",\n \"recording\": \"Grabando… {seconds} s\",\n \"review\": \"Revise la transcripción antes de enviar\",\n \"notRecognized\": \"No se reconoció la voz\",\n \"micDenied\": \"Sin acceso al micrófono\",\n \"unsupported\": \"Este navegador no admite la entrada de voz\",\n \"start\": \"Grabar un mensaje de voz\",\n \"done\": \"Detener\",\n \"recognizing\": \"Reconociendo…\",\n \"recordingNow\": \"Grabando\",\n \"failed\": \"No se pudo reconocer el mensaje de voz\",\n \"retry\": \"Reintentar\"\n },\n \"confirm\": {\n \"title\": \"Confirme la acción\",\n \"text\": \"El agente quiere ejecutar: {action}\",\n \"approve\": \"Ejecutar\",\n \"reject\": \"Rechazar\"\n },\n \"wait\": {\n \"starting\": \"El agente se está iniciando…\",\n \"queued\": \"{count, plural, =0 {En cola · usted es el siguiente} other {En cola · # por delante}}\"\n },\n \"palette\": {\n \"title\": \"Comandos y skills\",\n \"commands\": \"Comandos\",\n \"skills\": \"Skills\",\n \"noSkills\": \"No tiene skills disponibles\",\n \"empty\": \"No se encontró nada\"\n },\n \"unknownCommand\": \"Comando desconocido {name}\",\n \"sendAsText\": \"Enviar como texto\",\n \"skillPlaceholder\": \"¿Qué hacer con el skill?\",\n \"context\": {\n \"meter\": \"Contexto: {used} de {total} tokens ({pct} %)\",\n \"full\": \"Las respuestas se encarecen y el agente puede confundirse.\",\n \"compact\": \"Compactar\",\n \"reset\": \"Empezar de nuevo\",\n \"waitTurn\": \"Espere la respuesta o deténgala\"\n },\n \"event\": {\n \"details\": \"Resumen\"\n },\n \"files\": {\n \"open\": \"Abrir {name}\",\n \"download\": \"Descargar\",\n \"failed\": \"No se pudo abrir el archivo\",\n \"tooLarge\": \"El archivo es demasiado grande para la vista previa: descárguelo\",\n \"save\": \"Descargar {name}\",\n \"notUtf8\": \"El archivo no está en UTF-8: descárguelo\",\n \"rows\": \"Se muestran {shown} de {total, plural, one {# fila} other {# filas}}\",\n \"source\": \"Código\",\n \"page\": \"Página\",\n \"converted\": \"Vista previa · convertido desde {format}\",\n \"pagesShown\": \"Se muestran {shown} de {total} páginas\",\n \"firstPages\": \"Se muestran las primeras {shown} páginas\",\n \"cols\": \"y {shown} de {total} columnas\",\n \"preparing\": \"Preparando la vista previa…\",\n \"preparingHint\": \"Suele tardar unos segundos\",\n \"unavailable\": \"Vista previa no disponible\",\n \"formulaHint\": \"El valor se calcula al abrir el archivo en Excel\",\n \"sheets\": \"Hojas\",\n \"reasons\": {\n \"too_large\": \"El archivo supera {limit} MB\",\n \"timeout\": \"Tardó más de 30 segundos\",\n \"broken\": \"El archivo está dañado o el formato no es compatible\",\n \"busy\": \"El servicio está ocupado, inténtalo más tarde\"\n }\n },\n \"notice\": {\n \"more\": \"Mostrar completo\",\n \"less\": \"Contraer\"\n }\n },\n \"agent\": {\n \"menu\": \"Agente\",\n \"options\": \"Tono\",\n \"model\": \"Modelo\",\n \"modelDefault\": \"Predeterminado\",\n \"noModels\": \"No hay modelos disponibles: consulte a un administrador\",\n \"modelCompactWarn\": \"El contexto se compactará antes de la próxima respuesta\",\n \"everywhere\": \"El cambio se aplica en todos los canales y servicios conectados.\",\n \"capImage\": \"imágenes\",\n \"capReasoning\": \"razonamiento\"\n }\n}\n","{\n \"loading\": \"加载中…\",\n \"cancel\": \"取消\",\n \"create\": \"创建\",\n \"close\": \"关闭\",\n \"delete\": \"删除\",\n \"remove\": \"移除\",\n \"agentName\": \"智能体名称\",\n \"topbar\": {\n \"sections\": \"栏目\",\n \"profile\": \"个人资料\"\n },\n \"chat\": {\n \"title\": \"聊天\",\n \"conversations\": \"对话\",\n \"conversation\": \"对话\",\n \"topics\": \"话题\",\n \"archive\": \"归档\",\n \"noTopics\": \"暂无话题\",\n \"newTopic\": \"新话题\",\n \"topicTitle\": \"话题\",\n \"topicHint\": \"话题有独立的历史记录,记忆和空间与主对话相同。\",\n \"loadOlder\": \"更早的消息\",\n \"emptyTitle\": \"你好,我是 {name}\",\n \"placeholder\": \"给 {name} 发消息…\",\n \"send\": \"发送\",\n \"attach\": \"附加文件\",\n \"typing\": \"智能体正在输入\",\n \"moreSteps\": \"{count, plural, other {另外 # 个步骤}}\",\n \"hideSteps\": \"隐藏步骤\",\n \"unread\": \"{count} 条未读回复\",\n \"retry\": \"重试\",\n \"tooLarge\": \"文件太大。\",\n \"stop\": \"停止\",\n \"voice\": {\n \"hold\": \"按住录音\",\n \"stop\": \"停止录音\",\n \"recording\": \"录音中… {seconds} 秒\",\n \"review\": \"发送前请检查转写文本\",\n \"notRecognized\": \"未能识别语音\",\n \"micDenied\": \"无法访问麦克风\",\n \"unsupported\": \"此浏览器不支持语音输入\",\n \"start\": \"录制语音\",\n \"done\": \"停止\",\n \"recognizing\": \"正在识别…\",\n \"recordingNow\": \"录音中\",\n \"failed\": \"无法识别语音消息\",\n \"retry\": \"重试\"\n },\n \"confirm\": {\n \"title\": \"确认操作\",\n \"text\": \"代理想要执行:{action}\",\n \"approve\": \"执行\",\n \"reject\": \"拒绝\"\n },\n \"wait\": {\n \"starting\": \"代理正在启动…\",\n \"queued\": \"{count, plural, =0 {排队中 · 您是下一位} other {排队中 · 前面还有 # 位}}\"\n },\n \"palette\": {\n \"title\": \"命令和技能\",\n \"commands\": \"命令\",\n \"skills\": \"技能\",\n \"noSkills\": \"您没有可用的技能\",\n \"empty\": \"未找到\"\n },\n \"unknownCommand\": \"未知命令 {name}\",\n \"sendAsText\": \"作为文本发送\",\n \"skillPlaceholder\": \"用这个技能做什么?\",\n \"context\": {\n \"meter\": \"上下文:{used} / {total} 个令牌({pct}%)\",\n \"full\": \"回答变得更贵,代理可能会混淆。\",\n \"compact\": \"压缩\",\n \"reset\": \"重新开始\",\n \"waitTurn\": \"请等待回答或停止它\"\n },\n \"event\": {\n \"details\": \"摘要\"\n },\n \"files\": {\n \"open\": \"打开 {name}\",\n \"download\": \"下载\",\n \"failed\": \"无法打开文件\",\n \"tooLarge\": \"文件太大,无法预览,请下载\",\n \"save\": \"下载 {name}\",\n \"notUtf8\": \"文件不是 UTF-8 编码,请下载\",\n \"rows\": \"显示 {total} 行中的 {shown} 行\",\n \"source\": \"代码\",\n \"page\": \"页面\",\n \"converted\": \"预览 · 由 {format} 转换\",\n \"pagesShown\": \"显示 {shown} / {total} 页\",\n \"firstPages\": \"显示前 {shown} 页\",\n \"cols\": \"以及 {shown} / {total} 列\",\n \"preparing\": \"正在准备预览…\",\n \"preparingHint\": \"通常只需几秒\",\n \"unavailable\": \"无法预览\",\n \"formulaHint\": \"在 Excel 中打开时计算该值\",\n \"sheets\": \"工作表\",\n \"reasons\": {\n \"too_large\": \"文件大于 {limit} MB\",\n \"timeout\": \"超过 30 秒未完成\",\n \"broken\": \"文件已损坏或格式不受支持\",\n \"busy\": \"服务繁忙,请稍后重试\"\n }\n },\n \"notice\": {\n \"more\": \"显示全部\",\n \"less\": \"收起\"\n }\n },\n \"agent\": {\n \"menu\": \"智能体\",\n \"options\": \"语气\",\n \"model\": \"模型\",\n \"modelDefault\": \"默认\",\n \"noModels\": \"没有可用的模型——请联系管理员\",\n \"modelCompactWarn\": \"下次回答前将压缩上下文\",\n \"everywhere\": \"更改在所有渠道和已连接的服务中生效。\",\n \"capImage\": \"图片\",\n \"capReasoning\": \"推理\"\n }\n}\n","import en from \"./en.json\";\nimport ru from \"./ru.json\";\nimport de from \"./de.json\";\nimport es from \"./es.json\";\nimport zh from \"./zh.json\";\n\n/** Strings of the components in the five languages of the products. A product adds\n * them to its i18next instance under the namespace `uikit`. */\nexport const resources = { en, ru, de, es, zh };\nexport type KitLanguage = keyof typeof resources;\nexport { UIKIT_NS } from \"../i18n\";\n"],"mappings":";;;AKQA,IAAaqC,IAAY;CAAE,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAA;CAAI,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAA;CAAI,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAA;CAAI,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAA;CAAI,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAA;AAAG"}