/* * Copyright (c) 1998 Matthias Hoelzer (hoelzer@physik.uni-wuerzburg.de) * Copyright (c) 1999 Preston Brown * Copyright (c) 1999-2003 Hans Petter Bieker * Copyright 2010 John Layt * * 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ui_kcmlocalewidget.h" K_PLUGIN_FACTORY( KCMLocaleFactory, registerPlugin(); ) K_EXPORT_PLUGIN( KCMLocaleFactory( "kcmlocale" ) ) KCMLocale::KCMLocale( QWidget *parent, const QVariantList &args ) : KCModule( KCMLocaleFactory::componentData(), parent, args ), m_userConfig( 0 ), m_kcmConfig( 0 ), m_currentConfig( 0 ), m_defaultConfig( 0 ), m_groupConfig( 0 ), m_countryConfig( 0 ), m_cConfig( 0 ), m_kcmLocale( 0 ), m_defaultLocale( 0 ), m_ui( new Ui::KCMLocaleWidget ) { 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() ) ); connect( m_ui->m_comboCountryDivision, SIGNAL( activated( int ) ), this, SLOT( changedCountryDivisionIndex( int ) ) ); connect( m_ui->m_buttonDefaultCountryDivision, SIGNAL( clicked() ), this, SLOT( defaultCountryDivision() ) ); // 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 Install button, trigger distro specific install routine connect( m_ui->m_buttonTranslationsInstall, SIGNAL( clicked() ), this, SLOT( installTranslations() ) ); // Hide the Install button, this will be activated by those distros that support this feature. m_ui->m_buttonTranslationsInstall->setHidden( true ); // 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() ) ); // Money tab connect( m_ui->m_comboCurrencyCode, SIGNAL( currentIndexChanged( int ) ), this, SLOT( changedCurrencyCodeIndex( int ) ) ); connect( m_ui->m_buttonDefaultCurrencyCode, SIGNAL( clicked() ), this, SLOT( defaultCurrencyCode() ) ); connect( m_ui->m_comboCurrencySymbol, SIGNAL( currentIndexChanged( int ) ), this, SLOT( changedCurrencySymbolIndex( int ) ) ); connect( m_ui->m_buttonDefaultCurrencySymbol, SIGNAL( clicked() ), this, SLOT( defaultCurrencySymbol() ) ); connect( m_ui->m_comboMonetaryDigitGrouping, SIGNAL( currentIndexChanged( int ) ), this, SLOT( changedMonetaryDigitGroupingIndex( int ) ) ); connect( m_ui->m_buttonDefaultMonetaryDigitGrouping, SIGNAL( clicked() ), this, SLOT( defaultMonetaryDigitGrouping() ) ); connect( m_ui->m_comboMonetaryThousandsSeparator, SIGNAL( editTextChanged( const QString & ) ), this, SLOT( changedMonetaryThousandsSeparator( const QString & ) ) ); connect( m_ui->m_buttonDefaultMonetaryThousandsSeparator, SIGNAL( clicked() ), this, SLOT( defaultMonetaryThousandsSeparator() ) ); connect( m_ui->m_comboMonetaryDecimalSymbol, SIGNAL( editTextChanged( const QString & ) ), this, SLOT( changedMonetaryDecimalSymbol( const QString & ) ) ); connect( m_ui->m_buttonDefaultMonetaryDecimalSymbol, SIGNAL( clicked() ), this, SLOT( defaultMonetaryDecimalSymbol() ) ); connect( m_ui->m_intMonetaryDecimalPlaces, SIGNAL( valueChanged( int ) ), this, SLOT( changedMonetaryDecimalPlaces( int ) ) ); connect( m_ui->m_buttonDefaultMonetaryDecimalPlaces, SIGNAL( clicked() ), this, SLOT( defaultMonetaryDecimalPlaces() ) ); connect( m_ui->m_comboMonetaryPositiveFormat, SIGNAL( currentIndexChanged( int ) ), this, SLOT( changedMonetaryPositiveFormatIndex( int ) ) ); connect( m_ui->m_buttonDefaultMonetaryPositiveFormat, SIGNAL( clicked() ), this, SLOT( defaultMonetaryPositiveFormat() ) ); connect( m_ui->m_comboMonetaryNegativeFormat, SIGNAL( currentIndexChanged( int ) ), this, SLOT( changedMonetaryNegativeFormatIndex( int ) ) ); connect( m_ui->m_buttonDefaultMonetaryNegativeFormat, SIGNAL( clicked() ), this, SLOT( defaultMonetaryNegativeFormat() ) ); connect( m_ui->m_comboMonetaryDigitSet, SIGNAL( currentIndexChanged( int ) ), this, SLOT( changedMonetaryDigitSetIndex( int ) ) ); connect( m_ui->m_buttonDefaultMonetaryDigitSet, SIGNAL( clicked() ), this, SLOT( defaultMonetaryDigitSet() ) ); // 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() ) ); connect( m_ui->m_comboWorkingWeekStartDay, SIGNAL( currentIndexChanged( int ) ), this, SLOT( changedWorkingWeekStartDayIndex( int ) ) ); connect( m_ui->m_buttonDefaultWorkingWeekStartDay, SIGNAL( clicked() ), this, SLOT( defaultWorkingWeekStartDay() ) ); connect( m_ui->m_comboWorkingWeekEndDay, SIGNAL( currentIndexChanged( int ) ), this, SLOT( changedWorkingWeekEndDayIndex( int ) ) ); connect( m_ui->m_buttonDefaultWorkingWeekEndDay, SIGNAL( clicked() ), this, SLOT( defaultWorkingWeekEndDay() ) ); connect( m_ui->m_comboWeekDayOfPray, SIGNAL( currentIndexChanged( int ) ), this, SLOT( changedWeekDayOfPrayIndex( int ) ) ); connect( m_ui->m_buttonDefaultWeekDayOfPray, SIGNAL( clicked() ), this, SLOT( defaultWeekDayOfPray() ) ); // 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 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 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() ); 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() ); 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, "CountryDivision", 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, "CurrencyCode", flags ); copySetting( fromGroup, toGroup, "CurrencySymbol", flags ); copySetting( fromGroup, toGroup, "MonetaryDecimalPlaces", flags ); copySetting( fromGroup, toGroup, "MonetaryDecimalSymbol", flags ); copySetting( fromGroup, toGroup, "MonetaryDigitGroupFormat", flags ); copySetting( fromGroup, toGroup, "MonetaryThousandsSeparator", flags ); copySetting( fromGroup, toGroup, "PositivePrefixCurrencySymbol", flags ); copySetting( fromGroup, toGroup, "NegativePrefixCurrencySymbol", flags ); copySetting( fromGroup, toGroup, "PositiveMonetarySignPosition", flags ); copySetting( fromGroup, toGroup, "NegativeMonetarySignPosition", flags ); copySetting( fromGroup, toGroup, "MonetaryDigitSet", 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, "WorkingWeekStartDay", flags ); copySetting( fromGroup, toGroup, "WorkingWeekEndDay", flags ); copySetting( fromGroup, toGroup, "WeekDayOfPray", 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("

Country/Region & Language

\n" "

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.

" ).toString(m_kcmLocale); } void KCMLocale::initAllWidgets() { //Common initTabs(); initSample(); initResetButtons(); //Country tab initCountry(); initCountryDivision(); //Translations tab initTranslations(); initTranslationsInstall(); 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(); //Monetary tab initCurrencyCode(); // Also inits CurrencySymbol initMonetaryDigitGrouping(); initMonetaryThousandsSeparator(); initMonetaryDecimalSymbol(); initMonetaryDecimalPlaces(); initMonetaryPositiveFormat(); initMonetaryNegativeFormat(); initMonetaryDigitSet(); //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 ); m_ui->m_buttonDefaultCountryDivision->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 ); //Monetary tab m_ui->m_buttonDefaultCurrencyCode->setGuiItem( defaultItem ); m_ui->m_buttonDefaultCurrencySymbol->setGuiItem( defaultItem ); m_ui->m_buttonDefaultMonetaryDigitGrouping->setGuiItem( defaultItem ); m_ui->m_buttonDefaultMonetaryThousandsSeparator->setGuiItem( defaultItem ); m_ui->m_buttonDefaultMonetaryDecimalSymbol->setGuiItem( defaultItem ); m_ui->m_buttonDefaultMonetaryDecimalPlaces->setGuiItem( defaultItem ); m_ui->m_buttonDefaultMonetaryPositiveFormat->setGuiItem( defaultItem ); m_ui->m_buttonDefaultMonetaryNegativeFormat->setGuiItem( defaultItem ); m_ui->m_buttonDefaultMonetaryDigitSet->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 ); m_ui->m_buttonDefaultWorkingWeekStartDay->setGuiItem( defaultItem ); m_ui->m_buttonDefaultWorkingWeekEndDay->setGuiItem( defaultItem ); m_ui->m_buttonDefaultWeekDayOfPray->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, money void KCMLocale::initDigitSetCombo( KComboBox *digitSetCombo ) { digitSetCombo->clear(); QList 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 { digitGroupingCombo->addItem( customLocale->formatMoney( 123456789.12 ), digitGroupingFormat ); } groupingConfig->markAsClean(); delete customLocale; } // Generic utility to set up a Digit Grouping combo, used for numbers and money 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( "Money" ).toString( m_kcmLocale ) ); m_ui->m_tabWidgetSettings->setTabText( 4, ki18n( "Calendar" ).toString( m_kcmLocale ) ); m_ui->m_tabWidgetSettings->setTabText( 5, ki18n( "Date && Time" ).toString( m_kcmLocale ) ); m_ui->m_tabWidgetSettings->setTabText( 6, ki18n( "Other" ).toString( m_kcmLocale ) ); } 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_labelMoneySample->setText( ki18n( "Money:" ).toString( m_kcmLocale ) ); helpText = ki18n( "This is how positive monetary values will be displayed.").toString( m_kcmLocale ); m_ui->m_textMoneyPositiveSample->setToolTip( helpText ); m_ui->m_textMoneyPositiveSample->setWhatsThis( helpText ); helpText = ki18n( "This is how negative monetary values will be displayed.").toString( m_kcmLocale ); m_ui->m_textMoneyNegativeSample->setToolTip( helpText ); m_ui->m_textMoneyNegativeSample->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 ) ); m_ui->m_textMoneyPositiveSample->setText( m_kcmLocale->formatMoney( 123456789.12 ) ); m_ui->m_textMoneyNegativeSample->setText( m_kcmLocale->formatMoney( -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( "

This is the country where you live. The KDE Workspace will use " "the settings for this country or region.

" ).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 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 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::initCountryDivision() { m_ui->m_comboCountryDivision->blockSignals( true ); m_ui->m_labelCountryDivision->setText( ki18n( "Subdivision:" ).toString( m_kcmLocale ) ); QString helpText = ki18n( "

This is the country subdivision where you live, e.g. your state " "or province. The KDE Workspace will use this setting for local " "information services such as holidays.

" ).toString( m_kcmLocale ); m_ui->m_comboCountryDivision->setToolTip( helpText ); m_ui->m_comboCountryDivision->setWhatsThis( helpText ); setCountryDivision( m_kcmSettings.readEntry( "CountryDivision", QString() ) ); m_ui->m_labelCountryDivision->setHidden( true ); m_ui->m_comboCountryDivision->setHidden( true ); m_ui->m_buttonDefaultCountryDivision->setEnabled( false ); m_ui->m_buttonDefaultCountryDivision->setHidden( true ); m_ui->m_comboCountryDivision->blockSignals( false ); } void KCMLocale::defaultCountryDivision() { setCountryDivision( m_defaultSettings.readEntry( "CountryDivision", QString() ) ); } void KCMLocale::changedCountryDivisionIndex( int index ) { setCountryDivision( m_ui->m_comboCountryDivision->itemData( index ).toString() ); } void KCMLocale::setCountryDivision( const QString &newValue ) { setComboItem( "CountryDivision", newValue, m_ui->m_comboCountryDivision, m_ui->m_buttonDefaultCountryDivision ); m_kcmLocale->setCountryDivisionCode( m_kcmSettings.readEntry( "CountryDivision", QString() ) ); } void KCMLocale::initTranslations() { m_ui->m_selectTranslations->blockSignals( true ); m_ui->m_selectTranslations->setAvailableLabel( ki18n( "Available Languages:" ).toString( m_kcmLocale ) ); QString availableHelp = ki18n( "

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.

" ).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( "

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.

").toString( m_kcmLocale ); m_ui->m_selectTranslations->selectedListWidget()->setToolTip( selectedHelp ); m_ui->m_selectTranslations->selectedListWidget()->setWhatsThis( selectedHelp ); QString enUS; QString defaultLang = ki18nc( "%1 = default language name", "%1 (Default)" ).subs( enUS ).toString( m_kcmLocale ); // 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 int i = 0; 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 ); ++i; } // Load all the available languages the user hasn't selected into the available list i = 0; 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 ); ++i; } } 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::initTranslationsInstall() { m_ui->m_buttonTranslationsInstall->blockSignals( true ); m_ui->m_buttonTranslationsInstall->setText( ki18n( "Install more languages" ).toString( m_kcmLocale ) ); QString helpText = ki18n( "

Click here to install more languages

" ).toString( m_kcmLocale ); m_ui->m_buttonTranslationsInstall->setToolTip( helpText ); m_ui->m_buttonTranslationsInstall->setWhatsThis( helpText ); m_ui->m_buttonTranslationsInstall->blockSignals( false ); } void KCMLocale::installTranslations() { // User has clicked Install Languages button, trigger distro specific install routine } void KCMLocale::initNumericDigitGrouping() { m_ui->m_comboNumericDigitGrouping->blockSignals( true ); m_ui->m_labelNumericDigitGrouping->setText( ki18n( "Digit grouping:" ).toString( m_kcmLocale ) ); QString helpText = ki18n( "

Here you can define the digit grouping used to display " "numbers.

Note that the digit grouping used to display " "monetary values has to be set separately (see the 'Money' tab).

" ).toString( m_kcmLocale ); 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( "

Here you can define the digit group separator used to display " "numbers.

Note that the digit group separator used to display " "monetary values has to be set separately (see the 'Money' tab).

" ).toString( m_kcmLocale ); 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( "

Here you can define the decimal separator used to display " "numbers (i.e. a dot or a comma in most countries).

Note " "that the decimal separator used to display monetary values has " "to be set separately (see the 'Money' tab).

" ).toString( m_kcmLocale ); 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( "

Here you can set the number of decimal places displayed for " "numeric values, i.e. the number of digits after the " "decimal separator.

Note that the decimal places used " "to display monetary values has to be set separately (see the " "'Money' tab).

" ).toString( m_kcmLocale ); 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( "

Here you can specify text used to prefix positive numbers. " "Most locales leave this blank.

Note that the positive sign " "used to display monetary values has to be set separately (see the " "'Money' tab).

" ).toString( m_kcmLocale ); 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(); initMonetaryDigitGrouping(); initMonetaryPositiveFormat(); } // 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(); initMonetaryDigitGrouping(); initMonetaryPositiveFormat(); } void KCMLocale::initNumericNegativeSign() { m_ui->m_comboNegativeSign->blockSignals( true ); m_ui->m_labelNegativeFormat->setText( ki18n( "Negative sign:" ).toString( m_kcmLocale ) ); QString helpText = ki18n( "

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 (-).

Note " "that the negative sign used to display monetary values has to " "be set separately (see the 'Money' tab).

" ).toString( m_kcmLocale ); 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() ) ); // Update the monetary format samples to relect new setting initMonetaryNegativeFormat(); } // 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() ) ); // Update the monetary format samples to relect new setting initMonetaryNegativeFormat(); } void KCMLocale::initNumericDigitSet() { m_ui->m_comboDigitSet->blockSignals( true ); m_ui->m_labelDigitSet->setText( ki18n( "Digit set:" ).toString( m_kcmLocale ) ); QString helpText = ki18n( "

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.

Note that the set of digits used to " "display monetary values has to be set separately (see the 'Money' " "tab).

" ).toString( m_kcmLocale ); 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::initCurrencyCode() { m_ui->m_comboCurrencyCode->blockSignals( true ); m_ui->m_labelCurrencyCode->setText( ki18n( "Currency:" ).toString( m_kcmLocale ) ); QString helpText = ki18n( "

Here you can choose the currency to be used when displaying " "monetary values, e.g. United States Dollar or Pound Sterling.

" ).toString( m_kcmLocale ); m_ui->m_comboCurrencyCode->setToolTip( helpText ); m_ui->m_comboCurrencyCode->setWhatsThis( helpText ); //Create the list of Currency Codes to choose from. //Visible text will be localised name plus unlocalised code. m_ui->m_comboCurrencyCode->clear(); //First put all the preferred currencies first in order of priority QStringList currencyCodeList = m_kcmLocale->currencyCodeList(); foreach ( const QString ¤cyCode, currencyCodeList ) { QString text = ki18nc( "@item currency name and currency code", "%1 (%2)") .subs( m_kcmLocale->currency()->currencyCodeToName( currencyCode ) ) .subs( currencyCode ) .toString( m_kcmLocale ); m_ui->m_comboCurrencyCode->addItem( text, QVariant( currencyCode ) ); } //Next put all currencies available in alphabetical name order m_ui->m_comboCurrencyCode->insertSeparator(m_ui->m_comboCurrencyCode->count()); currencyCodeList = m_kcmLocale->currency()->allCurrencyCodesList(); QStringList currencyNameList; foreach ( const QString ¤cyCode, currencyCodeList ) { currencyNameList.append( ki18nc( "@item currency name and currency code", "%1 (%2)") .subs( m_kcmLocale->currency()->currencyCodeToName( currencyCode ) ) .subs( currencyCode ) .toString( m_kcmLocale ) ); } currencyNameList.sort(); foreach ( const QString &name, currencyNameList ) { m_ui->m_comboCurrencyCode->addItem( name, QVariant( name.mid( name.length()-4, 3 ) ) ); } setCurrencyCode( m_kcmSettings.readEntry( "CurrencyCode", QString() ) ); m_ui->m_comboCurrencyCode->blockSignals( false ); } void KCMLocale::defaultCurrencyCode() { setCurrencyCode( m_defaultSettings.readEntry( "CurrencyCode", QString() ) ); } void KCMLocale::changedCurrencyCodeIndex( int index ) { setCurrencyCode( m_ui->m_comboCurrencyCode->itemData( index ).toString() ); } void KCMLocale::setCurrencyCode( const QString &newValue ) { setComboItem( "CurrencyCode", newValue, m_ui->m_comboCurrencyCode, m_ui->m_buttonDefaultCurrencyCode ); m_kcmLocale->setCurrencyCode( m_kcmSettings.readEntry( "CurrencyCode", QString() ) ); // Update the Currency dependent widgets with the new Currency details initCurrencySymbol(); } void KCMLocale::initCurrencySymbol() { m_ui->m_comboCurrencySymbol->blockSignals( true ); m_ui->m_labelCurrencySymbol->setText( ki18n( "Currency symbol:" ).toString( m_kcmLocale ) ); QString helpText = ki18n( "

Here you can choose the symbol to be used when displaying " "monetary values, e.g. $, US$ or USD.

" ).toString( m_kcmLocale ); m_ui->m_comboCurrencySymbol->setToolTip( helpText ); m_ui->m_comboCurrencySymbol->setWhatsThis( helpText ); //Create the list of Currency Symbols for the selected Currency Code m_ui->m_comboCurrencySymbol->clear(); QStringList currencySymbolList = m_kcmLocale->currency()->symbolList(); foreach ( const QString ¤cySymbol, currencySymbolList ) { if ( currencySymbol == m_kcmLocale->currency()->defaultSymbol() ) { m_ui->m_comboCurrencySymbol->addItem( currencySymbol, QVariant( QString() ) ); } else { m_ui->m_comboCurrencySymbol->addItem( currencySymbol, QVariant( currencySymbol ) ); } } if ( !currencySymbolList.contains( m_kcmSettings.readEntry( "CurrencySymbol", QString() ) ) ) { m_kcmSettings.deleteEntry( "CurrencySymbol" ); m_userSettings.deleteEntry( "CurrencySymbol", KConfig::Persistent | KConfig::Global ); } setCurrencySymbol( m_kcmSettings.readEntry( "CurrencySymbol", QString() ) ); m_ui->m_comboCurrencySymbol->blockSignals( false ); } void KCMLocale::defaultCurrencySymbol() { setCurrencySymbol( m_defaultSettings.readEntry( "CurrencySymbol", QString() ) ); } void KCMLocale::changedCurrencySymbolIndex( int index ) { setCurrencySymbol( m_ui->m_comboCurrencySymbol->itemData( index ).toString() ); } void KCMLocale::setCurrencySymbol( const QString &newValue ) { setComboItem( "CurrencySymbol", newValue, m_ui->m_comboCurrencySymbol, m_ui->m_buttonDefaultCurrencySymbol ); if ( m_kcmSettings.readEntry( "CurrencySymbol", QString() ) != QString() ) { m_kcmLocale->setCurrencySymbol( m_kcmSettings.readEntry( "CurrencySymbol", QString() ) ); } else { m_kcmLocale->setCurrencySymbol( m_kcmLocale->currency()->defaultSymbol() ); } // Update the monetary format samples to relect new setting initMonetaryDigitGrouping(); initMonetaryPositiveFormat(); initMonetaryNegativeFormat(); } void KCMLocale::initMonetaryDigitGrouping() { m_ui->m_comboMonetaryDigitGrouping->blockSignals( true ); m_ui->m_labelMonetaryDigitGrouping->setText( ki18n( "Digit grouping:" ).toString( m_kcmLocale ) ); QString helpText = ki18n( "

Here you can define the digit grouping used to display monetary " "values.

Note that the digit grouping used to display " "other numbers has to be defined separately (see the 'Numbers' tab)." "

" ).toString( m_kcmLocale ); m_ui->m_comboMonetaryDigitGrouping->setToolTip( helpText ); m_ui->m_comboMonetaryDigitGrouping->setWhatsThis( helpText ); initDigitGroupingCombo( m_ui->m_comboMonetaryDigitGrouping, "MonetaryDigitGroupFormat" ); setMonetaryDigitGrouping( m_kcmSettings.readEntry( "MonetaryDigitGroupFormat", "3" ) ); m_ui->m_comboMonetaryDigitGrouping->blockSignals( false ); } void KCMLocale::defaultMonetaryDigitGrouping() { setMonetaryDigitGrouping( m_defaultSettings.readEntry( "MonetaryDigitGroupFormat", "3" ) ); } void KCMLocale::changedMonetaryDigitGroupingIndex( int index ) { setMonetaryDigitGrouping( m_ui->m_comboMonetaryDigitGrouping->itemData( index ).toString() ); } void KCMLocale::setMonetaryDigitGrouping( const QString &newValue ) { setComboItem( "MonetaryDigitGroupFormat", newValue, m_ui->m_comboMonetaryDigitGrouping, m_ui->m_buttonDefaultMonetaryDigitGrouping ); // 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::initMonetaryThousandsSeparator() { m_ui->m_comboMonetaryThousandsSeparator->blockSignals( true ); m_ui->m_labelMonetaryThousandsSeparator->setText( ki18n( "Group separator:" ).toString( m_kcmLocale ) ); QString helpText = ki18n( "

Here you can define the group separator used to display monetary " "values.

Note that the thousands separator used to display " "other numbers has to be defined separately (see the 'Numbers' tab)." "

" ).toString( m_kcmLocale ); m_ui->m_comboMonetaryThousandsSeparator->setToolTip( helpText ); m_ui->m_comboMonetaryThousandsSeparator->setWhatsThis( helpText ); initSeparatorCombo( m_ui->m_comboMonetaryThousandsSeparator ); setMonetaryThousandsSeparator( m_kcmSettings.readEntry( "MonetaryThousandsSeparator", QString() ) .remove( QString::fromLatin1("$0") ) ); m_ui->m_comboMonetaryThousandsSeparator->blockSignals( false ); } void KCMLocale::defaultMonetaryThousandsSeparator() { setMonetaryThousandsSeparator( m_defaultSettings.readEntry( "MonetaryThousandsSeparator", QString() ) .remove( QString::fromLatin1("$0") ) ); } void KCMLocale::changedMonetaryThousandsSeparator( const QString &newValue ) { QString useValue = newValue; int item = m_ui->m_comboMonetaryThousandsSeparator->findText( newValue ); if ( item >= 0 ) { useValue = m_ui->m_comboMonetaryThousandsSeparator->itemData( item ).toString(); m_ui->m_comboMonetaryThousandsSeparator->setEditText( useValue ); } if ( useValue == QString(' ') ) { useValue = "$0 $0"; } setItem( "MonetaryThousandsSeparator", useValue, m_ui->m_comboMonetaryThousandsSeparator, m_ui->m_buttonDefaultMonetaryThousandsSeparator ); m_kcmLocale->setMonetaryThousandsSeparator( m_kcmSettings.readEntry( "MonetaryThousandsSeparator", QString() ) .remove( QString::fromLatin1("$0") ) ); // Update the monetary format samples to relect new setting initMonetaryDigitGrouping(); initMonetaryPositiveFormat(); initMonetaryNegativeFormat(); updateSample(); } void KCMLocale::setMonetaryThousandsSeparator( const QString &newValue ) { changedMonetaryThousandsSeparator( newValue ); m_ui->m_comboMonetaryThousandsSeparator->setEditText( m_kcmSettings.readEntry( "MonetaryThousandsSeparator", QString() ) .remove( QString::fromLatin1("$0") ) ); } void KCMLocale::initMonetaryDecimalSymbol() { m_ui->m_comboMonetaryDecimalSymbol->blockSignals( true ); m_ui->m_labelMonetaryDecimalSymbol->setText( ki18n( "Decimal separator:" ).toString( m_kcmLocale ) ); QString helpText = ki18n( "

Here you can define the decimal separator used to display " "monetary values.

Note that the decimal separator used to " "display other numbers has to be defined separately (see the " "'Numbers' tab).

" ).toString( m_kcmLocale ); m_ui->m_comboMonetaryDecimalSymbol->setToolTip( helpText ); m_ui->m_comboMonetaryDecimalSymbol->setWhatsThis( helpText ); initSeparatorCombo( m_ui->m_comboMonetaryDecimalSymbol ); setMonetaryDecimalSymbol( m_kcmSettings.readEntry( "MonetaryDecimalSymbol", QString() ) ); m_ui->m_comboMonetaryDecimalSymbol->blockSignals( false ); } void KCMLocale::defaultMonetaryDecimalSymbol() { setMonetaryDecimalSymbol( m_defaultSettings.readEntry( "MonetaryDecimalSymbol", QString() ) ); } void KCMLocale::changedMonetaryDecimalSymbol( const QString &newValue ) { QString useValue = newValue; int item = m_ui->m_comboMonetaryDecimalSymbol->findText( newValue ); if ( item >= 0 ) { useValue = m_ui->m_comboMonetaryDecimalSymbol->itemData( item ).toString(); } setItem( "MonetaryDecimalSymbol", useValue, m_ui->m_comboMonetaryDecimalSymbol, m_ui->m_buttonDefaultMonetaryDecimalSymbol ); m_kcmLocale->setMonetaryDecimalSymbol( m_kcmSettings.readEntry( "MonetaryDecimalSymbol", QString() ) ); // Update the monetary format samples to relect new setting initMonetaryDigitGrouping(); initMonetaryPositiveFormat(); initMonetaryNegativeFormat(); } void KCMLocale::setMonetaryDecimalSymbol( const QString &newValue ) { setEditComboItem( "MonetaryDecimalSymbol", newValue, m_ui->m_comboMonetaryDecimalSymbol, m_ui->m_buttonDefaultMonetaryDecimalSymbol ); m_kcmLocale->setMonetaryDecimalSymbol( m_kcmSettings.readEntry( "MonetaryDecimalSymbol", QString() ) ); // Update the monetary format samples to relect new setting initMonetaryDigitGrouping(); initMonetaryPositiveFormat(); initMonetaryNegativeFormat(); } void KCMLocale::initMonetaryDecimalPlaces() { m_ui->m_intMonetaryDecimalPlaces->blockSignals( true ); m_ui->m_labelMonetaryDecimalPlaces->setText( ki18n( "Decimal places:" ).toString( m_kcmLocale ) ); QString helpText = ki18n( "

Here you can set the number of decimal places displayed for " "monetary values, i.e. the number of digits after the " "decimal separator.

Note that the decimal places used to " "display other numbers has to be defined separately (see the " "'Numbers' tab).

" ).toString( m_kcmLocale ); m_ui->m_intMonetaryDecimalPlaces->setToolTip( helpText ); m_ui->m_intMonetaryDecimalPlaces->setWhatsThis( helpText ); setMonetaryDecimalPlaces( m_kcmSettings.readEntry( "MonetaryDecimalPlaces", 0 ) ); m_ui->m_intMonetaryDecimalPlaces->blockSignals( false ); } void KCMLocale::defaultMonetaryDecimalPlaces() { setMonetaryDecimalPlaces( m_defaultSettings.readEntry( "MonetaryDecimalPlaces", 0 ) ); } void KCMLocale::changedMonetaryDecimalPlaces( int newValue ) { setMonetaryDecimalPlaces( newValue ); } void KCMLocale::setMonetaryDecimalPlaces( int newValue ) { setIntItem( "MonetaryDecimalPlaces", newValue, m_ui->m_intMonetaryDecimalPlaces, m_ui->m_buttonDefaultMonetaryDecimalPlaces ); m_kcmLocale->setMonetaryDecimalPlaces( m_kcmSettings.readEntry( "MonetaryDecimalPlaces", 0 ) ); // Update the monetary format samples to relect new setting initMonetaryDigitGrouping(); initMonetaryPositiveFormat(); initMonetaryNegativeFormat(); } void KCMLocale::insertMonetaryPositiveFormat( bool prefixCurrencySymbol, KLocale::SignPosition signPosition ) { KLocale custom( *m_kcmLocale ); custom.setPositivePrefixCurrencySymbol( prefixCurrencySymbol ); custom.setPositiveMonetarySignPosition( signPosition ); QVariantList options; options.append( QVariant( prefixCurrencySymbol ) ); options.append( QVariant( signPosition ) ); m_ui->m_comboMonetaryPositiveFormat->addItem( custom.formatMoney( 123456.78 ), options ); } void KCMLocale::initMonetaryPositiveFormat() { m_ui->m_comboMonetaryPositiveFormat->blockSignals( true ); m_ui->m_labelMonetaryPositiveFormat->setText( ki18n( "Positive format:" ).toString( m_kcmLocale ) ); QString helpText = ki18n( "

Here you can set the format of positive monetary values.

" "

Note that the positive sign used to display other numbers has " "to be defined separately (see the 'Numbers' tab).

" ).toString( m_kcmLocale ); m_ui->m_comboMonetaryPositiveFormat->setToolTip( helpText ); m_ui->m_comboMonetaryPositiveFormat->setWhatsThis( helpText ); m_ui->m_comboMonetaryPositiveFormat->clear(); // If the positive sign is null, then all the sign options will look the same, so only show a // choice between parens and no sign, but preserve original position in case they do set sign // Also keep options in same order, i.e. sign options then parens option if ( m_kcmSettings.readEntry( "PositiveSign", QString() ).isEmpty() ) { KLocale::SignPosition currentSignPosition = (KLocale::SignPosition) m_currentSettings.readEntry( "PositiveMonetarySignPosition", 0 ); KLocale::SignPosition kcmSignPosition = (KLocale::SignPosition) m_kcmSettings.readEntry( "PositiveMonetarySignPosition", 0 ); if ( currentSignPosition == KLocale::ParensAround && kcmSignPosition == KLocale::ParensAround ) { //Both are parens, so also give a sign option insertMonetaryPositiveFormat( true, KLocale::BeforeQuantityMoney ); insertMonetaryPositiveFormat( false, KLocale::BeforeQuantityMoney ); insertMonetaryPositiveFormat( true, kcmSignPosition ); insertMonetaryPositiveFormat( false, kcmSignPosition ); } else if ( kcmSignPosition == KLocale::ParensAround ) { //kcm is parens, current is sign, use both in right order insertMonetaryPositiveFormat( true, currentSignPosition ); insertMonetaryPositiveFormat( false, currentSignPosition ); insertMonetaryPositiveFormat( true, kcmSignPosition ); insertMonetaryPositiveFormat( false, kcmSignPosition ); } else { // kcm is sign, current is parens, use both in right order insertMonetaryPositiveFormat( true, kcmSignPosition ); insertMonetaryPositiveFormat( false, kcmSignPosition ); insertMonetaryPositiveFormat( true, currentSignPosition ); insertMonetaryPositiveFormat( false, currentSignPosition ); } } else { // Show the sign options first, then parens // Could do a loop, but lets keep it simple insertMonetaryPositiveFormat( true, KLocale::BeforeQuantityMoney ); insertMonetaryPositiveFormat( false, KLocale::BeforeQuantityMoney ); insertMonetaryPositiveFormat( true, KLocale::AfterQuantityMoney ); insertMonetaryPositiveFormat( false, KLocale::AfterQuantityMoney ); insertMonetaryPositiveFormat( true, KLocale::BeforeMoney ); insertMonetaryPositiveFormat( false, KLocale::BeforeMoney ); insertMonetaryPositiveFormat( true, KLocale::AfterMoney ); insertMonetaryPositiveFormat( false, KLocale::AfterMoney ); insertMonetaryPositiveFormat( true, KLocale::ParensAround ); insertMonetaryPositiveFormat( false, KLocale::ParensAround ); } setMonetaryPositiveFormat( m_kcmSettings.readEntry( "PositivePrefixCurrencySymbol", false ), (KLocale::SignPosition) m_defaultSettings.readEntry( "PositiveMonetarySignPosition", 0 ) ); // These are the old strings, keep around for now in case new implementation isn't usable QString format = ki18n( "Sign position:" ).toString( m_kcmLocale ); format = ki18n( "Parentheses Around" ).toString( m_kcmLocale ); format = ki18n( "Before Quantity Money" ).toString( m_kcmLocale ); format = ki18n( "After Quantity Money" ).toString( m_kcmLocale ); format = ki18n( "Before Money" ).toString( m_kcmLocale ); format = ki18n( "After Money" ).toString( m_kcmLocale ); format = ki18n( "Here you can select how a positive sign will be " "positioned. This only affects monetary values." ).toString( m_kcmLocale ); QString check = ki18n( "Prefix currency symbol" ).toString( m_kcmLocale ); check = ki18n( "If this option is checked, the currency sign " "will be prefixed (i.e. to the left of the " "value) for all positive monetary values. If " "not, it will be postfixed (i.e. to the right)." ).toString( m_kcmLocale ); m_ui->m_comboMonetaryPositiveFormat->blockSignals( false ); } void KCMLocale::defaultMonetaryPositiveFormat() { setMonetaryPositiveFormat( m_defaultSettings.readEntry( "PositivePrefixCurrencySymbol", false ), (KLocale::SignPosition) m_defaultSettings.readEntry( "PositiveMonetarySignPosition", 0 ) ); } void KCMLocale::changedMonetaryPositiveFormatIndex( int index ) { QVariantList options = m_ui->m_comboMonetaryPositiveFormat->itemData( index ).toList(); bool prefixCurrencySymbol = options.at( 0 ).toBool(); KLocale::SignPosition signPosition = (KLocale::SignPosition) options.at( 1 ).toInt(); setMonetaryPositiveFormat( prefixCurrencySymbol, signPosition ); } void KCMLocale::setMonetaryFormat( const QString &prefixCurrencySymbolKey, bool prefixCurrencySymbol, const QString &signPositionKey, KLocale::SignPosition signPosition, QWidget *formatWidget, KPushButton *formatDefaultButton ) { // 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( prefixCurrencySymbolKey ) || m_userSettings.isEntryImmutable( signPositionKey ) ) { formatWidget->setEnabled( false ); formatDefaultButton->setEnabled( false ); } else { formatWidget->setEnabled( true ); formatDefaultButton->setEnabled( false ); m_kcmSettings.writeEntry( prefixCurrencySymbolKey, prefixCurrencySymbol ); m_kcmSettings.writeEntry( signPositionKey, (int) signPosition ); // If the new value is not the default (i.e. is set in user), then save it and enable the default button if ( prefixCurrencySymbol != m_defaultSettings.readEntry( prefixCurrencySymbolKey, false ) ) { m_userSettings.writeEntry( prefixCurrencySymbolKey, prefixCurrencySymbol, KConfig::Persistent | KConfig::Global ); formatDefaultButton->setEnabled( true ); } else { // Is the default so delete any user setting m_userSettings.deleteEntry( prefixCurrencySymbolKey, KConfig::Persistent | KConfig::Global ); } // If the new value is not the default (i.e. is set in user), then save it and enable the default button if ( signPosition != m_defaultSettings.readEntry( signPositionKey, 0 ) ) { m_userSettings.writeEntry( signPositionKey, (int) signPosition, KConfig::Persistent | KConfig::Global ); formatDefaultButton->setEnabled( true ); } else { // Is the default so delete any user setting m_userSettings.deleteEntry( signPositionKey, KConfig::Persistent | KConfig::Global ); } checkIfChanged(); } } void KCMLocale::setMonetaryPositiveFormat( bool prefixCurrencySymbol, KLocale::SignPosition signPosition ) { setMonetaryFormat( "PositivePrefixCurrencySymbol", prefixCurrencySymbol, "PositiveMonetarySignPosition", signPosition, m_ui->m_comboMonetaryPositiveFormat, m_ui->m_buttonDefaultMonetaryPositiveFormat ); // Read back the kcm values and use them in the sample locale prefixCurrencySymbol = m_kcmSettings.readEntry( "PositivePrefixCurrencySymbol", false ); signPosition = (KLocale::SignPosition) m_kcmSettings.readEntry( "PositiveMonetarySignPosition", 0 ); m_kcmLocale->setPositivePrefixCurrencySymbol( prefixCurrencySymbol ); m_kcmLocale->setPositiveMonetarySignPosition( signPosition ); // Set the combo to the kcm value QVariantList options; options.append( QVariant( prefixCurrencySymbol ) ); options.append( QVariant( signPosition ) ); int index = m_ui->m_comboMonetaryPositiveFormat->findData( options ); m_ui->m_comboMonetaryPositiveFormat->setCurrentIndex( index ); } void KCMLocale::insertMonetaryNegativeFormat( bool prefixCurrencySymbol, KLocale::SignPosition signPosition ) { KLocale custom( *m_kcmLocale ); custom.setNegativePrefixCurrencySymbol( prefixCurrencySymbol ); custom.setNegativeMonetarySignPosition( signPosition ); QVariantList options; options.append( QVariant( prefixCurrencySymbol ) ); options.append( QVariant( signPosition ) ); m_ui->m_comboMonetaryNegativeFormat->addItem( custom.formatMoney( -123456.78 ), options ); } void KCMLocale::initMonetaryNegativeFormat() { m_ui->m_comboMonetaryNegativeFormat->blockSignals( true ); m_ui->m_labelMonetaryNegativeFormat->setText( ki18n( "Negative format:" ).toString( m_kcmLocale ) ); QString helpText = ki18n( "

Here you can set the format of negative monetary values.

" "

Note that the negative sign used to display other numbers has " "to be defined separately (see the 'Numbers' tab).

" ).toString( m_kcmLocale ); m_ui->m_comboMonetaryNegativeFormat->setToolTip( helpText ); m_ui->m_comboMonetaryNegativeFormat->setWhatsThis( helpText ); QString format = ki18n( "Sign position:" ).toString( m_kcmLocale ); format = ki18n( "Parentheses Around" ).toString( m_kcmLocale ); format = ki18n( "Before Quantity Money" ).toString( m_kcmLocale ); format = ki18n( "After Quantity Money" ).toString( m_kcmLocale ); format = ki18n( "Before Money" ).toString( m_kcmLocale ); format = ki18n( "After Money" ).toString( m_kcmLocale ); format = ki18n( "Here you can select how a negative sign will " "be positioned. This only affects monetary " "values." ).toString( m_kcmLocale ); QString check = ki18n( "Prefix currency symbol" ).toString( m_kcmLocale ); check = ki18n( "If this option is checked, the currency sign " "will be prefixed (i.e. to the left of the " "value) for all negative monetary values. If " "not, it will be postfixed (i.e. to the right)." ).toString( m_kcmLocale ); m_ui->m_comboMonetaryNegativeFormat->clear(); // If the negative sign is null, then all the sign options will look the same, so only show a // choice between parens and no sign, but preserve original position in case they do set sign // Also keep options in same order, i.e. sign options then parens option if ( m_kcmSettings.readEntry( "NegativeSign", QString() ).isEmpty() ) { KLocale::SignPosition currentSignPosition = (KLocale::SignPosition) m_currentSettings.readEntry( "NegativeMonetarySignPosition", 0 ); KLocale::SignPosition kcmSignPosition = (KLocale::SignPosition) m_kcmSettings.readEntry( "NegativeMonetarySignPosition", 0 ); if ( currentSignPosition == KLocale::ParensAround && kcmSignPosition == KLocale::ParensAround ) { //Both are parens, so also give a sign option insertMonetaryNegativeFormat( true, KLocale::BeforeQuantityMoney ); insertMonetaryNegativeFormat( false, KLocale::BeforeQuantityMoney ); insertMonetaryNegativeFormat( true, kcmSignPosition ); insertMonetaryNegativeFormat( false, kcmSignPosition ); } else if ( kcmSignPosition == KLocale::ParensAround ) { //kcm is parens, current is sign, use both in right order insertMonetaryNegativeFormat( true, currentSignPosition ); insertMonetaryNegativeFormat( false, currentSignPosition ); insertMonetaryNegativeFormat( true, kcmSignPosition ); insertMonetaryNegativeFormat( false, kcmSignPosition ); } else { // kcm is sign, current is parens, use both in right order insertMonetaryNegativeFormat( true, kcmSignPosition ); insertMonetaryNegativeFormat( false, kcmSignPosition ); insertMonetaryNegativeFormat( true, currentSignPosition ); insertMonetaryNegativeFormat( false, currentSignPosition ); } } else { // Show the sign options first, then parens insertMonetaryNegativeFormat( true, KLocale::BeforeQuantityMoney ); insertMonetaryNegativeFormat( false, KLocale::BeforeQuantityMoney ); insertMonetaryNegativeFormat( true, KLocale::AfterQuantityMoney ); insertMonetaryNegativeFormat( false, KLocale::AfterQuantityMoney ); insertMonetaryNegativeFormat( true, KLocale::BeforeMoney ); insertMonetaryNegativeFormat( false, KLocale::BeforeMoney ); insertMonetaryNegativeFormat( true, KLocale::AfterMoney ); insertMonetaryNegativeFormat( false, KLocale::AfterMoney ); insertMonetaryNegativeFormat( true, KLocale::ParensAround ); insertMonetaryNegativeFormat( false, KLocale::ParensAround ); } setMonetaryNegativeFormat( m_kcmSettings.readEntry( "NegativePrefixCurrencySymbol", false ), (KLocale::SignPosition) m_defaultSettings.readEntry( "NegativeMonetarySignPosition", 0 ) ); m_ui->m_comboMonetaryNegativeFormat->blockSignals( false ); } void KCMLocale::defaultMonetaryNegativeFormat() { setMonetaryNegativeFormat( m_defaultSettings.readEntry( "NegativePrefixCurrencySymbol", false ), (KLocale::SignPosition) m_defaultSettings.readEntry( "NegativeMonetarySignPosition", 0 ) ); } void KCMLocale::changedMonetaryNegativeFormatIndex( int index ) { QVariantList options = m_ui->m_comboMonetaryNegativeFormat->itemData( index ).toList(); bool prefixCurrencySymbol = options.at( 0 ).toBool(); KLocale::SignPosition signPosition = (KLocale::SignPosition) options.at( 1 ).toInt(); setMonetaryNegativeFormat( prefixCurrencySymbol, signPosition ); } void KCMLocale::setMonetaryNegativeFormat( bool prefixCurrencySymbol, KLocale::SignPosition signPosition ) { setMonetaryFormat( "NegativePrefixCurrencySymbol", prefixCurrencySymbol, "NegativeMonetarySignPosition", signPosition, m_ui->m_comboMonetaryNegativeFormat, m_ui->m_buttonDefaultMonetaryNegativeFormat ); // Read back the kcm values and use them in the sample locale prefixCurrencySymbol = m_kcmSettings.readEntry( "NegativePrefixCurrencySymbol", false ); signPosition = (KLocale::SignPosition) m_kcmSettings.readEntry( "NegativeMonetarySignPosition", 0 ); m_kcmLocale->setNegativePrefixCurrencySymbol( prefixCurrencySymbol ); m_kcmLocale->setNegativeMonetarySignPosition( signPosition ); // Set the combo to the kcm value QVariantList options; options.append( QVariant( prefixCurrencySymbol ) ); options.append( QVariant( signPosition ) ); int index = m_ui->m_comboMonetaryNegativeFormat->findData( options ); m_ui->m_comboMonetaryNegativeFormat->setCurrentIndex( index ); updateSample(); } void KCMLocale::initMonetaryDigitSet() { m_ui->m_comboMonetaryDigitSet->blockSignals( true ); m_ui->m_labelMonetaryDigitSet->setText( ki18n( "Digit set:" ).toString( m_kcmLocale ) ); QString helpText = ki18n( "

Here you can define the set of digits used to display monetary " "values. 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.

Note that the set of digits " "used to display other numbers has to be defined separately (see the " "'Numbers' tab).

" ).toString( m_kcmLocale ); m_ui->m_comboMonetaryDigitSet->setToolTip( helpText ); m_ui->m_comboMonetaryDigitSet->setWhatsThis( helpText ); initDigitSetCombo( m_ui->m_comboMonetaryDigitSet ); setMonetaryDigitSet( m_kcmSettings.readEntry( "MonetaryDigitSet", 0 ) ); m_ui->m_comboMonetaryDigitSet->blockSignals( false ); } void KCMLocale::defaultMonetaryDigitSet() { setMonetaryDigitSet( m_defaultSettings.readEntry( "MonetaryDigitSet", 0 ) ); } void KCMLocale::changedMonetaryDigitSetIndex( int index ) { setMonetaryDigitSet( m_ui->m_comboMonetaryDigitSet->itemData( index ).toInt() ); } void KCMLocale::setMonetaryDigitSet( int newValue ) { setComboItem( "MonetaryDigitSet", newValue, m_ui->m_comboMonetaryDigitSet, m_ui->m_buttonDefaultMonetaryDigitSet ); m_kcmLocale->setMonetaryDigitSet( (KLocale::DigitSet) m_kcmSettings.readEntry( "MonetaryDigitSet", 0 ) ); // Update the monetary format samples to relect new setting initMonetaryDigitGrouping(); initMonetaryPositiveFormat(); initMonetaryNegativeFormat(); } void KCMLocale::initCalendarSystem() { m_ui->m_comboCalendarSystem->blockSignals( true ); m_ui->m_labelCalendarSystem->setText( ki18n( "Calendar system:" ).toString( m_kcmLocale ) ); QString helpText = ki18n( "

Here you can set the Calendar System to use to display dates.

" ).toString( m_kcmLocale ); m_ui->m_comboCalendarSystem->setToolTip( helpText ); m_ui->m_comboCalendarSystem->setWhatsThis( helpText ); m_ui->m_comboCalendarSystem->clear(); QList calendarSystems = KCalendarSystem::calendarSystemsList(); foreach ( const KLocale::CalendarSystem &calendarType, calendarSystems ) { m_ui->m_comboCalendarSystem->addItem( KCalendarSystem::calendarLabel(calendarType , m_kcmLocale ), 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(); initWorkingWeekStartDay(); initWorkingWeekEndDay(); initWeekDayOfPray(); 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( "

This option determines if the Common Era (CE/BCE) should be used " "instead of the Christian Era (AD/BC).

" ).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( "

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.

" ).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( "

This option determines how the Week Number will be calculated. " "There are four options available:

" "
    " "
  • ISO Week 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.
  • " "
  • Full First Week The first week of the year starts on the " "first occurrence of the First day of the week, 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.
  • " "
  • Partial First Week The first week starts on the first day " "of the year. The second week of the year starts on the first " "occurrence of the First day of the week, and lasts for " "seven days. The first week may not contain seven days.
  • " "
  • Simple Week 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.
  • " "
" ).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( "

This option determines which day will be considered as the first " "one of the week. This value may affect the Week Number System.

" ).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::initWorkingWeekStartDay() { m_ui->m_comboWorkingWeekStartDay->blockSignals( true ); m_ui->m_labelWorkingWeekStartDay->setText( ki18n( "First working day of week:" ).toString( m_kcmLocale ) ); QString helpText = ki18n( "

This option determines which day will be considered as the first " "working day of the week.

" ).toString( m_kcmLocale ); m_ui->m_comboWorkingWeekStartDay->setToolTip( helpText ); m_ui->m_comboWorkingWeekStartDay->setWhatsThis( helpText ); initWeekDayCombo( m_ui->m_comboWorkingWeekStartDay ); setWorkingWeekStartDay( m_kcmSettings.readEntry( "WorkingWeekStartDay", 0 ) ); m_ui->m_comboWorkingWeekStartDay->blockSignals( false ); } void KCMLocale::defaultWorkingWeekStartDay() { setWorkingWeekStartDay( m_defaultSettings.readEntry( "WorkingWeekStartDay", 0 ) ); } void KCMLocale::changedWorkingWeekStartDayIndex( int index ) { setWorkingWeekStartDay( m_ui->m_comboWorkingWeekStartDay->itemData( index ).toInt() ); } void KCMLocale::setWorkingWeekStartDay( int newValue ) { setComboItem( "WorkingWeekStartDay", newValue, m_ui->m_comboWorkingWeekStartDay, m_ui->m_buttonDefaultWorkingWeekStartDay ); m_kcmLocale->setWorkingWeekStartDay( m_kcmSettings.readEntry( "WorkingWeekStartDay", 0 ) ); } void KCMLocale::initWorkingWeekEndDay() { m_ui->m_comboWorkingWeekEndDay->blockSignals( true ); m_ui->m_labelWorkingWeekEndDay->setText( ki18n( "Last working day of week:" ).toString( m_kcmLocale ) ); QString helpText = ki18n( "

This option determines which day will be considered as the last " "working day of the week.

" ).toString( m_kcmLocale ); m_ui->m_comboWorkingWeekEndDay->setToolTip( helpText ); m_ui->m_comboWorkingWeekEndDay->setWhatsThis( helpText ); initWeekDayCombo( m_ui->m_comboWorkingWeekEndDay ); setWorkingWeekEndDay( m_kcmSettings.readEntry( "WorkingWeekEndDay", 0 ) ); m_ui->m_comboWorkingWeekEndDay->blockSignals( false ); } void KCMLocale::defaultWorkingWeekEndDay() { setWorkingWeekEndDay( m_defaultSettings.readEntry( "WorkingWeekEndDay", 0 ) ); } void KCMLocale::changedWorkingWeekEndDayIndex( int index ) { setWorkingWeekEndDay( m_ui->m_comboWorkingWeekEndDay->itemData( index ).toInt() ); } void KCMLocale::setWorkingWeekEndDay( int newValue ) { setComboItem( "WorkingWeekEndDay", newValue, m_ui->m_comboWorkingWeekEndDay, m_ui->m_buttonDefaultWorkingWeekEndDay ); m_kcmLocale->setWorkingWeekEndDay( m_kcmSettings.readEntry( "WorkingWeekEndDay", 0 ) ); } void KCMLocale::initWeekDayOfPray() { m_ui->m_comboWeekDayOfPray->blockSignals( true ); m_ui->m_labelWeekDayOfPray->setText( ki18n( "Week day for special religious observance:" ).toString( m_kcmLocale ) ); QString helpText = ki18n( "

This option determines which day if any will be considered as " "the day of the week for special religious observance.

" ).toString( m_kcmLocale ); m_ui->m_comboWeekDayOfPray->setToolTip( helpText ); m_ui->m_comboWeekDayOfPray->setWhatsThis( helpText ); initWeekDayCombo( m_ui->m_comboWeekDayOfPray ); m_ui->m_comboWeekDayOfPray->insertItem( 0, ki18nc( "Day name list, option for no special day of religious observance", "None / None in particular" ).toString( m_kcmLocale ) ); setWeekDayOfPray( m_kcmSettings.readEntry( "WeekDayOfPray", 0 ) ); m_ui->m_comboWeekDayOfPray->blockSignals( false ); } void KCMLocale::defaultWeekDayOfPray() { setWeekDayOfPray( m_defaultSettings.readEntry( "WeekDayOfPray", 0 ) ); } void KCMLocale::changedWeekDayOfPrayIndex( int index ) { setWeekDayOfPray( m_ui->m_comboWeekDayOfPray->itemData( index ).toInt() ); } void KCMLocale::setWeekDayOfPray( int newValue ) { setComboItem( "WeekDayOfPray", newValue, m_ui->m_comboWeekDayOfPray, m_ui->m_buttonDefaultWeekDayOfPray ); m_kcmLocale->setWeekDayOfPray( m_kcmSettings.readEntry( "WeekDayOfPray", 0 ) ); } void KCMLocale::initTimeFormat() { m_ui->m_comboTimeFormat->blockSignals( true ); m_ui->m_labelTimeFormat->setText( ki18n( "Time format:" ).toString( m_kcmLocale ) ); QString helpText = ki18n( "

The text in this textbox will be used to format time strings. " "The sequences below will be replaced:

" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "
HHThe hour as a decimal number using a 24-hour clock (00-23).
hHThe hour (24-hour clock) as a decimal number (0-23).
PHThe hour as a decimal number using a 12-hour clock (01-12).
pHThe hour (12-hour clock) as a decimal number (1-12).
MMThe minutes as a decimal number (00-59).
SSThe seconds as a decimal number (00-59).
AMPMEither 'AM' or 'PM' according to the given time value. " "Noon is treated as 'PM' and midnight as 'AM'.
" ).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( "

Here you can set the text to be displayed for AM.

" ).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( "

Here you can set the text to be displayed for PM.

" ).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( "

The text in this textbox will be used to format long dates. " "The sequences below will be replaced:

" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "
YYYYThe year with century as a decimal number.
YYThe year without century as a decimal number (00-99).
MMThe month as a decimal number (01-12).
mMThe month as a decimal number (1-12).
SHORTMONTHThe first three characters of the month name.
MONTHThe full month name.
DDThe day of month as a decimal number (01-31).
dDThe day of month as a decimal number (1-31).
SHORTWEEKDAYThe first three characters of the weekday name.
WEEKDAYThe full weekday name.
ERAYEARThe Era Year in local format (e.g. 2000 AD).
SHORTERANAMEThe short Era Name.
YEARINERAThe Year in Era as a decimal number.
DAYOFYEARThe Day of Year as a decimal number.
ISOWEEKThe ISO Week as a decimal number.
DAYOFISOWEEKThe Day of the ISO Week as a decimal number.
" ).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( "

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:

" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "
YYYYThe year with century as a decimal number.
YYThe year without century as a decimal number (00-99).
MMThe month as a decimal number (01-12).
mMThe month as a decimal number (1-12).
SHORTMONTHThe first three characters of the month name.
MONTHThe full month name.
DDThe day of month as a decimal number (01-31).
dDThe day of month as a decimal number (1-31).
SHORTWEEKDAYThe first three characters of the weekday name.
WEEKDAYThe full weekday name.
ERAYEARThe Era Year in local format (e.g. 2000 AD).
SHORTERANAMEThe short Era Name.
YEARINERAThe Year in Era as a decimal number.
DAYOFYEARThe Day of Year as a decimal number.
ISOWEEKThe ISO Week as a decimal number.
DAYOFISOWEEKThe Day of the ISO Week as a decimal number.
" ).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( "

This option determines whether possessive form of month names " "should be used in dates.

" ).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( "

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.

Note that the set of " "digits used to display numeric and monetary values have to be set " "separately (see the 'Numbers' or 'Money' tabs).

" ).toString( m_kcmLocale ); 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( "

Here you can define the default page size to be used in new " "documents.

Note that this setting has no effect on printer " "paper size.

" ).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( "

Here you can define the measurement system to use.

" ).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( "

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." "

    " "
  • To reduce confusion you can use the recently standardized IEC " "units which are always in multiples of 1024.
  • " "
  • You can also select metric, which is always in units of 1000.
  • " "
  • Selecting JEDEC restores the older-style units used in KDE 3.5 " "and some other operating systems.
  • " "
" "

" ).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 &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 &map ) const { QMultiMap sizeMap; QMap::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 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; } #include "moc_kcmlocale.cpp"