Skip to content

Enhanced Italian Localization Updated - #1154

Open
albyalex96 wants to merge 9 commits into
rukamori:mainfrom
albyalex96:i18n/italian-localization
Open

Enhanced Italian Localization Updated#1154
albyalex96 wants to merge 9 commits into
rukamori:mainfrom
albyalex96:i18n/italian-localization

Conversation

@albyalex96

Copy link
Copy Markdown

Pull Request

Summary

Adds a complete Italian localization by introducing strings-it.xml with translations for every string in the base strings.xml. The translation preserves product and service names as-is (ArchiveTune, Discord, YouTube, Last.fm, Libre.fm, ListenBrainz, Spotify, Cast, Rich Presence, PO Token, etc.) and adjusts plural forms to Italian grammar rules. No app behavior, code, or existing resources are modified; devices with an Italian locale will now fall back to the new Italian strings instead of English.

Linked Work

  • Closes: (none)
  • Related: Localization follow-up for the existing strings.xml

Change Type

  • Feature
  • Bug fix
  • UI / UX
  • Performance / memory
  • Playback / Media3
  • Lyrics / provider integration
  • Search / YouTube / network data
  • Local library / Room database
  • Widgets / notification / shortcuts
  • Settings / preferences / DataStore
  • Discord / Last.fm / ListenBrainz / external integration
  • Localization / strings / fastlane metadata
  • Build / Gradle / CI / release packaging
  • Dependency update
  • Documentation only

Affected Surfaces

  • :app
  • :core
  • :lyrics
  • :lastfm
  • :canvas
  • :shazamkit
  • :spotifycore
  • Other: new strings-it.xml resource file (Italian string resources only; no code touched)

Screenshots / Recordings

Not applicable — this is a resource-only change with no visual or UI difference in the default (English) locale.

Before After

Behavior Notes

  • App behavior is unchanged for any locale except Italian.
  • Devices/users with locale it will now resolve UI strings from strings-it.xml; all other locales keep the base strings.xml values.
  • Every key present in the base file is mirrored in the Italian file, so no resource-linking gaps are introduced. Placeholders (%s, %d, %1$s, %1$d, %1$+.1f dB, %1$.1f kHz, etc.), escaped quotes (\u0022), escaped apostrophes (\'), and multiline \n sequences are preserved verbatim.
  • Plural entries (one/other) were adapted to Italian pluralization; invariant nouns such as album and playlist keep a single form in both quantities.
  • A pre-existing mojibake in external_downloader_not_configured (Settings â†' Player) is rendered correctly as Impostazioni → Player in the Italian file only; the base file is left untouched.

Architecture Checklist

Not applicable — no source, state, or data-flow changes.

  • The change preserves UDF flow: UI -> ViewModel -> UseCase/domain -> Repository/data.
  • Screen state is represented structurally with Loading, Success, Empty, and Error where this PR introduces or changes screen state.
  • Composables receive immutable, UI-specific domain models instead of raw Room, network, or service entities.
  • Business work is not triggered directly from composition.
  • Exceptions are surfaced through explicit state or result types instead of being swallowed.
  • No runBlocking is introduced in app execution paths.

Compose / Material Checklist

Not applicable — no UI code changes.

  • UI state is hoisted out of composable layout code.
  • Reactive state is collected with collectAsStateWithLifecycle().
  • New UI models are annotated with @Immutable or @Stable.
  • Lazy layouts use stable key values and explicit contentType.
  • Non-primitive constants, structural lambdas, and allocation-heavy objects in hot paths are remembered.
  • Rapidly changing inputs such as scroll, gesture, animation, or playback progress use derivedStateOf where appropriate.
  • UI strings come from stringResource() and duplicated visible strings on the same screen are avoided.
  • Interactive elements keep a minimum 48dp touch target.
  • Material 3 / Material 3 Expressive tokens are used for color, typography, shape, and motion instead of hardcoded UI values.
  • Edge-to-edge layouts handle and consume WindowInsets correctly when this PR changes screen layout.

Concurrency / Performance Checklist

Not applicable — no runtime code changes.

  • Business coroutines are scoped to viewModelScope or an existing lifecycle-owned application/service scope.
  • Disk, database, network, parsing, and heavy mapping work is dispatched to Dispatchers.IO or Dispatchers.Default.
  • Cancellation is handled explicitly where long-running work, playback, downloads, sync, lyrics fetching, or recognition is involved.
  • The change avoids blocking the main thread.
  • The change avoids unnecessary allocations in recomposition loops, playback loops, polling loops, and provider parsing paths.
  • Large lists, images, lyrics payloads, and network responses are bounded, streamed, cached, paged, or mapped off the main thread as appropriate.

Data / Persistence Checklist

Not applicable — no persistence, database, network, or DTO changes.

  • Room entity, DAO, or database changes include a schema update under app/schemas.
  • Database migrations preserve existing user data and fail clearly when migration is impossible.
  • DataStore or preference-key changes are backward compatible.
  • Network DTOs remain isolated from UI models.
  • Provider responses handle missing, malformed, regional, or rate-limited data without crashing the app.

Playback / Integration Checklist

Not applicable — no playback or integration behavior changes.

  • Media3 playback, queue, cache, and service behavior remains stable across foreground, background, notification, and process recreation paths.
  • Audio focus, notification controls, widgets, shortcuts, and media session actions are considered when playback behavior changes.
  • External integrations handle absent credentials, revoked auth, network failure, and API changes.
  • Native, AAR, or ABI-sensitive changes account for mobile/tv and universal, arm64, armeabi, x86, and x86_64 variants.

Localization / Assets Checklist

  • User-facing strings are added to the base resources and translated resources are updated or intentionally left for translation follow-up. (Base strings.xml is untouched; all of its keys are translated in the new strings-it.xml.)
  • Unused string resources, drawables, and metadata are removed when replaced. (Not applicable — nothing was replaced or removed.)
  • Image assets have explicit display dimensions and are decoded at the displayed size. (Not applicable.)
  • Fastlane metadata, screenshots, icons, or release text are updated when user-facing store behavior changes. (Not applicable.)

Privacy / Security Checklist

Not applicable — no runtime, network, or logging code changes. The new file contains only localized UI text and no secrets or paths.

  • No secrets, keys, tokens, keystores, signing files, private certificates, or local machine paths are committed.
  • Logs do not expose access tokens, cookies, auth headers, user identifiers, listening history, or local file paths.
  • New network calls are justified by the feature and use existing client, proxy, timeout, and error-handling patterns.
  • User data remains local unless the PR explicitly documents the integration and consent path.

Verification

  • Key-parity check: scripted comparison of name attributes between strings.xml and strings-it.xml — 0 missing, 0 extra keys.
  • XML validity: strings-it.xml parses successfully as well-formed XML.
  • Format placeholder audit: all %s, %d, %1$s, %1$d, %1$+.1f dB, %1$.1f kHz, %1$d%%, %1$s/s, \n, \u0022, and \' sequences match the base file.
  • Android Studio sync: not run — change is limited to a new string resource file.
  • Manual device/emulator verification: not performed — no locale-dependent UI review was done yet; recommended before merge.
  • UI screenshot/recording attached: not applicable (no visual change).
  • Accessibility or touch-target review: not applicable (no layout change).
  • Regression areas checked: not applicable (no runtime code paths affected).
  • CI expectation: standard resource validation; no build-script or Gradle changes.

Reviewer Focus

  • Review strings-it.xml for natural Italian phrasing and grammatical gender/number agreement (e.g., %d selezionati, plural brano/brani, invariant album/playlist).
  • Confirm no product/service names were mistranslated and that the Palette names (e.g., Spotify, YouTube, Sakura, Synthwave, Cyberpunk) stay as intended brand terms.
  • Confirm every format placeholder in the translated strings matches the base resource exactly, so String.format/resource formatting does not crash at runtime.

Release Notes

ArchiveTune is now fully translated into Italian.

@albyalex96

albyalex96 commented Sep 1, 2026

Copy link
Copy Markdown
Author

@rukamori could you please approve workflow so i can get a test version of the app with my branch? i don't really know how to build it myself ( as i don't know how to properly set up all the keys required for the build ) . i would use that version till this pr is merged ( hopefully 🤣 ) . peace <3

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.

4 participants