Localize server-provided strings#4200
Conversation
Make the server the single source of truth for translatable strings on server-provided objects. English source lives in per-module strings.json, compiles to translations/en.json for Lokalise, and is resolved at API serialization for the connection's locale; clients consume the already localized values instead of resolving these keys locally. - Add TranslationController (mass.translations) with an O(1) in-memory catalog and lazy per-locale loading. - Bind a per-connection locale resolver in _send_message so labels, descriptions, option titles, category labels, media item names, manifest text and task names resolve server-side. - Read the locale from the WebSocket auth args and a new translations/set_locale command; HTTP reads Accept-Language. - Extract in-scope hardcoded strings into per-module strings.json plus a shared common catalog and stamp explicit translation_keys. - Add scripts/build_translations.py and the Lokalise upload/download workflows. Background task name localization activates once the models pin is bumped to the release adding the BackgroundTask resolver hook.
🔒 Dependency Security Report📦 Modified DependenciesThe following dependencies were added or modified: diff --git a/requirements_all.txt b/requirements_all.txt
index 17ac2851..d9ccd460 100644
--- a/requirements_all.txt
+++ b/requirements_all.txt
@@ -49,7 +49,7 @@ lyricsgenius==3.12.2
mashumaro==3.20
modern_colorthief==0.2.1
music-assistant-frontend==2.17.187
-music-assistant-models==1.1.129
+music-assistant-models==1.1.131
mutagen==1.47.0
niconico.py-ma==2.1.0.post2
nnAudio==0.3.3New/modified packages to review:
🔍 Vulnerability Scan ResultsNo known vulnerabilities found
Automated Security Checks
Manual ReviewMaintainer approval required:
To approve: Comment |
There was a problem hiding this comment.
Pull request overview
This PR moves localization of server-provided strings (config entry labels/descriptions/options, provider manifests, some media item names, and task names) from clients into the server, making the server the single source of truth. It introduces server-side translation loading/lookup, extracts hardcoded English strings into per-module strings.json authoring files, compiles them into a flat translations/en.json for Lokalise, and adds GitHub workflows to sync translations.
Changes:
- Add server-side translation infrastructure and per-connection locale handling so serialized objects emit already-localized strings.
- Extract hardcoded provider/controller UI strings into
strings.jsoncatalogs and adjustConfigEntry/ConfigValueOptionusage accordingly. - Add translation build + Lokalise upload/download automation (pre-commit + GitHub Actions) and bump models/test snapshots for new serialization fields.
Reviewed changes
Copilot reviewed 224 out of 225 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| tests/providers/yandex_smarthome/test_auto_skill_ui.py | Tightens assertion around localized/filled status label. |
| tests/providers/yandex_music/snapshots/test_parsers.ambr | Updates snapshots for new translation_params field. |
| tests/providers/tidal/snapshots/test_parsers.ambr | Updates snapshots for new translation_params field. |
| tests/providers/kion_music/snapshots/test_parsers.ambr | Updates snapshots for new translation_params field. |
| requirements_all.txt | Bumps music-assistant-models pin to 1.1.130. |
| pyproject.toml | Bumps music-assistant-models dependency to 1.1.130. |
| music_assistant/providers/zvuk_music/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/zvuk_music/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/ytmusic/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/ytmusic/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/yousee/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/yousee/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/yandex_ynison/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/yandex_music/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/wikipedia/strings.json | Adds provider manifest description translation source. |
| music_assistant/providers/wiim/strings.json | Adds provider manifest description translation source. |
| music_assistant/providers/webdav/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/webdav/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/vban_receiver/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/vban_receiver/init.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/universal_player/strings.json | Adds provider manifest description translation source. |
| music_assistant/providers/universal_group/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/universal_group/player.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/universal_group/constants.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/tunein/strings.json | Adds provider manifest description translation source. |
| music_assistant/providers/tunein/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/tidal/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/theaudiodb/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/theaudiodb/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/sync_group/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/sync_group/player.py | Removes hardcoded UI strings in favor of translations / updates option sorting. |
| music_assistant/providers/sync_group/constants.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/subsonic_scrobble/strings.json | Adds provider manifest description translation source. |
| music_assistant/providers/squeezelite/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/squeezelite/player.py | Adjusts option construction to match new models/translation approach. |
| music_assistant/providers/squeezelite/constants.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/squeezelite/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/spotify/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/spotify/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/spotify_connect/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/spotify_connect/init.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/soundcloud/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/soundcloud/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/sonos/strings.json | Adds provider manifest description translation source. |
| music_assistant/providers/sonos_s1/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/sonos_s1/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/sonic_similarity/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/sonic_analysis/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/sonic_analysis/init.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/somafm/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/somafm/init.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/snapcast/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/snapcast/init.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/smart_playlist/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/smart_playlist/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/smart_fades/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/smart_fades/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/siriusxm/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/siriusxm/init.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/sendspin/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/sendspin/player.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/samsung_wam/strings.json | Adds provider manifest description translation source. |
| music_assistant/providers/roku_media_assistant/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/roku_media_assistant/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/radioparadise/strings.json | Adds provider manifest description translation source. |
| music_assistant/providers/radiobrowser/strings.json | Adds provider manifest description translation source. |
| music_assistant/providers/qqmusic/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/qqmusic/init.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/qobuz/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/qobuz/init.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/podcastfeed/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/podcastfeed/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/podcast_index/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/podcast_index/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/plex/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/plex_connect/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/plex_connect/init.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/phishin/strings.json | Adds provider manifest description translation source. |
| music_assistant/providers/pandora/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/pandora/init.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/orf_radiothek/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/orf_radiothek/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/opensubsonic/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/opensubsonic/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/nugs/strings.json | Adds provider manifest description translation source. |
| music_assistant/providers/nugs/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/nts/strings.json | Adds provider manifest description translation source. |
| music_assistant/providers/nicovideo/strings.json | Adds provider manifest description translation source. |
| music_assistant/providers/neteasecloudmusic/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/neteasecloudmusic/init.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/musicme/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/musicme/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/musiccast/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/musiccast/player.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/musicbrainz/strings.json | Adds provider manifest description translation source. |
| music_assistant/providers/msx_bridge/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/msx_bridge/init.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/mpd/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/mpd/player.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/mpd/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/motherearthradio/strings.json | Adds provider manifest description translation source. |
| music_assistant/providers/lrclib/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/lrclib/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/loudness_analysis/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/loudness_analysis/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/local_audio/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/local_audio/init.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/listenbrainz_scrobble/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/listenbrainz_scrobble/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/lastfm_scrobble/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/lastfm_scrobble/init.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/lastfm_recommendations/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/lastfm_recommendations/init.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/kion_music/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/kion_music/init.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/jellyfin/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/jellyfin/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/itunes_podcasts/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/itunes_podcasts/init.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/itunes_artwork/strings.json | Adds provider manifest description translation source. |
| music_assistant/providers/internet_archive/strings.json | Adds provider manifest description translation source. |
| music_assistant/providers/ibroadcast/strings.json | Adds provider manifest description translation source. |
| music_assistant/providers/ibroadcast/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/hue_entertainment/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/hue_entertainment/init.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/heos/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/heos/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/hass/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/hass_players/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/hass_players/constants.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/hass_players/init.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/gpodder/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/gpodder/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/genius_lyrics/strings.json | Adds provider manifest description translation source. |
| music_assistant/providers/fully_kiosk/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/fully_kiosk/player.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/fully_kiosk/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/filesystem_smb/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/filesystem_smb/init.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/filesystem_nfs/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/filesystem_nfs/init.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/filesystem_local/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/filesystem_local/constants.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/fastmcp_server/tools/config.py | Resolves ConfigEntry label/description via server translations for MCP tools. |
| music_assistant/providers/fastmcp_server/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/fastmcp_server/config.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/fanarttv/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/fanarttv/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/emby/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/emby/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/dlna/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/dlna/constants.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/digitally_incorporated/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/digitally_incorporated/init.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/deezer/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/deezer/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/dashie_kiosk/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/dashie_kiosk/init.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/coverartarchive/strings.json | Adds provider manifest description translation source. |
| music_assistant/providers/chromecast/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/chromecast/constants.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/builtin/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/bluesound/strings.json | Adds provider manifest description translation source. |
| music_assistant/providers/bbc_sounds/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/bbc_sounds/init.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/bandcamp/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/bandcamp/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/audiobookshelf/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/audiobookshelf/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/audible/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/audible/init.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/ariacast_receiver/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/ariacast_receiver/init.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/ard_audiothek/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/ard_audiothek/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/apple_music/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/apple_music/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/alexa/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/alexa/init.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/airplay/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/airplay/constants.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/providers/airplay_receiver/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/airplay_receiver/init.py | Removes hardcoded UI strings in favor of translations / updates option construction. |
| music_assistant/providers/acoustid_lookup/strings.json | Adds provider-authored translatable strings. |
| music_assistant/providers/acoustid_lookup/init.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/mass.py | Registers/initializes the new translations controller and includes it in API commands. |
| music_assistant/helpers/scrobbler.py | Updates ConfigValueOption construction to match new models/translation approach. |
| music_assistant/helpers/json.py | Adds load_json_dict helper for non-dataclass JSON (e.g., translations). |
| music_assistant/controllers/webserver/strings.json | Adds core-controller-authored translatable strings for webserver config. |
| music_assistant/controllers/streams/strings.json | Adds core-controller-authored translatable strings for stream config. |
| music_assistant/controllers/music.py | Adjusts config entry translation keys to avoid collisions and remove hardcoded strings. |
| music_assistant/controllers/metadata.py | Updates locale option construction for new models/translation approach. |
| music_assistant/controllers/discovery/strings.json | Adds core-controller-authored translatable strings. |
| music_assistant/controllers/discovery/controller.py | Removes hardcoded UI strings in favor of translations. |
| music_assistant/controllers/cache/strings.json | Adds core-controller-authored translatable strings. |
| music_assistant/controllers/cache/controller.py | Adjusts config entry translation keys to avoid collisions and remove hardcoded strings. |
| .pre-commit-config.yaml | Adds pre-commit hook to build/update Lokalise English source file. |
| .github/workflows/lokalise-upload.yml | Uploads generated English source strings to Lokalise. |
| .github/workflows/lokalise-download.yml | Downloads translations and opens an automated PR. |
Activates server-side localization of background task names via the BackgroundTask resolver hook added in models 1.1.131; all other server-provided strings already resolved under 1.1.130.
Spacing/typo fixes surfaced by review on strings carried over verbatim from the original hardcoded descriptions (jellyfin copy/paste leftover, missing spaces after periods in filesystem_smb/spotify/squeezelite, double space and "dont"->"don't" in squeezelite).
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 224 out of 225 changed files in this pull request and generated 5 comments.
Comments suppressed due to low confidence (1)
music_assistant/providers/spotify/init.py:187
- [PROBLEM] This user-facing description remains hardcoded in code, so it will always be English and bypass the new server-side localization pipeline (no corresponding translation key in the catalogs). Move this text into the provider’s strings.json (e.g. config_entries.client_id.description) and rely on translation resolution instead.
…ypo fixes
- Move the last 3 hardcoded f-string config-entry descriptions (kion_music
base_url, qqmusic check_qr_auth, spotify client_id) into strings.json with a
{0} placeholder + translation_params, so they localize server-side too.
- Fix chromecast use_mass_app description: the line break was double-escaped
(\\n\\n -> literal text), now renders as real newlines.
- Pin the Lokalise CLI install in both workflows to a tagged release (v3.1.4)
instead of pulling the installer from the master branch.
# Conflicts: # pyproject.toml # requirements_all.txt
- fastmcp _entry_dump now passes entry.translation_params to get_translation
so {0} placeholders (Spotify callback URL, QR provider name) are substituted
for MCP clients, matching ConfigEntry.__post_serialize__.
- Add minimal GITHUB_TOKEN permissions to the Lokalise workflows (upload:
contents:read; download: contents:write + pull-requests:write).
The MCP config dump now resolves labels/descriptions via mass.translations, but the test's MagicMock mass returned a MagicMock for get_translation, which landed in ConfigEntryDump and broke output-schema validation. Stub it to return None so the dump falls back to the in-code value / entry key.
# Conflicts: # music_assistant/controllers/streams/controller.py
What does this implement/fix?
Translatable strings for objects the server provides — config-entry labels/descriptions/option titles, config categories, provider manifest name/description, media item names (recommendations, browse folders, builtin playlists, genres) and background task names — were duplicated: hardcoded English in code plus a private copy of every key/string in each client (frontend, mobile). Adding or renaming one meant editing code and each client catalog by hand, and the server could never emit a localized string.
This makes the server the single source of truth for those strings. English source lives in per-module
strings.json, is compiled totranslations/en.jsonfor Lokalise, and is resolved server-side at serialization for the connection's locale. Clients stop resolving these locally and consume the already-localized values; only UI-only strings stay client-owned.Changes
TranslationController(mass.translations): loads each module'sstrings.json+ downloadedtranslations/<lang>.jsoninto a flat in-memory catalog with O(1) lookup and lazy per-locale loading._send_message/_send_message_sync.authargs and a newtranslations/set_localecommand; HTTP readsAccept-Language. Advertiseavailable_locales/default_localeonServerInfoMessage.strings.json+ a shared common catalog, stamp explicittranslation_keys, and addscripts/build_translations.pyto compileen.json.Pins
music-assistant-models==1.1.131(companion PR music-assistant/models#247), whoseBackgroundTaskresolver hook makes task names localize server-side alongside everything else.Related issue (if applicable):
Types of changes
bugfixnew-featureenhancementnew-providerbreaking-changerefactordocumentationmaintenancecidependenciesChecklist
pre-commit run --all-filespasses.pytestpasses, and tests have been added/updated undertests/where applicable.music-assistant/modelsis linked.music-assistant/frontendis linked.Companion PRs: