From 1d27f894bb8454693ff5fc5979dda0d9090dc7a8 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Sat, 13 Feb 2021 09:24:19 +0100 Subject: [PATCH] QtCreator: Add ability to specify text codec for default locale On Windows you get one locale for unicode applications, and one for old non-unicode applications. Qt Creator uses QTextCodec::codecForLocale(), which would result in the "System" codec, which is mapped for the default language in the system. Task-number: QTCREATORBUG-24776 Change-Id: I64496cc440931d3bf6f09314bdfc7c29e01b9f4f Reviewed-by: David Schulz --- src/app/main.cpp | 5 + src/plugins/coreplugin/generalsettings.cpp | 38 ++++++ src/plugins/coreplugin/generalsettings.ui | 146 +++++++++++++-------- 3 files changed, 133 insertions(+), 56 deletions(-) diff --git a/src/app/main.cpp b/src/app/main.cpp index 3448ace8240..74f245d2c16 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -60,6 +60,7 @@ #include #include #include +#include #include #include @@ -661,6 +662,10 @@ int main(int argc, char **argv) } } + QByteArray overrideCodecForLocale = settings->value("General/OverrideCodecForLocale").toByteArray(); + if (!overrideCodecForLocale.isEmpty()) + QTextCodec::setCodecForLocale(QTextCodec::codecForName(overrideCodecForLocale)); + app.setDesktopFileName("org.qt-project.qtcreator.desktop"); // Make sure we honor the system's proxy settings diff --git a/src/plugins/coreplugin/generalsettings.cpp b/src/plugins/coreplugin/generalsettings.cpp index e438a3ea2ae..d04dd5e5699 100644 --- a/src/plugins/coreplugin/generalsettings.cpp +++ b/src/plugins/coreplugin/generalsettings.cpp @@ -31,6 +31,7 @@ #include +#include #include #include #include @@ -42,6 +43,7 @@ #include #include #include +#include using namespace Utils; @@ -50,6 +52,7 @@ namespace Internal { const char settingsKeyDPI[] = "Core/EnableHighDpiScaling"; const char settingsKeyShortcutsInContextMenu[] = "General/ShowShortcutsInContextMenu"; +const char settingsKeyCodecForLocale[] = "General/OverrideCodecForLocale"; class GeneralSettingsWidget final : public IOptionsPageWidget { @@ -68,6 +71,9 @@ public: void fillLanguageBox() const; static QString language(); static void setLanguage(const QString&); + void fillCodecBox() const; + static QByteArray codecForLocale(); + static void setCodecForLocale(const QByteArray&); GeneralSettings *q; Ui::GeneralSettings m_ui; @@ -79,6 +85,7 @@ GeneralSettingsWidget::GeneralSettingsWidget(GeneralSettings *q) m_ui.setupUi(this); fillLanguageBox(); + fillCodecBox(); m_ui.colorButton->setColor(StyleHelper::requestedBaseColor()); m_ui.resetWarningsButton->setEnabled(canResetWarnings()); @@ -151,6 +158,8 @@ void GeneralSettingsWidget::apply() { int currentIndex = m_ui.languageBox->currentIndex(); setLanguage(m_ui.languageBox->itemData(currentIndex, Qt::UserRole).toString()); + currentIndex = m_ui.codecBox->currentIndex(); + setCodecForLocale(m_ui.codecBox->itemText(currentIndex).toLocal8Bit()); q->setShowShortcutsInContextMenu(m_ui.showShortcutsInContextMenus->isChecked()); // Apply the new base color if accepted StyleHelper::setBaseColor(m_ui.colorButton->color()); @@ -207,6 +216,35 @@ void GeneralSettingsWidget::setLanguage(const QString &locale) settings->setValueWithDefault(QLatin1String("General/OverrideLanguage"), locale, {}); } +void GeneralSettingsWidget::fillCodecBox() const +{ + const QByteArray currentCodec = codecForLocale(); + + QByteArrayList codecs = QTextCodec::availableCodecs(); + Utils::sort(codecs); + for (const QByteArray &codec : qAsConst(codecs)) { + m_ui.codecBox->addItem(QString::fromLocal8Bit(codec)); + if (codec == currentCodec) + m_ui.codecBox->setCurrentIndex(m_ui.codecBox->count() - 1); + } +} + +QByteArray GeneralSettingsWidget::codecForLocale() +{ + QSettings *settings = ICore::settings(); + QByteArray codec = settings->value(settingsKeyCodecForLocale).toByteArray(); + if (codec.isEmpty()) + codec = QTextCodec::codecForLocale()->name(); + return codec; +} + +void GeneralSettingsWidget::setCodecForLocale(const QByteArray &codec) +{ + QtcSettings *settings = ICore::settings(); + settings->setValueWithDefault(settingsKeyCodecForLocale, codec, {}); + QTextCodec::setCodecForLocale(QTextCodec::codecForName(codec)); +} + void GeneralSettings::setShowShortcutsInContextMenu(bool show) { ICore::settings()->setValueWithDefault(settingsKeyShortcutsInContextMenu, diff --git a/src/plugins/coreplugin/generalsettings.ui b/src/plugins/coreplugin/generalsettings.ui index 93edf245369..f121df8c72f 100644 --- a/src/plugins/coreplugin/generalsettings.ui +++ b/src/plugins/coreplugin/generalsettings.ui @@ -17,15 +17,49 @@ User Interface - - + + + + Re-enable warnings that were suppressed by selecting "Do Not Show Again" (for example, missing highlighter). + - Theme: + Reset Warnings - - + + + + + + QComboBox::AdjustToMinimumContentsLengthWithIcon + + + 20 + + + + + + + Qt::Horizontal + + + + 285 + 20 + + + + + + + + + + Enable high DPI scaling + + @@ -73,50 +107,6 @@ - - - - - - QComboBox::AdjustToMinimumContentsLengthWithIcon - - - 20 - - - - - - - Qt::Horizontal - - - - 285 - 20 - - - - - - - - - - Color: - - - - - - - Re-enable warnings that were suppressed by selecting "Do Not Show Again" (for example, missing highlighter). - - - Reset Warnings - - - @@ -124,13 +114,6 @@ - - - - Enable high DPI scaling - - - @@ -138,6 +121,57 @@ + + + + Theme: + + + + + + + + + + Color: + + + + + + + Text codec for locale: + + + + + + + + + QComboBox::AdjustToMinimumContentsLengthWithIcon + + + 20 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + +