forked from qt-creator/qt-creator
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:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user