summaryrefslogtreecommitdiffabout
authorzautrix <zautrix>2004-10-20 11:04:17 (UTC)
committer zautrix <zautrix>2004-10-20 11:04:17 (UTC)
commitc45d38a1574bcb53e1b0fd0dc4987cb725d430c0 (patch) (unidiff)
tree22f1ee07fc4002c49867d5dd36690e54cfe21276
parentf6f5f5cfcaa38f3e2bf36d8466b2b44ba7b3fb28 (diff)
downloadkdepimpi-c45d38a1574bcb53e1b0fd0dc4987cb725d430c0.zip
kdepimpi-c45d38a1574bcb53e1b0fd0dc4987cb725d430c0.tar.gz
kdepimpi-c45d38a1574bcb53e1b0fd0dc4987cb725d430c0.tar.bz2
fixed umlaute sort order
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--kaddressbook/views/contactlistview.cpp28
-rw-r--r--microkde/kdecore/klocale.cpp4
-rw-r--r--microkde/kdecore/klocale.h1
3 files changed, 32 insertions, 1 deletions
diff --git a/kaddressbook/views/contactlistview.cpp b/kaddressbook/views/contactlistview.cpp
index 4cc22ea..c74f8cf 100644
--- a/kaddressbook/views/contactlistview.cpp
+++ b/kaddressbook/views/contactlistview.cpp
@@ -1,345 +1,371 @@
1/* 1/*
2 This file is part of KAddressBook. 2 This file is part of KAddressBook.
3 Copyright (c) 2002 Mike Pilone <mpilone@slac.com> 3 Copyright (c) 2002 Mike Pilone <mpilone@slac.com>
4 4
5 This program is free software; you can redistribute it and/or modify 5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by 6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or 7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version. 8 (at your option) any later version.
9 9
10 This program is distributed in the hope that it will be useful, 10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details. 13 GNU General Public License for more details.
14 14
15 You should have received a copy of the GNU General Public License 15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software 16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 18
19 As a special exception, permission is given to link this program 19 As a special exception, permission is given to link this program
20 with any edition of Qt, and distribute the resulting executable, 20 with any edition of Qt, and distribute the resulting executable,
21 without including the source code for Qt in the source distribution. 21 without including the source code for Qt in the source distribution.
22*/ 22*/
23 23
24#include <qheader.h> 24#include <qheader.h>
25#include <qiconset.h> 25#include <qiconset.h>
26#include <qimage.h> 26#include <qimage.h>
27#include <qdragobject.h> 27#include <qdragobject.h>
28#include <qcombobox.h> 28#include <qcombobox.h>
29#include <qpainter.h> 29#include <qpainter.h>
30#include <qbrush.h> 30#include <qbrush.h>
31#include <qevent.h> 31#include <qevent.h>
32 32
33#include <klocale.h> 33#include <klocale.h>
34#include <kglobalsettings.h> 34#include <kglobalsettings.h>
35#include <kiconloader.h> 35#include <kiconloader.h>
36#include <kdebug.h> 36#include <kdebug.h>
37#include <kconfig.h> 37#include <kconfig.h>
38#include <kapplication.h> 38#include <kapplication.h>
39#include <kurl.h> 39#include <kurl.h>
40 40
41#include "kaddressbooktableview.h" 41#include "kaddressbooktableview.h"
42 42
43#include "contactlistview.h" 43#include "contactlistview.h"
44 44
45///////////////////////////////// 45/////////////////////////////////
46// DynamicTip Methods 46// DynamicTip Methods
47 47
48DynamicTip::DynamicTip( ContactListView *parent) 48DynamicTip::DynamicTip( ContactListView *parent)
49 : QToolTip( parent ) 49 : QToolTip( parent )
50{ 50{
51} 51}
52 52
53void DynamicTip::maybeTip( const QPoint &pos ) 53void DynamicTip::maybeTip( const QPoint &pos )
54{ 54{
55 static bool ishidden = true; 55 static bool ishidden = true;
56 if (!parentWidget()->inherits( "ContactListView" )) 56 if (!parentWidget()->inherits( "ContactListView" ))
57 return; 57 return;
58 58
59 ContactListView *plv = (ContactListView*)parentWidget(); 59 ContactListView *plv = (ContactListView*)parentWidget();
60 if (!plv->tooltips()) 60 if (!plv->tooltips())
61 return; 61 return;
62 62
63 QPoint posVp = plv->viewport()->pos(); 63 QPoint posVp = plv->viewport()->pos();
64 64
65 QListViewItem *lvi = plv->itemAt( pos - posVp ); 65 QListViewItem *lvi = plv->itemAt( pos - posVp );
66 if (!lvi) 66 if (!lvi)
67 return; 67 return;
68 68
69#ifndef KAB_EMBEDDED 69#ifndef KAB_EMBEDDED
70 ContactListViewItem *plvi = dynamic_cast< ContactListViewItem* >(lvi); 70 ContactListViewItem *plvi = dynamic_cast< ContactListViewItem* >(lvi);
71#else //KAB_EMBEDDED 71#else //KAB_EMBEDDED
72 ContactListViewItem *plvi = (ContactListViewItem*)(lvi); 72 ContactListViewItem *plvi = (ContactListViewItem*)(lvi);
73#endif //KAB_EMBEDDED 73#endif //KAB_EMBEDDED
74 74
75 if (!plvi) 75 if (!plvi)
76 return; 76 return;
77 77
78 if (ishidden) { 78 if (ishidden) {
79 QString s; 79 QString s;
80 QRect r = plv->itemRect( lvi ); 80 QRect r = plv->itemRect( lvi );
81 r.moveBy( posVp.x(), posVp.y() ); 81 r.moveBy( posVp.x(), posVp.y() );
82 82
83 //kdDebug() << "Tip rec: " << r.x() << "," << r.y() << "," << r.width() 83 //kdDebug() << "Tip rec: " << r.x() << "," << r.y() << "," << r.width()
84 // << "," << r.height() << endl; 84 // << "," << r.height() << endl;
85 85
86 KABC::Addressee a = plvi->addressee(); 86 KABC::Addressee a = plvi->addressee();
87 if (a.isEmpty()) 87 if (a.isEmpty())
88 return; 88 return;
89 89
90 s += i18n("label: value", "%1: %2").arg(a.formattedNameLabel()) 90 s += i18n("label: value", "%1: %2").arg(a.formattedNameLabel())
91 .arg(a.formattedName()); 91 .arg(a.formattedName());
92 92
93 s += '\n'; 93 s += '\n';
94 s += i18n("label: value", "%1: %2").arg(a.organizationLabel()) 94 s += i18n("label: value", "%1: %2").arg(a.organizationLabel())
95 .arg(a.organization()); 95 .arg(a.organization());
96 96
97 QString notes = a.note().stripWhiteSpace(); 97 QString notes = a.note().stripWhiteSpace();
98 if ( !notes.isEmpty() ) { 98 if ( !notes.isEmpty() ) {
99 notes += '\n'; 99 notes += '\n';
100 s += '\n' + i18n("label: value", "%1: \n").arg(a.noteLabel()); 100 s += '\n' + i18n("label: value", "%1: \n").arg(a.noteLabel());
101 QFontMetrics fm( font() ); 101 QFontMetrics fm( font() );
102 102
103 // Begin word wrap code based on QMultiLineEdit code 103 // Begin word wrap code based on QMultiLineEdit code
104 int i = 0; 104 int i = 0;
105 bool doBreak = false; 105 bool doBreak = false;
106 int linew = 0; 106 int linew = 0;
107 int lastSpace = -1; 107 int lastSpace = -1;
108 int a = 0; 108 int a = 0;
109 int lastw = 0; 109 int lastw = 0;
110 110
111 while ( i < int(notes.length()) ) { 111 while ( i < int(notes.length()) ) {
112 doBreak = FALSE; 112 doBreak = FALSE;
113 if ( notes[i] != '\n' ) 113 if ( notes[i] != '\n' )
114 linew += fm.width( notes[i] ); 114 linew += fm.width( notes[i] );
115 115
116 if ( lastSpace >= a && notes[i] != '\n' ) 116 if ( lastSpace >= a && notes[i] != '\n' )
117 if (linew >= parentWidget()->width()) { 117 if (linew >= parentWidget()->width()) {
118 doBreak = TRUE; 118 doBreak = TRUE;
119 if ( lastSpace > a ) { 119 if ( lastSpace > a ) {
120 i = lastSpace; 120 i = lastSpace;
121 linew = lastw; 121 linew = lastw;
122 } 122 }
123 else 123 else
124 i = QMAX( a, i-1 ); 124 i = QMAX( a, i-1 );
125 } 125 }
126 126
127 if ( notes[i] == '\n' || doBreak ) { 127 if ( notes[i] == '\n' || doBreak ) {
128 s += notes.mid( a, i - a + (doBreak?1:0) ) +"\n"; 128 s += notes.mid( a, i - a + (doBreak?1:0) ) +"\n";
129 129
130 a = i + 1; 130 a = i + 1;
131 lastSpace = a; 131 lastSpace = a;
132 linew = 0; 132 linew = 0;
133 } 133 }
134 134
135 if ( notes[i].isSpace() ) { 135 if ( notes[i].isSpace() ) {
136 lastSpace = i; 136 lastSpace = i;
137 lastw = linew; 137 lastw = linew;
138 } 138 }
139 139
140 if ( lastSpace <= a ) { 140 if ( lastSpace <= a ) {
141 lastw = linew; 141 lastw = linew;
142 } 142 }
143 143
144 ++i; 144 ++i;
145 } 145 }
146 } 146 }
147 147
148 tip( r, s ); 148 tip( r, s );
149 } 149 }
150 else 150 else
151 hide(); 151 hide();
152 ishidden = !ishidden; 152 ishidden = !ishidden;
153 153
154} 154}
155 155
156/////////////////////////// 156///////////////////////////
157// ContactListViewItem Methods 157// ContactListViewItem Methods
158 158
159ContactListViewItem::ContactListViewItem(const KABC::Addressee &a, 159ContactListViewItem::ContactListViewItem(const KABC::Addressee &a,
160 ContactListView *parent, 160 ContactListView *parent,
161 KABC::AddressBook *doc, 161 KABC::AddressBook *doc,
162 const KABC::Field::List &fields ) 162 const KABC::Field::List &fields )
163 : KListViewItem(parent), mAddressee(a), mFields( fields ), 163 : KListViewItem(parent), mAddressee(a), mFields( fields ),
164 parentListView( parent ), mDocument(doc) 164 parentListView( parent ), mDocument(doc)
165{ 165{
166 refresh(); 166 refresh();
167} 167}
168 168
169QString ContactListViewItem::key(int column, bool ascending) const 169QString ContactListViewItem::key(int column, bool ascending) const
170{ 170{
171 return QListViewItem::key(column, ascending).lower(); 171 int lan = KGlobal::locale()->language();
172 //qDebug("language %d ", lan);
173 if ( lan == 1 ) { //GERMAN
174 QString ret = QListViewItem::key(column, ascending).utf8();
175 int start = -1;
176 while ( (start = ret.find( 'ä', start+1)) > 0 ) {
177 ret.at(start-1) = 'a';
178 }
179 start = -1;
180 while ( (start = ret.find( 'ö', start+1)) > 0 ) {
181 ret.at(start-1) = 'o';
182 }
183 start = -1;
184 while ( (start = ret.find( 'ü', start+1)) > 0 ) {
185 ret.at(start-1) = 'o';
186 }
187 start = -1;
188 while ( (start = ret.find( 'ß', start+1)) > 0 ) {
189 ret.at(start-1) = 's';
190 }
191 //qDebug("conv string %s ", ret.latin1());
192
193 return ret;
194
195 }
196 else
197 return QListViewItem::key(column, ascending).lower();
172} 198}
173 199
174void ContactListViewItem::paintCell(QPainter * p, 200void ContactListViewItem::paintCell(QPainter * p,
175 const QColorGroup & cg, 201 const QColorGroup & cg,
176 int column, 202 int column,
177 int width, 203 int width,
178 int align) 204 int align)
179{ 205{
180 KListViewItem::paintCell(p, cg, column, width, align); 206 KListViewItem::paintCell(p, cg, column, width, align);
181 207
182 if ( !p ) 208 if ( !p )
183 return; 209 return;
184 210
185 if (parentListView->singleLine()) { 211 if (parentListView->singleLine()) {
186 p->setPen( parentListView->alternateColor() ); 212 p->setPen( parentListView->alternateColor() );
187 p->drawLine( 0, height() - 1, width, height() - 1 ); 213 p->drawLine( 0, height() - 1, width, height() - 1 );
188 } 214 }
189} 215}
190 216
191 217
192ContactListView *ContactListViewItem::parent() 218ContactListView *ContactListViewItem::parent()
193{ 219{
194 return parentListView; 220 return parentListView;
195} 221}
196 222
197 223
198void ContactListViewItem::refresh() 224void ContactListViewItem::refresh()
199{ 225{
200 // Update our addressee, since it may have changed else were 226 // Update our addressee, since it may have changed else were
201 mAddressee = mDocument->findByUid(mAddressee.uid()); 227 mAddressee = mDocument->findByUid(mAddressee.uid());
202 if (mAddressee.isEmpty()) 228 if (mAddressee.isEmpty())
203 return; 229 return;
204 230
205 int i = 0; 231 int i = 0;
206 KABC::Field::List::ConstIterator it; 232 KABC::Field::List::ConstIterator it;
207 for( it = mFields.begin(); it != mFields.end(); ++it ) { 233 for( it = mFields.begin(); it != mFields.end(); ++it ) {
208 setText( i++, (*it)->value( mAddressee ) ); 234 setText( i++, (*it)->value( mAddressee ) );
209 } 235 }
210} 236}
211 237
212/////////////////////////////// 238///////////////////////////////
213// ContactListView 239// ContactListView
214 240
215ContactListView::ContactListView(KAddressBookTableView *view, 241ContactListView::ContactListView(KAddressBookTableView *view,
216 KABC::AddressBook* /* doc */, 242 KABC::AddressBook* /* doc */,
217 QWidget *parent, 243 QWidget *parent,
218 const char *name ) 244 const char *name )
219 : KListView( parent, name ), 245 : KListView( parent, name ),
220 pabWidget( view ), 246 pabWidget( view ),
221 oldColumn( 0 ) 247 oldColumn( 0 )
222{ 248{
223 mABackground = true; 249 mABackground = true;
224 mSingleLine = false; 250 mSingleLine = false;
225 mToolTips = true; 251 mToolTips = true;
226#ifndef KAB_EMBEDDED 252#ifndef KAB_EMBEDDED
227 mAlternateColor = KGlobalSettings::alternateBackgroundColor(); 253 mAlternateColor = KGlobalSettings::alternateBackgroundColor();
228#else //KAB_EMBEDDED 254#else //KAB_EMBEDDED
229 mAlternateColor = QColor(240, 240, 240); 255 mAlternateColor = QColor(240, 240, 240);
230#endif //KAB_EMBEDDED 256#endif //KAB_EMBEDDED
231 257
232 setAlternateBackgroundEnabled(mABackground); 258 setAlternateBackgroundEnabled(mABackground);
233 setAcceptDrops( true ); 259 setAcceptDrops( true );
234 viewport()->setAcceptDrops( true ); 260 viewport()->setAcceptDrops( true );
235 setAllColumnsShowFocus( true ); 261 setAllColumnsShowFocus( true );
236 setShowSortIndicator(true); 262 setShowSortIndicator(true);
237 263
238 setSelectionModeExt( KListView::Extended ); 264 setSelectionModeExt( KListView::Extended );
239 setDropVisualizer(false); 265 setDropVisualizer(false);
240 // setFrameStyle(QFrame::NoFrame); 266 // setFrameStyle(QFrame::NoFrame);
241 //setLineWidth ( 0 ); 267 //setLineWidth ( 0 );
242 //setMidLineWidth ( 0 ); 268 //setMidLineWidth ( 0 );
243 //setMargin ( 0 ); 269 //setMargin ( 0 );
244#ifndef KAB_EMBEDDED 270#ifndef KAB_EMBEDDED
245 connect(this, SIGNAL(dropped(QDropEvent*)), 271 connect(this, SIGNAL(dropped(QDropEvent*)),
246 this, SLOT(itemDropped(QDropEvent*))); 272 this, SLOT(itemDropped(QDropEvent*)));
247#endif //KAB_EMBEDDED 273#endif //KAB_EMBEDDED
248 274
249 275
250 new DynamicTip( this ); 276 new DynamicTip( this );
251} 277}
252 278
253void ContactListView::setAlternateColor(const QColor &m_AlternateColor) 279void ContactListView::setAlternateColor(const QColor &m_AlternateColor)
254{ 280{
255 mAlternateColor = m_AlternateColor; 281 mAlternateColor = m_AlternateColor;
256} 282}
257 283
258void ContactListView::paintEmptyArea( QPainter * p, const QRect & rect ) 284void ContactListView::paintEmptyArea( QPainter * p, const QRect & rect )
259{ 285{
260 QBrush b = palette().brush(QPalette::Active, QColorGroup::Base); 286 QBrush b = palette().brush(QPalette::Active, QColorGroup::Base);
261 287
262 // Get the brush, which will have the background pixmap if there is one. 288 // Get the brush, which will have the background pixmap if there is one.
263 if (b.pixmap()) 289 if (b.pixmap())
264 { 290 {
265 p->drawTiledPixmap( rect.left(), rect.top(), rect.width(), rect.height(), 291 p->drawTiledPixmap( rect.left(), rect.top(), rect.width(), rect.height(),
266 *(b.pixmap()), 292 *(b.pixmap()),
267 rect.left() + contentsX(), 293 rect.left() + contentsX(),
268 rect.top() + contentsY() ); 294 rect.top() + contentsY() );
269 } 295 }
270 296
271 else 297 else
272 { 298 {
273 // Do a normal paint 299 // Do a normal paint
274 KListView::paintEmptyArea(p, rect); 300 KListView::paintEmptyArea(p, rect);
275 } 301 }
276} 302}
277 303
278void ContactListView::contentsMousePressEvent(QMouseEvent* e) 304void ContactListView::contentsMousePressEvent(QMouseEvent* e)
279{ 305{
280 presspos = e->pos(); 306 presspos = e->pos();
281 KListView::contentsMousePressEvent(e); 307 KListView::contentsMousePressEvent(e);
282} 308}
283 309
284 310
285// To initiate a drag operation 311// To initiate a drag operation
286void ContactListView::contentsMouseMoveEvent( QMouseEvent *e ) 312void ContactListView::contentsMouseMoveEvent( QMouseEvent *e )
287{ 313{
288 if ((e->state() & LeftButton) && (e->pos() - presspos).manhattanLength() > 4 ) { 314 if ((e->state() & LeftButton) && (e->pos() - presspos).manhattanLength() > 4 ) {
289 emit startAddresseeDrag(); 315 emit startAddresseeDrag();
290 } 316 }
291 else 317 else
292 KListView::contentsMouseMoveEvent( e ); 318 KListView::contentsMouseMoveEvent( e );
293} 319}
294 320
295bool ContactListView::acceptDrag(QDropEvent *e) const 321bool ContactListView::acceptDrag(QDropEvent *e) const
296{ 322{
297#ifndef KAB_EMBEDDED 323#ifndef KAB_EMBEDDED
298 return QTextDrag::canDecode(e); 324 return QTextDrag::canDecode(e);
299#else //KAB_EMBEDDED 325#else //KAB_EMBEDDED
300qDebug("ContactListView::acceptDrag has to be fixed"); 326qDebug("ContactListView::acceptDrag has to be fixed");
301 return false; 327 return false;
302#endif //KAB_EMBEDDED 328#endif //KAB_EMBEDDED
303} 329}
304 330
305void ContactListView::itemDropped(QDropEvent *e) 331void ContactListView::itemDropped(QDropEvent *e)
306{ 332{
307 contentsDropEvent(e); 333 contentsDropEvent(e);
308} 334}
309 335
310void ContactListView::contentsDropEvent( QDropEvent *e ) 336void ContactListView::contentsDropEvent( QDropEvent *e )
311{ 337{
312 emit addresseeDropped(e); 338 emit addresseeDropped(e);
313} 339}
314 340
315void ContactListView::setAlternateBackgroundEnabled(bool enabled) 341void ContactListView::setAlternateBackgroundEnabled(bool enabled)
316{ 342{
317 mABackground = enabled; 343 mABackground = enabled;
318 344
319 if (mABackground) 345 if (mABackground)
320 { 346 {
321 setAlternateBackground(mAlternateColor); 347 setAlternateBackground(mAlternateColor);
322 } 348 }
323 else 349 else
324 { 350 {
325 setAlternateBackground(QColor()); 351 setAlternateBackground(QColor());
326 } 352 }
327} 353}
328 354
329void ContactListView::setBackgroundPixmap(const QString &filename) 355void ContactListView::setBackgroundPixmap(const QString &filename)
330{ 356{
331 if (filename.isEmpty()) 357 if (filename.isEmpty())
332 { 358 {
333 unsetPalette(); 359 unsetPalette();
334 } 360 }
335 else 361 else
336 { 362 {
337 qDebug("ContactListView::setBackgroundPixmap has to be verified"); 363 qDebug("ContactListView::setBackgroundPixmap has to be verified");
338//US setPaletteBackgroundPixmap(QPixmap(filename)); 364//US setPaletteBackgroundPixmap(QPixmap(filename));
339 KListView::setBackgroundPixmap((const QPixmap&)QPixmap(filename)); 365 KListView::setBackgroundPixmap((const QPixmap&)QPixmap(filename));
340 } 366 }
341 367
342} 368}
343#ifndef KAB_EMBEDDED 369#ifndef KAB_EMBEDDED
344#include "contactlistview.moc" 370#include "contactlistview.moc"
345#endif //KAB_EMBEDDED 371#endif //KAB_EMBEDDED
diff --git a/microkde/kdecore/klocale.cpp b/microkde/kdecore/klocale.cpp
index 673d845..3674f28 100644
--- a/microkde/kdecore/klocale.cpp
+++ b/microkde/kdecore/klocale.cpp
@@ -1,550 +1,554 @@
1#include <qregexp.h> 1#include <qregexp.h>
2#include <qapplication.h> 2#include <qapplication.h>
3 3
4#include "kdebug.h" 4#include "kdebug.h"
5#include "kcalendarsystemgregorian.h" 5#include "kcalendarsystemgregorian.h"
6 6
7#include "klocale.h" 7#include "klocale.h"
8 8
9 9
10QDict<QString> *mLocaleDict = 0; 10QDict<QString> *mLocaleDict = 0;
11void setLocaleDict( QDict<QString> * dict ) 11void setLocaleDict( QDict<QString> * dict )
12{ 12{
13 mLocaleDict = dict; 13 mLocaleDict = dict;
14 14
15} 15}
16QString i18n(const char *text) 16QString i18n(const char *text)
17{ 17{
18 if ( ! mLocaleDict ) 18 if ( ! mLocaleDict )
19 return QString( text ); 19 return QString( text );
20 else { 20 else {
21 QString* ret = mLocaleDict->find(QString(text)) ; 21 QString* ret = mLocaleDict->find(QString(text)) ;
22 if ( ret == 0 ) { 22 if ( ret == 0 ) {
23 return QString( text ); 23 return QString( text );
24 } 24 }
25 else { 25 else {
26 if ( (*ret).isEmpty() ) 26 if ( (*ret).isEmpty() )
27 return QString( text ); 27 return QString( text );
28 else 28 else
29 return (*ret); 29 return (*ret);
30 } 30 }
31 } 31 }
32 32
33} 33}
34 34
35QString i18n(const char *,const char *text) 35QString i18n(const char *,const char *text)
36{ 36{
37 return i18n( text ); 37 return i18n( text );
38} 38}
39 39
40QString i18n(const char *text1, const char *textn, int num) 40QString i18n(const char *text1, const char *textn, int num)
41{ 41{
42 if ( num == 1 ) return i18n( text1 ); 42 if ( num == 1 ) return i18n( text1 );
43 else { 43 else {
44 QString text = i18n( textn ); 44 QString text = i18n( textn );
45 int pos = text.find( "%n" ); 45 int pos = text.find( "%n" );
46 if ( pos >= 0 ) text.replace( pos, 2, QString::number( num ) ); 46 if ( pos >= 0 ) text.replace( pos, 2, QString::number( num ) );
47 return text; 47 return text;
48 } 48 }
49} 49}
50 50
51inline void put_it_in( QChar *buffer, uint& index, const QString &s ) 51inline void put_it_in( QChar *buffer, uint& index, const QString &s )
52{ 52{
53 for ( uint l = 0; l < s.length(); l++ ) 53 for ( uint l = 0; l < s.length(); l++ )
54 buffer[index++] = s.at( l ); 54 buffer[index++] = s.at( l );
55} 55}
56 56
57inline void put_it_in( QChar *buffer, uint& index, int number ) 57inline void put_it_in( QChar *buffer, uint& index, int number )
58{ 58{
59 buffer[index++] = number / 10 + '0'; 59 buffer[index++] = number / 10 + '0';
60 buffer[index++] = number % 10 + '0'; 60 buffer[index++] = number % 10 + '0';
61} 61}
62 62
63static int readInt(const QString &str, uint &pos) 63static int readInt(const QString &str, uint &pos)
64{ 64{
65 if (!str.at(pos).isDigit()) return -1; 65 if (!str.at(pos).isDigit()) return -1;
66 int result = 0; 66 int result = 0;
67 for (; str.length() > pos && str.at(pos).isDigit(); pos++) 67 for (; str.length() > pos && str.at(pos).isDigit(); pos++)
68 { 68 {
69 result *= 10; 69 result *= 10;
70 result += str.at(pos).digitValue(); 70 result += str.at(pos).digitValue();
71 } 71 }
72 72
73 return result; 73 return result;
74} 74}
75 75
76KLocale::KLocale() : mCalendarSystem( 0 ) 76KLocale::KLocale() : mCalendarSystem( 0 )
77{ 77{
78 78
79 m_decimalSymbol = "."; 79 m_decimalSymbol = ".";
80 m_positiveSign = ""; 80 m_positiveSign = "";
81 m_negativeSign = "-"; 81 m_negativeSign = "-";
82 m_thousandsSeparator = ","; 82 m_thousandsSeparator = ",";
83 83
84 84
85 85
86 86
87 mWeekStartsMonday = true; 87 mWeekStartsMonday = true;
88 mHourF24Format = true; 88 mHourF24Format = true;
89 mIntDateFormat = Default; 89 mIntDateFormat = Default;
90 mIntTimeFormat = Default; 90 mIntTimeFormat = Default;
91 mLanguage = 0; 91 mLanguage = 0;
92 mDateFormat = "%a %Y %b %d"; 92 mDateFormat = "%a %Y %b %d";
93 mDateFormatShort = "%Y-%m-%d"; 93 mDateFormatShort = "%Y-%m-%d";
94 mTimeZoneList << i18n ("-11:00 US/Samoa") 94 mTimeZoneList << i18n ("-11:00 US/Samoa")
95 << i18n ("-10:00 US/Hawaii") 95 << i18n ("-10:00 US/Hawaii")
96 << i18n ("-09:00 US/Alaska") 96 << i18n ("-09:00 US/Alaska")
97 << i18n ("-08:00 US/Pacific") 97 << i18n ("-08:00 US/Pacific")
98 << i18n ("-07:00 US/Mountain") 98 << i18n ("-07:00 US/Mountain")
99 << i18n ("-06:00 US/Central") 99 << i18n ("-06:00 US/Central")
100 << i18n ("-05:00 US/Eastern") 100 << i18n ("-05:00 US/Eastern")
101 << i18n ("-04:00 Brazil/West") 101 << i18n ("-04:00 Brazil/West")
102 << i18n ("-03:00 Brazil/East") 102 << i18n ("-03:00 Brazil/East")
103 << i18n ("-02:00 Brazil/DeNoronha") 103 << i18n ("-02:00 Brazil/DeNoronha")
104 << i18n ("-01:00 Atlantic/Azores") 104 << i18n ("-01:00 Atlantic/Azores")
105 << i18n (" 00:00 Europe/London(UTC)") 105 << i18n (" 00:00 Europe/London(UTC)")
106 << i18n ("+01:00 Europe/Oslo(CET)") 106 << i18n ("+01:00 Europe/Oslo(CET)")
107 << i18n ("+02:00 Europe/Helsinki") 107 << i18n ("+02:00 Europe/Helsinki")
108 << i18n ("+03:00 Europe/Moscow") 108 << i18n ("+03:00 Europe/Moscow")
109 << i18n ("+04:00 Indian/Mauritius") 109 << i18n ("+04:00 Indian/Mauritius")
110 << i18n ("+05:00 Indian/Maldives") 110 << i18n ("+05:00 Indian/Maldives")
111 << i18n ("+06:00 Indian/Chagos") 111 << i18n ("+06:00 Indian/Chagos")
112 << i18n ("+07:00 Asia/Bangkok") 112 << i18n ("+07:00 Asia/Bangkok")
113 << i18n ("+08:00 Asia/Hongkong") 113 << i18n ("+08:00 Asia/Hongkong")
114 << i18n ("+09:00 Asia/Tokyo") 114 << i18n ("+09:00 Asia/Tokyo")
115 << i18n ("+10:00 Asia/Vladivostok") 115 << i18n ("+10:00 Asia/Vladivostok")
116 << i18n ("+11:00 Asia/Magadan") 116 << i18n ("+11:00 Asia/Magadan")
117 << i18n ("+12:00 Asia/Kamchatka") 117 << i18n ("+12:00 Asia/Kamchatka")
118 // << i18n (" xx:xx User defined offset") 118 // << i18n (" xx:xx User defined offset")
119 << i18n (" Local Time"); 119 << i18n (" Local Time");
120 mSouthDaylight = false; 120 mSouthDaylight = false;
121 mTimeZoneOffset = 0; 121 mTimeZoneOffset = 0;
122 daylightEnabled = false; 122 daylightEnabled = false;
123} 123}
124 124
125void KLocale::setDateFormat( QString s ) 125void KLocale::setDateFormat( QString s )
126{ 126{
127 mDateFormat = s; 127 mDateFormat = s;
128} 128}
129 129
130void KLocale::setDateFormatShort( QString s ) 130void KLocale::setDateFormatShort( QString s )
131{ 131{
132 mDateFormatShort = s; 132 mDateFormatShort = s;
133} 133}
134 134
135void KLocale::setHore24Format ( bool b ) 135void KLocale::setHore24Format ( bool b )
136{ 136{
137 mHourF24Format = b; 137 mHourF24Format = b;
138} 138}
139void KLocale::setWeekStartMonday( bool b ) 139void KLocale::setWeekStartMonday( bool b )
140{ 140{
141 mWeekStartsMonday = b; 141 mWeekStartsMonday = b;
142} 142}
143 143
144KLocale::IntDateFormat KLocale::getIntDateFormat( ) 144KLocale::IntDateFormat KLocale::getIntDateFormat( )
145{ 145{
146 return mIntDateFormat; 146 return mIntDateFormat;
147 147
148} 148}
149void KLocale::setIntDateFormat( KLocale::IntDateFormat i ) 149void KLocale::setIntDateFormat( KLocale::IntDateFormat i )
150{ 150{
151 mIntDateFormat = i; 151 mIntDateFormat = i;
152} 152}
153KLocale::IntDateFormat KLocale::getIntTimeFormat( ) 153KLocale::IntDateFormat KLocale::getIntTimeFormat( )
154{ 154{
155 return mIntTimeFormat; 155 return mIntTimeFormat;
156 156
157} 157}
158void KLocale::setIntTimeFormat( KLocale::IntDateFormat i ) 158void KLocale::setIntTimeFormat( KLocale::IntDateFormat i )
159{ 159{
160 mIntTimeFormat = i; 160 mIntTimeFormat = i;
161} 161}
162 162
163void KLocale::setLanguage( int i ) 163void KLocale::setLanguage( int i )
164{ 164{
165 mLanguage = i; 165 mLanguage = i;
166} 166}
167int KLocale::language( )
168{
169 return mLanguage;
170}
167QString KLocale::translate( const char *index ) const 171QString KLocale::translate( const char *index ) const
168{ 172{
169 return i18n( index ); 173 return i18n( index );
170} 174}
171 175
172QString KLocale::translate( const char *, const char *fallback) const 176QString KLocale::translate( const char *, const char *fallback) const
173{ 177{
174 return i18n( fallback ); 178 return i18n( fallback );
175} 179}
176 180
177QString KLocale::formatTime(const QTime &pTime, bool includeSecs, IntDateFormat intIntDateFormat) const 181QString KLocale::formatTime(const QTime &pTime, bool includeSecs, IntDateFormat intIntDateFormat) const
178{ 182{
179 const QString rst = timeFormat(intIntDateFormat); 183 const QString rst = timeFormat(intIntDateFormat);
180 184
181 // only "pm/am" here can grow, the rest shrinks, but 185 // only "pm/am" here can grow, the rest shrinks, but
182 // I'm rather safe than sorry 186 // I'm rather safe than sorry
183 QChar *buffer = new QChar[rst.length() * 3 / 2 + 30]; 187 QChar *buffer = new QChar[rst.length() * 3 / 2 + 30];
184 188
185 uint index = 0; 189 uint index = 0;
186 bool escape = false; 190 bool escape = false;
187 int number = 0; 191 int number = 0;
188 192
189 for ( uint format_index = 0; format_index < rst.length(); format_index++ ) 193 for ( uint format_index = 0; format_index < rst.length(); format_index++ )
190 { 194 {
191 if ( !escape ) 195 if ( !escape )
192 { 196 {
193 if ( rst.at( format_index ).unicode() == '%' ) 197 if ( rst.at( format_index ).unicode() == '%' )
194 escape = true; 198 escape = true;
195 else 199 else
196 buffer[index++] = rst.at( format_index ); 200 buffer[index++] = rst.at( format_index );
197 } 201 }
198 else 202 else
199 { 203 {
200 switch ( rst.at( format_index ).unicode() ) 204 switch ( rst.at( format_index ).unicode() )
201 { 205 {
202 case '%': 206 case '%':
203 buffer[index++] = '%'; 207 buffer[index++] = '%';
204 break; 208 break;
205 case 'H': 209 case 'H':
206 put_it_in( buffer, index, pTime.hour() ); 210 put_it_in( buffer, index, pTime.hour() );
207 break; 211 break;
208 case 'I': 212 case 'I':
209 put_it_in( buffer, index, ( pTime.hour() + 11) % 12 + 1 ); 213 put_it_in( buffer, index, ( pTime.hour() + 11) % 12 + 1 );
210 break; 214 break;
211 case 'M': 215 case 'M':
212 put_it_in( buffer, index, pTime.minute() ); 216 put_it_in( buffer, index, pTime.minute() );
213 break; 217 break;
214 case 'S': 218 case 'S':
215 if (includeSecs) 219 if (includeSecs)
216 put_it_in( buffer, index, pTime.second() ); 220 put_it_in( buffer, index, pTime.second() );
217 else 221 else
218 { 222 {
219 // we remove the seperator sign before the seconds and 223 // we remove the seperator sign before the seconds and
220 // assume that works everywhere 224 // assume that works everywhere
221 --index; 225 --index;
222 break; 226 break;
223 } 227 }
224 break; 228 break;
225 case 'k': 229 case 'k':
226 number = pTime.hour(); 230 number = pTime.hour();
227 case 'l': 231 case 'l':
228 // to share the code 232 // to share the code
229 if ( rst.at( format_index ).unicode() == 'l' ) 233 if ( rst.at( format_index ).unicode() == 'l' )
230 number = (pTime.hour() + 11) % 12 + 1; 234 number = (pTime.hour() + 11) % 12 + 1;
231 if ( number / 10 ) 235 if ( number / 10 )
232 buffer[index++] = number / 10 + '0'; 236 buffer[index++] = number / 10 + '0';
233 buffer[index++] = number % 10 + '0'; 237 buffer[index++] = number % 10 + '0';
234 break; 238 break;
235 case 'p': 239 case 'p':
236 { 240 {
237 QString s; 241 QString s;
238 if ( pTime.hour() >= 12 ) 242 if ( pTime.hour() >= 12 )
239 put_it_in( buffer, index, i18n("pm") ); 243 put_it_in( buffer, index, i18n("pm") );
240 else 244 else
241 put_it_in( buffer, index, i18n("am") ); 245 put_it_in( buffer, index, i18n("am") );
242 break; 246 break;
243 } 247 }
244 default: 248 default:
245 buffer[index++] = rst.at( format_index ); 249 buffer[index++] = rst.at( format_index );
246 break; 250 break;
247 } 251 }
248 escape = false; 252 escape = false;
249 } 253 }
250 } 254 }
251 QString ret( buffer, index ); 255 QString ret( buffer, index );
252 delete [] buffer; 256 delete [] buffer;
253 return ret; 257 return ret;
254} 258}
255 259
256QString KLocale::formatDate(const QDate &pDate, bool shortFormat, IntDateFormat intIntDateFormat) const 260QString KLocale::formatDate(const QDate &pDate, bool shortFormat, IntDateFormat intIntDateFormat) const
257{ 261{
258 const QString rst = shortFormat?dateFormatShort(intIntDateFormat):dateFormat(intIntDateFormat); 262 const QString rst = shortFormat?dateFormatShort(intIntDateFormat):dateFormat(intIntDateFormat);
259 263
260 // I'm rather safe than sorry 264 // I'm rather safe than sorry
261 QChar *buffer = new QChar[rst.length() * 3 / 2 + 50]; 265 QChar *buffer = new QChar[rst.length() * 3 / 2 + 50];
262 266
263 unsigned int index = 0; 267 unsigned int index = 0;
264 bool escape = false; 268 bool escape = false;
265 int number = 0; 269 int number = 0;
266 270
267 for ( uint format_index = 0; format_index < rst.length(); ++format_index ) 271 for ( uint format_index = 0; format_index < rst.length(); ++format_index )
268 { 272 {
269 if ( !escape ) 273 if ( !escape )
270 { 274 {
271 if ( rst.at( format_index ).unicode() == '%' ) 275 if ( rst.at( format_index ).unicode() == '%' )
272 escape = true; 276 escape = true;
273 else 277 else
274 buffer[index++] = rst.at( format_index ); 278 buffer[index++] = rst.at( format_index );
275 } 279 }
276 else 280 else
277 { 281 {
278 switch ( rst.at( format_index ).unicode() ) 282 switch ( rst.at( format_index ).unicode() )
279 { 283 {
280 case '%': 284 case '%':
281 buffer[index++] = '%'; 285 buffer[index++] = '%';
282 break; 286 break;
283 case 'Y': 287 case 'Y':
284 put_it_in( buffer, index, pDate.year() / 100 ); 288 put_it_in( buffer, index, pDate.year() / 100 );
285 case 'y': 289 case 'y':
286 put_it_in( buffer, index, pDate.year() % 100 ); 290 put_it_in( buffer, index, pDate.year() % 100 );
287 break; 291 break;
288 case 'n': 292 case 'n':
289 number = pDate.month(); 293 number = pDate.month();
290 case 'e': 294 case 'e':
291 // to share the code 295 // to share the code
292 if ( rst.at( format_index ).unicode() == 'e' ) 296 if ( rst.at( format_index ).unicode() == 'e' )
293 number = pDate.day(); 297 number = pDate.day();
294 if ( number / 10 ) 298 if ( number / 10 )
295 buffer[index++] = number / 10 + '0'; 299 buffer[index++] = number / 10 + '0';
296 buffer[index++] = number % 10 + '0'; 300 buffer[index++] = number % 10 + '0';
297 break; 301 break;
298 case 'm': 302 case 'm':
299 put_it_in( buffer, index, pDate.month() ); 303 put_it_in( buffer, index, pDate.month() );
300 break; 304 break;
301 case 'b': 305 case 'b':
302 put_it_in( buffer, index, monthName(pDate.month(), true) ); 306 put_it_in( buffer, index, monthName(pDate.month(), true) );
303 break; 307 break;
304 case 'B': 308 case 'B':
305 put_it_in( buffer, index, monthName(pDate.month(), false) ); 309 put_it_in( buffer, index, monthName(pDate.month(), false) );
306 break; 310 break;
307 case 'd': 311 case 'd':
308 put_it_in( buffer, index, pDate.day() ); 312 put_it_in( buffer, index, pDate.day() );
309 break; 313 break;
310 case 'a': 314 case 'a':
311 put_it_in( buffer, index, weekDayName(pDate.dayOfWeek(), true) ); 315 put_it_in( buffer, index, weekDayName(pDate.dayOfWeek(), true) );
312 break; 316 break;
313 case 'A': 317 case 'A':
314 put_it_in( buffer, index, weekDayName(pDate.dayOfWeek(), false) ); 318 put_it_in( buffer, index, weekDayName(pDate.dayOfWeek(), false) );
315 break; 319 break;
316 default: 320 default:
317 buffer[index++] = rst.at( format_index ); 321 buffer[index++] = rst.at( format_index );
318 break; 322 break;
319 } 323 }
320 escape = false; 324 escape = false;
321 } 325 }
322 } 326 }
323 QString ret( buffer, index ); 327 QString ret( buffer, index );
324 delete [] buffer; 328 delete [] buffer;
325 return ret; 329 return ret;
326} 330}
327 331
328QString KLocale::formatDateTime(const QDateTime &pDateTime, 332QString KLocale::formatDateTime(const QDateTime &pDateTime,
329 bool shortFormat, 333 bool shortFormat,
330 bool includeSeconds, 334 bool includeSeconds,
331 IntDateFormat intIntDateFormat) const 335 IntDateFormat intIntDateFormat) const
332{ 336{
333 QString format("%1 %2"); 337 QString format("%1 %2");
334 338
335 if ( intIntDateFormat == Default ) 339 if ( intIntDateFormat == Default )
336 format = "%1 %2"; 340 format = "%1 %2";
337 else if ( intIntDateFormat == Format1 ) 341 else if ( intIntDateFormat == Format1 )
338 format = "%1 %2"; 342 format = "%1 %2";
339 else if ( intIntDateFormat == ISODate ) 343 else if ( intIntDateFormat == ISODate )
340 format = "%1T%2"; 344 format = "%1T%2";
341 345
342 QString res = format.arg(formatDate( pDateTime.date(), shortFormat, intIntDateFormat )) 346 QString res = format.arg(formatDate( pDateTime.date(), shortFormat, intIntDateFormat ))
343 .arg(formatTime( pDateTime.time(), includeSeconds , intIntDateFormat )); 347 .arg(formatTime( pDateTime.time(), includeSeconds , intIntDateFormat ));
344 348
345 //qDebug("KLocale::formatDateTime transformed %s, into %s", pDateTime.toString().latin1(), res.latin1() ); 349 //qDebug("KLocale::formatDateTime transformed %s, into %s", pDateTime.toString().latin1(), res.latin1() );
346 350
347 return res; 351 return res;
348} 352}
349 353
350QString KLocale::formatDateTime(const QDateTime &pDateTime, IntDateFormat intIntDateFormat) const 354QString KLocale::formatDateTime(const QDateTime &pDateTime, IntDateFormat intIntDateFormat) const
351{ 355{
352 return formatDateTime(pDateTime, true, true, intIntDateFormat); 356 return formatDateTime(pDateTime, true, true, intIntDateFormat);
353} 357}
354 358
355QDate KLocale::readDate(const QString &intstr, bool* ok) const 359QDate KLocale::readDate(const QString &intstr, bool* ok) const
356{ 360{
357 QDate date; 361 QDate date;
358 date = readDate(intstr, true, ok); 362 date = readDate(intstr, true, ok);
359 if (date.isValid()) return date; 363 if (date.isValid()) return date;
360 return readDate(intstr, false, ok); 364 return readDate(intstr, false, ok);
361} 365}
362 366
363QDate KLocale::readDate(const QString &intstr, bool shortFormat, bool* ok) const 367QDate KLocale::readDate(const QString &intstr, bool shortFormat, bool* ok) const
364{ 368{
365 QString fmt = (shortFormat ? dateFormatShort() : dateFormat()).simplifyWhiteSpace(); 369 QString fmt = (shortFormat ? dateFormatShort() : dateFormat()).simplifyWhiteSpace();
366 return readDate( intstr, fmt, ok ); 370 return readDate( intstr, fmt, ok );
367} 371}
368 372
369QDate KLocale::readDate(const QString &intstr, const QString &fmt, bool* ok) const 373QDate KLocale::readDate(const QString &intstr, const QString &fmt, bool* ok) const
370{ 374{
371 //kdDebug(173) << "KLocale::readDate intstr=" << intstr << " fmt=" << fmt << endl; 375 //kdDebug(173) << "KLocale::readDate intstr=" << intstr << " fmt=" << fmt << endl;
372 QString str = intstr.simplifyWhiteSpace().lower(); 376 QString str = intstr.simplifyWhiteSpace().lower();
373 int day = -1, month = -1; 377 int day = -1, month = -1;
374 // allow the year to be omitted if not in the format 378 // allow the year to be omitted if not in the format
375 int year = QDate::currentDate().year(); 379 int year = QDate::currentDate().year();
376 uint strpos = 0; 380 uint strpos = 0;
377 uint fmtpos = 0; 381 uint fmtpos = 0;
378 382
379 while (fmt.length() > fmtpos || str.length() > strpos) 383 while (fmt.length() > fmtpos || str.length() > strpos)
380 { 384 {
381 if ( !(fmt.length() > fmtpos && str.length() > strpos) ) 385 if ( !(fmt.length() > fmtpos && str.length() > strpos) )
382 goto error; 386 goto error;
383 387
384 QChar c = fmt.at(fmtpos++); 388 QChar c = fmt.at(fmtpos++);
385 389
386 if (c != '%') { 390 if (c != '%') {
387 if (c.isSpace()) 391 if (c.isSpace())
388 strpos++; 392 strpos++;
389 else if (c != str.at(strpos++)) 393 else if (c != str.at(strpos++))
390 goto error; 394 goto error;
391 continue; 395 continue;
392 } 396 }
393 397
394 // remove space at the begining 398 // remove space at the begining
395 if (str.length() > strpos && str.at(strpos).isSpace()) 399 if (str.length() > strpos && str.at(strpos).isSpace())
396 strpos++; 400 strpos++;
397 401
398 c = fmt.at(fmtpos++); 402 c = fmt.at(fmtpos++);
399 switch (c) 403 switch (c)
400 { 404 {
401 case 'a': 405 case 'a':
402 case 'A': 406 case 'A':
403 // this will just be ignored 407 // this will just be ignored
404 { // Cristian Tache: porting to Win: Block added because of "j" redefinition 408 { // Cristian Tache: porting to Win: Block added because of "j" redefinition
405 for (int j = 1; j < 8; j++) { 409 for (int j = 1; j < 8; j++) {
406 QString s = weekDayName(j, c == 'a').lower(); 410 QString s = weekDayName(j, c == 'a').lower();
407 int len = s.length(); 411 int len = s.length();
408 if (str.mid(strpos, len) == s) 412 if (str.mid(strpos, len) == s)
409 strpos += len; 413 strpos += len;
410 } 414 }
411 break; 415 break;
412 } 416 }
413 case 'b': 417 case 'b':
414 case 'B': 418 case 'B':
415 { // Cristian Tache: porting to Win: Block added because of "j" redefinition 419 { // Cristian Tache: porting to Win: Block added because of "j" redefinition
416 for (int j = 1; j < 13; j++) { 420 for (int j = 1; j < 13; j++) {
417 QString s = monthName(j, c == 'b').lower(); 421 QString s = monthName(j, c == 'b').lower();
418 int len = s.length(); 422 int len = s.length();
419 if (str.mid(strpos, len) == s) { 423 if (str.mid(strpos, len) == s) {
420 month = j; 424 month = j;
421 strpos += len; 425 strpos += len;
422 } 426 }
423 } 427 }
424 break; 428 break;
425 } 429 }
426 case 'd': 430 case 'd':
427 case 'e': 431 case 'e':
428 day = readInt(str, strpos); 432 day = readInt(str, strpos);
429 if (day < 1 || day > 31) 433 if (day < 1 || day > 31)
430 goto error; 434 goto error;
431 435
432 break; 436 break;
433 437
434 case 'n': 438 case 'n':
435 case 'm': 439 case 'm':
436 month = readInt(str, strpos); 440 month = readInt(str, strpos);
437 if (month < 1 || month > 12) 441 if (month < 1 || month > 12)
438 goto error; 442 goto error;
439 443
440 break; 444 break;
441 445
442 case 'Y': 446 case 'Y':
443 case 'y': 447 case 'y':
444 year = readInt(str, strpos); 448 year = readInt(str, strpos);
445 if (year < 0) 449 if (year < 0)
446 goto error; 450 goto error;
447 // Qt treats a year in the range 0-100 as 1900-1999. 451 // Qt treats a year in the range 0-100 as 1900-1999.
448 // It is nicer for the user if we treat 0-68 as 2000-2068 452 // It is nicer for the user if we treat 0-68 as 2000-2068
449 if (year < 69) 453 if (year < 69)
450 year += 2000; 454 year += 2000;
451 else if (c == 'y') 455 else if (c == 'y')
452 year += 1900; 456 year += 1900;
453 457
454 break; 458 break;
455 } 459 }
456 } 460 }
457 //kdDebug(173) << "KLocale::readDate day=" << day << " month=" << month << " year=" << year << endl; 461 //kdDebug(173) << "KLocale::readDate day=" << day << " month=" << month << " year=" << year << endl;
458 if ( year != -1 && month != -1 && day != -1 ) 462 if ( year != -1 && month != -1 && day != -1 )
459 { 463 {
460 if (ok) *ok = true; 464 if (ok) *ok = true;
461 return QDate(year, month, day); 465 return QDate(year, month, day);
462 } 466 }
463 error: 467 error:
464 if (ok) *ok = false; 468 if (ok) *ok = false;
465 return QDate(); // invalid date 469 return QDate(); // invalid date
466} 470}
467 471
468QTime KLocale::readTime(const QString &intstr, bool *ok) const 472QTime KLocale::readTime(const QString &intstr, bool *ok) const
469{ 473{
470 QTime _time; 474 QTime _time;
471 _time = readTime(intstr, true, ok); 475 _time = readTime(intstr, true, ok);
472 if (_time.isValid()) return _time; 476 if (_time.isValid()) return _time;
473 return readTime(intstr, false, ok); 477 return readTime(intstr, false, ok);
474} 478}
475 479
476QTime KLocale::readTime(const QString &intstr, bool seconds, bool *ok) const 480QTime KLocale::readTime(const QString &intstr, bool seconds, bool *ok) const
477{ 481{
478 QString str = intstr.simplifyWhiteSpace().lower(); 482 QString str = intstr.simplifyWhiteSpace().lower();
479 QString Format = timeFormat().simplifyWhiteSpace(); 483 QString Format = timeFormat().simplifyWhiteSpace();
480 if (!seconds) 484 if (!seconds)
481 Format.replace(QRegExp(QString::fromLatin1(".%S")), QString::null); 485 Format.replace(QRegExp(QString::fromLatin1(".%S")), QString::null);
482 486
483 int hour = -1, minute = -1, second = seconds ? -1 : 0; // don't require seconds 487 int hour = -1, minute = -1, second = seconds ? -1 : 0; // don't require seconds
484 488
485 bool g_12h = false; 489 bool g_12h = false;
486 bool pm = false; 490 bool pm = false;
487 uint strpos = 0; 491 uint strpos = 0;
488 uint Formatpos = 0; 492 uint Formatpos = 0;
489 493
490 while (Format.length() > Formatpos || str.length() > strpos) 494 while (Format.length() > Formatpos || str.length() > strpos)
491 { 495 {
492 if ( !(Format.length() > Formatpos && str.length() > strpos) ) goto error; 496 if ( !(Format.length() > Formatpos && str.length() > strpos) ) goto error;
493 497
494 QChar c = Format.at(Formatpos++); 498 QChar c = Format.at(Formatpos++);
495 499
496 if (c != '%') 500 if (c != '%')
497 { 501 {
498 if (c.isSpace()) 502 if (c.isSpace())
499 strpos++; 503 strpos++;
500 else if (c != str.at(strpos++)) 504 else if (c != str.at(strpos++))
501 goto error; 505 goto error;
502 continue; 506 continue;
503 } 507 }
504 508
505 // remove space at the begining 509 // remove space at the begining
506 if (str.length() > strpos && str.at(strpos).isSpace()) 510 if (str.length() > strpos && str.at(strpos).isSpace())
507 strpos++; 511 strpos++;
508 512
509 c = Format.at(Formatpos++); 513 c = Format.at(Formatpos++);
510 switch (c) 514 switch (c)
511 { 515 {
512 case 'p': 516 case 'p':
513 { 517 {
514 QString s; 518 QString s;
515 s = i18n("pm").lower(); 519 s = i18n("pm").lower();
516 int len = s.length(); 520 int len = s.length();
517 if (str.mid(strpos, len) == s) 521 if (str.mid(strpos, len) == s)
518 { 522 {
519 pm = true; 523 pm = true;
520 strpos += len; 524 strpos += len;
521 } 525 }
522 else 526 else
523 { 527 {
524 s = i18n("am").lower(); 528 s = i18n("am").lower();
525 len = s.length(); 529 len = s.length();
526 if (str.mid(strpos, len) == s) { 530 if (str.mid(strpos, len) == s) {
527 pm = false; 531 pm = false;
528 strpos += len; 532 strpos += len;
529 } 533 }
530 else 534 else
531 goto error; 535 goto error;
532 } 536 }
533 } 537 }
534 break; 538 break;
535 539
536 case 'k': 540 case 'k':
537 case 'H': 541 case 'H':
538 g_12h = false; 542 g_12h = false;
539 hour = readInt(str, strpos); 543 hour = readInt(str, strpos);
540 if (hour < 0 || hour > 23) 544 if (hour < 0 || hour > 23)
541 goto error; 545 goto error;
542 546
543 break; 547 break;
544 548
545 case 'l': 549 case 'l':
546 case 'I': 550 case 'I':
547 g_12h = true; 551 g_12h = true;
548 hour = readInt(str, strpos); 552 hour = readInt(str, strpos);
549 if (hour < 1 || hour > 12) 553 if (hour < 1 || hour > 12)
550 goto error; 554 goto error;
diff --git a/microkde/kdecore/klocale.h b/microkde/kdecore/klocale.h
index be9442c..14660d6 100644
--- a/microkde/kdecore/klocale.h
+++ b/microkde/kdecore/klocale.h
@@ -1,118 +1,119 @@
1#ifndef MINIKDE_KLOCALE_H 1#ifndef MINIKDE_KLOCALE_H
2#define MINIKDE_KLOCALE_H 2#define MINIKDE_KLOCALE_H
3 3
4#include <qstring.h> 4#include <qstring.h>
5#include <qstringlist.h> 5#include <qstringlist.h>
6#include <qdatetime.h> 6#include <qdatetime.h>
7#include <qdict.h> 7#include <qdict.h>
8 8
9#ifndef I18N_NOOP 9#ifndef I18N_NOOP
10#define I18N_NOOP(x) (x) 10#define I18N_NOOP(x) (x)
11#endif 11#endif
12 12
13class KCalendarSystem; 13class KCalendarSystem;
14void setLocaleDict( QDict<QString> * dict ); 14void setLocaleDict( QDict<QString> * dict );
15QString i18n(const char *text); 15QString i18n(const char *text);
16QString i18n(const char *hint, const char *text); 16QString i18n(const char *hint, const char *text);
17QString i18n(const char *text1, const char *textn, int num); 17QString i18n(const char *text1, const char *textn, int num);
18 18
19// Qt3's uic generates i18n( "msg", "comment" ) calls which conflict 19// Qt3's uic generates i18n( "msg", "comment" ) calls which conflict
20// with our i18n method. we use uic -tr tr2i18n to redirect 20// with our i18n method. we use uic -tr tr2i18n to redirect
21// to the right i18n() function 21// to the right i18n() function
22inline QString tr2i18n(const char* message, const char* =0) { 22inline QString tr2i18n(const char* message, const char* =0) {
23 return i18n( message); 23 return i18n( message);
24} 24}
25 25
26class KLocale 26class KLocale
27{ 27{
28 public: 28 public:
29 KLocale(); 29 KLocale();
30 30
31 QString formatNumber(double num, int precision = -1) const; 31 QString formatNumber(double num, int precision = -1) const;
32 QString formatNumber(const QString &numStr) const; 32 QString formatNumber(const QString &numStr) const;
33 double readNumber(const QString &numStr, bool * ok = 0) const; 33 double readNumber(const QString &numStr, bool * ok = 0) const;
34 34
35 QString decimalSymbol() const; 35 QString decimalSymbol() const;
36 QString thousandsSeparator() const; 36 QString thousandsSeparator() const;
37 QString positiveSign() const; 37 QString positiveSign() const;
38 QString negativeSign() const; 38 QString negativeSign() const;
39 39
40 40
41 QString translate( const char *index ) const; 41 QString translate( const char *index ) const;
42 QString translate( const char *index, const char *fallback) const; 42 QString translate( const char *index, const char *fallback) const;
43 43
44 enum IntDateFormat { Undefined=-1, Default=0, Format1=1, ISODate=2, Userdefined=3 }; 44 enum IntDateFormat { Undefined=-1, Default=0, Format1=1, ISODate=2, Userdefined=3 };
45 45
46 QString formatDate(const QDate &pDate, bool shortFormat = false, IntDateFormat intIntDateFormat = Undefined) const; 46 QString formatDate(const QDate &pDate, bool shortFormat = false, IntDateFormat intIntDateFormat = Undefined) const;
47 QString formatTime(const QTime &pTime, bool includeSecs = false, IntDateFormat intIntDateFormat = Undefined) const; 47 QString formatTime(const QTime &pTime, bool includeSecs = false, IntDateFormat intIntDateFormat = Undefined) const;
48 QString formatDateTime(const QDateTime &pDateTime, IntDateFormat intIntDateFormat = Undefined) const; 48 QString formatDateTime(const QDateTime &pDateTime, IntDateFormat intIntDateFormat = Undefined) const;
49 QString formatDateTime(const QDateTime &pDateTime, 49 QString formatDateTime(const QDateTime &pDateTime,
50 bool shortFormat, 50 bool shortFormat,
51 bool includeSecs = false, IntDateFormat intIntDateFormat = Undefined) const; 51 bool includeSecs = false, IntDateFormat intIntDateFormat = Undefined) const;
52 52
53 QDate readDate(const QString &str, bool* ok = 0) const; 53 QDate readDate(const QString &str, bool* ok = 0) const;
54 QDate readDate( const QString &intstr, const QString &fmt, bool* ok = 0) const; 54 QDate readDate( const QString &intstr, const QString &fmt, bool* ok = 0) const;
55 QTime readTime(const QString &str, bool* ok = 0) const; 55 QTime readTime(const QString &str, bool* ok = 0) const;
56 QDate readDate(const QString &intstr, IntDateFormat intIntDateFormat, bool* ok) const; 56 QDate readDate(const QString &intstr, IntDateFormat intIntDateFormat, bool* ok) const;
57 57
58 QDateTime readDateTime(const QString &intstr, IntDateFormat intIntDateFormat, bool* ok) const; 58 QDateTime readDateTime(const QString &intstr, IntDateFormat intIntDateFormat, bool* ok) const;
59 59
60 bool use12Clock() const; 60 bool use12Clock() const;
61 bool weekStartsMonday() const; 61 bool weekStartsMonday() const;
62 int weekStartDay() const; 62 int weekStartDay() const;
63 63
64 QString weekDayName(int,bool=false) const; 64 QString weekDayName(int,bool=false) const;
65 QString monthName(int,bool=false) const; 65 QString monthName(int,bool=false) const;
66 66
67 QString country() const; 67 QString country() const;
68 68
69 QString dateFormat(IntDateFormat intIntDateFormat = Undefined) const; 69 QString dateFormat(IntDateFormat intIntDateFormat = Undefined) const;
70 QString dateFormatShort(IntDateFormat intIntDateFormat = Undefined) const; 70 QString dateFormatShort(IntDateFormat intIntDateFormat = Undefined) const;
71 QString timeFormat(IntDateFormat intIntDateFormat = Undefined) const; 71 QString timeFormat(IntDateFormat intIntDateFormat = Undefined) const;
72 72
73 void insertCatalogue ( const QString & ); 73 void insertCatalogue ( const QString & );
74 74
75 KCalendarSystem *calendar(); 75 KCalendarSystem *calendar();
76 void setHore24Format ( bool ); 76 void setHore24Format ( bool );
77 void setWeekStartMonday( bool ); 77 void setWeekStartMonday( bool );
78 void setIntDateFormat( IntDateFormat ); 78 void setIntDateFormat( IntDateFormat );
79 void setIntTimeFormat( IntDateFormat ); 79 void setIntTimeFormat( IntDateFormat );
80 IntDateFormat getIntDateFormat( ); 80 IntDateFormat getIntDateFormat( );
81 IntDateFormat getIntTimeFormat( ); 81 IntDateFormat getIntTimeFormat( );
82 void setLanguage( int ); 82 void setLanguage( int );
83 int language();
83 void setDateFormat( QString ); 84 void setDateFormat( QString );
84 void setDateFormatShort( QString ); 85 void setDateFormatShort( QString );
85 86
86 QString m_decimalSymbol; 87 QString m_decimalSymbol;
87 QString m_thousandsSeparator; 88 QString m_thousandsSeparator;
88 QString m_currencySymbol; 89 QString m_currencySymbol;
89 QString m_monetaryDecimalSymbol; 90 QString m_monetaryDecimalSymbol;
90 QString m_monetaryThousandsSeparator; 91 QString m_monetaryThousandsSeparator;
91 QString m_positiveSign; 92 QString m_positiveSign;
92 QString m_negativeSign; 93 QString m_negativeSign;
93 94
94 int timezoneOffset( QString ); 95 int timezoneOffset( QString );
95 QStringList timeZoneList() const; 96 QStringList timeZoneList() const;
96 void setDaylightSaving( bool, int , int ); 97 void setDaylightSaving( bool, int , int );
97 int localTimeOffset(const QDateTime &); 98 int localTimeOffset(const QDateTime &);
98 void setTimezone( const QString &timeZone , bool oddTZ); 99 void setTimezone( const QString &timeZone , bool oddTZ);
99 private: 100 private:
100 QTime readTime(const QString &str, bool seconds, bool *ok) const; 101 QTime readTime(const QString &str, bool seconds, bool *ok) const;
101 QDate readDate(const QString &str, bool shortFormat, bool *ok) const; 102 QDate readDate(const QString &str, bool shortFormat, bool *ok) const;
102 KCalendarSystem *mCalendarSystem; 103 KCalendarSystem *mCalendarSystem;
103 bool mWeekStartsMonday; 104 bool mWeekStartsMonday;
104 bool mHourF24Format; 105 bool mHourF24Format;
105 IntDateFormat mIntDateFormat; 106 IntDateFormat mIntDateFormat;
106 IntDateFormat mIntTimeFormat; 107 IntDateFormat mIntTimeFormat;
107 int mLanguage; 108 int mLanguage;
108 QString mDateFormat; 109 QString mDateFormat;
109 QString mDateFormatShort; 110 QString mDateFormatShort;
110 QStringList mTimeZoneList; 111 QStringList mTimeZoneList;
111 bool daylightEnabled; 112 bool daylightEnabled;
112 int mDaylightTZoffset; 113 int mDaylightTZoffset;
113 int mNondaylightTZoffset; 114 int mNondaylightTZoffset;
114 bool mSouthDaylight; 115 bool mSouthDaylight;
115 int daylightStart, daylightEnd, mTimeZoneOffset; 116 int daylightStart, daylightEnd, mTimeZoneOffset;
116}; 117};
117 118
118#endif 119#endif