Ariver
2026-06-03 53a1692d313a1203ddbed3103b13375a8362bca3
Update about page review info for 2.1.27
10 files modified
156 ■■■■ changed files
CHANGELOG.md 15 ●●●●● patch | view | raw | blame | history
privatevoice.src/app.go 4 ●●●● patch | view | raw | blame | history
privatevoice.src/build/config.yml 2 ●●● patch | view | raw | blame | history
privatevoice.src/build/darwin/Info.plist 4 ●●●● patch | view | raw | blame | history
privatevoice.src/build/windows/wails.exe.manifest 2 ●●● patch | view | raw | blame | history
privatevoice.src/frontend/package-lock.json 4 ●●●● patch | view | raw | blame | history
privatevoice.src/frontend/package.json 2 ●●● patch | view | raw | blame | history
privatevoice.src/frontend/src/components/settings/AboutPage.svelte 91 ●●●● patch | view | raw | blame | history
privatevoice.src/frontend/src/lib/i18n/en.json 18 ●●●● patch | view | raw | blame | history
privatevoice.src/frontend/src/lib/i18n/zh.json 14 ●●●● patch | view | raw | blame | history
CHANGELOG.md
@@ -1,5 +1,20 @@
# Changelog
## v2.1.27 (2026-06-03)
### QA 候选包
- **关于页审核信息补全**:关于页显示 `私语输入法 (PrivateVoice Dictation)`、离线识别说明、数据不出设备声明、开源项目归属、版权许可、隐私政策和支持反馈链接。
- **苹果审核链接更新**:版权许可、隐私政策、支持反馈统一指向 `privatevoice-dictation-support` 支持站点;保留 VoiceSnap 原项目地址入口。
- **英文界面同步**:English 关于页同步展示等价隐私与许可说明,避免系统语言为英文时仍显示旧审核信息。
### 构建
- build: `20260603.2238`
- 说明: 本版本为关于页审核信息补全后的用户验收候选包。
---
## v2.1.26 (2026-06-03)
### 修复
privatevoice.src/app.go
@@ -27,8 +27,8 @@
)
const (
    appVersion        = "2.1.26"
    appBuild          = "20260603.2151"
    appVersion        = "2.1.27"
    appBuild          = "20260603.2238"
    appDisplayVersion = appVersion + " (build " + appBuild + ")"
    appName           = "PrivateVoice Dictation"
privatevoice.src/build/config.yml
@@ -7,7 +7,7 @@
  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: .
privatevoice.src/build/darwin/Info.plist
@@ -17,9 +17,9 @@
    <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>
privatevoice.src/build/windows/wails.exe.manifest
@@ -3,7 +3,7 @@
  <assemblyIdentity
    type="win32"
    name="PrivateVoice.Dictation"
    version="2.1.26.0"
    version="2.1.27.0"
    processorArchitecture="*"/>
  <dependency>
    <dependentAssembly>
privatevoice.src/frontend/package-lock.json
@@ -1,12 +1,12 @@
{
  "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"
      },
privatevoice.src/frontend/package.json
@@ -1,7 +1,7 @@
{
  "name": "privatevoice-dictation-frontend",
  "private": true,
  "version": "2.1.26",
  "version": "2.1.27",
  "type": "module",
  "scripts": {
    "dev": "vite dev",
privatevoice.src/frontend/src/components/settings/AboutPage.svelte
@@ -3,8 +3,14 @@
  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 {
@@ -14,29 +20,38 @@
  }
  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>
@@ -52,31 +67,25 @@
    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 {
@@ -100,15 +109,38 @@
  .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;
@@ -116,6 +148,7 @@
    font: inherit;
    cursor: pointer;
    word-break: break-all;
    text-align: left;
  }
  .support-btn {
@@ -137,10 +170,9 @@
  }
  .bottom {
    position: absolute;
    bottom: 20px;
    left: 30px;
    right: 30px;
    width: min(560px, 100%);
    margin-top: auto;
    padding-top: 22px;
    text-align: center;
  }
@@ -154,4 +186,11 @@
    font-size: var(--font-size-xs);
    color: var(--color-tertiary-label);
  }
  @media (max-width: 520px) {
    .link-row {
      grid-template-columns: 1fr;
      gap: 2px;
    }
  }
</style>
privatevoice.src/frontend/src/lib/i18n/en.json
@@ -134,12 +134,22 @@
    "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": {
privatevoice.src/frontend/src/lib/i18n/zh.json
@@ -134,12 +134,22 @@
    "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": {