Bug 215837

Summary: Nativ KDE QFileDialog changes translation
Product: [Translations] i18n Reporter: Patrick R. Gansterer <paroga>
Component: generalAssignee: Albert Astals Cid <aacid>
Status: CONFIRMED ---    
Severity: normal CC: kossebau
Priority: NOR    
Version: unspecified   
Target Milestone: ---   
Platform: Ubuntu   
OS: Linux   
Latest Commit: Version Fixed In:

Description Patrick R. Gansterer 2009-11-23 15:04:22 UTC
Version:            (using KDE 4.3.2)
OS:                Linux
Installed from:    Ubuntu Packages

http://bugreports.qt.nokia.com/browse/QTBUG-5822

When you try the following code in an translated (non english) KDE 4 the first QMessageBox shows "Open" and the second the KDE-translation of "Open". 

#include <QtGui>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QMessageBox::information(0, QLatin1String("Open"), QObject::tr("Open"));
    QFileDialog::getOpenFileName();	
    QMessageBox::information(0, QLatin1String("Open"), QObject::tr("Open"));

    return app.exec();
}
Comment 1 Friedrich W. H. Kossebau 2016-06-27 18:35:36 UTC
Confirmed for Qt4/kdelibs4.

Similarly still happening with Qt5/KF5/Plasma5, though now translations are loaded on QApplication instance creation, so minor improvement is that texts do not change anymore after using QFileDialog.

Still, it is not perfect that the platform plugin decides on its own to load the Qt meta catalog for the current system locale and thus ruling over a possible decision of the app itself to use another catalog (or even none). As this not only affects the platform dependent UI as provided by the platform (where it could be reasoned it is kind of integrating with system language), but any other normal Qt UI of the app as well (e.g. strings in the context menu of QLineEdit, "Cut", "Copy" etc).
I'd consider this a bug.

Not tracked down to the call, but very possibly due to ki18n lib being pulled in by whatever platform plugin (lost overview) which provides the plasma/kf5 filedialog & Co.. The KI18n lib has a startup hook which load the Qt meta catalog with translations for the locale as defined by QLocale::system(). Meant as convenience for KDE application developers (who rely on that without knowing possibly ;) ), but surprising for 3rd-party Qt apps which might want own control over the translation catalogs used in the app.

See how many Qt catalogs are opened just due to the platform plugin here:

src.pro:
TEMPLATE = app
CONFIG += qt
QT += widgets
SOURCES += main.cpp

main.cpp:
#include <QtWidgets>
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    // Changed QObject::tr("Open") to QLineEdit::tr("Cu&t") to show the affect on normal Qt widgets
    QMessageBox::information(0, QLatin1String("Open"), QLineEdit::tr("Cu&t"));
    QFileDialog::getOpenFileName();
    QMessageBox::information(0, QLatin1String("Open"), QLineEdit::tr("Cu&t"));
    return app.exec();
}

kossebau@klux:~$ strace ~koder/Kode/qt/bug215837/src 2>&1 | grep '^open(' | grep -P '\.(mo|qm)'
open("/usr/share/locale/de/LC_MESSAGES/sonnet5_qt.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/locale/de/LC_MESSAGES/kcoreaddons5_qt.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/locale/de/LC_MESSAGES/kauth5_qt.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/locale/de/LC_MESSAGES/kglobalaccel5_qt.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/locale/de/LC_MESSAGES/kconfig5_qt.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/locale/de/LC_MESSAGES/kwidgetsaddons5_qt.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/locale/de/LC_MESSAGES/kcompletion5_qt.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/qt5/translations/qt_en.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/qt5/translations/qt_de.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/qt5/translations/qtbase_de.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/qt5/translations/qtscript_de.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/qt5/translations/qtquick1_de.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/qt5/translations/qtmultimedia_de.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/qt5/translations/qtxmlpatterns_de.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/locale/de/LC_MESSAGES/kcodecs5_qt.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/locale/de/LC_MESSAGES/kitemviews5_qt.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/locale/de/LC_MESSAGES/kdbusaddons5_qt.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/locale/de/LC_MESSAGES/kwindowsystem5_qt.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/locale/de/LC_MESSAGES/solid5_qt.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/locale/de/LC_MESSAGES/kbookmarks5_qt.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/locale/de/LC_MESSAGES/kjobwidgets5_qt.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/locale/de/LC_MESSAGES/knotifications5_qt.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/locale/de/LC_MESSAGES/knotifications5_qt.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/locale/de/LC_MESSAGES/kjobwidgets5_qt.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/locale/de/LC_MESSAGES/kbookmarks5_qt.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/locale/de/LC_MESSAGES/solid5_qt.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/locale/de/LC_MESSAGES/kwindowsystem5_qt.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/locale/de/LC_MESSAGES/kdbusaddons5_qt.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/locale/de/LC_MESSAGES/kitemviews5_qt.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/locale/de/LC_MESSAGES/kcodecs5_qt.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/qt5/translations/qt_en.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/qt5/translations/qt_de.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/qt5/translations/qtbase_de.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/qt5/translations/qtscript_de.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/qt5/translations/qtquick1_de.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/qt5/translations/qtmultimedia_de.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/qt5/translations/qtxmlpatterns_de.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/locale/de/LC_MESSAGES/kcompletion5_qt.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/locale/de/LC_MESSAGES/kwidgetsaddons5_qt.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/locale/de/LC_MESSAGES/kconfig5_qt.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/locale/de/LC_MESSAGES/kglobalaccel5_qt.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/locale/de/LC_MESSAGES/kauth5_qt.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/locale/de/LC_MESSAGES/kcoreaddons5_qt.qm", O_RDONLY|O_CLOEXEC) = 6
open("/usr/share/locale/de/LC_MESSAGES/sonnet5_qt.qm", O_RDONLY|O_CLOEXEC) = 6
[[here call to QFileDialog at runtime]]
open("/usr/share/locale-langpack/de_DE.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/de_DE.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-bundle/de_DE.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/de_DE.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/de_DE.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-bundle/de_DE.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/de_DE/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/de_DE/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-bundle/de_DE/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/de.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/de.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-bundle/de.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/de.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/de.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-bundle/de.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/de/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/de/LC_MESSAGES/libc.mo", O_RDONLY) = 10
open("/usr/share/locale-langpack/de/LC_MESSAGES/kio5.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/de/LC_MESSAGES/kio5.mo", O_RDONLY) = 15
open("/usr/share/locale-langpack/de/LC_MESSAGES/kconfigwidgets5.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/de/LC_MESSAGES/kconfigwidgets5.mo", O_RDONLY) = 19
open("/usr/share/locale-langpack/de/LC_MESSAGES/kxmlgui5.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/de/LC_MESSAGES/kxmlgui5.mo", O_RDONLY) = 19
open("/home/kossebau/messages.mo", O_RDONLY|O_CLOEXEC) = 19
Comment 2 Albert Astals Cid 2016-07-04 20:57:56 UTC
"The KI18n lib has a startup hook which load the Qt meta catalog with translations for the locale as defined by QLocale::system(). "

If you think that is a bug, open a bug against ki18n framework instead of reopening this unrelated bug please.