summaryrefslogtreecommitdiffstats
path: root/tdeui/kswitchlanguagedialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tdeui/kswitchlanguagedialog.cpp')
-rw-r--r--tdeui/kswitchlanguagedialog.cpp349
1 files changed, 349 insertions, 0 deletions
diff --git a/tdeui/kswitchlanguagedialog.cpp b/tdeui/kswitchlanguagedialog.cpp
new file mode 100644
index 000000000..fa43dcaf2
--- /dev/null
+++ b/tdeui/kswitchlanguagedialog.cpp
@@ -0,0 +1,349 @@
+/*
+ * This file is part of the KDE Libraries
+ * Copyright (C) 2007 Krzysztof Lichota (lichota@mimuw.edu.pl)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "kswitchlanguagedialog.h"
+
+#include <tqlayout.h>
+#include <tqtooltip.h>
+#include <tqlabel.h>
+#include <tqmap.h>
+
+#include <klanguagebutton.h>
+#include <kconfig.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kdebug.h>
+#include <kpushbutton.h>
+
+struct LanguageRowData
+{
+ TQLabel *label;
+ KLanguageButton *languageButton;
+ KPushButton *removeButton;
+
+ void setRowWidgets(
+ TQLabel *label,
+ KLanguageButton *languageButton,
+ KPushButton *removeButton
+ )
+ {
+ this->label = label;
+ this->languageButton = languageButton;
+ this->removeButton = removeButton;
+ }
+
+};
+
+class KSwitchLanguageDialogPrivate
+{
+public:
+ KSwitchLanguageDialogPrivate(KSwitchLanguageDialog *parent);
+
+ KSwitchLanguageDialog *p; //parent class
+
+ /**
+ Fills language button with names of languages for which given application has translation.
+ */
+ void fillApplicationLanguages(KLanguageButton *button);
+
+ /**
+ Adds one button with language to widget.
+ */
+ void addLanguageButton(const TQString & languageCode, bool primaryLanguage);
+
+ /**
+ Returns list of languages chosen for application or default languages is they are not set.
+ */
+ TQStringList applicationLanguageList();
+
+ TQMap<KPushButton*, LanguageRowData> languageRows;
+ TQPtrList<KLanguageButton> languageButtons;
+ TQGridLayout *languagesLayout;
+ TQWidget *page;
+};
+
+/*************************** KSwitchLanguageDialog **************************/
+
+KSwitchLanguageDialog::KSwitchLanguageDialog(
+ TQWidget *parent,
+ const char *name,
+ bool modal
+ ):
+ KDialogBase(parent, name, modal, i18n("Switch application language"), Ok|Cancel, Ok, true ),
+ d(new KSwitchLanguageDialogPrivate(this))
+{
+ d->page = new TQWidget( this );
+ setMainWidget(d->page);
+ TQVBoxLayout *topLayout = new TQVBoxLayout( d->page, 0, spacingHint() );
+ TQLabel *label = new TQLabel( i18n("Please choose language which should be used for this application"), d->page, "label1" );
+ topLayout->addWidget( label );
+
+ TQHBoxLayout *languageHorizontalLayout = new TQHBoxLayout();
+ topLayout->addLayout(languageHorizontalLayout);
+
+ d->languagesLayout = new TQGridLayout(0 , 2);
+ languageHorizontalLayout->addLayout(TQT_TQLAYOUT(d->languagesLayout));
+ languageHorizontalLayout->addStretch();
+
+ TQStringList defaultLanguages = d->applicationLanguageList();
+
+ for ( TQStringList::ConstIterator it = defaultLanguages.begin(); it != defaultLanguages.end(); ++it )
+ {
+ TQString language = *it;
+ bool primaryLanguage = (it == defaultLanguages.begin());
+ d->addLanguageButton(language, primaryLanguage);
+ }
+
+ if (defaultLanguages.count() == 0)
+ {
+ d->addLanguageButton(KGlobal::locale()->defaultLanguage(), true);
+ }
+
+ TQHBoxLayout *addButtonHorizontalLayout = new TQHBoxLayout();
+ topLayout->addLayout(addButtonHorizontalLayout);
+
+ KPushButton *addLangButton = new KPushButton(i18n("Add fallback language"), d->page, "addLangButton");
+ TQToolTip::add(addLangButton, i18n("Adds one more language which will be used if other translations do not contain proper translation"));
+ connect(addLangButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotAddLanguageButton()));
+ addButtonHorizontalLayout->addWidget(addLangButton);
+ addButtonHorizontalLayout->addStretch();
+
+ topLayout->addStretch(10);
+}
+
+KSwitchLanguageDialog::~KSwitchLanguageDialog()
+{
+ delete this->d;
+}
+
+void KSwitchLanguageDialog::slotAddLanguageButton()
+{
+ //adding new button with en_US as it should always be present
+ d->addLanguageButton("en_US", d->languageButtons.isEmpty() ? true : false);
+}
+
+void KSwitchLanguageDialog::removeButtonClicked()
+{
+ TQObject const *signalSender = TQT_TQOBJECT_CONST(sender());
+
+ if (signalSender == NULL)
+ {
+ kdError() << "KSwitchLanguageDialog::removeButtonClicked() called directly, not using signal";
+ return;
+ }
+
+ KPushButton *removeButton = const_cast<KPushButton*>(::tqqt_cast<const KPushButton*>(signalSender));
+
+ if (removeButton == NULL)
+ {
+ kdError() << "KSwitchLanguageDialog::removeButtonClicked() called from something else than KPushButton";
+ return;
+ }
+
+ TQMap<KPushButton *, LanguageRowData>::iterator it = d->languageRows.find(removeButton);
+
+ if (it == d->languageRows.end())
+ {
+ kdError() << "KSwitchLanguageDialog::removeButtonClicked called from unknown KPushButton";
+ return;
+ }
+
+ LanguageRowData languageRowData = it.data();
+
+ d->languageButtons.removeRef(languageRowData.languageButton);
+
+ languageRowData.label->deleteLater();
+ languageRowData.languageButton->deleteLater();
+ languageRowData.removeButton->deleteLater();
+ d->languageRows.erase(it);
+}
+
+void KSwitchLanguageDialog::languageOnButtonChanged(const TQString & languageCode)
+{
+ for ( TQPtrList<KLanguageButton>::ConstIterator it = d->languageButtons.begin(); it != d->languageButtons.end(); ++it )
+ {
+ KLanguageButton *languageButton = *it;
+ if (languageButton->current() == languageCode)
+ {
+ //update all buttons which have matching id
+ //might update buttons which were not changed, but well...
+ languageButton->setText(KGlobal::locale()->twoAlphaToLanguageName(languageCode));
+ }
+ }
+}
+
+void KSwitchLanguageDialog::slotOk()
+{
+ TQString languageString;
+ bool first = true;
+
+ for ( TQPtrList<KLanguageButton>::ConstIterator it = d->languageButtons.begin(); it != d->languageButtons.end(); ++it )
+ {
+ KLanguageButton *languageButton = *it;
+
+ if (first == false)
+ {
+ languageString += ':';
+ }
+ languageString += languageButton->current();
+ first = false;
+ }
+
+ KConfig *config = KGlobal::config();
+
+ if (d->applicationLanguageList().join(":") != languageString)
+ {
+ //list is different from defaults or saved languages list
+ KConfigGroup group(config, "Locale");
+
+ group.writeEntry("Language", languageString);
+ config->sync();
+
+ KMessageBox::information(
+ this,
+ i18n("Language for this application has been changed. The change will take effect upon next start of application"), //text
+ i18n("Application language changed"), //caption
+ "ApplicationLanguageChangedWarning" //dontShowAgainName
+ );
+ }
+
+ emit okClicked();
+ accept();
+}
+
+/************************ KSwitchLanguageDialogPrivate ***********************/
+
+KSwitchLanguageDialogPrivate::KSwitchLanguageDialogPrivate(
+ KSwitchLanguageDialog *parent
+ ):
+ p(parent)
+{
+ //NOTE: do NOT use "p" in constructor, it is not fully constructed
+}
+
+void KSwitchLanguageDialogPrivate::fillApplicationLanguages(KLanguageButton *button)
+{
+ KLocale *locale = KGlobal::locale();
+ TQStringList allLanguages = locale->allLanguagesTwoAlpha();
+ for ( TQStringList::ConstIterator it = allLanguages.begin(); it != allLanguages.end(); ++it )
+ {
+ TQString languageCode = *it;
+ if (locale->isApplicationTranslatedInto(languageCode))
+ {
+ button->insertItem(
+ locale->twoAlphaToLanguageName(languageCode),
+ languageCode
+ );
+ }
+ }
+}
+
+TQStringList KSwitchLanguageDialogPrivate::applicationLanguageList()
+{
+ KConfig *config = KGlobal::config();
+ TQStringList languagesList;
+
+ if (config->hasGroup("Locale"))
+ {
+ KConfigGroupSaver saver(config, "Locale");
+
+ if (config->hasKey("Language"))
+ {
+ languagesList = config->readListEntry("Language", ':');
+ }
+ }
+ if (languagesList.empty())
+ {
+ languagesList = KGlobal::locale()->languageList();
+ }
+ return languagesList;
+}
+
+void KSwitchLanguageDialogPrivate::addLanguageButton(const TQString & languageCode, bool primaryLanguage)
+{
+ TQString labelText = primaryLanguage ? i18n("Primary language:") : i18n("Fallback language:");
+
+ KLanguageButton *languageButton = new KLanguageButton(page);
+
+ languageButton->setText(KGlobal::locale()->twoAlphaToLanguageName(languageCode));
+
+ fillApplicationLanguages(languageButton);
+
+ languageButton->setCurrentItem(languageCode);
+
+ TQObject::connect(
+ languageButton,
+ TQT_SIGNAL(activated( const TQString &)),
+ p,
+ TQT_SLOT(languageOnButtonChanged(const TQString &))
+ );
+
+ LanguageRowData languageRowData;
+ KPushButton *removeButton = NULL;
+
+ if (primaryLanguage == false)
+ {
+ removeButton = new KPushButton(i18n("Remove"), page);
+
+ TQObject::connect(
+ removeButton,
+ TQT_SIGNAL(clicked()),
+ p,
+ TQT_SLOT(removeButtonClicked())
+ );
+ }
+
+ if (primaryLanguage)
+ {
+ TQToolTip::add(languageButton, i18n("This is main application language which will be used first before any other languages"));
+ }
+ else
+ {
+ TQToolTip::add(languageButton, i18n("This is language which will be used if any previous languages does not contain proper translation"));
+ }
+
+ int numRows = languagesLayout->numRows();
+
+ TQLabel *languageLabel = new TQLabel(labelText, page);
+ languagesLayout->addWidget( languageLabel, numRows + 1, 1, (TQ_Alignment)TQt::AlignAuto );
+ languagesLayout->addWidget( languageButton, numRows + 1, 2, (TQ_Alignment)TQt::AlignAuto );
+
+ if (primaryLanguage == false)
+ {
+ languagesLayout->addWidget( removeButton, numRows + 1, 3, (TQ_Alignment)TQt::AlignAuto );
+
+ languageRowData.setRowWidgets(
+ languageLabel,
+ languageButton,
+ removeButton
+ );
+ removeButton->show();
+ }
+
+ languageRows.insert(removeButton, languageRowData);
+
+ languageButtons.append(languageButton);
+ languageButton->show();
+ languageLabel->show();
+}
+
+#include "kswitchlanguagedialog.moc"
+