Translating texts from the kernel / Soundcard control names in KMix (good one)

Albert Astals Cid aacid at
Tue Aug 18 22:40:23 BST 2009

Pressed Ctrl+Enter without wanting to send :-/

A Dimarts, 18 d'agost de 2009, Christian Esken va escriure:
> Hello,
> I am currenlty adding WhatsThis help to the KMix controls. This is kind of
> special i18n usage, as the message ID's cannot be extraacted from the
> source, but are coming directly from the kernel (e.g. "Master", or "PCM
> Path Out & Mute").
> I'd like some comments about the concept:
> 1) Is it a good idea to use a separate message/po file for that?
>  As we have 2 different sources, it sounds reasonable to me.

It's reasonable yes

> 2) Implementation (revision  1013107)
> After reading the docs, i came up with the following code:
>      // Locale created once (static). Used below by
> whatsthisControlLocale() s_whatsthisLocale = new KLocale("kmix-controls");
>    // ...
>    QString w;
>    QString whatsthis (md->readableName());
>    char* whatsThisChar = whatsthis.toUtf8().data();
>    w = ki18n(whatsThisChar).toString(MixerToolBox::whatsthisControlLocale()
> ); setWhatsThis(w);
> Is that OK? I have a problem that the first translated message is garbage /
> contains random characters. The rest is OK, even when using the same
> message id as the garbage message.

No, it's wrong. To add the "kmix-controls" catalog just go with 

Also your use of .po files is wrong, you don't use them as a key value file, i 

msgid "Mic"
msgstr "Aufnahmestärke des Mikrophoneingangs"

is WRONG in a .po file, as "Aufnahmestärke des Mikrophoneingangs" is not the 
translation of "Mic"

the file should be

msgstr "Recording level of the microphone input."
msgstr "Aufnahmestärke des Mikrophoneingangs"

And the english file should not exist, since you don't need to translate 
english to english ;-)

My suggestion is that you create a file called something like 
kernelWhatsthis.cpp with a function that does

QString translateKernelToWhatsthis(const QString &kernelName)
	if (kernelName == "Mic") return i18n("Recording level of the microphone 
    else if ....

QString name = md->readableName();
and then you just do

> 3) How would this be integrated in the build/installation process?
>  I have placed a l10n/ directory with the message files below kmix/. Is it
> good there or should that  be moved somewhere else.

No, that sucks. Noone is going to translate this as it's totally out of our 
i18n procedure.

Once you have that kernelWhatsthis.cpp file you can put inside a controls/
directory and then change your to 

#! /bin/sh
$XGETTEXT *.cpp -o $podir/kmix.pot
$XGETTEXT controls/*.cpp -o $podir/kmix-controls.pot

And you'll get people to translate an automagically created kmix-controls.pot 
file in the proper translation workflow


P.S: If you "know" the readableNames you are going to get maybe it would be a 
good idea to provide translated labels for things like "Master", that would be 
as easy as creating a 

QString translateKernelToName(const QString &kernelName)
	if (kernelName == "Master") return i18nc("The Master channel of the sound 
card", "Master");
    else if ....

and when creating the labels doing
QString name = md->readableName();

> Greetings,
>     Christian

More information about the kde-core-devel mailing list