Sascha
Sascha

Reputation: 1114

Qt translate strings from non-source files

I have a Qt project which uses XML files. Those XML files contain human-readable text and this text should be translated by using the Qt tools (lupdate, lrelease, QtLinguist).

The question is if it is possible to generate entries in .ts file via lupdate without duplicating the strings from the XML files in a source code file by using the QT_TR_NOOP() macro and friends? Or in general, how do you translate strings in non-source files for Qt projects?

Upvotes: 10

Views: 5467

Answers (2)

Jérôme
Jérôme

Reputation: 27027

We had the same problem : XML files containing human readable strings.

Our solution was to make sure that human readable strings in the XML files were easy to extract (we put them in a LABEL attribute) and we developped a small tool which would parse the XML files, extract the strings, generate a context (by extracting data from the XML file), and then generating a CPP header file containing a list of QT_TR_NOOP().

This file was added to our project file (.pro) that was used by lupdate.

This solution was fine for us but we had to be very careful about two things :

  • run this tool each time the content of an XML file changed.
  • make sure the XML files are UTF-8 encoded.

Upvotes: 7

puetzk
puetzk

Reputation: 10814

You can translate anything you want at runtime by using tr(), as long as the .qm file has a matching translation/context. It shouldn't make any difference whether lupdate extracted it or not.

I don't know how to make lupdate to extract strings from arbitrary XML, but that doesn't mean you can't use linguist.

  1. .ts files are also XML; it should be easy to make an XSLT that transforms your XML into a .ts file. If you want to target something standard instead of just Qt, lupdate(and linguist) can process also XLIFF files.
  2. you can have multiple .ts files (just call QTranslator::load more than once when setting it up)

If you really want to have it all in one file for the translator, have your XSLT copy the lupdate-generated file into its output.

As long as you use a context name that doesn't duplicate something used in the source code, this shouldn't be any different (from Qt's point of view) from the way many apps load a .qm for each DLL that has GUI.

Upvotes: 3

Related Questions