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.
Files changed (139) hide show
  1. package/CHANGELOG.md +72 -0
  2. package/dist/cli/index.js +3512 -814
  3. package/dist/cli/index.js.map +99 -87
  4. package/dist/types/core/base-path.d.ts +5 -0
  5. package/dist/types/core/config-input.d.ts +82 -6
  6. package/dist/types/core/i18n-ui.d.ts +2 -0
  7. package/dist/types/core/schema.d.ts +19 -2
  8. package/dist/types/core/sources/types.d.ts +5 -0
  9. package/dist/types/core/types.d.ts +4 -3
  10. package/docs/02-deployment.mdx +1 -1
  11. package/docs/configuration/ai.mdx +15 -1
  12. package/docs/configuration/index.mdx +26 -0
  13. package/docs/configuration/search.mdx +1 -3
  14. package/docs/content/i18n.mdx +13 -1
  15. package/docs/content/navigation.mdx +11 -0
  16. package/docs/reference/cli.mdx +4 -0
  17. package/docs/reference/frontmatter.mdx +33 -0
  18. package/docs/reference/meta.ts +1 -1
  19. package/docs/reference/translate.mdx +80 -0
  20. package/package.json +22 -1
  21. package/src/ai/agent-readability.ts +7 -4
  22. package/src/ai/ask-context.ts +3 -6
  23. package/src/ai/component-markdown.ts +7 -6
  24. package/src/ai/mcp/data.ts +10 -4
  25. package/src/ai/mcp/server.ts +74 -3
  26. package/src/ai/mcp/tools.ts +2 -2
  27. package/src/astro/generate.ts +4 -13
  28. package/src/astro/integration.ts +3 -1
  29. package/src/astro/islands.ts +4 -1
  30. package/src/astro/markdown-negotiation.ts +5 -0
  31. package/src/astro/templates.ts +69 -22
  32. package/src/audit/checks/indexability.ts +3 -6
  33. package/src/audit/checks/robots.ts +18 -37
  34. package/src/audit/crawl.ts +49 -49
  35. package/src/audit/image-size.ts +13 -53
  36. package/src/audit/report.ts +22 -33
  37. package/src/audit/types.ts +6 -2
  38. package/src/audit/url.ts +5 -10
  39. package/src/cli/commands/build.ts +129 -24
  40. package/src/cli/commands/dev.ts +9 -21
  41. package/src/cli/commands/doctor.ts +9 -22
  42. package/src/cli/commands/translate.ts +300 -0
  43. package/src/cli/env.ts +6 -52
  44. package/src/cli/index.ts +2 -0
  45. package/src/cli/init/scaffold.ts +15 -28
  46. package/src/cli/internal-error.ts +11 -11
  47. package/src/components/Icon.astro +2 -7
  48. package/src/components/content/Step.astro +3 -8
  49. package/src/components/content/Tab.astro +20 -1
  50. package/src/components/islands/ask-ai.tsx +25 -100
  51. package/src/components/islands/hooks.ts +10 -3
  52. package/src/components/layout/LanguageSwitcher.astro +2 -1
  53. package/src/components/layout/Logo.astro +4 -4
  54. package/src/components/layout/PageActions.astro +12 -7
  55. package/src/components/layout/RootLayout.astro +37 -109
  56. package/src/components/layout/Search.astro +18 -25
  57. package/src/components/layout/search/orama.ts +3 -1
  58. package/src/components/layout/search/types.ts +4 -16
  59. package/src/components/openapi/helpers.ts +21 -75
  60. package/src/core/base-path.ts +9 -0
  61. package/src/core/component-overrides.ts +0 -7
  62. package/src/core/config-input.ts +84 -6
  63. package/src/core/config.ts +3 -3
  64. package/src/core/diagnostics.ts +10 -20
  65. package/src/core/fs-atomic.ts +22 -0
  66. package/src/core/graph.ts +46 -2
  67. package/src/core/i18n-ui.ts +2 -0
  68. package/src/core/i18n.ts +31 -0
  69. package/src/core/nav-diagnostics.ts +13 -34
  70. package/src/core/project-graph.ts +13 -2
  71. package/src/core/schema.ts +174 -74
  72. package/src/core/sources/github-releases.ts +29 -26
  73. package/src/core/sources/mdx-remote.ts +10 -57
  74. package/src/core/sources/normalize.ts +25 -12
  75. package/src/core/sources/notion.ts +17 -23
  76. package/src/core/sources/types.ts +5 -0
  77. package/src/core/tsconfig-aliases.ts +39 -172
  78. package/src/core/types.ts +4 -3
  79. package/src/core/ui-packs/ar.ts +42 -1
  80. package/src/core/ui-packs/bg.ts +42 -1
  81. package/src/core/ui-packs/bn.ts +42 -1
  82. package/src/core/ui-packs/ca.ts +44 -1
  83. package/src/core/ui-packs/cs.ts +42 -1
  84. package/src/core/ui-packs/da.ts +42 -1
  85. package/src/core/ui-packs/de.ts +42 -1
  86. package/src/core/ui-packs/el.ts +44 -1
  87. package/src/core/ui-packs/es.ts +44 -1
  88. package/src/core/ui-packs/fa.ts +42 -1
  89. package/src/core/ui-packs/fi.ts +42 -1
  90. package/src/core/ui-packs/fr.ts +44 -1
  91. package/src/core/ui-packs/he.ts +42 -1
  92. package/src/core/ui-packs/hi.ts +42 -1
  93. package/src/core/ui-packs/hr.ts +42 -1
  94. package/src/core/ui-packs/hu.ts +42 -1
  95. package/src/core/ui-packs/id.ts +42 -1
  96. package/src/core/ui-packs/it.ts +44 -1
  97. package/src/core/ui-packs/ja.ts +44 -1
  98. package/src/core/ui-packs/ko.ts +44 -1
  99. package/src/core/ui-packs/nl.ts +42 -1
  100. package/src/core/ui-packs/no.ts +42 -1
  101. package/src/core/ui-packs/pl.ts +42 -1
  102. package/src/core/ui-packs/pt-br.ts +44 -1
  103. package/src/core/ui-packs/pt.ts +44 -1
  104. package/src/core/ui-packs/ro.ts +42 -1
  105. package/src/core/ui-packs/ru.ts +42 -1
  106. package/src/core/ui-packs/sk.ts +42 -1
  107. package/src/core/ui-packs/sr.ts +42 -1
  108. package/src/core/ui-packs/sv.ts +42 -1
  109. package/src/core/ui-packs/th.ts +44 -1
  110. package/src/core/ui-packs/tr.ts +42 -1
  111. package/src/core/ui-packs/uk.ts +42 -1
  112. package/src/core/ui-packs/vi.ts +44 -1
  113. package/src/core/ui-packs/zh-tw.ts +44 -1
  114. package/src/core/ui-packs/zh.ts +44 -1
  115. package/src/deploy/adapter-output.ts +44 -5
  116. package/src/deploy/cloudflare-negotiation.ts +527 -0
  117. package/src/deploy/redirects.ts +13 -0
  118. package/src/deploy/rss.ts +4 -1
  119. package/src/deploy/sitemap.ts +3 -1
  120. package/src/eval/agents.ts +1 -1
  121. package/src/eval/report.ts +20 -28
  122. package/src/markdown/directives.ts +6 -18
  123. package/src/markdown/index.ts +1 -6
  124. package/src/markdown/package-commands.ts +0 -4
  125. package/src/openapi/parse.ts +11 -9
  126. package/src/search/documents.ts +11 -0
  127. package/src/search/facets.ts +33 -0
  128. package/src/search/orama-index.ts +48 -6
  129. package/src/search/popular-icon.ts +33 -0
  130. package/src/theme/icon-kind.ts +20 -0
  131. package/src/translate/agents.ts +51 -0
  132. package/src/translate/ledger.ts +142 -0
  133. package/src/translate/meta.ts +149 -0
  134. package/src/translate/prompts.ts +95 -0
  135. package/src/translate/report.ts +354 -0
  136. package/src/translate/run.ts +357 -0
  137. package/src/translate/validate.ts +171 -0
  138. package/src/translate/work-list.ts +0 -0
  139. package/src/deploy/xml.ts +0 -8
@@ -1,8 +1,7 @@
1
- import { existsSync, readFileSync, statSync } from "node:fs";
2
- import { createRequire } from "node:module";
3
- import { pathToFileURL } from "node:url";
1
+ import { existsSync } from "node:fs";
4
2
 
5
- import { dirname, isAbsolute, join, resolve } from "pathe";
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
- * Best-effort and non-fatal: tsconfig is parsed leniently (it is JSONC —
19
- * comments and trailing commas), a single `extends` chain is followed to the
20
- * file that actually declares `paths`, and anything unparseable yields no
21
- * aliases (the prior behavior).
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
- interface ScanStep {
25
- append: string;
26
- inString: boolean;
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
- /** Scan one character (or comment/escape run) starting at `index`. */
31
- const scanJsonChar = (
32
- text: string,
33
- index: number,
34
- inString: boolean
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 { find, replacement: resolve(baseDir, target) };
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
- const loaded = loadPaths(entry, new Set());
219
- if (!loaded) {
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(loaded.paths)) {
224
- const alias = toAlias(key, value, loaded.baseDir);
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`, validated by
150
- * the user-supplied schemas (schema output, so transforms apply). Present
151
- * only when the project opts in and the page carries at least one value.
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[];
@@ -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: { breadcrumb: "مسار التنقل" },
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
  };
@@ -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: { breadcrumb: "Навигационна пътека" },
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
  };
@@ -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: { breadcrumb: "ব্রেডক্রাম্ব" },
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
  };
@@ -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: { breadcrumb: "Ruta de navegació" },
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
  };