summaryrefslogtreecommitdiffabout
authorzautrix <zautrix>2005-02-09 20:56:06 (UTC)
committer zautrix <zautrix>2005-02-09 20:56:06 (UTC)
commitab7725c4517a1f6c145075edcff0bdafe105f0ea (patch) (unidiff)
treee1a230bcb5c31ca695bbebc40ff80874f2f13380
parenta9eff860d8399a198a9fdc04e09ed369097fc745 (diff)
downloadkdepimpi-ab7725c4517a1f6c145075edcff0bdafe105f0ea.zip
kdepimpi-ab7725c4517a1f6c145075edcff0bdafe105f0ea.tar.gz
kdepimpi-ab7725c4517a1f6c145075edcff0bdafe105f0ea.tar.bz2
fixes
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--bin/kdepim/WhatsNew.txt4
-rw-r--r--bin/kdepim/kaddressbook/germantranslation.txt29
-rw-r--r--bin/kdepim/korganizer/germantranslation.txt40
-rw-r--r--kaddressbook/kabcore.cpp3
-rw-r--r--korganizer/calendarview.cpp3
-rw-r--r--libkdepim/ksyncmanager.cpp13
-rw-r--r--microkde/kdecore/klocale.cpp2
7 files changed, 84 insertions, 10 deletions
diff --git a/bin/kdepim/WhatsNew.txt b/bin/kdepim/WhatsNew.txt
index 6ccf763..81b0d59 100644
--- a/bin/kdepim/WhatsNew.txt
+++ b/bin/kdepim/WhatsNew.txt
@@ -1,517 +1,519 @@
1Info about the changes in new versions of KDE-Pim/Pi 1Info about the changes in new versions of KDE-Pim/Pi
2 2
3********** VERSION 2.0.6 ************ 3********** VERSION 2.0.6 ************
4 4
5Two bugfixes in the pi-sync mode. 5Some bugfixes in the pi-sync mode.
6Added German translation for pi-sync mode.
7
6KO/Pi: 8KO/Pi:
7Made the todolist using alternate background. 9Made the todolist using alternate background.
8 10
9Other minor fixes in KO/Pi. 11Other minor fixes in KO/Pi.
10 12
11 13
12********** VERSION 2.0.5 ************ 14********** VERSION 2.0.5 ************
13 15
14Bugfixes in KO/Pi. 16Bugfixes in KO/Pi.
15 17
16********** VERSION 2.0.4 ************ 18********** VERSION 2.0.4 ************
17 19
18KO/Pi: 20KO/Pi:
19Fixed problem loading translations for summary/location edit boxes in event/todo editor. 21Fixed problem loading translations for summary/location edit boxes in event/todo editor.
20 22
21Added a general "select week number" to the toolbar. 23Added a general "select week number" to the toolbar.
22 24
23Fixed some small problem of the new features introduced in version 2.0.3. 25Fixed some small problem of the new features introduced in version 2.0.3.
24 26
25Made it possible to specify one specific category as category color, 27Made it possible to specify one specific category as category color,
26if more than one categories are selected. 28if more than one categories are selected.
27 29
28Fixed a bug in saving colors for categories with non-ascii characters. 30Fixed a bug in saving colors for categories with non-ascii characters.
29(Like, e.g. German Umlauts). 31(Like, e.g. German Umlauts).
30Propably you have to set your colors again for those categories. 32Propably you have to set your colors again for those categories.
31 33
32 34
33********** VERSION 2.0.3 ************ 35********** VERSION 2.0.3 ************
34 36
35KO/Pi: 37KO/Pi:
36Added feature for changing alarm settings for many items at once: 38Added feature for changing alarm settings for many items at once:
37Open list view (or search dialog), select the desired items and choose in 39Open list view (or search dialog), select the desired items and choose in
38the popup menu: Set alarm for selected... 40the popup menu: Set alarm for selected...
39 41
40Added to the event/todo viewer the option to send an email to 42Added to the event/todo viewer the option to send an email to
41all attendees or all selected (with RSVP) attendees. 43all attendees or all selected (with RSVP) attendees.
42 44
43Made the week-month mode changing in month view faster. 45Made the week-month mode changing in month view faster.
44 46
45Made month view better useable with keyboard. 47Made month view better useable with keyboard.
46Now TAB key jumps to next cell with an event/todo. 48Now TAB key jumps to next cell with an event/todo.
47Scroll in cell with coursor keys, scroll in time (next week) with 49Scroll in cell with coursor keys, scroll in time (next week) with
48Shift/Control + coursorkeys. 50Shift/Control + coursorkeys.
49 51
50Fixed bug that the todo view flat mode was reset after first view update. 52Fixed bug that the todo view flat mode was reset after first view update.
51 53
52If a todo is displayed closed in the todo view, 54If a todo is displayed closed in the todo view,
53it is now displayed in overdue/due today color depending on the subtodos overdue/due today properties. 55it is now displayed in overdue/due today color depending on the subtodos overdue/due today properties.
54 56
55Added info about the numbers of years to the caption (title) information about a birthday event. 57Added info about the numbers of years to the caption (title) information about a birthday event.
56 58
57Made completion date in todo editor editable. 59Made completion date in todo editor editable.
58 60
59Added possibility to save/load templates for journals. 61Added possibility to save/load templates for journals.
60(Which is just a simple "save text to file" or "insert text from file". 62(Which is just a simple "save text to file" or "insert text from file".
61 63
62********** VERSION 2.0.2 ************ 64********** VERSION 2.0.2 ************
63 65
64KO/Pi: 66KO/Pi:
65Fixed the layout problem of the day label buttons 67Fixed the layout problem of the day label buttons
66of the agenda view introduced in version 2.0.1. 68of the agenda view introduced in version 2.0.1.
67 69
68Added WhatsThis support for the todo view and the list view. 70Added WhatsThis support for the todo view and the list view.
69 71
70Added a quite useful feature to the montview. 72Added a quite useful feature to the montview.
71Just click on the week numbers on the left. 73Just click on the week numbers on the left.
72And in the top right corner of month view/agenda view 74And in the top right corner of month view/agenda view
73there is now a "week number quick selector". 75there is now a "week number quick selector".
74(Click on the black triangle). 76(Click on the black triangle).
75 77
76Made the quite difficult timezone change in KO/Pi easy. 78Made the quite difficult timezone change in KO/Pi easy.
77 79
78OM/Pi: 80OM/Pi:
79Fixed too small icons on desktop. 81Fixed too small icons on desktop.
80Fixed non visible icons in mainwindow on Z with fastload enabled. 82Fixed non visible icons in mainwindow on Z with fastload enabled.
81Added signature file setting to smtp account config. 83Added signature file setting to smtp account config.
82And the signature can be edited and saved in the edit mail dialog. 84And the signature can be edited and saved in the edit mail dialog.
83That does mean: 85That does mean:
84Simply edit the signature for the selected smtp account in the 86Simply edit the signature for the selected smtp account in the
85edit new mail dialog and press the "save signature" button there. 87edit new mail dialog and press the "save signature" button there.
86Then the signature is saved to the file specified in the smtp account settings. 88Then the signature is saved to the file specified in the smtp account settings.
87If there is no file specified, it is saved automatically to the file 89If there is no file specified, it is saved automatically to the file
88kdepim/apps/kopiemail/<accountname>.sig. 90kdepim/apps/kopiemail/<accountname>.sig.
89 91
90 92
91 93
92********** VERSION 2.0.1 ************ 94********** VERSION 2.0.1 ************
93 95
94Oooops ... I forgot to test on the Zaurus 5500 ... 96Oooops ... I forgot to test on the Zaurus 5500 ...
95 97
96Fixed many problems of new (english) strings (and german translations) 98Fixed many problems of new (english) strings (and german translations)
97introduced in the latest versions, where the text was not fitting on the 99introduced in the latest versions, where the text was not fitting on the
98240x320 display of the Zaurus 5500. 100240x320 display of the Zaurus 5500.
99 101
100KO/Pi: 102KO/Pi:
101Added a popup menu ( press pen and hold to get popup ) to the agenda view 103Added a popup menu ( press pen and hold to get popup ) to the agenda view
102with many useful items (add event/todo, show next week, two weeks, month, journal). 104with many useful items (add event/todo, show next week, two weeks, month, journal).
103 105
104Added items to the todolist popup menu for: 106Added items to the todolist popup menu for:
105Display all opened, all closed or all todos flat. 107Display all opened, all closed or all todos flat.
106The "flat" view makes is possible to sort all todos after ,e.g., prio or date. 108The "flat" view makes is possible to sort all todos after ,e.g., prio or date.
107Made the reparenting of todos on the desktop possible via Drag&Drop. 109Made the reparenting of todos on the desktop possible via Drag&Drop.
108Fixed several bugs in setting the completed datetime for todos. 110Fixed several bugs in setting the completed datetime for todos.
109Added info about completed datetime of todos to the todo viewer. 111Added info about completed datetime of todos to the todo viewer.
110Now displaying a completed todo (with completed datetime set) in the agenda view 112Now displaying a completed todo (with completed datetime set) in the agenda view
111at the time of the completion. Such that now it is possible to see in the agenda view 113at the time of the completion. Such that now it is possible to see in the agenda view
112when what todo was completed. 114when what todo was completed.
113Fixed behaviour of automatic setting completion of todos with sub-todos/parent todos. 115Fixed behaviour of automatic setting completion of todos with sub-todos/parent todos.
114Now the behaviour is: 116Now the behaviour is:
115Setting a parent to complete sets all (sub)childs to complete. 117Setting a parent to complete sets all (sub)childs to complete.
116Setting a parent to uncomplete does not change the childs. 118Setting a parent to uncomplete does not change the childs.
117Setting a child to uncomplete sets all parent to uncomplete. 119Setting a child to uncomplete sets all parent to uncomplete.
118Setting a child to complete does not change the parents. 120Setting a child to complete does not change the parents.
119 121
120Smart updating and double buffering of the daymatrix. 122Smart updating and double buffering of the daymatrix.
121Showing holidays in the day matrix. 123Showing holidays in the day matrix.
122Many other small performance updates. 124Many other small performance updates.
123 125
124Made day labels in agenda clickable. By clicking a label, the day is displayed in single day mode. 126Made day labels in agenda clickable. By clicking a label, the day is displayed in single day mode.
125 127
126Now the translation file usertranslation.txt is supposed to be in utf8 format. 128Now the translation file usertranslation.txt is supposed to be in utf8 format.
127If you want to translate a language from western europe, just change the germantranslation.txt file. Please read the updated Usertranslation HowTo in KO/Pi Help menu. 129If you want to translate a language from western europe, just change the germantranslation.txt file. Please read the updated Usertranslation HowTo in KO/Pi Help menu.
128 130
129 131
130********** VERSION 2.0.0 ************ 132********** VERSION 2.0.0 ************
131 133
132Stable release 2.0.0! 134Stable release 2.0.0!
133 135
134KO/Pi: 136KO/Pi:
135Fixed problem in edit dialog recreation at startup. 137Fixed problem in edit dialog recreation at startup.
136Made "toggle view*" menu items enabled context sensitive. 138Made "toggle view*" menu items enabled context sensitive.
137Changed agenda size menu to items 1-10. 139Changed agenda size menu to items 1-10.
138Made it possible to change agenda size quickly by pressing mouse on timelabels in agenda view and move mouse up/down. 140Made it possible to change agenda size quickly by pressing mouse on timelabels in agenda view and move mouse up/down.
139Usebility enhancements in the KO/Pi menus. 141Usebility enhancements in the KO/Pi menus.
140Birthday import now adds year to summary. 142Birthday import now adds year to summary.
141What's Next view shows age in years for birthday. 143What's Next view shows age in years for birthday.
142 144
143OM/Pi: 145OM/Pi:
144Added three info lines to display subject, from and to of selected mails. 146Added three info lines to display subject, from and to of selected mails.
145 147
146KA/Pi: 148KA/Pi:
147Fixed jump bar behaviour on Zaurus. 149Fixed jump bar behaviour on Zaurus.
148Now KA/Pi search field supports searching for a range of starting characters. 150Now KA/Pi search field supports searching for a range of starting characters.
149E.g. to search for all contact beginning with b to n, type 151E.g. to search for all contact beginning with b to n, type
150b-n 152b-n
151in the search field. 153in the search field.
152 154
153********** VERSION 1.9.20 ************ 155********** VERSION 1.9.20 ************
154 156
155KO/Pi: 157KO/Pi:
156Added for the "dislplay one day" agenda mode 158Added for the "dislplay one day" agenda mode
157info in the caption and in the day lables: 159info in the caption and in the day lables:
158Now it is displayed, if the selected day is from "day before yesterday" 160Now it is displayed, if the selected day is from "day before yesterday"
159to "day after tomorrow". 161to "day after tomorrow".
160Made it possible to delete a Todo, which has sub-todos. 162Made it possible to delete a Todo, which has sub-todos.
161Fixed two small problems in the todo view. 163Fixed two small problems in the todo view.
162Added missing German translation for filter edit and print dialog. 164Added missing German translation for filter edit and print dialog.
163Made search dialog closeable by cancel key. 165Made search dialog closeable by cancel key.
164 166
165Made it possible to select in the date picker the (ligt grey ) 167Made it possible to select in the date picker the (ligt grey )
166dates of the prev./next month with the mouse. 168dates of the prev./next month with the mouse.
167 169
168OM/Pi: 170OM/Pi:
169"Delete mail" icon in main window now deletes all selected mails. 171"Delete mail" icon in main window now deletes all selected mails.
170Fixed the problem, that the state flag of imap mails was ignored. 172Fixed the problem, that the state flag of imap mails was ignored.
171Now mails with "FLAG_SEEN" on the imap server get no icon in the list view 173Now mails with "FLAG_SEEN" on the imap server get no icon in the list view
172to indecate that they are already seen. 174to indecate that they are already seen.
173Fixed the problem that the body of some mails was not displayed in the 175Fixed the problem that the body of some mails was not displayed in the
174mail viewer when fetching them from the imap server directly to read them. 176mail viewer when fetching them from the imap server directly to read them.
175Made it (configurable) possible to show the "To:" field in the list view. 177Made it (configurable) possible to show the "To:" field in the list view.
176Added to the mail viewer the option "View Source" to make it possible to see the raw mail data. 178Added to the mail viewer the option "View Source" to make it possible to see the raw mail data.
177Added a "Download Mail" button to the mail viewer to quickly download the viewed mail to the 179Added a "Download Mail" button to the mail viewer to quickly download the viewed mail to the
178local storage folder (specified in account settings) of the account of the mail. 180local storage folder (specified in account settings) of the account of the mail.
179Removed some memory leaks in OM/Pi. 181Removed some memory leaks in OM/Pi.
180 182
181 183
182********** VERSION 1.9.19 ************ 184********** VERSION 1.9.19 ************
183 185
184Added a lot of missing translations to KA/Pi, 186Added a lot of missing translations to KA/Pi,
185Added some missing translations to KO/Pi and OM/Pi. 187Added some missing translations to KO/Pi and OM/Pi.
186 188
187Fixed some minor problems in KA/Pi + KO/Pi. 189Fixed some minor problems in KA/Pi + KO/Pi.
188 190
189Fixed a crash when closing PwM/Pi. 191Fixed a crash when closing PwM/Pi.
190Added German translation for PwM/Pi. 192Added German translation for PwM/Pi.
191 193
192Made view change and Month View update faster in KO/Pi. 194Made view change and Month View update faster in KO/Pi.
193 195
194 196
195********** VERSION 1.9.18 ************ 197********** VERSION 1.9.18 ************
196 198
197FYI: The VERSION 1.9.17 was a testing release only. 199FYI: The VERSION 1.9.17 was a testing release only.
198Please read the changelog of VERSION 1.9.17 as well. 200Please read the changelog of VERSION 1.9.17 as well.
199 201
200Cleaned up the syncing config dialog. 202Cleaned up the syncing config dialog.
201Added sync config options for date range for events. 203Added sync config options for date range for events.
202Added sync config options for filters on incoming data. 204Added sync config options for filters on incoming data.
203Added sync config options for filters on outgoing data. 205Added sync config options for filters on outgoing data.
204Please read the updated SyncHowTo about the new filter settings. 206Please read the updated SyncHowTo about the new filter settings.
205These filter settings make it now possible to sync with shared 207These filter settings make it now possible to sync with shared
206calendars without writing back private or confidential data 208calendars without writing back private or confidential data
207(via the outgoing filters). 209(via the outgoing filters).
208To sync only with particular parts of a shared calendar, 210To sync only with particular parts of a shared calendar,
209the incoming filter settings can be used. 211the incoming filter settings can be used.
210An example can be found in the SyncHowTo. 212An example can be found in the SyncHowTo.
211Same for shared addressbooks. 213Same for shared addressbooks.
212 214
213Added a setting for the global kdepim data storage. 215Added a setting for the global kdepim data storage.
214Usually the data is stored in (yourhomedir/kdepim). 216Usually the data is stored in (yourhomedir/kdepim).
215Now you can set in the Global config dialog TAB, subTAB "Data storage path" 217Now you can set in the Global config dialog TAB, subTAB "Data storage path"
216a directory where all the kdepim data is stored. 218a directory where all the kdepim data is stored.
217That makes it easy to save all kdepim data on a SD card on the Z, for example. 219That makes it easy to save all kdepim data on a SD card on the Z, for example.
218 220
219KO/Pi: 221KO/Pi:
220The timeedit input has a pulldown list for times. 222The timeedit input has a pulldown list for times.
221If opened, this pulldown list should now has the right time highlighted. 223If opened, this pulldown list should now has the right time highlighted.
222Added the possibility to exclude events/todos/journals in a filter. 224Added the possibility to exclude events/todos/journals in a filter.
223You should exclude journals, if you do not want them to sync with a public calendar. 225You should exclude journals, if you do not want them to sync with a public calendar.
224 226
225KA/Pi: 227KA/Pi:
226Added the possibility to in/exclude public/private/confidential contacts to a filter. 228Added the possibility to in/exclude public/private/confidential contacts to a filter.
227If you have already defined filterrules in KA/Pi you have to adjust them all by setting the "include public/private/confidential" property manually. Sorry for that ... 229If you have already defined filterrules in KA/Pi you have to adjust them all by setting the "include public/private/confidential" property manually. Sorry for that ...
228Added printing of card view and details view on desktop. 230Added printing of card view and details view on desktop.
229Printing of list view is not working... 231Printing of list view is not working...
230Added button for removing pictures in contact editor. 232Added button for removing pictures in contact editor.
231Parsing data fix of KA/Pi version 1.9.17. 233Parsing data fix of KA/Pi version 1.9.17.
232Fixed the "parse name automatically" problem of KA/Pi version 1.9.17. 234Fixed the "parse name automatically" problem of KA/Pi version 1.9.17.
233Fixed some syncing merging problems. 235Fixed some syncing merging problems.
234 236
235 237
236********** VERSION 1.9.17 ************ 238********** VERSION 1.9.17 ************
237 239
238KO/Pi: 240KO/Pi:
239Fixed that tooltips were not updated after moving an item in agenda view. 241Fixed that tooltips were not updated after moving an item in agenda view.
240Fixed a bug in sorting start date for recurring events in list view. 242Fixed a bug in sorting start date for recurring events in list view.
241Changed the left button in todo viewer from "Agenda" to "Set completed". 243Changed the left button in todo viewer from "Agenda" to "Set completed".
242This makes it possible to change a todo in the What's Next View quickly to the completed state without leaving the What's Next View. 244This makes it possible to change a todo in the What's Next View quickly to the completed state without leaving the What's Next View.
243Added more info in the todo viewer: Startdate, parent/sub todos. 245Added more info in the todo viewer: Startdate, parent/sub todos.
244 246
245 247
246KA/Pi: 248KA/Pi:
247All fields search does now actually search all the (possible) fields, 249All fields search does now actually search all the (possible) fields,
248not only those listed in the contact list. 250not only those listed in the contact list.
249Made is possible to inline a picture in a vcard on the Z. 251Made is possible to inline a picture in a vcard on the Z.
250This was only possible on the desktop, now is it possible on the Z as well. 252This was only possible on the desktop, now is it possible on the Z as well.
251Fixed of missing save settings after filter configuration. 253Fixed of missing save settings after filter configuration.
252Made saving of addressbook much faster. 254Made saving of addressbook much faster.
253Fixed extension widget layout problem. 255Fixed extension widget layout problem.
254Fixed saving of default formatted name settings. 256Fixed saving of default formatted name settings.
255Fixed formatted name handling in edit dialog. 257Fixed formatted name handling in edit dialog.
256Added an option for changing formatted names of many contacts 258Added an option for changing formatted names of many contacts
257(menu: File - Change - Set formatted name). 259(menu: File - Change - Set formatted name).
258 260
259QWhatsThis was not working on the Z ( only black rectangle was shown). 261QWhatsThis was not working on the Z ( only black rectangle was shown).
260This is Fixed. 262This is Fixed.
261 263
262KDE-Sync: 264KDE-Sync:
263Now readonly KDE resources are synced as well. 265Now readonly KDE resources are synced as well.
264(They are not changed in KDE itself, of course). 266(They are not changed in KDE itself, of course).
265 267
266 268
267 269
268********** VERSION 1.9.16 ************ 270********** VERSION 1.9.16 ************
269 271
270KO/Pi: 272KO/Pi:
271Fixed search dialog size on Z 6000 (480x640 display). 273Fixed search dialog size on Z 6000 (480x640 display).
272Added setting to hide/show time in agenda items. 274Added setting to hide/show time in agenda items.
273Added setting to hide not running todos in todo view. 275Added setting to hide not running todos in todo view.
274Added columns for start date/time in todo view. 276Added columns for start date/time in todo view.
275Replaced the solid half-hour lines in agenda view by dot lines. 277Replaced the solid half-hour lines in agenda view by dot lines.
276Added possibility of printing the What's Next View on the desktop 278Added possibility of printing the What's Next View on the desktop
277(i.e. Windows and Linux). 279(i.e. Windows and Linux).
278Fixed a crash in KO/Pi when starting KO/Pi with What's Next view. 280Fixed a crash in KO/Pi when starting KO/Pi with What's Next view.
279Added tooltips in month view.(Tooltips only available on desktop) 281Added tooltips in month view.(Tooltips only available on desktop)
280 282
281Fixed a strange problem in KO/Pi alarm applet. 283Fixed a strange problem in KO/Pi alarm applet.
282Did not find the actual problem, 284Did not find the actual problem,
283such that now Qtopia reboots again if deinstalling the alarm applet. 285such that now Qtopia reboots again if deinstalling the alarm applet.
284But the alarm applet should work again. 286But the alarm applet should work again.
285 287
286KA/Pi: 288KA/Pi:
287Fixed the problem, that internal pictures were not saved. 289Fixed the problem, that internal pictures were not saved.
288 290
289Fixed a problem in the pi-sync mode by increasing the timeout for data transfer from 20 seconds to 5 minutes. 291Fixed a problem in the pi-sync mode by increasing the timeout for data transfer from 20 seconds to 5 minutes.
290 292
291Fixed some minor problems. (Like word wrap in help text windows). 293Fixed some minor problems. (Like word wrap in help text windows).
292 294
293Fixed a compiling problem in microkde/kresources. 295Fixed a compiling problem in microkde/kresources.
294 296
295KO/Pi is using zdbat (renamed to db2file) for syncing with Sharp DTM. 297KO/Pi is using zdbat (renamed to db2file) for syncing with Sharp DTM.
296This version now includes zdbat 1.0.0 (old version was zdbat 0.2.9) 298This version now includes zdbat 1.0.0 (old version was zdbat 0.2.9)
297such that now syncing KO/Pi with Sharp DTM should work on the 299such that now syncing KO/Pi with Sharp DTM should work on the
298Zaurus C 3000 model. 300Zaurus C 3000 model.
299 301
300********** VERSION 1.9.15 ************ 302********** VERSION 1.9.15 ************
301 303
302Usebilty enhancements in KO/Pi: 304Usebilty enhancements in KO/Pi:
303When clicking on the date in a month view cell, the day view is shown. 305When clicking on the date in a month view cell, the day view is shown.
304Old behaviour was, that the "new event" dialog popped up. 306Old behaviour was, that the "new event" dialog popped up.
305 307
306Added a one step "undo delete" in KO/Pi (Accessable in the "Action" menu). 308Added a one step "undo delete" in KO/Pi (Accessable in the "Action" menu).
307That means, you can restore the latest 309That means, you can restore the latest
308event/todo/journal you have deleted. 310event/todo/journal you have deleted.
309A journal is deleted, if you clear all the text of the journal. 311A journal is deleted, if you clear all the text of the journal.
310 312
311Fixed the bug of the editor dialogs in KO/Pi of version 1.9.14. 313Fixed the bug of the editor dialogs in KO/Pi of version 1.9.14.
312 314
313KA/Pi starting in 480x640 resolution: 315KA/Pi starting in 480x640 resolution:
314Hide the filter action in toolbar 316Hide the filter action in toolbar
315and added icons for undo/delete/redo in toolbar. 317and added icons for undo/delete/redo in toolbar.
316 318
317Change in OM/Pi ViewMail dialog: 319Change in OM/Pi ViewMail dialog:
318When clicking on the "delete" icon the mail is deleted after confirmation as usual. 320When clicking on the "delete" icon the mail is deleted after confirmation as usual.
319But the edit dialog is not closed as before, now the next mail in the folder is shown automatically (if there is any). 321But the edit dialog is not closed as before, now the next mail in the folder is shown automatically (if there is any).
320 322
321Fixed a crash when deleting mail-accounts in OM/Pi. 323Fixed a crash when deleting mail-accounts in OM/Pi.
322 324
323 325
324********** VERSION 1.9.14 ************ 326********** VERSION 1.9.14 ************
325 327
326Fixed some problems with the dialog sizes when switching 328Fixed some problems with the dialog sizes when switching
327portrait/landscape mode on 640x480 PDA display. 329portrait/landscape mode on 640x480 PDA display.
328 330
329Fixed some other small bugs in KA/Pi KO/Pi and OM/Pi and PwM/Pi. 331Fixed some other small bugs in KA/Pi KO/Pi and OM/Pi and PwM/Pi.
330 332
331Fixed an ugly bug in KOpieMail: 333Fixed an ugly bug in KOpieMail:
332KOpieMail was not able to write files (mails) to MSDOS file system, 334KOpieMail was not able to write files (mails) to MSDOS file system,
333like on an usual preformatted SD card. That should work now. 335like on an usual preformatted SD card. That should work now.
334To save your mail data on the Sd card do the following: 336To save your mail data on the Sd card do the following:
335Create a dir on the SD card: 337Create a dir on the SD card:
336mkdir /mnt/card/localmail 338mkdir /mnt/card/localmail
337Go to your home dir: 339Go to your home dir:
338cd 340cd
339Go to kopiemail data storage dir: 341Go to kopiemail data storage dir:
340cd kdepim/apps/kopiemail 342cd kdepim/apps/kopiemail
341Create a symlink to the SD card: 343Create a symlink to the SD card:
342ls -s /mnt/card/localmail 344ls -s /mnt/card/localmail
343Now KOpieMail will store all mails on the SD card. 345Now KOpieMail will store all mails on the SD card.
344 346
345KO/Pi Monthview: 347KO/Pi Monthview:
346Now "Go to Today" selects the current month from day 1-end, 348Now "Go to Today" selects the current month from day 1-end,
347not the current date + some days. 349not the current date + some days.
348I.e. "Go to Today" shows now always 350I.e. "Go to Today" shows now always
349the current month with first day of month in the first row. 351the current month with first day of month in the first row.
350 352
351Added missing German translation. 353Added missing German translation.
352 354
353Fixed icons of executeable on Wintendo. 355Fixed icons of executeable on Wintendo.
354 356
355Added a "Show next Mail" button to the OM/Pi 357Added a "Show next Mail" button to the OM/Pi
356mail viewer such that the mail below the current mail 358mail viewer such that the mail below the current mail
357in the mail list view of the current folder 359in the mail list view of the current folder
358can be read with a single click. 360can be read with a single click.
359 361
360 362
361********** VERSION 1.9.13 ************ 363********** VERSION 1.9.13 ************
362 364
363Fixed nasty PwM/Pi file reading bug, when 365Fixed nasty PwM/Pi file reading bug, when
364the used hash algo of file is different then the global 366the used hash algo of file is different then the global
365hash algo. 367hash algo.
366 368
367Added KA/Pi support for opie mailit mailapplication. 369Added KA/Pi support for opie mailit mailapplication.
368 370
369Fixed some bugs in OM/Pi. 371Fixed some bugs in OM/Pi.
370Now character conversion tables are available for the Zaurus 372Now character conversion tables are available for the Zaurus
371to make OM/Pi working properly. 373to make OM/Pi working properly.
372To get the character conversion in OM/Pi working, please download 374To get the character conversion in OM/Pi working, please download
373at the sourceforge project site the package 375at the sourceforge project site the package
374sr-character-conversion_SharpROM_arm.ipk.zip 376sr-character-conversion_SharpROM_arm.ipk.zip
375(or oz-character-conversion_OZ-gcc3xx_arm.ipk.zip for OZ roms) 377(or oz-character-conversion_OZ-gcc3xx_arm.ipk.zip for OZ roms)
376from the section "general files for KDE/Pim" 378from the section "general files for KDE/Pim"
377Instructions how to install this package are in a ReadMe in this file. 379Instructions how to install this package are in a ReadMe in this file.
378 380
379 381
380Fixed the orientation change problem in KA/Pi when switching 382Fixed the orientation change problem in KA/Pi when switching
381portrait/landscape mode. 383portrait/landscape mode.
382 384
383French translation available for KA/Pi and OM/Pi. 385French translation available for KA/Pi and OM/Pi.
384 386
385Fixed some problems with categories in KO/Pi in DTM sync. 387Fixed some problems with categories in KO/Pi in DTM sync.
386 388
387Added selection dialog for export to phone in KA/Pi. 389Added selection dialog for export to phone in KA/Pi.
388 390
389If in KO/Pi is an attendee selected to add to a meeting and this 391If in KO/Pi is an attendee selected to add to a meeting and this
390attendee is already in the list of attendees, this person is not added 392attendee is already in the list of attendees, this person is not added
391again. 393again.
392 394
393Some menu cleanup in KA/Pi. 395Some menu cleanup in KA/Pi.
394 396
395********** VERSION 1.9.12 ************ 397********** VERSION 1.9.12 ************
396 398
397Fix for the bug in KO/Pi What's Next view of version 1.9.11. 399Fix for the bug in KO/Pi What's Next view of version 1.9.11.
398 400
399Bugfix: Licence file is now shown again. 401Bugfix: Licence file is now shown again.
400 402
401OM/Pi now supports Unicode (utf8 charset). 403OM/Pi now supports Unicode (utf8 charset).
402Fixed some bugs in OM/Pi. 404Fixed some bugs in OM/Pi.
403 405
404KA/Pi has more German translation. 406KA/Pi has more German translation.
405 407
406 408
407********** VERSION 1.9.11 ************ 409********** VERSION 1.9.11 ************
408 410
409Fixed several problems in PWM/Pi, like 411Fixed several problems in PWM/Pi, like
410asking the user, if unsaved changed are pending 412asking the user, if unsaved changed are pending
411when closing the app. 413when closing the app.
412And PwM/Pi handles now different texts for the 414And PwM/Pi handles now different texts for the
413fields Description, Username, Password, configurable per category. 415fields Description, Username, Password, configurable per category.
414 416
415Fixed a crash in KO/Pi , when importing/loading vcs files 417Fixed a crash in KO/Pi , when importing/loading vcs files
416which have an entry with an attendee with state: 418which have an entry with an attendee with state:
417NEEDS ACTION 419NEEDS ACTION
418 420
419Fixed some problems in the German translation of OM/Pi, 421Fixed some problems in the German translation of OM/Pi,
420which makes some dialogs not fitting on the screen 422which makes some dialogs not fitting on the screen
421of the Z 5500. 423of the Z 5500.
422 424
423Fixed Qtopia crash, when disabling/deinstalling 425Fixed Qtopia crash, when disabling/deinstalling
424KO/Pi alarm applet. 426KO/Pi alarm applet.
425 427
426Implemented direct KDE<->KA/Pi sync for KA/Pi running 428Implemented direct KDE<->KA/Pi sync for KA/Pi running
427on Linux desktop. 429on Linux desktop.
428 430
429Added feature "remove sync info" to sync menu. 431Added feature "remove sync info" to sync menu.
430 432
431Tweaked the KO/Pi What's next view a bit, added 433Tweaked the KO/Pi What's next view a bit, added
432setting to hide events that are done. 434setting to hide events that are done.
433 435
434Disabled "beam receive enabled" on startup to 436Disabled "beam receive enabled" on startup to
435avoid problems if Fastload is enabled. 437avoid problems if Fastload is enabled.
436Please set "beam receive enabled", 438Please set "beam receive enabled",
437if you want to receive data via IR. 439if you want to receive data via IR.
438 440
439Fixed bug in direct KDE<->KO/Pi sync for KO/Pi running 441Fixed bug in direct KDE<->KO/Pi sync for KO/Pi running
440on Linux desktop. 442on Linux desktop.
441 443
442Made in KA/Pi scrolling possible, if details view is selected. 444Made in KA/Pi scrolling possible, if details view is selected.
443(The keyboard focus is set automatically to the search line) 445(The keyboard focus is set automatically to the search line)
444 446
445Fixed a bug in DMT sync, that a new entry in DTM was added 447Fixed a bug in DMT sync, that a new entry in DTM was added
446on every sync to Kx/Pi. 448on every sync to Kx/Pi.
447 449
448Fixed missing writing of KA/Pi categories to DMT entries when syncing. 450Fixed missing writing of KA/Pi categories to DMT entries when syncing.
449 451
450Fixed a bug in DMT sync with todos created in KO/Pi containing 452Fixed a bug in DMT sync with todos created in KO/Pi containing
451non-latin1 characters. 453non-latin1 characters.
452 454
453Rearranged package contents of Sharp-ipks and made all 455Rearranged package contents of Sharp-ipks and made all
454packages installable on SD again. 456packages installable on SD again.
455 457
456Fixed the writing of addressbook data in DTM sync. 458Fixed the writing of addressbook data in DTM sync.
457Empty fields in KA/Pi were not removed. 459Empty fields in KA/Pi were not removed.
458 460
459Added better category handling in KA/Pi: 461Added better category handling in KA/Pi:
460Added item 462Added item
461Edit Categories and 463Edit Categories and
462Manage new categories 464Manage new categories
463to the settings menu. 465to the settings menu.
464Possible to configure a view to display categories. 466Possible to configure a view to display categories.
465 467
466Added detailed "KDE Sync Howto" and "Multi Sync Howto" to Help menu. 468Added detailed "KDE Sync Howto" and "Multi Sync Howto" to Help menu.
467 469
468Fixed displaying of "free" days and time in KO Monthview and Agendaview. 470Fixed displaying of "free" days and time in KO Monthview and Agendaview.
469 471
470... and many other bugfixes. 472... and many other bugfixes.
471 473
472********** VERSION 1.9.10 ************ 474********** VERSION 1.9.10 ************
473 475
474Many internal small bugfixes. 476Many internal small bugfixes.
475And fix of the "big" bug in KO/Pi, 477And fix of the "big" bug in KO/Pi,
476that after Syncing the appointments had an offset by several hours. 478that after Syncing the appointments had an offset by several hours.
477That was a problem with the internal timezone setting, 479That was a problem with the internal timezone setting,
478introduced by the changed timezone configuration settings. 480introduced by the changed timezone configuration settings.
479 481
480German translation for OM/Pi is now available. 482German translation for OM/Pi is now available.
481 483
482 484
483********** VERSION 1.9.9 ************ 485********** VERSION 1.9.9 ************
484 486
485KDE-Pim/Pi has a new Member! 487KDE-Pim/Pi has a new Member!
486It is called PWM/Pi (Passwordmanager/platform-independent) 488It is called PWM/Pi (Passwordmanager/platform-independent)
487and it is available for the Zaurus. 489and it is available for the Zaurus.
488It is planned, that it will be available later for Windows. 490It is planned, that it will be available later for Windows.
489(And for Linux, of course). 491(And for Linux, of course).
490It is a port of the Passwordmanager of KDE. 492It is a port of the Passwordmanager of KDE.
491It will need the MicroKDElibs to run. 493It will need the MicroKDElibs to run.
492 494
493Made loading of addressbooks in KA/Pi up to 7 times faster! 495Made loading of addressbooks in KA/Pi up to 7 times faster!
494The bigger your addressbook file, the more starting speed 496The bigger your addressbook file, the more starting speed
495will you gain. (relatively) 497will you gain. (relatively)
496 498
497The Qtopia addressbook connector is now platform independend 499The Qtopia addressbook connector is now platform independend
498as well and should work on any platform for importing/exporting 500as well and should work on any platform for importing/exporting
499Qtopia and Opie XML files. 501Qtopia and Opie XML files.
500 502
501Added a +30min feature to the timezone settings to make 503Added a +30min feature to the timezone settings to make
502KDE-Pim/Pi useable in Australia and other parts on the 504KDE-Pim/Pi useable in Australia and other parts on the
503world with strange timezones ;-) 505world with strange timezones ;-)
504 506
505German "Umlaute" should now be sorted correctly on the Z in KA/Pi. 507German "Umlaute" should now be sorted correctly on the Z in KA/Pi.
506 508
507It is now possible to disable the 509It is now possible to disable the
508"receive data via infrared" feature, such that syncing with 510"receive data via infrared" feature, such that syncing with
509Outlook is now possible again with Kx/Pi runing. 511Outlook is now possible again with Kx/Pi runing.
510Please disable it, before syncing Sharp DTM with Outlook. 512Please disable it, before syncing Sharp DTM with Outlook.
511For your convenience, the "receive data via infrared" feature 513For your convenience, the "receive data via infrared" feature
512is disabled automatically, if you sync Kx/Pi with DTM. 514is disabled automatically, if you sync Kx/Pi with DTM.
513You have to enable it again manually after syncing. 515You have to enable it again manually after syncing.
514Enabling this feature makes it impossible to start the 516Enabling this feature makes it impossible to start the
515Sharp DTM apps. If this feature is enabled, you will only get the 517Sharp DTM apps. If this feature is enabled, you will only get the
516alarm notification from KO/Pi and not from the Sharp calendar. 518alarm notification from KO/Pi and not from the Sharp calendar.
517This is very useful if you sync KO/Pi with Sharp DTM, 519This is very useful if you sync KO/Pi with Sharp DTM,
diff --git a/bin/kdepim/kaddressbook/germantranslation.txt b/bin/kdepim/kaddressbook/germantranslation.txt
index 57b2fda..5335f47 100644
--- a/bin/kdepim/kaddressbook/germantranslation.txt
+++ b/bin/kdepim/kaddressbook/germantranslation.txt
@@ -209,520 +209,549 @@
209{ "Synchronization successful","Synchronisation erfolgreich" }, 209{ "Synchronization successful","Synchronisation erfolgreich" },
210{ "Sync cancelled or failed. Nothing synced.","Sync abgebrochen oder fehlgeschlagen. Nichts wurde gesynced." }, 210{ "Sync cancelled or failed. Nothing synced.","Sync abgebrochen oder fehlgeschlagen. Nichts wurde gesynced." },
211{ "Sync file \n...%1\ndoes not exist!\nNothing synced!\n","Sync Datei \n...%1\nexistiert nicht!\nNichts wurde gesynced!\n" }, 211{ "Sync file \n...%1\ndoes not exist!\nNothing synced!\n","Sync Datei \n...%1\nexistiert nicht!\nNichts wurde gesynced!\n" },
212{ "Sync filename(*.ics/*.vcs)","Sync Dateiname(*.ics/*.vcs)" }, 212{ "Sync filename(*.ics/*.vcs)","Sync Dateiname(*.ics/*.vcs)" },
213{ "Enter password","Passwort eingeben" }, 213{ "Enter password","Passwort eingeben" },
214{ "Do you really want\nto remote sync\nwith profile \n","Wollen Sie wirklich\nmit dem entfernten\nProfil syncen: \n" }, 214{ "Do you really want\nto remote sync\nwith profile \n","Wollen Sie wirklich\nmit dem entfernten\nProfil syncen: \n" },
215{ "Copy remote file to local machine...","Kopiere entfernte Datei auf lokalen Rechner..." }, 215{ "Copy remote file to local machine...","Kopiere entfernte Datei auf lokalen Rechner..." },
216{ "Sorry, the copy command failed!\nCommand was:\n%1\n \nTry command on console to get more\ndetailed info about the reason.\n","Sorry, das Kopierkommando schlug fehl!\nKommando war:\n%1\n \nVersuche Kommando von Kosole um\nDetails für das Fehlschlagen\nzu erfahren.\n" }, 216{ "Sorry, the copy command failed!\nCommand was:\n%1\n \nTry command on console to get more\ndetailed info about the reason.\n","Sorry, das Kopierkommando schlug fehl!\nKommando war:\n%1\n \nVersuche Kommando von Kosole um\nDetails für das Fehlschlagen\nzu erfahren.\n" },
217{ "Writing back file result: ","Resultat des Dateizurückschreibens: " }, 217{ "Writing back file result: ","Resultat des Dateizurückschreibens: " },
218{ "Syncronization sucessfully completed","Synchronisation erfolgreich abgeschlossen" }, 218{ "Syncronization sucessfully completed","Synchronisation erfolgreich abgeschlossen" },
219{ "Used %1 Client","Benutzter %1 Client" }, 219{ "Used %1 Client","Benutzter %1 Client" },
220{ "No email client installed","Kein Email Klient installiert" }, 220{ "No email client installed","Kein Email Klient installiert" },
221{ "Userdefined email client","Benutzerdef. Email Klient" }, 221{ "Userdefined email client","Benutzerdef. Email Klient" },
222{ "OM/Pi email client","OM/Pi Email Klient" }, 222{ "OM/Pi email client","OM/Pi Email Klient" },
223{ "Include in multiple ","Beziehe in mehrfach " }, 223{ "Include in multiple ","Beziehe in mehrfach " },
224{ "calendar ","Kalender " }, 224{ "calendar ","Kalender " },
225{ "addressbook ","Adressbuch " }, 225{ "addressbook ","Adressbuch " },
226{ "pwmanager","PWmanager" }, 226{ "pwmanager","PWmanager" },
227{ " sync"," Sync ein" }, 227{ " sync"," Sync ein" },
228{ "Write back synced data","Schreibe gesyncte Daten zurück" }, 228{ "Write back synced data","Schreibe gesyncte Daten zurück" },
229{ "-- Write back (on remote) existing entries only","-- Schreibe nur existierende (entfernte) Einträge zurück" }, 229{ "-- Write back (on remote) existing entries only","-- Schreibe nur existierende (entfernte) Einträge zurück" },
230{ "-- Write back (calendar) entries in future only","-- Schreibe nur zukünftige Kalender-Einträge zurück" }, 230{ "-- Write back (calendar) entries in future only","-- Schreibe nur zukünftige Kalender-Einträge zurück" },
231{ "---- Max. weeks in future: ","---- Max. wochen in der Zukunft: " }, 231{ "---- Max. weeks in future: ","---- Max. wochen in der Zukunft: " },
232{ "Pi-Sync ( direct Kx/Pi to Kx/Pi sync )","Pi-Sync ( direktes Kx/Pi zu Kx/Pi sync )" }, 232{ "Pi-Sync ( direct Kx/Pi to Kx/Pi sync )","Pi-Sync ( direktes Kx/Pi zu Kx/Pi sync )" },
233{ "Mobile device (cell phone)","Mobiles Gerät (Handy)" }, 233{ "Mobile device (cell phone)","Mobiles Gerät (Handy)" },
234{ "Help...","Hilfe..." }, 234{ "Help...","Hilfe..." },
235{ "Local file Cal:","Lokale Datei Kal:" }, 235{ "Local file Cal:","Lokale Datei Kal:" },
236{ "Local file ABook:","Lokale Datei ABuch:" }, 236{ "Local file ABook:","Lokale Datei ABuch:" },
237{ "Local file PWMgr:","Lokale Datei PWMgr:" }, 237{ "Local file PWMgr:","Lokale Datei PWMgr:" },
238{ "Addressbook file (*.vcf) is used by KA/Pi","Adressbuch Datei (*.vcf) wird von KA/Pi genutzt" }, 238{ "Addressbook file (*.vcf) is used by KA/Pi","Adressbuch Datei (*.vcf) wird von KA/Pi genutzt" },
239{ "Calendar:","Kalender:" }, 239{ "Calendar:","Kalender:" },
240{ "AddressBook:","AdressBuch:" }, 240{ "AddressBook:","AdressBuch:" },
241{ "PWManager:","PWManager:" }, 241{ "PWManager:","PWManager:" },
242{ "Addressbook file is used by KA/Pi","Adressbuch Datei wird von KA/Pi genutzt" }, 242{ "Addressbook file is used by KA/Pi","Adressbuch Datei wird von KA/Pi genutzt" },
243{ "ssh/scp","ssh/scp" }, 243{ "ssh/scp","ssh/scp" },
244{ "ftp","ftp" }, 244{ "ftp","ftp" },
245{ "Password for remote access: (could be the same for each)","Passwort für entfernten Zugriff: (kann dasselbe sein für alle)" }, 245{ "Password for remote access: (could be the same for each)","Passwort für entfernten Zugriff: (kann dasselbe sein für alle)" },
246{ "Remote IP address: (could be the same for each)","Entfernte IP Adresse: (kann dasselbe sein für alle)" }, 246{ "Remote IP address: (could be the same for each)","Entfernte IP Adresse: (kann dasselbe sein für alle)" },
247{ "Remote port number: (should be different for each)","Entfernte Port Nummer: (Sollte für alle unterschiedlich sein)" }, 247{ "Remote port number: (should be different for each)","Entfernte Port Nummer: (Sollte für alle unterschiedlich sein)" },
248{ "command for downloading remote file to local device","Kommando zum Download der entfernten Datei zum lokalen Gerät" }, 248{ "command for downloading remote file to local device","Kommando zum Download der entfernten Datei zum lokalen Gerät" },
249{ "command for uploading local temp file to remote device","Kommando zum Upload der lokalen temp. Datei zum entfernten Gerät" }, 249{ "command for uploading local temp file to remote device","Kommando zum Upload der lokalen temp. Datei zum entfernten Gerät" },
250{ "Insert device where\nphone is connected. E.g.:\n","Füge Device ein, an dem\ndas Handy angeschlossen ist. Z.B.:\n" }, 250{ "Insert device where\nphone is connected. E.g.:\n","Füge Device ein, an dem\ndas Handy angeschlossen ist. Z.B.:\n" },
251{ "KDE-Pim sync config","KDE-Pim sync Konfig" }, 251{ "KDE-Pim sync config","KDE-Pim sync Konfig" },
252{ "Insert kind of connection,e.g.:\n","Füge Art der Verbindung ein,z.B.:\n" }, 252{ "Insert kind of connection,e.g.:\n","Füge Art der Verbindung ein,z.B.:\n" },
253{ "Recommended: Leave empty!\n(Such that model can\nbe auto detected)\nOr insert name of model:\n","Empfohlen: Leer lassen!\n(So dass das Model\nautomatisch erkannt\nwerden kann)\nOder füge Model Name ein:\n" }, 253{ "Recommended: Leave empty!\n(Such that model can\nbe auto detected)\nOr insert name of model:\n","Empfohlen: Leer lassen!\n(So dass das Model\nautomatisch erkannt\nwerden kann)\nOder füge Model Name ein:\n" },
254{ "Port number (Default: %1)","Port Nummer (Default: %1)" }, 254{ "Port number (Default: %1)","Port Nummer (Default: %1)" },
255{ "Password to enable\naccess from remote:","Passwort um entfernten\nZugriff zuzulassen:" }, 255{ "Password to enable\naccess from remote:","Passwort um entfernten\nZugriff zuzulassen:" },
256{ "Automatically start\nat application startup","Starte automatisch\nbeim Programmstart" }, 256{ "Automatically start\nat application startup","Starte automatisch\nbeim Programmstart" },
257{ "Automatically sync\nwith KDE-Desktop","Automatischer Sync\nmit dem KDE-Desktop" }, 257{ "Automatically sync\nwith KDE-Desktop","Automatischer Sync\nmit dem KDE-Desktop" },
258{ "Enter port for Pi-Sync","Port Nummer für Pi-Sync" }, 258{ "Enter port for Pi-Sync","Port Nummer für Pi-Sync" },
259{ "Disable Pi-Sync","Schalte Pi-Sync aus" }, 259{ "Disable Pi-Sync","Schalte Pi-Sync aus" },
260{ "Do you really want\nto multiple sync\nwith all checked profiles?\nSyncing takes some\ntime - all profiles\nare synced twice!","Wollen Sie wirklich\nmit allen selektierten\nProfilen \"Multi-Syncen\"?\nDas Syncen dauert einige Zeit -\nalle Profile werden zweimal gesynct!" }, 260{ "Do you really want\nto multiple sync\nwith all checked profiles?\nSyncing takes some\ntime - all profiles\nare synced twice!","Wollen Sie wirklich\nmit allen selektierten\nProfilen \"Multi-Syncen\"?\nDas Syncen dauert einige Zeit -\nalle Profile werden zweimal gesynct!" },
261{ "KDE-Pim Sync","KDE-Pim Sync" }, 261{ "KDE-Pim Sync","KDE-Pim Sync" },
262{ "Multiple profiles","Multi-Sync Profile" }, 262{ "Multiple profiles","Multi-Sync Profile" },
263{ "Device: ","Gerät: " }, 263{ "Device: ","Gerät: " },
264{ "Multiple sync started.","Multi-Sync gestartet." }, 264{ "Multiple sync started.","Multi-Sync gestartet." },
265{ "Nothing synced! No profiles defined for multisync!","Nichts gesynct! Keine Profile\nselektiert für Multi-Sync" }, 265{ "Nothing synced! No profiles defined for multisync!","Nichts gesynct! Keine Profile\nselektiert für Multi-Sync" },
266{ "KDE-Pim sync config","KDE-Pim Sync Konfig" }, 266{ "KDE-Pim sync config","KDE-Pim Sync Konfig" },
267{ "Insert kind of connection,e.g.:\n","Füge Art der Verbindung ein, z.B.:\n" }, 267{ "Insert kind of connection,e.g.:\n","Füge Art der Verbindung ein, z.B.:\n" },
268{ "Recommended: Leave empty!\n(Such that model can\nbe auto detected)\nOr insert name of model:\n","Empfohlen: Leer lassen!\n(So dass das Modell\nautomatisch\erkannt\nwerden kann)\nOder füge Model Name ein:\n" }, 268{ "Recommended: Leave empty!\n(Such that model can\nbe auto detected)\nOr insert name of model:\n","Empfohlen: Leer lassen!\n(So dass das Modell\nautomatisch\erkannt\nwerden kann)\nOder füge Model Name ein:\n" },
269{ "KO/Pi config error","KO/Pi Konfig. Fehler" }, 269{ "KO/Pi config error","KO/Pi Konfig. Fehler" },
270{ "Local device name undefined!\nPlease define device name!","Name dieses Gerätes undefiniert!\nBitte Namen angeben!" }, 270{ "Local device name undefined!\nPlease define device name!","Name dieses Gerätes undefiniert!\nBitte Namen angeben!" },
271{ "Edit Address Book Filters","Editiere Addressbuch Filter" }, 271{ "Edit Address Book Filters","Editiere Addressbuch Filter" },
272{ "&Add...","Hinzufügen..." }, 272{ "&Add...","Hinzufügen..." },
273{ "&Edit...","B&earbeiten..." }, 273{ "&Edit...","B&earbeiten..." },
274{ "&Remove","Entfe&rne" }, 274{ "&Remove","Entfe&rne" },
275{ "Modify View: ","Ansicht ändern: " }, 275{ "Modify View: ","Ansicht ändern: " },
276{ "Fields","Felder" }, 276{ "Fields","Felder" },
277{ "Select Fields to Display","Wähle anzuzeigende Felder" }, 277{ "Select Fields to Display","Wähle anzuzeigende Felder" },
278{ "All","Alles" }, 278{ "All","Alles" },
279{ "Frequent","Frequent" }, 279{ "Frequent","Frequent" },
280{ "Address","Adresse" }, 280{ "Address","Adresse" },
281{ "Email","E-Mail" }, 281{ "Email","E-Mail" },
282{ "Personal","Persönl." }, 282{ "Personal","Persönl." },
283{ "Organization","Organisation" }, 283{ "Organization","Organisation" },
284{ "Custom","Benutzerdefiniert" }, 284{ "Custom","Benutzerdefiniert" },
285{ "&Selected\nfields:","&Selektierte\nFelder:" }, 285{ "&Selected\nfields:","&Selektierte\nFelder:" },
286{ "Formatted Name","Format. Name" }, 286{ "Formatted Name","Format. Name" },
287{ "Additional Names","Mittelname" }, 287{ "Additional Names","Mittelname" },
288{ "Honorific Prefixes","Namen Prefix" }, 288{ "Honorific Prefixes","Namen Prefix" },
289{ "Honorific Suffixes","Namen Suffix" }, 289{ "Honorific Suffixes","Namen Suffix" },
290{ "Nick Name","Sptitzname" }, 290{ "Nick Name","Sptitzname" },
291{ "Birthday","Geburtstag" }, 291{ "Birthday","Geburtstag" },
292{ "Home Address Street","Privat Adresse Strasse" }, 292{ "Home Address Street","Privat Adresse Strasse" },
293{ "Home Address Locality","Privat Adresse Stadt" }, 293{ "Home Address Locality","Privat Adresse Stadt" },
294{ "Home Address Region","Privat Adresse Bundesland" }, 294{ "Home Address Region","Privat Adresse Bundesland" },
295{ "Home Address Postal Code","Privat Adresse PLZ" }, 295{ "Home Address Postal Code","Privat Adresse PLZ" },
296{ "Home Address Country","Privat Adresse Land" }, 296{ "Home Address Country","Privat Adresse Land" },
297{ "Home Address Label","Privat Adresse Label" }, 297{ "Home Address Label","Privat Adresse Label" },
298{ "Business Address Street","Büro Adresse Strasse" }, 298{ "Business Address Street","Büro Adresse Strasse" },
299{ "Business Address Locality","Büro Adresse Stadt" }, 299{ "Business Address Locality","Büro Adresse Stadt" },
300{ "Business Address Region","Büro Adresse Bundesland" }, 300{ "Business Address Region","Büro Adresse Bundesland" },
301{ "Business Address Postal Code","Büro Adresse PLZ" }, 301{ "Business Address Postal Code","Büro Adresse PLZ" },
302{ "Business Address Country","Büro Adresse Land" }, 302{ "Business Address Country","Büro Adresse Land" },
303{ "Business Address Label","Büro Adresse Label" }, 303{ "Business Address Label","Büro Adresse Label" },
304{ "Home Phone","Privat Telefon" }, 304{ "Home Phone","Privat Telefon" },
305{ "Business Phone","Büro Telefon" }, 305{ "Business Phone","Büro Telefon" },
306{ "Mobile Phone","Handy" }, 306{ "Mobile Phone","Handy" },
307{ "Home Fax","Privat Fax" }, 307{ "Home Fax","Privat Fax" },
308{ "Business Fax","Büro Fax" }, 308{ "Business Fax","Büro Fax" },
309{ "Car Phone","Autotelefon" }, 309{ "Car Phone","Autotelefon" },
310{ "ISDN","ISDN" }, 310{ "ISDN","ISDN" },
311{ "Pager","Pager" }, 311{ "Pager","Pager" },
312{ "Mail Client","Mail Client" }, 312{ "Mail Client","Mail Client" },
313{ "Title","Titel" }, 313{ "Title","Titel" },
314{ "Role","Rolle" }, 314{ "Role","Rolle" },
315{ "Note","Notiz" }, 315{ "Note","Notiz" },
316{ "URL","URL" }, 316{ "URL","URL" },
317{ "Resource","Resource" }, 317{ "Resource","Resource" },
318{ "SIP","SIP" }, 318{ "SIP","SIP" },
319{ "Default Filter","Default Filter" }, 319{ "Default Filter","Default Filter" },
320{ "The default filter will be activated whenever this view is displayed. This feature allows you to configure views that only interact with certain types of information based on the filter. Once the view is activated, the filter can be changed at anytime.","#The default filter will be activated whenever this view is displayed. This feature allows you to configure views that only interact with certain types of information based on the filter. Once the view is activated, the filter can be changed at anytime." }, 320{ "The default filter will be activated whenever this view is displayed. This feature allows you to configure views that only interact with certain types of information based on the filter. Once the view is activated, the filter can be changed at anytime.","#The default filter will be activated whenever this view is displayed. This feature allows you to configure views that only interact with certain types of information based on the filter. Once the view is activated, the filter can be changed at anytime." },
321{ "No default filter","Kein default Filter" }, 321{ "No default filter","Kein default Filter" },
322{ "Use last active filter","Nutze letzen aktiven Filter" }, 322{ "Use last active filter","Nutze letzen aktiven Filter" },
323{ "Use filter:","Nutze Filter:" }, 323{ "Use filter:","Nutze Filter:" },
324{ "Look & Feel","Look & Feel" }, 324{ "Look & Feel","Look & Feel" },
325{ "Row Separator","Reihen Separator" }, 325{ "Row Separator","Reihen Separator" },
326{ "Alternating backgrounds","Abwechselnder Hintergrund" }, 326{ "Alternating backgrounds","Abwechselnder Hintergrund" },
327{ "Single line","Einzelne Zeile" }, 327{ "Single line","Einzelne Zeile" },
328{ "Enable background image:","Hintergrundbild:" }, 328{ "Enable background image:","Hintergrundbild:" },
329{ "Enable contact tooltips","Contact Tooltips" }, 329{ "Enable contact tooltips","Contact Tooltips" },
330{ "&Enable custom Colors","Benutzerdef. Farben" }, 330{ "&Enable custom Colors","Benutzerdef. Farben" },
331{ "&Colors","Farben" }, 331{ "&Colors","Farben" },
332{ "If custom colors are enabled, you may choose the colors for the view below. Otherwise colors from your current KDE color scheme are used.","#If custom colors are enabled, you may choose the colors for the view below. Otherwise colors from your current KDE color scheme are used." }, 332{ "If custom colors are enabled, you may choose the colors for the view below. Otherwise colors from your current KDE color scheme are used.","#If custom colors are enabled, you may choose the colors for the view below. Otherwise colors from your current KDE color scheme are used." },
333{ "Double click or press RETURN on a item to select a color for the related strings in the view.","#Double click or press RETURN on a item to select a color for the related strings in the view." }, 333{ "Double click or press RETURN on a item to select a color for the related strings in the view.","#Double click or press RETURN on a item to select a color for the related strings in the view." },
334{ "&Enable custom fonts","B&enutzerdefinierte Schriften" }, 334{ "&Enable custom fonts","B&enutzerdefinierte Schriften" },
335{ "&Text font:","Textschriftart:" }, 335{ "&Text font:","Textschriftart:" },
336{ "&Header font:","Titelschriftart:" }, 336{ "&Header font:","Titelschriftart:" },
337{ "If custom fonts are enabled, you may choose which fonts to use for this view below. Otherwise the default KDE font will be used, in bold style for the header and normal style for the data.","#If custom fonts are enabled, you may choose which fonts to use for this view below. Otherwise the default KDE font will be used, in bold style for the header and normal style for the data." }, 337{ "If custom fonts are enabled, you may choose which fonts to use for this view below. Otherwise the default KDE font will be used, in bold style for the header and normal style for the data.","#If custom fonts are enabled, you may choose which fonts to use for this view below. Otherwise the default KDE font will be used, in bold style for the header and normal style for the data." },
338{ "&Fonts","Schri&ften" }, 338{ "&Fonts","Schri&ften" },
339{ "Background Color","Hintergrundfarbe" }, 339{ "Background Color","Hintergrundfarbe" },
340{ "Text Color","Textfarbe" }, 340{ "Text Color","Textfarbe" },
341{ "Header Background Color","Titel Hintergrundfarbe" }, 341{ "Header Background Color","Titel Hintergrundfarbe" },
342{ "Header Text Color","Titel Farbe" }, 342{ "Header Text Color","Titel Farbe" },
343{ "Highlight Color","Auswahlfarbe" }, 343{ "Highlight Color","Auswahlfarbe" },
344{ "Highlighted Text Color","Auswahltextfarbe" }, 344{ "Highlighted Text Color","Auswahltextfarbe" },
345{ "Alternating Background Color","Abwechselnder Hintergrundfarbe" }, 345{ "Alternating Background Color","Abwechselnder Hintergrundfarbe" },
346{ "Postal","Post" }, 346{ "Postal","Post" },
347{ "Dr.","Dr." }, 347{ "Dr.","Dr." },
348{ "Miss","Frl." }, 348{ "Miss","Frl." },
349{ "Mr.","Herr" }, 349{ "Mr.","Herr" },
350{ "Mrs.","Frau" }, 350{ "Mrs.","Frau" },
351{ "Ms.","Fr." }, 351{ "Ms.","Fr." },
352{ "Prof.","Prof." }, 352{ "Prof.","Prof." },
353{ "I","I" }, 353{ "I","I" },
354{ "II","II" }, 354{ "II","II" },
355{ "III","III" }, 355{ "III","III" },
356{ "Jr.","Jr." }, 356{ "Jr.","Jr." },
357{ "Sr.","Sr." }, 357{ "Sr.","Sr." },
358{ "Name:","Name:" }, 358{ "Name:","Name:" },
359{ "Documents","Dokumente" }, 359{ "Documents","Dokumente" },
360{ "Files","Dateien" }, 360{ "Files","Dateien" },
361{ "All Files","Alle Dateien" }, 361{ "All Files","Alle Dateien" },
362{ "Name","Name" }, 362{ "Name","Name" },
363{ "Size","Größe" }, 363{ "Size","Größe" },
364{ "Date","Datum" }, 364{ "Date","Datum" },
365{ "Mime Type","Mime Typ" }, 365{ "Mime Type","Mime Typ" },
366{ "Geo Data Input","Geo Dateneingabe" }, 366{ "Geo Data Input","Geo Dateneingabe" },
367{ "Sexagesimal","Sexagesimal" }, 367{ "Sexagesimal","Sexagesimal" },
368{ "North","Nord" }, 368{ "North","Nord" },
369{ "South","Süd" }, 369{ "South","Süd" },
370{ "East","Ost" }, 370{ "East","Ost" },
371{ "West","West" }, 371{ "West","West" },
372{ "Undefined","Unbestimmt" }, 372{ "Undefined","Unbestimmt" },
373{ "Edit Address","Bearbeite Adresse" }, 373{ "Edit Address","Bearbeite Adresse" },
374{ "Street:","Strasse:" }, 374{ "Street:","Strasse:" },
375{ "Post office box:","Postfach:" }, 375{ "Post office box:","Postfach:" },
376{ "Locality:","Stadt:" }, 376{ "Locality:","Stadt:" },
377{ "Region:","Region:" }, 377{ "Region:","Region:" },
378{ "Postal code:","PLZ:" }, 378{ "Postal code:","PLZ:" },
379{ "Country:","Staat:" }, 379{ "Country:","Staat:" },
380{ "This is the preferred address","Dies ist die bevorzugte Adresse" }, 380{ "This is the preferred address","Dies ist die bevorzugte Adresse" },
381{ "New...","Neu..." }, 381{ "New...","Neu..." },
382{ "Change Type","Ändere Art" }, 382{ "Change Type","Ändere Art" },
383{ "Edit Address Type","Ändere Address Art" }, 383{ "Edit Address Type","Ändere Address Art" },
384{ "Address Types","Address Art" }, 384{ "Address Types","Address Art" },
385{ "Domestic","Inland" }, 385{ "Domestic","Inland" },
386{ "International","International" }, 386{ "International","International" },
387{ "Parcel","Paket" }, 387{ "Parcel","Paket" },
388{ "Edit Contact Name","Ändere Kontakt Name" }, 388{ "Edit Contact Name","Ändere Kontakt Name" },
389{ "Honorific prefixes:","Namensprefixes:" }, 389{ "Honorific prefixes:","Namensprefixes:" },
390{ "Given name:","Vorname:" }, 390{ "Given name:","Vorname:" },
391{ "Additional names:","Mittelnamen:" }, 391{ "Additional names:","Mittelnamen:" },
392{ "Family names:","Nachname:" }, 392{ "Family names:","Nachname:" },
393{ "Honorific suffixes:","Namenssuffixe:" }, 393{ "Honorific suffixes:","Namenssuffixe:" },
394{ "Parse name automatically","Setze Namen automatisch" }, 394{ "Parse name automatically","Setze Namen automatisch" },
395{ "Edit Phone Numbers","Bearbeite Telefonnummern" }, 395{ "Edit Phone Numbers","Bearbeite Telefonnummern" },
396{ "Number","Nummer" }, 396{ "Number","Nummer" },
397{ "Type","Typ" }, 397{ "Type","Typ" },
398{ "Edit Phone Number","Bearbeite Telefonnummer" }, 398{ "Edit Phone Number","Bearbeite Telefonnummer" },
399{ "Number:","Nummer:" }, 399{ "Number:","Nummer:" },
400{ "This is the preferred phone number","Dies ist die bevorzugte Telefonnummer" }, 400{ "This is the preferred phone number","Dies ist die bevorzugte Telefonnummer" },
401{ "Types","Typen" }, 401{ "Types","Typen" },
402{ "Messenger","Messenger" }, 402{ "Messenger","Messenger" },
403{ "Other","Anderes" }, 403{ "Other","Anderes" },
404{ "Video","Video" }, 404{ "Video","Video" },
405{ "Mailbox","Mailbox" }, 405{ "Mailbox","Mailbox" },
406{ "Modem","Modem" }, 406{ "Modem","Modem" },
407{ "Car","Auto" }, 407{ "Car","Auto" },
408{ "PCS","PCS" }, 408{ "PCS","PCS" },
409{ "Category","Kategorie" }, 409{ "Category","Kategorie" },
410{ "Select Categories","Wähle Kategorien" }, 410{ "Select Categories","Wähle Kategorien" },
411{ " &Deselect All "," &Deselektiere alle " }, 411{ " &Deselect All "," &Deselektiere alle " },
412{ " &Edit Categories "," B&earbeite Kategorien " }, 412{ " &Edit Categories "," B&earbeite Kategorien " },
413{ "&OK","&OK" }, 413{ "&OK","&OK" },
414{ "&Cancel","Abbre&chen" }, 414{ "&Cancel","Abbre&chen" },
415{ "Configure","Konfiguriere" }, 415{ "Configure","Konfiguriere" },
416{ "Default","Voreinstellungen" }, 416{ "Default","Voreinstellungen" },
417{ "Addressbook","Adressbuch" }, 417{ "Addressbook","Adressbuch" },
418{ "Details view font","Schriftart Detailansicht" }, 418{ "Details view font","Schriftart Detailansicht" },
419{ "phone:123","phone:123" }, 419{ "phone:123","phone:123" },
420{ "Search only after <return> key pressed","Suche nur nach <return> Taste" }, 420{ "Search only after <return> key pressed","Suche nur nach <return> Taste" },
421{ "Honor KDE single click","Benutze KDE Einzelklick" }, 421{ "Honor KDE single click","Benutze KDE Einzelklick" },
422{ "Automatic name parsing for new addressees","Automa. Name Parsen für neue Einträge" }, 422{ "Automatic name parsing for new addressees","Automa. Name Parsen für neue Einträge" },
423{ "Display List and Details at once (restart)","Zeige Liste und Details zusammen(neustart)" }, 423{ "Display List and Details at once (restart)","Zeige Liste und Details zusammen(neustart)" },
424{ "Ask for quit when closing Ka/Pi","Vor Beenden von Ka/Pi nachfragen" }, 424{ "Ask for quit when closing Ka/Pi","Vor Beenden von Ka/Pi nachfragen" },
425{ "General","Algemein" }, 425{ "General","Algemein" },
426{ "Extensions (restart)","Extensions (restart)" }, 426{ "Extensions (restart)","Extensions (restart)" },
427{ "Description","Beschreibungen" }, 427{ "Description","Beschreibungen" },
428{ "Extensions","Extensions" }, 428{ "Extensions","Extensions" },
429{ "Prefixes","Prefixe" }, 429{ "Prefixes","Prefixe" },
430{ "Inclusions","Inclusions" }, 430{ "Inclusions","Inclusions" },
431{ "Suffixes","Suffixe" }, 431{ "Suffixes","Suffixe" },
432{ "Default formatted name:","Default format. Name:" }, 432{ "Default formatted name:","Default format. Name:" },
433{ "Empty","Leer" }, 433{ "Empty","Leer" },
434{ "Simple Name","Einfacher Name" }, 434{ "Simple Name","Einfacher Name" },
435{ "Full Name","Voller Name" }, 435{ "Full Name","Voller Name" },
436{ "Reverse Name","Namen umdrehen" }, 436{ "Reverse Name","Namen umdrehen" },
437{ "Contact","Kontakt" }, 437{ "Contact","Kontakt" },
438{ "Global","Allgemein" }, 438{ "Global","Allgemein" },
439{ "Phone","Telefon" }, 439{ "Phone","Telefon" },
440{ "SMS","SMS" }, 440{ "SMS","SMS" },
441{ "Language:(needs restart)","Sprache:(Neustart)" }, 441{ "Language:(needs restart)","Sprache:(Neustart)" },
442{ "English","English" }, 442{ "English","English" },
443{ "German","Deutsch" }, 443{ "German","Deutsch" },
444{ "French","Französisch" }, 444{ "French","Französisch" },
445{ "Italian","Italienisch" }, 445{ "Italian","Italienisch" },
446{ "User defined (usertranslation.txt)","Benutzerdef. (usertranslation.txt)" }, 446{ "User defined (usertranslation.txt)","Benutzerdef. (usertranslation.txt)" },
447{ "Time Format(nr):","Zeit Format(nr):" }, 447{ "Time Format(nr):","Zeit Format(nr):" },
448{ "24:00","24:00" }, 448{ "24:00","24:00" },
449{ "12:00am","12:00am" }, 449{ "12:00am","12:00am" },
450{ "Week starts on Sunday","Woche beginnt Sonntags" }, 450{ "Week starts on Sunday","Woche beginnt Sonntags" },
451{ "Locale","Locale" }, 451{ "Locale","Locale" },
452{ "Date Format:","Datums Format:" }, 452{ "Date Format:","Datums Format:" },
453{ "24.03.2004 (%d.%m.%Y|%A %d %B %Y)","24.03.2004 (%d.%m.%Y|%A %d %B %Y)" }, 453{ "24.03.2004 (%d.%m.%Y|%A %d %B %Y)","24.03.2004 (%d.%m.%Y|%A %d %B %Y)" },
454{ "03.24.2004 (%m.%d.%Y|%A %B %d %Y)","03.24.2004 (%m.%d.%Y|%A %B %d %Y)" }, 454{ "03.24.2004 (%m.%d.%Y|%A %B %d %Y)","03.24.2004 (%m.%d.%Y|%A %B %d %Y)" },
455{ "2004-03-24 (%Y-%m-%d|%A %Y %B %d)","2004-03-24 (%Y-%m-%d|%A %Y %B %d)" }, 455{ "2004-03-24 (%Y-%m-%d|%A %Y %B %d)","2004-03-24 (%Y-%m-%d|%A %Y %B %d)" },
456{ "User defined","Benutzerdefiniert" }, 456{ "User defined","Benutzerdefiniert" },
457{ "User long date:","Format langes Datum:" }, 457{ "User long date:","Format langes Datum:" },
458{ "User short date:","Format kurzes Datum:" }, 458{ "User short date:","Format kurzes Datum:" },
459{ "Daylight start:","Sommerzeit Beginn:" }, 459{ "Daylight start:","Sommerzeit Beginn:" },
460{ "Daylight end:","Sommerzeit Ende:" }, 460{ "Daylight end:","Sommerzeit Ende:" },
461{ "Actual start and end is the\nsunday before this date.","Tatsächlicher Beginn/Ende ist der\nSonntag vor diesem Datum!" }, 461{ "Actual start and end is the\nsunday before this date.","Tatsächlicher Beginn/Ende ist der\nSonntag vor diesem Datum!" },
462{ "Monday 19 April 2004: %A %d %B %Y","Monday 19 April 2004: %A %d %B %Y" }, 462{ "Monday 19 April 2004: %A %d %B %Y","Monday 19 April 2004: %A %d %B %Y" },
463{ "Mon 19.04.04: %a %d.%m.%y","Mon 19.04.04: %a %d.%m.%y" }, 463{ "Mon 19.04.04: %a %d.%m.%y","Mon 19.04.04: %a %d.%m.%y" },
464{ "Mon, 19.Apr.04: %a, %d.%b.%y","Mon, 19.Apr.04: %a, %d.%b.%y" }, 464{ "Mon, 19.Apr.04: %a, %d.%b.%y","Mon, 19.Apr.04: %a, %d.%b.%y" },
465{ "Date Format","Datums Format" }, 465{ "Date Format","Datums Format" },
466{ "Timezone:","Zeitzone:" }, 466{ "Timezone:","Zeitzone:" },
467{ "The year in the date is ignored.","Das Jahr vom Datum wird ignoriert." }, 467{ "The year in the date is ignored.","Das Jahr vom Datum wird ignoriert." },
468{ "Timezone has daylight saving","Zeitzone hat Sommerzeit" }, 468{ "Timezone has daylight saving","Zeitzone hat Sommerzeit" },
469{ "Add 30 min to selected Timezone","Addiere 30 min zur Zeitzone" }, 469{ "Add 30 min to selected Timezone","Addiere 30 min zur Zeitzone" },
470{ "Used Mail Client","Benutzter Mail Client" }, 470{ "Used Mail Client","Benutzter Mail Client" },
471{ "Channel:","Channel:" }, 471{ "Channel:","Channel:" },
472{ "Message:","Message:" }, 472{ "Message:","Message:" },
473{ "Parameters:","Parameter:" }, 473{ "Parameters:","Parameter:" },
474{ "HINT: Delimiter=; Name=%1,Email=%2","Hinweis: Begrenzer=; Name=%1,Email=%2" }, 474{ "HINT: Delimiter=; Name=%1,Email=%2","Hinweis: Begrenzer=; Name=%1,Email=%2" },
475{ "extra Message:","extra Message:" }, 475{ "extra Message:","extra Message:" },
476{ "extra Parameters:","extra Parameter:" }, 476{ "extra Parameters:","extra Parameter:" },
477{ "HINT: Emails=%1,Attachments=%2","Hinweis: Emails=%1,Attachments=%2" }, 477{ "HINT: Emails=%1,Attachments=%2","Hinweis: Emails=%1,Attachments=%2" },
478{ "External Apps.","Externe Appl." }, 478{ "External Apps.","Externe Appl." },
479{ "Used %1 Client","Benutzer %1 Client" }, 479{ "Used %1 Client","Benutzer %1 Client" },
480{ "No email client installed","Keine Email Client installiert" }, 480{ "No email client installed","Keine Email Client installiert" },
481{ "Userdefined email client","Benutzerdef. Email Client" }, 481{ "Userdefined email client","Benutzerdef. Email Client" },
482{ "OM/Pi email client","OM/Pi Email Client" }, 482{ "OM/Pi email client","OM/Pi Email Client" },
483{ "Close KA/Pi?","Schließe KA/Pi?" }, 483{ "Close KA/Pi?","Schließe KA/Pi?" },
484{ "\nChanges will be saved!","\nÄnderungen werden gespeichert!" }, 484{ "\nChanges will be saved!","\nÄnderungen werden gespeichert!" },
485{ "Yes!","Ja!" }, 485{ "Yes!","Ja!" },
486{ "There was an error while attempting to save\n the address book. Please check that some \nother application is not using it. ","#There was an error while attempting to save\n the address book. Please check that some \nother application is not using it. " }, 486{ "There was an error while attempting to save\n the address book. Please check that some \nother application is not using it. ","#There was an error while attempting to save\n the address book. Please check that some \nother application is not using it. " },
487{ "Saving addressbook ... ","Speichere Adressbuch ... " }, 487{ "Saving addressbook ... ","Speichere Adressbuch ... " },
488{ "Addressbook saved!","Adressbuch gespeichert!" }, 488{ "Addressbook saved!","Adressbuch gespeichert!" },
489{ "Default Table View","Default Tabellenansicht" }, 489{ "Default Table View","Default Tabellenansicht" },
490{ "Merge and Remove","Zusammenfügen/entfernen" }, 490{ "Merge and Remove","Zusammenfügen/entfernen" },
491{ "Merge","Zusammenfügen" }, 491{ "Merge","Zusammenfügen" },
492{ "Merge Contacts Editor","Contact-Zusammenfüge-Editor" }, 492{ "Merge Contacts Editor","Contact-Zusammenfüge-Editor" },
493{ "New List...","Neue Liste..." }, 493{ "New List...","Neue Liste..." },
494{ "Rename List...","Ändere Namen..." }, 494{ "Rename List...","Ändere Namen..." },
495{ "Remove List","Lösche Liste" }, 495{ "Remove List","Lösche Liste" },
496{ "Add Contact","Kontakt hinzu" }, 496{ "Add Contact","Kontakt hinzu" },
497{ "Change Email...","Ändere Email..." }, 497{ "Change Email...","Ändere Email..." },
498{ "Remove Contact","Entferne Kontakt" }, 498{ "Remove Contact","Entferne Kontakt" },
499{ "Use Preferred","Nutze Preferred" }, 499{ "Use Preferred","Nutze Preferred" },
500{ "Distribution List Editor","Distribution List Editor" }, 500{ "Distribution List Editor","Distribution List Editor" },
501{ "Choose which contacts to export","Wähle Kontakte zum Exportieren" }, 501{ "Choose which contacts to export","Wähle Kontakte zum Exportieren" },
502{ "Which contacts do you want to export?","Welche Kontakte sollen exportiert werden?" }, 502{ "Which contacts do you want to export?","Welche Kontakte sollen exportiert werden?" },
503{ "Contact Selection","Kontaktauswahl" }, 503{ "Contact Selection","Kontaktauswahl" },
504{ "&All","&Alle" }, 504{ "&All","&Alle" },
505{ "Export the entire address book","Exportiere das komplette Addressbuch" }, 505{ "Export the entire address book","Exportiere das komplette Addressbuch" },
506{ "&Selected","Au&sgewählte" }, 506{ "&Selected","Au&sgewählte" },
507{ "Only export contacts selected in KAddressBook.\nThis option is disabled if no contacts are selected.","###Only export contacts selected in KAddressBook.\nThis option is disabled if no contacts are selected." }, 507{ "Only export contacts selected in KAddressBook.\nThis option is disabled if no contacts are selected.","###Only export contacts selected in KAddressBook.\nThis option is disabled if no contacts are selected." },
508{ "By matching &filter","Zutreffender &Filter" }, 508{ "By matching &filter","Zutreffender &Filter" },
509{ "Only export contacts matching the selected filter.\nThis option is disabled if you haven't defined any filters","###Only export contacts matching the selected filter.\nThis option is disabled if you haven't defined any filters" }, 509{ "Only export contacts matching the selected filter.\nThis option is disabled if you haven't defined any filters","###Only export contacts matching the selected filter.\nThis option is disabled if you haven't defined any filters" },
510{ "By Cate&gories","Kategorien" }, 510{ "By Cate&gories","Kategorien" },
511{ "Only export contacts who are members of a category that is checked on the list to the left.\nThis option is disabled if you have no categories.","###Only export contacts who are members of a category that is checked on the list to the left.\nThis option is disabled if you have no categories." }, 511{ "Only export contacts who are members of a category that is checked on the list to the left.\nThis option is disabled if you have no categories.","###Only export contacts who are members of a category that is checked on the list to the left.\nThis option is disabled if you have no categories." },
512{ "Select a filter to decide which contacts to export.","Wähle Filter zum Export aus." }, 512{ "Select a filter to decide which contacts to export.","Wähle Filter zum Export aus." },
513{ "Check the categories whose members you want to export.","Wähle die Kategorien zum Export aus." }, 513{ "Check the categories whose members you want to export.","Wähle die Kategorien zum Export aus." },
514{ "Sorting","Sortieren" }, 514{ "Sorting","Sortieren" },
515{ "Criterion:","Merkmal:" }, 515{ "Criterion:","Merkmal:" },
516{ "Order:","Reihenfolge:" }, 516{ "Order:","Reihenfolge:" },
517{ "Ascending","Aufsteigend" }, 517{ "Ascending","Aufsteigend" },
518{ "Descending","Absteigend" }, 518{ "Descending","Absteigend" },
519{ "Save file","Datei speichern" }, 519{ "Save file","Datei speichern" },
520{ "Error","Fehler" }, 520{ "Error","Fehler" },
521{ "Unable to export contacts.","Exportieren der Kontakte geht nicht." }, 521{ "Unable to export contacts.","Exportieren der Kontakte geht nicht." },
522{ "\nNo unsaved changes detected!\nNothing will be saved!","\nKeine ungespeicherten\nÄnderungen erkannt!\nNichts wird gespeichert!" }, 522{ "\nNo unsaved changes detected!\nNothing will be saved!","\nKeine ungespeicherten\nÄnderungen erkannt!\nNichts wird gespeichert!" },
523{ "Manage new categories...","Verwalte neue Kategorien..." }, 523{ "Manage new categories...","Verwalte neue Kategorien..." },
524{ "&File","Datei" }, 524{ "&File","Datei" },
525{ "&Edit","Bearbeite" }, 525{ "&Edit","Bearbeite" },
526{ "&View","Ansichten" }, 526{ "&View","Ansichten" },
527{ "&Settings","Konfiguration" }, 527{ "&Settings","Konfiguration" },
528{ "&Change selected","Ändere Selekt." }, 528{ "&Change selected","Ändere Selekt." },
529{ "&Help","Hilfe" }, 529{ "&Help","Hilfe" },
530{ "Remove sync info","Entferne Sync Info" }, 530{ "Remove sync info","Entferne Sync Info" },
531{ "For all profiles","Für alle Profile" }, 531{ "For all profiles","Für alle Profile" },
532{ "&Change","Ändere" }, 532{ "&Change","Ändere" },
533{ "Import xml (Qtopia)...","Importiere xml (Qtopia)..." }, 533{ "Import xml (Qtopia)...","Importiere xml (Qtopia)..." },
534{ "Export xml (Qtopia)...","Exportiere xml (Qtopia)..." }, 534{ "Export xml (Qtopia)...","Exportiere xml (Qtopia)..." },
535{ "Export to phone","Exportiere aufs Handy..." }, 535{ "Export to phone","Exportiere aufs Handy..." },
536{ "Which contacts do you want to select?","Welche Kontakte möchten Sie wählen?" }, 536{ "Which contacts do you want to select?","Welche Kontakte möchten Sie wählen?" },
537{ "&Modify","Ändere" }, 537{ "&Modify","Ändere" },
538{ "Choose which contacts to select","Bitte Kontakte auswählen!" }, 538{ "Choose which contacts to select","Bitte Kontakte auswählen!" },
539{ "After importing/loading/syncing\nthere may be new categories in\naddressees\nwhich are not in the category list.\nPlease choose what to do:\n ","Nach dem Importieren/Laden/Syncen\nkann es neue Kategorien in den \nKontakten geben, die nicht\nin der Kategorieliste enthalten sind.\nBitte wählen Sie, was passieren soll:\n " }, 539{ "After importing/loading/syncing\nthere may be new categories in\naddressees\nwhich are not in the category list.\nPlease choose what to do:\n ","Nach dem Importieren/Laden/Syncen\nkann es neue Kategorien in den \nKontakten geben, die nicht\nin der Kategorieliste enthalten sind.\nBitte wählen Sie, was passieren soll:\n " },
540{ "Manage new Categories","Verwalte neue Kategorien" }, 540{ "Manage new Categories","Verwalte neue Kategorien" },
541{ "Add to category list","Füge zur Kategorieliste hinzu" }, 541{ "Add to category list","Füge zur Kategorieliste hinzu" },
542{ "Remove from addressees","Entferne von den Kontakten" }, 542{ "Remove from addressees","Entferne von den Kontakten" },
543{ "New categories not in list:","Kategorien, die nicht in der Liste sind:" }, 543{ "New categories not in list:","Kategorien, die nicht in der Liste sind:" },
544{ "A&dd","Hinzufügen" }, 544{ "A&dd","Hinzufügen" },
545{ "Please read Help-Sync Howto\nto know what settings to use.","Bitte lese Hilfe-Sync Howto\num zu erfahren welche Einstellungen\ndie richtigen sind." }, 545{ "Please read Help-Sync Howto\nto know what settings to use.","Bitte lese Hilfe-Sync Howto\num zu erfahren welche Einstellungen\ndie richtigen sind." },
546{ "NOTE: This will remove all old\ncontact data on phone!","ACHTUNG: Das löscht alle alten\nKontakt Daten auf dem Handy!" }, 546{ "NOTE: This will remove all old\ncontact data on phone!","ACHTUNG: Das löscht alle alten\nKontakt Daten auf dem Handy!" },
547{ "Export to mobile phone!","Exportiere auf das Handy!" }, 547{ "Export to mobile phone!","Exportiere auf das Handy!" },
548{ "Export to phone options","Export ans Handy Optionen" }, 548{ "Export to phone options","Export ans Handy Optionen" },
549{ "Writing to phone...","Sende Daten ans Handy..." }, 549{ "Writing to phone...","Sende Daten ans Handy..." },
550{ " This may take 1-3 minutes!"," Das kann 1-3 Minuten dauern!" }, 550{ " This may take 1-3 minutes!"," Das kann 1-3 Minuten dauern!" },
551{ "Retry","Nochmal versuchen" }, 551{ "Retry","Nochmal versuchen" },
552{ "KDE/Pim phone access","KDE/Pim Handy Zugriff" }, 552{ "KDE/Pim phone access","KDE/Pim Handy Zugriff" },
553{ "Error accessing device!\nPlease turn on connection\nand retry!","Fehler beim Zugriff auf das Gerät!\nBitte die Verbindung aktivieren\nund nochmal versuchen!" }, 553{ "Error accessing device!\nPlease turn on connection\nand retry!","Fehler beim Zugriff auf das Gerät!\nBitte die Verbindung aktivieren\nund nochmal versuchen!" },
554{ "Error exporting to phone!","Fehler beim Export auf das Handy!" }, 554{ "Error exporting to phone!","Fehler beim Export auf das Handy!" },
555{ "&Print View","Drucke Ansicht" }, 555{ "&Print View","Drucke Ansicht" },
556{ "&Print Details","Drucke Details" }, 556{ "&Print Details","Drucke Details" },
557{ "Beam v&Card(s)...","Beame v&Card(s)..." }, 557{ "Beam v&Card(s)...","Beame v&Card(s)..." },
558{ "Set formatted name...","Setze formatierten Namen..." }, 558{ "Set formatted name...","Setze formatierten Namen..." },
559{ "Kde Sync HowTo","Kde Sync HowTo" }, 559{ "Kde Sync HowTo","Kde Sync HowTo" },
560{ "Multi Sync HowTo","Multi Sync HowTo" }, 560{ "Multi Sync HowTo","Multi Sync HowTo" },
561{ "&Beam","&Beame" }, 561{ "&Beam","&Beame" },
562{ "Edit Email Addresses","Editiere Email Adressen" }, 562{ "Edit Email Addresses","Editiere Email Adressen" },
563{ "Email address:","Email Adresse:" }, 563{ "Email address:","Email Adresse:" },
564{ "Change","Ändere" }, 564{ "Change","Ändere" },
565{ "Set Standard","Setze Standard" }, 565{ "Set Standard","Setze Standard" },
566{ "New Contact","Neuer Contact" }, 566{ "New Contact","Neuer Contact" },
567{ "Undo %1","Rückgängig %1" }, 567{ "Undo %1","Rückgängig %1" },
568{ "Redo","Wiederholen" }, 568{ "Redo","Wiederholen" },
569{ "Saving ... please wait! ","Am Speichern ... bitte warten! " }, 569{ "Saving ... please wait! ","Am Speichern ... bitte warten! " },
570{ "CSV Import Dialog","CSV Import Dialog" }, 570{ "CSV Import Dialog","CSV Import Dialog" },
571{ "File to import:","Datei zum Import:" }, 571{ "File to import:","Datei zum Import:" },
572{ "Delimiter","Trennzeichen" }, 572{ "Delimiter","Trennzeichen" },
573{ "Comma","Komma" }, 573{ "Comma","Komma" },
574{ "Semicolon","Semikolon" }, 574{ "Semicolon","Semikolon" },
575{ "Tabulator","Tabulator" }, 575{ "Tabulator","Tabulator" },
576{ "Space","Leerzeichen" }, 576{ "Space","Leerzeichen" },
577{ "1","1" }, 577{ "1","1" },
578{ """,""" }, 578{ """,""" },
579{ "'","'" }, 579{ "'","'" },
580{ "Start at line:","Beginne mit Zeile:" }, 580{ "Start at line:","Beginne mit Zeile:" },
581{ "Textquote:","Textquote:" }, 581{ "Textquote:","Textquote:" },
582{ "Ignore duplicate delimiters","Ignoriere doppelte Trennzeichen" }, 582{ "Ignore duplicate delimiters","Ignoriere doppelte Trennzeichen" },
583{ "Import KDE 2 Addressbook","Importiere KDE 2 Addressbook" }, 583{ "Import KDE 2 Addressbook","Importiere KDE 2 Addressbook" },
584{ "Override previously imported entries?","Überschreibe bereits importierte Einträge?" }, 584{ "Override previously imported entries?","Überschreibe bereits importierte Einträge?" },
585{ "Select vCard to Import","Selektiere zu importierende vCard" }, 585{ "Select vCard to Import","Selektiere zu importierende vCard" },
586{ "Information","Information" }, 586{ "Information","Information" },
587{ "contacts successfully imported.","Kontakte erfolgreich importiert." }, 587{ "contacts successfully imported.","Kontakte erfolgreich importiert." },
588{ "Import xml file","Importiere xml Datei" }, 588{ "Import xml file","Importiere xml Datei" },
589{ "Choose contact selection","Wähle Kontakt Auswahl" }, 589{ "Choose contact selection","Wähle Kontakt Auswahl" },
590{ "Select the entire address book","Wähle das ganze Adressbuch" }, 590{ "Select the entire address book","Wähle das ganze Adressbuch" },
591{ "Only contacts selected in KAddressBook.\nThis option is disabled if no contacts are selected.","Nur in KA/Pi selektierte Kontate.\nDiese Option ist nicht verfügbar\nwhen keine Kontakte selektiert sind." }, 591{ "Only contacts selected in KAddressBook.\nThis option is disabled if no contacts are selected.","Nur in KA/Pi selektierte Kontate.\nDiese Option ist nicht verfügbar\nwhen keine Kontakte selektiert sind." },
592{ "Only contacts matching the selected filter.\nThis option is disabled if you haven't defined any filters","Nur Kontakte die auf den Filter zutreffen.\nDiese Option ist nicht verfügbar, wenn keine Filter definiert sind." }, 592{ "Only contacts matching the selected filter.\nThis option is disabled if you haven't defined any filters","Nur Kontakte die auf den Filter zutreffen.\nDiese Option ist nicht verfügbar, wenn keine Filter definiert sind." },
593{ "Only contacts who are members of a category that is checked on the list to the left.\nThis option is disabled if you have no categories.","Nur Kontakte die Mitglieder der Kategirien sind,\die links selektiert sind.\nDiese Option ist nicht verfügbar, wenn es keine Kategirien gibt." }, 593{ "Only contacts who are members of a category that is checked on the list to the left.\nThis option is disabled if you have no categories.","Nur Kontakte die Mitglieder der Kategirien sind,\die links selektiert sind.\nDiese Option ist nicht verfügbar, wenn es keine Kategirien gibt." },
594{ "Select a filter to decide which contacts to select.","Selektiere einen Filter um festzulegen welche Kontakte ausgewählt werden sollen." }, 594{ "Select a filter to decide which contacts to select.","Selektiere einen Filter um festzulegen welche Kontakte ausgewählt werden sollen." },
595{ "Check the categories whose members you want to select.","Setzte die Kategorien, dessen Mitglieder Sie auswählen möchten." }, 595{ "Check the categories whose members you want to select.","Setzte die Kategorien, dessen Mitglieder Sie auswählen möchten." },
596{ "I/O device: ","I/O device: " }, 596{ "I/O device: ","I/O device: " },
597{ "Connection: ","Connection: " }, 597{ "Connection: ","Connection: " },
598{ "Model(opt.): ","Model(opt.): " }, 598{ "Model(opt.): ","Model(opt.): " },
599{ "Exporting to phone...","Exportiere aufs Handy..." }, 599{ "Exporting to phone...","Exportiere aufs Handy..." },
600{ "Error exporting to phone","Fehler beim Export aufs Handy" }, 600{ "Error exporting to phone","Fehler beim Export aufs Handy" },
601{ "contacts successfully exported.","Kontakte erfolgreich exportiert." }, 601{ "contacts successfully exported.","Kontakte erfolgreich exportiert." },
602{ "Do you want to remove<br>all existing entries from<br>%1<br>before exporting.?","Wollen Sie<br>alle existieren Einträge von<br>%1<br>vor dem Export entfernen?" }, 602{ "Do you want to remove<br>all existing entries from<br>%1<br>before exporting.?","Wollen Sie<br>alle existieren Einträge von<br>%1<br>vor dem Export entfernen?" },
603{ "Set formatted name","Setze formatierten Namen" }, 603{ "Set formatted name","Setze formatierten Namen" },
604{ "You can set the formatted name\nfor a list of contacts in one go.","Sie können den formatierten Namen für\nein Liste von Kontakten auf einmal setzen." }, 604{ "You can set the formatted name\nfor a list of contacts in one go.","Sie können den formatierten Namen für\nein Liste von Kontakten auf einmal setzen." },
605{ "Set formatted name to:","Setze formatierten Name auf:" }, 605{ "Set formatted name to:","Setze formatierten Name auf:" },
606{ "Simple: James Bond","Einfach: James Bond" }, 606{ "Simple: James Bond","Einfach: James Bond" },
607{ "Full: Mr. James 007 Bond I","Voll: Mr. James 007 Bond I" }, 607{ "Full: Mr. James 007 Bond I","Voll: Mr. James 007 Bond I" },
608{ "Reverse: Bond, James","Umgekehrt: Bond, James" }, 608{ "Reverse: Bond, James","Umgekehrt: Bond, James" },
609{ "Organization: MI6","Organisation: MI6" }, 609{ "Organization: MI6","Organisation: MI6" },
610{ "Set formatted name to\norganization, if name empty","Setze formatierten Namen auf\nOrganisation, wenn Name leer ist." }, 610{ "Set formatted name to\norganization, if name empty","Setze formatierten Namen auf\nOrganisation, wenn Name leer ist." },
611{ "Select contact list","Selektiere Kontakt Liste" }, 611{ "Select contact list","Selektiere Kontakt Liste" },
612{ "Changing contact #%1","Ändere Kontakt #%1" }, 612{ "Changing contact #%1","Ändere Kontakt #%1" },
613{ "Refreshing view...","Lade Ansicht neu..." }, 613{ "Refreshing view...","Lade Ansicht neu..." },
614{ "Setting formatted name completed!","Setzen vom formatierten Namen beendet!" }, 614{ "Setting formatted name completed!","Setzen vom formatierten Namen beendet!" },
615{ "Removing voice...","Entferne voice..." }, 615{ "Removing voice...","Entferne voice..." },
616{ "Remove voice completed!","Entferne voice beendet!" }, 616{ "Remove voice completed!","Entferne voice beendet!" },
617{ "Merge with existing categories?","Zu bestehenden\nKategorien hinzufügen?" }, 617{ "Merge with existing categories?","Zu bestehenden\nKategorien hinzufügen?" },
618{ "Setting categories ... please wait!","Setze Kategorien ... bitte warten!" }, 618{ "Setting categories ... please wait!","Setze Kategorien ... bitte warten!" },
619{ "Setting categories completed!","Setzen der Kategorien beendet!" }, 619{ "Setting categories completed!","Setzen der Kategorien beendet!" },
620{ "OK","OK" }, 620{ "OK","OK" },
621{ "Please wait, processing categories...","Bitte warten, bearbeite Kategorien..." }, 621{ "Please wait, processing categories...","Bitte warten, bearbeite Kategorien..." },
622{ "Processing contact #%1","Bearbeite Kontakt #%1" }, 622{ "Processing contact #%1","Bearbeite Kontakt #%1" },
623{ " categories added to list! "," Kategorien zur Liste hinzugefügt! " }, 623{ " categories added to list! "," Kategorien zur Liste hinzugefügt! " },
624{ "%1: %2","%1: %2" }, 624{ "%1: %2","%1: %2" },
625{ "Your personal contact is\nnot set! Please select it\nand set it with menu:\nSettings - Set Who Am I\n","Ihr persönlicher Kontakt ist\nnicht gesetzt! Bitte selektieren Sie\nihn und setzen ihn mit Menu:\nKonfiguration - Setze wer bin ich\n" }, 625{ "Your personal contact is\nnot set! Please select it\nand set it with menu:\nSettings - Set Who Am I\n","Ihr persönlicher Kontakt ist\nnicht gesetzt! Bitte selektieren Sie\nihn und setzen ihn mit Menu:\nKonfiguration - Setze wer bin ich\n" },
626{ "<qt>Do you really want to use <b>%1</b> as your new personal contact?</qt>","<qt>Wollen Sie wirklich<br><b>%1</b><br>als persönlichen Kontakt setzent?</qt>" }, 626{ "<qt>Do you really want to use <b>%1</b> as your new personal contact?</qt>","<qt>Wollen Sie wirklich<br><b>%1</b><br>als persönlichen Kontakt setzent?</qt>" },
627{ "Cut","Ausschneiden" }, 627{ "Cut","Ausschneiden" },
628{ "Paste","Einfügen" }, 628{ "Paste","Einfügen" },
629{ "Delete","Löschen" }, 629{ "Delete","Löschen" },
630{ "Choose...","Wähle..." }, 630{ "Choose...","Wähle..." },
631{ "Add View","Ansicht hinzufügen" }, 631{ "Add View","Ansicht hinzufügen" },
632{ "View name:","Ansicht Name:" }, 632{ "View name:","Ansicht Name:" },
633{ "View Type","Ainsicht Typ" }, 633{ "View Type","Ainsicht Typ" },
634{ "Icons represent contacts. Very simple view.","Icons repräsentieren Kontakte. Sehr einfache Ansicht." }, 634{ "Icons represent contacts. Very simple view.","Icons repräsentieren Kontakte. Sehr einfache Ansicht." },
635{ "A listing of contacts in a table. Each cell of the table holds a field of the contact.","Eine Kontaktliste in einer Tabelle." }, 635{ "A listing of contacts in a table. Each cell of the table holds a field of the contact.","Eine Kontaktliste in einer Tabelle." },
636{ "Rolodex style cards represent contacts.","Rolodex Stil Karten repräsentieren Kontakte." }, 636{ "Rolodex style cards represent contacts.","Rolodex Stil Karten repräsentieren Kontakte." },
637{ "Draw &separators","Zeichne &Trennlinie" }, 637{ "Draw &separators","Zeichne &Trennlinie" },
638{ "Separator &width:","Trennlinien &Breite:" }, 638{ "Separator &width:","Trennlinien &Breite:" },
639{ "&Padding:","Füllung:" }, 639{ "&Padding:","Füllung:" },
640{ "Cards","Karten" }, 640{ "Cards","Karten" },
641{ "&Margin:","&Rand:" }, 641{ "&Margin:","&Rand:" },
642{ "Draw &borders","Zeichne Ränder" }, 642{ "Draw &borders","Zeichne Ränder" },
643{ "The item margin is the distance (in pixels) between the item edge and the item data. Most noticeably, incrementing the item margin will add space between the focus rectangle and the item data.","The item margin is the distance (in pixels) between the item edge and the item data. Most noticeably, incrementing the item margin will add space between the focus rectangle and the item data." }, 643{ "The item margin is the distance (in pixels) between the item edge and the item data. Most noticeably, incrementing the item margin will add space between the focus rectangle and the item data.","The item margin is the distance (in pixels) between the item edge and the item data. Most noticeably, incrementing the item margin will add space between the focus rectangle and the item data." },
644{ "The Item Spacing decides the distance (in pixels) between the items and anything else: the view borders, other items or column separators.","The Item Spacing decides the distance (in pixels) between the items and anything else: the view borders, other items or column separators." }, 644{ "The Item Spacing decides the distance (in pixels) between the items and anything else: the view borders, other items or column separators.","The Item Spacing decides the distance (in pixels) between the items and anything else: the view borders, other items or column separators." },
645{ "Sets the width of column separators","Sets the width of column separators" }, 645{ "Sets the width of column separators","Sets the width of column separators" },
646{ "&Layout","&Layout" }, 646{ "&Layout","&Layout" },
647{ "Show &empty fields","Zeige leere Felder" }, 647{ "Show &empty fields","Zeige leere Felder" },
648{ "Show field &labels","Zeige Feld Label" }, 648{ "Show field &labels","Zeige Feld Label" },
649{ "Be&havior","Ver&halten" }, 649{ "Be&havior","Ver&halten" },
650{ "Header, Border and Separator Color","Kopf, Rand und Trennlinien Farbe" }, 650{ "Header, Border and Separator Color","Kopf, Rand und Trennlinien Farbe" },
651{ "<qt>Are you sure that you want to delete the view <b>%1</b>?</qt>","<qt>Sind Sie sicher, dass Sie die Ansicht <b>%1</b> löschen möchten?</qt>" }, 651{ "<qt>Are you sure that you want to delete the view <b>%1</b>?</qt>","<qt>Sind Sie sicher, dass Sie die Ansicht <b>%1</b> löschen möchten?</qt>" },
652{ "Confirm Delete","Bestätige Löschen" }, 652{ "Confirm Delete","Bestätige Löschen" },
653{ "Edit Address Book Filter","Editiere Adressbuch Filter" }, 653{ "Edit Address Book Filter","Editiere Adressbuch Filter" },
654{ "Category rule","Kategorie Regel" }, 654{ "Category rule","Kategorie Regel" },
655{ "Include categories","Inklusive" }, 655{ "Include categories","Inklusive" },
656{ "Exclude categories","Exclusive" }, 656{ "Exclude categories","Exclusive" },
657{ "Include contacts, that are:","Schließe folgende Kontakte ein:" }, 657{ "Include contacts, that are:","Schließe folgende Kontakte ein:" },
658{ "public","Öffentlich" }, 658{ "public","Öffentlich" },
659{ "private","Privat" }, 659{ "private","Privat" },
660{ "confidential","Vertraulich" }, 660{ "confidential","Vertraulich" },
661{ "Configure Resources","Konfiguriere Resourcen" }, 661{ "Configure Resources","Konfiguriere Resourcen" },
662{ "Resource Configuration","Resource Konfiguration" }, 662{ "Resource Configuration","Resource Konfiguration" },
663{ "Resources","Resourcen" }, 663{ "Resources","Resourcen" },
664{ "Standard","Standard" }, 664{ "Standard","Standard" },
665{ "&Use as Standard","Setze als Standard" }, 665{ "&Use as Standard","Setze als Standard" },
666{ "Select type of the new resource:","Selektiere Typ der neuen Resource:" }, 666{ "Select type of the new resource:","Selektiere Typ der neuen Resource:" },
667{ "General Settings","Allgemeine Einstellungen" }, 667{ "General Settings","Allgemeine Einstellungen" },
668{ "Read-only","Nur-Lesen" }, 668{ "Read-only","Nur-Lesen" },
669{ "Include in sync","Schließe in Sync mit ein" }, 669{ "Include in sync","Schließe in Sync mit ein" },
670{ "%1 Resource Settings","%1 Resource Einstellungen" }, 670{ "%1 Resource Settings","%1 Resource Einstellungen" },
671{ "Format:","Format:" }, 671{ "Format:","Format:" },
672{ "Location:","Ort:" }, 672{ "Location:","Ort:" },
673{ "Full Menu bar (restart)","Volle Menu Leiste (Neustart!)" }, 673{ "Full Menu bar (restart)","Volle Menu Leiste (Neustart!)" },
674{ "Language","Sprache" }, 674{ "Language","Sprache" },
675{ "Time Format","Zeit Format" }, 675{ "Time Format","Zeit Format" },
676{ "Time Zone","Zeit Zone" }, 676{ "Time Zone","Zeit Zone" },
677{ "Data storage path","Daten Speicherpfad" }, 677{ "Data storage path","Daten Speicherpfad" },
678{ "Your current storage dir is:\n%1\nYour mail is stored in:\n(storagedir)/apps/kopiemail/localmail","Aktuelles Speicherverzeichnis ist:\n%1\nIhre Mail wird gespeichert in:\n(speicherverz.)/apps/kopiemail/localmail" }, 678{ "Your current storage dir is:\n%1\nYour mail is stored in:\n(storagedir)/apps/kopiemail/localmail","Aktuelles Speicherverzeichnis ist:\n%1\nIhre Mail wird gespeichert in:\n(speicherverz.)/apps/kopiemail/localmail" },
679{ "<b>New data storage dir:</b>","<b>Neues Datenspeicherverzeichnis:</b>" }, 679{ "<b>New data storage dir:</b>","<b>Neues Datenspeicherverzeichnis:</b>" },
680{ "New dirs are created automatically","Neue Verzeichnisse werden aut. erstellt" }, 680{ "New dirs are created automatically","Neue Verzeichnisse werden aut. erstellt" },
681{ "Save settings","Speichere Einstellungen" }, 681{ "Save settings","Speichere Einstellungen" },
682{ "Save standard","Speichere Standard" }, 682{ "Save standard","Speichere Standard" },
683{ "Save","Speichern" }, 683{ "Save","Speichern" },
684{ "<b>New settings are used\nafter a restart</b>","<b>Neue Einstellungen werden nach\neinem Neustart genutzt</b>" }, 684{ "<b>New settings are used\nafter a restart</b>","<b>Neue Einstellungen werden nach\neinem Neustart genutzt</b>" },
685{ "Settings are stored in\n%1","Einstellungen werden gespeichert in:\n%1" }, 685{ "Settings are stored in\n%1","Einstellungen werden gespeichert in:\n%1" },
686{ "Multiple Sync options","Multi Sync Optionen" }, 686{ "Multiple Sync options","Multi Sync Optionen" },
687{ "Sync algo options","Sync Ablauf Optionen" }, 687{ "Sync algo options","Sync Ablauf Optionen" },
688{ "Apply filter when adding data to local:","Filter für das Hinzufügen von Daten zu Lokal:" }, 688{ "Apply filter when adding data to local:","Filter für das Hinzufügen von Daten zu Lokal:" },
689{ "Incoming calendar filter:","Eingehender Kalender Filter:" }, 689{ "Incoming calendar filter:","Eingehender Kalender Filter:" },
690{ "Incoming addressbook filter:","Eingehender Adressbuch Filter:" }, 690{ "Incoming addressbook filter:","Eingehender Adressbuch Filter:" },
691{ "Write back options","Optionen zum Zurückschreiben" }, 691{ "Write back options","Optionen zum Zurückschreiben" },
692{ "Write back (on remote) existing entries only","Schreibe nur existierende (auf Entfernt) Einträge zurück" }, 692{ "Write back (on remote) existing entries only","Schreibe nur existierende (auf Entfernt) Einträge zurück" },
693{ "Apply filter when adding data to remote:","Filter für das Hinzufügen von Daten zu Entfernt:" }, 693{ "Apply filter when adding data to remote:","Filter für das Hinzufügen von Daten zu Entfernt:" },
694{ "Outgoing calendar filter:","Ausgehender Kalender Filter:" }, 694{ "Outgoing calendar filter:","Ausgehender Kalender Filter:" },
695{ "Outgoing addressbook filter:","Ausgehender Adressbuch Filter:" }, 695{ "Outgoing addressbook filter:","Ausgehender Adressbuch Filter:" },
696{ "Write back (calendar) entries for time period only","Schreibe nur Kalender Einträge für Zeitspanne zurück" }, 696{ "Write back (calendar) entries for time period only","Schreibe nur Kalender Einträge für Zeitspanne zurück" },
697{ "Time period","Zeitspanne" }, 697{ "Time period","Zeitspanne" },
698{ "From ","Von " }, 698{ "From ","Von " },
699{ " weeks in the past to "," Wochen in der Vergangenheit bis zu " }, 699{ " weeks in the past to "," Wochen in der Vergangenheit bis zu " },
700{ " weeks in the future "," Wochen in der Zukunft " }, 700{ " weeks in the future "," Wochen in der Zukunft " },
701{ "Profile kind specific settings","Profil Art abhängige Einstellungen" }, 701{ "Profile kind specific settings","Profil Art abhängige Einstellungen" },
702{ "Local temp file:","Lokale temp Datei:" }, 702{ "Local temp file:","Lokale temp Datei:" },
703{ "Multiple profiles with same name!\nPlease use unique profile names!","Mehrere Profile mit demselben Namen!\nBitte verschiedene Namen benutzen!" }, 703{ "Multiple profiles with same name!\nPlease use unique profile names!","Mehrere Profile mit demselben Namen!\nBitte verschiedene Namen benutzen!" },
704{ "Aborted! Nothing synced!","Abgebrochen! Nichts wurde gesynct!" }, 704{ "Aborted! Nothing synced!","Abgebrochen! Nichts wurde gesynct!" },
705{ "You cannot remove your standard resource!\n Please select a new standard resource first.","Standard Resource kann\nnicht entfernt werden!\nBitte eine andere Resource\nals Standard setzen." }, 705{ "You cannot remove your standard resource!\n Please select a new standard resource first.","Standard Resource kann\nnicht entfernt werden!\nBitte eine andere Resource\nals Standard setzen." },
706{ "Sorry","Tut mir leid" }, 706{ "Sorry","Tut mir leid" },
707{ "You cannot use a read-only<br> resource as standard!","Man kann nicht eine read-only<br> Resource als Standard setzen!" }, 707{ "You cannot use a read-only<br> resource as standard!","Man kann nicht eine read-only<br> Resource als Standard setzen!" },
708{ "Please restart to get the \nchanged resources (re)loaded!\n","Bitte starten Sie jetzt\ndas Programm neu, um die geänderten\nResourcen neu zu laden!\n" }, 708{ "Please restart to get the \nchanged resources (re)loaded!\n","Bitte starten Sie jetzt\ndas Programm neu, um die geänderten\nResourcen neu zu laden!\n" },
709{ "The selected file does not\ninclude a valid vCard.\nPlease check the file and try again.\n","Die gewählte Datei enthält\nkeine gültige vCard.\nBitte prüfen Sie die Datei\nund versuchen es erneut.\n" }, 709{ "The selected file does not\ninclude a valid vCard.\nPlease check the file and try again.\n","Die gewählte Datei enthält\nkeine gültige vCard.\nBitte prüfen Sie die Datei\nund versuchen es erneut.\n" },
710{ "Unable to load resource '%1'","Resource kann nicht geladen werden: '%1'" }, 710{ "Unable to load resource '%1'","Resource kann nicht geladen werden: '%1'" },
711{ "Some changes are only\neffective after a restart!\n","Einige Änderungen werden erst\nnach einem Neustart übernommen!\n" }, 711{ "Some changes are only\neffective after a restart!\n","Einige Änderungen werden erst\nnach einem Neustart übernommen!\n" },
712{ "Syncing aborted. Nothing synced.","Syncing abgebrochen.Nichts wurde gesynct." }, 712{ "Syncing aborted. Nothing synced.","Syncing abgebrochen.Nichts wurde gesynct." },
713{ "Connected! Sending request for remote file ...","Verbunden! Sende Daten Anfrage..." }, 713{ "Connected! Sending request for remote file ...","Verbunden! Sende Daten Anfrage..." },
714{ "Trying to connect to remote...","Versuche mit Gegenstelle zu verbinden..." }, 714{ "Trying to connect to remote...","Versuche mit Gegenstelle zu verbinden..." },
715{ "Connection to remote\nhost timed out!\nDid you forgot to enable\nsyncing on remote host?","Verbindungsversuch wegen\nZeitüberschreitung gescheitert!\nWurde vergessen Pi-Sync auf\nder Gegenstelle anzuschalten?" }, 715{ "Connection to remote\nhost timed out!\nDid you forgot to enable\nsyncing on remote host?","Verbindungsversuch wegen\nZeitüberschreitung gescheitert!\nWurde vergessen Pi-Sync auf\nder Gegenstelle anzuschalten?" },
716{ "ERROR: Receiving remote file failed.","FEHLER: Empfang der entfernten Daten fehlgeschlagen." }, 716{ "ERROR: Receiving remote file failed.","FEHLER: Empfang der entfernten Daten fehlgeschlagen." },
717{ "Error","Fehler" }, 717{ "Error","Fehler" },
718{ ""You entered an invalid date!\n Date changed to current date.","Ungültiges Datum eingegeben.\nSetze heutiges Datum." }, 718{ ""You entered an invalid date!\n Date changed to current date.","Ungültiges Datum eingegeben.\nSetze heutiges Datum." },
719{ "You entered an invalid date!\n Will use current date instead.","Ungültiges Datum eingegeben.\nSetze stattdessen heutiges Datum." }, 719{ "You entered an invalid date!\n Will use current date instead.","Ungültiges Datum eingegeben.\nSetze stattdessen heutiges Datum." },
720{ "Warning","Warnung" }, 720{ "Warning","Warnung" },
721{ "Select week number","Wähle Wochen Nummer" },
722{ "Februar","Februar" },
723{ "Pi-Sync options for device: ","Pi-Sync Einstellungen für Gerät: " },
724{ "Password for remote access:","Passwort für fernen Zugriff:" },
725{ "Remote IP address:","Ferne IP Adresse:" },
726{ "Remote port number:","Ferne Port Nummer:" },
727{ "Remote file saved to temp file.","Ferne Daten in temp Datei gespeichert." },
728{ "Remote from: ","Fern von: " },
729{ "Local from: ","Lokal von: " },
730{ "Synchronization summary:\n\n %d items added to local\n %d items added to remote\n %d items updated on local\n %d items updated on remote\n %d items deleted on local\n %d items deleted on remote\n %d incoming filtered out\n %d outgoing filtered out\n","Synchronisationsübersicht:\n\n %d lokal hinzugefügt\n %d fern hinzugefügt\n %d lokal geändert\n %d fern geändert\n %d lokal gelöscht\n %d fern gelöscht\n %d eingehende ausgefiltert\n %d ausgehende ausgefiltert\n" },
731{ "Local calendar changed!\n","Lokaler Kalender geändert!\n" },
732{ "Write back","Schreibe zurück" },
733{ "Pi-Sync succesful!","Pi-Sync erfolgreich!" },
734{ "Received sync request","Sync Anfrage erhalten" },
735{ "Synchronizing from remote ...\n\nDo not use this application!\n\nIf syncing fails\nyou can close this dialog.","Ferne Synchronisation ...\n\nBenutze diese Anwendung nicht!\n\nWenn das Syncen fehlschlägt kann\ndieser Dialog geschlossen werden." },
736{ "Saving Data to temp file ...","Speichere Daten in temp Datei..." },
737{ "Data saved to temp file!","Daten in temp Datei gespeichert!" },
738{ "Sending file...","Sende Datei..." },
739{ "Waiting for synced file...","Warte auf gesyncte Daten..." },
740{ "Receiving synced file...","Gesyncte Daten erhalten..." },
741{ "Received %1 bytes","%1 Bytes erhalten" },
742{ "Writing file to disk...","Speichere Datei..." },
743{ "Pi-Sync successful!","Pi-Sync erfolgreich!" },
744{ "Clock skew of\nsyncing devices\nis %1 seconds!","Uhrzeitunterschied der\nsyncenden Geräte\nist %1 Sekunden!" },
745{ "Synchronize!","Synchronisiere!" },
746{ "High clock skew!","Großer Uhrzeitunterschied!" },
747{ "ADJUST\nYOUR\nCLOCKS!","JUSTIERE\nDIE\nUHREN!" },
748{ "The clocks of the syncing\ndevices have a difference\nof more than 5 minutes.\nPlease adjust your clocks.\nYou may get wrong syncing results!\nPlease confirm synchronization!","Die Uhren der syncenden Geräte\nhaben einen Unterschied von\nmehr als 5 Minuten. Bitte die\nUhrzeiten anpassen. Sie können\nfalsche Sync-Resultate erhalten!\nBitte das Syncen bestätigen!" },
749{ "","" },
721{ "","" }, 750{ "","" },
722{ "","" }, 751{ "","" },
723{ "","" }, 752{ "","" },
724{ "","" }, 753{ "","" },
725{ "","" }, 754{ "","" },
726{ "","" }, 755{ "","" },
727{ "","" }, 756{ "","" },
728{ "","" }, \ No newline at end of file 757{ "","" }, \ No newline at end of file
diff --git a/bin/kdepim/korganizer/germantranslation.txt b/bin/kdepim/korganizer/germantranslation.txt
index 6587eaa..c85ca35 100644
--- a/bin/kdepim/korganizer/germantranslation.txt
+++ b/bin/kdepim/korganizer/germantranslation.txt
@@ -726,519 +726,559 @@
726{ "Enter filter name:","Neuer Filter Name:" }, 726{ "Enter filter name:","Neuer Filter Name:" },
727{ "Add Filter","Filter hinzufügen" }, 727{ "Add Filter","Filter hinzufügen" },
728{ "Question","Frage" }, 728{ "Question","Frage" },
729{ "Filter position: ","Filter Position: " }, 729{ "Filter position: ","Filter Position: " },
730{ "Month View","Monatsansicht" }, 730{ "Month View","Monatsansicht" },
731{ "This profil cannot be deleted!\n","Dieses Profil kann\nnicht gelöscht werden!" }, 731{ "This profil cannot be deleted!\n","Dieses Profil kann\nnicht gelöscht werden!" },
732{ "KO/Pi config error","KO/Pi Konfig. Fehler" }, 732{ "KO/Pi config error","KO/Pi Konfig. Fehler" },
733{ "Local device name undefined!\nPlease define device name!","Name dieses Gerätes undefiniert!\nBitte Namen angeben!" }, 733{ "Local device name undefined!\nPlease define device name!","Name dieses Gerätes undefiniert!\nBitte Namen angeben!" },
734{ "Multiple profiles with same name!\nPlease use unique profile names!","Mehrere Profile haben denselben Namen!\nBitte unterschiedliche Namen wählen!" }, 734{ "Multiple profiles with same name!\nPlease use unique profile names!","Mehrere Profile haben denselben Namen!\nBitte unterschiedliche Namen wählen!" },
735{ "Access: ","Zugriff: " }, 735{ "Access: ","Zugriff: " },
736{ "Needs Action","Aktion notwendig" }, 736{ "Needs Action","Aktion notwendig" },
737{ "Accepted","Akzeptiert" }, 737{ "Accepted","Akzeptiert" },
738{ "Declined","Abgelehnt" }, 738{ "Declined","Abgelehnt" },
739{ "Tentative","Vorläufig" }, 739{ "Tentative","Vorläufig" },
740{ "Delegated","Beauftragt" }, 740{ "Delegated","Beauftragt" },
741{ "Completed","Vollständig" }, 741{ "Completed","Vollständig" },
742{ "In Process","In Bearbeitung" }, 742{ "In Process","In Bearbeitung" },
743{ "Participant","Teilnehmer" }, 743{ "Participant","Teilnehmer" },
744{ "Optional Participant","Möglicher Teilnehmer" }, 744{ "Optional Participant","Möglicher Teilnehmer" },
745{ "Observer","Beobachter" }, 745{ "Observer","Beobachter" },
746{ "Chair","Vorsitzender" }, 746{ "Chair","Vorsitzender" },
747{ "Not supported \non desktop!\n","" }, 747{ "Not supported \non desktop!\n","" },
748{ "Nothing selected!\n\nThis prints the full width of the Agenda view as you see it!\n\nTo determine the vertical range of the printing, please select\na vertical range (with the left mouse button down) in one column. ","Es ist nichts selektiert!\nDieses druckt die volle Breite der Agenda View, so wie man sie sieht.\nUm die verticale Auswahl zum Drucken zu bestimmen,\nbitte einen verticalen Zeitraum (mit gedrückter linker Maustaste)\nin einer Spalte auswählen. " }, 748{ "Nothing selected!\n\nThis prints the full width of the Agenda view as you see it!\n\nTo determine the vertical range of the printing, please select\na vertical range (with the left mouse button down) in one column. ","Es ist nichts selektiert!\nDieses druckt die volle Breite der Agenda View, so wie man sie sieht.\nUm die verticale Auswahl zum Drucken zu bestimmen,\nbitte einen verticalen Zeitraum (mit gedrückter linker Maustaste)\nin einer Spalte auswählen. " },
749{ "Date range: ","Datums Zeitspanne: " }, 749{ "Date range: ","Datums Zeitspanne: " },
750{ "Not supported \non PDA!\n","Nicht verfügbar\nauf dem PDA. " }, 750{ "Not supported \non PDA!\n","Nicht verfügbar\nauf dem PDA. " },
751{ "Syncing - close to abort!","Syncing-schließe um abzubrechen." }, 751{ "Syncing - close to abort!","Syncing-schließe um abzubrechen." },
752{ "Add / remove events","Add./entferne Termine" }, 752{ "Add / remove events","Add./entferne Termine" },
753{ "File does not exist:\n '%1'.","Datei existiert nicht:\n '%1'." }, 753{ "File does not exist:\n '%1'.","Datei existiert nicht:\n '%1'." },
754{ "Couldn't load calendar\n '%1'.","Kann Kalender nicht laden:\n '%1'." }, 754{ "Couldn't load calendar\n '%1'.","Kann Kalender nicht laden:\n '%1'." },
755{ "\nThe file on disk has changed!\nFile size: %1 bytes.\nLast modified: %2\nDo you want to:\n\n - Save and overwrite file?\n - Sync with file, then save?\n - Cancel without saving? \n","\nDie gepeicherte Datei wurde verändert!\nDatei Grösse: %1 Bytes.\nZuletzt geändert: %2\nMöchten Sie:\n\n - Speichern und die Datei überschreiben?\n - Mit Datei Synchronisieren, dann speichern?\n - Abbrechen ohne zu speichern? \n" }, 755{ "\nThe file on disk has changed!\nFile size: %1 bytes.\nLast modified: %2\nDo you want to:\n\n - Save and overwrite file?\n - Sync with file, then save?\n - Cancel without saving? \n","\nDie gepeicherte Datei wurde verändert!\nDatei Grösse: %1 Bytes.\nZuletzt geändert: %2\nMöchten Sie:\n\n - Speichern und die Datei überschreiben?\n - Mit Datei Synchronisieren, dann speichern?\n - Abbrechen ohne zu speichern? \n" },
756{ "Overwrite","Überschreiben" }, 756{ "Overwrite","Überschreiben" },
757{ "Sync+save","Syncen+speichern" }, 757{ "Sync+save","Syncen+speichern" },
758{ "Default","Standard" }, 758{ "Default","Standard" },
759{ " Categories added to list! "," Kategorien zur Liste hinzugefügt! " }, 759{ " Categories added to list! "," Kategorien zur Liste hinzugefügt! " },
760{ " %d items?"," %d Einträge?" }, 760{ " %d items?"," %d Einträge?" },
761{ "\nThis event recurs\nover multiple dates.\nAre you sure you want\nto delete this event\nand all its recurrences?","\nDieses ist ein\nwiederholender Termin!.\nSind Sie sicher, dass Sie\ndiesen Termin und alle\nWiederholungen löschen möchten?" }, 761{ "\nThis event recurs\nover multiple dates.\nAre you sure you want\nto delete this event\nand all its recurrences?","\nDieses ist ein\nwiederholender Termin!.\nSind Sie sicher, dass Sie\ndiesen Termin und alle\nWiederholungen löschen möchten?" },
762{ " ?\n\nDelete:\n"," ?\n\nLösche:\n" }, 762{ " ?\n\nDelete:\n"," ?\n\nLösche:\n" },
763{ "Current","Aktuelle" }, 763{ "Current","Aktuelle" },
764{ "\nThis event recurs\nover multiple dates.\nDo you want to delete\nall it's recurrences,\nor only the current one on:\n","\nDieses ist ein\nwiederholender Termin!\nMöchten sie alle Wiederholungen\nlöschen, oder nur die aktuelle am:\n" }, 764{ "\nThis event recurs\nover multiple dates.\nDo you want to delete\nall it's recurrences,\nor only the current one on:\n","\nDieses ist ein\nwiederholender Termin!\nMöchten sie alle Wiederholungen\nlöschen, oder nur die aktuelle am:\n" },
765{ "All","Alle" }, 765{ "All","Alle" },
766{ "Data Loss Warning","Datenverlust Warnung" }, 766{ "Data Loss Warning","Datenverlust Warnung" },
767{ "Proceed","Weitermachen" }, 767{ "Proceed","Weitermachen" },
768{ "The journal entries can not be\nexported to a vCalendar file.","Die Journal Einträge können\nnicht in eine vCalendar\nDatei exportiert werden!" }, 768{ "The journal entries can not be\nexported to a vCalendar file.","Die Journal Einträge können\nnicht in eine vCalendar\nDatei exportiert werden!" },
769{ "Filter disabled ","Filter abgeschaltet" }, 769{ "Filter disabled ","Filter abgeschaltet" },
770{ "Filter selected: ","Gewählter Filter: " }, 770{ "Filter selected: ","Gewählter Filter: " },
771{ "Toggle Cancel","Gecancelt ändern" }, 771{ "Toggle Cancel","Gecancelt ändern" },
772{ "&Toggle Cancel","Gecancel&t ändern" }, 772{ "&Toggle Cancel","Gecancel&t ändern" },
773{ "Configure Toolbar","Konfiguriere Toolbar" }, 773{ "Configure Toolbar","Konfiguriere Toolbar" },
774{ "Stretched TB","Gedehnte TB" }, 774{ "Stretched TB","Gedehnte TB" },
775{ "Import file \n...%1\ndoes not exist!\nNothing imported!\n","Import Datei \n...%1\nexistiert nicht!\nNichts importiert!\n" }, 775{ "Import file \n...%1\ndoes not exist!\nNothing imported!\n","Import Datei \n...%1\nexistiert nicht!\nNichts importiert!\n" },
776{ "Import filename(*.ics/*.vcs)","Import Dateiname(*.ics/*.vcs)" }, 776{ "Import filename(*.ics/*.vcs)","Import Dateiname(*.ics/*.vcs)" },
777{ "When importing a calendar twice\nduplicated events will be ignored!\nYou can create a backup file with\nFile - Save Calendar Backup\nto revert importing","Wenn ein Kalender doppelt importiert\nwird, werden doppelte Einträge ignoriert!\nSie können eine Backup Datei anlegen unter\nDatei - Speichere Kalender Backup\num den Import rückgängig machen zu können.\n" }, 777{ "When importing a calendar twice\nduplicated events will be ignored!\nYou can create a backup file with\nFile - Save Calendar Backup\nto revert importing","Wenn ein Kalender doppelt importiert\nwird, werden doppelte Einträge ignoriert!\nSie können eine Backup Datei anlegen unter\nDatei - Speichere Kalender Backup\num den Import rückgängig machen zu können.\n" },
778{ "Not supported \non desktop!\n","Nur verfügbar auf PDA!" }, 778{ "Not supported \non desktop!\n","Nur verfügbar auf PDA!" },
779{ "Imported file successfully","Datei erfolgreich importiert" }, 779{ "Imported file successfully","Datei erfolgreich importiert" },
780{ "Error importing file","Fehler beim Importieren der Datei" }, 780{ "Error importing file","Fehler beim Importieren der Datei" },
781{ "Export vcal filename(*.vcs)","Export vcal Dateiname(*.vcs)" }, 781{ "Export vcal filename(*.vcs)","Export vcal Dateiname(*.vcs)" },
782{ "Save file\nalready exists!\nOld save file from:\n%1\nOverwrite?\n","Zu speichernde Datei\existiert bereits!\nExist. Datei vom:\n%1\nÜberschreiben?\n" }, 782{ "Save file\nalready exists!\nOld save file from:\n%1\nOverwrite?\n","Zu speichernde Datei\existiert bereits!\nExist. Datei vom:\n%1\nÜberschreiben?\n" },
783{ "Overwrite!","Überschreiben!" }, 783{ "Overwrite!","Überschreiben!" },
784{ "Import file \n...%1\nfrom:\n%2\nDuplicated entries\nwill not be imported!\n","Import Datei \n...%1\nvom:\n%2\nDuplizierte Einträge\nwerden nicht importiert!\n" }, 784{ "Import file \n...%1\nfrom:\n%2\nDuplicated entries\nwill not be imported!\n","Import Datei \n...%1\nvom:\n%2\nDuplizierte Einträge\nwerden nicht importiert!\n" },
785{ "Load backup filename","Lade Backup Dateiname" }, 785{ "Load backup filename","Lade Backup Dateiname" },
786{ "Backup file\ndoes not exist!\nNothing loaded!","Backup Datei\nexistiert nicht!\nNichts geladen!" }, 786{ "Backup file\ndoes not exist!\nNothing loaded!","Backup Datei\nexistiert nicht!\nNichts geladen!" },
787{ "KO/Pi:Loaded %1","KO/Pi:Geladen %1" }, 787{ "KO/Pi:Loaded %1","KO/Pi:Geladen %1" },
788{ "Save backup filename","Speichere Backup Dateiname" }, 788{ "Save backup filename","Speichere Backup Dateiname" },
789{ "Backup file\nalready exists!\nOld backup file from:\n%1\nOverwrite?\n","Backup Datei\nexistiert bereits!\nAlte Backup Datei vom:\n%1\nÜberschreiben?\n" }, 789{ "Backup file\nalready exists!\nOld backup file from:\n%1\nOverwrite?\n","Backup Datei\nexistiert bereits!\nAlte Backup Datei vom:\n%1\nÜberschreiben?\n" },
790{ "KO/Pi:Saved %1","KO/Pi:Gespeichert %1" }, 790{ "KO/Pi:Saved %1","KO/Pi:Gespeichert %1" },
791{ "Details of attendee","Teilnehmerdetails" }, 791{ "Details of attendee","Teilnehmerdetails" },
792{ "Work phone:\n","Telefon Arbeit:\n" }, 792{ "Work phone:\n","Telefon Arbeit:\n" },
793{ "Work mobile phone:\n","Mobiltelefon Arbeit:\n" }, 793{ "Work mobile phone:\n","Mobiltelefon Arbeit:\n" },
794{ "Home phone:\n","Telefon privat:\n" }, 794{ "Home phone:\n","Telefon privat:\n" },
795{ "Mobile home phone:\n","Mobiltelefon privat:\n" }, 795{ "Mobile home phone:\n","Mobiltelefon privat:\n" },
796{ "Email:\n","Email:\n" }, 796{ "Email:\n","Email:\n" },
797{ "Alarm disabled for this item","Alarm deaktiviert für dieses Item" }, 797{ "Alarm disabled for this item","Alarm deaktiviert für dieses Item" },
798{ "Audio Al.: ","Audio Al.: " }, 798{ "Audio Al.: ","Audio Al.: " },
799{ "Proc.Al.: ","Proz.Al.: " }, 799{ "Proc.Al.: ","Proz.Al.: " },
800{ "No sound set","Kein Sound definiert" }, 800{ "No sound set","Kein Sound definiert" },
801{ "*.wav|Wav Files","*.wav|Wav Dateien" }, 801{ "*.wav|Wav Files","*.wav|Wav Dateien" },
802{ "No program set","Kein Programm definiert" }, 802{ "No program set","Kein Programm definiert" },
803{ "Running '%1'","Ausführen '%1'" }, 803{ "Running '%1'","Ausführen '%1'" },
804{ "Playing '%1'","Abspielen '%1'" }, 804{ "Playing '%1'","Abspielen '%1'" },
805{ "Show Sync Events in WN/Agenda view","Zeige Sync Events in WN/Agenda Ansicht" }, 805{ "Show Sync Events in WN/Agenda view","Zeige Sync Events in WN/Agenda Ansicht" },
806{ "User defined (usertranslation.txt)","Benutzerdefiniert (usertranslation.txt)" }, 806{ "User defined (usertranslation.txt)","Benutzerdefiniert (usertranslation.txt)" },
807{ "Load!","Laden!" }, 807{ "Load!","Laden!" },
808{ "Backup file from:\n%1\nLoading backup\nfile will delete\nyour current Data!\n","Backup Datei vom:\n%1\nDas Laden der Backup Datei\nlöscht die aktuellen Daten!\n" }, 808{ "Backup file from:\n%1\nLoading backup\nfile will delete\nyour current Data!\n","Backup Datei vom:\n%1\nDas Laden der Backup Datei\nlöscht die aktuellen Daten!\n" },
809{ "KO/Pi Features and hints","KO/Pi Eigenschaften und Tipps" }, 809{ "KO/Pi Features and hints","KO/Pi Eigenschaften und Tipps" },
810{ "KO/Pi User translation HowTo","KO/Pi Benutzer-Übersetzung HowTo" }, 810{ "KO/Pi User translation HowTo","KO/Pi Benutzer-Übersetzung HowTo" },
811{ "KO/Pi Synchronization HowTo","KO/Pi Synchronisation HowTo" }, 811{ "KO/Pi Synchronization HowTo","KO/Pi Synchronisation HowTo" },
812{ "Features + hints...","Eigenschaften + Tipps..." }, 812{ "Features + hints...","Eigenschaften + Tipps..." },
813{ "User translation...","Benutzer Übersetzung..." }, 813{ "User translation...","Benutzer Übersetzung..." },
814{ "Sync HowTo...","Synchronisation HowTo..." }, 814{ "Sync HowTo...","Synchronisation HowTo..." },
815{ "Print calendar...","Drucke Kalender..." }, 815{ "Print calendar...","Drucke Kalender..." },
816{ "Anniversary","Jahrestag" }, 816{ "Anniversary","Jahrestag" },
817{ "When importing birthdays twice\nduplicated events will be ignored,\nif the event has not been\nchanged in KO/Pi!\n","Wenn Geburtstage mehrfach importiert\nwerden, werden doppelte Einträge ignoriert\nwenn sie nicht verändert wurden.\n" }, 817{ "When importing birthdays twice\nduplicated events will be ignored,\nif the event has not been\nchanged in KO/Pi!\n","Wenn Geburtstage mehrfach importiert\nwerden, werden doppelte Einträge ignoriert\nwenn sie nicht verändert wurden.\n" },
818{ "Import Birthdays (KA/Pi)","Importiere Geburtstage (KA/Pi)" }, 818{ "Import Birthdays (KA/Pi)","Importiere Geburtstage (KA/Pi)" },
819{ "Next recurrence is on: ","Nächste Wiederholung ist am:" }, 819{ "Next recurrence is on: ","Nächste Wiederholung ist am:" },
820{ "<b>Alarm on: </b>","<b>Alarm am: </b>" }, 820{ "<b>Alarm on: </b>","<b>Alarm am: </b>" },
821{ "<b>Access: </b>","<b>Zugriff: </b>" }, 821{ "<b>Access: </b>","<b>Zugriff: </b>" },
822{ "(%1 min before)","(%1 min vorher)" }, 822{ "(%1 min before)","(%1 min vorher)" },
823{ "<b>Categories: </b>","<b>Kategorien: </b>" }, 823{ "<b>Categories: </b>","<b>Kategorien: </b>" },
824{ "Save Journal/Description...","Speichere Journal/Details..." }, 824{ "Save Journal/Description...","Speichere Journal/Details..." },
825{ "This saves the text/details of selected\nJournals and Events/Todos\nto a text file.","Das speichert den Text bzw.\ndie Details von selektierten\nJournalen und Events/Todos\nin eine Textdatei." }, 825{ "This saves the text/details of selected\nJournals and Events/Todos\nto a text file.","Das speichert den Text bzw.\ndie Details von selektierten\nJournalen und Events/Todos\nin eine Textdatei." },
826{ "Continue","Weitermachen" }, 826{ "Continue","Weitermachen" },
827{ " birthdays/anniversaries added!"," Geburts-/Jahrestage hinzugefügt" }, 827{ " birthdays/anniversaries added!"," Geburts-/Jahrestage hinzugefügt" },
828{ "Attendee:","Teilnehmer:" }, 828{ "Attendee:","Teilnehmer:" },
829{ "Click OK to search ->","Klicke zum Suchen auf OK ->" }, 829{ "Click OK to search ->","Klicke zum Suchen auf OK ->" },
830{ "On day ","Am Tag " }, 830{ "On day ","Am Tag " },
831{ "%1 of ","%1 des Monats" }, 831{ "%1 of ","%1 des Monats" },
832{ "%1 of the year","%1 des Jahres" }, 832{ "%1 of the year","%1 des Jahres" },
833{ "Anonymous","Anonymo" }, 833{ "Anonymous","Anonymo" },
834{ "nobody@nowhere","niemand@nirgendwo" }, 834{ "nobody@nowhere","niemand@nirgendwo" },
835{ "calendar.html","calendar.html" }, 835{ "calendar.html","calendar.html" },
836{ " Local Time"," Locale Zeit" }, 836{ " Local Time"," Locale Zeit" },
837{ "Unknown Name","Unbekannter Name" }, 837{ "Unknown Name","Unbekannter Name" },
838{ "unknown@nowhere","unbekannt@nirgendwo" }, 838{ "unknown@nowhere","unbekannt@nirgendwo" },
839{ "Beam via IR!","Beam via IR!" }, 839{ "Beam via IR!","Beam via IR!" },
840{ "Next Month","Nächster Monat" }, 840{ "Next Month","Nächster Monat" },
841{ "Prio","Prio" }, 841{ "Prio","Prio" },
842{ "Reparent Todo","Mache Sub-Todo" }, 842{ "Reparent Todo","Mache Sub-Todo" },
843{ "tomorrow","morgen" }, 843{ "tomorrow","morgen" },
844{ "today","heute" }, 844{ "today","heute" },
845{ "yesterday","gestern" }, 845{ "yesterday","gestern" },
846{ "Ok","Ok" }, 846{ "Ok","Ok" },
847{ "Ok+Agenda","Ok+Agenda" }, 847{ "Ok+Agenda","Ok+Agenda" },
848{ "Email","Email" }, 848{ "Email","Email" },
849{ "RSVP","RSVP" }, 849{ "RSVP","RSVP" },
850{ "Email:","Email:" }, 850{ "Email:","Email:" },
851{ "Appointment Time ","Termin Zeit " }, 851{ "Appointment Time ","Termin Zeit " },
852{ "2","2" }, 852{ "2","2" },
853{ "3","3" }, 853{ "3","3" },
854{ "4","4" }, 854{ "4","4" },
855{ " 0 %"," 0 %" }, 855{ " 0 %"," 0 %" },
856{ " 20 %"," 20 %" }, 856{ " 20 %"," 20 %" },
857{ " 40 %"," 40 %" }, 857{ " 40 %"," 40 %" },
858{ " 60 %"," 60 %" }, 858{ " 60 %"," 60 %" },
859{ " 80 %"," 80 %" }, 859{ " 80 %"," 80 %" },
860{ "100 %","100 %" }, 860{ "100 %","100 %" },
861{ "Filter","Filter" }, 861{ "Filter","Filter" },
862{ "Configure","Konfiguriere" }, 862{ "Configure","Konfiguriere" },
863{ "What's Next","What's Next" }, 863{ "What's Next","What's Next" },
864{ "Complete calendar...","Kompletten Kalender..." }, 864{ "Complete calendar...","Kompletten Kalender..." },
865{ "Filtered calendar...","Gefilterten Kalender..." }, 865{ "Filtered calendar...","Gefilterten Kalender..." },
866{ "Export to phone","Exportiere zum Handy" }, 866{ "Export to phone","Exportiere zum Handy" },
867{ "Beam receive enabled","Beam Empfang an" }, 867{ "Beam receive enabled","Beam Empfang an" },
868{ "What's new?","Was ist neu?" }, 868{ "What's new?","Was ist neu?" },
869{ "FAQ...","FAQ..." }, 869{ "FAQ...","FAQ..." },
870{ "Licence...","Licence..." }, 870{ "Licence...","Licence..." },
871{ "What's This?","What's This?" }, 871{ "What's This?","What's This?" },
872{ "&Edit...","&Editiere..." }, 872{ "&Edit...","&Editiere..." },
873{ "Oktober","Oktober" }, 873{ "Oktober","Oktober" },
874{ "Title","Titel" }, 874{ "Title","Titel" },
875{ "%1 %","%1 %" }, 875{ "%1 %","%1 %" },
876{ "Enable Pi-Sync","Schalte Pi-Sync an" }, 876{ "Enable Pi-Sync","Schalte Pi-Sync an" },
877{ "Import!","Importiere!" }, 877{ "Import!","Importiere!" },
878{ "inserting birthdays - close to abort!","Burzeltage werden eingefügt - schließe um abzubrechen!" }, 878{ "inserting birthdays - close to abort!","Burzeltage werden eingefügt - schließe um abzubrechen!" },
879{ "Export to phone options","Export ans Handy Optionen" }, 879{ "Export to phone options","Export ans Handy Optionen" },
880{ "Please read Help-Sync Howto\nto know what settings to use.","Bitte lese Hilfe-Sync Howto\num zu erfahren welche Einstellungen\ndie richtigen sind." }, 880{ "Please read Help-Sync Howto\nto know what settings to use.","Bitte lese Hilfe-Sync Howto\num zu erfahren welche Einstellungen\ndie richtigen sind." },
881{ "I/O device: ","I/O device: " }, 881{ "I/O device: ","I/O device: " },
882{ "Connection: ","Connection: " }, 882{ "Connection: ","Connection: " },
883{ "Model(opt.): ","Model(opt.): " }, 883{ "Model(opt.): ","Model(opt.): " },
884{ "Write back events in future only","Schreibe nur zukünftige Termine zurück" }, 884{ "Write back events in future only","Schreibe nur zukünftige Termine zurück" },
885{ "Max. weeks in future: ","Max. Wochen in der Zukunft: " }, 885{ "Max. weeks in future: ","Max. Wochen in der Zukunft: " },
886{ "NOTE: This will remove all old\ntodo/calendar data on phone!","ACHTUNG: Das löscht alle alten\nToDo/Kalender Daten auf dem Handy!" }, 886{ "NOTE: This will remove all old\ntodo/calendar data on phone!","ACHTUNG: Das löscht alle alten\nToDo/Kalender Daten auf dem Handy!" },
887{ "Export to mobile phone!","Exportiere auf das Handy!" }, 887{ "Export to mobile phone!","Exportiere auf das Handy!" },
888{ "Export complete calendar","Exportiere kompletten Kalender" }, 888{ "Export complete calendar","Exportiere kompletten Kalender" },
889{ "Writing to phone...","Sende Daten ans Handy..." }, 889{ "Writing to phone...","Sende Daten ans Handy..." },
890{ " This may take 1-3 minutes!"," Das kann 1-3 Minuten dauern!" }, 890{ " This may take 1-3 minutes!"," Das kann 1-3 Minuten dauern!" },
891{ "Retry","Nochmal versuchen" }, 891{ "Retry","Nochmal versuchen" },
892{ "KDE/Pim phone access","KDE/Pim Handy Zugriff" }, 892{ "KDE/Pim phone access","KDE/Pim Handy Zugriff" },
893{ "Error accessing device!\nPlease turn on connection\nand retry!","Fehler beim Zugriff auf das Gerät!\nBitte die Verbindung aktivieren\nund nochmal versuchen!" }, 893{ "Error accessing device!\nPlease turn on connection\nand retry!","Fehler beim Zugriff auf das Gerät!\nBitte die Verbindung aktivieren\nund nochmal versuchen!" },
894{ "Error exporting to phone!","Fehler beim Export auf das Handy!" }, 894{ "Error exporting to phone!","Fehler beim Export auf das Handy!" },
895{ "Export filtered calendar","Exportiere gefilterten Kalender" }, 895{ "Export filtered calendar","Exportiere gefilterten Kalender" },
896{ "Preferences","Vorlieben" }, 896{ "Preferences","Vorlieben" },
897{ "Global","Global" }, 897{ "Global","Global" },
898{ "Phone","Phone" }, 898{ "Phone","Phone" },
899{ "SMS","SMS" }, 899{ "SMS","SMS" },
900{ "Fax","Fax" }, 900{ "Fax","Fax" },
901{ "Pager","Pager" }, 901{ "Pager","Pager" },
902{ "SIP","SIP" }, 902{ "SIP","SIP" },
903{ "Italian","Italienisch" }, 903{ "Italian","Italienisch" },
904{ "24:00","24:00" }, 904{ "24:00","24:00" },
905{ "12:00am","12:00am" }, 905{ "12:00am","12:00am" },
906{ "24.03.2004 (%d.%m.%Y|%A %d %B %Y)","24.03.2004 (%d.%m.%Y|%A %d %B %Y)" }, 906{ "24.03.2004 (%d.%m.%Y|%A %d %B %Y)","24.03.2004 (%d.%m.%Y|%A %d %B %Y)" },
907{ "03.24.2004 (%m.%d.%Y|%A %B %d %Y)","03.24.2004 (%m.%d.%Y|%A %B %d %Y)" }, 907{ "03.24.2004 (%m.%d.%Y|%A %B %d %Y)","03.24.2004 (%m.%d.%Y|%A %B %d %Y)" },
908{ "2004-03-24 (%Y-%m-%d|%A %Y %B %d)","2004-03-24 (%Y-%m-%d|%A %Y %B %d)" }, 908{ "2004-03-24 (%Y-%m-%d|%A %Y %B %d)","2004-03-24 (%Y-%m-%d|%A %Y %B %d)" },
909{ "Mon 19.04.04: %a %d.%m.%y","Mon 19.04.04: %a %d.%m.%y" }, 909{ "Mon 19.04.04: %a %d.%m.%y","Mon 19.04.04: %a %d.%m.%y" },
910{ "Mon, 19.Apr.04: %a, %d.%b.%y","Mon, 19.Apr.04: %a, %d.%b.%y" }, 910{ "Mon, 19.Apr.04: %a, %d.%b.%y","Mon, 19.Apr.04: %a, %d.%b.%y" },
911{ "Add 30 min to selected Timezone","Addiere 30 min zur Zeitzone" }, 911{ "Add 30 min to selected Timezone","Addiere 30 min zur Zeitzone" },
912{ "Used Mail Client","Benutzter Mail Client" }, 912{ "Used Mail Client","Benutzter Mail Client" },
913{ "Channel:","Channel:" }, 913{ "Channel:","Channel:" },
914{ "Message:","Message:" }, 914{ "Message:","Message:" },
915{ "Parameters:","Parameter:" }, 915{ "Parameters:","Parameter:" },
916{ "HINT: Delimiter=; Name=%1,Email=%2","Hinweis: Begrenzer=; Name=%1,Email=%2" }, 916{ "HINT: Delimiter=; Name=%1,Email=%2","Hinweis: Begrenzer=; Name=%1,Email=%2" },
917{ "extra Message:","extra Message:" }, 917{ "extra Message:","extra Message:" },
918{ "extra Parameters:","extra Parameter:" }, 918{ "extra Parameters:","extra Parameter:" },
919{ "HINT: Emails=%1,Attachments=%2","Hinweis: Emails=%1,Attachments=%2" }, 919{ "HINT: Emails=%1,Attachments=%2","Hinweis: Emails=%1,Attachments=%2" },
920{ "External Apps.","Externe Appl." }, 920{ "External Apps.","Externe Appl." },
921{ "24 hours","24 Std." }, 921{ "24 hours","24 Std." },
922{ "3 hours","3 Std." }, 922{ "3 hours","3 Std." },
923{ "1 hour","1 Std." }, 923{ "1 hour","1 Std." },
924{ "15 minutes","15 Min." }, 924{ "15 minutes","15 Min." },
925{ "5 minutes","5 Min." }, 925{ "5 minutes","5 Min." },
926{ "1 minute","1 Min." }, 926{ "1 minute","1 Min." },
927{ "23","23" }, 927{ "23","23" },
928{ "Mon 15","Mon 15" }, 928{ "Mon 15","Mon 15" },
929{ "Configure KO","Konfiguriere KO" }, 929{ "Configure KO","Konfiguriere KO" },
930{ "Event text","Termin Text" }, 930{ "Event text","Termin Text" },
931{ "ToDo","ToDo" }, 931{ "ToDo","ToDo" },
932{ "Today","Heute" }, 932{ "Today","Heute" },
933{ "What's Next View","What's Next Ansicht" }, 933{ "What's Next View","What's Next Ansicht" },
934{ "Show Sync Events in \nWhat's Next/Agenda view","Zeige Sync Termine in \nWhat's Next/Agenda view" }, 934{ "Show Sync Events in \nWhat's Next/Agenda view","Zeige Sync Termine in \nWhat's Next/Agenda view" },
935{ "Use short date in \nWhat's Next/Event view","Zeige Kurzdatum in \nWhat's Next/Event view" }, 935{ "Use short date in \nWhat's Next/Event view","Zeige Kurzdatum in \nWhat's Next/Event view" },
936{ "Allday Agenda view shows todos","Ganztag Agenda zeigt Todos" }, 936{ "Allday Agenda view shows todos","Ganztag Agenda zeigt Todos" },
937{ "Alarm","Alarm" }, 937{ "Alarm","Alarm" },
938{ "Used %1 Client","Benutzter %1 Client" }, 938{ "Used %1 Client","Benutzter %1 Client" },
939{ "No email client installed","Kein Email Klient installiert" }, 939{ "No email client installed","Kein Email Klient installiert" },
940{ "Userdefined email client","Benutzerdef. Email Klient" }, 940{ "Userdefined email client","Benutzerdef. Email Klient" },
941{ "OM/Pi email client","OM/Pi Email Klient" }, 941{ "OM/Pi email client","OM/Pi Email Klient" },
942{ "Include in multiple ","Beziehe in multiple " }, 942{ "Include in multiple ","Beziehe in multiple " },
943{ "calendar ","Kalender " }, 943{ "calendar ","Kalender " },
944{ "addressbook ","Adressbuch " }, 944{ "addressbook ","Adressbuch " },
945{ "pwmanager","PWmanager" }, 945{ "pwmanager","PWmanager" },
946{ " sync"," Sync ein" }, 946{ " sync"," Sync ein" },
947{ "Write back synced data","Schreibe gesyncte Daten zurück" }, 947{ "Write back synced data","Schreibe gesyncte Daten zurück" },
948{ "-- Write back (on remote) existing entries only","-- Schreibe nur existierende (entfernte) Einträge zurück" }, 948{ "-- Write back (on remote) existing entries only","-- Schreibe nur existierende (entfernte) Einträge zurück" },
949{ "-- Write back (calendar) entries in future only","-- Schreibe nur zukünftige Kalender-Einträge zurück" }, 949{ "-- Write back (calendar) entries in future only","-- Schreibe nur zukünftige Kalender-Einträge zurück" },
950{ "---- Max. weeks in future: ","---- Max. wochen in der Zukunft: " }, 950{ "---- Max. weeks in future: ","---- Max. wochen in der Zukunft: " },
951{ "Pi-Sync ( direct Kx/Pi to Kx/Pi sync )","Pi-Sync ( direktes Kx/Pi zu Kx/Pi sync )" }, 951{ "Pi-Sync ( direct Kx/Pi to Kx/Pi sync )","Pi-Sync ( direktes Kx/Pi zu Kx/Pi sync )" },
952{ "Mobile device (cell phone)","Mobiles Gerät (Handy)" }, 952{ "Mobile device (cell phone)","Mobiles Gerät (Handy)" },
953{ "Help...","Hilfe..." }, 953{ "Help...","Hilfe..." },
954{ "Local file Cal:","Lokale Datei Kal:" }, 954{ "Local file Cal:","Lokale Datei Kal:" },
955{ "Local file ABook:","Lokale Datei ABuch:" }, 955{ "Local file ABook:","Lokale Datei ABuch:" },
956{ "Local file PWMgr:","Lokale Datei PWMgr:" }, 956{ "Local file PWMgr:","Lokale Datei PWMgr:" },
957{ "Addressbook file (*.vcf) is used by KA/Pi","Adressbuch Datei (*.vcf) wird von KA/Pi genutzt" }, 957{ "Addressbook file (*.vcf) is used by KA/Pi","Adressbuch Datei (*.vcf) wird von KA/Pi genutzt" },
958{ "Calendar:","Kalender:" }, 958{ "Calendar:","Kalender:" },
959{ "AddressBook:","AdressBuch:" }, 959{ "AddressBook:","AdressBuch:" },
960{ "PWManager:","PWManager:" }, 960{ "PWManager:","PWManager:" },
961{ "Addressbook file is used by KA/Pi","Adressbuch Datei wird von KA/Pi genutzt" }, 961{ "Addressbook file is used by KA/Pi","Adressbuch Datei wird von KA/Pi genutzt" },
962{ "ssh/scp","ssh/scp" }, 962{ "ssh/scp","ssh/scp" },
963{ "ftp","ftp" }, 963{ "ftp","ftp" },
964{ "Password for remote access: (could be the same for each)","Passwort für entfernten Zugriff: (kann dasselbe sein für alle)" }, 964{ "Password for remote access: (could be the same for each)","Passwort für entfernten Zugriff: (kann dasselbe sein für alle)" },
965{ "Remote IP address: (could be the same for each)","Entfernte IP Adresse: (kann dasselbe sein für alle)" }, 965{ "Remote IP address: (could be the same for each)","Entfernte IP Adresse: (kann dasselbe sein für alle)" },
966{ "Remote port number: (should be different for each)","Entfernte Port Nummer: (Sollte für alle unterschiedlich sein)" }, 966{ "Remote port number: (should be different for each)","Entfernte Port Nummer: (Sollte für alle unterschiedlich sein)" },
967{ "command for downloading remote file to local device","Kommando zum Download der entfernten Datei zum lokalen Gerät" }, 967{ "command for downloading remote file to local device","Kommando zum Download der entfernten Datei zum lokalen Gerät" },
968{ "command for uploading local temp file to remote device","Kommando zum Upload der lokalen temp. Datei zum entfernten Gerät" }, 968{ "command for uploading local temp file to remote device","Kommando zum Upload der lokalen temp. Datei zum entfernten Gerät" },
969{ "Insert device where\nphone is connected. E.g.:\n","Füge Device ein, an dem\ndas Handy angeschlossen ist. Z.B.:\n" }, 969{ "Insert device where\nphone is connected. E.g.:\n","Füge Device ein, an dem\ndas Handy angeschlossen ist. Z.B.:\n" },
970{ "KDE-Pim sync config","KDE-Pim sync Konfig" }, 970{ "KDE-Pim sync config","KDE-Pim sync Konfig" },
971{ "Insert kind of connection,e.g.:\n","Füge Art der Verbindung ein,z.B.:\n" }, 971{ "Insert kind of connection,e.g.:\n","Füge Art der Verbindung ein,z.B.:\n" },
972{ "Recommended: Leave empty!\n(Such that model can\nbe auto detected)\nOr insert name of model:\n","Empfohlen: Leer lassen!\n(So dass das Model\nautomatisch erkannt\nwerden kann)\nOder füge Model Name ein:\n" }, 972{ "Recommended: Leave empty!\n(Such that model can\nbe auto detected)\nOr insert name of model:\n","Empfohlen: Leer lassen!\n(So dass das Model\nautomatisch erkannt\nwerden kann)\nOder füge Model Name ein:\n" },
973{ "Port number (Default: %1)","Port Nummer (Default: %1)" }, 973{ "Port number (Default: %1)","Port Nummer (Default: %1)" },
974{ "Password to enable\naccess from remote:","Passwort um entfernten\nZugriff zuzulassen:" }, 974{ "Password to enable\naccess from remote:","Passwort um entfernten\nZugriff zuzulassen:" },
975{ "Automatically start\nat application startup","Starte automatisch\nbeim Programmstart" }, 975{ "Automatically start\nat application startup","Starte automatisch\nbeim Programmstart" },
976{ "Automatically sync\nwith KDE-Desktop","Automatischer Sync\nmit dem KDE-Desktop" }, 976{ "Automatically sync\nwith KDE-Desktop","Automatischer Sync\nmit dem KDE-Desktop" },
977{ "Enter port for Pi-Sync","Port Nummer für Pi-Sync" }, 977{ "Enter port for Pi-Sync","Port Nummer für Pi-Sync" },
978{ "Disable Pi-Sync","Schalte Pi-Sync aus" }, 978{ "Disable Pi-Sync","Schalte Pi-Sync aus" },
979{ "Do you really want\nto multiple sync\nwith all checked profiles?\nSyncing takes some\ntime - all profiles\nare synced twice!","Wollen Sie wirklich\nmit allen selektierten\nProfilen \"Multi-Syncen\"?\nDas Syncen dauert einige Zeit -\nalle Profile werden zweimal gesynct!" }, 979{ "Do you really want\nto multiple sync\nwith all checked profiles?\nSyncing takes some\ntime - all profiles\nare synced twice!","Wollen Sie wirklich\nmit allen selektierten\nProfilen \"Multi-Syncen\"?\nDas Syncen dauert einige Zeit -\nalle Profile werden zweimal gesynct!" },
980{ "KDE-Pim Sync","KDE-Pim Sync" }, 980{ "KDE-Pim Sync","KDE-Pim Sync" },
981{ "Multiple profiles","Multi-Sync Profile" }, 981{ "Multiple profiles","Multi-Sync Profile" },
982{ "Device: ","Gerät: " }, 982{ "Device: ","Gerät: " },
983{ "Multiple sync started.","Multi-Sync gestartet." }, 983{ "Multiple sync started.","Multi-Sync gestartet." },
984{ "Nothing synced! No profiles defined for multisync!","Nichts gesynct! Keine Profile\nselektiert für Multi-Sync" }, 984{ "Nothing synced! No profiles defined for multisync!","Nichts gesynct! Keine Profile\nselektiert für Multi-Sync" },
985{ "Turn filter on","Schalte Filter an" }, 985{ "Turn filter on","Schalte Filter an" },
986{ "Turn filter off","Schalte Filter aus" }, 986{ "Turn filter off","Schalte Filter aus" },
987{ "Key bindings KOrganizer/Pi","Tastatur Belegung KOrganizer/Pi" }, 987{ "Key bindings KOrganizer/Pi","Tastatur Belegung KOrganizer/Pi" },
988{ "<p><b>White</b>: Item readonly</p>\n","<p><b>Weiss</b>: Eintrag schreibgeschützt</p>\n" }, 988{ "<p><b>White</b>: Item readonly</p>\n","<p><b>Weiss</b>: Eintrag schreibgeschützt</p>\n" },
989{ "<p><b>Dark yellow</b>: Event/todo with attendees.</p>\n","<p><b>Dunkelgelb</b>: Termin/Todo mit Teilnehmern.</p>\n" }, 989{ "<p><b>Dark yellow</b>: Event/todo with attendees.</p>\n","<p><b>Dunkelgelb</b>: Termin/Todo mit Teilnehmern.</p>\n" },
990{ "<p><b>Black</b>: Event/todo with attendees. You are the organizer!</p>\n","<p><b>Schwarz</b>: Termin/Todo mit Teilnehmern. Sie sind der Organisator!</p>\n" }, 990{ "<p><b>Black</b>: Event/todo with attendees. You are the organizer!</p>\n","<p><b>Schwarz</b>: Termin/Todo mit Teilnehmern. Sie sind der Organisator!</p>\n" },
991{ "<p><b>Dark green</b>: Information(description) available.([i] in WN view)</p>\n","<p><b>Dunkelgrün</b>: Information(Beschreibung) verfügbar.([i] in WN Ansicht)</p>\n" }, 991{ "<p><b>Dark green</b>: Information(description) available.([i] in WN view)</p>\n","<p><b>Dunkelgrün</b>: Information(Beschreibung) verfügbar.([i] in WN Ansicht)</p>\n" },
992{ "<p><b>Blue</b>: Recurrent event.([r] in Whats'Next view)</p>\n","<p><b>Blau</b>: Wiederholender Termin.([r] in Whats'Next Ansicht)</p>\n" }, 992{ "<p><b>Blue</b>: Recurrent event.([r] in Whats'Next view)</p>\n","<p><b>Blau</b>: Wiederholender Termin.([r] in Whats'Next Ansicht)</p>\n" },
993{ "<p><b>Red</b>: Alarm set.([a] in Whats'Next view)</p>\n","<p><b>Rot</b>: Alarm gesetzt.([a] in Whats'Next Ansicht)</p>\n" }, 993{ "<p><b>Red</b>: Alarm set.([a] in Whats'Next view)</p>\n","<p><b>Rot</b>: Alarm gesetzt.([a] in Whats'Next Ansicht)</p>\n" },
994{ "<p><b>Cross</b>: Item cancelled.([c] in Whats'Next view)</p>\n","<p><b>Kreuz</b>: Eintrag gecancelt.([c] in Whats'Next Ansicht)</p>\n" }, 994{ "<p><b>Cross</b>: Item cancelled.([c] in Whats'Next view)</p>\n","<p><b>Kreuz</b>: Eintrag gecancelt.([c] in Whats'Next Ansicht)</p>\n" },
995{ "<p><b>(for square icons in agenda and month view)</b></p>\n","<p><b>(für quadratische Icons in Agenda und Monats Ansicht)</b></p>\n" }, 995{ "<p><b>(for square icons in agenda and month view)</b></p>\n","<p><b>(für quadratische Icons in Agenda und Monats Ansicht)</b></p>\n" },
996{ "<p><h2>KO/Pi icon colors:</h2></p>\n","<p><h2>KO/Pi Icon Farben:</h2></p>\n" }, 996{ "<p><h2>KO/Pi icon colors:</h2></p>\n","<p><h2>KO/Pi Icon Farben:</h2></p>\n" },
997{ "<p><b>E</b>: Edit item</p>\n","<p><b>E</b>: Editiere Eintrag</p>\n" }, 997{ "<p><b>E</b>: Edit item</p>\n","<p><b>E</b>: Editiere Eintrag</p>\n" },
998{ "<p><b>A</b>: Show agenda view.</p>\n","<p><b>A</b>: Zeige Agenda Ansicht.</p>\n" }, 998{ "<p><b>A</b>: Show agenda view.</p>\n","<p><b>A</b>: Zeige Agenda Ansicht.</p>\n" },
999{ "<p><b>I,C</b>: Close dialog.</p>\n","<p><b>I,C</b>: Schließe Dialog.</p>\n" }, 999{ "<p><b>I,C</b>: Close dialog.</p>\n","<p><b>I,C</b>: Schließe Dialog.</p>\n" },
1000{ "<p><h3>In event/todo viewer:</h3></p>\n","<p><h3>In Termin/Todo Detail-Anzeige:</h3></p>\n" }, 1000{ "<p><h3>In event/todo viewer:</h3></p>\n","<p><h3>In Termin/Todo Detail-Anzeige:</h3></p>\n" },
1001{ "<p><b>shift+up/down</b>: Goto first/last item</p>\n","<p><b>shift+up/down</b>: Gehe zum ersten/letzten Eintrag</p>\n" }, 1001{ "<p><b>shift+up/down</b>: Goto first/last item</p>\n","<p><b>shift+up/down</b>: Gehe zum ersten/letzten Eintrag</p>\n" },
1002{ "<p><b>ctrl+up/down</b>: Goto up/down by 20% of items</p>\n","<p><b>ctrl+up/down</b>: Gehe hoch/runter 20% aller Einträge</p>\n" }, 1002{ "<p><b>ctrl+up/down</b>: Goto up/down by 20% of items</p>\n","<p><b>ctrl+up/down</b>: Gehe hoch/runter 20% aller Einträge</p>\n" },
1003{ "<p><b>up/down</b>: Next/prev item</p>\n","<p><b>up/down</b>: Nächster/vorheriger Eintrag</p>\n" }, 1003{ "<p><b>up/down</b>: Next/prev item</p>\n","<p><b>up/down</b>: Nächster/vorheriger Eintrag</p>\n" },
1004{ "<p><b>return+shift</b>: Deselect item+one step down</p>\n","<p><b>return+shift</b>: Deselektiere Item+Cursor einen Eintrag runter</p>\n" }, 1004{ "<p><b>return+shift</b>: Deselect item+one step down</p>\n","<p><b>return+shift</b>: Deselektiere Item+Cursor einen Eintrag runter</p>\n" },
1005{ "<p><b>return</b>: Select item+one step down</p>\n","<p><b>return</b>: Selektiere Item+Cursor einen Eintrag runter</p>\n" }, 1005{ "<p><b>return</b>: Select item+one step down</p>\n","<p><b>return</b>: Selektiere Item+Cursor einen Eintrag runter</p>\n" },
1006{ "<p><b>I</b>: Show info of current item+one step down.</p>\n","<p><b>I</b>: Zeige Detail-Ansicht vom sel.Eintrag+Cursor einen Eintrag runter.</p>\n" }, 1006{ "<p><b>I</b>: Show info of current item+one step down.</p>\n","<p><b>I</b>: Zeige Detail-Ansicht vom sel.Eintrag+Cursor einen Eintrag runter.</p>\n" },
1007{ "<p><h3>In list view:</h3></p>\n","<p><h3>In Listen Ansicht:</h3></p>\n" }, 1007{ "<p><h3>In list view:</h3></p>\n","<p><h3>In Listen Ansicht:</h3></p>\n" },
1008{ "<p><b>return+shift</b>: Mark item as not completed+one step down</p>\n","<p><b>return+shift</b>: Markiere Todo als nicht erledigt+Cursor einen Eintrag runter</p>\n" }, 1008{ "<p><b>return+shift</b>: Mark item as not completed+one step down</p>\n","<p><b>return+shift</b>: Markiere Todo als nicht erledigt+Cursor einen Eintrag runter</p>\n" },
1009{ "<p><b>return</b>: Mark item as completed+one step down.</p>\n","<p><b>return</b>: Markiere Todo als erledigt+Cursor einen Eintrag runter.</p>\n" }, 1009{ "<p><b>return</b>: Mark item as completed+one step down.</p>\n","<p><b>return</b>: Markiere Todo als erledigt+Cursor einen Eintrag runter.</p>\n" },
1010{ "<p><b>Q</b>: Toggle quick todo line edit.</p>\n","<p><b>Q</b>: Zeige/verstecke Quick Todo Eingabe Zeile.</p>\n" }, 1010{ "<p><b>Q</b>: Toggle quick todo line edit.</p>\n","<p><b>Q</b>: Zeige/verstecke Quick Todo Eingabe Zeile.</p>\n" },
1011{ "<p><b>shift+P</b>: Make new <b>P</b>arent for todo selected with shift+S</p>\n","<p><b>shift+P</b>: Mache Todo zum neuen <b>P</b>arent Todo für das Todo, welches mit shift+Sselektiert wurde.</p>\n" }, 1011{ "<p><b>shift+P</b>: Make new <b>P</b>arent for todo selected with shift+S</p>\n","<p><b>shift+P</b>: Mache Todo zum neuen <b>P</b>arent Todo für das Todo, welches mit shift+Sselektiert wurde.</p>\n" },
1012{ "<p><b>shift+S</b>: Make <b>S</b>ubtodo (reparent todo)</p>\n","<p><b>shift+S</b>: Mache Todo zum <b>S</b>ubtodo</p>\n" }, 1012{ "<p><b>shift+S</b>: Make <b>S</b>ubtodo (reparent todo)</p>\n","<p><b>shift+S</b>: Mache Todo zum <b>S</b>ubtodo</p>\n" },
1013{ "<p><b>shift+U</b>: <b>U</b>nparent todo (make root todo)</p>\n","<p><b>shift+U</b>: <b>U</b>nparent Todo (Mache Sub-Todo zum Toplevel Todo)</p>\n" }, 1013{ "<p><b>shift+U</b>: <b>U</b>nparent todo (make root todo)</p>\n","<p><b>shift+U</b>: <b>U</b>nparent Todo (Mache Sub-Todo zum Toplevel Todo)</p>\n" },
1014{ "<p><h3>In todo view:</h3></p>\n","<p><h3>In Todo Anzige:</h3></p>\n" }, 1014{ "<p><h3>In todo view:</h3></p>\n","<p><h3>In Todo Anzige:</h3></p>\n" },
1015{ "<p><b>ctrl+up/down</b>: Scroll small todo view</p>\n","<p><b>ctrl+up/down</b>: Scrolle kleine Todo Ansicht</p>\n" }, 1015{ "<p><b>ctrl+up/down</b>: Scroll small todo view</p>\n","<p><b>ctrl+up/down</b>: Scrolle kleine Todo Ansicht</p>\n" },
1016{ "<p><b>up/down</b>: Scroll agenda view</p>\n","<p><b>up/down</b>: Scrolle Agenda Ansicht</p>\n" }, 1016{ "<p><b>up/down</b>: Scroll agenda view</p>\n","<p><b>up/down</b>: Scrolle Agenda Ansicht</p>\n" },
1017{ "<p><h3>In agenda view:</h3></p>\n","<p><h3>In Agenda Ansicht:</h3></p>\n" }, 1017{ "<p><h3>In agenda view:</h3></p>\n","<p><h3>In Agenda Ansicht:</h3></p>\n" },
1018{ "<p><b>del,backspace</b>: Delete selected item</p>\n","<p><b>del,backspace</b>: Lösche selektiertes Item</p>\n" }, 1018{ "<p><b>del,backspace</b>: Delete selected item</p>\n","<p><b>del,backspace</b>: Lösche selektiertes Item</p>\n" },
1019{ "<p><b>left</b>: Prev. week | <b>left+ctrl</b>: Prev. month</p>\n","<p><b>left</b>: Vorh. Woche | <b>left+ctrl</b>: Vorh. Monat</p>\n" }, 1019{ "<p><b>left</b>: Prev. week | <b>left+ctrl</b>: Prev. month</p>\n","<p><b>left</b>: Vorh. Woche | <b>left+ctrl</b>: Vorh. Monat</p>\n" },
1020{ "<p><b>right</b>: Next week | <b>right+ctrl</b>: Next month</p>\n","<p><b>right</b>: Nächste Woche | <b>right+ctrl</b>: Nächste Woche</p>\n" }, 1020{ "<p><b>right</b>: Next week | <b>right+ctrl</b>: Next month</p>\n","<p><b>right</b>: Nächste Woche | <b>right+ctrl</b>: Nächste Woche</p>\n" },
1021{ "<p><b>B</b>: Edit description (details) of selected item</p>\n","<p><b>B</b>: Editiere Beschreibung (Details) des selektierten Items</p>\n" }, 1021{ "<p><b>B</b>: Edit description (details) of selected item</p>\n","<p><b>B</b>: Editiere Beschreibung (Details) des selektierten Items</p>\n" },
1022{ "<p><b>C</b>: Show current time in agenda view</p>\n","<p><b>C</b>: Zeige aktuelle Zeit in Agenda Ansicht</p>\n" }, 1022{ "<p><b>C</b>: Show current time in agenda view</p>\n","<p><b>C</b>: Zeige aktuelle Zeit in Agenda Ansicht</p>\n" },
1023{ "<p><b>+,-</b> : Zoom in/out agenda | <b>A</b>: Toggle allday agenda height</p>\n","<p><b>+,-</b> : Zoom rein/raus Agenda | <b>A</b>: Wechsle Ganztag Agenda Höhe</p>\n" }, 1023{ "<p><b>+,-</b> : Zoom in/out agenda | <b>A</b>: Toggle allday agenda height</p>\n","<p><b>+,-</b> : Zoom rein/raus Agenda | <b>A</b>: Wechsle Ganztag Agenda Höhe</p>\n" },
1024{ "<p><b>S+ctrl</b>: Add sub-todo | <b>X</b>: Toggle datenavigator</p>\n","<p><b>S+ctrl</b>: Füge Sub-Todo hinzu | <b>X</b>: Zeige/verstecke Datenavigator</p>\n" }, 1024{ "<p><b>S+ctrl</b>: Add sub-todo | <b>X</b>: Toggle datenavigator</p>\n","<p><b>S+ctrl</b>: Füge Sub-Todo hinzu | <b>X</b>: Zeige/verstecke Datenavigator</p>\n" },
1025{ "<p><b>T</b>: Goto today | <b>T+ctrl</b>: New Todo</p>\n","<p><b>T</b>: Gehe zu Heute | <b>T+ctrl</b>: Neues Todo</p>\n" }, 1025{ "<p><b>T</b>: Goto today | <b>T+ctrl</b>: New Todo</p>\n","<p><b>T</b>: Gehe zu Heute | <b>T+ctrl</b>: Neues Todo</p>\n" },
1026{ "<p><b>E</b>: Edit selected item |<b> E+ctrl</b>: New Event</p>\n","<p><b>E</b>: Editiere selektiertes Item |<b> E+ctrl</b>: Neuer Termin</p>\n" }, 1026{ "<p><b>E</b>: Edit selected item |<b> E+ctrl</b>: New Event</p>\n","<p><b>E</b>: Editiere selektiertes Item |<b> E+ctrl</b>: Neuer Termin</p>\n" },
1027{ "<p><b>D</b>: One day view | <b>M</b>: Month view</p>\n","<p><b>D</b>: Ein-Tages Ansicht | <b>M</b>: Monats Ansicht</p>\n" }, 1027{ "<p><b>D</b>: One day view | <b>M</b>: Month view</p>\n","<p><b>D</b>: Ein-Tages Ansicht | <b>M</b>: Monats Ansicht</p>\n" },
1028{ "<p><b>Z,Y</b>: Work week view | <b>U</b>: Week view</p>\n","<p><b>Z,Y</b>: Arbeitswochen Ansicht | <b>U</b>: Wochen Ansicht</p>\n" }, 1028{ "<p><b>Z,Y</b>: Work week view | <b>U</b>: Week view</p>\n","<p><b>Z,Y</b>: Arbeitswochen Ansicht | <b>U</b>: Wochen Ansicht</p>\n" },
1029{ "<p><b>V</b>: Todo view | <b>L</b>: Event list view</p>\n","<p><b>V</b>: Todo Ansicht | <b>L</b>: Termin Listen Ansicht</p>\n" }, 1029{ "<p><b>V</b>: Todo view | <b>L</b>: Event list view</p>\n","<p><b>V</b>: Todo Ansicht | <b>L</b>: Termin Listen Ansicht</p>\n" },
1030{ "<p><b>N</b>: Next days view| <b>W</b>: What's next view\n ","<p><b>N</b>: Nächste-Tage Ansicht days view| <b>W</b>: What's next Ansicht\n " }, 1030{ "<p><b>N</b>: Next days view| <b>W</b>: What's next view\n ","<p><b>N</b>: Nächste-Tage Ansicht days view| <b>W</b>: What's next Ansicht\n " },
1031{ "<p><b>1-0</b> (+<b>ctrl</b>): Select filter 1-10 (11-20)</p>\n","<p><b>1-0</b> (+<b>ctrl</b>): Selektiere Filter 1-10 (11-20)</p>\n" }, 1031{ "<p><b>1-0</b> (+<b>ctrl</b>): Select filter 1-10 (11-20)</p>\n","<p><b>1-0</b> (+<b>ctrl</b>): Selektiere Filter 1-10 (11-20)</p>\n" },
1032{ "<p><b>O</b>: Filter On/Off | <b>J</b>: Journal view</p>\n","<p><b>O</b>: Filter An/Aus | <b>J</b>: Journal Ansicht</p>\n" }, 1032{ "<p><b>O</b>: Filter On/Off | <b>J</b>: Journal view</p>\n","<p><b>O</b>: Filter An/Aus | <b>J</b>: Journal Ansicht</p>\n" },
1033{ "<p><b>F</b>: Toggle filterview |<b>F+ctrl</b>: Edit filter </p>\n","<p><b>F</b>: Zeige/verstecke Filter Ansicht |<b>F+ctrl</b>: Editiere Filter </p>\n" }, 1033{ "<p><b>F</b>: Toggle filterview |<b>F+ctrl</b>: Edit filter </p>\n","<p><b>F</b>: Zeige/verstecke Filter Ansicht |<b>F+ctrl</b>: Editiere Filter </p>\n" },
1034{ "<p><b>Space</b>: Toggle fullscreen | <b>P</b>: Date picker</p>\n","<p><b>Space</b>: Zeige fullscreen | <b>P</b>: Datums Picker</p>\n" }, 1034{ "<p><b>Space</b>: Toggle fullscreen | <b>P</b>: Date picker</p>\n","<p><b>Space</b>: Zeige fullscreen | <b>P</b>: Datums Picker</p>\n" },
1035{ "<p><b>I</b>: Show info for selected event/todo</p>\n","<p><b>I</b>: Zeige Info (Details) für selektiertes Item</p>\n" }, 1035{ "<p><b>I</b>: Show info for selected event/todo</p>\n","<p><b>I</b>: Zeige Info (Details) für selektiertes Item</p>\n" },
1036{ "<p><b>H</b>: This help dialog | <b>S</b>: Search dialog</p>\n","<p><b>H</b>: Dieser Hilfe Dialog | <b>S</b>: Such Dialog</p>\n" }, 1036{ "<p><b>H</b>: This help dialog | <b>S</b>: Search dialog</p>\n","<p><b>H</b>: Dieser Hilfe Dialog | <b>S</b>: Such Dialog</p>\n" },
1037{ "<p><h2>KO/Pi key shortcuts:</h2></p>\n","<p><h2>KO/Pi Tastatur Kurzbefehle:</h2></p>\n" }, 1037{ "<p><h2>KO/Pi key shortcuts:</h2></p>\n","<p><h2>KO/Pi Tastatur Kurzbefehle:</h2></p>\n" },
1038{ "After changing something, the data is\nautomatically saved to the file\n~/kdepim/apps/korganizer/mycalendar.ics\nafter (configurable) three minutes.\nFor safety reasons there is one autosaving\nafter 10 minutes (of idle time) again. The \ndata is saved automatically when closing KO/Pi\nYou can create a backup file \nwith: File - Save Calendar Backup\n","Nachdem etwas geändert wurde, werden die\nDaten automatisch in die Datei abgespeichert\n~/kdepim/apps/korganizer/mycalendar.ics\nnach (konfigurierbar) drei Minuten.\nAus Sicherheitsgründen wird noch einmal\nnach 10 Min. abgespeichert, wenn keine\nÄnderungen vorgenommen wurden. Die \nDaten werden automatisch gespeichert,\nwenn KO/Pi beendet wird.\nSie können eine Backup-Datei erstellen im\nMenu: Datei - Speichere Kalender Backup\n" }, 1038{ "After changing something, the data is\nautomatically saved to the file\n~/kdepim/apps/korganizer/mycalendar.ics\nafter (configurable) three minutes.\nFor safety reasons there is one autosaving\nafter 10 minutes (of idle time) again. The \ndata is saved automatically when closing KO/Pi\nYou can create a backup file \nwith: File - Save Calendar Backup\n","Nachdem etwas geändert wurde, werden die\nDaten automatisch in die Datei abgespeichert\n~/kdepim/apps/korganizer/mycalendar.ics\nnach (konfigurierbar) drei Minuten.\nAus Sicherheitsgründen wird noch einmal\nnach 10 Min. abgespeichert, wenn keine\nÄnderungen vorgenommen wurden. Die \nDaten werden automatisch gespeichert,\nwenn KO/Pi beendet wird.\nSie können eine Backup-Datei erstellen im\nMenu: Datei - Speichere Kalender Backup\n" },
1039{ "Auto Saving in KOrganizer/Pi","Auto Speichern in KOrganizer/Pi" }, 1039{ "Auto Saving in KOrganizer/Pi","Auto Speichern in KOrganizer/Pi" },
1040{ "\nhttp://sourceforge.net/projects/kdepimpi\n","\nhttp://sourceforge.net/projects/kdepimpi\n" }, 1040{ "\nhttp://sourceforge.net/projects/kdepimpi\n","\nhttp://sourceforge.net/projects/kdepimpi\n" },
1041{ "\nor report them in the bugtracker on\n","\noder trage sie in dem Bugtracker ein auf\n" }, 1041{ "\nor report them in the bugtracker on\n","\noder trage sie in dem Bugtracker ein auf\n" },
1042{ "\nPlease report unexpected behaviour to\nlutz@pi-sync.net\n","\nBitte melde fehlerhaftes Verhalten an\nlutz@pi-sync.net\n" }, 1042{ "\nPlease report unexpected behaviour to\nlutz@pi-sync.net\n","\nBitte melde fehlerhaftes Verhalten an\nlutz@pi-sync.net\n" },
1043{ "2) Audio alarm daemon\nfor Zaurus is available!\nas an additional small application\n","2) Ein Audio Alarm Daemon\nfür den Zaurus ist verfügbar\nals zusätzliche Anwendung\n" }, 1043{ "2) Audio alarm daemon\nfor Zaurus is available!\nas an additional small application\n","2) Ein Audio Alarm Daemon\nfür den Zaurus ist verfügbar\nals zusätzliche Anwendung\n" },
1044{ "1) Importing *.vcs or *.ics files from\nother applications may not work properly,\nif there are events with properties\nKO/Pi does not support.\n","1) Importieren von *.vcs oder *.ics Dateien von\nanderen Anwendungen kann möglicherweise\n nicht richtig funktionieren,\nwenn die Termine Eigenschaften haben,\ndie KO/Pi nicht unterstützt.\n" }, 1044{ "1) Importing *.vcs or *.ics files from\nother applications may not work properly,\nif there are events with properties\nKO/Pi does not support.\n","1) Importieren von *.vcs oder *.ics Dateien von\nanderen Anwendungen kann möglicherweise\n nicht richtig funktionieren,\nwenn die Termine Eigenschaften haben,\ndie KO/Pi nicht unterstützt.\n" },
1045{ "Known Problems in KOrganizer/Pi","Bekannte Probleme in KOrganizer/Pi" }, 1045{ "Known Problems in KOrganizer/Pi","Bekannte Probleme in KOrganizer/Pi" },
1046{ "KO/Pi FAQ","KO/Pi FAQ" }, 1046{ "KO/Pi FAQ","KO/Pi FAQ" },
1047{ "PDA-Edition\nfor: Zaurus 5x00/7x0/860/3000/6000\n","PDA-Edition\nfür: Zaurus 5x00/7x0/860/3000/6000\n" }, 1047{ "PDA-Edition\nfor: Zaurus 5x00/7x0/860/3000/6000\n","PDA-Edition\nfür: Zaurus 5x00/7x0/860/3000/6000\n" },
1048{ "KOrganizer/Platform-independent\n","KOrganizer/Platform-independent\n" }, 1048{ "KOrganizer/Platform-independent\n","KOrganizer/Platform-independent\n" },
1049{ "About KOrganizer/Pi","Über KOrganizer/Pi" }, 1049{ "About KOrganizer/Pi","Über KOrganizer/Pi" },
1050{ "From: ","Von: " }, 1050{ "From: ","Von: " },
1051{ "Remove sync info","Entferne Sync Info" }, 1051{ "Remove sync info","Entferne Sync Info" },
1052{ "For all profiles","Für alle Profile" }, 1052{ "For all profiles","Für alle Profile" },
1053{ "Hide not Running","Verstecke nicht Laufende" }, 1053{ "Hide not Running","Verstecke nicht Laufende" },
1054{ "ME","ME" }, 1054{ "ME","ME" },
1055{ "Toolbar","Toolbar" }, 1055{ "Toolbar","Toolbar" },
1056{ "Undo Delete...","Löschen rückgängig machen..." }, 1056{ "Undo Delete...","Löschen rückgängig machen..." },
1057{ "Undo Delete","Löschen rückgängig machen" }, 1057{ "Undo Delete","Löschen rückgängig machen" },
1058{ "KDE Sync HowTo...","KDE Sync HowTo..." }, 1058{ "KDE Sync HowTo...","KDE Sync HowTo..." },
1059{ "Multi Sync HowTo...","Multi Sync HowTo..." }, 1059{ "Multi Sync HowTo...","Multi Sync HowTo..." },
1060{ "Januar","Januar" }, 1060{ "Januar","Januar" },
1061{ "KO/Pi Keys + Colors","KO/Pi Tasten + Farben" }, 1061{ "KO/Pi Keys + Colors","KO/Pi Tasten + Farben" },
1062{ "No Filter","Kein Filter" }, 1062{ "No Filter","Kein Filter" },
1063{ "Multiple Sync options","Multi Sync Optionen" }, 1063{ "Multiple Sync options","Multi Sync Optionen" },
1064{ "Sync algo options","Sync Ablauf Optionen" }, 1064{ "Sync algo options","Sync Ablauf Optionen" },
1065{ "Apply filter when adding data to local:","Filter für das Hinzufügen von Daten zu Lokal:" }, 1065{ "Apply filter when adding data to local:","Filter für das Hinzufügen von Daten zu Lokal:" },
1066{ "Incoming calendar filter:","Eingehender Kalender Filter:" }, 1066{ "Incoming calendar filter:","Eingehender Kalender Filter:" },
1067{ "Incoming addressbook filter:","Eingehender Adressbuch Filter:" }, 1067{ "Incoming addressbook filter:","Eingehender Adressbuch Filter:" },
1068{ "Write back options","Optionen zum Zurückschreiben" }, 1068{ "Write back options","Optionen zum Zurückschreiben" },
1069{ "Write back (on remote) existing entries only","Schreibe nur existierende (auf Entfernt) Einträge zurück" }, 1069{ "Write back (on remote) existing entries only","Schreibe nur existierende (auf Entfernt) Einträge zurück" },
1070{ "Apply filter when adding data to remote:","Filter für das Hinzufügen von Daten zu Entfernt:" }, 1070{ "Apply filter when adding data to remote:","Filter für das Hinzufügen von Daten zu Entfernt:" },
1071{ "Outgoing calendar filter:","Ausgehender Kalender Filter:" }, 1071{ "Outgoing calendar filter:","Ausgehender Kalender Filter:" },
1072{ "Outgoing addressbook filter:","Ausgehender Adressbuch Filter:" }, 1072{ "Outgoing addressbook filter:","Ausgehender Adressbuch Filter:" },
1073{ "Write back (calendar) entries for time period only","Schreibe nur Kalender Einträge für Zeitspanne zurück" }, 1073{ "Write back (calendar) entries for time period only","Schreibe nur Kalender Einträge für Zeitspanne zurück" },
1074{ "Time period","Zeitspanne" }, 1074{ "Time period","Zeitspanne" },
1075{ "From ","Von " }, 1075{ "From ","Von " },
1076{ " weeks in the past to "," Wochen in der Vergangenheit bis zu " }, 1076{ " weeks in the past to "," Wochen in der Vergangenheit bis zu " },
1077{ " weeks in the future "," Wochen in der Zukunft " }, 1077{ " weeks in the future "," Wochen in der Zukunft " },
1078{ "Profile kind specific settings","Profil Art abhängige Einstellungen" }, 1078{ "Profile kind specific settings","Profil Art abhängige Einstellungen" },
1079{ "Local temp file:","Lokale temp Datei:" }, 1079{ "Local temp file:","Lokale temp Datei:" },
1080{ "Multiple profiles with same name!\nPlease use unique profile names!","Mehrere Profile mit demselben Namen!\nBitte verschiedene Namen benutzen!" }, 1080{ "Multiple profiles with same name!\nPlease use unique profile names!","Mehrere Profile mit demselben Namen!\nBitte verschiedene Namen benutzen!" },
1081{ "Aborted! Nothing synced!","Abgebrochen! Nichts wurde gesynct!" }, 1081{ "Aborted! Nothing synced!","Abgebrochen! Nichts wurde gesynct!" },
1082{ "Language","Sprache" }, 1082{ "Language","Sprache" },
1083{ "Time Format","Zeit Format" }, 1083{ "Time Format","Zeit Format" },
1084{ "Time Zone","Zeit Zone" }, 1084{ "Time Zone","Zeit Zone" },
1085{ "%1 groups subscribed","%1 Guppen abboniert" }, 1085{ "%1 groups subscribed","%1 Guppen abboniert" },
1086{ "Your current storage dir is:\n%1\nYour mail is stored in:\n(storagedir)/apps/kopiemail/localmail","Aktuelles Speicherverzeichnis ist:\n%1\nIhre Mail wird gespeichert in:\n(speicherverz.)/apps/kopiemail/localmail" }, 1086{ "Your current storage dir is:\n%1\nYour mail is stored in:\n(storagedir)/apps/kopiemail/localmail","Aktuelles Speicherverzeichnis ist:\n%1\nIhre Mail wird gespeichert in:\n(speicherverz.)/apps/kopiemail/localmail" },
1087{ "<b>New data storage dir:</b>","<b>Neues Datenspeicherverzeichnis:</b>" }, 1087{ "<b>New data storage dir:</b>","<b>Neues Datenspeicherverzeichnis:</b>" },
1088{ "New dirs are created automatically","Neue Verzeichnisse werden aut. erstellt" }, 1088{ "New dirs are created automatically","Neue Verzeichnisse werden aut. erstellt" },
1089{ "Save settings","Speichere Einstellungen" }, 1089{ "Save settings","Speichere Einstellungen" },
1090{ "Save standard","Speichere Standard" }, 1090{ "Save standard","Speichere Standard" },
1091{ "<b>New settings are used\nafter a restart</b>","<b>Neue Einstellungen werden nach\neinem Neustart genutzt</b>" }, 1091{ "<b>New settings are used\nafter a restart</b>","<b>Neue Einstellungen werden nach\neinem Neustart genutzt</b>" },
1092{ "Settings are stored in\n%1","Einstellungen werden gespeichert in:\n%1" }, 1092{ "Settings are stored in\n%1","Einstellungen werden gespeichert in:\n%1" },
1093{ "Data storage path","Daten Speicherpfad" }, 1093{ "Data storage path","Daten Speicherpfad" },
1094{ "Language","Sprache" }, 1094{ "Language","Sprache" },
1095{ "Show time in agenda items","Zeige Zeit in Agenda Items" }, 1095{ "Show time in agenda items","Zeige Zeit in Agenda Items" },
1096{ "Color for Sundays + category "Holiday"","Farbe für Sonntags + Kategorie "Feiertag"" }, 1096{ "Color for Sundays + category "Holiday"","Farbe für Sonntags + Kategorie "Feiertag"" },
1097{ "Show events, that are done in \nWhat's Next view","Zeige abgelaufene Termine in\nWhat's Next Ansicht" }, 1097{ "Show events, that are done in \nWhat's Next view","Zeige abgelaufene Termine in\nWhat's Next Ansicht" },
1098{ "Hide not running Todos in To-do view","Verstecke nicht laufende Todos" }, 1098{ "Hide not running Todos in To-do view","Verstecke nicht laufende Todos" },
1099{ "+01:00 Europe/Oslo(CET)","+01:00 Europe/Oslo(CET)" }, 1099{ "+01:00 Europe/Oslo(CET)","+01:00 Europe/Oslo(CET)" },
1100{ "KO/Pi","KO/Pi" }, 1100{ "KO/Pi","KO/Pi" },
1101{ "There is nothing to undo!","Es gibt nichts zum\nRückgängigmachen!" }, 1101{ "There is nothing to undo!","Es gibt nichts zum\nRückgängigmachen!" },
1102{ "Recreating edit dialog. Please wait...","Recreating edit dialog. Please wait..." }, 1102{ "Recreating edit dialog. Please wait...","Recreating edit dialog. Please wait..." },
1103{ "Sound.Al.: ","Sound.Al.: " }, 1103{ "Sound.Al.: ","Sound.Al.: " },
1104{ "From: %1 To: %2 %3","Von: %1 Bis: %2 %3" }, 1104{ "From: %1 To: %2 %3","Von: %1 Bis: %2 %3" },
1105{ "Restore","Wiederherstellen" }, 1105{ "Restore","Wiederherstellen" },
1106{ "\nAre you sure you want\nto restore this?","\nMöchten Sie das wirklicht\nwiederherstellen?" }, 1106{ "\nAre you sure you want\nto restore this?","\nMöchten Sie das wirklicht\nwiederherstellen?" },
1107{ "% completed","% komplett" }, 1107{ "% completed","% komplett" },
1108{ "%d item(s) found.","%d Item(s) gefunden." }, 1108{ "%d item(s) found.","%d Item(s) gefunden." },
1109{ "Set complete","Setze auf erledigt" }, 1109{ "Set complete","Setze auf erledigt" },
1110{ "(cancelled)","(gecancelt)" }, 1110{ "(cancelled)","(gecancelt)" },
1111{ "Click on the week number to\nshow week in agenda view","Klicke auf die Wochennummer\num die Woche in der Agenda anzuzeigen" }, 1111{ "Click on the week number to\nshow week in agenda view","Klicke auf die Wochennummer\num die Woche in der Agenda anzuzeigen" },
1112{ " Local time "," Locale Zeit " }, 1112{ " Local time "," Locale Zeit " },
1113{ "Form2","Form2" }, 1113{ "Form2","Form2" },
1114{ "Filter enabled","Filter angeschaltet" }, 1114{ "Filter enabled","Filter angeschaltet" },
1115{ "Edit Filters","Ändere Filter" }, 1115{ "Edit Filters","Ändere Filter" },
1116{ "Print What's Next View...","Drucke What's Next Ansicht..." }, 1116{ "Print What's Next View...","Drucke What's Next Ansicht..." },
1117{ "Agenda","Agenda" }, 1117{ "Agenda","Agenda" },
1118{ " ("," (" }, 1118{ " ("," (" },
1119{ "<p><b>Due on:</b> %1</p>","<p><b>Fällig am:</b> %1</p>" }, 1119{ "<p><b>Due on:</b> %1</p>","<p><b>Fällig am:</b> %1</p>" },
1120{ "Print","Print" }, 1120{ "Print","Print" },
1121{ "&Setup Printer...","Drucker &Setup..." }, 1121{ "&Setup Printer...","Drucker &Setup..." },
1122{ "View Type","Zeige Typ" }, 1122{ "View Type","Zeige Typ" },
1123{ "Page &orientation:","Seiten Ausrichtung:" }, 1123{ "Page &orientation:","Seiten Ausrichtung:" },
1124{ "Use Default of Selected Style","Default des selektierten Stils" }, 1124{ "Use Default of Selected Style","Default des selektierten Stils" },
1125{ "Use Default Setting of Printer","Default Einstellung des Druckers" }, 1125{ "Use Default Setting of Printer","Default Einstellung des Druckers" },
1126{ "Portrait","Portrait" }, 1126{ "Portrait","Portrait" },
1127{ "Landscape","Landschaft" }, 1127{ "Landscape","Landschaft" },
1128{ "Print day","Drucke Tag" }, 1128{ "Print day","Drucke Tag" },
1129{ "CalPrintDay_Base","CalPrintDay_Base" }, 1129{ "CalPrintDay_Base","CalPrintDay_Base" },
1130{ "Date && Time Range","Datum && Zeitspanne" }, 1130{ "Date && Time Range","Datum && Zeitspanne" },
1131{ "&End date:","&Enddatum:" }, 1131{ "&End date:","&Enddatum:" },
1132{ "&Start date:","&Startdatum:" }, 1132{ "&Start date:","&Startdatum:" },
1133{ "Start &time:","Startzeit:" }, 1133{ "Start &time:","Startzeit:" },
1134{ "End ti&me:","Endzeit:" }, 1134{ "End ti&me:","Endzeit:" },
1135{ "E&xtend time range to include all events","Erweitere Zeitspanne um alle Termine einzuschliessen" }, 1135{ "E&xtend time range to include all events","Erweitere Zeitspanne um alle Termine einzuschliessen" },
1136{ "Include to&dos that are due on the printed day(s)","Inclusive To&dos, die an den selektierten Tagen fällig sind" }, 1136{ "Include to&dos that are due on the printed day(s)","Inclusive To&dos, die an den selektierten Tagen fällig sind" },
1137{ "Alt+D","Alt+D" }, 1137{ "Alt+D","Alt+D" },
1138{ "&Use colors","Nutze Farben" }, 1138{ "&Use colors","Nutze Farben" },
1139{ "Alt+U","Alt+U" }, 1139{ "Alt+U","Alt+U" },
1140{ "Print week","Drucke Woche" }, 1140{ "Print week","Drucke Woche" },
1141{ "CalPrintWeek_Base","CalPrintWeek_Base" }, 1141{ "CalPrintWeek_Base","CalPrintWeek_Base" },
1142{ "Use &colors","Nutze Farben" }, 1142{ "Use &colors","Nutze Farben" },
1143{ "Type of View","Typ der Ansicht" }, 1143{ "Type of View","Typ der Ansicht" },
1144{ "Print as &Filofax page","Drucke als &Filofax Seite" }, 1144{ "Print as &Filofax page","Drucke als &Filofax Seite" },
1145{ "Alt+F","Alt+F" }, 1145{ "Alt+F","Alt+F" },
1146{ "Print as &timetable view:","Drucke als Zeittabelle:" }, 1146{ "Print as &timetable view:","Drucke als Zeittabelle:" },
1147{ "Alt+T","Alt+T" }, 1147{ "Alt+T","Alt+T" },
1148{ "Print as split week view","Drucke als gesplittete Wochenansicht" }, 1148{ "Print as split week view","Drucke als gesplittete Wochenansicht" },
1149{ "Print month","Drucke Monat" }, 1149{ "Print month","Drucke Monat" },
1150{ "CalPrintMonth_Base","CalPrintMonth_Base" }, 1150{ "CalPrintMonth_Base","CalPrintMonth_Base" },
1151{ "&Start month:","&Startmonat:" }, 1151{ "&Start month:","&Startmonat:" },
1152{ "&End month:","&Endmonat:" }, 1152{ "&End month:","&Endmonat:" },
1153{ "Print week &numbers","Drucke Wochen Nummer(n)" }, 1153{ "Print week &numbers","Drucke Wochen Nummer(n)" },
1154{ "Print todos","Drucke Todos" }, 1154{ "Print todos","Drucke Todos" },
1155{ "CalPrintTodoConfig_Base","CalPrintTodoConfig_Base" }, 1155{ "CalPrintTodoConfig_Base","CalPrintTodoConfig_Base" },
1156{ "Include &description of the item","Inclusive Itembeschreibung" }, 1156{ "Include &description of the item","Inclusive Itembeschreibung" },
1157{ "Include d&ue date of the item","Inclusive Fälligkeitsdatum des Items" }, 1157{ "Include d&ue date of the item","Inclusive Fälligkeitsdatum des Items" },
1158{ "Include &priority of the item","Inclusive Priorität des Items" }, 1158{ "Include &priority of the item","Inclusive Priorität des Items" },
1159{ "Items to Print","Zu druckende Items" }, 1159{ "Items to Print","Zu druckende Items" },
1160{ "&From:","Von:" }, 1160{ "&From:","Von:" },
1161{ "&To:","Bis:" }, 1161{ "&To:","Bis:" },
1162{ "Print &all todo items","Drucke alle Todo Items" }, 1162{ "Print &all todo items","Drucke alle Todo Items" },
1163{ "Print only &uncompleted items","Drucke nur nicht erledigte Todos" }, 1163{ "Print only &uncompleted items","Drucke nur nicht erledigte Todos" },
1164{ "Only items due in the &range:","Nur Items in dem Zeitraum:" }, 1164{ "Only items due in the &range:","Nur Items in dem Zeitraum:" },
1165{ "Todo List","Todo Liste" }, 1165{ "Todo List","Todo Liste" },
1166{ "&Title:","&Titel:" }, 1166{ "&Title:","&Titel:" },
1167{ "Co&nnect subtodos with its parent","Verbinde Unter-Todos mit ihren Ober-Todos" }, 1167{ "Co&nnect subtodos with its parent","Verbinde Unter-Todos mit ihren Ober-Todos" },
1168{ "Todo list","Todo Liste" }, 1168{ "Todo list","Todo Liste" },
1169{ "&Print...","Drucke..." }, 1169{ "&Print...","Drucke..." },
1170{ "<qt>Printing on printer <b>%1</b></qt>","<qt>Drucke auf Drucker <b>%1</b></qt>" }, 1170{ "<qt>Printing on printer <b>%1</b></qt>","<qt>Drucke auf Drucker <b>%1</b></qt>" },
1171{ "[Unconfigured]","[Unkonfiguriert]" }, 1171{ "[Unconfigured]","[Unkonfiguriert]" },
1172{ "OK","OK" }, 1172{ "OK","OK" },
1173{ "FilterEditor","FilterEditor" }, 1173{ "FilterEditor","FilterEditor" },
1174{ "Include","Inclusive" }, 1174{ "Include","Inclusive" },
1175{ "Exclude","Exclusive" }, 1175{ "Exclude","Exclusive" },
1176{ "Edit Selection...","Editiere Auswahl" }, 1176{ "Edit Selection...","Editiere Auswahl" },
1177{ "recurring events","wiederholende Termine" }, 1177{ "recurring events","wiederholende Termine" },
1178{ "recurr. events","wiederh.Termine" }, 1178{ "recurr. events","wiederh.Termine" },
1179{ "completed to-dos","erledigte Todos" }, 1179{ "completed to-dos","erledigte Todos" },
1180{ "events","Termine" }, 1180{ "events","Termine" },
1181{ "todos","Todos" }, 1181{ "todos","Todos" },
1182{ "journals","Journale" }, 1182{ "journals","Journale" },
1183{ "public","öffentl." }, 1183{ "public","öffentl." },
1184{ "private","privat" }, 1184{ "private","privat" },
1185{ "confidential","vertraul." }, 1185{ "confidential","vertraul." },
1186{ "\nhas sub-todos.\nAll completed sub-todos\nwill be deleted as well!","\nhat Unter-Todos.\nAlle erledigten Unter-Todos\nwerden auch gelöscht!" }, 1186{ "\nhas sub-todos.\nAll completed sub-todos\nwill be deleted as well!","\nhat Unter-Todos.\nAlle erledigten Unter-Todos\nwerden auch gelöscht!" },
1187{ "Yesterday","Gestern" }, 1187{ "Yesterday","Gestern" },
1188{ "Day after tomorrow","Übermorgen" }, 1188{ "Day after tomorrow","Übermorgen" },
1189{ "Tomorrow","Morgen" }, 1189{ "Tomorrow","Morgen" },
1190{ "Day before yesterday","Vorgestern" }, 1190{ "Day before yesterday","Vorgestern" },
1191{ "Size %1","Größe %1" }, 1191{ "Size %1","Größe %1" },
1192{ "New Agendasize: %1","Neue Agendagröße: %1" }, 1192{ "New Agendasize: %1","Neue Agendagröße: %1" },
1193{ " (%1 y.)"," (%1 J.)" }, 1193{ " (%1 y.)"," (%1 J.)" },
1194{ "Allday:","Ganztägig:" }, 1194{ "Allday:","Ganztägig:" },
1195{ "compl.todos","erled.Todos" }, 1195{ "compl.todos","erled.Todos" },
1196{ "Day view","Tagesansicht" }, 1196{ "Day view","Tagesansicht" },
1197{ "Next days","Nächste Tage" }, 1197{ "Next days","Nächste Tage" },
1198{ "Next week","Nächste Woche" }, 1198{ "Next week","Nächste Woche" },
1199{ "Next two weeks","Nächste zwei Wochen" }, 1199{ "Next two weeks","Nächste zwei Wochen" },
1200{ "Next month","Nächster Monat" }, 1200{ "Next month","Nächster Monat" },
1201{ "Journal view","Journal" }, 1201{ "Journal view","Journal" },
1202{ "Display all opened","Zeige alle geöffnet" }, 1202{ "Display all opened","Zeige alle geöffnet" },
1203{ "Display all closed","Zeige alle geschlossen" }, 1203{ "Display all closed","Zeige alle geschlossen" },
1204{ "Display all flat","Zeige alle flach" }, 1204{ "Display all flat","Zeige alle flach" },
1205{ "<p><i>Completed on %1</i></p>","<p><i>Erledigt am %1</i></p>" }, 1205{ "<p><i>Completed on %1</i></p>","<p><i>Erledigt am %1</i></p>" },
1206{ "Default todo done color:","Standard Todo erledigt Farbe" }, 1206{ "Default todo done color:","Standard Todo erledigt Farbe" },
1207{ "Select week %1-%2","Wähle Woche %1-%2" }, 1207{ "Select week %1-%2","Wähle Woche %1-%2" },
1208{ "Select Week","Wähle Woche" }, 1208{ "Select Week","Wähle Woche" },
1209{ "Set alarm for selected...","Setze Alarm für Selekt..." }, 1209{ "Set alarm for selected...","Setze Alarm für Selekt..." },
1210{ "Set Alarm!","Setze Alarm!" }, 1210{ "Set Alarm!","Setze Alarm!" },
1211{ "Canged alarm for %1 items","Alarm für %1 Items geändert" }, 1211{ "Canged alarm for %1 items","Alarm für %1 Items geändert" },
1212{ " and "," und " }, 1212{ " and "," und " },
1213{ "<IMG src="%1"> only )","nur <IMG src="%1"> )" }, 1213{ "<IMG src="%1"> only )","nur <IMG src="%1"> )" },
1214{ "Mail to selected","Mail an Ausgewählte" }, 1214{ "Mail to selected","Mail an Ausgewählte" },
1215{ "Mail to all","Mail an Alle" }, 1215{ "Mail to all","Mail an Alle" },
1216{ "Week view mode uses bigger font","Wochenansicht Modus nutzt größeren Font" }, 1216{ "Week view mode uses bigger font","Wochenansicht Modus nutzt größeren Font" },
1217{ "Set reminder ON with offset to:","Alarm AN mit Offset auf:" }, 1217{ "Set reminder ON with offset to:","Alarm AN mit Offset auf:" },
1218{ " on"," am" }, 1218{ " on"," am" },
1219{ " completed on "," erledigt am " }, 1219{ " completed on "," erledigt am " },
1220{ "Save as Event template","Speichere als Vorlage" }, 1220{ "Save as Event template","Speichere als Vorlage" },
1221{ "Load Event template","Lade Termin Vorlage" }, 1221{ "Load Event template","Lade Termin Vorlage" },
1222{ "Save as Journal template","Speichere als Journal Vorlage" }, 1222{ "Save as Journal template","Speichere als Journal Vorlage" },
1223{ "Insert Journal template","Füge Journal Vorlage ein" }, 1223{ "Insert Journal template","Füge Journal Vorlage ein" },
1224{ "Sub todos:<br>","Unter Todos:<br>" }, 1224{ "Sub todos:<br>","Unter Todos:<br>" },
1225{ "Parent todo:<br>","Über Todo:<br>" }, 1225{ "Parent todo:<br>","Über Todo:<br>" },
1226{ "Set current as color category","Setze Gewählte als Farbkategorie" }, 1226{ "Set current as color category","Setze Gewählte als Farbkategorie" },
1227{ " completed"," erledigt" }, 1227{ " completed"," erledigt" },
1228{ "(c)2004 Lutz Rogowski (rogowski@kde.org)\nKO/Pi is based on KOrganizer\n(c)2002,2003 Cornelius Schumacher\n(schumacher@kde.org) and the KDE team.\nKOrganizer/Pi is licensed under the GPL.\nKO/Pi can be compiled for\nLinux, Zaurus-PDA and Windows\nwww.pi-sync.net --- www.korganizer.org\nSpecial thanks to Michael and Ben\nfor intensive testing!","(c)2004 Lutz Rogowski (rogowski@kde.org)\nKO/Pi basiert auf KOrganizer\n(c)2002,2003 Cornelius Schumacher\n(schumacher@kde.org) und das KDE Team.\nKOrganizer/Pi ist lizensiert unter der GPL.\nKO/Pi kann kompiliert werden für\nLinux, Zaurus-PDA und Windows\nwww.pi-sync.net --- www.korganizer.org\nBesonderen Dank an Michael und Ben\nfür intensives Testen!" }, 1228{ "(c)2004 Lutz Rogowski (rogowski@kde.org)\nKO/Pi is based on KOrganizer\n(c)2002,2003 Cornelius Schumacher\n(schumacher@kde.org) and the KDE team.\nKOrganizer/Pi is licensed under the GPL.\nKO/Pi can be compiled for\nLinux, Zaurus-PDA and Windows\nwww.pi-sync.net --- www.korganizer.org\nSpecial thanks to Michael and Ben\nfor intensive testing!","(c)2004 Lutz Rogowski (rogowski@kde.org)\nKO/Pi basiert auf KOrganizer\n(c)2002,2003 Cornelius Schumacher\n(schumacher@kde.org) und das KDE Team.\nKOrganizer/Pi ist lizensiert unter der GPL.\nKO/Pi kann kompiliert werden für\nLinux, Zaurus-PDA und Windows\nwww.pi-sync.net --- www.korganizer.org\nBesonderen Dank an Michael und Ben\nfür intensives Testen!" },
1229{ "Syncing aborted. Nothing synced.","Syncing abgebrochen.Nichts wurde gesynct." }, 1229{ "Syncing aborted. Nothing synced.","Syncing abgebrochen.Nichts wurde gesynct." },
1230{ "Connected! Sending request for remote file ...","Verbunden! Sende Daten Anfrage..." }, 1230{ "Connected! Sending request for remote file ...","Verbunden! Sende Daten Anfrage..." },
1231{ "Trying to connect to remote...","Versuche mit Gegenstelle zu verbinden..." }, 1231{ "Trying to connect to remote...","Versuche mit Gegenstelle zu verbinden..." },
1232{ "Connection to remote\nhost timed out!\nDid you forgot to enable\nsyncing on remote host?","Verbindungsversuch wegen\nZeitüberschreitung gescheitert!\nWurde vergessen Pi-Sync auf\nder Gegenstelle anzuschalten?" }, 1232{ "Connection to remote\nhost timed out!\nDid you forgot to enable\nsyncing on remote host?","Verbindungsversuch wegen\nZeitüberschreitung gescheitert!\nWurde vergessen Pi-Sync auf\nder Gegenstelle anzuschalten?" },
1233{ "ERROR: Receiving remote file failed.","FEHLER: Empfang der entfernten Daten fehlgeschlagen." }, 1233{ "ERROR: Receiving remote file failed.","FEHLER: Empfang der entfernten Daten fehlgeschlagen." },
1234{ "Error","Fehler" }, 1234{ "Error","Fehler" },
1235{ ""You entered an invalid date!\n Date changed to current date.","Ungültiges Datum eingegeben.\nSetze heutiges Datum." }, 1235{ ""You entered an invalid date!\n Date changed to current date.","Ungültiges Datum eingegeben.\nSetze heutiges Datum." },
1236{ "You entered an invalid date!\n Will use current date instead.","Ungültiges Datum eingegeben.\nSetze stattdessen heutiges Datum." }, 1236{ "You entered an invalid date!\n Will use current date instead.","Ungültiges Datum eingegeben.\nSetze stattdessen heutiges Datum." },
1237{ "Warning","Warnung" }, 1237{ "Warning","Warnung" },
1238{ "Select week number","Wähle Wochen Nummer" },
1239{ "Februar","Februar" },
1240{ "Click on the week number to\nshow week zoomed","Klicke auf die Wochennummer\num die Woche groß zu zeigen" },
1241{ "W","W" },
1242{ "Click on this to\nselect week number","Klicke hierauf um\ndie Woche auszuwählen" },
1243{ "T: %1","T: %1" },
1244{ "Start: ","Start: " },
1245{ "Pi-Sync options for device: ","Pi-Sync Einstellungen für Gerät: " },
1246{ "Password for remote access:","Passwort für fernen Zugriff:" },
1247{ "Remote IP address:","Ferne IP Adresse:" },
1248{ "Remote port number:","Ferne Port Nummer:" },
1249{ "Remote file saved to temp file.","Ferne Daten in temp Datei gespeichert." },
1250{ "Remote from: ","Fern von: " },
1251{ "Local from: ","Lokal von: " },
1252{ "Synchronization summary:\n\n %d items added to local\n %d items added to remote\n %d items updated on local\n %d items updated on remote\n %d items deleted on local\n %d items deleted on remote\n %d incoming filtered out\n %d outgoing filtered out\n","Synchronisationsübersicht:\n\n %d lokal hinzugefügt\n %d fern hinzugefügt\n %d lokal geändert\n %d fern geändert\n %d lokal gelöscht\n %d fern gelöscht\n %d eingehende ausgefiltert\n %d ausgehende ausgefiltert\n" },
1253{ "Local calendar changed!\n","Lokaler Kalender geändert!\n" },
1254{ "Write back","Schreibe zurück" },
1255{ "KO/Pi Synchronization","KO/Pi Synchronisation" },
1256{ "Pi-Sync succesful!","Pi-Sync erfolgreich!" },
1257{ "Received sync request","Sync Anfrage erhalten" },
1258{ "Synchronizing from remote ...\n\nDo not use this application!\n\nIf syncing fails\nyou can close this dialog.","Ferne Synchronisation ...\n\nBenutze diese Anwendung nicht!\n\nWenn das Syncen fehlschlägt kann\ndieser Dialog geschlossen werden." },
1259{ "Saving Data to temp file ...","Speichere Daten in temp Datei..." },
1260{ "Data saved to temp file!","Daten in temp Datei gespeichert!" },
1261{ "Sending file...","Sende Datei..." },
1262{ "Waiting for synced file...","Warte auf gesyncte Daten..." },
1263{ "Receiving synced file...","Gesyncte Daten erhalten..." },
1264{ "Received %1 bytes","%1 Bytes erhalten" },
1265{ "Writing file to disk...","Speichere Datei..." },
1266{ "Pi-Sync successful!","Pi-Sync erfolgreich!" },
1267{ "Clock skew of\nsyncing devices\nis %1 seconds!","Uhrzeitunterschied der\nsyncenden Geräte\nist %1 Sekunden!" },
1268{ "Synchronize!","Synchronisiere!" },
1269{ "High clock skew!","Großer Uhrzeitunterschied!" },
1270{ "ADJUST\nYOUR\nCLOCKS!","JUSTIERE\nDIE\nUHREN!" },
1271{ "The clocks of the syncing\ndevices have a difference\nof more than 5 minutes.\nPlease adjust your clocks.\nYou may get wrong syncing results!\nPlease confirm synchronization!","Die Uhren der syncenden Geräte\nhaben einen Unterschied von\nmehr als 5 Minuten. Bitte die\nUhrzeiten anpassen. Sie können\nfalsche Sync-Resultate erhalten!\nBitte das Syncen bestätigen!" },
1272{ "","" },
1273{ "","" },
1274{ "","" },
1275{ "","" },
1276{ "","" },
1277{ "","" },
1238{ "","" }, 1278{ "","" },
1239{ "","" }, 1279{ "","" },
1240{ "","" }, 1280{ "","" },
1241{ "","" }, 1281{ "","" },
1242{ "","" }, 1282{ "","" },
1243{ "","" }, 1283{ "","" },
1244{ "","" }, \ No newline at end of file 1284{ "","" }, \ No newline at end of file
diff --git a/kaddressbook/kabcore.cpp b/kaddressbook/kabcore.cpp
index a8e4de5..1b17665 100644
--- a/kaddressbook/kabcore.cpp
+++ b/kaddressbook/kabcore.cpp
@@ -2625,705 +2625,706 @@ void KABCore::requestForDetails(const QString& sourceChannel, const QString& ses
2625 if (namelist[i] == emaillist[j]) 2625 if (namelist[i] == emaillist[j])
2626 { 2626 {
2627 foundUid = namelist[i].uid(); 2627 foundUid = namelist[i].uid();
2628 } 2628 }
2629 } 2629 }
2630 } 2630 }
2631 } 2631 }
2632 } 2632 }
2633 else 2633 else
2634 { 2634 {
2635 foundUid = uid; 2635 foundUid = uid;
2636 } 2636 }
2637 2637
2638 if (!foundUid.isEmpty()) 2638 if (!foundUid.isEmpty())
2639 { 2639 {
2640 2640
2641 // raise Ka/Pi if it is in the background 2641 // raise Ka/Pi if it is in the background
2642#ifndef DESKTOP_VERSION 2642#ifndef DESKTOP_VERSION
2643#ifndef KORG_NODCOP 2643#ifndef KORG_NODCOP
2644 //QCopEnvelope e("QPE/Application/kapi", "raise()"); 2644 //QCopEnvelope e("QPE/Application/kapi", "raise()");
2645#endif 2645#endif
2646#endif 2646#endif
2647 2647
2648 mMainWindow->showMaximized(); 2648 mMainWindow->showMaximized();
2649 mMainWindow-> raise(); 2649 mMainWindow-> raise();
2650 2650
2651 mViewManager->setSelected( "", false); 2651 mViewManager->setSelected( "", false);
2652 mViewManager->refreshView( "" ); 2652 mViewManager->refreshView( "" );
2653 mViewManager->setSelected( foundUid, true ); 2653 mViewManager->setSelected( foundUid, true );
2654 mViewManager->refreshView( foundUid ); 2654 mViewManager->refreshView( foundUid );
2655 2655
2656 if ( !mMultipleViewsAtOnce ) 2656 if ( !mMultipleViewsAtOnce )
2657 { 2657 {
2658 setDetailsVisible( true ); 2658 setDetailsVisible( true );
2659 mActionDetails->setChecked(true); 2659 mActionDetails->setChecked(true);
2660 } 2660 }
2661 } 2661 }
2662} 2662}
2663 2663
2664void KABCore::whatsnew() 2664void KABCore::whatsnew()
2665{ 2665{
2666 KApplication::showFile( "KDE-Pim/Pi Version Info", "kdepim/WhatsNew.txt" ); 2666 KApplication::showFile( "KDE-Pim/Pi Version Info", "kdepim/WhatsNew.txt" );
2667} 2667}
2668void KABCore::synchowto() 2668void KABCore::synchowto()
2669{ 2669{
2670 KApplication::showFile( "KDE-Pim/Pi Synchronization HowTo", "kdepim/SyncHowto.txt" ); 2670 KApplication::showFile( "KDE-Pim/Pi Synchronization HowTo", "kdepim/SyncHowto.txt" );
2671} 2671}
2672void KABCore::kdesynchowto() 2672void KABCore::kdesynchowto()
2673{ 2673{
2674 KApplication::showFile( "KDE-Pim/Pi Synchronization HowTo", "kdepim/Zaurus-KDE_syncHowTo.txt" ); 2674 KApplication::showFile( "KDE-Pim/Pi Synchronization HowTo", "kdepim/Zaurus-KDE_syncHowTo.txt" );
2675} 2675}
2676void KABCore::multisynchowto() 2676void KABCore::multisynchowto()
2677{ 2677{
2678 KApplication::showFile( "KDE-Pim/Pi Synchronization HowTo", "kdepim/MultiSyncHowTo.txt" ); 2678 KApplication::showFile( "KDE-Pim/Pi Synchronization HowTo", "kdepim/MultiSyncHowTo.txt" );
2679} 2679}
2680void KABCore::faq() 2680void KABCore::faq()
2681{ 2681{
2682 KApplication::showFile( "KA/Pi FAQ", "kdepim/kaddressbook/kapiFAQ.txt" ); 2682 KApplication::showFile( "KA/Pi FAQ", "kdepim/kaddressbook/kapiFAQ.txt" );
2683} 2683}
2684 2684
2685#include <libkcal/syncdefines.h> 2685#include <libkcal/syncdefines.h>
2686 2686
2687KABC::Addressee KABCore::getLastSyncAddressee() 2687KABC::Addressee KABCore::getLastSyncAddressee()
2688{ 2688{
2689 Addressee lse; 2689 Addressee lse;
2690 QString mCurrentSyncDevice = syncManager->getCurrentSyncDevice(); 2690 QString mCurrentSyncDevice = syncManager->getCurrentSyncDevice();
2691 2691
2692 //qDebug("CurrentSyncDevice %s ",mCurrentSyncDevice .latin1() ); 2692 //qDebug("CurrentSyncDevice %s ",mCurrentSyncDevice .latin1() );
2693 lse = mAddressBook->findByUid( "last-syncAddressee-"+mCurrentSyncDevice ); 2693 lse = mAddressBook->findByUid( "last-syncAddressee-"+mCurrentSyncDevice );
2694 if (lse.isEmpty()) { 2694 if (lse.isEmpty()) {
2695 qDebug("KA: Creating new last-syncAddressee "); 2695 qDebug("KA: Creating new last-syncAddressee ");
2696 lse.setUid( "last-syncAddressee-"+mCurrentSyncDevice ); 2696 lse.setUid( "last-syncAddressee-"+mCurrentSyncDevice );
2697 QString sum = ""; 2697 QString sum = "";
2698 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) 2698 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL )
2699 sum = "E: "; 2699 sum = "E: ";
2700 lse.setFamilyName("!"+sum+mCurrentSyncDevice + i18n(" - sync event")); 2700 lse.setFamilyName("!"+sum+mCurrentSyncDevice + i18n(" - sync event"));
2701 lse.setRevision( mLastAddressbookSync ); 2701 lse.setRevision( mLastAddressbookSync );
2702 lse.setCategories( i18n("SyncEvent") ); 2702 lse.setCategories( i18n("SyncEvent") );
2703 mAddressBook->insertAddressee( lse ); 2703 mAddressBook->insertAddressee( lse );
2704 } 2704 }
2705 return lse; 2705 return lse;
2706} 2706}
2707int KABCore::takeAddressee( KABC::Addressee* local, KABC::Addressee* remote, int mode , bool full ) 2707int KABCore::takeAddressee( KABC::Addressee* local, KABC::Addressee* remote, int mode , bool full )
2708{ 2708{
2709 2709
2710 //void setZaurusId(int id); 2710 //void setZaurusId(int id);
2711 // int zaurusId() const; 2711 // int zaurusId() const;
2712 // void setZaurusUid(int id); 2712 // void setZaurusUid(int id);
2713 // int zaurusUid() const; 2713 // int zaurusUid() const;
2714 // void setZaurusStat(int id); 2714 // void setZaurusStat(int id);
2715 // int zaurusStat() const; 2715 // int zaurusStat() const;
2716 // 0 equal 2716 // 0 equal
2717 // 1 take local 2717 // 1 take local
2718 // 2 take remote 2718 // 2 take remote
2719 // 3 cancel 2719 // 3 cancel
2720 QDateTime lastSync = mLastAddressbookSync; 2720 QDateTime lastSync = mLastAddressbookSync;
2721 QDateTime localMod = local->revision(); 2721 QDateTime localMod = local->revision();
2722 QDateTime remoteMod = remote->revision(); 2722 QDateTime remoteMod = remote->revision();
2723 2723
2724 QString mCurrentSyncDevice = syncManager->getCurrentSyncDevice(); 2724 QString mCurrentSyncDevice = syncManager->getCurrentSyncDevice();
2725 2725
2726 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 2726 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
2727 bool remCh, locCh; 2727 bool remCh, locCh;
2728 remCh = ( remote->getCsum(mCurrentSyncDevice) != local->getCsum(mCurrentSyncDevice) ); 2728 remCh = ( remote->getCsum(mCurrentSyncDevice) != local->getCsum(mCurrentSyncDevice) );
2729 //if ( remCh ) 2729 //if ( remCh )
2730 // qDebug("loc %s rem %s", local->getCsum(mCurrentSyncDevice).latin1(), remote->getCsum(mCurrentSyncDevice).latin1() ); 2730 // qDebug("loc %s rem %s", local->getCsum(mCurrentSyncDevice).latin1(), remote->getCsum(mCurrentSyncDevice).latin1() );
2731 locCh = ( localMod > mLastAddressbookSync ); 2731 locCh = ( localMod > mLastAddressbookSync );
2732 //qDebug("cahnged rem %d loc %d",remCh, locCh ); 2732 //qDebug("cahnged rem %d loc %d",remCh, locCh );
2733 if ( !remCh && ! locCh ) { 2733 if ( !remCh && ! locCh ) {
2734 //qDebug("both not changed "); 2734 //qDebug("both not changed ");
2735 lastSync = localMod.addDays(1); 2735 lastSync = localMod.addDays(1);
2736 if ( mode <= SYNC_PREF_ASK ) 2736 if ( mode <= SYNC_PREF_ASK )
2737 return 0; 2737 return 0;
2738 } else { 2738 } else {
2739 if ( locCh ) { 2739 if ( locCh ) {
2740 //qDebug("loc changed %s %s", localMod.toString().latin1(), mLastAddressbookSync.toString().latin1()); 2740 //qDebug("loc changed %s %s", localMod.toString().latin1(), mLastAddressbookSync.toString().latin1());
2741 lastSync = localMod.addDays( -1 ); 2741 lastSync = localMod.addDays( -1 );
2742 if ( !remCh ) 2742 if ( !remCh )
2743 remoteMod =( lastSync.addDays( -1 ) ); 2743 remoteMod =( lastSync.addDays( -1 ) );
2744 } else { 2744 } else {
2745 //qDebug(" not loc changed "); 2745 //qDebug(" not loc changed ");
2746 lastSync = localMod.addDays( 1 ); 2746 lastSync = localMod.addDays( 1 );
2747 if ( remCh ) { 2747 if ( remCh ) {
2748 //qDebug("rem changed "); 2748 //qDebug("rem changed ");
2749 remoteMod =( lastSync.addDays( 1 ) ); 2749 remoteMod =( lastSync.addDays( 1 ) );
2750 } 2750 }
2751 2751
2752 } 2752 }
2753 } 2753 }
2754 full = true; 2754 full = true;
2755 if ( mode < SYNC_PREF_ASK ) 2755 if ( mode < SYNC_PREF_ASK )
2756 mode = SYNC_PREF_ASK; 2756 mode = SYNC_PREF_ASK;
2757 } else { 2757 } else {
2758 if ( localMod == remoteMod ) 2758 if ( localMod == remoteMod )
2759 return 0; 2759 return 0;
2760 2760
2761 } 2761 }
2762 //qDebug("%s %s --- %d %d", localMod.toString().latin1() , remoteMod.toString().latin1(), localMod.time().msec(), remoteMod.time().msec()); 2762 //qDebug("%s %s --- %d %d", localMod.toString().latin1() , remoteMod.toString().latin1(), localMod.time().msec(), remoteMod.time().msec());
2763 //qDebug("lastsync %s ", lastSync.toString().latin1() ); 2763 //qDebug("lastsync %s ", lastSync.toString().latin1() );
2764 //full = true; //debug only 2764 //full = true; //debug only
2765 if ( full ) { 2765 if ( full ) {
2766 bool equ = ( (*local) == (*remote) ); 2766 bool equ = ( (*local) == (*remote) );
2767 if ( equ ) { 2767 if ( equ ) {
2768 //qDebug("equal "); 2768 //qDebug("equal ");
2769 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 2769 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
2770 local->setCsum( mCurrentSyncDevice, remote->getCsum(mCurrentSyncDevice) ); 2770 local->setCsum( mCurrentSyncDevice, remote->getCsum(mCurrentSyncDevice) );
2771 } 2771 }
2772 if ( mode < SYNC_PREF_FORCE_LOCAL ) 2772 if ( mode < SYNC_PREF_FORCE_LOCAL )
2773 return 0; 2773 return 0;
2774 2774
2775 }//else //debug only 2775 }//else //debug only
2776 //qDebug("not equal %s %s ", local->summary().latin1(), remote->summary().latin1()); 2776 //qDebug("not equal %s %s ", local->summary().latin1(), remote->summary().latin1());
2777 } 2777 }
2778 int result; 2778 int result;
2779 bool localIsNew; 2779 bool localIsNew;
2780 //qDebug("%s -- %s mLastCalendarSync %s lastsync %s --- local %s remote %s ",local->summary().latin1(), remote->summary().latin1(),mLastCalendarSync.toString().latin1() ,lastSync.toString().latin1() , local->lastModified().toString().latin1() , remote->lastModified().toString().latin1() ); 2780 //qDebug("%s -- %s mLastCalendarSync %s lastsync %s --- local %s remote %s ",local->summary().latin1(), remote->summary().latin1(),mLastCalendarSync.toString().latin1() ,lastSync.toString().latin1() , local->lastModified().toString().latin1() , remote->lastModified().toString().latin1() );
2781 2781
2782 if ( full && mode < SYNC_PREF_NEWEST ) 2782 if ( full && mode < SYNC_PREF_NEWEST )
2783 mode = SYNC_PREF_ASK; 2783 mode = SYNC_PREF_ASK;
2784 2784
2785 switch( mode ) { 2785 switch( mode ) {
2786 case SYNC_PREF_LOCAL: 2786 case SYNC_PREF_LOCAL:
2787 if ( lastSync > remoteMod ) 2787 if ( lastSync > remoteMod )
2788 return 1; 2788 return 1;
2789 if ( lastSync > localMod ) 2789 if ( lastSync > localMod )
2790 return 2; 2790 return 2;
2791 return 1; 2791 return 1;
2792 break; 2792 break;
2793 case SYNC_PREF_REMOTE: 2793 case SYNC_PREF_REMOTE:
2794 if ( lastSync > remoteMod ) 2794 if ( lastSync > remoteMod )
2795 return 1; 2795 return 1;
2796 if ( lastSync > localMod ) 2796 if ( lastSync > localMod )
2797 return 2; 2797 return 2;
2798 return 2; 2798 return 2;
2799 break; 2799 break;
2800 case SYNC_PREF_NEWEST: 2800 case SYNC_PREF_NEWEST:
2801 if ( localMod > remoteMod ) 2801 if ( localMod > remoteMod )
2802 return 1; 2802 return 1;
2803 else 2803 else
2804 return 2; 2804 return 2;
2805 break; 2805 break;
2806 case SYNC_PREF_ASK: 2806 case SYNC_PREF_ASK:
2807 //qDebug("lsy %s --- lo %s --- re %s ", lastSync.toString().latin1(), localMod.toString().latin1(), remoteMod.toString().latin1() ); 2807 //qDebug("lsy %s --- lo %s --- re %s ", lastSync.toString().latin1(), localMod.toString().latin1(), remoteMod.toString().latin1() );
2808 if ( lastSync > remoteMod ) 2808 if ( lastSync > remoteMod )
2809 return 1; 2809 return 1;
2810 if ( lastSync > localMod ) { 2810 if ( lastSync > localMod ) {
2811 return 2; 2811 return 2;
2812 } 2812 }
2813 localIsNew = localMod >= remoteMod; 2813 localIsNew = localMod >= remoteMod;
2814 //qDebug("conflict! ************************************** "); 2814 //qDebug("conflict! ************************************** ");
2815 { 2815 {
2816 KABC::AddresseeChooser acd ( *local,*remote, localIsNew , this ); 2816 KABC::AddresseeChooser acd ( *local,*remote, localIsNew , this );
2817 result = acd.executeD(localIsNew); 2817 result = acd.executeD(localIsNew);
2818 return result; 2818 return result;
2819 } 2819 }
2820 break; 2820 break;
2821 case SYNC_PREF_FORCE_LOCAL: 2821 case SYNC_PREF_FORCE_LOCAL:
2822 return 1; 2822 return 1;
2823 break; 2823 break;
2824 case SYNC_PREF_FORCE_REMOTE: 2824 case SYNC_PREF_FORCE_REMOTE:
2825 return 2; 2825 return 2;
2826 break; 2826 break;
2827 2827
2828 default: 2828 default:
2829 // SYNC_PREF_TAKE_BOTH not implemented 2829 // SYNC_PREF_TAKE_BOTH not implemented
2830 break; 2830 break;
2831 } 2831 }
2832 return 0; 2832 return 0;
2833} 2833}
2834 2834
2835 2835
2836bool KABCore::synchronizeAddressbooks( KABC::AddressBook* local, KABC::AddressBook* remote,int mode) 2836bool KABCore::synchronizeAddressbooks( KABC::AddressBook* local, KABC::AddressBook* remote,int mode)
2837{ 2837{
2838 bool syncOK = true; 2838 bool syncOK = true;
2839 int addedAddressee = 0; 2839 int addedAddressee = 0;
2840 int addedAddresseeR = 0; 2840 int addedAddresseeR = 0;
2841 int deletedAddresseeR = 0; 2841 int deletedAddresseeR = 0;
2842 int deletedAddresseeL = 0; 2842 int deletedAddresseeL = 0;
2843 int changedLocal = 0; 2843 int changedLocal = 0;
2844 int changedRemote = 0; 2844 int changedRemote = 0;
2845 int filteredIN = 0; 2845 int filteredIN = 0;
2846 int filteredOUT = 0; 2846 int filteredOUT = 0;
2847 2847
2848 QString mCurrentSyncName = syncManager->getCurrentSyncName(); 2848 QString mCurrentSyncName = syncManager->getCurrentSyncName();
2849 QString mCurrentSyncDevice = syncManager->getCurrentSyncDevice(); 2849 QString mCurrentSyncDevice = syncManager->getCurrentSyncDevice();
2850 2850
2851 //QPtrList<Addressee> el = local->rawAddressees(); 2851 //QPtrList<Addressee> el = local->rawAddressees();
2852 Addressee addresseeR; 2852 Addressee addresseeR;
2853 QString uid; 2853 QString uid;
2854 int take; 2854 int take;
2855 Addressee addresseeL; 2855 Addressee addresseeL;
2856 Addressee addresseeRSync; 2856 Addressee addresseeRSync;
2857 Addressee addresseeLSync; 2857 Addressee addresseeLSync;
2858 // KABC::Addressee::List addresseeRSyncSharp = remote->getExternLastSyncAddressees(); 2858 // KABC::Addressee::List addresseeRSyncSharp = remote->getExternLastSyncAddressees();
2859 //KABC::Addressee::List addresseeLSyncSharp = local->getExternLastSyncAddressees(); 2859 //KABC::Addressee::List addresseeLSyncSharp = local->getExternLastSyncAddressees();
2860 bool fullDateRange = false; 2860 bool fullDateRange = false;
2861 local->resetTempSyncStat(); 2861 local->resetTempSyncStat();
2862 mLastAddressbookSync = QDateTime::currentDateTime(); 2862 mLastAddressbookSync = QDateTime::currentDateTime();
2863 if ( syncManager->syncWithDesktop() ) { 2863 if ( syncManager->syncWithDesktop() ) {
2864 // remote->removeSyncInfo( QString());//remove all info 2864 // remote->removeSyncInfo( QString());//remove all info
2865 if ( KSyncManager::mRequestedSyncEvent.isValid() ) { 2865 if ( KSyncManager::mRequestedSyncEvent.isValid() ) {
2866 mLastAddressbookSync = KSyncManager::mRequestedSyncEvent; 2866 mLastAddressbookSync = KSyncManager::mRequestedSyncEvent;
2867 qDebug("KA: using extern time for calendar sync: %s ", mLastAddressbookSync.toString().latin1() ); 2867 qDebug("KA: using extern time for calendar sync: %s ", mLastAddressbookSync.toString().latin1() );
2868 } else { 2868 } else {
2869 qDebug("KA: KSyncManager::mRequestedSyncEvent has invalid datatime "); 2869 qDebug("KA: KSyncManager::mRequestedSyncEvent has invalid datatime ");
2870 } 2870 }
2871 } 2871 }
2872 QDateTime modifiedCalendar = mLastAddressbookSync; 2872 QDateTime modifiedCalendar = mLastAddressbookSync;
2873 addresseeLSync = getLastSyncAddressee(); 2873 addresseeLSync = getLastSyncAddressee();
2874 qDebug("KA: Last Sync %s ", addresseeLSync.revision().toString().latin1()); 2874 qDebug("KA: Last Sync %s ", addresseeLSync.revision().toString().latin1());
2875 addresseeR = remote->findByUid("last-syncAddressee-"+mCurrentSyncName ); 2875 addresseeR = remote->findByUid("last-syncAddressee-"+mCurrentSyncName );
2876 if ( !addresseeR.isEmpty() ) { 2876 if ( !addresseeR.isEmpty() ) {
2877 addresseeRSync = addresseeR; 2877 addresseeRSync = addresseeR;
2878 remote->removeAddressee(addresseeR ); 2878 remote->removeAddressee(addresseeR );
2879 2879
2880 } else { 2880 } else {
2881 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 2881 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
2882 addresseeRSync = addresseeLSync ; 2882 addresseeRSync = addresseeLSync ;
2883 } else { 2883 } else {
2884 //qDebug("FULLDATE 1"); 2884 //qDebug("FULLDATE 1");
2885 fullDateRange = true; 2885 fullDateRange = true;
2886 Addressee newAdd; 2886 Addressee newAdd;
2887 addresseeRSync = newAdd; 2887 addresseeRSync = newAdd;
2888 addresseeRSync.setFamilyName(mCurrentSyncName + i18n(" - sync addressee")); 2888 addresseeRSync.setFamilyName(mCurrentSyncName + i18n(" - sync addressee"));
2889 addresseeRSync.setUid("last-syncAddressee-"+mCurrentSyncName ); 2889 addresseeRSync.setUid("last-syncAddressee-"+mCurrentSyncName );
2890 addresseeRSync.setRevision( mLastAddressbookSync ); 2890 addresseeRSync.setRevision( mLastAddressbookSync );
2891 addresseeRSync.setCategories( i18n("SyncAddressee") ); 2891 addresseeRSync.setCategories( i18n("SyncAddressee") );
2892 } 2892 }
2893 } 2893 }
2894 if ( addresseeLSync.revision() == mLastAddressbookSync ) { 2894 if ( addresseeLSync.revision() == mLastAddressbookSync ) {
2895 // qDebug("FULLDATE 2"); 2895 // qDebug("FULLDATE 2");
2896 fullDateRange = true; 2896 fullDateRange = true;
2897 } 2897 }
2898 if ( ! fullDateRange ) { 2898 if ( ! fullDateRange ) {
2899 if ( addresseeLSync.revision() != addresseeRSync.revision() ) { 2899 if ( addresseeLSync.revision() != addresseeRSync.revision() ) {
2900 2900
2901 // qDebug("set fulldate to true %s %s" ,addresseeLSync->dtStart().toString().latin1(), addresseeRSync->dtStart().toString().latin1() ); 2901 // qDebug("set fulldate to true %s %s" ,addresseeLSync->dtStart().toString().latin1(), addresseeRSync->dtStart().toString().latin1() );
2902 //qDebug("%d %d %d %d ", addresseeLSync->dtStart().time().second(), addresseeLSync->dtStart().time().msec() , addresseeRSync->dtStart().time().second(), addresseeRSync->dtStart().time().msec()); 2902 //qDebug("%d %d %d %d ", addresseeLSync->dtStart().time().second(), addresseeLSync->dtStart().time().msec() , addresseeRSync->dtStart().time().second(), addresseeRSync->dtStart().time().msec());
2903 fullDateRange = true; 2903 fullDateRange = true;
2904 //qDebug("FULLDATE 3 %s %s", addresseeLSync.revision().toString().latin1() , addresseeRSync.revision().toString().latin1() ); 2904 //qDebug("FULLDATE 3 %s %s", addresseeLSync.revision().toString().latin1() , addresseeRSync.revision().toString().latin1() );
2905 } 2905 }
2906 } 2906 }
2907 // fullDateRange = true; // debug only! 2907 // fullDateRange = true; // debug only!
2908 if ( fullDateRange ) 2908 if ( fullDateRange )
2909 mLastAddressbookSync = QDateTime::currentDateTime().addDays( -100*365); 2909 mLastAddressbookSync = QDateTime::currentDateTime().addDays( -100*365);
2910 else 2910 else
2911 mLastAddressbookSync = addresseeLSync.revision(); 2911 mLastAddressbookSync = addresseeLSync.revision();
2912 // for resyncing if own file has changed 2912 // for resyncing if own file has changed
2913 // PENDING fixme later when implemented 2913 // PENDING fixme later when implemented
2914#if 0 2914#if 0
2915 if ( mCurrentSyncDevice == "deleteaftersync" ) { 2915 if ( mCurrentSyncDevice == "deleteaftersync" ) {
2916 mLastAddressbookSync = loadedFileVersion; 2916 mLastAddressbookSync = loadedFileVersion;
2917 qDebug("setting mLastAddressbookSync "); 2917 qDebug("setting mLastAddressbookSync ");
2918 } 2918 }
2919#endif 2919#endif
2920 2920
2921 2921
2922 // ********** setting filters **************** 2922 // ********** setting filters ****************
2923 Filter filterIN = mViewManager->getFilterByName( syncManager->mFilterInAB ); 2923 Filter filterIN = mViewManager->getFilterByName( syncManager->mFilterInAB );
2924 Filter filterOUT = mViewManager->getFilterByName( syncManager->mFilterOutAB ); 2924 Filter filterOUT = mViewManager->getFilterByName( syncManager->mFilterOutAB );
2925 2925
2926 //qDebug("*************************** "); 2926 //qDebug("*************************** ");
2927 // qDebug("mLastAddressbookSync %s ",mLastAddressbookSync.toString().latin1() ); 2927 // qDebug("mLastAddressbookSync %s ",mLastAddressbookSync.toString().latin1() );
2928 QStringList er = remote->uidList(); 2928 QStringList er = remote->uidList();
2929 Addressee inR ;//= er.first(); 2929 Addressee inR ;//= er.first();
2930 Addressee inL; 2930 Addressee inL;
2931 2931
2932 syncManager->showProgressBar(0, i18n("Syncing - close to abort!"), er.count()); 2932 syncManager->showProgressBar(0, i18n("Syncing - close to abort!"), er.count());
2933 2933
2934 int modulo = (er.count()/10)+1; 2934 int modulo = (er.count()/10)+1;
2935 int incCounter = 0; 2935 int incCounter = 0;
2936 while ( incCounter < er.count()) { 2936 while ( incCounter < er.count()) {
2937 if (syncManager->isProgressBarCanceled()) 2937 if (syncManager->isProgressBarCanceled())
2938 return false; 2938 return false;
2939 if ( incCounter % modulo == 0 ) 2939 if ( incCounter % modulo == 0 )
2940 syncManager->showProgressBar(incCounter); 2940 syncManager->showProgressBar(incCounter);
2941 2941
2942 uid = er[ incCounter ]; 2942 uid = er[ incCounter ];
2943 bool skipIncidence = false; 2943 bool skipIncidence = false;
2944 if ( uid.left(19) == QString("last-syncAddressee-") ) 2944 if ( uid.left(19) == QString("last-syncAddressee-") )
2945 skipIncidence = true; 2945 skipIncidence = true;
2946 QString idS,OidS; 2946 QString idS,OidS;
2947 qApp->processEvents(); 2947 qApp->processEvents();
2948 if ( !skipIncidence ) { 2948 if ( !skipIncidence ) {
2949 inL = local->findByUid( uid ); 2949 inL = local->findByUid( uid );
2950 inR = remote->findByUid( uid ); 2950 inR = remote->findByUid( uid );
2951 //inL.setResource( 0 ); 2951 //inL.setResource( 0 );
2952 //inR.setResource( 0 ); 2952 //inR.setResource( 0 );
2953 if ( !inL.isEmpty() ) { // maybe conflict - same uid in both calendars 2953 if ( !inL.isEmpty() ) { // maybe conflict - same uid in both calendars
2954 if ( !inL.resource() || inL.resource()->includeInSync() ) { 2954 if ( !inL.resource() || inL.resource()->includeInSync() ) {
2955 if ( (take = takeAddressee( &inL, &inR, mode, fullDateRange )) ) { 2955 if ( (take = takeAddressee( &inL, &inR, mode, fullDateRange )) ) {
2956 //qDebug("take %d %s ", take, inL.summary().latin1()); 2956 //qDebug("take %d %s ", take, inL.summary().latin1());
2957 if ( take == 3 ) 2957 if ( take == 3 )
2958 return false; 2958 return false;
2959 if ( take == 1 ) {// take local ********************** 2959 if ( take == 1 ) {// take local **********************
2960 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 2960 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
2961 inL.setCsum( mCurrentSyncDevice, inR.getCsum(mCurrentSyncDevice) ); 2961 inL.setCsum( mCurrentSyncDevice, inR.getCsum(mCurrentSyncDevice) );
2962 inL.setID( mCurrentSyncDevice, inR.getID(mCurrentSyncDevice) ); 2962 inL.setID( mCurrentSyncDevice, inR.getID(mCurrentSyncDevice) );
2963 local->insertAddressee( inL, false ); 2963 local->insertAddressee( inL, false );
2964 idS = inR.externalUID(); 2964 idS = inR.externalUID();
2965 OidS = inR.originalExternalUID(); 2965 OidS = inR.originalExternalUID();
2966 } 2966 }
2967 else 2967 else
2968 idS = inR.IDStr(); 2968 idS = inR.IDStr();
2969 remote->removeAddressee( inR ); 2969 remote->removeAddressee( inR );
2970 inR = inL; 2970 inR = inL;
2971 inR.setTempSyncStat( SYNC_TEMPSTATE_INITIAL ); 2971 inR.setTempSyncStat( SYNC_TEMPSTATE_INITIAL );
2972 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 2972 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
2973 inR.setOriginalExternalUID( OidS ); 2973 inR.setOriginalExternalUID( OidS );
2974 inR.setExternalUID( idS ); 2974 inR.setExternalUID( idS );
2975 if ( syncManager->syncWithDesktop() ) { 2975 if ( syncManager->syncWithDesktop() ) {
2976 inR.setIDStr("changed" ); 2976 inR.setIDStr("changed" );
2977 } 2977 }
2978 //inR.insertCustom( "KADDRESSBOOK", "X-KDESYNC","changed" ); 2978 //inR.insertCustom( "KADDRESSBOOK", "X-KDESYNC","changed" );
2979 } else { 2979 } else {
2980 inR.setIDStr( idS ); 2980 inR.setIDStr( idS );
2981 } 2981 }
2982 inR.setResource( 0 ); 2982 inR.setResource( 0 );
2983 remote->insertAddressee( inR , false); 2983 remote->insertAddressee( inR , false);
2984 ++changedRemote; 2984 ++changedRemote;
2985 } else { // take == 2 take remote ********************** 2985 } else { // take == 2 take remote **********************
2986 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 2986 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
2987 if ( inR.revision().date().year() < 2004 ) 2987 if ( inR.revision().date().year() < 2004 )
2988 inR.setRevision( modifiedCalendar ); 2988 inR.setRevision( modifiedCalendar );
2989 } 2989 }
2990 idS = inL.IDStr(); 2990 idS = inL.IDStr();
2991 local->removeAddressee( inL ); 2991 local->removeAddressee( inL );
2992 inL = inR; 2992 inL = inR;
2993 inL.setIDStr( idS ); 2993 inL.setIDStr( idS );
2994 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 2994 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
2995 inL.setCsum( mCurrentSyncDevice, inR.getCsum(mCurrentSyncDevice) ); 2995 inL.setCsum( mCurrentSyncDevice, inR.getCsum(mCurrentSyncDevice) );
2996 inL.setID( mCurrentSyncDevice, inR.getID(mCurrentSyncDevice) ); 2996 inL.setID( mCurrentSyncDevice, inR.getID(mCurrentSyncDevice) );
2997 } 2997 }
2998 inL.setResource( 0 ); 2998 inL.setResource( 0 );
2999 local->insertAddressee( inL , false ); 2999 local->insertAddressee( inL , false );
3000 ++changedLocal; 3000 ++changedLocal;
3001 } 3001 }
3002 } 3002 }
3003 } 3003 }
3004 } else { // no conflict ********** add or delete remote 3004 } else { // no conflict ********** add or delete remote
3005 if ( filterIN.name().isEmpty() || filterIN.filterAddressee( inR ) ) { 3005 if ( filterIN.name().isEmpty() || filterIN.filterAddressee( inR ) ) {
3006 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 3006 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
3007 QString des = addresseeLSync.note(); 3007 QString des = addresseeLSync.note();
3008 if ( des.find( inR.getID(mCurrentSyncDevice) +"," ) >= 0 && mode != 5) { // delete it 3008 if ( des.find( inR.getID(mCurrentSyncDevice) +"," ) >= 0 && mode != 5) { // delete it
3009 inR.setTempSyncStat( SYNC_TEMPSTATE_DELETE ); 3009 inR.setTempSyncStat( SYNC_TEMPSTATE_DELETE );
3010 remote->insertAddressee( inR, false ); 3010 remote->insertAddressee( inR, false );
3011 ++deletedAddresseeR; 3011 ++deletedAddresseeR;
3012 } else { 3012 } else {
3013 inR.setRevision( modifiedCalendar ); 3013 inR.setRevision( modifiedCalendar );
3014 remote->insertAddressee( inR, false ); 3014 remote->insertAddressee( inR, false );
3015 inL = inR; 3015 inL = inR;
3016 inL.setIDStr( ":" ); 3016 inL.setIDStr( ":" );
3017 inL.setCsum( mCurrentSyncDevice, inR.getCsum(mCurrentSyncDevice) ); 3017 inL.setCsum( mCurrentSyncDevice, inR.getCsum(mCurrentSyncDevice) );
3018 inL.setID( mCurrentSyncDevice, inR.getID(mCurrentSyncDevice) ); 3018 inL.setID( mCurrentSyncDevice, inR.getID(mCurrentSyncDevice) );
3019 inL.setResource( 0 ); 3019 inL.setResource( 0 );
3020 local->insertAddressee( inL , false); 3020 local->insertAddressee( inL , false);
3021 ++addedAddressee; 3021 ++addedAddressee;
3022 } 3022 }
3023 } else { 3023 } else {
3024 if ( inR.revision() > mLastAddressbookSync || mode == 5 ) { 3024 if ( inR.revision() > mLastAddressbookSync || mode == 5 ) {
3025 inR.setRevision( modifiedCalendar ); 3025 inR.setRevision( modifiedCalendar );
3026 remote->insertAddressee( inR, false ); 3026 remote->insertAddressee( inR, false );
3027 inR.setResource( 0 ); 3027 inR.setResource( 0 );
3028 local->insertAddressee( inR, false ); 3028 local->insertAddressee( inR, false );
3029 ++addedAddressee; 3029 ++addedAddressee;
3030 } else { 3030 } else {
3031 // pending checkExternSyncAddressee(addresseeRSyncSharp, inR); 3031 // pending checkExternSyncAddressee(addresseeRSyncSharp, inR);
3032 remote->removeAddressee( inR ); 3032 remote->removeAddressee( inR );
3033 ++deletedAddresseeR; 3033 ++deletedAddresseeR;
3034 } 3034 }
3035 } 3035 }
3036 } else { 3036 } else {
3037 ++filteredIN; 3037 ++filteredIN;
3038 } 3038 }
3039 } 3039 }
3040 } 3040 }
3041 ++incCounter; 3041 ++incCounter;
3042 } 3042 }
3043 er.clear(); 3043 er.clear();
3044 QStringList el = local->uidList(); 3044 QStringList el = local->uidList();
3045 modulo = (el.count()/10)+1; 3045 modulo = (el.count()/10)+1;
3046 3046
3047 syncManager->showProgressBar(0, i18n("Add / remove addressees"), el.count()); 3047 syncManager->showProgressBar(0, i18n("Add / remove addressees"), el.count());
3048 incCounter = 0; 3048 incCounter = 0;
3049 while ( incCounter < el.count()) { 3049 while ( incCounter < el.count()) {
3050 qApp->processEvents(); 3050 qApp->processEvents();
3051 if (syncManager->isProgressBarCanceled()) 3051 if (syncManager->isProgressBarCanceled())
3052 return false; 3052 return false;
3053 if ( incCounter % modulo == 0 ) 3053 if ( incCounter % modulo == 0 )
3054 syncManager->showProgressBar(incCounter); 3054 syncManager->showProgressBar(incCounter);
3055 uid = el[ incCounter ]; 3055 uid = el[ incCounter ];
3056 bool skipIncidence = false; 3056 bool skipIncidence = false;
3057 if ( uid.left(19) == QString("last-syncAddressee-") ) 3057 if ( uid.left(19) == QString("last-syncAddressee-") )
3058 skipIncidence = true; 3058 skipIncidence = true;
3059 if ( !skipIncidence ) { 3059 if ( !skipIncidence ) {
3060 inL = local->findByUid( uid ); 3060 inL = local->findByUid( uid );
3061 if ( !inL.resource() || inL.resource()->includeInSync() ) { 3061 if ( !inL.resource() || inL.resource()->includeInSync() ) {
3062 inR = remote->findByUid( uid ); 3062 inR = remote->findByUid( uid );
3063 if ( inR.isEmpty() ){ 3063 if ( inR.isEmpty() ){
3064 if ( filterOUT.name().isEmpty() || filterOUT.filterAddressee( inL ) ) { 3064 if ( filterOUT.name().isEmpty() || filterOUT.filterAddressee( inL ) ) {
3065 // no conflict ********** add or delete local 3065 // no conflict ********** add or delete local
3066 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 3066 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
3067 if ( !inL.getID(mCurrentSyncDevice).isEmpty() && mode != 4 ) { 3067 if ( !inL.getID(mCurrentSyncDevice).isEmpty() && mode != 4 ) {
3068 // pending checkExternSyncAddressee(addresseeLSyncSharp, inL); 3068 // pending checkExternSyncAddressee(addresseeLSyncSharp, inL);
3069 local->removeAddressee( inL ); 3069 local->removeAddressee( inL );
3070 ++deletedAddresseeL; 3070 ++deletedAddresseeL;
3071 } else { 3071 } else {
3072 if ( ! syncManager->mWriteBackExistingOnly ) { 3072 if ( ! syncManager->mWriteBackExistingOnly ) {
3073 inL.removeID(mCurrentSyncDevice ); 3073 inL.removeID(mCurrentSyncDevice );
3074 ++addedAddresseeR; 3074 ++addedAddresseeR;
3075 inL.setRevision( modifiedCalendar ); 3075 inL.setRevision( modifiedCalendar );
3076 local->insertAddressee( inL, false ); 3076 local->insertAddressee( inL, false );
3077 inR = inL; 3077 inR = inL;
3078 inR.setTempSyncStat( SYNC_TEMPSTATE_ADDED_EXTERNAL ); 3078 inR.setTempSyncStat( SYNC_TEMPSTATE_ADDED_EXTERNAL );
3079 inR.setResource( 0 ); 3079 inR.setResource( 0 );
3080 remote->insertAddressee( inR, false ); 3080 remote->insertAddressee( inR, false );
3081 } 3081 }
3082 } 3082 }
3083 } else { 3083 } else {
3084 if ( inL.revision() < mLastAddressbookSync && mode != 4 ) { 3084 if ( inL.revision() < mLastAddressbookSync && mode != 4 ) {
3085 //qDebug("data %s ", inL.revision().toString().latin1()); 3085 //qDebug("data %s ", inL.revision().toString().latin1());
3086 // pending checkExternSyncAddressee(addresseeLSyncSharp, inL); 3086 // pending checkExternSyncAddressee(addresseeLSyncSharp, inL);
3087 local->removeAddressee( inL ); 3087 local->removeAddressee( inL );
3088 ++deletedAddresseeL; 3088 ++deletedAddresseeL;
3089 } else { 3089 } else {
3090 if ( ! syncManager->mWriteBackExistingOnly ) { 3090 if ( ! syncManager->mWriteBackExistingOnly ) {
3091 ++addedAddresseeR; 3091 ++addedAddresseeR;
3092 inL.setRevision( modifiedCalendar ); 3092 inL.setRevision( modifiedCalendar );
3093 local->insertAddressee( inL, false ); 3093 local->insertAddressee( inL, false );
3094 inR = inL; 3094 inR = inL;
3095 inR.setIDStr( ":" ); 3095 inR.setIDStr( ":" );
3096 inR.setResource( 0 ); 3096 inR.setResource( 0 );
3097 remote->insertAddressee( inR, false ); 3097 remote->insertAddressee( inR, false );
3098 } 3098 }
3099 } 3099 }
3100 } 3100 }
3101 } else { 3101 } else {
3102 ++filteredOUT; 3102 ++filteredOUT;
3103 } 3103 }
3104 } 3104 }
3105 } 3105 }
3106 } 3106 }
3107 ++incCounter; 3107 ++incCounter;
3108 } 3108 }
3109 el.clear(); 3109 el.clear();
3110 syncManager->hideProgressBar(); 3110 syncManager->hideProgressBar();
3111 mLastAddressbookSync = QDateTime::currentDateTime().addSecs( 1 ); 3111 mLastAddressbookSync = QDateTime::currentDateTime().addSecs( 1 );
3112 // get rid of micro seconds 3112 // get rid of micro seconds
3113 QTime t = mLastAddressbookSync.time(); 3113 QTime t = mLastAddressbookSync.time();
3114 mLastAddressbookSync.setTime( QTime (t.hour (), t.minute (), t.second () ) ); 3114 mLastAddressbookSync.setTime( QTime (t.hour (), t.minute (), t.second () ) );
3115 addresseeLSync.setRevision( mLastAddressbookSync ); 3115 addresseeLSync.setRevision( mLastAddressbookSync );
3116 addresseeRSync.setRevision( mLastAddressbookSync ); 3116 addresseeRSync.setRevision( mLastAddressbookSync );
3117 addresseeRSync.setRole( i18n("!Remote from: ")+mCurrentSyncName ) ; 3117 addresseeRSync.setRole( i18n("!Remote from: ")+mCurrentSyncName ) ;
3118 addresseeLSync.setRole(i18n("!Local from: ") + mCurrentSyncName ); 3118 addresseeLSync.setRole(i18n("!Local from: ") + mCurrentSyncName );
3119 addresseeRSync.setGivenName( i18n("!DO NOT EDIT!") ) ; 3119 addresseeRSync.setGivenName( i18n("!DO NOT EDIT!") ) ;
3120 addresseeLSync.setGivenName(i18n("!DO NOT EDIT!") ); 3120 addresseeLSync.setGivenName(i18n("!DO NOT EDIT!") );
3121 addresseeRSync.setOrganization( "!"+mLastAddressbookSync.toString() ) ; 3121 addresseeRSync.setOrganization( "!"+mLastAddressbookSync.toString() ) ;
3122 addresseeLSync.setOrganization("!"+ mLastAddressbookSync.toString() ); 3122 addresseeLSync.setOrganization("!"+ mLastAddressbookSync.toString() );
3123 addresseeRSync.setNote( "" ) ; 3123 addresseeRSync.setNote( "" ) ;
3124 addresseeLSync.setNote( "" ); 3124 addresseeLSync.setNote( "" );
3125 3125
3126 if ( mGlobalSyncMode == SYNC_MODE_NORMAL) 3126 if ( mGlobalSyncMode == SYNC_MODE_NORMAL)
3127 remote->insertAddressee( addresseeRSync, false ); 3127 remote->insertAddressee( addresseeRSync, false );
3128 local->insertAddressee( addresseeLSync, false ); 3128 local->insertAddressee( addresseeLSync, false );
3129 QString mes; 3129 QString mes;
3130 mes .sprintf( i18n("Synchronization summary:\n\n %d items added to local\n %d items added to remote\n %d items updated on local\n %d items updated on remote\n %d items deleted on local\n %d items deleted on remote\n %d incoming filtered out\n %d outgoing filtered out"),addedAddressee, addedAddresseeR, changedLocal, changedRemote, deletedAddresseeL, deletedAddresseeR, filteredIN, filteredOUT ); 3130 mes .sprintf( i18n("Synchronization summary:\n\n %d items added to local\n %d items added to remote\n %d items updated on local\n %d items updated on remote\n %d items deleted on local\n %d items deleted on remote\n %d incoming filtered out\n %d outgoing filtered out"),addedAddressee, addedAddresseeR, changedLocal, changedRemote, deletedAddresseeL, deletedAddresseeR, filteredIN, filteredOUT );
3131 qDebug( mes ); 3131 qDebug( mes );
3132 mes = i18n("Local addressbook changed!\n") +mes; 3132 mes = i18n("Local addressbook changed!\n") +mes;
3133 if ( syncManager->mShowSyncSummary ) { 3133 if ( syncManager->mShowSyncSummary ) {
3134 if ( KMessageBox::Cancel == KMessageBox::warningContinueCancel(this, mes, 3134 if ( KMessageBox::Cancel == KMessageBox::warningContinueCancel(this, mes,
3135 i18n("KA/Pi Synchronization"),i18n("Write back"))) { 3135 i18n("KA/Pi Synchronization"),i18n("Write back"))) {
3136 qDebug("KA: WB cancelled "); 3136 qDebug("KA: WB cancelled ");
3137 return false; 3137 syncManager->mWriteBackFile = false;
3138 return syncOK;
3138 } 3139 }
3139 } 3140 }
3140 return syncOK; 3141 return syncOK;
3141} 3142}
3142 3143
3143 3144
3144//this is a overwritten callbackmethods from the syncinterface 3145//this is a overwritten callbackmethods from the syncinterface
3145bool KABCore::sync(KSyncManager* manager, QString filename, int mode) 3146bool KABCore::sync(KSyncManager* manager, QString filename, int mode)
3146{ 3147{
3147 3148
3148 //pending prepare addresseeview for output 3149 //pending prepare addresseeview for output
3149 //pending detect, if remote file has REV field. if not switch to external sync 3150 //pending detect, if remote file has REV field. if not switch to external sync
3150 mGlobalSyncMode = SYNC_MODE_NORMAL; 3151 mGlobalSyncMode = SYNC_MODE_NORMAL;
3151 if ( manager != syncManager ) 3152 if ( manager != syncManager )
3152 qDebug("KABCore::sync:: ERROR! :: manager != syncManager "); 3153 qDebug("KABCore::sync:: ERROR! :: manager != syncManager ");
3153 QString mCurrentSyncDevice = manager->getCurrentSyncDevice(); 3154 QString mCurrentSyncDevice = manager->getCurrentSyncDevice();
3154 3155
3155 AddressBook abLocal(filename,"syncContact"); 3156 AddressBook abLocal(filename,"syncContact");
3156 bool syncOK = false; 3157 bool syncOK = false;
3157 if ( abLocal.load() ) { 3158 if ( abLocal.load() ) {
3158 qDebug("KA: Sync::AB loaded %s,sync mode %d",filename.latin1(), mode ); 3159 qDebug("KA: Sync::AB loaded %s,sync mode %d",filename.latin1(), mode );
3159 bool external = false; 3160 bool external = false;
3160 bool isXML = false; 3161 bool isXML = false;
3161 if ( filename.right(4) == ".xml") { 3162 if ( filename.right(4) == ".xml") {
3162 mGlobalSyncMode = SYNC_MODE_EXTERNAL; 3163 mGlobalSyncMode = SYNC_MODE_EXTERNAL;
3163 isXML = true; 3164 isXML = true;
3164 abLocal.preExternSync( mAddressBook ,mCurrentSyncDevice, true ); 3165 abLocal.preExternSync( mAddressBook ,mCurrentSyncDevice, true );
3165 } else { 3166 } else {
3166 external = !manager->mIsKapiFile; 3167 external = !manager->mIsKapiFile;
3167 if ( external ) { 3168 if ( external ) {
3168 qDebug("KA: Sync::Setting vcf mode to external "); 3169 qDebug("KA: Sync::Setting vcf mode to external ");
3169 mGlobalSyncMode = SYNC_MODE_EXTERNAL; 3170 mGlobalSyncMode = SYNC_MODE_EXTERNAL;
3170 AddressBook::Iterator it; 3171 AddressBook::Iterator it;
3171 for ( it = abLocal.begin(); it != abLocal.end(); ++it ) { 3172 for ( it = abLocal.begin(); it != abLocal.end(); ++it ) {
3172 (*it).setID( mCurrentSyncDevice, (*it).uid() ); 3173 (*it).setID( mCurrentSyncDevice, (*it).uid() );
3173 (*it).computeCsum( mCurrentSyncDevice ); 3174 (*it).computeCsum( mCurrentSyncDevice );
3174 } 3175 }
3175 } 3176 }
3176 } 3177 }
3177 //AddressBook::Iterator it; 3178 //AddressBook::Iterator it;
3178 //QStringList vcards; 3179 //QStringList vcards;
3179 //for ( it = abLocal.begin(); it != abLocal.end(); ++it ) { 3180 //for ( it = abLocal.begin(); it != abLocal.end(); ++it ) {
3180 // qDebug("Name %s ", (*it).familyName().latin1()); 3181 // qDebug("Name %s ", (*it).familyName().latin1());
3181 //} 3182 //}
3182 syncOK = synchronizeAddressbooks( mAddressBook, &abLocal, mode ); 3183 syncOK = synchronizeAddressbooks( mAddressBook, &abLocal, mode );
3183 if ( syncOK ) { 3184 if ( syncOK ) {
3184 if ( syncManager->mWriteBackFile ) 3185 if ( syncManager->mWriteBackFile )
3185 { 3186 {
3186 if ( external ) 3187 if ( external )
3187 abLocal.removeSyncAddressees( !isXML); 3188 abLocal.removeSyncAddressees( !isXML);
3188 qDebug("KA: Sync::Saving remote AB "); 3189 qDebug("KA: Sync::Saving remote AB ");
3189 if ( ! abLocal.saveAB()) 3190 if ( ! abLocal.saveAB())
3190 qDebug("KA: sync::Error writing back AB to file "); 3191 qDebug("KA: sync::Error writing back AB to file ");
3191 if ( external ) { 3192 if ( external ) {
3192 // afterwrite processing 3193 // afterwrite processing
3193 abLocal.postExternSync( mAddressBook,mCurrentSyncDevice ,isXML); 3194 abLocal.postExternSync( mAddressBook,mCurrentSyncDevice ,isXML);
3194 } 3195 }
3195 } 3196 }
3196 } 3197 }
3197 setModified(); 3198 setModified();
3198 3199
3199 } 3200 }
3200 abLocal.removeResources(); 3201 abLocal.removeResources();
3201 if ( syncOK ) 3202 if ( syncOK )
3202 mViewManager->refreshView(); 3203 mViewManager->refreshView();
3203 return syncOK; 3204 return syncOK;
3204 3205
3205} 3206}
3206void KABCore::removeSyncInfo( QString syncProfile) 3207void KABCore::removeSyncInfo( QString syncProfile)
3207{ 3208{
3208 qDebug("KA: AB:removeSyncInfo for profile %s ", syncProfile.latin1()); 3209 qDebug("KA: AB:removeSyncInfo for profile %s ", syncProfile.latin1());
3209 mAddressBook->removeSyncInfo( syncProfile ); 3210 mAddressBook->removeSyncInfo( syncProfile );
3210 setModified(); 3211 setModified();
3211} 3212}
3212 3213
3213 3214
3214//this is a overwritten callbackmethods from the syncinterface 3215//this is a overwritten callbackmethods from the syncinterface
3215bool KABCore::syncExternal(KSyncManager* manager, QString resource) 3216bool KABCore::syncExternal(KSyncManager* manager, QString resource)
3216{ 3217{
3217 if ( resource == "phone" ) 3218 if ( resource == "phone" )
3218 return syncPhone(); 3219 return syncPhone();
3219 disableBR( true ); 3220 disableBR( true );
3220 if ( manager != syncManager ) 3221 if ( manager != syncManager )
3221 qDebug("KABCore::syncExternal:: ERROR! :: manager != syncManager "); 3222 qDebug("KABCore::syncExternal:: ERROR! :: manager != syncManager ");
3222 QString mCurrentSyncDevice = manager->getCurrentSyncDevice(); 3223 QString mCurrentSyncDevice = manager->getCurrentSyncDevice();
3223 3224
3224 AddressBook abLocal( resource,"syncContact"); 3225 AddressBook abLocal( resource,"syncContact");
3225 bool syncOK = false; 3226 bool syncOK = false;
3226 message(i18n("Loading DTM address data..."), false); 3227 message(i18n("Loading DTM address data..."), false);
3227 if ( abLocal.load() ) { 3228 if ( abLocal.load() ) {
3228 qDebug("KA: AB sharp loaded ,sync device %s",mCurrentSyncDevice.latin1()); 3229 qDebug("KA: AB sharp loaded ,sync device %s",mCurrentSyncDevice.latin1());
3229 mGlobalSyncMode = SYNC_MODE_EXTERNAL; 3230 mGlobalSyncMode = SYNC_MODE_EXTERNAL;
3230 message(i18n("Sync preprocessing..."),false); 3231 message(i18n("Sync preprocessing..."),false);
3231 abLocal.preExternSync( mAddressBook ,mCurrentSyncDevice, false ); 3232 abLocal.preExternSync( mAddressBook ,mCurrentSyncDevice, false );
3232 message(i18n("Synchronizing..."),false); 3233 message(i18n("Synchronizing..."),false);
3233 syncOK = synchronizeAddressbooks( mAddressBook, &abLocal, syncManager->mSyncAlgoPrefs ); 3234 syncOK = synchronizeAddressbooks( mAddressBook, &abLocal, syncManager->mSyncAlgoPrefs );
3234 if ( syncOK ) { 3235 if ( syncOK ) {
3235 if ( syncManager->mWriteBackFile ) { 3236 if ( syncManager->mWriteBackFile ) {
3236 abLocal.removeSyncAddressees( false ); 3237 abLocal.removeSyncAddressees( false );
3237 message(i18n("Saving DTM address data..."),false); 3238 message(i18n("Saving DTM address data..."),false);
3238 abLocal.saveAB(); 3239 abLocal.saveAB();
3239 message(i18n("Sync postprocessing..."),false); 3240 message(i18n("Sync postprocessing..."),false);
3240 abLocal.postExternSync( mAddressBook,mCurrentSyncDevice, true ); 3241 abLocal.postExternSync( mAddressBook,mCurrentSyncDevice, true );
3241 } 3242 }
3242 } else 3243 } else
3243 message( i18n("Sync cancelled or failed.") ); 3244 message( i18n("Sync cancelled or failed.") );
3244 setModified(); 3245 setModified();
3245 } 3246 }
3246 abLocal.removeResources(); 3247 abLocal.removeResources();
3247 if ( syncOK ) { 3248 if ( syncOK ) {
3248 mViewManager->refreshView(); 3249 mViewManager->refreshView();
3249 message(i18n("DTM syncing finished.")); 3250 message(i18n("DTM syncing finished."));
3250 } 3251 }
3251 disableBR( false ); 3252 disableBR( false );
3252 return syncOK; 3253 return syncOK;
3253 3254
3254} 3255}
3255void KABCore::message( QString m, bool startTimer) 3256void KABCore::message( QString m, bool startTimer)
3256{ 3257{
3257 topLevelWidget()->setCaption( m ); 3258 topLevelWidget()->setCaption( m );
3258 qApp->processEvents(); 3259 qApp->processEvents();
3259 if ( startTimer ) 3260 if ( startTimer )
3260 mMessageTimer->start( 15000, true ); 3261 mMessageTimer->start( 15000, true );
3261 else 3262 else
3262 mMessageTimer->stop(); 3263 mMessageTimer->stop();
3263} 3264}
3264bool KABCore::syncPhone() 3265bool KABCore::syncPhone()
3265{ 3266{
3266 QString mCurrentSyncDevice = syncManager->getCurrentSyncDevice(); 3267 QString mCurrentSyncDevice = syncManager->getCurrentSyncDevice();
3267 QString fileName = getPhoneFile(); 3268 QString fileName = getPhoneFile();
3268 if ( !PhoneAccess::readFromPhone( fileName) ) { 3269 if ( !PhoneAccess::readFromPhone( fileName) ) {
3269 message(i18n("Phone access failed!")); 3270 message(i18n("Phone access failed!"));
3270 return false; 3271 return false;
3271 } 3272 }
3272 AddressBook abLocal( fileName,"syncContact"); 3273 AddressBook abLocal( fileName,"syncContact");
3273 bool syncOK = false; 3274 bool syncOK = false;
3274 { 3275 {
3275 abLocal.importFromFile( fileName ); 3276 abLocal.importFromFile( fileName );
3276 qDebug("KA: AB phone loaded ,sync device %s",mCurrentSyncDevice.latin1()); 3277 qDebug("KA: AB phone loaded ,sync device %s",mCurrentSyncDevice.latin1());
3277 mGlobalSyncMode = SYNC_MODE_EXTERNAL; 3278 mGlobalSyncMode = SYNC_MODE_EXTERNAL;
3278 abLocal.preparePhoneSync( mCurrentSyncDevice, true ); 3279 abLocal.preparePhoneSync( mCurrentSyncDevice, true );
3279 abLocal.preExternSync( mAddressBook ,mCurrentSyncDevice, true ); 3280 abLocal.preExternSync( mAddressBook ,mCurrentSyncDevice, true );
3280 syncOK = synchronizeAddressbooks( mAddressBook, &abLocal, syncManager->mSyncAlgoPrefs ); 3281 syncOK = synchronizeAddressbooks( mAddressBook, &abLocal, syncManager->mSyncAlgoPrefs );
3281 if ( syncOK ) { 3282 if ( syncOK ) {
3282 if ( syncManager->mWriteBackFile ) { 3283 if ( syncManager->mWriteBackFile ) {
3283 abLocal.removeSyncAddressees( true ); 3284 abLocal.removeSyncAddressees( true );
3284 abLocal.saveABphone( fileName ); 3285 abLocal.saveABphone( fileName );
3285 abLocal.findNewExtIds( fileName, mCurrentSyncDevice ); 3286 abLocal.findNewExtIds( fileName, mCurrentSyncDevice );
3286 //abLocal.preparePhoneSync( mCurrentSyncDevice, false ); 3287 //abLocal.preparePhoneSync( mCurrentSyncDevice, false );
3287 abLocal.postExternSync( mAddressBook,mCurrentSyncDevice, true ); 3288 abLocal.postExternSync( mAddressBook,mCurrentSyncDevice, true );
3288 } 3289 }
3289 } 3290 }
3290 setModified(); 3291 setModified();
3291 } 3292 }
3292 abLocal.removeResources(); 3293 abLocal.removeResources();
3293 if ( syncOK ) 3294 if ( syncOK )
3294 mViewManager->refreshView(); 3295 mViewManager->refreshView();
3295 return syncOK; 3296 return syncOK;
3296} 3297}
3297void KABCore::getFile( bool success ) 3298void KABCore::getFile( bool success )
3298{ 3299{
3299 if ( ! success ) { 3300 if ( ! success ) {
3300 message( i18n("Error receiving file. Nothing changed!") ); 3301 message( i18n("Error receiving file. Nothing changed!") );
3301 return; 3302 return;
3302 } 3303 }
3303 int count = mAddressBook->importFromFile( sentSyncFile() , false, true ); 3304 int count = mAddressBook->importFromFile( sentSyncFile() , false, true );
3304 if ( count ) 3305 if ( count )
3305 setModified( true ); 3306 setModified( true );
3306 message( i18n("Pi-Sync successful!") ); 3307 message( i18n("Pi-Sync successful!") );
3307 mViewManager->refreshView(); 3308 mViewManager->refreshView();
3308} 3309}
3309void KABCore::syncFileRequest() 3310void KABCore::syncFileRequest()
3310{ 3311{
3311 if ( KABPrefs::instance()->mPassiveSyncWithDesktop ) { 3312 if ( KABPrefs::instance()->mPassiveSyncWithDesktop ) {
3312 syncManager->slotSyncMenu( 999 ); 3313 syncManager->slotSyncMenu( 999 );
3313 } 3314 }
3314 mAddressBook->export2File( sentSyncFile() ); 3315 mAddressBook->export2File( sentSyncFile() );
3315} 3316}
3316QString KABCore::sentSyncFile() 3317QString KABCore::sentSyncFile()
3317{ 3318{
3318#ifdef DESKTOP_VERSION 3319#ifdef DESKTOP_VERSION
3319 return locateLocal( "tmp", "copysyncab.vcf" ); 3320 return locateLocal( "tmp", "copysyncab.vcf" );
3320#else 3321#else
3321 return QString( "/tmp/copysyncab.vcf" ); 3322 return QString( "/tmp/copysyncab.vcf" );
3322#endif 3323#endif
3323} 3324}
3324 3325
3325void KABCore::setCaptionBack() 3326void KABCore::setCaptionBack()
3326{ 3327{
3327 mMessageTimer->stop(); 3328 mMessageTimer->stop();
3328 topLevelWidget()->setCaption( i18n("KAddressbook/Pi") ); 3329 topLevelWidget()->setCaption( i18n("KAddressbook/Pi") );
3329} 3330}
diff --git a/korganizer/calendarview.cpp b/korganizer/calendarview.cpp
index a9de65a..7c8316f 100644
--- a/korganizer/calendarview.cpp
+++ b/korganizer/calendarview.cpp
@@ -718,1025 +718,1026 @@ int CalendarView::takeEvent( Incidence* local, Incidence* remote, int mode , b
718 // 3 cancel 718 // 3 cancel
719 QDateTime lastSync = mLastCalendarSync; 719 QDateTime lastSync = mLastCalendarSync;
720 QDateTime localMod = local->lastModified(); 720 QDateTime localMod = local->lastModified();
721 QDateTime remoteMod = remote->lastModified(); 721 QDateTime remoteMod = remote->lastModified();
722 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 722 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
723 bool remCh, locCh; 723 bool remCh, locCh;
724 remCh = ( remote->getCsum(mCurrentSyncDevice) != local->getCsum(mCurrentSyncDevice) ); 724 remCh = ( remote->getCsum(mCurrentSyncDevice) != local->getCsum(mCurrentSyncDevice) );
725 //if ( remCh ) 725 //if ( remCh )
726 //qDebug("loc %s rem %s", local->getCsum(mCurrentSyncDevice).latin1(), remote->getCsum(mCurrentSyncDevice).latin1() ); 726 //qDebug("loc %s rem %s", local->getCsum(mCurrentSyncDevice).latin1(), remote->getCsum(mCurrentSyncDevice).latin1() );
727 locCh = ( localMod > mLastCalendarSync ); 727 locCh = ( localMod > mLastCalendarSync );
728 if ( !remCh && ! locCh ) { 728 if ( !remCh && ! locCh ) {
729 //qDebug("both not changed "); 729 //qDebug("both not changed ");
730 lastSync = localMod.addDays(1); 730 lastSync = localMod.addDays(1);
731 if ( mode <= SYNC_PREF_ASK ) 731 if ( mode <= SYNC_PREF_ASK )
732 return 0; 732 return 0;
733 } else { 733 } else {
734 if ( locCh ) { 734 if ( locCh ) {
735 //qDebug("loc changed %d %s %s", local->revision() , localMod.toString().latin1(), mLastCalendarSync.toString().latin1()); 735 //qDebug("loc changed %d %s %s", local->revision() , localMod.toString().latin1(), mLastCalendarSync.toString().latin1());
736 lastSync = localMod.addDays( -1 ); 736 lastSync = localMod.addDays( -1 );
737 if ( !remCh ) 737 if ( !remCh )
738 remoteMod = ( lastSync.addDays( -1 ) ); 738 remoteMod = ( lastSync.addDays( -1 ) );
739 } else { 739 } else {
740 //qDebug(" not loc changed "); 740 //qDebug(" not loc changed ");
741 lastSync = localMod.addDays( 1 ); 741 lastSync = localMod.addDays( 1 );
742 if ( remCh ) 742 if ( remCh )
743 remoteMod =( lastSync.addDays( 1 ) ); 743 remoteMod =( lastSync.addDays( 1 ) );
744 744
745 } 745 }
746 } 746 }
747 full = true; 747 full = true;
748 if ( mode < SYNC_PREF_ASK ) 748 if ( mode < SYNC_PREF_ASK )
749 mode = SYNC_PREF_ASK; 749 mode = SYNC_PREF_ASK;
750 } else { 750 } else {
751 if ( localMod == remoteMod ) 751 if ( localMod == remoteMod )
752 // if ( local->revision() == remote->revision() ) 752 // if ( local->revision() == remote->revision() )
753 return 0; 753 return 0;
754 754
755 } 755 }
756 // qDebug(" %d %d conflict on %s %s ", mode, full, local->summary().latin1(), remote->summary().latin1() ); 756 // qDebug(" %d %d conflict on %s %s ", mode, full, local->summary().latin1(), remote->summary().latin1() );
757 757
758 //qDebug("%s %d %s %d", localMod.toString().latin1() , local->revision(), remoteMod.toString().latin1(), remote->revision()); 758 //qDebug("%s %d %s %d", localMod.toString().latin1() , local->revision(), remoteMod.toString().latin1(), remote->revision());
759 //qDebug("%d %d %d %d ", localMod.time().second(), localMod.time().msec(), remoteMod.time().second(), remoteMod.time().msec() ); 759 //qDebug("%d %d %d %d ", localMod.time().second(), localMod.time().msec(), remoteMod.time().second(), remoteMod.time().msec() );
760 //full = true; //debug only 760 //full = true; //debug only
761 if ( full ) { 761 if ( full ) {
762 bool equ = false; 762 bool equ = false;
763 if ( local->type() == "Event" ) { 763 if ( local->type() == "Event" ) {
764 equ = (*((Event*) local) == *((Event*) remote)); 764 equ = (*((Event*) local) == *((Event*) remote));
765 } 765 }
766 else if ( local->type() =="Todo" ) 766 else if ( local->type() =="Todo" )
767 equ = (*((Todo*) local) == (*(Todo*) remote)); 767 equ = (*((Todo*) local) == (*(Todo*) remote));
768 else if ( local->type() =="Journal" ) 768 else if ( local->type() =="Journal" )
769 equ = (*((Journal*) local) == *((Journal*) remote)); 769 equ = (*((Journal*) local) == *((Journal*) remote));
770 if ( equ ) { 770 if ( equ ) {
771 //qDebug("equal "); 771 //qDebug("equal ");
772 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 772 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
773 local->setCsum( mCurrentSyncDevice, remote->getCsum(mCurrentSyncDevice) ); 773 local->setCsum( mCurrentSyncDevice, remote->getCsum(mCurrentSyncDevice) );
774 } 774 }
775 if ( mode < SYNC_PREF_FORCE_LOCAL ) 775 if ( mode < SYNC_PREF_FORCE_LOCAL )
776 return 0; 776 return 0;
777 777
778 }//else //debug only 778 }//else //debug only
779 //qDebug("not equal %s %s ", local->summary().latin1(), remote->summary().latin1()); 779 //qDebug("not equal %s %s ", local->summary().latin1(), remote->summary().latin1());
780 } 780 }
781 int result; 781 int result;
782 bool localIsNew; 782 bool localIsNew;
783 //qDebug("%s -- %s mLastCalendarSync %s lastsync %s --- local %s remote %s ",local->summary().latin1(), remote->summary().latin1(),mLastCalendarSync.toString().latin1() ,lastSync.toString().latin1() , localMod.toString().latin1() , remoteMod.toString().latin1() ); 783 //qDebug("%s -- %s mLastCalendarSync %s lastsync %s --- local %s remote %s ",local->summary().latin1(), remote->summary().latin1(),mLastCalendarSync.toString().latin1() ,lastSync.toString().latin1() , localMod.toString().latin1() , remoteMod.toString().latin1() );
784 784
785 if ( full && mode < SYNC_PREF_NEWEST ) 785 if ( full && mode < SYNC_PREF_NEWEST )
786 mode = SYNC_PREF_ASK; 786 mode = SYNC_PREF_ASK;
787 787
788 switch( mode ) { 788 switch( mode ) {
789 case SYNC_PREF_LOCAL: 789 case SYNC_PREF_LOCAL:
790 if ( lastSync > remoteMod ) 790 if ( lastSync > remoteMod )
791 return 1; 791 return 1;
792 if ( lastSync > localMod ) 792 if ( lastSync > localMod )
793 return 2; 793 return 2;
794 return 1; 794 return 1;
795 break; 795 break;
796 case SYNC_PREF_REMOTE: 796 case SYNC_PREF_REMOTE:
797 if ( lastSync > remoteMod ) 797 if ( lastSync > remoteMod )
798 return 1; 798 return 1;
799 if ( lastSync > localMod ) 799 if ( lastSync > localMod )
800 return 2; 800 return 2;
801 return 2; 801 return 2;
802 break; 802 break;
803 case SYNC_PREF_NEWEST: 803 case SYNC_PREF_NEWEST:
804 if ( localMod > remoteMod ) 804 if ( localMod > remoteMod )
805 return 1; 805 return 1;
806 else 806 else
807 return 2; 807 return 2;
808 break; 808 break;
809 case SYNC_PREF_ASK: 809 case SYNC_PREF_ASK:
810 //qDebug("lsy %s --- lo %s --- re %s ", lastSync.toString().latin1(), localMod.toString().latin1(), remoteMod.toString().latin1() ); 810 //qDebug("lsy %s --- lo %s --- re %s ", lastSync.toString().latin1(), localMod.toString().latin1(), remoteMod.toString().latin1() );
811 if ( lastSync > remoteMod ) 811 if ( lastSync > remoteMod )
812 return 1; 812 return 1;
813 if ( lastSync > localMod ) 813 if ( lastSync > localMod )
814 return 2; 814 return 2;
815 //qDebug("lsy %s --- lo %s --- re %s ", lastSync.toString().latin1(), localMod.toString().latin1(), remoteMod.toString().latin1() ); 815 //qDebug("lsy %s --- lo %s --- re %s ", lastSync.toString().latin1(), localMod.toString().latin1(), remoteMod.toString().latin1() );
816 localIsNew = localMod >= remoteMod; 816 localIsNew = localMod >= remoteMod;
817 if ( localIsNew ) 817 if ( localIsNew )
818 getEventViewerDialog()->setColorMode( 1 ); 818 getEventViewerDialog()->setColorMode( 1 );
819 else 819 else
820 getEventViewerDialog()->setColorMode( 2 ); 820 getEventViewerDialog()->setColorMode( 2 );
821 getEventViewerDialog()->setIncidence(local); 821 getEventViewerDialog()->setIncidence(local);
822 if ( localIsNew ) 822 if ( localIsNew )
823 getEventViewerDialog()->setColorMode( 2 ); 823 getEventViewerDialog()->setColorMode( 2 );
824 else 824 else
825 getEventViewerDialog()->setColorMode( 1 ); 825 getEventViewerDialog()->setColorMode( 1 );
826 getEventViewerDialog()->addIncidence(remote); 826 getEventViewerDialog()->addIncidence(remote);
827 getEventViewerDialog()->setColorMode( 0 ); 827 getEventViewerDialog()->setColorMode( 0 );
828 //qDebug("local %d remote %d ",local->relatedTo(),remote->relatedTo() ); 828 //qDebug("local %d remote %d ",local->relatedTo(),remote->relatedTo() );
829 getEventViewerDialog()->setCaption( mCurrentSyncDevice +i18n(" : Conflict! Please choose entry!")); 829 getEventViewerDialog()->setCaption( mCurrentSyncDevice +i18n(" : Conflict! Please choose entry!"));
830 getEventViewerDialog()->showMe(); 830 getEventViewerDialog()->showMe();
831 result = getEventViewerDialog()->executeS( localIsNew ); 831 result = getEventViewerDialog()->executeS( localIsNew );
832 return result; 832 return result;
833 833
834 break; 834 break;
835 case SYNC_PREF_FORCE_LOCAL: 835 case SYNC_PREF_FORCE_LOCAL:
836 return 1; 836 return 1;
837 break; 837 break;
838 case SYNC_PREF_FORCE_REMOTE: 838 case SYNC_PREF_FORCE_REMOTE:
839 return 2; 839 return 2;
840 break; 840 break;
841 841
842 default: 842 default:
843 // SYNC_PREF_TAKE_BOTH not implemented 843 // SYNC_PREF_TAKE_BOTH not implemented
844 break; 844 break;
845 } 845 }
846 return 0; 846 return 0;
847} 847}
848Event* CalendarView::getLastSyncEvent() 848Event* CalendarView::getLastSyncEvent()
849{ 849{
850 Event* lse; 850 Event* lse;
851 //qDebug("CurrentSyncDevice %s ",mCurrentSyncDevice .latin1() ); 851 //qDebug("CurrentSyncDevice %s ",mCurrentSyncDevice .latin1() );
852 lse = mCalendar->event( "last-syncEvent-"+mCurrentSyncDevice ); 852 lse = mCalendar->event( "last-syncEvent-"+mCurrentSyncDevice );
853 if (!lse) { 853 if (!lse) {
854 lse = new Event(); 854 lse = new Event();
855 lse->setUid( "last-syncEvent-"+mCurrentSyncDevice ); 855 lse->setUid( "last-syncEvent-"+mCurrentSyncDevice );
856 QString sum = ""; 856 QString sum = "";
857 if ( mSyncManager->mExternSyncProfiles.contains( mCurrentSyncDevice ) ) 857 if ( mSyncManager->mExternSyncProfiles.contains( mCurrentSyncDevice ) )
858 sum = "E: "; 858 sum = "E: ";
859 lse->setSummary(sum+mCurrentSyncDevice + i18n(" - sync event")); 859 lse->setSummary(sum+mCurrentSyncDevice + i18n(" - sync event"));
860 lse->setDtStart( mLastCalendarSync ); 860 lse->setDtStart( mLastCalendarSync );
861 lse->setDtEnd( mLastCalendarSync.addSecs( 7200 ) ); 861 lse->setDtEnd( mLastCalendarSync.addSecs( 7200 ) );
862 lse->setCategories( i18n("SyncEvent") ); 862 lse->setCategories( i18n("SyncEvent") );
863 lse->setReadOnly( true ); 863 lse->setReadOnly( true );
864 mCalendar->addEvent( lse ); 864 mCalendar->addEvent( lse );
865 } 865 }
866 866
867 return lse; 867 return lse;
868 868
869} 869}
870 870
871// we check, if the to delete event has a id for a profile 871// we check, if the to delete event has a id for a profile
872// if yes, we set this id in the profile to delete 872// if yes, we set this id in the profile to delete
873void CalendarView::checkExternSyncEvent( QPtrList<Event> lastSync , Incidence* toDelete ) 873void CalendarView::checkExternSyncEvent( QPtrList<Event> lastSync , Incidence* toDelete )
874{ 874{
875 if ( lastSync.count() == 0 ) { 875 if ( lastSync.count() == 0 ) {
876 //qDebug(" lastSync.count() == 0"); 876 //qDebug(" lastSync.count() == 0");
877 return; 877 return;
878 } 878 }
879 if ( toDelete->type() == "Journal" ) 879 if ( toDelete->type() == "Journal" )
880 return; 880 return;
881 881
882 Event* eve = lastSync.first(); 882 Event* eve = lastSync.first();
883 883
884 while ( eve ) { 884 while ( eve ) {
885 QString id = toDelete->getID( eve->uid().mid( 15 ) ); // this is the sync profile name 885 QString id = toDelete->getID( eve->uid().mid( 15 ) ); // this is the sync profile name
886 if ( !id.isEmpty() ) { 886 if ( !id.isEmpty() ) {
887 QString des = eve->description(); 887 QString des = eve->description();
888 QString pref = "e"; 888 QString pref = "e";
889 if ( toDelete->type() == "Todo" ) 889 if ( toDelete->type() == "Todo" )
890 pref = "t"; 890 pref = "t";
891 des += pref+ id + ","; 891 des += pref+ id + ",";
892 eve->setReadOnly( false ); 892 eve->setReadOnly( false );
893 eve->setDescription( des ); 893 eve->setDescription( des );
894 //qDebug("setdes %s ", des.latin1()); 894 //qDebug("setdes %s ", des.latin1());
895 eve->setReadOnly( true ); 895 eve->setReadOnly( true );
896 } 896 }
897 eve = lastSync.next(); 897 eve = lastSync.next();
898 } 898 }
899 899
900} 900}
901void CalendarView::checkExternalId( Incidence * inc ) 901void CalendarView::checkExternalId( Incidence * inc )
902{ 902{
903 QPtrList<Event> lastSync = mCalendar->getExternLastSyncEvents() ; 903 QPtrList<Event> lastSync = mCalendar->getExternLastSyncEvents() ;
904 checkExternSyncEvent( lastSync, inc ); 904 checkExternSyncEvent( lastSync, inc );
905 905
906} 906}
907bool CalendarView::synchronizeCalendar( Calendar* local, Calendar* remote, int mode ) 907bool CalendarView::synchronizeCalendar( Calendar* local, Calendar* remote, int mode )
908{ 908{
909 bool syncOK = true; 909 bool syncOK = true;
910 int addedEvent = 0; 910 int addedEvent = 0;
911 int addedEventR = 0; 911 int addedEventR = 0;
912 int deletedEventR = 0; 912 int deletedEventR = 0;
913 int deletedEventL = 0; 913 int deletedEventL = 0;
914 int changedLocal = 0; 914 int changedLocal = 0;
915 int changedRemote = 0; 915 int changedRemote = 0;
916 int filteredIN = 0; 916 int filteredIN = 0;
917 int filteredOUT = 0; 917 int filteredOUT = 0;
918 //QPtrList<Event> el = local->rawEvents(); 918 //QPtrList<Event> el = local->rawEvents();
919 Event* eventR; 919 Event* eventR;
920 QString uid; 920 QString uid;
921 int take; 921 int take;
922 Event* eventL; 922 Event* eventL;
923 Event* eventRSync; 923 Event* eventRSync;
924 Event* eventLSync; 924 Event* eventLSync;
925 QPtrList<Event> eventRSyncSharp = remote->getExternLastSyncEvents(); 925 QPtrList<Event> eventRSyncSharp = remote->getExternLastSyncEvents();
926 QPtrList<Event> eventLSyncSharp = local->getExternLastSyncEvents(); 926 QPtrList<Event> eventLSyncSharp = local->getExternLastSyncEvents();
927 bool fullDateRange = false; 927 bool fullDateRange = false;
928 local->resetTempSyncStat(); 928 local->resetTempSyncStat();
929 mLastCalendarSync = QDateTime::currentDateTime(); 929 mLastCalendarSync = QDateTime::currentDateTime();
930 if ( mSyncManager->syncWithDesktop() ) { 930 if ( mSyncManager->syncWithDesktop() ) {
931 remote->resetPilotStat(1); 931 remote->resetPilotStat(1);
932 if ( KSyncManager::mRequestedSyncEvent.isValid() ) { 932 if ( KSyncManager::mRequestedSyncEvent.isValid() ) {
933 mLastCalendarSync = KSyncManager::mRequestedSyncEvent; 933 mLastCalendarSync = KSyncManager::mRequestedSyncEvent;
934 qDebug("KO: using extern time for calendar sync: %s ", mLastCalendarSync.toString().latin1() ); 934 qDebug("KO: using extern time for calendar sync: %s ", mLastCalendarSync.toString().latin1() );
935 } else { 935 } else {
936 qDebug("KSyncManager::mRequestedSyncEvent has invalid datatime "); 936 qDebug("KSyncManager::mRequestedSyncEvent has invalid datatime ");
937 } 937 }
938 } 938 }
939 QDateTime modifiedCalendar = mLastCalendarSync; 939 QDateTime modifiedCalendar = mLastCalendarSync;
940 eventLSync = getLastSyncEvent(); 940 eventLSync = getLastSyncEvent();
941 eventR = remote->event("last-syncEvent-"+mCurrentSyncName ); 941 eventR = remote->event("last-syncEvent-"+mCurrentSyncName );
942 if ( eventR ) { 942 if ( eventR ) {
943 eventRSync = (Event*) eventR->clone(); 943 eventRSync = (Event*) eventR->clone();
944 remote->deleteEvent(eventR ); 944 remote->deleteEvent(eventR );
945 945
946 } else { 946 } else {
947 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL || mSyncManager->syncWithDesktop()) { 947 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL || mSyncManager->syncWithDesktop()) {
948 eventRSync = (Event*)eventLSync->clone(); 948 eventRSync = (Event*)eventLSync->clone();
949 } else { 949 } else {
950 fullDateRange = true; 950 fullDateRange = true;
951 eventRSync = new Event(); 951 eventRSync = new Event();
952 eventRSync->setSummary(mCurrentSyncName + i18n(" - sync event")); 952 eventRSync->setSummary(mCurrentSyncName + i18n(" - sync event"));
953 eventRSync->setUid("last-syncEvent-"+mCurrentSyncName ); 953 eventRSync->setUid("last-syncEvent-"+mCurrentSyncName );
954 eventRSync->setDtStart( mLastCalendarSync ); 954 eventRSync->setDtStart( mLastCalendarSync );
955 eventRSync->setDtEnd( mLastCalendarSync.addSecs( 7200 ) ); 955 eventRSync->setDtEnd( mLastCalendarSync.addSecs( 7200 ) );
956 eventRSync->setCategories( i18n("SyncEvent") ); 956 eventRSync->setCategories( i18n("SyncEvent") );
957 } 957 }
958 } 958 }
959 if ( eventLSync->dtStart() == mLastCalendarSync ) 959 if ( eventLSync->dtStart() == mLastCalendarSync )
960 fullDateRange = true; 960 fullDateRange = true;
961 961
962 if ( ! fullDateRange ) { 962 if ( ! fullDateRange ) {
963 if ( eventLSync->dtStart() != eventRSync->dtStart() ) { 963 if ( eventLSync->dtStart() != eventRSync->dtStart() ) {
964 964
965 // qDebug("set fulldate to true %s %s" ,eventLSync->dtStart().toString().latin1(), eventRSync->dtStart().toString().latin1() ); 965 // qDebug("set fulldate to true %s %s" ,eventLSync->dtStart().toString().latin1(), eventRSync->dtStart().toString().latin1() );
966 //qDebug("%d %d %d %d ", eventLSync->dtStart().time().second(), eventLSync->dtStart().time().msec() , eventRSync->dtStart().time().second(), eventRSync->dtStart().time().msec()); 966 //qDebug("%d %d %d %d ", eventLSync->dtStart().time().second(), eventLSync->dtStart().time().msec() , eventRSync->dtStart().time().second(), eventRSync->dtStart().time().msec());
967 fullDateRange = true; 967 fullDateRange = true;
968 } 968 }
969 } 969 }
970 if ( mSyncManager->syncWithDesktop() ) { 970 if ( mSyncManager->syncWithDesktop() ) {
971 fullDateRange = ( eventLSync->dtStart() <= mLastCalendarSync && eventLSync->dtStart().addSecs(1) >= mLastCalendarSync ); 971 fullDateRange = ( eventLSync->dtStart() <= mLastCalendarSync && eventLSync->dtStart().addSecs(1) >= mLastCalendarSync );
972 } 972 }
973 if ( fullDateRange ) 973 if ( fullDateRange )
974 mLastCalendarSync = QDateTime::currentDateTime().addDays( -100*365); 974 mLastCalendarSync = QDateTime::currentDateTime().addDays( -100*365);
975 else 975 else
976 mLastCalendarSync = eventLSync->dtStart(); 976 mLastCalendarSync = eventLSync->dtStart();
977 // for resyncing if own file has changed 977 // for resyncing if own file has changed
978 if ( mCurrentSyncDevice == "deleteaftersync" ) { 978 if ( mCurrentSyncDevice == "deleteaftersync" ) {
979 mLastCalendarSync = loadedFileVersion; 979 mLastCalendarSync = loadedFileVersion;
980 //qDebug("setting mLastCalendarSync "); 980 //qDebug("setting mLastCalendarSync ");
981 } 981 }
982 //qDebug("*************************** "); 982 //qDebug("*************************** ");
983 qDebug("KO: mLastCalendarSync %s .Full: %d",mLastCalendarSync.toString().latin1(), fullDateRange); 983 qDebug("KO: mLastCalendarSync %s .Full: %d",mLastCalendarSync.toString().latin1(), fullDateRange);
984 QPtrList<Incidence> er = remote->rawIncidences(); 984 QPtrList<Incidence> er = remote->rawIncidences();
985 Incidence* inR = er.first(); 985 Incidence* inR = er.first();
986 Incidence* inL; 986 Incidence* inL;
987 QProgressBar bar( er.count(),0 ); 987 QProgressBar bar( er.count(),0 );
988 bar.setCaption (i18n("Syncing - close to abort!") ); 988 bar.setCaption (i18n("Syncing - close to abort!") );
989 989
990 // ************** setting up filter ************* 990 // ************** setting up filter *************
991 CalFilter *filterIN = 0; 991 CalFilter *filterIN = 0;
992 CalFilter *filterOUT = 0; 992 CalFilter *filterOUT = 0;
993 CalFilter *filter = mFilters.first(); 993 CalFilter *filter = mFilters.first();
994 while(filter) { 994 while(filter) {
995 if ( filter->name() == mSyncManager->mFilterInCal ) 995 if ( filter->name() == mSyncManager->mFilterInCal )
996 filterIN = filter; 996 filterIN = filter;
997 if ( filter->name() == mSyncManager->mFilterOutCal ) 997 if ( filter->name() == mSyncManager->mFilterOutCal )
998 filterOUT = filter; 998 filterOUT = filter;
999 filter = mFilters.next(); 999 filter = mFilters.next();
1000 } 1000 }
1001 int w = 300; 1001 int w = 300;
1002 if ( QApplication::desktop()->width() < 320 ) 1002 if ( QApplication::desktop()->width() < 320 )
1003 w = 220; 1003 w = 220;
1004 int h = bar.sizeHint().height() ; 1004 int h = bar.sizeHint().height() ;
1005 int dw = QApplication::desktop()->width(); 1005 int dw = QApplication::desktop()->width();
1006 int dh = QApplication::desktop()->height(); 1006 int dh = QApplication::desktop()->height();
1007 bar.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); 1007 bar.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
1008 bar.show(); 1008 bar.show();
1009 int modulo = (er.count()/10)+1; 1009 int modulo = (er.count()/10)+1;
1010 int incCounter = 0; 1010 int incCounter = 0;
1011 while ( inR ) { 1011 while ( inR ) {
1012 if ( ! bar.isVisible() ) 1012 if ( ! bar.isVisible() )
1013 return false; 1013 return false;
1014 if ( incCounter % modulo == 0 ) 1014 if ( incCounter % modulo == 0 )
1015 bar.setProgress( incCounter ); 1015 bar.setProgress( incCounter );
1016 ++incCounter; 1016 ++incCounter;
1017 uid = inR->uid(); 1017 uid = inR->uid();
1018 bool skipIncidence = false; 1018 bool skipIncidence = false;
1019 if ( uid.left(15) == QString("last-syncEvent-") ) 1019 if ( uid.left(15) == QString("last-syncEvent-") )
1020 skipIncidence = true; 1020 skipIncidence = true;
1021 QString idS; 1021 QString idS;
1022 qApp->processEvents(); 1022 qApp->processEvents();
1023 if ( !skipIncidence ) { 1023 if ( !skipIncidence ) {
1024 inL = local->incidence( uid ); 1024 inL = local->incidence( uid );
1025 if ( inL ) { // maybe conflict - same uid in both calendars 1025 if ( inL ) { // maybe conflict - same uid in both calendars
1026 if ( (take = takeEvent( inL, inR, mode, fullDateRange )) > 0 ) { 1026 if ( (take = takeEvent( inL, inR, mode, fullDateRange )) > 0 ) {
1027 //qDebug("take %d %s ", take, inL->summary().latin1()); 1027 //qDebug("take %d %s ", take, inL->summary().latin1());
1028 if ( take == 3 ) 1028 if ( take == 3 )
1029 return false; 1029 return false;
1030 if ( take == 1 ) {// take local ********************** 1030 if ( take == 1 ) {// take local **********************
1031 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) 1031 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL )
1032 inL->setCsum( mCurrentSyncDevice, inR->getCsum(mCurrentSyncDevice) ); 1032 inL->setCsum( mCurrentSyncDevice, inR->getCsum(mCurrentSyncDevice) );
1033 else 1033 else
1034 idS = inR->IDStr(); 1034 idS = inR->IDStr();
1035 remote->deleteIncidence( inR ); 1035 remote->deleteIncidence( inR );
1036 inR = inL->clone(); 1036 inR = inL->clone();
1037 inR->setTempSyncStat( SYNC_TEMPSTATE_INITIAL ); 1037 inR->setTempSyncStat( SYNC_TEMPSTATE_INITIAL );
1038 if ( mGlobalSyncMode != SYNC_MODE_EXTERNAL ) 1038 if ( mGlobalSyncMode != SYNC_MODE_EXTERNAL )
1039 inR->setIDStr( idS ); 1039 inR->setIDStr( idS );
1040 remote->addIncidence( inR ); 1040 remote->addIncidence( inR );
1041 if ( mSyncManager->syncWithDesktop() ) 1041 if ( mSyncManager->syncWithDesktop() )
1042 inR->setPilotId( 2 ); 1042 inR->setPilotId( 2 );
1043 ++changedRemote; 1043 ++changedRemote;
1044 } else {// take remote ********************** 1044 } else {// take remote **********************
1045 idS = inL->IDStr(); 1045 idS = inL->IDStr();
1046 int pid = inL->pilotId(); 1046 int pid = inL->pilotId();
1047 local->deleteIncidence( inL ); 1047 local->deleteIncidence( inL );
1048 inL = inR->clone(); 1048 inL = inR->clone();
1049 if ( mSyncManager->syncWithDesktop() ) 1049 if ( mSyncManager->syncWithDesktop() )
1050 inL->setPilotId( pid ); 1050 inL->setPilotId( pid );
1051 inL->setIDStr( idS ); 1051 inL->setIDStr( idS );
1052 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 1052 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
1053 inL->setCsum( mCurrentSyncDevice, inR->getCsum(mCurrentSyncDevice) ); 1053 inL->setCsum( mCurrentSyncDevice, inR->getCsum(mCurrentSyncDevice) );
1054 inL->setID( mCurrentSyncDevice, inR->getID(mCurrentSyncDevice) ); 1054 inL->setID( mCurrentSyncDevice, inR->getID(mCurrentSyncDevice) );
1055 } 1055 }
1056 local->addIncidence( inL ); 1056 local->addIncidence( inL );
1057 ++changedLocal; 1057 ++changedLocal;
1058 } 1058 }
1059 } 1059 }
1060 } else { // no conflict ********** add or delete remote 1060 } else { // no conflict ********** add or delete remote
1061 if ( !filterIN || filterIN->filterCalendarItem( inR ) ){ 1061 if ( !filterIN || filterIN->filterCalendarItem( inR ) ){
1062 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 1062 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
1063 QString des = eventLSync->description(); 1063 QString des = eventLSync->description();
1064 QString pref = "e"; 1064 QString pref = "e";
1065 if ( inR->type() == "Todo" ) 1065 if ( inR->type() == "Todo" )
1066 pref = "t"; 1066 pref = "t";
1067 if ( des.find(pref+ inR->getID(mCurrentSyncDevice) +"," ) >= 0 && mode != 5) { // delete it 1067 if ( des.find(pref+ inR->getID(mCurrentSyncDevice) +"," ) >= 0 && mode != 5) { // delete it
1068 inR->setTempSyncStat( SYNC_TEMPSTATE_DELETE ); 1068 inR->setTempSyncStat( SYNC_TEMPSTATE_DELETE );
1069 //remote->deleteIncidence( inR ); 1069 //remote->deleteIncidence( inR );
1070 ++deletedEventR; 1070 ++deletedEventR;
1071 } else { 1071 } else {
1072 inR->setLastModified( modifiedCalendar ); 1072 inR->setLastModified( modifiedCalendar );
1073 inL = inR->clone(); 1073 inL = inR->clone();
1074 inL->setIDStr( ":" ); 1074 inL->setIDStr( ":" );
1075 inL->setCsum( mCurrentSyncDevice, inR->getCsum(mCurrentSyncDevice) ); 1075 inL->setCsum( mCurrentSyncDevice, inR->getCsum(mCurrentSyncDevice) );
1076 inL->setID( mCurrentSyncDevice, inR->getID(mCurrentSyncDevice) ); 1076 inL->setID( mCurrentSyncDevice, inR->getID(mCurrentSyncDevice) );
1077 local->addIncidence( inL ); 1077 local->addIncidence( inL );
1078 ++addedEvent; 1078 ++addedEvent;
1079 1079
1080 } 1080 }
1081 } else { 1081 } else {
1082 if ( inR->lastModified() > mLastCalendarSync || mode == 5 ) { 1082 if ( inR->lastModified() > mLastCalendarSync || mode == 5 ) {
1083 inR->setLastModified( modifiedCalendar ); 1083 inR->setLastModified( modifiedCalendar );
1084 inL = inR->clone(); 1084 inL = inR->clone();
1085 inL->setIDStr( ":" ); 1085 inL->setIDStr( ":" );
1086 local->addIncidence( inL ); 1086 local->addIncidence( inL );
1087 ++addedEvent; 1087 ++addedEvent;
1088 1088
1089 } else { 1089 } else {
1090 checkExternSyncEvent(eventRSyncSharp, inR); 1090 checkExternSyncEvent(eventRSyncSharp, inR);
1091 remote->deleteIncidence( inR ); 1091 remote->deleteIncidence( inR );
1092 ++deletedEventR; 1092 ++deletedEventR;
1093 } 1093 }
1094 } 1094 }
1095 } else { 1095 } else {
1096 ++filteredIN; 1096 ++filteredIN;
1097 } 1097 }
1098 } 1098 }
1099 } 1099 }
1100 inR = er.next(); 1100 inR = er.next();
1101 } 1101 }
1102 QPtrList<Incidence> el = local->rawIncidences(); 1102 QPtrList<Incidence> el = local->rawIncidences();
1103 inL = el.first(); 1103 inL = el.first();
1104 modulo = (el.count()/10)+1; 1104 modulo = (el.count()/10)+1;
1105 bar.setCaption (i18n("Add / remove events") ); 1105 bar.setCaption (i18n("Add / remove events") );
1106 bar.setTotalSteps ( el.count() ) ; 1106 bar.setTotalSteps ( el.count() ) ;
1107 bar.show(); 1107 bar.show();
1108 incCounter = 0; 1108 incCounter = 0;
1109 1109
1110 while ( inL ) { 1110 while ( inL ) {
1111 1111
1112 qApp->processEvents(); 1112 qApp->processEvents();
1113 if ( ! bar.isVisible() ) 1113 if ( ! bar.isVisible() )
1114 return false; 1114 return false;
1115 if ( incCounter % modulo == 0 ) 1115 if ( incCounter % modulo == 0 )
1116 bar.setProgress( incCounter ); 1116 bar.setProgress( incCounter );
1117 ++incCounter; 1117 ++incCounter;
1118 uid = inL->uid(); 1118 uid = inL->uid();
1119 bool skipIncidence = false; 1119 bool skipIncidence = false;
1120 if ( uid.left(15) == QString("last-syncEvent-") ) 1120 if ( uid.left(15) == QString("last-syncEvent-") )
1121 skipIncidence = true; 1121 skipIncidence = true;
1122 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL && inL->type() == "Journal" ) 1122 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL && inL->type() == "Journal" )
1123 skipIncidence = true; 1123 skipIncidence = true;
1124 if ( !skipIncidence ) { 1124 if ( !skipIncidence ) {
1125 inR = remote->incidence( uid ); 1125 inR = remote->incidence( uid );
1126 if ( ! inR ) { 1126 if ( ! inR ) {
1127 if ( !filterOUT || filterOUT->filterCalendarItem( inL ) ){ 1127 if ( !filterOUT || filterOUT->filterCalendarItem( inL ) ){
1128 // no conflict ********** add or delete local 1128 // no conflict ********** add or delete local
1129 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 1129 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
1130 if ( !inL->getID(mCurrentSyncDevice).isEmpty() && mode != 4 ) { 1130 if ( !inL->getID(mCurrentSyncDevice).isEmpty() && mode != 4 ) {
1131 checkExternSyncEvent(eventLSyncSharp, inL); 1131 checkExternSyncEvent(eventLSyncSharp, inL);
1132 local->deleteIncidence( inL ); 1132 local->deleteIncidence( inL );
1133 ++deletedEventL; 1133 ++deletedEventL;
1134 } else { 1134 } else {
1135 if ( ! mSyncManager->mWriteBackExistingOnly ) { 1135 if ( ! mSyncManager->mWriteBackExistingOnly ) {
1136 inL->removeID(mCurrentSyncDevice ); 1136 inL->removeID(mCurrentSyncDevice );
1137 ++addedEventR; 1137 ++addedEventR;
1138 //qDebug("remote added Incidence %s ", inL->summary().latin1()); 1138 //qDebug("remote added Incidence %s ", inL->summary().latin1());
1139 inL->setLastModified( modifiedCalendar ); 1139 inL->setLastModified( modifiedCalendar );
1140 inR = inL->clone(); 1140 inR = inL->clone();
1141 inR->setIDStr( ":" ); 1141 inR->setIDStr( ":" );
1142 inR->setTempSyncStat( SYNC_TEMPSTATE_INITIAL ); 1142 inR->setTempSyncStat( SYNC_TEMPSTATE_INITIAL );
1143 remote->addIncidence( inR ); 1143 remote->addIncidence( inR );
1144 } 1144 }
1145 } 1145 }
1146 } else { 1146 } else {
1147 if ( inL->lastModified() < mLastCalendarSync && mode != 4 ) { 1147 if ( inL->lastModified() < mLastCalendarSync && mode != 4 ) {
1148 checkExternSyncEvent(eventLSyncSharp, inL); 1148 checkExternSyncEvent(eventLSyncSharp, inL);
1149 local->deleteIncidence( inL ); 1149 local->deleteIncidence( inL );
1150 ++deletedEventL; 1150 ++deletedEventL;
1151 } else { 1151 } else {
1152 if ( ! mSyncManager->mWriteBackExistingOnly ) { 1152 if ( ! mSyncManager->mWriteBackExistingOnly ) {
1153 ++addedEventR; 1153 ++addedEventR;
1154 inL->setLastModified( modifiedCalendar ); 1154 inL->setLastModified( modifiedCalendar );
1155 inR = inL->clone(); 1155 inR = inL->clone();
1156 inR->setIDStr( ":" ); 1156 inR->setIDStr( ":" );
1157 remote->addIncidence( inR ); 1157 remote->addIncidence( inR );
1158 } 1158 }
1159 } 1159 }
1160 } 1160 }
1161 } else { 1161 } else {
1162 ++filteredOUT; 1162 ++filteredOUT;
1163 } 1163 }
1164 } 1164 }
1165 } 1165 }
1166 inL = el.next(); 1166 inL = el.next();
1167 } 1167 }
1168 int delFut = 0; 1168 int delFut = 0;
1169 int remRem = 0; 1169 int remRem = 0;
1170 if ( mSyncManager->mWriteBackInFuture ) { 1170 if ( mSyncManager->mWriteBackInFuture ) {
1171 er = remote->rawIncidences(); 1171 er = remote->rawIncidences();
1172 remRem = er.count(); 1172 remRem = er.count();
1173 inR = er.first(); 1173 inR = er.first();
1174 QDateTime dt; 1174 QDateTime dt;
1175 QDateTime cur = QDateTime::currentDateTime().addDays( -(mSyncManager->mWriteBackInPast * 7) ); 1175 QDateTime cur = QDateTime::currentDateTime().addDays( -(mSyncManager->mWriteBackInPast * 7) );
1176 QDateTime end = QDateTime::currentDateTime().addDays( (mSyncManager->mWriteBackInFuture ) *7 ); 1176 QDateTime end = QDateTime::currentDateTime().addDays( (mSyncManager->mWriteBackInFuture ) *7 );
1177 while ( inR ) { 1177 while ( inR ) {
1178 if ( inR->type() == "Todo" ) { 1178 if ( inR->type() == "Todo" ) {
1179 Todo * t = (Todo*)inR; 1179 Todo * t = (Todo*)inR;
1180 if ( t->hasDueDate() ) 1180 if ( t->hasDueDate() )
1181 dt = t->dtDue(); 1181 dt = t->dtDue();
1182 else 1182 else
1183 dt = cur.addSecs( 62 ); 1183 dt = cur.addSecs( 62 );
1184 } 1184 }
1185 else if (inR->type() == "Event" ) { 1185 else if (inR->type() == "Event" ) {
1186 bool ok; 1186 bool ok;
1187 dt = inR->getNextOccurence( cur, &ok ); 1187 dt = inR->getNextOccurence( cur, &ok );
1188 if ( !ok ) 1188 if ( !ok )
1189 dt = cur.addSecs( -62 ); 1189 dt = cur.addSecs( -62 );
1190 } 1190 }
1191 else 1191 else
1192 dt = inR->dtStart(); 1192 dt = inR->dtStart();
1193 if ( dt < cur || dt > end ) { 1193 if ( dt < cur || dt > end ) {
1194 remote->deleteIncidence( inR ); 1194 remote->deleteIncidence( inR );
1195 ++delFut; 1195 ++delFut;
1196 } 1196 }
1197 inR = er.next(); 1197 inR = er.next();
1198 } 1198 }
1199 } 1199 }
1200 bar.hide(); 1200 bar.hide();
1201 mLastCalendarSync = QDateTime::currentDateTime().addSecs( 1 ); 1201 mLastCalendarSync = QDateTime::currentDateTime().addSecs( 1 );
1202 eventLSync->setReadOnly( false ); 1202 eventLSync->setReadOnly( false );
1203 eventLSync->setDtStart( mLastCalendarSync ); 1203 eventLSync->setDtStart( mLastCalendarSync );
1204 eventRSync->setDtStart( mLastCalendarSync ); 1204 eventRSync->setDtStart( mLastCalendarSync );
1205 eventLSync->setDtEnd( mLastCalendarSync.addSecs( 3600 ) ); 1205 eventLSync->setDtEnd( mLastCalendarSync.addSecs( 3600 ) );
1206 eventRSync->setDtEnd( mLastCalendarSync.addSecs( 3600 ) ); 1206 eventRSync->setDtEnd( mLastCalendarSync.addSecs( 3600 ) );
1207 eventRSync->setLocation( i18n("Remote from: ")+mCurrentSyncName ) ; 1207 eventRSync->setLocation( i18n("Remote from: ")+mCurrentSyncName ) ;
1208 eventLSync->setLocation(i18n("Local from: ") + mCurrentSyncName ); 1208 eventLSync->setLocation(i18n("Local from: ") + mCurrentSyncName );
1209 eventLSync->setReadOnly( true ); 1209 eventLSync->setReadOnly( true );
1210 qDebug("KO: Normal sync: %d ",mGlobalSyncMode == SYNC_MODE_NORMAL ); 1210 qDebug("KO: Normal sync: %d ",mGlobalSyncMode == SYNC_MODE_NORMAL );
1211 if ( mGlobalSyncMode == SYNC_MODE_NORMAL && !mSyncManager->syncWithDesktop()) // kde is abnormal... 1211 if ( mGlobalSyncMode == SYNC_MODE_NORMAL && !mSyncManager->syncWithDesktop()) // kde is abnormal...
1212 remote->addEvent( eventRSync ); 1212 remote->addEvent( eventRSync );
1213 else 1213 else
1214 delete eventRSync; 1214 delete eventRSync;
1215 qDebug("KO: Sync with desktop %d ",mSyncManager->syncWithDesktop() ); 1215 qDebug("KO: Sync with desktop %d ",mSyncManager->syncWithDesktop() );
1216 QString mes; 1216 QString mes;
1217 mes .sprintf( i18n("Synchronization summary:\n\n %d items added to local\n %d items added to remote\n %d items updated on local\n %d items updated on remote\n %d items deleted on local\n %d items deleted on remote\n %d incoming filtered out\n %d outgoing filtered out\n"),addedEvent, addedEventR, changedLocal, changedRemote, deletedEventL, deletedEventR, filteredIN, filteredOUT ); 1217 mes .sprintf( i18n("Synchronization summary:\n\n %d items added to local\n %d items added to remote\n %d items updated on local\n %d items updated on remote\n %d items deleted on local\n %d items deleted on remote\n %d incoming filtered out\n %d outgoing filtered out\n"),addedEvent, addedEventR, changedLocal, changedRemote, deletedEventL, deletedEventR, filteredIN, filteredOUT );
1218 QString delmess; 1218 QString delmess;
1219 if ( delFut ) { 1219 if ( delFut ) {
1220 delmess.sprintf( i18n("%d items skipped on remote,\nbecause they are more\nthan %d weeks in the past or\nmore than %d weeks in the future.\nAfter skipping, remote has\n%d calendar/todo items."), delFut,mSyncManager->mWriteBackInPast,mSyncManager->mWriteBackInFuture, remRem-delFut); 1220 delmess.sprintf( i18n("%d items skipped on remote,\nbecause they are more\nthan %d weeks in the past or\nmore than %d weeks in the future.\nAfter skipping, remote has\n%d calendar/todo items."), delFut,mSyncManager->mWriteBackInPast,mSyncManager->mWriteBackInFuture, remRem-delFut);
1221 mes += delmess; 1221 mes += delmess;
1222 } 1222 }
1223 mes = i18n("Local calendar changed!\n") +mes; 1223 mes = i18n("Local calendar changed!\n") +mes;
1224 mCalendar->checkAlarmForIncidence( 0, true ); 1224 mCalendar->checkAlarmForIncidence( 0, true );
1225 qDebug( mes ); 1225 qDebug( mes );
1226 if ( mSyncManager->mShowSyncSummary ) { 1226 if ( mSyncManager->mShowSyncSummary ) {
1227 if ( KMessageBox::Cancel == KMessageBox::warningContinueCancel(this, mes, 1227 if ( KMessageBox::Cancel == KMessageBox::warningContinueCancel(this, mes,
1228 i18n("KO/Pi Synchronization"),i18n("Write back"))) { 1228 i18n("KO/Pi Synchronization"),i18n("Write back"))) {
1229 qDebug("KO: WB cancelled "); 1229 qDebug("KO: WB cancelled ");
1230 return false; 1230 mSyncManager->mWriteBackFile = false;
1231 return syncOK;
1231 } 1232 }
1232 } 1233 }
1233 return syncOK; 1234 return syncOK;
1234} 1235}
1235 1236
1236void CalendarView::setSyncDevice( QString s ) 1237void CalendarView::setSyncDevice( QString s )
1237{ 1238{
1238 mCurrentSyncDevice= s; 1239 mCurrentSyncDevice= s;
1239} 1240}
1240void CalendarView::setSyncName( QString s ) 1241void CalendarView::setSyncName( QString s )
1241{ 1242{
1242 mCurrentSyncName= s; 1243 mCurrentSyncName= s;
1243} 1244}
1244bool CalendarView::syncCalendar(QString filename, int mode) 1245bool CalendarView::syncCalendar(QString filename, int mode)
1245{ 1246{
1246 //qDebug("syncCalendar %s ", filename.latin1()); 1247 //qDebug("syncCalendar %s ", filename.latin1());
1247 mGlobalSyncMode = SYNC_MODE_NORMAL; 1248 mGlobalSyncMode = SYNC_MODE_NORMAL;
1248 CalendarLocal* calendar = new CalendarLocal(); 1249 CalendarLocal* calendar = new CalendarLocal();
1249 calendar->setTimeZoneId(KPimGlobalPrefs::instance()->mTimeZoneId); 1250 calendar->setTimeZoneId(KPimGlobalPrefs::instance()->mTimeZoneId);
1250 FileStorage* storage = new FileStorage( calendar ); 1251 FileStorage* storage = new FileStorage( calendar );
1251 bool syncOK = false; 1252 bool syncOK = false;
1252 storage->setFileName( filename ); 1253 storage->setFileName( filename );
1253 // qDebug("loading ... "); 1254 // qDebug("loading ... ");
1254 if ( storage->load() ) { 1255 if ( storage->load() ) {
1255 getEventViewerDialog()->setSyncMode( true ); 1256 getEventViewerDialog()->setSyncMode( true );
1256 syncOK = synchronizeCalendar( mCalendar, calendar, mode ); 1257 syncOK = synchronizeCalendar( mCalendar, calendar, mode );
1257 getEventViewerDialog()->setSyncMode( false ); 1258 getEventViewerDialog()->setSyncMode( false );
1258 if ( syncOK ) { 1259 if ( syncOK ) {
1259 if ( mSyncManager->mWriteBackFile ) 1260 if ( mSyncManager->mWriteBackFile )
1260 { 1261 {
1261 storage->setSaveFormat( new ICalFormat() ); 1262 storage->setSaveFormat( new ICalFormat() );
1262 storage->save(); 1263 storage->save();
1263 } 1264 }
1264 } 1265 }
1265 setModified( true ); 1266 setModified( true );
1266 } 1267 }
1267 delete storage; 1268 delete storage;
1268 delete calendar; 1269 delete calendar;
1269 if ( syncOK ) 1270 if ( syncOK )
1270 updateView(); 1271 updateView();
1271 return syncOK; 1272 return syncOK;
1272} 1273}
1273 1274
1274void CalendarView::syncExternal( int mode ) 1275void CalendarView::syncExternal( int mode )
1275{ 1276{
1276 mGlobalSyncMode = SYNC_MODE_EXTERNAL; 1277 mGlobalSyncMode = SYNC_MODE_EXTERNAL;
1277 1278
1278 qApp->processEvents(); 1279 qApp->processEvents();
1279 CalendarLocal* calendar = new CalendarLocal(); 1280 CalendarLocal* calendar = new CalendarLocal();
1280 calendar->setTimeZoneId(KPimGlobalPrefs::instance()->mTimeZoneId); 1281 calendar->setTimeZoneId(KPimGlobalPrefs::instance()->mTimeZoneId);
1281 bool syncOK = false; 1282 bool syncOK = false;
1282 bool loadSuccess = false; 1283 bool loadSuccess = false;
1283 PhoneFormat* phoneFormat = 0; 1284 PhoneFormat* phoneFormat = 0;
1284 emit tempDisableBR(true); 1285 emit tempDisableBR(true);
1285#ifndef DESKTOP_VERSION 1286#ifndef DESKTOP_VERSION
1286 SharpFormat* sharpFormat = 0; 1287 SharpFormat* sharpFormat = 0;
1287 if ( mode == 0 ) { // sharp 1288 if ( mode == 0 ) { // sharp
1288 sharpFormat = new SharpFormat () ; 1289 sharpFormat = new SharpFormat () ;
1289 loadSuccess = sharpFormat->load( calendar, mCalendar ); 1290 loadSuccess = sharpFormat->load( calendar, mCalendar );
1290 1291
1291 } else 1292 } else
1292#endif 1293#endif
1293 if ( mode == 1 ) { // phone 1294 if ( mode == 1 ) { // phone
1294 phoneFormat = new PhoneFormat (mCurrentSyncDevice, 1295 phoneFormat = new PhoneFormat (mCurrentSyncDevice,
1295 mSyncManager->mPhoneDevice, 1296 mSyncManager->mPhoneDevice,
1296 mSyncManager->mPhoneConnection, 1297 mSyncManager->mPhoneConnection,
1297 mSyncManager->mPhoneModel); 1298 mSyncManager->mPhoneModel);
1298 loadSuccess = phoneFormat->load( calendar,mCalendar); 1299 loadSuccess = phoneFormat->load( calendar,mCalendar);
1299 1300
1300 } else { 1301 } else {
1301 emit tempDisableBR(false); 1302 emit tempDisableBR(false);
1302 return; 1303 return;
1303 } 1304 }
1304 if ( loadSuccess ) { 1305 if ( loadSuccess ) {
1305 getEventViewerDialog()->setSyncMode( true ); 1306 getEventViewerDialog()->setSyncMode( true );
1306 syncOK = synchronizeCalendar( mCalendar, calendar, mSyncManager->mSyncAlgoPrefs ); 1307 syncOK = synchronizeCalendar( mCalendar, calendar, mSyncManager->mSyncAlgoPrefs );
1307 getEventViewerDialog()->setSyncMode( false ); 1308 getEventViewerDialog()->setSyncMode( false );
1308 qApp->processEvents(); 1309 qApp->processEvents();
1309 if ( syncOK ) { 1310 if ( syncOK ) {
1310 if ( mSyncManager->mWriteBackFile ) 1311 if ( mSyncManager->mWriteBackFile )
1311 { 1312 {
1312 QPtrList<Incidence> iL = mCalendar->rawIncidences(); 1313 QPtrList<Incidence> iL = mCalendar->rawIncidences();
1313 Incidence* inc = iL.first(); 1314 Incidence* inc = iL.first();
1314 if ( phoneFormat ) { 1315 if ( phoneFormat ) {
1315 while ( inc ) { 1316 while ( inc ) {
1316 inc->removeID(mCurrentSyncDevice); 1317 inc->removeID(mCurrentSyncDevice);
1317 inc = iL.next(); 1318 inc = iL.next();
1318 } 1319 }
1319 } 1320 }
1320#ifndef DESKTOP_VERSION 1321#ifndef DESKTOP_VERSION
1321 if ( sharpFormat ) 1322 if ( sharpFormat )
1322 sharpFormat->save(calendar); 1323 sharpFormat->save(calendar);
1323#endif 1324#endif
1324 if ( phoneFormat ) 1325 if ( phoneFormat )
1325 phoneFormat->save(calendar); 1326 phoneFormat->save(calendar);
1326 iL = calendar->rawIncidences(); 1327 iL = calendar->rawIncidences();
1327 inc = iL.first(); 1328 inc = iL.first();
1328 Incidence* loc; 1329 Incidence* loc;
1329 while ( inc ) { 1330 while ( inc ) {
1330 if ( inc->tempSyncStat() == SYNC_TEMPSTATE_NEW_ID ) { 1331 if ( inc->tempSyncStat() == SYNC_TEMPSTATE_NEW_ID ) {
1331 loc = mCalendar->incidence(inc->uid() ); 1332 loc = mCalendar->incidence(inc->uid() );
1332 if ( loc ) { 1333 if ( loc ) {
1333 loc->setID(mCurrentSyncDevice, inc->getID(mCurrentSyncDevice) ); 1334 loc->setID(mCurrentSyncDevice, inc->getID(mCurrentSyncDevice) );
1334 loc->setCsum( mCurrentSyncDevice, inc->getCsum(mCurrentSyncDevice) ); 1335 loc->setCsum( mCurrentSyncDevice, inc->getCsum(mCurrentSyncDevice) );
1335 } 1336 }
1336 } 1337 }
1337 inc = iL.next(); 1338 inc = iL.next();
1338 } 1339 }
1339 Incidence* lse = getLastSyncEvent(); 1340 Incidence* lse = getLastSyncEvent();
1340 if ( lse ) { 1341 if ( lse ) {
1341 lse->setReadOnly( false ); 1342 lse->setReadOnly( false );
1342 lse->setDescription( "" ); 1343 lse->setDescription( "" );
1343 lse->setReadOnly( true ); 1344 lse->setReadOnly( true );
1344 } 1345 }
1345 } 1346 }
1346 } else { 1347 } else {
1347 topLevelWidget()->setCaption( i18n("Sync cancelled or failed.") ); 1348 topLevelWidget()->setCaption( i18n("Sync cancelled or failed.") );
1348 } 1349 }
1349 setModified( true ); 1350 setModified( true );
1350 } else { 1351 } else {
1351 QString question = i18n("Sorry, the database access\ncommand failed!\n\nNothing synced!\n") ; 1352 QString question = i18n("Sorry, the database access\ncommand failed!\n\nNothing synced!\n") ;
1352 QMessageBox::information( 0, i18n("KO/Pi Import - ERROR"), 1353 QMessageBox::information( 0, i18n("KO/Pi Import - ERROR"),
1353 question, i18n("Ok")) ; 1354 question, i18n("Ok")) ;
1354 1355
1355 } 1356 }
1356 delete calendar; 1357 delete calendar;
1357 updateView(); 1358 updateView();
1358 emit tempDisableBR(false); 1359 emit tempDisableBR(false);
1359 return ;//syncOK; 1360 return ;//syncOK;
1360 1361
1361} 1362}
1362 1363
1363bool CalendarView::importBday() 1364bool CalendarView::importBday()
1364{ 1365{
1365#ifndef KORG_NOKABC 1366#ifndef KORG_NOKABC
1366 1367
1367#ifdef DESKTOP_VERSION 1368#ifdef DESKTOP_VERSION
1368 KABC::StdAddressBook* AddressBook = KABC::StdAddressBook::self( true ); 1369 KABC::StdAddressBook* AddressBook = KABC::StdAddressBook::self( true );
1369 KABC::AddressBook::Iterator it; 1370 KABC::AddressBook::Iterator it;
1370 int count = 0; 1371 int count = 0;
1371 for( it = AddressBook->begin(); it != AddressBook->end(); ++it ) { 1372 for( it = AddressBook->begin(); it != AddressBook->end(); ++it ) {
1372 ++count; 1373 ++count;
1373 } 1374 }
1374 QProgressBar bar(count,0 ); 1375 QProgressBar bar(count,0 );
1375 int w = 300; 1376 int w = 300;
1376 if ( QApplication::desktop()->width() < 320 ) 1377 if ( QApplication::desktop()->width() < 320 )
1377 w = 220; 1378 w = 220;
1378 int h = bar.sizeHint().height() ; 1379 int h = bar.sizeHint().height() ;
1379 int dw = QApplication::desktop()->width(); 1380 int dw = QApplication::desktop()->width();
1380 int dh = QApplication::desktop()->height(); 1381 int dh = QApplication::desktop()->height();
1381 bar.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); 1382 bar.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
1382 bar.show(); 1383 bar.show();
1383 bar.setCaption (i18n("Reading addressbook - close to abort!") ); 1384 bar.setCaption (i18n("Reading addressbook - close to abort!") );
1384 qApp->processEvents(); 1385 qApp->processEvents();
1385 count = 0; 1386 count = 0;
1386 int addCount = 0; 1387 int addCount = 0;
1387 KCal::Attendee* a = 0; 1388 KCal::Attendee* a = 0;
1388 for( it = AddressBook->begin(); it != AddressBook->end(); ++it ) { 1389 for( it = AddressBook->begin(); it != AddressBook->end(); ++it ) {
1389 if ( ! bar.isVisible() ) 1390 if ( ! bar.isVisible() )
1390 return false; 1391 return false;
1391 bar.setProgress( count++ ); 1392 bar.setProgress( count++ );
1392 qApp->processEvents(); 1393 qApp->processEvents();
1393 //qDebug("add BDay %s %s", (*it).realName().latin1(),(*it).birthday().date().toString().latin1() ); 1394 //qDebug("add BDay %s %s", (*it).realName().latin1(),(*it).birthday().date().toString().latin1() );
1394 if ( (*it).birthday().date().isValid() ){ 1395 if ( (*it).birthday().date().isValid() ){
1395 a = new KCal::Attendee( (*it).realName(), (*it).preferredEmail(),false,KCal::Attendee::NeedsAction,KCal::Attendee::ReqParticipant,(*it).uid()) ; 1396 a = new KCal::Attendee( (*it).realName(), (*it).preferredEmail(),false,KCal::Attendee::NeedsAction,KCal::Attendee::ReqParticipant,(*it).uid()) ;
1396 if ( addAnniversary( (*it).birthday().date(), (*it).assembledName(), a, true ) ) 1397 if ( addAnniversary( (*it).birthday().date(), (*it).assembledName(), a, true ) )
1397 ++addCount; 1398 ++addCount;
1398 } 1399 }
1399 QDate anni = KGlobal::locale()->readDate( (*it).custom("KADDRESSBOOK", "X-Anniversary" ), "%Y-%m-%d"); 1400 QDate anni = KGlobal::locale()->readDate( (*it).custom("KADDRESSBOOK", "X-Anniversary" ), "%Y-%m-%d");
1400 if ( anni.isValid() ){ 1401 if ( anni.isValid() ){
1401 a = new KCal::Attendee( (*it).realName(), (*it).preferredEmail(),false,KCal::Attendee::NeedsAction,KCal::Attendee::ReqParticipant,(*it).uid()) ; 1402 a = new KCal::Attendee( (*it).realName(), (*it).preferredEmail(),false,KCal::Attendee::NeedsAction,KCal::Attendee::ReqParticipant,(*it).uid()) ;
1402 if ( addAnniversary( anni, (*it).assembledName(), a, false ) ) 1403 if ( addAnniversary( anni, (*it).assembledName(), a, false ) )
1403 ++addCount; 1404 ++addCount;
1404 } 1405 }
1405 } 1406 }
1406 updateView(); 1407 updateView();
1407 topLevelWidget()->setCaption(QString::number( addCount )+ i18n(" birthdays/anniversaries added!")); 1408 topLevelWidget()->setCaption(QString::number( addCount )+ i18n(" birthdays/anniversaries added!"));
1408#else //DESKTOP_VERSION 1409#else //DESKTOP_VERSION
1409 1410
1410 ExternalAppHandler::instance()->requestBirthdayListFromKAPI("QPE/Application/kopi", this->name() /* name is here the unique uid*/); 1411 ExternalAppHandler::instance()->requestBirthdayListFromKAPI("QPE/Application/kopi", this->name() /* name is here the unique uid*/);
1411 // the result should now arrive through method insertBirthdays 1412 // the result should now arrive through method insertBirthdays
1412 1413
1413#endif //DESKTOP_VERSION 1414#endif //DESKTOP_VERSION
1414 1415
1415#endif //KORG_NOKABC 1416#endif //KORG_NOKABC
1416 1417
1417 1418
1418 return true; 1419 return true;
1419} 1420}
1420 1421
1421// This method will be called from Ka/Pi as a response to requestBirthdayListFromKAPI 1422// This method will be called from Ka/Pi as a response to requestBirthdayListFromKAPI
1422void CalendarView::insertBirthdays(const QString& uid, const QStringList& birthdayList, 1423void CalendarView::insertBirthdays(const QString& uid, const QStringList& birthdayList,
1423 const QStringList& anniversaryList, const QStringList& realNameList, 1424 const QStringList& anniversaryList, const QStringList& realNameList,
1424 const QStringList& emailList, const QStringList& assembledNameList, 1425 const QStringList& emailList, const QStringList& assembledNameList,
1425 const QStringList& uidList) 1426 const QStringList& uidList)
1426{ 1427{
1427 //qDebug("KO::CalendarView::insertBirthdays"); 1428 //qDebug("KO::CalendarView::insertBirthdays");
1428 if (uid == this->name()) 1429 if (uid == this->name())
1429 { 1430 {
1430 int count = birthdayList.count(); 1431 int count = birthdayList.count();
1431 int addCount = 0; 1432 int addCount = 0;
1432 KCal::Attendee* a = 0; 1433 KCal::Attendee* a = 0;
1433 1434
1434 //qDebug("CalView 1 %i", count); 1435 //qDebug("CalView 1 %i", count);
1435 1436
1436 QProgressBar bar(count,0 ); 1437 QProgressBar bar(count,0 );
1437 int w = 300; 1438 int w = 300;
1438 if ( QApplication::desktop()->width() < 320 ) 1439 if ( QApplication::desktop()->width() < 320 )
1439 w = 220; 1440 w = 220;
1440 int h = bar.sizeHint().height() ; 1441 int h = bar.sizeHint().height() ;
1441 int dw = QApplication::desktop()->width(); 1442 int dw = QApplication::desktop()->width();
1442 int dh = QApplication::desktop()->height(); 1443 int dh = QApplication::desktop()->height();
1443 bar.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); 1444 bar.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
1444 bar.show(); 1445 bar.show();
1445 bar.setCaption (i18n("inserting birthdays - close to abort!") ); 1446 bar.setCaption (i18n("inserting birthdays - close to abort!") );
1446 qApp->processEvents(); 1447 qApp->processEvents();
1447 1448
1448 QDate birthday; 1449 QDate birthday;
1449 QDate anniversary; 1450 QDate anniversary;
1450 QString realName; 1451 QString realName;
1451 QString email; 1452 QString email;
1452 QString assembledName; 1453 QString assembledName;
1453 QString uid; 1454 QString uid;
1454 bool ok = true; 1455 bool ok = true;
1455 for ( int i = 0; i < count; i++) 1456 for ( int i = 0; i < count; i++)
1456 { 1457 {
1457 if ( ! bar.isVisible() ) 1458 if ( ! bar.isVisible() )
1458 return; 1459 return;
1459 bar.setProgress( i ); 1460 bar.setProgress( i );
1460 qApp->processEvents(); 1461 qApp->processEvents();
1461 1462
1462 birthday = KGlobal::locale()->readDate(birthdayList[i], KLocale::ISODate, &ok); 1463 birthday = KGlobal::locale()->readDate(birthdayList[i], KLocale::ISODate, &ok);
1463 if (!ok) { 1464 if (!ok) {
1464 ;//qDebug("CalendarView::insertBirthdays found invalid birthday: %s",birthdayList[i].latin1()); 1465 ;//qDebug("CalendarView::insertBirthdays found invalid birthday: %s",birthdayList[i].latin1());
1465 } 1466 }
1466 1467
1467 anniversary = KGlobal::locale()->readDate(anniversaryList[i], KLocale::ISODate, &ok); 1468 anniversary = KGlobal::locale()->readDate(anniversaryList[i], KLocale::ISODate, &ok);
1468 if (!ok) { 1469 if (!ok) {
1469 ;//qDebug("CalendarView::insertBirthdays found invalid anniversary: %s",anniversaryList[i].latin1()); 1470 ;//qDebug("CalendarView::insertBirthdays found invalid anniversary: %s",anniversaryList[i].latin1());
1470 } 1471 }
1471 realName = realNameList[i]; 1472 realName = realNameList[i];
1472 email = emailList[i]; 1473 email = emailList[i];
1473 assembledName = assembledNameList[i]; 1474 assembledName = assembledNameList[i];
1474 uid = uidList[i]; 1475 uid = uidList[i];
1475 //qDebug("insert birthday in KO/Pi: %s,%s,%s,%s: %s, %s", realName.latin1(), email.latin1(), assembledName.latin1(), uid.latin1(), birthdayList[i].latin1(), anniversaryList[i].latin1() ); 1476 //qDebug("insert birthday in KO/Pi: %s,%s,%s,%s: %s, %s", realName.latin1(), email.latin1(), assembledName.latin1(), uid.latin1(), birthdayList[i].latin1(), anniversaryList[i].latin1() );
1476 1477
1477 if ( birthday.isValid() ){ 1478 if ( birthday.isValid() ){
1478 a = new KCal::Attendee( realName, email,false,KCal::Attendee::NeedsAction, 1479 a = new KCal::Attendee( realName, email,false,KCal::Attendee::NeedsAction,
1479 KCal::Attendee::ReqParticipant,uid) ; 1480 KCal::Attendee::ReqParticipant,uid) ;
1480 if ( addAnniversary( birthday, assembledName, a, true ) ) 1481 if ( addAnniversary( birthday, assembledName, a, true ) )
1481 ++addCount; 1482 ++addCount;
1482 } 1483 }
1483 1484
1484 if ( anniversary.isValid() ){ 1485 if ( anniversary.isValid() ){
1485 a = new KCal::Attendee( realName, email,false,KCal::Attendee::NeedsAction, 1486 a = new KCal::Attendee( realName, email,false,KCal::Attendee::NeedsAction,
1486 KCal::Attendee::ReqParticipant,uid) ; 1487 KCal::Attendee::ReqParticipant,uid) ;
1487 if ( addAnniversary( anniversary, assembledName, a, false ) ) 1488 if ( addAnniversary( anniversary, assembledName, a, false ) )
1488 ++addCount; 1489 ++addCount;
1489 } 1490 }
1490 } 1491 }
1491 1492
1492 updateView(); 1493 updateView();
1493 topLevelWidget()->setCaption(QString::number( addCount )+ i18n(" birthdays/anniversaries added!")); 1494 topLevelWidget()->setCaption(QString::number( addCount )+ i18n(" birthdays/anniversaries added!"));
1494 1495
1495 } 1496 }
1496 1497
1497} 1498}
1498 1499
1499 1500
1500 1501
1501bool CalendarView::addAnniversary( QDate date, QString name, KCal::Attendee* a, bool birthday) 1502bool CalendarView::addAnniversary( QDate date, QString name, KCal::Attendee* a, bool birthday)
1502{ 1503{
1503 //qDebug("addAnni "); 1504 //qDebug("addAnni ");
1504 Event * ev = new Event(); 1505 Event * ev = new Event();
1505 ev->setOrganizer(KOPrefs::instance()->email()); 1506 ev->setOrganizer(KOPrefs::instance()->email());
1506 if ( a ) { 1507 if ( a ) {
1507 ev->addAttendee( a ); 1508 ev->addAttendee( a );
1508 } 1509 }
1509 QString kind; 1510 QString kind;
1510 if ( birthday ) { 1511 if ( birthday ) {
1511 kind = i18n( "Birthday" ); 1512 kind = i18n( "Birthday" );
1512 ev->setSummary( name + " (" + QString::number(date.year()) +")"); 1513 ev->setSummary( name + " (" + QString::number(date.year()) +")");
1513 } 1514 }
1514 else { 1515 else {
1515 kind = i18n( "Anniversary" ); 1516 kind = i18n( "Anniversary" );
1516 ev->setSummary( name + " (" + QString::number(date.year()) +") " + kind ); 1517 ev->setSummary( name + " (" + QString::number(date.year()) +") " + kind );
1517 } 1518 }
1518 ev->setCategories( kind ); 1519 ev->setCategories( kind );
1519 ev->setDtStart( QDateTime(date) ); 1520 ev->setDtStart( QDateTime(date) );
1520 ev->setDtEnd( QDateTime(date) ); 1521 ev->setDtEnd( QDateTime(date) );
1521 ev->setFloats( true ); 1522 ev->setFloats( true );
1522 Recurrence * rec = ev->recurrence(); 1523 Recurrence * rec = ev->recurrence();
1523 rec->setYearly(Recurrence::rYearlyMonth,1,-1); 1524 rec->setYearly(Recurrence::rYearlyMonth,1,-1);
1524 rec->addYearlyNum( date.month() ); 1525 rec->addYearlyNum( date.month() );
1525 if ( !mCalendar->addAnniversaryNoDup( ev ) ) { 1526 if ( !mCalendar->addAnniversaryNoDup( ev ) ) {
1526 delete ev; 1527 delete ev;
1527 return false; 1528 return false;
1528 } 1529 }
1529 return true; 1530 return true;
1530 1531
1531} 1532}
1532bool CalendarView::importQtopia( const QString &categories, 1533bool CalendarView::importQtopia( const QString &categories,
1533 const QString &datebook, 1534 const QString &datebook,
1534 const QString &todolist ) 1535 const QString &todolist )
1535{ 1536{
1536 1537
1537 QtopiaFormat qtopiaFormat; 1538 QtopiaFormat qtopiaFormat;
1538 qtopiaFormat.setCategoriesList ( &(KOPrefs::instance()->mCustomCategories)); 1539 qtopiaFormat.setCategoriesList ( &(KOPrefs::instance()->mCustomCategories));
1539 if ( !categories.isEmpty() ) qtopiaFormat.load( mCalendar, categories ); 1540 if ( !categories.isEmpty() ) qtopiaFormat.load( mCalendar, categories );
1540 if ( !datebook.isEmpty() ) qtopiaFormat.load( mCalendar, datebook ); 1541 if ( !datebook.isEmpty() ) qtopiaFormat.load( mCalendar, datebook );
1541 if ( !todolist.isEmpty() ) qtopiaFormat.load( mCalendar, todolist ); 1542 if ( !todolist.isEmpty() ) qtopiaFormat.load( mCalendar, todolist );
1542 1543
1543 updateView(); 1544 updateView();
1544 return true; 1545 return true;
1545 1546
1546#if 0 1547#if 0
1547 mGlobalSyncMode = SYNC_MODE_QTOPIA; 1548 mGlobalSyncMode = SYNC_MODE_QTOPIA;
1548 mCurrentSyncDevice = "qtopia-XML"; 1549 mCurrentSyncDevice = "qtopia-XML";
1549 if ( mSyncManager->mAskForPreferences ) 1550 if ( mSyncManager->mAskForPreferences )
1550 edit_sync_options(); 1551 edit_sync_options();
1551 qApp->processEvents(); 1552 qApp->processEvents();
1552 CalendarLocal* calendar = new CalendarLocal(); 1553 CalendarLocal* calendar = new CalendarLocal();
1553 calendar->setTimeZoneId(KPimGlobalPrefs::instance()->mTimeZoneId); 1554 calendar->setTimeZoneId(KPimGlobalPrefs::instance()->mTimeZoneId);
1554 bool syncOK = false; 1555 bool syncOK = false;
1555 QtopiaFormat qtopiaFormat; 1556 QtopiaFormat qtopiaFormat;
1556 qtopiaFormat.setCategoriesList ( &(KOPrefs::instance()->mCustomCategories)); 1557 qtopiaFormat.setCategoriesList ( &(KOPrefs::instance()->mCustomCategories));
1557 bool loadOk = true; 1558 bool loadOk = true;
1558 if ( !categories.isEmpty() ) 1559 if ( !categories.isEmpty() )
1559 loadOk = qtopiaFormat.load( calendar, categories ); 1560 loadOk = qtopiaFormat.load( calendar, categories );
1560 if ( loadOk && !datebook.isEmpty() ) 1561 if ( loadOk && !datebook.isEmpty() )
1561 loadOk = qtopiaFormat.load( calendar, datebook ); 1562 loadOk = qtopiaFormat.load( calendar, datebook );
1562 if ( loadOk && !todolist.isEmpty() ) 1563 if ( loadOk && !todolist.isEmpty() )
1563 loadOk = qtopiaFormat.load( calendar, todolist ); 1564 loadOk = qtopiaFormat.load( calendar, todolist );
1564 1565
1565 if ( loadOk ) { 1566 if ( loadOk ) {
1566 getEventViewerDialog()->setSyncMode( true ); 1567 getEventViewerDialog()->setSyncMode( true );
1567 syncOK = synchronizeCalendar( mCalendar, calendar, mSyncManager->mSyncAlgoPrefs ); 1568 syncOK = synchronizeCalendar( mCalendar, calendar, mSyncManager->mSyncAlgoPrefs );
1568 getEventViewerDialog()->setSyncMode( false ); 1569 getEventViewerDialog()->setSyncMode( false );
1569 qApp->processEvents(); 1570 qApp->processEvents();
1570 if ( syncOK ) { 1571 if ( syncOK ) {
1571 if ( mSyncManager->mWriteBackFile ) 1572 if ( mSyncManager->mWriteBackFile )
1572 { 1573 {
1573 // write back XML file 1574 // write back XML file
1574 1575
1575 } 1576 }
1576 setModified( true ); 1577 setModified( true );
1577 } 1578 }
1578 } else { 1579 } else {
1579 QString question = i18n("Sorry, the file loading\ncommand failed!\n\nNothing synced!\n") ; 1580 QString question = i18n("Sorry, the file loading\ncommand failed!\n\nNothing synced!\n") ;
1580 QMessageBox::information( 0, i18n("KO/Pi Sync - ERROR"), 1581 QMessageBox::information( 0, i18n("KO/Pi Sync - ERROR"),
1581 question, i18n("Ok")) ; 1582 question, i18n("Ok")) ;
1582 } 1583 }
1583 delete calendar; 1584 delete calendar;
1584 updateView(); 1585 updateView();
1585 return syncOK; 1586 return syncOK;
1586 1587
1587 1588
1588#endif 1589#endif
1589 1590
1590} 1591}
1591 1592
1592void CalendarView::setSyncEventsReadOnly() 1593void CalendarView::setSyncEventsReadOnly()
1593{ 1594{
1594 Event * ev; 1595 Event * ev;
1595 QPtrList<Event> eL = mCalendar->rawEvents(); 1596 QPtrList<Event> eL = mCalendar->rawEvents();
1596 ev = eL.first(); 1597 ev = eL.first();
1597 while ( ev ) { 1598 while ( ev ) {
1598 if ( ev->uid().left(15) == QString("last-syncEvent-") ) 1599 if ( ev->uid().left(15) == QString("last-syncEvent-") )
1599 ev->setReadOnly( true ); 1600 ev->setReadOnly( true );
1600 ev = eL.next(); 1601 ev = eL.next();
1601 } 1602 }
1602} 1603}
1603bool CalendarView::openCalendar(QString filename, bool merge) 1604bool CalendarView::openCalendar(QString filename, bool merge)
1604{ 1605{
1605 1606
1606 if (filename.isEmpty()) { 1607 if (filename.isEmpty()) {
1607 return false; 1608 return false;
1608 } 1609 }
1609 1610
1610 if (!QFile::exists(filename)) { 1611 if (!QFile::exists(filename)) {
1611 KMessageBox::error(this,i18n("File does not exist:\n '%1'.").arg(filename)); 1612 KMessageBox::error(this,i18n("File does not exist:\n '%1'.").arg(filename));
1612 return false; 1613 return false;
1613 } 1614 }
1614 1615
1615 globalFlagBlockAgenda = 1; 1616 globalFlagBlockAgenda = 1;
1616 if (!merge) mCalendar->close(); 1617 if (!merge) mCalendar->close();
1617 1618
1618 mStorage->setFileName( filename ); 1619 mStorage->setFileName( filename );
1619 1620
1620 if ( mStorage->load() ) { 1621 if ( mStorage->load() ) {
1621 if ( merge ) ;//setModified( true ); 1622 if ( merge ) ;//setModified( true );
1622 else { 1623 else {
1623 //setModified( true ); 1624 //setModified( true );
1624 mViewManager->setDocumentId( filename ); 1625 mViewManager->setDocumentId( filename );
1625 mDialogManager->setDocumentId( filename ); 1626 mDialogManager->setDocumentId( filename );
1626 mTodoList->setDocumentId( filename ); 1627 mTodoList->setDocumentId( filename );
1627 } 1628 }
1628 globalFlagBlockAgenda = 2; 1629 globalFlagBlockAgenda = 2;
1629 // if ( getLastSyncEvent() ) 1630 // if ( getLastSyncEvent() )
1630 // getLastSyncEvent()->setReadOnly( true ); 1631 // getLastSyncEvent()->setReadOnly( true );
1631 mCalendar->reInitAlarmSettings(); 1632 mCalendar->reInitAlarmSettings();
1632 setSyncEventsReadOnly(); 1633 setSyncEventsReadOnly();
1633 updateUnmanagedViews(); 1634 updateUnmanagedViews();
1634 updateView(); 1635 updateView();
1635 if ( filename != MainWindow::defaultFileName() ) { 1636 if ( filename != MainWindow::defaultFileName() ) {
1636 saveCalendar( MainWindow::defaultFileName() ); 1637 saveCalendar( MainWindow::defaultFileName() );
1637 } else { 1638 } else {
1638 QFileInfo finf ( MainWindow::defaultFileName()); 1639 QFileInfo finf ( MainWindow::defaultFileName());
1639 if ( finf.exists() ) { 1640 if ( finf.exists() ) {
1640 setLoadedFileVersion( finf.lastModified () ); 1641 setLoadedFileVersion( finf.lastModified () );
1641 } 1642 }
1642 } 1643 }
1643 return true; 1644 return true;
1644 } else { 1645 } else {
1645 // while failing to load, the calendar object could 1646 // while failing to load, the calendar object could
1646 // have become partially populated. Clear it out. 1647 // have become partially populated. Clear it out.
1647 if ( !merge ) { 1648 if ( !merge ) {
1648 mCalendar->close(); 1649 mCalendar->close();
1649 mViewManager->setDocumentId( filename ); 1650 mViewManager->setDocumentId( filename );
1650 mDialogManager->setDocumentId( filename ); 1651 mDialogManager->setDocumentId( filename );
1651 mTodoList->setDocumentId( filename ); 1652 mTodoList->setDocumentId( filename );
1652 } 1653 }
1653 1654
1654 //KMessageBox::error(this,i18n("Couldn't load calendar\n '%1'.").arg(filename)); 1655 //KMessageBox::error(this,i18n("Couldn't load calendar\n '%1'.").arg(filename));
1655 1656
1656 QTimer::singleShot ( 1, this, SLOT ( showOpenError() ) ); 1657 QTimer::singleShot ( 1, this, SLOT ( showOpenError() ) );
1657 globalFlagBlockAgenda = 2; 1658 globalFlagBlockAgenda = 2;
1658 mCalendar->reInitAlarmSettings(); 1659 mCalendar->reInitAlarmSettings();
1659 setSyncEventsReadOnly(); 1660 setSyncEventsReadOnly();
1660 updateUnmanagedViews(); 1661 updateUnmanagedViews();
1661 updateView(); 1662 updateView();
1662 } 1663 }
1663 return false; 1664 return false;
1664} 1665}
1665void CalendarView::showOpenError() 1666void CalendarView::showOpenError()
1666{ 1667{
1667 KMessageBox::error(this,i18n("Couldn't load calendar\n.")); 1668 KMessageBox::error(this,i18n("Couldn't load calendar\n."));
1668} 1669}
1669void CalendarView::setLoadedFileVersion(QDateTime dt) 1670void CalendarView::setLoadedFileVersion(QDateTime dt)
1670{ 1671{
1671 loadedFileVersion = dt; 1672 loadedFileVersion = dt;
1672} 1673}
1673bool CalendarView::checkFileChanged(QString fn) 1674bool CalendarView::checkFileChanged(QString fn)
1674{ 1675{
1675 QFileInfo finf ( fn ); 1676 QFileInfo finf ( fn );
1676 if ( !finf.exists() ) 1677 if ( !finf.exists() )
1677 return true; 1678 return true;
1678 QDateTime dt = finf.lastModified (); 1679 QDateTime dt = finf.lastModified ();
1679 if ( dt <= loadedFileVersion ) 1680 if ( dt <= loadedFileVersion )
1680 return false; 1681 return false;
1681 return true; 1682 return true;
1682 1683
1683} 1684}
1684void CalendarView::watchSavedFile() 1685void CalendarView::watchSavedFile()
1685{ 1686{
1686 QFileInfo finf ( MainWindow::defaultFileName()); 1687 QFileInfo finf ( MainWindow::defaultFileName());
1687 if ( !finf.exists() ) 1688 if ( !finf.exists() )
1688 return; 1689 return;
1689 QDateTime dt = finf.lastModified (); 1690 QDateTime dt = finf.lastModified ();
1690 if ( dt < loadedFileVersion ) { 1691 if ( dt < loadedFileVersion ) {
1691 //qDebug("watch %s %s ", dt.toString().latin1(), loadedFileVersion.toString().latin1()); 1692 //qDebug("watch %s %s ", dt.toString().latin1(), loadedFileVersion.toString().latin1());
1692 QTimer::singleShot( 1000 , this, SLOT ( watchSavedFile() ) ); 1693 QTimer::singleShot( 1000 , this, SLOT ( watchSavedFile() ) );
1693 return; 1694 return;
1694 } 1695 }
1695 loadedFileVersion = dt; 1696 loadedFileVersion = dt;
1696} 1697}
1697 1698
1698bool CalendarView::checkFileVersion(QString fn) 1699bool CalendarView::checkFileVersion(QString fn)
1699{ 1700{
1700 QFileInfo finf ( fn ); 1701 QFileInfo finf ( fn );
1701 if ( !finf.exists() ) 1702 if ( !finf.exists() )
1702 return true; 1703 return true;
1703 QDateTime dt = finf.lastModified (); 1704 QDateTime dt = finf.lastModified ();
1704 //qDebug("loaded file version %s",loadedFileVersion.toString().latin1()); 1705 //qDebug("loaded file version %s",loadedFileVersion.toString().latin1());
1705 //qDebug("file on disk version %s",dt.toString().latin1()); 1706 //qDebug("file on disk version %s",dt.toString().latin1());
1706 if ( dt <= loadedFileVersion ) 1707 if ( dt <= loadedFileVersion )
1707 return true; 1708 return true;
1708 int km = KMessageBox::warningYesNoCancel(this, i18n("\nThe file on disk has changed!\nFile size: %1 bytes.\nLast modified: %2\nDo you want to:\n\n - Save and overwrite file?\n - Sync with file, then save?\n - Cancel without saving? \n").arg( QString::number( finf.size())).arg( KGlobal::locale()->formatDateTime(finf.lastModified (), true, true)) , 1709 int km = KMessageBox::warningYesNoCancel(this, i18n("\nThe file on disk has changed!\nFile size: %1 bytes.\nLast modified: %2\nDo you want to:\n\n - Save and overwrite file?\n - Sync with file, then save?\n - Cancel without saving? \n").arg( QString::number( finf.size())).arg( KGlobal::locale()->formatDateTime(finf.lastModified (), true, true)) ,
1709 i18n("KO/Pi Warning"),i18n("Overwrite"), 1710 i18n("KO/Pi Warning"),i18n("Overwrite"),
1710 i18n("Sync+save")); 1711 i18n("Sync+save"));
1711 1712
1712 if ( km == KMessageBox::Cancel ) 1713 if ( km == KMessageBox::Cancel )
1713 return false; 1714 return false;
1714 if ( km == KMessageBox::Yes ) 1715 if ( km == KMessageBox::Yes )
1715 return true; 1716 return true;
1716 1717
1717 setSyncDevice("deleteaftersync" ); 1718 setSyncDevice("deleteaftersync" );
1718 mSyncManager->mAskForPreferences = true; 1719 mSyncManager->mAskForPreferences = true;
1719 mSyncManager->mSyncAlgoPrefs = 3; 1720 mSyncManager->mSyncAlgoPrefs = 3;
1720 mSyncManager->mWriteBackFile = false; 1721 mSyncManager->mWriteBackFile = false;
1721 mSyncManager->mWriteBackExistingOnly = false; 1722 mSyncManager->mWriteBackExistingOnly = false;
1722 mSyncManager->mShowSyncSummary = false; 1723 mSyncManager->mShowSyncSummary = false;
1723 syncCalendar( fn, 3 ); 1724 syncCalendar( fn, 3 );
1724 Event * e = getLastSyncEvent(); 1725 Event * e = getLastSyncEvent();
1725 mCalendar->deleteEvent ( e ); 1726 mCalendar->deleteEvent ( e );
1726 updateView(); 1727 updateView();
1727 return true; 1728 return true;
1728} 1729}
1729 1730
1730bool CalendarView::saveCalendar( QString filename ) 1731bool CalendarView::saveCalendar( QString filename )
1731{ 1732{
1732 1733
1733 // Store back all unsaved data into calendar object 1734 // Store back all unsaved data into calendar object
1734 // qDebug("file %s %d ", filename.latin1() , mViewManager->currentView() ); 1735 // qDebug("file %s %d ", filename.latin1() , mViewManager->currentView() );
1735 if ( mViewManager->currentView() ) 1736 if ( mViewManager->currentView() )
1736 mViewManager->currentView()->flushView(); 1737 mViewManager->currentView()->flushView();
1737 1738
1738 1739
1739 QDateTime lfv = QDateTime::currentDateTime().addSecs( -2); 1740 QDateTime lfv = QDateTime::currentDateTime().addSecs( -2);
1740 mStorage->setSaveFormat( new ICalFormat() ); 1741 mStorage->setSaveFormat( new ICalFormat() );
1741 mStorage->setFileName( filename ); 1742 mStorage->setFileName( filename );
1742 bool success; 1743 bool success;
diff --git a/libkdepim/ksyncmanager.cpp b/libkdepim/ksyncmanager.cpp
index c8d0e0d..02e5587 100644
--- a/libkdepim/ksyncmanager.cpp
+++ b/libkdepim/ksyncmanager.cpp
@@ -578,926 +578,927 @@ int KSyncManager::ringSync()
578 default: 578 default:
579 qDebug("KSM::ringSync: invalid apptype selected"); 579 qDebug("KSM::ringSync: invalid apptype selected");
580 break; 580 break;
581 581
582 } 582 }
583 583
584 584
585 if ( includeInRingSync && ( i < 1 || i > 2 )) { 585 if ( includeInRingSync && ( i < 1 || i > 2 )) {
586 mParent->topLevelWidget()->setCaption(i18n("Profile ")+syncProfileNames[mCurrentSyncProfile]+ i18n(" is synced ... ")); 586 mParent->topLevelWidget()->setCaption(i18n("Profile ")+syncProfileNames[mCurrentSyncProfile]+ i18n(" is synced ... "));
587 ++syncedProfiles; 587 ++syncedProfiles;
588 mSyncWithDesktop = false; 588 mSyncWithDesktop = false;
589 // mAskForPreferences = temp->getAskForPreferences(); 589 // mAskForPreferences = temp->getAskForPreferences();
590 mWriteBackFile = temp->getWriteBackFile(); 590 mWriteBackFile = temp->getWriteBackFile();
591 mWriteBackExistingOnly = temp->getWriteBackExisting(); 591 mWriteBackExistingOnly = temp->getWriteBackExisting();
592 mIsKapiFile = temp->getIsKapiFile(); 592 mIsKapiFile = temp->getIsKapiFile();
593 mWriteBackInFuture = 0; 593 mWriteBackInFuture = 0;
594 if ( temp->getWriteBackFuture() ) { 594 if ( temp->getWriteBackFuture() ) {
595 mWriteBackInFuture = temp->getWriteBackFutureWeeks( ); 595 mWriteBackInFuture = temp->getWriteBackFutureWeeks( );
596 mWriteBackInPast = temp->getWriteBackPastWeeks( ); 596 mWriteBackInPast = temp->getWriteBackPastWeeks( );
597 } 597 }
598 mFilterInCal = temp->getFilterInCal(); 598 mFilterInCal = temp->getFilterInCal();
599 mFilterOutCal = temp->getFilterOutCal(); 599 mFilterOutCal = temp->getFilterOutCal();
600 mFilterInAB = temp->getFilterInAB(); 600 mFilterInAB = temp->getFilterInAB();
601 mFilterOutAB = temp->getFilterOutAB(); 601 mFilterOutAB = temp->getFilterOutAB();
602 mShowSyncSummary = false; 602 mShowSyncSummary = false;
603 mCurrentSyncDevice = syncProfileNames[i] ; 603 mCurrentSyncDevice = syncProfileNames[i] ;
604 mCurrentSyncName = mLocalMachineName; 604 mCurrentSyncName = mLocalMachineName;
605 if ( i == 0 ) { 605 if ( i == 0 ) {
606 mIsKapiFile = false; 606 mIsKapiFile = false;
607#ifdef DESKTOP_VERSION 607#ifdef DESKTOP_VERSION
608 syncKDE(); 608 syncKDE();
609#else 609#else
610 syncSharp(); 610 syncSharp();
611#endif 611#endif
612 } else { 612 } else {
613 if ( temp->getIsLocalFileSync() ) { 613 if ( temp->getIsLocalFileSync() ) {
614 switch(mTargetApp) 614 switch(mTargetApp)
615 { 615 {
616 case (KAPI): 616 case (KAPI):
617 if ( syncWithFile( temp->getRemoteFileNameAB( ), false ) ) 617 if ( syncWithFile( temp->getRemoteFileNameAB( ), false ) )
618 mPrefs->mLastSyncedLocalFile = temp->getRemoteFileNameAB(); 618 mPrefs->mLastSyncedLocalFile = temp->getRemoteFileNameAB();
619 break; 619 break;
620 case (KOPI): 620 case (KOPI):
621 if ( syncWithFile( temp->getRemoteFileName( ), false ) ) 621 if ( syncWithFile( temp->getRemoteFileName( ), false ) )
622 mPrefs->mLastSyncedLocalFile = temp->getRemoteFileName(); 622 mPrefs->mLastSyncedLocalFile = temp->getRemoteFileName();
623 break; 623 break;
624 case (PWMPI): 624 case (PWMPI):
625 if ( syncWithFile( temp->getRemoteFileNamePWM( ), false ) ) 625 if ( syncWithFile( temp->getRemoteFileNamePWM( ), false ) )
626 mPrefs->mLastSyncedLocalFile = temp->getRemoteFileNamePWM(); 626 mPrefs->mLastSyncedLocalFile = temp->getRemoteFileNamePWM();
627 break; 627 break;
628 default: 628 default:
629 qDebug("KSM: invalid apptype selected"); 629 qDebug("KSM: invalid apptype selected");
630 break; 630 break;
631 } 631 }
632 } else { 632 } else {
633 if ( temp->getIsPhoneSync() ) { 633 if ( temp->getIsPhoneSync() ) {
634 mPhoneDevice = temp->getPhoneDevice( ) ; 634 mPhoneDevice = temp->getPhoneDevice( ) ;
635 mPhoneConnection = temp->getPhoneConnection( ); 635 mPhoneConnection = temp->getPhoneConnection( );
636 mPhoneModel = temp->getPhoneModel( ); 636 mPhoneModel = temp->getPhoneModel( );
637 syncPhone(); 637 syncPhone();
638 } else if ( temp->getIsPiSync() ) { 638 } else if ( temp->getIsPiSync() ) {
639 if ( mTargetApp == KAPI ) { 639 if ( mTargetApp == KAPI ) {
640 mPassWordPiSync = temp->getRemotePwAB(); 640 mPassWordPiSync = temp->getRemotePwAB();
641 mActiveSyncPort = temp->getRemotePortAB(); 641 mActiveSyncPort = temp->getRemotePortAB();
642 mActiveSyncIP = temp->getRemoteIPAB(); 642 mActiveSyncIP = temp->getRemoteIPAB();
643 } else if ( mTargetApp == KOPI ) { 643 } else if ( mTargetApp == KOPI ) {
644 mPassWordPiSync = temp->getRemotePw(); 644 mPassWordPiSync = temp->getRemotePw();
645 mActiveSyncPort = temp->getRemotePort(); 645 mActiveSyncPort = temp->getRemotePort();
646 mActiveSyncIP = temp->getRemoteIP(); 646 mActiveSyncIP = temp->getRemoteIP();
647 } else { 647 } else {
648 mPassWordPiSync = temp->getRemotePwPWM(); 648 mPassWordPiSync = temp->getRemotePwPWM();
649 mActiveSyncPort = temp->getRemotePortPWM(); 649 mActiveSyncPort = temp->getRemotePortPWM();
650 mActiveSyncIP = temp->getRemoteIPPWM(); 650 mActiveSyncIP = temp->getRemoteIPPWM();
651 } 651 }
652 syncPi(); 652 syncPi();
653 while ( !mPisyncFinished ) { 653 while ( !mPisyncFinished ) {
654 //qDebug("waiting "); 654 //qDebug("waiting ");
655 qApp->processEvents(); 655 qApp->processEvents();
656 } 656 }
657 timer.start(); 657 timer.start();
658 while ( timer.elapsed () < 2000 ) { 658 while ( timer.elapsed () < 2000 ) {
659 qApp->processEvents(); 659 qApp->processEvents();
660 } 660 }
661 } else 661 } else
662 syncRemote( temp, false ); 662 syncRemote( temp, false );
663 663
664 } 664 }
665 } 665 }
666 timer.start(); 666 timer.start();
667 mParent->topLevelWidget()->setCaption(i18n("Multiple sync in progress ... please wait!") ); 667 mParent->topLevelWidget()->setCaption(i18n("Multiple sync in progress ... please wait!") );
668 while ( timer.elapsed () < 2000 ) { 668 while ( timer.elapsed () < 2000 ) {
669 qApp->processEvents(); 669 qApp->processEvents();
670#ifndef _WIN32_ 670#ifndef _WIN32_
671 sleep (1); 671 sleep (1);
672#endif 672#endif
673 } 673 }
674 674
675 } 675 }
676 676
677 } 677 }
678 delete temp; 678 delete temp;
679 return syncedProfiles; 679 return syncedProfiles;
680} 680}
681 681
682void KSyncManager::syncRemote( KSyncProfile* prof, bool ask) 682void KSyncManager::syncRemote( KSyncProfile* prof, bool ask)
683{ 683{
684 QString question; 684 QString question;
685 if ( ask ) { 685 if ( ask ) {
686 question = i18n("Do you really want\nto remote sync\nwith profile \n")+ prof->getName()+" ?\n"; 686 question = i18n("Do you really want\nto remote sync\nwith profile \n")+ prof->getName()+" ?\n";
687 if ( QMessageBox::information( mParent, i18n("Sync"), 687 if ( QMessageBox::information( mParent, i18n("Sync"),
688 question, 688 question,
689 i18n("Yes"), i18n("No"), 689 i18n("Yes"), i18n("No"),
690 0, 0 ) != 0 ) 690 0, 0 ) != 0 )
691 return; 691 return;
692 } 692 }
693 693
694 QString preCommand; 694 QString preCommand;
695 QString localTempFile; 695 QString localTempFile;
696 QString postCommand; 696 QString postCommand;
697 697
698 switch(mTargetApp) 698 switch(mTargetApp)
699 { 699 {
700 case (KAPI): 700 case (KAPI):
701 preCommand = prof->getPreSyncCommandAB(); 701 preCommand = prof->getPreSyncCommandAB();
702 postCommand = prof->getPostSyncCommandAB(); 702 postCommand = prof->getPostSyncCommandAB();
703 localTempFile = prof->getLocalTempFileAB(); 703 localTempFile = prof->getLocalTempFileAB();
704 break; 704 break;
705 case (KOPI): 705 case (KOPI):
706 preCommand = prof->getPreSyncCommand(); 706 preCommand = prof->getPreSyncCommand();
707 postCommand = prof->getPostSyncCommand(); 707 postCommand = prof->getPostSyncCommand();
708 localTempFile = prof->getLocalTempFile(); 708 localTempFile = prof->getLocalTempFile();
709 break; 709 break;
710 case (PWMPI): 710 case (PWMPI):
711 preCommand = prof->getPreSyncCommandPWM(); 711 preCommand = prof->getPreSyncCommandPWM();
712 postCommand = prof->getPostSyncCommandPWM(); 712 postCommand = prof->getPostSyncCommandPWM();
713 localTempFile = prof->getLocalTempFilePWM(); 713 localTempFile = prof->getLocalTempFilePWM();
714 break; 714 break;
715 default: 715 default:
716 qDebug("KSM::syncRemote: invalid apptype selected"); 716 qDebug("KSM::syncRemote: invalid apptype selected");
717 break; 717 break;
718 } 718 }
719 719
720 720
721 int fi; 721 int fi;
722 if ( (fi = preCommand.find("$PWD$")) > 0 ) { 722 if ( (fi = preCommand.find("$PWD$")) > 0 ) {
723 QString pwd = getPassword(); 723 QString pwd = getPassword();
724 preCommand = preCommand.left( fi )+ pwd + preCommand.mid( fi+5 ); 724 preCommand = preCommand.left( fi )+ pwd + preCommand.mid( fi+5 );
725 725
726 } 726 }
727 int maxlen = 30; 727 int maxlen = 30;
728 if ( QApplication::desktop()->width() > 320 ) 728 if ( QApplication::desktop()->width() > 320 )
729 maxlen += 25; 729 maxlen += 25;
730 mParent->topLevelWidget()->setCaption ( i18n( "Copy remote file to local machine..." ) ); 730 mParent->topLevelWidget()->setCaption ( i18n( "Copy remote file to local machine..." ) );
731 int fileSize = 0; 731 int fileSize = 0;
732 int result = system ( preCommand ); 732 int result = system ( preCommand );
733 // 0 : okay 733 // 0 : okay
734 // 256: no such file or dir 734 // 256: no such file or dir
735 // 735 //
736 qDebug("KSM::Sync: Remote copy result(0 = okay): %d ",result ); 736 qDebug("KSM::Sync: Remote copy result(0 = okay): %d ",result );
737 if ( result != 0 ) { 737 if ( result != 0 ) {
738 unsigned int len = maxlen; 738 unsigned int len = maxlen;
739 while ( len < preCommand.length() ) { 739 while ( len < preCommand.length() ) {
740 preCommand.insert( len , "\n" ); 740 preCommand.insert( len , "\n" );
741 len += maxlen +2; 741 len += maxlen +2;
742 } 742 }
743 question = i18n("Sorry, the copy command failed!\nCommand was:\n%1\n \nTry command on console to get more\ndetailed info about the reason.\n").arg (preCommand) ; 743 question = i18n("Sorry, the copy command failed!\nCommand was:\n%1\n \nTry command on console to get more\ndetailed info about the reason.\n").arg (preCommand) ;
744 QMessageBox::information( mParent, i18n("Sync - ERROR"), 744 QMessageBox::information( mParent, i18n("Sync - ERROR"),
745 question, 745 question,
746 i18n("Okay!")) ; 746 i18n("Okay!")) ;
747 mParent->topLevelWidget()->setCaption ("KDE-Pim"); 747 mParent->topLevelWidget()->setCaption ("KDE-Pim");
748 return; 748 return;
749 } 749 }
750 mParent->topLevelWidget()->setCaption ( i18n( "Copying succeed." ) ); 750 mParent->topLevelWidget()->setCaption ( i18n( "Copying succeed." ) );
751 //qDebug(" file **%s** ",prof->getLocalTempFile().latin1() ); 751 //qDebug(" file **%s** ",prof->getLocalTempFile().latin1() );
752 752
753 if ( syncWithFile( localTempFile, true ) ) { 753 if ( syncWithFile( localTempFile, true ) ) {
754 754
755 if ( mWriteBackFile ) { 755 if ( mWriteBackFile ) {
756 int fi; 756 int fi;
757 if ( (fi = postCommand.find("$PWD$")) > 0 ) { 757 if ( (fi = postCommand.find("$PWD$")) > 0 ) {
758 QString pwd = getPassword(); 758 QString pwd = getPassword();
759 postCommand = postCommand.left( fi )+ pwd + postCommand.mid( fi+5 ); 759 postCommand = postCommand.left( fi )+ pwd + postCommand.mid( fi+5 );
760 760
761 } 761 }
762 mParent->topLevelWidget()->setCaption ( i18n( "Writing back file ..." ) ); 762 mParent->topLevelWidget()->setCaption ( i18n( "Writing back file ..." ) );
763 result = system ( postCommand ); 763 result = system ( postCommand );
764 qDebug("KSM::Sync:Writing back file result: %d ", result); 764 qDebug("KSM::Sync:Writing back file result: %d ", result);
765 if ( result != 0 ) { 765 if ( result != 0 ) {
766 mParent->topLevelWidget()->setCaption ( i18n( "Writing back file result: " )+QString::number( result ) ); 766 mParent->topLevelWidget()->setCaption ( i18n( "Writing back file result: " )+QString::number( result ) );
767 return; 767 return;
768 } else { 768 } else {
769 mParent->topLevelWidget()->setCaption ( i18n( "Syncronization sucessfully completed" ) ); 769 mParent->topLevelWidget()->setCaption ( i18n( "Syncronization sucessfully completed" ) );
770 } 770 }
771 } 771 }
772 } 772 }
773 return; 773 return;
774} 774}
775bool KSyncManager::edit_pisync_options() 775bool KSyncManager::edit_pisync_options()
776{ 776{
777 QDialog dia( mParent, "dia", true ); 777 QDialog dia( mParent, "dia", true );
778 dia.setCaption( i18n("Pi-Sync options for device: " ) +mCurrentSyncDevice ); 778 dia.setCaption( i18n("Pi-Sync options for device: " ) +mCurrentSyncDevice );
779 QVBoxLayout lay ( &dia ); 779 QVBoxLayout lay ( &dia );
780 lay.setSpacing( 5 ); 780 lay.setSpacing( 5 );
781 lay.setMargin( 3 ); 781 lay.setMargin( 3 );
782 QLabel lab1 ( i18n("Password for remote access:"), &dia); 782 QLabel lab1 ( i18n("Password for remote access:"), &dia);
783 lay.addWidget( &lab1 ); 783 lay.addWidget( &lab1 );
784 QLineEdit le1 (&dia ); 784 QLineEdit le1 (&dia );
785 lay.addWidget( &le1 ); 785 lay.addWidget( &le1 );
786 QLabel lab2 ( i18n("Remote IP address:"), &dia); 786 QLabel lab2 ( i18n("Remote IP address:"), &dia);
787 lay.addWidget( &lab2 ); 787 lay.addWidget( &lab2 );
788 QLineEdit le2 (&dia ); 788 QLineEdit le2 (&dia );
789 lay.addWidget( &le2 ); 789 lay.addWidget( &le2 );
790 QLabel lab3 ( i18n("Remote port number:"), &dia); 790 QLabel lab3 ( i18n("Remote port number:"), &dia);
791 lay.addWidget( &lab3 ); 791 lay.addWidget( &lab3 );
792 QLineEdit le3 (&dia ); 792 QLineEdit le3 (&dia );
793 lay.addWidget( &le3 ); 793 lay.addWidget( &le3 );
794 QPushButton pb ( "OK", &dia); 794 QPushButton pb ( "OK", &dia);
795 lay.addWidget( &pb ); 795 lay.addWidget( &pb );
796 connect(&pb, SIGNAL( clicked() ), &dia, SLOT ( accept() ) ); 796 connect(&pb, SIGNAL( clicked() ), &dia, SLOT ( accept() ) );
797 le1.setText( mPassWordPiSync ); 797 le1.setText( mPassWordPiSync );
798 le2.setText( mActiveSyncIP ); 798 le2.setText( mActiveSyncIP );
799 le3.setText( mActiveSyncPort ); 799 le3.setText( mActiveSyncPort );
800 if ( dia.exec() ) { 800 if ( dia.exec() ) {
801 mPassWordPiSync = le1.text(); 801 mPassWordPiSync = le1.text();
802 mActiveSyncPort = le3.text(); 802 mActiveSyncPort = le3.text();
803 mActiveSyncIP = le2.text(); 803 mActiveSyncIP = le2.text();
804 return true; 804 return true;
805 } 805 }
806 return false; 806 return false;
807} 807}
808bool KSyncManager::edit_sync_options() 808bool KSyncManager::edit_sync_options()
809{ 809{
810 810
811 QDialog dia( mParent, "dia", true ); 811 QDialog dia( mParent, "dia", true );
812 dia.setCaption( i18n("Device: " ) +mCurrentSyncDevice ); 812 dia.setCaption( i18n("Device: " ) +mCurrentSyncDevice );
813 QButtonGroup gr ( 1, Qt::Horizontal, i18n("Sync preferences"), &dia); 813 QButtonGroup gr ( 1, Qt::Horizontal, i18n("Sync preferences"), &dia);
814 QVBoxLayout lay ( &dia ); 814 QVBoxLayout lay ( &dia );
815 lay.setSpacing( 2 ); 815 lay.setSpacing( 2 );
816 lay.setMargin( 3 ); 816 lay.setMargin( 3 );
817 lay.addWidget(&gr); 817 lay.addWidget(&gr);
818 QRadioButton loc ( i18n("Take local entry on conflict"), &gr ); 818 QRadioButton loc ( i18n("Take local entry on conflict"), &gr );
819 QRadioButton rem ( i18n("Take remote entry on conflict"), &gr ); 819 QRadioButton rem ( i18n("Take remote entry on conflict"), &gr );
820 QRadioButton newest( i18n("Take newest entry on conflict"), &gr ); 820 QRadioButton newest( i18n("Take newest entry on conflict"), &gr );
821 QRadioButton ask( i18n("Ask for every entry on conflict"), &gr ); 821 QRadioButton ask( i18n("Ask for every entry on conflict"), &gr );
822 QRadioButton f_loc( i18n("Force: Take local entry always"), &gr ); 822 QRadioButton f_loc( i18n("Force: Take local entry always"), &gr );
823 QRadioButton f_rem( i18n("Force: Take remote entry always"), &gr ); 823 QRadioButton f_rem( i18n("Force: Take remote entry always"), &gr );
824 //QRadioButton both( i18n("Take both on conflict"), &gr ); 824 //QRadioButton both( i18n("Take both on conflict"), &gr );
825 QPushButton pb ( "OK", &dia); 825 QPushButton pb ( "OK", &dia);
826 lay.addWidget( &pb ); 826 lay.addWidget( &pb );
827 connect(&pb, SIGNAL( clicked() ), &dia, SLOT ( accept() ) ); 827 connect(&pb, SIGNAL( clicked() ), &dia, SLOT ( accept() ) );
828 switch ( mSyncAlgoPrefs ) { 828 switch ( mSyncAlgoPrefs ) {
829 case 0: 829 case 0:
830 loc.setChecked( true); 830 loc.setChecked( true);
831 break; 831 break;
832 case 1: 832 case 1:
833 rem.setChecked( true ); 833 rem.setChecked( true );
834 break; 834 break;
835 case 2: 835 case 2:
836 newest.setChecked( true); 836 newest.setChecked( true);
837 break; 837 break;
838 case 3: 838 case 3:
839 ask.setChecked( true); 839 ask.setChecked( true);
840 break; 840 break;
841 case 4: 841 case 4:
842 f_loc.setChecked( true); 842 f_loc.setChecked( true);
843 break; 843 break;
844 case 5: 844 case 5:
845 f_rem.setChecked( true); 845 f_rem.setChecked( true);
846 break; 846 break;
847 case 6: 847 case 6:
848 // both.setChecked( true); 848 // both.setChecked( true);
849 break; 849 break;
850 default: 850 default:
851 break; 851 break;
852 } 852 }
853 if ( dia.exec() ) { 853 if ( dia.exec() ) {
854 mSyncAlgoPrefs = rem.isChecked()*1+newest.isChecked()*2+ ask.isChecked()*3+ f_loc.isChecked()*4+ f_rem.isChecked()*5;//+ both.isChecked()*6 ; 854 mSyncAlgoPrefs = rem.isChecked()*1+newest.isChecked()*2+ ask.isChecked()*3+ f_loc.isChecked()*4+ f_rem.isChecked()*5;//+ both.isChecked()*6 ;
855 return true; 855 return true;
856 } 856 }
857 return false; 857 return false;
858} 858}
859 859
860QString KSyncManager::getPassword( ) 860QString KSyncManager::getPassword( )
861{ 861{
862 QString retfile = ""; 862 QString retfile = "";
863 QDialog dia ( mParent, "input-dialog", true ); 863 QDialog dia ( mParent, "input-dialog", true );
864 QLineEdit lab ( &dia ); 864 QLineEdit lab ( &dia );
865 lab.setEchoMode( QLineEdit::Password ); 865 lab.setEchoMode( QLineEdit::Password );
866 QVBoxLayout lay( &dia ); 866 QVBoxLayout lay( &dia );
867 lay.setMargin(7); 867 lay.setMargin(7);
868 lay.setSpacing(7); 868 lay.setSpacing(7);
869 lay.addWidget( &lab); 869 lay.addWidget( &lab);
870 dia.setFixedSize( 230,50 ); 870 dia.setFixedSize( 230,50 );
871 dia.setCaption( i18n("Enter password") ); 871 dia.setCaption( i18n("Enter password") );
872 QPushButton pb ( "OK", &dia); 872 QPushButton pb ( "OK", &dia);
873 lay.addWidget( &pb ); 873 lay.addWidget( &pb );
874 connect(&pb, SIGNAL( clicked() ), &dia, SLOT ( accept() ) ); 874 connect(&pb, SIGNAL( clicked() ), &dia, SLOT ( accept() ) );
875 dia.show(); 875 dia.show();
876 int res = dia.exec(); 876 int res = dia.exec();
877 if ( res ) 877 if ( res )
878 retfile = lab.text(); 878 retfile = lab.text();
879 dia.hide(); 879 dia.hide();
880 qApp->processEvents(); 880 qApp->processEvents();
881 return retfile; 881 return retfile;
882 882
883} 883}
884 884
885 885
886void KSyncManager::confSync() 886void KSyncManager::confSync()
887{ 887{
888 static KSyncPrefsDialog* sp = 0; 888 static KSyncPrefsDialog* sp = 0;
889 if ( ! sp ) { 889 if ( ! sp ) {
890 sp = new KSyncPrefsDialog( mParent, "syncprefs", true ); 890 sp = new KSyncPrefsDialog( mParent, "syncprefs", true );
891 } 891 }
892 sp->usrReadConfig(); 892 sp->usrReadConfig();
893#ifndef DESKTOP_VERSION 893#ifndef DESKTOP_VERSION
894 sp->showMaximized(); 894 sp->showMaximized();
895#else 895#else
896 sp->show(); 896 sp->show();
897#endif 897#endif
898 sp->exec(); 898 sp->exec();
899 QStringList oldSyncProfileNames = mSyncProfileNames; 899 QStringList oldSyncProfileNames = mSyncProfileNames;
900 mSyncProfileNames = sp->getSyncProfileNames(); 900 mSyncProfileNames = sp->getSyncProfileNames();
901 mLocalMachineName = sp->getLocalMachineName (); 901 mLocalMachineName = sp->getLocalMachineName ();
902 int ii; 902 int ii;
903 for ( ii = 0; ii < oldSyncProfileNames.count(); ++ii ) { 903 for ( ii = 0; ii < oldSyncProfileNames.count(); ++ii ) {
904 if ( ! mSyncProfileNames.contains( oldSyncProfileNames[ii] ) ) 904 if ( ! mSyncProfileNames.contains( oldSyncProfileNames[ii] ) )
905 mImplementation->removeSyncInfo( oldSyncProfileNames[ii] ); 905 mImplementation->removeSyncInfo( oldSyncProfileNames[ii] );
906 } 906 }
907 QTimer::singleShot ( 1, this, SLOT ( fillSyncMenu() ) ); 907 QTimer::singleShot ( 1, this, SLOT ( fillSyncMenu() ) );
908} 908}
909void KSyncManager::syncKDE() 909void KSyncManager::syncKDE()
910{ 910{
911 mSyncWithDesktop = true; 911 mSyncWithDesktop = true;
912 emit save(); 912 emit save();
913 switch(mTargetApp) 913 switch(mTargetApp)
914 { 914 {
915 case (KAPI): 915 case (KAPI):
916 { 916 {
917#ifdef DESKTOP_VERSION 917#ifdef DESKTOP_VERSION
918 QString command = qApp->applicationDirPath () + "/kdeabdump"; 918 QString command = qApp->applicationDirPath () + "/kdeabdump";
919#else 919#else
920 QString command = "kdeabdump"; 920 QString command = "kdeabdump";
921#endif 921#endif
922 if ( ! QFile::exists ( command ) ) 922 if ( ! QFile::exists ( command ) )
923 command = "kdeabdump"; 923 command = "kdeabdump";
924 QString fileName = QDir::homeDirPath ()+"/.kdeaddressbookdump.vcf"; 924 QString fileName = QDir::homeDirPath ()+"/.kdeaddressbookdump.vcf";
925 system ( command.latin1()); 925 system ( command.latin1());
926 if ( syncWithFile( fileName,true ) ) { 926 if ( syncWithFile( fileName,true ) ) {
927 if ( mWriteBackFile ) { 927 if ( mWriteBackFile ) {
928 command += " --read"; 928 command += " --read";
929 system ( command.latin1()); 929 system ( command.latin1());
930 } 930 }
931 } 931 }
932 932
933 } 933 }
934 break; 934 break;
935 case (KOPI): 935 case (KOPI):
936 { 936 {
937#ifdef DESKTOP_VERSION 937#ifdef DESKTOP_VERSION
938 QString command = qApp->applicationDirPath () + "/kdecaldump"; 938 QString command = qApp->applicationDirPath () + "/kdecaldump";
939#else 939#else
940 QString command = "kdecaldump"; 940 QString command = "kdecaldump";
941#endif 941#endif
942 if ( ! QFile::exists ( command ) ) 942 if ( ! QFile::exists ( command ) )
943 command = "kdecaldump"; 943 command = "kdecaldump";
944 QString fileName = QDir::homeDirPath ()+"/.kdecalendardump.ics"; 944 QString fileName = QDir::homeDirPath ()+"/.kdecalendardump.ics";
945 system ( command.latin1()); 945 system ( command.latin1());
946 if ( syncWithFile( fileName,true ) ) { 946 if ( syncWithFile( fileName,true ) ) {
947 if ( mWriteBackFile ) { 947 if ( mWriteBackFile ) {
948 command += " --read"; 948 command += " --read";
949 system ( command.latin1()); 949 system ( command.latin1());
950 } 950 }
951 } 951 }
952 952
953 } 953 }
954 break; 954 break;
955 case (PWMPI): 955 case (PWMPI):
956 956
957 break; 957 break;
958 default: 958 default:
959 qDebug("KSM::slotSyncMenu: invalid apptype selected"); 959 qDebug("KSM::slotSyncMenu: invalid apptype selected");
960 break; 960 break;
961 961
962 } 962 }
963} 963}
964 964
965void KSyncManager::syncSharp() 965void KSyncManager::syncSharp()
966{ 966{
967 967
968 if ( ! syncExternalApplication("sharp") ) 968 if ( ! syncExternalApplication("sharp") )
969 qDebug("KSM::ERROR sync sharp "); 969 qDebug("KSM::ERROR sync sharp ");
970} 970}
971 971
972bool KSyncManager::syncExternalApplication(QString resource) 972bool KSyncManager::syncExternalApplication(QString resource)
973{ 973{
974 974
975 emit save(); 975 emit save();
976 976
977 if ( mAskForPreferences ) 977 if ( mAskForPreferences )
978 if ( !edit_sync_options()) { 978 if ( !edit_sync_options()) {
979 mParent->topLevelWidget()->setCaption( i18n("Syncing aborted. Nothing synced.") ); 979 mParent->topLevelWidget()->setCaption( i18n("Syncing aborted. Nothing synced.") );
980 return false; 980 return false;
981 } 981 }
982 982
983 qDebug("KSM::Sync extern %s", resource.latin1()); 983 qDebug("KSM::Sync extern %s", resource.latin1());
984 984
985 bool syncOK = mImplementation->syncExternal(this, resource); 985 bool syncOK = mImplementation->syncExternal(this, resource);
986 986
987 return syncOK; 987 return syncOK;
988 988
989} 989}
990 990
991void KSyncManager::syncPhone() 991void KSyncManager::syncPhone()
992{ 992{
993 993
994 syncExternalApplication("phone"); 994 syncExternalApplication("phone");
995 995
996} 996}
997 997
998void KSyncManager::showProgressBar(int percentage, QString caption, int total) 998void KSyncManager::showProgressBar(int percentage, QString caption, int total)
999{ 999{
1000 if (!bar->isVisible()) 1000 if (!bar->isVisible())
1001 { 1001 {
1002 bar->setCaption (caption); 1002 bar->setCaption (caption);
1003 bar->setTotalSteps ( total ) ; 1003 bar->setTotalSteps ( total ) ;
1004 bar->show(); 1004 bar->show();
1005 } 1005 }
1006 bar->raise(); 1006 bar->raise();
1007 bar->setProgress( percentage ); 1007 bar->setProgress( percentage );
1008 qApp->processEvents(); 1008 qApp->processEvents();
1009} 1009}
1010 1010
1011void KSyncManager::hideProgressBar() 1011void KSyncManager::hideProgressBar()
1012{ 1012{
1013 bar->hide(); 1013 bar->hide();
1014 qApp->processEvents(); 1014 qApp->processEvents();
1015} 1015}
1016 1016
1017bool KSyncManager::isProgressBarCanceled() 1017bool KSyncManager::isProgressBarCanceled()
1018{ 1018{
1019 return !bar->isVisible(); 1019 return !bar->isVisible();
1020} 1020}
1021 1021
1022QString KSyncManager::syncFileName() 1022QString KSyncManager::syncFileName()
1023{ 1023{
1024 1024
1025 QString fn = "tempfile"; 1025 QString fn = "tempfile";
1026 switch(mTargetApp) 1026 switch(mTargetApp)
1027 { 1027 {
1028 case (KAPI): 1028 case (KAPI):
1029 fn = "tempsyncab.vcf"; 1029 fn = "tempsyncab.vcf";
1030 break; 1030 break;
1031 case (KOPI): 1031 case (KOPI):
1032 fn = "tempsynccal.ics"; 1032 fn = "tempsynccal.ics";
1033 break; 1033 break;
1034 case (PWMPI): 1034 case (PWMPI):
1035 fn = "tempsyncpw.pwm"; 1035 fn = "tempsyncpw.pwm";
1036 break; 1036 break;
1037 default: 1037 default:
1038 break; 1038 break;
1039 } 1039 }
1040#ifdef _WIN32_ 1040#ifdef _WIN32_
1041 return locateLocal( "tmp", fn ); 1041 return locateLocal( "tmp", fn );
1042#else 1042#else
1043 return (QString( "/tmp/" )+ fn ); 1043 return (QString( "/tmp/" )+ fn );
1044#endif 1044#endif
1045} 1045}
1046 1046
1047void KSyncManager::syncPi() 1047void KSyncManager::syncPi()
1048{ 1048{
1049 mIsKapiFile = true; 1049 mIsKapiFile = true;
1050 mPisyncFinished = false; 1050 mPisyncFinished = false;
1051 qApp->processEvents(); 1051 qApp->processEvents();
1052 if ( mAskForPreferences ) 1052 if ( mAskForPreferences )
1053 if ( !edit_pisync_options()) { 1053 if ( !edit_pisync_options()) {
1054 mParent->topLevelWidget()->setCaption( i18n("Syncing aborted. Nothing synced.") ); 1054 mParent->topLevelWidget()->setCaption( i18n("Syncing aborted. Nothing synced.") );
1055 return; 1055 return;
1056 } 1056 }
1057 bool ok; 1057 bool ok;
1058 Q_UINT16 port = mActiveSyncPort.toUInt(&ok); 1058 Q_UINT16 port = mActiveSyncPort.toUInt(&ok);
1059 if ( ! ok ) { 1059 if ( ! ok ) {
1060 mParent->topLevelWidget()->setCaption( i18n("Sorry, no valid port.Syncing cancelled.") ); 1060 mParent->topLevelWidget()->setCaption( i18n("Sorry, no valid port.Syncing cancelled.") );
1061 return; 1061 return;
1062 } 1062 }
1063 KCommandSocket* commandSocket = new KCommandSocket( mPassWordPiSync, port, mActiveSyncIP, this, mParent->topLevelWidget() ); 1063 KCommandSocket* commandSocket = new KCommandSocket( mPassWordPiSync, port, mActiveSyncIP, this, mParent->topLevelWidget() );
1064 connect( commandSocket, SIGNAL(commandFinished( KCommandSocket*, int )), this, SLOT(deleteCommandSocket(KCommandSocket*, int)) ); 1064 connect( commandSocket, SIGNAL(commandFinished( KCommandSocket*, int )), this, SLOT(deleteCommandSocket(KCommandSocket*, int)) );
1065 commandSocket->readFile( syncFileName() ); 1065 commandSocket->readFile( syncFileName() );
1066} 1066}
1067 1067
1068void KSyncManager::deleteCommandSocket(KCommandSocket*s, int state) 1068void KSyncManager::deleteCommandSocket(KCommandSocket*s, int state)
1069{ 1069{
1070 //enum { success, errorW, errorR, quiet }; 1070 //enum { success, errorW, errorR, quiet };
1071 if ( state == KCommandSocket::errorR ||state == KCommandSocket::errorTO ) { 1071 if ( state == KCommandSocket::errorR ||state == KCommandSocket::errorTO ) {
1072 mParent->topLevelWidget()->setCaption( i18n("ERROR: Receiving remote file failed.") ); 1072 mParent->topLevelWidget()->setCaption( i18n("ERROR: Receiving remote file failed.") );
1073 delete s; 1073 delete s;
1074 if ( state == KCommandSocket::errorR ) { 1074 if ( state == KCommandSocket::errorR ) {
1075 KCommandSocket* commandSocket = new KCommandSocket( mPassWordPiSync, mActiveSyncPort.toUInt(), mActiveSyncIP, this, mParent->topLevelWidget()); 1075 KCommandSocket* commandSocket = new KCommandSocket( mPassWordPiSync, mActiveSyncPort.toUInt(), mActiveSyncIP, this, mParent->topLevelWidget());
1076 connect( commandSocket, SIGNAL(commandFinished( KCommandSocket*, int)), this, SLOT(deleteCommandSocket(KCommandSocket*, int )) ); 1076 connect( commandSocket, SIGNAL(commandFinished( KCommandSocket*, int)), this, SLOT(deleteCommandSocket(KCommandSocket*, int )) );
1077 commandSocket->sendStop(); 1077 commandSocket->sendStop();
1078 } 1078 }
1079 mPisyncFinished = true; 1079 mPisyncFinished = true;
1080 return; 1080 return;
1081 1081
1082 } else if ( state == KCommandSocket::errorW ) { 1082 } else if ( state == KCommandSocket::errorW ) {
1083 mParent->topLevelWidget()->setCaption( i18n("ERROR:Writing back file failed.") ); 1083 mParent->topLevelWidget()->setCaption( i18n("ERROR:Writing back file failed.") );
1084 mPisyncFinished = true; 1084 mPisyncFinished = true;
1085 1085
1086 } else if ( state == KCommandSocket::successR ) { 1086 } else if ( state == KCommandSocket::successR ) {
1087 QTimer::singleShot( 1, this , SLOT ( readFileFromSocket())); 1087 QTimer::singleShot( 1, this , SLOT ( readFileFromSocket()));
1088 1088
1089 } else if ( state == KCommandSocket::successW ) { 1089 } else if ( state == KCommandSocket::successW ) {
1090 mParent->topLevelWidget()->setCaption( i18n("Pi-Sync succesful!") ); 1090 mParent->topLevelWidget()->setCaption( i18n("Pi-Sync successful!") );
1091 mPisyncFinished = true; 1091 mPisyncFinished = true;
1092 } 1092 }
1093 1093
1094 delete s; 1094 delete s;
1095} 1095}
1096 1096
1097void KSyncManager::readFileFromSocket() 1097void KSyncManager::readFileFromSocket()
1098{ 1098{
1099 QString fileName = syncFileName(); 1099 QString fileName = syncFileName();
1100 bool syncOK = true;
1100 mParent->topLevelWidget()->setCaption( i18n("Remote file saved to temp file.") ); 1101 mParent->topLevelWidget()->setCaption( i18n("Remote file saved to temp file.") );
1101 if ( ! syncWithFile( fileName , true ) ) { 1102 if ( ! syncWithFile( fileName , true ) ) {
1102 mParent->topLevelWidget()->setCaption( i18n("Syncing failed.") ); 1103 mParent->topLevelWidget()->setCaption( i18n("Syncing failed.") );
1103 mPisyncFinished = true; 1104 syncOK = false;
1104 return;
1105 } 1105 }
1106 KCommandSocket* commandSocket = new KCommandSocket( mPassWordPiSync, mActiveSyncPort.toUInt(), mActiveSyncIP, this, mParent->topLevelWidget() ); 1106 KCommandSocket* commandSocket = new KCommandSocket( mPassWordPiSync, mActiveSyncPort.toUInt(), mActiveSyncIP, this, mParent->topLevelWidget() );
1107 connect( commandSocket, SIGNAL(commandFinished( KCommandSocket*, int)), this, SLOT(deleteCommandSocket(KCommandSocket*, int )) ); 1107 connect( commandSocket, SIGNAL(commandFinished( KCommandSocket*, int)), this, SLOT(deleteCommandSocket(KCommandSocket*, int )) );
1108 if ( mWriteBackFile ) 1108 if ( mWriteBackFile && syncOK )
1109 commandSocket->writeFile( fileName ); 1109 commandSocket->writeFile( fileName );
1110 else { 1110 else {
1111 commandSocket->sendStop(); 1111 commandSocket->sendStop();
1112 mParent->topLevelWidget()->setCaption( i18n("Pi-Sync succesful!") ); 1112 if ( syncOK )
1113 mParent->topLevelWidget()->setCaption( i18n("Pi-Sync succesful!") );
1113 mPisyncFinished = true; 1114 mPisyncFinished = true;
1114 } 1115 }
1115} 1116}
1116 1117
1117KServerSocket:: KServerSocket ( QString pw, Q_UINT16 port, int backlog, QObject * parent, const char * name ) : QServerSocket( port, backlog, parent, name ) 1118KServerSocket:: KServerSocket ( QString pw, Q_UINT16 port, int backlog, QObject * parent, const char * name ) : QServerSocket( port, backlog, parent, name )
1118{ 1119{
1119 mPassWord = pw; 1120 mPassWord = pw;
1120 mSocket = 0; 1121 mSocket = 0;
1121 mSyncActionDialog = 0; 1122 mSyncActionDialog = 0;
1122 blockRC = false; 1123 blockRC = false;
1123} 1124}
1124 1125
1125void KServerSocket::newConnection ( int socket ) 1126void KServerSocket::newConnection ( int socket )
1126{ 1127{
1127 // qDebug("KServerSocket:New connection %d ", socket); 1128 // qDebug("KServerSocket:New connection %d ", socket);
1128 if ( mSocket ) { 1129 if ( mSocket ) {
1129 qDebug("KSS::newConnection Socket deleted! "); 1130 qDebug("KSS::newConnection Socket deleted! ");
1130 delete mSocket; 1131 delete mSocket;
1131 mSocket = 0; 1132 mSocket = 0;
1132 } 1133 }
1133 mSocket = new QSocket( this ); 1134 mSocket = new QSocket( this );
1134 connect( mSocket , SIGNAL(readyRead()), this, SLOT(readClient()) ); 1135 connect( mSocket , SIGNAL(readyRead()), this, SLOT(readClient()) );
1135 connect( mSocket , SIGNAL(delayedCloseFinished()), this, SLOT(discardClient()) ); 1136 connect( mSocket , SIGNAL(delayedCloseFinished()), this, SLOT(discardClient()) );
1136 mSocket->setSocket( socket ); 1137 mSocket->setSocket( socket );
1137} 1138}
1138 1139
1139void KServerSocket::discardClient() 1140void KServerSocket::discardClient()
1140{ 1141{
1141 //qDebug(" KServerSocket::discardClient()"); 1142 //qDebug(" KServerSocket::discardClient()");
1142 if ( mSocket ) { 1143 if ( mSocket ) {
1143 delete mSocket; 1144 delete mSocket;
1144 mSocket = 0; 1145 mSocket = 0;
1145 } 1146 }
1146 //emit endConnect(); 1147 //emit endConnect();
1147} 1148}
1148void KServerSocket::readClient() 1149void KServerSocket::readClient()
1149{ 1150{
1150 if ( blockRC ) 1151 if ( blockRC )
1151 return; 1152 return;
1152 if ( mSocket == 0 ) { 1153 if ( mSocket == 0 ) {
1153 qDebug("ERROR::KSS::readClient(): mSocket == 0 "); 1154 qDebug("ERROR::KSS::readClient(): mSocket == 0 ");
1154 return; 1155 return;
1155 } 1156 }
1156 //qDebug("KServerSocket::readClient()"); 1157 //qDebug("KServerSocket::readClient()");
1157 if ( mSocket->canReadLine() ) { 1158 if ( mSocket->canReadLine() ) {
1158 QString line = mSocket->readLine(); 1159 QString line = mSocket->readLine();
1159 //qDebug("KServerSocket readline: %s ", line.latin1()); 1160 //qDebug("KServerSocket readline: %s ", line.latin1());
1160 QStringList tokens = QStringList::split( QRegExp("[ \r\n][ \r\n]*"), line ); 1161 QStringList tokens = QStringList::split( QRegExp("[ \r\n][ \r\n]*"), line );
1161 if ( tokens[0] == "GET" ) { 1162 if ( tokens[0] == "GET" ) {
1162 if ( tokens[1] == mPassWord ) { 1163 if ( tokens[1] == mPassWord ) {
1163 //emit sendFile( mSocket ); 1164 //emit sendFile( mSocket );
1164 bool ok = false; 1165 bool ok = false;
1165 QDateTime dt = KGlobal::locale()->readDateTime( tokens[2], KLocale::ISODate, &ok); 1166 QDateTime dt = KGlobal::locale()->readDateTime( tokens[2], KLocale::ISODate, &ok);
1166 if ( ok ) { 1167 if ( ok ) {
1167 KSyncManager::mRequestedSyncEvent = dt; 1168 KSyncManager::mRequestedSyncEvent = dt;
1168 } 1169 }
1169 else 1170 else
1170 KSyncManager::mRequestedSyncEvent = QDateTime(); 1171 KSyncManager::mRequestedSyncEvent = QDateTime();
1171 send_file(); 1172 send_file();
1172 } 1173 }
1173 else { 1174 else {
1174 KMessageBox::error( 0, i18n("Got send file request\nwith invalid password")); 1175 KMessageBox::error( 0, i18n("Got send file request\nwith invalid password"));
1175 //qDebug("password %s, invalid password %s ",mPassWord.latin1(), tokens[1].latin1() ); 1176 //qDebug("password %s, invalid password %s ",mPassWord.latin1(), tokens[1].latin1() );
1176 } 1177 }
1177 } 1178 }
1178 if ( tokens[0] == "PUT" ) { 1179 if ( tokens[0] == "PUT" ) {
1179 if ( tokens[1] == mPassWord ) { 1180 if ( tokens[1] == mPassWord ) {
1180 //emit getFile( mSocket ); 1181 //emit getFile( mSocket );
1181 blockRC = true; 1182 blockRC = true;
1182 get_file(); 1183 get_file();
1183 } 1184 }
1184 else { 1185 else {
1185 KMessageBox::error( 0, i18n("Got receive file request\nwith invalid password")); 1186 KMessageBox::error( 0, i18n("Got receive file request\nwith invalid password"));
1186 //qDebug("password %s, invalid password %s ",mPassWord.latin1(), tokens[1].latin1() ); 1187 //qDebug("password %s, invalid password %s ",mPassWord.latin1(), tokens[1].latin1() );
1187 } 1188 }
1188 } 1189 }
1189 if ( tokens[0] == "STOP" ) { 1190 if ( tokens[0] == "STOP" ) {
1190 //emit endConnect(); 1191 //emit endConnect();
1191 end_connect(); 1192 end_connect();
1192 } 1193 }
1193 } 1194 }
1194} 1195}
1195void KServerSocket::end_connect() 1196void KServerSocket::end_connect()
1196{ 1197{
1197 delete mSyncActionDialog; 1198 delete mSyncActionDialog;
1198 mSyncActionDialog = 0; 1199 mSyncActionDialog = 0;
1199} 1200}
1200void KServerSocket::send_file() 1201void KServerSocket::send_file()
1201{ 1202{
1202 //qDebug("MainWindow::sendFile(QSocket* s) "); 1203 //qDebug("MainWindow::sendFile(QSocket* s) ");
1203 if ( mSyncActionDialog ) 1204 if ( mSyncActionDialog )
1204 delete mSyncActionDialog; 1205 delete mSyncActionDialog;
1205 mSyncActionDialog = new QDialog ( 0, "input-dialog", true ); 1206 mSyncActionDialog = new QDialog ( 0, "input-dialog", true );
1206 mSyncActionDialog->setCaption(i18n("Received sync request")); 1207 mSyncActionDialog->setCaption(i18n("Received sync request"));
1207 QLabel* label = new QLabel( i18n("Synchronizing from remote ...\n\nDo not use this application!\n\nIf syncing fails\nyou can close this dialog."), mSyncActionDialog ); 1208 QLabel* label = new QLabel( i18n("Synchronizing from remote ...\n\nDo not use this application!\n\nIf syncing fails\nyou can close this dialog."), mSyncActionDialog );
1208 label->setAlignment ( Qt::AlignHCenter ); 1209 label->setAlignment ( Qt::AlignHCenter );
1209 QVBoxLayout* lay = new QVBoxLayout( mSyncActionDialog ); 1210 QVBoxLayout* lay = new QVBoxLayout( mSyncActionDialog );
1210 lay->addWidget( label); 1211 lay->addWidget( label);
1211 lay->setMargin(7); 1212 lay->setMargin(7);
1212 lay->setSpacing(7); 1213 lay->setSpacing(7);
1213 if ( KSyncManager::mRequestedSyncEvent.isValid() ) { 1214 if ( KSyncManager::mRequestedSyncEvent.isValid() ) {
1214 int secs = QDateTime::currentDateTime().secsTo( KSyncManager::mRequestedSyncEvent ); 1215 int secs = QDateTime::currentDateTime().secsTo( KSyncManager::mRequestedSyncEvent );
1215 if ( secs < 0 ) 1216 if ( secs < 0 )
1216 secs = secs * (-1); 1217 secs = secs * (-1);
1217 if ( secs > 30 ) 1218 if ( secs > 30 )
1218 //if ( true ) 1219 //if ( true )
1219 { 1220 {
1220 QString warning = i18n("Clock skew of\nsyncing devices\nis %1 seconds!").arg( secs ); 1221 QString warning = i18n("Clock skew of\nsyncing devices\nis %1 seconds!").arg( secs );
1221 QLabel* label = new QLabel( warning, mSyncActionDialog ); 1222 QLabel* label = new QLabel( warning, mSyncActionDialog );
1222 label->setAlignment ( Qt::AlignHCenter ); 1223 label->setAlignment ( Qt::AlignHCenter );
1223 lay->addWidget( label); 1224 lay->addWidget( label);
1224 if ( secs > 180 ) 1225 if ( secs > 180 )
1225 { 1226 {
1226 if ( secs > 300 ) { 1227 if ( secs > 300 ) {
1227 if ( KMessageBox::Cancel == KMessageBox::warningContinueCancel(0, i18n("The clocks of the syncing\ndevices have a difference\n of more than 5 minutes.\nPlease adjust your clocks.\n<b>You may get wrong syncing results!<\b>\nPlease confirm synchronization!"), i18n("High clock skew!"),i18n("Synchronize!"))) { 1228 if ( KMessageBox::Cancel == KMessageBox::warningContinueCancel(0, i18n("The clocks of the syncing\ndevices have a difference\nof more than 5 minutes.\nPlease adjust your clocks.\nYou may get wrong syncing results!\nPlease confirm synchronization!"), i18n("High clock skew!"),i18n("Synchronize!"))) {
1228 qDebug("KSS::Sync cancelled ,cs"); 1229 qDebug("KSS::Sync cancelled ,cs");
1229 return ; 1230 return ;
1230 } 1231 }
1231 } 1232 }
1232 QFont f = label->font(); 1233 QFont f = label->font();
1233 f.setPointSize ( f.pointSize() *2 ); 1234 f.setPointSize ( f.pointSize() *2 );
1234 f. setBold (true ); 1235 f. setBold (true );
1235 QLabel* label = new QLabel( warning, mSyncActionDialog ); 1236 QLabel* label = new QLabel( warning, mSyncActionDialog );
1236 label->setFont( f ); 1237 label->setFont( f );
1237 warning = i18n("ADJUST\nYOUR\nCLOCKS!"); 1238 warning = i18n("ADJUST\nYOUR\nCLOCKS!");
1238 label->setText( warning ); 1239 label->setText( warning );
1239 label->setAlignment ( Qt::AlignHCenter ); 1240 label->setAlignment ( Qt::AlignHCenter );
1240 lay->addWidget( label); 1241 lay->addWidget( label);
1241 mSyncActionDialog->setFixedSize( 230, 300); 1242 mSyncActionDialog->setFixedSize( 230, 300);
1242 } else { 1243 } else {
1243 mSyncActionDialog->setFixedSize( 230, 200); 1244 mSyncActionDialog->setFixedSize( 230, 200);
1244 } 1245 }
1245 } else { 1246 } else {
1246 mSyncActionDialog->setFixedSize( 230, 120); 1247 mSyncActionDialog->setFixedSize( 230, 120);
1247 } 1248 }
1248 } else 1249 } else
1249 mSyncActionDialog->setFixedSize( 230, 120); 1250 mSyncActionDialog->setFixedSize( 230, 120);
1250 mSyncActionDialog->show(); 1251 mSyncActionDialog->show();
1251 mSyncActionDialog->raise(); 1252 mSyncActionDialog->raise();
1252 emit request_file(); 1253 emit request_file();
1253 qApp->processEvents(); 1254 qApp->processEvents();
1254 QString fileName = mFileName; 1255 QString fileName = mFileName;
1255 QFile file( fileName ); 1256 QFile file( fileName );
1256 if (!file.open( IO_ReadOnly ) ) { 1257 if (!file.open( IO_ReadOnly ) ) {
1257 delete mSyncActionDialog; 1258 delete mSyncActionDialog;
1258 mSyncActionDialog = 0; 1259 mSyncActionDialog = 0;
1259 qDebug("KSS::error open sync file: %s ", fileName.latin1()); 1260 qDebug("KSS::error open sync file: %s ", fileName.latin1());
1260 mSocket->close(); 1261 mSocket->close();
1261 if ( mSocket->state() == QSocket::Idle ) 1262 if ( mSocket->state() == QSocket::Idle )
1262 QTimer::singleShot( 10, this , SLOT ( discardClient())); 1263 QTimer::singleShot( 10, this , SLOT ( discardClient()));
1263 return ; 1264 return ;
1264 1265
1265 } 1266 }
1266 mSyncActionDialog->setCaption( i18n("Sending file...") ); 1267 mSyncActionDialog->setCaption( i18n("Sending file...") );
1267 QTextStream ts( &file ); 1268 QTextStream ts( &file );
1268 ts.setEncoding( QTextStream::Latin1 ); 1269 ts.setEncoding( QTextStream::Latin1 );
1269 1270
1270 QTextStream os( mSocket ); 1271 QTextStream os( mSocket );
1271 os.setEncoding( QTextStream::Latin1 ); 1272 os.setEncoding( QTextStream::Latin1 );
1272 while ( ! ts.atEnd() ) { 1273 while ( ! ts.atEnd() ) {
1273 os << ts.readLine() << "\r\n\r\n"; 1274 os << ts.readLine() << "\r\n\r\n";
1274 } 1275 }
1275 //os << ts.read(); 1276 //os << ts.read();
1276 file.close(); 1277 file.close();
1277 mSyncActionDialog->setCaption( i18n("Waiting for synced file...") ); 1278 mSyncActionDialog->setCaption( i18n("Waiting for synced file...") );
1278 mSocket->close(); 1279 mSocket->close();
1279 if ( mSocket->state() == QSocket::Idle ) 1280 if ( mSocket->state() == QSocket::Idle )
1280 QTimer::singleShot( 10, this , SLOT ( discardClient())); 1281 QTimer::singleShot( 10, this , SLOT ( discardClient()));
1281} 1282}
1282void KServerSocket::get_file() 1283void KServerSocket::get_file()
1283{ 1284{
1284 mSyncActionDialog->setCaption( i18n("Receiving synced file...") ); 1285 mSyncActionDialog->setCaption( i18n("Receiving synced file...") );
1285 1286
1286 piTime.start(); 1287 piTime.start();
1287 piFileString = ""; 1288 piFileString = "";
1288 QTimer::singleShot( 1, this , SLOT (readBackFileFromSocket( ) )); 1289 QTimer::singleShot( 1, this , SLOT (readBackFileFromSocket( ) ));
1289} 1290}
1290 1291
1291 1292
1292void KServerSocket::readBackFileFromSocket() 1293void KServerSocket::readBackFileFromSocket()
1293{ 1294{
1294 //qDebug("readBackFileFromSocket() %d ", piTime.elapsed ()); 1295 //qDebug("readBackFileFromSocket() %d ", piTime.elapsed ());
1295 while ( mSocket->canReadLine () ) { 1296 while ( mSocket->canReadLine () ) {
1296 piTime.restart(); 1297 piTime.restart();
1297 QString line = mSocket->readLine (); 1298 QString line = mSocket->readLine ();
1298 piFileString += line; 1299 piFileString += line;
1299 //qDebug("readline: %s ", line.latin1()); 1300 //qDebug("readline: %s ", line.latin1());
1300 mSyncActionDialog->setCaption( i18n("Received %1 bytes").arg( piFileString.length() ) ); 1301 mSyncActionDialog->setCaption( i18n("Received %1 bytes").arg( piFileString.length() ) );
1301 1302
1302 } 1303 }
1303 if ( piTime.elapsed () < 3000 ) { 1304 if ( piTime.elapsed () < 3000 ) {
1304 // wait for more 1305 // wait for more
1305 //qDebug("waitformore "); 1306 //qDebug("waitformore ");
1306 QTimer::singleShot( 100, this , SLOT (readBackFileFromSocket( ) )); 1307 QTimer::singleShot( 100, this , SLOT (readBackFileFromSocket( ) ));
1307 return; 1308 return;
1308 } 1309 }
1309 QString fileName = mFileName; 1310 QString fileName = mFileName;
1310 QFile file ( fileName ); 1311 QFile file ( fileName );
1311 if (!file.open( IO_WriteOnly ) ) { 1312 if (!file.open( IO_WriteOnly ) ) {
1312 delete mSyncActionDialog; 1313 delete mSyncActionDialog;
1313 mSyncActionDialog = 0; 1314 mSyncActionDialog = 0;
1314 qDebug("KSS:Error open read back file "); 1315 qDebug("KSS:Error open read back file ");
1315 piFileString = ""; 1316 piFileString = "";
1316 emit file_received( false ); 1317 emit file_received( false );
1317 blockRC = false; 1318 blockRC = false;
1318 return ; 1319 return ;
1319 1320
1320 } 1321 }
1321 1322
1322 // mView->setLoadedFileVersion(QDateTime::currentDateTime().addSecs( -1)); 1323 // mView->setLoadedFileVersion(QDateTime::currentDateTime().addSecs( -1));
1323 QTextStream ts ( &file ); 1324 QTextStream ts ( &file );
1324 ts.setEncoding( QTextStream::Latin1 ); 1325 ts.setEncoding( QTextStream::Latin1 );
1325 mSyncActionDialog->setCaption( i18n("Writing file to disk...") ); 1326 mSyncActionDialog->setCaption( i18n("Writing file to disk...") );
1326 ts << piFileString; 1327 ts << piFileString;
1327 mSocket->close(); 1328 mSocket->close();
1328 if ( mSocket->state() == QSocket::Idle ) 1329 if ( mSocket->state() == QSocket::Idle )
1329 QTimer::singleShot( 10, this , SLOT ( discardClient())); 1330 QTimer::singleShot( 10, this , SLOT ( discardClient()));
1330 file.close(); 1331 file.close();
1331 piFileString = ""; 1332 piFileString = "";
1332 emit file_received( true ); 1333 emit file_received( true );
1333 delete mSyncActionDialog; 1334 delete mSyncActionDialog;
1334 mSyncActionDialog = 0; 1335 mSyncActionDialog = 0;
1335 blockRC = false; 1336 blockRC = false;
1336 1337
1337} 1338}
1338 1339
1339KCommandSocket::KCommandSocket ( QString password, Q_UINT16 port, QString host, QObject * parent, QWidget * cap, const char * name ): QObject( parent, name ) 1340KCommandSocket::KCommandSocket ( QString password, Q_UINT16 port, QString host, QObject * parent, QWidget * cap, const char * name ): QObject( parent, name )
1340{ 1341{
1341 mPassWord = password; 1342 mPassWord = password;
1342 mSocket = 0; 1343 mSocket = 0;
1343 mFirst = false; 1344 mFirst = false;
1344 mPort = port; 1345 mPort = port;
1345 mHost = host; 1346 mHost = host;
1346 tlw = cap; 1347 tlw = cap;
1347 mRetVal = quiet; 1348 mRetVal = quiet;
1348 mTimerSocket = new QTimer ( this ); 1349 mTimerSocket = new QTimer ( this );
1349 connect( mTimerSocket, SIGNAL ( timeout () ), this, SLOT ( deleteSocket() ) ); 1350 connect( mTimerSocket, SIGNAL ( timeout () ), this, SLOT ( deleteSocket() ) );
1350} 1351}
1351void KCommandSocket::sendFileRequest() 1352void KCommandSocket::sendFileRequest()
1352{ 1353{
1353 if ( tlw ) 1354 if ( tlw )
1354 tlw->setCaption( i18n("Connected! Sending request for remote file ...") ); 1355 tlw->setCaption( i18n("Connected! Sending request for remote file ...") );
1355 mTimerSocket->start( 300000 ); 1356 mTimerSocket->start( 300000 );
1356 QTextStream os( mSocket ); 1357 QTextStream os( mSocket );
1357 os.setEncoding( QTextStream::Latin1 ); 1358 os.setEncoding( QTextStream::Latin1 );
1358 1359
1359 QString curDt = " " +KGlobal::locale()->formatDateTime(QDateTime::currentDateTime().addSecs(-1),true, true,KLocale::ISODate ); 1360 QString curDt = " " +KGlobal::locale()->formatDateTime(QDateTime::currentDateTime().addSecs(-1),true, true,KLocale::ISODate );
1360 os << "GET " << mPassWord << curDt <<"\r\n\r\n"; 1361 os << "GET " << mPassWord << curDt <<"\r\n\r\n";
1361} 1362}
1362 1363
1363void KCommandSocket::readFile( QString fn ) 1364void KCommandSocket::readFile( QString fn )
1364{ 1365{
1365 if ( !mSocket ) { 1366 if ( !mSocket ) {
1366 mSocket = new QSocket( this ); 1367 mSocket = new QSocket( this );
1367 connect( mSocket, SIGNAL(readyRead()), this, SLOT(startReadFileFromSocket()) ); 1368 connect( mSocket, SIGNAL(readyRead()), this, SLOT(startReadFileFromSocket()) );
1368 connect( mSocket, SIGNAL(delayedCloseFinished ()), this, SLOT(deleteSocket()) ); 1369 connect( mSocket, SIGNAL(delayedCloseFinished ()), this, SLOT(deleteSocket()) );
1369 connect( mSocket, SIGNAL(connected ()), this, SLOT(sendFileRequest() )); 1370 connect( mSocket, SIGNAL(connected ()), this, SLOT(sendFileRequest() ));
1370 } 1371 }
1371 mFileString = ""; 1372 mFileString = "";
1372 mFileName = fn; 1373 mFileName = fn;
1373 mFirst = true; 1374 mFirst = true;
1374 if ( tlw ) 1375 if ( tlw )
1375 tlw->setCaption( i18n("Trying to connect to remote...") ); 1376 tlw->setCaption( i18n("Trying to connect to remote...") );
1376 mSocket->connectToHost( mHost, mPort ); 1377 mSocket->connectToHost( mHost, mPort );
1377 qDebug("KSS: Waiting for connection"); 1378 qDebug("KSS: Waiting for connection");
1378 mTimerSocket->start( 20000 ); 1379 mTimerSocket->start( 20000 );
1379} 1380}
1380 1381
1381void KCommandSocket::writeFile( QString fileName ) 1382void KCommandSocket::writeFile( QString fileName )
1382{ 1383{
1383 if ( !mSocket ) { 1384 if ( !mSocket ) {
1384 mSocket = new QSocket( this ); 1385 mSocket = new QSocket( this );
1385 connect( mSocket, SIGNAL(delayedCloseFinished ()), this, SLOT(deleteSocket()) ); 1386 connect( mSocket, SIGNAL(delayedCloseFinished ()), this, SLOT(deleteSocket()) );
1386 connect( mSocket, SIGNAL(connected ()), this, SLOT(writeFileToSocket()) ); 1387 connect( mSocket, SIGNAL(connected ()), this, SLOT(writeFileToSocket()) );
1387 } 1388 }
1388 mFileName = fileName ; 1389 mFileName = fileName ;
1389 mSocket->connectToHost( mHost, mPort ); 1390 mSocket->connectToHost( mHost, mPort );
1390} 1391}
1391void KCommandSocket::writeFileToSocket() 1392void KCommandSocket::writeFileToSocket()
1392{ 1393{
1393 QFile file2( mFileName ); 1394 QFile file2( mFileName );
1394 if (!file2.open( IO_ReadOnly ) ) { 1395 if (!file2.open( IO_ReadOnly ) ) {
1395 mRetVal= errorW; 1396 mRetVal= errorW;
1396 mSocket->close(); 1397 mSocket->close();
1397 if ( mSocket->state() == QSocket::Idle ) 1398 if ( mSocket->state() == QSocket::Idle )
1398 QTimer::singleShot( 10, this , SLOT ( deleteSocket())); 1399 QTimer::singleShot( 10, this , SLOT ( deleteSocket()));
1399 return ; 1400 return ;
1400 } 1401 }
1401 QTextStream ts2( &file2 ); 1402 QTextStream ts2( &file2 );
1402 ts2.setEncoding( QTextStream::Latin1 ); 1403 ts2.setEncoding( QTextStream::Latin1 );
1403 QTextStream os2( mSocket ); 1404 QTextStream os2( mSocket );
1404 os2.setEncoding( QTextStream::Latin1 ); 1405 os2.setEncoding( QTextStream::Latin1 );
1405 os2 << "PUT " << mPassWord << "\r\n\r\n";; 1406 os2 << "PUT " << mPassWord << "\r\n\r\n";;
1406 while ( ! ts2.atEnd() ) { 1407 while ( ! ts2.atEnd() ) {
1407 os2 << ts2.readLine() << "\r\n\r\n"; 1408 os2 << ts2.readLine() << "\r\n\r\n";
1408 } 1409 }
1409 mRetVal= successW; 1410 mRetVal= successW;
1410 file2.close(); 1411 file2.close();
1411 mSocket->close(); 1412 mSocket->close();
1412 if ( mSocket->state() == QSocket::Idle ) 1413 if ( mSocket->state() == QSocket::Idle )
1413 QTimer::singleShot( 10, this , SLOT ( deleteSocket())); 1414 QTimer::singleShot( 10, this , SLOT ( deleteSocket()));
1414} 1415}
1415void KCommandSocket::sendStop() 1416void KCommandSocket::sendStop()
1416{ 1417{
1417 if ( !mSocket ) { 1418 if ( !mSocket ) {
1418 mSocket = new QSocket( this ); 1419 mSocket = new QSocket( this );
1419 connect( mSocket, SIGNAL(delayedCloseFinished ()), this, SLOT(deleteSocket()) ); 1420 connect( mSocket, SIGNAL(delayedCloseFinished ()), this, SLOT(deleteSocket()) );
1420 } 1421 }
1421 mSocket->connectToHost( mHost, mPort ); 1422 mSocket->connectToHost( mHost, mPort );
1422 QTextStream os2( mSocket ); 1423 QTextStream os2( mSocket );
1423 os2.setEncoding( QTextStream::Latin1 ); 1424 os2.setEncoding( QTextStream::Latin1 );
1424 os2 << "STOP\r\n\r\n"; 1425 os2 << "STOP\r\n\r\n";
1425 mSocket->close(); 1426 mSocket->close();
1426 if ( mSocket->state() == QSocket::Idle ) 1427 if ( mSocket->state() == QSocket::Idle )
1427 QTimer::singleShot( 10, this , SLOT ( deleteSocket())); 1428 QTimer::singleShot( 10, this , SLOT ( deleteSocket()));
1428} 1429}
1429 1430
1430void KCommandSocket::startReadFileFromSocket() 1431void KCommandSocket::startReadFileFromSocket()
1431{ 1432{
1432 if ( ! mFirst ) 1433 if ( ! mFirst )
1433 return; 1434 return;
1434 mFirst = false; 1435 mFirst = false;
1435 mTimerSocket->stop(); 1436 mTimerSocket->stop();
1436 mFileString = ""; 1437 mFileString = "";
1437 mTime.start(); 1438 mTime.start();
1438 QTimer::singleShot( 1, this , SLOT (readFileFromSocket( ) )); 1439 QTimer::singleShot( 1, this , SLOT (readFileFromSocket( ) ));
1439 1440
1440} 1441}
1441void KCommandSocket::readFileFromSocket() 1442void KCommandSocket::readFileFromSocket()
1442{ 1443{
1443 //qDebug("readBackFileFromSocket() %d ", mTime.elapsed ()); 1444 //qDebug("readBackFileFromSocket() %d ", mTime.elapsed ());
1444 while ( mSocket->canReadLine () ) { 1445 while ( mSocket->canReadLine () ) {
1445 mTime.restart(); 1446 mTime.restart();
1446 QString line = mSocket->readLine (); 1447 QString line = mSocket->readLine ();
1447 mFileString += line; 1448 mFileString += line;
1448 //qDebug("readline: %s ", line.latin1()); 1449 //qDebug("readline: %s ", line.latin1());
1449 } 1450 }
1450 if ( mTime.elapsed () < 3000 ) { 1451 if ( mTime.elapsed () < 3000 ) {
1451 // wait for more 1452 // wait for more
1452 //qDebug("waitformore "); 1453 //qDebug("waitformore ");
1453 QTimer::singleShot( 100, this , SLOT (readFileFromSocket( ) )); 1454 QTimer::singleShot( 100, this , SLOT (readFileFromSocket( ) ));
1454 return; 1455 return;
1455 } 1456 }
1456 QString fileName = mFileName; 1457 QString fileName = mFileName;
1457 QFile file ( fileName ); 1458 QFile file ( fileName );
1458 if (!file.open( IO_WriteOnly ) ) { 1459 if (!file.open( IO_WriteOnly ) ) {
1459 mFileString = ""; 1460 mFileString = "";
1460 mRetVal = errorR; 1461 mRetVal = errorR;
1461 qDebug("KSS:Error open temp sync file for writing: %s",fileName.latin1() ); 1462 qDebug("KSS:Error open temp sync file for writing: %s",fileName.latin1() );
1462 deleteSocket(); 1463 deleteSocket();
1463 return ; 1464 return ;
1464 1465
1465 } 1466 }
1466 // mView->setLoadedFileVersion(QDateTime::currentDateTime().addSecs( -1)); 1467 // mView->setLoadedFileVersion(QDateTime::currentDateTime().addSecs( -1));
1467 QTextStream ts ( &file ); 1468 QTextStream ts ( &file );
1468 ts.setEncoding( QTextStream::Latin1 ); 1469 ts.setEncoding( QTextStream::Latin1 );
1469 ts << mFileString; 1470 ts << mFileString;
1470 file.close(); 1471 file.close();
1471 mFileString = ""; 1472 mFileString = "";
1472 mRetVal = successR; 1473 mRetVal = successR;
1473 mSocket->close(); 1474 mSocket->close();
1474 // if state is not idle, deleteSocket(); is called via 1475 // if state is not idle, deleteSocket(); is called via
1475 // connect( mSocket, SIGNAL(delayedCloseFinished ()), this, SLOT(deleteSocket()) ); 1476 // connect( mSocket, SIGNAL(delayedCloseFinished ()), this, SLOT(deleteSocket()) );
1476 if ( mSocket->state() == QSocket::Idle ) 1477 if ( mSocket->state() == QSocket::Idle )
1477 deleteSocket(); 1478 deleteSocket();
1478} 1479}
1479 1480
1480void KCommandSocket::deleteSocket() 1481void KCommandSocket::deleteSocket()
1481{ 1482{
1482 //qDebug("KCommandSocket::deleteSocket() "); 1483 //qDebug("KCommandSocket::deleteSocket() ");
1483 if ( mTimerSocket->isActive () ) { 1484 if ( mTimerSocket->isActive () ) {
1484 mTimerSocket->stop(); 1485 mTimerSocket->stop();
1485 mRetVal = errorTO; 1486 mRetVal = errorTO;
1486 qDebug("KCS::Connection to remote host timed out"); 1487 qDebug("KCS::Connection to remote host timed out");
1487 if ( mSocket ) { 1488 if ( mSocket ) {
1488 mSocket->close(); 1489 mSocket->close();
1489 //if ( mSocket->state() == QSocket::Idle ) 1490 //if ( mSocket->state() == QSocket::Idle )
1490 // deleteSocket(); 1491 // deleteSocket();
1491 delete mSocket; 1492 delete mSocket;
1492 mSocket = 0; 1493 mSocket = 0;
1493 } 1494 }
1494 KMessageBox::error( 0, i18n("Connection to remote\nhost timed out!\nDid you forgot to enable\nsyncing on remote host?")); 1495 KMessageBox::error( 0, i18n("Connection to remote\nhost timed out!\nDid you forgot to enable\nsyncing on remote host?"));
1495 emit commandFinished( this, mRetVal ); 1496 emit commandFinished( this, mRetVal );
1496 return; 1497 return;
1497 } 1498 }
1498 //qDebug("KCommandSocket::deleteSocket() %d", mRetVal ); 1499 //qDebug("KCommandSocket::deleteSocket() %d", mRetVal );
1499 if ( mSocket) 1500 if ( mSocket)
1500 delete mSocket; 1501 delete mSocket;
1501 mSocket = 0; 1502 mSocket = 0;
1502 emit commandFinished( this, mRetVal ); 1503 emit commandFinished( this, mRetVal );
1503} 1504}
diff --git a/microkde/kdecore/klocale.cpp b/microkde/kdecore/klocale.cpp
index 7f31ab1..aec74fa 100644
--- a/microkde/kdecore/klocale.cpp
+++ b/microkde/kdecore/klocale.cpp
@@ -1,523 +1,523 @@
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#include <qstringlist.h> 9#include <qstringlist.h>
10 10
11//#define COLLECT_TRANSLATION 11#define COLLECT_TRANSLATION
12 12
13 13
14QDict<QString> *mLocaleDict = 0; 14QDict<QString> *mLocaleDict = 0;
15void setLocaleDict( QDict<QString> * dict ) 15void setLocaleDict( QDict<QString> * dict )
16{ 16{
17 mLocaleDict = dict; 17 mLocaleDict = dict;
18 18
19} 19}
20 20
21#ifdef COLLECT_TRANSLATION 21#ifdef COLLECT_TRANSLATION
22 22
23QStringList missingTrans; 23QStringList missingTrans;
24QStringList existingTrans1; 24QStringList existingTrans1;
25QStringList existingTrans2; 25QStringList existingTrans2;
26 26
27void addMissing(const char *text) 27void addMissing(const char *text)
28{ 28{
29 29
30 QString mis ( text ); 30 QString mis ( text );
31 if ( !missingTrans.contains( mis ) ) 31 if ( !missingTrans.contains( mis ) )
32 missingTrans.append(mis); 32 missingTrans.append(mis);
33 33
34} 34}
35void addExist(const char *text,QString trans ) 35void addExist(const char *text,QString trans )
36{ 36{
37 //return; 37 //return;
38 QString mis ( text ); 38 QString mis ( text );
39 if ( !existingTrans1.contains( mis ) ) { 39 if ( !existingTrans1.contains( mis ) ) {
40 existingTrans1.append(mis); 40 existingTrans1.append(mis);
41 existingTrans2.append(trans); 41 existingTrans2.append(trans);
42 42
43 } 43 }
44 44
45} 45}
46 46
47#include <qfile.h> 47#include <qfile.h>
48#include <qtextstream.h> 48#include <qtextstream.h>
49#include <qtextcodec.h> 49#include <qtextcodec.h>
50#endif 50#endif
51void dumpMissing() 51void dumpMissing()
52{ 52{
53#ifdef COLLECT_TRANSLATION 53#ifdef COLLECT_TRANSLATION
54 QString fileName = "/tmp/usernewtrans.txt"; 54 QString fileName = "/tmp/usernewtrans.txt";
55 QFile file( fileName ); 55 QFile file( fileName );
56 if (!file.open( IO_WriteOnly ) ) { 56 if (!file.open( IO_WriteOnly ) ) {
57 return ; 57 return ;
58 } 58 }
59 QTextStream ts( &file ); 59 QTextStream ts( &file );
60 ts.setCodec( QTextCodec::codecForName("utf8") ); 60 ts.setCodec( QTextCodec::codecForName("utf8") );
61 61
62 int i; 62 int i;
63 for ( i = 0; i< missingTrans.count(); ++i ) { 63 for ( i = 0; i< missingTrans.count(); ++i ) {
64 64
65 QString text = missingTrans[i].replace( QRegExp("\n"),"\\n" ); 65 QString text = missingTrans[i].replace( QRegExp("\n"),"\\n" );
66 ts << "{ \""<<text<< "\",\""<< text <<"\" },\n"; 66 ts << "{ \""<<text<< "\",\""<< text <<"\" },\n";
67 67
68 } 68 }
69 file.close(); 69 file.close();
70 { 70 {
71 QString fileName = "/tmp/usertrans.txt"; 71 QString fileName = "/tmp/usertrans.txt";
72 QFile file( fileName ); 72 QFile file( fileName );
73 if (!file.open( IO_WriteOnly ) ) { 73 if (!file.open( IO_WriteOnly ) ) {
74 return ; 74 return ;
75 } 75 }
76 QTextStream ts( &file ); 76 QTextStream ts( &file );
77 ts.setCodec( QTextCodec::codecForName("utf8") ); 77 ts.setCodec( QTextCodec::codecForName("utf8") );
78 78
79 int i; 79 int i;
80 for ( i = 0; i< existingTrans1.count(); ++i ) { 80 for ( i = 0; i< existingTrans1.count(); ++i ) {
81 81
82 QString text = existingTrans1[i].replace( QRegExp("\n"),"\\n" ); 82 QString text = existingTrans1[i].replace( QRegExp("\n"),"\\n" );
83 QString text2 = existingTrans2[i].replace( QRegExp("\n"),"\\n" ); 83 QString text2 = existingTrans2[i].replace( QRegExp("\n"),"\\n" );
84 ts << "{ \""<<text<< "\",\""<< text2 <<"\" },\n"; 84 ts << "{ \""<<text<< "\",\""<< text2 <<"\" },\n";
85 85
86 } 86 }
87 file.close(); 87 file.close();
88 } 88 }
89#endif 89#endif
90} 90}
91QString i18n(const char *text) 91QString i18n(const char *text)
92{ 92{
93 if ( ! mLocaleDict ) { 93 if ( ! mLocaleDict ) {
94#ifdef COLLECT_TRANSLATION 94#ifdef COLLECT_TRANSLATION
95 addMissing( text ); 95 addMissing( text );
96#endif 96#endif
97 return QString( text ); 97 return QString( text );
98 } 98 }
99 else { 99 else {
100 QString* ret = mLocaleDict->find(QString(text)) ; 100 QString* ret = mLocaleDict->find(QString(text)) ;
101 if ( ret == 0 ) { 101 if ( ret == 0 ) {
102#ifdef COLLECT_TRANSLATION 102#ifdef COLLECT_TRANSLATION
103 addMissing( text ); 103 addMissing( text );
104#endif 104#endif
105 return QString( text ); 105 return QString( text );
106 } 106 }
107 else { 107 else {
108 if ( (*ret).isEmpty() ) { 108 if ( (*ret).isEmpty() ) {
109#ifdef COLLECT_TRANSLATION 109#ifdef COLLECT_TRANSLATION
110 addMissing( text ); 110 addMissing( text );
111#endif 111#endif
112 return QString( text ); 112 return QString( text );
113 } 113 }
114 else { 114 else {
115#ifdef COLLECT_TRANSLATION 115#ifdef COLLECT_TRANSLATION
116 addExist( text, *ret ); 116 addExist( text, *ret );
117#endif 117#endif
118 return (*ret); 118 return (*ret);
119 } 119 }
120 } 120 }
121 } 121 }
122 122
123} 123}
124 124
125QString i18n(const char *,const char *text) 125QString i18n(const char *,const char *text)
126{ 126{
127 return i18n( text ); 127 return i18n( text );
128} 128}
129 129
130QString i18n(const char *text1, const char *textn, int num) 130QString i18n(const char *text1, const char *textn, int num)
131{ 131{
132 if ( num == 1 ) return i18n( text1 ); 132 if ( num == 1 ) return i18n( text1 );
133 else { 133 else {
134 QString text = i18n( textn ); 134 QString text = i18n( textn );
135 int pos = text.find( "%n" ); 135 int pos = text.find( "%n" );
136 if ( pos >= 0 ) text.replace( pos, 2, QString::number( num ) ); 136 if ( pos >= 0 ) text.replace( pos, 2, QString::number( num ) );
137 return text; 137 return text;
138 } 138 }
139} 139}
140 140
141inline void put_it_in( QChar *buffer, uint& index, const QString &s ) 141inline void put_it_in( QChar *buffer, uint& index, const QString &s )
142{ 142{
143 for ( uint l = 0; l < s.length(); l++ ) 143 for ( uint l = 0; l < s.length(); l++ )
144 buffer[index++] = s.at( l ); 144 buffer[index++] = s.at( l );
145} 145}
146 146
147inline void put_it_in( QChar *buffer, uint& index, int number ) 147inline void put_it_in( QChar *buffer, uint& index, int number )
148{ 148{
149 buffer[index++] = number / 10 + '0'; 149 buffer[index++] = number / 10 + '0';
150 buffer[index++] = number % 10 + '0'; 150 buffer[index++] = number % 10 + '0';
151} 151}
152 152
153static int readInt(const QString &str, uint &pos) 153static int readInt(const QString &str, uint &pos)
154{ 154{
155 if (!str.at(pos).isDigit()) return -1; 155 if (!str.at(pos).isDigit()) return -1;
156 int result = 0; 156 int result = 0;
157 for (; str.length() > pos && str.at(pos).isDigit(); pos++) 157 for (; str.length() > pos && str.at(pos).isDigit(); pos++)
158 { 158 {
159 result *= 10; 159 result *= 10;
160 result += str.at(pos).digitValue(); 160 result += str.at(pos).digitValue();
161 } 161 }
162 162
163 return result; 163 return result;
164} 164}
165 165
166KLocale::KLocale() : mCalendarSystem( 0 ) 166KLocale::KLocale() : mCalendarSystem( 0 )
167{ 167{
168 168
169 m_decimalSymbol = "."; 169 m_decimalSymbol = ".";
170 m_positiveSign = ""; 170 m_positiveSign = "";
171 m_negativeSign = "-"; 171 m_negativeSign = "-";
172 m_thousandsSeparator = ","; 172 m_thousandsSeparator = ",";
173 173
174 174
175 175
176 176
177 mWeekStartsMonday = true; 177 mWeekStartsMonday = true;
178 mHourF24Format = true; 178 mHourF24Format = true;
179 mIntDateFormat = Default; 179 mIntDateFormat = Default;
180 mIntTimeFormat = Default; 180 mIntTimeFormat = Default;
181 mLanguage = 0; 181 mLanguage = 0;
182 mDateFormat = "%a %Y %b %d"; 182 mDateFormat = "%a %Y %b %d";
183 mDateFormatShort = "%Y-%m-%d"; 183 mDateFormatShort = "%Y-%m-%d";
184 mTimeZoneList << ("-11:00 US/Samoa") 184 mTimeZoneList << ("-11:00 US/Samoa")
185 << ("-10:00 US/Hawaii") 185 << ("-10:00 US/Hawaii")
186 << ("-09:00 US/Alaska") 186 << ("-09:00 US/Alaska")
187 << ("-08:00 US/Pacific") 187 << ("-08:00 US/Pacific")
188 << ("-07:00 US/Mountain") 188 << ("-07:00 US/Mountain")
189 << ("-06:00 US/Central") 189 << ("-06:00 US/Central")
190 << ("-05:00 US/Eastern") 190 << ("-05:00 US/Eastern")
191 << ("-04:00 Brazil/West") 191 << ("-04:00 Brazil/West")
192 << ("-03:00 Brazil/East") 192 << ("-03:00 Brazil/East")
193 << ("-02:00 Brazil/DeNoronha") 193 << ("-02:00 Brazil/DeNoronha")
194 << ("-01:00 Atlantic/Azores") 194 << ("-01:00 Atlantic/Azores")
195 << (" 00:00 Europe/London(UTC)") 195 << (" 00:00 Europe/London(UTC)")
196 << ("+01:00 Europe/Oslo(CET)") 196 << ("+01:00 Europe/Oslo(CET)")
197 << ("+02:00 Europe/Helsinki") 197 << ("+02:00 Europe/Helsinki")
198 << ("+03:00 Europe/Moscow") 198 << ("+03:00 Europe/Moscow")
199 << ("+04:00 Indian/Mauritius") 199 << ("+04:00 Indian/Mauritius")
200 << ("+05:00 Indian/Maldives") 200 << ("+05:00 Indian/Maldives")
201 << ("+06:00 Indian/Chagos") 201 << ("+06:00 Indian/Chagos")
202 << ("+07:00 Asia/Bangkok") 202 << ("+07:00 Asia/Bangkok")
203 << ("+08:00 Asia/Hongkong") 203 << ("+08:00 Asia/Hongkong")
204 << ("+09:00 Asia/Tokyo") 204 << ("+09:00 Asia/Tokyo")
205 << ("+10:00 Asia/Vladivostok") 205 << ("+10:00 Asia/Vladivostok")
206 << ("+11:00 Asia/Magadan") 206 << ("+11:00 Asia/Magadan")
207 << ("+12:00 Asia/Kamchatka") 207 << ("+12:00 Asia/Kamchatka")
208 // << (" xx:xx User defined offset") 208 // << (" xx:xx User defined offset")
209 << i18n (" Local Time"); 209 << i18n (" Local Time");
210 mSouthDaylight = false; 210 mSouthDaylight = false;
211 mTimeZoneOffset = 0; 211 mTimeZoneOffset = 0;
212 daylightEnabled = false; 212 daylightEnabled = false;
213} 213}
214 214
215void KLocale::setDateFormat( QString s ) 215void KLocale::setDateFormat( QString s )
216{ 216{
217 mDateFormat = s; 217 mDateFormat = s;
218} 218}
219 219
220void KLocale::setDateFormatShort( QString s ) 220void KLocale::setDateFormatShort( QString s )
221{ 221{
222 mDateFormatShort = s; 222 mDateFormatShort = s;
223} 223}
224 224
225void KLocale::setHore24Format ( bool b ) 225void KLocale::setHore24Format ( bool b )
226{ 226{
227 mHourF24Format = b; 227 mHourF24Format = b;
228} 228}
229void KLocale::setWeekStartMonday( bool b ) 229void KLocale::setWeekStartMonday( bool b )
230{ 230{
231 mWeekStartsMonday = b; 231 mWeekStartsMonday = b;
232} 232}
233 233
234KLocale::IntDateFormat KLocale::getIntDateFormat( ) 234KLocale::IntDateFormat KLocale::getIntDateFormat( )
235{ 235{
236 return mIntDateFormat; 236 return mIntDateFormat;
237 237
238} 238}
239void KLocale::setIntDateFormat( KLocale::IntDateFormat i ) 239void KLocale::setIntDateFormat( KLocale::IntDateFormat i )
240{ 240{
241 mIntDateFormat = i; 241 mIntDateFormat = i;
242} 242}
243KLocale::IntDateFormat KLocale::getIntTimeFormat( ) 243KLocale::IntDateFormat KLocale::getIntTimeFormat( )
244{ 244{
245 return mIntTimeFormat; 245 return mIntTimeFormat;
246 246
247} 247}
248void KLocale::setIntTimeFormat( KLocale::IntDateFormat i ) 248void KLocale::setIntTimeFormat( KLocale::IntDateFormat i )
249{ 249{
250 mIntTimeFormat = i; 250 mIntTimeFormat = i;
251} 251}
252 252
253void KLocale::setLanguage( int i ) 253void KLocale::setLanguage( int i )
254{ 254{
255 mLanguage = i; 255 mLanguage = i;
256} 256}
257int KLocale::language( ) 257int KLocale::language( )
258{ 258{
259 return mLanguage; 259 return mLanguage;
260} 260}
261QString KLocale::translate( const char *index ) const 261QString KLocale::translate( const char *index ) const
262{ 262{
263 return i18n( index ); 263 return i18n( index );
264} 264}
265 265
266QString KLocale::translate( const char *, const char *fallback) const 266QString KLocale::translate( const char *, const char *fallback) const
267{ 267{
268 return i18n( fallback ); 268 return i18n( fallback );
269} 269}
270 270
271QString KLocale::formatTime(const QTime &pTime, bool includeSecs, IntDateFormat intIntDateFormat) const 271QString KLocale::formatTime(const QTime &pTime, bool includeSecs, IntDateFormat intIntDateFormat) const
272{ 272{
273 const QString rst = timeFormat(intIntDateFormat); 273 const QString rst = timeFormat(intIntDateFormat);
274 274
275 // only "pm/am" here can grow, the rest shrinks, but 275 // only "pm/am" here can grow, the rest shrinks, but
276 // I'm rather safe than sorry 276 // I'm rather safe than sorry
277 QChar *buffer = new QChar[rst.length() * 3 / 2 + 30]; 277 QChar *buffer = new QChar[rst.length() * 3 / 2 + 30];
278 278
279 uint index = 0; 279 uint index = 0;
280 bool escape = false; 280 bool escape = false;
281 int number = 0; 281 int number = 0;
282 282
283 for ( uint format_index = 0; format_index < rst.length(); format_index++ ) 283 for ( uint format_index = 0; format_index < rst.length(); format_index++ )
284 { 284 {
285 if ( !escape ) 285 if ( !escape )
286 { 286 {
287 if ( rst.at( format_index ).unicode() == '%' ) 287 if ( rst.at( format_index ).unicode() == '%' )
288 escape = true; 288 escape = true;
289 else 289 else
290 buffer[index++] = rst.at( format_index ); 290 buffer[index++] = rst.at( format_index );
291 } 291 }
292 else 292 else
293 { 293 {
294 switch ( rst.at( format_index ).unicode() ) 294 switch ( rst.at( format_index ).unicode() )
295 { 295 {
296 case '%': 296 case '%':
297 buffer[index++] = '%'; 297 buffer[index++] = '%';
298 break; 298 break;
299 case 'H': 299 case 'H':
300 put_it_in( buffer, index, pTime.hour() ); 300 put_it_in( buffer, index, pTime.hour() );
301 break; 301 break;
302 case 'I': 302 case 'I':
303 put_it_in( buffer, index, ( pTime.hour() + 11) % 12 + 1 ); 303 put_it_in( buffer, index, ( pTime.hour() + 11) % 12 + 1 );
304 break; 304 break;
305 case 'M': 305 case 'M':
306 put_it_in( buffer, index, pTime.minute() ); 306 put_it_in( buffer, index, pTime.minute() );
307 break; 307 break;
308 case 'S': 308 case 'S':
309 if (includeSecs) 309 if (includeSecs)
310 put_it_in( buffer, index, pTime.second() ); 310 put_it_in( buffer, index, pTime.second() );
311 else 311 else
312 { 312 {
313 // we remove the seperator sign before the seconds and 313 // we remove the seperator sign before the seconds and
314 // assume that works everywhere 314 // assume that works everywhere
315 --index; 315 --index;
316 break; 316 break;
317 } 317 }
318 break; 318 break;
319 case 'k': 319 case 'k':
320 number = pTime.hour(); 320 number = pTime.hour();
321 case 'l': 321 case 'l':
322 // to share the code 322 // to share the code
323 if ( rst.at( format_index ).unicode() == 'l' ) 323 if ( rst.at( format_index ).unicode() == 'l' )
324 number = (pTime.hour() + 11) % 12 + 1; 324 number = (pTime.hour() + 11) % 12 + 1;
325 if ( number / 10 ) 325 if ( number / 10 )
326 buffer[index++] = number / 10 + '0'; 326 buffer[index++] = number / 10 + '0';
327 buffer[index++] = number % 10 + '0'; 327 buffer[index++] = number % 10 + '0';
328 break; 328 break;
329 case 'p': 329 case 'p':
330 { 330 {
331 QString s; 331 QString s;
332 if ( pTime.hour() >= 12 ) 332 if ( pTime.hour() >= 12 )
333 put_it_in( buffer, index, i18n("pm") ); 333 put_it_in( buffer, index, i18n("pm") );
334 else 334 else
335 put_it_in( buffer, index, i18n("am") ); 335 put_it_in( buffer, index, i18n("am") );
336 break; 336 break;
337 } 337 }
338 default: 338 default:
339 buffer[index++] = rst.at( format_index ); 339 buffer[index++] = rst.at( format_index );
340 break; 340 break;
341 } 341 }
342 escape = false; 342 escape = false;
343 } 343 }
344 } 344 }
345 QString ret( buffer, index ); 345 QString ret( buffer, index );
346 delete [] buffer; 346 delete [] buffer;
347 return ret; 347 return ret;
348} 348}
349 349
350QString KLocale::formatDate(const QDate &pDate, bool shortFormat, IntDateFormat intIntDateFormat) const 350QString KLocale::formatDate(const QDate &pDate, bool shortFormat, IntDateFormat intIntDateFormat) const
351{ 351{
352 const QString rst = shortFormat?dateFormatShort(intIntDateFormat):dateFormat(intIntDateFormat); 352 const QString rst = shortFormat?dateFormatShort(intIntDateFormat):dateFormat(intIntDateFormat);
353 353
354 // I'm rather safe than sorry 354 // I'm rather safe than sorry
355 QChar *buffer = new QChar[rst.length() * 3 / 2 + 50]; 355 QChar *buffer = new QChar[rst.length() * 3 / 2 + 50];
356 356
357 unsigned int index = 0; 357 unsigned int index = 0;
358 bool escape = false; 358 bool escape = false;
359 int number = 0; 359 int number = 0;
360 360
361 for ( uint format_index = 0; format_index < rst.length(); ++format_index ) 361 for ( uint format_index = 0; format_index < rst.length(); ++format_index )
362 { 362 {
363 if ( !escape ) 363 if ( !escape )
364 { 364 {
365 if ( rst.at( format_index ).unicode() == '%' ) 365 if ( rst.at( format_index ).unicode() == '%' )
366 escape = true; 366 escape = true;
367 else 367 else
368 buffer[index++] = rst.at( format_index ); 368 buffer[index++] = rst.at( format_index );
369 } 369 }
370 else 370 else
371 { 371 {
372 switch ( rst.at( format_index ).unicode() ) 372 switch ( rst.at( format_index ).unicode() )
373 { 373 {
374 case '%': 374 case '%':
375 buffer[index++] = '%'; 375 buffer[index++] = '%';
376 break; 376 break;
377 case 'Y': 377 case 'Y':
378 put_it_in( buffer, index, pDate.year() / 100 ); 378 put_it_in( buffer, index, pDate.year() / 100 );
379 case 'y': 379 case 'y':
380 put_it_in( buffer, index, pDate.year() % 100 ); 380 put_it_in( buffer, index, pDate.year() % 100 );
381 break; 381 break;
382 case 'n': 382 case 'n':
383 number = pDate.month(); 383 number = pDate.month();
384 case 'e': 384 case 'e':
385 // to share the code 385 // to share the code
386 if ( rst.at( format_index ).unicode() == 'e' ) 386 if ( rst.at( format_index ).unicode() == 'e' )
387 number = pDate.day(); 387 number = pDate.day();
388 if ( number / 10 ) 388 if ( number / 10 )
389 buffer[index++] = number / 10 + '0'; 389 buffer[index++] = number / 10 + '0';
390 buffer[index++] = number % 10 + '0'; 390 buffer[index++] = number % 10 + '0';
391 break; 391 break;
392 case 'm': 392 case 'm':
393 put_it_in( buffer, index, pDate.month() ); 393 put_it_in( buffer, index, pDate.month() );
394 break; 394 break;
395 case 'b': 395 case 'b':
396 put_it_in( buffer, index, monthName(pDate.month(), true) ); 396 put_it_in( buffer, index, monthName(pDate.month(), true) );
397 break; 397 break;
398 case 'B': 398 case 'B':
399 put_it_in( buffer, index, monthName(pDate.month(), false) ); 399 put_it_in( buffer, index, monthName(pDate.month(), false) );
400 break; 400 break;
401 case 'd': 401 case 'd':
402 put_it_in( buffer, index, pDate.day() ); 402 put_it_in( buffer, index, pDate.day() );
403 break; 403 break;
404 case 'a': 404 case 'a':
405 put_it_in( buffer, index, weekDayName(pDate.dayOfWeek(), true) ); 405 put_it_in( buffer, index, weekDayName(pDate.dayOfWeek(), true) );
406 break; 406 break;
407 case 'A': 407 case 'A':
408 put_it_in( buffer, index, weekDayName(pDate.dayOfWeek(), false) ); 408 put_it_in( buffer, index, weekDayName(pDate.dayOfWeek(), false) );
409 break; 409 break;
410 default: 410 default:
411 buffer[index++] = rst.at( format_index ); 411 buffer[index++] = rst.at( format_index );
412 break; 412 break;
413 } 413 }
414 escape = false; 414 escape = false;
415 } 415 }
416 } 416 }
417 QString ret( buffer, index ); 417 QString ret( buffer, index );
418 delete [] buffer; 418 delete [] buffer;
419 return ret; 419 return ret;
420} 420}
421 421
422QString KLocale::formatDateTime(const QDateTime &pDateTime, 422QString KLocale::formatDateTime(const QDateTime &pDateTime,
423 bool shortFormat, 423 bool shortFormat,
424 bool includeSeconds, 424 bool includeSeconds,
425 IntDateFormat intIntDateFormat) const 425 IntDateFormat intIntDateFormat) const
426{ 426{
427 QString format("%1 %2"); 427 QString format("%1 %2");
428 428
429 if ( intIntDateFormat == Default ) 429 if ( intIntDateFormat == Default )
430 format = "%1 %2"; 430 format = "%1 %2";
431 else if ( intIntDateFormat == Format1 ) 431 else if ( intIntDateFormat == Format1 )
432 format = "%1 %2"; 432 format = "%1 %2";
433 else if ( intIntDateFormat == ISODate ) 433 else if ( intIntDateFormat == ISODate )
434 format = "%1T%2"; 434 format = "%1T%2";
435 435
436 QString res = format.arg(formatDate( pDateTime.date(), shortFormat, intIntDateFormat )) 436 QString res = format.arg(formatDate( pDateTime.date(), shortFormat, intIntDateFormat ))
437 .arg(formatTime( pDateTime.time(), includeSeconds , intIntDateFormat )); 437 .arg(formatTime( pDateTime.time(), includeSeconds , intIntDateFormat ));
438 438
439 //qDebug("KLocale::formatDateTime transformed %s, into %s", pDateTime.toString().latin1(), res.latin1() ); 439 //qDebug("KLocale::formatDateTime transformed %s, into %s", pDateTime.toString().latin1(), res.latin1() );
440 440
441 return res; 441 return res;
442} 442}
443 443
444QString KLocale::formatDateTime(const QDateTime &pDateTime, IntDateFormat intIntDateFormat) const 444QString KLocale::formatDateTime(const QDateTime &pDateTime, IntDateFormat intIntDateFormat) const
445{ 445{
446 return formatDateTime(pDateTime, true, true, intIntDateFormat); 446 return formatDateTime(pDateTime, true, true, intIntDateFormat);
447} 447}
448 448
449QDate KLocale::readDate(const QString &intstr, bool* ok) const 449QDate KLocale::readDate(const QString &intstr, bool* ok) const
450{ 450{
451 QDate date; 451 QDate date;
452 date = readDate(intstr, true, ok); 452 date = readDate(intstr, true, ok);
453 if (date.isValid()) return date; 453 if (date.isValid()) return date;
454 return readDate(intstr, false, ok); 454 return readDate(intstr, false, ok);
455} 455}
456 456
457QDate KLocale::readDate(const QString &intstr, bool shortFormat, bool* ok) const 457QDate KLocale::readDate(const QString &intstr, bool shortFormat, bool* ok) const
458{ 458{
459 QString fmt = (shortFormat ? dateFormatShort() : dateFormat()).simplifyWhiteSpace(); 459 QString fmt = (shortFormat ? dateFormatShort() : dateFormat()).simplifyWhiteSpace();
460 return readDate( intstr, fmt, ok ); 460 return readDate( intstr, fmt, ok );
461} 461}
462 462
463QDate KLocale::readDate(const QString &intstr, const QString &fmt, bool* ok) const 463QDate KLocale::readDate(const QString &intstr, const QString &fmt, bool* ok) const
464{ 464{
465 //kdDebug(173) << "KLocale::readDate intstr=" << intstr << " fmt=" << fmt << endl; 465 //kdDebug(173) << "KLocale::readDate intstr=" << intstr << " fmt=" << fmt << endl;
466 QString str = intstr.simplifyWhiteSpace().lower(); 466 QString str = intstr.simplifyWhiteSpace().lower();
467 int day = -1, month = -1; 467 int day = -1, month = -1;
468 // allow the year to be omitted if not in the format 468 // allow the year to be omitted if not in the format
469 int year = QDate::currentDate().year(); 469 int year = QDate::currentDate().year();
470 uint strpos = 0; 470 uint strpos = 0;
471 uint fmtpos = 0; 471 uint fmtpos = 0;
472 472
473 while (fmt.length() > fmtpos || str.length() > strpos) 473 while (fmt.length() > fmtpos || str.length() > strpos)
474 { 474 {
475 if ( !(fmt.length() > fmtpos && str.length() > strpos) ) 475 if ( !(fmt.length() > fmtpos && str.length() > strpos) )
476 goto error; 476 goto error;
477 477
478 QChar c = fmt.at(fmtpos++); 478 QChar c = fmt.at(fmtpos++);
479 479
480 if (c != '%') { 480 if (c != '%') {
481 if (c.isSpace()) 481 if (c.isSpace())
482 strpos++; 482 strpos++;
483 else if (c != str.at(strpos++)) 483 else if (c != str.at(strpos++))
484 goto error; 484 goto error;
485 continue; 485 continue;
486 } 486 }
487 487
488 // remove space at the begining 488 // remove space at the begining
489 if (str.length() > strpos && str.at(strpos).isSpace()) 489 if (str.length() > strpos && str.at(strpos).isSpace())
490 strpos++; 490 strpos++;
491 491
492 c = fmt.at(fmtpos++); 492 c = fmt.at(fmtpos++);
493 switch (c) 493 switch (c)
494 { 494 {
495 case 'a': 495 case 'a':
496 case 'A': 496 case 'A':
497 // this will just be ignored 497 // this will just be ignored
498 { // Cristian Tache: porting to Win: Block added because of "j" redefinition 498 { // Cristian Tache: porting to Win: Block added because of "j" redefinition
499 for (int j = 1; j < 8; j++) { 499 for (int j = 1; j < 8; j++) {
500 QString s = weekDayName(j, c == 'a').lower(); 500 QString s = weekDayName(j, c == 'a').lower();
501 int len = s.length(); 501 int len = s.length();
502 if (str.mid(strpos, len) == s) 502 if (str.mid(strpos, len) == s)
503 strpos += len; 503 strpos += len;
504 } 504 }
505 break; 505 break;
506 } 506 }
507 case 'b': 507 case 'b':
508 case 'B': 508 case 'B':
509 { // Cristian Tache: porting to Win: Block added because of "j" redefinition 509 { // Cristian Tache: porting to Win: Block added because of "j" redefinition
510 for (int j = 1; j < 13; j++) { 510 for (int j = 1; j < 13; j++) {
511 QString s = monthName(j, c == 'b').lower(); 511 QString s = monthName(j, c == 'b').lower();
512 int len = s.length(); 512 int len = s.length();
513 if (str.mid(strpos, len) == s) { 513 if (str.mid(strpos, len) == s) {
514 month = j; 514 month = j;
515 strpos += len; 515 strpos += len;
516 } 516 }
517 } 517 }
518 break; 518 break;
519 } 519 }
520 case 'd': 520 case 'd':
521 case 'e': 521 case 'e':
522 day = readInt(str, strpos); 522 day = readInt(str, strpos);
523 if (day < 1 || day > 31) 523 if (day < 1 || day > 31)