Skip to content

fix(mobile): correct Finnish consent, device and glanceable copy - #8340

Merged
iscekic merged 4 commits into
mainfrom
drain/fi-copy-consent-device-glanceable
Oct 22, 2026
Merged

iscekic merged 4 commits into
mainfrom
drain/fi-copy-consent-device-glanceable

Conversation

@iscekic

@iscekic iscekic commented Oct 20, 2026 •

Copy link
Copy Markdown
Collaborator

Change

apps/mobile/src/i18n/locales/fi.json only, 14 values. English stays canonical; no code changes.

  • Consent section bodies. consent.errorScreenshotsWhat puts the masking qualifier on both the screenshots and the recordings, and leaves the on-device masking statement to consent.errorScreenshotsNote, which renders directly below it. consent.performanceProfilingWhat links the sample to sessions ("CPU-profiileja pienen otoksen istunnoista"). consent.performanceProfilingWhy uses the purposive form every sibling consent.*Why on that screen already uses. consent.gatewayWhy uses the authentication term ("Todennus").
  • Device sessions. deviceSessions.signOutThisSessionMessage takes {{device}} as the subject, because the call site passes deviceSessionLabel(...) ("Verkkoselain", "Kilo-Code", "Tuntematon laite"). deviceSessions.currentDeviceUnidentified drops the sentence-final period its sibling noSessions does not have.
  • Short labels. common.imageUnavailable and common.notFound drop the terminal period; notFound is a title at both call sites. common.searchModels expresses the search action that is the field's placeholder and accessibility label.
  • Pagination. common.couldnTLoadMore says loading more items failed, matching the common.loadMore control it accompanies in the pagination footers.
  • Store parity. credits.purchaseOwnedByAnotherAccountPlay reuses the Apple-variant wording, as the English strings are identical apart from the store name.
  • Glanceable. glanceable.finishedIn conveys elapsed time instead of repeating the idle label; glanceable.planOf is a count-agnostic separator instead of a hardcoded step total; glanceable.failure.other is sentence case like its siblings.

One test-only line came with it, unrelated to the copy. todo-list-model-picker.mounted.test.tsx mocks react-native by hand, and the shared to-do settings sheet now registers an Android Back listener, so that mock gains a BackHandler stub in the shape member-limit-sheet.mounted.test.tsx already uses. Without it mobile-test (5/8) fails on a clean main tree 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 matches en.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/8 after building @kilocode/harness-sdk — 153 files, 2021 tests pass, including the to-do model picker suite.
  • Key-level diff of fi.json against main: 14 changed keys, 0 added, 0 removed. The one placeholder ({{device}}) is unchanged.

Runtime probe (i18next, lng: 'fi', the app's compatibilityJSON: 'v4' and interpolation options):

  • every changed key resolves to its new value;
  • deviceSessions.signOutThisSessionMessage with deviceSessions.webBrowser renders Verkkoselain kirjataan ulos. Sen API-käyttöoikeus voi säilyä vielä tunnin ajan.;
  • the Android notification card composition (done, planOf, total joined by spaces) renders 3 / 7;
  • the Live Activity composition (finishedIn + duration) renders Kesti 3 min;
  • the corresponding English values are unchanged.

End to end on the Android emulator, local dev stack, app language Finnish, owned fake account:

  • Consent details screen: 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.
  • Device sessions screen with a second session row, then its confirm sheet: title Kirjataanko tämä istunto ulos? and message Verkkoselain kirjataan ulos. Sen API-käyttöoikeus voi säilyä vielä tunnin ajan.
  • Model picker: search field placeholder and accessibility label Hae malleja….

Limitation: glanceable.planOf and glanceable.failure.other render 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.

  1. Question: finishedIn: iOS composes ${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.
  2. Question: planOf: Android composes [done, planOf, total].join(' '); iOS draws done/total itself. 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.
  3. Question: profilingWhy: The finding asks for an imperative ("Etsi ja korjaa koodi, joka hidastaa sovellusta."), but every sibling fi consent.*Why in 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.
  4. Question: gatewayWhy: "Authentication" in consent.gatewayWhy currently reads "Tunnistaminen" (identification). Which term?
    Answer: Todennus
    Confidence: 0.70 · Precedent: none
  5. Question: loadMore: common.couldnTLoadMore needs new wording ("Lisää ei voitu ladata"). English "Couldn't load more" has no terminal period, but the Finnish pagination/session-load strings around it do ("Istuntojen lataaminen epäonnistui."). Keep the period?
    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.
  6. Question: CI on this PR now fails in mobile-test (5/8): apps/mobile/src/components/todos/todo-list-model-picker.mounted.test.tsx crashes with No "BackHandler" export is defined on the "react-native" mock. It reproduces on a clean origin/main tree (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 added BackHandler.addEventListener to the shared to-do settings sheet, and this suite's hand-written react-native mock lacks that export. My Finnish copy PR touches only fi.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)

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.
@iscekic iscekic added drain Work item from the findings drain janitor:i18n Janitor finding: mobile copy and catalog checks labels Oct 20, 2026
@iscekic

iscekic commented Oct 20, 2026

Copy link
Copy Markdown
Collaborator Author

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.

  • Consent details, the section bodies and the on-device masking note below them.
  • Device sessions, including a second session row whose label comes from the stored user agent.
  • The session sign-out confirmation for that second row, where the device label is the sentence subject.
  • Model picker, whose search field placeholder and accessibility label read "Hae malleja…".

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.

Finnish consent details section bodies and masking note

Finnish device sessions list with an additional session row

Finnish session sign-out confirmation sheet

Finnish model picker search field placeholder

@kilo-code-bot

kilo-code-bot Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: No Issues Found | Recommendation: Merge

Executive Summary

The incremental change is a single-line BackHandler stub in the to-do model picker mounted suite; it matches the shape used by member-limit-sheet.mounted.test.tsx and satisfies the addEventListener → subscription.remove() contract in todo-list-settings-sheet.tsx:76, with the earlier Finnish copy corrections unchanged and re-verified.

Assumptions: [INFERENCE] Mobile checks were not executed in this read-only review; the stub's sufficiency is inferred from the component's usage and the identical sibling mock. Changes from the merged origin/main commits are outside this PR's diff and were not re-reviewed.

Files Reviewed (2 files)
  • apps/mobile/src/components/todos/todo-list-model-picker.mounted.test.tsx
  • apps/mobile/src/i18n/locales/fi.json
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 Summary

The 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)
  • apps/mobile/src/i18n/locales/fi.json

Verified against call sites: glanceable.planOf composes as 3 / 7 on both Android (planText joins with spaces) and iOS (HStack); glanceable.finishedIn always renders before a duration (Kesti 3 min); signOutThisSessionMessage receives a nominative label from deviceSessionLabel (webBrowser, unknownDevice, or a product token), all without a terminal period; and couldnTLoadMore, currentDeviceUnidentified, notFound, and imageUnavailable are standalone labels/paragraphs rather than sentence tails. The masking qualifier added to errorScreenshotsWhat remains non-redundant with errorScreenshotsNote, which is rendered directly beneath it.


Reviewed by deepseek-flash-latest · Input: 59.9K · Output: 3.6K · Cached: 357.4K

Review guidance: REVIEW.md from base branch main

@iscekic iscekic added the merge:bot Bot-owned review; merge when ready once readiness passes and a review approves. label Oct 20, 2026
…-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.
@iscekic iscekic added merge:bot Bot-owned review; merge when ready once readiness passes and a review approves. and removed merge:bot Bot-owned review; merge when ready once readiness passes and a review approves. labels Oct 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

drain Work item from the findings drain janitor:i18n Janitor finding: mobile copy and catalog checks merge:bot Bot-owned review; merge when ready once readiness passes and a review approves.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants