Translations
Slint’s translation infrastructure makes your application available in different languages.
You can choose between runtime translations using gettext
or bundling translations directly into your executable for platforms where gettext
is unavailable or impractical.
To translate your application, follow these steps:
- Identify all user-visible strings that need translation and annotate them with the
@tr()
macro. - Extract annotated strings by running the
slint-tr-extractor
tool to generate.pot
files. - Use a third-party tool to translate the strings into
.po
files for each target language. - (For runtime
gettext
translations only) Convert.po
files into.mo
files using gettext’smsgfmt
↗. - (For bundled translations only) Configure bundling during the build process to embed translations into your application.
- Use Slint’s API to select the appropriate translation based on the user’s locale.
At this point, all strings marked for translation will be automatically rendered in the selected language.
Annotating Translatable Strings
Use the @tr
macro in .slint
files to mark strings for translation.
This macro supports formatting and pluralization, and can include contextual information.
The first argument must be a plain string literal, followed by the arguments:
Basic Example
Formatting
The @tr
macro replaces each {}
placeholder in the string marked for translation with the corresponding argument.
It’s also possible to re-order the arguments using {0}
, {1}
, and so on. Translators can use ordered
placeholders even if the original string did not.
You can include the literal characters {
and }
in a string by preceding them with the same character.
For example, escaping the {
character with {{
and the }
character with }}
.
Plurals
Use plural formatting when the translation of text involving a variable number of elements should change depending on whether there is a single element or multiple.
Given count
and an expression that represents the count of something, form the plural with the |
and %
symbols like so:
@tr("I have {n} item" | "I have {n} items" % count)
.
Use {n}
in the format string to access the expression after the %
.
Context
Disambiguate translations for strings with the same source text but different contextual meanings by adding a context
to the @tr(...)
macro using the "..." =>
syntax.
Use the context to provide additional context information to translators, ensuring accurate and contextually appropriate translations.
The context must be a plain string literal and it appears as msgctx
in the .pot
files. If not specified, the context defaults
to the name of the surrounding component.
Extracting Translatable Strings
Use slint-tr-extractor
to generate a .pot
file with all strings marked for translation:
This creates a file called MY_PROJECT.pot
. Replace “MY_PROJECT” with your actual project name.
To learn how the project name affects the lookup of translations, read the sections below.
Translating Strings
Start a new translation by creating a .po
file from a .pot
file. Both file formats are identical.
You can either copy the file manually or use a tool like Gettext’s msginit
to start a new .po
file.
The .po
file contains the strings in a target language.
.po
and .pot
files are plain text files that you can edit with a text editor. We recommend
using a dedicated translation tool for working with them, such as the following:
- poedit ↗
- OmegaT ↗
- Lokalize ↗
- Transifex ↗ (web interface)
Convert .po
Files to .mo
Files
Convert the human readable .po
files into machine-friendly .mo
files, which are a binary representation
that is more efficient to read by code.
Use Gettext ↗’s msgfmt
command line tool to convert .po
files to .mo
files:
For bundled translations, no conversion is needed; .po
files are embedded directly.
Runtime Translations with Gettext
Slint can use the Gettext ↗ library to load translations at run-time.
Gettext expects translation files - called message catalogs - in following directory hierarchy:
Directorydir_name/
Directorylocale/ e.g.
fr
,en
,de
, etcDirectoryLC_MESSAGES/
- domain_name.mo
-
dir_name
: the base directory that you can choose freely. -
locale
: The name of the user’s locale for a given target language, such asfr
for French, orde
for German.The locale is typically determined using environment variables that your operating system sets.
-
domain_name
: Selected based on the programming language you’re using Slint with.
Select and Load Translations
First, enable the SLINT_FEATURE_GETTEXT
cmake option when compiling Slint to gain access to
the translations API and activate run-time translation support.
In C++ applications using cmake, the domain_name
is the CMake target name.
Next, bind the text domain to a path using the standard gettext library.
To do so, add this in your CMakeLists.txt
file:
You can then setup the locale and the text domain
For example, if you’re using the above and the user’s locale is fr
,
Slint looks for my_application.mo
in the lang/fr/LC_MESSAGES/
directory.
First, enable the gettext
feature of the slint
crate in the features
section to gain access to the translations API
and activate run-time translation support.
Next, use the slint::init_translations!
↗ macro to specify the base location of your .mo
files.
This is the dir_name
in the scheme of the previous section. Slint expects the .mo
files to be in the
corresponding sub-directories and their file name - domain_name
- must match the package name
in your Cargo.toml
. This is often the same as the crate name.
For example:
For example, if your Cargo.toml
contains the following lines and the user’s locale is fr
:
With these settings, Slint looks for gallery.mo
in the lang/fr/LC_MESSAGES/gallery.mo
.
Bundled Translations
Bundled translations embed the translated strings directly into your application binary.
This approach is ideal for platforms like WASM or microcontrollers where gettext
is unavailable.
Configure the Slint compiler to bundle translations by providing a path to the translations. Translation files should be organized in the following hierarchy:
Bundling
Set the SLINT_BUNDLE_TRANSLATIONS
↗ property in CMake:
the <domain>
is the cmake target name.
Use slint_build::CompilerConfiguration
’s with_bundled_translations()
↗ function to set up bundling in
build.rs
:
The <domain>
is the crate name.
Selecting a Translation
If you enable the std
feature with Slint, language for translations is detected based on the locale:
if one of the bundled language matches the selected locale, it will be used.
Use the slint::select_bundled_translation
↗ function to change translations at runtime.
Use the slint::select_bundled_translation
↗ function to change translations at runtime.
Previewing Translations with slint-viewer
Make sure the gettext
feature was enabled when building slint-viewer.
Use the --translation-domain
and --translation-dir
command line options to load translations for preview.
© 2024 SixtyFPS GmbH