Skip to content

feat: Add multi-language support with 4 new languages and validation#30

Merged
tphakala merged 5 commits intomainfrom
feature/multi-language-support
Feb 15, 2026
Merged

feat: Add multi-language support with 4 new languages and validation#30
tphakala merged 5 commits intomainfrom
feature/multi-language-support

Conversation

@tphakala
Copy link
Copy Markdown
Owner

@tphakala tphakala commented Feb 15, 2026

Summary

This PR adds comprehensive multi-language support to Birda GUI with Finnish, Swedish, German, and Spanish translations, plus a centralized language registry, auto-detection system, and CI validation.

Changes

🌍 Translation Files

  • Finnish (fi): 329 keys translated to Suomi
  • Swedish (sv): 329 keys translated to Svenska
  • German (de): 329 keys translated to Deutsch
  • Spanish (es): 329 keys translated to Español

All translations:

  • Preserve placeholder syntax ({count}, {path}, etc.)
  • Follow native grammar and UI conventions
  • Keep brand names unchanged (Birda GUI, birda CLI, eBird)
  • Use established technical terminology

📦 Language Registry System

  • New file: src/renderer/src/lib/i18n/languages.ts
    • Centralized language metadata (codes, native names, text direction)
    • Utility functions: getLanguage(), getLanguageCodes()
    • Single source of truth for all language configuration

🔍 Auto-Detection System

  • New file: src/renderer/src/lib/i18n/detect.ts
    • Detects user's OS language on first run
    • Fallback to English if detected language unavailable
  • New file: src/main/ipc/system.ts
    • IPC handler for system locale detection (system:get-locale)
  • Updated: src/renderer/src/main.ts
    • Auto-detects and applies language before app mount
    • Works for new users without saved preferences

🧙 Setup Wizard Integration

  • Updated: src/renderer/src/lib/components/SetupWizard.svelte
    • New wizard flow: Welcome → UI Language → CLI → Model → Species Language
    • Auto-detects and pre-selects system language
    • Shows detection message: "We detected {language} based on your system settings"
    • Applies language immediately on selection
  • New message keys:
    • wizard_uiLanguage_title
    • wizard_uiLanguage_subtitle
    • wizard_uiLanguage_detected

⚙️ Settings Panel Refactoring

  • Updated: src/renderer/src/lib/components/SettingsPanel.svelte
    • Removed hardcoded UI_LANGUAGE_NAMES constant
    • Now imports from centralized $lib/i18n/languages
    • Displays native language names from registry

🔌 IPC Infrastructure

  • Updated: src/main/ipc/handlers.ts - Register system handlers
  • Updated: src/preload/index.ts - Add system:get-locale to allowlist
  • Updated: src/renderer/src/lib/utils/ipc.ts - Add getSystemLocale() wrapper

✅ Translation Validation Script

  • New file: scripts/validate-translations.js
    • Validates key count consistency across all languages
    • Checks placeholder consistency ({placeholders} must match)
    • Detects untranslated English content
    • Ignore list for technical terms/abbreviations
    • Exit codes: 0 (pass), 1 (fail) for CI integration
  • Updated: package.json
    • New script: npm run validate:translations
    • Updated validate script to include translation validation
  • Updated: .github/workflows/ci.yml
    • Added "Validate translations" step after Paraglide compilation
    • Runs on every PR/push to main

📝 Configuration Updates

  • Updated: project.inlang/settings.json
    • Added language codes: ["en", "fi", "sv", "de", "es"]
  • Updated: messages/en.json
    • Added 3 new wizard UI language keys

Verification

# All translation files validated
✓ Reference (en.json): 329 keys
✓ de.json
✓ es.json
✓ fi.json
✓ sv.json
✅ All translation files are valid!

# Build completed successfully
✓ built in 7.07s

# Key consistency verified
en: 329 keys
fi: 329 keys
sv: 329 keys
de: 329 keys
es: 329 keys

Testing Checklist

  • Build completes without errors
  • All translation files have correct key count
  • All placeholders preserved correctly
  • Validation script passes in CI
  • Auto-detection works on first run
  • Language switching works in Settings
  • Setup wizard shows UI language step
  • Language persists across app restarts

Screenshots

(To be added by reviewer - test each language in the wizard and settings)

Notes

  • Translation quality: AI-generated translations reviewed for technical accuracy
  • Ignore list: Technical terms like "Mono", "Stereo", "Data", "Format" allowed to be identical
  • Future languages: Easy to add - just add to registry + create translation file
  • Paraglide compiles all 5 languages successfully with tree-shaking

Migration Guide

For users:

  • Existing users keep English (default)
  • New users get auto-detected language
  • Can change language anytime in Settings → Preferences → UI Language

For developers:

  • When adding new message keys, add to ALL 5 language files
  • Run npm run validate:translations to check
  • Paraglide shows warnings for missing translations
  • App gracefully falls back to English for untranslated keys

Summary by CodeRabbit

Release Notes

  • New Features

    • Added support for German, Spanish, Finnish, and Swedish languages
    • Automatic language detection during setup based on system settings
    • New UI language selection step in the setup wizard
  • Chores

    • Enhanced translation validation in CI/CD pipeline

Add comprehensive multi-language translation system with Finnish, Swedish,
German, and Spanish support, including centralized language registry,
auto-detection, and CI validation.

Features added:
- Translation files for Finnish, Swedish, German, and Spanish (329 keys each)
- Centralized language registry (src/renderer/src/lib/i18n/languages.ts)
- Auto-detection utility using system locale (src/renderer/src/lib/i18n/detect.ts)
- System locale IPC handler (src/main/ipc/system.ts)
- UI language selection step in setup wizard (before CLI step)
- Refactored SettingsPanel to use language registry
- Translation validation script for CI (scripts/validate-translations.js)
- CI workflow integration for translation validation

Technical changes:
- Updated Paraglide configuration to support 5 languages (en, fi, sv, de, es)
- Added IPC channel system:get-locale for locale detection
- Updated main.ts with auto-detection on first run
- Added 3 new wizard message keys for UI language step
- Updated CI workflow to validate translations on every PR/push

Validation features:
- Key count consistency checking
- Placeholder consistency validation
- Detection of untranslated content
- Ignore list for technical terms and abbreviations
- Exit codes for CI integration (0 = pass, 1 = fail)

All translation files validated and build tested successfully.
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Feb 15, 2026

Warning

Rate limit exceeded

@tphakala has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 8 minutes and 37 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

Walkthrough

Adds comprehensive internationalization support with translation files for German, Spanish, Finnish, and Swedish. Implements system locale detection via IPC, introduces translation validation infrastructure, and integrates UI language selection into the setup wizard with auto-detection capabilities.

Changes

Cohort / File(s) Summary
Translation Files
messages/en.json, messages/de.json, messages/es.json, messages/fi.json, messages/sv.json
Added German, Spanish, Finnish, and Swedish translation files; added UI language wizard strings to English translations. Comprehensive coverage of UI keys across common actions, settings, analysis, models, maps, tables, and wizard flows.
i18n Infrastructure
src/renderer/src/lib/i18n/languages.ts, src/renderer/src/lib/i18n/detect.ts
Introduced centralized language registry with LanguageInfo interface and LANGUAGES constant for en, fi, sv, de, es; added language detection utility that maps system locale to supported language codes with English fallback.
IPC System Integration
src/main/ipc/system.ts, src/main/ipc/handlers.ts, src/preload/index.ts, src/renderer/src/lib/utils/ipc.ts
Added system IPC module exposing getSystemLocale handler; registered handler in main process; whitelisted system:get-locale channel in preload; exposed getSystemLocale() method in renderer IPC utilities.
UI Components & Initialization
src/renderer/src/lib/components/SetupWizard.svelte, src/renderer/src/lib/components/SettingsPanel.svelte, src/renderer/src/main.ts
Integrated UI language selection as wizard step with system locale auto-detection; updated SettingsPanel to use centralized LANGUAGES registry; added auto-detection logic to main.ts with fallback to English if no saved preference.
Validation & Configuration
scripts/validate-translations.js, package.json, project.inlang/settings.json, .github/workflows/ci.yml
Introduced translation validation script with key count, placeholder, empty string, English word, and untranslated text detection; added npm validate:translations script; expanded inlang settings to support five languages and new linting modules; added CI validation step.

Sequence Diagram(s)

sequenceDiagram
    participant User as User (Renderer)
    participant Wizard as SetupWizard Component
    participant IPC as IPC Bridge
    participant Main as Main Process
    participant Store as Settings Storage
    participant i18n as i18n System
    
    User->>Wizard: Visit wizard (first run)
    Wizard->>IPC: getSystemLocale()
    IPC->>Main: invoke 'system:get-locale'
    Main->>IPC: app.getLocale() result
    IPC->>Wizard: system locale string
    Wizard->>i18n: detectLanguage(systemLocale)
    i18n-->>Wizard: detected language code
    Wizard->>Wizard: display detected language<br/>populate LANGUAGES dropdown
    User->>Wizard: select UI language
    Wizard->>i18n: setLocale(selected)
    i18n-->>Wizard: locale applied
    Wizard->>Store: saveSettings({ui_language})
    Wizard->>Wizard: proceed to next step
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main change: adding multi-language support with 4 new languages and validation. It is concise, specific, and directly relevant to the changeset's primary objective.
Docstring Coverage ✅ Passed Docstring coverage is 83.33% which is sufficient. The required threshold is 80.00%.
Merge Conflict Detection ✅ Passed ✅ No merge conflicts detected when merging into main

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feature/multi-language-support

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@gemini-code-assist
Copy link
Copy Markdown

Summary of Changes

Hello @tphakala, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly enhances the Birda GUI by introducing comprehensive multi-language support. It enables the application to be used in Finnish, Swedish, German, and Spanish, alongside English. The changes include a robust framework for managing language data, an intelligent system for automatically detecting and applying the user's preferred UI language, and a new validation process to maintain the quality and consistency of all translations. This initiative aims to provide a more localized and user-friendly experience for a wider international audience.

Highlights

  • Multi-language Support Added: Introduced Finnish, Swedish, German, and Spanish translations, expanding the Birda GUI's accessibility to new language communities.
  • Centralized Language Management: Implemented a new language registry system (src/renderer/src/lib/i18n/languages.ts) to centralize language metadata and provide utility functions for consistent language configuration across the application.
  • Automatic UI Language Detection: Developed an auto-detection system (src/renderer/src/lib/i18n/detect.ts) that identifies the user's OS language on first run and applies it, falling back to English if the detected language is unavailable.
  • Setup Wizard Integration for UI Language: Integrated a new UI language selection step into the setup wizard, which pre-selects the auto-detected system language and applies it immediately upon selection.
  • Automated Translation Validation: Added a CI-integrated script (scripts/validate-translations.js) to validate translation files for key count consistency, placeholder matching, and detection of untranslated English content, ensuring translation quality.
Changelog
  • messages/de.json
    • Added German translation file with 329 keys.
  • messages/en.json
    • Added three new wizard UI language keys.
  • messages/es.json
    • Added Spanish translation file with 329 keys.
  • messages/fi.json
    • Added Finnish translation file with 329 keys.
  • messages/sv.json
    • Added Swedish translation file with 329 keys.
  • package.json
    • Added a new validate:translations script.
    • Integrated the new translation validation script into the main validate script.
  • project.inlang/settings.json
    • Updated languageTags to include Finnish, Swedish, German, and Spanish.
  • scripts/validate-translations.js
    • Added a new script to validate translation files for consistency and completeness.
  • src/main/ipc/handlers.ts
    • Imported and registered registerSystemHandlers.
  • src/main/ipc/system.ts
    • Added a new file to register IPC handlers for system-level operations, including system:get-locale.
  • src/preload/index.ts
    • Added system:get-locale to the list of allowed IPC invoke channels.
  • src/renderer/src/lib/components/SettingsPanel.svelte
    • Removed hardcoded UI_LANGUAGE_NAMES constant.
    • Updated to import language options from the new centralized $lib/i18n/languages registry.
    • Modified UI language selection to display native language names.
  • src/renderer/src/lib/components/SetupWizard.svelte
    • Imported new i18n utilities (LANGUAGES, getLanguage, detectLanguage, setLocale).
    • Modified the wizard step flow to include a ui-language step.
    • Implemented logic to auto-detect system locale and pre-select the UI language.
    • Added a new handleUiLanguageNext function to apply and save the selected UI language.
  • src/renderer/src/lib/i18n/detect.ts
    • Added a new utility function detectLanguage to determine the best UI language based on the system locale.
  • src/renderer/src/lib/i18n/languages.ts
    • Added a new file to serve as a central registry for all available UI languages and their metadata.
  • src/renderer/src/lib/utils/ipc.ts
    • Added a new IPC wrapper function getSystemLocale.
  • src/renderer/src/main.ts
    • Imported getSystemLocale and detectLanguage.
    • Modified the initial locale setting logic to auto-detect and apply the system UI language if no preference is saved.
Ignored Files
  • Ignored by pattern: .github/workflows/** (1)
    • .github/workflows/ci.yml
Activity
  • All new translation files (German, Spanish, Finnish, Swedish) were added, each containing 329 keys.
  • The English translation file (messages/en.json) was updated with 3 new keys for the UI language wizard step.
  • A new validate-translations.js script was created to ensure translation consistency and quality.
  • The package.json was updated to include and run the new translation validation script as part of the validate command.
  • The project.inlang/settings.json file was updated to register the new language codes.
  • New IPC handlers and related utility functions were added to support system locale detection.
  • The SettingsPanel.svelte and SetupWizard.svelte components were refactored to integrate the new language registry and auto-detection features.
  • The main application entry point (src/renderer/src/main.ts) was modified to apply the auto-detected UI language on startup.
  • Verification steps confirmed that all translation files are valid, the build completed successfully, and key consistency was maintained across all languages.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@src/renderer/src/lib/components/SetupWizard.svelte`:
- Around line 163-172: The onMount block can assign null to selectedUiLanguage
if detectLanguage(systemLocale) returns null; change the assignment in the
onMount handler so selectedUiLanguage only gets detectLanguage(systemLocale)
when non-null, otherwise keep the default 'en' (e.g., use a null-coalescing
pattern or conditional) and ensure detectedLanguage is set accordingly; update
references to selectedUiLanguage/detectedLanguage used by handleUiLanguageNext
and isLocale so they never receive null from detectLanguage/getSystemLocale
calls.
🧹 Nitpick comments (6)
project.inlang/settings.json (1)

5-9: Consider pinning inlang module versions for reproducible builds.

All four module URLs use @latest, which means a breaking upstream release could silently affect your build. Pinning to specific versions (e.g., @1.x.x) would improve reproducibility.

src/renderer/src/lib/i18n/languages.ts (2)

6-23: Clean registry design.

Well-structured single source of truth. One note: the LANGUAGES codes must stay in sync with project.inlang/settings.json languageTags. Consider adding a comment pointing to this dependency so future contributors adding a language don't miss updating both.


38-39: getLanguageCodes() allocates a new array on every call.

This is called from detectLanguage on startup and potentially from hot paths. Since LANGUAGES is a constant, consider caching the result.

♻️ Optional: memoize the codes array
+const languageCodes = LANGUAGES.map((lang) => lang.code);
+
 export function getLanguageCodes(): string[] {
-  return LANGUAGES.map((lang) => lang.code);
+  return languageCodes;
 }
scripts/validate-translations.js (3)

139-160: False positives likely with common European cognates like "in", "on", "to".

Words such as in, on, to, and at exist as native words in German, Swedish, and other target languages. Even with threshold=3, a German sentence like "Klicken Sie in der Analyse auf den Model-Tab" could match in, on, model, analysis (4 hits), triggering a false warning despite being properly translated.

Consider either removing the shortest/most ambiguous words (in, on, at, to) from ENGLISH_INDICATORS, or raising the threshold for these short words.


141-143: Skipping all texts with < or > is overly broad.

Any translation containing a literal < or > (e.g., comparison text like "values > 0") will bypass the English-word check entirely. If the intent is to skip HTML tags, a more targeted check like /<[a-zA-Z/]/.test(text) would be narrower.


279-287: Static analysis: forEach callback should not return a value.

Biome flags the implicit return from console.log inside the forEach arrow. Use a block body or switch to for...of.

Proposed fix
       if (result.errors.length > 0) {
         console.log(`  Errors (${result.errors.length}):`);
-        result.errors.forEach((err) => console.log(`    • ${err}`));
+        for (const err of result.errors) {
+          console.log(`    • ${err}`);
+        }
       }
 
       if (result.warnings.length > 0) {
         console.log(`  Warnings (${result.warnings.length}):`);
-        result.warnings.forEach((warn) => console.log(`    ⚠ ${warn}`));
+        for (const warn of result.warnings) {
+          console.log(`    ⚠ ${warn}`);
+        }
       }

Comment on lines 163 to +172
onMount(async () => {
// Auto-detect system language for UI language step
try {
const systemLocale = await getSystemLocale();
detectedLanguage = detectLanguage(systemLocale);
selectedUiLanguage = detectedLanguage;
} catch {
// Detection failed, use English default
selectedUiLanguage = 'en';
}
Copy link
Copy Markdown

@coderabbitai coderabbitai bot Feb 15, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

selectedUiLanguage can be set to null if detectLanguage returns no match.

If detectLanguage(systemLocale) returns null (OS locale doesn't map to a supported language), line 168 assigns null to selectedUiLanguage, overriding its 'en' default. This would leave the <select> with no valid selection and handleUiLanguageNext would skip saving entirely (since isLocale(null) is falsy).

Proposed fix
     try {
       const systemLocale = await getSystemLocale();
-      detectedLanguage = detectLanguage(systemLocale);
-      selectedUiLanguage = detectedLanguage;
+      const detected = detectLanguage(systemLocale);
+      detectedLanguage = detected;
+      if (detected) {
+        selectedUiLanguage = detected;
+      }
     } catch {
🧰 Tools
🪛 GitHub Actions: CI

[warning] Code style issues found. Run 'prettier --write' to fix.

🤖 Prompt for AI Agents
In `@src/renderer/src/lib/components/SetupWizard.svelte` around lines 163 - 172,
The onMount block can assign null to selectedUiLanguage if
detectLanguage(systemLocale) returns null; change the assignment in the onMount
handler so selectedUiLanguage only gets detectLanguage(systemLocale) when
non-null, otherwise keep the default 'en' (e.g., use a null-coalescing pattern
or conditional) and ensure detectedLanguage is set accordingly; update
references to selectedUiLanguage/detectedLanguage used by handleUiLanguageNext
and isLocale so they never receive null from detectLanguage/getSystemLocale
calls.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a false positive. detectLanguage() return type is string, not string | null (detect.ts:10). It always returns either a matched language code or 'en' as fallback (line 22). The assignment at line 168 is safe.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Read the detect.ts file to verify the return type and implementation
cat src/renderer/src/lib/i18n/detect.ts

Length of output: 764


@tphakala You're absolutely right, and I apologize for the confusion. I've confirmed that detectLanguage() has an explicit return type of string (line 10 in detect.ts) and always returns either a matched language code or falls back to 'en' (line 23). It never returns null.

The assignment selectedUiLanguage = detectedLanguage at line 168 is indeed safe. Thank you for catching this false positive and providing the reference! 🙏

🐰💭
(\/)
(•
•)
/>📚 learned something today!

if (selectedUiLanguage && isLocale(selectedUiLanguage)) {
try {
await setSettings({ ui_language: selectedUiLanguage });
void setLocale(selectedUiLanguage);

This comment was marked as outdated.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in b01e17a. Added { reload: false } to match pattern in main.ts.

…lescing, disable Node.js rules in validation script
Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces comprehensive multi-language support, adding translations for Finnish, Swedish, German, and Spanish. The implementation is well-structured, featuring a centralized language registry, an auto-detection system for new users, and integration into both the setup wizard and settings panel. The inclusion of a CI validation script for translations is an excellent step towards ensuring long-term maintainability. The code is clean and follows good practices. I've found one issue in the setup wizard that could disrupt the user experience, which I've detailed in a specific comment. Overall, this is a great enhancement for the application.

if (selectedUiLanguage && isLocale(selectedUiLanguage)) {
try {
await setSettings({ ui_language: selectedUiLanguage });
void setLocale(selectedUiLanguage);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The setLocale function from Paraglide reloads the page by default. Calling it without { reload: false } will interrupt the setup wizard flow by causing a page refresh. This would prevent the user from proceeding to the next step.

To fix this, you should call setLocale with the reload: false option and await it within the try...catch block to ensure the language is applied without disrupting the wizard.

        await setLocale(selectedUiLanguage, { reload: false });

…style

- Add { reload: false } to setLocale in handleUiLanguageNext to prevent page reload
- Add comment documenting sync requirement with project.inlang/settings.json
- Change forEach to for...of loops to avoid implicit return warnings
@tphakala tphakala merged commit 0d027de into main Feb 15, 2026
5 checks passed
@tphakala tphakala deleted the feature/multi-language-support branch February 15, 2026 14:12
tphakala added a commit that referenced this pull request Feb 15, 2026
Previously, changing the UI language in settings required an app
restart. The setLocale call was missing the { reload: false } parameter
that was added to SetupWizard in PR #30.

Now the UI updates immediately when saving settings with a new language
selection, matching the behavior of the setup wizard.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant