diff options
Diffstat (limited to 'tdeui/kswitchlanguagedialog.cpp')
-rw-r--r-- | tdeui/kswitchlanguagedialog.cpp | 349 |
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" + |