i18n(scanner): translate the reconcile walk progress strings

The walk-progress feature left exactly one [TODO: Translate] key behind,
common.scanProgress.walkFiles ("{count} files"), so this is the whole
pending set for all 9 locales. Each rendering reuses the locale's
stages.count_models noun for "files":

  zh-CN {count} 个文件          zh-TW {count} 個檔案
  ja    {count} 件のファイル      ko    파일 {count}개
  fr    {count} fichiers        de    {count} Dateien
  es    {count} archivos        ru    {count} файл(ов)
  he    {count} קבצים

{count} arrives pre-formatted (toLocaleString), so no locale adds digit
grouping, and the string stays a bare fragment: the root labels, the
parentheses and the " | " before the ETA are composed by
static/js/api/baseModelApi.js. ru uses файл(ов) because the counter ticks
live (notEmptyMessageCount precedent).

Also document the new surface in docs/i18n-translation-guidelines.md:
a status note plus the "Scan progress (walk phase)" terminology section
recording the per-locale renderings and the fragment/composition rule.

Verified: python scripts/sync_translation_keys.py --dry-run reports no
pending changes, pytest tests/i18n 20 passed, and
grep -c "TODO: Translate" locales/*.json is 0 everywhere.
This commit is contained in:
Will Miao
2026-10-06 12:42:08 +08:00
parent 14e660e876
commit a48855d576
10 changed files with 38 additions and 9 deletions
+29
View File
@@ -151,6 +151,14 @@ Locales: `en`, `zh-CN`, `zh-TW`, `ja`, `ko`, `fr`, `de`, `es`, `ru`, `he` (RTL).
> nothing is tracked for alerts). Register follows each file's existing norm: 你 (zh-CN),
> 您 (zh-TW), Sie (de), tú (es), вы (ru). No remaining `[TODO: Translate]` placeholders.
> **Status (2026-10, reconcile walk progress):** a regular Refresh now reports the reconcile
> walk per model root (which roots are being checked, how many model files have been seen, and
> an ETA) and splits the progress bar into walk (0-50 %) and new-file (50-99 %) phases, which
> added the single `common.scanProgress.walkFiles` fragment. All 9 locales are translated
> (renderings in §2, "Scan progress (walk phase)"), so the "no remaining placeholders" claim
> holds again. The same pass scoped the client-side ETA to the current stage in
> `static/js/api/baseModelApi.js`; no other locale string changed.
---
## 1. Hard rules (do not violate)
@@ -669,6 +677,27 @@ that form fits a tooltip (ru shortens both toggle labels to bare «Галере
| gallery / vertical list (option labels) | zh-CN 画廊 / 纵向列表 · zh-TW 圖庫 / 垂直清單 · ja ギャラリー / 縦並びリスト · ko 갤러리 / 세로 목록 · fr Galerie / Liste verticale · de Galerie / Vertikale Liste · es Galería / Lista vertical · ru Галерея / Вертикальный список · he גלריה / רשימה אנכית |
| gallery view / list view (toggle tooltips) | zh-CN 画廊视图 / 列表视图 · zh-TW 圖庫檢視 / 清單檢視 · ja ギャラリー表示 / リスト表示 · ko 갤러리 보기 / 목록 보기 · fr Vue galerie / Vue liste · de Galerieansicht / Listenansicht · es Vista de galería / Vista de lista · ru Галерея / Список · he תצוגת גלריה / תצוגת רשימה |
### Scan progress (walk phase)
The manual Refresh dialog renders its status line from `common.scanProgress.*`. During the
reconcile walk the backend does not know the real file count yet (counting *is* the walk), so
the client shows the roots being walked plus a running count instead of a `processed/total`
ratio: `Checking for changes... G:, Y: (12,345 files) | ~3 min remaining`. The bar covers
0-50 % for the walk and 50-99 % for the new-file pass.
| Term | Rendering |
|---|---|
| `walkFiles` ("{count} files") | zh-CN {count} 个文件 · zh-TW {count} 個檔案 · ja {count} 件のファイル · ko 파일 {count}개 · fr {count} fichiers · de {count} Dateien · es {count} archivos · ru {count} файл(ов) · he {count} קבצים |
`walkFiles` is a **fragment, not a sentence**: the root labels, the `(` `)`, the ` | ` before
the ETA and the ETA text itself all come from `static/js/api/baseModelApi.js`, so no locale
carries punctuation here (the ASCII parentheses match the sibling `stages.process_models`
count, `(5/10)`). `{count}` is substituted with an already-formatted number
(`toLocaleString()`), so no locale adds its own digit grouping. "files" means the **model
files the walk looked at**, not every file on disk — the noun mirrors each locale's
`stages.count_models` rendering, and `ru` uses the `файл(ов)` form because the count ticks
live and can be any number (`notEmptyMessageCount` precedent).
---
## 3. Cross-cutting confusion hot-spots (must-fix list)
+1 -1
View File
@@ -74,7 +74,7 @@
"minutes": "~{minutes} Min. verbleibend",
"hours": "~{hours} Std. {minutes} Min. verbleibend"
},
"walkFiles": "[TODO: Translate] {count} files"
"walkFiles": "{count} Dateien"
}
},
"onboarding": {
+1 -1
View File
@@ -74,7 +74,7 @@
"minutes": "Quedan ~{minutes} min",
"hours": "Quedan ~{hours} h {minutes} min"
},
"walkFiles": "[TODO: Translate] {count} files"
"walkFiles": "{count} archivos"
}
},
"onboarding": {
+1 -1
View File
@@ -74,7 +74,7 @@
"minutes": "~{minutes} min restantes",
"hours": "~{hours} h {minutes} min restantes"
},
"walkFiles": "[TODO: Translate] {count} files"
"walkFiles": "{count} fichiers"
}
},
"onboarding": {
+1 -1
View File
@@ -74,7 +74,7 @@
"minutes": "נותרו ~{minutes} דקות",
"hours": "נותרו ~{hours} שעות ו-{minutes} דקות"
},
"walkFiles": "[TODO: Translate] {count} files"
"walkFiles": "{count} קבצים"
}
},
"onboarding": {
+1 -1
View File
@@ -74,7 +74,7 @@
"minutes": "残り約 {minutes} 分",
"hours": "残り約 {hours} 時間 {minutes} 分"
},
"walkFiles": "[TODO: Translate] {count} files"
"walkFiles": "{count} 件のファイル"
}
},
"onboarding": {
+1 -1
View File
@@ -74,7 +74,7 @@
"minutes": "약 {minutes}분 남음",
"hours": "약 {hours}시간 {minutes}분 남음"
},
"walkFiles": "[TODO: Translate] {count} files"
"walkFiles": "파일 {count}개"
}
},
"onboarding": {
+1 -1
View File
@@ -74,7 +74,7 @@
"minutes": "Осталось ~{minutes} мин",
"hours": "Осталось ~{hours} ч {minutes} мин"
},
"walkFiles": "[TODO: Translate] {count} files"
"walkFiles": "{count} файл(ов)"
}
},
"onboarding": {
+1 -1
View File
@@ -74,7 +74,7 @@
"minutes": "剩余约 {minutes} 分钟",
"hours": "剩余约 {hours} 小时 {minutes} 分钟"
},
"walkFiles": "[TODO: Translate] {count} files"
"walkFiles": "{count} 个文件"
}
},
"onboarding": {
+1 -1
View File
@@ -74,7 +74,7 @@
"minutes": "剩餘約 {minutes} 分鐘",
"hours": "剩餘約 {hours} 小時 {minutes} 分鐘"
},
"walkFiles": "[TODO: Translate] {count} files"
"walkFiles": "{count} 個檔案"
}
},
"onboarding": {