diff --git a/.github/workflows/electron-build.yml b/.github/workflows/electron-build.yml new file mode 100644 index 00000000..9521f543 --- /dev/null +++ b/.github/workflows/electron-build.yml @@ -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 diff --git a/README.md b/README.md index b1ad3a4b..12dbfa0c 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,10 @@
VoiceStudio

VoiceStudio

-

Your voices. Your stories. Your machine.

+

Open source voice cloning and workflow engine. Build local.

Clone voices, dub videos, dictate, and create audiobooks with local AI.

+ Website · Download · Get started · Docs · @@ -19,7 +20,7 @@ ![A tour of the Electron app: voice cloning, voice design, dubbing, and model management](docs/media/electron/voicestudio.gif) -

The new Electron desktop UI, captured from this branch with the bundled demo voice. Release builds may look different.

+

Captured from the running Electron preview with the bundled demo voice. Published installers may look different.

## Create with VoiceStudio @@ -39,6 +40,11 @@ Local workflows run on your hardware. Remote services are optional; usage analyt Electron video dubbing workspace Voice cloningVideo dubbing + + Describe a voice in the Electron voice design workspace + Install and manage local speech models + + Voice designLocal models ## 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). diff --git a/README_CN.md b/README_CN.md index 4e4b331d..ae8c0dd6 100644 --- a/README_CN.md +++ b/README_CN.md @@ -1,7 +1,7 @@
VoiceStudio

VoiceStudio

-

你的声音,你的故事,在你的电脑上创作。

+

开源声音克隆与工作流引擎。在本地构建。

使用本地 AI 克隆声音、翻译配音、语音听写和制作有声书。

下载 · @@ -32,6 +32,11 @@ Electron 视频配音工作区 声音克隆视频配音 + + Electron 声音设计工作区 + 本地语音模型管理 + + 声音设计本地模型 ## 开始使用 @@ -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)。 diff --git a/docs/media/electron/dubbing.png b/docs/media/electron/dubbing.png index d1745a34..423a4849 100644 Binary files a/docs/media/electron/dubbing.png and b/docs/media/electron/dubbing.png differ diff --git a/docs/media/electron/voice-cloning.png b/docs/media/electron/voice-cloning.png index 2021a657..8ce05052 100644 Binary files a/docs/media/electron/voice-cloning.png and b/docs/media/electron/voice-cloning.png differ diff --git a/docs/media/electron/voice-design.png b/docs/media/electron/voice-design.png index eae7328d..e003718a 100644 Binary files a/docs/media/electron/voice-design.png and b/docs/media/electron/voice-design.png differ diff --git a/docs/media/electron/voicestudio.gif b/docs/media/electron/voicestudio.gif index 3f0daed8..6dd21960 100644 Binary files a/docs/media/electron/voicestudio.gif and b/docs/media/electron/voicestudio.gif differ diff --git a/electron/src/renderer/src/components/app-shell/sponsor-footer.css b/electron/src/renderer/src/components/app-shell/sponsor-footer.css index ddede592..b2da683a 100644 --- a/electron/src/renderer/src/components/app-shell/sponsor-footer.css +++ b/electron/src/renderer/src/components/app-shell/sponsor-footer.css @@ -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; diff --git a/electron/src/renderer/src/components/app-shell/support-shortcut.css b/electron/src/renderer/src/components/app-shell/support-shortcut.css new file mode 100644 index 00000000..35b20a5b --- /dev/null +++ b/electron/src/renderer/src/components/app-shell/support-shortcut.css @@ -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; } +} diff --git a/electron/src/renderer/src/components/app-shell/support-shortcut.tsx b/electron/src/renderer/src/components/app-shell/support-shortcut.tsx index bed07ab2..a5420583 100644 --- a/electron/src/renderer/src/components/app-shell/support-shortcut.tsx +++ b/electron/src/renderer/src/components/app-shell/support-shortcut.tsx @@ -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={ } >

-

{t('integrationCatalog.title')}

-

{t('integrationCatalog.description')}

-

{t('directoryExamples.notice')}

+
+
+

{t('integrationCatalog.title')}

+

{t('integrationCatalog.description')}

+
+

{t('directoryExamples.notice')}

diff --git a/electron/src/renderer/src/i18n/locales/ar.json b/electron/src/renderer/src/i18n/locales/ar.json index 2b242506..974cde04 100644 --- a/electron/src/renderer/src/i18n/locales/ar.json +++ b/electron/src/renderer/src/i18n/locales/ar.json @@ -2621,6 +2621,7 @@ "title": "المجاني مقابل Pro", "free": "مجاني", "pro": "Pro", + "get_pro": "احصل على Pro", "sponsor_bar": "شريط الرعاة", "visible": "ظاهر", "hideable": "يمكن إخفاؤه", diff --git a/electron/src/renderer/src/i18n/locales/de.json b/electron/src/renderer/src/i18n/locales/de.json index 68fa960c..c41087c4 100644 --- a/electron/src/renderer/src/i18n/locales/de.json +++ b/electron/src/renderer/src/i18n/locales/de.json @@ -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", diff --git a/electron/src/renderer/src/i18n/locales/en.json b/electron/src/renderer/src/i18n/locales/en.json index 1ecdb394..5ca965bc 100644 --- a/electron/src/renderer/src/i18n/locales/en.json +++ b/electron/src/renderer/src/i18n/locales/en.json @@ -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", diff --git a/electron/src/renderer/src/i18n/locales/es.json b/electron/src/renderer/src/i18n/locales/es.json index 478dc694..08bb59b6 100644 --- a/electron/src/renderer/src/i18n/locales/es.json +++ b/electron/src/renderer/src/i18n/locales/es.json @@ -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", diff --git a/electron/src/renderer/src/i18n/locales/fr.json b/electron/src/renderer/src/i18n/locales/fr.json index c6c45c7d..9272fdaf 100644 --- a/electron/src/renderer/src/i18n/locales/fr.json +++ b/electron/src/renderer/src/i18n/locales/fr.json @@ -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", diff --git a/electron/src/renderer/src/i18n/locales/hi.json b/electron/src/renderer/src/i18n/locales/hi.json index 72def73e..ab8b1993 100644 --- a/electron/src/renderer/src/i18n/locales/hi.json +++ b/electron/src/renderer/src/i18n/locales/hi.json @@ -2613,6 +2613,7 @@ "title": "मुफ़्त बनाम Pro", "free": "मुफ़्त", "pro": "Pro", + "get_pro": "Pro लें", "sponsor_bar": "प्रायोजक बार", "visible": "दिखाई देता है", "hideable": "छिपाया जा सकता है", diff --git a/electron/src/renderer/src/i18n/locales/id.json b/electron/src/renderer/src/i18n/locales/id.json index 9d6c4a80..5a1740c2 100644 --- a/electron/src/renderer/src/i18n/locales/id.json +++ b/electron/src/renderer/src/i18n/locales/id.json @@ -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", diff --git a/electron/src/renderer/src/i18n/locales/it.json b/electron/src/renderer/src/i18n/locales/it.json index 14291823..70185736 100644 --- a/electron/src/renderer/src/i18n/locales/it.json +++ b/electron/src/renderer/src/i18n/locales/it.json @@ -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", diff --git a/electron/src/renderer/src/i18n/locales/ja.json b/electron/src/renderer/src/i18n/locales/ja.json index c95f977c..1310a316 100644 --- a/electron/src/renderer/src/i18n/locales/ja.json +++ b/electron/src/renderer/src/i18n/locales/ja.json @@ -2613,6 +2613,7 @@ "title": "無料版とProの比較", "free": "無料", "pro": "Pro", + "get_pro": "Pro を入手", "sponsor_bar": "スポンサー欄", "visible": "表示", "hideable": "非表示にできます", diff --git a/electron/src/renderer/src/i18n/locales/ko.json b/electron/src/renderer/src/i18n/locales/ko.json index 628cca2c..607f195a 100644 --- a/electron/src/renderer/src/i18n/locales/ko.json +++ b/electron/src/renderer/src/i18n/locales/ko.json @@ -2613,6 +2613,7 @@ "title": "무료와 Pro 비교", "free": "무료", "pro": "Pro", + "get_pro": "Pro 받기", "sponsor_bar": "스폰서 바", "visible": "표시됨", "hideable": "숨길 수 있음", diff --git a/electron/src/renderer/src/i18n/locales/nl.json b/electron/src/renderer/src/i18n/locales/nl.json index bb48caa8..0b8a91d7 100644 --- a/electron/src/renderer/src/i18n/locales/nl.json +++ b/electron/src/renderer/src/i18n/locales/nl.json @@ -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", diff --git a/electron/src/renderer/src/i18n/locales/pl.json b/electron/src/renderer/src/i18n/locales/pl.json index 6365ea8c..c20fccf2 100644 --- a/electron/src/renderer/src/i18n/locales/pl.json +++ b/electron/src/renderer/src/i18n/locales/pl.json @@ -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ć", diff --git a/electron/src/renderer/src/i18n/locales/pt.json b/electron/src/renderer/src/i18n/locales/pt.json index 18487fc8..901c3b8a 100644 --- a/electron/src/renderer/src/i18n/locales/pt.json +++ b/electron/src/renderer/src/i18n/locales/pt.json @@ -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", diff --git a/electron/src/renderer/src/i18n/locales/ru.json b/electron/src/renderer/src/i18n/locales/ru.json index 982aa540..c4e889ca 100644 --- a/electron/src/renderer/src/i18n/locales/ru.json +++ b/electron/src/renderer/src/i18n/locales/ru.json @@ -2617,6 +2617,7 @@ "title": "Бесплатная версия и Pro", "free": "Бесплатно", "pro": "Pro", + "get_pro": "Получить Pro", "sponsor_bar": "Панель спонсоров", "visible": "Видна", "hideable": "Можно скрыть", diff --git a/electron/src/renderer/src/i18n/locales/sv.json b/electron/src/renderer/src/i18n/locales/sv.json index a2cb421f..aedc2a30 100644 --- a/electron/src/renderer/src/i18n/locales/sv.json +++ b/electron/src/renderer/src/i18n/locales/sv.json @@ -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", diff --git a/electron/src/renderer/src/i18n/locales/th.json b/electron/src/renderer/src/i18n/locales/th.json index 7d320dbf..545640ec 100644 --- a/electron/src/renderer/src/i18n/locales/th.json +++ b/electron/src/renderer/src/i18n/locales/th.json @@ -2613,6 +2613,7 @@ "title": "เปรียบเทียบฟรีกับ Pro", "free": "ฟรี", "pro": "Pro", + "get_pro": "รับ Pro", "sponsor_bar": "แถบผู้สนับสนุน", "visible": "แสดง", "hideable": "ซ่อนได้", diff --git a/electron/src/renderer/src/i18n/locales/tr.json b/electron/src/renderer/src/i18n/locales/tr.json index 133d9296..3856122d 100644 --- a/electron/src/renderer/src/i18n/locales/tr.json +++ b/electron/src/renderer/src/i18n/locales/tr.json @@ -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", diff --git a/electron/src/renderer/src/i18n/locales/uk.json b/electron/src/renderer/src/i18n/locales/uk.json index d715bd73..7fcf285c 100644 --- a/electron/src/renderer/src/i18n/locales/uk.json +++ b/electron/src/renderer/src/i18n/locales/uk.json @@ -2617,6 +2617,7 @@ "title": "Безкоштовна версія та Pro", "free": "Безкоштовно", "pro": "Pro", + "get_pro": "Отримати Pro", "sponsor_bar": "Панель спонсорів", "visible": "Видима", "hideable": "Можна приховати", diff --git a/electron/src/renderer/src/i18n/locales/vi.json b/electron/src/renderer/src/i18n/locales/vi.json index 4754918a..60b29946 100644 --- a/electron/src/renderer/src/i18n/locales/vi.json +++ b/electron/src/renderer/src/i18n/locales/vi.json @@ -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", diff --git a/electron/src/renderer/src/i18n/locales/zh-CN.json b/electron/src/renderer/src/i18n/locales/zh-CN.json index dfd5ce90..591b6576 100644 --- a/electron/src/renderer/src/i18n/locales/zh-CN.json +++ b/electron/src/renderer/src/i18n/locales/zh-CN.json @@ -2617,6 +2617,7 @@ "title": "免费版与 Pro 对比", "free": "免费版", "pro": "Pro", + "get_pro": "获取 Pro", "sponsor_bar": "赞助商栏", "visible": "显示", "hideable": "可隐藏", diff --git a/electron/src/renderer/src/i18n/locales/zh-TW.json b/electron/src/renderer/src/i18n/locales/zh-TW.json index fa477502..d81f7744 100644 --- a/electron/src/renderer/src/i18n/locales/zh-TW.json +++ b/electron/src/renderer/src/i18n/locales/zh-TW.json @@ -2613,6 +2613,7 @@ "title": "免費版與 Pro 比較", "free": "免費版", "pro": "Pro", + "get_pro": "取得 Pro", "sponsor_bar": "贊助商列", "visible": "顯示", "hideable": "可隱藏",