Fwd: Using multiple klocales uses stale translations

Stephen Kelly steveire at gmail.com
Sun Nov 7 15:59:16 GMT 2010

Moving to k-c-d.

--------------- Forwarded message (begin)

Subject: Using multiple klocales uses stale translations
From: Stephen Kelly <steveire at gmail.com>
Date: Sun, 07 Nov 2010 15:03:01 +0100
Newsgroup: gmane.comp.kde.devel.internationalization-and-documentation


I'm trying to get strings from different locales, but gettext seems to be 
caching the result from the previous language.

For example, I patch kwrite like this:

$ git diff .
diff --git a/apps/kwrite/kwritemain.cpp b/apps/kwrite/kwritemain.cpp
index d8af711..6c50423 100644
--- a/apps/kwrite/kwritemain.cpp
+++ b/apps/kwrite/kwritemain.cpp
@@ -675,6 +675,15 @@ extern "C" KDE_EXPORT int kdemain(int argc, char 
   KWriteApp a(args);
+  KLocalizedString s1 = ki18n("&New Window");
+  KLocale de("kwrite", "de");
+  KLocale fr("kwrite", "fr");
+  kDebug() << s1.toString(&de);
+  kDebug() << s1.toString(&fr);
   return a.exec ();

and start it in my default locale (en_US) I get this:

kwrite(560) kdemain: "&Neues Fenster"
kwrite(560) kdemain: "&Neues Fenster"

That is, the German version twice. Swapping the toString calls I get the 
French version twice.

I get one followed by the other only if I apply this patch:

$ git diff localization/kcatalog.cpp
diff --git a/kdecore/localization/kcatalog.cpp 
index 240885e..2abc9ad 100644
--- a/kdecore/localization/kcatalog.cpp
+++ b/kdecore/localization/kcatalog.cpp
@@ -189,13 +189,10 @@ void KCatalogPrivate::setupGettextEnv ()
     //kDebug() << "bindtextdomain" << name << localeDir;
     bindtextdomain(name, localeDir);
-    // // Magic to make sure Gettext doesn't use stale cached translation
-    // // from previous language.
-    // extern int _nl_msg_cat_cntr;
-    // ++_nl_msg_cat_cntr;
-    //
-    // Note: Not needed, caching of translations is not an issue because
-    // language is switched only if translation is not found.
+    // Magic to make sure Gettext doesn't use stale cached translation
+    // from previous language.
+    extern int _nl_msg_cat_cntr;
+    ++_nl_msg_cat_cntr;

Clearly someone decided that should be commented out. Should what I am 
trying work already, or does that need to be uncommented?

I also noticed that when I do this:

  QDate now = QDate::currentDate();

  kDebug() << de.formatDate(now, KLocale::ShortDate);
  kDebug() << fr.formatDate(now, KLocale::ShortDate);

I always get the date in the system locale instead of de or fr. Shouldn't 
that work?

All the best,


--------------- Forwarded message (end)

More information about the kde-core-devel mailing list