/* * Plugins-specific i18n strings, kept separate from `_lib/i18n.ts` so * the plugin library's chrome (hub, list pages, chip rails, share * dialog) doesn't bloat the canonical Copy table every page already * loads. The catch-all (`pages/[locale]/[...path].astro`) and the * locale-prefixed detail page (`pages/[locale]/plugins/[slug]/`) * import from here. * * Locale strategy: * - English fills every key; every other locale is `Partial<...>` * and falls back to English on miss. Translations were drafted to * match the voice of the existing `_lib/i18n.ts` overrides for * each locale. Long blurbs that don't have an obvious idiomatic * translation stay in English — the catalog still reads cleanly, * and a follow-up can polish them without rebuilding the schema. * - 7 artifact-kind labels and 25 scene-subcategory labels are * translated to keep the chip rails legible at a glance. * - Share-dialog copy ports the 18-locale table from PR #2679 so * the brand keyword "open-source Claude Design alternative" stays * in English on every share (deliberate — see PR #2679). */ /* * Locale key uses `LandingLocaleCode` (short codes — `en`, `zh`, * `zh-tw`, `pt-br`, …) to match the rest of `app/pages/plugins/...`, * which derives the active locale from `localeFromPath()`. The * Cloudflare `_redirects` file maps the long-code variants * (`/zh-CN/...` → `/zh/...`) so visitors can still land here from * either URL shape. */ import type { LandingLocaleCode } from '../i18n'; const DEFAULT_LOCALE: LandingLocaleCode = 'en'; export interface PluginCategoryCopy { label: string; description: string; } export interface PluginsCopy { hubLabel: string; hubHeading: (n: number) => string; hubLead: string; tileTemplates: string; tileSkills: string; tileSystems: string; tileCraft: string; tileTemplatesBlurb: string; tileSkillsBlurb: string; tileSystemsBlurb: string; tileCraftBlurb: string; browseTemplates: string; browseSkills: string; browseSystems: string; browseCraft: string; templatesLabel: string; templatesHeading: (n: number) => string; templatesLead: string; skillsLabel: string; skillsHeading: (n: number) => string; skillsLead: string; systemsLabel: string; systemsHeading: (n: number) => string; systemsLead: string; craftLabel: string; craftHeading: (n: number) => string; craftLead: string; artifactKindLabel: string; sceneLabel: string; allChip: string; category: Record< 'prototype' | 'live-artifact' | 'deck' | 'image' | 'video' | 'hyperframes' | 'audio', PluginCategoryCopy >; subcategory: Record; // Detail page chrome detailUseCta: string; // "Use this plugin →" detailFindOnGithub: string; // "Find on GitHub →" detailHomepage: string; // "Homepage ↗" detailMode: string; detailScenario: string; detailPlatform: string; detailSurface: string; detailAuthor: string; detailManifestId: string; detailTags: string; detailPreviewCaption: string; detailClickForLivePreview: string; // "Click for live preview ↗" detailOpenInNewTab: string; // "Open in new tab ↗" (visible label) /** * Accessible-name variant of {@link detailOpenInNewTab}: same meaning, no * decorative `↗` glyph. Splitting the keys keeps screen readers from * announcing the arrow as part of the control's name while the visible * label keeps the visual cue. (Reviewer flag: `aria-label` should not * embed decorative typography.) */ detailOpenInNewTabAria: string; detailBucketLabel: Record< 'examples' | 'image-templates' | 'video-templates' | 'scenarios' | 'design-systems' | 'atoms', string >; // A11y strings used as `aria-label` / `alt` / `