docs: refresh Electron showcase and packaging prep
@@ -0,0 +1,115 @@
|
||||
name: Electron packaging rehearsal
|
||||
|
||||
# Explicitly artifact-only: no tag, schedule, release, or publishing permission.
|
||||
on:
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
concurrency:
|
||||
group: electron-rehearsal-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
package:
|
||||
runs-on: ${{ matrix.runner }}
|
||||
timeout-minutes: 60
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- runner: ubuntu-24.04
|
||||
platform: linux
|
||||
arch: x64
|
||||
target: x86_64-unknown-linux-gnu
|
||||
flags: --linux --x64
|
||||
- runner: windows-2022
|
||||
platform: win32
|
||||
arch: x64
|
||||
target: x86_64-pc-windows-msvc
|
||||
flags: --win --x64
|
||||
- runner: macos-15
|
||||
platform: darwin
|
||||
arch: arm64
|
||||
target: aarch64-apple-darwin
|
||||
flags: --mac --arm64
|
||||
- runner: macos-15-intel
|
||||
platform: darwin
|
||||
arch: x64
|
||||
target: x86_64-apple-darwin
|
||||
flags: --mac --x64
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
env:
|
||||
VOICESTUDIO_RUST_TARGET: ${{ matrix.target }}
|
||||
VOICESTUDIO_UPDATE_CHANNEL: electron-preview-${{ matrix.platform }}-${{ matrix.arch }}
|
||||
CSC_IDENTITY_AUTO_DISCOVERY: 'false'
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '22'
|
||||
- uses: oven-sh/setup-bun@v2
|
||||
with:
|
||||
bun-version: '1.4.2'
|
||||
- uses: dtolnay/rust-toolchain@stable
|
||||
with:
|
||||
targets: ${{ matrix.target }}
|
||||
- uses: Swatinem/rust-cache@v2
|
||||
with:
|
||||
workspaces: native/desktop-bridge -> target
|
||||
key: electron-${{ matrix.target }}
|
||||
- uses: astral-sh/setup-uv@v6
|
||||
with:
|
||||
version: '0.12.13'
|
||||
enable-cache: false
|
||||
- name: Linux native dependencies
|
||||
if: runner.os == 'Linux'
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y libasound2-dev libxdo-dev libxtst-dev libx11-dev libxkbcommon-dev libwayland-dev libssl-dev pkg-config xvfb
|
||||
- name: Bundle pinned uv for the host architecture
|
||||
run: |
|
||||
node --input-type=module <<'NODE'
|
||||
import { execFileSync } from 'node:child_process';
|
||||
import { mkdirSync, copyFileSync, chmodSync } from 'node:fs';
|
||||
import { join } from 'node:path';
|
||||
const expected = process.env.VOICESTUDIO_RUST_TARGET;
|
||||
const targets = { 'linux-x64': 'x86_64-unknown-linux-gnu', 'win32-x64': 'x86_64-pc-windows-msvc', 'darwin-arm64': 'aarch64-apple-darwin', 'darwin-x64': 'x86_64-apple-darwin' };
|
||||
if (targets[`${process.platform}-${process.arch}`] !== expected) throw new Error('Runner architecture does not match package target');
|
||||
const source = execFileSync(process.platform === 'win32' ? 'where.exe' : 'which', ['uv'], { encoding: 'utf8' }).trim().split(/\r?\n/)[0];
|
||||
const dir = 'frontend/src-tauri/binaries';
|
||||
mkdirSync(dir, { recursive: true });
|
||||
const destination = join(dir, `uv-${expected}${process.platform === 'win32' ? '.exe' : ''}`);
|
||||
copyFileSync(source, destination);
|
||||
if (process.platform !== 'win32') chmodSync(destination, 0o755);
|
||||
NODE
|
||||
- name: Install locked dependencies
|
||||
run: bun install --frozen-lockfile
|
||||
- name: Validate and build Electron
|
||||
run: bun run check:electron
|
||||
- name: Package without publishing
|
||||
working-directory: electron
|
||||
run: |
|
||||
bun x electron-builder --config electron-builder.config.mjs ${{ matrix.flags }} --publish never
|
||||
node tests/packaging-contract.mjs --artifact
|
||||
node tests/update-package-contract.mjs --platform ${{ matrix.platform }} --arch ${{ matrix.arch }}
|
||||
- name: Packaged startup smoke test
|
||||
working-directory: electron
|
||||
run: |
|
||||
if [ "$RUNNER_OS" = Linux ]; then
|
||||
xvfb-run -a node tests/packaged-smoke.mjs --setup
|
||||
else
|
||||
node tests/packaged-smoke.mjs --setup
|
||||
fi
|
||||
- name: Save installers and updater metadata for review
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: electron-rehearsal-${{ matrix.platform }}-${{ matrix.arch }}
|
||||
retention-days: 14
|
||||
if-no-files-found: error
|
||||
path: |
|
||||
electron/release/VoiceStudio-Electron-*
|
||||
electron/release/electron-*.yml
|
||||
@@ -1,9 +1,10 @@
|
||||
<div align="center">
|
||||
<img src="docs/logo.png" alt="VoiceStudio" width="88" />
|
||||
<h1>VoiceStudio</h1>
|
||||
<p><strong>Your voices. Your stories. Your machine.</strong></p>
|
||||
<p><strong>Open source voice cloning and workflow engine. Build local.</strong></p>
|
||||
<p>Clone voices, dub videos, dictate, and create audiobooks with local AI.</p>
|
||||
<p>
|
||||
<a href="https://voicestudio.sh/?utm_source=github&utm_medium=readme&utm_campaign=project">Website</a> ·
|
||||
<a href="https://github.com/debpalash/VoiceStudio/releases/latest">Download</a> ·
|
||||
<a href="#get-started">Get started</a> ·
|
||||
<a href="#documentation">Docs</a> ·
|
||||
@@ -19,7 +20,7 @@
|
||||
|
||||

|
||||
|
||||
<p align="center"><sub>The new Electron desktop UI, captured from this branch with the bundled demo voice. Release builds may look different.</sub></p>
|
||||
<p align="center"><sub>Captured from the running Electron preview with the bundled demo voice. Published installers may look different.</sub></p>
|
||||
|
||||
## Create with VoiceStudio
|
||||
|
||||
@@ -39,6 +40,11 @@ Local workflows run on your hardware. Remote services are optional; usage analyt
|
||||
<td><img src="docs/media/electron/dubbing.png" alt="Electron video dubbing workspace" width="100%" /></td>
|
||||
</tr>
|
||||
<tr><td align="center">Voice cloning</td><td align="center">Video dubbing</td></tr>
|
||||
<tr>
|
||||
<td><img src="docs/media/electron/voice-design.png" alt="Describe a voice in the Electron voice design workspace" width="100%" /></td>
|
||||
<td><img src="docs/media/electron/models.png" alt="Install and manage local speech models" width="100%" /></td>
|
||||
</tr>
|
||||
<tr><td align="center">Voice design</td><td align="center">Local models</td></tr>
|
||||
</table>
|
||||
|
||||
## Get started
|
||||
@@ -76,6 +82,8 @@ Agent skills: `npx skills add debpalash/VoiceStudio`
|
||||
|
||||
[Ko-fi](https://ko-fi.com/debpalash) · [PayPal](https://paypal.me/palashCoder) · [Sponsor the project](SPONSORS.md) · [Partnerships](mailto:partner@voicestudio.sh)
|
||||
|
||||
**Put your brand where people build with voice.** Explore paid placements in the app footer, integrations directory, documentation, and README. [Apply to partner](https://forms.gle/2PYCvd39hbwijzX37) or [email us](mailto:partner@voicestudio.sh).
|
||||
|
||||
## License & responsible use
|
||||
|
||||
[AGPL-3.0](LICENSE). Models have their own licenses; review them before commercial use. Clone voices only with permission. See [license details](LICENSE-NOTICE.md).
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<div align="center">
|
||||
<img src="docs/logo.png" alt="VoiceStudio" width="88" />
|
||||
<h1>VoiceStudio</h1>
|
||||
<p><strong>你的声音,你的故事,在你的电脑上创作。</strong></p>
|
||||
<p><strong>开源声音克隆与工作流引擎。在本地构建。</strong></p>
|
||||
<p>使用本地 AI 克隆声音、翻译配音、语音听写和制作有声书。</p>
|
||||
<p>
|
||||
<a href="https://github.com/debpalash/VoiceStudio/releases/latest">下载</a> ·
|
||||
@@ -32,6 +32,11 @@
|
||||
<td><img src="docs/media/electron/dubbing.png" alt="Electron 视频配音工作区" width="100%" /></td>
|
||||
</tr>
|
||||
<tr><td align="center">声音克隆</td><td align="center">视频配音</td></tr>
|
||||
<tr>
|
||||
<td><img src="docs/media/electron/voice-design.png" alt="Electron 声音设计工作区" width="100%" /></td>
|
||||
<td><img src="docs/media/electron/models.png" alt="本地语音模型管理" width="100%" /></td>
|
||||
</tr>
|
||||
<tr><td align="center">声音设计</td><td align="center">本地模型</td></tr>
|
||||
</table>
|
||||
|
||||
## 开始使用
|
||||
@@ -69,6 +74,8 @@ bun run dev
|
||||
|
||||
[Ko-fi](https://ko-fi.com/debpalash) · [PayPal](https://paypal.me/palashCoder) · [赞助项目](SPONSORS.md) · [商务合作](mailto:partner@voicestudio.sh)
|
||||
|
||||
**让语音应用开发者看到你的品牌。** 了解应用底部栏、集成目录、文档和 README 的付费展示合作。[申请合作](https://forms.gle/2PYCvd39hbwijzX37)或[发送邮件](mailto:partner@voicestudio.sh)。
|
||||
|
||||
## 许可与负责任使用
|
||||
|
||||
应用采用 [AGPL-3.0](LICENSE) 许可。模型遵循各自的许可,商用前请确认其条款。克隆声音前须取得本人许可。详见[许可说明](LICENSE-NOTICE.md)。
|
||||
|
||||
|
Before Width: | Height: | Size: 158 KiB After Width: | Height: | Size: 154 KiB |
|
Before Width: | Height: | Size: 99 KiB After Width: | Height: | Size: 106 KiB |
|
Before Width: | Height: | Size: 124 KiB After Width: | Height: | Size: 132 KiB |
|
Before Width: | Height: | Size: 3.1 MiB After Width: | Height: | Size: 3.4 MiB |
@@ -75,6 +75,9 @@
|
||||
color: var(--muted-foreground);
|
||||
}
|
||||
.sponsor-book-tile {
|
||||
position: relative;
|
||||
isolation: isolate;
|
||||
overflow: hidden;
|
||||
width: 190px;
|
||||
min-width: 190px;
|
||||
border: 1px dashed color-mix(in srgb, var(--primary) 48%, var(--border));
|
||||
@@ -82,9 +85,36 @@
|
||||
color: var(--muted-foreground);
|
||||
font-size: 12px;
|
||||
}
|
||||
.sponsor-book-tile::before {
|
||||
position: absolute;
|
||||
z-index: -1;
|
||||
inset: -85% -45%;
|
||||
content: '';
|
||||
opacity: 0;
|
||||
background:
|
||||
radial-gradient(ellipse at 20% 40%, color-mix(in srgb, var(--primary) 30%, transparent), transparent 50%),
|
||||
repeating-radial-gradient(ellipse at 0% 100%, transparent 0 12px, color-mix(in srgb, var(--primary) 22%, transparent) 13px 15px, transparent 16px 28px);
|
||||
transform: translateX(-12%) rotate(-5deg);
|
||||
transition: opacity 180ms ease;
|
||||
}
|
||||
.sponsor-book-tile > * { position: relative; z-index: 1; }
|
||||
.sponsor-book-tile:hover::before,
|
||||
.sponsor-book-tile:focus-visible::before {
|
||||
opacity: 1;
|
||||
animation: sponsor-book-waves 1.8s ease-in-out infinite alternate;
|
||||
}
|
||||
@keyframes sponsor-book-waves {
|
||||
from { transform: translateX(-12%) rotate(-5deg) scale(1); }
|
||||
to { transform: translateX(12%) rotate(5deg) scale(1.08); }
|
||||
}
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.sponsor-book-tile::before { transition: none; }
|
||||
.sponsor-book-tile:hover::before,
|
||||
.sponsor-book-tile:focus-visible::before { animation: none; }
|
||||
}
|
||||
.sponsor-book-tile--combined {
|
||||
display: grid;
|
||||
grid-template-columns: 28px minmax(0, 1fr) 15px;
|
||||
grid-template-columns: 34px minmax(0, 1fr) 15px;
|
||||
justify-content: initial;
|
||||
gap: 8px;
|
||||
text-align: center;
|
||||
@@ -94,9 +124,9 @@
|
||||
overflow: visible;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
flex: 0 0 28px;
|
||||
width: 34px;
|
||||
height: 34px;
|
||||
flex: 0 0 34px;
|
||||
border: 0;
|
||||
border-radius: 0;
|
||||
background: transparent;
|
||||
@@ -104,6 +134,17 @@
|
||||
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::before {
|
||||
position: absolute;
|
||||
z-index: 0;
|
||||
inset: 5px 4px 3px;
|
||||
content: '';
|
||||
clip-path: polygon(50% 0, 100% 100%, 0 100%);
|
||||
background: radial-gradient(circle at 50% 42%, color-mix(in srgb, var(--primary) 58%, transparent), transparent 65%);
|
||||
filter: blur(2px);
|
||||
opacity: 0.9;
|
||||
transition: opacity 180ms ease, transform 180ms ease;
|
||||
}
|
||||
.sponsor-book-mark::after {
|
||||
position: absolute;
|
||||
inset: -65% -35%;
|
||||
@@ -115,10 +156,10 @@
|
||||
.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;
|
||||
width: 34px;
|
||||
height: 34px;
|
||||
fill: color-mix(in srgb, var(--primary) 36%, var(--sidebar));
|
||||
stroke-width: 1.7;
|
||||
transition: transform 180ms ease;
|
||||
}
|
||||
.sponsor-book-question {
|
||||
@@ -128,18 +169,23 @@
|
||||
left: 50%;
|
||||
width: auto;
|
||||
color: var(--foreground);
|
||||
font-size: 15px;
|
||||
font-weight: 800;
|
||||
font-size: 17px;
|
||||
font-weight: 900;
|
||||
line-height: 1;
|
||||
transform: translate(-50%, -50%);
|
||||
text-align: center;
|
||||
text-shadow: 0 1px 4px color-mix(in srgb, var(--background) 65%, transparent);
|
||||
text-shadow: 0 0 5px color-mix(in srgb, var(--primary) 68%, 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::before {
|
||||
opacity: 1;
|
||||
transform: scale(1.16);
|
||||
animation: sponsor-mark-glow 900ms ease-in-out infinite alternate;
|
||||
}
|
||||
.sponsor-book-tile:hover .sponsor-book-mark::after {
|
||||
opacity: 1;
|
||||
animation: sponsor-mark-sheen 700ms ease-out;
|
||||
@@ -154,11 +200,16 @@
|
||||
from { transform: translateX(-70%); }
|
||||
to { transform: translateX(70%); }
|
||||
}
|
||||
@keyframes sponsor-mark-glow {
|
||||
from { filter: blur(2px); opacity: 0.7; }
|
||||
to { filter: blur(4px); opacity: 1; }
|
||||
}
|
||||
@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-tile:hover .sponsor-book-mark::after,
|
||||
.sponsor-book-tile:hover .sponsor-book-mark::before { animation: none; }
|
||||
}
|
||||
.sponsor-book-copy {
|
||||
display: grid;
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
.support-shortcut {
|
||||
position: relative;
|
||||
isolation: isolate;
|
||||
overflow: hidden;
|
||||
border-radius: 8px;
|
||||
}
|
||||
.support-shortcut::before {
|
||||
position: absolute;
|
||||
z-index: -1;
|
||||
inset: -85% -45%;
|
||||
content: '';
|
||||
opacity: 0;
|
||||
background:
|
||||
radial-gradient(ellipse at 20% 40%, color-mix(in srgb, var(--primary) 30%, transparent), transparent 50%),
|
||||
repeating-radial-gradient(ellipse at 0% 100%, transparent 0 12px, color-mix(in srgb, var(--primary) 22%, transparent) 13px 15px, transparent 16px 28px);
|
||||
transform: translateX(-12%) rotate(-5deg);
|
||||
transition: opacity 180ms ease;
|
||||
}
|
||||
.support-shortcut:hover::before,
|
||||
.support-shortcut:focus-visible::before {
|
||||
opacity: 1;
|
||||
animation: support-shortcut-waves 1.8s ease-in-out infinite alternate;
|
||||
}
|
||||
@keyframes support-shortcut-waves {
|
||||
from { transform: translateX(-12%) rotate(-5deg) scale(1); }
|
||||
to { transform: translateX(12%) rotate(5deg) scale(1.08); }
|
||||
}
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.support-shortcut::before { transition: none; }
|
||||
.support-shortcut:hover::before,
|
||||
.support-shortcut:focus-visible::before { animation: none; }
|
||||
}
|
||||
@@ -2,6 +2,7 @@ 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';
|
||||
import './support-shortcut.css';
|
||||
|
||||
export function SupportShortcut() {
|
||||
const { t } = useTranslation();
|
||||
@@ -11,17 +12,17 @@ export function SupportShortcut() {
|
||||
render={
|
||||
<Link
|
||||
to="/settings/support"
|
||||
aria-label={t('supportPlans.title')}
|
||||
className="app-no-drag flex h-8 items-center gap-1.5 rounded-lg border border-primary/25 bg-primary/10 px-2.5 text-primary hover:border-primary/45 hover:bg-primary/15 focus-visible:outline-2 focus-visible:outline-primary motion-safe:transition-colors"
|
||||
aria-label={t('supportPlans.get_pro')}
|
||||
className="support-shortcut app-no-drag flex h-8 items-center gap-1.5 px-1.5 text-primary hover:text-foreground focus-visible:outline-2 focus-visible:outline-primary motion-safe:transition-colors"
|
||||
/>
|
||||
}
|
||||
>
|
||||
<GemIcon aria-hidden="true" className="size-3.5" />
|
||||
<span className="hidden text-xs font-semibold sm:inline">{t('supportPlans.pro')}</span>
|
||||
<span className="hidden text-xs font-semibold sm:inline">{t('supportPlans.get_pro')}</span>
|
||||
<ArrowUpRightIcon aria-hidden="true" className="size-3" />
|
||||
</TooltipTrigger>
|
||||
<TooltipContent surface="theme" side="bottom">
|
||||
{t('supportPlans.title')}
|
||||
{t('supportPlans.get_pro')}
|
||||
</TooltipContent>
|
||||
</Tooltip>
|
||||
);
|
||||
|
||||
@@ -17,7 +17,9 @@
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 18px;
|
||||
min-height: 82px;
|
||||
margin: 4px 0 30px;
|
||||
padding: 8px 0;
|
||||
}
|
||||
.integrations-hero-icon {
|
||||
display: grid;
|
||||
@@ -41,11 +43,26 @@
|
||||
letter-spacing: -0.045em;
|
||||
line-height: 1.1;
|
||||
}
|
||||
.integrations-hero-copy {
|
||||
display: grid;
|
||||
min-width: 0;
|
||||
gap: 4px;
|
||||
}
|
||||
.integrations-hero-title-row {
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
flex-wrap: wrap;
|
||||
gap: 6px 16px;
|
||||
}
|
||||
.integrations-hero p {
|
||||
margin-top: 5px;
|
||||
margin: 0;
|
||||
color: var(--muted-foreground);
|
||||
font-size: 13px;
|
||||
}
|
||||
.integrations-hero-notice {
|
||||
font-size: 11px !important;
|
||||
opacity: 0.75;
|
||||
}
|
||||
.integrations-featured {
|
||||
margin-bottom: 28px;
|
||||
}
|
||||
@@ -86,11 +103,26 @@
|
||||
}
|
||||
.integration-featured-card,
|
||||
.integration-card {
|
||||
position: relative;
|
||||
isolation: isolate;
|
||||
overflow: hidden;
|
||||
cursor: pointer;
|
||||
border: 1px solid var(--border);
|
||||
background: color-mix(in srgb, var(--foreground) 2.5%, var(--background));
|
||||
color: var(--foreground);
|
||||
text-align: left;
|
||||
transition: color 150ms, background-color 150ms, box-shadow 150ms, border-color 150ms, backdrop-filter 150ms;
|
||||
}
|
||||
.integration-featured-card::before,
|
||||
.integration-card::before {
|
||||
position: absolute;
|
||||
z-index: -1;
|
||||
inset: 0;
|
||||
content: '';
|
||||
border-radius: inherit;
|
||||
background: linear-gradient(90deg, rgb(255 255 255 / 7%), rgb(255 255 255 / 2%), transparent);
|
||||
opacity: 0;
|
||||
transition: opacity 150ms;
|
||||
}
|
||||
.integration-featured-card {
|
||||
display: flex;
|
||||
@@ -191,8 +223,14 @@
|
||||
}
|
||||
.integration-card:hover,
|
||||
.integration-featured-card:hover {
|
||||
border-color: var(--primary);
|
||||
box-shadow: 0 8px 25px -18px var(--primary);
|
||||
border-color: color-mix(in srgb, var(--sidebar-border) 70%, var(--primary));
|
||||
background: color-mix(in srgb, var(--sidebar-accent) 65%, var(--background));
|
||||
backdrop-filter: blur(18px);
|
||||
box-shadow: inset 0 1px 0 rgb(255 255 255 / 9%), 0 6px 18px rgb(0 0 0 / 10%);
|
||||
}
|
||||
.integration-card:hover::before,
|
||||
.integration-featured-card:hover::before {
|
||||
opacity: 1;
|
||||
}
|
||||
.integration-card:focus-visible,
|
||||
.integration-featured-card:focus-visible,
|
||||
|
||||
@@ -66,10 +66,12 @@ export function IntegrationsPage() {
|
||||
<span className="integrations-hero-icon">
|
||||
<BlocksIcon aria-hidden="true" />
|
||||
</span>
|
||||
<div>
|
||||
<h2>{t('integrationCatalog.title')}</h2>
|
||||
<p>{t('integrationCatalog.description')}</p>
|
||||
<p>{t('directoryExamples.notice')}</p>
|
||||
<div className="integrations-hero-copy">
|
||||
<div className="integrations-hero-title-row">
|
||||
<h2>{t('integrationCatalog.title')}</h2>
|
||||
<p>{t('integrationCatalog.description')}</p>
|
||||
</div>
|
||||
<p className="integrations-hero-notice">{t('directoryExamples.notice')}</p>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
|
||||
@@ -2621,6 +2621,7 @@
|
||||
"title": "المجاني مقابل Pro",
|
||||
"free": "مجاني",
|
||||
"pro": "Pro",
|
||||
"get_pro": "احصل على Pro",
|
||||
"sponsor_bar": "شريط الرعاة",
|
||||
"visible": "ظاهر",
|
||||
"hideable": "يمكن إخفاؤه",
|
||||
|
||||
@@ -2613,6 +2613,7 @@
|
||||
"title": "Free und Pro im Vergleich",
|
||||
"free": "Kostenlos",
|
||||
"pro": "Pro",
|
||||
"get_pro": "Pro holen",
|
||||
"sponsor_bar": "Sponsorenleiste",
|
||||
"visible": "Sichtbar",
|
||||
"hideable": "Ausblendbar",
|
||||
|
||||
@@ -2613,6 +2613,7 @@
|
||||
"title": "Free vs Pro",
|
||||
"free": "Free",
|
||||
"pro": "Pro",
|
||||
"get_pro": "Get Pro",
|
||||
"sponsor_bar": "Sponsor bar",
|
||||
"visible": "Visible",
|
||||
"hideable": "Can be hidden",
|
||||
|
||||
@@ -2615,6 +2615,7 @@
|
||||
"title": "Gratis vs Pro",
|
||||
"free": "Gratis",
|
||||
"pro": "Pro",
|
||||
"get_pro": "Obtener Pro",
|
||||
"sponsor_bar": "Barra de patrocinadores",
|
||||
"visible": "Visible",
|
||||
"hideable": "Se puede ocultar",
|
||||
|
||||
@@ -2615,6 +2615,7 @@
|
||||
"title": "Gratuit ou Pro",
|
||||
"free": "Gratuit",
|
||||
"pro": "Pro",
|
||||
"get_pro": "Passer à Pro",
|
||||
"sponsor_bar": "Barre des sponsors",
|
||||
"visible": "Visible",
|
||||
"hideable": "Peut être masquée",
|
||||
|
||||
@@ -2613,6 +2613,7 @@
|
||||
"title": "मुफ़्त बनाम Pro",
|
||||
"free": "मुफ़्त",
|
||||
"pro": "Pro",
|
||||
"get_pro": "Pro लें",
|
||||
"sponsor_bar": "प्रायोजक बार",
|
||||
"visible": "दिखाई देता है",
|
||||
"hideable": "छिपाया जा सकता है",
|
||||
|
||||
@@ -2613,6 +2613,7 @@
|
||||
"title": "Gratis vs Pro",
|
||||
"free": "Gratis",
|
||||
"pro": "Pro",
|
||||
"get_pro": "Dapatkan Pro",
|
||||
"sponsor_bar": "Bilah sponsor",
|
||||
"visible": "Terlihat",
|
||||
"hideable": "Dapat disembunyikan",
|
||||
|
||||
@@ -2615,6 +2615,7 @@
|
||||
"title": "Gratis o Pro",
|
||||
"free": "Gratis",
|
||||
"pro": "Pro",
|
||||
"get_pro": "Ottieni Pro",
|
||||
"sponsor_bar": "Barra sponsor",
|
||||
"visible": "Visibile",
|
||||
"hideable": "Può essere nascosta",
|
||||
|
||||
@@ -2613,6 +2613,7 @@
|
||||
"title": "無料版とProの比較",
|
||||
"free": "無料",
|
||||
"pro": "Pro",
|
||||
"get_pro": "Pro を入手",
|
||||
"sponsor_bar": "スポンサー欄",
|
||||
"visible": "表示",
|
||||
"hideable": "非表示にできます",
|
||||
|
||||
@@ -2613,6 +2613,7 @@
|
||||
"title": "무료와 Pro 비교",
|
||||
"free": "무료",
|
||||
"pro": "Pro",
|
||||
"get_pro": "Pro 받기",
|
||||
"sponsor_bar": "스폰서 바",
|
||||
"visible": "표시됨",
|
||||
"hideable": "숨길 수 있음",
|
||||
|
||||
@@ -2613,6 +2613,7 @@
|
||||
"title": "Gratis versus Pro",
|
||||
"free": "Gratis",
|
||||
"pro": "Pro",
|
||||
"get_pro": "Pro nemen",
|
||||
"sponsor_bar": "Sponsorbalk",
|
||||
"visible": "Zichtbaar",
|
||||
"hideable": "Kan worden verborgen",
|
||||
|
||||
@@ -2617,6 +2617,7 @@
|
||||
"title": "Darmowa a Pro",
|
||||
"free": "Darmowa",
|
||||
"pro": "Pro",
|
||||
"get_pro": "Zdobądź Pro",
|
||||
"sponsor_bar": "Pasek sponsorów",
|
||||
"visible": "Widoczny",
|
||||
"hideable": "Można ukryć",
|
||||
|
||||
@@ -2615,6 +2615,7 @@
|
||||
"title": "Grátis vs Pro",
|
||||
"free": "Grátis",
|
||||
"pro": "Pro",
|
||||
"get_pro": "Obter Pro",
|
||||
"sponsor_bar": "Barra de patrocinadores",
|
||||
"visible": "Visível",
|
||||
"hideable": "Pode ser ocultada",
|
||||
|
||||
@@ -2617,6 +2617,7 @@
|
||||
"title": "Бесплатная версия и Pro",
|
||||
"free": "Бесплатно",
|
||||
"pro": "Pro",
|
||||
"get_pro": "Получить Pro",
|
||||
"sponsor_bar": "Панель спонсоров",
|
||||
"visible": "Видна",
|
||||
"hideable": "Можно скрыть",
|
||||
|
||||
@@ -2613,6 +2613,7 @@
|
||||
"title": "Gratis jämfört med Pro",
|
||||
"free": "Gratis",
|
||||
"pro": "Pro",
|
||||
"get_pro": "Skaffa Pro",
|
||||
"sponsor_bar": "Sponsorfält",
|
||||
"visible": "Synligt",
|
||||
"hideable": "Kan döljas",
|
||||
|
||||
@@ -2613,6 +2613,7 @@
|
||||
"title": "เปรียบเทียบฟรีกับ Pro",
|
||||
"free": "ฟรี",
|
||||
"pro": "Pro",
|
||||
"get_pro": "รับ Pro",
|
||||
"sponsor_bar": "แถบผู้สนับสนุน",
|
||||
"visible": "แสดง",
|
||||
"hideable": "ซ่อนได้",
|
||||
|
||||
@@ -2613,6 +2613,7 @@
|
||||
"title": "Ücretsiz ve Pro",
|
||||
"free": "Ücretsiz",
|
||||
"pro": "Pro",
|
||||
"get_pro": "Pro'yu edin",
|
||||
"sponsor_bar": "Sponsor çubuğu",
|
||||
"visible": "Görünür",
|
||||
"hideable": "Gizlenebilir",
|
||||
|
||||
@@ -2617,6 +2617,7 @@
|
||||
"title": "Безкоштовна версія та Pro",
|
||||
"free": "Безкоштовно",
|
||||
"pro": "Pro",
|
||||
"get_pro": "Отримати Pro",
|
||||
"sponsor_bar": "Панель спонсорів",
|
||||
"visible": "Видима",
|
||||
"hideable": "Можна приховати",
|
||||
|
||||
@@ -2613,6 +2613,7 @@
|
||||
"title": "Miễn phí và Pro",
|
||||
"free": "Miễn phí",
|
||||
"pro": "Pro",
|
||||
"get_pro": "Nhận Pro",
|
||||
"sponsor_bar": "Thanh nhà tài trợ",
|
||||
"visible": "Hiển thị",
|
||||
"hideable": "Có thể ẩn",
|
||||
|
||||
@@ -2617,6 +2617,7 @@
|
||||
"title": "免费版与 Pro 对比",
|
||||
"free": "免费版",
|
||||
"pro": "Pro",
|
||||
"get_pro": "获取 Pro",
|
||||
"sponsor_bar": "赞助商栏",
|
||||
"visible": "显示",
|
||||
"hideable": "可隐藏",
|
||||
|
||||
@@ -2613,6 +2613,7 @@
|
||||
"title": "免費版與 Pro 比較",
|
||||
"free": "免費版",
|
||||
"pro": "Pro",
|
||||
"get_pro": "取得 Pro",
|
||||
"sponsor_bar": "贊助商列",
|
||||
"visible": "顯示",
|
||||
"hideable": "可隱藏",
|
||||
|
||||