Translate
Qt Linguist.ts Files

Upload your Qt Linguist .ts source files, translate messages by context, and export a file lrelease compiles without changes.

No credit card required14-day free trialTracking-free service
translations_pl.ts
<?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>
<?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>

The .ts you're thinking of
is not this one

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.

ICU conversion (imported)
{COUNT, plural, one {Znaleziono %n plik} few {Znaleziono %n pliki} other {Znaleziono %n plików} }
{COUNT, plural,
  one {Znaleziono %n plik}
  few {Znaleziono %n pliki}
  other {Znaleziono %n plików}
}

Source, not the compiled output

What .ts holds, and what stays with lrelease

Contexts group messages

Each context block usually names the class or QML component a string belongs to.

Source, not compiled

A .ts file is the editable XML source. lrelease compiles it into the binary .qm your app loads.

Variable plural counts

The number of numerusform variants per message depends on the target language's grammar.

End-to-end workflow

Translate a Qt Linguist file end to end

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.

Terminal
simplelocalize upload \ --apiKey PROJECT_API_KEY \ --uploadFormat qt-linguist \ --uploadLanguageKey en \ --uploadPath ./translations_en.ts
simplelocalize upload \
  --apiKey PROJECT_API_KEY \
  --uploadFormat qt-linguist \
  --uploadLanguageKey en \
  --uploadPath ./translations_en.ts

Upload your source .ts file

1
Export source strings from Qt Linguist as a .ts file and upload it. Messages import grouped by their original context.
Namespaces
AboutPage Author Version Found %n files SettingsPage Language
AboutPage
  Author
  Version
  Found %n files
SettingsPage
  Language

Contexts show up as namespaces

2
AboutPage and SettingsPage messages stay grouped exactly as they were in the original .ts file, so translators keep the same mental map.
Found %n files (pl)
one: Znaleziono %n plik few: Znaleziono %n pliki many: Znaleziono %n plików other: Znaleziono %n pliku
one:   Znaleziono %n plik
few:   Znaleziono %n pliki
many:  Znaleziono %n plików
other: Znaleziono %n pliku

Auto-translate plurals in one pass

3
Each numerusform variant translates together as a single ICU-format key, so a translator never sees a plural form out of context from the others.
Terminal
simplelocalize download \ --apiKey PROJECT_API_KEY \ --downloadFormat qt-linguist \ --downloadPath ./translations_{lang}.ts lrelease translations_pl.ts
simplelocalize download \
  --apiKey PROJECT_API_KEY \
  --downloadFormat qt-linguist \
  --downloadPath ./translations_{lang}.ts

lrelease translations_pl.ts

Download and run lrelease

4
Export a translation source per language, then compile it into a .qm file the same way you always have.

For developers

A localization platform,
that keeps context and plurals together

SimpleLocalize maps Qt Linguist's own structure onto concepts you already use in the editor.

Contexts become namespaces

Each context block is imported as a namespace, so messages stay grouped by the class or component they belong to.

Plurals as one key

All plural variants for a message are combined into a single translation key, instead of several disconnected strings.

AI auto-translation

Translate new and changed messages with DeepL, Google Translate, OpenAI, Claude or Gemini, grouped by their original context.

CLI and REST API

Upload and download translation sources from the CLI, or automate the same logic through the REST API.

SimpleLocalize connects your code to professional translations

More conversions

Convert Qt Linguist to other formats

Free online converter, no account required. Upload a .ts file and download it in the format you need.

Start translating Qt Linguist files

  • Contexts imported as namespaces
  • Plural variants combined into one editable key
  • Exports a source file ready for lrelease
Start for free
No credit card required5-minute setup
"The product
and support
are fantastic."
Laars Buur|CTO
"The support is
blazing fast,
thank you Jakub!"
Stefan|Developer
"Interface that
makes any dev
feel at home!"
Dario De Cianni|CTO
"Excellent app,
saves my time
and money"
Dmitry Melnik|Developer

Frequently asked questions about Qt Linguist files

Is a Qt .ts file the same as a TypeScript file?

No. They share a file extension by coincidence. Qt Linguist's .ts is an XML translation source, unrelated to the TypeScript programming language.

Do I still need to run lrelease?

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.

How are contexts handled?

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.

Are numerusform plurals supported?

Yes. Variants are combined into a single ICU-format translation key, with the correct number of forms per language.