With frameworks 5 the translation system changed quite a bit resulting in your application not being translated without any adjustments. In this blog post I want to highlight how you can test whether your application loads the translation correctly and how to fix it if not. First of all I recommend to read the general translation documentation for the KI18n framework.
Like with kdelibs4 there is a test language which wraps every translated string “foo” to “xxfooxx”. This language needs to get installed. For that follow the following steps:
mkdir i18n # create a directory for the checkout cd i18n # change into it svn co svn://anonsvn.kde.org/home/kde/trunk/l10n-kf5/scripts # check out scripts svn co svn://anonsvn.kde.org/home/kde/trunk/l10n-kf5/x-test # check out test language ./scripts/autogen.sh x-test # generate build system for test language mkdir x-test-build # create build dir for test language cd x-test-build # and change into it cmake -DCMAKE_INSTALL_PREFIX=/opt/kf5/ ../x-test # adjust /opt/kf5/ to your kf5 install dir make make install
With these steps the language gets installed. Now you can run your application to test with the LANGUAGE environment variable. For this blog post I use kinfocenter as the test application:
LANGUAGE=x-test kinfocenter
As you can see kinfocenter is not yet translated properly:
Aus i18n-kf5 |
The first step is now to connect the application to the catalog. The catalog is the name of the .pot file in Messages.sh – in the case of our test application that is “kinfocenter”.
This is being done with the following call:
KLocalizedString::setApplicationDomain("kinfocenter");
This has to be done before calling any i18n call, so most likely it is in your main function and before the construction of QApplication. After doing this change our kinfocenter looks like that:
Aus i18n-kf5 |
That’s better but there is still a lot of untranslated code around. The reason for that is kinfocenter loads libraries to display the content and those libraries are not yet connected to the catalogs. In kdelibs4 time one did that through the insertCatalog function, now it needs to be done in the library.
The way is to add a definition for TRANSLATION_DOMAIN with the catalog as value in the CMakeLists.txt of the library. So for the info module in kinfocenter that’s:
# KI18N Translation Domain for this library add_definitions(-DTRANSLATION_DOMAIN=\"kcm_infosummary\")
And now our kinfocenter looks like that:
Aus i18n-kf5 |
Of course one needs to do these adjustments for each of the libraries.
Last but not least one needs to mention ui files. For those one needs to use ki18n_wrap_ui in the CMakeLists.txt.