Repository navigation
The app in English, Portuguese and Spanish, with a language picker - #14
Merged
Merged
Conversation
The app checks the latest published GitHub release (latest.json) when it opens and every six hours. A newer version shows "Update available" in the title bar; one click downloads it with progress, runs the installer passively and reopens Botloft, and the reopened app updates the daemon because it is now outdated. Failures keep the current version, with the error under "Details". Dev builds never offer to replace themselves. Updates are signed with the Tauri updater key (public key in tauri.conf.json, private key in the TAURI_SIGNING_PRIVATE_KEY secret), and requireSignedVersion keeps a tampered feed from pushing an older signed release back. Pushing a tag vX.Y.Z runs release.yml: it checks the tag against the workspace version, builds the signed installer and opens a draft release with the installer, its signature and latest.json. The updater sees it once the owner publishes it. The version now lives only in Cargo.toml.
… for the app The daemon runs `claude auth status` (documented: JSON with loggedIn, exit 0 when signed in, 1 when not; checked with 2.1.284) once Claude Code is found, every 30 s while signed out, at once when a bot hits a sign-in error, and when the app calls the new `system.refresh`. `system.status` reports `claudeSignedIn` and `claudePath`. When the answer turns from signed out to signed in, the bots a sign-in error stopped start again by themselves. An account problem with a valid sign-in (billing, a blocked organization) does not change the answer, so it cannot loop. So the app can speak the owner's language, notices carry a code (signed_out, usage_limit, turn_failed) next to the English text, and the conversation-list line carries its kind with no wording of its own: the app adds "You:" and "Waiting for approval".
Both pick a free port; run in parallel, one could take the port the other had just freed and read it as taken.
"Sign in to Claude" opens Claude Code's own sign-in (`claude auth login`) in a window of its own, launched by the app so it comes to the front, then asks the daemon to check again and watches for the result. It shows on the welcome screen as a "Claude account" check, as a banner when signed out, and on a bot stopped by a sign-in error. The Tauri command only runs an absolute path to an existing claude.exe, and strips the Claude Code session variables an app started from a session would pass on.
Every string the owner reads now lives in app/src/i18n/<locale>/, one file per area. English is the reference: its shape is the Messages type, so a text missing or extra in another language does not compile, and a test checks that none is empty. Components read with useT(); code outside React (toasts, connection errors, formatting) with t(). A language button in the title bar (also on the setup screens) picks English, Português (Brasil) or Español, or follows Windows (the first supported of the preferred languages, English otherwise). The choice is kept in localStorage and sets <html lang>. Dates, relative times and decimals follow it. The installer also comes in the three languages. The daemon's notices and conversation-list lines are worded by the app from their code and kind; names, messages, replies, tool output and the daemon's own error texts stay as they come. "Turn" gave way to plain words along the way.
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.
The app now supports multiple languages: English, Português (Brasil) and Español. Stacked on #13, which is itself on #12. Once those merge with merge commits, this diff shrinks to the last commit.
How it works
app/src/i18n/<language>/<area>.ts(common, shell, onboarding, updates, bots, chat, crews, messages). English is the reference, and its shape is theMessagestype, so a string missing from (or extra in) another language fails to compile. A test also checks that no translation is empty. Strings that include values are functions, with plurals written out for each language.useT(). Code outside React usest()when the text is needed: toasts, connection errors, date formatting.localStorage, and sets<html lang>.kind/codeadded in Sign in to Claude from the app #13. User content stays as it arrives: names, messages, replies, tool output, the tool summaries the service writes, and the service's own error messages.Tested
pnpm check: 61 tests pass. The new ones cover system-language detection, that every language has every string, switching languages (immediate and remembered), and dates in the chosen language. Existing English tests pass unchanged.Not translated (known)