From cb813a119bb33e47eddd702f3e13a70fffa6662e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=9A=A9=EC=9D=80?= Date: Mon, 10 Aug 2026 00:46:43 +0900 Subject: [PATCH] i18n(store): add the zh-CN store listing and correct the language count MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The app ships seven UI languages as of #294, but the store metadata still described six and had no Chinese listing at all — so a Chinese F-Droid page would have rendered in English while claiming the app speaks six languages, one of which is now its own. Adds `fastlane/metadata/android/zh-CN/` with a short description, a full description, and the changelog for the current versionCode (124). Only the current one: F-Droid and Play show the latest note, and backfilling 25 historical changelogs into a locale that did not exist would be inventing a record rather than keeping one. The "6 languages" line becomes 7 in all six existing full descriptions. Three hard-coded locale lists had to learn zh-CN, and missing any one of them breaks a different thing: - `noteLocales` in app/build.gradle.kts — the release-notes export throws if a locale has no changelog for the versionCode, so this is what actually enforces the new locale from here on. - `$StoreLocales` in verify-release-notes.ps1 — the pre-cut character check (Play caps notes at 500; zh-CN comes in at 124). - `$StoreLocales` in verify-release-export.ps1 — the post-export check that every locale block reached the notes file. AGENTS.md said "6 store locales" in four places and listed the locale tags in a fifth. Left as-is, the next release would have followed that instruction, written six changelogs, and failed the export gate. Note for the next cut: verify-release-export.ps1 now fails against the *existing* v2.32.2 export in D:\Build, which predates zh-CN. That is expected and was left alone deliberately — re-running the export would rewrite the AAB and R8 mapping, and those have to keep matching the binary that actually shipped. The next release regenerates the file with all seven blocks. Verified: verify-release-notes.ps1 passes on 7 locales, gradle configuration is clean. Co-Authored-By: Claude Opus 5 --- AGENTS.md | 12 +++--- app/build.gradle.kts | 2 +- .../android/de-DE/full_description.txt | 2 +- .../android/en-US/full_description.txt | 2 +- .../android/es-ES/full_description.txt | 2 +- .../android/fr-FR/full_description.txt | 2 +- .../android/ja-JP/full_description.txt | 2 +- .../android/ko-KR/full_description.txt | 2 +- .../metadata/android/zh-CN/changelogs/124.txt | 1 + .../android/zh-CN/full_description.txt | 37 +++++++++++++++++++ .../android/zh-CN/short_description.txt | 1 + scripts/verify-release-export.ps1 | 2 +- scripts/verify-release-notes.ps1 | 2 +- 13 files changed, 54 insertions(+), 15 deletions(-) create mode 100644 fastlane/metadata/android/zh-CN/changelogs/124.txt create mode 100644 fastlane/metadata/android/zh-CN/full_description.txt create mode 100644 fastlane/metadata/android/zh-CN/short_description.txt diff --git a/AGENTS.md b/AGENTS.md index f735f876..4698354a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -80,7 +80,7 @@ CI 또는 릴리즈 검증 시에는 APK 산출물 확인을 반드시 포함한 - `app/build/outputs/apk/debug/app-debug.apk` 파일 존재 여부 확인 - GitHub Release에서 APK 다운로드 가능 여부와 크기가 0보다 큰지 확인 -- 태그 전에 `pwsh scripts/verify-release-export.ps1` — `D:\Build`의 AAB·mapping·6개 +- 태그 전에 `pwsh scripts/verify-release-export.ps1` — `D:\Build`의 AAB·mapping·7개 로케일 노트가 현재 versionName/versionCode로 존재하고 비어 있지 않은지 확인한다. **이것이 릴리스 자산의 유일한 영구 사본 검증이다**(D066). - GitLab 쪽 검증은 `GITLAB_RELEASE_MIRROR=true`일 때만 적용된다. **2026-08-05(v2.32.2)부터 @@ -108,7 +108,7 @@ Android 프로젝트가 아직 초기화되지 않았다면 먼저 표준 Kotlin - `markleaf-v-vc.aab` — `app/build/outputs/bundle/release/app-release.aab`(서명) 복사본 - `markleaf-v-vc.mapping.txt` — R8 mapping(Play 크래시 deobfuscation; 있으면 복사). AAB가 없으면 task가 예외를 던지지만 mapping은 warn만 남기고 넘어가므로, AAB가 나왔다고 mapping도 나왔다고 볼 수 없다 — `scripts/verify-release-export.ps1`이 이것까지 확인한다 -- `markleaf-v-vc-release-notes.txt` — **모든 스토어 로케일**(ko-KR / en-US / ja-JP / de-DE / fr-FR / es-ES)의 `fastlane/metadata/android//changelogs/.txt`를 읽어 하나의 파일에 로케일 태그 블록을 연달아 묶음 +- `markleaf-v-vc-release-notes.txt` — **모든 스토어 로케일**(ko-KR / en-US / ja-JP / zh-CN / de-DE / fr-FR / es-ES)의 `fastlane/metadata/android//changelogs/.txt`를 읽어 하나의 파일에 로케일 태그 블록을 연달아 묶음 TXT 파일은 바로 복사/붙여넣기 가능해야 하며, 각 로케일 릴리즈 노트만 아래 태그로 감싼다. 태그 밖에는 어떤 설명이나 문구도 넣지 않는다 (Gradle task가 이 형식을 보장한다). @@ -133,7 +133,7 @@ TXT 파일은 바로 복사/붙여넣기 가능해야 하며, 각 로케일 릴 ``` -따라서 cut 전에 **6개 스토어 로케일 fastlane changelog 전부**(BCP 47 region 대문자)가 새 versionCode 파일명으로 작성되어 있어야 task가 통과한다. 하나라도 누락되거나 로케일당 500자를 넘으면 task가 명시적으로 실패한다. +따라서 cut 전에 **7개 스토어 로케일 fastlane changelog 전부**(BCP 47 region 대문자)가 새 versionCode 파일명으로 작성되어 있어야 task가 통과한다. 하나라도 누락되거나 로케일당 500자를 넘으면 task가 명시적으로 실패한다. GitLab CI용 산출물은 `-Pmarkleaf.releaseExportDir=`와 함께 `:app:exportReleaseArtifacts`를 실행한다. 이 task는 위 3개 파일에 서명 APK를 더해 내보내며, @@ -185,7 +185,7 @@ GitLab CI용 산출물은 `-Pmarkleaf.releaseExportDir=`와 함께 Play 제출용 서명 AAB와 릴리즈 노트 TXT를 내보낸다(서명 AAB는 CI 릴리스 산출물 기준). 업로드는 메인테이너가 수동으로 한다. 5. **마감 + 보고.** 해결된 이슈에 감사 댓글을 달고 닫되, 사용자측 확인이 남으면 열어 둔다. - 굵직한 변경이면 README·랜딩 페이지의 버전 표기를 6개 언어 모두 갱신하고 + 굵직한 변경이면 README·랜딩 페이지의 버전 표기를 7개 언어 모두 갱신하고 `scripts/verify-landing-versions.ps1`로 검증한다. 마지막으로 무엇이 나갔는지, 이슈 상태, 릴리스 링크를 보고한다. @@ -258,9 +258,9 @@ Markleaf 사용자 대부분이 영어를 쓰므로 공개 문서의 기본 언 - 이슈 번호(`#123`), 코드 식별자, 파일 경로, 제품명은 번역하지 않고 그대로 둔다. - v2.16.0 이전 항목은 영어화 대상이 아니다. `CHANGELOG.md`의 "Earlier releases (Korean)" 이후 구간과 `CHANGELOG.ko.md`에 한국어로 보존되어 있으며 소급 번역하지 않는다. -Play/F-Droid용 `fastlane/metadata/android//changelogs/.txt`는 기존대로 **6개 스토어 로케일 전부** 작성한다. 이 지침은 [Release Artifact Export](#release-artifact-export)의 6개 로케일 요구사항을 대체하지 않는다. +Play/F-Droid용 `fastlane/metadata/android//changelogs/.txt`는 기존대로 **7개 스토어 로케일 전부** 작성한다. 이 지침은 [Release Artifact Export](#release-artifact-export)의 7개 로케일 요구사항을 대체하지 않는다. -README와 GitHub Pages 랜딩도 영어가 기본이며 앱이 지원하는 6개 언어(en · ko · ja · de · es · fr)로 병기한다. 영어판이 canonical이고 `x-default`다. 공개 표면의 버전 표기를 갱신할 때는 6개 언어를 함께 갱신하고 `scripts/verify-landing-versions.ps1`로 검증한다. +README와 GitHub Pages 랜딩도 영어가 기본이며 앱이 지원하는 7개 언어(en · ko · ja · zh · de · es · fr)로 병기한다. 영어판이 canonical이고 `x-default`다. 공개 표면의 버전 표기를 갱신할 때는 7개 언어를 함께 갱신하고 `scripts/verify-landing-versions.ps1`로 검증한다. ### GitHub 공개 표면 콘텐츠 — 영어 기본 diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 406383e7..9ac7a881 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -240,7 +240,7 @@ val writeReleaseArtifacts: (File, Boolean) -> Unit = { exportDir, includeApk -> // Every locale must have a changelog for this versionCode; fail fast so // a cut never ships notes that silently drop a locale. val fastlaneRoot = rootProject.file("fastlane/metadata/android") - val noteLocales = listOf("ko-KR", "en-US", "ja-JP", "de-DE", "fr-FR", "es-ES") + val noteLocales = listOf("ko-KR", "en-US", "ja-JP", "zh-CN", "de-DE", "fr-FR", "es-ES") val sources = noteLocales.associateWith { File(fastlaneRoot, "$it/changelogs/$versionCode.txt") } val missing = noteLocales.filter { !sources.getValue(it).isFile } diff --git a/fastlane/metadata/android/de-DE/full_description.txt b/fastlane/metadata/android/de-DE/full_description.txt index fec032e1..32eeb672 100644 --- a/fastlane/metadata/android/de-DE/full_description.txt +++ b/fastlane/metadata/android/de-DE/full_description.txt @@ -27,7 +27,7 @@ Design und Barrierefreiheit: * Homescreen-Widget, biometrische Sperre, Option zum Blockieren von Screenshots * Hell / dunkel / Material You, Tablet-Layout mit zwei Spalten -* Oberfläche in 6 Sprachen (Koreanisch, Englisch, Spanisch, Japanisch, Französisch, Deutsch) +* Oberfläche in 7 Sprachen (Koreanisch, Englisch, Spanisch, Japanisch, Französisch, Deutsch, Vereinfachtes Chinesisch) Datenschutz und Verteilung: diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt index 864d38ca..4a88ba41 100644 --- a/fastlane/metadata/android/en-US/full_description.txt +++ b/fastlane/metadata/android/en-US/full_description.txt @@ -27,7 +27,7 @@ Design and accessibility: * Home screen widget, biometric lock, screenshot blocking option * Light / dark / Material You, tablet two-pane layout -* UI in 6 languages (Korean, English, Spanish, Japanese, French, German) +* UI in 7 languages (Korean, English, Spanish, Japanese, French, German, Simplified Chinese) Privacy and distribution: diff --git a/fastlane/metadata/android/es-ES/full_description.txt b/fastlane/metadata/android/es-ES/full_description.txt index fffd56c2..85d62651 100644 --- a/fastlane/metadata/android/es-ES/full_description.txt +++ b/fastlane/metadata/android/es-ES/full_description.txt @@ -27,7 +27,7 @@ Diseño y accesibilidad: * Widget de pantalla de inicio, bloqueo biométrico, opción de bloqueo de capturas de pantalla * Claro / oscuro / Material You, diseño de dos paneles para tablets -* Interfaz en 6 idiomas (coreano, inglés, español, japonés, francés, alemán) +* Interfaz en 7 idiomas (coreano, inglés, español, japonés, francés, alemán, chino simplificado) Privacidad y distribución: diff --git a/fastlane/metadata/android/fr-FR/full_description.txt b/fastlane/metadata/android/fr-FR/full_description.txt index 09875e84..74a04fb3 100644 --- a/fastlane/metadata/android/fr-FR/full_description.txt +++ b/fastlane/metadata/android/fr-FR/full_description.txt @@ -27,7 +27,7 @@ Design et accessibilité : * Widget d'écran d'accueil, verrouillage biométrique, option de blocage des captures d'écran * Clair / sombre / Material You, disposition à deux volets pour tablettes -* Interface en 6 langues (coréen, anglais, espagnol, japonais, français, allemand) +* Interface en 7 langues (coréen, anglais, espagnol, japonais, français, allemand, chinois simplifié) Confidentialité et distribution : diff --git a/fastlane/metadata/android/ja-JP/full_description.txt b/fastlane/metadata/android/ja-JP/full_description.txt index a8e4e6d9..428a397e 100644 --- a/fastlane/metadata/android/ja-JP/full_description.txt +++ b/fastlane/metadata/android/ja-JP/full_description.txt @@ -27,7 +27,7 @@ Markleaf は Android 向けのローカルファースト Markdown ノートア * ホーム画面ウィジェット、生体認証ロック、スクリーンショット遮断オプション * ライト / ダーク / Material You、タブレット向け 2ペインレイアウト -* 6 言語の UI(韓国語、英語、スペイン語、日本語、フランス語、ドイツ語) +* 7 言語の UI(韓国語、英語、スペイン語、日本語、フランス語、ドイツ語、簡体字中国語) プライバシーと配布: diff --git a/fastlane/metadata/android/ko-KR/full_description.txt b/fastlane/metadata/android/ko-KR/full_description.txt index 41f80ff2..00e53840 100644 --- a/fastlane/metadata/android/ko-KR/full_description.txt +++ b/fastlane/metadata/android/ko-KR/full_description.txt @@ -27,7 +27,7 @@ Markleaf는 Android용 로컬 우선(local-first) Markdown 메모 앱입니다. * 홈 화면 위젯, 생체 인증 잠금, 스크린샷 차단 옵션 * 라이트 / 다크 / Material You, 태블릿 2-pane 레이아웃 -* 6개 언어 UI (한국어, 영어, 스페인어, 일본어, 프랑스어, 독일어) +* 7개 언어 UI (한국어, 영어, 스페인어, 일본어, 프랑스어, 독일어, 중국어 간체) 개인정보와 배포 원칙: diff --git a/fastlane/metadata/android/zh-CN/changelogs/124.txt b/fastlane/metadata/android/zh-CN/changelogs/124.txt new file mode 100644 index 00000000..62e05be7 --- /dev/null +++ b/fastlane/metadata/android/zh-CN/changelogs/124.txt @@ -0,0 +1 @@ +编辑器中的两处配色修复。引用块和分隔线此前使用固定的灰色,不随主题变化,在浅色页面上的对比度低于正文保持可读所需的程度;现在它们会像编辑器中其他结构标记一样跟随主题。标记笔记已锁定为预览模式的琥珀色徽章,在浅色顶栏上也过淡,现已加深。深色主题不变。 diff --git a/fastlane/metadata/android/zh-CN/full_description.txt b/fastlane/metadata/android/zh-CN/full_description.txt new file mode 100644 index 00000000..ea6cf569 --- /dev/null +++ b/fastlane/metadata/android/zh-CN/full_description.txt @@ -0,0 +1,37 @@ +Markleaf 是一款面向 Android 的本地优先 Markdown 笔记应用。 + +书写纯 Markdown,用内联标签整理,即时搜索,让笔记始终由你掌控。Markleaf 将笔记保存在本地 Room 数据库中,并且不声明 INTERNET 权限。 + +书写与预览: + +* 实时 Markdown 预览,支持实时语法着色 +* GFM 表格、复选框、引用、提示块(> [!NOTE] …) +* 10 种语言的代码块语法高亮 +* 脚注引用 ↔ 定义跳转、Wiki 链接与反向链接 +* 智能格式化,为选区或单词加上粗体/斜体/删除线/代码 +* 专注模式、词数与阅读时长统计、笔记内查找替换 + +整理与导航: + +* 只需在正文中写 #标签 即可自动索引(无需文件夹) +* 快速切换与 SQLite FTS 全文搜索 +* 置顶、归档、回收站与恢复流程 + +同步与导入(No-Cloud): + +* 通过 SAF 选择文件夹,把每篇笔记镜像为 .md 文件 +* 用打开或分享的方式导入外部 .md / .txt 文件 +* 单篇与全部笔记的 Markdown 导出,以及系统分享 + +设计与无障碍: + +* 主屏幕小组件、生物识别锁、屏蔽截屏选项 +* 浅色 / 深色 / Material You,平板双栏布局 +* 7 种语言界面(韩语、英语、西班牙语、日语、法语、德语、简体中文) + +隐私与分发: + +* 无需账户,没有 Markleaf 服务器 +* 没有分析、广告、跟踪、Firebase 或专有崩溃报告 SDK +* 不声明 INTERNET 权限,已关闭 Android 自动备份 +* 只有在你明确执行导出、分享、打开外部链接或选择 SAF 文件夹等由系统中介的操作时,用户数据才会离开设备 diff --git a/fastlane/metadata/android/zh-CN/short_description.txt b/fastlane/metadata/android/zh-CN/short_description.txt new file mode 100644 index 00000000..4f31b030 --- /dev/null +++ b/fastlane/metadata/android/zh-CN/short_description.txt @@ -0,0 +1 @@ +本地优先的 Markdown 笔记,支持标签、搜索与文件导出 diff --git a/scripts/verify-release-export.ps1 b/scripts/verify-release-export.ps1 index d9ee5cb1..f3cbd0af 100644 --- a/scripts/verify-release-export.ps1 +++ b/scripts/verify-release-export.ps1 @@ -37,7 +37,7 @@ Set-StrictMode -Version Latest # app/build.gradle.kts 의 noteLocales 와 같은 목록이어야 한다. 릴리스 노트 TXT 는 # 로케일마다 ... 블록을 연달아 담는다(writeReleaseArtifacts). -$StoreLocales = @("ko-KR", "en-US", "ja-JP", "de-DE", "fr-FR", "es-ES") +$StoreLocales = @("ko-KR", "en-US", "ja-JP", "zh-CN", "de-DE", "fr-FR", "es-ES") function Resolve-UnderRoot([string]$Path) { if ([System.IO.Path]::IsPathRooted($Path)) { return $Path } diff --git a/scripts/verify-release-notes.ps1 b/scripts/verify-release-notes.ps1 index 2d5c8f36..219ddca1 100644 --- a/scripts/verify-release-notes.ps1 +++ b/scripts/verify-release-notes.ps1 @@ -41,7 +41,7 @@ $PlayNoteLimit = 500 $PlayNoteWarnAt = [int][math]::Floor($PlayNoteLimit * 0.9) # app/build.gradle.kts 의 noteLocales 와 같은 목록이어야 한다. -$StoreLocales = @("ko-KR", "en-US", "ja-JP", "de-DE", "fr-FR", "es-ES") +$StoreLocales = @("ko-KR", "en-US", "ja-JP", "zh-CN", "de-DE", "fr-FR", "es-ES") function Resolve-UnderRoot([string]$Path) { if ([System.IO.Path]::IsPathRooted($Path)) { return $Path }