mirror of
https://github.com/Felitendo/spotifast.git
synced 2026-11-01 09:23:26 +01:00
* feat(i18n): add Turkish language support Add complete Turkish translation catalogue (assets/i18n/tr.po) covering all 650 messages in spotifast.pot with natural terminology and plural rules. Register Locale::Turkish in src/i18n.rs, update documentation, and add localization test coverage. * docs: update translation coverage documentation for Turkish * fix(i18n): fix po header comment for polib parser and rustfmt style * fix(i18n): use 'Beğenilenler' for Liked Songs to support case folding
137 lines
6.8 KiB
Markdown
137 lines
6.8 KiB
Markdown
---
|
|
title: Translating Spotifast
|
|
description: Help translate Spotifast and preview the work so far.
|
|
nav_order: 6
|
|
---
|
|
|
|
Spotifast follows your computer's language when it has a translation for it,
|
|
and uses English otherwise. **Settings → Appearance → Language** picks another
|
|
language, listed under its own name, and applies it at once; **System** follows
|
|
the computer again. This arrived in 0.10.0. Corrections from
|
|
fluent speakers are welcome.
|
|
|
|
Translations are stored in `.po` files, a common format supported by editors
|
|
such as Poedit and Weblate. They are included with Spotifast, so the app does
|
|
not contact an online translation service.
|
|
|
|
## Languages and coverage
|
|
|
|
| Language | Tag | Coverage |
|
|
| --- | --- | --- |
|
|
| English | `en` | Source language |
|
|
| Spanish | `es` | Complete |
|
|
| German | `de-DE` | Partial |
|
|
| Dutch | `nl` | Partial |
|
|
| Portuguese (Brazil) | `pt-BR` | Partial |
|
|
| Portuguese (Portugal) | `pt-PT` | Partial |
|
|
| French | `fr` | Partial |
|
|
| Swedish | `sv` | Partial |
|
|
| Polish | `pl` | Partial |
|
|
| Russian | `ru` | Partial |
|
|
| Italian | `it` | Partial |
|
|
| Japanese | `ja` | Partial |
|
|
| Chinese (Simplified) | `zh-Hans` | Partial |
|
|
| Chinese (Traditional) | `zh-Hant` | Partial |
|
|
| Turkish | `tr` | Complete |
|
|
|
|
The interface is marked for translation throughout: navigation, Home, Search,
|
|
Library and collection pages, menus, the player bar, Queue and Lyrics, dialogs,
|
|
keyboard shortcuts, sign-in, Settings and notifications, including tooltips
|
|
and screen-reader names. The partial catalogues translate the earlier pilot:
|
|
navigation, Library controls, the player bar, Queue and Lyrics. Everything they
|
|
do not translate yet appears in English. The tray menu, the macOS menu bar and
|
|
Dock menu, and the Windows taskbar buttons are still English in every language,
|
|
as are error details reported by Spotify, the network or the system.
|
|
|
|
A regional system language uses the closest catalogue: `es-MX` and `es-419`
|
|
use Spanish, `de-AT` uses German, `pt-BR` and a plain `pt` use Portuguese
|
|
(Brazil), other Portuguese regions use Portuguese (Portugal), `zh-CN` and
|
|
`zh-SG` use Simplified Chinese, and `zh-TW`, `zh-HK` and `zh-MO` use
|
|
Traditional Chinese. When the system lists several preferred languages, the
|
|
first one with a catalogue wins.
|
|
|
|
Song, album, artist and playlist names come from Spotify or their creators and
|
|
are kept as provided, as are lyric lines and failure details. Generated queue
|
|
playlist names translate the surrounding words while retaining the song title
|
|
or the date in `YYYY-MM-DD` form.
|
|
|
|
## Edit and preview
|
|
|
|
The repository's `assets/i18n/spotifast.pot` is the English source template.
|
|
Open the PO for your language, such as `assets/i18n/es.po`, in your translation editor. Edit `msgstr` values;
|
|
keep `msgid`, `msgid_plural`, `msgctxt`, and placeholders such as `{count}`, `{date}`,
|
|
`{track}` and `{error}` unchanged.
|
|
Translator comments explain the placeholders. Clear a fuzzy flag only after
|
|
reviewing the translation against its current English source.
|
|
|
|
Build and preview your changes in demo mode, which uses sample music data and
|
|
needs no Spotify account. `--demo-language` takes a tag from the table above
|
|
and overrides both the setting and the system language:
|
|
|
|
```sh
|
|
cargo run --features demo -- --demo --demo-language es
|
|
cargo run --features demo -- --demo --demo-language es --demo-show light --demo-size 760x620
|
|
cargo run --features demo -- --demo --demo-language de-DE --demo-show playing-next
|
|
cargo run --features demo -- --demo --demo-language ja --demo-show lyrics-follow
|
|
```
|
|
|
|
Check a narrow and a normal window, light and dark themes, keyboard navigation,
|
|
and screen-reader names. `--demo-shot PATH` saves the preview and exits. When automating screenshots, give the process
|
|
its own XDG config, data and state directories on Linux so framework window and
|
|
scroll state do not carry between captures.
|
|
|
|
Panel fixtures also include `queue-empty`, `queue-loading`, `queue-error`,
|
|
`recents-empty`, `recents-loading`, `recents-error`, `lyrics-empty`,
|
|
`lyrics-loading`, `lyrics-error`, `lyrics-instrumental` and `lyrics-no-playback`.
|
|
Combine a lyrics fixture with `lyrics-fullscreen` first to preview that state
|
|
in full screen, for example `--demo-show lyrics-fullscreen,lyrics-error`.
|
|
|
|
## Update the template and check catalogs
|
|
|
|
Maintainers mark source phrases with `gettext(locale, "English text")` and whole
|
|
counted phrases with `ngettext(locale, "Singular", "Plural", count)`. Use
|
|
`pgettext(locale, "context", "English text")` when the same English word has
|
|
different meanings. For example, `Follow` in the `lyrics` context follows the
|
|
current lyric line, so its translation can differ from following an artist.
|
|
Interpolate with named placeholders, such as `gettext(locale, "Added {name}")`
|
|
followed by `.replace("{name}", &name)`, and explain each one in a
|
|
`// Translators:` comment above the phrase. Add any
|
|
new source file to `assets/i18n/POTFILES`. With GNU gettext tools that support
|
|
Rust installed, run:
|
|
|
|
```sh
|
|
.github/scripts/update-translations.sh
|
|
.github/scripts/update-translations.sh --check
|
|
cargo test --locked --test localization
|
|
```
|
|
|
|
The update command extracts the template with `xgettext` and merges it into
|
|
existing PO files with `msgmerge`. The check command verifies the template and
|
|
uses `msgfmt` to check catalog syntax and marked format placeholders. The
|
|
localization tests also check that every translated phrase preserves its named
|
|
placeholders, including phrases filled by string replacement. Submit changed
|
|
PO files and the template, together with any required source changes. Generated
|
|
Rust catalogs stay in Cargo's build directory and are not committed.
|
|
|
|
Normal application builds need no external gettext tools. The build validates
|
|
the PO files and compiles their translations and plural expressions to Rust.
|
|
Missing, empty, fuzzy, or incomplete plural entries fall back to the full English
|
|
phrase, so a catalogue can be published before it is complete. The localization
|
|
test requires completeness only of catalogues that claim it (currently
|
|
Spanish); every catalogue must keep the placeholders of what it translates. Each locale's `Plural-Forms` header determines its plural choices;
|
|
languages are not restricted to two forms.
|
|
|
|
## Another language or a correction
|
|
|
|
Create another PO from the template using your editor's new-translation command,
|
|
or `msginit`. Set its language and plural rules and translate what you can.
|
|
A maintainer must also register the locale in the app, including how system
|
|
language tags map to it, and preview it before it becomes available. Adding a
|
|
PO alone does not add a language to the Settings list.
|
|
|
|
Use the [translation problem form](https://github.com/crmne/spotifast/issues/new?template=translation.yml)
|
|
for incorrect wording, missing translations or text that does not fit. Each
|
|
report gets its own issue. Include the language, version, affected control, and
|
|
the text you see; a suggested correction is welcome. The catalog headers link
|
|
to this form too.
|