Upload your Qt Linguist .ts source files, translate messages by context, and export a file lrelease compiles without changes.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="pl">
<context>
<name>AboutPage</name>
<message>
<source>Author</source>
<translation>Autor</translation>
</message>
</context>
</TS>Qt Linguist's translation source files also use the .ts extension, which has nothing to do with TypeScript. It is an XML format where every <message> sits inside a <context> block, usually named after the C++ class or QML component the string came from. Before an app ships, Qt's lrelease tool compiles the file into a binary .qm file that the runtime actually loads.
Plural forms use numerusform entries built around a %n placeholder, and how many variants a language needs depends on that language's own grammar rather than a fixed count. On import, SimpleLocalize turns those variants into one translation key in ICU message syntax, so all plural forms for a string are edited together.
{COUNT, plural,
one {Znaleziono %n plik}
few {Znaleziono %n pliki}
other {Znaleziono %n plików}
}Source, not the compiled output
Each context block usually names the class or QML component a string belongs to.
A .ts file is the editable XML source. lrelease compiles it into the binary .qm your app loads.
The number of numerusform variants per message depends on the target language's grammar.
End-to-end workflow
Upload a neutral translations_en.ts file, translate messages while keeping the original context and comments, and export one file per language, ready to compile with lrelease.
simplelocalize upload \
--apiKey PROJECT_API_KEY \
--uploadFormat qt-linguist \
--uploadLanguageKey en \
--uploadPath ./translations_en.ts.ts file and upload it. Messages import grouped by their original context.AboutPage
Author
Version
Found %n files
SettingsPage
LanguageAboutPage and SettingsPage messages stay grouped exactly as they were in the original .ts file, so translators keep the same mental map.one: Znaleziono %n plik
few: Znaleziono %n pliki
many: Znaleziono %n plików
other: Znaleziono %n plikunumerusform variant translates together as a single ICU-format key, so a translator never sees a plural form out of context from the others.simplelocalize download \
--apiKey PROJECT_API_KEY \
--downloadFormat qt-linguist \
--downloadPath ./translations_{lang}.ts
lrelease translations_pl.ts.qm file the same way you always have.For developers
SimpleLocalize maps Qt Linguist's own structure onto concepts you already use in the editor.
Each context block is imported as a namespace, so messages stay grouped by the class or component they belong to.
All plural variants for a message are combined into a single translation key, instead of several disconnected strings.
Translate new and changed messages with DeepL, Google Translate, OpenAI, Claude or Gemini, grouped by their original context.
Upload and download translation sources from the CLI, or automate the same logic through the REST API.

More conversions
Free online converter, no account required. Upload a .ts file and download it in the format you need.
More on localization workflows and translation file formats.

Stop treating translation as a manual step before release. Learn how to trigger AI translations automatically on every GitHub push, using SimpleLocalize CLI or the GitHub App.

Machine translation often breaks UI strings through missing context, character limits, and grammar rules other languages don't follow. Here's why, and how to fix it.

Why context is the single biggest factor in AI translation quality, and how to structure project context, key descriptions, and glossaries for accurate results.
No. They share a file extension by coincidence. Qt Linguist's .ts is an XML translation source, unrelated to the TypeScript programming language.
Yes. SimpleLocalize exports the XML translation source. Compiling it into a binary .qm file for your app still happens with lrelease as part of your normal build.
Each <context> block is imported as a namespace in SimpleLocalize, so messages from the same class or QML component stay grouped together in the editor.
Yes. Variants are combined into a single ICU-format translation key, with the correct number of forms per language.