[Development] Direct-lookup translation, even for English (was Re: [Interest] get english translation)
Ziller Eike
Eike.Ziller at digia.com
Tue Sep 2 10:31:36 CEST 2014
On Sep 2, 2014, at 9:01 AM, Rutledge Shawn <Shawn.Rutledge at digia.com> wrote:
>
> On 1 Sep 2014, at 8:32 PM, Thiago Macieira wrote:
>
>> On Monday 01 September 2014 12:50:23 Graham Labdon wrote:
>>> Hi
>>> My application is internationalized, however, in some circumstances I need
>>> the English version of the string no matter what translator is being used.
>>> Anyone have any suggestions on how to achieve this?
>>
>> You have the English text. The way to get the English text from that is to use
>> it as-is.
>>
>> Don't translate, don't transform it in any way.
>
> Some projects like to use "programmer shorthand" for strings and then leave the final text up to a different team. Such teams tend to be capricious and change the English text multiple times (PR and marketing reasons), so it's an advantage not to treat the English text as the key for looking up the translation. (And then the shorthand can be written in any language the programmer likes, too.)
If your english translation is done in a separate .qm file (i.e. you do not use the tr-keys for the english text), your application can create a separate QTranslator that you use to load the english translation separately. You just do NOT INSTALL that translator into your app, but instead use that translator directly yourself if you want to access a specific english translation, with englishTranslator.translate(context, text, ......).
> I had a previous job like that. They had their own cross-platform cross-toolkit translation system, so I wasn't allowed to use tr() at all, and they convinced me that their way was better. They wanted to have all the strings for all the languages inside the binary. And there was a utility to generate an enum for the shorthand strings. Imagine opening up Designer and creating a button, and setting its label to BUTTON_OK. Then you run uic. Then you post-process the generated header file and make it do something like tr(BUTTON_OK), which will use the enum to look up the actual string at runtime, in a fixed-length array in which all strings for a particular language are stored.
>
> - Since the header modification is part of the build process, it costs the developer no time at all if the translation team wants to change the English text. They do their work independently, and then the application is re-built.
Since the text that is put in tr() is just used as a fallback, there is nothing preventing anyone from providing a separately created english translation (or change individual texts if they are supposed to change). In “your” code that tries to load the correct translation for the current locale, you can fallback to loading this english translation instead of using the tr-key fallback. Of course you might end up with lots of strings in your application that are only used as a key.
> - At runtime, this kind of lookup is much more efficient than the usual Gnome and KDE ways of looking around the filesystem for separate translation files (but at the cost of bloating the binary somewhat).
I would have thought that it is possible to use qrc to add your .qm files to your binary if you really want? Since you define yourself in your app where to look for translations.
> - It is clear to everyone when the translation mechanism is not working or there is an un-translated string: you see the enum shorthand strings instead of the correct strings - no need to wait for a non-English-speaking tester to discover it.
Linguist keeps track of which strings actually have been translated in some language, so the check “do all strings have translations" is easily automated. I’d expect any translation tool to do that tracking ;). For the check if the translation is actually good/correct you need a native speaker of the corresponding language for testing anyhow in the end.
> - There will never be a user who cannot use the app because it wasn't installed correctly and therefore the translation file was not found: the strings are guaranteed to be present as long as someone did the translation work before it shipped.
>
> The current way of using separate translation files should be kept as a fallback mechanism though, so that people in countries which were neglected by the development team can still do their own translations. This is the good part of the KDE way, that the translation work can be distributed to lots of people around the world. But it's also possible that they could contribute their work back to the original git repo, so that some future build of the application will have those strings built-in.
>
> I think it's a worthwhile goal that at least commercial Linux binaries ought to be self-contained and portable, so that there is no installation process beyond putting the binary in some directory which is in your path. It wouldn't hurt if the free software community had the goal of zero-install binaries too. The strings could be packaged as compressed resources, so the total space consumed is less. And perhaps resources which are not needed for the current language could even be expunged from memory (at the cost that you then cannot switch languages dynamically).
>
> But even if it were not for the enum-lookup implementation that they insisted on, our assumption that English needs no translation does not fit the multi-team workflow. There is often an assumption that programmers cannot design UIs because they are not artistic people or because they don't have psychology degrees or haven't studied usability enough. This is why we have separate tools for UI designers to use. It's very similar to the way that some people assume that programmers cannot write good English either. Stereotypes in general are wrong, and offensive to people with multi-disciplinary abilities. Nevertheless we can probably agree that UI design and the wording of text are often subject to later revision;
> so it's useful not to choose a changing string as a lookup key,
Actually I’m not so sure about that. If the english (or whatever default language) text changes, that might very well be a hint that all other translations should be adapted too.
> for the same reason that imperative code should not assume too much about the declarative structure of the UI.
--
Eike Ziller, Senior Software Engineer - Digia, Qt
Digia Germany GmbH, Rudower Chaussee 13, D-12489 Berlin
Geschäftsführer: Mika Pälsi, Juha Varelius, Tuula Haataja
Sitz der Gesellschaft: Berlin, Registergericht: Amtsgericht Charlottenburg, HRB 144331 B
More information about the Development
mailing list