From 53a1692d313a1203ddbed3103b13375a8362bca3 Mon Sep 17 00:00:00 2001
From: Ariver <shanghai3168@gmail.com>
Date: Wed, 03 Jun 2026 22:39:30 +0800
Subject: [PATCH] Update about page review info for 2.1.27

---
 privatevoice.src/frontend/package.json                             |    2 
 privatevoice.src/app.go                                            |    4 
 privatevoice.src/build/config.yml                                  |    2 
 privatevoice.src/frontend/package-lock.json                        |    4 
 CHANGELOG.md                                                       |   15 +++++
 privatevoice.src/frontend/src/components/settings/AboutPage.svelte |   93 ++++++++++++++++++++++---------
 privatevoice.src/build/darwin/Info.plist                           |    4 
 privatevoice.src/build/windows/wails.exe.manifest                  |    2 
 privatevoice.src/frontend/src/lib/i18n/zh.json                     |   14 ++++
 privatevoice.src/frontend/src/lib/i18n/en.json                     |   18 ++++-
 10 files changed, 116 insertions(+), 42 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index b6a8111..8e79bb6 100755
--- a/CHANGELOG.md
+++ b/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)
 
 ### 修复
diff --git a/privatevoice.src/app.go b/privatevoice.src/app.go
index daa6fba..fb75c77 100755
--- a/privatevoice.src/app.go
+++ b/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"
 
diff --git a/privatevoice.src/build/config.yml b/privatevoice.src/build/config.yml
index a791b0c..1cd73e0 100755
--- a/privatevoice.src/build/config.yml
+++ b/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: .
diff --git a/privatevoice.src/build/darwin/Info.plist b/privatevoice.src/build/darwin/Info.plist
index 4910b5d..4d72636 100755
--- a/privatevoice.src/build/darwin/Info.plist
+++ b/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>
diff --git a/privatevoice.src/build/windows/wails.exe.manifest b/privatevoice.src/build/windows/wails.exe.manifest
index 22eacb8..13f0118 100755
--- a/privatevoice.src/build/windows/wails.exe.manifest
+++ b/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>
diff --git a/privatevoice.src/frontend/package-lock.json b/privatevoice.src/frontend/package-lock.json
index 8fd1934..fd063e5 100755
--- a/privatevoice.src/frontend/package-lock.json
+++ b/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"
       },
diff --git a/privatevoice.src/frontend/package.json b/privatevoice.src/frontend/package.json
index d2c93d0..839a64b 100755
--- a/privatevoice.src/frontend/package.json
+++ b/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",
diff --git a/privatevoice.src/frontend/src/components/settings/AboutPage.svelte b/privatevoice.src/frontend/src/components/settings/AboutPage.svelte
index 78ddffd..8c814f4 100644
--- a/privatevoice.src/frontend/src/components/settings/AboutPage.svelte
+++ b/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')}
-      </button>
+
+      <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>
diff --git a/privatevoice.src/frontend/src/lib/i18n/en.json b/privatevoice.src/frontend/src/lib/i18n/en.json
index 8211f00..8c83064 100755
--- a/privatevoice.src/frontend/src/lib/i18n/en.json
+++ b/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": {
diff --git a/privatevoice.src/frontend/src/lib/i18n/zh.json b/privatevoice.src/frontend/src/lib/i18n/zh.json
index 99a8181..3b24839 100755
--- a/privatevoice.src/frontend/src/lib/i18n/zh.json
+++ b/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": {

--
Gitblit v1.9.3