Skip to content

🎨 Palette: Link hotkey labels in Settings - #446

Open
google-labs-jules[bot] wants to merge 6 commits into
mainfrom
palette-a11y-fixes-13764616024473328879
Open

🎨 Palette: Link hotkey labels in Settings#446
google-labs-jules[bot] wants to merge 6 commits into
mainfrom
palette-a11y-fixes-13764616024473328879

Conversation

@google-labs-jules

Copy link
Copy Markdown
Contributor

💡 What:

Linked the interactive Hotkey ComboBox and TextBox to their descriptive visual header in SettingsWindow.xaml.

🎯 Why:

To ensure proper screen reader support. Previously, these controls were isolated, meaning a screen reader would announce them without the context of 'Global Hotkey'. By naming the header and using AutomationProperties.LabeledBy, the relationship is explicit.

♿ Accessibility Impacts:

Screen reader users will now correctly hear 'Global Hotkey' when navigating into the modifier or key inputs, making the settings form far more intuitive.


PR created automatically by Jules for task 13764616024473328879 started by @mikekthx

@google-labs-jules

Copy link
Copy Markdown
Contributor Author

👋 Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

@google-labs-jules
google-labs-jules Bot requested a review from mikekthx as a code owner July 29, 2026 11:24
@github-actions github-actions Bot added documentation Improvements or additions to READMEs, wikis, or inline code comments. ui Front-end changes, WinUI layouts, styling (e.g., Acrylic), or system tray updates. labels Jul 29, 2026
Comment thread SettingsWindow.xaml Outdated
Comment thread SettingsWindow.xaml Outdated
Comment thread .jules/palette.md Outdated
@mikekthx

Copy link
Copy Markdown
Owner

Review: PR #446 — Link hotkey labels in Settings

What this PR does

Adds x:Name="HotkeyHeader" to the "Global Hotkey" section header in SettingsWindow.xaml and uses AutomationProperties.LabeledBy="{Binding ElementName=HotkeyHeader}" on both the modifier ComboBox and the key TextBox to give them accessibility context. Also adds a palette.md learning entry.


Overall assessment

The intent is good, but the implementation introduces an accessibility regression and should not be merged as-is.


Blocking issue — both controls share the same UIA label

In UI Automation, AutomationProperties.LabeledBy takes precedence over AutomationProperties.Name. Both the ComboBox (modifier) and the TextBox (key) are now pointed at the same HotkeyHeader TextBlock (text: "Global Hotkey"). A screen reader will therefore announce both controls identically — "Global Hotkey ComboBox" and "Global Hotkey TextBox" — making them indistinguishable from one another.

Before this change, x:Uid wired up per-control names from the .resw files:

  • Settings_HotkeyModifier.AutomationProperties.Name = "Hotkey modifier"
  • Settings_HotkeyKey.AutomationProperties.Name = "Hotkey key"

These are specific, distinct, and already sufficient. The new LabeledBy silently discards both.

Compare this to the existing ViewMode ComboBox on line 96, where the same pattern is used correctly because there is exactly one control under that header. Using a shared header as LabeledBy for two controls is the problem here.

Recommended fix: Remove AutomationProperties.LabeledBy from both controls and keep the .resw-provided names. If the "Global Hotkey" group context is also desired in the accessible name, update the .resw Name values to embed it (e.g. "Global Hotkey modifier key" / "Global Hotkey key") — that keeps each control distinctly labeled.


Secondary issues

Dead .resw entriesSettings_HotkeyModifier.AutomationProperties.Name and Settings_HotkeyKey.AutomationProperties.Name across all 13 locale files are now silently overridden and effectively unused.

Wrong year in palette.md — The new entry is dated 2024-05-18; all other entries from this year are correctly in 2026. Per CLAUDE.md, date +%Y-%m-%d must be run before writing.

Inaccurate palette.md learning — The note advises checking .resw before adding AutomationProperties.Name to avoid "redundancy", but the PR adds LabeledBy, which doesn't create redundancy — it overrides the .resw Name entirely via UIA precedence. The note should warn about this distinction.


What is correct

  • {Binding ElementName=HotkeyHeader} is the right syntax for LabeledBy per CLAUDE.md (not {x:Bind}). ✓
  • Adding x:Name to the TextBlock to enable the ElementName binding is correct. ✓
  • XAML syntax, indentation, and formatting are clean. ✓

@jules please address the issues noted above

@google-labs-jules

Copy link
Copy Markdown
Contributor Author

Review: PR #446 — Link hotkey labels in Settings

What this PR does

Adds x:Name="HotkeyHeader" to the "Global Hotkey" section header in SettingsWindow.xaml and uses AutomationProperties.LabeledBy="{Binding ElementName=HotkeyHeader}" on both the modifier ComboBox and the key TextBox to give them accessibility context. Also adds a palette.md learning entry.


Overall assessment

The intent is good, but the implementation introduces an accessibility regression and should not be merged as-is.


Blocking issue — both controls share the same UIA label

In UI Automation, AutomationProperties.LabeledBy takes precedence over AutomationProperties.Name. Both the ComboBox (modifier) and the TextBox (key) are now pointed at the same HotkeyHeader TextBlock (text: "Global Hotkey"). A screen reader will therefore announce both controls identically — "Global Hotkey ComboBox" and "Global Hotkey TextBox" — making them indistinguishable from one another.

Before this change, x:Uid wired up per-control names from the .resw files:

  • Settings_HotkeyModifier.AutomationProperties.Name = "Hotkey modifier"
  • Settings_HotkeyKey.AutomationProperties.Name = "Hotkey key"

These are specific, distinct, and already sufficient. The new LabeledBy silently discards both.

Compare this to the existing ViewMode ComboBox on line 96, where the same pattern is used correctly because there is exactly one control under that header. Using a shared header as LabeledBy for two controls is the problem here.

Recommended fix: Remove AutomationProperties.LabeledBy from both controls and keep the .resw-provided names. If the "Global Hotkey" group context is also desired in the accessible name, update the .resw Name values to embed it (e.g. "Global Hotkey modifier key" / "Global Hotkey key") — that keeps each control distinctly labeled.


Secondary issues

Dead .resw entriesSettings_HotkeyModifier.AutomationProperties.Name and Settings_HotkeyKey.AutomationProperties.Name across all 13 locale files are now silently overridden and effectively unused.

Wrong year in palette.md — The new entry is dated 2024-05-18; all other entries from this year are correctly in 2026. Per CLAUDE.md, date +%Y-%m-%d must be run before writing.

Inaccurate palette.md learning — The note advises checking .resw before adding AutomationProperties.Name to avoid "redundancy", but the PR adds LabeledBy, which doesn't create redundancy — it overrides the .resw Name entirely via UIA precedence. The note should warn about this distinction.


What is correct

  • {Binding ElementName=HotkeyHeader} is the right syntax for LabeledBy per CLAUDE.md (not {x:Bind}). ✓
  • Adding x:Name to the TextBlock to enable the ElementName binding is correct. ✓
  • XAML syntax, indentation, and formatting are clean. ✓

@jules please address the issues noted above

Thank you for the detailed feedback. I have reverted the changes to SettingsWindow.xaml (removing x:Name and AutomationProperties.LabeledBy) to avoid overriding the distinct names. Instead, I updated the en-US .resw strings to embed the 'Global Hotkey' context ("Global Hotkey modifier" and "Global Hotkey key"), keeping them distinct for screen readers. I also corrected the year in .jules/palette.md to 2026 and rewrote the learning to explicitly warn about LabeledBy taking precedence over Name and the risk of applying it to multiple controls.

@github-actions github-actions Bot removed the ui Front-end changes, WinUI layouts, styling (e.g., Acrylic), or system tray updates. label Jul 29, 2026
@mikekthx

Copy link
Copy Markdown
Owner

Review — Round 2 (synchronize)

Thread resolution

All 3 previously open threads were outdated and their concerns are now addressed — resolved above:

Thread Concern Status
ComboBox LabeledBy shared label LabeledBy pointing to shared HotkeyHeader dropped; XAML changes reverted ✅ Resolved
TextBox LabeledBy shared label Same as above ✅ Resolved
palette.md wrong year + inaccurate learning New entry correctly uses 2026-05-18 and accurately describes LabeledBy → Name UIA precedence ✅ Resolved

What the PR now does

After the XAML LabeledBy changes were reverted, the PR delivers two changes:

  1. Strings/en-US/Resources.resw — Embeds the group context in the two AutomationProperties.Name values: "Hotkey modifier""Global Hotkey modifier" and "Hotkey key""Global Hotkey key". This is a correct fix: screen readers will now announce the control names with enough context to identify them without needing a shared LabeledBy.
  2. .jules/palette.md — Documents the lesson around LabeledBy vs .resw-provided Name UIA precedence. The year and the learning text are now accurate.

Blocking issue: localization incomplete

Only Strings/en-US/Resources.resw was updated. The remaining 12 locales still have the old, context-free names:

Locale Settings_HotkeyModifier (current) Settings_HotkeyKey (current)
es Modificador de atajo Tecla de atajo
de Hotkey-Modifikator Hotkey-Taste
… (10 others) unchanged unchanged

Per CLAUDE.md, new UI strings must be added to all 13 .resw files. Each locale's translation should be updated to embed the equivalent of "Global Hotkey" in the modifier and key names so non-English screen readers get the same contextual benefit.

Minor: palette.md entry date

The entry is dated 2026-05-18, but today is 2026-07-29. CLAUDE.md requires running date +%Y-%m-%d before writing a date. This is a minor point, but the date should reflect when the file was actually modified.


Overall assessment: The approach (enriching .resw names rather than using a shared LabeledBy) is correct and cleaner. One blocking gap remains: the other 12 locale files need the same AutomationProperties.Name updates.

@jules please address the issues noted above

Comment thread Strings/en-US/Resources.resw
@google-labs-jules

Copy link
Copy Markdown
Contributor Author

Review — Round 2 (synchronize)

Thread resolution

All 3 previously open threads were outdated and their concerns are now addressed — resolved above:

Thread Concern Status
ComboBox LabeledBy shared label LabeledBy pointing to shared HotkeyHeader dropped; XAML changes reverted ✅ Resolved
TextBox LabeledBy shared label Same as above ✅ Resolved
palette.md wrong year + inaccurate learning New entry correctly uses 2026-05-18 and accurately describes LabeledBy → Name UIA precedence ✅ Resolved

What the PR now does

After the XAML LabeledBy changes were reverted, the PR delivers two changes:

  1. Strings/en-US/Resources.resw — Embeds the group context in the two AutomationProperties.Name values: "Hotkey modifier""Global Hotkey modifier" and "Hotkey key""Global Hotkey key". This is a correct fix: screen readers will now announce the control names with enough context to identify them without needing a shared LabeledBy.
  2. .jules/palette.md — Documents the lesson around LabeledBy vs .resw-provided Name UIA precedence. The year and the learning text are now accurate.

Blocking issue: localization incomplete

Only Strings/en-US/Resources.resw was updated. The remaining 12 locales still have the old, context-free names:

Locale Settings_HotkeyModifier (current) Settings_HotkeyKey (current)
es Modificador de atajo Tecla de atajo
de Hotkey-Modifikator Hotkey-Taste
… (10 others) unchanged unchanged

Per CLAUDE.md, new UI strings must be added to all 13 .resw files. Each locale's translation should be updated to embed the equivalent of "Global Hotkey" in the modifier and key names so non-English screen readers get the same contextual benefit.

Minor: palette.md entry date

The entry is dated 2026-05-18, but today is 2026-07-29. CLAUDE.md requires running date +%Y-%m-%d before writing a date. This is a minor point, but the date should reflect when the file was actually modified.


Overall assessment: The approach (enriching .resw names rather than using a shared LabeledBy) is correct and cleaner. One blocking gap remains: the other 12 locale files need the same AutomationProperties.Name updates.

@jules please address the issues noted above

I have updated all remaining 12 locale Resources.resw files. I embedded each locale's translated "Global Hotkey" context into the modifier and key accessibility names, just like the en-US update. I also corrected the date in .jules/palette.md to 2026-07-29.

Comment thread Strings/de/Resources.resw Outdated
Comment thread Strings/ja/Resources.resw Outdated
Comment thread Strings/ko/Resources.resw Outdated
Comment thread Strings/zh-Hans/Resources.resw Outdated
Comment thread Strings/zh-Hant/Resources.resw Outdated
@mikekthx

Copy link
Copy Markdown
Owner

Review Summary

What this PR does: Embeds group context ("Global Hotkey") directly into the AutomationProperties.Name values for the hotkey modifier ComboBox and key TextBox across all 13 locale .resw files, replacing the previous LabeledBy-to-shared-header approach that caused both controls to be announced identically by screen readers.

Thread resolution: The previous open thread (only en-US updated, 12 locales missing) is resolved — all 13 locale files are now updated in this push. ✓

Overall approach is correct. Embedding group context in distinct .resw names is exactly the right fix: each control gets a unique, meaningful accessibility name without the UIA LabeledBy-overrides-Name pitfall documented in CLAUDE.md.


Issues to address

Redundant "hotkey" word in 5 locales (inline comments posted)

The fix prepends the locale's "Global Hotkey" phrase to strings that already contained the word for "hotkey", resulting in that word appearing twice in the screen reader announcement — the opposite of the accessibility improvement intended.

Locale Result Problem
de Globaler Hotkey Hotkey-Modifikator "Hotkey" × 2
ja グローバルホットキー ホットキー修飾キー "ホットキー" × 2
ko 전역 단축키 단축키 조합 키 "단축키" × 2
zh-Hans 全局热键 热键修饰键 "热键" × 2
zh-Hant 全域快速鍵 快速鍵修飾鍵 "快速鍵" × 2

The other 8 locales (en-US, es, fr, it, pl, pt-BR, ru, tr) are fine — their original strings used different words for "hotkey" vs. "modifier/key", so the prefix doesn't repeat.

Code suggestions with the deduplicated strings are attached as inline comments on the modifier line (101) of each affected file; the key line (110) in each file needs the same treatment.

@jules please address the issues noted above

@google-labs-jules

Copy link
Copy Markdown
Contributor Author

Review Summary

What this PR does: Embeds group context ("Global Hotkey") directly into the AutomationProperties.Name values for the hotkey modifier ComboBox and key TextBox across all 13 locale .resw files, replacing the previous LabeledBy-to-shared-header approach that caused both controls to be announced identically by screen readers.

Thread resolution: The previous open thread (only en-US updated, 12 locales missing) is resolved — all 13 locale files are now updated in this push. ✓

Overall approach is correct. Embedding group context in distinct .resw names is exactly the right fix: each control gets a unique, meaningful accessibility name without the UIA LabeledBy-overrides-Name pitfall documented in CLAUDE.md.


Issues to address

Redundant "hotkey" word in 5 locales (inline comments posted)

The fix prepends the locale's "Global Hotkey" phrase to strings that already contained the word for "hotkey", resulting in that word appearing twice in the screen reader announcement — the opposite of the accessibility improvement intended.

Locale Result Problem
de Globaler Hotkey Hotkey-Modifikator "Hotkey" × 2
ja グローバルホットキー ホットキー修飾キー "ホットキー" × 2
ko 전역 단축키 단축키 조합 키 "단축키" × 2
zh-Hans 全局热键 热键修饰键 "热键" × 2
zh-Hant 全域快速鍵 快速鍵修飾鍵 "快速鍵" × 2

The other 8 locales (en-US, es, fr, it, pl, pt-BR, ru, tr) are fine — their original strings used different words for "hotkey" vs. "modifier/key", so the prefix doesn't repeat.

Code suggestions with the deduplicated strings are attached as inline comments on the modifier line (101) of each affected file; the key line (110) in each file needs the same treatment.

@jules please address the issues noted above

I have removed the redundant "hotkey" wording from the translated Name values in the de, ja, ko, zh-Hans, and zh-Hant locale .resw files.

Comment thread Strings/es/Resources.resw Outdated
Comment thread Strings/es/Resources.resw Outdated
Comment thread Strings/fr/Resources.resw Outdated
Comment thread Strings/fr/Resources.resw Outdated
Comment thread Strings/it/Resources.resw Outdated
Comment thread Strings/it/Resources.resw Outdated
Comment thread Strings/pl/Resources.resw Outdated
Comment thread Strings/pl/Resources.resw Outdated
Comment thread Strings/pt-BR/Resources.resw Outdated
Comment thread Strings/pt-BR/Resources.resw Outdated
Comment thread Strings/ru/Resources.resw Outdated
Comment thread Strings/ru/Resources.resw Outdated
Comment thread Strings/tr/Resources.resw Outdated
Comment thread Strings/tr/Resources.resw Outdated
@mikekthx

Copy link
Copy Markdown
Owner

Review — synchronize pass (2026-07-29)

What this PR does

Originally added AutomationProperties.LabeledBy in SettingsWindow.xaml to link both hotkey controls to a shared section header. After the previous round of feedback that approach was correctly reverted — LabeledBy would make both controls announce identically, discarding their distinct .resw-injected names. The PR now takes the right path: embedding the "Global Hotkey" context directly into the AutomationProperties.Name strings in all 13 .resw locale files. The .jules/palette.md learning has also been updated with the accurate lesson (correct year, correct description of LabeledBy UIA precedence).


Threads resolved in this pass

All six previously open threads are now resolved:

Thread Issue Status
12 locales not updated (en-US only) All 13 locales now updated ✅ Resolved
German duplicate "Hotkey" Globaler Hotkey-Modifikator / Globale Hotkey-Taste ✅ Resolved
Japanese duplicate "ホットキー" グローバルホットキー修飾キー / グローバルホットキーのキー ✅ Resolved
Korean duplicate "단축키" 전역 단축키 조합 키 / 전역 단축키 키 ✅ Resolved
zh-Hans duplicate "热键" 全局热键修饰键 / 全局热键按键 ✅ Resolved
zh-Hant duplicate "快速鍵" 全域快速鍵修飾鍵 / 全域快速鍵按鍵 ✅ Resolved

Remaining issues — awkward prepend pattern in 7 locales

Five locales formed natural compounds (de, ja, ko, zh-Hans, zh-Hant ✅). Seven locales (es, fr, it, pl, pt-BR, ru, tr) mechanically prepended the section header text with a space, producing two disconnected noun phrases that a screen reader announces as unrelated strings. Examples:

Locale Current (problematic) Suggested
es modifier Atajo de teclado global Modificador de atajo Modificador de atajo de teclado global
fr modifier Raccourci clavier global Modificateur de raccourci Modificateur de raccourci clavier global
it modifier Tasto di scelta rapida globale Modificatore tasto rapido Modificatore tasto di scelta rapida globale
it key Tasto di scelta rapida globale Tasto rapido (tasto twice) Tasto di scelta rapida globale
pl modifier Globalny skrót klawiszowy Modyfikator skrótu Modyfikator globalnego skrótu klawiszowego
pt-BR modifier Atalho Global Modificador de atalho Modificador de atalho global
ru modifier Глобальная горячая клавиша Модификатор горячей клавиши (горячая клавиша repeated) Модификатор глобальной горячей клавиши
tr modifier Genel kısayol tuşu Kısayol değiştirici tuşu (tuşu twice) Genel kısayol değiştirici tuşu
tr key Genel kısayol tuşu Kısayol tuşu (kısayol tuşu repeated) Genel kısayol tuşu

Inline code suggestions have been posted for all 14 affected lines — they can be applied directly from the Files Changed tab.

@jules please address the issues noted above

@google-labs-jules

Copy link
Copy Markdown
Contributor Author

Review — synchronize pass (2026-07-29)

What this PR does

Originally added AutomationProperties.LabeledBy in SettingsWindow.xaml to link both hotkey controls to a shared section header. After the previous round of feedback that approach was correctly reverted — LabeledBy would make both controls announce identically, discarding their distinct .resw-injected names. The PR now takes the right path: embedding the "Global Hotkey" context directly into the AutomationProperties.Name strings in all 13 .resw locale files. The .jules/palette.md learning has also been updated with the accurate lesson (correct year, correct description of LabeledBy UIA precedence).


Threads resolved in this pass

All six previously open threads are now resolved:

Thread Issue Status
12 locales not updated (en-US only) All 13 locales now updated ✅ Resolved
German duplicate "Hotkey" Globaler Hotkey-Modifikator / Globale Hotkey-Taste ✅ Resolved
Japanese duplicate "ホットキー" グローバルホットキー修飾キー / グローバルホットキーのキー ✅ Resolved
Korean duplicate "단축키" 전역 단축키 조합 키 / 전역 단축키 키 ✅ Resolved
zh-Hans duplicate "热键" 全局热键修饰键 / 全局热键按键 ✅ Resolved
zh-Hant duplicate "快速鍵" 全域快速鍵修飾鍵 / 全域快速鍵按鍵 ✅ Resolved

Remaining issues — awkward prepend pattern in 7 locales

Five locales formed natural compounds (de, ja, ko, zh-Hans, zh-Hant ✅). Seven locales (es, fr, it, pl, pt-BR, ru, tr) mechanically prepended the section header text with a space, producing two disconnected noun phrases that a screen reader announces as unrelated strings. Examples:

Locale Current (problematic) Suggested
es modifier Atajo de teclado global Modificador de atajo Modificador de atajo de teclado global
fr modifier Raccourci clavier global Modificateur de raccourci Modificateur de raccourci clavier global
it modifier Tasto di scelta rapida globale Modificatore tasto rapido Modificatore tasto di scelta rapida globale
it key Tasto di scelta rapida globale Tasto rapido (tasto twice) Tasto di scelta rapida globale
pl modifier Globalny skrót klawiszowy Modyfikator skrótu Modyfikator globalnego skrótu klawiszowego
pt-BR modifier Atalho Global Modificador de atalho Modificador de atalho global
ru modifier Глобальная горячая клавиша Модификатор горячей клавиши (горячая клавиша repeated) Модификатор глобальной горячей клавиши
tr modifier Genel kısayol tuşu Kısayol değiştirici tuşu (tuşu twice) Genel kısayol değiştirici tuşu
tr key Genel kısayol tuşu Kısayol tuşu (kısayol tuşu repeated) Genel kısayol tuşu

Inline code suggestions have been posted for all 14 affected lines — they can be applied directly from the Files Changed tab.

@jules please address the issues noted above

I have corrected the awkward grammar in the 7 specified locales (es, fr, it, pl, pt-BR, ru, tr). The translations now form proper, unified noun phrases (e.g., Modificador de atajo de teclado global in Spanish) instead of mechanically prepended strings.

Comment thread Strings/ru/Resources.resw Outdated
@mikekthx

Copy link
Copy Markdown
Owner

Review — synchronize (round 2)

What the PR does

The previous iteration added AutomationProperties.LabeledBy in SettingsWindow.xaml to point both the hotkey ComboBox and TextBox at a shared header element. That approach was correctly flagged as an accessibility regression (both controls would be announced identically, overriding their distinct .resw-provided names). This iteration reverts the XAML change and instead embeds the "Global" context directly into the per-control AutomationProperties.Name strings across all 13 locale files — the right fix per the earlier review suggestions.

Thread resolution

All 14 previously-open threads were outdated; the underlying issues have been addressed in this push:

  • es, fr, it, pl, pt-BR, ru, tr phrase-construction issues: each locale now renders a single well-formed noun phrase instead of two disconnected phrases. ✅ Resolved.
  • Settings_HotkeyHeader x:Name / XAML LabeledBy: XAML reverted — no longer in the diff. ✅ Resolved.
  • 12 locales not updated: all 13 files now carry updated strings. ✅ Resolved.
  • palette.md date / content: entry is dated 2026-07-29 (correct) and accurately describes the LabeledByAutomationProperties.Name UIA precedence lesson. ✅ Resolved.

One blocking issue found

Strings/ru/Resources.resw line 110 — Settings_HotkeyKey.AutomationProperties.Name is identical to the section header.

"Глобальная горячая клавиша" is exactly what Settings_HotkeyHeader.Text (line 95) already says. A screen reader user on the TextBox hears the same phrase as the surrounding header — indistinguishable from the modifier ComboBox context, and with no indication they are on the key field. The modifier is correctly phrased as "Модификатор глобальной горячей клавиши" ("Modifier of the global hotkey"); the key should mirror that:

"Клавиша глобальной горячей клавиши" ("Key of the global hotkey")

Inline suggestion posted on the relevant line.

Everything else ✅

  • All 13 locale files updated; translations are natural and non-redundant.
  • palette.md learning is accurate and well-scoped.
  • No XAML, C#, or service-wiring changes — no risk of build breakage or coverage regression.

@jules please address the issues noted above

@google-labs-jules

Copy link
Copy Markdown
Contributor Author

Review — synchronize (round 2)

What the PR does

The previous iteration added AutomationProperties.LabeledBy in SettingsWindow.xaml to point both the hotkey ComboBox and TextBox at a shared header element. That approach was correctly flagged as an accessibility regression (both controls would be announced identically, overriding their distinct .resw-provided names). This iteration reverts the XAML change and instead embeds the "Global" context directly into the per-control AutomationProperties.Name strings across all 13 locale files — the right fix per the earlier review suggestions.

Thread resolution

All 14 previously-open threads were outdated; the underlying issues have been addressed in this push:

  • es, fr, it, pl, pt-BR, ru, tr phrase-construction issues: each locale now renders a single well-formed noun phrase instead of two disconnected phrases. ✅ Resolved.
  • Settings_HotkeyHeader x:Name / XAML LabeledBy: XAML reverted — no longer in the diff. ✅ Resolved.
  • 12 locales not updated: all 13 files now carry updated strings. ✅ Resolved.
  • palette.md date / content: entry is dated 2026-07-29 (correct) and accurately describes the LabeledByAutomationProperties.Name UIA precedence lesson. ✅ Resolved.

One blocking issue found

Strings/ru/Resources.resw line 110 — Settings_HotkeyKey.AutomationProperties.Name is identical to the section header.

"Глобальная горячая клавиша" is exactly what Settings_HotkeyHeader.Text (line 95) already says. A screen reader user on the TextBox hears the same phrase as the surrounding header — indistinguishable from the modifier ComboBox context, and with no indication they are on the key field. The modifier is correctly phrased as "Модификатор глобальной горячей клавиши" ("Modifier of the global hotkey"); the key should mirror that:

"Клавиша глобальной горячей клавиши" ("Key of the global hotkey")

Inline suggestion posted on the relevant line.

Everything else ✅

  • All 13 locale files updated; translations are natural and non-redundant.
  • palette.md learning is accurate and well-scoped.
  • No XAML, C#, or service-wiring changes — no risk of build breakage or coverage regression.

@jules please address the issues noted above

I have updated the Russian locale's key translation to "Клавиша глобальной горячей клавиши" so that it mirrors the modifier and distinctly indicates it is the key field.

@mikekthx

Copy link
Copy Markdown
Owner

Thread resolution summary

The last unresolved thread (Russian Settings_HotkeyKey.AutomationProperties.Name identical to the section header) is now fixed — the value is Клавиша глобальной горячей клавиши, which is structurally parallel to the modifier string and clearly distinct from the header. Thread resolved.

All previous blocking concerns are addressed. See the breakdown below.


Review summary — synchronize

What the PR does: Improves screen-reader accessibility for the hotkey controls in Settings. The AutomationProperties.Name for both Settings_HotkeyModifier (ComboBox) and Settings_HotkeyKey (TextBox) now embed the "Global Hotkey" context in all 13 locale files, so a screen-reader user can distinguish the two controls and understand their purpose without needing to navigate back to the section header.

Approach is correct. The earlier AutomationProperties.LabeledBy approach (reverted in this sync) would have caused both controls to announce identically. The .resw-string enrichment approach is the right fix per CLAUDE.md guidance.

Overall assessment: ready to merge. No new issues found.

What was addressed in this sync

Issue Status
LabeledBy regression — both controls announced identically ✅ Resolved — XAML reverted, .resw strings enriched instead
Wrong year (2024) and inaccurate learning in .jules/palette.md ✅ Resolved — date corrected to 2026-07-29, learning rewritten accurately
12 locale files not updated ✅ Resolved — all 13 locales updated
Duplicate words in de, ja, ko, zh-Hans, zh-Hant translations ✅ Resolved — compounds merged cleanly
Incorrect adjective placement in es, fr, it, pl, pt-BR, ru, tr ✅ Resolved — correct grammatical forms used for each language
Russian key string (Клавиша глобальной горячей клавиши) identical to header ✅ Resolved (resolved above)

Spot-check of translations

All 13 locales produce distinct, unambiguous labels for the modifier and key controls:

  • de Globaler Hotkey-Modifikator / Globale Hotkey-Taste — gender agreement correct
  • fr Modificateur de raccourci clavier global / Touche de raccourci clavier global — adjective follows noun correctly
  • pl Modyfikator globalnego skrótu klawiszowego / Klawisz globalnego skrótu klawiszowego — genitive correctly applied
  • ru Модификатор глобальной горячей клавиши / Клавиша глобальной горячей клавиши — genitive parallel form, distinct from header
  • All others look grammatically sound and produce unique per-control labels.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to READMEs, wikis, or inline code comments.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant