@astrojs/starlight 0.12.1 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/CHANGELOG.md +77 -0
  2. package/components/Icons.ts +2 -0
  3. package/components/Search.astro +3 -2
  4. package/components/SiteTitle.astro +2 -2
  5. package/index.ts +17 -1
  6. package/integrations/asides.ts +17 -14
  7. package/integrations/expressive-code/exports.ts +36 -0
  8. package/integrations/expressive-code/index.ts +156 -0
  9. package/integrations/expressive-code/themes/night-owl-dark.jsonc +1796 -0
  10. package/integrations/expressive-code/themes/night-owl-light.jsonc +1695 -0
  11. package/integrations/expressive-code/theming.ts +108 -0
  12. package/integrations/expressive-code/translations.ts +26 -0
  13. package/integrations/shared/pathToLocale.ts +32 -0
  14. package/integrations/virtual-user-config.ts +14 -2
  15. package/package.json +3 -1
  16. package/schemas/expressiveCode.ts +13 -0
  17. package/schemas/i18n.ts +28 -2
  18. package/schemas/social.ts +2 -0
  19. package/translations/ar.json +5 -1
  20. package/translations/cs.json +5 -1
  21. package/translations/da.json +5 -1
  22. package/translations/de.json +5 -1
  23. package/translations/en.json +5 -1
  24. package/translations/es.json +5 -1
  25. package/translations/fa.json +5 -1
  26. package/translations/fr.json +5 -1
  27. package/translations/gl.json +5 -1
  28. package/translations/he.json +5 -1
  29. package/translations/hi.json +26 -0
  30. package/translations/id.json +5 -1
  31. package/translations/index.ts +4 -0
  32. package/translations/it.json +5 -1
  33. package/translations/ja.json +5 -1
  34. package/translations/ko.json +5 -1
  35. package/translations/nb.json +5 -1
  36. package/translations/nl.json +5 -1
  37. package/translations/pt.json +5 -1
  38. package/translations/ro.json +26 -0
  39. package/translations/ru.json +5 -1
  40. package/translations/sv.json +5 -1
  41. package/translations/tr.json +5 -1
  42. package/translations/uk.json +5 -1
  43. package/translations/vi.json +5 -1
  44. package/translations/zh-CN.json +5 -1
  45. package/utils/base.ts +4 -4
  46. package/utils/createPathFormatter.ts +57 -0
  47. package/utils/format-path.ts +7 -0
  48. package/utils/navigation.ts +21 -10
  49. package/utils/path.ts +15 -0
  50. package/utils/user-config.ts +7 -0
  51. package/virtual.d.ts +9 -1
@@ -0,0 +1,108 @@
1
+ import fs from 'node:fs';
2
+ import { ExpressiveCodeTheme, type ThemeObjectOrShikiThemeName } from 'astro-expressive-code';
3
+
4
+ export type BundledThemeName = 'starlight-dark' | 'starlight-light';
5
+
6
+ export type ThemeObjectOrBundledThemeName = ThemeObjectOrShikiThemeName | BundledThemeName;
7
+
8
+ /**
9
+ * Converts the Starlight `themes` config option into a format understood by Expressive Code,
10
+ * loading any bundled themes and using the Starlight defaults if no themes were provided.
11
+ */
12
+ export function preprocessThemes(
13
+ themes: ThemeObjectOrBundledThemeName[] | undefined
14
+ ): ThemeObjectOrShikiThemeName[] {
15
+ // Try to gracefully handle cases where the user forgot to use an array in the config
16
+ themes = themes && !Array.isArray(themes) ? [themes] : themes;
17
+ // If no themes were provided, use our bundled default themes
18
+ if (!themes || !themes.length) themes = ['starlight-dark', 'starlight-light'];
19
+
20
+ return themes.map((theme) => {
21
+ // If the current entry is the name of a bundled theme, load it
22
+ if (theme === 'starlight-dark' || theme === 'starlight-light') {
23
+ const bundledThemeFile =
24
+ theme === 'starlight-dark' ? 'night-owl-dark.jsonc' : 'night-owl-light.jsonc';
25
+ return customizeBundledTheme(
26
+ ExpressiveCodeTheme.fromJSONString(
27
+ fs.readFileSync(new URL(`./themes/${bundledThemeFile}`, import.meta.url), 'utf-8')
28
+ )
29
+ );
30
+ }
31
+ // Otherwise, just pass it through
32
+ return theme;
33
+ });
34
+ }
35
+
36
+ /**
37
+ * Customizes some settings of the bundled theme to make it fit better with Starlight.
38
+ */
39
+ function customizeBundledTheme(theme: ExpressiveCodeTheme) {
40
+ theme.colors['titleBar.border'] = theme.colors['tab.activeBackground'];
41
+ theme.colors['editorGroupHeader.tabsBorder'] = theme.colors['tab.activeBackground'];
42
+
43
+ // Add underline font style to link syntax highlighting tokens
44
+ // to match the new GitHub theme link style
45
+ theme.settings.forEach((s) => {
46
+ if (s.name?.includes('Link')) s.settings.fontStyle = 'underline';
47
+ });
48
+
49
+ return theme;
50
+ }
51
+
52
+ /**
53
+ * Modifies the given theme by applying Starlight's CSS variables to the colors of UI elements
54
+ * (backgrounds, buttons, shadows etc.). This ensures that code blocks match the site's theme.
55
+ */
56
+ export function applyStarlightUiThemeColors(theme: ExpressiveCodeTheme) {
57
+ const isDark = theme.type === 'dark';
58
+ const neutralMinimal = isDark ? '#ffffff17' : '#0000001a';
59
+ const neutralDimmed = isDark ? '#ffffff40' : '#00000055';
60
+
61
+ // Make borders slightly transparent
62
+ const borderColor = 'color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)';
63
+ theme.colors['titleBar.border'] = borderColor;
64
+ theme.colors['editorGroupHeader.tabsBorder'] = borderColor;
65
+
66
+ // Use the same color for terminal title bar background and editor tab bar background
67
+ const backgroundColor = isDark ? 'var(--sl-color-black)' : 'var(--sl-color-gray-6)';
68
+ theme.colors['titleBar.activeBackground'] = backgroundColor;
69
+ theme.colors['editorGroupHeader.tabsBackground'] = backgroundColor;
70
+
71
+ // Use the same color for terminal titles and tab titles
72
+ theme.colors['titleBar.activeForeground'] = 'var(--sl-color-text)';
73
+ theme.colors['tab.activeForeground'] = 'var(--sl-color-text)';
74
+
75
+ // Set tab border colors
76
+ const activeBorderColor = isDark ? 'var(--sl-color-accent-high)' : 'var(--sl-color-accent)';
77
+ theme.colors['tab.activeBorder'] = 'transparent';
78
+ theme.colors['tab.activeBorderTop'] = activeBorderColor;
79
+
80
+ // Use neutral colors for scrollbars
81
+ theme.colors['scrollbarSlider.background'] = neutralMinimal;
82
+ theme.colors['scrollbarSlider.hoverBackground'] = neutralDimmed;
83
+
84
+ // Set theme `bg` color property for contrast calculations
85
+ theme.bg = isDark ? '#23262f' : '#f6f7f9';
86
+ // Set actual background color to the appropriate Starlight CSS variable
87
+ const editorBackgroundColor = isDark ? 'var(--sl-color-gray-6)' : 'var(--sl-color-gray-7)';
88
+
89
+ theme.styleOverrides.frames = {
90
+ // Use the same color for editor background, terminal background and active tab background
91
+ editorBackground: editorBackgroundColor,
92
+ terminalBackground: editorBackgroundColor,
93
+ editorActiveTabBackground: editorBackgroundColor,
94
+ terminalTitlebarDotsForeground: borderColor,
95
+ terminalTitlebarDotsOpacity: '0.75',
96
+ inlineButtonForeground: 'var(--sl-color-text)',
97
+ frameBoxShadowCssValue: 'none',
98
+ };
99
+
100
+ // Use neutral, semi-transparent colors for default text markers
101
+ // to avoid conflicts with the user's chosen background color
102
+ theme.styleOverrides.textMarkers = {
103
+ markBackground: neutralMinimal,
104
+ markBorderColor: neutralDimmed,
105
+ };
106
+
107
+ return theme;
108
+ }
@@ -0,0 +1,26 @@
1
+ import { pluginFramesTexts } from 'astro-expressive-code';
2
+ import type { StarlightConfig } from '../../types';
3
+ import type { createTranslationSystemFromFs } from '../../utils/translations-fs';
4
+
5
+ export function addTranslations(
6
+ locales: StarlightConfig['locales'],
7
+ useTranslations: ReturnType<typeof createTranslationSystemFromFs>
8
+ ) {
9
+ for (const locale in locales) {
10
+ const lang = locales[locale]?.lang;
11
+ if (!lang) continue;
12
+
13
+ const t = useTranslations(locale);
14
+ const translationKeys = [
15
+ 'expressiveCode.copyButtonCopied',
16
+ 'expressiveCode.copyButtonTooltip',
17
+ 'expressiveCode.terminalWindowFallbackTitle',
18
+ ] as const;
19
+ translationKeys.forEach((key) => {
20
+ const translation = t(key);
21
+ if (!translation) return;
22
+ const ecId = key.replace(/^expressiveCode\./, '');
23
+ pluginFramesTexts.overrideTexts(lang, { [ecId]: translation });
24
+ });
25
+ }
26
+ }
@@ -0,0 +1,32 @@
1
+ import type { StarlightConfig } from '../../types';
2
+
3
+ function slugToLocale(
4
+ slug: string | undefined,
5
+ localesConfig: StarlightConfig['locales']
6
+ ): string | undefined {
7
+ const locales = Object.keys(localesConfig || {});
8
+ const baseSegment = slug?.split('/')[0];
9
+ return baseSegment && locales.includes(baseSegment) ? baseSegment : undefined;
10
+ }
11
+
12
+ /** Get current locale from the full file path. */
13
+ export function pathToLocale(
14
+ path: string | undefined,
15
+ {
16
+ starlightConfig,
17
+ astroConfig,
18
+ }: {
19
+ starlightConfig: { locales: StarlightConfig['locales'] };
20
+ astroConfig: { root: URL; srcDir: URL };
21
+ }
22
+ ): string | undefined {
23
+ const srcDir = new URL(astroConfig.srcDir, astroConfig.root);
24
+ const docsDir = new URL('content/docs/', srcDir);
25
+ const slug = path
26
+ // Format path to unix style path.
27
+ ?.replace(/\\/g, '/')
28
+ // Strip docs path leaving only content collection file ID.
29
+ // Example: /Users/houston/repo/src/content/docs/en/guide.md => en/guide.md
30
+ .replace(docsDir.pathname, '');
31
+ return slugToLocale(slug, starlightConfig.locales);
32
+ }
@@ -10,7 +10,14 @@ function resolveVirtualModuleId<T extends string>(id: T): `\0${T}` {
10
10
  /** Vite plugin that exposes Starlight user config and project context via virtual modules. */
11
11
  export function vitePluginStarlightUserConfig(
12
12
  opts: StarlightConfig,
13
- { root, srcDir }: Pick<AstroConfig, 'root' | 'srcDir'>
13
+ {
14
+ build,
15
+ root,
16
+ srcDir,
17
+ trailingSlash,
18
+ }: Pick<AstroConfig, 'root' | 'srcDir' | 'trailingSlash'> & {
19
+ build: Pick<AstroConfig['build'], 'format'>;
20
+ }
14
21
  ): NonNullable<ViteUserConfig['plugins']>[number] {
15
22
  const resolveId = (id: string) =>
16
23
  JSON.stringify(id.startsWith('.') ? resolve(fileURLToPath(root), id) : id);
@@ -18,7 +25,12 @@ export function vitePluginStarlightUserConfig(
18
25
  /** Map of virtual module names to their code contents as strings. */
19
26
  const modules = {
20
27
  'virtual:starlight/user-config': `export default ${JSON.stringify(opts)}`,
21
- 'virtual:starlight/project-context': `export default ${JSON.stringify({ root, srcDir })}`,
28
+ 'virtual:starlight/project-context': `export default ${JSON.stringify({
29
+ build: { format: build.format },
30
+ root,
31
+ srcDir,
32
+ trailingSlash,
33
+ })}`,
22
34
  'virtual:starlight/user-css': opts.customCss.map((id) => `import ${resolveId(id)};`).join(''),
23
35
  'virtual:starlight/user-images': opts.logo
24
36
  ? 'src' in opts.logo
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astrojs/starlight",
3
- "version": "0.12.1",
3
+ "version": "0.13.0",
4
4
  "description": "Build beautiful, high-performance documentation websites with Astro",
5
5
  "keywords": [
6
6
  "docs",
@@ -153,6 +153,7 @@
153
153
  "./props": "./props.ts",
154
154
  "./schema": "./schema.ts",
155
155
  "./types": "./types.ts",
156
+ "./expressive-code": "./integrations/expressive-code/exports.ts",
156
157
  "./index.astro": "./index.astro",
157
158
  "./404.astro": "./404.astro",
158
159
  "./style/markdown.css": "./style/markdown.css"
@@ -172,6 +173,7 @@
172
173
  "@astrojs/sitemap": "^3.0.0",
173
174
  "@pagefind/default-ui": "^1.0.3",
174
175
  "@types/mdast": "^3.0.11",
176
+ "astro-expressive-code": "^0.29.0",
175
177
  "bcp-47": "^2.1.0",
176
178
  "execa": "^8.0.1",
177
179
  "hast-util-select": "^5.0.5",
@@ -0,0 +1,13 @@
1
+ import { z } from 'astro/zod';
2
+ import type { StarlightExpressiveCodeOptions } from '../integrations/expressive-code';
3
+
4
+ export const ExpressiveCodeSchema = () =>
5
+ z
6
+ .union([
7
+ z.custom<StarlightExpressiveCodeOptions>((value) => typeof value === 'object' && value),
8
+ z.boolean(),
9
+ ])
10
+ .describe(
11
+ 'Define how code blocks are rendered by passing options to Expressive Code, or disable the integration by passing `false`.'
12
+ )
13
+ .optional();
package/schemas/i18n.ts CHANGED
@@ -1,12 +1,16 @@
1
1
  import { z } from 'astro/zod';
2
2
 
3
3
  export function i18nSchema() {
4
- return starlightI18nSchema().merge(pagefindI18nSchema());
4
+ return starlightI18nSchema().merge(pagefindI18nSchema()).merge(expressiveCodeI18nSchema());
5
5
  }
6
6
  export type i18nSchemaOutput = z.output<ReturnType<typeof i18nSchema>>;
7
7
 
8
8
  export function builtinI18nSchema() {
9
- return starlightI18nSchema().required().strict().merge(pagefindI18nSchema());
9
+ return starlightI18nSchema()
10
+ .required()
11
+ .strict()
12
+ .merge(pagefindI18nSchema())
13
+ .merge(expressiveCodeI18nSchema());
10
14
  }
11
15
 
12
16
  function starlightI18nSchema() {
@@ -89,6 +93,10 @@ function starlightI18nSchema() {
89
93
  .describe('Label shown on the “next page” pagination arrow in the page footer.'),
90
94
 
91
95
  '404.text': z.string().describe('Text shown on Starlight’s default 404 page'),
96
+ 'aside.tip': z.string().describe('Text shown on the tip aside variant'),
97
+ 'aside.note': z.string().describe('Text shown on the note aside variant'),
98
+ 'aside.caution': z.string().describe('Text shown on the warning aside variant'),
99
+ 'aside.danger': z.string().describe('Text shown on the danger aside variant'),
92
100
  })
93
101
  .partial();
94
102
  }
@@ -158,3 +166,21 @@ function pagefindI18nSchema() {
158
166
  })
159
167
  .partial();
160
168
  }
169
+
170
+ function expressiveCodeI18nSchema() {
171
+ return z
172
+ .object({
173
+ 'expressiveCode.copyButtonCopied': z
174
+ .string()
175
+ .describe('Expressive Code UI translation. English default value: `"Copied!"`'),
176
+
177
+ 'expressiveCode.copyButtonTooltip': z
178
+ .string()
179
+ .describe('Expressive Code UI translation. English default value: `"Copy to clipboard"`'),
180
+
181
+ 'expressiveCode.terminalWindowFallbackTitle': z
182
+ .string()
183
+ .describe('Expressive Code UI translation. English default value: `"Terminal window"`'),
184
+ })
185
+ .partial();
186
+ }
package/schemas/social.ts CHANGED
@@ -24,6 +24,7 @@ export const socialLinks = [
24
24
  'email',
25
25
  'reddit',
26
26
  'patreon',
27
+ 'slack',
27
28
  ] as const;
28
29
 
29
30
  export const SocialLinksSchema = () =>
@@ -63,6 +64,7 @@ export const SocialLinksSchema = () =>
63
64
  email: 'Email',
64
65
  reddit: 'Reddit',
65
66
  patreon: 'Patreon',
67
+ slack: 'Slack',
66
68
  }[key];
67
69
  labelledLinks[key] = { label, url };
68
70
  }
@@ -18,5 +18,9 @@
18
18
  "page.lastUpdated": "اخر تحديث:",
19
19
  "page.previousLink": "السابق",
20
20
  "page.nextLink": "التالي",
21
- "404.text": "الصفحة غير موجودة. تأكد من الرابط أو ابحث بإستعمال شريط البحث."
21
+ "404.text": "الصفحة غير موجودة. تأكد من الرابط أو ابحث بإستعمال شريط البحث.",
22
+ "aside.note": "ملحوظة",
23
+ "aside.tip": "نصيحة",
24
+ "aside.caution": "تنبيه",
25
+ "aside.danger": "تحذير"
22
26
  }
@@ -18,5 +18,9 @@
18
18
  "page.lastUpdated": "Poslední aktualizace:",
19
19
  "page.previousLink": "Předchozí",
20
20
  "page.nextLink": "Další",
21
- "404.text": "Stránka nenalezena. Zkontrolujte adresu URL nebo zkuste použít vyhledávací pole."
21
+ "404.text": "Stránka nenalezena. Zkontrolujte adresu URL nebo zkuste použít vyhledávací pole.",
22
+ "aside.note": "Note",
23
+ "aside.tip": "Tip",
24
+ "aside.caution": "Caution",
25
+ "aside.danger": "Danger"
22
26
  }
@@ -18,5 +18,9 @@
18
18
  "page.lastUpdated": "Sidst opdateret:",
19
19
  "page.previousLink": "Forrige",
20
20
  "page.nextLink": "Næste",
21
- "404.text": "Siden er ikke fundet. Tjek din URL eller prøv søgelinjen."
21
+ "404.text": "Siden er ikke fundet. Tjek din URL eller prøv søgelinjen.",
22
+ "aside.note": "Note",
23
+ "aside.tip": "Tip",
24
+ "aside.caution": "Caution",
25
+ "aside.danger": "Danger"
22
26
  }
@@ -18,5 +18,9 @@
18
18
  "page.lastUpdated": "Zuletzt bearbeitet:",
19
19
  "page.previousLink": "Vorherige Seite",
20
20
  "page.nextLink": "Nächste Seite",
21
- "404.text": "Seite nicht gefunden. Überprüfe die URL oder nutze die Suchleiste."
21
+ "404.text": "Seite nicht gefunden. Überprüfe die URL oder nutze die Suchleiste.",
22
+ "aside.note": "Hinweis",
23
+ "aside.tip": "Tipp",
24
+ "aside.caution": "Achtung",
25
+ "aside.danger": "Gefahr"
22
26
  }
@@ -18,5 +18,9 @@
18
18
  "page.lastUpdated": "Last updated:",
19
19
  "page.previousLink": "Previous",
20
20
  "page.nextLink": "Next",
21
- "404.text": "Page not found. Check the URL or try using the search bar."
21
+ "404.text": "Page not found. Check the URL or try using the search bar.",
22
+ "aside.note": "Note",
23
+ "aside.tip": "Tip",
24
+ "aside.caution": "Caution",
25
+ "aside.danger": "Danger"
22
26
  }
@@ -18,5 +18,9 @@
18
18
  "page.lastUpdated": "Última actualización:",
19
19
  "page.previousLink": "Página anterior",
20
20
  "page.nextLink": "Siguiente página",
21
- "404.text": "Página no encontrada. Verifica la URL o intenta usar la barra de búsqueda."
21
+ "404.text": "Página no encontrada. Verifica la URL o intenta usar la barra de búsqueda.",
22
+ "aside.note": "Nota",
23
+ "aside.tip": "Consejo",
24
+ "aside.caution": "Precaución",
25
+ "aside.danger": "Peligro"
22
26
  }
@@ -18,5 +18,9 @@
18
18
  "page.lastUpdated": "آخرین به روز رسانی:",
19
19
  "page.previousLink": "قبلی",
20
20
  "page.nextLink": "بعدی",
21
- "404.text": "صفحه یافت نشد. لطفاً URL را بررسی کنید یا از جستجو استفاده نمایید."
21
+ "404.text": "صفحه یافت نشد. لطفاً URL را بررسی کنید یا از جستجو استفاده نمایید.",
22
+ "aside.note": "Note",
23
+ "aside.tip": "Tip",
24
+ "aside.caution": "Caution",
25
+ "aside.danger": "Danger"
22
26
  }
@@ -18,5 +18,9 @@
18
18
  "page.lastUpdated": "Dernière mise à jour :",
19
19
  "page.previousLink": "Précédent",
20
20
  "page.nextLink": "Suivant",
21
- "404.text": "Page non trouvée. Vérifiez l’URL ou essayez d’utiliser la barre de recherche."
21
+ "404.text": "Page non trouvée. Vérifiez l’URL ou essayez d’utiliser la barre de recherche.",
22
+ "aside.note": "Note",
23
+ "aside.tip": "Astuce",
24
+ "aside.caution": "Attention",
25
+ "aside.danger": "Danger"
22
26
  }
@@ -18,5 +18,9 @@
18
18
  "page.lastUpdated": "Última actualización:",
19
19
  "page.previousLink": "Anterior",
20
20
  "page.nextLink": "Seguinte",
21
- "404.text": "Paxina non atopada. Comproba a URL ou intenta usar a barra de busca."
21
+ "404.text": "Paxina non atopada. Comproba a URL ou intenta usar a barra de busca.",
22
+ "aside.note": "Note",
23
+ "aside.tip": "Tip",
24
+ "aside.caution": "Caution",
25
+ "aside.danger": "Danger"
22
26
  }
@@ -18,5 +18,9 @@
18
18
  "page.lastUpdated": "עדכון אחרון:",
19
19
  "page.previousLink": "הקודם",
20
20
  "page.nextLink": "הבא",
21
- "404.text": "הדף לא נמצא. אנא בדקו את כתובת האתר או נסו להשתמש בסרגל החיפוש."
21
+ "404.text": "הדף לא נמצא. אנא בדקו את כתובת האתר או נסו להשתמש בסרגל החיפוש.",
22
+ "aside.note": "Note",
23
+ "aside.tip": "Tip",
24
+ "aside.caution": "Caution",
25
+ "aside.danger": "Danger"
22
26
  }
@@ -0,0 +1,26 @@
1
+ {
2
+ "skipLink.label": "इसे छोड़कर कंटेंट पर जाएं",
3
+ "search.label": "खोजें",
4
+ "search.shortcutLabel": "(खोजने के लिए / दबाएँ)",
5
+ "search.cancelLabel": "रद्द करे",
6
+ "search.devWarning": "खोज केवल उत्पादन बिल्ड में उपलब्ध है। \nस्थानीय स्तर पर परीक्षण करने के लिए साइट बनाए और उसका पूर्वावलोकन करने का प्रयास करें।",
7
+ "themeSelect.accessibleLabel": "थीम चुनें",
8
+ "themeSelect.dark": "अँधेरा",
9
+ "themeSelect.light": "रोशनी",
10
+ "themeSelect.auto": "स्वत",
11
+ "languageSelect.accessibleLabel": "भाषा चुने",
12
+ "menuButton.accessibleLabel": "मेन्यू",
13
+ "sidebarNav.accessibleLabel": "मुख्य",
14
+ "tableOfContents.onThisPage": "इस पृष्ठ पर",
15
+ "tableOfContents.overview": "अवलोकन",
16
+ "i18n.untranslatedContent": "यह कंटेंट अभी तक आपकी भाषा में उपलब्ध नहीं है.",
17
+ "page.editLink": "पृष्ठ संपादित करें",
18
+ "page.lastUpdated": "आखिरी अद्यतन:",
19
+ "page.previousLink": "पिछला",
20
+ "page.nextLink": "अगला",
21
+ "404.text": "यह पृष्ठ नहीं मिला। URL जांचें या खोज बार का उपयोग करने का प्रयास करें।",
22
+ "aside.note": "टिप्पणी",
23
+ "aside.tip": "संकेत",
24
+ "aside.caution": "सावधानी",
25
+ "aside.danger": "खतरा"
26
+ }
@@ -18,5 +18,9 @@
18
18
  "page.lastUpdated": "Terakhir diperbaharui:",
19
19
  "page.previousLink": "Sebelumnya",
20
20
  "page.nextLink": "Selanjutnya",
21
- "404.text": "Halaman tidak ditemukan. Cek kembali kolom URL atau gunakan fitur pencarian."
21
+ "404.text": "Halaman tidak ditemukan. Cek kembali kolom URL atau gunakan fitur pencarian.",
22
+ "aside.note": "Catatan",
23
+ "aside.tip": "Tips",
24
+ "aside.caution": "Perhatian",
25
+ "aside.danger": "Bahaya"
22
26
  }
@@ -19,9 +19,11 @@ import nb from './nb.json';
19
19
  import zh from './zh-CN.json';
20
20
  import ko from './ko.json';
21
21
  import sv from './sv.json';
22
+ import ro from './ro.json';
22
23
  import ru from './ru.json';
23
24
  import vi from './vi.json';
24
25
  import uk from './uk.json';
26
+ import hi from './hi.json';
25
27
 
26
28
  const { parse } = builtinI18nSchema();
27
29
 
@@ -47,8 +49,10 @@ export default Object.fromEntries(
47
49
  zh,
48
50
  ko,
49
51
  sv,
52
+ ro,
50
53
  ru,
51
54
  vi,
52
55
  uk,
56
+ hi,
53
57
  }).map(([key, dict]) => [key, parse(dict)])
54
58
  );
@@ -18,5 +18,9 @@
18
18
  "page.lastUpdated": "Ultimo aggiornamento:",
19
19
  "page.previousLink": "Indietro",
20
20
  "page.nextLink": "Avanti",
21
- "404.text": "Pagina non trovata. Verifica l'URL o prova a utilizzare la barra di ricerca."
21
+ "404.text": "Pagina non trovata. Verifica l'URL o prova a utilizzare la barra di ricerca.",
22
+ "aside.note": "Nota",
23
+ "aside.tip": "Consiglio",
24
+ "aside.caution": "Attenzione",
25
+ "aside.danger": "Pericolo"
22
26
  }
@@ -18,5 +18,9 @@
18
18
  "page.lastUpdated": "最終更新日:",
19
19
  "page.previousLink": "前へ",
20
20
  "page.nextLink": "次へ",
21
- "404.text": "ページが見つかりません。 URL を確認するか、検索バーを使用してみてください。"
21
+ "404.text": "ページが見つかりません。 URL を確認するか、検索バーを使用してみてください。",
22
+ "aside.note": "ノート",
23
+ "aside.tip": "ヒント",
24
+ "aside.caution": "注意",
25
+ "aside.danger": "危険"
22
26
  }
@@ -18,5 +18,9 @@
18
18
  "page.lastUpdated": "최종 수정:",
19
19
  "page.previousLink": "이전 페이지",
20
20
  "page.nextLink": "다음 페이지",
21
- "404.text": "페이지를 찾을 수 없습니다. URL을 확인하거나 검색창을 사용해보세요."
21
+ "404.text": "페이지를 찾을 수 없습니다. URL을 확인하거나 검색창을 사용해보세요.",
22
+ "aside.note": "노트",
23
+ "aside.tip": "팁",
24
+ "aside.caution": "주의",
25
+ "aside.danger": "위험"
22
26
  }
@@ -18,5 +18,9 @@
18
18
  "page.lastUpdated": "Sist oppdatert:",
19
19
  "page.previousLink": "Forrige",
20
20
  "page.nextLink": "Neste",
21
- "404.text": "Siden ble ikke funnet. Sjekk URL-en eller prøv å bruke søkefeltet."
21
+ "404.text": "Siden ble ikke funnet. Sjekk URL-en eller prøv å bruke søkefeltet.",
22
+ "aside.note": "Note",
23
+ "aside.tip": "Tip",
24
+ "aside.caution": "Caution",
25
+ "aside.danger": "Danger"
22
26
  }
@@ -18,5 +18,9 @@
18
18
  "page.lastUpdated": "Laatst bewerkt:",
19
19
  "page.previousLink": "Vorige",
20
20
  "page.nextLink": "Volgende",
21
- "404.text": "Pagina niet gevonden. Controleer de URL of probeer de zoekbalk."
21
+ "404.text": "Pagina niet gevonden. Controleer de URL of probeer de zoekbalk.",
22
+ "aside.note": "Note",
23
+ "aside.tip": "Tip",
24
+ "aside.caution": "Caution",
25
+ "aside.danger": "Danger"
22
26
  }
@@ -18,5 +18,9 @@
18
18
  "page.lastUpdated": "Última atualização:",
19
19
  "page.previousLink": "Anterior",
20
20
  "page.nextLink": "Próximo",
21
- "404.text": "Página não encontrada. Verifique o URL ou tente usar a barra de pesquisa."
21
+ "404.text": "Página não encontrada. Verifique o URL ou tente usar a barra de pesquisa.",
22
+ "aside.note": "Nota",
23
+ "aside.tip": "Dica",
24
+ "aside.caution": "Cuidado",
25
+ "aside.danger": "Perigo"
22
26
  }
@@ -0,0 +1,26 @@
1
+ {
2
+ "skipLink.label": "Sari la conținut",
3
+ "search.label": "Caută",
4
+ "search.shortcutLabel": "(Apasă pe / ca să cauți)",
5
+ "search.cancelLabel": "Anulează",
6
+ "search.devWarning": "Căutarea este disponibilă numai în versiunea de producție. \nÎncercă să construiești și să previzualizezi site-ul pentru a-l testa local.",
7
+ "themeSelect.accessibleLabel": "Selectează tema",
8
+ "themeSelect.dark": "Întunecată",
9
+ "themeSelect.light": "Deschisă",
10
+ "themeSelect.auto": "Auto",
11
+ "languageSelect.accessibleLabel": "Selectează limba",
12
+ "menuButton.accessibleLabel": "Meniu",
13
+ "sidebarNav.accessibleLabel": "Principal",
14
+ "tableOfContents.onThisPage": "Pe această pagină",
15
+ "tableOfContents.overview": "Sinopsis",
16
+ "i18n.untranslatedContent": "Acest conținut nu este încă disponibil în limba selectată.",
17
+ "page.editLink": "Editează pagina",
18
+ "page.lastUpdated": "Ultima actualizare:",
19
+ "page.previousLink": "Pagina precendentă",
20
+ "page.nextLink": "Pagina următoare",
21
+ "404.text": "Pagina nu a fost găsită. Verifică adresa URL sau încercă să folosești bara de căutare.",
22
+ "aside.note": "Mențiune",
23
+ "aside.tip": "Sfat",
24
+ "aside.caution": "Atenție",
25
+ "aside.danger": "Pericol"
26
+ }
@@ -18,5 +18,9 @@
18
18
  "page.lastUpdated": "Последнее обновление:",
19
19
  "page.previousLink": "Предыдущая",
20
20
  "page.nextLink": "Следующая",
21
- "404.text": "Страница не найдена. Проверьтье URL или используйте поиск по сайту"
21
+ "404.text": "Страница не найдена. Проверьтье URL или используйте поиск по сайту",
22
+ "aside.note": "Заметка",
23
+ "aside.tip": "Знали ли вы?",
24
+ "aside.caution": "Осторожно",
25
+ "aside.danger": "Опасно"
22
26
  }
@@ -18,5 +18,9 @@
18
18
  "page.lastUpdated": "Senast uppdaterad:",
19
19
  "page.previousLink": "Föregående",
20
20
  "page.nextLink": "Nästa",
21
- "404.text": "Sidan hittades inte. Kontrollera URL:n eller testa att använda sökfältet."
21
+ "404.text": "Sidan hittades inte. Kontrollera URL:n eller testa att använda sökfältet.",
22
+ "aside.note": "Note",
23
+ "aside.tip": "Tip",
24
+ "aside.caution": "Caution",
25
+ "aside.danger": "Danger"
22
26
  }
@@ -18,5 +18,9 @@
18
18
  "page.lastUpdated": "Son güncelleme:",
19
19
  "page.previousLink": "Önceki",
20
20
  "page.nextLink": "Sonraki",
21
- "404.text": "Sayfa bulunamadı. URL'i kontrol edin ya da arama çubuğunu kullanmayı deneyin."
21
+ "404.text": "Sayfa bulunamadı. URL'i kontrol edin ya da arama çubuğunu kullanmayı deneyin.",
22
+ "aside.note": "Note",
23
+ "aside.tip": "Tip",
24
+ "aside.caution": "Caution",
25
+ "aside.danger": "Danger"
22
26
  }
@@ -18,5 +18,9 @@
18
18
  "page.lastUpdated": "Останнє оновлення:",
19
19
  "page.previousLink": "Попередня",
20
20
  "page.nextLink": "Наступна",
21
- "404.text": "Сторінку не знайдено. Перевірте URL-адресу або спробуйте скористатися рядком пошуку."
21
+ "404.text": "Сторінку не знайдено. Перевірте URL-адресу або спробуйте скористатися рядком пошуку.",
22
+ "aside.note": "Note",
23
+ "aside.tip": "Tip",
24
+ "aside.caution": "Caution",
25
+ "aside.danger": "Danger"
22
26
  }