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 <david.schulz@qt.io>
This commit is contained in:
Cristian Adam
2021-02-13 09:24:19 +01:00
parent 38a38cd0ed
commit 1d27f894bb
3 changed files with 133 additions and 56 deletions

View File

@@ -31,6 +31,7 @@
#include <coreplugin/dialogs/restartdialog.h>
#include <utils/algorithm.h>
#include <utils/checkablemessagebox.h>
#include <utils/hostosinfo.h>
#include <utils/infobar.h>
@@ -42,6 +43,7 @@
#include <QMessageBox>
#include <QSettings>
#include <QStyleHints>
#include <QTextCodec>
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,