Skip to content

fix(mobile): translate unavailable notification category reasons - #6452

Open
iscekic wants to merge 1 commit into
mainfrom
kwf/explorer-notifications-toggled-same-screen-the-security-n-dbd2b-362e
Open

iscekic wants to merge 1 commit into
mainfrom
kwf/explorer-notifications-toggled-same-screen-the-security-n-dbd2b-362e

Conversation

@iscekic

@iscekic iscekic commented Sep 21, 2026

Copy link
Copy Markdown
Collaborator

Changelog for users

  • An unavailable notifications category now shows its reason in the app's language.
  • English server prose no longer appears inside a non-English notifications list.
  • The Security findings row explains how to get findings in the user's language.
  • The KiloClaw activity and balance alerts rows show translated reasons in the same way.

Changelog for maintainers

  • The notifications screen ignores the response's unavailableReason; it renders catalog copy keyed by category instead.
  • NotificationCategoryCapability now carries only available.
  • Only KiloClaw activity, balance alerts, and security findings can be unavailable; the other four stay always available.
  • Every locale catalog adds the three notifications.category.*Unavailable keys; the English source copy lives in en.json.
  • A new i18n test requires each locale's reason copy to be non-empty and different from the English string.
  • Catalog parity tracks keys written in English before translation lands; that pending set is empty today.
  • Review hint: read the reason copy for each language, especially RTL Arabic, before merge.

E2E proof

[e4] ux-check: unavailable Security findings row follows the app language (android) — On android emulator-5554, in the same unavailable-capability state (disabled Security findings switch), switching the app language in-session showed the row's catalog copy in German (e4-de-notifications.txt: 'Aktiviere den Kilo-Sicherheitsagenten für einen Bereich, um Sicherheitsbefunde zu erhalten.') and in Spanish (e4-es-notifications.txt: 'Activa el agente de seguridad de Kilo en un ámbito para recibir hallazgos de seguridad.'), never the server's English prose (English baseline in scripted-e1.log), with no app restart; screenshots e4-de-notifications.png / e4-es-notifications.png for the…

[e4] ux-check: unavailable Security findings row follows the app language (android) — prior/e4-es-notifications.png

[e4] ux-check: unavailable Security findings row follows the app language (android)

[e4] ux-check: unavailable Security findings row follows the app language (android) — prior/e4-de-notifications.png

[e1] notifications-toggled Arabic — Security findings row disabled with the Arabic reason, chat row keeps its Arabic subtitle, English sentence absent — android emulator-5554; declared start state restored first ('STATE HIT signed-in-home', e1-state.log); the account's Security Agent config was disabled before the run (db.sh: agent_configs security_scan is_enabled=false, selected_repository_ids=[]) and restored to that seeded shape afterwards; the scene passed — e1-run.log:1 'SCENE e1 OK' — and the same moment's digest carries the Arabic reason 'android.widget.TextView فعّل وكيل أمان Kilo على نطاق للحصول على ملاحظات الأمان. tappable [232,1891][923,1928]' (e1-run.log:31) under 'android.widget.TextView ملاحظات الأمان tappable…

[e1] notifications-toggled Arabic — Security findings row disabled with the Arabic reason, chat row keeps its Arabic subtitle, English sentence absent — e2e-mobile-app/e1-notifications-ar.png

[e1] notifications-toggled Arabic — Security findings row disabled with the Arabic reason, chat row keeps its Arabic subtitle, English sentence absent

[e1] notifications-toggled Arabic — Security findings row disabled with the Arabic reason, chat row keeps its Arabic subtitle, English sentence absent — e2e-mobile-app/e1.png

[e3] ux-check: Arabic (RTL) Notifications shows the Arabic Security findings reason, no English prose — android emulator-5606; app set to العربية via Profile > Account > Language, signed in as the e2e account with Security findings unavailable; SCENE e3 OK digest (e3-run.log) shows 'android.widget.TextView ملاحظات الأمان' with 'android.widget.TextView فعّل وكيل أمان Kilo على نطاق للحصول على ملاحظات الأمان.', the switch [disabled], and the scripted absent step for the English sentence passed (grep 'Enable Kilo Security Agent' = 0 in e3-run.log); zero UX-DEFECT observed in the digest, screenshots left to the visual reviewer.

[e3] ux-check: Arabic (RTL) Notifications shows the Arabic Security findings reason, no English prose — prior/e3.png

[e2] ux-check: With all categories available, every category row keeps its original short subtitle (e.g. — android emulator-5554; the all-categories-available state was created through the product's own Security Agent screen (Personal scope, repo iscekic/wf-fake-test selected → agent_configs security_scan is_enabled=true, selected_repository_ids=[1338954801] at run time, reverted to disabled with no repos afterwards) and the parked replay then passed — e2-run.log:2 'SCENE e2 OK' — with the gated row available on its original subtitle 'android.widget.TextView new findings and SLA reminders tappable [157,1855][848,1892]' (e2-run.log:32) under 'android.widget.TextView Security findings tappable…

[e2] ux-check: With all categories available, every category row keeps its original short subtitle (e.g. — e2e-mobile-app/e2.png

E2E proof — log excerpts

[e1] notifications-toggled Arabic — Security findings row disabled with the Arab -> pass :: android emulator-5554; declared start state restored first ('STATE HIT signed-in-home', e1-state.log); the account's Security Agent config was disabled before the run (db.sh: agent_configs security_scan is_enabled=false, selected_repository_ids=[]) and restored to that seeded shape afterwards; the scene passed — e1-run.log:1 'SCENE e1 OK' — and the same moment's digest carries the Arabic reason 'android.widget.TextView فعّل وكيل أمان Kilo على نطاق للحصول على ملاحظات الأمان. tappable [232,1891][923,1928]' (e1-run.log:31) under 'android.widget.TextView ملاحظات الأمان tappable [232,1841][923,1887]' (e1-run.log:30) with the chat row's own subtitle 'android.widget.TextView الردود في محادثاتك tapp
[e2] ux-check: With all categories available, every category row keeps its origi -> pass :: android emulator-5554; the all-categories-available state was created through the product's own Security Agent screen (Personal scope, repo iscekic/wf-fake-test selected → agent_configs security_scan is_enabled=true, selected_repository_ids=[1338954801] at run time, reverted to disabled with no repos afterwards) and the parked replay then passed — e2-run.log:2 'SCENE e2 OK' — with the gated row available on its original subtitle 'android.widget.TextView new findings and SLA reminders tappable [157,1855][848,1892]' (e2-run.log:32) under 'android.widget.TextView Security findings tappable [157,1805][848,1851]' (e2-run.log:31) and its enabled switch 'android.widget.Switch Security findings tapp
[e1] notifications-toggled: the English categories list renders after the copy m -> pass :: jev read the digest: pass (confidence 1.00)
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-notifications-toggled-same-screen-the-security-n-dbd2b-362e/e2e-mobile-app/e1-run.log
android.widget.TextView الوكيل بحاجة إليك tappable [232,1160][923,1206]
android.widget.TextView أسئلة وطلبات إذن ومعلومات مطلوبة tappable [232,1210][923,1247]
android.widget.Switch الوكيل بحاجة إليك tappable [82,1167][204,1238]
android.widget.TextView تحديثات الوكيل tappable [232,1330][923,1376]
android.widget.TextView رسائل من الوكيل أثناء تنفيذ المهمة tappable [232,1380][923,1417]
android.widget.Switch تحديثات الوكيل tappable [82,1337][204,1408]
android.widget.TextView حالة الجلسة tappable [232,1500][923,1546]
android.widget.TextView مكتملة / تعذّر إكمالها / جاهزة للتحكم tappable [232,1550][923,1587]
android.widget.Switch حالة الجلسة tappable [82,1507][204,1578]
android.widget.TextView تنبيهات الرصيد tappable [232,1671][923,1717]
android.widget.TextView تحذيرات انخفاض رصيد المؤسسة tappable [232,1721][923,1758]
android.widget.Switch تنبيهات الرصيد tappable [82,1678][204,1749]
android.widget.TextView ملاحظات الأمان tappable [232,1841][923,1887]
android.widget.TextView فعّل وكيل أمان Kilo على نطاق للحصول على ملاحظات الأمان. tappable [232,1891][923,1928]
android.widget.Switch ملاحظات الأمان [82,1848][204,1919]
android.widget.TextView معاينات الرسائل tappable [55,2010][1025,2066]
android.widget.TextView عند إلغاء القفل tappable [232,2122][998,2153]
android.widget.Switch عرض المعاينات الكاملة tappable [82,2129][204,2153]
android.view.View الرئيسية، تبويب، 1 من 3 tappable [720,2195][1080,2337]
android.widget.TextView الرئيسية tappable [733,2281][1067,2330]
android.view.View الوكلاء، تبويب، 2 من 3 tappable [360,2195][720,2337]
android.widget.TextView الوكلاء tappable [373,2281][707,2330]
android.view.View الملف الشخصي، تبويب، 3 من 3 tappable [0,2195][360,2337]
android.widget.TextView الملف الشخصي tappable [13,2281][347,2330]
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-notifications-toggled-same-screen-the-security-n-dbd2b-362e/e2e-mobile-app/e1-notifications-ar.txt
<redacted>
<redacted>
                                        </com.horcrux.svg.GroupView>
                                      </com.horcrux.svg.SvgView>
                                    </android.view.View>
                                  </android.view.ViewGroup>
                                </android.view.ViewGroup>
                              </android.view.ViewGroup>
                            </android.widget.ScrollView>
                          </android.view.ViewGroup>
                        </android.view.ViewGroup>
                      </android.view.ViewGroup>
<redacted>
                    </android.view.ViewGroup>
                  </android.view.ViewGroup>
                </android.view.ViewGroup>
              </android.widget.FrameLayout>
            </android.widget.FrameLayout>
          </android.widget.FrameLayout>
        </android.widget.LinearLayout>
      </android.widget.FrameLayout>
    </android.widget.LinearLayout>
  </android.widget.FrameLayout>
</hierarchy>
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-notifications-toggled-same-screen-the-security-n-dbd2b-362e/e2e-mobile-app/e1-state.log
STATE HIT signed-in-home
digest: /home/igor_kilocode_ai/.local/share/kwf/sections/explorer-notifications-toggled-same-screen-the-security-n-dbd2b-362e/e2e-mobile-app/state-signed-in-home.txt
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-notifications-toggled-same-screen-the-security-n-dbd2b-362e/e2e-mobile-app/e2-run.log
android.widget.TextView Agent needs you tappable [157,1124][848,1170]
android.widget.TextView questions, permission, input needed tappable [157,1174][848,1211]
android.widget.Switch Agent needs you tappable [875,1131][997,1202]
android.widget.TextView Agent updates tappable [157,1294][848,1340]
android.widget.TextView mid-task messages from the agent tappable [157,1344][848,1381]
android.widget.Switch Agent updates tappable [875,1301][997,1372]
android.widget.TextView Session status tappable [157,1464][848,1510]
android.widget.TextView finished / failed / ready to control tappable [157,1514][848,1551]
android.widget.Switch Session status tappable [875,1471][997,1542]
android.widget.TextView Balance alerts tappable [157,1635][848,1681]
android.widget.TextView low organization balance warnings tappable [157,1685][848,1722]
android.widget.Switch Balance alerts tappable [875,1642][997,1713]
android.widget.TextView Security findings tappable [157,1805][848,1851]
android.widget.TextView new findings and SLA reminders tappable [157,1855][848,1892]
android.widget.Switch Security findings tappable [875,1812][997,1883]
android.widget.TextView MESSAGE PREVIEWS tappable [55,1974][1025,2018]
android.widget.TextView When unlocked tappable [83,2074][849,2120]
android.widget.TextView Notifications show that something happened. Open Kilo to read it. tappable [83,2124][849,2153]
android.widget.Switch Show full previews tappable [875,2100][997,2153]
android.view.View Home, tab, 1 of 3 tappable [0,2195][360,2337]
android.widget.TextView HOME tappable [13,2281][347,2320]
android.view.View Agents, tab, 2 of 3 tappable [360,2195][720,2337]
android.widget.TextView AGENTS tappable [373,2281][707,2320]
android.view.View Profile, tab, 3 of 3 tappable [720,2195][1080,2337]
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-notifications-toggled-same-screen-the-security-n-dbd2b-362e/e2e-mobile-app/scripted-e1.log
android.widget.TextView الجلسات الجارية الآن tappable [496,282][1044,328]
android.widget.Button عرض الكل tappable [37,281][478,330]
android.widget.TextView عرض الكل tappable [37,281][478,330]
android.widget.TextView لا شيء قيد التشغيل الآن tappable [396,438][684,484]
android.widget.Button مهمة برمجة جديدة tappable [37,612][1043,728]
android.widget.TextView مهمة برمجة جديدة tappable [390,646][624,692]
android.widget.Button مهمة جديدة من صورة tappable [37,746][1043,862]
android.widget.TextView مهمة جديدة من صورة tappable [371,780][643,826]
android.widget.TextView استكشاف tappable [36,897][1044,943]
android.widget.Button مراجع الشيفرة, مراجعات PR تلقائية tappable [37,962][1043,1106]
android.widget.TextView مراجع الشيفرة tappable [129,990][911,1036]
android.widget.TextView مراجعات PR تلقائية tappable [129,1040][911,1077]
android.widget.Button وكيل الأمان, اكتشاف الثغرات ومعالجتها tappable [37,1124][1043,1268]
android.widget.TextView وكيل الأمان tappable [129,1152][911,1198]
android.widget.TextView اكتشاف الثغرات ومعالجتها tappable [129,1202][911,1239]
android.widget.Button مراجعة PR, مراجعة طلبات السحب على الجوال tappable [37,1287][1043,1429]
android.widget.TextView مراجعة PR tappable [129,1315][911,1361]
android.widget.TextView مراجعة طلبات السحب على الجوال tappable [129,1365][911,1402]
android.view.View الرئيسية، تبويب، 1 من 3 tappable [720,2195][1080,2337]
android.widget.TextView الرئيسية tappable [733,2281][1067,2330]
android.view.View الوكلاء، تبويب، 2 من 3 tappable [360,2195][720,2337]
android.widget.TextView الوكلاء tappable [373,2281][707,2330]
android.view.View الملف الشخصي، تبويب، 3 من 3 tappable [0,2195][360,2337]
android.widget.TextView الملف الشخصي tappable [13,2281][347,2330]
Owner request

Explorer finding: notifications-toggled: Same screen: the Security notes row's description is untranslated English inside the Arabic notifications list.

The user-agent explorer found this while using the app like a user.
One finding per item; the explorer never edits product code.

Flow: notifications-toggled
Found on revision: f2181ae

Repro:

  1. set this state first: fault nextjs down; battery 12 discharging; uimode night; relaunch; fault nextjs up; reviews 3; the device in dark mode
  2. open the app on emulator-5554
  3. reach notifications-toggled
  4. the capture shows the defect named below

Observed: Same screen: the Security notes row's description is untranslated English inside the Arabic notifications list.
Expected: the screen renders without this defect

Evidence (from the device run):

[e6] ux-check: all categories available, every row keeps its original short subtitle — android emulator-5606; 'all categories available' was created through the product's own Security Agent screen (Personal scope, repo iscekic/wf-fake-test) and reverted afterwards (agent_configs security_scan is_enabled=false, selected_repository_ids=[]); SCENE e6 OK digest (e6-run.log) lists every category row with its original subtitle — 'android.widget.TextView new findings and SLA reminders' under 'android.widget.TextView Security findings' with an enabled 'android.widget.Switch Security findings' (no [disabled]), plus 'low organization balance warnings', 'replies in your conversations'…

[e6] ux-check: all categories available, every row keeps its original short subtitle — e6.png

[e5] ux-check — unavailable row's longer description wraps inside its card, no overlap, switch centered, card grows — android emulator-5604; German catalog copy (de.json:341) at e5-notifications-de.txt line 126 has subtitle bounds [157,1929][848,2003] (two lines) inside card [55,1851][1025,2031] = 180 px vs 143 px for single-line sibling rows, switch [875,1905][997,1976] centre 1940.5 = card centre 1941, subtitle x<=848 vs switch x>=875 (no overlap); pixel appearance of the wrap is the visual reviewer's, capture e5-notifications-de.png.

[e5] ux-check — unavailable row's longer description wraps inside its card, no overlap, switch centered, card grows — e5-notifications-de.png

[e2] notifications-toggled Arabic — Security findings row disabled with the Arabic reason, chat row keeps its Arabic subtitle, English sentence absent — android emulator-5604; SCENE e2 OK. e2-scene5.log line 32 'فعّل وكيل أمان Kilo على نطاق للحصول على ملاحظات الأمان.' (= ar.json:341), line 31 title ملاحظات الأمان, line 17 الردود في محادثاتك; e2-notifications-ar.txt line 127 shows the row's Switch enabled="false" (disabled); grep for 'Enable Kilo|Security findings|Chat messages' in the digest = 0, and the account's agent_configs security_scan row is is_enabled=f (unavailable state), which I did not toggle. Screenshots e2.png / e2-notifications-ar.png for the visual reviewer. Parked step list e2 in e2e-scripts.json was edited (unanchored…

[e2] notifications-toggled Arabic — Security findings row disabled with the Arabic reason, chat row keeps its Arabic subtitle, English sentence absent — e2-notifications-ar.png

Follow-ups (not changed here)

Open findings (not fixed here)

e2

Explorer finding: notifications-toggled: Same screen: the Security notes row's description is untranslated English inside the Arabic notifications list.

The user-agent explorer found this while using the app like a user.
One finding per item; the explorer never edits product code.

Flow: notifications-toggled
Found on revision: f2181ae

Repro:
1. set this state first: fault nextjs down; battery 12 discharging; uimode night; relaunch; fault nextjs up; reviews 3; the device in dark mode
2. open the app on emulator-5554
3. reach notifications-toggled
4. the capture shows the defect named below

Observed: Same screen: the Security notes row's description is untranslated English inside the Arabic notifications list.
Expected: the screen renders without this defect

Evidence (from the device run):
- ~/.local/share/kwf/findings/explorer-notifications-toggled-same-screen-the-security-n-dbd2b42e/notifications-toggled.png
@kilo-code-bot

kilo-code-bot Bot commented Sep 21, 2026

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: No Issues Found | Recommendation: Merge

Executive Summary

The unavailable-category rows now render translated catalog copy keyed by category instead of the server's English unavailableReason, and the change is verified without regressions in the reviewed scope.

Files Reviewed (91 files)
  • apps/mobile/src/components/notifications-screen.tsx
  • apps/mobile/src/components/notifications-screen.mounted.test.tsx
  • apps/mobile/src/i18n/catalog-parity.test.ts
  • apps/mobile/src/i18n/category-unavailable-copy.test.ts
  • apps/mobile/src/i18n/locales/*.json (87 catalogs, including en.json)

Reviewed by deepseek-v4.1-flash · Input: 0 · Output: 0 · Cached: 0

Review guidance: REVIEW.md from base branch main

@iscekic iscekic added the human-ready The PR is ready for human review. label Sep 21, 2026
@iscekic iscekic self-assigned this Sep 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

human-ready The PR is ready for human review.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant