diff --git a/src/app/main.cpp b/src/app/main.cpp
index f4d17c4bf43d9c231cb4a27c4e5ed29ebe9f7357..26c7e85d5bc2cc4aa9beed0f4322599a94eaac21 100644
--- a/src/app/main.cpp
+++ b/src/app/main.cpp
@@ -40,6 +40,7 @@
 #include <QtCore/QTimer>
 #include <QtCore/QLibraryInfo>
 #include <QtCore/QTranslator>
+#include <QtCore/QSettings>
 #include <QtCore/QVariant>
 
 #include <QtGui/QMessageBox>
@@ -179,6 +180,12 @@ int main(int argc, char **argv)
     QTranslator translator;
     QTranslator qtTranslator;
     QString locale = QLocale::system().name();
+    // keep this in sync with the MainWindow ctor in coreplugin/mainwindow.cpp
+    const QSettings settings(QSettings::IniFormat, QSettings::UserScope,
+                                 QLatin1String("Nokia"), QLatin1String("QtCreator"));
+    locale = settings.value("General/OverrideLanguage", locale).toString();
+
+
     const QString &creatorTrPath = QCoreApplication::applicationDirPath()
                         + QLatin1String(SHARE_PATH "/translations");
     if (translator.load(QLatin1String("qtcreator_") + locale, creatorTrPath)) {
diff --git a/src/plugins/coreplugin/generalsettings.cpp b/src/plugins/coreplugin/generalsettings.cpp
index 97f9dc97fa12bde9f592884ccd0e36e2525e5603..203fda65fffda774be3a82f81c80d3d43beda79f 100644
--- a/src/plugins/coreplugin/generalsettings.cpp
+++ b/src/plugins/coreplugin/generalsettings.cpp
@@ -38,9 +38,13 @@
 #include <coreplugin/icore.h>
 
 #include <QtGui/QMessageBox>
+#include <QtGui/QMainWindow>
 
 #include <QtCore/QCoreApplication>
 #include <QtCore/QTextStream>
+#include <QtCore/QDir>
+#include <QtCore/QLibraryInfo>
+#include <QtCore/QSettings>
 
 #include "ui_generalsettings.h"
 
@@ -73,6 +77,38 @@ QString GeneralSettings::trCategory() const
     return QCoreApplication::translate("Core", Core::Constants::SETTINGS_TR_CATEGORY_CORE);
 }
 
+static bool hasQmFilesForLocale(const QString &locale, const QString &creatorTrPath)
+{
+    static const QString qtTrPath = QLibraryInfo::location(QLibraryInfo::TranslationsPath);
+
+    const QString trFile = QLatin1String("qt_") + locale + QLatin1String(".qm");
+    return QFile::exists(qtTrPath+'/'+trFile) || QFile::exists(creatorTrPath+'/'+trFile);
+}
+
+void GeneralSettings::fillLanguageBox() const
+{
+    m_page->languageBox->addItem(tr("<System Language>"), QString());
+
+    const QString creatorTrPath =
+            Core::ICore::instance()->resourcePath() + QLatin1String("/translations");
+    const QStringList languageFiles = QDir(creatorTrPath).entryList(QStringList(QLatin1String("*.qm")));
+    const QString currentLocale = language();
+
+    Q_FOREACH(const QString languageFile, languageFiles)
+    {
+        int start = languageFile.lastIndexOf(QLatin1Char('_'))+1;
+        int end = languageFile.lastIndexOf(QLatin1Char('.'));
+        const QString locale = languageFile.mid(start, end-start);
+        // no need to show a language that creator will not load anyway
+        if (hasQmFilesForLocale(locale, creatorTrPath)) {
+            m_page->languageBox->addItem(QLocale::languageToString(QLocale(locale).language()), locale);
+            if (locale == currentLocale)
+                m_page->languageBox->setCurrentIndex(m_page->languageBox->count() - 1);
+
+        }
+    }
+}
+
 QWidget *GeneralSettings::createPage(QWidget *parent)
 {
     m_page = new Ui::GeneralSettings();
@@ -80,6 +116,8 @@ QWidget *GeneralSettings::createPage(QWidget *parent)
     m_page->setupUi(w);
 
     QSettings* settings = Core::ICore::instance()->settings();
+    Q_UNUSED(settings)
+    fillLanguageBox();
     m_page->colorButton->setColor(StyleHelper::baseColor());
     m_page->externalEditorEdit->setText(EditorManager::instance()->externalEditor());
     m_page->reloadBehavior->setCurrentIndex(EditorManager::instance()->reloadBehavior());
@@ -103,6 +141,8 @@ QWidget *GeneralSettings::createPage(QWidget *parent)
             this, SLOT(resetInterfaceColor()));
     connect(m_page->resetEditorButton, SIGNAL(clicked()),
             this, SLOT(resetExternalEditor()));
+    connect(m_page->resetLanguageButton, SIGNAL(clicked()),
+            this, SLOT(resetLanguage()));
     connect(m_page->helpExternalEditorButton, SIGNAL(clicked()),
             this, SLOT(showHelpForExternalEditor()));
 #ifdef Q_OS_UNIX
@@ -132,6 +172,8 @@ bool GeneralSettings::matches(const QString &s) const
 
 void GeneralSettings::apply()
 {
+    int currentIndex = m_page->languageBox->currentIndex();
+    setLanguage(m_page->languageBox->itemData(currentIndex, Qt::UserRole).toString());
     // Apply the new base color if accepted
     StyleHelper::setBaseColor(m_page->colorButton->color());
     EditorManager::instance()->setExternalEditor(m_page->externalEditorEdit->text());
@@ -205,3 +247,29 @@ void GeneralSettings::showHelpForFileBrowser()
     variableHelpDialogCreator(UnixUtils::fileBrowserHelpText());
 }
 #endif
+
+void GeneralSettings::resetLanguage()
+{
+    // system language is default
+    m_page->languageBox->setCurrentIndex(0);
+}
+
+QString GeneralSettings::language() const
+{
+    QSettings* settings = Core::ICore::instance()->settings();
+    return settings->value(QLatin1String("General/OverrideLanguage")).toString();
+}
+
+void GeneralSettings::setLanguage(const QString &locale)
+{
+    QSettings* settings = Core::ICore::instance()->settings();
+    if (settings->value(QLatin1String("General/OverrideLanguage")).toString() != locale)
+    {
+        QMessageBox::information(Core::ICore::instance()->mainWindow(), tr("Restart required"),
+                                 tr("The language change will take effect after a restart of Qt Creator."));
+    }
+    if (locale.isEmpty())
+        settings->remove(QLatin1String("General/OverrideLanguage"));
+    else
+        settings->setValue(QLatin1String("General/OverrideLanguage"), locale);
+}
diff --git a/src/plugins/coreplugin/generalsettings.h b/src/plugins/coreplugin/generalsettings.h
index fb13a88ed43b6ba18c9a4e044aa4012263415a53..cef5ef543c2bd4beec5d52b595001b576a5b7db1 100644
--- a/src/plugins/coreplugin/generalsettings.h
+++ b/src/plugins/coreplugin/generalsettings.h
@@ -60,6 +60,7 @@ public:
 private slots:
     void resetInterfaceColor();
     void resetExternalEditor();
+    void resetLanguage();
     void showHelpForExternalEditor();
 #ifdef Q_OS_UNIX
 #  ifndef Q_OS_MAC
@@ -71,6 +72,9 @@ private slots:
 
 private:
     void variableHelpDialogCreator(const QString& helpText);
+    void fillLanguageBox() const;
+    QString language() const;
+    void setLanguage(const QString&);
     Ui::GeneralSettings *m_page;
     QString m_searchKeywords;
     QPointer<QWidget> m_dialog;
diff --git a/src/plugins/coreplugin/generalsettings.ui b/src/plugins/coreplugin/generalsettings.ui
index fad3f5222aeb71c4038d8700ca805c71daafe6db..de8299a3fc9199df534435c23e0b1e6a3ecbac37 100644
--- a/src/plugins/coreplugin/generalsettings.ui
+++ b/src/plugins/coreplugin/generalsettings.ui
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>363</width>
-    <height>296</height>
+    <width>408</width>
+    <height>295</height>
    </rect>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
@@ -23,7 +23,7 @@
       <item row="0" column="0">
        <widget class="QLabel" name="colorLabel">
         <property name="text">
-         <string>User &amp;interface color:</string>
+         <string>User interface color:</string>
         </property>
         <property name="buddy">
          <cstring>colorButton</cstring>
@@ -80,14 +80,14 @@
         </item>
        </layout>
       </item>
-      <item row="1" column="0">
+      <item row="3" column="0">
        <widget class="QLabel" name="terminalLabel">
         <property name="text">
          <string>Terminal:</string>
         </property>
        </widget>
       </item>
-      <item row="1" column="1">
+      <item row="3" column="1">
        <layout class="QHBoxLayout" name="terminalHorizontalLayout">
         <item>
          <widget class="QLineEdit" name="terminalEdit"/>
@@ -108,14 +108,14 @@
         </item>
        </layout>
       </item>
-      <item row="2" column="0">
+      <item row="4" column="0">
        <widget class="QLabel" name="editorLabel">
         <property name="text">
          <string>External editor:</string>
         </property>
        </widget>
       </item>
-      <item row="2" column="1">
+      <item row="4" column="1">
        <layout class="QHBoxLayout" name="editorHorizontalLayout">
         <item>
          <widget class="QLineEdit" name="externalEditorEdit"/>
@@ -143,14 +143,14 @@
         </item>
        </layout>
       </item>
-      <item row="3" column="0">
+      <item row="5" column="0">
        <widget class="QLabel" name="externalFileBrowserLabel">
         <property name="text">
          <string>External file browser:</string>
         </property>
        </widget>
       </item>
-      <item row="4" column="0">
+      <item row="6" column="0">
        <widget class="QLabel" name="modifiedLabel">
         <property name="text">
          <string>When files are externally modified:</string>
@@ -160,7 +160,7 @@
         </property>
        </widget>
       </item>
-      <item row="4" column="1">
+      <item row="6" column="1">
        <widget class="QComboBox" name="reloadBehavior">
         <property name="sizePolicy">
          <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
@@ -188,7 +188,7 @@
         </item>
        </widget>
       </item>
-      <item row="3" column="1">
+      <item row="5" column="1">
        <layout class="QHBoxLayout" name="horizontalLayout">
         <item>
          <layout class="QHBoxLayout" name="horizontalLayout_2">
@@ -220,6 +220,34 @@
         </item>
        </layout>
       </item>
+      <item row="2" column="0">
+       <widget class="QLabel" name="languageLabel">
+        <property name="text">
+         <string>User interface language:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="1">
+       <layout class="QHBoxLayout" name="horizontalLayout_3">
+        <item>
+         <widget class="QComboBox" name="languageBox"/>
+        </item>
+        <item>
+         <widget class="QToolButton" name="resetLanguageButton">
+          <property name="toolTip">
+           <string>Reset to default</string>
+          </property>
+          <property name="text">
+           <string>R</string>
+          </property>
+          <property name="icon">
+           <iconset resource="core.qrc">
+            <normaloff>:/core/images/reset.png</normaloff>:/core/images/reset.png</iconset>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </item>
      </layout>
     </widget>
    </item>
@@ -245,6 +273,21 @@
    <header location="global">utils/qtcolorbutton.h</header>
   </customwidget>
  </customwidgets>
+ <tabstops>
+  <tabstop>colorButton</tabstop>
+  <tabstop>resetButton</tabstop>
+  <tabstop>languageBox</tabstop>
+  <tabstop>resetLanguageButton</tabstop>
+  <tabstop>terminalEdit</tabstop>
+  <tabstop>resetTerminalButton</tabstop>
+  <tabstop>externalEditorEdit</tabstop>
+  <tabstop>resetEditorButton</tabstop>
+  <tabstop>helpExternalEditorButton</tabstop>
+  <tabstop>externalFileBrowserEdit</tabstop>
+  <tabstop>resetFileBrowserButton</tabstop>
+  <tabstop>helpExternalFileBrowserButton</tabstop>
+  <tabstop>reloadBehavior</tabstop>
+ </tabstops>
  <resources>
   <include location="core.qrc"/>
  </resources>
diff --git a/src/plugins/coreplugin/mainwindow.cpp b/src/plugins/coreplugin/mainwindow.cpp
index 54c79ec5a34d164ea008e1181aaab8cabe9ace2e..cdc3898ee347edf3e22714dcf05ec10b6e168cef 100644
--- a/src/plugins/coreplugin/mainwindow.cpp
+++ b/src/plugins/coreplugin/mainwindow.cpp
@@ -114,6 +114,7 @@ MainWindow::MainWindow() :
     m_uniqueIDManager(new UniqueIDManager()),
     m_globalContext(QList<int>() << Constants::C_GLOBAL_ID),
     m_additionalContexts(m_globalContext),
+    // keep this in sync with main() in app/main.cpp
     m_settings(new QSettings(QSettings::IniFormat, QSettings::UserScope,
                              QLatin1String("Nokia"), QLatin1String("QtCreator"), this)),
     m_settingsDatabase(new SettingsDatabase(QFileInfo(m_settings->fileName()).path(),