Repository navigation
fix(mobile): correct Finnish consent, device and glanceable copy - #8340
Conversation
The Finnish catalog now states the same facts as English in the consent section bodies, the device-session sign-out dialog and the glanceable status lines, keeps the shared store strings in one wording, and uses the same punctuation as the English labels.
|
bot: Android emulator, local dev stack, app language Finnish, owned test account. Each capture shows the affected Finnish copy on the surface that renders it.
Not captured: the glanceable plan and stop-state labels, which render only inside a session notification card and need a running agent session with a plan; the PR body describes how those were verified. |
Code Review SummaryStatus: No Issues Found | Recommendation: Merge Executive SummaryThe incremental change is a single-line Assumptions: Files Reviewed (2 files)
Previous Review Summary (commit 329e040)Current summary above is authoritative. Previous snapshots are kept for context only. Previous review (commit 329e040)Status: No Issues Found | Recommendation: Merge Executive SummaryThe 14 Finnish copy corrections match English meaning, caller composition, and sibling punctuation; no runtime or security concerns in this translation-only change. Files Reviewed (1 file)
Verified against call sites: Reviewed by deepseek-flash-latest · Input: 59.9K · Output: 3.6K · Cached: 357.4K Review guidance: REVIEW.md from base branch |
…-device-glanceable # Conflicts: # apps/mobile/src/i18n/locales/fi.json
The shared to-do settings sheet answers Android Back through BackHandler, so the mounted suite's hand-written react-native mock needs that export to mount the sheet.
…-device-glanceable




Change
apps/mobile/src/i18n/locales/fi.jsononly, 14 values. English stays canonical; no code changes.consent.errorScreenshotsWhatputs the masking qualifier on both the screenshots and the recordings, and leaves the on-device masking statement toconsent.errorScreenshotsNote, which renders directly below it.consent.performanceProfilingWhatlinks the sample to sessions ("CPU-profiileja pienen otoksen istunnoista").consent.performanceProfilingWhyuses the purposive form every siblingconsent.*Whyon that screen already uses.consent.gatewayWhyuses the authentication term ("Todennus").deviceSessions.signOutThisSessionMessagetakes{{device}}as the subject, because the call site passesdeviceSessionLabel(...)("Verkkoselain", "Kilo-Code", "Tuntematon laite").deviceSessions.currentDeviceUnidentifieddrops the sentence-final period its siblingnoSessionsdoes not have.common.imageUnavailableandcommon.notFounddrop the terminal period;notFoundis a title at both call sites.common.searchModelsexpresses the search action that is the field's placeholder and accessibility label.common.couldnTLoadMoresays loading more items failed, matching thecommon.loadMorecontrol it accompanies in the pagination footers.credits.purchaseOwnedByAnotherAccountPlayreuses the Apple-variant wording, as the English strings are identical apart from the store name.glanceable.finishedInconveys elapsed time instead of repeating the idle label;glanceable.planOfis a count-agnostic separator instead of a hardcoded step total;glanceable.failure.otheris sentence case like its siblings.One test-only line came with it, unrelated to the copy.
todo-list-model-picker.mounted.test.tsxmocksreact-nativeby hand, and the shared to-do settings sheet now registers an Android Back listener, so that mock gains aBackHandlerstub in the shapemember-limit-sheet.mounted.test.tsxalready uses. Without itmobile-test (5/8)fails on a cleanmaintree as well;main's own CI does not run the mobile jobs.Verification
Repository checks:
node tools/i18n/check-catalogs.mjs— 87 languages, every catalog matchesen.json.node tools/i18n/check-plurals.mjs— every counted message declares its categories.pnpm --filter kilo-app exec vitest run src/i18n— 16 files, 1611 tests pass.pnpm --filter kilo-app exec vitest run --shard=5/8after building@kilocode/harness-sdk— 153 files, 2021 tests pass, including the to-do model picker suite.fi.jsonagainstmain: 14 changed keys, 0 added, 0 removed. The one placeholder ({{device}}) is unchanged.Runtime probe (i18next,
lng: 'fi', the app'scompatibilityJSON: 'v4'and interpolation options):deviceSessions.signOutThisSessionMessagewithdeviceSessions.webBrowserrendersVerkkoselain kirjataan ulos. Sen API-käyttöoikeus voi säilyä vielä tunnin ajan.;done,planOf,totaljoined by spaces) renders3 / 7;finishedIn+ duration) rendersKesti 3 min;End to end on the Android emulator, local dev stack, app language Finnish, owned fake account:
Miksi: Todennus, pyyntöjen reititys ja laskutuksen täsmäytys.,Mitä: Peitetyt näyttökuvat virhetilanteista ja peitetyt tallenteet pienen otoksen istunnoista.,Mitä: CPU-profiileja pienen otoksen istunnoista, mukaan lukien funktionimet ja kutsupinot.,Miksi: Sovellusta hidastavan koodin etsimiseen ja korjaamiseen.Kirjataanko tämä istunto ulos?and messageVerkkoselain kirjataan ulos. Sen API-käyttöoikeus voi säilyä vielä tunnin ajan.Hae malleja….Limitation:
glanceable.planOfandglanceable.failure.otherrender inside the session notification card, which needs a running agent session with a plan. No such session ran here, so those two are covered by the composition probe above rather than by a screenshot.Screenshots are attached in a follow-up comment.
Proxy answers
The owner's proxy gave these answers in the owner's place.
${finishedIn} ${duration}(e.g. "Finished in 3 min"). Which Finnish value replaces "Valmis"?Answer: Kesti
Confidence: 0.75 · Precedent: Make every surface pleasant to look at: "remove redundant copy" (session a247f3c19b1e). It is short, idiomatic, keeps the elapsed-time sense, and fits the tight Live Activity space.
[done, planOf, total].join(' '); iOS drawsdone/totalitself. Which Finnish value replaces the hardcoded "viidestä" ("of five")?Answer: /
Confidence: 0.75 · Precedent: Keep similar elements consistent across surfaces: "owner asked that the thought row match the tool call row" (session a247f3c19b1e). Android then matches the done/total form that iOS already draws.
consent.*Whyin the same section is a purposive noun phrase ("Kaatumisten tunnistamiseen ja korjaamiseen.", "Sen selvittämiseen, mitä sovellus näytti…"). Which form should performanceProfilingWhy take?Answer: Follow section convention
Confidence: 0.70 · Precedent: Keep similar elements consistent across surfaces: "owner asked that the thought row match the tool call row" (session a247f3c19b1e). It matches the five sibling Why strings shown on the same screen.
Answer: Todennus
Confidence: 0.70 · Precedent: none
Answer: Keep period
Confidence: 0.55 · Precedent: Keep similar elements consistent across surfaces: "owner asked that the thought row match the tool call row" (session a247f3c19b1e). It matches the sibling Finnish pagination-failure strings.
mobile-test (5/8):apps/mobile/src/components/todos/todo-list-model-picker.mounted.test.tsxcrashes withNo "BackHandler" export is defined on the "react-native" mock. It reproduces on a cleanorigin/maintree (main's own CI skips mobile jobs, so no PR caught it); main's fix(mobile): keep a form sheet open while its content scrolls #8249 addedBackHandler.addEventListenerto the shared to-do settings sheet, and this suite's hand-writtenreact-nativemock lacks that export. My Finnish copy PR touches onlyfi.json, so this is pre-existing main breakage, but it blocks merge. How should I unblock it?Answer: Add the one-line BackHandler stub here
Confidence: 0.72 · Precedent: Autonomy: 'If you see a gap or an error, fix it, even if it is not related to the current task' — session a247f3c19b1e: 'fix the error even though it's unrelated'; also 'a work item must converge' (2f71af3a787e)