QLocale::toString() bug
-
I'm not sure if this is a bug in Qt or if I am doing something stupid.
This code:
QLocale locale1( QLocale::German, QLocale::Germany ); for ( int m = 1; m <= 12; m++ ) { QDate date1( 2025, m, 1 ); qDebug() << "locale1=" << locale1 << " date1=" << date1 << "locale1.toString( date1, \"MMMM\" )=" << locale1.toString( date1, "MMMM" ); }Gives the expected output:
locale1= QLocale(German, Latin, Germany) date1= QDate("2025-01-01") locale1.toString( date1, "MMMM" )= "Januar" locale1= QLocale(German, Latin, Germany) date1= QDate("2025-02-01") locale1.toString( date1, "MMMM" )= "Februar" locale1= QLocale(German, Latin, Germany) date1= QDate("2025-03-01") locale1.toString( date1, "MMMM" )= "März" locale1= QLocale(German, Latin, Germany) date1= QDate("2025-04-01") locale1.toString( date1, "MMMM" )= "April" ...But this code:
foreach ( const QLocale& locale2, QLocale::matchingLocales( QLocale::AnyLanguage, QLocale::AnyScript, QLocale::AnyCountry ) ) { if ( locale2.country() == QLocale::Germany && locale2.language() == QLocale::German ) { for ( int m = 1; m <= 12; m++ ) { QDate date2( 2025, m, 1 ); qDebug() << "locale2=" << locale2 << " date2=" << date2 << "locale2.toString( date2, \"MMMM\" )=" << locale2.toString( date2, "MMMM" ); } }Gives different output:
locale2= QLocale(German, Latin, Germany) date2= QDate("2025-01-01") locale2.toString( date2, "MMMM" )= "January" locale2= QLocale(German, Latin, Germany) date2= QDate("2025-02-01") locale2.toString( date2, "MMMM" )= "February" locale2= QLocale(German, Latin, Germany) date2= QDate("2025-03-01") locale2.toString( date2, "MMMM" )= "March" locale2= QLocale(German, Latin, Germany) date2= QDate("2025-04-01") locale2.toString( date2, "MMMM" )= "April" ...I am completely baffled why the month output isn't the same. I've looked at it for over hour! Any ideas?
-
Works fine for me with a recent Qt version:
int main(int argc, char* argv[]) { QApplication a(argc, argv); QLocale locale1(QLocale::German, QLocale::Germany); for (int m = 1; m <= 12; m++) { QDate date1(2025, m, 1); qDebug() << "locale1=" << locale1 << " date1=" << date1 << "locale1.toString( date1, \"MMMM\" )=" << locale1.toString(date1, "MMMM"); } const auto locales = QLocale::matchingLocales(QLocale::AnyLanguage, QLocale::AnyScript, QLocale::AnyCountry); for (const QLocale& locale2 : locales) { if (locale2.country() == QLocale::Germany && locale2.language() == QLocale::German) { for (int m = 1; m <= 12; m++) { QDate date2(2025, m, 1); qDebug() << "locale2=" << locale2 << " date2=" << date2 << "locale2.toString( date2, \"MMMM\" )=" << locale2.toString(date2, "MMMM"); } } } return 0; } -
Stranger still, if I change "MMMM" to "dddd-MMMM" it returns the German day name, but not the German month name, inside the loop:
locale1= QLocale(German, Latin, Germany) date1= QDate("2025-01-01") locale1.toString( date1, "dddd-MMMM" )= "Mittwoch-Januar" locale1= QLocale(German, Latin, Germany) date1= QDate("2025-02-01") locale1.toString( date1, "dddd-MMMM" )= "Samstag-Februar" locale1= QLocale(German, Latin, Germany) date1= QDate("2025-03-01") locale1.toString( date1, "dddd-MMMM" )= "Samstag-März" locale1= QLocale(German, Latin, Germany) date1= QDate("2025-04-01") locale1.toString( date1, "dddd-MMMM" )= "Dienstag-April" ...locale2= QLocale(German, Latin, Germany) date2= QDate("2025-01-01") locale2.toString( date2, "dddd-MMMM" )= "Mittwoch-January" locale2= QLocale(German, Latin, Germany) date2= QDate("2025-02-01") locale2.toString( date2, "dddd-MMMM" )= "Samstag-February" locale2= QLocale(German, Latin, Germany) date2= QDate("2025-03-01") locale2.toString( date2, "dddd-MMMM" )= "Samstag-March" locale2= QLocale(German, Latin, Germany) date2= QDate("2025-04-01") locale2.toString( date2, "dddd-MMMM" )= "Dienstag-April" ... -
Update to a recent version.
-
Hi,
Just for the sake of research, what do you get if you compare the two QLocale objects for equality ?
-
Please provide a minimal, compileable example which does not work with a recent Qt version. I provided one which does work fine.
-
Code:
#include <QCoreApplication> #include <QLocale> #include <QDate> #include <QtDebug> int main(int argc, char* argv[]) { QCoreApplication a(argc, argv); QLocale locale1(QLocale::German, QLocale::Germany); for (int m = 1; m <= 3; m++) { QDate date1(2025, m, 1); qDebug() << "locale1=" << locale1 << " date1=" << date1 << "locale1.toString( date1, \"MMMM\" )=" << locale1.toString(date1, "MMMM"); } const auto locales = QLocale::matchingLocales(QLocale::AnyLanguage, QLocale::AnyScript, QLocale::AnyCountry); for (const QLocale& locale2 : locales) { if (locale2.country() == QLocale::Germany && locale2.language() == QLocale::German) { qDebug() << "locale1 == locale2 =" << ( locale1 == locale2 ); for (int m = 1; m <= 3; m++) { QDate date2(2025, m, 1); qDebug() << "locale2=" << locale2 << " date2=" << date2 << "locale2.toString( date2, \"MMMM\" )=" << locale2.toString(date2, "MMMM"); } } } return 0; }Results:
Qt 5.15.18/MSVC2019/Windows:
Qt 5.15.18/XCode/macOS:locale1= QLocale(German, Latin, Germany) date1= QDate("2025-01-01") locale1.toString( date1, "MMMM" )= "Januar" locale1= QLocale(German, Latin, Germany) date1= QDate("2025-02-01") locale1.toString( date1, "MMMM" )= "Februar" locale1= QLocale(German, Latin, Germany) date1= QDate("2025-03-01") locale1.toString( date1, "MMMM" )= "März" locale1 == locale2 = true locale2= QLocale(German, Latin, Germany) date2= QDate("2025-01-01") locale2.toString( date2, "MMMM" )= "January" locale2= QLocale(German, Latin, Germany) date2= QDate("2025-02-01") locale2.toString( date2, "MMMM" )= "February" locale2= QLocale(German, Latin, Germany) date2= QDate("2025-03-01") locale2.toString( date2, "MMMM" )= "March"^^^Month is incorrect for locale2^^^
Qt 6.7.3/MSVC2019/Windows:
Qt 6.7.3/XCode/macOS:locale1= QLocale(German, Latin, Germany) date1= QDate("2025-01-01") locale1.toString( date1, "MMMM" )= "Januar" locale1= QLocale(German, Latin, Germany) date1= QDate("2025-02-01") locale1.toString( date1, "MMMM" )= "Februar" locale1= QLocale(German, Latin, Germany) date1= QDate("2025-03-01") locale1.toString( date1, "MMMM" )= "März" locale1 == locale2 = true locale2= QLocale(German, Latin, Germany) date2= QDate("2025-01-01") locale2.toString( date2, "MMMM" )= "Januar" locale2= QLocale(German, Latin, Germany) date2= QDate("2025-02-01") locale2.toString( date2, "MMMM" )= "Februar" locale2= QLocale(German, Latin, Germany) date2= QDate("2025-03-01") locale2.toString( date2, "MMMM" )= "März"^^^ Month is as expected^^^
So the localised month is wrong (but only inside the loop) for Qt 5.15.18.
Weirdly, day of week ("ddd" or "dddd") is correct in both cases.
I can work around it, but it is a very odd bug.