You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
307 lines
13 KiB
307 lines
13 KiB
/* |
|
* Copyright 2010, 2014 John Layt <john@layt.net> |
|
* |
|
* This program is free software; you can redistribute it and/or modify |
|
* it under the terms of the GNU General Public License as published by |
|
* the Free Software Foundation; either version 2 of the License, or |
|
* (at your option) any later version. |
|
* |
|
* This program 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 General Public License for more details. |
|
* |
|
* You should have received a copy of the GNU General Public License |
|
* along with this program; if not, write to the Free Software |
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
* |
|
*/ |
|
|
|
#include "kcmtranslations.h" |
|
|
|
#include "../formats/writeexports.h" |
|
|
|
#include <KAboutData> |
|
#include <KActionSelector> |
|
#include <KLocalizedString> |
|
#include <KMessageBox> |
|
#include <KPluginFactory> |
|
#include <kglobalsettings.h> |
|
|
|
#include <QDebug> |
|
#include <QListWidget> |
|
#include <QListWidgetItem> |
|
#include <QStandardPaths> |
|
|
|
#include "ui_kcmtranslationswidget.h" |
|
|
|
K_PLUGIN_FACTORY(KCMTranslationsFactory, registerPlugin<KCMTranslations>();) |
|
|
|
KCMTranslations::KCMTranslations(QWidget *parent, const QVariantList &args) |
|
: KCModule(parent, args), |
|
m_ui(new Ui::KCMTranslationsWidget) |
|
{ |
|
KAboutData *about = new KAboutData(I18N_NOOP("KCMTranslations"), |
|
i18n("Translations"), |
|
QString(), |
|
i18n("Configure Plasma translations"), |
|
KAboutLicense::GPL); |
|
about->addAuthor(ki18n("John Layt").toString(), ki18n("Maintainer").toString(), QStringLiteral("jlayt@kde.net")); |
|
setAboutData(about); |
|
|
|
m_ui->setupUi(this); |
|
|
|
// Set the translation domain to Plasma, i.e. |
|
KLocalizedString::setApplicationDomain("systemsettings"); |
|
|
|
// Get the current config |
|
m_config = KConfigGroup(KSharedConfig::openConfig("plasma-localerc"), "Translations"); |
|
|
|
// Set up UI to respond to user changing the translation selection |
|
connect(m_ui->m_selectTranslations, SIGNAL(added( QListWidgetItem*)), |
|
this, SLOT(changedTranslationsSelected(QListWidgetItem*))); |
|
connect(m_ui->m_selectTranslations, SIGNAL(removed( QListWidgetItem*)), |
|
this, SLOT(changedTranslationsAvailable(QListWidgetItem*))); |
|
connect(m_ui->m_selectTranslations, SIGNAL(movedUp( QListWidgetItem*)), |
|
this, SLOT(changedTranslationsSelected(QListWidgetItem*))); |
|
connect(m_ui->m_selectTranslations, SIGNAL(movedDown( QListWidgetItem*)), |
|
this, SLOT(changedTranslationsSelected(QListWidgetItem*))); |
|
|
|
// If user clicks the Install button, trigger distro specific install routine |
|
connect(m_ui->m_buttonTranslationsInstall, SIGNAL(clicked()), |
|
this, SLOT(installTranslations())); |
|
|
|
// Hide the Install button, this will be activated by those distros that support this feature. |
|
m_ui->m_buttonTranslationsInstall->setHidden(true); |
|
} |
|
|
|
KCMTranslations::~KCMTranslations() |
|
{ |
|
delete m_ui; |
|
} |
|
|
|
// Reimp |
|
// Load == User has clicked on Reset to restore saved settings |
|
// Also gets called automatically called after constructor |
|
void KCMTranslations::load() |
|
{ |
|
// Get the currently installed translations for Plasma |
|
// TODO May want to later add all installed .po files on system? |
|
m_installedTranslations.clear(); |
|
m_installedTranslations = KLocalizedString::availableApplicationTranslations().toList(); |
|
if (!m_installedTranslations.contains("en_US")) { |
|
m_installedTranslations.append("en_US"); |
|
} |
|
|
|
// Load the current user translations |
|
loadTranslations(); |
|
|
|
// Check if any of the current user translations are no longer installed |
|
// If any missing remove them and save the settings, then tell the user |
|
QStringList missingLanguages; |
|
QStringList availableLanguages; |
|
if (!m_config.isEntryImmutable("LANGUAGE")) { |
|
foreach (const QString &languageCode, m_kcmTranslations) { |
|
if (m_installedTranslations.contains(languageCode)) { |
|
availableLanguages.append(languageCode); |
|
} else { |
|
missingLanguages.append(languageCode); |
|
} |
|
} |
|
qDebug() << "Missing: av ? << " << missingLanguages << availableLanguages; |
|
//m_config.writeEntry("LANGUAGE", availableLanguages.join(":"), KConfig::Persistent | KConfig::Global); |
|
m_config.writeEntry("LANGUAGE", availableLanguages.join(":")); |
|
m_config.sync(); |
|
m_config.config()->reparseConfiguration(); |
|
loadTranslations(); |
|
} |
|
|
|
// Then update all the widgets to use the new settings |
|
initWidgets(); |
|
|
|
// Now we have a ui built tell the user about the missing languages |
|
foreach (const QString &languageCode, missingLanguages) { |
|
KMessageBox::information(this, ki18n("You have the language with code '%1' in your list " |
|
"of languages to use for translation but the " |
|
"localization files for it could not be found. The " |
|
"language has been removed from your configuration. " |
|
"If you want to add it again please install the " |
|
"localization files for it and add the language again.") |
|
.subs(languageCode).toString()); |
|
} |
|
} |
|
|
|
// Reimp |
|
// Save the new LANGUAGE setting |
|
void KCMTranslations::save() |
|
{ |
|
qDebug() << m_kcmTranslations.join(":"); |
|
|
|
m_config.writeEntry("LANGUAGE", m_kcmTranslations.join(":"), KConfig::Persistent | KConfig::Global); |
|
m_config.sync(); |
|
KMessageBox::information(this, |
|
i18n("Your changes will take effect the next time you log in."), |
|
i18n("Applying Language Settings"), |
|
QLatin1String("LanguageChangesApplyOnlyToNewlyStartedPrograms")); |
|
load(); |
|
KGlobalSettings::self()->emitChange(KGlobalSettings::SettingsChanged, KGlobalSettings::SETTINGS_LOCALE); |
|
writeExports(); |
|
} |
|
|
|
// Reimp |
|
// Defaults == User has clicked on Defaults to load default settings |
|
// We interpret this to mean the default LANG setting |
|
void KCMTranslations::defaults() |
|
{ |
|
// Get the users LANG setting, or if empty the system LANG |
|
QString lang = m_config.readEntry("LANG", QString()); |
|
if (lang.isEmpty() || !m_installedTranslations.contains(lang)) |
|
lang = QLocale::system().name(); |
|
if (!m_installedTranslations.contains(lang)) |
|
lang = QStringLiteral("en_US"); |
|
|
|
// Use the available lang as the default |
|
m_kcmTranslations.clear(); |
|
m_kcmTranslations.append(lang); |
|
|
|
// The update all the widgets to use the new language |
|
initWidgets(); |
|
} |
|
|
|
void KCMTranslations::loadTranslations() |
|
{ |
|
// Load the user translations |
|
m_configTranslations = m_config.readEntry("LANGUAGE", QString()); |
|
m_kcmTranslations.clear(); |
|
m_kcmTranslations = m_configTranslations.split(':', QString::SkipEmptyParts); |
|
} |
|
|
|
QString KCMTranslations::quickHelp() const |
|
{ |
|
return ki18n("<h1>Translations</h1>\n" |
|
"<p>Here you can set your preferred language for translating the " |
|
"user interface of your applications. You can choose a single " |
|
"language, or a list of languages to be applied in sequence. Only " |
|
"language translations that are installed on your system will " |
|
"be listed as available. If your language is not listed then " |
|
"you will need to install it first.</p>").toString(); |
|
} |
|
|
|
void KCMTranslations::initWidgets() |
|
{ |
|
initTranslations(); |
|
initTranslationsInstall(); |
|
// Init the KCM "Apply" button |
|
emit changed(m_kcmTranslations.join(":") != m_configTranslations); |
|
} |
|
|
|
void KCMTranslations::initTranslations() |
|
{ |
|
m_ui->m_selectTranslations->blockSignals(true); |
|
|
|
m_ui->m_selectTranslations->setAvailableLabel(ki18n( "Available Languages:" ).toString()); |
|
QString availableHelp = ki18n("<p>This is the list of installed KDE Plasma language " |
|
"translations not currently being used. To use a language " |
|
"translation move it to the 'Preferred Languages' list in " |
|
"the order of preference. If no suitable languages are " |
|
"listed, then you may need to install more language packages " |
|
"using your usual installation method.</p>" ).toString(); |
|
m_ui->m_selectTranslations->availableListWidget()->setToolTip(availableHelp); |
|
m_ui->m_selectTranslations->availableListWidget()->setWhatsThis(availableHelp); |
|
|
|
m_ui->m_selectTranslations->setSelectedLabel(ki18n("Preferred Languages:").toString()); |
|
QString selectedHelp = ki18n("<p>This is the list of installed KDE Plasma language " |
|
"translations currently being used, listed in order of " |
|
"preference. If a translation is not available for the " |
|
"first language in the list, the next language will be used. " |
|
"If no other translations are available then US English will " |
|
"be used.</p>").toString(); |
|
m_ui->m_selectTranslations->selectedListWidget()->setToolTip(selectedHelp); |
|
m_ui->m_selectTranslations->selectedListWidget()->setWhatsThis(selectedHelp); |
|
|
|
QString enUS; |
|
QString defaultLang = ki18nc("%1 = default language name", "%1 (Default)").subs(enUS).toString(); |
|
|
|
// Clear the selector before reloading |
|
m_ui->m_selectTranslations->availableListWidget()->clear(); |
|
m_ui->m_selectTranslations->selectedListWidget()->clear(); |
|
|
|
// Load each user selected language into the selected list |
|
foreach (const QString &languageCode, m_kcmTranslations) { |
|
QListWidgetItem *listItem = new QListWidgetItem(m_ui->m_selectTranslations->selectedListWidget()); |
|
// TODO This gives the name in the language itself, not in current language, need new QLocale api for that |
|
listItem->setText(QLocale(languageCode).nativeLanguageName()); |
|
listItem->setData(Qt::UserRole, languageCode); |
|
} |
|
|
|
// Load all the available languages the user hasn't selected into the available list |
|
foreach ( const QString &languageCode, m_installedTranslations ) { |
|
if (!m_kcmTranslations.contains(languageCode)) { |
|
QListWidgetItem *listItem = new QListWidgetItem(m_ui->m_selectTranslations->availableListWidget()); |
|
// TODO This gives the name in the language itself, not in current language, need new QLocale api for that |
|
listItem->setText(QLocale(languageCode).nativeLanguageName()); |
|
listItem->setData(Qt::UserRole, languageCode); |
|
} |
|
} |
|
m_ui->m_selectTranslations->availableListWidget()->sortItems(); |
|
|
|
// Default to selecting the first Selected language, |
|
// otherwise the first Available language, |
|
// otherwise no languages so disable all buttons |
|
if (m_ui->m_selectTranslations->selectedListWidget()->count() > 0) { |
|
m_ui->m_selectTranslations->selectedListWidget()->setCurrentRow(0); |
|
} else if (m_ui->m_selectTranslations->availableListWidget()->count() > 0) { |
|
m_ui->m_selectTranslations->availableListWidget()->setCurrentRow(0); |
|
} |
|
|
|
// If the setting is locked down by Kiosk, then don't let the user make any changes |
|
if (m_config.isEntryImmutable("LANGUAGE")) { |
|
m_ui->m_selectTranslations->setEnabled(false); |
|
} |
|
|
|
m_ui->m_selectTranslations->blockSignals(false); |
|
} |
|
|
|
void KCMTranslations::changedTranslationsAvailable(QListWidgetItem *item) |
|
{ |
|
Q_UNUSED(item); |
|
m_ui->m_selectTranslations->availableListWidget()->sortItems(); |
|
int row = m_ui->m_selectTranslations->availableListWidget()->currentRow(); |
|
changedTranslations(); |
|
m_ui->m_selectTranslations->availableListWidget()->setCurrentRow(row); |
|
} |
|
|
|
void KCMTranslations::changedTranslationsSelected(QListWidgetItem *item) |
|
{ |
|
Q_UNUSED(item); |
|
int row = m_ui->m_selectTranslations->selectedListWidget()->currentRow(); |
|
changedTranslations(); |
|
m_ui->m_selectTranslations->selectedListWidget()->setCurrentRow(row); |
|
} |
|
|
|
void KCMTranslations::changedTranslations() |
|
{ |
|
// Read the list of all Selected translations from the selector widget |
|
m_kcmTranslations.clear(); |
|
for (int i = 0; i < m_ui->m_selectTranslations->selectedListWidget()->count(); ++i) { |
|
m_kcmTranslations.append(m_ui->m_selectTranslations->selectedListWidget()->item(i)->data(Qt::UserRole).toString()); |
|
} |
|
initWidgets(); |
|
} |
|
|
|
void KCMTranslations::initTranslationsInstall() |
|
{ |
|
m_ui->m_buttonTranslationsInstall->blockSignals(true); |
|
m_ui->m_buttonTranslationsInstall->setText( ki18n("Install more languages").toString()); |
|
QString helpText = ki18n("<p>Click here to install more languages</p>").toString(); |
|
m_ui->m_buttonTranslationsInstall->setToolTip(helpText); |
|
m_ui->m_buttonTranslationsInstall->setWhatsThis(helpText); |
|
m_ui->m_buttonTranslationsInstall->blockSignals(false); |
|
} |
|
|
|
void KCMTranslations::installTranslations() |
|
{ |
|
// User has clicked Install Languages button, trigger distro specific install routine |
|
} |
|
|
|
#include "kcmtranslations.moc"
|
|
|