From bf97fd1a080f18d1dc1679f554bcbc83f0eb8e7c Mon Sep 17 00:00:00 2001 From: Michael Haeckel Date: Sat, 21 Oct 2000 16:49:00 +0000 Subject: [PATCH] It is now possible to switch the language for the reply phrases. svn path=/trunk/kdenetwork/kmail/; revision=68490 --- configuredialog.cpp | 276 ++++++++++++++++++++++++++++++++++++++------ configuredialog.h | 63 ++++++++-- kmmessage.cpp | 38 ++++-- 3 files changed, 325 insertions(+), 52 deletions(-) diff --git a/configuredialog.cpp b/configuredialog.cpp index 76f9cd783..c80956763 100644 --- a/configuredialog.cpp +++ b/configuredialog.cpp @@ -366,6 +366,93 @@ QString RenameIdentityDialog::identityText( void ) +NewLanguageDialog::NewLanguageDialog( QWidget *parent, const char *name, + bool modal, LanguageItem *langList ) + :KDialogBase( parent, name, modal, i18n("New Language"), Ok|Cancel|Help, Ok, + true ) +{ + QFrame *page = makeMainWidget(); + QHBoxLayout *hlay = new QHBoxLayout( page, 0, spacingHint() ); + QLabel *label = new QLabel( i18n("Language:"), page ); + hlay->addWidget( label ); + mComboBox = new QComboBox( page ); + hlay->addWidget( mComboBox, 1 ); + QStringList langlist = KGlobal::dirs()->findAllResources( "locale", + "*/entry.desktop" ); + LanguageItem *l; + for ( QStringList::ConstIterator it = langlist.begin(); + it != langlist.end(); ++it ) + { + KSimpleConfig entry( *it ); + entry.setGroup( "KCM Locale" ); + QString name = entry.readEntry( "Name" ); + QString path = *it; + int index = path.findRev('/'); + path = path.left(index); + index = path.findRev('/'); + path = path.mid(index+1); + l = langList; + while (l && l->mLanguage != path) l = l->next; + if (!l) + { + QString output = name + " (" + path + ")"; + QPixmap flag( locate("locale", path + "/flag.png") ); + mComboBox->insertItem( flag, output ); + } + } + if (mComboBox->count() == 0) + { + mComboBox->insertItem( i18n("No more languages available") ); + enableButtonOK( false ); + } else mComboBox->listBox()->sort(); +} + +const QString NewLanguageDialog::language( void ) +{ + QString s = QString( mComboBox->currentText() ); + int i = s.findRev( "(" ); + return( s.mid( i + 1, s.length() - i - 2 ) ); +} + +LanguageComboBox::LanguageComboBox( bool rw, QWidget *parent, const char *name ) + :QComboBox( rw, parent, name ) +{ +} + +int LanguageComboBox::insertLanguage( const QString & language ) +{ + KSimpleConfig entry( locate("locale", language + "/entry.desktop") ); + entry.setGroup( "KCM Locale" ); + QString name = entry.readEntry( "Name" ); + QString output = name + " (" + language + ")"; + insertItem( QPixmap( locate("locale", language + "/flag.png") ), + output ); + listBox()->sort(); + return listBox()->index( listBox()->findItem(output) ); +} + +const QString LanguageComboBox::language( void ) +{ + QString s = QString( currentText() ); + int i = s.findRev( "(" ); + return( s.mid( i + 1, s.length() - i - 2 ) ); +} + +void LanguageComboBox::setLanguage( const QString & language ) +{ + for (int i = 0; i < count(); i++) + if (text(i).find(QString("(%1)").arg(language)) >= 0) setCurrentItem(i); +} + +LanguageItem::LanguageItem( const QString& language, const QString& reply, + const QString& replyAll, const QString& forward, const QString& indentPrefix ) +{ + mLanguage = language; + mReply = reply; + mReplyAll = replyAll; + mForward = forward; + mIndentPrefix = indentPrefix; +} ConfigureDialog::ConfigureDialog( QWidget *parent, const char *name, bool modal ) @@ -867,7 +954,7 @@ void ConfigureDialog::makeComposerPage( void ) QGroupBox *group = new QGroupBox(i18n("Phrases"), page ); topLevel->addWidget( group ); - QGridLayout *glay = new QGridLayout( group, 6, 2, spacingHint() ); + QGridLayout *glay = new QGridLayout( group, 8, 2, spacingHint() ); glay->addRowSpacing( 0, fontMetrics().lineSpacing() ); glay->setColStretch( 1, 10 ); @@ -876,22 +963,41 @@ void ConfigureDialog::makeComposerPage( void ) i18n( "The following placeholders are supported in the reply phrases:\n" "%D=date, %S=subject, %F=sender, %%=percent sign, %_=space")); glay->addMultiCellWidget( label, 1, 1, 0, 1 ); - label = new QLabel( i18n("Reply to sender:"), group ); + label = new QLabel( i18n("Language:"), group ); glay->addWidget( label, 2, 0 ); + mComposer.phraseLanguageCombo = new LanguageComboBox( false, group ); + glay->addWidget( mComposer.phraseLanguageCombo, 2, 1 ); + mComposer.LanguageList = NULL; + QHBoxLayout *languageHlay = new QHBoxLayout( group, 0, spacingHint() ); + glay->addLayout( languageHlay, 3, 1 ); + QPushButton *newButton = new QPushButton( i18n("New..."), group ); + mComposer.removeButton = new QPushButton( i18n("Remove"), group ); + newButton->setAutoDefault( false ); + mComposer.removeButton->setAutoDefault( false ); + languageHlay->addWidget( newButton ); + languageHlay->addWidget( mComposer.removeButton ); + connect( newButton, SIGNAL(clicked()), + this, SLOT(slotNewLanguage()) ); + connect( mComposer.removeButton, SIGNAL(clicked()), + this, SLOT(slotRemoveLanguage()) ); + connect( mComposer.phraseLanguageCombo, SIGNAL(activated( const QString& )), + this, SLOT(slotLanguageChanged( const QString& )) ); + label = new QLabel( i18n("Reply to sender:"), group ); + glay->addWidget( label, 4, 0 ); mComposer.phraseReplyEdit = new QLineEdit( group ); - glay->addWidget( mComposer.phraseReplyEdit, 2, 1 ); + glay->addWidget( mComposer.phraseReplyEdit, 4, 1 ); label = new QLabel( i18n("Reply to all:"), group ); - glay->addWidget( label, 3, 0 ); + glay->addWidget( label, 5, 0 ); mComposer.phraseReplyAllEdit = new QLineEdit( group ); - glay->addWidget( mComposer.phraseReplyAllEdit, 3, 1 ); + glay->addWidget( mComposer.phraseReplyAllEdit, 5, 1 ); label = new QLabel( i18n("Forward:"), group ); - glay->addWidget( label, 4, 0 ); + glay->addWidget( label, 6, 0 ); mComposer.phraseForwardEdit = new QLineEdit( group ); - glay->addWidget( mComposer.phraseForwardEdit, 4, 1 ); + glay->addWidget( mComposer.phraseForwardEdit, 6, 1 ); label = new QLabel( i18n("Indentation:"), group ); - glay->addWidget( label, 5, 0 ); + glay->addWidget( label, 7, 0 ); mComposer.phraseindentPrefixEdit = new QLineEdit( group ); - glay->addWidget( mComposer.phraseindentPrefixEdit, 5, 1 ); + glay->addWidget( mComposer.phraseindentPrefixEdit, 7, 1 ); mComposer.autoAppSignFileCheck = new QCheckBox( i18n("Automatically append signature"), page ); @@ -1261,22 +1367,43 @@ void ConfigureDialog::setupAppearancePage( void ) void ConfigureDialog::setupComposerPage( void ) { KConfig &config = *kapp->config(); - config.setGroup("KMMessage"); - - QString str = config.readEntry("phrase-reply"); - if (str.isEmpty()) str = i18n("On %D, you wrote:"); - mComposer.phraseReplyEdit->setText(str); - - str = config.readEntry("phrase-reply-all"); - if (str.isEmpty()) str = i18n("On %D, %F wrote:"); - mComposer.phraseReplyAllEdit->setText(str); - - str = config.readEntry("phrase-forward"); - if (str.isEmpty()) str = i18n("Forwarded Message"); - mComposer.phraseForwardEdit->setText(str); + mComposer.CurrentLanguage = NULL; + LanguageItem *l = mComposer.LanguageList; + while (mComposer.LanguageList) + { + l = mComposer.LanguageList; + mComposer.LanguageList = l->next; + delete l; + } + mComposer.phraseLanguageCombo->clear(); - str = config.readEntry("indent-prefix", ">%_"); - mComposer.phraseindentPrefixEdit->setText(str ); + config.setGroup("General"); + int num = config.readNumEntry("reply-languages",0); + int currentNr = config.readNumEntry("reply-current-language",0); + QString itemStr = QString(); + int nr; + + for (int i = num - 1; i >= 0; i--) + { + config.setGroup(QString("KMMessage #%1").arg(i)); + l = new LanguageItem( config.readEntry("language"), + config.readEntry("phrase-reply"), + config.readEntry("phrase-reply-all"), + config.readEntry("phrase-forward"), + config.readEntry("indent-prefix") ); + l->next = mComposer.LanguageList; + mComposer.LanguageList = l; + nr = mComposer.phraseLanguageCombo->insertLanguage( l->mLanguage ); + if (currentNr == i) itemStr = mComposer.phraseLanguageCombo->listBox()-> + text(nr); + } + mComposer.phraseLanguageCombo->setCurrentItem(mComposer.phraseLanguageCombo-> + listBox()->index(mComposer.phraseLanguageCombo-> + listBox()->findItem(itemStr))); + mComposer.phraseLanguageCombo->listBox()->setCurrentItem( + mComposer.phraseLanguageCombo->currentItem() ); + if (num == 0) slotAddNewLanguage( KGlobal::locale()->language() ); + slotLanguageChanged( NULL ); config.setGroup("Composer"); @@ -1636,15 +1763,25 @@ void ConfigureDialog::slotDoApply( bool everything ) } if( activePage == mComposer.pageIndex || everything ) { - config.setGroup("KMMessage"); - config.writeEntry("phrase-reply", - mComposer.phraseReplyEdit->text() ); - config.writeEntry("phrase-reply-all", - mComposer.phraseReplyAllEdit->text() ); - config.writeEntry("phrase-forward", - mComposer.phraseForwardEdit->text() ); - config.writeEntry("indent-prefix", - mComposer.phraseindentPrefixEdit->text() ); + slotSaveOldPhrases(); + LanguageItem *l = mComposer.LanguageList; + int languageCount = 0, currentNr = 0; + while (l) + { + if (l == mComposer.CurrentLanguage) currentNr = languageCount; + config.setGroup(QString("KMMessage #%1").arg(languageCount)); + config.writeEntry( "language", l->mLanguage ); + config.writeEntry( "phrase-reply", l->mReply ); + config.writeEntry( "phrase-reply-all", l->mReplyAll ); + config.writeEntry( "phrase-forward", l->mForward ); + config.writeEntry( "indent-prefix", l->mIndentPrefix ); + l = l->next; + languageCount++; + } + + config.setGroup("General"); + config.writeEntry("reply-languages", languageCount); + config.writeEntry("reply-current-language", currentNr); config.setGroup("Composer"); bool autoSignature = mComposer.autoAppSignFileCheck->isChecked(); @@ -2373,6 +2510,79 @@ void ConfigureDialog::slotCustomColorSelectionChanged( void ) mAppearance.recycleColorCheck->setEnabled( state ); } +void ConfigureDialog::slotNewLanguage( void ) +{ + NewLanguageDialog *dialog = new NewLanguageDialog( this, "new", true, + mComposer.LanguageList ); + int result = dialog->exec(); + if ( result == QDialog::Accepted ) slotAddNewLanguage( dialog->language() ); + delete dialog; +} + +void ConfigureDialog::slotAddNewLanguage( const QString& lang ) +{ + mComposer.phraseLanguageCombo->setCurrentItem( mComposer. + phraseLanguageCombo->insertLanguage(lang) ); + KLocale locale("kmail"); + locale.setLanguage( lang ); + LanguageItem *l = new LanguageItem( lang, + locale.translate("On %D, you wrote:"), + locale.translate("On %D, %F wrote:"), + locale.translate("Forwarded Message"), + locale.translate(">%_") ); + l->next = mComposer.LanguageList; + mComposer.LanguageList = l; + slotLanguageChanged( NULL ); +} + +void ConfigureDialog::slotRemoveLanguage( void ) +{ + LanguageItem *l = mComposer.LanguageList, *l2 = NULL; + while (l && l->mLanguage != mComposer.phraseLanguageCombo->language()) + { l2 = l; l = l->next; } + if (l) + { + if (l2 == NULL) { + mComposer.LanguageList = l->next; + } else l2->next = l->next; + delete l; + mComposer.CurrentLanguage = NULL; + } + mComposer.phraseLanguageCombo->removeItem( mComposer.phraseLanguageCombo-> + currentItem() ); + slotLanguageChanged( NULL ); +} + +void ConfigureDialog::slotSaveOldPhrases( void ) +{ + LanguageItem *l = mComposer.CurrentLanguage; + if (l) + { + l->mReply = mComposer.phraseReplyEdit->text(); + l->mReplyAll = mComposer.phraseReplyAllEdit->text(); + l->mForward = mComposer.phraseForwardEdit->text(); + l->mIndentPrefix = mComposer.phraseindentPrefixEdit->text(); + } +} + +void ConfigureDialog::slotLanguageChanged( const QString& ) +{ + QString s = mComposer.phraseLanguageCombo->language(); + slotSaveOldPhrases(); + LanguageItem *l = mComposer.LanguageList; + while (l && l->mLanguage != s) l = l->next; + if (l) + { + mComposer.phraseReplyEdit->setText( l->mReply ); + mComposer.phraseReplyAllEdit->setText( l->mReplyAll ); + mComposer.phraseForwardEdit->setText( l->mForward ); + mComposer.phraseindentPrefixEdit->setText( l->mIndentPrefix ); + } + mComposer.CurrentLanguage = l; + mComposer.removeButton->setEnabled( mComposer.phraseLanguageCombo-> + count() > 1 ); +} + void ConfigureDialog::slotWordWrapSelectionChanged( void ) { mComposer.wrapColumnSpin->setEnabled(mComposer.wordWrapCheck->isChecked()); diff --git a/configuredialog.h b/configuredialog.h index 5c76f5858..5c61ca3c6 100644 --- a/configuredialog.h +++ b/configuredialog.h @@ -41,6 +41,7 @@ class KMAccount; #include #include #include +#include #define DEFAULT_EDITOR_STR "kedit %f" @@ -164,6 +165,41 @@ class IdentityList }; +class LanguageItem +{ + public: + LanguageItem( const QString& language, const QString& reply, + const QString& replyAll, const QString& forward, + const QString& indentPrefix ); + QString mLanguage, mReply, mReplyAll, mForward, mIndentPrefix; + LanguageItem *next; +}; + +class NewLanguageDialog : public KDialogBase +{ + Q_OBJECT + + public: + NewLanguageDialog( QWidget *parent, const char *name, bool modal, + LanguageItem *langList ); + const QString language( void ); + + private: + QComboBox *mComboBox; +}; + +class LanguageComboBox : public QComboBox +{ + Q_OBJECT + + public: + LanguageComboBox( bool rw, QWidget *parent=0, const char *name=0 ); + int insertLanguage( const QString & language ); + const QString language( void ); + void setLanguage( const QString & language ); + private: + QString *i18nPath; +}; class ConfigureDialog : public KDialogBase { @@ -271,15 +307,19 @@ class ConfigureDialog : public KDialogBase struct ComposerWidget { int pageIndex; - QLineEdit *phraseReplyEdit; - QLineEdit *phraseReplyAllEdit; - QLineEdit *phraseForwardEdit; - QLineEdit *phraseindentPrefixEdit; - QCheckBox *autoAppSignFileCheck; - QCheckBox *smartQuoteCheck; - QCheckBox *pgpAutoSignatureCheck; - QCheckBox *wordWrapCheck; - QSpinBox *wrapColumnSpin; + LanguageComboBox *phraseLanguageCombo; + QPushButton *removeButton; + QLineEdit *phraseReplyEdit; + QLineEdit *phraseReplyAllEdit; + QLineEdit *phraseForwardEdit; + QLineEdit *phraseindentPrefixEdit; + QCheckBox *autoAppSignFileCheck; + QCheckBox *smartQuoteCheck; + QCheckBox *pgpAutoSignatureCheck; + QCheckBox *wordWrapCheck; + QSpinBox *wrapColumnSpin; + LanguageItem *LanguageList; + LanguageItem *CurrentLanguage; }; struct MimeWidget { @@ -390,6 +430,11 @@ class ConfigureDialog : public KDialogBase void slotFontSelectorChanged( int index ); void slotAddressbookSelectorChanged( int index ); void slotCustomColorSelectionChanged( void ); + void slotNewLanguage( void ); + void slotRemoveLanguage( void ); + void slotSaveOldPhrases( void ); + void slotLanguageChanged( const QString& ); + void slotAddNewLanguage( const QString& ); void slotWordWrapSelectionChanged( void ); void slotMimeHeaderSelectionChanged( void ); void slotMimeHeaderNameChanged( const QString &text ); diff --git a/kmmessage.cpp b/kmmessage.cpp index 4085912bb..c7f4d6054 100644 --- a/kmmessage.cpp +++ b/kmmessage.cpp @@ -48,7 +48,7 @@ static DwString emptyString(""); // Values that are set from the config file with KMMessage::readConfig() -static QString sReplyStr, sReplyAllStr, sIndentPrefixStr; +static QString sReplyLanguage, sReplyStr, sReplyAllStr, sIndentPrefixStr; static bool sSmartQuote, sReplaceSubjPrefix; static int sWrapCol; static QStringList sReplySubjPrefixes; @@ -281,6 +281,7 @@ const QString KMMessage::formatString(const QString& aStr) const ch = aStr[i++]; if (ch == '%') { ch = aStr[i++]; + QString langSave = KGlobal::locale()->language(); switch ((char)ch) { case 'D': /* I'm not too sure about this change. Is it not possible @@ -288,9 +289,11 @@ const QString KMMessage::formatString(const QString& aStr) const like this change to a short XX/XX/YY date format. At least not for the default. -sanders */ { - QDateTime datetime; - datetime.setTime_t(date()); - result += KGlobal::locale()->formatDateTime(datetime, false); + QDateTime datetime; + datetime.setTime_t(date()); + KLocale locale("kmail"); + locale.setLanguage(sReplyLanguage); + result += locale.formatDateTime(datetime, false); } break; case 'F': @@ -1980,17 +1983,32 @@ const QString KMMessage::emailAddrAsAnchor(const QString& aEmail, bool stripped) //----------------------------------------------------------------------------- void KMMessage::readConfig(void) { + KConfig *config=kapp->config(); + + config->setGroup("General"); + int languageNr = config->readNumEntry("reply-current-language",0); +// int replyLanguages = config->readNumEntry("reply-languages",1); /* Default values added for KRN otherwise createReply() segfaults*/ /* They are taken from kmail's dialog */ - KConfig *config=kapp->config(); - +// for (int i=0; isetGroup(QString("KMMessage #%1").arg(languageNr)); +// if (i == replyLanguages - 1 || config->readEntry("language") == sLanguage) + { + sReplyLanguage = config->readEntry("language",KGlobal::locale()->language()); + sReplyStr = config->readEntry("phrase-reply", + i18n("On %D, you wrote:")); + sReplyAllStr = config->readEntry("phrase-reply-all", + i18n("On %D, %F wrote:")); + sForwardStr = config->readEntry("phrase-forward", + i18n("Forwarded Message")); + sIndentPrefixStr = config->readEntry("indent-prefix",">%_"); +// break; + } + } config->setGroup("KMMessage"); - sReplyStr = config->readEntry("phrase-reply",i18n("On %D, you wrote:")); - sReplyAllStr = config->readEntry("phrase-reply-all",i18n("On %D, %F wrote:")); - sForwardStr = config->readEntry("phrase-forward",i18n("Forwarded Message")); - sIndentPrefixStr = config->readEntry("indent-prefix",">%_"); sReplySubjPrefixes = config->readListEntry("reply-prefixes", ','); if (sReplySubjPrefixes.count() == 0) sReplySubjPrefixes.append("Re:");