Files
Barış Berke Çetin 1f03a766ee feat(i18n): add Turkish language support (#643)
* 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
2026-10-03 00:20:16 +02:00

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.