Update about page review info for 2.1.27
| | |
| | | # Changelog |
| | | |
| | | ## v2.1.27 (2026-06-03) |
| | | |
| | | ### QA 候选包 |
| | | |
| | | - **关于页审核信息补全**:关于页显示 `私语输入法 (PrivateVoice Dictation)`、离线识别说明、数据不出设备声明、开源项目归属、版权许可、隐私政策和支持反馈链接。 |
| | | - **苹果审核链接更新**:版权许可、隐私政策、支持反馈统一指向 `privatevoice-dictation-support` 支持站点;保留 VoiceSnap 原项目地址入口。 |
| | | - **英文界面同步**:English 关于页同步展示等价隐私与许可说明,避免系统语言为英文时仍显示旧审核信息。 |
| | | |
| | | ### 构建 |
| | | |
| | | - build: `20260603.2238` |
| | | - 说明: 本版本为关于页审核信息补全后的用户验收候选包。 |
| | | |
| | | --- |
| | | |
| | | ## v2.1.26 (2026-06-03) |
| | | |
| | | ### 修复 |
| | |
| | | ) |
| | | |
| | | const ( |
| | | appVersion = "2.1.26" |
| | | appBuild = "20260603.2151" |
| | | appVersion = "2.1.27" |
| | | appBuild = "20260603.2238" |
| | | appDisplayVersion = appVersion + " (build " + appBuild + ")" |
| | | appName = "PrivateVoice Dictation" |
| | | |
| | |
| | | description: "Private offline voice input tool" |
| | | copyright: "(c) 2026, PrivateVoice" |
| | | comments: "Private. Offline." |
| | | version: "2.1.26" |
| | | version: "2.1.27" |
| | | |
| | | dev_mode: |
| | | root_path: . |
| | |
| | | <key>CFBundlePackageType</key> |
| | | <string>APPL</string> |
| | | <key>CFBundleShortVersionString</key> |
| | | <string>2.1.26</string> |
| | | <string>2.1.27</string> |
| | | <key>CFBundleVersion</key> |
| | | <string>20260603.2151</string> |
| | | <string>20260603.2238</string> |
| | | <key>LSMinimumSystemVersion</key> |
| | | <string>11.0</string> |
| | | <key>NSMicrophoneUsageDescription</key> |
| | |
| | | <assemblyIdentity |
| | | type="win32" |
| | | name="PrivateVoice.Dictation" |
| | | version="2.1.26.0" |
| | | version="2.1.27.0" |
| | | processorArchitecture="*"/> |
| | | <dependency> |
| | | <dependentAssembly> |
| | |
| | | { |
| | | "name": "privatevoice-dictation-frontend", |
| | | "version": "2.1.26", |
| | | "version": "2.1.27", |
| | | "lockfileVersion": 3, |
| | | "requires": true, |
| | | "packages": { |
| | | "": { |
| | | "name": "privatevoice-dictation-frontend", |
| | | "version": "2.1.26", |
| | | "version": "2.1.27", |
| | | "dependencies": { |
| | | "@wailsio/runtime": "latest" |
| | | }, |
| | |
| | | { |
| | | "name": "privatevoice-dictation-frontend", |
| | | "private": true, |
| | | "version": "2.1.26", |
| | | "version": "2.1.27", |
| | | "type": "module", |
| | | "scripts": { |
| | | "dev": "vite dev", |
| | |
| | | import { t } from '../../lib/i18n' |
| | | import AppIcon from '../shared/AppIcon.svelte' |
| | | |
| | | let version = $state('2.1.12') |
| | | let version = $state('2.1.27 (build 20260603.2238)') |
| | | const currentYear = new Date().getFullYear().toString() |
| | | const aboutLinks = [ |
| | | { labelKey: 'about.sourceProjectLabel', urlKey: 'about.sourceUrl' }, |
| | | { labelKey: 'about.licenseLabel', urlKey: 'about.licenseUrl' }, |
| | | { labelKey: 'about.privacyLabel', urlKey: 'about.privacyUrl' }, |
| | | { labelKey: 'about.feedbackLabel', urlKey: 'about.feedbackUrl' }, |
| | | ] |
| | | |
| | | async function loadVersion() { |
| | | try { |
| | |
| | | } |
| | | loadVersion() |
| | | |
| | | function openSupport() { |
| | | Call.ByName('voicesnap/services.AppService.OpenURL', t('about.supportUrl')) |
| | | function openUrl(url: string) { |
| | | Call.ByName('voicesnap/services.AppService.OpenURL', url) |
| | | } |
| | | </script> |
| | | |
| | | <div class="about"> |
| | | <div class="center-content"> |
| | | <AppIcon size={80} elevated /> |
| | | <h2 class="app-name">{t('app.name')}</h2> |
| | | <p class="app-secondary-name">{t('app.secondaryName')}</p> |
| | | <AppIcon size={72} elevated /> |
| | | <h2 class="app-name">{t('about.displayName')}</h2> |
| | | <p class="app-version">v{version}</p> |
| | | <p class="app-tagline">{t('about.tagline')}</p> |
| | | <p class="app-slogan">{t('about.slogan')}</p> |
| | | |
| | | <div class="legal"> |
| | | <p>{t('about.offlineText')}</p> |
| | | <p>{t('about.noDataText')}</p> |
| | | <p>{t('about.legalText')}</p> |
| | | <p>{t('about.legalDetails')}</p> |
| | | <button type="button" class="support-link" onclick={openSupport}> |
| | | {t('about.supportUrl')} |
| | | |
| | | <div class="link-list"> |
| | | {#each aboutLinks as item} |
| | | <div class="link-row"> |
| | | <span class="link-label">{t(item.labelKey)}</span> |
| | | <button type="button" class="support-link" onclick={() => openUrl(t(item.urlKey))}> |
| | | {t(item.urlKey)} |
| | | </button> |
| | | </div> |
| | | {/each} |
| | | </div> |
| | | </div> |
| | | |
| | | <button type="button" class="support-btn" onclick={openSupport}> |
| | | <button type="button" class="support-btn" onclick={() => openUrl(t('about.feedbackUrl'))}> |
| | | {t('about.openSupport')} |
| | | </button> |
| | | </div> |
| | |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | justify-content: center; |
| | | justify-content: flex-start; |
| | | min-height: calc(100vh - 40px); |
| | | padding: 28px 24px 18px; |
| | | background: var(--color-bg-grouped-secondary); |
| | | border-radius: var(--radius-md); |
| | | position: relative; |
| | | } |
| | | |
| | | .center-content { |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | width: min(420px, 100%); |
| | | margin-top: -20px; |
| | | width: min(560px, 100%); |
| | | } |
| | | |
| | | .app-name { |
| | | font-size: 22px; |
| | | font-weight: 700; |
| | | margin-top: 16px; |
| | | } |
| | | |
| | | .app-secondary-name { |
| | | font-size: var(--font-size-sm); |
| | | color: var(--color-secondary-label); |
| | | margin-top: 3px; |
| | | text-align: center; |
| | | } |
| | | |
| | | .app-version { |
| | |
| | | |
| | | .legal { |
| | | width: 100%; |
| | | margin-top: 28px; |
| | | margin-top: 22px; |
| | | color: var(--color-secondary-label); |
| | | font-size: var(--font-size-sm); |
| | | line-height: 1.65; |
| | | text-align: center; |
| | | text-align: left; |
| | | } |
| | | |
| | | .legal p + p { |
| | | margin-top: 10px; |
| | | } |
| | | |
| | | .link-list { |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 8px; |
| | | margin-top: 12px; |
| | | } |
| | | |
| | | .link-row { |
| | | display: grid; |
| | | grid-template-columns: 96px minmax(0, 1fr); |
| | | gap: 10px; |
| | | align-items: baseline; |
| | | } |
| | | |
| | | .link-label { |
| | | color: var(--color-tertiary-label); |
| | | white-space: nowrap; |
| | | } |
| | | |
| | | .support-link { |
| | | display: inline; |
| | | display: inline-block; |
| | | padding: 0; |
| | | border: none; |
| | | background: transparent; |
| | |
| | | font: inherit; |
| | | cursor: pointer; |
| | | word-break: break-all; |
| | | text-align: left; |
| | | } |
| | | |
| | | .support-btn { |
| | |
| | | } |
| | | |
| | | .bottom { |
| | | position: absolute; |
| | | bottom: 20px; |
| | | left: 30px; |
| | | right: 30px; |
| | | width: min(560px, 100%); |
| | | margin-top: auto; |
| | | padding-top: 22px; |
| | | text-align: center; |
| | | } |
| | | |
| | |
| | | font-size: var(--font-size-xs); |
| | | color: var(--color-tertiary-label); |
| | | } |
| | | |
| | | @media (max-width: 520px) { |
| | | .link-row { |
| | | grid-template-columns: 1fr; |
| | | gap: 2px; |
| | | } |
| | | } |
| | | </style> |
| | |
| | | "checkingUpdate": "Checking...", |
| | | "isLatestVersion": "Up to date", |
| | | "checkFailed": "Check failed", |
| | | "tagline": "Private. Offline.", |
| | | "slogan": "Private. Offline.", |
| | | "displayName": "PrivateVoice Dictation", |
| | | "tagline": "Private offline · Custom dictionary · Privacy protected", |
| | | "slogan": "Voice dictation that truly belongs to you", |
| | | "offlineText": "This app runs fully offline. All speech recognition is completed on the local device using local models including SenseVoice, Qwen3-ASR, Moonshine English, and Parakeet.", |
| | | "noDataText": "Data never leaves the device. The app does not collect, upload, or store any voice, text, dictionary, or usage data.", |
| | | "legalText": "This app is a secondary development based on the open-source VoiceSnap project and follows the MIT License.", |
| | | "legalDetails": "For complete copyright notices, license text, and improvement details, visit:", |
| | | "supportUrl": "https://shanghai3168.github.io/privatevoice-support/", |
| | | "openSupport": "Open copyright and license details", |
| | | "sourceProjectLabel": "Source project", |
| | | "licenseLabel": "License details", |
| | | "privacyLabel": "Privacy policy", |
| | | "feedbackLabel": "Support", |
| | | "sourceUrl": "https://github.com/vorojar/VoiceSnap", |
| | | "licenseUrl": "https://shanghai3168.github.io/privatevoice-dictation-support/", |
| | | "privacyUrl": "https://shanghai3168.github.io/privatevoice-dictation-support/privacy.html", |
| | | "feedbackUrl": "https://shanghai3168.github.io/privatevoice-dictation-support/support.html", |
| | | "openSupport": "Open support and feedback", |
| | | "copyright": "© {year} PrivateVoice Dictation · MIT License" |
| | | }, |
| | | "history": { |
| | |
| | | "checkingUpdate": "正在检查...", |
| | | "isLatestVersion": "已是最新版本", |
| | | "checkFailed": "检查失败", |
| | | "displayName": "私语输入法 (PrivateVoice Dictation)", |
| | | "tagline": "私密离线 · 自定义词库 · 保护隐私", |
| | | "slogan": "真正属于你的语音输入法", |
| | | "offlineText": "本应用完全离线运行,所有语音识别均在本地设备上完成,使用 SenseVoice、Qwen3-ASR、Moonshine English、Parakeet 等本地模型。", |
| | | "noDataText": "数据永不出设备,不会收集、上传或存储任何语音、文本、词库或使用数据。", |
| | | "legalText": "本应用基于开源项目 VoiceSnap 进行二次开发,遵循 MIT License。", |
| | | "legalDetails": "完整版权声明、许可文本及改进详情,请访问:", |
| | | "supportUrl": "https://shanghai3168.github.io/privatevoice-support/", |
| | | "openSupport": "打开版权与许可说明", |
| | | "sourceProjectLabel": "原项目地址", |
| | | "licenseLabel": "版权许可", |
| | | "privacyLabel": "隐私政策", |
| | | "feedbackLabel": "支持与反馈", |
| | | "sourceUrl": "https://github.com/vorojar/VoiceSnap", |
| | | "licenseUrl": "https://shanghai3168.github.io/privatevoice-dictation-support/", |
| | | "privacyUrl": "https://shanghai3168.github.io/privatevoice-dictation-support/privacy.html", |
| | | "feedbackUrl": "https://shanghai3168.github.io/privatevoice-dictation-support/support.html", |
| | | "openSupport": "打开支持与反馈", |
| | | "copyright": "© {year} 私语输入法 · MIT License" |
| | | }, |
| | | "history": { |