docs: refresh Electron showcase and packaging prep

This commit is contained in:
Palash Debnath
2026-09-16 13:09:32 +05:30
parent 1d5d3d873e
commit 3f1f9bf9d0
33 changed files with 301 additions and 26 deletions
+115
View File
@@ -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
+10 -2
View File
@@ -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 @@
![A tour of the Electron app: voice cloning, voice design, dubbing, and model management](docs/media/electron/voicestudio.gif)
<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).
+8 -1
View File
@@ -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)。
Binary file not shown.

Before

Width:  |  Height:  |  Size: 158 KiB

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 124 KiB

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

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": "可隱藏",