Repository navigation
fix(ui): Orchestrate settings follow the current language - #684
Merged
Merged
Conversation
Tryanks
marked this pull request as ready for review
October 9, 2026 11:54
Tryanks
enabled auto-merge (squash)
October 9, 2026 11:54
This was referenced Oct 9, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
After switching the UI language in Settings, the Orchestrate panel kept the previous language's add buttons and description placeholders until restart. It resolved those strings once, when it was built, instead of at render time like everything else in the panel. Switching language only re-applies the locale and refreshes the window (
settings_page.rslanguage_row), so anything resolved early stays stale.The textarea state owns its placeholder, so the panel refreshes it in
renderwhen it differs. The composer does the same thing (applied_placeholder→set_placeholder).ProviderModelPicker::addhas one caller, this panel. No new type, field or abstraction.Evidence
Synthetic profile (
TCODE_DATA_DIRthrowaway,HOSTNAME="Sample desktop"), language set to 简体中文, then Settings → General → Language → English, then Orchestrate, with no restart. The desktop pair has the first collaboration description cleared so its placeholder shows. The phone pair shows only the Add button fix: in it the description is not cleared, so no placeholder is visible. The placeholder is covered by the regression test below.origin/maind1b3438): the "Add" button stays Chinese on both. On desktop, the placeholder also stays Chinese.After: "Add collaboration model" shows right after the switch on both, and on desktop the English placeholder shows too. Through the accessibility tree, all four description placeholders and "Add execution model" also read English on both shells.
Regression test, added:
orchestrate_settings::tests::switching_language_relocalizes_the_description_placeholder. It uses the existing Settings test seam:TestLocaleGuard,WorkspaceStore::new_attachedandstore::tests::seed_full_scope, as inarchived_delete_uses_response_worktree_sharing_and_preserves_the_cleanup_choice.The test mounts the panel itself rather than the whole
SettingsPage. Reading the row textareas from aSettingsPagetest would mean wideningSettingsPage.orchestrate_panelandOrchestrateSettingsPanel.child_rowsfor the test alone. Mounting the panel tests the same code:SettingsPage::newbuilds this panel the same way, and the language row makes the same two calls.It fails on
origin/main(main's two production files, with this test module appended):It passes on this branch. No test was changed or deleted.
Checks run on the final commit:
cargo fmt --all --check: cleancargo clippy --workspace --all-targets --locked -- -D warnings: finished, no warningscargo nextest run --workspace --locked: 1094 tests run: 1094 passed, 13 skippedcargo machete: no unused dependenciesGaps: the mobile (iOS/Android) and Web builds were left to CI. Dark theme was checked on the phone shell but not attached. Narrow width is the phone shot.
PROTOCOL_VERSIONbump: a note was added under "Unreleased" above theconstant in
crates/protocol/src/lib.rs(the number itself changes onlywhen the release is cut — CONTRIBUTING.md, principle 9).
Merge Danger
Door: two-way
Blast Radius: cosmetic
UI strings only, in Settings → Orchestrate. Nothing on the wire or in persisted state changes. The per-row placeholder comparison runs on each panel render, over a handful of rows.
Closes #645