kde-workspace/kcontrol/locale/kcmlocale.cpp

2516 lines
116 KiB
C++
Raw Normal View History

2014-11-15 03:14:34 +02:00
/*
* Copyright (c) 1998 Matthias Hoelzer (hoelzer@physik.uni-wuerzburg.de)
* Copyright (c) 1999 Preston Brown <pbrown@kde.org>
* Copyright (c) 1999-2003 Hans Petter Bieker <bieker@kde.org>
* Copyright 2010 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 "kcmlocale.h"
#include <QListWidget>
#include <QtGui/qlistwidget.h>
2014-11-15 03:14:34 +02:00
#include <QPrinter>
#include <QTimer>
#include <KAboutData>
#include <KActionSelector>
#include <KBuildSycocaProgressDialog>
#include <KCalendarSystem>
#include <KDateTime>
#include <KDebug>
#include <KLocale>
#include <KLocalizedString>
#include <KMessageBox>
#include <KPluginFactory>
#include <KStandardDirs>
#include "ui_kcmlocalewidget.h"
K_PLUGIN_FACTORY( KCMLocaleFactory, registerPlugin<KCMLocale>(); )
K_EXPORT_PLUGIN( KCMLocaleFactory( "kcmlocale" ) )
KCMLocale::KCMLocale( QWidget *parent, const QVariantList &args )
: KCModule( KCMLocaleFactory::componentData(), parent, args ),
m_userConfig( 0 ),
m_kcmConfig( 0 ),
m_defaultConfig( 0 ),
m_groupConfig( 0 ),
m_countryConfig( 0 ),
m_cConfig( 0 ),
m_kcmLocale( 0 ),
m_defaultLocale( 0 ),
m_ui( new Ui_KCMLocaleWidget )
2014-11-15 03:14:34 +02:00
{
KAboutData *about = new KAboutData( "kcmlocale", 0, ki18n( "Localization options for KDE applications" ),
0, KLocalizedString(), KAboutData::License_GPL,
ki18n( "Copyright 2010 John Layt" ) );
about->addAuthor( ki18n( "John Layt" ), ki18n( "Maintainer" ), "john@layt.net" );
setAboutData( about );
m_ui->setupUi( this );
initSettings();
// Country tab
connect( m_ui->m_comboCountry, SIGNAL( activated( int ) ),
this, SLOT( changedCountryIndex( int ) ) );
connect( m_ui->m_buttonDefaultCountry, SIGNAL( clicked() ),
this, SLOT( defaultCountry() ) );
// Translations tab
// User has changed the translations selection in some way
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* ) ) );
// User has clicked Default button, resest lists to Defaults
connect( m_ui->m_buttonDefaultTranslations, SIGNAL( clicked() ),
this, SLOT( defaultTranslations() ) );
// Numbers tab
connect( m_ui->m_comboNumericDigitGrouping, SIGNAL( currentIndexChanged( int ) ),
this, SLOT( changedNumericDigitGroupingIndex( int ) ) );
connect( m_ui->m_buttonDefaultNumericDigitGrouping, SIGNAL( clicked() ),
this, SLOT( defaultNumericDigitGrouping() ) );
connect( m_ui->m_comboThousandsSeparator, SIGNAL( editTextChanged( const QString & ) ),
this, SLOT( changedNumericThousandsSeparator( const QString & ) ) );
connect( m_ui->m_buttonDefaultThousandsSeparator, SIGNAL( clicked() ),
this, SLOT( defaultNumericThousandsSeparator() ) );
connect( m_ui->m_comboDecimalSymbol, SIGNAL( editTextChanged( const QString & ) ),
this, SLOT( changedNumericDecimalSymbol( const QString & ) ) );
connect( m_ui->m_buttonDefaultDecimalSymbol, SIGNAL( clicked() ),
this, SLOT( defaultNumericDecimalSymbol() ) );
connect( m_ui->m_intDecimalPlaces, SIGNAL( valueChanged( int ) ),
this, SLOT( changedNumericDecimalPlaces( int ) ) );
connect( m_ui->m_buttonDefaultDecimalPlaces, SIGNAL( clicked() ),
this, SLOT( defaultNumericDecimalPlaces() ) );
connect( m_ui->m_comboPositiveSign, SIGNAL( editTextChanged( const QString & ) ),
this, SLOT( changedNumericPositiveSign( const QString & ) ) );
connect( m_ui->m_buttonDefaultPositiveSign, SIGNAL( clicked() ),
this, SLOT( defaultNumericPositiveSign() ) );
connect( m_ui->m_comboNegativeSign, SIGNAL( editTextChanged( const QString & ) ),
this, SLOT( changedNumericNegativeSign( const QString & ) ) );
connect( m_ui->m_buttonDefaultNegativeSign, SIGNAL( clicked() ),
this, SLOT( defaultNumericNegativeSign() ) );
connect( m_ui->m_comboDigitSet, SIGNAL( currentIndexChanged( int ) ),
this, SLOT( changedNumericDigitSetIndex( int ) ) );
connect( m_ui->m_buttonDefaultDigitSet, SIGNAL( clicked() ),
this, SLOT( defaultNumericDigitSet() ) );
// Calendar tab
connect( m_ui->m_comboCalendarSystem, SIGNAL( currentIndexChanged( int ) ),
this, SLOT( changedCalendarSystemIndex( int ) ) );
connect( m_ui->m_buttonDefaultCalendarSystem, SIGNAL( clicked() ),
this, SLOT( defaultCalendarSystem() ) );
connect( m_ui->m_checkCalendarGregorianUseCommonEra, SIGNAL( clicked( bool ) ),
this, SLOT( changedUseCommonEra( bool ) ) );
connect( m_ui->m_buttonDefaultCalendarGregorianUseCommonEra, SIGNAL( clicked() ),
this, SLOT( defaultUseCommonEra() ) );
connect( m_ui->m_intShortYearWindowStartYear, SIGNAL( valueChanged( int ) ),
this, SLOT( changedShortYearWindow( int ) ) );
connect( m_ui->m_buttonDefaultShortYearWindow, SIGNAL( clicked() ),
this, SLOT( defaultShortYearWindow() ) );
connect( m_ui->m_comboWeekNumberSystem, SIGNAL( currentIndexChanged( int ) ),
this, SLOT( changedWeekNumberSystemIndex( int ) ) );
connect( m_ui->m_buttonDefaultWeekNumberSystem, SIGNAL( clicked() ),
this, SLOT( defaultWeekNumberSystem() ) );
connect( m_ui->m_comboWeekStartDay, SIGNAL( currentIndexChanged( int ) ),
this, SLOT( changedWeekStartDayIndex( int ) ) );
connect( m_ui->m_buttonDefaultWeekStartDay, SIGNAL( clicked() ),
this, SLOT( defaultWeekStartDay() ) );
// Date / Time tab
connect( m_ui->m_comboTimeFormat, SIGNAL( editTextChanged( const QString & ) ),
this, SLOT( changedTimeFormat( const QString & ) ) );
connect( m_ui->m_buttonDefaultTimeFormat, SIGNAL( clicked() ),
this, SLOT( defaultTimeFormat() ) );
connect( m_ui->m_comboAmSymbol, SIGNAL( editTextChanged( const QString & ) ),
this, SLOT( changedAmSymbol( const QString & ) ) );
connect( m_ui->m_buttonDefaultAmSymbol, SIGNAL( clicked() ),
this, SLOT( defaultAmSymbol() ) );
connect( m_ui->m_comboPmSymbol, SIGNAL( editTextChanged( const QString & ) ),
this, SLOT( changedPmSymbol( const QString & ) ) );
connect( m_ui->m_buttonDefaultPmSymbol, SIGNAL( clicked() ),
this, SLOT( defaultPmSymbol() ) );
connect( m_ui->m_comboDateFormat, SIGNAL( editTextChanged( const QString & ) ),
this, SLOT( changedDateFormat( const QString & ) ) );
connect( m_ui->m_buttonDefaultDateFormat, SIGNAL( clicked() ),
this, SLOT( defaultDateFormat() ) );
connect( m_ui->m_comboShortDateFormat, SIGNAL( editTextChanged( const QString & ) ),
this, SLOT( changedShortDateFormat( const QString & ) ) );
connect( m_ui->m_buttonDefaultShortDateFormat, SIGNAL( clicked() ),
this, SLOT( defaultShortDateFormat() ) );
connect( m_ui->m_checkMonthNamePossessive, SIGNAL( clicked( bool ) ),
this, SLOT( changedMonthNamePossessive( bool ) ) );
connect( m_ui->m_buttonDefaultMonthNamePossessive, SIGNAL( clicked() ),
this, SLOT( defaultMonthNamePossessive() ) );
connect( m_ui->m_comboDateTimeDigitSet, SIGNAL( currentIndexChanged( int ) ),
this, SLOT( changedDateTimeDigitSetIndex( int ) ) );
connect( m_ui->m_buttonDefaultDateTimeDigitSet, SIGNAL( clicked() ),
this, SLOT( defaultDateTimeDigitSet() ) );
// Other tab
connect( m_ui->m_comboPageSize, SIGNAL( currentIndexChanged( int ) ),
this, SLOT( changedPageSizeIndex( int ) ) );
connect( m_ui->m_buttonDefaultPageSize, SIGNAL( clicked() ),
this, SLOT( defaultPageSize() ) );
connect( m_ui->m_comboMeasureSystem, SIGNAL( currentIndexChanged( int ) ),
this, SLOT( changedMeasureSystemIndex( int ) ) );
connect( m_ui->m_buttonDefaultMeasureSystem, SIGNAL( clicked() ),
this, SLOT( defaultMeasureSystem() ) );
connect( m_ui->m_comboBinaryUnitDialect, SIGNAL( currentIndexChanged( int ) ),
this, SLOT( changedBinaryUnitDialectIndex( int ) ) );
connect( m_ui->m_buttonDefaultBinaryUnitDialect, SIGNAL( clicked() ),
this, SLOT( defaultBinaryUnitDialect() ) );
}
KCMLocale::~KCMLocale()
{
// Throw away any unsaved changes as delete calls an unwanted sync()
m_kcmConfig->markAsClean();
m_userConfig->markAsClean();
m_defaultConfig->markAsClean();
m_cConfig->markAsClean();
m_countryConfig->markAsClean();
m_groupConfig->markAsClean();
delete m_kcmLocale;
delete m_defaultLocale;
delete m_ui;
}
// Init all the config/settings objects, only called at the very start but inits everything so
// load() and mergeSettings() can assume everything exists every time they are called
void KCMLocale::initSettings()
{
// Setup the KCM Config/Settings
// These are the effective settings merging KCM Changes, User, Group, Country, and C settings
// This will be used to display current state of settings in the KCM
// These settings should never be saved anywhere
m_kcmConfig = KSharedConfig::openConfig( "kcmlocale-kcm", KConfig::SimpleConfig );
m_kcmSettings = KConfigGroup( m_kcmConfig, "Locale" );
m_kcmSettings.deleteGroup();
m_kcmSettings.markAsClean();
// Setup the Default Config/Settings
// These will be a merge of the C, Country and Group settings
// If the user clicks on the Defaults button, these are the settings that will be used
// These settings should never be saved anywhere
m_defaultConfig = KSharedConfig::openConfig( "kcmlocale-default", KConfig::SimpleConfig );
m_defaultSettings = KConfigGroup( m_defaultConfig, "Locale" );
// Setup the User Config/Settings
// These are the User overrides, they exclude any Group, Country, or C settings
// This will be used to store the User changes
// These are the only settings that should ever be saved
m_userConfig = KSharedConfig::openConfig( "kcmlocale-user", KConfig::IncludeGlobals );
m_userSettings = KConfigGroup( m_userConfig, "Locale" );
// Setup the Current Config/Settings
// These are the currently saved User settings
// This will be used to check if the kcm settings have been changed
// These settings should never be saved anywhere
m_currentConfig = KSharedConfig::openConfig( "kcmlocale-current", KConfig::IncludeGlobals );
m_currentSettings = KConfigGroup( m_currentConfig, "Locale" );
// Setup the Group Config/Settings
// These are the Group overrides, they exclude any User, Country, or C settings
// This will be used in the merge to obtain the KCM Defaults
// These settings should never be saved anywhere
m_groupConfig = KSharedConfig::openConfig( "kcmlocale-group", KConfig::NoGlobals );
m_groupSettings = KConfigGroup( m_groupConfig, "Locale" );
// Setup the C Config Settings
// These are the C/Posix defaults and KDE defaults where a setting doesn't exist in Posix
// This will be used as the lowest level in the merge to obtain the KCM Defaults
// These settings should never be saved anywhere
m_cConfig = KSharedConfig::openConfig( KStandardDirs::locate( "locale",
QString::fromLatin1("l10n/C/entry.desktop") ) );
m_cSettings= KConfigGroup( m_cConfig, "KCM Locale" );
initCountrySettings( KGlobal::locale()->country() );
initCalendarSettings();
m_kcmLocale = new KLocale( QLatin1String("kcmlocale"), m_kcmConfig );
m_defaultLocale = new KLocale( QLatin1String("kcmlocale"), m_defaultConfig );
// Find out the system country using a null config
m_systemCountry = m_kcmLocale->country();
// Set up the initial languages to use
m_currentTranslations = m_userSettings.readEntry( "Language", QString() );
m_kcmTranslations = m_currentTranslations.split( ':', QString::SkipEmptyParts );
}
void KCMLocale::initCountrySettings( const QString &countryCode )
{
// Setup the Country Config/Settings
2014-11-15 03:14:34 +02:00
// These are the Country overrides, they exclude any User, Group, or C settings
// This will be used in the merge to obtain the KCM Defaults
// These settings should never be saved anywhere
m_countryConfig = KSharedConfig::openConfig( KStandardDirs::locate( "locale",
QString::fromLatin1("l10n/%1/entry.desktop")
.arg( countryCode ) ) );
m_countrySettings = KConfigGroup( m_countryConfig, "KCM Locale" );
QString calendarType = m_countrySettings.readEntry( "CalendarSystem", "gregorian" );
QString calendarGroup = QString::fromLatin1( "KCalendarSystem %1" ).arg( calendarType );
m_countryCalendarSettings = m_countrySettings.group( calendarGroup );
}
// Init all the calendar settings sub-group objects, called both at the start and whenever the
// calendar system is changed
void KCMLocale::initCalendarSettings()
{
// Setup the User Config/Settings
// These are the User overrides, they exclude any Group, Country, or C settings
// This will be used to store the User changes
QString calendarType = m_kcmSettings.readEntry( "CalendarSystem", QString() );
QString calendarGroup = QString::fromLatin1( "KCalendarSystem %1" ).arg( calendarType );
m_userCalendarSettings = m_userSettings.group( calendarGroup );
// Setup the Current Config/Settings
// These are the currently saved User settings
// This will be used to check if the kcm settings have been changed
calendarType = m_currentSettings.readEntry( "CalendarSystem", KGlobal::locale()->calendar()->calendarLabel() );
2014-11-15 03:14:34 +02:00
calendarGroup = QString::fromLatin1( "KCalendarSystem %1" ).arg( calendarType );
m_currentCalendarSettings = m_currentSettings.group( calendarGroup );
// Setup the Group Config/Settings
// These are the Group overrides, they exclude any User, Country, or C settings
// This will be used in the merge to obtain the KCM Defaults
// These settings should never be saved anywhere
calendarType = m_groupSettings.readEntry( "CalendarSystem", KGlobal::locale()->calendar()->calendarLabel() );
2014-11-15 03:14:34 +02:00
calendarGroup = QString::fromLatin1( "KCalendarSystem %1" ).arg( calendarType );
m_groupCalendarSettings = m_groupSettings.group( calendarGroup );
// Setup the C Config Settings
// These are the C/Posix defaults and KDE defaults where a setting doesn't exist in Posix
// This will be used as the lowest level in the merge to obtain the KCM Defaults
// These settings should never be saved anywhere
calendarType = m_cSettings.readEntry( "CalendarSystem", QString() );
calendarGroup = QString::fromLatin1( "KCalendarSystem %1" ).arg( calendarType );
m_cCalendarSettings = m_cSettings.group( calendarGroup );
// Setup a the Country Config/Settings
// These are the Country overrides, they exclude any User, Group, or C settings
// This will be used in the merge to obtain the KCM Defaults
// These settings should never be saved anywhere
calendarType = m_countrySettings.readEntry( "CalendarSystem", "gregorian" );
calendarGroup = QString::fromLatin1( "KCalendarSystem %1" ).arg( calendarType );
m_countryCalendarSettings = m_countrySettings.group( calendarGroup );
}
// Load == User has clicked on Reset to restore load saved settings
// Also gets called automatically called after constructor
void KCMLocale::load()
{
// Throw away any unsaved changes then reload from file
m_userConfig->markAsClean();
m_userConfig->reparseConfiguration();
// Get the currently installed translations
m_installedTranslations.clear();
m_installedTranslations = m_kcmLocale->installedLanguages();
// Check if any of the user requested translations are no longer installed
// If any missing remove them and save the settings, we'll tell the user later
m_kcmTranslations.clear();
QStringList missingLanguages;
QStringList userTranslations = m_userSettings.readEntry( "Language", QString() ).split( ':', QString::SkipEmptyParts );
foreach ( const QString &languageCode, userTranslations ) {
if ( m_installedTranslations.contains( languageCode ) ) {
m_kcmTranslations.append( languageCode );
} else {
missingLanguages.append( languageCode );
}
}
if (!missingLanguages.isEmpty()) {
m_userSettings.writeEntry( "Language", m_kcmTranslations.join( ":" ), KConfig::Persistent | KConfig::Global );
m_userConfig->sync();
}
// Now load the new current settings
m_currentConfig->reparseConfiguration();
m_currentTranslations = m_userSettings.readEntry( "Language", QString() );
// Then create the new settings using the default, include user settings
mergeSettings();
// The update all the widgets to use the new settings
initAllWidgets();
// 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( m_kcmLocale ) );
}
}
// Defaults == User has clicked on Defaults to load default settings
// We interpret this to mean the defaults for the system country and language
void KCMLocale::defaults()
{
// Clear out the user config but don't sync or reparse as we want to ignore the user settings
m_userCalendarSettings.deleteGroup( KConfig::Persistent | KConfig::Global );
m_userSettings.deleteGroup( KConfig::Persistent | KConfig::Global );
m_kcmTranslations.clear();
m_currentTranslations = QString();
// Reload the system country
initCountrySettings( m_systemCountry );
// Then create the new settings using the default, exclude user settings
mergeSettings();
// Save the current translations for checking later
m_currentTranslations = m_kcmSettings.readEntry( "Language", QString() );
// The update all the widgets to use the new settings
initAllWidgets();
}
// Write our own copy routine as we need to be selective about what values get copied, e.g. exclude
// Name, Region, etc, and copyTo() seems to barf on some uses
void KCMLocale::copySettings( KConfigGroup *fromGroup, KConfigGroup *toGroup, KConfig::WriteConfigFlags flags )
{
copySetting( fromGroup, toGroup, "Country", flags );
copySetting( fromGroup, toGroup, "Language", flags );
copySetting( fromGroup, toGroup, "DecimalPlaces", flags );
copySetting( fromGroup, toGroup, "DecimalSymbol", flags );
copySetting( fromGroup, toGroup, "DigitGroupFormat", flags );
copySetting( fromGroup, toGroup, "ThousandsSeparator", flags );
copySetting( fromGroup, toGroup, "PositiveSign", flags );
copySetting( fromGroup, toGroup, "NegativeSign", flags );
copySetting( fromGroup, toGroup, "DigitSet", flags );
copySetting( fromGroup, toGroup, "CalendarSystem", flags );
copySetting( fromGroup, toGroup, "TimeFormat", flags );
QString eraKey = QString::fromLatin1("DayPeriod1");
int i = 1;
while ( fromGroup->hasKey( eraKey ) ) {
copySetting( fromGroup, toGroup, eraKey, flags );
++i;
eraKey = QString::fromLatin1("DayPeriod%1").arg( i );
}
copySetting( fromGroup, toGroup, "DateFormat", flags );
copySetting( fromGroup, toGroup, "DateFormatShort", flags );
copySetting( fromGroup, toGroup, "DateMonthNamePossessive", flags );
copySetting( fromGroup, toGroup, "WeekNumberSystem", flags );
copySetting( fromGroup, toGroup, "WeekStartDay", flags );
copySetting( fromGroup, toGroup, "DateTimeDigitSet", flags );
copySetting( fromGroup, toGroup, "BinaryUnitDialect", flags );
copySetting( fromGroup, toGroup, "PageSize", flags );
copySetting( fromGroup, toGroup, "MeasureSystem", flags );
}
void KCMLocale::copyCalendarSettings( KConfigGroup *fromGroup, KConfigGroup *toGroup, KConfig::WriteConfigFlags flags )
{
copySetting( fromGroup, toGroup, "ShortYearWindowStartYear", flags );
copySetting( fromGroup, toGroup, "UseCommonEra", flags );
QString eraKey = QString::fromLatin1("Era1");
int i = 1;
while ( fromGroup->hasKey( eraKey ) ) {
copySetting( fromGroup, toGroup, eraKey, flags );
++i;
eraKey = QString::fromLatin1("Era%1").arg( i );
}
}
void KCMLocale::copySetting( KConfigGroup *fromGroup, KConfigGroup *toGroup, const QString &key, KConfig::WriteConfigFlags flags )
{
if ( fromGroup->hasKey( key ) ) {
toGroup->writeEntry( key, fromGroup->readEntry( key, QString() ), flags );
}
}
void KCMLocale::mergeSettings()
{
// Set the Locale for the configs to use
QString locale;
if ( m_kcmTranslations.count() >= 1 ) {
locale = m_kcmTranslations.first();
} else {
locale = "en_US";
}
m_cConfig->setLocale( locale );
m_countryConfig->setLocale( locale );
m_groupConfig->setLocale( locale );
// Merge the default settings, i.e. C, Country, and Group
m_defaultSettings.deleteGroup();
m_defaultSettings.markAsClean();
m_defaultConfig->setLocale( locale );
copySettings( &m_cSettings, &m_defaultSettings );
copySettings( &m_countrySettings, &m_defaultSettings );
copySettings( &m_groupSettings, &m_defaultSettings );
// Mark as clean to prevent any accidental sync() via side-effect once passed to the KLocale
m_defaultConfig->markAsClean();
// Need to set the language of the KLocale first, so when we pass the config into the setCountry
// call the implicit setLocale() will find the languages match and not force a reparse of the
// non-existent settings file, losing all our settings in the process.
m_defaultLocale->setLanguage( m_kcmTranslations );
m_defaultLocale->setCountry( m_defaultSettings.readEntry( "Country", QString() ), m_defaultConfig.data() );
m_defaultSettings.writeEntry( "DayPeriod1",
amPeriod( m_defaultLocale->dayPeriodText( QTime( 0, 0, 0 ), KLocale::LongName ),
m_defaultLocale->dayPeriodText( QTime( 0, 0, 0 ), KLocale::ShortName ),
m_defaultLocale->dayPeriodText( QTime( 0, 0, 0 ), KLocale::NarrowName ) ) );
m_defaultSettings.writeEntry( "DayPeriod2",
pmPeriod( m_defaultLocale->dayPeriodText( QTime( 12, 0, 0 ), KLocale::LongName ),
m_defaultLocale->dayPeriodText( QTime( 12, 0, 0 ), KLocale::ShortName ),
m_defaultLocale->dayPeriodText( QTime( 12, 0, 0 ), KLocale::NarrowName ) ) );
m_defaultConfig->markAsClean();
// Merge the KCM settings, i.e. C, Country, Group, and User
m_kcmSettings.deleteGroup();
m_kcmConfig->markAsClean();
m_kcmConfig->setLocale( locale );
copySettings( &m_defaultSettings, &m_kcmSettings );
copySettings( &m_userSettings, &m_kcmSettings );
// Merge the calendar settings sub-groups
mergeCalendarSettings();
// Reload the kcm translations list
m_kcmTranslations.clear();
m_kcmTranslations = m_kcmSettings.readEntry( "Language", QString() ).split( ':', QString::SkipEmptyParts );
// Reload the kcm locale from the kcm settings
// Mark as clean to prevent any accidental sync() via side-effect once passed to the KLocale
m_kcmConfig->markAsClean();
// Need to set the language of the KLocale first, so when we pass the config into the setCountry
// call the implicit setLocale() will find the languages match and not force a reparse of the
// non-existent settings file, losing all our settings in the process.
m_kcmLocale->setLanguage( m_kcmTranslations );
m_kcmLocale->setCountry( m_kcmSettings.readEntry( "Country", QString() ), m_kcmConfig.data() );
}
void KCMLocale::mergeCalendarSettings()
{
// Merge the default settings, i.e. C, Country, and Group
QString calendarType = m_defaultSettings.readEntry( "CalendarSystem", "gregorian" );
QString calendarGroup = QString::fromLatin1( "KCalendarSystem %1" ).arg( calendarType );
m_defaultCalendarSettings = m_defaultSettings.group( calendarGroup );
m_defaultCalendarSettings.deleteGroup();
copyCalendarSettings( &m_cCalendarSettings, &m_defaultCalendarSettings );
copyCalendarSettings( &m_countryCalendarSettings, &m_defaultCalendarSettings );
copyCalendarSettings( &m_groupCalendarSettings, &m_defaultCalendarSettings );
// Merge the KCM settings, i.e. C, Country, Group, and User
calendarType = m_kcmSettings.readEntry( "CalendarSystem", "gregorian" );
calendarGroup = QString::fromLatin1( "KCalendarSystem %1" ).arg( calendarType );
m_kcmCalendarSettings = m_kcmSettings.group( calendarGroup );
m_kcmCalendarSettings.deleteGroup();
copyCalendarSettings( &m_defaultCalendarSettings, &m_kcmCalendarSettings );
copyCalendarSettings( &m_userCalendarSettings, &m_kcmCalendarSettings );
}
void KCMLocale::save()
{
m_userConfig->sync();
// rebuild the date base if language was changed
if ( m_currentTranslations != m_kcmSettings.readEntry( "Language", QString() ) ) {
KMessageBox::information(this, ki18n("Changed language settings apply only to "
"newly started applications.\nTo change the "
"language of all programs, you will have to "
"logout first.").toString(m_kcmLocale),
ki18n("Applying Language Settings").toString(m_kcmLocale),
QLatin1String("LanguageChangesApplyOnlyToNewlyStartedPrograms"));
KBuildSycocaProgressDialog::rebuildKSycoca(this);
}
load();
KGlobalSettings::self()->emitChange(KGlobalSettings::SettingsChanged, KGlobalSettings::SETTINGS_LOCALE);
}
QString KCMLocale::quickHelp() const
{
return ki18n("<h1>Country/Region & Language</h1>\n"
"<p>Here you can set your localization settings such as language, "
"numeric formats, date and time formats, etc. Choosing a country "
"will load a set of default formats which you can then change to "
"your personal preferences. These personal preferences will remain "
"set even if you change the country. The reset buttons allow you "
"to easily see where you have personal settings and to restore "
"those items to the country's default value.</p>"
).toString(m_kcmLocale);
}
void KCMLocale::initAllWidgets()
{
//Common
initTabs();
initSample();
initResetButtons();
//Country tab
initCountry();
//Translations tab
initTranslations();
initSettingsWidgets();
}
void KCMLocale::initSettingsWidgets()
{
// Initialise the settings widgets with the default values whenever the country or language changes
//Numeric tab
initNumericDigitGrouping();
initNumericThousandsSeparator();
initNumericDecimalSymbol();
initNumericDecimalPlaces();
initNumericPositiveSign();
initNumericNegativeSign();
initNumericDigitSet();
//Calendar tab
initCalendarSystem();
// this also inits all the Calendar System dependent settings
//Date/Time tab
initTimeFormat();
initAmPmSymbols();
initDateFormat();
initShortDateFormat();
initMonthNamePossessive();
initDateTimeDigitSet();
//Other tab
initPageSize();
initMeasureSystem();
initBinaryUnitDialect();
checkIfChanged();
}
void KCMLocale::initResetButtons()
{
KGuiItem defaultItem( QString(), "document-revert", ki18n( "Reset item to its default value" ).toString( m_kcmLocale ) );
//Country tab
m_ui->m_buttonDefaultCountry->setGuiItem( defaultItem );
//Translations tab
m_ui->m_buttonDefaultTranslations->setGuiItem( defaultItem );
//Numeric tab
m_ui->m_buttonDefaultNumericDigitGrouping->setGuiItem( defaultItem );
m_ui->m_buttonDefaultThousandsSeparator->setGuiItem( defaultItem );
m_ui->m_buttonDefaultDecimalSymbol->setGuiItem( defaultItem );
m_ui->m_buttonDefaultDecimalPlaces->setGuiItem( defaultItem );
m_ui->m_buttonDefaultPositiveSign->setGuiItem( defaultItem );
m_ui->m_buttonDefaultNegativeSign->setGuiItem( defaultItem );
m_ui->m_buttonDefaultDigitSet->setGuiItem( defaultItem );
//Calendar tab
m_ui->m_buttonDefaultCalendarSystem->setGuiItem( defaultItem );
m_ui->m_buttonDefaultCalendarGregorianUseCommonEra->setGuiItem( defaultItem );
m_ui->m_buttonDefaultShortYearWindow->setGuiItem( defaultItem );
m_ui->m_buttonDefaultWeekNumberSystem->setGuiItem( defaultItem );
m_ui->m_buttonDefaultWeekStartDay->setGuiItem( defaultItem );
//Date/Time tab
m_ui->m_buttonDefaultTimeFormat->setGuiItem( defaultItem );
m_ui->m_buttonDefaultAmSymbol->setGuiItem( defaultItem );
m_ui->m_buttonDefaultPmSymbol->setGuiItem( defaultItem );
m_ui->m_buttonDefaultDateFormat->setGuiItem( defaultItem );
m_ui->m_buttonDefaultShortDateFormat->setGuiItem( defaultItem );
m_ui->m_buttonDefaultMonthNamePossessive->setGuiItem( defaultItem );
m_ui->m_buttonDefaultDateTimeDigitSet->setGuiItem( defaultItem );
//Other tab
m_ui->m_buttonDefaultPageSize->setGuiItem( defaultItem );
m_ui->m_buttonDefaultMeasureSystem->setGuiItem( defaultItem );
m_ui->m_buttonDefaultBinaryUnitDialect->setGuiItem( defaultItem );
}
void KCMLocale::checkIfChanged()
{
if ( m_userSettings.keyList() != m_currentSettings.keyList() ||
m_userCalendarSettings.keyList() != m_currentCalendarSettings.keyList() ) {
emit changed( true );
} else {
foreach( const QString & key, m_currentSettings.keyList() ) {
if ( m_userSettings.readEntry( key, QString() ) !=
m_currentSettings.readEntry( key, QString() ) ) {
emit changed( true );
return;
}
}
foreach( const QString & key, m_currentCalendarSettings.keyList() ) {
if ( m_userCalendarSettings.readEntry( key, QString() ) !=
m_currentCalendarSettings.readEntry( key, QString() ) ) {
emit changed( true );
return;
}
}
emit changed( false );
}
}
// Determine if the item should be enabled or disabled
void KCMLocale::enableItemWidgets( const QString &itemKey,
KConfigGroup *userSettings, KConfigGroup *kcmSettings, KConfigGroup *defaultSettings,
QWidget *itemWidget, KPushButton *itemDefaultButton )
{
// If the setting is locked down by Kiosk, then don't let the user make any changes
if ( userSettings->isEntryImmutable( itemKey ) ) {
itemWidget->setEnabled( false );
itemDefaultButton->setEnabled( false );
} else {
itemWidget->setEnabled( true );
// If the new value is not the default, then enable the default button
if ( kcmSettings->readEntry( itemKey, QString() ) !=
defaultSettings->readEntry( itemKey, QString() ) ) {
itemDefaultButton->setEnabled( true );
} else {
itemDefaultButton->setEnabled( false );
}
}
}
// Set the value of a QString item in kcm and user settings
void KCMLocale::setItemValue( const QString &itemKey, const QString &itemValue,
KConfigGroup *userSettings, KConfigGroup *kcmSettings, KConfigGroup *defaultSettings )
{
if ( !userSettings->isEntryImmutable( itemKey ) ) {
// Always write to the kcm as the value will always exist there and needs overwriting
kcmSettings->writeEntry( itemKey, itemValue );
// If different to the default save the new value, otherwise delete and use the default
if ( itemValue != defaultSettings->readEntry( itemKey, QString() ) ) {
userSettings->writeEntry( itemKey, itemValue, KConfig::Persistent | KConfig::Global );
} else {
userSettings->deleteEntry( itemKey, KConfig::Persistent | KConfig::Global );
}
}
}
void KCMLocale::setItem( const QString &itemKey, const QString &itemValue,
QWidget *itemWidget, KPushButton *itemDefaultButton )
{
setItemValue( itemKey, itemValue,
&m_userSettings, &m_kcmSettings, &m_defaultSettings);
enableItemWidgets( itemKey,
&m_userSettings, &m_kcmSettings, &m_defaultSettings,
itemWidget, itemDefaultButton );
checkIfChanged();
}
void KCMLocale::setItem( const QString &itemKey, int itemValue,
QWidget *itemWidget, KPushButton *itemDefaultButton )
{
setItem( itemKey, QVariant( itemValue ).toString(), itemWidget, itemDefaultButton );
}
void KCMLocale::setItem( const QString &itemKey, bool itemValue,
QWidget *itemWidget, KPushButton *itemDefaultButton )
{
setItem( itemKey, QVariant( itemValue ).toString(), itemWidget, itemDefaultButton );
}
void KCMLocale::setCalendarItem( const QString &itemKey, const QString &itemValue,
QWidget *itemWidget, KPushButton *itemDefaultButton )
{
setItemValue( itemKey, itemValue,
&m_userCalendarSettings, &m_kcmCalendarSettings, &m_defaultCalendarSettings );
enableItemWidgets( itemKey,
&m_userCalendarSettings, &m_kcmCalendarSettings, &m_defaultCalendarSettings,
itemWidget, itemDefaultButton );
checkIfChanged();
}
void KCMLocale::setCalendarItem( const QString &itemKey, int itemValue,
QWidget *itemWidget, KPushButton *itemDefaultButton )
{
setCalendarItem( itemKey, QVariant( itemValue ).toString(), itemWidget, itemDefaultButton );
}
void KCMLocale::setCalendarItem( const QString &itemKey, bool itemValue,
QWidget *itemWidget, KPushButton *itemDefaultButton )
{
setCalendarItem( itemKey, QVariant( itemValue ).toString(), itemWidget, itemDefaultButton );
}
// Don't use for edit combo's
void KCMLocale::setComboItem( const QString &itemKey, const QString &itemValue,
KComboBox *itemCombo, KPushButton *itemDefaultButton )
{
setItem( itemKey, itemValue, itemCombo, itemDefaultButton );
// Read the entry rather than use itemValue in case setItem didn't change the value, e.g. if immutable
itemCombo->setCurrentIndex( itemCombo->findData( m_kcmSettings.readEntry( itemKey, QString() ) ) );
}
// Don't use for edit combo's
void KCMLocale::setComboItem( const QString &itemKey, int itemValue,
KComboBox *itemCombo, KPushButton *itemDefaultButton )
{
setItem( itemKey, itemValue, itemCombo, itemDefaultButton );
// Read the entry rather than use itemValue in case setItem didn't change the value, e.g. if immutable
itemCombo->setCurrentIndex( itemCombo->findData( m_kcmSettings.readEntry( itemKey, 0 ) ) );
}
// Don't use for user changes as will EOL on the entry
void KCMLocale::setEditComboItem( const QString &itemKey, const QString &itemValue,
KComboBox *itemCombo, KPushButton *itemDefaultButton )
{
setItem( itemKey, itemValue, itemCombo, itemDefaultButton );
// Read the entry rather than use itemValue in case setItem didn't change the value, e.g. if immutable
itemCombo->setEditText( m_kcmSettings.readEntry( itemKey, QString() ) );
}
void KCMLocale::setIntItem( const QString &itemKey, int itemValue,
KIntNumInput *itemInput, KPushButton *itemDefaultButton )
{
setItem( itemKey, itemValue, itemInput, itemDefaultButton );
// Read the entry rather than use itemValue in case setItem didn't change the value, e.g. if immutable
itemInput->setValue( m_kcmSettings.readEntry( itemKey, 0 ) );
}
void KCMLocale::setCheckItem( const QString &itemKey, bool itemValue,
QCheckBox *itemCheck, KPushButton *itemDefaultButton )
{
setItem( itemKey, itemValue, itemCheck, itemDefaultButton );
// Read the entry rather than use itemValue in case setItem didn't change the value, e.g. if immutable
itemCheck->setChecked( m_kcmSettings.readEntry( itemKey, false ) );
}
// Add week day names to a combo
void KCMLocale::initWeekDayCombo( KComboBox *dayCombo )
{
dayCombo->clear();
int daysInWeek = m_kcmLocale->calendar()->daysInWeek( QDate::currentDate() );
for ( int i = 1; i <= daysInWeek; ++i )
{
dayCombo->insertItem( i - 1, m_kcmLocale->calendar()->weekDayName( i ), QVariant( i ) );
}
}
// Add standard separator symbols to a combo
void KCMLocale::initSeparatorCombo( KComboBox *seperatorCombo )
{
seperatorCombo->clear();
seperatorCombo->addItem( ki18nc( "No separator symbol" , "None" ).toString( m_kcmLocale ), QString() );
seperatorCombo->addItem( QString(','), QString(',') );
seperatorCombo->addItem( QString('.'), QString('.') );
seperatorCombo->addItem( ki18nc( "Space separator symbol", "Single Space" ).toString( m_kcmLocale ), QString(' ') );
}
// Generic utility to set up a DigitSet combo, used for numbers, dates
2014-11-15 03:14:34 +02:00
void KCMLocale::initDigitSetCombo( KComboBox *digitSetCombo )
{
digitSetCombo->clear();
QList<KLocale::DigitSet> digitSets = m_kcmLocale->allDigitSetsList();
foreach ( const KLocale::DigitSet &digitSet, digitSets )
{
digitSetCombo->addItem( m_kcmLocale->digitSetToName( digitSet, true ), QVariant( digitSet ) );
}
}
void KCMLocale::insertDigitGroupingItem( KComboBox *digitGroupingCombo,
KSharedConfigPtr groupingConfig, KConfigGroup *groupingSettings,
const QString &digitGroupingKey, const QString &digitGroupingFormat)
{
groupingSettings->writeEntry( digitGroupingKey, digitGroupingFormat );
KLocale *customLocale = new KLocale( QLatin1String("kcmlocale"), groupingConfig );
if ( digitGroupingKey == "DigitGroupFormat" ) {
digitGroupingCombo->addItem( customLocale->formatNumber( 123456789.12 ), digitGroupingFormat );
} else {
Q_ASSERT(false);
2014-11-15 03:14:34 +02:00
}
groupingConfig->markAsClean();
delete customLocale;
}
// Generic utility to set up a Digit Grouping combo, used for numbers
2014-11-15 03:14:34 +02:00
void KCMLocale::initDigitGroupingCombo( KComboBox *digitGroupingCombo, const QString &digitGroupingKey)
{
digitGroupingCombo->clear();
KSharedConfigPtr groupingConfig = KSharedConfig::openConfig( "kcmlocale-grouping", KConfig::SimpleConfig );
KConfigGroup groupingSettings = KConfigGroup( groupingConfig, "Locale" );
copySettings( &m_kcmSettings, &groupingSettings );
insertDigitGroupingItem( digitGroupingCombo, groupingConfig, &groupingSettings, digitGroupingKey, "3" );
insertDigitGroupingItem( digitGroupingCombo, groupingConfig, &groupingSettings, digitGroupingKey, "3;2" );
insertDigitGroupingItem( digitGroupingCombo, groupingConfig, &groupingSettings, digitGroupingKey, "4" );
insertDigitGroupingItem( digitGroupingCombo, groupingConfig, &groupingSettings, digitGroupingKey, "-1" );
}
void KCMLocale::initTabs()
{
m_ui->m_tabWidgetSettings->setTabText( 0, ki18n( "Country" ).toString( m_kcmLocale ) );
m_ui->m_tabWidgetSettings->setTabText( 1, ki18n( "Languages" ).toString( m_kcmLocale ) );
m_ui->m_tabWidgetSettings->setTabText( 2, ki18n( "Numbers" ).toString( m_kcmLocale ) );
m_ui->m_tabWidgetSettings->setTabText( 3, ki18n( "Calendar" ).toString( m_kcmLocale ) );
m_ui->m_tabWidgetSettings->setTabText( 4, ki18n( "Date && Time" ).toString( m_kcmLocale ) );
m_ui->m_tabWidgetSettings->setTabText( 5, ki18n( "Other" ).toString( m_kcmLocale ) );
2014-11-15 03:14:34 +02:00
}
void KCMLocale::initSample()
{
m_ui->m_labelNumbersSample->setText( ki18n( "Numbers:" ).toString( m_kcmLocale ) );
QString helpText = ki18n( "This is how positive numbers will be displayed.").toString( m_kcmLocale );
m_ui->m_textNumbersPositiveSample->setToolTip( helpText );
m_ui->m_textNumbersPositiveSample->setWhatsThis( helpText );
helpText = ki18n( "This is how negative numbers will be displayed.").toString( m_kcmLocale );
m_ui->m_textNumbersNegativeSample->setToolTip( helpText );
m_ui->m_textNumbersNegativeSample->setWhatsThis( helpText );
m_ui->m_labelDateSample->setText( ki18n( "Date:" ).toString( m_kcmLocale ) );
helpText = ki18n( "This is how long dates will be displayed.").toString( m_kcmLocale );
m_ui->m_textDateSample->setToolTip( helpText );
m_ui->m_textDateSample->setWhatsThis( helpText );
m_ui->m_labelShortDateSample->setText( ki18n( "Short date:" ).toString( m_kcmLocale ) );
helpText = ki18n( "This is how short dates will be displayed.").toString( m_kcmLocale );
m_ui->m_textShortDateSample->setToolTip( helpText );
m_ui->m_textShortDateSample->setWhatsThis( helpText );
m_ui->m_labelTimeSample->setText( ki18n( "Time:" ).toString( m_kcmLocale ) );
helpText = ki18n( "This is how time will be displayed.").toString( m_kcmLocale );
m_ui->m_textTimeSample->setToolTip( helpText );
m_ui->m_textTimeSample->setWhatsThis( helpText );
QTimer *timer = new QTimer( this );
timer->setObjectName( QLatin1String( "clock_timer" ) );
connect( timer, SIGNAL( timeout() ), this, SLOT( updateSample() ) );
timer->start( 1000 );
}
void KCMLocale::updateSample()
{
m_ui->m_textNumbersPositiveSample->setText( m_kcmLocale->formatNumber( 123456789.12 ) );
m_ui->m_textNumbersNegativeSample->setText( m_kcmLocale->formatNumber( -123456789.12 ) );
KDateTime dateTime = KDateTime::currentLocalDateTime();
m_ui->m_textDateSample->setText( m_kcmLocale->formatDate( dateTime.date(), KLocale::LongDate ) );
m_ui->m_textShortDateSample->setText( m_kcmLocale->formatDate( dateTime.date(), KLocale::ShortDate ) );
m_ui->m_textTimeSample->setText( m_kcmLocale->formatTime( dateTime.time(), true ) );
}
void KCMLocale::initCountry()
{
m_ui->m_comboCountry->blockSignals( true );
m_ui->m_labelCountry->setText( ki18n( "Country:" ).toString( m_kcmLocale ) );
QString helpText = ki18n( "<p>This is the country where you live. The KDE Workspace will use "
"the settings for this country or region.</p>" ).toString( m_kcmLocale );
m_ui->m_comboCountry->setToolTip( helpText );
m_ui->m_comboCountry->setWhatsThis( helpText );
m_ui->m_comboCountry->clear();
QStringList countryCodes = m_kcmLocale->allCountriesList();
countryCodes.removeDuplicates();
QMap<QString, QString> countryNames;
foreach ( const QString &countryCode, countryCodes ) {
countryNames.insert( m_kcmLocale->countryCodeToName( countryCode ), countryCode );
}
QString systemCountryName = m_kcmLocale->countryCodeToName( m_systemCountry );
QString systemCountry = ki18nc( "%1 is the system country name", "System Country (%1)" ).subs( systemCountryName ).toString( m_kcmLocale );
m_ui->m_comboCountry->addItem( systemCountry , QString() );
QString defaultLocale = ki18n( "No Country (Default Settings)" ).toString( m_kcmLocale );
m_ui->m_comboCountry->addItem( defaultLocale , "C" );
QMapIterator<QString, QString> it( countryNames );
while ( it.hasNext() ) {
it.next();
KIcon flag( KStandardDirs::locate( "locale", QString::fromLatin1( "l10n/%1/flag.png" ).arg( it.value() ) ) );
m_ui->m_comboCountry->addItem( flag, it.key(), it.value() );
}
setCountry( m_kcmSettings.readEntry( "Country", QString() ) );
m_ui->m_comboCountry->blockSignals( false );
}
void KCMLocale::defaultCountry()
{
setCountry( m_defaultSettings.readEntry( "Country", QString() ) );
}
void KCMLocale::changedCountryIndex( int index )
{
m_ui->m_comboCountry->blockSignals( true );
setCountry( m_ui->m_comboCountry->itemData( index ).toString() );
initCountrySettings( m_kcmSettings.readEntry( "Country", QString() ) );
mergeSettings();
m_ui->m_comboCountry->blockSignals( false );
initSettingsWidgets();
}
void KCMLocale::setCountry( const QString &newValue )
{
setComboItem( "Country", newValue,
m_ui->m_comboCountry, m_ui->m_buttonDefaultCountry );
}
void KCMLocale::initTranslations()
{
m_ui->m_selectTranslations->blockSignals( true );
m_ui->m_selectTranslations->setAvailableLabel( ki18n( "Available Languages:" ).toString( m_kcmLocale ) );
QString availableHelp = ki18n( "<p>This is the list of installed KDE Workspace 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_kcmLocale );
m_ui->m_selectTranslations->availableListWidget()->setToolTip( availableHelp );
m_ui->m_selectTranslations->availableListWidget()->setWhatsThis( availableHelp );
m_ui->m_selectTranslations->setSelectedLabel( ki18n( "Preferred Languages:" ).toString( m_kcmLocale ) );
QString selectedHelp = ki18n( "<p>This is the list of installed KDE Workspace 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_kcmLocale );
m_ui->m_selectTranslations->selectedListWidget()->setToolTip( selectedHelp );
m_ui->m_selectTranslations->selectedListWidget()->setWhatsThis( selectedHelp );
// 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() );
listItem->setText( m_kcmLocale->languageCodeToName( languageCode ) );
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() );
listItem->setText( m_kcmLocale->languageCodeToName( languageCode ) );
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 );
}
enableItemWidgets( "Language",
&m_userSettings, &m_kcmSettings, &m_defaultSettings,
m_ui->m_selectTranslations, m_ui->m_buttonDefaultTranslations );
m_ui->m_selectTranslations->blockSignals( false );
}
void KCMLocale::defaultTranslations()
{
setTranslations( m_defaultSettings.readEntry( "Language", QString() ) );
}
void KCMLocale::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 KCMLocale::changedTranslationsSelected( QListWidgetItem *item )
{
Q_UNUSED( item );
int row = m_ui->m_selectTranslations->selectedListWidget()->currentRow();
changedTranslations();
m_ui->m_selectTranslations->selectedListWidget()->setCurrentRow( row );
}
void KCMLocale::changedTranslations()
{
// Read the list of all Selected translations from the selector widget
QStringList selectedTranslations;
for ( int i = 0; i < m_ui->m_selectTranslations->selectedListWidget()->count(); ++i ) {
selectedTranslations.append( m_ui->m_selectTranslations->selectedListWidget()->item( i )->data( Qt::UserRole ).toString() );
}
setTranslations( selectedTranslations.join( ":" ) );
}
void KCMLocale::setTranslations( const QString &newValue )
{
setItem( "Language", newValue, m_ui->m_selectTranslations, m_ui->m_buttonDefaultTranslations );
// Create the kcm translations list
m_kcmTranslations.clear();
m_kcmTranslations = m_kcmSettings.readEntry( "Language", QString() ).split( ':', QString::SkipEmptyParts );
m_kcmLocale->setLanguage( m_kcmTranslations );
// Do merge again as may be localized settings that need to be reloaded
mergeSettings();
initAllWidgets();
}
void KCMLocale::initNumericDigitGrouping()
{
m_ui->m_comboNumericDigitGrouping->blockSignals( true );
m_ui->m_labelNumericDigitGrouping->setText( ki18n( "Digit grouping:" ).toString( m_kcmLocale ) );
QString helpText = ki18n( "<p>Here you can define the digit grouping used to display "
"numbers.</p>" ).toString( m_kcmLocale );
2014-11-15 03:14:34 +02:00
m_ui->m_comboNumericDigitGrouping->setToolTip( helpText );
m_ui->m_comboNumericDigitGrouping->setWhatsThis( helpText );
initDigitGroupingCombo( m_ui->m_comboNumericDigitGrouping, "DigitGroupFormat" );
setNumericDigitGrouping( m_kcmSettings.readEntry( "DigitGroupFormat", "3" ) );
m_ui->m_comboNumericDigitGrouping->blockSignals( false );
updateSample();
}
void KCMLocale::defaultNumericDigitGrouping()
{
setNumericDigitGrouping( m_defaultSettings.readEntry( "DigitGroupFormat", "3" ) );
}
void KCMLocale::changedNumericDigitGroupingIndex( int index )
{
setNumericDigitGrouping( m_ui->m_comboNumericDigitGrouping->itemData( index ).toString() );
}
void KCMLocale::setNumericDigitGrouping( const QString &newValue )
{
setComboItem( "DigitGroupFormat", newValue,
m_ui->m_comboNumericDigitGrouping, m_ui->m_buttonDefaultNumericDigitGrouping );
// No api to set, so need to force reload the locale
m_kcmConfig->markAsClean();
m_kcmLocale->setCountry( m_kcmSettings.readEntry( "Country", QString() ), m_kcmConfig.data() );
updateSample();
}
void KCMLocale::initNumericThousandsSeparator()
{
m_ui->m_comboThousandsSeparator->blockSignals( true );
m_ui->m_labelThousandsSeparator->setText( ki18n( "Group separator:" ).toString( m_kcmLocale ) );
QString helpText = ki18n( "<p>Here you can define the digit group separator used to display "
"numbers.</p>" ).toString( m_kcmLocale );
2014-11-15 03:14:34 +02:00
m_ui->m_comboThousandsSeparator->setToolTip( helpText );
m_ui->m_comboThousandsSeparator->setWhatsThis( helpText );
initSeparatorCombo( m_ui->m_comboThousandsSeparator );
setNumericThousandsSeparator( m_kcmSettings.readEntry( "ThousandsSeparator", QString() )
.remove( QString::fromLatin1("$0") ) );
m_ui->m_comboThousandsSeparator->blockSignals( false );
}
void KCMLocale::defaultNumericThousandsSeparator()
{
setNumericThousandsSeparator( m_defaultSettings.readEntry( "ThousandsSeparator", QString() )
.remove( QString::fromLatin1("$0") ) );
}
// Change in response to user input, doesn't set edit text as causes cursor to EOL
void KCMLocale::changedNumericThousandsSeparator( const QString &newValue )
{
QString useValue = newValue;
int item = m_ui->m_comboThousandsSeparator->findText( newValue );
if ( item >= 0 ) {
useValue = m_ui->m_comboThousandsSeparator->itemData( item ).toString();
m_ui->m_comboThousandsSeparator->setEditText( useValue );
}
if ( useValue == QString(' ') ) {
useValue = "$0 $0";
}
setItem( "ThousandsSeparator", useValue,
m_ui->m_comboThousandsSeparator, m_ui->m_buttonDefaultThousandsSeparator );
m_kcmLocale->setThousandsSeparator( m_kcmSettings.readEntry( "ThousandsSeparator", QString() )
.remove( QString::fromLatin1("$0") ) );
// Update the numeric format samples to relect new setting
initNumericDigitGrouping();
}
// Change programatically, does set edit text so user can see it
void KCMLocale::setNumericThousandsSeparator( const QString &newValue )
{
changedNumericThousandsSeparator( newValue );
m_ui->m_comboThousandsSeparator->setEditText( m_kcmSettings.readEntry( "ThousandsSeparator", QString() )
.remove( QString::fromLatin1("$0") ) );
// Update the numeric format samples to relect new setting
initNumericDigitGrouping();
}
void KCMLocale::initNumericDecimalSymbol()
{
m_ui->m_comboDecimalSymbol->blockSignals( true );
m_ui->m_labelDecimalSymbol->setText( ki18n( "Decimal separator:" ).toString( m_kcmLocale ) );
QString helpText = ki18n( "<p>Here you can define the decimal separator used to display "
"numbers (i.e. a dot or a comma in most countries).</p>" ).toString( m_kcmLocale );
2014-11-15 03:14:34 +02:00
m_ui->m_comboDecimalSymbol->setToolTip( helpText );
m_ui->m_comboDecimalSymbol->setWhatsThis( helpText );
initSeparatorCombo( m_ui->m_comboDecimalSymbol );
setNumericDecimalSymbol( m_kcmSettings.readEntry( "DecimalSymbol", QString() ) );
m_ui->m_comboDecimalSymbol->blockSignals( false );
}
void KCMLocale::defaultNumericDecimalSymbol()
{
setNumericDecimalSymbol( m_defaultSettings.readEntry( "DecimalSymbol", QString() ) );
}
// Change in response to user input, doesn't set edit text as causes cursor to EOL
void KCMLocale::changedNumericDecimalSymbol( const QString &newValue )
{
QString useValue = newValue;
int item = m_ui->m_comboDecimalSymbol->findText( newValue );
if ( item >= 0 ) {
useValue = m_ui->m_comboDecimalSymbol->itemData( item ).toString();
}
setItem( "DecimalSymbol", useValue,
m_ui->m_comboDecimalSymbol, m_ui->m_buttonDefaultDecimalSymbol );
m_kcmLocale->setDecimalSymbol( m_kcmSettings.readEntry( "DecimalSymbol", QString() ) );
// Update the numeric format samples to relect new setting
initNumericDigitGrouping();
}
// Change programatically, does set edit text so user can see it
void KCMLocale::setNumericDecimalSymbol( const QString &newValue )
{
setEditComboItem( "DecimalSymbol", newValue,
m_ui->m_comboDecimalSymbol, m_ui->m_buttonDefaultDecimalSymbol );
m_kcmLocale->setDecimalSymbol( m_kcmSettings.readEntry( "DecimalSymbol", QString() ) );
// Update the numeric format samples to relect new setting
initNumericDigitGrouping();
}
void KCMLocale::initNumericDecimalPlaces()
{
m_ui->m_intDecimalPlaces->blockSignals( true );
m_ui->m_labelDecimalPlaces->setText( ki18n( "Decimal places:" ).toString( m_kcmLocale ) );
QString helpText = ki18n( "<p>Here you can set the number of decimal places displayed for "
"numeric values, i.e. the number of digits <em>after</em> the "
"decimal separator.</p>" ).toString( m_kcmLocale );
2014-11-15 03:14:34 +02:00
m_ui->m_intDecimalPlaces->setToolTip( helpText );
m_ui->m_intDecimalPlaces->setWhatsThis( helpText );
setNumericDecimalPlaces( m_kcmSettings.readEntry( "DecimalPlaces", 0 ) );
m_ui->m_intDecimalPlaces->blockSignals( false );
}
void KCMLocale::defaultNumericDecimalPlaces()
{
setNumericDecimalPlaces( m_defaultSettings.readEntry( "DecimalPlaces", 0 ) );
}
void KCMLocale::changedNumericDecimalPlaces( int newValue )
{
setNumericDecimalPlaces( newValue );
}
void KCMLocale::setNumericDecimalPlaces( int newValue )
{
setIntItem( "DecimalPlaces", newValue,
m_ui->m_intDecimalPlaces, m_ui->m_buttonDefaultDecimalPlaces );
m_kcmLocale->setDecimalPlaces( m_kcmSettings.readEntry( "DecimalPlaces", 0 ) );
// Update the numeric format samples to relect new setting
initNumericDigitGrouping();
}
void KCMLocale::initNumericPositiveSign()
{
m_ui->m_comboPositiveSign->blockSignals( true );
m_ui->m_labelPositiveFormat->setText( ki18n( "Positive sign:" ).toString( m_kcmLocale ) );
QString helpText = ki18n( "<p>Here you can specify text used to prefix positive numbers. "
"Most locales leave this blank.</p>" ).toString( m_kcmLocale );
2014-11-15 03:14:34 +02:00
m_ui->m_comboPositiveSign->setToolTip( helpText );
m_ui->m_comboPositiveSign->setWhatsThis( helpText );
m_ui->m_comboPositiveSign->clear();
m_ui->m_comboPositiveSign->addItem( ki18nc( "No positive symbol", "None" ).toString( m_kcmLocale ), QString() );
m_ui->m_comboPositiveSign->addItem( QString('+'), QString('+') );
setNumericPositiveSign( m_kcmSettings.readEntry( "PositiveSign", QString() ) );
m_ui->m_comboPositiveSign->blockSignals( false );
}
void KCMLocale::defaultNumericPositiveSign()
{
setNumericPositiveSign( m_defaultSettings.readEntry( "PositiveSign", QString() ) );
}
// Change in response to user input, doesn't set edit text as causes cursor to EOL
void KCMLocale::changedNumericPositiveSign( const QString &newValue )
{
QString useValue = newValue;
int item = m_ui->m_comboPositiveSign->findText( newValue );
if ( item >= 0 ) {
useValue = m_ui->m_comboPositiveSign->itemData( item ).toString();
}
setItem( "PositiveSign", useValue,
m_ui->m_comboPositiveSign, m_ui->m_buttonDefaultPositiveSign );
m_kcmLocale->setPositiveSign( m_kcmSettings.readEntry( "PositiveSign", QString() ) );
// Update the format samples to relect new setting
initNumericDigitGrouping();
}
// Change programatically, does set edit text so user can see it
void KCMLocale::setNumericPositiveSign( const QString &newValue )
{
setEditComboItem( "PositiveSign", newValue,
m_ui->m_comboPositiveSign, m_ui->m_buttonDefaultPositiveSign );
m_kcmLocale->setPositiveSign( m_kcmSettings.readEntry( "PositiveSign", QString() ) );
// Update the format samples to relect new setting
initNumericDigitGrouping();
}
void KCMLocale::initNumericNegativeSign()
{
m_ui->m_comboNegativeSign->blockSignals( true );
m_ui->m_labelNegativeFormat->setText( ki18n( "Negative sign:" ).toString( m_kcmLocale ) );
QString helpText = ki18n( "<p>Here you can specify text used to prefix negative numbers. "
"This should not be empty, so you can distinguish positive and "
"negative numbers. It is normally set to minus (-).</p>" ).toString( m_kcmLocale );
2014-11-15 03:14:34 +02:00
m_ui->m_comboNegativeSign->setToolTip( helpText );
m_ui->m_comboNegativeSign->setWhatsThis( helpText );
m_ui->m_comboNegativeSign->clear();
m_ui->m_comboNegativeSign->addItem( ki18nc("No negative symbol", "None" ).toString( m_kcmLocale ), QString() );
m_ui->m_comboNegativeSign->addItem( QString('-'), QString('-') );
setNumericNegativeSign( m_kcmSettings.readEntry( "NegativeSign", QString() ) );
m_ui->m_comboNegativeSign->blockSignals( false );
}
void KCMLocale::defaultNumericNegativeSign()
{
setNumericNegativeSign( m_defaultSettings.readEntry( "NegativeSign", QString() ) );
}
// Change in response to user input, doesn't set edit text as causes cursor to EOL
void KCMLocale::changedNumericNegativeSign( const QString &newValue )
{
QString useValue = newValue;
int item = m_ui->m_comboNegativeSign->findText( newValue );
if ( item >= 0 ) {
useValue = m_ui->m_comboNegativeSign->itemData( item ).toString();
}
setItem( "NegativeSign", useValue,
m_ui->m_comboNegativeSign, m_ui->m_buttonDefaultNegativeSign );
m_kcmLocale->setNegativeSign( m_kcmSettings.readEntry( "NegativeSign", QString() ) );
}
// Change programatically, does set edit text so user can see it
void KCMLocale::setNumericNegativeSign( const QString &newValue )
{
setEditComboItem( "NegativeSign", newValue,
m_ui->m_comboNegativeSign, m_ui->m_buttonDefaultNegativeSign );
m_kcmLocale->setNegativeSign( m_kcmSettings.readEntry( "NegativeSign", QString() ) );
}
void KCMLocale::initNumericDigitSet()
{
m_ui->m_comboDigitSet->blockSignals( true );
m_ui->m_labelDigitSet->setText( ki18n( "Digit set:" ).toString( m_kcmLocale ) );
QString helpText = ki18n( "<p>Here you can define the set of digits used to display numbers. "
"If digits other than Arabic are selected, they will appear only if "
"used in the language of the application or the piece of text where "
"the number is shown.</p>" ).toString( m_kcmLocale );
2014-11-15 03:14:34 +02:00
m_ui->m_comboDigitSet->setToolTip( helpText );
m_ui->m_comboDigitSet->setWhatsThis( helpText );
initDigitSetCombo( m_ui->m_comboDigitSet );
setNumericDigitSet( m_kcmSettings.readEntry( "DigitSet", 0 ) );
m_ui->m_comboDigitSet->blockSignals( false );
}
void KCMLocale::defaultNumericDigitSet()
{
setNumericDigitSet( m_defaultSettings.readEntry( "DigitSet", 0 ) );
}
void KCMLocale::changedNumericDigitSetIndex( int index )
{
setNumericDigitSet( m_ui->m_comboDigitSet->itemData( index ).toInt() );
}
void KCMLocale::setNumericDigitSet( int newValue )
{
setComboItem( "DigitSet", newValue,
m_ui->m_comboDigitSet, m_ui->m_buttonDefaultDigitSet );
m_kcmLocale->setDigitSet( (KLocale::DigitSet) m_kcmSettings.readEntry( "DigitSet", 0 ) );
// Update the numeric format samples to relect new setting
initNumericDigitGrouping();
}
void KCMLocale::initCalendarSystem()
{
m_ui->m_comboCalendarSystem->blockSignals( true );
m_ui->m_labelCalendarSystem->setText( ki18n( "Calendar system:" ).toString( m_kcmLocale ) );
QString helpText = ki18n( "<p>Here you can set the Calendar System to use to display dates.</p>" ).toString( m_kcmLocale );
m_ui->m_comboCalendarSystem->setToolTip( helpText );
m_ui->m_comboCalendarSystem->setWhatsThis( helpText );
m_ui->m_comboCalendarSystem->clear();
QList<KLocale::CalendarSystem> calendarSystems = KCalendarSystem::calendarSystemsList();
2014-11-15 03:14:34 +02:00
foreach ( const KLocale::CalendarSystem &calendarType, calendarSystems ) {
m_ui->m_comboCalendarSystem->addItem( KCalendarSystem::calendarLabel(calendarType , m_kcmLocale ),
2014-11-15 03:14:34 +02:00
QVariant( calendarType ) );
}
setCalendarSystem( m_kcmSettings.readEntry( "CalendarSystem", QString() ) );
m_ui->m_comboCalendarSystem->blockSignals( false );
}
void KCMLocale::defaultCalendarSystem()
{
setCalendarSystem( m_defaultSettings.readEntry( "CalendarSystem", QString() ) );
}
void KCMLocale::changedCalendarSystemIndex( int index )
{
setCalendarSystem( m_ui->m_comboCalendarSystem->itemData( index ).toString() );
}
void KCMLocale::setCalendarSystem( const QString &newValue )
{
setComboItem( "CalendarSystem", newValue,
m_ui->m_comboCalendarSystem, m_ui->m_buttonDefaultCalendarSystem );
// Load the correct settings group for the new calendar
initCalendarSettings();
mergeCalendarSettings();
// If item was changed, i.e. not immutable, then update locale
m_kcmLocale->setCalendar( m_kcmSettings.readEntry( "CalendarSystem", QString() ) );
// Update the Calendar dependent widgets with the new Calendar System details
initUseCommonEra();
initShortYearWindow();
initWeekNumberSystem();
initWeekStartDay();
updateSample();
}
void KCMLocale::initUseCommonEra()
{
m_ui->m_checkCalendarGregorianUseCommonEra->blockSignals( true );
m_ui->m_checkCalendarGregorianUseCommonEra->setText( ki18n( "Use Common Era" ).toString( m_kcmLocale ) );
QString helpText = ki18n( "<p>This option determines if the Common Era (CE/BCE) should be used "
"instead of the Christian Era (AD/BC).</p>" ).toString( m_kcmLocale );
m_ui->m_checkCalendarGregorianUseCommonEra->setToolTip( helpText );
m_ui->m_checkCalendarGregorianUseCommonEra->setWhatsThis( helpText );
QString calendarType = m_kcmSettings.readEntry( "CalendarSystem", QString() );
if ( calendarType == "gregorian" || calendarType == "gregorian-proleptic" ) {
setUseCommonEra( m_kcmCalendarSettings.readEntry( "UseCommonEra", false ) );
} else {
setUseCommonEra( false );
m_ui->m_checkCalendarGregorianUseCommonEra->setEnabled( false );
m_ui->m_buttonDefaultCalendarGregorianUseCommonEra->setEnabled( false );
}
m_ui->m_checkCalendarGregorianUseCommonEra->blockSignals( false );
}
void KCMLocale::defaultUseCommonEra()
{
setUseCommonEra( m_defaultCalendarSettings.readEntry( "UseCommonEra", false ) );
}
void KCMLocale::changedUseCommonEra( bool newValue )
{
setUseCommonEra( newValue );
}
void KCMLocale::setUseCommonEra( bool newValue )
{
setCalendarItem( "UseCommonEra", newValue,
m_ui->m_checkCalendarGregorianUseCommonEra, m_ui->m_buttonDefaultCalendarGregorianUseCommonEra );
m_ui->m_checkCalendarGregorianUseCommonEra->setChecked( m_kcmCalendarSettings.readEntry( "UseCommonEra", false ) );
// No api to set, so need to force reload the locale
m_kcmConfig->markAsClean();
m_kcmLocale->setCountry( m_kcmSettings.readEntry( "Country", QString() ), m_kcmConfig.data() );
m_kcmLocale->setCalendar( m_kcmSettings.readEntry( "CalendarSystem", QString() ) );
}
void KCMLocale::initShortYearWindow()
{
m_ui->m_intShortYearWindowStartYear->blockSignals( true );
m_ui->m_labelShortYearWindow->setText( ki18n( "Short year window:" ).toString( m_kcmLocale ) );
m_ui->m_labelShortYearWindowTo->setText( ki18nc( "label between two year inputs, i.e. 1930 to 2029", "to" ).toString( m_kcmLocale ) );
QString helpText = ki18n( "<p>This option determines what year range a two digit date is "
"interpreted as, for example with a range of 1950 to 2049 the "
"value 10 is interpreted as 2010. This range is only applied when "
"reading the Short Year (YY) date format.</p>" ).toString( m_kcmLocale );
m_ui->m_intShortYearWindowStartYear->setToolTip( helpText );
m_ui->m_intShortYearWindowStartYear->setWhatsThis( helpText );
m_ui->m_spinShortYearWindowEndYear->setToolTip( helpText );
m_ui->m_spinShortYearWindowEndYear->setWhatsThis( helpText );
setShortYearWindow( m_kcmCalendarSettings.readEntry( "ShortYearWindowStartYear", 0 ) );
m_ui->m_intShortYearWindowStartYear->blockSignals( false );
}
void KCMLocale::defaultShortYearWindow()
{
setShortYearWindow( m_defaultCalendarSettings.readEntry( "ShortYearWindowStartYear", 0 ) );
}
void KCMLocale::changedShortYearWindow( int newValue )
{
setShortYearWindow( newValue );
}
void KCMLocale::setShortYearWindow( int newValue )
{
setCalendarItem( "ShortYearWindowStartYear", newValue,
m_ui->m_intShortYearWindowStartYear, m_ui->m_buttonDefaultShortYearWindow );
int startYear = m_kcmCalendarSettings.readEntry( "ShortYearWindowStartYear", 0 );
m_ui->m_intShortYearWindowStartYear->setValue( startYear );
m_ui->m_spinShortYearWindowEndYear->setValue( startYear + 99 );
// No api to set, so need to force reload the locale and calendar
m_kcmConfig->markAsClean();
m_kcmLocale->setCountry( m_kcmSettings.readEntry( "Country", QString() ), m_kcmConfig.data() );
m_kcmLocale->setCalendar( m_kcmSettings.readEntry( "CalendarSystem", QString() ) );
}
void KCMLocale::initWeekNumberSystem()
{
m_ui->m_comboWeekNumberSystem->blockSignals( true );
m_ui->m_labelWeekNumberSystem->setText( ki18n( "Week number system:" ).toString( m_kcmLocale ) );
QString helpText = ki18n( "<p>This option determines how the Week Number will be calculated. "
"There are four options available:</p> "
"<ul>"
"<li><b>ISO Week</b> Use the ISO standard Week Number. This will always "
"use Monday as the first day of the ISO week. This is the most commonly "
"used system.</li>"
"<li><b>Full First Week</b> The first week of the year starts on the "
"first occurrence of the <i>First day of the week</i>, and lasts for "
"seven days. Any days before Week 1 are considered part of the last "
"week of the previous year. This system is most commonly used in the "
"USA.</li>"
"<li><b>Partial First Week</b> The first week starts on the first day "
"of the year. The second week of the year starts on the first "
"occurrence of the <i>First day of the week</i>, and lasts for "
"seven days. The first week may not contain seven days.</li>"
"<li><b>Simple Week</b> The first week starts on the first day of the "
"year and lasts seven days, with all new weeks starting on the same "
"weekday as the first day of the year.</li>"
"</ul>"
).toString( m_kcmLocale );
m_ui->m_comboWeekNumberSystem->setToolTip( helpText );
m_ui->m_comboWeekNumberSystem->setWhatsThis( helpText );
m_ui->m_comboWeekNumberSystem->clear();
m_ui->m_comboWeekNumberSystem->addItem( ki18n( "ISO Week" ).toString( m_kcmLocale ),
QVariant( KLocale::IsoWeekNumber ) );
m_ui->m_comboWeekNumberSystem->addItem( ki18n( "Full First Week" ).toString( m_kcmLocale ),
QVariant( KLocale::FirstFullWeek ) );
m_ui->m_comboWeekNumberSystem->addItem( ki18n( "Partial First Week" ).toString( m_kcmLocale ),
QVariant( KLocale::FirstPartialWeek ) );
m_ui->m_comboWeekNumberSystem->addItem( ki18n( "Simple Week" ).toString( m_kcmLocale ),
QVariant( KLocale::SimpleWeek ) );
setWeekNumberSystem( (KLocale::WeekNumberSystem) m_kcmSettings.readEntry( "WeekNumberSystem", 0 ) );
m_ui->m_comboWeekNumberSystem->blockSignals( false );
}
void KCMLocale::defaultWeekNumberSystem()
{
setWeekNumberSystem( m_defaultSettings.readEntry( "WeekNumberSystem", 0 ) );
}
void KCMLocale::changedWeekNumberSystemIndex( int index )
{
setWeekNumberSystem( m_ui->m_comboWeekNumberSystem->itemData( index ).toInt() );
}
void KCMLocale::setWeekNumberSystem( int newValue )
{
setComboItem( "WeekNumberSystem", newValue,
m_ui->m_comboWeekNumberSystem, m_ui->m_buttonDefaultWeekNumberSystem );
m_kcmLocale->setWeekNumberSystem( (KLocale::WeekNumberSystem) m_kcmSettings.readEntry( "WeekNumberSystem", 0 ) );
}
void KCMLocale::initWeekStartDay()
{
m_ui->m_comboWeekStartDay->blockSignals( true );
m_ui->m_labelWeekStartDay->setText( ki18n( "First day of week:" ).toString( m_kcmLocale ) );
QString helpText = ki18n( "<p>This option determines which day will be considered as the first "
"one of the week. This value may affect the Week Number System.</p> "
).toString( m_kcmLocale );
m_ui->m_comboWeekStartDay->setToolTip( helpText );
m_ui->m_comboWeekStartDay->setWhatsThis( helpText );
initWeekDayCombo( m_ui->m_comboWeekStartDay );
setWeekStartDay( m_kcmSettings.readEntry( "WeekStartDay", 0 ) );
m_ui->m_comboWeekStartDay->blockSignals( false );
}
void KCMLocale::defaultWeekStartDay()
{
setWeekStartDay( m_defaultSettings.readEntry( "WeekStartDay", 0 ) );
}
void KCMLocale::changedWeekStartDayIndex( int index )
{
setWeekStartDay( m_ui->m_comboWeekStartDay->itemData( index ).toInt() );
}
void KCMLocale::setWeekStartDay( int newValue )
{
setComboItem( "WeekStartDay", newValue,
m_ui->m_comboWeekStartDay, m_ui->m_buttonDefaultWeekStartDay );
m_kcmLocale->setWeekStartDay( m_kcmSettings.readEntry( "WeekStartDay", 0 ) );
}
void KCMLocale::initTimeFormat()
{
m_ui->m_comboTimeFormat->blockSignals( true );
m_ui->m_labelTimeFormat->setText( ki18n( "Time format:" ).toString( m_kcmLocale ) );
QString helpText = ki18n( "<p>The text in this textbox will be used to format time strings. "
"The sequences below will be replaced:</p>"
"<table>"
"<tr><td><b>HH</b></td>"
"<td>The hour as a decimal number using a 24-hour clock (00-23).</td></tr>"
"<tr><td><b>hH</b></td>"
"<td>The hour (24-hour clock) as a decimal number (0-23).</td></tr>"
"<tr><td><b>PH</b></td>"
"<td>The hour as a decimal number using a 12-hour clock (01-12).</td></tr>"
"<tr><td><b>pH</b></td>"
"<td>The hour (12-hour clock) as a decimal number (1-12).</td></tr>"
"<tr><td><b>MM</b></td>"
"<td>The minutes as a decimal number (00-59).</td></tr>"
"<tr><td><b>SS</b></td>"
"<td>The seconds as a decimal number (00-59).</td></tr>"
"<tr><td><b>AMPM</b></td>"
"<td>Either 'AM' or 'PM' according to the given time value. "
"Noon is treated as 'PM' and midnight as 'AM'.</td></tr>"
"</table>" ).toString( m_kcmLocale );
m_ui->m_comboTimeFormat->setToolTip( helpText );
m_ui->m_comboTimeFormat->setWhatsThis( helpText );
m_timeFormatMap.clear();
m_timeFormatMap.insert( QString( 'H' ), ki18n( "HH" ).toString( m_kcmLocale ) );
m_timeFormatMap.insert( QString( 'k' ), ki18n( "hH" ).toString( m_kcmLocale ) );
m_timeFormatMap.insert( QString( 'I' ), ki18n( "PH" ).toString( m_kcmLocale ) );
m_timeFormatMap.insert( QString( 'l' ), ki18n( "pH" ).toString( m_kcmLocale ) );
m_timeFormatMap.insert( QString( 'M' ), ki18nc( "Minute", "MM" ).toString( m_kcmLocale ) );
m_timeFormatMap.insert( QString( 'S' ), ki18n( "SS" ).toString( m_kcmLocale ) );
m_timeFormatMap.insert( QString( 'p' ), ki18n( "AMPM" ).toString( m_kcmLocale ) );
QStringList formatList;
QString cValue = m_cSettings.readEntry( "TimeFormat", QString() );
formatList.append( posixToUserTime( m_kcmSettings.readEntry( "TimeFormat", cValue ) ) );
formatList.append( posixToUserTime( m_defaultSettings.readEntry( "TimeFormat", cValue ) ) );
formatList.append( posixToUserTime( m_countrySettings.readEntry( "TimeFormat", cValue ) ) );
formatList.append( posixToUserTime( cValue ) );
// TODO convert these to POSIX and US format!
QString formats =ki18nc( "some reasonable time formats for the language",
"HH:MM:SS\n"
"pH:MM:SS AMPM").toString( m_kcmLocale );
formatList.append( formats.split( QString::fromLatin1("\n") ) );
formatList.removeDuplicates();
m_ui->m_comboTimeFormat->clear();
m_ui->m_comboTimeFormat->addItems( formatList );
setTimeFormat( m_kcmSettings.readEntry( "TimeFormat", QString() ) );
m_ui->m_comboTimeFormat->blockSignals( false );
}
void KCMLocale::defaultTimeFormat()
{
setTimeFormat( m_defaultSettings.readEntry( "TimeFormat", QString() ) );
}
void KCMLocale::changedTimeFormat( const QString &newValue )
{
setItem( "TimeFormat", userToPosixTime( newValue ),
m_ui->m_comboTimeFormat, m_ui->m_buttonDefaultTimeFormat );
m_kcmLocale->setTimeFormat( m_kcmSettings.readEntry( "TimeFormat", QString() ) );
updateSample();
}
void KCMLocale::setTimeFormat( const QString &newValue )
{
setItem( "TimeFormat", newValue,
m_ui->m_comboTimeFormat, m_ui->m_buttonDefaultTimeFormat );
QString value = m_kcmSettings.readEntry( "TimeFormat", QString() );
m_ui->m_comboTimeFormat->setEditText( posixToUserTime( value ) );
m_kcmLocale->setTimeFormat( value );
updateSample();
}
QString KCMLocale::dayPeriodText( const QString &dayPeriod )
{
// If you get here with an empty dayPeriod, this is not the cause, merely a symptom of the
// real bug. You need to find out why it is empty otherwise time parse/format will break.
Q_ASSERT( !dayPeriod.isEmpty() );
return dayPeriod.isEmpty() ? QString() : dayPeriod.split( QChar::fromLatin1(',') ).at( 2 );
}
QString KCMLocale::amPeriod( const QString &longName, const QString &shortName, const QString &narrowName )
{
QStringList dayPeriod;
dayPeriod.append( QString::fromLatin1("am") );
dayPeriod.append( longName );
dayPeriod.append( shortName );
dayPeriod.append( narrowName );
dayPeriod.append( QTime( 0, 0, 0 ).toString( QString::fromLatin1("HH:mm:ss.zzz") ) );
dayPeriod.append( QTime( 11, 59, 59, 999 ).toString( QString::fromLatin1("HH:mm:ss.zzz") ) );
dayPeriod.append( QChar::fromLatin1('0') );
dayPeriod.append( QString::fromLatin1("12") );
return dayPeriod.join( QChar::fromLatin1(',') );
}
QString KCMLocale::pmPeriod( const QString &longName, const QString &shortName, const QString &narrowName )
{
QStringList dayPeriod;
dayPeriod.append( QString::fromLatin1("pm") );
dayPeriod.append( longName );
dayPeriod.append( shortName );
dayPeriod.append( narrowName );
dayPeriod.append( QTime( 12, 0, 0 ).toString( QString::fromLatin1("HH:mm:ss.zzz") ) );
dayPeriod.append( QTime( 23, 59, 59, 999 ).toString( QString::fromLatin1("HH:mm:ss.zzz") ) );
dayPeriod.append( QChar::fromLatin1('0') );
dayPeriod.append( QString::fromLatin1("12") );
return dayPeriod.join( QChar::fromLatin1(',') );
}
void KCMLocale::initAmPmSymbols()
{
m_ui->m_comboAmSymbol->blockSignals( true );
m_ui->m_comboPmSymbol->blockSignals( true );
m_ui->m_labelAmSymbol->setText( ki18n( "AM symbol:" ).toString( m_kcmLocale ) );
QString helpText = ki18n( "<p>Here you can set the text to be displayed for AM.</p>" ).toString( m_kcmLocale );
m_ui->m_comboAmSymbol->setToolTip( helpText );
m_ui->m_comboAmSymbol->setWhatsThis( helpText );
m_ui->m_labelPmSymbol->setText( ki18n( "PM symbol:" ).toString( m_kcmLocale ) );
helpText = ki18n( "<p>Here you can set the text to be displayed for PM.</p>" ).toString( m_kcmLocale );
m_ui->m_comboPmSymbol->setToolTip( helpText );
m_ui->m_comboPmSymbol->setWhatsThis( helpText );
QStringList formatList;
formatList.append( m_kcmLocale->dayPeriodText( QTime( 0, 0, 0 ) ) );
formatList.append( m_defaultLocale->dayPeriodText( QTime( 0, 0, 0 ) ) );
formatList.removeDuplicates();
m_ui->m_comboAmSymbol->clear();
m_ui->m_comboAmSymbol->addItems( formatList );
formatList.clear();
formatList.append( m_kcmLocale->dayPeriodText( QTime( 12, 0, 0 ) ) );
formatList.append( m_defaultLocale->dayPeriodText( QTime( 12, 0, 0 ) ) );
formatList.removeDuplicates();
m_ui->m_comboPmSymbol->clear();
m_ui->m_comboPmSymbol->addItems( formatList );
setAmPmPeriods( m_kcmSettings.readEntry( "DayPeriod1", QString() ),
m_kcmSettings.readEntry( "DayPeriod2", QString() ) );
m_ui->m_comboAmSymbol->setEditText( dayPeriodText( m_kcmSettings.readEntry( "DayPeriod1", QString() ) ) );
m_ui->m_comboPmSymbol->setEditText( dayPeriodText( m_kcmSettings.readEntry( "DayPeriod2", QString() ) ) );
m_ui->m_comboAmSymbol->blockSignals( false );
m_ui->m_comboPmSymbol->blockSignals( false );
}
void KCMLocale::setAmPmPeriods( const QString &amPeriod, const QString &pmPeriod )
{
// If either setting is locked down by Kiosk, then don't let the user make any changes, and disable the widgets
if ( m_userSettings.isEntryImmutable( "DayPeriod1" ) ||
m_userSettings.isEntryImmutable( "DayPeriod2" ) ) {
m_ui->m_comboAmSymbol->setEnabled( false );
m_ui->m_buttonDefaultAmSymbol->setEnabled( false );
m_ui->m_comboPmSymbol->setEnabled( false );
m_ui->m_buttonDefaultPmSymbol->setEnabled( false );
} else {
m_ui->m_comboAmSymbol->setEnabled( true );
m_ui->m_comboPmSymbol->setEnabled( true );
m_ui->m_buttonDefaultAmSymbol->setEnabled( false );
m_ui->m_buttonDefaultPmSymbol->setEnabled( false );
m_kcmSettings.writeEntry( "DayPeriod1", amPeriod );
m_kcmSettings.writeEntry( "DayPeriod2", pmPeriod );
// If either value is not the default then both values must be set in the user settings
if ( amPeriod != m_defaultSettings.readEntry( "DayPeriod1", QString() ) ||
pmPeriod != m_defaultSettings.readEntry( "DayPeriod2", QString() ) ) {
m_userSettings.writeEntry( "DayPeriod1", amPeriod, KConfig::Persistent | KConfig::Global );
m_userSettings.writeEntry( "DayPeriod2", pmPeriod, KConfig::Persistent | KConfig::Global );
} else { // Is the default so delete any user setting
m_userSettings.deleteEntry( "DayPeriod1", KConfig::Persistent | KConfig::Global );
m_userSettings.deleteEntry( "DayPeriod2", KConfig::Persistent | KConfig::Global );
}
if ( m_kcmSettings.readEntry( "DayPeriod1", QString() ) !=
m_defaultSettings.readEntry( "DayPeriod1", QString() ) ) {
m_ui->m_buttonDefaultAmSymbol->setEnabled( true );
}
if ( m_kcmSettings.readEntry( "DayPeriod2", QString() ) !=
m_defaultSettings.readEntry( "DayPeriod2", QString() ) ) {
m_ui->m_buttonDefaultPmSymbol->setEnabled( true );
}
checkIfChanged();
// No api to set, so need to force reload the locale
m_kcmConfig->markAsClean();
m_kcmLocale->setCountry( m_kcmSettings.readEntry( "Country", QString() ), m_kcmConfig.data() );
m_kcmLocale->setCalendar( m_kcmSettings.readEntry( "CalendarSystem", QString() ) );
}
updateSample();
}
void KCMLocale::defaultAmSymbol()
{
setAmPmPeriods( m_defaultSettings.readEntry( "DayPeriod1", QString() ),
m_kcmSettings.readEntry( "DayPeriod2", QString() ) );
m_ui->m_comboAmSymbol->setEditText( dayPeriodText( m_kcmSettings.readEntry( "DayPeriod1", QString() ) ) );
}
void KCMLocale::changedAmSymbol( const QString &newValue )
{
QStringList dayPeriod = m_defaultSettings.readEntry( "DayPeriod1", QString() ).split(',');
dayPeriod[2] = newValue;
setAmPmPeriods( dayPeriod.join( QChar::fromLatin1(',') ), m_kcmSettings.readEntry( "DayPeriod2", QString() ) );
}
void KCMLocale::defaultPmSymbol()
{
setAmPmPeriods( m_kcmSettings.readEntry( "DayPeriod1", QString() ),
m_defaultSettings.readEntry( "DayPeriod2", QString() ) );
m_ui->m_comboPmSymbol->setEditText( dayPeriodText( m_kcmSettings.readEntry( "DayPeriod2", QString() ) ) );
}
void KCMLocale::changedPmSymbol( const QString &newValue )
{
QStringList dayPeriod = m_defaultSettings.readEntry( "DayPeriod2", QString() ).split(',');
dayPeriod[2] = newValue;
setAmPmPeriods( m_kcmSettings.readEntry( "DayPeriod1", QString() ), dayPeriod.join( QChar::fromLatin1(',') ) );
}
void KCMLocale::initDateFormat()
{
m_ui->m_comboDateFormat->blockSignals( true );
m_ui->m_labelDateFormat->setText( ki18n( "Long date format:" ).toString( m_kcmLocale ) );
QString helpText = ki18n( "<p>The text in this textbox will be used to format long dates. "
"The sequences below will be replaced:</p>"
"<table>"
"<tr>"
"<td><b>YYYY</b></td>"
"<td>The year with century as a decimal number.</td>"
"</tr>"
"<tr>"
"<td><b>YY</b></td>"
"<td>The year without century as a decimal number (00-99).</td>"
"</tr>"
"<tr>"
"<td><b>MM</b></td>"
"<td>The month as a decimal number (01-12).</td>"
"</tr>"
"<tr>"
"<td><b>mM</b></td>"
"<td>The month as a decimal number (1-12).</td>"
"</tr>"
"<tr>"
"<td><b>SHORTMONTH</b></td>"
"<td>The first three characters of the month name.</td>"
"</tr>"
"<tr>"
"<td><b>MONTH</b></td>"
"<td>The full month name.</td>"
"</tr>"
"<tr>"
"<td><b>DD</b></td>"
"<td>The day of month as a decimal number (01-31).</td>"
"</tr>"
"<tr>"
"<td><b>dD</b></td>"
"<td>The day of month as a decimal number (1-31).</td>"
"</tr>"
"<tr>"
"<td><b>SHORTWEEKDAY</b></td>"
"<td>The first three characters of the weekday name.</td>"
"</tr>"
"<tr>"
"<td><b>WEEKDAY</b></td>"
"<td>The full weekday name.</td>"
"</tr>"
"<tr>"
"<td><b>ERAYEAR</b></td>"
"<td>The Era Year in local format (e.g. 2000 AD).</td>"
"</tr>"
"<tr>"
"<td><b>SHORTERANAME</b></td>"
"<td>The short Era Name.</td>"
"</tr>"
"<tr>"
"<td><b>YEARINERA</b></td>"
"<td>The Year in Era as a decimal number.</td>"
"</tr>"
"<tr>"
"<td><b>DAYOFYEAR</b></td>"
"<td>The Day of Year as a decimal number.</td>"
"</tr>"
"<tr>"
"<td><b>ISOWEEK</b></td>"
"<td>The ISO Week as a decimal number.</td>"
"</tr>"
"<tr>"
"<td><b>DAYOFISOWEEK</b></td>"
"<td>The Day of the ISO Week as a decimal number.</td>"
"</tr>"
"</table>" ).toString( m_kcmLocale );
m_ui->m_comboDateFormat->setToolTip( helpText );
m_ui->m_comboDateFormat->setWhatsThis( helpText );
m_dateFormatMap.clear();
m_dateFormatMap.insert( QString( 'Y' ), ki18n("YYYY").toString( m_kcmLocale ) );
m_dateFormatMap.insert( QString( 'y' ), ki18n( "YY" ).toString( m_kcmLocale ) );
m_dateFormatMap.insert( QString( 'n' ), ki18n( "mM" ).toString( m_kcmLocale ) );
m_dateFormatMap.insert( QString( 'm' ), ki18nc( "Month", "MM" ).toString( m_kcmLocale ) );
m_dateFormatMap.insert( QString( 'b' ), ki18n( "SHORTMONTH" ).toString( m_kcmLocale ) );
m_dateFormatMap.insert( QString( 'B' ), ki18n( "MONTH" ).toString( m_kcmLocale ) );
m_dateFormatMap.insert( QString( 'e' ), ki18n( "dD" ).toString( m_kcmLocale ) );
m_dateFormatMap.insert( QString( 'd' ), ki18n( "DD" ).toString( m_kcmLocale ) );
m_dateFormatMap.insert( QString( 'a' ), ki18n( "SHORTWEEKDAY" ).toString( m_kcmLocale ) );
m_dateFormatMap.insert( QString( 'A' ), ki18n( "WEEKDAY" ).toString( m_kcmLocale ) );
m_dateFormatMap.insert( "EY", ki18n( "ERAYEAR" ).toString( m_kcmLocale ) );
m_dateFormatMap.insert( "Ey", ki18n( "YEARINERA" ).toString( m_kcmLocale ) );
m_dateFormatMap.insert( "EC", ki18n( "SHORTERANAME" ).toString( m_kcmLocale ) );
m_dateFormatMap.insert( QString( 'j' ), ki18n( "DAYOFYEAR" ).toString( m_kcmLocale ) );
m_dateFormatMap.insert( QString( 'V' ), ki18n( "ISOWEEK" ).toString( m_kcmLocale ) );
m_dateFormatMap.insert( QString( 'u' ), ki18n( "DAYOFISOWEEK" ).toString( m_kcmLocale ) );
QStringList formatList;
QString cValue = m_cSettings.readEntry( "DateFormat", QString() );
formatList.append( posixToUserDate( m_kcmSettings.readEntry( "DateFormat", cValue ) ) );
formatList.append( posixToUserDate( m_defaultSettings.readEntry( "DateFormat", cValue ) ) );
formatList.append( posixToUserDate( m_countrySettings.readEntry( "DateFormat", cValue ) ) );
formatList.append( posixToUserDate( cValue ) );
// TODO convert these to POSIX and US format!
QString formats = ki18nc("some reasonable date formats for the language",
"WEEKDAY MONTH dD YYYY\n"
"SHORTWEEKDAY MONTH dD YYYY").toString( m_kcmLocale );
formatList.append( formats.split( QString::fromLatin1("\n") ) );
formatList.removeDuplicates();
m_ui->m_comboDateFormat->clear();
m_ui->m_comboDateFormat->addItems( formatList );
setDateFormat( m_kcmSettings.readEntry( "DateFormat", QString() ) );
m_ui->m_comboDateFormat->blockSignals( false );
}
void KCMLocale::defaultDateFormat()
{
setDateFormat( m_defaultSettings.readEntry( "DateFormat", QString() ) );
}
void KCMLocale::changedDateFormat( const QString &newValue )
{
setItem( "DateFormat", userToPosixDate( newValue ),
m_ui->m_comboDateFormat, m_ui->m_buttonDefaultDateFormat );
m_kcmLocale->setDateFormat( m_kcmSettings.readEntry( "DateFormat", QString() ) );
updateSample();
}
void KCMLocale::setDateFormat( const QString &newValue )
{
setItem( "DateFormat", newValue,
m_ui->m_comboDateFormat, m_ui->m_buttonDefaultDateFormat );
QString value = m_kcmSettings.readEntry( "DateFormat", QString() );
m_ui->m_comboDateFormat->setEditText( posixToUserDate( value ) );
m_kcmLocale->setDateFormat( value );
updateSample();
}
void KCMLocale::initShortDateFormat()
{
m_ui->m_comboShortDateFormat->blockSignals( true );
m_ui->m_labelShortDateFormat->setText( ki18n( "Short date format:" ).toString( m_kcmLocale ) );
QString helpText = ki18n( "<p>The text in this textbox will be used to format short dates. "
"For instance, this is used when listing files. The sequences below "
"will be replaced:</p>"
"<table>"
"<tr>"
"<td><b>YYYY</b></td>"
"<td>The year with century as a decimal number.</td>"
"</tr>"
"<tr>"
"<td><b>YY</b></td>"
"<td>The year without century as a decimal number (00-99).</td>"
"</tr>"
"<tr>"
"<td><b>MM</b></td>"
"<td>The month as a decimal number (01-12).</td>"
"</tr>"
"<tr>"
"<td><b>mM</b></td>"
"<td>The month as a decimal number (1-12).</td>"
"</tr>"
"<tr>"
"<td><b>SHORTMONTH</b></td>"
"<td>The first three characters of the month name.</td>"
"</tr>"
"<tr>"
"<td><b>MONTH</b></td>"
"<td>The full month name.</td>"
"</tr>"
"<tr>"
"<td><b>DD</b></td>"
"<td>The day of month as a decimal number (01-31).</td>"
"</tr>"
"<tr>"
"<td><b>dD</b></td>"
"<td>The day of month as a decimal number (1-31).</td>"
"</tr>"
"<tr>"
"<td><b>SHORTWEEKDAY</b></td>"
"<td>The first three characters of the weekday name.</td>"
"</tr>"
"<tr>"
"<td><b>WEEKDAY</b></td>"
"<td>The full weekday name.</td>"
"</tr>"
"<tr>"
"<td><b>ERAYEAR</b></td>"
"<td>The Era Year in local format (e.g. 2000 AD).</td>"
"</tr>"
"<tr>"
"<td><b>SHORTERANAME</b></td>"
"<td>The short Era Name.</td>"
"</tr>"
"<tr>"
"<td><b>YEARINERA</b></td>"
"<td>The Year in Era as a decimal number.</td>"
"</tr>"
"<tr>"
"<td><b>DAYOFYEAR</b></td>"
"<td>The Day of Year as a decimal number.</td>"
"</tr>"
"<tr>"
"<td><b>ISOWEEK</b></td>"
"<td>The ISO Week as a decimal number.</td>"
"</tr>"
"<tr>"
"<td><b>DAYOFISOWEEK</b></td>"
"<td>The Day of the ISO Week as a decimal number.</td>"
"</tr>"
"</table>" ).toString( m_kcmLocale );
m_ui->m_comboShortDateFormat->setToolTip( helpText );
m_ui->m_comboShortDateFormat->setWhatsThis( helpText );
QStringList formatList;
QString cValue = m_cSettings.readEntry( "DateFormatShort", QString() );
formatList.append( posixToUserDate( m_kcmSettings.readEntry( "DateFormatShort", cValue ) ) );
formatList.append( posixToUserDate( m_defaultSettings.readEntry( "DateFormatShort", cValue ) ) );
formatList.append( posixToUserDate( m_countrySettings.readEntry( "DateFormatShort", cValue ) ) );
formatList.append( posixToUserDate( cValue ) );
formatList.append( "YYYY-MM-DD" );
// TODO convert these to POSIX and US format!
QString formats = ki18nc("some reasonable short date formats for the language",
"YYYY-MM-DD\n"
"dD.mM.YYYY\n"
"DD.MM.YYYY").toString( m_kcmLocale );
formatList.append( formats.split( QString::fromLatin1("\n") ) );
formatList.removeDuplicates();
m_ui->m_comboShortDateFormat->clear();
m_ui->m_comboShortDateFormat->addItems( formatList );
setShortDateFormat( m_kcmSettings.readEntry( "DateFormatShort", QString() ) );
m_ui->m_comboShortDateFormat->blockSignals( false );
}
void KCMLocale::defaultShortDateFormat()
{
setShortDateFormat( m_defaultSettings.readEntry( "DateFormatShort", QString() ) );
}
void KCMLocale::changedShortDateFormat( const QString &newValue )
{
setItem( "DateFormatShort", userToPosixDate( newValue ),
m_ui->m_comboShortDateFormat, m_ui->m_buttonDefaultShortDateFormat );
m_kcmLocale->setDateFormatShort( m_kcmSettings.readEntry( "DateFormatShort", QString() ) );
updateSample();
}
void KCMLocale::setShortDateFormat( const QString &newValue )
{
setItem( "DateFormatShort", newValue,
m_ui->m_comboShortDateFormat, m_ui->m_buttonDefaultShortDateFormat );
QString value = m_kcmSettings.readEntry( "DateFormatShort", QString() );
m_ui->m_comboShortDateFormat->setEditText( posixToUserDate( value ) );
m_kcmLocale->setDateFormatShort( value );
updateSample();
}
void KCMLocale::initMonthNamePossessive()
{
m_ui->m_checkMonthNamePossessive->blockSignals( true );
m_ui->m_labelMonthNamePossessive->setText( ki18n( "Possessive month names:" ).toString( m_kcmLocale ) );
QString helpText = ki18n( "<p>This option determines whether possessive form of month names "
"should be used in dates.</p>" ).toString( m_kcmLocale );
m_ui->m_checkMonthNamePossessive->setToolTip( helpText );
m_ui->m_checkMonthNamePossessive->setWhatsThis( helpText );
m_ui->m_checkMonthNamePossessive->setChecked( m_kcmLocale->dateMonthNamePossessive() );
setCheckItem( "DateMonthNamePossessive", m_kcmSettings.readEntry( "DateMonthNamePossessive", false ),
m_ui->m_checkMonthNamePossessive, m_ui->m_buttonDefaultMonthNamePossessive );
setMonthNamePossessive( m_kcmSettings.readEntry( "DateMonthNamePossessive", false ) );
// Hide the option as it's not usable without ordinal day numbers
m_ui->m_labelMonthNamePossessive->setHidden( true );
m_ui->m_checkMonthNamePossessive->setHidden( true );
m_ui->m_buttonDefaultMonthNamePossessive->setHidden( true );
m_ui->m_checkMonthNamePossessive->blockSignals( false );
}
void KCMLocale::defaultMonthNamePossessive()
{
setMonthNamePossessive( m_defaultSettings.readEntry( "DateMonthNamePossessive", false ) );
}
void KCMLocale::changedMonthNamePossessive( bool newValue )
{
setMonthNamePossessive( newValue );
}
void KCMLocale::setMonthNamePossessive( bool newValue )
{
setCheckItem( "DateMonthNamePossessive", newValue,
m_ui->m_checkMonthNamePossessive, m_ui->m_buttonDefaultMonthNamePossessive );
m_kcmLocale->setDateMonthNamePossessive( m_kcmSettings.readEntry( "DateMonthNamePossessive", 0 ) );
updateSample();
}
void KCMLocale::initDateTimeDigitSet()
{
m_ui->m_comboDateTimeDigitSet->blockSignals( true );
m_ui->m_labelDateTimeDigitSet->setText( ki18n( "Digit set:" ).toString( m_kcmLocale ) );
QString helpText = ki18n( "<p>Here you can define the set of digits used to display dates and "
"times. If digits other than Arabic are selected, they will appear "
"only if used in the language of the application or the piece of "
"text where the date or time is shown.</p><p>Note that the set of "
"digits used to display numeric values have to be set "
"separately (see the 'Numbers' tab).</p>" ).toString( m_kcmLocale );
2014-11-15 03:14:34 +02:00
m_ui->m_comboDateTimeDigitSet->setToolTip( helpText );
m_ui->m_comboDateTimeDigitSet->setWhatsThis( helpText );
initDigitSetCombo( m_ui->m_comboDateTimeDigitSet );
setDateTimeDigitSet( m_kcmSettings.readEntry( "DateTimeDigitSet", 0 ) );
m_ui->m_comboDateTimeDigitSet->blockSignals( false );
}
void KCMLocale::defaultDateTimeDigitSet()
{
setDateTimeDigitSet( m_defaultSettings.readEntry( "DateTimeDigitSet", 0 ) );
}
void KCMLocale::changedDateTimeDigitSetIndex( int index )
{
setDateTimeDigitSet( m_ui->m_comboDateTimeDigitSet->itemData( index ).toInt() );
}
void KCMLocale::setDateTimeDigitSet( int newValue )
{
setComboItem( "DateTimeDigitSet", newValue,
m_ui->m_comboDateTimeDigitSet, m_ui->m_buttonDefaultDateTimeDigitSet );
m_kcmLocale->setDateTimeDigitSet( (KLocale::DigitSet) m_kcmSettings.readEntry( "DateTimeDigitSet", 0 ) );
}
void KCMLocale::initPageSize()
{
m_ui->m_comboPageSize->blockSignals( true );
m_ui->m_labelPageSize->setText( ki18n( "Page size:" ).toString( m_kcmLocale ) );
QString helpText = ki18n( "<p>Here you can define the default page size to be used in new "
"documents.</p><p>Note that this setting has no effect on printer "
"paper size.</p>" ).toString( m_kcmLocale );
m_ui->m_comboPageSize->setToolTip( helpText );
m_ui->m_comboPageSize->setWhatsThis( helpText );
m_ui->m_comboPageSize->clear();
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "A4").toString( m_kcmLocale ),
QVariant( QPrinter::A4 ) );
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "US Letter").toString( m_kcmLocale ),
QVariant( QPrinter::Letter ) );
m_ui->m_comboPageSize->insertSeparator( m_ui->m_comboPageSize->count() );
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "A0").toString( m_kcmLocale ),
QVariant( QPrinter::A0 ) );
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "A1").toString( m_kcmLocale ),
QVariant( QPrinter::A1 ) );
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "A2").toString( m_kcmLocale ),
QVariant( QPrinter::A2 ) );
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "A3").toString( m_kcmLocale ),
QVariant( QPrinter::A3 ) );
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "A4").toString( m_kcmLocale ),
QVariant( QPrinter::A4 ) );
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "A5").toString( m_kcmLocale ),
QVariant( QPrinter::A5 ) );
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "A6").toString( m_kcmLocale ),
QVariant( QPrinter::A6 ) );
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "A7").toString( m_kcmLocale ),
QVariant( QPrinter::A7 ) );
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "A8").toString( m_kcmLocale ),
QVariant( QPrinter::A8 ) );
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "A9").toString( m_kcmLocale ),
QVariant( QPrinter::A9 ) );
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "B0").toString( m_kcmLocale ),
QVariant( QPrinter::B0 ) );
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "B1").toString( m_kcmLocale ),
QVariant( QPrinter::B1 ) );
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "B2").toString( m_kcmLocale ),
QVariant( QPrinter::B2 ) );
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "B3").toString( m_kcmLocale ),
QVariant( QPrinter::B3 ) );
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "B4").toString( m_kcmLocale ),
QVariant( QPrinter::B4 ) );
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "B5").toString( m_kcmLocale ),
QVariant( QPrinter::B5 ) );
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "B6").toString( m_kcmLocale ),
QVariant( QPrinter::B6 ) );
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "B7").toString( m_kcmLocale ),
QVariant( QPrinter::B7 ) );
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "B8").toString( m_kcmLocale ),
QVariant( QPrinter::B8 ) );
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "B9").toString( m_kcmLocale ),
QVariant( QPrinter::B9 ) );
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "B10").toString( m_kcmLocale ),
QVariant( QPrinter::B10 ) );
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "C5 Envelope").toString( m_kcmLocale ),
QVariant( QPrinter::C5E ) );
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "US Common 10 Envelope").toString( m_kcmLocale ),
QVariant( QPrinter::Comm10E ) );
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "DLE Envelope").toString( m_kcmLocale ),
QVariant( QPrinter::DLE ) );
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "Executive").toString( m_kcmLocale ),
QVariant( QPrinter::Executive ) );
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "Folio").toString( m_kcmLocale ),
QVariant( QPrinter::Folio ) );
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "Ledger").toString( m_kcmLocale ),
QVariant( QPrinter::Ledger ) );
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "US Legal").toString( m_kcmLocale ),
QVariant( QPrinter::Legal ) );
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "US Letter").toString( m_kcmLocale ),
QVariant( QPrinter::Letter ) );
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "Tabloid").toString( m_kcmLocale ),
QVariant( QPrinter::Tabloid ) );
m_ui->m_comboPageSize->addItem( ki18nc("Page size", "Custom").toString( m_kcmLocale ),
QVariant( QPrinter::Custom ) );
setPageSize( m_kcmSettings.readEntry( "PageSize", 0 ) );
m_ui->m_comboPageSize->blockSignals( false );
}
void KCMLocale::defaultPageSize()
{
setPageSize( m_defaultSettings.readEntry( "PageSize", 0 ) );
}
void KCMLocale::changedPageSizeIndex( int index )
{
setPageSize( m_ui->m_comboPageSize->itemData( index ).toInt() );
}
void KCMLocale::setPageSize( int newValue )
{
setComboItem( "PageSize", newValue,
m_ui->m_comboPageSize, m_ui->m_buttonDefaultPageSize );
m_kcmLocale->setPageSize( m_kcmSettings.readEntry( "PageSize", 0 ) );
}
void KCMLocale::initMeasureSystem()
{
m_ui->m_comboMeasureSystem->blockSignals( true );
m_ui->m_labelMeasureSystem->setText( ki18n( "Measurement system:" ).toString( m_kcmLocale ) );
QString helpText = ki18n( "<p>Here you can define the measurement system to use.</p>" ).toString( m_kcmLocale );
m_ui->m_comboMeasureSystem->setToolTip( helpText );
m_ui->m_comboMeasureSystem->setWhatsThis( helpText );
m_ui->m_comboMeasureSystem->clear();
m_ui->m_comboMeasureSystem->addItem( ki18n("Metric System").toString( m_kcmLocale ), (int) KLocale::Metric );
m_ui->m_comboMeasureSystem->addItem( ki18n("Imperial System").toString( m_kcmLocale ), (int) KLocale::Imperial );
setMeasureSystem( m_kcmSettings.readEntry( "MeasureSystem", 0 ) );
m_ui->m_comboMeasureSystem->blockSignals( false );
}
void KCMLocale::defaultMeasureSystem()
{
setMeasureSystem( m_defaultSettings.readEntry( "MeasureSystem", 0 ) );
}
void KCMLocale::changedMeasureSystemIndex( int index )
{
setMeasureSystem( m_ui->m_comboMeasureSystem->itemData( index ).toInt() );
}
void KCMLocale::setMeasureSystem( int newValue )
{
setComboItem( "MeasureSystem", newValue,
m_ui->m_comboMeasureSystem, m_ui->m_buttonDefaultMeasureSystem );
m_kcmLocale->setMeasureSystem( (KLocale::MeasureSystem) m_kcmSettings.readEntry( "MeasureSystem", 0 ) );
}
void KCMLocale::initBinaryUnitDialect()
{
m_ui->m_comboBinaryUnitDialect->blockSignals( true );
m_ui->m_labelBinaryUnitDialect->setText( ki18n( "Byte size units:" ).toString( m_kcmLocale ) );
QString helpText = ki18n( "<p>This changes the units used by most KDE programs to display "
"numbers counted in bytes. Traditionally \"kilobytes\" meant units "
"of 1024, instead of the metric 1000, for most (but not all) byte "
"sizes."
"<ul>"
"<li>To reduce confusion you can use the recently standardized IEC "
"units which are always in multiples of 1024.</li>"
"<li>You can also select metric, which is always in units of 1000.</li>"
"<li>Selecting JEDEC restores the older-style units used in KDE 3.5 "
"and some other operating systems.</li>"
"</ul>"
"</p>" ).toString( m_kcmLocale );
m_ui->m_comboBinaryUnitDialect->setToolTip( helpText );
m_ui->m_comboBinaryUnitDialect->setWhatsThis( helpText );
m_ui->m_comboBinaryUnitDialect->clear(),
m_ui->m_comboBinaryUnitDialect->addItem( ki18nc("Unit of binary measurement", "IEC Units (KiB, MiB, etc)").toString( m_kcmLocale ),
QVariant( KLocale::IECBinaryDialect ) );
m_ui->m_comboBinaryUnitDialect->addItem( ki18nc("Unit of binary measurement", "JEDEC Units (KB, MB, etc)").toString( m_kcmLocale ),
QVariant( KLocale::JEDECBinaryDialect ) );
m_ui->m_comboBinaryUnitDialect->addItem( ki18nc("Unit of binary measurement", "Metric Units (kB, MB, etc)").toString( m_kcmLocale ),
QVariant( KLocale::MetricBinaryDialect ) );
setBinaryUnitDialect( m_kcmSettings.readEntry( "BinaryUnitDialect", 0 ) );
m_ui->m_comboBinaryUnitDialect->blockSignals( false );
}
void KCMLocale::defaultBinaryUnitDialect()
{
setBinaryUnitDialect( m_defaultSettings.readEntry( "BinaryUnitDialect", 0 ) );
}
void KCMLocale::changedBinaryUnitDialectIndex( int index )
{
setBinaryUnitDialect( m_ui->m_comboBinaryUnitDialect->itemData( index ).toInt() );
}
void KCMLocale::setBinaryUnitDialect( int newValue )
{
setComboItem( "BinaryUnitDialect", newValue,
m_ui->m_comboBinaryUnitDialect, m_ui->m_buttonDefaultBinaryUnitDialect );
m_kcmLocale->setBinaryUnitDialect( (KLocale::BinaryUnitDialect)
m_kcmSettings.readEntry( "BinaryUnitDialect", 0 ) );
m_ui->m_labelBinaryUnitSample->setText( ki18nc("Example test for binary unit dialect",
"Example: 2000 bytes equals %1")
.subs( m_kcmLocale->formatByteSize( 2000, 2 ) )
.toString( m_kcmLocale ) );
}
QString KCMLocale::posixToUserTime( const QString &posixFormat ) const
{
return posixToUser( posixFormat, m_timeFormatMap );
}
QString KCMLocale::posixToUserDate( const QString &posixFormat ) const
{
return posixToUser( posixFormat, m_dateFormatMap );
}
QString KCMLocale::posixToUser( const QString &posixFormat, const QMap<QString, QString> &map ) const
{
QString result;
bool escaped = false;
for ( int pos = 0; pos < posixFormat.length(); ++pos ) {
QChar c = posixFormat.at( pos );
if ( escaped ) {
QString key = c;
if ( c == 'E' ) {
key += posixFormat.at( ++pos );
}
QString val = map.value( key, QString() );
if ( !val.isEmpty() ) {
result += val;
} else {
result += key;
}
escaped = false;
} else if ( c == '%' ) {
escaped = true;
} else {
result += c;
}
}
return result;
}
QString KCMLocale::userToPosixTime( const QString &userFormat ) const
{
return userToPosix( userFormat, m_timeFormatMap );
}
QString KCMLocale::userToPosixDate( const QString &userFormat ) const
{
return userToPosix( userFormat, m_dateFormatMap );
}
QString KCMLocale::userToPosix( const QString &userFormat, const QMap<QString, QString> &map ) const
{
QMultiMap<int, QString> sizeMap;
QMap<QString, QString>::const_iterator it = map.constBegin();
while ( it != map.constEnd() ) {
sizeMap.insert( it.value().length(), it.key() );
++it;
}
QString result;
for ( int pos = 0; pos < userFormat.length(); ++pos ) {
bool matchFound = false;
QMapIterator<int, QString> it2(sizeMap);
it2.toBack();
while (!matchFound && it2.hasPrevious()) {
it2.previous();
QString s = map.value(it2.value());
if ( userFormat.mid( pos, s.length() ) == s ) {
result += '%';
result += it2.value();
pos += s.length() - 1;
matchFound = true;
}
}
if ( !matchFound ) {
QChar c = userFormat.at( pos );
if ( c == '%' ) {
result += c;
}
result += c;
}
}
return result;
}
2015-02-27 09:28:46 +00:00
#include "moc_kcmlocale.cpp"