void chooseWorkspace()}>
@@ -436,7 +436,7 @@ export function RepairAgentDock() {
onChange={(event) => setReport(event.target.value)}
placeholder={t('repairAgent.placeholder')}
aria-label={t('repairAgent.placeholder')}
- className="min-h-24 max-h-36 shrink-0 resize-y rounded-md border border-sidebar-border bg-sidebar-control-surface px-3 py-2 text-sm outline-none placeholder:text-muted-foreground focus-visible:ring-2 focus-visible:ring-ring"
+ className="min-h-16 max-h-24 shrink-0 resize-y rounded-md border border-sidebar-border bg-sidebar-control-surface px-3 py-1.5 text-sm outline-none placeholder:text-muted-foreground focus-visible:ring-2 focus-visible:ring-ring"
/>
diff --git a/electron/src/renderer/src/components/app-shell/sponsor-footer.css b/electron/src/renderer/src/components/app-shell/sponsor-footer.css
new file mode 100644
index 00000000..ddede592
--- /dev/null
+++ b/electron/src/renderer/src/components/app-shell/sponsor-footer.css
@@ -0,0 +1,478 @@
+.sponsor-strip {
+ display: flex;
+ flex-shrink: 0;
+ align-items: center;
+ gap: 1px;
+ min-height: var(--workspace-footer-height);
+ padding: 0;
+ border-top: 1px solid var(--border);
+ background: color-mix(in srgb, var(--foreground) 2%, var(--background));
+}
+.sponsor-strip-logos {
+ display: flex;
+ align-items: center;
+ justify-content: flex-start;
+ flex: 1;
+ min-width: 0;
+ gap: 1px;
+ overflow-x: auto;
+ scrollbar-width: none;
+ padding: 0;
+}
+.sponsor-strip-logos::-webkit-scrollbar { display: none; }
+.sponsor-logo-tile,
+.sponsor-book-tile {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex: 0 0 auto;
+ gap: 12px;
+ height: calc(var(--workspace-footer-height) - 1px);
+ min-height: calc(var(--workspace-footer-height) - 1px);
+ padding: 6px 12px;
+ border: 1px solid color-mix(in srgb, var(--foreground) 14%, transparent);
+ border-radius: 0;
+ background: var(--background);
+ color: var(--foreground);
+ cursor: pointer;
+}
+.sponsor-logo-preview {
+ width: min(100%, 210px);
+ background: linear-gradient(
+ 110deg,
+ color-mix(in srgb, var(--primary) 5%, var(--background)),
+ var(--background)
+ );
+}
+.sponsor-logo-preview > span:first-child {
+ border-radius: 3px;
+ width: 30px;
+ height: 30px;
+ background: transparent;
+ color: var(--muted-foreground);
+}
+.sponsor-logo-preview > span:first-child svg {
+ width: 25px;
+ height: 25px;
+ stroke-width: 1.3;
+}
+.sponsor-logo-preview > svg:last-child {
+ margin-left: auto;
+ opacity: 0.5;
+}
+.sponsor-logo-copy {
+ display: grid;
+ gap: 3px;
+ text-align: left;
+ font-size: 13px;
+ font-weight: 550;
+ letter-spacing: -0.015em;
+}
+.sponsor-logo-copy small {
+ font-size: 10px;
+ font-weight: 400;
+ letter-spacing: 0.035em;
+ color: var(--muted-foreground);
+}
+.sponsor-book-tile {
+ width: 190px;
+ min-width: 190px;
+ border: 1px dashed color-mix(in srgb, var(--primary) 48%, var(--border));
+ background: transparent;
+ color: var(--muted-foreground);
+ font-size: 12px;
+}
+.sponsor-book-tile--combined {
+ display: grid;
+ grid-template-columns: 28px minmax(0, 1fr) 15px;
+ justify-content: initial;
+ gap: 8px;
+ text-align: center;
+}
+.sponsor-book-mark {
+ position: relative;
+ overflow: visible;
+ display: grid;
+ place-items: center;
+ width: 28px;
+ height: 28px;
+ flex: 0 0 28px;
+ border: 0;
+ border-radius: 0;
+ background: transparent;
+ color: var(--primary);
+ filter: drop-shadow(0 3px 6px color-mix(in srgb, var(--primary) 25%, transparent));
+ transition: transform 180ms ease, border-color 180ms ease, box-shadow 180ms ease;
+}
+.sponsor-book-mark::after {
+ position: absolute;
+ inset: -65% -35%;
+ content: '';
+ background: linear-gradient(110deg, transparent 35%, rgb(255 255 255 / 24%), transparent 65%);
+ opacity: 0;
+ transform: translateX(-70%);
+}
+.sponsor-book-mark svg {
+ position: relative;
+ z-index: 1;
+ width: 28px;
+ height: 28px;
+ fill: color-mix(in srgb, var(--primary) 28%, var(--sidebar));
+ stroke-width: 1.4;
+ transition: transform 180ms ease;
+}
+.sponsor-book-question {
+ position: absolute;
+ z-index: 2;
+ top: 50%;
+ left: 50%;
+ width: auto;
+ color: var(--foreground);
+ font-size: 15px;
+ font-weight: 800;
+ line-height: 1;
+ transform: translate(-50%, -50%);
+ text-align: center;
+ text-shadow: 0 1px 4px color-mix(in srgb, var(--background) 65%, transparent);
+ transition: transform 180ms ease;
+}
+.sponsor-book-tile:hover .sponsor-book-mark {
+ transform: translateY(-1px) rotate(-4deg) scale(1.04);
+ filter: drop-shadow(0 5px 8px color-mix(in srgb, var(--primary) 40%, transparent));
+}
+.sponsor-book-tile:hover .sponsor-book-mark::after {
+ opacity: 1;
+ animation: sponsor-mark-sheen 700ms ease-out;
+}
+.sponsor-book-tile:hover .sponsor-book-mark svg {
+ transform: scale(1.08) rotate(7deg);
+}
+.sponsor-book-tile:hover .sponsor-book-question {
+ transform: translate(-50%, -50%) scale(1.12) rotate(7deg);
+}
+@keyframes sponsor-mark-sheen {
+ from { transform: translateX(-70%); }
+ to { transform: translateX(70%); }
+}
+@media (prefers-reduced-motion: reduce) {
+ .sponsor-book-mark,
+ .sponsor-book-mark svg,
+ .sponsor-book-question { transition: none; }
+ .sponsor-book-tile:hover .sponsor-book-mark::after { animation: none; }
+}
+.sponsor-book-copy {
+ display: grid;
+ gap: 1px;
+ min-width: 0;
+ text-align: center;
+}
+.sponsor-book-copy strong {
+ white-space: nowrap;
+ font-size: 13px;
+ font-weight: 650;
+ letter-spacing: -0.01em;
+ line-height: 1.1;
+ color: var(--foreground);
+}
+.sponsor-book-copy small {
+ white-space: nowrap;
+ font-size: 11px;
+ font-weight: 500;
+ line-height: 1.1;
+ color: color-mix(in srgb, var(--foreground) 72%, var(--muted-foreground));
+}
+.sponsor-book-plus {
+ width: 15px;
+ height: 15px;
+ margin-left: 0;
+ color: var(--primary);
+}
+.sponsor-book-tooltip {
+ border: 1px solid color-mix(in srgb, var(--primary) 34%, var(--border));
+ border-radius: 12px;
+ background:
+ radial-gradient(circle at 8% 0%, color-mix(in srgb, var(--primary) 20%, transparent), transparent 48%),
+ var(--popover);
+ box-shadow:
+ 0 18px 42px rgb(0 0 0 / 34%),
+ inset 0 1px 0 rgb(255 255 255 / 9%);
+ backdrop-filter: blur(18px);
+}
+.sponsor-book-tooltip-eyebrow {
+ display: flex;
+ align-items: center;
+ gap: 5px;
+ color: var(--primary);
+ font-size: 10px;
+ font-weight: 650;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+}
+.sponsor-book-tooltip-eyebrow svg {
+ width: 14px;
+ height: 14px;
+ fill: color-mix(in srgb, var(--primary) 22%, var(--popover));
+ stroke-width: 1.5;
+}
+.sponsor-book-tooltip-title {
+ color: var(--foreground);
+ font-size: 14px;
+ font-weight: 650;
+ letter-spacing: -0.015em;
+ line-height: 1.25;
+}
+.sponsor-book-tooltip-lead,
+.sponsor-book-tooltip-detail {
+ color: var(--muted-foreground);
+ font-size: 11px;
+ line-height: 1.45;
+}
+.sponsor-book-tooltip-detail + .sponsor-book-tooltip-detail {
+ padding-top: 6px;
+ border-top: 1px solid color-mix(in srgb, var(--border) 70%, transparent);
+}
+.sponsor-book-tooltip-cta {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 8px;
+ margin-top: 2px;
+ padding: 7px 9px;
+ border-radius: 7px;
+ background: color-mix(in srgb, var(--primary) 14%, transparent);
+ color: var(--primary);
+ border: 0;
+ cursor: pointer;
+ font-family: inherit;
+ text-align: left;
+ font-size: 11px;
+ font-weight: 650;
+}
+.sponsor-book-tooltip-cta svg { width: 13px; height: 13px; }
+.sponsor-book-tooltip-cta:hover {
+ background: color-mix(in srgb, var(--primary) 22%, transparent);
+}
+.sponsor-book-tile > svg {
+ width: 18px;
+ height: 18px;
+ color: var(--primary);
+}
+.sponsor-logo-tile:focus-visible,
+.sponsor-book-tile:focus-visible {
+ outline: 2px solid var(--primary);
+ outline-offset: -3px;
+}
+@media (hover: hover) {
+ .sponsor-logo-tile:hover,
+ .sponsor-book-tile:hover {
+ border-color: var(--primary);
+ color: var(--foreground);
+ box-shadow: 0 3px 15px -10px var(--primary);
+ }
+}
+@media (prefers-reduced-motion: no-preference) {
+ .sponsor-logo-tile,
+ .sponsor-book-tile {
+ transition:
+ border-color 180ms,
+ box-shadow 180ms,
+ transform 180ms;
+ }
+ .sponsor-logo-tile:hover,
+ .sponsor-book-tile:hover {
+ background-color: var(--accent);
+ }
+}
+@container (max-width: 680px) {
+ .sponsor-strip {
+ gap: 1px;
+ padding-inline: 0;
+ }
+ .sponsor-book-tile {
+ min-width: 185px;
+ max-width: 185px;
+ padding: 8px;
+ }
+ .sponsor-logo-tile {
+ padding-inline: 10px;
+ }
+ .sponsor-strip > svg,
+ .sponsor-strip > span {
+ display: none;
+ }
+}
+.sponsor-footer-host {
+ position: relative;
+ flex-shrink: 0;
+ min-width: 0;
+}
+.sponsor-logo-tooltip {
+ border: 1px solid color-mix(in srgb, var(--primary) 22%, var(--border));
+ border-radius: 12px;
+ background: linear-gradient(
+ 145deg,
+ color-mix(in srgb, var(--primary) 14%, var(--popover)),
+ var(--popover)
+ );
+ box-shadow:
+ 0 16px 38px rgb(0 0 0 / 32%),
+ inset 0 1px 0 rgb(255 255 255 / 9%);
+ backdrop-filter: blur(18px);
+}
+.sponsor-tooltip-heading {
+ display: flex;
+ align-items: center;
+ gap: 9px;
+ width: 100%;
+ font-size: 14px;
+}
+.sponsor-tooltip-heading img {
+ width: 25px;
+ height: 25px;
+ flex: 0 0 25px;
+ border-radius: 7px;
+ object-fit: contain;
+ background: color-mix(in srgb, var(--foreground) 8%, transparent);
+ padding: 3px;
+}
+.sponsor-catalog-toggle {
+ display: grid;
+ place-items: center;
+ width: 32px;
+ height: calc(var(--workspace-footer-height) - 1px);
+ flex-shrink: 0;
+ cursor: pointer;
+ color: var(--muted-foreground);
+}
+.sponsor-catalog-toggle:hover {
+ color: var(--primary);
+ background: var(--accent);
+}
+.sponsor-catalog {
+ position: absolute;
+ bottom: 100%;
+ left: 0;
+ right: 0;
+ z-index: 30;
+ display: flex;
+ flex-direction: column;
+ gap: 18px;
+ max-height: min(60vh, 540px);
+ overflow-y: auto;
+ padding: 24px;
+ border: 1px solid var(--border);
+ border-radius: 16px 16px 0 0;
+ background: var(--background);
+ box-shadow: 0 -12px 40px -24px #0008;
+}
+.sponsor-catalog-header {
+ display: flex;
+ align-items: flex-start;
+ justify-content: space-between;
+ gap: 16px;
+}
+.sponsor-catalog h2 {
+ font-size: 20px;
+ font-weight: 600;
+ letter-spacing: -0.025em;
+}
+.sponsor-catalog-header p {
+ font-size: 13px;
+ color: var(--muted-foreground);
+ margin-top: 5px;
+}
+.sponsor-catalog-search {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 10px 12px;
+ border: 1px solid var(--border);
+ border-radius: 8px;
+ color: var(--muted-foreground);
+}
+.sponsor-catalog-search input {
+ flex: 1;
+ min-width: 0;
+ background: transparent;
+ color: var(--foreground);
+ font-size: 13px;
+ outline: none;
+}
+.sponsor-catalog-search:focus-within {
+ outline: 2px solid var(--primary);
+ outline-offset: 2px;
+}
+.sponsor-catalog-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, 220px), 1fr));
+ gap: 12px;
+}
+.sponsor-catalog-card {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+ min-height: 160px;
+ padding: 18px;
+ border: 1px solid var(--border);
+ border-radius: 12px;
+ text-align: left;
+ background: color-mix(in srgb, var(--foreground) 3%, var(--background));
+ cursor: pointer;
+}
+.sponsor-catalog-card-top {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 16px;
+ min-height: 32px;
+ color: var(--muted-foreground);
+}
+.sponsor-catalog-card img {
+ max-width: 130px;
+ height: 32px;
+ object-fit: contain;
+}
+.sponsor-catalog-card h3 {
+ font-size: 15px;
+ font-weight: 600;
+}
+.sponsor-catalog-card p {
+ overflow-wrap: anywhere;
+ color: var(--muted-foreground);
+ font-size: 12px;
+ line-height: 1.5;
+}
+.sponsor-catalog-card > span {
+ margin-top: auto;
+ color: var(--primary);
+ font-size: 12px;
+}
+.sponsor-catalog-book {
+ border-style: dashed;
+}
+.sponsor-catalog-card:hover {
+ border-color: var(--primary);
+}
+.sponsor-catalog-card:focus-visible,
+.sponsor-catalog-toggle:focus-visible {
+ outline: 2px solid var(--primary);
+ outline-offset: -3px;
+}
+@media (prefers-reduced-motion: no-preference) {
+ .sponsor-catalog {
+ animation: sponsor-catalog-in 180ms ease-out;
+ }
+ .sponsor-catalog-card {
+ transition: border-color 180ms;
+ }
+}
+@keyframes sponsor-catalog-in {
+ from {
+ opacity: 0;
+ transform: translateY(8px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
diff --git a/electron/src/renderer/src/components/app-shell/sponsor-footer.test.tsx b/electron/src/renderer/src/components/app-shell/sponsor-footer.test.tsx
new file mode 100644
index 00000000..4d5340ac
--- /dev/null
+++ b/electron/src/renderer/src/components/app-shell/sponsor-footer.test.tsx
@@ -0,0 +1,155 @@
+import { cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react';
+import { afterEach, expect, it, vi } from 'vitest';
+import type { AnchorHTMLAttributes } from 'react';
+const mock = vi.hoisted(() => ({
+ examples: [] as { name: string; logoUrl: string; url: string; detailKeys: string[] }[],
+ sponsors: [] as { name: string; logoUrl: string; url: string; tier: string }[],
+ open: vi.fn().mockResolvedValue(undefined),
+ navigate: vi.fn(),
+}));
+vi.mock('../../../../../../frontend/src/config/voice-ai-directory', () => ({
+ VOICE_AI_DIRECTORY: mock.examples,
+}));
+vi.mock('../../../../../../frontend/src/config/sponsors', () => ({
+ SPONSORS: mock.sponsors,
+ SPONSOR_TIERS: ['gold'],
+}));
+vi.mock('@/components/bridge', () => ({
+ getBridge: () => ({ files: { openExternal: mock.open } }),
+}));
+vi.mock('@tanstack/react-router', () => ({
+ useNavigate: () => mock.navigate,
+ Link: ({ to, ...props }: AnchorHTMLAttributes & { to: string }) => (
+
+ ),
+}));
+vi.mock('react-i18next', () => ({
+ useTranslation: () => ({
+ t: (key: string, params?: { name?: string }) => (params?.name ? `${key} ${params.name}` : key),
+ }),
+}));
+import { SponsorFooter } from './sponsor-footer';
+afterEach(() => {
+ cleanup();
+ mock.sponsors.length = 0;
+ mock.examples.length = 0;
+ vi.clearAllMocks();
+ vi.unstubAllGlobals();
+});
+it('shows a labeled preview and opens the booking form without launching email', () => {
+ render( );
+ expect(screen.getByRole('button', { name: 'sponsorSlot.book' })).toBeVisible();
+ fireEvent.click(screen.getByRole('button', { name: 'sponsorSlot.book' }));
+ expect(screen.getByRole('dialog')).toBeVisible();
+ expect(document.querySelectorAll('img')).toHaveLength(0);
+ expect(mock.open).not.toHaveBeenCalled();
+});
+it('opens the configured sponsor only on click and shows a themed tooltip on focus', async () => {
+ mock.sponsors.push({
+ name: 'Example sponsor',
+ logoUrl: '/sponsor.svg',
+ url: 'https://example.org',
+ tier: 'gold',
+ });
+ render( );
+ const link = screen.getByRole('link', { name: 'support.sponsors_logo_aria Example sponsor' });
+ expect(link.querySelector('img')).toHaveAttribute('src', '/sponsor.svg');
+ fireEvent.focus(link);
+ await waitFor(() => expect(screen.getByText('support.sponsors_tier_gold')).toBeVisible());
+ expect(mock.open).not.toHaveBeenCalled();
+ fireEvent.click(link);
+ expect(mock.open).toHaveBeenCalledWith('https://example.org');
+ fireEvent.error(link.querySelector('img')!);
+ expect(link).toHaveTextContent('Example sponsor');
+});
+
+it('encodes the message into an email draft and copies only the partner address', async () => {
+ const writeText = vi.fn().mockResolvedValue(undefined);
+ vi.stubGlobal('navigator', { ...navigator, clipboard: { writeText } });
+ render( );
+ fireEvent.click(screen.getByRole('button', { name: 'sponsorSlot.book' }));
+ fireEvent.click(screen.getByRole('tab', { name: 'sponsorSlot.email' }));
+ const body = 'Studio & Co\nhttps://example.org/?a=1&b=2\nA logo + a link — hello!';
+ fireEvent.change(screen.getByRole('textbox', { name: 'sponsorSlot.message' }), {
+ target: { value: body },
+ });
+ fireEvent.click(screen.getByRole('button', { name: 'sponsorSlot.copy_email' }));
+ await waitFor(() => expect(writeText).toHaveBeenCalledWith('partner@voicestudio.sh'));
+ expect(mock.open).not.toHaveBeenCalled();
+ fireEvent.click(screen.getAllByRole('button', { name: 'sponsorSlot.email_app' }).at(-1)!);
+ await waitFor(() => expect(mock.open).toHaveBeenCalledOnce());
+ const url = new URL(mock.open.mock.calls[0][0]);
+ expect(url.protocol).toBe('mailto:');
+ expect(url.pathname).toBe('partner@voicestudio.sh');
+ expect(url.searchParams.get('body')).toBe(body);
+ expect(screen.getByRole('textbox')).toHaveValue(body);
+});
+
+it('prefills an editable sponsor brief for the email fallback', () => {
+ render( );
+ fireEvent.click(screen.getByRole('button', { name: 'sponsorSlot.book' }));
+ fireEvent.click(screen.getByRole('tab', { name: 'sponsorSlot.email' }));
+ const value = (screen.getByRole('textbox') as HTMLTextAreaElement).value;
+ expect(value).toBe('sponsorSlot.email_template');
+});
+
+it('opens the Google Form in the browser from the form tab', () => {
+ render( );
+ fireEvent.click(screen.getByRole('button', { name: 'sponsorSlot.book' }));
+ fireEvent.click(screen.getByRole('button', { name: 'network.open_in_browser' }));
+ expect(mock.open).toHaveBeenCalledWith('https://forms.gle/2PYCvd39hbwijzX37');
+});
+
+it('opens the booking modal from the tooltip call to action', async () => {
+ render( );
+ const trigger = screen.getByRole('button', { name: 'sponsorSlot.book' });
+ fireEvent.focus(trigger);
+ const cta = await screen.findByRole('button', { name: 'sponsorSlot.footer_book' });
+ fireEvent.click(cta);
+ expect(screen.getByRole('dialog')).toBeVisible();
+});
+
+it('keeps the message available if the email app cannot open', async () => {
+ mock.open.mockRejectedValueOnce(new Error('no handler'));
+ render( );
+ fireEvent.click(screen.getByRole('button', { name: 'sponsorSlot.book' }));
+ fireEvent.click(screen.getByRole('tab', { name: 'sponsorSlot.email' }));
+ fireEvent.change(screen.getByRole('textbox'), { target: { value: 'My proposal' } });
+ fireEvent.click(screen.getByRole('button', { name: 'sponsorSlot.email_app' }));
+ await waitFor(() => expect(screen.getByRole('alert')).toHaveTextContent('common.error'));
+ expect(screen.getByRole('textbox')).toHaveValue('My proposal');
+ expect(screen.getByRole('button', { name: 'sponsorSlot.copy_email' })).toBeEnabled();
+});
+
+it('routes removal to the plan comparison while activation is unavailable', () => {
+ render( );
+ fireEvent.click(screen.getByRole('button', { name: 'supportPlans.remove' }));
+ expect(mock.navigate).toHaveBeenCalledWith({
+ to: '/settings/support',
+ search: { compare: true },
+ });
+});
+
+it('opens the full integrations workspace from the footer', () => {
+ mock.sponsors.push(
+ { name: 'Acme', logoUrl: '/acme.svg', url: 'https://acme.example', tier: 'gold' },
+ { name: 'Orbit', logoUrl: '/orbit.svg', url: 'https://orbit.example', tier: '' },
+ );
+ render( );
+ const toggle = screen.getByRole('button', { name: 'integrationCatalog.title' });
+ fireEvent.click(toggle);
+ expect(mock.navigate).toHaveBeenCalledWith({ to: '/integrations' });
+ expect(mock.open).not.toHaveBeenCalled();
+});
+
+it('labels company examples without presenting them as featured sponsors', () => {
+ mock.examples.push({
+ name: 'ElevenLabs',
+ url: 'https://elevenlabs.io',
+ logoUrl: '/elevenlabs.ico',
+ detailKeys: ['nav.clone'],
+ });
+ render( );
+ expect(screen.getByRole('link', { name: 'support.sponsors_logo_aria ElevenLabs' })).toBeVisible();
+ expect(mock.open).not.toHaveBeenCalled();
+});
diff --git a/electron/src/renderer/src/components/app-shell/sponsor-footer.tsx b/electron/src/renderer/src/components/app-shell/sponsor-footer.tsx
new file mode 100644
index 00000000..b0e0c2ef
--- /dev/null
+++ b/electron/src/renderer/src/components/app-shell/sponsor-footer.tsx
@@ -0,0 +1,331 @@
+import { VOICE_AI_DIRECTORY } from '../../../../../../frontend/src/config/voice-ai-directory';
+import './sponsor-footer.css';
+import { useNavigate } from '@tanstack/react-router';
+import { useEffect, useRef, useState } from 'react';
+import { SponsorInquiry } from './sponsor-inquiry';
+import {
+ ArrowUpRightIcon,
+ BlocksIcon,
+ SearchIcon,
+ GemIcon,
+ PlusIcon,
+ TriangleIcon,
+ XIcon,
+} from 'lucide-react';
+import { useTranslation } from 'react-i18next';
+import { getBridge } from '@/components/bridge';
+import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';
+import { SPONSORS, SPONSOR_TIERS } from '../../../../../../frontend/src/config/sponsors';
+
+const linkClass =
+ 'flex min-h-9 shrink-0 items-center gap-2 rounded-lg px-2.5 text-xs text-muted-foreground hover:bg-accent hover:text-foreground focus-visible:outline-2 focus-visible:outline-primary motion-safe:transition-colors';
+
+/** Lives in the content column, so it never covers the editor or its sidebar. */
+export function SponsorFooter() {
+ const { t } = useTranslation();
+ const navigate = useNavigate();
+ const [expanded, setExpanded] = useState(false);
+ const [query, setQuery] = useState('');
+ const toggleRef = useRef(null);
+ const logoScrollerRef = useRef(null);
+ const edgeScrollRef = useRef(0);
+ useEffect(() => {
+ const timer = window.setInterval(() => {
+ const scroller = logoScrollerRef.current;
+ if (scroller && edgeScrollRef.current) scroller.scrollLeft += edgeScrollRef.current;
+ }, 16);
+ return () => window.clearInterval(timer);
+ }, []);
+ const entries = [
+ ...SPONSORS.map((sponsor) => ({ ...sponsor, featured: true, detailKeys: [] as string[] })),
+ ...VOICE_AI_DIRECTORY.filter(
+ (example) => !SPONSORS.some((sponsor) => sponsor.url === example.url),
+ ).map((example) => ({ ...example, tier: '', featured: false })),
+ ];
+ const visibleSponsors = entries.filter((sponsor) =>
+ `${sponsor.name} ${sponsor.tier} ${sponsor.url} ${sponsor.detailKeys.map((key) => t(key)).join(' ')}`
+ .toLocaleLowerCase()
+ .includes(query.trim().toLocaleLowerCase()),
+ );
+ const collapse = () => {
+ setExpanded(false);
+ toggleRef.current?.focus();
+ };
+ const [failed, setFailed] = useState(false);
+ const [inquiryOpen, setInquiryOpen] = useState(false);
+ return (
+
+ {expanded && (
+
+ )}
+
+
+ );
+}
diff --git a/electron/src/renderer/src/components/app-shell/sponsor-inquiry.css b/electron/src/renderer/src/components/app-shell/sponsor-inquiry.css
new file mode 100644
index 00000000..6ee787dc
--- /dev/null
+++ b/electron/src/renderer/src/components/app-shell/sponsor-inquiry.css
@@ -0,0 +1,84 @@
+.sponsor-inquiry-dialog {
+ display: flex;
+ flex-direction: column;
+ min-height: 0;
+ border: 1px solid var(--sidebar-border);
+ background:
+ radial-gradient(circle at 8% 0%, color-mix(in srgb, var(--primary) 12%, transparent), transparent 34%),
+ var(--sidebar);
+ color: var(--sidebar-foreground);
+ box-shadow:
+ 0 24px 70px rgb(0 0 0 / 38%),
+ inset 0 1px 0 rgb(255 255 255 / 6%);
+}
+.sponsor-inquiry-tabs {
+ border: 1px solid var(--sidebar-border);
+ background: color-mix(in srgb, var(--sidebar-foreground) 4%, var(--sidebar));
+}
+.sponsor-inquiry-hero-icon {
+ display: grid;
+ place-items: center;
+ width: 42px;
+ height: 42px;
+ flex: 0 0 42px;
+ border: 1px solid color-mix(in srgb, var(--primary) 35%, var(--sidebar-border));
+ border-radius: 11px;
+ background: color-mix(in srgb, var(--primary) 14%, var(--sidebar));
+ color: var(--primary);
+ box-shadow: inset 0 1px 0 rgb(255 255 255 / 8%);
+}
+.sponsor-inquiry-hero-icon svg { width: 21px; height: 21px; }
+.sponsor-inquiry-perks {
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ gap: 8px 18px;
+}
+.sponsor-inquiry-perks span {
+ display: flex;
+ min-width: 0;
+ align-items: center;
+ gap: 3px;
+ color: var(--muted-foreground);
+}
+.sponsor-inquiry-perks span + span {
+ border-left: 0;
+ padding-left: 0;
+}
+.sponsor-inquiry-perks svg { width: 13px; height: 13px; flex: 0 0 auto; color: var(--primary); }
+.sponsor-inquiry-perks small { font-size: 10px; line-height: 1.2; }
+.sponsor-inquiry-tab {
+ border-radius: 8px;
+ color: var(--muted-foreground);
+}
+.sponsor-inquiry-tab[aria-selected='true'] {
+ border-color: color-mix(in srgb, var(--sidebar-border) 80%, var(--primary));
+ background: linear-gradient(180deg, color-mix(in srgb, var(--primary) 18%, var(--sidebar-accent)), var(--sidebar-accent));
+ color: var(--sidebar-foreground);
+ box-shadow:
+ inset 0 1px 0 rgb(255 255 255 / 8%),
+ 0 4px 12px rgb(0 0 0 / 12%);
+}
+.sponsor-inquiry-tab:hover {
+ color: var(--sidebar-foreground);
+}
+.sponsor-inquiry-form-link {
+ width: 32px;
+ color: var(--muted-foreground);
+}
+.sponsor-inquiry-form-link svg { width: 14px; height: 14px; }
+.sponsor-inquiry-form-link:hover {
+ color: var(--sidebar-foreground);
+ background: color-mix(in srgb, var(--primary) 10%, transparent);
+}
+.sponsor-inquiry-panel {
+ min-height: 0;
+ border-color: var(--sidebar-border);
+ background: color-mix(in srgb, var(--sidebar-foreground) 2%, var(--sidebar));
+}
+.sponsor-inquiry-panel > button[type='submit'] {
+ margin-top: auto;
+ flex: 0 0 auto;
+}
+@media (max-width: 560px) {
+ .sponsor-inquiry-perks { grid-template-columns: repeat(2, minmax(0, 1fr)); }
+}
diff --git a/electron/src/renderer/src/components/app-shell/sponsor-inquiry.tsx b/electron/src/renderer/src/components/app-shell/sponsor-inquiry.tsx
new file mode 100644
index 00000000..e04ba529
--- /dev/null
+++ b/electron/src/renderer/src/components/app-shell/sponsor-inquiry.tsx
@@ -0,0 +1,236 @@
+import { useState } from 'react';
+import {
+ BlocksIcon,
+ BookOpenIcon,
+ BadgeCheckIcon,
+ CopyIcon,
+ DownloadIcon,
+ EyeIcon,
+ ExternalLinkIcon,
+ MailIcon,
+ ShieldCheckIcon,
+ PinIcon,
+ XIcon,
+} from 'lucide-react';
+import { useTranslation } from 'react-i18next';
+import {
+ Dialog,
+ DialogContent,
+ DialogTitle,
+ DialogDescription,
+ DialogClose,
+} from '@/components/ui/dialog';
+import { Button } from '@/components/ui/button';
+import { getBridge } from '@/components/bridge';
+import './sponsor-inquiry.css';
+
+export const PARTNER_EMAIL = 'partner@voicestudio.sh';
+export const SPONSOR_FORM_URL = 'https://forms.gle/2PYCvd39hbwijzX37';
+export function sponsorMailto(subject: string, message: string) {
+ return `mailto:${PARTNER_EMAIL}?subject=${encodeURIComponent(subject)}&body=${encodeURIComponent(message)}`;
+}
+
+export function SponsorInquiry({
+ open,
+ onOpenChange,
+}: {
+ open: boolean;
+ onOpenChange: (open: boolean) => void;
+}) {
+ const { t } = useTranslation();
+ const emailTemplate = t('sponsorSlot.email_template');
+ const [message, setMessage] = useState(emailTemplate);
+ const [copied, setCopied] = useState(false);
+ const [failed, setFailed] = useState(false);
+ const [busy, setBusy] = useState(false);
+ const [mode, setMode] = useState<'form' | 'email'>('form');
+ return (
+ {
+ setCopied(false);
+ setFailed(false);
+ onOpenChange(value);
+ }}
+ >
+
+
+ }
+ >
+
+
+
+
+
+
+
+ {t('sponsorSlot.title')}
+ {t('sponsorSlot.description')}
+
+
+
+
+
+ {t('sponsorSlot.visibility')}
+
+
+
+ {t('sponsorSlot.integration')}
+
+
+
+ {t('sponsorSlot.installs')}
+
+
+
+ {t('sponsorSlot.distribution')}
+
+
+
+ {t('sponsorSlot.partner')}
+
+
+
+ {t('sponsorSlot.privacy')}
+
+
+
+ setMode('form')}
+ >
+ {t('sponsorSlot.form')}
+
+ {
+ const bridge = getBridge();
+ if (bridge) {
+ void bridge.files.openExternal(SPONSOR_FORM_URL).catch(() => setFailed(true));
+ } else {
+ window.open(SPONSOR_FORM_URL, '_blank', 'noopener,noreferrer');
+ }
+ }}
+ >
+
+
+ setMode('email')}
+ >
+ {t('sponsorSlot.email')}
+
+
+ {mode === 'form' ? (
+
+ ) : (
+
+ )}
+
+
+ );
+}
diff --git a/electron/src/renderer/src/components/app-shell/support-shortcut.tsx b/electron/src/renderer/src/components/app-shell/support-shortcut.tsx
new file mode 100644
index 00000000..bed07ab2
--- /dev/null
+++ b/electron/src/renderer/src/components/app-shell/support-shortcut.tsx
@@ -0,0 +1,28 @@
+import { Link } from '@tanstack/react-router';
+import { ArrowUpRightIcon, GemIcon } from 'lucide-react';
+import { useTranslation } from 'react-i18next';
+import { Tooltip, TooltipTrigger, TooltipContent } from '@/components/ui/tooltip';
+
+export function SupportShortcut() {
+ const { t } = useTranslation();
+ return (
+
+
+ }
+ >
+
+ {t('supportPlans.pro')}
+
+
+
+ {t('supportPlans.title')}
+
+
+ );
+}
diff --git a/electron/src/renderer/src/components/app-shell/translation-agent-dock.tsx b/electron/src/renderer/src/components/app-shell/translation-agent-dock.tsx
index c96ee19e..1ad95c85 100644
--- a/electron/src/renderer/src/components/app-shell/translation-agent-dock.tsx
+++ b/electron/src/renderer/src/components/app-shell/translation-agent-dock.tsx
@@ -32,7 +32,7 @@ export function TranslationAgentDock() {
: latest.status === 'cancelled' ? t('dubActivity.cancelled') : t('common.error');
const busy = ['translating', 'generating', 'transcribing', 'preparing'].includes(session.phase);
return
-
+
{status} · {latest.target} · {latest.agent}
diff --git a/electron/src/renderer/src/components/app-shell/workspace-header.tsx b/electron/src/renderer/src/components/app-shell/workspace-header.tsx
index 4b576dce..757d43f2 100644
--- a/electron/src/renderer/src/components/app-shell/workspace-header.tsx
+++ b/electron/src/renderer/src/components/app-shell/workspace-header.tsx
@@ -1,3 +1,4 @@
+import { SupportShortcut } from './support-shortcut';
import { SidebarToggle } from './sidebar-toggle';
import type { ReactNode } from 'react';
import { SearchIcon } from 'lucide-react';
@@ -17,17 +18,20 @@ export function WorkspaceHeader({ children }: { children: ReactNode }) {
>
{!isMac() &&
}
{children}
-
window.dispatchEvent(new Event('voicestudio:commands'))}
- >
-
- {isMac() ? '⌘K' : 'Ctrl K'}
-
+
+
+ window.dispatchEvent(new Event('voicestudio:commands'))}
+ >
+
+ {isMac() ? '⌘K' : 'Ctrl K'}
+
+
);
}
diff --git a/electron/src/renderer/src/components/app-shell/workspace-menu.tsx b/electron/src/renderer/src/components/app-shell/workspace-menu.tsx
index 5d875105..9bbc0ad3 100644
--- a/electron/src/renderer/src/components/app-shell/workspace-menu.tsx
+++ b/electron/src/renderer/src/components/app-shell/workspace-menu.tsx
@@ -12,6 +12,7 @@ import {
MicIcon,
UsersRoundIcon,
ChevronRightIcon,
+ BlocksIcon,
} from 'lucide-react';
import { useTranslation } from 'react-i18next';
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';
@@ -30,7 +31,8 @@ type Destination = readonly [
| '/dub'
| '/design'
| '/transcriptions'
- | '/personas',
+ | '/personas'
+ | '/integrations',
label: string,
icon: typeof AudioLinesIcon,
activate?: () => void,
@@ -50,6 +52,7 @@ const compactDestinations: Destination[] = [
['/audiobook', 'audiobook.title', BookOpenIcon],
['/projects', 'projects.title', FolderIcon],
['/tools', 'tools.title', WrenchIcon],
+ ['/integrations', 'integrationCatalog.title', BlocksIcon],
];
const laterDestinations: Destination[] = [
@@ -58,6 +61,7 @@ const laterDestinations: Destination[] = [
['/audiobook', 'audiobook.title', BookOpenIcon],
['/projects', 'projects.title', FolderIcon],
['/tools', 'tools.title', WrenchIcon],
+ ['/integrations', 'integrationCatalog.title', BlocksIcon],
];
const itemClass =
diff --git a/electron/src/renderer/src/components/app-shell/workspace-sidebar.tsx b/electron/src/renderer/src/components/app-shell/workspace-sidebar.tsx
index 7f1e5a02..1625fe54 100644
--- a/electron/src/renderer/src/components/app-shell/workspace-sidebar.tsx
+++ b/electron/src/renderer/src/components/app-shell/workspace-sidebar.tsx
@@ -60,8 +60,11 @@ export function WorkspaceSidebar() {
)}
-
-
+
+
+
+
+
-
)}
@@ -121,7 +123,7 @@ export function WorkspaceSidebar() {
-
+
{t('nav.settings')}
diff --git a/electron/src/renderer/src/features/clone/clone-page.tsx b/electron/src/renderer/src/features/clone/clone-page.tsx
index cfcdd375..fd61c831 100644
--- a/electron/src/renderer/src/features/clone/clone-page.tsx
+++ b/electron/src/renderer/src/features/clone/clone-page.tsx
@@ -1,3 +1,4 @@
+import { SupportShortcut } from '@/components/app-shell/support-shortcut';
import { SidebarToggle } from '@/components/app-shell/sidebar-toggle';
import { EditProfile } from './edit-profile';
import { ProfileAvatar } from '@/components/profile-avatar';
@@ -154,6 +155,7 @@ export function ClonePage() {
{t('clone.title')}
+
{
});
afterEach(() => { cleanup(); vi.restoreAllMocks(); vi.unstubAllGlobals(); });
it('keeps short segments proportional on long recordings and offers zoom', () => {
- render( );
const options = screen.getAllByRole('option');
expect(parseFloat(options[0].style.width)).toBeCloseTo(100 / 1980, 4);
diff --git a/electron/src/renderer/src/features/home/home-page.tsx b/electron/src/renderer/src/features/home/home-page.tsx
index ea8b6f33..7a807bc0 100644
--- a/electron/src/renderer/src/features/home/home-page.tsx
+++ b/electron/src/renderer/src/features/home/home-page.tsx
@@ -1,4 +1,4 @@
-import { isMac } from '@/components/bridge';
+import { getBridge, isMac } from '@/components/bridge';
import { WorkspaceHeader } from '@/components/app-shell/workspace-header';
import { ProfileAvatar } from '@/components/profile-avatar';
import { Button } from '@/components/ui/button';
@@ -53,6 +53,12 @@ export function HomePage() {
const { t } = useTranslation();
const { libraryOpen } = useWorkspace();
const navigate = useNavigate();
+ const openSite = () => {
+ const bridge = getBridge();
+ const url = 'https://voicestudio.sh/?utm_source=voicestudio&utm_medium=desktop&utm_campaign=home_banner';
+ if (bridge) void bridge.files.openExternal(url);
+ else window.open(url, '_blank', 'noopener,noreferrer');
+ };
const { data: profiles = [] } = useProfiles();
const { data: history = [] } = useHistory();
const { data: exports = [] } = useQuery({
@@ -220,6 +226,13 @@ export function HomePage() {
{t('app.name')}
{t('app.tagline')}
+
+ voicestudio.sh
+
diff --git a/electron/src/renderer/src/features/integrations/integration-detail-page.tsx b/electron/src/renderer/src/features/integrations/integration-detail-page.tsx
new file mode 100644
index 00000000..1df86938
--- /dev/null
+++ b/electron/src/renderer/src/features/integrations/integration-detail-page.tsx
@@ -0,0 +1,72 @@
+import { ArrowLeftIcon, ExternalLinkIcon, BlocksIcon } from 'lucide-react';
+import { Link, useParams } from '@tanstack/react-router';
+import { useTranslation } from 'react-i18next';
+import { WorkspaceHeader } from '@/components/app-shell/workspace-header';
+import { getBridge } from '@/components/bridge';
+import { getIntegrationBySlug } from '../../../../../../frontend/src/config/integration-catalog';
+import './integrations-page.css';
+
+const categoryLabels: Record
= {
+ comms: ['nav.dub', 'Calling & voice agents'],
+ automation: ['tools.title', 'Automation'],
+ agents: ['dub.choose_translation_agent', 'Agents'],
+ mcp: ['settings.mcp_title', 'MCP'],
+ developer: ['tools.title', 'Developer tools'],
+ data: ['engineSidebar.asr', 'AI and data'],
+ productivity: ['tools.title', 'Productivity'],
+};
+
+export function IntegrationDetailPage() {
+ const { t } = useTranslation();
+ const { slug } = useParams({ strict: false });
+ const entry = getIntegrationBySlug(slug ?? '');
+ if (!entry) {
+ return (
+
+
{t('integrationCatalog.title')}
+
+ {t('common.no_matches')}
+ {t('common.back')}
+
+
+ );
+ }
+ const [categoryKey, categoryFallback] = categoryLabels[entry.category] ?? ['tools.title', 'Integration'];
+ const openExternal = () => {
+ const bridge = getBridge();
+ if (bridge) void bridge.files.openExternal(entry.url);
+ else window.open(entry.url, '_blank', 'noopener,noreferrer');
+ };
+ return (
+
+
{entry.name}
+
+ {t('common.back')}
+
+
+
+
{t(categoryKey, { defaultValue: categoryFallback })}
+
{entry.name}
+
{t('integrationCatalog.description')}
+
+
+
+
+ {t('common.details')}
+
+ {entry.detailKeys.map((key) => {t(key)} )}
+
+ {t('directoryExamples.notice')}
+
+
+ {t('common.details')}
+ {entry.url}
+
+ {t('common.open')}
+
+
+
+
+
+ );
+}
diff --git a/electron/src/renderer/src/features/integrations/integrations-page.css b/electron/src/renderer/src/features/integrations/integrations-page.css
new file mode 100644
index 00000000..b12dd3fe
--- /dev/null
+++ b/electron/src/renderer/src/features/integrations/integrations-page.css
@@ -0,0 +1,316 @@
+.integrations-page {
+ display: flex;
+ min-height: 0;
+ height: 100%;
+ flex-direction: column;
+}
+.integrations-content {
+ width: 100%;
+ max-width: 1180px;
+ margin: 0 auto;
+ min-height: 0;
+ flex: 1;
+ overflow-y: auto;
+ padding: 34px clamp(18px, 4vw, 58px) 48px;
+}
+.integrations-hero {
+ display: flex;
+ align-items: center;
+ gap: 18px;
+ margin: 4px 0 30px;
+}
+.integrations-hero-icon {
+ display: grid;
+ place-items: center;
+ width: 58px;
+ height: 58px;
+ flex: 0 0 58px;
+ border: 1px solid color-mix(in srgb, var(--primary) 25%, var(--border));
+ border-radius: 17px;
+ background: color-mix(in srgb, var(--primary) 9%, var(--background));
+ color: var(--primary);
+}
+.integrations-hero-icon svg {
+ width: 28px;
+ height: 28px;
+ stroke-width: 1.5;
+}
+.integrations-hero h2 {
+ font-size: clamp(26px, 3vw, 38px);
+ font-weight: 650;
+ letter-spacing: -0.045em;
+ line-height: 1.1;
+}
+.integrations-hero p {
+ margin-top: 5px;
+ color: var(--muted-foreground);
+ font-size: 13px;
+}
+.integrations-featured {
+ margin-bottom: 28px;
+}
+.integrations-section-heading {
+ display: flex;
+ align-items: center;
+ gap: 9px;
+ margin-bottom: 11px;
+ color: var(--muted-foreground);
+}
+.integrations-section-heading h3 {
+ display: flex;
+ align-items: center;
+ gap: 7px;
+ font-size: 13px;
+ font-weight: 600;
+}
+.integrations-section-heading h3 svg {
+ width: 15px;
+ height: 15px;
+ color: var(--primary);
+}
+.integrations-section-heading > span {
+ display: grid;
+ place-items: center;
+ min-width: 21px;
+ height: 21px;
+ padding: 0 6px;
+ border-radius: 99px;
+ background: color-mix(in srgb, var(--primary) 10%, transparent);
+ color: var(--primary);
+ font-size: 11px;
+}
+.integrations-featured-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(190px, 1fr));
+ gap: 8px;
+}
+.integration-featured-card,
+.integration-card {
+ cursor: pointer;
+ border: 1px solid var(--border);
+ background: color-mix(in srgb, var(--foreground) 2.5%, var(--background));
+ color: var(--foreground);
+ text-align: left;
+}
+.integration-featured-card {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ min-height: 56px;
+ padding: 10px 12px;
+ border-radius: 10px;
+}
+.integration-featured-card img {
+ width: 27px;
+ height: 27px;
+ object-fit: contain;
+}
+.integration-featured-card strong {
+ min-width: 0;
+ flex: 1;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ font-size: 13px;
+}
+.integration-featured-card span {
+ border-radius: 99px;
+ background: color-mix(in srgb, var(--primary) 10%, transparent);
+ padding: 3px 6px;
+ color: var(--primary);
+ font-size: 9px;
+}
+.integration-featured-card > svg,
+.integration-card-top > svg {
+ width: 13px;
+ height: 13px;
+ flex: 0 0 auto;
+ color: var(--muted-foreground);
+}
+.integrations-toolbar {
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 12px;
+ padding: 14px 0;
+ border-top: 1px solid var(--border);
+ border-bottom: 1px solid var(--border);
+}
+.integrations-search {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ min-width: 220px;
+ flex: 1;
+ color: var(--muted-foreground);
+}
+.integrations-search svg {
+ width: 16px;
+ height: 16px;
+}
+.integrations-search input {
+ height: 36px;
+ border-radius: 9px;
+}
+.integrations-filters {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 4px;
+}
+.integrations-filters button {
+ min-height: 34px;
+ padding: 6px 10px;
+ border: 1px solid transparent;
+ border-radius: 8px;
+ color: var(--muted-foreground);
+ font-size: 11px;
+ cursor: pointer;
+}
+.integrations-filters button[aria-pressed='true'] {
+ border-color: color-mix(in srgb, var(--primary) 35%, var(--border));
+ background: color-mix(in srgb, var(--primary) 10%, var(--background));
+ color: var(--primary);
+}
+.integrations-filters button:hover {
+ background: var(--accent);
+ color: var(--foreground);
+}
+.integrations-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, 245px), 1fr));
+ gap: 10px;
+ padding-top: 18px;
+}
+.integration-card {
+ display: flex;
+ min-height: 172px;
+ flex-direction: column;
+ gap: 11px;
+ padding: 16px;
+ border-radius: 13px;
+}
+.integration-card:hover,
+.integration-featured-card:hover {
+ border-color: var(--primary);
+ box-shadow: 0 8px 25px -18px var(--primary);
+}
+.integration-card:focus-visible,
+.integration-featured-card:focus-visible,
+.integrations-filters button:focus-visible {
+ outline: 2px solid var(--primary);
+ outline-offset: 2px;
+}
+.integration-card-top {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ min-height: 32px;
+}
+.integration-card-top img {
+ width: auto;
+ max-width: 125px;
+ height: 31px;
+ object-fit: contain;
+}
+.integration-card-title {
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 7px;
+}
+.integration-card-title h3 {
+ font-size: 15px;
+ font-weight: 600;
+ letter-spacing: -0.02em;
+}
+.integration-badge {
+ border: 1px solid var(--border);
+ border-radius: 99px;
+ padding: 2px 6px;
+ color: var(--muted-foreground);
+ font-size: 9px;
+}
+.integration-badge--featured {
+ border-color: color-mix(in srgb, var(--primary) 28%, transparent);
+ background: color-mix(in srgb, var(--primary) 10%, transparent);
+ color: var(--primary);
+}
+.integration-card p {
+ min-height: 34px;
+ color: var(--muted-foreground);
+ font-size: 12px;
+ line-height: 1.45;
+}
+.integration-card-url {
+ overflow: hidden;
+ margin-top: auto;
+ color: var(--muted-foreground);
+ font-size: 10px;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.integrations-empty {
+ grid-column: 1/-1;
+ padding: 30px;
+ text-align: center;
+ color: var(--muted-foreground);
+}
+.integrations-detail { max-width: 920px; }
+.integration-back-link { display: inline-flex; align-items: center; gap: 7px; margin-bottom: 26px; color: var(--muted-foreground); font-size: 12px; }
+.integration-back-link:hover { color: var(--foreground); }
+.integration-back-link svg { width: 15px; height: 15px; }
+.integration-detail-hero { display: flex; align-items: center; gap: 18px; padding: 24px; border: 1px solid var(--border); border-radius: 16px; background: color-mix(in srgb, var(--foreground) 3%, var(--background)); }
+.integration-detail-logo { display: grid; place-items: center; width: 72px; height: 72px; flex: 0 0 72px; border: 1px solid var(--border); border-radius: 16px; background: var(--background); }
+.integration-detail-logo img { width: 48px; height: 48px; object-fit: contain; }
+.integration-detail-kicker { display: flex; align-items: center; gap: 6px; color: var(--primary); font-size: 12px; }
+.integration-detail-kicker svg { width: 14px; height: 14px; }
+.integration-detail-hero h2 { margin-top: 4px; font-size: clamp(26px, 4vw, 38px); font-weight: 650; letter-spacing: -.045em; }
+.integration-detail-hero p:last-child { margin-top: 7px; color: var(--muted-foreground); font-size: 13px; }
+.integration-detail-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; margin-top: 14px; }
+.integration-detail-panel { min-height: 160px; padding: 18px; border: 1px solid var(--border); border-radius: 14px; background: color-mix(in srgb, var(--foreground) 2.5%, var(--background)); }
+.integration-detail-panel h3 { font-size: 13px; font-weight: 600; }
+.integration-capabilities { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 14px; }
+.integration-capabilities span { padding: 5px 8px; border: 1px solid color-mix(in srgb, var(--primary) 25%, var(--border)); border-radius: 7px; color: var(--primary); font-size: 11px; }
+.integration-detail-note { margin-top: 20px; color: var(--muted-foreground); font-size: 12px; line-height: 1.5; }
+.integration-detail-url { margin-top: 14px; overflow-wrap: anywhere; color: var(--muted-foreground); font-size: 12px; line-height: 1.5; }
+.integration-open-button { display: inline-flex; align-items: center; gap: 7px; margin-top: 20px; padding: 8px 12px; border: 1px solid color-mix(in srgb, var(--primary) 32%, var(--border)); border-radius: 8px; background: color-mix(in srgb, var(--primary) 10%, transparent); color: var(--primary); font-size: 12px; cursor: pointer; }
+.integration-open-button:hover { background: color-mix(in srgb, var(--primary) 16%, transparent); }
+.integration-open-button svg { width: 14px; height: 14px; }
+.integrations-detail-empty { display: grid; place-items: center; align-content: center; gap: 14px; }
+@media (prefers-reduced-motion: no-preference) {
+ .integration-card,
+ .integration-featured-card {
+ transition:
+ border-color 180ms,
+ box-shadow 180ms,
+ transform 180ms;
+ }
+ .integration-card:hover,
+ .integration-featured-card:hover {
+ transform: translateY(-1px);
+ }
+}
+@media (max-width: 600px) {
+ .integrations-content {
+ padding-inline: 16px;
+ }
+ .integrations-hero {
+ align-items: flex-start;
+ }
+ .integrations-hero-icon {
+ width: 46px;
+ height: 46px;
+ flex-basis: 46px;
+ border-radius: 13px;
+ }
+ .integrations-toolbar {
+ align-items: stretch;
+ flex-direction: column;
+ }
+ .integrations-filters {
+ overflow-x: auto;
+ flex-wrap: nowrap;
+ }
+ .integration-detail-hero { align-items: flex-start; flex-direction: column; }
+ .integration-detail-grid { grid-template-columns: 1fr; }
+}
diff --git a/electron/src/renderer/src/features/integrations/integrations-page.tsx b/electron/src/renderer/src/features/integrations/integrations-page.tsx
new file mode 100644
index 00000000..1764d120
--- /dev/null
+++ b/electron/src/renderer/src/features/integrations/integrations-page.tsx
@@ -0,0 +1,175 @@
+import { BlocksIcon, ExternalLinkIcon, SearchIcon, SparklesIcon } from 'lucide-react';
+import { useMemo, useState } from 'react';
+import { useTranslation } from 'react-i18next';
+import { useNavigate } from '@tanstack/react-router';
+import { WorkspaceHeader } from '@/components/app-shell/workspace-header';
+import { getBridge } from '@/components/bridge';
+import { Input } from '@/components/ui/input';
+import { INTEGRATION_CATALOG, integrationSlug } from '../../../../../../frontend/src/config/integration-catalog';
+import { SPONSORS } from '../../../../../../frontend/src/config/sponsors';
+import './integrations-page.css';
+
+const categories = [
+ ['comms', 'nav.dub', 'Calling & voice agents'],
+ ['automation', 'tools.title', 'Automation'],
+ ['agents', 'dub.choose_translation_agent', 'Agents'],
+ ['mcp', 'settings.mcp_title', 'MCP'],
+ ['developer', 'tools.title', 'Developer tools'],
+ ['data', 'engineSidebar.asr', 'AI and data'],
+ ['productivity', 'tools.title', 'Productivity'],
+] as const;
+
+function openExternal(url: string) {
+ const bridge = getBridge();
+ if (bridge) void bridge.files.openExternal(url);
+ else window.open(url, '_blank', 'noopener,noreferrer');
+}
+
+export function IntegrationsPage() {
+ const { t } = useTranslation();
+ const navigate = useNavigate();
+ const [query, setQuery] = useState('');
+ const [category, setCategory] = useState(null);
+ const entries = useMemo(
+ () => [
+ ...SPONSORS.map((entry) => ({
+ ...entry,
+ featured: true,
+ directory: false,
+ detailKeys: [] as string[],
+ category: null as string | null,
+ })),
+ ...INTEGRATION_CATALOG.map((entry) => ({
+ ...entry,
+ tier: '',
+ featured: false,
+ directory: true,
+ })),
+ ],
+ [],
+ );
+ const filtered = entries.filter((entry) => {
+ const haystack =
+ `${entry.name} ${entry.url} ${entry.detailKeys.join(' ')} ${entry.category ?? ''}`.toLocaleLowerCase();
+ return (
+ haystack.includes(query.trim().toLocaleLowerCase()) &&
+ (!category || entry.category === category)
+ );
+ });
+ return (
+
+
+ {t('integrationCatalog.title')}
+
+
+
+
+ {SPONSORS.length > 0 && (
+
+
+
+
+ {t('integrationCatalog.featured')}
+
+ {SPONSORS.length}
+
+
+ {SPONSORS.map((sponsor) => (
+
openExternal(sponsor.url)}
+ className="integration-featured-card"
+ >
+
+ {sponsor.name}
+ {t('integrationCatalog.featured')}
+
+
+ ))}
+
+
+ )}
+
+
+
+
+ setQuery(event.target.value)}
+ placeholder={t('common.search')}
+ aria-label={t('common.search')}
+ />
+
+
+ setCategory(null)}
+ >
+ {t('common.clear')}
+
+ {categories.map(([id, key, fallback]) => (
+ setCategory(category === id ? null : id)}
+ >
+ {t(key, { defaultValue: fallback })}
+
+ ))}
+
+
+
+
+ {filtered.map((entry) => (
+ void navigate({ to: '/integrations/$slug', params: { slug: integrationSlug(entry.name) } })}
+ className="integration-card"
+ >
+
+
+
+
+
+
{entry.name}
+
+ {t(entry.featured ? 'integrationCatalog.featured' : 'directoryExamples.example')}
+
+
+
+ {entry.directory && entry.detailKeys.length
+ ? entry.detailKeys.map((key) => t(key)).join(' · ')
+ : t('integrationCatalog.description')}
+
+ {entry.url}
+
+ ))}
+ {filtered.length === 0 && {t('common.no_matches')}
}
+
+
+
+ );
+}
diff --git a/electron/src/renderer/src/features/settings/donation-goal.tsx b/electron/src/renderer/src/features/settings/donation-goal.tsx
index 95302284..934a384a 100644
--- a/electron/src/renderer/src/features/settings/donation-goal.tsx
+++ b/electron/src/renderer/src/features/settings/donation-goal.tsx
@@ -23,10 +23,10 @@ export function DonationGoal() {
const raised = formatMoney(data.raised, data.currency);
const goal = formatMoney(data.goal, data.currency);
return (
-
+
{t('donate.goal.title')}
- {pct}%
+ {pct}%
{isGoalMet(data) ? (
t('donate.goal.met', { raised })
) : (
<>
- {raised} {t('donate.goal.of')} {goal} {t('donate.goal.per_month')}
+ {raised} {t('donate.goal.of')} {goal} {t('donate.goal.per_month')}
>
)}
- {!isGoalMet(data) && (
-
- {t('donate.goal.remaining', {
- amount: formatMoney(Math.max(0, data.goal - data.raised), data.currency),
- })}
-
- )}
{data.sponsorCount > 0 && (
-
+
{t('donate.goal.social_proof', { count: data.sponsorCount })}
)}
diff --git a/electron/src/renderer/src/features/settings/support-settings.css b/electron/src/renderer/src/features/settings/support-settings.css
new file mode 100644
index 00000000..a500ee0c
--- /dev/null
+++ b/electron/src/renderer/src/features/settings/support-settings.css
@@ -0,0 +1,368 @@
+/* Page-local editorial layout. Theme colors and local system fonts follow the app. */
+.support-studio {
+ --support-surface: color-mix(in srgb, var(--foreground) 3%, var(--background));
+ --support-line: color-mix(in srgb, var(--foreground) 10%, transparent);
+ width: 100%;
+ max-width: 1040px;
+ margin-inline: auto;
+ padding: 16px 0 24px;
+ color: var(--foreground);
+ container-type: inline-size;
+}
+.support-intro {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ text-align: center;
+ padding: 8px 20px 34px;
+}
+.support-emblem {
+ position: relative;
+ display: grid;
+ place-items: center;
+ width: 100px;
+ height: 100px;
+ margin-bottom: 22px;
+ color: var(--primary);
+}
+.support-intro h1 {
+ max-width: 100%;
+ font-size: clamp(30px, 4.6cqi, 48px);
+ font-weight: 650;
+ letter-spacing: -0.045em;
+ line-height: 1.08;
+ text-wrap: balance;
+}
+.support-intro p {
+ max-width: 470px;
+ margin-top: 14px;
+ font-size: 15px;
+ line-height: 1.6;
+ color: var(--muted-foreground);
+ text-wrap: balance;
+}
+.support-giving {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ border-radius: 24px;
+ background: var(--support-surface);
+ border: 1px solid var(--support-line);
+ overflow: hidden;
+}
+.support-progress,
+.support-checkout {
+ padding: 28px 30px;
+ min-width: 0;
+}
+.support-progress {
+ display: flex;
+ align-items: center;
+}
+.support-checkout {
+ border-left: 1px solid var(--support-line);
+}
+.support-checkout h2 {
+ font-size: 13px;
+ font-weight: 550;
+ margin-bottom: 14px;
+}
+.support-amounts {
+ display: grid;
+ grid-template-columns: repeat(4, minmax(0, 1fr));
+ gap: 7px;
+}
+.support-amounts button {
+ position: relative;
+ cursor: pointer;
+ min-height: 50px;
+ padding: 10px 6px;
+ border: 1px solid var(--support-line);
+ border-radius: 11px;
+ font-size: 15px;
+ font-weight: 550;
+ background: var(--background);
+}
+.support-amounts button[aria-pressed='true'] {
+ border-color: var(--primary);
+ color: var(--primary);
+ box-shadow: inset 0 0 0 1px var(--primary);
+ background: color-mix(in srgb, var(--primary) 7%, var(--background));
+}
+.support-selected {
+ position: absolute;
+ top: 3px;
+ right: 3px;
+ width: 10px;
+ height: 10px;
+ opacity: 0;
+}
+.support-amounts button[aria-pressed='true'] .support-selected {
+ opacity: 1;
+}
+.support-payments {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 8px;
+ margin-top: 14px;
+}
+.support-studio .support-payments a {
+ min-height: 46px;
+ border: 0;
+ border-radius: 11px;
+ background: var(--primary);
+ color: var(--primary-foreground);
+ font-size: 14px;
+ box-shadow: none;
+}
+.support-payments a svg:last-child {
+ width: 12px;
+ height: 12px;
+ opacity: 0.75;
+}
+.support-payment-note {
+ min-height: 18px;
+ margin-top: 12px;
+ text-align: center;
+ font-size: 12px;
+ color: var(--muted-foreground);
+}
+.support-community {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 4px 14px;
+ padding: 17px 0 27px;
+}
+.support-community > span {
+ font-size: 12px;
+ color: var(--muted-foreground);
+}
+.support-studio .support-community a,
+.support-studio .support-tile-actions a {
+ min-height: 44px;
+ padding: 6px 0;
+ border: 0;
+ background: transparent;
+ box-shadow: none;
+ color: var(--primary);
+ font-size: 13px;
+ white-space: normal;
+}
+.support-community a svg:last-child,
+.support-tile-actions a svg:last-child {
+ width: 12px;
+ height: 12px;
+}
+.support-opportunities {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 18px;
+}
+.support-tile {
+ display: flex;
+ flex-direction: column;
+ min-width: 0;
+ padding: 26px 28px 18px;
+ border: 1px solid var(--support-line);
+ border-radius: 22px;
+ background: var(--support-surface);
+}
+.support-tile-icon {
+ width: 27px;
+ height: 27px;
+ stroke-width: 1.5;
+ margin-bottom: 17px;
+ color: var(--muted-foreground);
+}
+.support-tile h2 {
+ font-size: 21px;
+ font-weight: 600;
+ line-height: 1.2;
+ letter-spacing: -0.025em;
+}
+.support-tile p {
+ color: var(--muted-foreground);
+ font-size: 13px;
+ line-height: 1.65;
+ margin-top: 10px;
+}
+.support-logo-slot {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ margin: 20px 0;
+ padding: 15px;
+ border: 1px dashed color-mix(in srgb, var(--foreground) 20%, transparent);
+ border-radius: 12px;
+ color: var(--muted-foreground);
+ font-size: 13px;
+}
+.support-logo-slot svg {
+ width: 23px;
+ height: 23px;
+ stroke-width: 1.25;
+}
+.support-logo-plus {
+ margin-left: auto;
+ font-size: 20px;
+}
+.support-license-mark {
+ display: flex;
+ align-items: center;
+ gap: 9px;
+ margin: 17px 0 12px;
+ color: var(--muted-foreground);
+ font-size: 12px;
+ letter-spacing: 0.06em;
+}
+.support-license-mark svg {
+ width: 18px;
+ height: 18px;
+}
+.support-license-mark svg:last-child {
+ display: none;
+}
+.support-tile-actions {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ gap: 0 18px;
+ margin-top: auto;
+}
+.support-sponsor-group {
+ padding-block: 12px;
+}
+.support-sponsor-group h3 {
+ margin-bottom: 8px;
+ font-size: 12px;
+ color: var(--muted-foreground);
+}
+.support-sponsor-group > div {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+}
+.support-sponsor-group img {
+ max-width: 80px;
+ max-height: 26px;
+ object-fit: contain;
+}
+.support-contact {
+ margin-top: 28px;
+ border-top: 1px solid var(--support-line);
+ padding-top: 18px;
+}
+.support-contact-heading {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ flex-wrap: wrap;
+ gap: 12px;
+ margin-bottom: 14px;
+}
+.support-contact h2 {
+ font-size: 14px;
+ font-weight: 550;
+}
+.support-contact-heading button {
+ min-height: 44px;
+}
+.support-channel-grid {
+ display: grid;
+ grid-template-columns: repeat(6, minmax(0, 1fr));
+ gap: 8px;
+}
+.support-studio .support-channel-grid a {
+ height: auto;
+ min-height: 86px;
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+ padding: 12px 8px;
+ border: 1px solid transparent;
+ border-radius: 14px;
+ background: transparent;
+ box-shadow: none;
+ white-space: normal;
+ text-align: center;
+ color: var(--muted-foreground);
+ font-size: 12px;
+ line-height: 1.4;
+}
+.support-channel-grid a > svg:first-child {
+ width: 21px;
+ height: 21px;
+ stroke-width: 1.5;
+ color: var(--foreground);
+}
+.support-channel-grid a > svg:last-child {
+ display: none;
+}
+.support-studio a:focus-visible,
+.support-studio button:focus-visible {
+ outline: 2px solid var(--primary);
+ outline-offset: 4px;
+}
+@media (hover: hover) {
+ .support-studio .support-channel-grid a:hover {
+ background: var(--support-surface);
+ border-color: var(--support-line);
+ color: var(--foreground);
+ }
+ .support-studio .support-community a:hover,
+ .support-studio .support-tile-actions a:hover {
+ text-decoration: underline;
+ text-underline-offset: 4px;
+ }
+ .support-amounts button:hover {
+ border-color: var(--primary);
+ }
+ .support-studio .support-payments a:hover {
+ filter: brightness(1.12);
+ }
+}
+@media (prefers-reduced-motion: no-preference) {
+ .support-studio a,
+ .support-studio button {
+ transition:
+ background-color 180ms ease,
+ color 180ms ease,
+ border-color 180ms ease,
+ transform 180ms ease;
+ }
+ .support-payments a:active,
+ .support-amounts button:active {
+ transform: scale(0.97);
+ }
+}
+@container (max-width: 660px) {
+ .support-giving,
+ .support-opportunities {
+ grid-template-columns: 1fr;
+ }
+ .support-checkout {
+ border-left: 0;
+ border-top: 1px solid var(--support-line);
+ }
+ .support-progress,
+ .support-checkout,
+ .support-tile {
+ padding: 22px;
+ }
+ .support-channel-grid {
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ }
+ .support-intro {
+ padding-inline: 0;
+ }
+}
+.support-progress > div {
+ width: 100%;
+}
+.support-emblem img {
+ display: block;
+ width: 100%;
+ height: 100%;
+ object-fit: contain;
+}
diff --git a/electron/src/renderer/src/features/settings/support-settings.test.tsx b/electron/src/renderer/src/features/settings/support-settings.test.tsx
index 8af47791..01cad883 100644
--- a/electron/src/renderer/src/features/settings/support-settings.test.tsx
+++ b/electron/src/renderer/src/features/settings/support-settings.test.tsx
@@ -1,6 +1,6 @@
import { cleanup, fireEvent, render, screen } from '@testing-library/react';
import { afterEach, expect, it, vi } from 'vitest';
-const mock = vi.hoisted(() => ({ open: vi.fn().mockResolvedValue(undefined) }));
+const mock = vi.hoisted(() => ({ open: vi.fn().mockResolvedValue(undefined), navigate: vi.fn() }));
vi.mock('@/components/bridge', () => ({
getBridge: () => ({ files: { openExternal: mock.open } }),
}));
@@ -8,6 +8,11 @@ vi.mock('react-i18next', async (importOriginal) => ({
...(await importOriginal
()),
useTranslation: () => ({ t: (key: string) => key }),
}));
+vi.mock('@tanstack/react-router', async (importOriginal) => ({
+ ...(await importOriginal()),
+ useSearch: () => ({}),
+ useNavigate: () => mock.navigate,
+}));
import { SupportSettings } from './support-settings';
vi.mock('./donation-goal', () => ({ DonationGoal: () => null }));
afterEach(() => {
@@ -36,10 +41,33 @@ it('opens only the explicit destination and applies selected amounts only to Pay
'href',
'https://github.com/debpalash/VoiceStudio/issues/new?template=sponsor.yml',
);
- const license = new URL(
- screen.getByRole('link', { name: 'enterprise.request_quote' }).getAttribute('href')!,
+ fireEvent.click(screen.getByRole('button', { name: 'supportPlans.title' }));
+ expect(mock.navigate).toHaveBeenCalledWith({
+ to: '/settings/support',
+ search: { compare: true },
+ });
+});
+
+it('keeps contact and Pro actions visible and lets the donor clear an amount', () => {
+ render( );
+ expect(screen.getByRole('button', { name: 'supportPlans.title' })).toBeVisible();
+ expect(screen.getByRole('link', { name: 'contact.security_cta' })).toBeVisible();
+ expect(screen.getByRole('button', { name: 'donate.custom' })).toHaveAttribute(
+ 'aria-pressed',
+ 'false',
);
- expect(license.protocol).toBe('mailto:');
- expect(license.searchParams.get('subject')).toBe('VoiceStudio Commercial License Inquiry');
- expect(license.searchParams.get('body')).toContain('Use case:');
+ const amount = screen.getByRole('button', { name: '$50' });
+ fireEvent.click(amount);
+ expect(amount).toHaveAttribute('aria-pressed', 'true');
+ fireEvent.click(amount);
+ expect(amount).toHaveAttribute('aria-pressed', 'false');
+ expect(screen.getByRole('link', { name: 'PayPal' })).toHaveAttribute(
+ 'href',
+ 'https://paypal.me/palashCoder',
+ );
+ fireEvent.click(screen.getByRole('button', { name: 'donate.custom' }));
+ expect(screen.getByRole('link', { name: 'PayPal' })).toHaveAttribute(
+ 'href',
+ 'https://paypal.me/palashCoder',
+ );
});
diff --git a/electron/src/renderer/src/features/settings/support-settings.tsx b/electron/src/renderer/src/features/settings/support-settings.tsx
index 2cd47a72..f9b2fc9a 100644
--- a/electron/src/renderer/src/features/settings/support-settings.tsx
+++ b/electron/src/renderer/src/features/settings/support-settings.tsx
@@ -1,23 +1,23 @@
import {
- BadgeCheckIcon,
- BugIcon,
- Building2Icon,
+ ArrowUpRightIcon,
+ CheckIcon,
CoffeeIcon,
CreditCardIcon,
+ GemIcon,
Globe2Icon,
- HeartHandshakeIcon,
LightbulbIcon,
MailIcon,
MessagesSquareIcon,
RadioIcon,
- ShieldAlertIcon,
- SparklesIcon,
- UsersRoundIcon,
+ ShieldCheckIcon,
+ StarIcon,
} from 'lucide-react';
-import { useState } from 'react';
+import { useSearch, useNavigate } from '@tanstack/react-router';
+import { useEffect, useRef, useState } from 'react';
+import { useTranslation } from 'react-i18next';
+import { brandIcon } from '@/lib/brand';
import { DonationGoal } from './donation-goal';
import { ReportBug } from '@/components/report-bug';
-import { useTranslation } from 'react-i18next';
import { ExternalLink } from '@/components/external-link';
import { KOFI_URL, PAYPAL_URL } from '../../../../../../frontend/src/utils/donateLinks';
import {
@@ -32,14 +32,21 @@ import {
EMAIL,
WEBSITE_URL,
X_URL,
- LICENSE_MAILTO,
} from '../../../../../../frontend/src/utils/contactLinks';
-import { Button } from '@/components/ui/button';
-import { SettingsSection } from './settings-layout';
+import './support-settings.css';
export function SupportSettings() {
const { t } = useTranslation();
- const [amount, setAmount] = useState(null);
+ const navigate = useNavigate();
+ const search = useSearch({ strict: false }) as { compare?: boolean };
+ const comparison = useRef(null);
+ useEffect(() => {
+ if (search.compare) {
+ comparison.current?.scrollIntoView({ block: 'start' });
+ comparison.current?.focus({ preventScroll: true });
+ }
+ }, [search.compare]);
+ const [amount, setAmount] = useState(null);
const sponsorGroups = [...SPONSOR_TIERS, '']
.map((tier) => ({
tier,
@@ -48,137 +55,204 @@ export function SupportSettings() {
),
}))
.filter((group) => group.sponsors.length);
- const enterpriseBenefits = [
- ['benefit_ip', ShieldAlertIcon],
- ['benefit_cost', BadgeCheckIcon],
- ['benefit_support', HeartHandshakeIcon],
- ] as const;
- const contactChannels = [
- ['contact.feature_title', 'contact.feature_cta', ISSUES_URL, LightbulbIcon],
- ['contact.community_title', 'contact.community_cta', DISCORD_URL, MessagesSquareIcon],
- ['contact.follow_title', 'contact.follow_cta', X_URL, RadioIcon],
- ['contact.security_title', 'contact.security_cta', SECURITY_URL, ShieldAlertIcon],
- ['contact.email_desc', 'contact.email', 'mailto:' + EMAIL, MailIcon],
- ['contact.website_desc', 'contact.website', WEBSITE_URL, Globe2Icon],
+ const channels = [
+ ['contact.feature_cta', ISSUES_URL, LightbulbIcon],
+ ['contact.community_cta', DISCORD_URL, MessagesSquareIcon],
+ ['contact.follow_cta', X_URL, RadioIcon],
+ ['contact.security_cta', SECURITY_URL, ShieldCheckIcon],
+ ['contact.email', 'mailto:' + EMAIL, MailIcon],
+ ['contact.website', WEBSITE_URL, Globe2Icon],
] as const;
+
return (
- <>
-
-
-
-
-
-
-
-
- {t('donate.hero_desc')}
-
-
+
+
+
+
+
+ {t('donate.hero_title')}
+ {t('donate.footer')}
+
+
+ {search.compare && (
+
+
+ {t('supportPlans.title')}
+
+
+
+
+
+ {t('supportPlans.sponsor_bar')}
+
+
+ {t('supportPlans.free')}
+
+
+ {t('supportPlans.pro')}
+
+
+
+
+ {[
+ ['sponsor_bar', 'visible', 'hideable'],
+ ['telemetry', 'opt_in', 'disabled'],
+ ['badge', 'standard', 'included'],
+ ['advanced', 'standard', 'included'],
+ ].map(([label, free, pro]) => (
+
+
+ {t('supportPlans.' + label)}
+
+ {t('supportPlans.' + free)}
+ {t('supportPlans.' + pro)}
+
+ ))}
+
+
+ {t('supportPlans.unavailable')}
+
+ )}
+
+
+
-
- {[10, 20, 50, null].map((value) => (
-
+
+
{t('donate.suggested_title')}
+
+ {[10, 20, 50, 'custom' as const].map((value) => (
+ setAmount(value)}
+ onClick={() => setAmount(amount === value ? null : value)}
>
- {value === null ? t('donate.custom') : '$' + value}
-
+
+ {value === 'custom' ? t('donate.custom') : '$' + value}
+
))}
-
+
-
+
Ko-fi
-
-
+
+
PayPal
+
+ {typeof amount === 'number'
+ ? t('donate.choose_method_amount', { amount })
+ : t('donate.choose_method')}
+
-
-
-
+
+
+
+ {t('support.other_ways')}
+
+
+ {t('support.star_github')}
+
+
+
+ {t('support.join_discord')}
+
+
+
+
+
+
+
+ {t(SPONSORS.length ? 'support.sponsors_lead' : 'support.sponsors_empty_title')}
{SPONSORS.length === 0 && (
- {t('support.sponsors_empty_title')}
+
+
+ {t('support.sponsors_empty_desc')}
+ +
+
)}
{sponsorGroups.map(({ tier, sponsors }) => (
-
- {tier && (
-
{t('support.sponsors_tier_' + tier)}
- )}
-
+
+ {tier &&
{t('support.sponsors_tier_' + tier)} }
+
{sponsors.map((sponsor) => (
-
+
{sponsor.name}
))}
))}
-
+
-
{t('support.sponsors_become')}
-
{t('support.sponsors_learn_more')}
-
-
-
-
-
- {t('enterprise.hero_simple')}
-
-
- {enterpriseBenefits.map(([key, Icon]) => (
-
-
- {t('enterprise.' + key)}
+
+
+
+ {t('supportPlans.pro')}
+
+ {t('supportPlans.pro')}
+
+ {[
+ ['telemetry', 'disabled'],
+ ['sponsor_bar', 'hideable'],
+ ['badge', 'included'],
+ ['advanced', 'included'],
+ ].map(([label, value]) => (
+
+
+
+ {t('supportPlans.' + label)} · {t('supportPlans.' + value)}
+
))}
-
-
- {t('enterprise.request_quote')}
-
-
-
-
-
-
-
- {t('contact.bug_title')}
-
+
{t('supportPlans.unavailable')}
+
void navigate({ to: '/settings/support', search: { compare: true } })}
+ className="mt-4 flex min-h-11 items-center gap-2 text-sm font-medium text-primary hover:underline focus-visible:outline-2 focus-visible:outline-primary"
+ >
+ {t('supportPlans.title')}
+
+
+
+
+
+
+
+
- {contactChannels.map(([title, label, href, Icon]) => (
-
-
-
- {t(title)}
-
-
{t(label)}
-
- ))}
-
- >
+
+ {channels.map(([label, href, Icon]) => (
+
+
+ {t(label)}
+
+ ))}
+
+
+
);
}
diff --git a/electron/src/renderer/src/i18n/locales/ar.json b/electron/src/renderer/src/i18n/locales/ar.json
index 7a2d7232..2b242506 100644
--- a/electron/src/renderer/src/i18n/locales/ar.json
+++ b/electron/src/renderer/src/i18n/locales/ar.json
@@ -2081,7 +2081,7 @@
"choose_method": "اختر كيفية العطاء",
"choose_method_amount": "المتابعة مع ${{amount}}",
"goal": {
- "title": "صندوق كلود ماكس",
+ "title": "ادعم تطوير VoiceStudio",
"of": "من",
"per_month": "/ شهر",
"aria": "{{raised}} من {{goal}} الهدف الشهري",
@@ -2090,7 +2090,7 @@
"social_proof": "انضم إلى مؤيدي {{count}} الذين يقومون بتمويل الذكاء الاصطناعي المحلي"
},
"postcard": {
- "title": "صندوق كلود ماكس",
+ "title": "ادعم تطوير VoiceStudio",
"lead_default": "سعيد أن عملت! VoiceStudio مجاني ومحلي بالكامل. إذا كان ذلك يوفر عليك الوقت، فستقوم شريحة شهرية صغيرة بتمويل كلود ماكس الذي يقف وراءه.",
"lead_first_clone": "لقد تم استنساخ صوتك الأول – رائع! يعمل VoiceStudio بالكامل على جهازك، ويحافظ دعمك عليه على هذا النحو.",
"lead_tenth_dub": "عشر دبلجة - من الواضح أنك تعمل على تنفيذها. شريحة شهرية صغيرة تمول كلود ماكس الذي يشحن هذه الميزات.",
@@ -2594,5 +2594,52 @@
"progress": "تم التحقق من {{done}} / {{total}} مقطع",
"cancelled": "أُلغي",
"fitting": "ضبط التوقيت"
+ },
+ "sponsorSlot": {
+ "visibility": "الظهور",
+ "integration": "تكامل المنتج",
+ "installs": "تثبيت مباشر",
+ "distribution": "توزيع للمطورين",
+ "partner": "شريك موثّق",
+ "privacy": "الخصوصية",
+ "title": "احصل على ظهور مميز في VoiceStudio",
+ "description": "زد ظهور علامتك التجارية عبر رعاية مساحة مميزة مدفوعة.",
+ "form": "نموذج Google",
+ "email": "البريد الإلكتروني",
+ "book": "احجز مكانك",
+ "preview": "معاينة الراعي",
+ "footer_brand": "علامتك التجارية",
+ "footer_book": "أضف الآن",
+ "email_template": "مرحباً فريق VoiceStudio،\n\nأرغب في الشراكة مع VoiceStudio واستكشاف ظهور مميز لعلامتي التجارية.\n\nالعلامة التجارية / المنتج:\nالموقع الإلكتروني:\nالتكامل أو الحملة:\nالجمهور / الموعد:\n\nهل يمكنكم مشاركة الباقات والأسعار وخيارات الظهور والمتطلبات التقنية؟ أفهم أن الشراكة المميزة قد تشمل صفحة توثيق وشعاراً في GitHub README ومكاناً في تذييل التطبيق ودليل Integrations.\n\nشكراً،\n[الاسم]\n[الدور / الشركة]\n[بيانات التواصل]",
+ "message": "علامتك التجارية وموقعك ورسالتك",
+ "email_app": "افتح تطبيق البريد",
+ "copy_email": "نسخ البريد الإلكتروني",
+ "preview_detail": "يمكن أن يظهر هنا شعارك ورابطك ونبذة عنك."
+ },
+ "supportPlans": {
+ "remove": "إزالة شريط الرعاة",
+ "title": "المجاني مقابل Pro",
+ "free": "مجاني",
+ "pro": "Pro",
+ "sponsor_bar": "شريط الرعاة",
+ "visible": "ظاهر",
+ "hideable": "يمكن إخفاؤه",
+ "unavailable": "لم يتم إعداد تفعيل Pro بعد.",
+ "telemetry": "بيانات الاستخدام",
+ "opt_in": "اختيارية وبموافقة مسبقة",
+ "disabled": "معطّلة",
+ "badge": "شارة Pro",
+ "advanced": "أدوات متقدمة",
+ "standard": "قياسية",
+ "included": "مضمّنة"
+ },
+ "integrationCatalog": {
+ "title": "التكاملات",
+ "featured": "مميّز",
+ "description": "اكتشف التكاملات والشركاء المميّزين."
+ },
+ "directoryExamples": {
+ "example": "مثال في الدليل",
+ "notice": "أمثلة في الدليل فقط — ليست جهات راعية أو تكاملات متصلة."
}
}
diff --git a/electron/src/renderer/src/i18n/locales/de.json b/electron/src/renderer/src/i18n/locales/de.json
index 2fb47018..68fa960c 100644
--- a/electron/src/renderer/src/i18n/locales/de.json
+++ b/electron/src/renderer/src/i18n/locales/de.json
@@ -2073,7 +2073,7 @@
"choose_method": "Wählen Sie, wie Sie geben möchten",
"choose_method_amount": "Weiter mit ${{amount}}",
"goal": {
- "title": "Fonds Claude Max",
+ "title": "Unterstütze die Entwicklung von VoiceStudio",
"of": "von",
"per_month": "/ Monat",
"aria": "{{raised}} von {{goal}} Monatsziel",
@@ -2082,7 +2082,7 @@
"social_proof": "Schließen Sie sich den Unterstützern von {{count}} an, die lokale KI finanzieren"
},
"postcard": {
- "title": "Fonds Claude Max",
+ "title": "Unterstütze die Entwicklung von VoiceStudio",
"lead_default": "Ich bin froh, dass das funktioniert hat! VoiceStudio ist kostenlos und vollständig lokal. Wenn es Ihnen Zeit spart, finanziert ein kleiner monatlicher Chip-In den dahinter stehenden Claude Max.",
"lead_first_clone": "Ihr erster Sprachklon ist fertig – schön! VoiceStudio läuft vollständig auf Ihrem Computer und Ihr Support sorgt dafür, dass dies auch so bleibt.",
"lead_tenth_dub": "Nach zehn Dubs – Sie setzen es eindeutig um. Ein kleiner monatlicher Chip-In finanziert den Claude Max, der diese Funktionen bereitstellt.",
@@ -2586,5 +2586,52 @@
"progress": "{{done}} / {{total}} Segmente geprüft",
"cancelled": "Abgebrochen",
"fitting": "Timing anpassen"
+ },
+ "sponsorSlot": {
+ "visibility": "Sichtbarkeit",
+ "integration": "Produktintegration",
+ "installs": "Direkte Installationen",
+ "distribution": "Vertrieb für Entwickler",
+ "partner": "Verifizierter Partner",
+ "privacy": "Datenschutz",
+ "title": "Auf VoiceStudio vorgestellt werden",
+ "description": "Steigern Sie die Sichtbarkeit Ihrer Marke mit einem bezahlten hervorgehobenen Platz.",
+ "form": "Google-Formular",
+ "email": "E-Mail",
+ "book": "Platz anfragen",
+ "preview": "Sponsor-Vorschau",
+ "footer_brand": "Deine Marke",
+ "footer_book": "Jetzt hinzufügen",
+ "email_template": "Hallo VoiceStudio-Team,\n\nich möchte mit VoiceStudio zusammenarbeiten und eine hervorgehobene Platzierung für meine Marke prüfen.\n\nMarke / Produkt:\nWebsite:\nIntegration oder Kampagne:\nZielgruppe / Zeitpunkt:\n\nKönnt ihr verfügbare Pakete, Preise, Platzierungsoptionen und technische Anforderungen teilen? Ich verstehe, dass eine Partnerschaft eine Dokumentationsseite, ein GitHub-README-Logo, einen Platz in der App-Fußzeile und einen Eintrag unter Integrations umfassen kann.\n\nDanke,\n[Name]\n[Rolle / Unternehmen]\n[Kontakt]",
+ "message": "Deine Marke, Website und Nachricht",
+ "email_app": "E-Mail-App öffnen",
+ "copy_email": "E-Mail-Adresse kopieren",
+ "preview_detail": "Hier könnten dein Logo, Link und eine Vorstellung stehen."
+ },
+ "supportPlans": {
+ "remove": "Sponsorenleiste entfernen",
+ "title": "Free und Pro im Vergleich",
+ "free": "Kostenlos",
+ "pro": "Pro",
+ "sponsor_bar": "Sponsorenleiste",
+ "visible": "Sichtbar",
+ "hideable": "Ausblendbar",
+ "unavailable": "Die Pro-Aktivierung ist noch nicht eingerichtet.",
+ "telemetry": "Telemetrie",
+ "opt_in": "Optional, nur mit Zustimmung",
+ "disabled": "Deaktiviert",
+ "badge": "Pro-Abzeichen",
+ "advanced": "Erweiterte Werkzeuge",
+ "standard": "Standard",
+ "included": "Enthalten"
+ },
+ "integrationCatalog": {
+ "title": "Integrationen",
+ "featured": "Hervorgehoben",
+ "description": "Entdecke Integrationen und hervorgehobene Partner."
+ },
+ "directoryExamples": {
+ "example": "Verzeichnisbeispiel",
+ "notice": "Nur Verzeichnisbeispiele — keine Sponsoren oder verbundenen Integrationen."
}
}
diff --git a/electron/src/renderer/src/i18n/locales/en.json b/electron/src/renderer/src/i18n/locales/en.json
index 5c9a08fd..1ecdb394 100644
--- a/electron/src/renderer/src/i18n/locales/en.json
+++ b/electron/src/renderer/src/i18n/locales/en.json
@@ -53,7 +53,7 @@
},
"app": {
"name": "VoiceStudio",
- "tagline": "Local voice cloning. Nothing leaves your machine.",
+ "tagline": "Open source voice cloning and workflow engine. Build local.",
"coming_soon": "Coming soon",
"version": "v{{version}}",
"switch_to_light": "Switch to light theme",
@@ -2122,7 +2122,7 @@
"choose_method": "Choose how to give",
"choose_method_amount": "Continue with ${{amount}}",
"goal": {
- "title": "Fund Claude Max",
+ "title": "Support VoiceStudio development",
"of": "of",
"per_month": "/ month",
"aria": "{{raised}} of {{goal}} monthly goal",
@@ -2131,7 +2131,7 @@
"social_proof": "Join {{count}} supporters funding local AI"
},
"postcard": {
- "title": "Fund Claude Max",
+ "title": "Support VoiceStudio development",
"lead_default": "Glad that worked! VoiceStudio is free and fully local. If it saves you time, a small monthly chip-in funds the Claude Max behind it.",
"lead_first_clone": "Your first voice clone is done — nice! VoiceStudio runs entirely on your machine, and your support keeps it that way.",
"lead_tenth_dub": "Ten dubs in — you're clearly putting it to work. A small monthly chip-in funds the Claude Max that ships these features.",
@@ -2586,5 +2586,52 @@
"progress": "{{done}} / {{total}} segments validated",
"cancelled": "Cancelled",
"fitting": "Adjusting timing"
+ },
+ "sponsorSlot": {
+ "visibility": "Visibility",
+ "integration": "Product integration",
+ "installs": "Direct installs",
+ "distribution": "Developer distribution",
+ "partner": "Verified partner",
+ "privacy": "Privacy",
+ "title": "Partner with VoiceStudio and Get Featured",
+ "description": "Drive visibility to your brand by sponsoring a paid featured slot.",
+ "form": "Google Form",
+ "email": "Email",
+ "book": "Book your slot",
+ "preview": "Get featured",
+ "footer_brand": "Your brand",
+ "footer_book": "Add now",
+ "email_template": "Hi VoiceStudio team,\n\nI'd like to partner with VoiceStudio and explore a featured placement for my brand.\n\nBrand / product:\nWebsite:\nIntegration or campaign:\nAudience / timing:\n\nCould you share available packages, pricing, placement options, and technical requirements? I understand a featured partnership can include a docs page, GitHub README logo, app footer slot, and Integrations directory placement.\n\nThanks,\n[Name]\n[Role / company]\n[Contact]",
+ "message": "Your brand, website & message",
+ "email_app": "Open email app",
+ "copy_email": "Copy email",
+ "preview_detail": "Book a slot for your sponsored brand or product integration. We’ll include a docs page, GitHub README logo, app footer slot, and Integrations."
+ },
+ "supportPlans": {
+ "remove": "Remove sponsor bar",
+ "title": "Free vs Pro",
+ "free": "Free",
+ "pro": "Pro",
+ "sponsor_bar": "Sponsor bar",
+ "visible": "Visible",
+ "hideable": "Can be hidden",
+ "unavailable": "Pro activation is not configured yet.",
+ "telemetry": "Telemetry",
+ "opt_in": "Optional, opt-in",
+ "disabled": "Disabled",
+ "badge": "Pro badge",
+ "advanced": "Advanced tools",
+ "standard": "Standard",
+ "included": "Included"
+ },
+ "integrationCatalog": {
+ "title": "Integrations",
+ "featured": "Featured",
+ "description": "Discover integrations and featured partners."
+ },
+ "directoryExamples": {
+ "example": "Directory example",
+ "notice": "Directory examples only — not sponsors or connected integrations."
}
}
diff --git a/electron/src/renderer/src/i18n/locales/es.json b/electron/src/renderer/src/i18n/locales/es.json
index a7bc0f97..478dc694 100644
--- a/electron/src/renderer/src/i18n/locales/es.json
+++ b/electron/src/renderer/src/i18n/locales/es.json
@@ -2075,7 +2075,7 @@
"choose_method": "Elige cómo regalar",
"choose_method_amount": "Continuar con ${{amount}}",
"goal": {
- "title": "Fondo Claude Max",
+ "title": "Apoya el desarrollo de VoiceStudio",
"of": "de",
"per_month": "/ mes",
"aria": "{{raised}} de {{goal}} meta mensual",
@@ -2084,7 +2084,7 @@
"social_proof": "Únase a los partidarios de {{count}} que financian la IA local"
},
"postcard": {
- "title": "Fondo Claude Max",
+ "title": "Apoya el desarrollo de VoiceStudio",
"lead_default": "¡Me alegro de que haya funcionado! VoiceStudio es gratuito y totalmente local. Si le ahorra tiempo, un pequeño aporte mensual financia el Claude Max detrás de él.",
"lead_first_clone": "Tu primer clon de voz está listo, ¡bien! VoiceStudio se ejecuta completamente en su máquina y su soporte lo mantiene así.",
"lead_tenth_dub": "Diez doblajes: claramente lo estás poniendo a funcionar. Un pequeño aporte mensual financia el Claude Max que incluye estas funciones.",
@@ -2588,5 +2588,52 @@
"progress": "{{done}} / {{total}} segmentos validados",
"cancelled": "Cancelado",
"fitting": "Ajustando tiempos"
+ },
+ "sponsorSlot": {
+ "visibility": "Visibilidad",
+ "integration": "Integración del producto",
+ "installs": "Instalaciones directas",
+ "distribution": "Distribución para desarrolladores",
+ "partner": "Socio verificado",
+ "privacy": "Privacidad",
+ "title": "Destaca en VoiceStudio",
+ "description": "Aumenta la visibilidad de tu marca patrocinando un espacio destacado de pago.",
+ "form": "Formulario de Google",
+ "email": "Correo electrónico",
+ "book": "Reserva tu espacio",
+ "preview": "Vista previa del patrocinador",
+ "footer_brand": "Tu marca",
+ "footer_book": "Añadir ahora",
+ "email_template": "Hola, equipo de VoiceStudio:\n\nMe gustaría asociarme con VoiceStudio y explorar una presencia destacada para mi marca.\n\nMarca / producto:\nSitio web:\nIntegración o campaña:\nPúblico / fechas:\n\n¿Podrían compartir los paquetes, precios, opciones de ubicación y requisitos técnicos disponibles? Entiendo que una colaboración destacada puede incluir una página de documentación, un logo en el README de GitHub, un espacio en el pie de la aplicación y presencia en el directorio de Integrations.\n\nGracias,\n[Nombre]\n[Cargo / empresa]\n[Contacto]",
+ "message": "Tu marca, sitio web y mensaje",
+ "email_app": "Abrir correo",
+ "copy_email": "Copiar correo",
+ "preview_detail": "Aquí podrían aparecer tu logo, enlace y presentación."
+ },
+ "supportPlans": {
+ "remove": "Quitar barra de patrocinadores",
+ "title": "Gratis vs Pro",
+ "free": "Gratis",
+ "pro": "Pro",
+ "sponsor_bar": "Barra de patrocinadores",
+ "visible": "Visible",
+ "hideable": "Se puede ocultar",
+ "unavailable": "La activación de Pro aún no está configurada.",
+ "telemetry": "Telemetría",
+ "opt_in": "Opcional, con consentimiento",
+ "disabled": "Desactivada",
+ "badge": "Insignia Pro",
+ "advanced": "Herramientas avanzadas",
+ "standard": "Estándar",
+ "included": "Incluidas"
+ },
+ "integrationCatalog": {
+ "title": "Integraciones",
+ "featured": "Destacado",
+ "description": "Descubre integraciones y socios destacados."
+ },
+ "directoryExamples": {
+ "example": "Ejemplo del directorio",
+ "notice": "Solo ejemplos del directorio; no son patrocinadores ni integraciones conectadas."
}
}
diff --git a/electron/src/renderer/src/i18n/locales/fr.json b/electron/src/renderer/src/i18n/locales/fr.json
index e9ccea80..c6c45c7d 100644
--- a/electron/src/renderer/src/i18n/locales/fr.json
+++ b/electron/src/renderer/src/i18n/locales/fr.json
@@ -2075,7 +2075,7 @@
"choose_method": "Choisissez comment donner",
"choose_method_amount": "Continuez avec ${{amount}}",
"goal": {
- "title": "Fonds Claude Max",
+ "title": "Soutenez le développement de VoiceStudio",
"of": "de",
"per_month": "/mois",
"aria": "{{raised}} sur {{goal}} objectif mensuel",
@@ -2084,7 +2084,7 @@
"social_proof": "Rejoignez les sympathisants de {{count}} qui financent l'IA locale"
},
"postcard": {
- "title": "Fonds Claude Max",
+ "title": "Soutenez le développement de VoiceStudio",
"lead_default": "Content que ça ait fonctionné ! VoiceStudio est gratuit et entièrement local. Si cela vous fait gagner du temps, une petite contribution mensuelle finance le Claude Max derrière.",
"lead_first_clone": "Votre premier clone de voix est terminé – super ! VoiceStudio fonctionne entièrement sur votre ordinateur et votre assistance le maintient ainsi.",
"lead_tenth_dub": "Dix doublages – vous le mettez clairement à profit. Une petite contribution mensuelle finance le Claude Max qui fournit ces fonctionnalités.",
@@ -2588,5 +2588,52 @@
"progress": "{{done}} / {{total}} segments validés",
"cancelled": "Annulé",
"fitting": "Ajustement du minutage"
+ },
+ "sponsorSlot": {
+ "visibility": "Visibilité",
+ "integration": "Intégration produit",
+ "installs": "Installations directes",
+ "distribution": "Distribution auprès des développeurs",
+ "partner": "Partenaire vérifié",
+ "privacy": "Confidentialité",
+ "title": "Soyez mis en avant sur VoiceStudio",
+ "description": "Donnez de la visibilité à votre marque en sponsorisant un emplacement vedette payant.",
+ "form": "Formulaire Google",
+ "email": "E-mail",
+ "book": "Réservez votre emplacement",
+ "preview": "Aperçu du sponsor",
+ "footer_brand": "Votre marque",
+ "footer_book": "Ajouter maintenant",
+ "email_template": "Bonjour l’équipe VoiceStudio,\n\nJ’aimerais devenir partenaire de VoiceStudio et étudier une mise en avant pour ma marque.\n\nMarque / produit :\nSite web :\nIntégration ou campagne :\nAudience / calendrier :\n\nPourriez-vous partager les offres, tarifs, emplacements et exigences techniques disponibles ? Je comprends qu’un partenariat mis en avant peut inclure une page de documentation, un logo dans le README GitHub, un emplacement dans le pied de l’application et une présence dans le répertoire Integrations.\n\nMerci,\n[Nom]\n[Rôle / entreprise]\n[Contact]",
+ "message": "Votre marque, site web et message",
+ "email_app": "Ouvrir la messagerie",
+ "copy_email": "Copier l’adresse e-mail",
+ "preview_detail": "Votre logo, lien et présentation pourraient apparaître ici."
+ },
+ "supportPlans": {
+ "remove": "Retirer la barre des sponsors",
+ "title": "Gratuit ou Pro",
+ "free": "Gratuit",
+ "pro": "Pro",
+ "sponsor_bar": "Barre des sponsors",
+ "visible": "Visible",
+ "hideable": "Peut être masquée",
+ "unavailable": "L’activation de Pro n’est pas encore configurée.",
+ "telemetry": "Télémétrie",
+ "opt_in": "Facultative, sur consentement",
+ "disabled": "Désactivée",
+ "badge": "Badge Pro",
+ "advanced": "Outils avancés",
+ "standard": "Standard",
+ "included": "Inclus"
+ },
+ "integrationCatalog": {
+ "title": "Intégrations",
+ "featured": "À la une",
+ "description": "Découvrez les intégrations et les partenaires à la une."
+ },
+ "directoryExamples": {
+ "example": "Exemple du répertoire",
+ "notice": "Exemples uniquement : ni sponsors ni intégrations connectées."
}
}
diff --git a/electron/src/renderer/src/i18n/locales/hi.json b/electron/src/renderer/src/i18n/locales/hi.json
index 1bd8444c..72def73e 100644
--- a/electron/src/renderer/src/i18n/locales/hi.json
+++ b/electron/src/renderer/src/i18n/locales/hi.json
@@ -2073,7 +2073,7 @@
"choose_method": "चुनें कि कैसे देना है",
"choose_method_amount": "${{amount}} के साथ जारी रखें",
"goal": {
- "title": "फंड क्लाउड मैक्स",
+ "title": "VoiceStudio के विकास में सहयोग करें",
"of": "का",
"per_month": "/ महीना",
"aria": "{{raised}} का {{goal}} मासिक लक्ष्य",
@@ -2082,7 +2082,7 @@
"social_proof": "स्थानीय AI को वित्तपोषित करने वाले {{count}} समर्थकों से जुड़ें"
},
"postcard": {
- "title": "फंड क्लाउड मैक्स",
+ "title": "VoiceStudio के विकास में सहयोग करें",
"lead_default": "खुशी है कि यह काम कर गया! VoiceStudio मुफ़्त और पूरी तरह से स्थानीय है। यदि यह आपका समय बचाता है, तो इसके पीछे एक छोटा सा मासिक चिप-इन क्लाउड मैक्स को फंड करता है।",
"lead_first_clone": "आपकी पहली आवाज़ का क्लोन तैयार हो गया है - बढ़िया! VoiceStudio पूरी तरह से आपकी मशीन पर चलता है, और आपका समर्थन इसे उसी तरह बनाए रखता है।",
"lead_tenth_dub": "दस डब - आप स्पष्ट रूप से इसे कार्यान्वित कर रहे हैं। एक छोटा सा मासिक चिप-इन क्लाउड मैक्स को फंड करता है जो इन सुविधाओं को शिप करता है।",
@@ -2586,5 +2586,52 @@
"progress": "{{done}} / {{total}} खंड सत्यापित",
"cancelled": "रद्द किया गया",
"fitting": "समय समायोजित हो रहा है"
+ },
+ "sponsorSlot": {
+ "visibility": "दृश्यता",
+ "integration": "उत्पाद एकीकरण",
+ "installs": "सीधे इंस्टॉल",
+ "distribution": "डेवलपर वितरण",
+ "partner": "सत्यापित पार्टनर",
+ "privacy": "गोपनीयता",
+ "title": "VoiceStudio पर फ़ीचर्ड बनें",
+ "description": "पेड फ़ीचर्ड स्लॉट को प्रायोजित करके अपने ब्रांड की दृश्यता बढ़ाएँ।",
+ "form": "Google फ़ॉर्म",
+ "email": "ईमेल",
+ "book": "अपना स्थान बुक करें",
+ "preview": "प्रायोजक पूर्वावलोकन",
+ "footer_brand": "आपका ब्रांड",
+ "footer_book": "अभी जोड़ें",
+ "email_template": "नमस्ते VoiceStudio टीम,\n\nमैं VoiceStudio के साथ साझेदारी करके अपने ब्रांड के लिए एक प्रमुख स्थान के बारे में जानना चाहता/चाहती हूँ।\n\nब्रांड / उत्पाद:\nवेबसाइट:\nइंटीग्रेशन या अभियान:\nदर्शक / समय:\n\nक्या आप उपलब्ध पैकेज, कीमत, प्लेसमेंट विकल्प और तकनीकी आवश्यकताएँ साझा कर सकते हैं? मैं समझता/समझती हूँ कि फीचर्ड पार्टनरशिप में डॉक्यूमेंटेशन पेज, GitHub README लोगो, ऐप फ़ुटर स्लॉट और Integrations डायरेक्टरी में स्थान शामिल हो सकता है।\n\nधन्यवाद,\n[नाम]\n[भूमिका / कंपनी]\n[संपर्क]",
+ "message": "आपका ब्रांड, वेबसाइट और संदेश",
+ "email_app": "ईमेल ऐप खोलें",
+ "copy_email": "ईमेल कॉपी करें",
+ "preview_detail": "आपका लोगो, लिंक और परिचय यहाँ दिख सकते हैं।"
+ },
+ "supportPlans": {
+ "remove": "प्रायोजक बार हटाएँ",
+ "title": "मुफ़्त बनाम Pro",
+ "free": "मुफ़्त",
+ "pro": "Pro",
+ "sponsor_bar": "प्रायोजक बार",
+ "visible": "दिखाई देता है",
+ "hideable": "छिपाया जा सकता है",
+ "unavailable": "Pro सक्रियण अभी कॉन्फ़िगर नहीं किया गया है।",
+ "telemetry": "टेलीमेट्री",
+ "opt_in": "वैकल्पिक, सहमति पर",
+ "disabled": "बंद",
+ "badge": "Pro बैज",
+ "advanced": "उन्नत टूल",
+ "standard": "मानक",
+ "included": "शामिल"
+ },
+ "integrationCatalog": {
+ "title": "इंटीग्रेशन",
+ "featured": "विशेष",
+ "description": "इंटीग्रेशन और विशेष साझेदारों को देखें।"
+ },
+ "directoryExamples": {
+ "example": "डायरेक्टरी उदाहरण",
+ "notice": "केवल डायरेक्टरी उदाहरण — प्रायोजक या जुड़े हुए इंटीग्रेशन नहीं।"
}
}
diff --git a/electron/src/renderer/src/i18n/locales/id.json b/electron/src/renderer/src/i18n/locales/id.json
index 732f10db..9d6c4a80 100644
--- a/electron/src/renderer/src/i18n/locales/id.json
+++ b/electron/src/renderer/src/i18n/locales/id.json
@@ -2073,7 +2073,7 @@
"choose_method": "Pilih cara memberi",
"choose_method_amount": "Lanjutkan dengan ${{amount}}",
"goal": {
- "title": "Dana Claude Max",
+ "title": "Dukung pengembangan VoiceStudio",
"of": "dari",
"per_month": "/ bulan",
"aria": "{{raised}} dari {{goal}} sasaran bulanan",
@@ -2082,7 +2082,7 @@
"social_proof": "Bergabunglah dengan pendukung {{count}} yang mendanai AI lokal"
},
"postcard": {
- "title": "Dana Claude Max",
+ "title": "Dukung pengembangan VoiceStudio",
"lead_default": "Senang itu berhasil! VoiceStudio gratis dan sepenuhnya lokal. Jika ini menghemat waktu Anda, chip-in bulanan kecil akan mendanai Claude Max di belakangnya.",
"lead_first_clone": "Klon suara pertama Anda selesai — bagus! VoiceStudio berjalan sepenuhnya di mesin Anda, dan dukungan Anda menjaganya tetap seperti itu.",
"lead_tenth_dub": "Sepuluh sulih suara - Anda jelas berhasil. Chip-in bulanan kecil mendanai Claude Max yang mengirimkan fitur-fitur ini.",
@@ -2586,5 +2586,52 @@
"progress": "{{done}} / {{total}} segmen divalidasi",
"cancelled": "Dibatalkan",
"fitting": "Menyesuaikan waktu"
+ },
+ "sponsorSlot": {
+ "visibility": "Visibilitas",
+ "integration": "Integrasi produk",
+ "installs": "Instalasi langsung",
+ "distribution": "Distribusi pengembang",
+ "partner": "Mitra terverifikasi",
+ "privacy": "Privasi",
+ "title": "Tampil di VoiceStudio",
+ "description": "Tingkatkan visibilitas merek Anda dengan mensponsori slot unggulan berbayar.",
+ "form": "Formulir Google",
+ "email": "Email",
+ "book": "Pesan slot Anda",
+ "preview": "Pratinjau sponsor",
+ "footer_brand": "Merek Anda",
+ "footer_book": "Tambahkan sekarang",
+ "email_template": "Halo tim VoiceStudio,\n\nSaya ingin bermitra dengan VoiceStudio dan mengeksplorasi penempatan unggulan untuk merek saya.\n\nMerek / produk:\nSitus web:\nIntegrasi atau kampanye:\nAudiens / waktu:\n\nBisakah Anda membagikan paket, harga, opsi penempatan, dan persyaratan teknis yang tersedia? Saya memahami bahwa kemitraan unggulan dapat mencakup halaman dokumentasi, logo di README GitHub, slot di footer aplikasi, dan penempatan di direktori Integrations.\n\nTerima kasih,\n[Nama]\n[Peran / perusahaan]\n[Kontak]",
+ "message": "Merek, situs web & pesan Anda",
+ "email_app": "Buka aplikasi email",
+ "copy_email": "Salin email",
+ "preview_detail": "Logo, tautan, dan perkenalan Anda bisa tampil di sini."
+ },
+ "supportPlans": {
+ "remove": "Hapus bilah sponsor",
+ "title": "Gratis vs Pro",
+ "free": "Gratis",
+ "pro": "Pro",
+ "sponsor_bar": "Bilah sponsor",
+ "visible": "Terlihat",
+ "hideable": "Dapat disembunyikan",
+ "unavailable": "Aktivasi Pro belum dikonfigurasi.",
+ "telemetry": "Telemetri",
+ "opt_in": "Opsional, dengan persetujuan",
+ "disabled": "Dinonaktifkan",
+ "badge": "Lencana Pro",
+ "advanced": "Alat lanjutan",
+ "standard": "Standar",
+ "included": "Termasuk"
+ },
+ "integrationCatalog": {
+ "title": "Integrasi",
+ "featured": "Unggulan",
+ "description": "Temukan integrasi dan mitra unggulan."
+ },
+ "directoryExamples": {
+ "example": "Contoh direktori",
+ "notice": "Hanya contoh direktori — bukan sponsor atau integrasi yang terhubung."
}
}
diff --git a/electron/src/renderer/src/i18n/locales/it.json b/electron/src/renderer/src/i18n/locales/it.json
index 6739bc2c..14291823 100644
--- a/electron/src/renderer/src/i18n/locales/it.json
+++ b/electron/src/renderer/src/i18n/locales/it.json
@@ -2075,7 +2075,7 @@
"choose_method": "Scegli come donare",
"choose_method_amount": "Continua con ${{amount}}",
"goal": {
- "title": "Fondo Claude Max",
+ "title": "Sostieni lo sviluppo di VoiceStudio",
"of": "di",
"per_month": "/mese",
"aria": "{{raised}} di {{goal}} obiettivo mensile",
@@ -2084,7 +2084,7 @@
"social_proof": "Unisciti ai sostenitori di {{count}} che finanziano l'intelligenza artificiale locale"
},
"postcard": {
- "title": "Fondo Claude Max",
+ "title": "Sostieni lo sviluppo di VoiceStudio",
"lead_default": "Sono contento che abbia funzionato! VoiceStudio è gratuito e completamente locale. Se ti fa risparmiare tempo, un piccolo chip-in mensile finanzia il Claude Max che sta dietro di esso.",
"lead_first_clone": "Il tuo primo clone vocale è pronto: fantastico! VoiceStudio funziona interamente sul tuo computer e il tuo supporto lo mantiene così.",
"lead_tenth_dub": "Dieci doppiaggi: lo stai chiaramente mettendo in pratica. Un piccolo chip-in mensile finanzia il Claude Max che fornisce queste funzionalità.",
@@ -2588,5 +2588,52 @@
"progress": "{{done}} / {{total}} segmenti convalidati",
"cancelled": "Annullato",
"fitting": "Regolazione dei tempi"
+ },
+ "sponsorSlot": {
+ "visibility": "Visibilità",
+ "integration": "Integrazione del prodotto",
+ "installs": "Installazioni dirette",
+ "distribution": "Distribuzione per sviluppatori",
+ "partner": "Partner verificato",
+ "privacy": "Privacy",
+ "title": "In evidenza su VoiceStudio",
+ "description": "Aumenta la visibilità del tuo brand sponsorizzando uno spazio in evidenza a pagamento.",
+ "form": "Modulo Google",
+ "email": "Email",
+ "book": "Prenota il tuo spazio",
+ "preview": "Anteprima sponsor",
+ "footer_brand": "Il tuo brand",
+ "footer_book": "Aggiungi ora",
+ "email_template": "Ciao team VoiceStudio,\n\nVorrei collaborare con VoiceStudio e valutare una presenza in evidenza per il mio brand.\n\nBrand / prodotto:\nSito web:\nIntegrazione o campagna:\nPubblico / tempistiche:\n\nPotete condividere pacchetti, prezzi, opzioni di visibilità e requisiti tecnici? Ho capito che una partnership in evidenza può includere una pagina docs, un logo nel README GitHub, uno spazio nel footer dell’app e una presenza nella directory Integrations.\n\nGrazie,\n[Nome]\n[Ruolo / azienda]\n[Contatto]",
+ "message": "Il tuo marchio, sito e messaggio",
+ "email_app": "Apri l’app email",
+ "copy_email": "Copia email",
+ "preview_detail": "Qui potrebbero apparire il tuo logo, link e presentazione."
+ },
+ "supportPlans": {
+ "remove": "Rimuovi barra sponsor",
+ "title": "Gratis o Pro",
+ "free": "Gratis",
+ "pro": "Pro",
+ "sponsor_bar": "Barra sponsor",
+ "visible": "Visibile",
+ "hideable": "Può essere nascosta",
+ "unavailable": "L’attivazione di Pro non è ancora configurata.",
+ "telemetry": "Telemetria",
+ "opt_in": "Facoltativa, con consenso",
+ "disabled": "Disattivata",
+ "badge": "Badge Pro",
+ "advanced": "Strumenti avanzati",
+ "standard": "Standard",
+ "included": "Inclusi"
+ },
+ "integrationCatalog": {
+ "title": "Integrazioni",
+ "featured": "In evidenza",
+ "description": "Scopri integrazioni e partner in evidenza."
+ },
+ "directoryExamples": {
+ "example": "Esempio di catalogo",
+ "notice": "Solo esempi di catalogo: non sponsor né integrazioni collegate."
}
}
diff --git a/electron/src/renderer/src/i18n/locales/ja.json b/electron/src/renderer/src/i18n/locales/ja.json
index 0ed0ef9d..c95f977c 100644
--- a/electron/src/renderer/src/i18n/locales/ja.json
+++ b/electron/src/renderer/src/i18n/locales/ja.json
@@ -2073,7 +2073,7 @@
"choose_method": "与え方を選ぶ",
"choose_method_amount": "${{amount}} に進む",
"goal": {
- "title": "クロード・マックス基金",
+ "title": "VoiceStudio の開発を支援",
"of": "の",
"per_month": "/月",
"aria": "月間目標 {{raised}}/{{goal}}",
@@ -2082,7 +2082,7 @@
"social_proof": "{{count}} サポーターに参加してローカル AI に資金を提供しましょう"
},
"postcard": {
- "title": "クロード・マックス基金",
+ "title": "VoiceStudio の開発を支援",
"lead_default": "うまくいってよかったです! VoiceStudio は無料で完全にローカルです。時間を節約できるのであれば、毎月少額のチップインがその背後にいるクロード・マックスに資金を提供します。",
"lead_first_clone": "最初の音声クローンが完成しました。いいですね! VoiceStudio は完全にマシン上で実行され、サポートがその状態を維持します。",
"lead_tenth_dub": "10 個のダブが入っています。明らかに効果を発揮しています。これらの機能を提供する Claude Max には、毎月少額のチップインが資金として提供されます。",
@@ -2586,5 +2586,52 @@
"progress": "{{done}} / {{total}} セグメントを検証済み",
"cancelled": "キャンセル済み",
"fitting": "タイミングを調整中"
+ },
+ "sponsorSlot": {
+ "visibility": "認知度",
+ "integration": "製品連携",
+ "installs": "直接インストール",
+ "distribution": "開発者向け配信",
+ "partner": "認証済みパートナー",
+ "privacy": "プライバシー",
+ "title": "VoiceStudioで注目を集める",
+ "description": "有料の注目枠をスポンサーして、ブランドの認知度を高めましょう。",
+ "form": "Googleフォーム",
+ "email": "メール",
+ "book": "掲載枠を申し込む",
+ "preview": "スポンサーの表示例",
+ "footer_brand": "あなたのブランド",
+ "footer_book": "今すぐ追加",
+ "email_template": "VoiceStudioチームの皆さま、\n\nVoiceStudioとのパートナーシップと、ブランドの注目掲載について相談したくご連絡しました。\n\nブランド / 製品:\nウェブサイト:\n連携またはキャンペーン:\n対象ユーザー / 時期:\n\n利用可能なプラン、料金、掲載場所、技術要件を教えていただけますか?注目パートナーには、ドキュメントページ、GitHub READMEのロゴ、アプリフッター枠、Integrationsディレクトリ掲載が含まれると理解しています。\n\nよろしくお願いします。\n[名前]\n[役職 / 会社]\n[連絡先]",
+ "message": "ブランド名・ウェブサイト・メッセージ",
+ "email_app": "メールアプリを開く",
+ "copy_email": "メールアドレスをコピー",
+ "preview_detail": "ここにロゴ、リンク、紹介文を掲載できます。"
+ },
+ "supportPlans": {
+ "remove": "スポンサー欄を非表示にする",
+ "title": "無料版とProの比較",
+ "free": "無料",
+ "pro": "Pro",
+ "sponsor_bar": "スポンサー欄",
+ "visible": "表示",
+ "hideable": "非表示にできます",
+ "unavailable": "Proの有効化はまだ設定されていません。",
+ "telemetry": "テレメトリ",
+ "opt_in": "任意・同意が必要",
+ "disabled": "無効",
+ "badge": "Proバッジ",
+ "advanced": "高度なツール",
+ "standard": "標準",
+ "included": "利用可能"
+ },
+ "integrationCatalog": {
+ "title": "連携",
+ "featured": "注目",
+ "description": "連携機能と注目のパートナーを見つけましょう。"
+ },
+ "directoryExamples": {
+ "example": "掲載例",
+ "notice": "ディレクトリの掲載例です。スポンサーや接続済みの連携ではありません。"
}
}
diff --git a/electron/src/renderer/src/i18n/locales/ko.json b/electron/src/renderer/src/i18n/locales/ko.json
index 4a498e1e..628cca2c 100644
--- a/electron/src/renderer/src/i18n/locales/ko.json
+++ b/electron/src/renderer/src/i18n/locales/ko.json
@@ -2073,7 +2073,7 @@
"choose_method": "주는 방법을 선택하세요",
"choose_method_amount": "${{amount}}로 계속",
"goal": {
- "title": "클로드 맥스 기금",
+ "title": "VoiceStudio 개발 지원",
"of": "중",
"per_month": "/월",
"aria": "{{goal}} 월 목표 중 {{raised}}",
@@ -2082,7 +2082,7 @@
"social_proof": "로컬 AI에 자금을 지원하는 {{count}}명의 후원자와 함께하세요"
},
"postcard": {
- "title": "클로드 맥스 기금",
+ "title": "VoiceStudio 개발 지원",
"lead_default": "효과가 있어서 다행이에요! VoiceStudio는 무료이며 완전히 로컬입니다. 시간을 절약할 수 있다면 매월 소액의 칩인을 통해 Claude Max에 자금을 지원할 수 있습니다.",
"lead_first_clone": "첫 번째 음성 복제가 완료되었습니다. 좋습니다! VoiceStudio는 전적으로 귀하의 컴퓨터에서 실행되며 귀하의 지원은 이를 그대로 유지합니다.",
"lead_tenth_dub": "10개의 더빙이 포함되어 있습니다. 확실히 효과를 발휘하고 계십니다. 이러한 기능을 제공하는 Claude Max에는 매월 소액의 칩인 자금이 지원됩니다.",
@@ -2586,5 +2586,52 @@
"progress": "{{done}} / {{total}}개 구간 검증됨",
"cancelled": "취소됨",
"fitting": "타이밍 조정 중"
+ },
+ "sponsorSlot": {
+ "visibility": "가시성",
+ "integration": "제품 통합",
+ "installs": "직접 설치",
+ "distribution": "개발자 배포",
+ "partner": "검증된 파트너",
+ "privacy": "개인정보 보호",
+ "title": "VoiceStudio에서 브랜드를 소개하세요",
+ "description": "유료 추천 슬롯을 후원하여 브랜드의 노출을 높이세요.",
+ "form": "Google 양식",
+ "email": "이메일",
+ "book": "스폰서 자리 신청",
+ "preview": "스폰서 미리보기",
+ "footer_brand": "내 브랜드",
+ "footer_book": "지금 추가",
+ "email_template": "VoiceStudio 팀께,\n\nVoiceStudio와 파트너십을 맺고 제 브랜드의 주요 노출을 검토하고 싶습니다.\n\n브랜드 / 제품:\n웹사이트:\n연동 또는 캠페인:\n대상 / 일정:\n\n이용 가능한 패키지, 가격, 노출 옵션과 기술 요구사항을 알려주실 수 있을까요? 추천 파트너십에는 문서 페이지, GitHub README 로고, 앱 푸터 슬롯, Integrations 디렉터리 노출이 포함되는 것으로 이해하고 있습니다.\n\n감사합니다.\n[이름]\n[직함 / 회사]\n[연락처]",
+ "message": "브랜드, 웹사이트 및 메시지",
+ "email_app": "이메일 앱 열기",
+ "copy_email": "이메일 주소 복사",
+ "preview_detail": "여기에 로고, 링크 및 소개를 표시할 수 있습니다."
+ },
+ "supportPlans": {
+ "remove": "스폰서 바 제거",
+ "title": "무료와 Pro 비교",
+ "free": "무료",
+ "pro": "Pro",
+ "sponsor_bar": "스폰서 바",
+ "visible": "표시됨",
+ "hideable": "숨길 수 있음",
+ "unavailable": "Pro 활성화가 아직 구성되지 않았습니다.",
+ "telemetry": "사용 정보 수집",
+ "opt_in": "선택 사항, 동의 필요",
+ "disabled": "비활성화",
+ "badge": "Pro 배지",
+ "advanced": "고급 도구",
+ "standard": "기본",
+ "included": "포함"
+ },
+ "integrationCatalog": {
+ "title": "연동",
+ "featured": "추천",
+ "description": "연동 기능과 추천 파트너를 살펴보세요."
+ },
+ "directoryExamples": {
+ "example": "디렉터리 예시",
+ "notice": "디렉터리 예시이며 스폰서나 연결된 연동이 아닙니다."
}
}
diff --git a/electron/src/renderer/src/i18n/locales/nl.json b/electron/src/renderer/src/i18n/locales/nl.json
index 309189b4..bb48caa8 100644
--- a/electron/src/renderer/src/i18n/locales/nl.json
+++ b/electron/src/renderer/src/i18n/locales/nl.json
@@ -2073,7 +2073,7 @@
"choose_method": "Kies hoe u wilt geven",
"choose_method_amount": "Ga verder met ${{amount}}",
"goal": {
- "title": "Fonds Claude Max",
+ "title": "Steun de ontwikkeling van VoiceStudio",
"of": "van",
"per_month": "/ maand",
"aria": "{{raised}} van {{goal}} maanddoel",
@@ -2082,7 +2082,7 @@
"social_proof": "Sluit u aan bij {{count}} supporters die lokale AI financieren"
},
"postcard": {
- "title": "Fonds Claude Max",
+ "title": "Steun de ontwikkeling van VoiceStudio",
"lead_default": "Fijn dat dat werkte! VoiceStudio is gratis en volledig lokaal. Als het u tijd bespaart, financiert een kleine maandelijkse chip-in de Claude Max erachter.",
"lead_first_clone": "Je eerste stemkloon is klaar - leuk! VoiceStudio draait volledig op uw machine, en uw ondersteuning zorgt ervoor dat dit zo blijft.",
"lead_tenth_dub": "Tien dubs erin - je zet het duidelijk aan het werk. Een kleine maandelijkse chip-in financiert de Claude Max die deze functies levert.",
@@ -2586,5 +2586,52 @@
"progress": "{{done}} / {{total}} segmenten gevalideerd",
"cancelled": "Geannuleerd",
"fitting": "Timing aanpassen"
+ },
+ "sponsorSlot": {
+ "visibility": "Zichtbaarheid",
+ "integration": "Productintegratie",
+ "installs": "Directe installaties",
+ "distribution": "Distributie voor ontwikkelaars",
+ "partner": "Geverifieerde partner",
+ "privacy": "Privacy",
+ "title": "Uitgelicht worden op VoiceStudio",
+ "description": "Vergroot de zichtbaarheid van uw merk met een betaalde uitgelichte plek.",
+ "form": "Google-formulier",
+ "email": "E-mail",
+ "book": "Reserveer je plek",
+ "preview": "Sponsorvoorbeeld",
+ "footer_brand": "Jouw merk",
+ "footer_book": "Nu toevoegen",
+ "email_template": "Hallo VoiceStudio-team,\n\nIk wil graag met VoiceStudio samenwerken en een uitgelichte plek voor mijn merk verkennen.\n\nMerk / product:\nWebsite:\nIntegratie of campagne:\nDoelgroep / timing:\n\nKunnen jullie beschikbare pakketten, prijzen, plaatsingsopties en technische vereisten delen? Ik begrijp dat een uitgelicht partnerschap een documentatiepagina, GitHub README-logo, app-footerplek en vermelding in de Integrations-directory kan bevatten.\n\nBedankt,\n[Naam]\n[Rol / bedrijf]\n[Contact]",
+ "message": "Je merk, website en bericht",
+ "email_app": "E-mailapp openen",
+ "copy_email": "E-mailadres kopiëren",
+ "preview_detail": "Hier kunnen je logo, link en introductie staan."
+ },
+ "supportPlans": {
+ "remove": "Sponsorbalk verwijderen",
+ "title": "Gratis versus Pro",
+ "free": "Gratis",
+ "pro": "Pro",
+ "sponsor_bar": "Sponsorbalk",
+ "visible": "Zichtbaar",
+ "hideable": "Kan worden verborgen",
+ "unavailable": "Pro-activering is nog niet ingesteld.",
+ "telemetry": "Telemetrie",
+ "opt_in": "Optioneel, met toestemming",
+ "disabled": "Uitgeschakeld",
+ "badge": "Pro-badge",
+ "advanced": "Geavanceerde tools",
+ "standard": "Standaard",
+ "included": "Inbegrepen"
+ },
+ "integrationCatalog": {
+ "title": "Integraties",
+ "featured": "Uitgelicht",
+ "description": "Ontdek integraties en uitgelichte partners."
+ },
+ "directoryExamples": {
+ "example": "Directoryvoorbeeld",
+ "notice": "Alleen directoryvoorbeelden — geen sponsors of verbonden integraties."
}
}
diff --git a/electron/src/renderer/src/i18n/locales/pl.json b/electron/src/renderer/src/i18n/locales/pl.json
index ad97b814..6365ea8c 100644
--- a/electron/src/renderer/src/i18n/locales/pl.json
+++ b/electron/src/renderer/src/i18n/locales/pl.json
@@ -2077,7 +2077,7 @@
"choose_method": "Wybierz sposób dawania",
"choose_method_amount": "Kontynuuj za pomocą ${{amount}}",
"goal": {
- "title": "Fundusz Claude'a Maxa",
+ "title": "Wesprzyj rozwój VoiceStudio",
"of": "z",
"per_month": "/ miesiąc",
"aria": "{{raised}} z {{goal}} celu miesięcznego",
@@ -2086,7 +2086,7 @@
"social_proof": "Dołącz do {{count}} zwolenników finansujących lokalną sztuczną inteligencję"
},
"postcard": {
- "title": "Fundusz Claude'a Maxa",
+ "title": "Wesprzyj rozwój VoiceStudio",
"lead_default": "Cieszę się, że to zadziałało! Usługa VoiceStudio jest bezpłatna i w pełni lokalna. Jeśli oszczędzi to Twój czas, niewielka miesięczna wpłata sfinansuje stojącego za nim Claude'a Maxa.",
"lead_first_clone": "Twój pierwszy klon głosu jest gotowy — świetnie! VoiceStudio działa całkowicie na Twoim komputerze, a dzięki Twojemu wsparciu tak będzie.",
"lead_tenth_dub": "Dziesięć dubów — wyraźnie to robisz. Niewielki miesięczny wkład finansuje Claude Max, który udostępnia te funkcje.",
@@ -2590,5 +2590,52 @@
"progress": "Zweryfikowano {{done}} / {{total}} segmentów",
"cancelled": "Anulowano",
"fitting": "Dostosowywanie czasu"
+ },
+ "sponsorSlot": {
+ "visibility": "Widoczność",
+ "integration": "Integracja produktu",
+ "installs": "Instalacje bezpośrednie",
+ "distribution": "Dystrybucja dla deweloperów",
+ "partner": "Zweryfikowany partner",
+ "privacy": "Prywatność",
+ "title": "Wyróżnij się w VoiceStudio",
+ "description": "Zwiększ widoczność swojej marki, sponsorując płatne wyróżnione miejsce.",
+ "form": "Formularz Google",
+ "email": "E-mail",
+ "book": "Zarezerwuj miejsce",
+ "preview": "Podgląd sponsora",
+ "footer_brand": "Twoja marka",
+ "footer_book": "Dodaj teraz",
+ "email_template": "Cześć, zespole VoiceStudio,\n\nChcę nawiązać współpracę z VoiceStudio i poznać możliwości wyróżnienia mojej marki.\n\nMarka / produkt:\nStrona internetowa:\nIntegracja lub kampania:\nOdbiorcy / termin:\n\nCzy możecie przesłać dostępne pakiety, ceny, opcje ekspozycji i wymagania techniczne? Rozumiem, że wyróżnione partnerstwo może obejmować stronę dokumentacji, logo w GitHub README, miejsce w stopce aplikacji i wpis w katalogu Integrations.\n\nDziękuję,\n[Imię]\n[Rola / firma]\n[Kontakt]",
+ "message": "Twoja marka, strona i wiadomość",
+ "email_app": "Otwórz pocztę",
+ "copy_email": "Kopiuj e-mail",
+ "preview_detail": "Tutaj mogą pojawić się Twoje logo, link i opis."
+ },
+ "supportPlans": {
+ "remove": "Usuń pasek sponsorów",
+ "title": "Darmowa a Pro",
+ "free": "Darmowa",
+ "pro": "Pro",
+ "sponsor_bar": "Pasek sponsorów",
+ "visible": "Widoczny",
+ "hideable": "Można ukryć",
+ "unavailable": "Aktywacja Pro nie została jeszcze skonfigurowana.",
+ "telemetry": "Telemetria",
+ "opt_in": "Opcjonalna, za zgodą",
+ "disabled": "Wyłączona",
+ "badge": "Odznaka Pro",
+ "advanced": "Zaawansowane narzędzia",
+ "standard": "Standardowe",
+ "included": "W zestawie"
+ },
+ "integrationCatalog": {
+ "title": "Integracje",
+ "featured": "Wyróżnione",
+ "description": "Odkryj integracje i wyróżnionych partnerów."
+ },
+ "directoryExamples": {
+ "example": "Przykład katalogowy",
+ "notice": "Wyłącznie przykłady katalogowe — nie sponsorzy ani połączone integracje."
}
}
diff --git a/electron/src/renderer/src/i18n/locales/pt.json b/electron/src/renderer/src/i18n/locales/pt.json
index 09d67953..18487fc8 100644
--- a/electron/src/renderer/src/i18n/locales/pt.json
+++ b/electron/src/renderer/src/i18n/locales/pt.json
@@ -2075,7 +2075,7 @@
"choose_method": "Escolha como dar",
"choose_method_amount": "Continuar com ${{amount}}",
"goal": {
- "title": "Fundo Claude Max",
+ "title": "Apoie o desenvolvimento do VoiceStudio",
"of": "de",
"per_month": "/mês",
"aria": "{{raised}} da meta mensal de {{goal}}",
@@ -2084,7 +2084,7 @@
"social_proof": "Junte-se a {{count}} apoiadores que financiam IA local"
},
"postcard": {
- "title": "Fundo Claude Max",
+ "title": "Apoie o desenvolvimento do VoiceStudio",
"lead_default": "Que bom que funcionou! VoiceStudio é gratuito e totalmente local. Se você economizar tempo, uma pequena contribuição mensal financiará Claude Max por trás disso.",
"lead_first_clone": "Seu primeiro clone de voz está pronto – ótimo! VoiceStudio é executado inteiramente em sua máquina e seu suporte mantém isso assim.",
"lead_tenth_dub": "Dez dublagens - você está claramente colocando isso para funcionar. Uma pequena contribuição mensal financia o Claude Max que fornece esses recursos.",
@@ -2588,5 +2588,52 @@
"progress": "{{done}} / {{total}} segmentos validados",
"cancelled": "Cancelado",
"fitting": "Ajustando o tempo"
+ },
+ "sponsorSlot": {
+ "visibility": "Visibilidade",
+ "integration": "Integração do produto",
+ "installs": "Instalações diretas",
+ "distribution": "Distribuição para desenvolvedores",
+ "partner": "Parceiro verificado",
+ "privacy": "Privacidade",
+ "title": "Destaque-se no VoiceStudio",
+ "description": "Aumente a visibilidade da sua marca patrocinando um espaço em destaque pago.",
+ "form": "Formulário Google",
+ "email": "E-mail",
+ "book": "Reserve seu espaço",
+ "preview": "Prévia do patrocinador",
+ "footer_brand": "Sua marca",
+ "footer_book": "Adicionar agora",
+ "email_template": "Olá, equipe VoiceStudio,\n\nGostaria de fazer uma parceria com a VoiceStudio e avaliar um espaço em destaque para minha marca.\n\nMarca / produto:\nSite:\nIntegração ou campanha:\nPúblico / prazo:\n\nPodem compartilhar os pacotes, preços, opções de posicionamento e requisitos técnicos disponíveis? Entendo que uma parceria em destaque pode incluir uma página de documentação, logo no README do GitHub, espaço no rodapé do app e presença no diretório Integrations.\n\nObrigado(a),\n[Nome]\n[Cargo / empresa]\n[Contato]",
+ "message": "Sua marca, site e mensagem",
+ "email_app": "Abrir app de e-mail",
+ "copy_email": "Copiar e-mail",
+ "preview_detail": "Seu logo, link e apresentação podem aparecer aqui."
+ },
+ "supportPlans": {
+ "remove": "Remover barra de patrocinadores",
+ "title": "Grátis vs Pro",
+ "free": "Grátis",
+ "pro": "Pro",
+ "sponsor_bar": "Barra de patrocinadores",
+ "visible": "Visível",
+ "hideable": "Pode ser ocultada",
+ "unavailable": "A ativação do Pro ainda não foi configurada.",
+ "telemetry": "Telemetria",
+ "opt_in": "Opcional, com consentimento",
+ "disabled": "Desativada",
+ "badge": "Selo Pro",
+ "advanced": "Ferramentas avançadas",
+ "standard": "Padrão",
+ "included": "Incluídas"
+ },
+ "integrationCatalog": {
+ "title": "Integrações",
+ "featured": "Destaque",
+ "description": "Descubra integrações e parceiros em destaque."
+ },
+ "directoryExamples": {
+ "example": "Exemplo do diretório",
+ "notice": "Apenas exemplos do diretório — não são patrocinadores nem integrações conectadas."
}
}
diff --git a/electron/src/renderer/src/i18n/locales/ru.json b/electron/src/renderer/src/i18n/locales/ru.json
index 52c8bcda..982aa540 100644
--- a/electron/src/renderer/src/i18n/locales/ru.json
+++ b/electron/src/renderer/src/i18n/locales/ru.json
@@ -2077,7 +2077,7 @@
"choose_method": "Выберите, как подарить",
"choose_method_amount": "Продолжить с ${{amount}}",
"goal": {
- "title": "Фонд Клода Макса",
+ "title": "Поддержите разработку VoiceStudio",
"of": "из",
"per_month": "/ месяц",
"aria": "{{raised}} из {{goal}} цели на месяц",
@@ -2086,7 +2086,7 @@
"social_proof": "Присоединяйтесь к сторонникам {{count}}, финансирующим местный искусственный интеллект"
},
"postcard": {
- "title": "Фонд Клода Макса",
+ "title": "Поддержите разработку VoiceStudio",
"lead_default": "Рад, что это сработало! VoiceStudio бесплатен и полностью локальный. Если это сэкономит вам время, небольшой ежемесячный взнос пополнит фонд Claude Max, стоящий за этим.",
"lead_first_clone": "Ваш первый голосовой клон готов — отлично! VoiceStudio полностью работает на вашем компьютере, и ваша поддержка поддерживает эту функцию.",
"lead_tenth_dub": "Десять дублей — вы явно прикладываете усилия. Небольшой ежемесячный взнос финансирует Claude Max, который предоставляет эти функции.",
@@ -2590,5 +2590,52 @@
"progress": "Проверено сегментов: {{done}} / {{total}}",
"cancelled": "Отменено",
"fitting": "Настройка времени"
+ },
+ "sponsorSlot": {
+ "visibility": "Видимость",
+ "integration": "Интеграция продукта",
+ "installs": "Прямые установки",
+ "distribution": "Дистрибуция для разработчиков",
+ "partner": "Проверенный партнёр",
+ "privacy": "Конфиденциальность",
+ "title": "Продвигайтесь в VoiceStudio",
+ "description": "Повысьте заметность бренда, спонсируя платное избранное размещение.",
+ "form": "Форма Google",
+ "email": "Электронная почта",
+ "book": "Забронировать место",
+ "preview": "Пример спонсорского блока",
+ "footer_brand": "Ваш бренд",
+ "footer_book": "Добавить сейчас",
+ "email_template": "Здравствуйте, команда VoiceStudio!\n\nЯ хочу стать партнёром VoiceStudio и обсудить заметное размещение для своего бренда.\n\nБренд / продукт:\nСайт:\nИнтеграция или кампания:\nАудитория / сроки:\n\nМожете поделиться доступными пакетами, ценами, вариантами размещения и техническими требованиями? Насколько я понимаю, партнёрство может включать страницу документации, логотип в GitHub README, место в подвале приложения и размещение в каталоге Integrations.\n\nСпасибо,\n[Имя]\n[Должность / компания]\n[Контакт]",
+ "message": "Ваш бренд, сайт и сообщение",
+ "email_app": "Открыть почтовое приложение",
+ "copy_email": "Скопировать email",
+ "preview_detail": "Здесь могут появиться ваш логотип, ссылка и описание."
+ },
+ "supportPlans": {
+ "remove": "Убрать панель спонсоров",
+ "title": "Бесплатная версия и Pro",
+ "free": "Бесплатно",
+ "pro": "Pro",
+ "sponsor_bar": "Панель спонсоров",
+ "visible": "Видна",
+ "hideable": "Можно скрыть",
+ "unavailable": "Активация Pro ещё не настроена.",
+ "telemetry": "Телеметрия",
+ "opt_in": "Необязательно, по согласию",
+ "disabled": "Отключена",
+ "badge": "Значок Pro",
+ "advanced": "Расширенные инструменты",
+ "standard": "Стандартные",
+ "included": "Включены"
+ },
+ "integrationCatalog": {
+ "title": "Интеграции",
+ "featured": "Рекомендуемое",
+ "description": "Откройте для себя интеграции и рекомендуемых партнёров."
+ },
+ "directoryExamples": {
+ "example": "Пример в каталоге",
+ "notice": "Только примеры каталога — не спонсоры и не подключённые интеграции."
}
}
diff --git a/electron/src/renderer/src/i18n/locales/sv.json b/electron/src/renderer/src/i18n/locales/sv.json
index 94ba7eab..a2cb421f 100644
--- a/electron/src/renderer/src/i18n/locales/sv.json
+++ b/electron/src/renderer/src/i18n/locales/sv.json
@@ -2073,7 +2073,7 @@
"choose_method": "Välj hur du ska ge",
"choose_method_amount": "Fortsätt med ${{amount}}",
"goal": {
- "title": "Fond Claude Max",
+ "title": "Stöd utvecklingen av VoiceStudio",
"of": "av",
"per_month": "/ månad",
"aria": "{{raised}} av {{goal}} månadsmål",
@@ -2082,7 +2082,7 @@
"social_proof": "Gå med i {{count}}-supportrar som finansierar lokal AI"
},
"postcard": {
- "title": "Fond Claude Max",
+ "title": "Stöd utvecklingen av VoiceStudio",
"lead_default": "Kul att det fungerade! VoiceStudio är gratis och helt lokalt. Om det sparar tid, finansierar ett litet månatligt chip-in Claude Max bakom det.",
"lead_first_clone": "Din första röstklon är klar – trevligt! VoiceStudio körs helt och hållet på din maskin, och din support håller det så.",
"lead_tenth_dub": "Tio dubbar in — du sätter helt klart igång det. Ett litet månatligt chip-in finansierar Claude Max som levererar dessa funktioner.",
@@ -2586,5 +2586,52 @@
"progress": "{{done}} / {{total}} segment validerade",
"cancelled": "Avbruten",
"fitting": "Justerar tidsplacering"
+ },
+ "sponsorSlot": {
+ "visibility": "Synlighet",
+ "integration": "Produktintegration",
+ "installs": "Direkta installationer",
+ "distribution": "Distribution för utvecklare",
+ "partner": "Verifierad partner",
+ "privacy": "Integritet",
+ "title": "Bli utvald på VoiceStudio",
+ "description": "Öka synligheten för ditt varumärke genom att sponsra en betald utvald plats.",
+ "form": "Google-formulär",
+ "email": "E-post",
+ "book": "Boka din plats",
+ "preview": "Förhandsvisning för sponsorer",
+ "footer_brand": "Ditt varumärke",
+ "footer_book": "Lägg till nu",
+ "email_template": "Hej VoiceStudio-teamet,\n\nJag vill gärna samarbeta med VoiceStudio och undersöka en framhävd placering för mitt varumärke.\n\nVarumärke / produkt:\nWebbplats:\nIntegration eller kampanj:\nMålgrupp / tidplan:\n\nKan ni dela tillgängliga paket, priser, placeringsalternativ och tekniska krav? Jag förstår att ett framhävt partnerskap kan omfatta en dokumentsida, GitHub README-logotyp, en plats i appens sidfot och en post i Integrations-katalogen.\n\nTack,\n[Namn]\n[Roll / företag]\n[Kontakt]",
+ "message": "Ditt varumärke, webbplats och meddelande",
+ "email_app": "Öppna e-postappen",
+ "copy_email": "Kopiera e-postadress",
+ "preview_detail": "Här kan din logotyp, länk och presentation visas."
+ },
+ "supportPlans": {
+ "remove": "Ta bort sponsorfältet",
+ "title": "Gratis jämfört med Pro",
+ "free": "Gratis",
+ "pro": "Pro",
+ "sponsor_bar": "Sponsorfält",
+ "visible": "Synligt",
+ "hideable": "Kan döljas",
+ "unavailable": "Pro-aktivering har inte konfigurerats ännu.",
+ "telemetry": "Telemetri",
+ "opt_in": "Valfritt, med samtycke",
+ "disabled": "Avstängd",
+ "badge": "Pro-märke",
+ "advanced": "Avancerade verktyg",
+ "standard": "Standard",
+ "included": "Ingår"
+ },
+ "integrationCatalog": {
+ "title": "Integrationer",
+ "featured": "Utvald",
+ "description": "Upptäck integrationer och utvalda partner."
+ },
+ "directoryExamples": {
+ "example": "Katalogexempel",
+ "notice": "Endast katalogexempel — inte sponsorer eller anslutna integrationer."
}
}
diff --git a/electron/src/renderer/src/i18n/locales/th.json b/electron/src/renderer/src/i18n/locales/th.json
index 52b88a2d..7d320dbf 100644
--- a/electron/src/renderer/src/i18n/locales/th.json
+++ b/electron/src/renderer/src/i18n/locales/th.json
@@ -2073,7 +2073,7 @@
"choose_method": "เลือกวิธีการให้",
"choose_method_amount": "ต่อด้วย ${{amount}}",
"goal": {
- "title": "กองทุน Claude Max",
+ "title": "สนับสนุนการพัฒนา VoiceStudio",
"of": "ของ",
"per_month": "/เดือน",
"aria": "{{raised}} จาก {{goal}} เป้าหมายรายเดือน",
@@ -2082,7 +2082,7 @@
"social_proof": "เข้าร่วมกับผู้สนับสนุน {{count}} ที่ให้ทุนสนับสนุน AI ในท้องถิ่น"
},
"postcard": {
- "title": "กองทุน Claude Max",
+ "title": "สนับสนุนการพัฒนา VoiceStudio",
"lead_default": "ดีใจที่ได้ผล! VoiceStudio เป็นบริการฟรีและอยู่ในเครื่องโดยสมบูรณ์ ถ้ามันช่วยคุณประหยัดเวลาได้ เงินสมทบรายเดือนเล็กๆ น้อยๆ ที่ Claude Max อยู่เบื้องหลัง",
"lead_first_clone": "การโคลนเสียงครั้งแรกของคุณเสร็จสิ้นแล้ว เยี่ยมมาก! VoiceStudio ทำงานบนเครื่องของคุณทั้งหมด และฝ่ายสนับสนุนของคุณก็จะเป็นเช่นนั้น",
"lead_tenth_dub": "มีพากย์สิบตอน — คุณเห็นได้ชัดว่ามันใช้งานได้จริง กองทุนรายเดือนเล็กๆ น้อยๆ ของ Claude Max ที่จัดส่งฟีเจอร์เหล่านี้",
@@ -2586,5 +2586,52 @@
"progress": "ตรวจสอบแล้ว {{done}} / {{total}} ช่วง",
"cancelled": "ยกเลิกแล้ว",
"fitting": "กำลังปรับเวลา"
+ },
+ "sponsorSlot": {
+ "visibility": "การมองเห็น",
+ "integration": "การผสานรวมผลิตภัณฑ์",
+ "installs": "ติดตั้งโดยตรง",
+ "distribution": "การเผยแพร่สำหรับนักพัฒนา",
+ "partner": "พาร์ทเนอร์ที่ยืนยันแล้ว",
+ "privacy": "ความเป็นส่วนตัว",
+ "title": "รับการแนะนำบน VoiceStudio",
+ "description": "เพิ่มการมองเห็นแบรนด์ด้วยการสนับสนุนพื้นที่แนะนำแบบชำระเงิน",
+ "form": "แบบฟอร์ม Google",
+ "email": "อีเมล",
+ "book": "จองพื้นที่ของคุณ",
+ "preview": "ตัวอย่างผู้สนับสนุน",
+ "footer_brand": "แบรนด์ของคุณ",
+ "footer_book": "เพิ่มตอนนี้",
+ "email_template": "สวัสดีทีม VoiceStudio\n\nฉันต้องการร่วมมือกับ VoiceStudio และสอบถามพื้นที่แนะนำสำหรับแบรนด์ของฉัน\n\nแบรนด์ / ผลิตภัณฑ์:\nเว็บไซต์:\nการเชื่อมต่อหรือแคมเปญ:\nกลุ่มเป้าหมาย / ช่วงเวลา:\n\nขอทราบแพ็กเกจ ราคา ตัวเลือกการจัดวาง และข้อกำหนดทางเทคนิคที่มีได้ไหม? ฉันเข้าใจว่าพาร์ทเนอร์แบบแนะนำอาจรวมหน้าคู่มือ โลโก้ใน GitHub README พื้นที่ท้ายแอป และรายการในไดเรกทอรี Integrations\n\nขอบคุณ\n[ชื่อ]\n[ตำแหน่ง / บริษัท]\n[ช่องทางติดต่อ]",
+ "message": "แบรนด์ เว็บไซต์ และข้อความของคุณ",
+ "email_app": "เปิดแอปอีเมล",
+ "copy_email": "คัดลอกอีเมล",
+ "preview_detail": "โลโก้ ลิงก์ และคำแนะนำของคุณอาจปรากฏที่นี่"
+ },
+ "supportPlans": {
+ "remove": "ลบแถบผู้สนับสนุน",
+ "title": "เปรียบเทียบฟรีกับ Pro",
+ "free": "ฟรี",
+ "pro": "Pro",
+ "sponsor_bar": "แถบผู้สนับสนุน",
+ "visible": "แสดง",
+ "hideable": "ซ่อนได้",
+ "unavailable": "ยังไม่ได้ตั้งค่าการเปิดใช้งาน Pro",
+ "telemetry": "ข้อมูลการใช้งาน",
+ "opt_in": "ไม่บังคับ ต้องยินยอมก่อน",
+ "disabled": "ปิดใช้งาน",
+ "badge": "ป้าย Pro",
+ "advanced": "เครื่องมือขั้นสูง",
+ "standard": "มาตรฐาน",
+ "included": "รวมอยู่ด้วย"
+ },
+ "integrationCatalog": {
+ "title": "การเชื่อมต่อ",
+ "featured": "แนะนำ",
+ "description": "ค้นพบการเชื่อมต่อและพันธมิตรแนะนำ"
+ },
+ "directoryExamples": {
+ "example": "ตัวอย่างในไดเรกทอรี",
+ "notice": "เป็นเพียงตัวอย่างในไดเรกทอรี ไม่ใช่ผู้สนับสนุนหรือการเชื่อมต่อที่เปิดใช้"
}
}
diff --git a/electron/src/renderer/src/i18n/locales/tr.json b/electron/src/renderer/src/i18n/locales/tr.json
index 34a4771e..133d9296 100644
--- a/electron/src/renderer/src/i18n/locales/tr.json
+++ b/electron/src/renderer/src/i18n/locales/tr.json
@@ -2073,7 +2073,7 @@
"choose_method": "Nasıl vereceğinizi seçin",
"choose_method_amount": "${{amount}} ile devam et",
"goal": {
- "title": "Claude Max'e fon sağlayın",
+ "title": "VoiceStudio geliştirmelerini destekleyin",
"of": "arasında",
"per_month": "/ ay",
"aria": "{{raised}} / {{goal}} aylık hedef",
@@ -2082,7 +2082,7 @@
"social_proof": "Yerel yapay zekayı finanse eden {{count}} destekçilerine katılın"
},
"postcard": {
- "title": "Claude Max'e fon sağlayın",
+ "title": "VoiceStudio geliştirmelerini destekleyin",
"lead_default": "İşe yaradığına sevindim! VoiceStudio ücretsizdir ve tamamen yereldir. Size zaman kazandıracaksa, aylık küçük bir chip-in, arkasındaki Claude Max'e fon sağlar.",
"lead_first_clone": "İlk ses klonunuz tamamlandı — güzel! VoiceStudio tamamen makinenizde çalışır ve desteğiniz de bu şekilde kalmasını sağlar.",
"lead_tenth_dub": "On dublaj - açıkça işe koyuyorsunuz. Küçük bir aylık chip-in, bu özellikleri sunan Claude Max'e fon sağlıyor.",
@@ -2586,5 +2586,52 @@
"progress": "{{done}} / {{total}} bölüm doğrulandı",
"cancelled": "İptal edildi",
"fitting": "Zamanlama ayarlanıyor"
+ },
+ "sponsorSlot": {
+ "visibility": "Görünürlük",
+ "integration": "Ürün entegrasyonu",
+ "installs": "Doğrudan kurulumlar",
+ "distribution": "Geliştirici dağıtımı",
+ "partner": "Doğrulanmış iş ortağı",
+ "privacy": "Gizlilik",
+ "title": "VoiceStudio'da öne çıkın",
+ "description": "Ücretli bir öne çıkan alanı sponsorlayarak markanızın görünürlüğünü artırın.",
+ "form": "Google Formu",
+ "email": "E-posta",
+ "book": "Yerinizi ayırtın",
+ "preview": "Sponsor önizlemesi",
+ "footer_brand": "Markanız",
+ "footer_book": "Şimdi ekle",
+ "email_template": "Merhaba VoiceStudio ekibi,\n\nVoiceStudio ile ortaklık kurmak ve markam için öne çıkan bir yerleşimi değerlendirmek istiyorum.\n\nMarka / ürün:\nWeb sitesi:\nEntegrasyon veya kampanya:\nHedef kitle / zamanlama:\n\nMevcut paketleri, fiyatları, yerleşim seçeneklerini ve teknik gereksinimleri paylaşabilir misiniz? Öne çıkan ortaklığın bir dokümantasyon sayfası, GitHub README logosu, uygulama altbilgisi alanı ve Integrations dizininde yer alabileceğini anlıyorum.\n\nTeşekkürler,\n[Ad]\n[Rol / şirket]\n[İletişim]",
+ "message": "Markanız, web siteniz ve mesajınız",
+ "email_app": "E-posta uygulamasını aç",
+ "copy_email": "E-postayı kopyala",
+ "preview_detail": "Logonuz, bağlantınız ve tanıtımınız burada görünebilir."
+ },
+ "supportPlans": {
+ "remove": "Sponsor çubuğunu kaldır",
+ "title": "Ücretsiz ve Pro",
+ "free": "Ücretsiz",
+ "pro": "Pro",
+ "sponsor_bar": "Sponsor çubuğu",
+ "visible": "Görünür",
+ "hideable": "Gizlenebilir",
+ "unavailable": "Pro etkinleştirmesi henüz yapılandırılmadı.",
+ "telemetry": "Telemetri",
+ "opt_in": "İsteğe bağlı, onay ile",
+ "disabled": "Devre dışı",
+ "badge": "Pro rozeti",
+ "advanced": "Gelişmiş araçlar",
+ "standard": "Standart",
+ "included": "Dahil"
+ },
+ "integrationCatalog": {
+ "title": "Entegrasyonlar",
+ "featured": "Öne çıkan",
+ "description": "Entegrasyonları ve öne çıkan iş ortaklarını keşfedin."
+ },
+ "directoryExamples": {
+ "example": "Dizin örneği",
+ "notice": "Yalnızca dizin örnekleri; sponsor veya bağlı entegrasyon değildir."
}
}
diff --git a/electron/src/renderer/src/i18n/locales/uk.json b/electron/src/renderer/src/i18n/locales/uk.json
index b259ccd2..d715bd73 100644
--- a/electron/src/renderer/src/i18n/locales/uk.json
+++ b/electron/src/renderer/src/i18n/locales/uk.json
@@ -2077,7 +2077,7 @@
"choose_method": "Виберіть, як дарувати",
"choose_method_amount": "Продовжити з ${{amount}}",
"goal": {
- "title": "Фонд Клод Макс",
+ "title": "Підтримайте розробку VoiceStudio",
"of": "з",
"per_month": "/ місяць",
"aria": "{{raised}} з {{goal}} місячної цілі",
@@ -2086,7 +2086,7 @@
"social_proof": "Приєднуйтеся до прихильників {{count}}, які фінансують місцевий ШІ"
},
"postcard": {
- "title": "Фонд Клод Макс",
+ "title": "Підтримайте розробку VoiceStudio",
"lead_default": "Радий, що спрацювало! VoiceStudio є безкоштовним і повністю локальним. Якщо це економить ваш час, невеликий щомісячний внесок фінансує Клода Макса, який стоїть за цим.",
"lead_first_clone": "Ваш перший голосовий клон готовий — чудово! VoiceStudio повністю працює на вашому комп’ютері, і ваша підтримка підтримує його.",
"lead_tenth_dub": "Десять дубляжів — ви явно вводите це в роботу. Невеликий щомісячний внесок фінансує Claude Max, який постачає ці функції.",
@@ -2590,5 +2590,52 @@
"progress": "Перевірено сегментів: {{done}} / {{total}}",
"cancelled": "Скасовано",
"fitting": "Налаштування часу"
+ },
+ "sponsorSlot": {
+ "visibility": "Видимість",
+ "integration": "Інтеграція продукту",
+ "installs": "Прямі встановлення",
+ "distribution": "Дистрибуція для розробників",
+ "partner": "Перевірений партнер",
+ "privacy": "Конфіденційність",
+ "title": "Розмістіть бренд у VoiceStudio",
+ "description": "Підвищте видимість бренду, спонсоруючи платне рекомендоване місце.",
+ "form": "Форма Google",
+ "email": "Електронна пошта",
+ "book": "Забронювати місце",
+ "preview": "Приклад спонсорського блоку",
+ "footer_brand": "Ваш бренд",
+ "footer_book": "Додати зараз",
+ "email_template": "Вітаю, командо VoiceStudio!\n\nЯ хочу стати партнером VoiceStudio та обговорити помітне розміщення для свого бренду.\n\nБренд / продукт:\nВебсайт:\nІнтеграція або кампанія:\nАудиторія / терміни:\n\nЧи можете ви надіслати доступні пакети, ціни, варіанти розміщення та технічні вимоги? Я розумію, що партнерство може включати сторінку документації, логотип у GitHub README, місце в нижній частині застосунку та розміщення в каталозі Integrations.\n\nДякую,\n[Ім’я]\n[Посада / компанія]\n[Контакт]",
+ "message": "Ваш бренд, сайт і повідомлення",
+ "email_app": "Відкрити поштовий застосунок",
+ "copy_email": "Скопіювати email",
+ "preview_detail": "Тут можуть з’явитися ваш логотип, посилання та опис."
+ },
+ "supportPlans": {
+ "remove": "Прибрати панель спонсорів",
+ "title": "Безкоштовна версія та Pro",
+ "free": "Безкоштовно",
+ "pro": "Pro",
+ "sponsor_bar": "Панель спонсорів",
+ "visible": "Видима",
+ "hideable": "Можна приховати",
+ "unavailable": "Активацію Pro ще не налаштовано.",
+ "telemetry": "Телеметрія",
+ "opt_in": "Необов’язкова, за згодою",
+ "disabled": "Вимкнена",
+ "badge": "Значок Pro",
+ "advanced": "Розширені інструменти",
+ "standard": "Стандартні",
+ "included": "Включені"
+ },
+ "integrationCatalog": {
+ "title": "Інтеграції",
+ "featured": "Рекомендоване",
+ "description": "Відкрийте інтеграції та рекомендованих партнерів."
+ },
+ "directoryExamples": {
+ "example": "Приклад у каталозі",
+ "notice": "Лише приклади каталогу — не спонсори й не підключені інтеграції."
}
}
diff --git a/electron/src/renderer/src/i18n/locales/vi.json b/electron/src/renderer/src/i18n/locales/vi.json
index 2b53ab30..4754918a 100644
--- a/electron/src/renderer/src/i18n/locales/vi.json
+++ b/electron/src/renderer/src/i18n/locales/vi.json
@@ -2073,7 +2073,7 @@
"choose_method": "Chọn cách cho đi",
"choose_method_amount": "Tiếp tục với ${{amount}}",
"goal": {
- "title": "Quỹ Claude Max",
+ "title": "Hỗ trợ phát triển VoiceStudio",
"of": "của",
"per_month": "/ tháng",
"aria": "{{raised}} trong số {{goal}} mục tiêu hàng tháng",
@@ -2082,7 +2082,7 @@
"social_proof": "Tham gia cùng những người ủng hộ {{count}} tài trợ cho AI địa phương"
},
"postcard": {
- "title": "Quỹ Claude Max",
+ "title": "Hỗ trợ phát triển VoiceStudio",
"lead_default": "Vui mừng vì nó đã hiệu quả! VoiceStudio là miễn phí và hoàn toàn cục bộ. Nếu việc này giúp bạn tiết kiệm thời gian, một khoản chip-in nhỏ hàng tháng sẽ tài trợ cho Claude Max đằng sau nó.",
"lead_first_clone": "Bản sao giọng nói đầu tiên của bạn đã hoàn tất - thật tuyệt! VoiceStudio chạy hoàn toàn trên máy của bạn và bộ phận hỗ trợ của bạn sẽ duy trì hoạt động đó.",
"lead_tenth_dub": "Mười bản lồng tiếng - rõ ràng bạn đang thực hiện nó. Một khoản chip-in nhỏ hàng tháng sẽ tài trợ cho Claude Max cung cấp các tính năng này.",
@@ -2586,5 +2586,52 @@
"progress": "Đã xác thực {{done}} / {{total}} đoạn",
"cancelled": "Đã hủy",
"fitting": "Đang điều chỉnh thời gian"
+ },
+ "sponsorSlot": {
+ "visibility": "Khả năng hiển thị",
+ "integration": "Tích hợp sản phẩm",
+ "installs": "Cài đặt trực tiếp",
+ "distribution": "Phân phối cho nhà phát triển",
+ "partner": "Đối tác đã xác minh",
+ "privacy": "Quyền riêng tư",
+ "title": "Nổi bật trên VoiceStudio",
+ "description": "Tăng khả năng nhận diện thương hiệu bằng cách tài trợ một vị trí nổi bật có trả phí.",
+ "form": "Biểu mẫu Google",
+ "email": "Email",
+ "book": "Đặt vị trí của bạn",
+ "preview": "Xem trước nhà tài trợ",
+ "footer_brand": "Thương hiệu của bạn",
+ "footer_book": "Thêm ngay",
+ "email_template": "Xin chào đội ngũ VoiceStudio,\n\nTôi muốn hợp tác với VoiceStudio và tìm hiểu vị trí nổi bật cho thương hiệu của mình.\n\nThương hiệu / sản phẩm:\nTrang web:\nTích hợp hoặc chiến dịch:\nĐối tượng / thời gian:\n\nBạn có thể chia sẻ các gói, mức giá, tùy chọn hiển thị và yêu cầu kỹ thuật hiện có không? Tôi hiểu rằng đối tác nổi bật có thể được giới thiệu trên trang tài liệu, README GitHub, chân trang ứng dụng và thư mục Integrations.\n\nCảm ơn,\n[Tên]\n[Chức vụ / công ty]\n[Liên hệ]",
+ "message": "Thương hiệu, trang web và lời nhắn",
+ "email_app": "Mở ứng dụng email",
+ "copy_email": "Sao chép email",
+ "preview_detail": "Logo, liên kết và phần giới thiệu của bạn có thể xuất hiện ở đây."
+ },
+ "supportPlans": {
+ "remove": "Xóa thanh nhà tài trợ",
+ "title": "Miễn phí và Pro",
+ "free": "Miễn phí",
+ "pro": "Pro",
+ "sponsor_bar": "Thanh nhà tài trợ",
+ "visible": "Hiển thị",
+ "hideable": "Có thể ẩn",
+ "unavailable": "Chưa cấu hình kích hoạt Pro.",
+ "telemetry": "Dữ liệu sử dụng",
+ "opt_in": "Tùy chọn, cần đồng ý",
+ "disabled": "Tắt",
+ "badge": "Huy hiệu Pro",
+ "advanced": "Công cụ nâng cao",
+ "standard": "Tiêu chuẩn",
+ "included": "Bao gồm"
+ },
+ "integrationCatalog": {
+ "title": "Tích hợp",
+ "featured": "Nổi bật",
+ "description": "Khám phá các tích hợp và đối tác nổi bật."
+ },
+ "directoryExamples": {
+ "example": "Ví dụ trong danh mục",
+ "notice": "Chỉ là ví dụ trong danh mục, không phải nhà tài trợ hay tích hợp đã kết nối."
}
}
diff --git a/electron/src/renderer/src/i18n/locales/zh-CN.json b/electron/src/renderer/src/i18n/locales/zh-CN.json
index 59403595..dfd5ce90 100644
--- a/electron/src/renderer/src/i18n/locales/zh-CN.json
+++ b/electron/src/renderer/src/i18n/locales/zh-CN.json
@@ -2077,7 +2077,7 @@
"choose_method": "选择捐赠方式",
"choose_method_amount": "继续 ${{amount}}",
"goal": {
- "title": "Claude Max 基金",
+ "title": "支持 VoiceStudio 开发",
"of": "已筹 / 目标",
"per_month": "/月",
"aria": "每月目标 {{goal}},已筹 {{raised}}",
@@ -2086,7 +2086,7 @@
"social_proof": "加入 {{count}} 位支持本地 AI 的支持者"
},
"postcard": {
- "title": "Claude Max 基金",
+ "title": "支持 VoiceStudio 开发",
"lead_default": "很高兴它对你有用!VoiceStudio 免费且完全本地运行。如果它能节省你的时间,每月一小笔赞助就能支撑其背后的 Claude Max。",
"lead_first_clone": "你的第一次声音克隆已完成——太好了!VoiceStudio 完全在你的电脑上运行,你的支持让它保持如此。",
"lead_tenth_dub": "十次配音——你显然正在让它发挥作用。每月一小笔赞助为这些功能背后的 Claude Max 提供资金。",
@@ -2590,5 +2590,52 @@
"progress": "已验证 {{done}} / {{total}} 个片段",
"cancelled": "已取消",
"fitting": "正在调整时间"
+ },
+ "sponsorSlot": {
+ "visibility": "品牌曝光",
+ "integration": "产品集成",
+ "installs": "直接安装",
+ "distribution": "开发者分发",
+ "partner": "认证合作伙伴",
+ "privacy": "隐私",
+ "title": "在 VoiceStudio 上获得推荐",
+ "description": "赞助付费推荐位,提升品牌曝光度。",
+ "form": "Google 表单",
+ "email": "电子邮件",
+ "book": "预订展示位",
+ "preview": "赞助商展示预览",
+ "footer_brand": "您的品牌",
+ "footer_book": "立即添加",
+ "email_template": "VoiceStudio 团队您好:\n\n我想与 VoiceStudio 建立合作,并了解为我的品牌提供精选展示的机会。\n\n品牌 / 产品:\n网站:\n集成或活动:\n受众 / 时间:\n\n请问可以分享可选方案、价格、展示位置和技术要求吗?据我了解,精选合作伙伴可以获得文档页面、GitHub README 标志、应用底部栏位置以及 Integrations 目录展示。\n\n谢谢!\n[姓名]\n[职位 / 公司]\n[联系方式]",
+ "message": "您的品牌、网站和留言",
+ "email_app": "打开邮件应用",
+ "copy_email": "复制邮箱",
+ "preview_detail": "这里可以展示您的标志、链接和介绍。"
+ },
+ "supportPlans": {
+ "remove": "移除赞助商栏",
+ "title": "免费版与 Pro 对比",
+ "free": "免费版",
+ "pro": "Pro",
+ "sponsor_bar": "赞助商栏",
+ "visible": "显示",
+ "hideable": "可隐藏",
+ "unavailable": "尚未配置 Pro 激活。",
+ "telemetry": "遥测",
+ "opt_in": "可选,需主动同意",
+ "disabled": "已禁用",
+ "badge": "Pro 徽章",
+ "advanced": "高级工具",
+ "standard": "标准",
+ "included": "包含"
+ },
+ "integrationCatalog": {
+ "title": "集成",
+ "featured": "精选",
+ "description": "探索集成与精选合作伙伴。"
+ },
+ "directoryExamples": {
+ "example": "目录示例",
+ "notice": "仅为目录示例,并非赞助商或已连接的集成。"
}
}
diff --git a/electron/src/renderer/src/i18n/locales/zh-TW.json b/electron/src/renderer/src/i18n/locales/zh-TW.json
index 80e3be3b..fa477502 100644
--- a/electron/src/renderer/src/i18n/locales/zh-TW.json
+++ b/electron/src/renderer/src/i18n/locales/zh-TW.json
@@ -2073,7 +2073,7 @@
"choose_method": "選擇如何給予",
"choose_method_amount": "繼續 ${{amount}}",
"goal": {
- "title": "克勞德馬克斯基金",
+ "title": "支持 VoiceStudio 開發",
"of": "的",
"per_month": "/月",
"aria": "{{raised}} 每月目標 {{goal}}",
@@ -2082,7 +2082,7 @@
"social_proof": "加入資助本地人工智慧的 {{count}} 支持者"
},
"postcard": {
- "title": "克勞德馬克斯基金",
+ "title": "支持 VoiceStudio 開發",
"lead_default": "很高興這有效! VoiceStudio 是免費的並且完全本地化。如果可以節省您的時間,每月只需投入一小筆資金即可資助其背後的 Claude Max。",
"lead_first_clone": "你的第一個聲音克隆已經完成——太好了! VoiceStudio 完全在您的電腦上運行,並且您的支援使其保持這種狀態。",
"lead_tenth_dub": "十次配音——你顯然正在讓它發揮作用。每月一小筆資金為 Claude Max 提供這些功能的資金。",
@@ -2586,5 +2586,52 @@
"progress": "已驗證 {{done}} / {{total}} 個片段",
"cancelled": "已取消",
"fitting": "正在調整時間"
+ },
+ "sponsorSlot": {
+ "visibility": "品牌曝光",
+ "integration": "產品整合",
+ "installs": "直接安裝",
+ "distribution": "開發者發佈",
+ "partner": "已驗證合作夥伴",
+ "privacy": "隱私",
+ "title": "在 VoiceStudio 上獲得推薦",
+ "description": "贊助付費推薦位,提升品牌曝光度。",
+ "form": "Google 表單",
+ "email": "電子郵件",
+ "book": "預訂展示位",
+ "preview": "贊助商展示預覽",
+ "footer_brand": "您的品牌",
+ "footer_book": "立即新增",
+ "email_template": "VoiceStudio 團隊您好:\n\n我想與 VoiceStudio 合作,並了解為我的品牌提供精選展示的機會。\n\n品牌 / 產品:\n網站:\n整合或活動:\n受眾 / 時間:\n\n請問可以分享可選方案、價格、展示位置和技術要求嗎?據我了解,精選合作夥伴可以獲得文件頁面、GitHub README 標誌、應用程式底部欄位以及 Integrations 目錄展示。\n\n謝謝!\n[姓名]\n[職稱 / 公司]\n[聯絡方式]",
+ "message": "您的品牌、網站和留言",
+ "email_app": "開啟郵件應用程式",
+ "copy_email": "複製信箱",
+ "preview_detail": "這裡可以展示您的標誌、連結和介紹。"
+ },
+ "supportPlans": {
+ "remove": "移除贊助商列",
+ "title": "免費版與 Pro 比較",
+ "free": "免費版",
+ "pro": "Pro",
+ "sponsor_bar": "贊助商列",
+ "visible": "顯示",
+ "hideable": "可隱藏",
+ "unavailable": "尚未設定 Pro 啟用。",
+ "telemetry": "遙測",
+ "opt_in": "可選,需主動同意",
+ "disabled": "已停用",
+ "badge": "Pro 徽章",
+ "advanced": "進階工具",
+ "standard": "標準",
+ "included": "包含"
+ },
+ "integrationCatalog": {
+ "title": "整合",
+ "featured": "精選",
+ "description": "探索整合與精選合作夥伴。"
+ },
+ "directoryExamples": {
+ "example": "目錄範例",
+ "notice": "僅為目錄範例,並非贊助商或已連接的整合。"
}
}
diff --git a/electron/src/renderer/src/routes/index.ts b/electron/src/renderer/src/routes/index.ts
index c4aea52e..2cc66326 100644
--- a/electron/src/renderer/src/routes/index.ts
+++ b/electron/src/renderer/src/routes/index.ts
@@ -29,6 +29,14 @@ const ProjectsPage = lazyRouteComponent(
'ProjectsPage',
);
const ToolsPage = lazyRouteComponent(() => import('@/features/tools/tools-page'), 'ToolsPage');
+const IntegrationsPage = lazyRouteComponent(
+ () => import('@/features/integrations/integrations-page'),
+ 'IntegrationsPage',
+);
+const IntegrationDetailPage = lazyRouteComponent(
+ () => import('@/features/integrations/integration-detail-page'),
+ 'IntegrationDetailPage',
+);
const SettingsPage = lazyRouteComponent(
() => import('@/features/settings/settings-page'),
'SettingsPage',
@@ -135,6 +143,16 @@ export const toolsRoute = createRoute({
path: '/tools',
component: ToolsPage,
});
+export const integrationsRoute = createRoute({
+ getParentRoute: () => rootRoute,
+ path: '/integrations',
+ component: IntegrationsPage,
+});
+export const integrationDetailRoute = createRoute({
+ getParentRoute: () => rootRoute,
+ path: '/integrations/$slug',
+ component: IntegrationDetailPage,
+});
export const mediaRoute = createRoute({
getParentRoute: () => rootRoute,
path: '/settings/media',
@@ -208,6 +226,9 @@ export const storageRoute = createRoute({
export const supportRoute = createRoute({
getParentRoute: () => rootRoute,
path: '/settings/support',
+ validateSearch: (search: Record
): { compare?: boolean } => ({
+ compare: search.compare === true || search.compare === 'true' ? true : undefined,
+ }),
component: SettingsPage,
});
export const updatesRoute = createRoute({
@@ -248,6 +269,8 @@ export const routeTree = rootRoute.addChildren([
pronunciationRoute,
mediaRoute,
toolsRoute,
+ integrationsRoute,
+ integrationDetailRoute,
batchRoute,
galleryRoute,
logsRoute,
diff --git a/electron/src/renderer/src/styles/globals.css b/electron/src/renderer/src/styles/globals.css
index 708f7178..b122ec69 100644
--- a/electron/src/renderer/src/styles/globals.css
+++ b/electron/src/renderer/src/styles/globals.css
@@ -67,6 +67,7 @@
}
:root {
+ --workspace-footer-height: 49px;
--control-radius: 0.5rem;
--workspace-gap: 1rem;
--workspace-inset: 1.5rem;
diff --git a/frontend/src/api/donation.ts b/frontend/src/api/donation.ts
index 88b4e911..62c1b5c9 100644
--- a/frontend/src/api/donation.ts
+++ b/frontend/src/api/donation.ts
@@ -1,5 +1,5 @@
/**
- * Donation goal data — "Fund Claude Max" goal bar (spec 007, Option B).
+ * Donation goal data — "Support VoiceStudio development" goal bar (spec 007, Option B).
*
* Source-of-truth strategy (Option B):
* 1. A bundled, committed snapshot ships with the app so the goal bar ALWAYS
diff --git a/frontend/src/assets/integrations/anthropic.png b/frontend/src/assets/integrations/anthropic.png
new file mode 100644
index 00000000..f0b5d7c5
Binary files /dev/null and b/frontend/src/assets/integrations/anthropic.png differ
diff --git a/frontend/src/assets/integrations/assemblyai.ico b/frontend/src/assets/integrations/assemblyai.ico
new file mode 100644
index 00000000..dc0a6090
Binary files /dev/null and b/frontend/src/assets/integrations/assemblyai.ico differ
diff --git a/frontend/src/assets/integrations/cartesia.png b/frontend/src/assets/integrations/cartesia.png
new file mode 100644
index 00000000..664972d2
Binary files /dev/null and b/frontend/src/assets/integrations/cartesia.png differ
diff --git a/frontend/src/assets/integrations/codex.png b/frontend/src/assets/integrations/codex.png
new file mode 100644
index 00000000..468574c2
Binary files /dev/null and b/frontend/src/assets/integrations/codex.png differ
diff --git a/frontend/src/assets/integrations/deepgram.ico b/frontend/src/assets/integrations/deepgram.ico
new file mode 100644
index 00000000..7d2ffb61
Binary files /dev/null and b/frontend/src/assets/integrations/deepgram.ico differ
diff --git a/frontend/src/assets/integrations/docker.png b/frontend/src/assets/integrations/docker.png
new file mode 100644
index 00000000..f37200f7
Binary files /dev/null and b/frontend/src/assets/integrations/docker.png differ
diff --git a/frontend/src/assets/integrations/elevenlabs.ico b/frontend/src/assets/integrations/elevenlabs.ico
new file mode 100644
index 00000000..0afed799
Binary files /dev/null and b/frontend/src/assets/integrations/elevenlabs.ico differ
diff --git a/frontend/src/assets/integrations/ghcr.png b/frontend/src/assets/integrations/ghcr.png
new file mode 100644
index 00000000..468574c2
Binary files /dev/null and b/frontend/src/assets/integrations/ghcr.png differ
diff --git a/frontend/src/assets/integrations/github.png b/frontend/src/assets/integrations/github.png
new file mode 100644
index 00000000..468574c2
Binary files /dev/null and b/frontend/src/assets/integrations/github.png differ
diff --git a/frontend/src/assets/integrations/hume.ico b/frontend/src/assets/integrations/hume.ico
new file mode 100644
index 00000000..e544ab8f
Binary files /dev/null and b/frontend/src/assets/integrations/hume.ico differ
diff --git a/frontend/src/assets/integrations/integration-generic.svg b/frontend/src/assets/integrations/integration-generic.svg
new file mode 100644
index 00000000..3f8d7943
--- /dev/null
+++ b/frontend/src/assets/integrations/integration-generic.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/frontend/src/assets/integrations/inworld.ico b/frontend/src/assets/integrations/inworld.ico
new file mode 100644
index 00000000..881fa2a5
Binary files /dev/null and b/frontend/src/assets/integrations/inworld.ico differ
diff --git a/frontend/src/assets/integrations/mcp.png b/frontend/src/assets/integrations/mcp.png
new file mode 100644
index 00000000..9f221af3
Binary files /dev/null and b/frontend/src/assets/integrations/mcp.png differ
diff --git a/frontend/src/assets/integrations/murf.ico b/frontend/src/assets/integrations/murf.ico
new file mode 100644
index 00000000..3b31238f
Binary files /dev/null and b/frontend/src/assets/integrations/murf.ico differ
diff --git a/frontend/src/assets/integrations/n8n.ico b/frontend/src/assets/integrations/n8n.ico
new file mode 100644
index 00000000..4df30bfe
Binary files /dev/null and b/frontend/src/assets/integrations/n8n.ico differ
diff --git a/frontend/src/assets/integrations/plivo.svg b/frontend/src/assets/integrations/plivo.svg
new file mode 100644
index 00000000..09601b24
--- /dev/null
+++ b/frontend/src/assets/integrations/plivo.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/frontend/src/assets/integrations/resemble.png b/frontend/src/assets/integrations/resemble.png
new file mode 100644
index 00000000..72b8a191
Binary files /dev/null and b/frontend/src/assets/integrations/resemble.png differ
diff --git a/frontend/src/assets/integrations/speechify.ico b/frontend/src/assets/integrations/speechify.ico
new file mode 100644
index 00000000..61d0989a
Binary files /dev/null and b/frontend/src/assets/integrations/speechify.ico differ
diff --git a/frontend/src/assets/integrations/telnyx.ico b/frontend/src/assets/integrations/telnyx.ico
new file mode 100644
index 00000000..8f66fdd9
Binary files /dev/null and b/frontend/src/assets/integrations/telnyx.ico differ
diff --git a/frontend/src/assets/integrations/twilio.png b/frontend/src/assets/integrations/twilio.png
new file mode 100644
index 00000000..c4ebb792
Binary files /dev/null and b/frontend/src/assets/integrations/twilio.png differ
diff --git a/frontend/src/assets/integrations/voicestudio.png b/frontend/src/assets/integrations/voicestudio.png
new file mode 100644
index 00000000..468574c2
Binary files /dev/null and b/frontend/src/assets/integrations/voicestudio.png differ
diff --git a/frontend/src/assets/integrations/wellsaid.png b/frontend/src/assets/integrations/wellsaid.png
new file mode 100644
index 00000000..5a0299fd
Binary files /dev/null and b/frontend/src/assets/integrations/wellsaid.png differ
diff --git a/frontend/src/assets/integrations/zapier.ico b/frontend/src/assets/integrations/zapier.ico
new file mode 100644
index 00000000..f8ef29f4
Binary files /dev/null and b/frontend/src/assets/integrations/zapier.ico differ
diff --git a/frontend/src/components/donate/GoalBar.jsx b/frontend/src/components/donate/GoalBar.jsx
index 03936da0..0aee66d4 100644
--- a/frontend/src/components/donate/GoalBar.jsx
+++ b/frontend/src/components/donate/GoalBar.jsx
@@ -4,7 +4,7 @@ import Pip from './Pip';
import { BUNDLED_PROGRESS, loadDonationProgress, progressPct, isGoalMet } from '../../api/donation';
/**
- * GoalBar — the "Fund Claude Max" progress meter.
+ * GoalBar — the "Support VoiceStudio development" progress meter.
*
* Two variants via the `mini` prop:
* - page (default): full bar with caption + Pip perched on the fill.
@@ -72,7 +72,7 @@ export default function GoalBar({ mini = false, progress: injected = null, class
{!mini && (
- {t('donate.goal.title', { defaultValue: 'Fund Claude Max' })}
+ {t('donate.goal.title', { defaultValue: 'Support VoiceStudio development' })}
{pctLabel}%
diff --git a/frontend/src/config/integration-catalog.d.ts b/frontend/src/config/integration-catalog.d.ts
new file mode 100644
index 00000000..225f57a7
--- /dev/null
+++ b/frontend/src/config/integration-catalog.d.ts
@@ -0,0 +1,12 @@
+export interface IntegrationCatalogEntry {
+ name: string;
+ url: string;
+ logoUrl: string;
+ detailKeys: string[];
+ category: string;
+ featured: boolean;
+}
+
+export const INTEGRATION_CATALOG: IntegrationCatalogEntry[];
+export function integrationSlug(name: string): string;
+export function getIntegrationBySlug(slug: string): IntegrationCatalogEntry | undefined;
diff --git a/frontend/src/config/integration-catalog.js b/frontend/src/config/integration-catalog.js
new file mode 100644
index 00000000..629ef557
--- /dev/null
+++ b/frontend/src/config/integration-catalog.js
@@ -0,0 +1,40 @@
+// Local-first integration directory. These are links and capability references,
+// not bundled SDKs, endorsements, or connected accounts.
+import genericLogo from '../assets/integrations/integration-generic.svg';
+import { VOICE_AI_DIRECTORY } from './voice-ai-directory';
+
+const groups = [
+ ['automation', ['n8n|https://n8n.io', 'Zapier|https://zapier.com', 'Make|https://www.make.com', 'Pipedream|https://pipedream.com', 'IFTTT|https://ifttt.com', 'Activepieces|https://www.activepieces.com', 'Windmill|https://www.windmill.dev', 'Temporal|https://temporal.io', 'Prefect|https://www.prefect.io', 'Dagster|https://dagster.io', 'Airflow|https://airflow.apache.org', 'Node-RED|https://nodered.org', 'Huginn|https://github.com/huginn/huginn', 'Trigger.dev|https://trigger.dev', 'Inngest|https://www.inngest.com', 'Pipedream Connect|https://pipedream.com/connect', 'Workato|https://www.workato.com', 'Tray.ai|https://tray.ai', 'Retool Workflows|https://retool.com/workflows', 'Bardeen|https://www.bardeen.ai'] ],
+ ['comms', ['Twilio|https://www.twilio.com', 'Plivo|https://www.plivo.com', 'Telnyx|https://telnyx.com', 'SignalWire|https://signalwire.com', 'Vonage|https://www.vonage.com/communications-apis', 'Bandwidth|https://www.bandwidth.com', 'Sinch|https://sinch.com', 'MessageBird|https://bird.com', 'Agora|https://www.agora.io', 'Daily|https://www.daily.co', 'LiveKit|https://livekit.io', 'Stream|https://getstream.io', 'Retell AI|https://www.retellai.com', 'Vapi|https://vapi.ai', 'Bland AI|https://www.bland.ai', 'ElevenLabs Conversational AI|https://elevenlabs.io/conversational-ai', 'Deepgram Voice Agent|https://deepgram.com/voice-agents', 'SIP.js|https://sipjs.com', 'Asterisk|https://www.asterisk.org', 'FreeSWITCH|https://signalwire.com/freeswitch'] ],
+ ['agents', ['OpenAI Agents|https://platform.openai.com/docs/guides/agents', 'Anthropic Claude|https://www.anthropic.com', 'Claude Code|https://docs.anthropic.com/en/docs/claude-code', 'Codex CLI|https://github.com/openai/codex', 'GitHub Copilot|https://github.com/features/copilot', 'Cursor|https://www.cursor.com', 'Windsurf|https://windsurf.com', 'Cline|https://github.com/cline/cline', 'Roo Code|https://github.com/RooCodeInc/Roo-Code', 'Aider|https://aider.chat', 'OpenHands|https://github.com/All-Hands-AI/OpenHands', 'Goose|https://block.github.io/goose', 'OpenCode|https://opencode.ai', 'Continue|https://www.continue.dev', 'Amazon Q Developer|https://aws.amazon.com/q/developer', 'Google Jules|https://jules.google', 'Devin|https://devin.ai', 'Replit Agent|https://replit.com/ai', 'Warp AI|https://www.warp.dev/ai', 'Pi|https://pi.dev'] ],
+ ['mcp', ['Model Context Protocol|https://modelcontextprotocol.io', 'MCP Registry|https://registry.modelcontextprotocol.io', 'GitHub MCP Server|https://github.com/github/github-mcp-server', 'Filesystem MCP|https://github.com/modelcontextprotocol/servers', 'Postgres MCP|https://github.com/modelcontextprotocol/servers', 'Brave Search MCP|https://github.com/modelcontextprotocol/servers', 'Slack MCP|https://github.com/modelcontextprotocol/servers', 'Notion MCP|https://github.com/makenotion/notion-mcp-server', 'Linear MCP|https://github.com/jerhadf/linear-mcp-server', 'Figma MCP|https://github.com/GLips/Figma-Context-MCP', 'Playwright MCP|https://github.com/microsoft/playwright-mcp', 'Browserbase MCP|https://github.com/browserbase/mcp-server-browserbase', 'Sentry MCP|https://github.com/getsentry/sentry-mcp', 'Cloudflare MCP|https://github.com/cloudflare/mcp-server-cloudflare', 'AWS MCP|https://github.com/awslabs/mcp', 'Google Cloud MCP|https://github.com/GoogleCloudPlatform/mcp', 'Docker MCP Catalog|https://www.docker.com/products/mcp-catalog', 'MCPJam|https://www.mcpjam.com', 'Smithery|https://smithery.ai', 'PulseMCP|https://www.pulsemcp.com'] ],
+ ['developer', ['GitHub|https://github.com', 'GitLab|https://gitlab.com', 'Bitbucket|https://bitbucket.org', 'GitHub Actions|https://github.com/features/actions', 'GitHub Container Registry|https://ghcr.io', 'Docker|https://www.docker.com', 'Kubernetes|https://kubernetes.io', 'Vercel|https://vercel.com', 'Netlify|https://www.netlify.com', 'Cloudflare Workers|https://workers.cloudflare.com', 'Fly.io|https://fly.io', 'Railway|https://railway.app', 'Render|https://render.com', 'Supabase|https://supabase.com', 'Neon|https://neon.tech', 'Turso|https://turso.tech', 'PlanetScale|https://planetscale.com', 'Sentry|https://sentry.io', 'PostHog|https://posthog.com', 'Grafana|https://grafana.com'] ],
+ ['data', ['OpenAI API|https://platform.openai.com', 'Hugging Face|https://huggingface.co', 'Ollama|https://ollama.com', 'LM Studio|https://lmstudio.ai', 'vLLM|https://vllm.ai', 'llama.cpp|https://github.com/ggml-org/llama.cpp', 'Replicate|https://replicate.com', 'Together AI|https://www.together.ai', 'Groq|https://groq.com', 'Cerebras|https://www.cerebras.ai', 'Fireworks AI|https://fireworks.ai', 'Cohere|https://cohere.com', 'Mistral AI|https://mistral.ai', 'Google Gemini API|https://ai.google.dev', 'Perplexity API|https://www.perplexity.ai', 'AssemblyAI|https://www.assemblyai.com', 'Deepgram|https://deepgram.com', 'Qdrant|https://qdrant.tech', 'Weaviate|https://weaviate.io', 'Pinecone|https://www.pinecone.io'] ],
+ ['productivity', ['Slack|https://slack.com', 'Discord|https://discord.com', 'Microsoft Teams|https://www.microsoft.com/microsoft-teams', 'Telegram|https://telegram.org', 'Notion|https://www.notion.so', 'Linear|https://linear.app', 'Jira|https://www.atlassian.com/software/jira', 'Trello|https://trello.com', 'Asana|https://asana.com', 'ClickUp|https://clickup.com', 'Google Drive|https://drive.google.com', 'Dropbox|https://www.dropbox.com', 'OneDrive|https://www.microsoft.com/microsoft-365/onedrive', 'Gmail|https://gmail.com', 'Google Calendar|https://calendar.google.com', 'Microsoft Outlook|https://outlook.live.com', 'Airtable|https://airtable.com', 'HubSpot|https://www.hubspot.com', 'Salesforce|https://www.salesforce.com', 'Intercom|https://www.intercom.com'] ],
+];
+
+const categoryDetails = {
+ automation: ['tools.title'],
+ comms: ['nav.dub'],
+ agents: ['dub.choose_translation_agent'],
+ mcp: ['settings.mcp_title'],
+ developer: ['tools.title'],
+ data: ['engineSidebar.asr'],
+ productivity: ['tools.title'],
+};
+
+export const INTEGRATION_CATALOG = [
+ ...VOICE_AI_DIRECTORY.map((entry) => ({ ...entry, category: 'comms', featured: false })),
+ ...groups.flatMap(([category, items]) => items.map((item) => {
+ const [name, url] = item.split('|');
+ return { name, url, logoUrl: genericLogo, detailKeys: categoryDetails[category], category, featured: false };
+ })),
+];
+
+export function integrationSlug(name) {
+ return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
+}
+
+export function getIntegrationBySlug(slug) {
+ return INTEGRATION_CATALOG.find((entry) => integrationSlug(entry.name) === slug);
+}
diff --git a/frontend/src/config/voice-ai-directory.d.ts b/frontend/src/config/voice-ai-directory.d.ts
new file mode 100644
index 00000000..48b1c068
--- /dev/null
+++ b/frontend/src/config/voice-ai-directory.d.ts
@@ -0,0 +1 @@
+export const VOICE_AI_DIRECTORY: { name: string; url: string; logoUrl: string; detailKeys: string[] }[];
diff --git a/frontend/src/config/voice-ai-directory.js b/frontend/src/config/voice-ai-directory.js
new file mode 100644
index 00000000..825cf7b2
--- /dev/null
+++ b/frontend/src/config/voice-ai-directory.js
@@ -0,0 +1,29 @@
+// Integration directory links, not sponsors, rankings, or connected accounts.
+// Official icon sources and verification links: docs/integration-directory.md.
+import genericLogo from '../assets/integrations/integration-generic.svg';
+import twilioLogo from '../assets/integrations/twilio.png';
+import plivoLogo from '../assets/integrations/plivo.svg';
+import telnyxLogo from '../assets/integrations/telnyx.ico';
+import n8nLogo from '../assets/integrations/n8n.ico';
+import zapierLogo from '../assets/integrations/zapier.ico';
+import githubLogo from '../assets/integrations/github.png';
+import dockerLogo from '../assets/integrations/docker.png';
+import mcpLogo from '../assets/integrations/mcp.png';
+import anthropicLogo from '../assets/integrations/anthropic.png';
+
+export const VOICE_AI_DIRECTORY = [
+ { name: "Twilio", url: "https://www.twilio.com", logoUrl: twilioLogo, detailKeys: ["nav.dub", "settings.mcp_title"] },
+ { name: "Plivo", url: "https://www.plivo.com", logoUrl: plivoLogo, detailKeys: ["nav.dub", "engineSidebar.asr"] },
+ { name: "Telnyx", url: "https://telnyx.com", logoUrl: telnyxLogo, detailKeys: ["nav.dub", "engineSidebar.tts"] },
+ { name: "n8n", url: "https://n8n.io", logoUrl: n8nLogo, detailKeys: ["tools.title", "settings.mcp_title"] },
+ { name: "Zapier", url: "https://zapier.com", logoUrl: zapierLogo, detailKeys: ["tools.title"] },
+ { name: "Make", url: "https://www.make.com", logoUrl: genericLogo, detailKeys: ["tools.title"] },
+ { name: "GitHub", url: "https://github.com", logoUrl: githubLogo, detailKeys: ["tools.title", "settings.mcp_title"] },
+ { name: "GitHub Container Registry", url: "https://ghcr.io", logoUrl: githubLogo, detailKeys: ["tools.title", "settings.mcp_title"] },
+ { name: "Docker", url: "https://www.docker.com", logoUrl: dockerLogo, detailKeys: ["tools.title"] },
+ { name: "Model Context Protocol", url: "https://modelcontextprotocol.io", logoUrl: mcpLogo, detailKeys: ["settings.mcp_title", "tools.title"] },
+ { name: "OpenAI Agents", url: "https://platform.openai.com/docs/guides/agents", logoUrl: genericLogo, detailKeys: ["dub.choose_translation_agent", "settings.mcp_title"] },
+ { name: "Claude Code", url: "https://docs.anthropic.com/en/docs/claude-code", logoUrl: anthropicLogo, detailKeys: ["dub.choose_translation_agent", "tools.title"] },
+ { name: "Codex CLI", url: "https://github.com/openai/codex", logoUrl: genericLogo, detailKeys: ["dub.choose_translation_agent", "tools.title"] },
+ { name: "VoiceStudio API", url: "https://github.com/debpalash/VoiceStudio", logoUrl: genericLogo, detailKeys: ["tools.title", "engineSidebar.tts", "engineSidebar.asr"] },
+];
diff --git a/frontend/src/i18n/locales/ar.json b/frontend/src/i18n/locales/ar.json
index e71ec4c8..884a11d7 100644
--- a/frontend/src/i18n/locales/ar.json
+++ b/frontend/src/i18n/locales/ar.json
@@ -1607,7 +1607,7 @@
"choose_method": "اختر كيفية العطاء",
"choose_method_amount": "المتابعة مع ${{amount}}",
"goal": {
- "title": "صندوق كلود ماكس",
+ "title": "ادعم تطوير VoiceStudio",
"of": "من",
"per_month": "/ شهر",
"aria": "{{raised}} من {{goal}} الهدف الشهري",
@@ -1616,7 +1616,7 @@
"social_proof": "انضم إلى مؤيدي {{count}} الذين يقومون بتمويل الذكاء الاصطناعي المحلي"
},
"postcard": {
- "title": "صندوق كلود ماكس",
+ "title": "ادعم تطوير VoiceStudio",
"lead_default": "سعيد أن عملت! VoiceStudio مجاني ومحلي بالكامل. إذا كان ذلك يوفر عليك الوقت، فستقوم شريحة شهرية صغيرة بتمويل كلود ماكس الذي يقف وراءه.",
"lead_first_clone": "لقد تم استنساخ صوتك الأول – رائع! يعمل VoiceStudio بالكامل على جهازك، ويحافظ دعمك عليه على هذا النحو.",
"lead_tenth_dub": "عشر دبلجة - من الواضح أنك تعمل على تنفيذها. شريحة شهرية صغيرة تمول كلود ماكس الذي يشحن هذه الميزات.",
@@ -2848,5 +2848,39 @@
"progress": "تم التحقق من {{done}} / {{total}} مقطع",
"cancelled": "أُلغي",
"fitting": "ضبط التوقيت"
+ },
+ "sponsorSlot": {
+ "book": "احجز مكانك",
+ "preview": "معاينة الراعي",
+ "message": "علامتك التجارية وموقعك ورسالتك",
+ "email_app": "افتح تطبيق البريد",
+ "copy_email": "نسخ البريد الإلكتروني",
+ "preview_detail": "يمكن أن يظهر هنا شعارك ورابطك ونبذة عنك."
+ },
+ "supportPlans": {
+ "remove": "إزالة شريط الرعاة",
+ "title": "المجاني مقابل Pro",
+ "free": "مجاني",
+ "pro": "Pro",
+ "sponsor_bar": "شريط الرعاة",
+ "visible": "ظاهر",
+ "hideable": "يمكن إخفاؤه",
+ "unavailable": "لم يتم إعداد تفعيل Pro بعد.",
+ "telemetry": "بيانات الاستخدام",
+ "opt_in": "اختيارية وبموافقة مسبقة",
+ "disabled": "معطّلة",
+ "badge": "شارة Pro",
+ "advanced": "أدوات متقدمة",
+ "standard": "قياسية",
+ "included": "مضمّنة"
+ },
+ "integrationCatalog": {
+ "title": "التكاملات",
+ "featured": "مميّز",
+ "description": "اكتشف التكاملات والشركاء المميّزين."
+ },
+ "directoryExamples": {
+ "example": "مثال في الدليل",
+ "notice": "أمثلة في الدليل فقط — ليست جهات راعية أو تكاملات متصلة."
}
}
diff --git a/frontend/src/i18n/locales/de.json b/frontend/src/i18n/locales/de.json
index b5afb85b..7a058460 100644
--- a/frontend/src/i18n/locales/de.json
+++ b/frontend/src/i18n/locales/de.json
@@ -1607,7 +1607,7 @@
"choose_method": "Wählen Sie, wie Sie geben möchten",
"choose_method_amount": "Weiter mit ${{amount}}",
"goal": {
- "title": "Fonds Claude Max",
+ "title": "Unterstütze die Entwicklung von VoiceStudio",
"of": "von",
"per_month": "/ Monat",
"aria": "{{raised}} von {{goal}} Monatsziel",
@@ -1616,7 +1616,7 @@
"social_proof": "Schließen Sie sich den Unterstützern von {{count}} an, die lokale KI finanzieren"
},
"postcard": {
- "title": "Fonds Claude Max",
+ "title": "Unterstütze die Entwicklung von VoiceStudio",
"lead_default": "Ich bin froh, dass das funktioniert hat! VoiceStudio ist kostenlos und vollständig lokal. Wenn es Ihnen Zeit spart, finanziert ein kleiner monatlicher Chip-In den dahinter stehenden Claude Max.",
"lead_first_clone": "Ihr erster Sprachklon ist fertig – schön! VoiceStudio läuft vollständig auf Ihrem Computer und Ihr Support sorgt dafür, dass dies auch so bleibt.",
"lead_tenth_dub": "Nach zehn Dubs – Sie setzen es eindeutig um. Ein kleiner monatlicher Chip-In finanziert den Claude Max, der diese Funktionen bereitstellt.",
@@ -2848,5 +2848,39 @@
"progress": "{{done}} / {{total}} Segmente geprüft",
"cancelled": "Abgebrochen",
"fitting": "Timing anpassen"
+ },
+ "sponsorSlot": {
+ "book": "Platz anfragen",
+ "preview": "Sponsor-Vorschau",
+ "message": "Deine Marke, Website und Nachricht",
+ "email_app": "E-Mail-App öffnen",
+ "copy_email": "E-Mail-Adresse kopieren",
+ "preview_detail": "Hier könnten dein Logo, Link und eine Vorstellung stehen."
+ },
+ "supportPlans": {
+ "remove": "Sponsorenleiste entfernen",
+ "title": "Free und Pro im Vergleich",
+ "free": "Kostenlos",
+ "pro": "Pro",
+ "sponsor_bar": "Sponsorenleiste",
+ "visible": "Sichtbar",
+ "hideable": "Ausblendbar",
+ "unavailable": "Die Pro-Aktivierung ist noch nicht eingerichtet.",
+ "telemetry": "Telemetrie",
+ "opt_in": "Optional, nur mit Zustimmung",
+ "disabled": "Deaktiviert",
+ "badge": "Pro-Abzeichen",
+ "advanced": "Erweiterte Werkzeuge",
+ "standard": "Standard",
+ "included": "Enthalten"
+ },
+ "integrationCatalog": {
+ "title": "Integrationen",
+ "featured": "Hervorgehoben",
+ "description": "Entdecke Integrationen und hervorgehobene Partner."
+ },
+ "directoryExamples": {
+ "example": "Verzeichnisbeispiel",
+ "notice": "Nur Verzeichnisbeispiele — keine Sponsoren oder verbundenen Integrationen."
}
}
diff --git a/frontend/src/i18n/locales/en.json b/frontend/src/i18n/locales/en.json
index 57b149b6..f2c45d0d 100644
--- a/frontend/src/i18n/locales/en.json
+++ b/frontend/src/i18n/locales/en.json
@@ -1882,7 +1882,7 @@
"choose_method": "Choose how to give",
"choose_method_amount": "Continue with ${{amount}}",
"goal": {
- "title": "Fund Claude Max",
+ "title": "Support VoiceStudio development",
"of": "of",
"per_month": "/ month",
"aria": "{{raised}} of {{goal}} monthly goal",
@@ -1891,7 +1891,7 @@
"social_proof": "Join {{count}} supporters funding local AI"
},
"postcard": {
- "title": "Fund Claude Max",
+ "title": "Support VoiceStudio development",
"lead_default": "Glad that worked! VoiceStudio is free and fully local. If it saves you time, a small monthly chip-in funds the Claude Max behind it.",
"lead_first_clone": "Your first voice clone is done — nice! VoiceStudio runs entirely on your machine, and your support keeps it that way.",
"lead_tenth_dub": "Ten dubs in — you're clearly putting it to work. A small monthly chip-in funds the Claude Max that ships these features.",
@@ -3329,5 +3329,39 @@
"progress": "{{done}} / {{total}} segments validated",
"cancelled": "Cancelled",
"fitting": "Adjusting timing"
+ },
+ "sponsorSlot": {
+ "book": "Book your slot",
+ "preview": "Sponsor preview",
+ "message": "Your brand, website & message",
+ "email_app": "Open email app",
+ "copy_email": "Copy email",
+ "preview_detail": "Your logo, link and introduction could appear here."
+ },
+ "supportPlans": {
+ "remove": "Remove sponsor bar",
+ "title": "Free vs Pro",
+ "free": "Free",
+ "pro": "Pro",
+ "sponsor_bar": "Sponsor bar",
+ "visible": "Visible",
+ "hideable": "Can be hidden",
+ "unavailable": "Pro activation is not configured yet.",
+ "telemetry": "Telemetry",
+ "opt_in": "Optional, opt-in",
+ "disabled": "Disabled",
+ "badge": "Pro badge",
+ "advanced": "Advanced tools",
+ "standard": "Standard",
+ "included": "Included"
+ },
+ "integrationCatalog": {
+ "title": "Integrations",
+ "featured": "Featured",
+ "description": "Discover integrations and featured partners."
+ },
+ "directoryExamples": {
+ "example": "Directory example",
+ "notice": "Directory examples only — not sponsors or connected integrations."
}
}
diff --git a/frontend/src/i18n/locales/es.json b/frontend/src/i18n/locales/es.json
index 837fc711..5778642a 100644
--- a/frontend/src/i18n/locales/es.json
+++ b/frontend/src/i18n/locales/es.json
@@ -1607,7 +1607,7 @@
"choose_method": "Elige cómo regalar",
"choose_method_amount": "Continuar con ${{amount}}",
"goal": {
- "title": "Fondo Claude Max",
+ "title": "Apoya el desarrollo de VoiceStudio",
"of": "de",
"per_month": "/ mes",
"aria": "{{raised}} de {{goal}} meta mensual",
@@ -1616,7 +1616,7 @@
"social_proof": "Únase a los partidarios de {{count}} que financian la IA local"
},
"postcard": {
- "title": "Fondo Claude Max",
+ "title": "Apoya el desarrollo de VoiceStudio",
"lead_default": "¡Me alegro de que haya funcionado! VoiceStudio es gratuito y totalmente local. Si le ahorra tiempo, un pequeño aporte mensual financia el Claude Max detrás de él.",
"lead_first_clone": "Tu primer clon de voz está listo, ¡bien! VoiceStudio se ejecuta completamente en su máquina y su soporte lo mantiene así.",
"lead_tenth_dub": "Diez doblajes: claramente lo estás poniendo a funcionar. Un pequeño aporte mensual financia el Claude Max que incluye estas funciones.",
@@ -2848,5 +2848,39 @@
"progress": "{{done}} / {{total}} segmentos validados",
"cancelled": "Cancelado",
"fitting": "Ajustando tiempos"
+ },
+ "sponsorSlot": {
+ "book": "Reserva tu espacio",
+ "preview": "Vista previa del patrocinador",
+ "message": "Tu marca, sitio web y mensaje",
+ "email_app": "Abrir correo",
+ "copy_email": "Copiar correo",
+ "preview_detail": "Aquí podrían aparecer tu logo, enlace y presentación."
+ },
+ "supportPlans": {
+ "remove": "Quitar barra de patrocinadores",
+ "title": "Gratis vs Pro",
+ "free": "Gratis",
+ "pro": "Pro",
+ "sponsor_bar": "Barra de patrocinadores",
+ "visible": "Visible",
+ "hideable": "Se puede ocultar",
+ "unavailable": "La activación de Pro aún no está configurada.",
+ "telemetry": "Telemetría",
+ "opt_in": "Opcional, con consentimiento",
+ "disabled": "Desactivada",
+ "badge": "Insignia Pro",
+ "advanced": "Herramientas avanzadas",
+ "standard": "Estándar",
+ "included": "Incluidas"
+ },
+ "integrationCatalog": {
+ "title": "Integraciones",
+ "featured": "Destacado",
+ "description": "Descubre integraciones y socios destacados."
+ },
+ "directoryExamples": {
+ "example": "Ejemplo del directorio",
+ "notice": "Solo ejemplos del directorio; no son patrocinadores ni integraciones conectadas."
}
}
diff --git a/frontend/src/i18n/locales/fr.json b/frontend/src/i18n/locales/fr.json
index 12ad22d9..9e9af394 100644
--- a/frontend/src/i18n/locales/fr.json
+++ b/frontend/src/i18n/locales/fr.json
@@ -1607,7 +1607,7 @@
"choose_method": "Choisissez comment donner",
"choose_method_amount": "Continuez avec ${{amount}}",
"goal": {
- "title": "Fonds Claude Max",
+ "title": "Soutenez le développement de VoiceStudio",
"of": "de",
"per_month": "/mois",
"aria": "{{raised}} sur {{goal}} objectif mensuel",
@@ -1616,7 +1616,7 @@
"social_proof": "Rejoignez les sympathisants de {{count}} qui financent l'IA locale"
},
"postcard": {
- "title": "Fonds Claude Max",
+ "title": "Soutenez le développement de VoiceStudio",
"lead_default": "Content que ça ait fonctionné ! VoiceStudio est gratuit et entièrement local. Si cela vous fait gagner du temps, une petite contribution mensuelle finance le Claude Max derrière.",
"lead_first_clone": "Votre premier clone de voix est terminé – super ! VoiceStudio fonctionne entièrement sur votre ordinateur et votre assistance le maintient ainsi.",
"lead_tenth_dub": "Dix doublages – vous le mettez clairement à profit. Une petite contribution mensuelle finance le Claude Max qui fournit ces fonctionnalités.",
@@ -2848,5 +2848,39 @@
"progress": "{{done}} / {{total}} segments validés",
"cancelled": "Annulé",
"fitting": "Ajustement du minutage"
+ },
+ "sponsorSlot": {
+ "book": "Réservez votre emplacement",
+ "preview": "Aperçu du sponsor",
+ "message": "Votre marque, site web et message",
+ "email_app": "Ouvrir la messagerie",
+ "copy_email": "Copier l’adresse e-mail",
+ "preview_detail": "Votre logo, lien et présentation pourraient apparaître ici."
+ },
+ "supportPlans": {
+ "remove": "Retirer la barre des sponsors",
+ "title": "Gratuit ou Pro",
+ "free": "Gratuit",
+ "pro": "Pro",
+ "sponsor_bar": "Barre des sponsors",
+ "visible": "Visible",
+ "hideable": "Peut être masquée",
+ "unavailable": "L’activation de Pro n’est pas encore configurée.",
+ "telemetry": "Télémétrie",
+ "opt_in": "Facultative, sur consentement",
+ "disabled": "Désactivée",
+ "badge": "Badge Pro",
+ "advanced": "Outils avancés",
+ "standard": "Standard",
+ "included": "Inclus"
+ },
+ "integrationCatalog": {
+ "title": "Intégrations",
+ "featured": "À la une",
+ "description": "Découvrez les intégrations et les partenaires à la une."
+ },
+ "directoryExamples": {
+ "example": "Exemple du répertoire",
+ "notice": "Exemples uniquement : ni sponsors ni intégrations connectées."
}
}
diff --git a/frontend/src/i18n/locales/hi.json b/frontend/src/i18n/locales/hi.json
index 7c83f671..11789d33 100644
--- a/frontend/src/i18n/locales/hi.json
+++ b/frontend/src/i18n/locales/hi.json
@@ -1607,7 +1607,7 @@
"choose_method": "चुनें कि कैसे देना है",
"choose_method_amount": "${{amount}} के साथ जारी रखें",
"goal": {
- "title": "फंड क्लाउड मैक्स",
+ "title": "VoiceStudio के विकास में सहयोग करें",
"of": "का",
"per_month": "/ महीना",
"aria": "{{raised}} का {{goal}} मासिक लक्ष्य",
@@ -1616,7 +1616,7 @@
"social_proof": "स्थानीय AI को वित्तपोषित करने वाले {{count}} समर्थकों से जुड़ें"
},
"postcard": {
- "title": "फंड क्लाउड मैक्स",
+ "title": "VoiceStudio के विकास में सहयोग करें",
"lead_default": "खुशी है कि यह काम कर गया! ओमनीवॉइस मुफ़्त और पूरी तरह से स्थानीय है। यदि यह आपका समय बचाता है, तो इसके पीछे एक छोटा सा मासिक चिप-इन क्लाउड मैक्स को फंड करता है।",
"lead_first_clone": "आपकी पहली आवाज़ का क्लोन तैयार हो गया है - बढ़िया! ओमनीवॉइस पूरी तरह से आपकी मशीन पर चलता है, और आपका समर्थन इसे उसी तरह बनाए रखता है।",
"lead_tenth_dub": "दस डब - आप स्पष्ट रूप से इसे कार्यान्वित कर रहे हैं। एक छोटा सा मासिक चिप-इन क्लाउड मैक्स को फंड करता है जो इन सुविधाओं को शिप करता है।",
@@ -2848,5 +2848,39 @@
"progress": "{{done}} / {{total}} खंड सत्यापित",
"cancelled": "रद्द किया गया",
"fitting": "समय समायोजित हो रहा है"
+ },
+ "sponsorSlot": {
+ "book": "अपना स्थान बुक करें",
+ "preview": "प्रायोजक पूर्वावलोकन",
+ "message": "आपका ब्रांड, वेबसाइट और संदेश",
+ "email_app": "ईमेल ऐप खोलें",
+ "copy_email": "ईमेल कॉपी करें",
+ "preview_detail": "आपका लोगो, लिंक और परिचय यहाँ दिख सकते हैं।"
+ },
+ "supportPlans": {
+ "remove": "प्रायोजक बार हटाएँ",
+ "title": "मुफ़्त बनाम Pro",
+ "free": "मुफ़्त",
+ "pro": "Pro",
+ "sponsor_bar": "प्रायोजक बार",
+ "visible": "दिखाई देता है",
+ "hideable": "छिपाया जा सकता है",
+ "unavailable": "Pro सक्रियण अभी कॉन्फ़िगर नहीं किया गया है।",
+ "telemetry": "टेलीमेट्री",
+ "opt_in": "वैकल्पिक, सहमति पर",
+ "disabled": "बंद",
+ "badge": "Pro बैज",
+ "advanced": "उन्नत टूल",
+ "standard": "मानक",
+ "included": "शामिल"
+ },
+ "integrationCatalog": {
+ "title": "इंटीग्रेशन",
+ "featured": "विशेष",
+ "description": "इंटीग्रेशन और विशेष साझेदारों को देखें।"
+ },
+ "directoryExamples": {
+ "example": "डायरेक्टरी उदाहरण",
+ "notice": "केवल डायरेक्टरी उदाहरण — प्रायोजक या जुड़े हुए इंटीग्रेशन नहीं।"
}
}
diff --git a/frontend/src/i18n/locales/id.json b/frontend/src/i18n/locales/id.json
index c2aba4c8..8d1b07e3 100644
--- a/frontend/src/i18n/locales/id.json
+++ b/frontend/src/i18n/locales/id.json
@@ -1607,7 +1607,7 @@
"choose_method": "Pilih cara memberi",
"choose_method_amount": "Lanjutkan dengan ${{amount}}",
"goal": {
- "title": "Dana Claude Max",
+ "title": "Dukung pengembangan VoiceStudio",
"of": "dari",
"per_month": "/ bulan",
"aria": "{{raised}} dari {{goal}} sasaran bulanan",
@@ -1616,7 +1616,7 @@
"social_proof": "Bergabunglah dengan pendukung {{count}} yang mendanai AI lokal"
},
"postcard": {
- "title": "Dana Claude Max",
+ "title": "Dukung pengembangan VoiceStudio",
"lead_default": "Senang itu berhasil! VoiceStudio gratis dan sepenuhnya lokal. Jika ini menghemat waktu Anda, chip-in bulanan kecil akan mendanai Claude Max di belakangnya.",
"lead_first_clone": "Klon suara pertama Anda selesai — bagus! VoiceStudio berjalan sepenuhnya di mesin Anda, dan dukungan Anda menjaganya tetap seperti itu.",
"lead_tenth_dub": "Sepuluh sulih suara - Anda jelas berhasil. Chip-in bulanan kecil mendanai Claude Max yang mengirimkan fitur-fitur ini.",
@@ -2848,5 +2848,39 @@
"progress": "{{done}} / {{total}} segmen divalidasi",
"cancelled": "Dibatalkan",
"fitting": "Menyesuaikan waktu"
+ },
+ "sponsorSlot": {
+ "book": "Pesan slot Anda",
+ "preview": "Pratinjau sponsor",
+ "message": "Merek, situs web & pesan Anda",
+ "email_app": "Buka aplikasi email",
+ "copy_email": "Salin email",
+ "preview_detail": "Logo, tautan, dan perkenalan Anda bisa tampil di sini."
+ },
+ "supportPlans": {
+ "remove": "Hapus bilah sponsor",
+ "title": "Gratis vs Pro",
+ "free": "Gratis",
+ "pro": "Pro",
+ "sponsor_bar": "Bilah sponsor",
+ "visible": "Terlihat",
+ "hideable": "Dapat disembunyikan",
+ "unavailable": "Aktivasi Pro belum dikonfigurasi.",
+ "telemetry": "Telemetri",
+ "opt_in": "Opsional, dengan persetujuan",
+ "disabled": "Dinonaktifkan",
+ "badge": "Lencana Pro",
+ "advanced": "Alat lanjutan",
+ "standard": "Standar",
+ "included": "Termasuk"
+ },
+ "integrationCatalog": {
+ "title": "Integrasi",
+ "featured": "Unggulan",
+ "description": "Temukan integrasi dan mitra unggulan."
+ },
+ "directoryExamples": {
+ "example": "Contoh direktori",
+ "notice": "Hanya contoh direktori — bukan sponsor atau integrasi yang terhubung."
}
}
diff --git a/frontend/src/i18n/locales/it.json b/frontend/src/i18n/locales/it.json
index 3419a0b7..e56bf339 100644
--- a/frontend/src/i18n/locales/it.json
+++ b/frontend/src/i18n/locales/it.json
@@ -1607,7 +1607,7 @@
"choose_method": "Scegli come donare",
"choose_method_amount": "Continua con ${{amount}}",
"goal": {
- "title": "Fondo Claude Max",
+ "title": "Sostieni lo sviluppo di VoiceStudio",
"of": "di",
"per_month": "/mese",
"aria": "{{raised}} di {{goal}} obiettivo mensile",
@@ -1616,7 +1616,7 @@
"social_proof": "Unisciti ai sostenitori di {{count}} che finanziano l'intelligenza artificiale locale"
},
"postcard": {
- "title": "Fondo Claude Max",
+ "title": "Sostieni lo sviluppo di VoiceStudio",
"lead_default": "Sono contento che abbia funzionato! VoiceStudio è gratuito e completamente locale. Se ti fa risparmiare tempo, un piccolo chip-in mensile finanzia il Claude Max che sta dietro di esso.",
"lead_first_clone": "Il tuo primo clone vocale è pronto: fantastico! VoiceStudio funziona interamente sul tuo computer e il tuo supporto lo mantiene così.",
"lead_tenth_dub": "Dieci doppiaggi: lo stai chiaramente mettendo in pratica. Un piccolo chip-in mensile finanzia il Claude Max che fornisce queste funzionalità.",
@@ -2848,5 +2848,39 @@
"progress": "{{done}} / {{total}} segmenti convalidati",
"cancelled": "Annullato",
"fitting": "Regolazione dei tempi"
+ },
+ "sponsorSlot": {
+ "book": "Prenota il tuo spazio",
+ "preview": "Anteprima sponsor",
+ "message": "Il tuo marchio, sito e messaggio",
+ "email_app": "Apri l’app email",
+ "copy_email": "Copia email",
+ "preview_detail": "Qui potrebbero apparire il tuo logo, link e presentazione."
+ },
+ "supportPlans": {
+ "remove": "Rimuovi barra sponsor",
+ "title": "Gratis o Pro",
+ "free": "Gratis",
+ "pro": "Pro",
+ "sponsor_bar": "Barra sponsor",
+ "visible": "Visibile",
+ "hideable": "Può essere nascosta",
+ "unavailable": "L’attivazione di Pro non è ancora configurata.",
+ "telemetry": "Telemetria",
+ "opt_in": "Facoltativa, con consenso",
+ "disabled": "Disattivata",
+ "badge": "Badge Pro",
+ "advanced": "Strumenti avanzati",
+ "standard": "Standard",
+ "included": "Inclusi"
+ },
+ "integrationCatalog": {
+ "title": "Integrazioni",
+ "featured": "In evidenza",
+ "description": "Scopri integrazioni e partner in evidenza."
+ },
+ "directoryExamples": {
+ "example": "Esempio di catalogo",
+ "notice": "Solo esempi di catalogo: non sponsor né integrazioni collegate."
}
}
diff --git a/frontend/src/i18n/locales/ja.json b/frontend/src/i18n/locales/ja.json
index 533f3361..8ccdb471 100644
--- a/frontend/src/i18n/locales/ja.json
+++ b/frontend/src/i18n/locales/ja.json
@@ -1607,7 +1607,7 @@
"choose_method": "与え方を選ぶ",
"choose_method_amount": "${{amount}} に進む",
"goal": {
- "title": "クロード・マックス基金",
+ "title": "VoiceStudio の開発を支援",
"of": "の",
"per_month": "/月",
"aria": "月間目標 {{raised}}/{{goal}}",
@@ -1616,7 +1616,7 @@
"social_proof": "{{count}} サポーターに参加してローカル AI に資金を提供しましょう"
},
"postcard": {
- "title": "クロード・マックス基金",
+ "title": "VoiceStudio の開発を支援",
"lead_default": "うまくいってよかったです! VoiceStudio は無料で完全にローカルです。時間を節約できるのであれば、毎月少額のチップインがその背後にいるクロード・マックスに資金を提供します。",
"lead_first_clone": "最初の音声クローンが完成しました。いいですね! VoiceStudio は完全にマシン上で実行され、サポートがその状態を維持します。",
"lead_tenth_dub": "10 個のダブが入っています。明らかに効果を発揮しています。これらの機能を提供する Claude Max には、毎月少額のチップインが資金として提供されます。",
@@ -2848,5 +2848,39 @@
"progress": "{{done}} / {{total}} セグメントを検証済み",
"cancelled": "キャンセル済み",
"fitting": "タイミングを調整中"
+ },
+ "sponsorSlot": {
+ "book": "掲載枠を申し込む",
+ "preview": "スポンサーの表示例",
+ "message": "ブランド名・ウェブサイト・メッセージ",
+ "email_app": "メールアプリを開く",
+ "copy_email": "メールアドレスをコピー",
+ "preview_detail": "ここにロゴ、リンク、紹介文を掲載できます。"
+ },
+ "supportPlans": {
+ "remove": "スポンサー欄を非表示にする",
+ "title": "無料版とProの比較",
+ "free": "無料",
+ "pro": "Pro",
+ "sponsor_bar": "スポンサー欄",
+ "visible": "表示",
+ "hideable": "非表示にできます",
+ "unavailable": "Proの有効化はまだ設定されていません。",
+ "telemetry": "テレメトリ",
+ "opt_in": "任意・同意が必要",
+ "disabled": "無効",
+ "badge": "Proバッジ",
+ "advanced": "高度なツール",
+ "standard": "標準",
+ "included": "利用可能"
+ },
+ "integrationCatalog": {
+ "title": "連携",
+ "featured": "注目",
+ "description": "連携機能と注目のパートナーを見つけましょう。"
+ },
+ "directoryExamples": {
+ "example": "掲載例",
+ "notice": "ディレクトリの掲載例です。スポンサーや接続済みの連携ではありません。"
}
}
diff --git a/frontend/src/i18n/locales/ko.json b/frontend/src/i18n/locales/ko.json
index 0692df2c..d5c37fcb 100644
--- a/frontend/src/i18n/locales/ko.json
+++ b/frontend/src/i18n/locales/ko.json
@@ -1922,7 +1922,7 @@
"choose_method": "주는 방법을 선택하세요",
"choose_method_amount": "${{amount}}로 계속",
"goal": {
- "title": "클로드 맥스 기금",
+ "title": "VoiceStudio 개발 지원",
"of": "중",
"per_month": "/월",
"aria": "{{goal}} 월 목표 중 {{raised}}",
@@ -1931,7 +1931,7 @@
"social_proof": "로컬 AI에 자금을 지원하는 {{count}}명의 후원자와 함께하세요"
},
"postcard": {
- "title": "클로드 맥스 기금",
+ "title": "VoiceStudio 개발 지원",
"lead_default": "효과가 있어서 다행이에요! VoiceStudio는 무료이며 완전히 로컬입니다. 시간을 절약할 수 있다면 매월 소액의 칩인을 통해 Claude Max에 자금을 지원할 수 있습니다.",
"lead_first_clone": "첫 번째 음성 복제가 완료되었습니다. 좋습니다! VoiceStudio는 전적으로 귀하의 컴퓨터에서 실행되며 귀하의 지원은 이를 그대로 유지합니다.",
"lead_tenth_dub": "10개의 더빙이 포함되어 있습니다. 확실히 효과를 발휘하고 계십니다. 이러한 기능을 제공하는 Claude Max에는 매월 소액의 칩인 자금이 지원됩니다.",
@@ -3329,5 +3329,39 @@
"progress": "{{done}} / {{total}}개 구간 검증됨",
"cancelled": "취소됨",
"fitting": "타이밍 조정 중"
+ },
+ "sponsorSlot": {
+ "book": "스폰서 자리 신청",
+ "preview": "스폰서 미리보기",
+ "message": "브랜드, 웹사이트 및 메시지",
+ "email_app": "이메일 앱 열기",
+ "copy_email": "이메일 주소 복사",
+ "preview_detail": "여기에 로고, 링크 및 소개를 표시할 수 있습니다."
+ },
+ "supportPlans": {
+ "remove": "스폰서 바 제거",
+ "title": "무료와 Pro 비교",
+ "free": "무료",
+ "pro": "Pro",
+ "sponsor_bar": "스폰서 바",
+ "visible": "표시됨",
+ "hideable": "숨길 수 있음",
+ "unavailable": "Pro 활성화가 아직 구성되지 않았습니다.",
+ "telemetry": "사용 정보 수집",
+ "opt_in": "선택 사항, 동의 필요",
+ "disabled": "비활성화",
+ "badge": "Pro 배지",
+ "advanced": "고급 도구",
+ "standard": "기본",
+ "included": "포함"
+ },
+ "integrationCatalog": {
+ "title": "연동",
+ "featured": "추천",
+ "description": "연동 기능과 추천 파트너를 살펴보세요."
+ },
+ "directoryExamples": {
+ "example": "디렉터리 예시",
+ "notice": "디렉터리 예시이며 스폰서나 연결된 연동이 아닙니다."
}
}
diff --git a/frontend/src/i18n/locales/nl.json b/frontend/src/i18n/locales/nl.json
index dcb69a07..2d95e347 100644
--- a/frontend/src/i18n/locales/nl.json
+++ b/frontend/src/i18n/locales/nl.json
@@ -1607,7 +1607,7 @@
"choose_method": "Kies hoe u wilt geven",
"choose_method_amount": "Ga verder met ${{amount}}",
"goal": {
- "title": "Fonds Claude Max",
+ "title": "Steun de ontwikkeling van VoiceStudio",
"of": "van",
"per_month": "/ maand",
"aria": "{{raised}} van {{goal}} maanddoel",
@@ -1616,7 +1616,7 @@
"social_proof": "Sluit u aan bij {{count}} supporters die lokale AI financieren"
},
"postcard": {
- "title": "Fonds Claude Max",
+ "title": "Steun de ontwikkeling van VoiceStudio",
"lead_default": "Fijn dat dat werkte! VoiceStudio is gratis en volledig lokaal. Als het u tijd bespaart, financiert een kleine maandelijkse chip-in de Claude Max erachter.",
"lead_first_clone": "Je eerste stemkloon is klaar - leuk! VoiceStudio draait volledig op uw machine, en uw ondersteuning zorgt ervoor dat dit zo blijft.",
"lead_tenth_dub": "Tien dubs erin - je zet het duidelijk aan het werk. Een kleine maandelijkse chip-in financiert de Claude Max die deze functies levert.",
@@ -2848,5 +2848,39 @@
"progress": "{{done}} / {{total}} segmenten gevalideerd",
"cancelled": "Geannuleerd",
"fitting": "Timing aanpassen"
+ },
+ "sponsorSlot": {
+ "book": "Reserveer je plek",
+ "preview": "Sponsorvoorbeeld",
+ "message": "Je merk, website en bericht",
+ "email_app": "E-mailapp openen",
+ "copy_email": "E-mailadres kopiëren",
+ "preview_detail": "Hier kunnen je logo, link en introductie staan."
+ },
+ "supportPlans": {
+ "remove": "Sponsorbalk verwijderen",
+ "title": "Gratis versus Pro",
+ "free": "Gratis",
+ "pro": "Pro",
+ "sponsor_bar": "Sponsorbalk",
+ "visible": "Zichtbaar",
+ "hideable": "Kan worden verborgen",
+ "unavailable": "Pro-activering is nog niet ingesteld.",
+ "telemetry": "Telemetrie",
+ "opt_in": "Optioneel, met toestemming",
+ "disabled": "Uitgeschakeld",
+ "badge": "Pro-badge",
+ "advanced": "Geavanceerde tools",
+ "standard": "Standaard",
+ "included": "Inbegrepen"
+ },
+ "integrationCatalog": {
+ "title": "Integraties",
+ "featured": "Uitgelicht",
+ "description": "Ontdek integraties en uitgelichte partners."
+ },
+ "directoryExamples": {
+ "example": "Directoryvoorbeeld",
+ "notice": "Alleen directoryvoorbeelden — geen sponsors of verbonden integraties."
}
}
diff --git a/frontend/src/i18n/locales/pl.json b/frontend/src/i18n/locales/pl.json
index 069efad8..cf621480 100644
--- a/frontend/src/i18n/locales/pl.json
+++ b/frontend/src/i18n/locales/pl.json
@@ -1607,7 +1607,7 @@
"choose_method": "Wybierz sposób dawania",
"choose_method_amount": "Kontynuuj za pomocą ${{amount}}",
"goal": {
- "title": "Fundusz Claude'a Maxa",
+ "title": "Wesprzyj rozwój VoiceStudio",
"of": "z",
"per_month": "/ miesiąc",
"aria": "{{raised}} z {{goal}} celu miesięcznego",
@@ -1616,7 +1616,7 @@
"social_proof": "Dołącz do {{count}} zwolenników finansujących lokalną sztuczną inteligencję"
},
"postcard": {
- "title": "Fundusz Claude'a Maxa",
+ "title": "Wesprzyj rozwój VoiceStudio",
"lead_default": "Cieszę się, że to zadziałało! Usługa VoiceStudio jest bezpłatna i w pełni lokalna. Jeśli oszczędzi to Twój czas, niewielka miesięczna wpłata sfinansuje stojącego za nim Claude'a Maxa.",
"lead_first_clone": "Twój pierwszy klon głosu jest gotowy — świetnie! VoiceStudio działa całkowicie na Twoim komputerze, a dzięki Twojemu wsparciu tak będzie.",
"lead_tenth_dub": "Dziesięć dubów — wyraźnie to robisz. Niewielki miesięczny wkład finansuje Claude Max, który udostępnia te funkcje.",
@@ -2848,5 +2848,39 @@
"progress": "Zweryfikowano {{done}} / {{total}} segmentów",
"cancelled": "Anulowano",
"fitting": "Dostosowywanie czasu"
+ },
+ "sponsorSlot": {
+ "book": "Zarezerwuj miejsce",
+ "preview": "Podgląd sponsora",
+ "message": "Twoja marka, strona i wiadomość",
+ "email_app": "Otwórz pocztę",
+ "copy_email": "Kopiuj e-mail",
+ "preview_detail": "Tutaj mogą pojawić się Twoje logo, link i opis."
+ },
+ "supportPlans": {
+ "remove": "Usuń pasek sponsorów",
+ "title": "Darmowa a Pro",
+ "free": "Darmowa",
+ "pro": "Pro",
+ "sponsor_bar": "Pasek sponsorów",
+ "visible": "Widoczny",
+ "hideable": "Można ukryć",
+ "unavailable": "Aktywacja Pro nie została jeszcze skonfigurowana.",
+ "telemetry": "Telemetria",
+ "opt_in": "Opcjonalna, za zgodą",
+ "disabled": "Wyłączona",
+ "badge": "Odznaka Pro",
+ "advanced": "Zaawansowane narzędzia",
+ "standard": "Standardowe",
+ "included": "W zestawie"
+ },
+ "integrationCatalog": {
+ "title": "Integracje",
+ "featured": "Wyróżnione",
+ "description": "Odkryj integracje i wyróżnionych partnerów."
+ },
+ "directoryExamples": {
+ "example": "Przykład katalogowy",
+ "notice": "Wyłącznie przykłady katalogowe — nie sponsorzy ani połączone integracje."
}
}
diff --git a/frontend/src/i18n/locales/pt.json b/frontend/src/i18n/locales/pt.json
index c9a609cf..e71887fb 100644
--- a/frontend/src/i18n/locales/pt.json
+++ b/frontend/src/i18n/locales/pt.json
@@ -1607,7 +1607,7 @@
"choose_method": "Escolha como dar",
"choose_method_amount": "Continuar com ${{amount}}",
"goal": {
- "title": "Fundo Claude Max",
+ "title": "Apoie o desenvolvimento do VoiceStudio",
"of": "de",
"per_month": "/mês",
"aria": "{{raised}} da meta mensal de {{goal}}",
@@ -1616,7 +1616,7 @@
"social_proof": "Junte-se a {{count}} apoiadores que financiam IA local"
},
"postcard": {
- "title": "Fundo Claude Max",
+ "title": "Apoie o desenvolvimento do VoiceStudio",
"lead_default": "Que bom que funcionou! VoiceStudio é gratuito e totalmente local. Se você economizar tempo, uma pequena contribuição mensal financiará Claude Max por trás disso.",
"lead_first_clone": "Seu primeiro clone de voz está pronto – ótimo! VoiceStudio é executado inteiramente em sua máquina e seu suporte mantém isso assim.",
"lead_tenth_dub": "Dez dublagens - você está claramente colocando isso para funcionar. Uma pequena contribuição mensal financia o Claude Max que fornece esses recursos.",
@@ -2848,5 +2848,39 @@
"progress": "{{done}} / {{total}} segmentos validados",
"cancelled": "Cancelado",
"fitting": "Ajustando o tempo"
+ },
+ "sponsorSlot": {
+ "book": "Reserve seu espaço",
+ "preview": "Prévia do patrocinador",
+ "message": "Sua marca, site e mensagem",
+ "email_app": "Abrir app de e-mail",
+ "copy_email": "Copiar e-mail",
+ "preview_detail": "Seu logo, link e apresentação podem aparecer aqui."
+ },
+ "supportPlans": {
+ "remove": "Remover barra de patrocinadores",
+ "title": "Grátis vs Pro",
+ "free": "Grátis",
+ "pro": "Pro",
+ "sponsor_bar": "Barra de patrocinadores",
+ "visible": "Visível",
+ "hideable": "Pode ser ocultada",
+ "unavailable": "A ativação do Pro ainda não foi configurada.",
+ "telemetry": "Telemetria",
+ "opt_in": "Opcional, com consentimento",
+ "disabled": "Desativada",
+ "badge": "Selo Pro",
+ "advanced": "Ferramentas avançadas",
+ "standard": "Padrão",
+ "included": "Incluídas"
+ },
+ "integrationCatalog": {
+ "title": "Integrações",
+ "featured": "Destaque",
+ "description": "Descubra integrações e parceiros em destaque."
+ },
+ "directoryExamples": {
+ "example": "Exemplo do diretório",
+ "notice": "Apenas exemplos do diretório — não são patrocinadores nem integrações conectadas."
}
}
diff --git a/frontend/src/i18n/locales/ru.json b/frontend/src/i18n/locales/ru.json
index 08bbb9a1..8a6316c8 100644
--- a/frontend/src/i18n/locales/ru.json
+++ b/frontend/src/i18n/locales/ru.json
@@ -1607,7 +1607,7 @@
"choose_method": "Выберите, как подарить",
"choose_method_amount": "Продолжить с ${{amount}}",
"goal": {
- "title": "Фонд Клода Макса",
+ "title": "Поддержите разработку VoiceStudio",
"of": "из",
"per_month": "/ месяц",
"aria": "{{raised}} из {{goal}} цели на месяц",
@@ -1616,7 +1616,7 @@
"social_proof": "Присоединяйтесь к сторонникам {{count}}, финансирующим местный искусственный интеллект"
},
"postcard": {
- "title": "Фонд Клода Макса",
+ "title": "Поддержите разработку VoiceStudio",
"lead_default": "Рад, что это сработало! VoiceStudio бесплатен и полностью локальный. Если это сэкономит вам время, небольшой ежемесячный взнос пополнит фонд Claude Max, стоящий за этим.",
"lead_first_clone": "Ваш первый голосовой клон готов — отлично! VoiceStudio полностью работает на вашем компьютере, и ваша поддержка поддерживает эту функцию.",
"lead_tenth_dub": "Десять дублей — вы явно прикладываете усилия. Небольшой ежемесячный взнос финансирует Claude Max, который предоставляет эти функции.",
@@ -2848,5 +2848,39 @@
"progress": "Проверено сегментов: {{done}} / {{total}}",
"cancelled": "Отменено",
"fitting": "Настройка времени"
+ },
+ "sponsorSlot": {
+ "book": "Забронировать место",
+ "preview": "Пример спонсорского блока",
+ "message": "Ваш бренд, сайт и сообщение",
+ "email_app": "Открыть почтовое приложение",
+ "copy_email": "Скопировать email",
+ "preview_detail": "Здесь могут появиться ваш логотип, ссылка и описание."
+ },
+ "supportPlans": {
+ "remove": "Убрать панель спонсоров",
+ "title": "Бесплатная версия и Pro",
+ "free": "Бесплатно",
+ "pro": "Pro",
+ "sponsor_bar": "Панель спонсоров",
+ "visible": "Видна",
+ "hideable": "Можно скрыть",
+ "unavailable": "Активация Pro ещё не настроена.",
+ "telemetry": "Телеметрия",
+ "opt_in": "Необязательно, по согласию",
+ "disabled": "Отключена",
+ "badge": "Значок Pro",
+ "advanced": "Расширенные инструменты",
+ "standard": "Стандартные",
+ "included": "Включены"
+ },
+ "integrationCatalog": {
+ "title": "Интеграции",
+ "featured": "Рекомендуемое",
+ "description": "Откройте для себя интеграции и рекомендуемых партнёров."
+ },
+ "directoryExamples": {
+ "example": "Пример в каталоге",
+ "notice": "Только примеры каталога — не спонсоры и не подключённые интеграции."
}
}
diff --git a/frontend/src/i18n/locales/sv.json b/frontend/src/i18n/locales/sv.json
index e3e6460d..c124746f 100644
--- a/frontend/src/i18n/locales/sv.json
+++ b/frontend/src/i18n/locales/sv.json
@@ -1607,7 +1607,7 @@
"choose_method": "Välj hur du ska ge",
"choose_method_amount": "Fortsätt med ${{amount}}",
"goal": {
- "title": "Fond Claude Max",
+ "title": "Stöd utvecklingen av VoiceStudio",
"of": "av",
"per_month": "/ månad",
"aria": "{{raised}} av {{goal}} månadsmål",
@@ -1616,7 +1616,7 @@
"social_proof": "Gå med i {{count}}-supportrar som finansierar lokal AI"
},
"postcard": {
- "title": "Fond Claude Max",
+ "title": "Stöd utvecklingen av VoiceStudio",
"lead_default": "Kul att det fungerade! VoiceStudio är gratis och helt lokalt. Om det sparar tid, finansierar ett litet månatligt chip-in Claude Max bakom det.",
"lead_first_clone": "Din första röstklon är klar – trevligt! VoiceStudio körs helt och hållet på din maskin, och din support håller det så.",
"lead_tenth_dub": "Tio dubbar in — du sätter helt klart igång det. Ett litet månatligt chip-in finansierar Claude Max som levererar dessa funktioner.",
@@ -2848,5 +2848,39 @@
"progress": "{{done}} / {{total}} segment validerade",
"cancelled": "Avbruten",
"fitting": "Justerar tidsplacering"
+ },
+ "sponsorSlot": {
+ "book": "Boka din plats",
+ "preview": "Förhandsvisning för sponsorer",
+ "message": "Ditt varumärke, webbplats och meddelande",
+ "email_app": "Öppna e-postappen",
+ "copy_email": "Kopiera e-postadress",
+ "preview_detail": "Här kan din logotyp, länk och presentation visas."
+ },
+ "supportPlans": {
+ "remove": "Ta bort sponsorfältet",
+ "title": "Gratis jämfört med Pro",
+ "free": "Gratis",
+ "pro": "Pro",
+ "sponsor_bar": "Sponsorfält",
+ "visible": "Synligt",
+ "hideable": "Kan döljas",
+ "unavailable": "Pro-aktivering har inte konfigurerats ännu.",
+ "telemetry": "Telemetri",
+ "opt_in": "Valfritt, med samtycke",
+ "disabled": "Avstängd",
+ "badge": "Pro-märke",
+ "advanced": "Avancerade verktyg",
+ "standard": "Standard",
+ "included": "Ingår"
+ },
+ "integrationCatalog": {
+ "title": "Integrationer",
+ "featured": "Utvald",
+ "description": "Upptäck integrationer och utvalda partner."
+ },
+ "directoryExamples": {
+ "example": "Katalogexempel",
+ "notice": "Endast katalogexempel — inte sponsorer eller anslutna integrationer."
}
}
diff --git a/frontend/src/i18n/locales/th.json b/frontend/src/i18n/locales/th.json
index c16c359c..f13bb688 100644
--- a/frontend/src/i18n/locales/th.json
+++ b/frontend/src/i18n/locales/th.json
@@ -1607,7 +1607,7 @@
"choose_method": "เลือกวิธีการให้",
"choose_method_amount": "ต่อด้วย ${{amount}}",
"goal": {
- "title": "กองทุน Claude Max",
+ "title": "สนับสนุนการพัฒนา VoiceStudio",
"of": "ของ",
"per_month": "/เดือน",
"aria": "{{raised}} จาก {{goal}} เป้าหมายรายเดือน",
@@ -1616,7 +1616,7 @@
"social_proof": "เข้าร่วมกับผู้สนับสนุน {{count}} ที่ให้ทุนสนับสนุน AI ในท้องถิ่น"
},
"postcard": {
- "title": "กองทุน Claude Max",
+ "title": "สนับสนุนการพัฒนา VoiceStudio",
"lead_default": "ดีใจที่ได้ผล! VoiceStudio เป็นบริการฟรีและอยู่ในเครื่องโดยสมบูรณ์ ถ้ามันช่วยคุณประหยัดเวลาได้ เงินสมทบรายเดือนเล็กๆ น้อยๆ ที่ Claude Max อยู่เบื้องหลัง",
"lead_first_clone": "การโคลนเสียงครั้งแรกของคุณเสร็จสิ้นแล้ว เยี่ยมมาก! VoiceStudio ทำงานบนเครื่องของคุณทั้งหมด และฝ่ายสนับสนุนของคุณก็จะเป็นเช่นนั้น",
"lead_tenth_dub": "มีพากย์สิบตอน — คุณเห็นได้ชัดว่ามันใช้งานได้จริง กองทุนรายเดือนเล็กๆ น้อยๆ ของ Claude Max ที่จัดส่งฟีเจอร์เหล่านี้",
@@ -2848,5 +2848,39 @@
"progress": "ตรวจสอบแล้ว {{done}} / {{total}} ช่วง",
"cancelled": "ยกเลิกแล้ว",
"fitting": "กำลังปรับเวลา"
+ },
+ "sponsorSlot": {
+ "book": "จองพื้นที่ของคุณ",
+ "preview": "ตัวอย่างผู้สนับสนุน",
+ "message": "แบรนด์ เว็บไซต์ และข้อความของคุณ",
+ "email_app": "เปิดแอปอีเมล",
+ "copy_email": "คัดลอกอีเมล",
+ "preview_detail": "โลโก้ ลิงก์ และคำแนะนำของคุณอาจปรากฏที่นี่"
+ },
+ "supportPlans": {
+ "remove": "ลบแถบผู้สนับสนุน",
+ "title": "เปรียบเทียบฟรีกับ Pro",
+ "free": "ฟรี",
+ "pro": "Pro",
+ "sponsor_bar": "แถบผู้สนับสนุน",
+ "visible": "แสดง",
+ "hideable": "ซ่อนได้",
+ "unavailable": "ยังไม่ได้ตั้งค่าการเปิดใช้งาน Pro",
+ "telemetry": "ข้อมูลการใช้งาน",
+ "opt_in": "ไม่บังคับ ต้องยินยอมก่อน",
+ "disabled": "ปิดใช้งาน",
+ "badge": "ป้าย Pro",
+ "advanced": "เครื่องมือขั้นสูง",
+ "standard": "มาตรฐาน",
+ "included": "รวมอยู่ด้วย"
+ },
+ "integrationCatalog": {
+ "title": "การเชื่อมต่อ",
+ "featured": "แนะนำ",
+ "description": "ค้นพบการเชื่อมต่อและพันธมิตรแนะนำ"
+ },
+ "directoryExamples": {
+ "example": "ตัวอย่างในไดเรกทอรี",
+ "notice": "เป็นเพียงตัวอย่างในไดเรกทอรี ไม่ใช่ผู้สนับสนุนหรือการเชื่อมต่อที่เปิดใช้"
}
}
diff --git a/frontend/src/i18n/locales/tr.json b/frontend/src/i18n/locales/tr.json
index 3fed2213..b6b90c20 100644
--- a/frontend/src/i18n/locales/tr.json
+++ b/frontend/src/i18n/locales/tr.json
@@ -1607,7 +1607,7 @@
"choose_method": "Nasıl vereceğinizi seçin",
"choose_method_amount": "${{amount}} ile devam et",
"goal": {
- "title": "Claude Max'e fon sağlayın",
+ "title": "VoiceStudio geliştirmelerini destekleyin",
"of": "arasında",
"per_month": "/ ay",
"aria": "{{raised}} / {{goal}} aylık hedef",
@@ -1616,7 +1616,7 @@
"social_proof": "Yerel yapay zekayı finanse eden {{count}} destekçilerine katılın"
},
"postcard": {
- "title": "Claude Max'e fon sağlayın",
+ "title": "VoiceStudio geliştirmelerini destekleyin",
"lead_default": "İşe yaradığına sevindim! VoiceStudio ücretsizdir ve tamamen yereldir. Size zaman kazandıracaksa, aylık küçük bir chip-in, arkasındaki Claude Max'e fon sağlar.",
"lead_first_clone": "İlk ses klonunuz tamamlandı — güzel! VoiceStudio tamamen makinenizde çalışır ve desteğiniz de bu şekilde kalmasını sağlar.",
"lead_tenth_dub": "On dublaj - açıkça işe koyuyorsunuz. Küçük bir aylık chip-in, bu özellikleri sunan Claude Max'e fon sağlıyor.",
@@ -2848,5 +2848,39 @@
"progress": "{{done}} / {{total}} bölüm doğrulandı",
"cancelled": "İptal edildi",
"fitting": "Zamanlama ayarlanıyor"
+ },
+ "sponsorSlot": {
+ "book": "Yerinizi ayırtın",
+ "preview": "Sponsor önizlemesi",
+ "message": "Markanız, web siteniz ve mesajınız",
+ "email_app": "E-posta uygulamasını aç",
+ "copy_email": "E-postayı kopyala",
+ "preview_detail": "Logonuz, bağlantınız ve tanıtımınız burada görünebilir."
+ },
+ "supportPlans": {
+ "remove": "Sponsor çubuğunu kaldır",
+ "title": "Ücretsiz ve Pro",
+ "free": "Ücretsiz",
+ "pro": "Pro",
+ "sponsor_bar": "Sponsor çubuğu",
+ "visible": "Görünür",
+ "hideable": "Gizlenebilir",
+ "unavailable": "Pro etkinleştirmesi henüz yapılandırılmadı.",
+ "telemetry": "Telemetri",
+ "opt_in": "İsteğe bağlı, onay ile",
+ "disabled": "Devre dışı",
+ "badge": "Pro rozeti",
+ "advanced": "Gelişmiş araçlar",
+ "standard": "Standart",
+ "included": "Dahil"
+ },
+ "integrationCatalog": {
+ "title": "Entegrasyonlar",
+ "featured": "Öne çıkan",
+ "description": "Entegrasyonları ve öne çıkan iş ortaklarını keşfedin."
+ },
+ "directoryExamples": {
+ "example": "Dizin örneği",
+ "notice": "Yalnızca dizin örnekleri; sponsor veya bağlı entegrasyon değildir."
}
}
diff --git a/frontend/src/i18n/locales/uk.json b/frontend/src/i18n/locales/uk.json
index 22cfad33..5e23b2cc 100644
--- a/frontend/src/i18n/locales/uk.json
+++ b/frontend/src/i18n/locales/uk.json
@@ -1607,7 +1607,7 @@
"choose_method": "Виберіть, як дарувати",
"choose_method_amount": "Продовжити з ${{amount}}",
"goal": {
- "title": "Фонд Клод Макс",
+ "title": "Підтримайте розробку VoiceStudio",
"of": "з",
"per_month": "/ місяць",
"aria": "{{raised}} з {{goal}} місячної цілі",
@@ -1616,7 +1616,7 @@
"social_proof": "Приєднуйтеся до прихильників {{count}}, які фінансують місцевий ШІ"
},
"postcard": {
- "title": "Фонд Клод Макс",
+ "title": "Підтримайте розробку VoiceStudio",
"lead_default": "Радий, що спрацювало! VoiceStudio є безкоштовним і повністю локальним. Якщо це економить ваш час, невеликий щомісячний внесок фінансує Клода Макса, який стоїть за цим.",
"lead_first_clone": "Ваш перший голосовий клон готовий — чудово! VoiceStudio повністю працює на вашому комп’ютері, і ваша підтримка підтримує його.",
"lead_tenth_dub": "Десять дубляжів — ви явно вводите це в роботу. Невеликий щомісячний внесок фінансує Claude Max, який постачає ці функції.",
@@ -2848,5 +2848,39 @@
"progress": "Перевірено сегментів: {{done}} / {{total}}",
"cancelled": "Скасовано",
"fitting": "Налаштування часу"
+ },
+ "sponsorSlot": {
+ "book": "Забронювати місце",
+ "preview": "Приклад спонсорського блоку",
+ "message": "Ваш бренд, сайт і повідомлення",
+ "email_app": "Відкрити поштовий застосунок",
+ "copy_email": "Скопіювати email",
+ "preview_detail": "Тут можуть з’явитися ваш логотип, посилання та опис."
+ },
+ "supportPlans": {
+ "remove": "Прибрати панель спонсорів",
+ "title": "Безкоштовна версія та Pro",
+ "free": "Безкоштовно",
+ "pro": "Pro",
+ "sponsor_bar": "Панель спонсорів",
+ "visible": "Видима",
+ "hideable": "Можна приховати",
+ "unavailable": "Активацію Pro ще не налаштовано.",
+ "telemetry": "Телеметрія",
+ "opt_in": "Необов’язкова, за згодою",
+ "disabled": "Вимкнена",
+ "badge": "Значок Pro",
+ "advanced": "Розширені інструменти",
+ "standard": "Стандартні",
+ "included": "Включені"
+ },
+ "integrationCatalog": {
+ "title": "Інтеграції",
+ "featured": "Рекомендоване",
+ "description": "Відкрийте інтеграції та рекомендованих партнерів."
+ },
+ "directoryExamples": {
+ "example": "Приклад у каталозі",
+ "notice": "Лише приклади каталогу — не спонсори й не підключені інтеграції."
}
}
diff --git a/frontend/src/i18n/locales/vi.json b/frontend/src/i18n/locales/vi.json
index 73924a2b..b29569ce 100644
--- a/frontend/src/i18n/locales/vi.json
+++ b/frontend/src/i18n/locales/vi.json
@@ -1607,7 +1607,7 @@
"choose_method": "Chọn cách cho đi",
"choose_method_amount": "Tiếp tục với ${{amount}}",
"goal": {
- "title": "Quỹ Claude Max",
+ "title": "Hỗ trợ phát triển VoiceStudio",
"of": "của",
"per_month": "/ tháng",
"aria": "{{raised}} trong số {{goal}} mục tiêu hàng tháng",
@@ -1616,7 +1616,7 @@
"social_proof": "Tham gia cùng những người ủng hộ {{count}} tài trợ cho AI địa phương"
},
"postcard": {
- "title": "Quỹ Claude Max",
+ "title": "Hỗ trợ phát triển VoiceStudio",
"lead_default": "Vui mừng vì nó đã hiệu quả! VoiceStudio là miễn phí và hoàn toàn cục bộ. Nếu việc này giúp bạn tiết kiệm thời gian, một khoản chip-in nhỏ hàng tháng sẽ tài trợ cho Claude Max đằng sau nó.",
"lead_first_clone": "Bản sao giọng nói đầu tiên của bạn đã hoàn tất - thật tuyệt! VoiceStudio chạy hoàn toàn trên máy của bạn và bộ phận hỗ trợ của bạn sẽ duy trì hoạt động đó.",
"lead_tenth_dub": "Mười bản lồng tiếng - rõ ràng bạn đang thực hiện nó. Một khoản chip-in nhỏ hàng tháng sẽ tài trợ cho Claude Max cung cấp các tính năng này.",
@@ -2848,5 +2848,39 @@
"progress": "Đã xác thực {{done}} / {{total}} đoạn",
"cancelled": "Đã hủy",
"fitting": "Đang điều chỉnh thời gian"
+ },
+ "sponsorSlot": {
+ "book": "Đặt vị trí của bạn",
+ "preview": "Xem trước nhà tài trợ",
+ "message": "Thương hiệu, trang web và lời nhắn",
+ "email_app": "Mở ứng dụng email",
+ "copy_email": "Sao chép email",
+ "preview_detail": "Logo, liên kết và phần giới thiệu của bạn có thể xuất hiện ở đây."
+ },
+ "supportPlans": {
+ "remove": "Xóa thanh nhà tài trợ",
+ "title": "Miễn phí và Pro",
+ "free": "Miễn phí",
+ "pro": "Pro",
+ "sponsor_bar": "Thanh nhà tài trợ",
+ "visible": "Hiển thị",
+ "hideable": "Có thể ẩn",
+ "unavailable": "Chưa cấu hình kích hoạt Pro.",
+ "telemetry": "Dữ liệu sử dụng",
+ "opt_in": "Tùy chọn, cần đồng ý",
+ "disabled": "Tắt",
+ "badge": "Huy hiệu Pro",
+ "advanced": "Công cụ nâng cao",
+ "standard": "Tiêu chuẩn",
+ "included": "Bao gồm"
+ },
+ "integrationCatalog": {
+ "title": "Tích hợp",
+ "featured": "Nổi bật",
+ "description": "Khám phá các tích hợp và đối tác nổi bật."
+ },
+ "directoryExamples": {
+ "example": "Ví dụ trong danh mục",
+ "notice": "Chỉ là ví dụ trong danh mục, không phải nhà tài trợ hay tích hợp đã kết nối."
}
}
diff --git a/frontend/src/i18n/locales/zh-CN.json b/frontend/src/i18n/locales/zh-CN.json
index 51a7f706..ae47528b 100644
--- a/frontend/src/i18n/locales/zh-CN.json
+++ b/frontend/src/i18n/locales/zh-CN.json
@@ -1874,7 +1874,7 @@
"choose_method": "选择捐赠方式",
"choose_method_amount": "继续 ${{amount}}",
"goal": {
- "title": "Claude Max 基金",
+ "title": "支持 VoiceStudio 开发",
"of": "已筹 / 目标",
"per_month": "/月",
"aria": "每月目标 {{goal}},已筹 {{raised}}",
@@ -1883,7 +1883,7 @@
"social_proof": "加入 {{count}} 位支持本地 AI 的支持者"
},
"postcard": {
- "title": "Claude Max 基金",
+ "title": "支持 VoiceStudio 开发",
"lead_default": "很高兴它对你有用!VoiceStudio 免费且完全本地运行。如果它能节省你的时间,每月一小笔赞助就能支撑其背后的 Claude Max。",
"lead_first_clone": "你的第一次声音克隆已完成——太好了!VoiceStudio 完全在你的电脑上运行,你的支持让它保持如此。",
"lead_tenth_dub": "十次配音——你显然正在让它发挥作用。每月一小笔赞助为这些功能背后的 Claude Max 提供资金。",
@@ -3329,5 +3329,39 @@
"progress": "已验证 {{done}} / {{total}} 个片段",
"cancelled": "已取消",
"fitting": "正在调整时间"
+ },
+ "sponsorSlot": {
+ "book": "预订展示位",
+ "preview": "赞助商展示预览",
+ "message": "您的品牌、网站和留言",
+ "email_app": "打开邮件应用",
+ "copy_email": "复制邮箱",
+ "preview_detail": "这里可以展示您的标志、链接和介绍。"
+ },
+ "supportPlans": {
+ "remove": "移除赞助商栏",
+ "title": "免费版与 Pro 对比",
+ "free": "免费版",
+ "pro": "Pro",
+ "sponsor_bar": "赞助商栏",
+ "visible": "显示",
+ "hideable": "可隐藏",
+ "unavailable": "尚未配置 Pro 激活。",
+ "telemetry": "遥测",
+ "opt_in": "可选,需主动同意",
+ "disabled": "已禁用",
+ "badge": "Pro 徽章",
+ "advanced": "高级工具",
+ "standard": "标准",
+ "included": "包含"
+ },
+ "integrationCatalog": {
+ "title": "集成",
+ "featured": "精选",
+ "description": "探索集成与精选合作伙伴。"
+ },
+ "directoryExamples": {
+ "example": "目录示例",
+ "notice": "仅为目录示例,并非赞助商或已连接的集成。"
}
}
diff --git a/frontend/src/i18n/locales/zh-TW.json b/frontend/src/i18n/locales/zh-TW.json
index 35f65ae7..2b9eeabe 100644
--- a/frontend/src/i18n/locales/zh-TW.json
+++ b/frontend/src/i18n/locales/zh-TW.json
@@ -1607,7 +1607,7 @@
"choose_method": "選擇如何給予",
"choose_method_amount": "繼續 ${{amount}}",
"goal": {
- "title": "克勞德馬克斯基金",
+ "title": "支持 VoiceStudio 開發",
"of": "的",
"per_month": "/月",
"aria": "{{raised}} 每月目標 {{goal}}",
@@ -1616,7 +1616,7 @@
"social_proof": "加入資助本地人工智慧的 {{count}} 支持者"
},
"postcard": {
- "title": "克勞德馬克斯基金",
+ "title": "支持 VoiceStudio 開發",
"lead_default": "很高興這有效! VoiceStudio 是免費的並且完全本地化。如果可以節省您的時間,每月只需投入一小筆資金即可資助其背後的 Claude Max。",
"lead_first_clone": "你的第一個聲音克隆已經完成——太好了! VoiceStudio 完全在您的電腦上運行,並且您的支援使其保持這種狀態。",
"lead_tenth_dub": "十次配音——你顯然正在讓它發揮作用。每月一小筆資金為 Claude Max 提供這些功能的資金。",
@@ -2848,5 +2848,39 @@
"progress": "已驗證 {{done}} / {{total}} 個片段",
"cancelled": "已取消",
"fitting": "正在調整時間"
+ },
+ "sponsorSlot": {
+ "book": "預訂展示位",
+ "preview": "贊助商展示預覽",
+ "message": "您的品牌、網站和留言",
+ "email_app": "開啟郵件應用程式",
+ "copy_email": "複製信箱",
+ "preview_detail": "這裡可以展示您的標誌、連結和介紹。"
+ },
+ "supportPlans": {
+ "remove": "移除贊助商列",
+ "title": "免費版與 Pro 比較",
+ "free": "免費版",
+ "pro": "Pro",
+ "sponsor_bar": "贊助商列",
+ "visible": "顯示",
+ "hideable": "可隱藏",
+ "unavailable": "尚未設定 Pro 啟用。",
+ "telemetry": "遙測",
+ "opt_in": "可選,需主動同意",
+ "disabled": "已停用",
+ "badge": "Pro 徽章",
+ "advanced": "進階工具",
+ "standard": "標準",
+ "included": "包含"
+ },
+ "integrationCatalog": {
+ "title": "整合",
+ "featured": "精選",
+ "description": "探索整合與精選合作夥伴。"
+ },
+ "directoryExamples": {
+ "example": "目錄範例",
+ "notice": "僅為目錄範例,並非贊助商或已連接的整合。"
}
}
diff --git a/frontend/src/index.css b/frontend/src/index.css
index 065a45d8..08c3c3da 100644
--- a/frontend/src/index.css
+++ b/frontend/src/index.css
@@ -5279,7 +5279,7 @@ button.dub-stepper__action:focus-visible {
/* ═══ from src/components/donate/DonateGoal.css ═══ */
/* ════════════════════════════════════════════════════════════════════════
- "Fund Claude Max" goal bar + Pip mascot (spec 007).
+ "Support VoiceStudio development" goal bar + Pip mascot (spec 007).
Reuses real design tokens from index.css / tokens.css:
--chrome-*, --space-*, --ease-spring, --font-serif, --chrome-font-mono.
════════════════════════════════════════════════════════════════════════ */
@@ -5409,7 +5409,7 @@ button.dub-stepper__action:focus-visible {
/* ═══ from src/components/donate/Postcard.css ═══ */
/* ════════════════════════════════════════════════════════════════════════
- "Fund Claude Max" kawaii postcard toast (spec 007, Phase 2).
+ "Support VoiceStudio development" kawaii postcard toast (spec 007, Phase 2).
Non-blocking — lives in the toast layer, no backdrop, never covers results.
Uses real tokens: --chrome-*, --space-*, --ease-spring, --z-toast.
════════════════════════════════════════════════════════════════════════ */
diff --git a/frontend/src/pages/SupportPage.jsx b/frontend/src/pages/SupportPage.jsx
index 0379e9ba..79ea605c 100644
--- a/frontend/src/pages/SupportPage.jsx
+++ b/frontend/src/pages/SupportPage.jsx
@@ -1,6 +1,8 @@
import React, { useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import {
+ Coffee,
+ CreditCard,
Heart,
ExternalLink,
ArrowLeft,
@@ -37,8 +39,8 @@ const SUGGESTED_AMOUNTS = [
];
const METHODS = [
- { id: 'kofi', label: 'Ko-fi', url: KOFI_URL, icon: '☕' },
- { id: 'paypal', label: 'PayPal', url: PAYPAL_URL, icon: '💳' },
+ { id: 'kofi', label: 'Ko-fi', url: KOFI_URL, icon: },
+ { id: 'paypal', label: 'PayPal', url: PAYPAL_URL, icon: },
];
// Donate/support accent tracks the themed brand token (per-[data-theme]) so the
@@ -60,9 +62,9 @@ function LinkCard({ icon, label, hue, onClick }) {
type="button"
onClick={onClick}
style={{ '--card-hue': hue }}
- className="flex min-h-10 w-full items-center gap-2.5 overflow-hidden rounded-md border border-border bg-transparent px-3 py-2 text-left transition-colors hover:border-transparent hover:bg-[color-mix(in_srgb,var(--card-hue)_6%,transparent)]"
+ className="group flex min-h-14 w-full items-center gap-3 overflow-hidden rounded-xl border border-border bg-transparent px-3 py-2 text-left motion-safe:transition-all motion-safe:duration-200 motion-safe:hover:-translate-y-0.5 motion-safe:active:translate-y-0 focus-visible:outline-2 focus-visible:outline-[var(--color-brand)] hover:border-transparent hover:bg-[color-mix(in_srgb,var(--card-hue)_6%,transparent)]"
>
-
+
{icon}
@@ -230,12 +232,12 @@ function SupportView() {
}, []);
return (
-
-
-
+
+
+
@@ -244,9 +246,9 @@ function SupportView() {
-
+
-
+
@@ -272,7 +274,7 @@ function SupportView() {
: a.label
}
onClick={() => setAmount(selected ? null : a.value)}
- className={`flex min-h-10 items-center justify-center rounded-md border px-1.5 py-1.5 transition-colors ${
+ className={`flex min-h-12 items-center justify-center rounded-xl border px-1.5 py-1.5 motion-safe:transition-all motion-safe:duration-200 motion-safe:active:scale-95 ${
selected
? 'border-[var(--chrome-accent)] bg-[var(--chrome-accent-bg)]'
: `${a.common ? 'border-transparent' : 'border-border'} hover:border-transparent hover:bg-[color-mix(in_srgb,var(--chrome-accent)_7%,transparent)]`
@@ -288,7 +290,7 @@ function SupportView() {
type="button"
aria-pressed={amount === 'custom'}
onClick={() => setAmount(amount === 'custom' ? null : 'custom')}
- className={`flex min-h-10 items-center justify-center rounded-md border px-1.5 py-1.5 transition-colors ${
+ className={`flex min-h-12 items-center justify-center rounded-xl border px-1.5 py-1.5 motion-safe:transition-all motion-safe:duration-200 motion-safe:active:scale-95 ${
amount === 'custom'
? 'border-[var(--chrome-accent)] bg-[var(--chrome-accent-bg)]'
: 'border-border hover:border-transparent hover:bg-[color-mix(in_srgb,var(--chrome-accent)_7%,transparent)]'
@@ -471,7 +473,7 @@ export default function SupportPage({ onBack, initialView = 'support' }) {
id={`support-${view === 'license' ? 'license' : view === 'contact' ? 'contact' : 'give'}`}
role="tabpanel"
aria-label={panelLabel}
- className="relative z-[1] mx-auto flex min-h-0 w-full max-w-[820px] flex-1 flex-col justify-center overflow-y-auto px-6 py-3"
+ className="relative z-[1] mx-auto flex min-h-0 w-full max-w-[900px] flex-1 flex-col overflow-y-auto px-6 py-8"
key={view}
>
{view === 'support' ? (
diff --git a/frontend/src/store/donationSlice.ts b/frontend/src/store/donationSlice.ts
index e09dc36a..7d337bb3 100644
--- a/frontend/src/store/donationSlice.ts
+++ b/frontend/src/store/donationSlice.ts
@@ -1,5 +1,5 @@
/**
- * Donation prompt slice — the "Fund Claude Max" kawaii postcard state machine
+ * Donation prompt slice — the "Support VoiceStudio development" kawaii postcard state machine
* (spec 007, Phase 2/3).
*
* NOTE (footer donation moments): the postcard UI and its call sites were
diff --git a/scripts/capture-readme-electron.mjs b/scripts/capture-readme-electron.mjs
new file mode 100644
index 00000000..4aacebf8
--- /dev/null
+++ b/scripts/capture-readme-electron.mjs
@@ -0,0 +1,50 @@
+/** Capture the real Electron renderer in an isolated, read-only browser context.
+ * Run against `cd electron && bun run dev`; no user workspace state is changed.
+ * CHROMIUM_PATH can select an installed Chromium binary.
+ */
+import { chromium } from 'playwright';
+import { mkdir } from 'node:fs/promises';
+import { resolve } from 'node:path';
+const base = process.env.VOICESTUDIO_CAPTURE_URL || 'http://localhost:3902';
+const output = resolve('docs/media/electron');
+await mkdir(output, { recursive: true });
+const browser = await chromium.launch({ headless: true, ...(process.env.CHROMIUM_PATH ? { executablePath: process.env.CHROMIUM_PATH } : {}) });
+const context = await browser.newContext({ viewport: { width: 1440, height: 960 }, deviceScaleFactor: 1, colorScheme: 'dark', recordVideo: { dir: '/tmp/voicestudio-readme-video', size: { width: 1440, height: 960 } } });
+await context.addInitScript(() => {
+ localStorage.setItem('voicestudio.setup.complete.v1', '1');
+ localStorage.setItem('voicestudio.theme.v2', JSON.stringify({mode:'dark',light:'default',dark:'default'}));
+ localStorage.setItem('voicestudio.clone.settings.v1', JSON.stringify({selectedProfileId:'demo0001',text:'Every voice has a story. Bring yours to life with VoiceStudio — created on your machine, in your own way.'}));
+ localStorage.setItem('omnivoice.demoClonePrompted', '1');
+});
+// Capture only bundled demo voices; never publish personal voices or project history.
+await context.route('**/api/**', async route => {
+ const request = route.request();
+ const path = new URL(request.url()).pathname;
+ if (request.method() !== 'GET') return route.abort();
+ if (path === '/api/profiles') {
+ const response = await route.fetch();
+ return route.fulfill({ response, json: (await response.json()).filter(profile => profile.id === 'demo0001') });
+ }
+ if (['/api/history','/api/projects','/api/transcriptions'].includes(path)) return route.fulfill({json:[]});
+ return route.continue();
+});
+const page = await context.newPage();
+try {
+ await page.goto(`${base}/#/clone`);
+ await page.getByRole('heading', {name:'Voice cloning', exact:true}).waitFor();
+ await page.waitForTimeout(2500);
+ await page.screenshot({path:resolve(output,'voice-cloning.png')});
+ for (const [route, file] of [['/design','voice-design'],['/dub','dubbing'],['/settings/models','models']]) {
+ await page.evaluate(route => {location.hash=route;},route);
+ await page.waitForTimeout(1800);
+ if (route === '/dub') {
+ await page.getByRole('button', {name:'Play',exact:true}).first().click();
+ await page.waitForTimeout(2200);
+ }
+ await page.screenshot({path:resolve(output,`${file}.png`)});
+ console.log(file, (await page.locator('h1,h2').allTextContents()).slice(0,5));
+ }
+ await page.evaluate(()=>{location.hash='/clone';});
+ await page.waitForTimeout(1800);
+ console.log('Video:',await page.video().path());
+} finally { await context.close(); await browser.close(); }