blume 1.3.1 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +72 -0
- package/dist/cli/index.js +3512 -814
- package/dist/cli/index.js.map +99 -87
- package/dist/types/core/base-path.d.ts +5 -0
- package/dist/types/core/config-input.d.ts +82 -6
- package/dist/types/core/i18n-ui.d.ts +2 -0
- package/dist/types/core/schema.d.ts +19 -2
- package/dist/types/core/sources/types.d.ts +5 -0
- package/dist/types/core/types.d.ts +4 -3
- package/docs/02-deployment.mdx +1 -1
- package/docs/configuration/ai.mdx +15 -1
- package/docs/configuration/index.mdx +26 -0
- package/docs/configuration/search.mdx +1 -3
- package/docs/content/i18n.mdx +13 -1
- package/docs/content/navigation.mdx +11 -0
- package/docs/reference/cli.mdx +4 -0
- package/docs/reference/frontmatter.mdx +33 -0
- package/docs/reference/meta.ts +1 -1
- package/docs/reference/translate.mdx +80 -0
- package/package.json +22 -1
- package/src/ai/agent-readability.ts +7 -4
- package/src/ai/ask-context.ts +3 -6
- package/src/ai/component-markdown.ts +7 -6
- package/src/ai/mcp/data.ts +10 -4
- package/src/ai/mcp/server.ts +74 -3
- package/src/ai/mcp/tools.ts +2 -2
- package/src/astro/generate.ts +4 -13
- package/src/astro/integration.ts +3 -1
- package/src/astro/islands.ts +4 -1
- package/src/astro/markdown-negotiation.ts +5 -0
- package/src/astro/templates.ts +69 -22
- package/src/audit/checks/indexability.ts +3 -6
- package/src/audit/checks/robots.ts +18 -37
- package/src/audit/crawl.ts +49 -49
- package/src/audit/image-size.ts +13 -53
- package/src/audit/report.ts +22 -33
- package/src/audit/types.ts +6 -2
- package/src/audit/url.ts +5 -10
- package/src/cli/commands/build.ts +129 -24
- package/src/cli/commands/dev.ts +9 -21
- package/src/cli/commands/doctor.ts +9 -22
- package/src/cli/commands/translate.ts +300 -0
- package/src/cli/env.ts +6 -52
- package/src/cli/index.ts +2 -0
- package/src/cli/init/scaffold.ts +15 -28
- package/src/cli/internal-error.ts +11 -11
- package/src/components/Icon.astro +2 -7
- package/src/components/content/Step.astro +3 -8
- package/src/components/content/Tab.astro +20 -1
- package/src/components/islands/ask-ai.tsx +25 -100
- package/src/components/islands/hooks.ts +10 -3
- package/src/components/layout/LanguageSwitcher.astro +2 -1
- package/src/components/layout/Logo.astro +4 -4
- package/src/components/layout/PageActions.astro +12 -7
- package/src/components/layout/RootLayout.astro +37 -109
- package/src/components/layout/Search.astro +18 -25
- package/src/components/layout/search/orama.ts +3 -1
- package/src/components/layout/search/types.ts +4 -16
- package/src/components/openapi/helpers.ts +21 -75
- package/src/core/base-path.ts +9 -0
- package/src/core/component-overrides.ts +0 -7
- package/src/core/config-input.ts +84 -6
- package/src/core/config.ts +3 -3
- package/src/core/diagnostics.ts +10 -20
- package/src/core/fs-atomic.ts +22 -0
- package/src/core/graph.ts +46 -2
- package/src/core/i18n-ui.ts +2 -0
- package/src/core/i18n.ts +31 -0
- package/src/core/nav-diagnostics.ts +13 -34
- package/src/core/project-graph.ts +13 -2
- package/src/core/schema.ts +174 -74
- package/src/core/sources/github-releases.ts +29 -26
- package/src/core/sources/mdx-remote.ts +10 -57
- package/src/core/sources/normalize.ts +25 -12
- package/src/core/sources/notion.ts +17 -23
- package/src/core/sources/types.ts +5 -0
- package/src/core/tsconfig-aliases.ts +39 -172
- package/src/core/types.ts +4 -3
- package/src/core/ui-packs/ar.ts +42 -1
- package/src/core/ui-packs/bg.ts +42 -1
- package/src/core/ui-packs/bn.ts +42 -1
- package/src/core/ui-packs/ca.ts +44 -1
- package/src/core/ui-packs/cs.ts +42 -1
- package/src/core/ui-packs/da.ts +42 -1
- package/src/core/ui-packs/de.ts +42 -1
- package/src/core/ui-packs/el.ts +44 -1
- package/src/core/ui-packs/es.ts +44 -1
- package/src/core/ui-packs/fa.ts +42 -1
- package/src/core/ui-packs/fi.ts +42 -1
- package/src/core/ui-packs/fr.ts +44 -1
- package/src/core/ui-packs/he.ts +42 -1
- package/src/core/ui-packs/hi.ts +42 -1
- package/src/core/ui-packs/hr.ts +42 -1
- package/src/core/ui-packs/hu.ts +42 -1
- package/src/core/ui-packs/id.ts +42 -1
- package/src/core/ui-packs/it.ts +44 -1
- package/src/core/ui-packs/ja.ts +44 -1
- package/src/core/ui-packs/ko.ts +44 -1
- package/src/core/ui-packs/nl.ts +42 -1
- package/src/core/ui-packs/no.ts +42 -1
- package/src/core/ui-packs/pl.ts +42 -1
- package/src/core/ui-packs/pt-br.ts +44 -1
- package/src/core/ui-packs/pt.ts +44 -1
- package/src/core/ui-packs/ro.ts +42 -1
- package/src/core/ui-packs/ru.ts +42 -1
- package/src/core/ui-packs/sk.ts +42 -1
- package/src/core/ui-packs/sr.ts +42 -1
- package/src/core/ui-packs/sv.ts +42 -1
- package/src/core/ui-packs/th.ts +44 -1
- package/src/core/ui-packs/tr.ts +42 -1
- package/src/core/ui-packs/uk.ts +42 -1
- package/src/core/ui-packs/vi.ts +44 -1
- package/src/core/ui-packs/zh-tw.ts +44 -1
- package/src/core/ui-packs/zh.ts +44 -1
- package/src/deploy/adapter-output.ts +44 -5
- package/src/deploy/cloudflare-negotiation.ts +527 -0
- package/src/deploy/redirects.ts +13 -0
- package/src/deploy/rss.ts +4 -1
- package/src/deploy/sitemap.ts +3 -1
- package/src/eval/agents.ts +1 -1
- package/src/eval/report.ts +20 -28
- package/src/markdown/directives.ts +6 -18
- package/src/markdown/index.ts +1 -6
- package/src/markdown/package-commands.ts +0 -4
- package/src/openapi/parse.ts +11 -9
- package/src/search/documents.ts +11 -0
- package/src/search/facets.ts +33 -0
- package/src/search/orama-index.ts +48 -6
- package/src/search/popular-icon.ts +33 -0
- package/src/theme/icon-kind.ts +20 -0
- package/src/translate/agents.ts +51 -0
- package/src/translate/ledger.ts +142 -0
- package/src/translate/meta.ts +149 -0
- package/src/translate/prompts.ts +95 -0
- package/src/translate/report.ts +354 -0
- package/src/translate/run.ts +357 -0
- package/src/translate/validate.ts +171 -0
- package/src/translate/work-list.ts +0 -0
- package/src/deploy/xml.ts +0 -8
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { existsSync
|
|
2
|
-
import { createRequire } from "node:module";
|
|
3
|
-
import { pathToFileURL } from "node:url";
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
4
2
|
|
|
5
|
-
import {
|
|
3
|
+
import { parseTsconfig } from "get-tsconfig";
|
|
4
|
+
import { dirname, join, resolve } from "pathe";
|
|
6
5
|
|
|
7
6
|
/**
|
|
8
7
|
* Read the project's TypeScript path aliases (`compilerOptions.paths`) and turn
|
|
@@ -15,177 +14,28 @@ import { dirname, isAbsolute, join, resolve } from "pathe";
|
|
|
15
14
|
* import would have to be rewritten to a relative path. Reading the aliases here
|
|
16
15
|
* lets those components port over unchanged.
|
|
17
16
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
17
|
+
* Parsing is get-tsconfig's job — JSONC, the full `extends` chain (relative
|
|
18
|
+
* paths, directories, package specifiers, TS 5.0 arrays), and the rebasing of
|
|
19
|
+
* inherited relative paths all follow tsc's own semantics. Best-effort and
|
|
20
|
+
* non-fatal: anything unparseable yields no aliases.
|
|
22
21
|
*/
|
|
23
22
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
next: number;
|
|
28
|
-
}
|
|
23
|
+
/** TS 5.5's config-relative template prefix, literal by design in tsconfig. */
|
|
24
|
+
// oxlint-disable-next-line no-template-curly-in-string -- tsconfig's own syntax
|
|
25
|
+
const CONFIG_DIR_TEMPLATE = "${configDir}";
|
|
29
26
|
|
|
30
|
-
/**
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
): ScanStep => {
|
|
36
|
-
const char = text[index];
|
|
37
|
-
if (inString) {
|
|
38
|
-
if (char === "\\") {
|
|
39
|
-
return {
|
|
40
|
-
append: char + (text[index + 1] ?? ""),
|
|
41
|
-
inString: true,
|
|
42
|
-
next: index + 2,
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
return { append: char ?? "", inString: char !== '"', next: index + 1 };
|
|
46
|
-
}
|
|
47
|
-
if (char === '"') {
|
|
48
|
-
return { append: char, inString: true, next: index + 1 };
|
|
49
|
-
}
|
|
50
|
-
if (char === "/" && text[index + 1] === "/") {
|
|
51
|
-
const newline = text.indexOf("\n", index + 2);
|
|
52
|
-
return {
|
|
53
|
-
append: "",
|
|
54
|
-
inString: false,
|
|
55
|
-
next: newline === -1 ? text.length : newline,
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
if (char === "/" && text[index + 1] === "*") {
|
|
59
|
-
const end = text.indexOf("*/", index + 2);
|
|
60
|
-
return {
|
|
61
|
-
append: "",
|
|
62
|
-
inString: false,
|
|
63
|
-
next: end === -1 ? text.length : end + 2,
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
return { append: char ?? "", inString: false, next: index + 1 };
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
/** Strip `//` line and `/* *\/` block comments that sit outside strings. */
|
|
70
|
-
const stripJsonComments = (text: string): string => {
|
|
71
|
-
let out = "";
|
|
72
|
-
let inString = false;
|
|
73
|
-
let index = 0;
|
|
74
|
-
while (index < text.length) {
|
|
75
|
-
const {
|
|
76
|
-
append,
|
|
77
|
-
inString: nextInString,
|
|
78
|
-
next,
|
|
79
|
-
} = scanJsonChar(text, index, inString);
|
|
80
|
-
out += append;
|
|
81
|
-
inString = nextInString;
|
|
82
|
-
index = next;
|
|
83
|
-
}
|
|
84
|
-
return out;
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
const TRAILING_COMMA = /,(?<rest>\s*[}\]])/gu;
|
|
88
|
-
|
|
89
|
-
/** Parse JSONC (tsconfig) into a plain object, or null if it can't be read. */
|
|
90
|
-
const parseJsonc = (text: string): Record<string, unknown> | null => {
|
|
91
|
-
try {
|
|
92
|
-
const cleaned = stripJsonComments(text).replaceAll(
|
|
93
|
-
TRAILING_COMMA,
|
|
94
|
-
"$<rest>"
|
|
95
|
-
);
|
|
96
|
-
const value: unknown = JSON.parse(cleaned);
|
|
97
|
-
return value && typeof value === "object" && !Array.isArray(value)
|
|
98
|
-
? (value as Record<string, unknown>)
|
|
99
|
-
: null;
|
|
100
|
-
} catch {
|
|
101
|
-
return null;
|
|
102
|
-
}
|
|
103
|
-
};
|
|
104
|
-
|
|
105
|
-
const isFile = (path: string): boolean => {
|
|
106
|
-
try {
|
|
107
|
-
return statSync(path).isFile();
|
|
108
|
-
} catch {
|
|
109
|
-
return false;
|
|
110
|
-
}
|
|
111
|
-
};
|
|
112
|
-
|
|
113
|
-
/** Resolve a tsconfig `extends` target (relative path, directory, or package). */
|
|
114
|
-
const resolveExtends = (spec: string, fromDir: string): string | null => {
|
|
115
|
-
if (spec.startsWith(".") || isAbsolute(spec)) {
|
|
116
|
-
const candidates = spec.endsWith(".json")
|
|
117
|
-
? [resolve(fromDir, spec)]
|
|
118
|
-
: [
|
|
119
|
-
resolve(fromDir, `${spec}.json`),
|
|
120
|
-
resolve(fromDir, spec, "tsconfig.json"),
|
|
121
|
-
resolve(fromDir, spec),
|
|
122
|
-
];
|
|
123
|
-
return candidates.find(isFile) ?? null;
|
|
124
|
-
}
|
|
125
|
-
// A bare specifier points at a package's shared config (e.g. `@tsconfig/*`).
|
|
126
|
-
try {
|
|
127
|
-
const requireFromDir = createRequire(
|
|
128
|
-
pathToFileURL(join(fromDir, "_.js")).href
|
|
129
|
-
);
|
|
130
|
-
for (const sub of [`${spec}/tsconfig.json`, spec]) {
|
|
131
|
-
try {
|
|
132
|
-
return requireFromDir.resolve(sub);
|
|
133
|
-
} catch {
|
|
134
|
-
// try the next candidate
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
} catch {
|
|
138
|
-
// createRequire failed; fall through
|
|
139
|
-
}
|
|
140
|
-
return null;
|
|
141
|
-
};
|
|
142
|
-
|
|
143
|
-
interface LoadedPaths {
|
|
144
|
-
/** Directory `paths` entries resolve against (`dirname(file)` + `baseUrl`). */
|
|
145
|
-
baseDir: string;
|
|
146
|
-
paths: Record<string, unknown>;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/** Find the nearest tsconfig in an `extends` chain that declares `paths`. */
|
|
150
|
-
const loadPaths = (file: string, seen: Set<string>): LoadedPaths | null => {
|
|
151
|
-
if (seen.has(file) || !existsSync(file)) {
|
|
152
|
-
return null;
|
|
153
|
-
}
|
|
154
|
-
seen.add(file);
|
|
155
|
-
const json = parseJsonc(readFileSync(file, "utf-8"));
|
|
156
|
-
if (!json) {
|
|
157
|
-
return null;
|
|
158
|
-
}
|
|
159
|
-
const options = (json.compilerOptions ?? {}) as Record<string, unknown>;
|
|
160
|
-
if (options.paths && typeof options.paths === "object") {
|
|
161
|
-
const baseUrl = typeof options.baseUrl === "string" ? options.baseUrl : ".";
|
|
162
|
-
return {
|
|
163
|
-
baseDir: resolve(dirname(file), baseUrl),
|
|
164
|
-
paths: options.paths as Record<string, unknown>,
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
// `extends` is a string or, since TS 5.0, an array searched first-to-last.
|
|
168
|
-
const bases = Array.isArray(json.extends)
|
|
169
|
-
? json.extends
|
|
170
|
-
: [json.extends].filter(Boolean);
|
|
171
|
-
for (const base of bases) {
|
|
172
|
-
if (typeof base !== "string") {
|
|
173
|
-
continue;
|
|
174
|
-
}
|
|
175
|
-
const resolved = resolveExtends(base, dirname(file));
|
|
176
|
-
const found = resolved ? loadPaths(resolved, seen) : null;
|
|
177
|
-
if (found) {
|
|
178
|
-
return found;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
return null;
|
|
182
|
-
};
|
|
27
|
+
/** Substitute a leading `${configDir}` template with the config's directory. */
|
|
28
|
+
const substituteConfigDir = (value: string, configDir: string): string =>
|
|
29
|
+
value.startsWith(CONFIG_DIR_TEMPLATE)
|
|
30
|
+
? join(configDir, value.slice(CONFIG_DIR_TEMPLATE.length))
|
|
31
|
+
: value;
|
|
183
32
|
|
|
184
33
|
/** Convert one tsconfig `paths` mapping to a Vite alias, or null to skip. */
|
|
185
34
|
const toAlias = (
|
|
186
35
|
key: string,
|
|
187
36
|
value: unknown,
|
|
188
|
-
baseDir: string
|
|
37
|
+
baseDir: string,
|
|
38
|
+
configDir: string
|
|
189
39
|
): { find: string; replacement: string } | null => {
|
|
190
40
|
// tsconfig allows a fallback array; Vite aliases are 1:1, so take the first.
|
|
191
41
|
const first = Array.isArray(value) ? value[0] : value;
|
|
@@ -198,7 +48,10 @@ const toAlias = (
|
|
|
198
48
|
if (find === "" || find === "*") {
|
|
199
49
|
return null;
|
|
200
50
|
}
|
|
201
|
-
return {
|
|
51
|
+
return {
|
|
52
|
+
find,
|
|
53
|
+
replacement: resolve(baseDir, substituteConfigDir(target, configDir)),
|
|
54
|
+
};
|
|
202
55
|
};
|
|
203
56
|
|
|
204
57
|
/**
|
|
@@ -215,13 +68,27 @@ export const resolveTsconfigAliases = (
|
|
|
215
68
|
if (!entry) {
|
|
216
69
|
return {};
|
|
217
70
|
}
|
|
218
|
-
|
|
219
|
-
|
|
71
|
+
let options: ReturnType<typeof parseTsconfig>["compilerOptions"];
|
|
72
|
+
try {
|
|
73
|
+
options = parseTsconfig(entry).compilerOptions;
|
|
74
|
+
} catch {
|
|
75
|
+
// Unparseable config or unresolvable extends: no aliases, as before.
|
|
76
|
+
return {};
|
|
77
|
+
}
|
|
78
|
+
const paths = options?.paths;
|
|
79
|
+
if (!paths) {
|
|
220
80
|
return {};
|
|
221
81
|
}
|
|
82
|
+
const configDir = dirname(entry);
|
|
83
|
+
// get-tsconfig rebases inherited relative values onto the entry config, so
|
|
84
|
+
// `baseUrl` (and bare `paths` entries) anchor here after substitution.
|
|
85
|
+
const baseDir = resolve(
|
|
86
|
+
configDir,
|
|
87
|
+
substituteConfigDir(options?.baseUrl ?? ".", configDir)
|
|
88
|
+
);
|
|
222
89
|
const aliases: Record<string, string> = {};
|
|
223
|
-
for (const [key, value] of Object.entries(
|
|
224
|
-
const alias = toAlias(key, value,
|
|
90
|
+
for (const [key, value] of Object.entries(paths)) {
|
|
91
|
+
const alias = toAlias(key, value, baseDir, configDir);
|
|
225
92
|
if (alias) {
|
|
226
93
|
aliases[alias.find] = alias.replacement;
|
|
227
94
|
}
|
package/src/core/types.ts
CHANGED
|
@@ -146,9 +146,10 @@ export interface PageRecord {
|
|
|
146
146
|
contentType: string;
|
|
147
147
|
meta: PageMeta;
|
|
148
148
|
/**
|
|
149
|
-
* Custom frontmatter values declared via `frontmatter.extend
|
|
150
|
-
* the user-supplied
|
|
151
|
-
*
|
|
149
|
+
* Custom frontmatter values declared via `frontmatter.extend` or the page
|
|
150
|
+
* type's `content.types.<type>.frontmatter`, validated by the user-supplied
|
|
151
|
+
* schemas (schema output, so transforms apply). Present only when the
|
|
152
|
+
* project opts in and the page carries at least one value.
|
|
152
153
|
*/
|
|
153
154
|
custom?: Record<string, unknown>;
|
|
154
155
|
headings: Heading[];
|
package/src/core/ui-packs/ar.ts
CHANGED
|
@@ -9,25 +9,40 @@ export const ar: UIStringsOverride = {
|
|
|
9
9
|
connectMcp: "الاتصال بـ MCP",
|
|
10
10
|
copied: "تم النسخ!",
|
|
11
11
|
copyClaudeCode: "نسخ أمر Claude Code",
|
|
12
|
+
copyCode: "نسخ الكود",
|
|
13
|
+
copyCodex: "نسخ أمر Codex",
|
|
12
14
|
copyMarkdown: "نسخ بصيغة Markdown",
|
|
13
15
|
copyServerUrl: "نسخ عنوان URL للخادم",
|
|
14
16
|
edit: "التعديل على GitHub",
|
|
17
|
+
export: "تصدير",
|
|
18
|
+
exportEpub: "التصدير إلى EPUB",
|
|
19
|
+
exportPdf: "التصدير إلى PDF",
|
|
20
|
+
generating: "جارٍ الإنشاء…",
|
|
21
|
+
openIn: "فتح في {name}",
|
|
15
22
|
openInChat: "فتح في المحادثة",
|
|
16
23
|
scrollToTop: "العودة إلى الأعلى",
|
|
17
24
|
},
|
|
18
25
|
ask: {
|
|
26
|
+
ai: "الذكاء الاصطناعي",
|
|
27
|
+
clear: "مسح المحادثة",
|
|
28
|
+
close: "إغلاق",
|
|
29
|
+
copy: "نسخ المحادثة",
|
|
19
30
|
empty: "اطرح سؤالاً حول الوثائق.",
|
|
20
31
|
error: "عذراً، حدث خطأ ما.",
|
|
21
32
|
label: "اطرح سؤالاً",
|
|
22
33
|
placeholder: "اطرح سؤالاً…",
|
|
23
34
|
send: "إرسال",
|
|
35
|
+
tip: "نصيحة: يمكنك فتح المحادثة وإغلاقها باستخدام",
|
|
24
36
|
title: "اسأل الذكاء الاصطناعي",
|
|
37
|
+
you: "أنت",
|
|
25
38
|
},
|
|
26
39
|
banner: { dismiss: "إغلاق الإعلان" },
|
|
27
40
|
changelog: {
|
|
28
41
|
description: "تحديثات المنتج وملاحظات الإصدارات.",
|
|
42
|
+
showReleases: "عرض إصدارات {version}",
|
|
29
43
|
title: "سجل التغييرات",
|
|
30
44
|
},
|
|
45
|
+
content: { diagramError: "تعذّر عرض هذا المخطط." },
|
|
31
46
|
feedback: {
|
|
32
47
|
no: "لا",
|
|
33
48
|
question: "هل كانت هذه الصفحة مفيدة؟",
|
|
@@ -35,7 +50,24 @@ export const ar: UIStringsOverride = {
|
|
|
35
50
|
yes: "نعم",
|
|
36
51
|
},
|
|
37
52
|
languageSwitcher: { label: "اللغة", untranslated: "غير مترجم" },
|
|
38
|
-
nav: {
|
|
53
|
+
nav: {
|
|
54
|
+
back: "رجوع",
|
|
55
|
+
breadcrumb: "مسار التنقل",
|
|
56
|
+
closeNavigation: "إغلاق التنقل",
|
|
57
|
+
deprecated: "مهمل",
|
|
58
|
+
featured: "مميز",
|
|
59
|
+
githubRepository: "مستودع GitHub",
|
|
60
|
+
navigation: "التنقل",
|
|
61
|
+
primary: "رئيسي",
|
|
62
|
+
sections: "الأقسام",
|
|
63
|
+
toggleNavigation: "تبديل التنقل",
|
|
64
|
+
toggleTheme: "تبديل سمة الألوان",
|
|
65
|
+
},
|
|
66
|
+
notFound: {
|
|
67
|
+
description: "لم نتمكن من العثور على الصفحة التي تبحث عنها.",
|
|
68
|
+
home: "العودة إلى الصفحة الرئيسية",
|
|
69
|
+
title: "الصفحة غير موجودة",
|
|
70
|
+
},
|
|
39
71
|
page: {
|
|
40
72
|
lastUpdated: "آخر تحديث في",
|
|
41
73
|
next: "التالي",
|
|
@@ -45,11 +77,20 @@ export const ar: UIStringsOverride = {
|
|
|
45
77
|
},
|
|
46
78
|
search: {
|
|
47
79
|
all: "الكل",
|
|
80
|
+
allLanguages: "جميع اللغات",
|
|
81
|
+
askAi: "اسأل الذكاء الاصطناعي",
|
|
82
|
+
askAiHint: "احصل على إجابة فورية من الذكاء الاصطناعي",
|
|
48
83
|
button: "بحث",
|
|
49
84
|
devOnly: "البحث متاح في إصدار الإنتاج.",
|
|
85
|
+
error: "حدث خطأ ما. يرجى المحاولة مرة أخرى.",
|
|
50
86
|
label: "البحث في الوثائق",
|
|
87
|
+
navigate: "تنقل",
|
|
51
88
|
noResults: "لم يتم العثور على نتائج.",
|
|
89
|
+
open: "فتح",
|
|
52
90
|
placeholder: "البحث في الوثائق…",
|
|
91
|
+
popular: "شائع",
|
|
92
|
+
preview: "معاينة",
|
|
93
|
+
results: "النتائج",
|
|
53
94
|
},
|
|
54
95
|
toc: { title: "في هذه الصفحة" },
|
|
55
96
|
};
|
package/src/core/ui-packs/bg.ts
CHANGED
|
@@ -9,25 +9,40 @@ export const bg: UIStringsOverride = {
|
|
|
9
9
|
connectMcp: "Свържи се с MCP",
|
|
10
10
|
copied: "Копирано!",
|
|
11
11
|
copyClaudeCode: "Копирай командата на Claude Code",
|
|
12
|
+
copyCode: "Копирай кода",
|
|
13
|
+
copyCodex: "Копирай командата на Codex",
|
|
12
14
|
copyMarkdown: "Копирай като Markdown",
|
|
13
15
|
copyServerUrl: "Копирай URL на сървъра",
|
|
14
16
|
edit: "Редактирай в GitHub",
|
|
17
|
+
export: "Експортирай",
|
|
18
|
+
exportEpub: "Експортирай в EPUB",
|
|
19
|
+
exportPdf: "Експортирай в PDF",
|
|
20
|
+
generating: "Генериране…",
|
|
21
|
+
openIn: "Отвори в {name}",
|
|
15
22
|
openInChat: "Отвори в чата",
|
|
16
23
|
scrollToTop: "Нагоре",
|
|
17
24
|
},
|
|
18
25
|
ask: {
|
|
26
|
+
ai: "ИИ",
|
|
27
|
+
clear: "Изчисти разговора",
|
|
28
|
+
close: "Затвори",
|
|
29
|
+
copy: "Копирай разговора",
|
|
19
30
|
empty: "Задайте въпрос за документацията.",
|
|
20
31
|
error: "Съжаляваме, нещо се обърка.",
|
|
21
32
|
label: "Задайте въпрос",
|
|
22
33
|
placeholder: "Задайте въпрос…",
|
|
23
34
|
send: "Изпрати",
|
|
35
|
+
tip: "Съвет: Можете да отваряте и затваряте чата с",
|
|
24
36
|
title: "Попитай ИИ",
|
|
37
|
+
you: "Вие",
|
|
25
38
|
},
|
|
26
39
|
banner: { dismiss: "Затваряне на съобщението" },
|
|
27
40
|
changelog: {
|
|
28
41
|
description: "Актуализации на продукта и бележки към изданията.",
|
|
42
|
+
showReleases: "Покажи изданията на {version}",
|
|
29
43
|
title: "Дневник на промените",
|
|
30
44
|
},
|
|
45
|
+
content: { diagramError: "Тази диаграма не можа да бъде показана." },
|
|
31
46
|
feedback: {
|
|
32
47
|
no: "Не",
|
|
33
48
|
question: "Беше ли полезна тази страница?",
|
|
@@ -35,7 +50,24 @@ export const bg: UIStringsOverride = {
|
|
|
35
50
|
yes: "Да",
|
|
36
51
|
},
|
|
37
52
|
languageSwitcher: { label: "Език", untranslated: "Непреведено" },
|
|
38
|
-
nav: {
|
|
53
|
+
nav: {
|
|
54
|
+
back: "Назад",
|
|
55
|
+
breadcrumb: "Навигационна пътека",
|
|
56
|
+
closeNavigation: "Затвори навигацията",
|
|
57
|
+
deprecated: "остаряло",
|
|
58
|
+
featured: "Препоръчано",
|
|
59
|
+
githubRepository: "Хранилище в GitHub",
|
|
60
|
+
navigation: "Навигация",
|
|
61
|
+
primary: "Основно",
|
|
62
|
+
sections: "Раздели",
|
|
63
|
+
toggleNavigation: "Превключи навигацията",
|
|
64
|
+
toggleTheme: "Превключи цветовата тема",
|
|
65
|
+
},
|
|
66
|
+
notFound: {
|
|
67
|
+
description: "Не успяхме да намерим страницата, която търсите.",
|
|
68
|
+
home: "Обратно към началната страница",
|
|
69
|
+
title: "Страницата не е намерена",
|
|
70
|
+
},
|
|
39
71
|
page: {
|
|
40
72
|
lastUpdated: "Последна актуализация",
|
|
41
73
|
next: "Напред",
|
|
@@ -45,11 +77,20 @@ export const bg: UIStringsOverride = {
|
|
|
45
77
|
},
|
|
46
78
|
search: {
|
|
47
79
|
all: "Всички",
|
|
80
|
+
allLanguages: "Всички езици",
|
|
81
|
+
askAi: "Попитай ИИ",
|
|
82
|
+
askAiHint: "Получете незабавен отговор от ИИ",
|
|
48
83
|
button: "Търсене",
|
|
49
84
|
devOnly: "Търсенето е достъпно в производствената компилация.",
|
|
85
|
+
error: "Нещо се обърка. Моля, опитайте отново.",
|
|
50
86
|
label: "Търсене в документацията",
|
|
87
|
+
navigate: "навигация",
|
|
51
88
|
noResults: "Няма намерени резултати.",
|
|
89
|
+
open: "отвори",
|
|
52
90
|
placeholder: "Търсене в документацията…",
|
|
91
|
+
popular: "Популярни",
|
|
92
|
+
preview: "преглед",
|
|
93
|
+
results: "Резултати",
|
|
53
94
|
},
|
|
54
95
|
toc: { title: "На тази страница" },
|
|
55
96
|
};
|
package/src/core/ui-packs/bn.ts
CHANGED
|
@@ -9,25 +9,40 @@ export const bn: UIStringsOverride = {
|
|
|
9
9
|
connectMcp: "MCP-তে সংযোগ করুন",
|
|
10
10
|
copied: "অনুলিপি করা হয়েছে!",
|
|
11
11
|
copyClaudeCode: "Claude Code কমান্ড অনুলিপি করুন",
|
|
12
|
+
copyCode: "কোড অনুলিপি করুন",
|
|
13
|
+
copyCodex: "Codex কমান্ড অনুলিপি করুন",
|
|
12
14
|
copyMarkdown: "Markdown হিসেবে অনুলিপি করুন",
|
|
13
15
|
copyServerUrl: "সার্ভার URL অনুলিপি করুন",
|
|
14
16
|
edit: "GitHub-এ সম্পাদনা করুন",
|
|
17
|
+
export: "এক্সপোর্ট করুন",
|
|
18
|
+
exportEpub: "EPUB-এ এক্সপোর্ট করুন",
|
|
19
|
+
exportPdf: "PDF-এ এক্সপোর্ট করুন",
|
|
20
|
+
generating: "তৈরি হচ্ছে…",
|
|
21
|
+
openIn: "{name}-এ খুলুন",
|
|
15
22
|
openInChat: "চ্যাটে খুলুন",
|
|
16
23
|
scrollToTop: "উপরে যান",
|
|
17
24
|
},
|
|
18
25
|
ask: {
|
|
26
|
+
ai: "AI",
|
|
27
|
+
clear: "কথোপকথন মুছুন",
|
|
28
|
+
close: "বন্ধ করুন",
|
|
29
|
+
copy: "কথোপকথন অনুলিপি করুন",
|
|
19
30
|
empty: "ডকুমেন্টেশন সম্পর্কে একটি প্রশ্ন করুন।",
|
|
20
31
|
error: "দুঃখিত, কিছু একটা ভুল হয়েছে।",
|
|
21
32
|
label: "একটি প্রশ্ন করুন",
|
|
22
33
|
placeholder: "একটি প্রশ্ন করুন…",
|
|
23
34
|
send: "পাঠান",
|
|
35
|
+
tip: "টিপ: চ্যাট খুলতে ও বন্ধ করতে চাপুন",
|
|
24
36
|
title: "AI-কে জিজ্ঞাসা করুন",
|
|
37
|
+
you: "আপনি",
|
|
25
38
|
},
|
|
26
39
|
banner: { dismiss: "ঘোষণা বন্ধ করুন" },
|
|
27
40
|
changelog: {
|
|
28
41
|
description: "পণ্য আপডেট এবং রিলিজ নোট।",
|
|
42
|
+
showReleases: "{version} রিলিজ দেখান",
|
|
29
43
|
title: "পরিবর্তন লগ",
|
|
30
44
|
},
|
|
45
|
+
content: { diagramError: "এই ডায়াগ্রামটি রেন্ডার করা যায়নি।" },
|
|
31
46
|
feedback: {
|
|
32
47
|
no: "না",
|
|
33
48
|
question: "এই পৃষ্ঠাটি কি সহায়ক ছিল?",
|
|
@@ -35,7 +50,24 @@ export const bn: UIStringsOverride = {
|
|
|
35
50
|
yes: "হ্যাঁ",
|
|
36
51
|
},
|
|
37
52
|
languageSwitcher: { label: "ভাষা", untranslated: "অনূদিত নয়" },
|
|
38
|
-
nav: {
|
|
53
|
+
nav: {
|
|
54
|
+
back: "ফিরে যান",
|
|
55
|
+
breadcrumb: "ব্রেডক্রাম্ব",
|
|
56
|
+
closeNavigation: "নেভিগেশন বন্ধ করুন",
|
|
57
|
+
deprecated: "অপ্রচলিত",
|
|
58
|
+
featured: "ফিচার্ড",
|
|
59
|
+
githubRepository: "GitHub রিপোজিটরি",
|
|
60
|
+
navigation: "নেভিগেশন",
|
|
61
|
+
primary: "প্রধান",
|
|
62
|
+
sections: "বিভাগসমূহ",
|
|
63
|
+
toggleNavigation: "নেভিগেশন টগল করুন",
|
|
64
|
+
toggleTheme: "রঙের থিম টগল করুন",
|
|
65
|
+
},
|
|
66
|
+
notFound: {
|
|
67
|
+
description: "আপনি যে পৃষ্ঠাটি খুঁজছেন তা আমরা খুঁজে পাইনি।",
|
|
68
|
+
home: "হোমে ফিরে যান",
|
|
69
|
+
title: "পৃষ্ঠা পাওয়া যায়নি",
|
|
70
|
+
},
|
|
39
71
|
page: {
|
|
40
72
|
lastUpdated: "সর্বশেষ আপডেট",
|
|
41
73
|
next: "পরবর্তী",
|
|
@@ -45,11 +77,20 @@ export const bn: UIStringsOverride = {
|
|
|
45
77
|
},
|
|
46
78
|
search: {
|
|
47
79
|
all: "সব",
|
|
80
|
+
allLanguages: "সব ভাষা",
|
|
81
|
+
askAi: "AI-কে জিজ্ঞাসা করুন",
|
|
82
|
+
askAiHint: "AI থেকে তাৎক্ষণিক উত্তর পান",
|
|
48
83
|
button: "অনুসন্ধান",
|
|
49
84
|
devOnly: "অনুসন্ধান প্রোডাকশন বিল্ডে উপলব্ধ।",
|
|
85
|
+
error: "কিছু একটা ভুল হয়েছে। অনুগ্রহ করে আবার চেষ্টা করুন।",
|
|
50
86
|
label: "ডকুমেন্টেশন অনুসন্ধান করুন",
|
|
87
|
+
navigate: "নেভিগেট",
|
|
51
88
|
noResults: "কোনো ফলাফল পাওয়া যায়নি।",
|
|
89
|
+
open: "খুলুন",
|
|
52
90
|
placeholder: "ডকুমেন্টেশন অনুসন্ধান করুন…",
|
|
91
|
+
popular: "জনপ্রিয়",
|
|
92
|
+
preview: "প্রিভিউ",
|
|
93
|
+
results: "ফলাফল",
|
|
53
94
|
},
|
|
54
95
|
toc: { title: "এই পৃষ্ঠায়" },
|
|
55
96
|
};
|
package/src/core/ui-packs/ca.ts
CHANGED
|
@@ -9,25 +9,42 @@ export const ca: UIStringsOverride = {
|
|
|
9
9
|
connectMcp: "Connecta a MCP",
|
|
10
10
|
copied: "Copiat!",
|
|
11
11
|
copyClaudeCode: "Copia l'ordre de Claude Code",
|
|
12
|
+
copyCode: "Copia el codi",
|
|
13
|
+
copyCodex: "Copia l'ordre de Codex",
|
|
12
14
|
copyMarkdown: "Copia com a Markdown",
|
|
13
15
|
copyServerUrl: "Copia l'URL del servidor",
|
|
14
16
|
edit: "Edita a GitHub",
|
|
17
|
+
export: "Exporta",
|
|
18
|
+
exportEpub: "Exporta a EPUB",
|
|
19
|
+
exportPdf: "Exporta a PDF",
|
|
20
|
+
generating: "S'està generant…",
|
|
21
|
+
openIn: "Obre a {name}",
|
|
15
22
|
openInChat: "Obre al xat",
|
|
16
23
|
scrollToTop: "Torna a dalt",
|
|
17
24
|
},
|
|
18
25
|
ask: {
|
|
26
|
+
ai: "IA",
|
|
27
|
+
clear: "Esborra la conversa",
|
|
28
|
+
close: "Tanca",
|
|
29
|
+
copy: "Copia la conversa",
|
|
19
30
|
empty: "Fes una pregunta sobre la documentació.",
|
|
20
31
|
error: "Ho sentim, alguna cosa ha anat malament.",
|
|
21
32
|
label: "Fes una pregunta",
|
|
22
33
|
placeholder: "Fes una pregunta…",
|
|
23
34
|
send: "Envia",
|
|
35
|
+
tip: "Consell: pots obrir i tancar el xat amb",
|
|
24
36
|
title: "Pregunta a la IA",
|
|
37
|
+
you: "Tu",
|
|
25
38
|
},
|
|
26
39
|
banner: { dismiss: "Tanca l'anunci" },
|
|
27
40
|
changelog: {
|
|
28
41
|
description: "Actualitzacions del producte i notes de la versió.",
|
|
42
|
+
showReleases: "Mostra les versions {version}",
|
|
29
43
|
title: "Registre de canvis",
|
|
30
44
|
},
|
|
45
|
+
content: {
|
|
46
|
+
diagramError: "No s'ha pogut mostrar aquest diagrama.",
|
|
47
|
+
},
|
|
31
48
|
feedback: {
|
|
32
49
|
no: "No",
|
|
33
50
|
question: "Aquesta pàgina t'ha estat útil?",
|
|
@@ -35,7 +52,24 @@ export const ca: UIStringsOverride = {
|
|
|
35
52
|
yes: "Sí",
|
|
36
53
|
},
|
|
37
54
|
languageSwitcher: { label: "Idioma", untranslated: "Sense traduir" },
|
|
38
|
-
nav: {
|
|
55
|
+
nav: {
|
|
56
|
+
back: "Enrere",
|
|
57
|
+
breadcrumb: "Ruta de navegació",
|
|
58
|
+
closeNavigation: "Tanca la navegació",
|
|
59
|
+
deprecated: "obsolet",
|
|
60
|
+
featured: "Destacat",
|
|
61
|
+
githubRepository: "Repositori de GitHub",
|
|
62
|
+
navigation: "Navegació",
|
|
63
|
+
primary: "Principal",
|
|
64
|
+
sections: "Seccions",
|
|
65
|
+
toggleNavigation: "Mostra o amaga la navegació",
|
|
66
|
+
toggleTheme: "Canvia el tema de color",
|
|
67
|
+
},
|
|
68
|
+
notFound: {
|
|
69
|
+
description: "No hem pogut trobar la pàgina que cerques.",
|
|
70
|
+
home: "Torna a l'inici",
|
|
71
|
+
title: "Pàgina no trobada",
|
|
72
|
+
},
|
|
39
73
|
page: {
|
|
40
74
|
lastUpdated: "Última actualització el",
|
|
41
75
|
next: "Següent",
|
|
@@ -45,11 +79,20 @@ export const ca: UIStringsOverride = {
|
|
|
45
79
|
},
|
|
46
80
|
search: {
|
|
47
81
|
all: "Tots",
|
|
82
|
+
allLanguages: "Tots els idiomes",
|
|
83
|
+
askAi: "Pregunta a la IA",
|
|
84
|
+
askAiHint: "Obtén una resposta instantània de la IA",
|
|
48
85
|
button: "Cerca",
|
|
49
86
|
devOnly: "La cerca està disponible a la compilació de producció.",
|
|
87
|
+
error: "Alguna cosa ha anat malament. Torna-ho a provar.",
|
|
50
88
|
label: "Cerca a la documentació",
|
|
89
|
+
navigate: "navega",
|
|
51
90
|
noResults: "No s'ha trobat cap resultat.",
|
|
91
|
+
open: "obre",
|
|
52
92
|
placeholder: "Cerca a la documentació…",
|
|
93
|
+
popular: "Populars",
|
|
94
|
+
preview: "previsualitza",
|
|
95
|
+
results: "Resultats",
|
|
53
96
|
},
|
|
54
97
|
toc: { title: "En aquesta pàgina" },
|
|
55
98
|
};
|