From 334fbc3a265e70f788e5beb44997b52778cd70aa Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Tue, 1 Nov 2011 20:45:59 +0000 Subject: [PATCH 01/38] Monotone-Parent: 1e8c7259f7ef4e643e8c4d7691e6d7b69faa65c3 Monotone-Revision: ca32e7014fbdeca8576a2cd0926f5921a097e971 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-01T20:45:59 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 3 +++ OpenChange/MAPIStoreCalendarMessage.m | 25 +++++++++++++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 38d3bcff3..09e770858 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2011-11-01 Wolfgang Sourdeau + * OpenChange/MAPIStoreCalendarMessage.m (-save): added work-around + for setting of organizer as an attendee record. + * OpenChange/MAPIStoreMailMessage.m (-setReadFlag:): implemented basic method, only dealing with actual setting or unsetting of "\Seen". diff --git a/OpenChange/MAPIStoreCalendarMessage.m b/OpenChange/MAPIStoreCalendarMessage.m index 70efa4585..0b5f39ad0 100644 --- a/OpenChange/MAPIStoreCalendarMessage.m +++ b/OpenChange/MAPIStoreCalendarMessage.m @@ -799,10 +799,11 @@ { NSArray *recipients; NSDictionary *dict; + NSString *orgEmail, *attEmail; iCalPerson *person; iCalPersonPartStat newPartStat; NSNumber *flags, *trackStatus; - int i; + int i, effective; /* We must set the organizer preliminarily here because, unlike what the doc states, Outlook does not always pass the real organizer @@ -810,15 +811,28 @@ dict = [activeUser primaryIdentity]; person = [iCalPerson new]; [person setCn: [dict objectForKey: @"fullName"]]; - [person setEmail: [dict objectForKey: @"email"]]; + orgEmail = [dict objectForKey: @"email"]; + [person setEmail: orgEmail]; [newEvent setOrganizer: person]; [person release]; recipients = [value objectForKey: @"to"]; - + effective = 0; for (i = 0; i < [recipients count]; i++) { dict = [recipients objectAtIndex: i]; + attEmail = [dict objectForKey: @"email"]; + + /* Work-around: it happens that Outlook still passes the + organizer as a recipient, maybe because of a feature + documented in a pre-mesozoic PDF still buried in a cavern... + In that case we remove it, and we keep the number of + effective recipients in "effective". If the total is 0, we + remove the "ORGANIZER" too. */ + if ([attEmail isEqualToString: orgEmail]) + continue; + + effective++; flags = [dict objectForKey: MAPIPropertyKey (PR_RECIPIENT_FLAGS)]; if (!flags) { @@ -828,7 +842,7 @@ person = [iCalPerson new]; [person setCn: [dict objectForKey: @"fullName"]]; - [person setEmail: [dict objectForKey: @"email"]]; + [person setEmail: attEmail]; if (([flags unsignedIntValue] & 0x0002)) /* recipOrganizer */ [newEvent setOrganizer: person]; @@ -861,6 +875,9 @@ [newEvent addToAttendees: person]; } + if (effective == 0) /* See work-around above */ + [newEvent setOrganizer: nil]; + [person release]; } } From ff5efe1b1986c616f5b2168d2a7512ef0545e099 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 2 Nov 2011 12:43:36 +0000 Subject: [PATCH 02/38] Monotone-Parent: ca32e7014fbdeca8576a2cd0926f5921a097e971 Monotone-Revision: 3e37d64800faf93e948c9831e2985ae7f4da314a Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-02T12:43:36 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 5 +++++ OpenChange/MAPIStoreCalendarMessage.m | 23 +++++++++++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 09e770858..baee5b509 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2011-11-02 Wolfgang Sourdeau + + * OpenChange/MAPIStoreCalendarMessage.m (-save): handle all day + events based on the value of PidLidAppointmentSubType. + 2011-11-01 Wolfgang Sourdeau * OpenChange/MAPIStoreCalendarMessage.m (-save): added work-around diff --git a/OpenChange/MAPIStoreCalendarMessage.m b/OpenChange/MAPIStoreCalendarMessage.m index 0b5f39ad0..07a34ee52 100644 --- a/OpenChange/MAPIStoreCalendarMessage.m +++ b/OpenChange/MAPIStoreCalendarMessage.m @@ -610,6 +610,7 @@ - (void) save { iCalCalendar *vCalendar; + BOOL isAllDay; iCalDateTime *start, *end; iCalTimeZone *tz; NSCalendarDate *now; @@ -715,6 +716,10 @@ tz = [iCalTimeZone timeZoneForName: tzName]; [vCalendar addTimeZone: tz]; + isAllDay = [[properties + objectForKey: MAPIPropertyKey (PidLidAppointmentSubType)] + boolValue]; + // start value = [properties objectForKey: MAPIPropertyKey (PR_START_DATE)]; if (!value) @@ -723,8 +728,13 @@ if (value) { start = (iCalDateTime *) [newEvent uniqueChildWithTag: @"dtstart"]; - [start setTimeZone: tz]; - [start setDateTime: value]; + if (isAllDay) + [start setDate: value]; + else + { + [start setTimeZone: tz]; + [start setDateTime: value]; + } } /* end */ @@ -734,8 +744,13 @@ if (value) { end = (iCalDateTime *) [newEvent uniqueChildWithTag: @"dtend"]; - [end setTimeZone: tz]; - [end setDateTime: value]; + if (isAllDay) + [end setDate: value]; + else + { + [end setTimeZone: tz]; + [end setDateTime: value]; + } } /* priority */ From db46c4e1a5993792417e915fe60a820a2a678961 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 2 Nov 2011 18:18:32 +0000 Subject: [PATCH 03/38] Monotone-Parent: 3e37d64800faf93e948c9831e2985ae7f4da314a Monotone-Revision: c376ff04c7ac6aed511caec05718166c8170cc7c Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-02T18:18:32 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 1 + OpenChange/MAPIStoreCalendarMessage.m | 11 +++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index baee5b509..0725d6235 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,7 @@ * OpenChange/MAPIStoreCalendarMessage.m (-save): handle all day events based on the value of PidLidAppointmentSubType. + Don't add the timezone component to the vCalendar in that case. 2011-11-01 Wolfgang Sourdeau diff --git a/OpenChange/MAPIStoreCalendarMessage.m b/OpenChange/MAPIStoreCalendarMessage.m index 07a34ee52..214f1c76d 100644 --- a/OpenChange/MAPIStoreCalendarMessage.m +++ b/OpenChange/MAPIStoreCalendarMessage.m @@ -712,14 +712,17 @@ if (value) [newEvent setLocation: value]; - tzName = [[self ownerTimeZone] name]; - tz = [iCalTimeZone timeZoneForName: tzName]; - [vCalendar addTimeZone: tz]; - isAllDay = [[properties objectForKey: MAPIPropertyKey (PidLidAppointmentSubType)] boolValue]; + if (!isAllDay) + { + tzName = [[self ownerTimeZone] name]; + tz = [iCalTimeZone timeZoneForName: tzName]; + [vCalendar addTimeZone: tz]; + } + // start value = [properties objectForKey: MAPIPropertyKey (PR_START_DATE)]; if (!value) From 2d2da7d4e45166d69bcb0bf8514401552d3b3dc9 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 2 Nov 2011 20:28:42 +0000 Subject: [PATCH 04/38] Monotone-Parent: c376ff04c7ac6aed511caec05718166c8170cc7c Monotone-Revision: e96abacf1d7b608365ee07514a3264bb7e77e0a8 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-02T20:28:42 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 3 +++ OpenChange/MAPIStoreMessage.m | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 0725d6235..181e7222d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2011-11-02 Wolfgang Sourdeau + * OpenChange/MAPIStoreMessage.m (-setReadFlag:): make overrides + optional. + * OpenChange/MAPIStoreCalendarMessage.m (-save): handle all day events based on the value of PidLidAppointmentSubType. Don't add the timezone component to the vCalendar in that case. diff --git a/OpenChange/MAPIStoreMessage.m b/OpenChange/MAPIStoreMessage.m index d3a2f3bd4..eb7b467fe 100644 --- a/OpenChange/MAPIStoreMessage.m +++ b/OpenChange/MAPIStoreMessage.m @@ -744,7 +744,7 @@ MAPIStoreExternalEntryId (NSString *cn, NSString *email) - (int) setReadFlag: (uint8_t) flag { - [self subclassResponsibility: _cmd]; + // [self subclassResponsibility: _cmd]; return MAPISTORE_ERROR; } From 328c50246300e232f40142201b0ba730d41832e7 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 2 Nov 2011 20:40:32 +0000 Subject: [PATCH 05/38] Monotone-Parent: e96abacf1d7b608365ee07514a3264bb7e77e0a8 Monotone-Revision: 5142a197a31d673a6de8de30e4f1f213bd8e1806 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-02T20:40:32 Monotone-Branch: ca.inverse.sogo --- OpenChange/MAPIStoreCalendarMessage.m | 150 +++++++++++++------------- 1 file changed, 77 insertions(+), 73 deletions(-) diff --git a/OpenChange/MAPIStoreCalendarMessage.m b/OpenChange/MAPIStoreCalendarMessage.m index 214f1c76d..c79f457c6 100644 --- a/OpenChange/MAPIStoreCalendarMessage.m +++ b/OpenChange/MAPIStoreCalendarMessage.m @@ -811,92 +811,96 @@ /* alarm */ [self _setupAlarmDataInEvent: newEvent]; - // Organizer - value = [properties objectForKey: @"recipients"]; - if (value) + if ([[properties objectForKey: MAPIPropertyKey (PidLidAppointmentStateFlags)] intValue] + != 0) { - NSArray *recipients; - NSDictionary *dict; - NSString *orgEmail, *attEmail; - iCalPerson *person; - iCalPersonPartStat newPartStat; - NSNumber *flags, *trackStatus; - int i, effective; - - /* We must set the organizer preliminarily here because, unlike what - the doc states, Outlook does not always pass the real organizer - in the recipients list. */ - dict = [activeUser primaryIdentity]; - person = [iCalPerson new]; - [person setCn: [dict objectForKey: @"fullName"]]; - orgEmail = [dict objectForKey: @"email"]; - [person setEmail: orgEmail]; - [newEvent setOrganizer: person]; - [person release]; - - recipients = [value objectForKey: @"to"]; - effective = 0; - for (i = 0; i < [recipients count]; i++) + // Organizer + value = [properties objectForKey: @"recipients"]; + if (value) { - dict = [recipients objectAtIndex: i]; - attEmail = [dict objectForKey: @"email"]; - - /* Work-around: it happens that Outlook still passes the - organizer as a recipient, maybe because of a feature - documented in a pre-mesozoic PDF still buried in a cavern... - In that case we remove it, and we keep the number of - effective recipients in "effective". If the total is 0, we - remove the "ORGANIZER" too. */ - if ([attEmail isEqualToString: orgEmail]) - continue; - - effective++; - flags = [dict objectForKey: MAPIPropertyKey (PR_RECIPIENT_FLAGS)]; - if (!flags) - { - [self logWithFormat: @"no recipient flags specified"]; - break; - } + NSArray *recipients; + NSDictionary *dict; + NSString *orgEmail, *attEmail; + iCalPerson *person; + iCalPersonPartStat newPartStat; + NSNumber *flags, *trackStatus; + int i, effective; + /* We must set the organizer preliminarily here because, unlike what + the doc states, Outlook does not always pass the real organizer + in the recipients list. */ + dict = [activeUser primaryIdentity]; person = [iCalPerson new]; [person setCn: [dict objectForKey: @"fullName"]]; - [person setEmail: attEmail]; + orgEmail = [dict objectForKey: @"email"]; + [person setEmail: orgEmail]; + [newEvent setOrganizer: person]; + [person release]; - if (([flags unsignedIntValue] & 0x0002)) /* recipOrganizer */ - [newEvent setOrganizer: person]; - else + recipients = [value objectForKey: @"to"]; + effective = 0; + for (i = 0; i < [recipients count]; i++) { - trackStatus - = [dict - objectForKey: MAPIPropertyKey (PR_RECIPIENT_TRACKSTATUS)]; + dict = [recipients objectAtIndex: i]; + attEmail = [dict objectForKey: @"email"]; - /* FIXME: we should provide a data converter between OL - partstats and SOGo */ - switch ([trackStatus unsignedIntValue]) + /* Work-around: it happens that Outlook still passes the + organizer as a recipient, maybe because of a feature + documented in a pre-mesozoic PDF still buried in a cavern... + In that case we remove it, and we keep the number of + effective recipients in "effective". If the total is 0, we + remove the "ORGANIZER" too. */ + if ([attEmail isEqualToString: orgEmail]) + continue; + + effective++; + flags = [dict objectForKey: MAPIPropertyKey (PR_RECIPIENT_FLAGS)]; + if (!flags) { - case 0x02: /* respTentative */ - newPartStat = iCalPersonPartStatTentative; + [self logWithFormat: @"no recipient flags specified"]; break; - case 0x03: /* respAccepted */ - newPartStat = iCalPersonPartStatAccepted; - break; - case 0x04: /* respDeclined */ - newPartStat = iCalPersonPartStatDeclined; - break; - default: - newPartStat = iCalPersonPartStatNeedsAction; } - [person setParticipationStatus: newPartStat]; - [person setRsvp: @"TRUE"]; - [person setRole: @"REQ-PARTICIPANT"]; - [newEvent addToAttendees: person]; + person = [iCalPerson new]; + [person setCn: [dict objectForKey: @"fullName"]]; + [person setEmail: attEmail]; + + if (([flags unsignedIntValue] & 0x0002)) /* recipOrganizer */ + [newEvent setOrganizer: person]; + else + { + trackStatus + = [dict + objectForKey: MAPIPropertyKey (PR_RECIPIENT_TRACKSTATUS)]; + + /* FIXME: we should provide a data converter between OL + partstats and SOGo */ + switch ([trackStatus unsignedIntValue]) + { + case 0x02: /* respTentative */ + newPartStat = iCalPersonPartStatTentative; + break; + case 0x03: /* respAccepted */ + newPartStat = iCalPersonPartStatAccepted; + break; + case 0x04: /* respDeclined */ + newPartStat = iCalPersonPartStatDeclined; + break; + default: + newPartStat = iCalPersonPartStatNeedsAction; + } + + [person setParticipationStatus: newPartStat]; + [person setRsvp: @"TRUE"]; + [person setRole: @"REQ-PARTICIPANT"]; + [newEvent addToAttendees: person]; + } + + if (effective == 0) /* See work-around above */ + [newEvent setOrganizer: nil]; + + [person release]; } - - if (effective == 0) /* See work-around above */ - [newEvent setOrganizer: nil]; - - [person release]; } } From 1a4d064d117597d3a5a549bd2851a7a2cc17d362 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 2 Nov 2011 20:40:57 +0000 Subject: [PATCH 06/38] Monotone-Parent: 5142a197a31d673a6de8de30e4f1f213bd8e1806 Monotone-Revision: 1b807c65d09c64e8b6e6a775dbaaad3db3150dd6 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-02T20:40:57 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ChangeLog b/ChangeLog index 181e7222d..9466d0795 100644 --- a/ChangeLog +++ b/ChangeLog @@ -6,6 +6,8 @@ * OpenChange/MAPIStoreCalendarMessage.m (-save): handle all day events based on the value of PidLidAppointmentSubType. Don't add the timezone component to the vCalendar in that case. + Take PidLidAppointmentStateFlags into account before building the + list of attendees. 2011-11-01 Wolfgang Sourdeau From 5ca67f5b8e1c96e01fff2aa1fa09536ad0d94dbb Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 2 Nov 2011 21:20:02 +0000 Subject: [PATCH 07/38] Monotone-Parent: 1b807c65d09c64e8b6e6a775dbaaad3db3150dd6 Monotone-Revision: c16aa62954764e28a982189ae9222645f4705921 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-02T21:20:02 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 3 ++- OpenChange/MAPIStoreCalendarMessage.m | 37 +++++++++++++++------------ 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9466d0795..32a703693 100644 --- a/ChangeLog +++ b/ChangeLog @@ -7,7 +7,8 @@ events based on the value of PidLidAppointmentSubType. Don't add the timezone component to the vCalendar in that case. Take PidLidAppointmentStateFlags into account before building the - list of attendees. + list of attendees. Take the organizer passed in the recipients + into account when specified. 2011-11-01 Wolfgang Sourdeau diff --git a/OpenChange/MAPIStoreCalendarMessage.m b/OpenChange/MAPIStoreCalendarMessage.m index c79f457c6..174d33f65 100644 --- a/OpenChange/MAPIStoreCalendarMessage.m +++ b/OpenChange/MAPIStoreCalendarMessage.m @@ -842,33 +842,37 @@ for (i = 0; i < [recipients count]; i++) { dict = [recipients objectAtIndex: i]; - attEmail = [dict objectForKey: @"email"]; - /* Work-around: it happens that Outlook still passes the - organizer as a recipient, maybe because of a feature - documented in a pre-mesozoic PDF still buried in a cavern... - In that case we remove it, and we keep the number of - effective recipients in "effective". If the total is 0, we - remove the "ORGANIZER" too. */ - if ([attEmail isEqualToString: orgEmail]) - continue; - - effective++; flags = [dict objectForKey: MAPIPropertyKey (PR_RECIPIENT_FLAGS)]; if (!flags) { - [self logWithFormat: @"no recipient flags specified"]; - break; + [self logWithFormat: + @"no recipient flags specified: skipping recipient"]; + continue; } person = [iCalPerson new]; [person setCn: [dict objectForKey: @"fullName"]]; + attEmail = [dict objectForKey: @"email"]; [person setEmail: attEmail]; if (([flags unsignedIntValue] & 0x0002)) /* recipOrganizer */ [newEvent setOrganizer: person]; else { + /* Work-around: it happens that Outlook still passes the + organizer as a recipient, maybe because of a feature + documented in a pre-mesozoic PDF still buried in a + cavern... In that case we remove it, and we keep the + number of effective recipients in "effective". If the + total is 0, we remove the "ORGANIZER" too. */ + if ([attEmail isEqualToString: orgEmail]) + { + [self logWithFormat: + @"avoiding setting organizer as recipient"]; + continue; + } + trackStatus = [dict objectForKey: MAPIPropertyKey (PR_RECIPIENT_TRACKSTATUS)]; @@ -894,13 +898,14 @@ [person setRsvp: @"TRUE"]; [person setRole: @"REQ-PARTICIPANT"]; [newEvent addToAttendees: person]; + effective++; } - if (effective == 0) /* See work-around above */ - [newEvent setOrganizer: nil]; - [person release]; } + + if (effective == 0) /* See work-around above */ + [newEvent setOrganizer: nil]; } } From b1e5170060ede532743d1d96b011dbcf3d471ff5 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Thu, 3 Nov 2011 11:51:05 +0000 Subject: [PATCH 08/38] Reverse localization patch. Monotone-Parent: c16aa62954764e28a982189ae9222645f4705921 Monotone-Revision: a46f694fb88b061ebf1cde5157986657756d6f5c Monotone-Author: flachapelle@inverse.ca Monotone-Date: 2011-11-03T11:51:05 Monotone-Branch: ca.inverse.sogo --- SOPE/NGCards/iCalDailyRecurrenceCalculator.m | 6 + SOPE/NGCards/iCalWeeklyRecurrenceCalculator.m | 2 +- SOPE/NGCards/iCalYearlyRecurrenceCalculator.m | 11 +- .../Localizable.strings | 58 ++-- .../Czech.lproj/Localizable.strings | 25 +- .../Dutch.lproj/Localizable.strings | 63 ++-- .../German.lproj/Localizable.strings | 8 +- .../Hungarian.lproj/Localizable.strings | 57 ++-- .../Italian.lproj/Localizable.strings | 3 +- .../Norwegian.lproj/Localizable.strings | 49 ++-- .../Polish.lproj/Localizable.strings | 1 - .../Russian.lproj/Localizable.strings | 3 +- .../Swedish.lproj/Localizable.strings | 3 +- .../Ukrainian.lproj/Localizable.strings | 1 - .../Welsh.lproj/Localizable.strings | 58 ++-- .../Appointments/iCalEventChanges+SOGo.m | 2 +- SoObjects/SOGo/SOGoSieveManager.m | 1 + Tools/SOGoToolRemove.m | 2 +- Tools/SOGoToolRenameUser.m | 2 +- .../Localizable.strings | 12 +- .../Czech.lproj/Localizable.strings | 12 +- .../Dutch.lproj/Localizable.strings | 12 +- .../French.lproj/Localizable.strings | 4 +- .../German.lproj/Localizable.strings | 2 +- .../Hungarian.lproj/Localizable.strings | 12 +- .../Icelandic.lproj/Localizable.strings | 12 +- .../Italian.lproj/Localizable.strings | 12 +- .../Russian.lproj/Localizable.strings | 2 +- .../Spanish.lproj/Localizable.strings | 2 +- .../Welsh.lproj/Localizable.strings | 12 +- .../Localizable.strings | 37 ++- UI/Common/Czech.lproj/Localizable.strings | 5 +- UI/Common/Dutch.lproj/Localizable.strings | 31 +- UI/Common/French.lproj/Localizable.strings | 6 +- UI/Common/German.lproj/Localizable.strings | 8 +- UI/Common/Hungarian.lproj/Localizable.strings | 37 ++- UI/Common/Icelandic.lproj/Localizable.strings | 2 +- UI/Common/Italian.lproj/Localizable.strings | 12 +- UI/Common/Norwegian.lproj/Localizable.strings | 8 +- UI/Common/Polish.lproj/Localizable.strings | 2 +- UI/Common/Russian.lproj/Localizable.strings | 8 +- UI/Common/Spanish.lproj/Localizable.strings | 2 +- UI/Common/Swedish.lproj/Localizable.strings | 6 +- UI/Common/Welsh.lproj/Localizable.strings | 37 ++- .../Localizable.strings | 20 +- .../Czech.lproj/Localizable.strings | 2 +- .../Dutch.lproj/Localizable.strings | 20 +- .../French.lproj/Localizable.strings | 4 +- .../Hungarian.lproj/Localizable.strings | 20 +- .../Polish.lproj/Localizable.strings | 2 +- .../Russian.lproj/Localizable.strings | 22 +- .../Ukrainian.lproj/Localizable.strings | 4 +- .../Welsh.lproj/Localizable.strings | 22 +- .../Localizable.strings | 53 ++-- UI/MailerUI/Catalan.lproj/Localizable.strings | 27 +- UI/MailerUI/Czech.lproj/Localizable.strings | 27 +- UI/MailerUI/Dutch.lproj/Localizable.strings | 85 +++--- UI/MailerUI/French.lproj/Localizable.strings | 22 +- UI/MailerUI/German.lproj/Localizable.strings | 24 +- .../Hungarian.lproj/Localizable.strings | 41 ++- .../Icelandic.lproj/Localizable.strings | 14 +- UI/MailerUI/Italian.lproj/Localizable.strings | 18 +- .../Norwegian.lproj/Localizable.strings | 14 +- UI/MailerUI/Polish.lproj/Localizable.strings | 27 +- UI/MailerUI/Russian.lproj/Localizable.strings | 40 +-- UI/MailerUI/Spanish.lproj/Localizable.strings | 8 +- UI/MailerUI/Swedish.lproj/Localizable.strings | 6 +- .../Ukrainian.lproj/Localizable.strings | 3 +- UI/MailerUI/Welsh.lproj/Localizable.strings | 65 ++--- .../Localizable.strings | 71 +++-- UI/MainUI/Catalan.lproj/Localizable.strings | 15 +- UI/MainUI/Czech.lproj/Localizable.strings | 17 +- UI/MainUI/Dutch.lproj/Localizable.strings | 71 +++-- UI/MainUI/French.lproj/Localizable.strings | 11 +- UI/MainUI/German.lproj/Localizable.strings | 11 +- UI/MainUI/Hungarian.lproj/Localizable.strings | 69 +++-- UI/MainUI/Icelandic.lproj/Localizable.strings | 44 +-- UI/MainUI/Italian.lproj/Localizable.strings | 15 +- UI/MainUI/Norwegian.lproj/Localizable.strings | 23 +- UI/MainUI/Polish.lproj/Localizable.strings | 11 +- UI/MainUI/Russian.lproj/Localizable.strings | 69 +++-- UI/MainUI/Spanish.lproj/Localizable.strings | 6 +- UI/MainUI/Swedish.lproj/Localizable.strings | 11 +- UI/MainUI/Ukrainian.lproj/Localizable.strings | 6 +- UI/MainUI/Welsh.lproj/Localizable.strings | 71 +++-- .../Localizable.strings | 263 +++++++++-------- .../Hungarian.lproj/Localizable.strings | 251 ++++++++-------- .../Norwegian.lproj/Localizable.strings | 63 ++-- .../Swedish.lproj/Localizable.strings | 63 ++-- .../Ukrainian.lproj/Localizable.strings | 3 - .../Welsh.lproj/Localizable.strings | 276 +++++++++--------- .../Localizable.strings | 163 +++++------ UI/Scheduler/Czech.lproj/Localizable.strings | 36 +-- UI/Scheduler/Dutch.lproj/Localizable.strings | 179 ++++++------ UI/Scheduler/French.lproj/Localizable.strings | 36 +-- .../Hungarian.lproj/Localizable.strings | 163 +++++------ .../Icelandic.lproj/Localizable.strings | 72 ++--- .../Italian.lproj/Localizable.strings | 52 ++-- .../Norwegian.lproj/Localizable.strings | 56 ++-- UI/Scheduler/Polish.lproj/Localizable.strings | 44 +-- .../Russian.lproj/Localizable.strings | 46 +-- .../Spanish.lproj/Localizable.strings | 28 +- .../Swedish.lproj/Localizable.strings | 52 ++-- UI/WebServerResources/SchedulerUI.js | 2 +- .../UIxAppointmentEditor.css | 7 +- UI/WebServerResources/UIxAttendeesEditor.js | 2 +- UI/WebServerResources/UIxMailEditor.css | 9 + UI/WebServerResources/UIxMailEditor.js | 5 +- 108 files changed, 1779 insertions(+), 1853 deletions(-) diff --git a/SOPE/NGCards/iCalDailyRecurrenceCalculator.m b/SOPE/NGCards/iCalDailyRecurrenceCalculator.m index 728d0dec2..e5f0fc1ec 100644 --- a/SOPE/NGCards/iCalDailyRecurrenceCalculator.m +++ b/SOPE/NGCards/iCalDailyRecurrenceCalculator.m @@ -70,6 +70,9 @@ dayMask = nil; repeatCount = 0; + NSLog(@"*** [iCalDaily] occurrences between %@ and %@", [_r startDate], [_r endDate]); + NSLog(@"*** [iCalDaily] first occurrence starts on %@", firStart); + if ([endDate compare: firStart] == NSOrderedAscending) // Range ends before first occurrence return nil; @@ -103,6 +106,7 @@ if (lastDate != nil) { + NSLog(@"*** [iCalDaily] ends on %@", lastDate); if ([lastDate compare: startDate] == NSOrderedAscending) // Range starts after last occurrence return nil; @@ -161,6 +165,7 @@ currentEndDate = [currentStartDate addTimeInterval: [firstRange duration]]; r = [NGCalendarDateRange calendarDateRangeWithStartDate: currentStartDate endDate: currentEndDate]; + NSLog(@"*** [iCalDaily] Analysing period %i from %@ to %@", i, currentStartDate, currentEndDate); if ([_r containsDateRange: r] || [_r doesIntersectWithDateRange: r]) [ranges addObject: r]; } @@ -177,6 +182,7 @@ i++; } + NSLog(@"*** [iCalDaily] returning %i ranges", [ranges count]); return ranges; } diff --git a/SOPE/NGCards/iCalWeeklyRecurrenceCalculator.m b/SOPE/NGCards/iCalWeeklyRecurrenceCalculator.m index 41ed0dc0f..daa4c5234 100644 --- a/SOPE/NGCards/iCalWeeklyRecurrenceCalculator.m +++ b/SOPE/NGCards/iCalWeeklyRecurrenceCalculator.m @@ -186,7 +186,7 @@ currentEndDate = [currentStartDate addTimeInterval: [firstRange duration]]; r = [NGCalendarDateRange calendarDateRangeWithStartDate: currentStartDate endDate: currentEndDate]; - + NSLog(@"*** [iCalWeekly] Analysing period %i from %@ to %@", i, currentStartDate, currentEndDate); if ([_r containsDateRange: r]) [ranges addObject: r]; } diff --git a/SOPE/NGCards/iCalYearlyRecurrenceCalculator.m b/SOPE/NGCards/iCalYearlyRecurrenceCalculator.m index e47ae3912..b8cbd6025 100644 --- a/SOPE/NGCards/iCalYearlyRecurrenceCalculator.m +++ b/SOPE/NGCards/iCalYearlyRecurrenceCalculator.m @@ -60,6 +60,9 @@ count = 0; referenceDate = nil; + NSLog(@"*** [iCalYearly] looking at period from %@ to %@", [_r startDate], [_r endDate]); + NSLog(@"*** [iCalYearly] reference period from %@ to %@", [firstRange startDate], [firstRange endDate]); + if ([rEnd compare: firStart] == NSOrderedAscending) // Range ends before first occurrence return nil; @@ -91,7 +94,7 @@ if ([lastDate compare: rStart] == NSOrderedAscending) // Range starts after last occurrence return nil; - if ([lastDate compare: rEnd] == NSOrderedDescending) + if ([lastDate compare: rEnd] == NSOrderedAscending) // Range ends after last occurence; adjust end date rEnd = lastDate; } @@ -189,12 +192,12 @@ rangesInMonth = [monthlyCalc recurrenceRangesWithinCalendarDateRange: rangeForMonth]; for (k = 0; k < [rangesInMonth count] && (repeatCount == 0 || count < repeatCount); k++) { - //NSLog(@"*** YEARLY found %@ (count = %i)", [[rangesInMonth objectAtIndex: k] startDate], count); + NSLog(@"*** [iCalYearly] found %@ - %@ (count = %i)", [[rangesInMonth objectAtIndex: k] startDate], [[rangesInMonth objectAtIndex: k] endDate], count); count++; if ([_r containsDateRange: [rangesInMonth objectAtIndex: k]]) { [ranges addObject: [rangesInMonth objectAtIndex: k]]; - //NSLog(@"*** YEARLY adding %@ (count = %i)", [[rangesInMonth objectAtIndex: k] startDate], count); + NSLog(@"*** [iCalYearly] adding %@ (count = %i)", [[rangesInMonth objectAtIndex: k] startDate], count); } } } @@ -215,8 +218,10 @@ end = [start addTimeInterval: [firstRange duration]]; r = [NGCalendarDateRange calendarDateRangeWithStartDate: start endDate: end]; + NSLog(@"*** [iCalYearly] possibly %@ - %@ (count = %i)", [r startDate], [r endDate], count); if ([_r containsDateRange: r] && (repeatCount == 0 || count < repeatCount)) { + NSLog(@"*** [iCalYearly] adding %@ (count = %i)", [r startDate], count); [ranges addObject: r]; count++; } diff --git a/SoObjects/Appointments/BrazilianPortuguese.lproj/Localizable.strings b/SoObjects/Appointments/BrazilianPortuguese.lproj/Localizable.strings index 958b2ad85..8984e34df 100644 --- a/SoObjects/Appointments/BrazilianPortuguese.lproj/Localizable.strings +++ b/SoObjects/Appointments/BrazilianPortuguese.lproj/Localizable.strings @@ -8,47 +8,43 @@ vtodo_class1 = "(Tarefa Privada)"; vtodo_class2 = "(Tarefa Confidencial)"; /* Receipts */ -"Title:" = "Title:"; -"Start:" = "Start:"; -"End:" = "End:"; -"Receipt: users invited to a meeting" = "Receipt: users invited to a meeting"; -"You have invited the following attendees(s):" = "You have invited the following attendees(s):"; -"... to attend the following event:" = "... to attend the following event:"; -"Receipt: invitation updated" = "Receipt: invitation updated"; -"The following attendees(s):" = "The following attendees(s):"; -"... have been notified of the changes to the following event:" = "... have been notified of the changes to the following event:"; -"Receipt: attendees removed from an event" = "Receipt: attendees removed from an event"; -"You have removed the following attendees(s):" = "You have removed the following attendees(s):"; -"... from the following event:" = "... from the following event:"; + + + + + + + + + + + + /* IMIP messages */ -"startDate_label" = "Start:"; -"endDate_label" = "End:"; -"due_label" = "Due Date:"; -"location_label" = "Location:"; -"summary_label" = "Summary:"; -"comment_label" = "Comment:"; + + + + + + /* Invitation */ -"Event Invitation: \"%{Summary}\"" = "Event Invitation: \"%{Summary}\""; + "(sent by %{SentBy}) " = "(enviado por %{SentBy}) "; -"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" = "%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"; + /* Deletion */ -"Event Cancelled: \"%{Summary}\"" = "Event Cancelled: \"%{Summary}\""; -"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" -= "%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"; + + /* Update */ -"The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed" -= "The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed"; -"The following parameters have changed in the \"%{Summary}\" meeting:" -= "The following parameters have changed in the \"%{Summary}\" meeting:"; -"Please accept or decline those changes." -= "Please accept or decline those changes."; + + + /* Reply */ "Reply to invitation: \"%{Summary}\"" = "Resposta a Evento de Convite: \"%{Summary}\""; @@ -56,10 +52,8 @@ vtodo_class2 = "(Tarefa Confidencial)"; = "%{Attendee} %{SentByText}foi aceitado seu convite ao evento."; "%{Attendee} %{SentByText}has declined your event invitation." = "%{Attendee} %{SentByText}foi declinado seu convite ao evento."; -"%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}." -= "%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}."; + "%{Attendee} %{SentByText}has not yet decided upon your event invitation." = "%{Attendee} %{SentByText}foi ainda não decidiu seu convite ao evento."; /* Resources */ -"Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"." = "Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"."; \ No newline at end of file diff --git a/SoObjects/Appointments/Czech.lproj/Localizable.strings b/SoObjects/Appointments/Czech.lproj/Localizable.strings index 294efe89b..a97943c57 100644 --- a/SoObjects/Appointments/Czech.lproj/Localizable.strings +++ b/SoObjects/Appointments/Czech.lproj/Localizable.strings @@ -12,25 +12,25 @@ vtodo_class2 = "(Skrytý úkol)"; "Start:" = "Začátek:"; "End:" = "Konec:"; -"Receipt: users invited to a meeting" = "Receipt: users invited to a meeting"; -"You have invited the following attendees(s):" = "You have invited the following attendees(s):"; -"... to attend the following event:" = "... to attend the following event:"; -"Receipt: invitation updated" = "Receipt: invitation updated"; -"The following attendees(s):" = "The following attendees(s):"; -"... have been notified of the changes to the following event:" = "... have been notified of the changes to the following event:"; -"Receipt: attendees removed from an event" = "Receipt: attendees removed from an event"; -"You have removed the following attendees(s):" = "You have removed the following attendees(s):"; -"... from the following event:" = "... from the following event:"; + + + + + + + + + /* IMIP messages */ "startDate_label" = "Začátek:"; "endDate_label" = "Konec:"; -"due_label" = "Due Date:"; + "location_label" = "Místo:"; -"summary_label" = "Summary:"; -"comment_label" = "Comment:"; + + /* Invitation */ "Event Invitation: \"%{Summary}\"" = "Pozvání na událost: \"%{Summary}\""; @@ -62,4 +62,3 @@ vtodo_class2 = "(Skrytý úkol)"; = "%{Attendee} %{SentByText}dosud o Vaší pozvánce k události nerozhodl/a."; /* Resources */ -"Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"." = "Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"."; \ No newline at end of file diff --git a/SoObjects/Appointments/Dutch.lproj/Localizable.strings b/SoObjects/Appointments/Dutch.lproj/Localizable.strings index f3acf2d5d..008c3f339 100644 --- a/SoObjects/Appointments/Dutch.lproj/Localizable.strings +++ b/SoObjects/Appointments/Dutch.lproj/Localizable.strings @@ -8,47 +8,43 @@ vtodo_class1 = "(Privétaak)"; vtodo_class2 = "(Vertrouwelijke taak)"; /* Receipts */ -"Title:" = "Title:"; -"Start:" = "Start:"; -"End:" = "End:"; -"Receipt: users invited to a meeting" = "Receipt: users invited to a meeting"; -"You have invited the following attendees(s):" = "You have invited the following attendees(s):"; -"... to attend the following event:" = "... to attend the following event:"; -"Receipt: invitation updated" = "Receipt: invitation updated"; -"The following attendees(s):" = "The following attendees(s):"; -"... have been notified of the changes to the following event:" = "... have been notified of the changes to the following event:"; -"Receipt: attendees removed from an event" = "Receipt: attendees removed from an event"; -"You have removed the following attendees(s):" = "You have removed the following attendees(s):"; -"... from the following event:" = "... from the following event:"; + + + + + + + + + + + + /* IMIP messages */ -"startDate_label" = "Start:"; -"endDate_label" = "End:"; -"due_label" = "Due Date:"; -"location_label" = "Location:"; -"summary_label" = "Summary:"; -"comment_label" = "Comment:"; + + + + + + /* Invitation */ -"Event Invitation: \"%{Summary}\"" = "Event Invitation: \"%{Summary}\""; -"(sent by %{SentBy}) " = "(sent by %{SentBy}) "; -"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" = "%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"; + + + /* Deletion */ -"Event Cancelled: \"%{Summary}\"" = "Event Cancelled: \"%{Summary}\""; -"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" -= "%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"; + + /* Update */ -"The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed" -= "The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed"; -"The following parameters have changed in the \"%{Summary}\" meeting:" -= "The following parameters have changed in the \"%{Summary}\" meeting:"; -"Please accept or decline those changes." -= "Please accept or decline those changes."; + + + /* Reply */ "Reply to invitation: \"%{Summary}\"" = "Antwoord voor de gebeurtenisuitnodiging: \"%{Summary}\""; @@ -56,10 +52,7 @@ vtodo_class2 = "(Vertrouwelijke taak)"; = "%{Attendee} %{SentByText}heeft uw uitnodiging voor de gebeurtenis geaccepteerd."; "%{Attendee} %{SentByText}has declined your event invitation." = "%{Attendee} %{SentByText}heeft uw uitnodiging voor de gebeurtenis geweigerd."; -"%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}." -= "%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}."; -"%{Attendee} %{SentByText}has not yet decided upon your event invitation." -= "%{Attendee} %{SentByText}has not yet decided upon your event invitation."; + + /* Resources */ -"Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"." = "Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"."; \ No newline at end of file diff --git a/SoObjects/Appointments/German.lproj/Localizable.strings b/SoObjects/Appointments/German.lproj/Localizable.strings index f5b5d1840..82f29535a 100644 --- a/SoObjects/Appointments/German.lproj/Localizable.strings +++ b/SoObjects/Appointments/German.lproj/Localizable.strings @@ -9,7 +9,7 @@ vtodo_class2 = "(Vertrauliche Aufgabe)"; /* Receipts */ "Title:" = "Titel:"; -"Start:" = "Start:"; + "End:" = "Ende:"; "Receipt: users invited to a meeting" = "Empfangsbestätigung: Benutzer zu einem Termin eingeladen"; @@ -25,7 +25,7 @@ vtodo_class2 = "(Vertrauliche Aufgabe)"; "... from the following event:" = "... von folgendem Termin:"; /* IMIP messages */ -"startDate_label" = "Start:"; + "endDate_label" = "Ende:"; "due_label" = "Fällig:"; "location_label" = "Ort:"; @@ -61,5 +61,5 @@ vtodo_class2 = "(Vertrauliche Aufgabe)"; "%{Attendee} %{SentByText}has not yet decided upon your event invitation." = "%{Attendee} %{SentByText}hat noch nicht über Ihre Termineinladung entschieden."; -"Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"." = "Maximale Zahl simultaner Buchungen (%{NumberOfSimultaneousBookings}) erreicht für Ressource \"%{Cn} %{SystemEmail}\"."; - +/* Resources */ +"Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"." = "Maximale Zahl simultaner Buchungen (%{NumberOfSimultaneousBookings}) erreicht für Ressource \"%{Cn} %{SystemEmail}\"."; \ No newline at end of file diff --git a/SoObjects/Appointments/Hungarian.lproj/Localizable.strings b/SoObjects/Appointments/Hungarian.lproj/Localizable.strings index 6b0bed1b9..920b00123 100644 --- a/SoObjects/Appointments/Hungarian.lproj/Localizable.strings +++ b/SoObjects/Appointments/Hungarian.lproj/Localizable.strings @@ -8,47 +8,43 @@ vtodo_class1 = "(Magán feladat)"; vtodo_class2 = "(Bizalmas feladat)"; /* Receipts */ -"Title:" = "Title:"; -"Start:" = "Start:"; -"End:" = "End:"; -"Receipt: users invited to a meeting" = "Receipt: users invited to a meeting"; -"You have invited the following attendees(s):" = "You have invited the following attendees(s):"; -"... to attend the following event:" = "... to attend the following event:"; -"Receipt: invitation updated" = "Receipt: invitation updated"; -"The following attendees(s):" = "The following attendees(s):"; -"... have been notified of the changes to the following event:" = "... have been notified of the changes to the following event:"; -"Receipt: attendees removed from an event" = "Receipt: attendees removed from an event"; -"You have removed the following attendees(s):" = "You have removed the following attendees(s):"; -"... from the following event:" = "... from the following event:"; + + + + + + + + + + + + /* IMIP messages */ -"startDate_label" = "Start:"; -"endDate_label" = "End:"; -"due_label" = "Due Date:"; -"location_label" = "Location:"; -"summary_label" = "Summary:"; -"comment_label" = "Comment:"; + + + + + + /* Invitation */ -"Event Invitation: \"%{Summary}\"" = "Event Invitation: \"%{Summary}\""; + "(sent by %{SentBy}) " = "(%{SentBy} által elküldve) "; -"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" = "%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"; + /* Deletion */ -"Event Cancelled: \"%{Summary}\"" = "Event Cancelled: \"%{Summary}\""; -"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" -= "%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"; + + /* Update */ -"The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed" -= "The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed"; -"The following parameters have changed in the \"%{Summary}\" meeting:" -= "The following parameters have changed in the \"%{Summary}\" meeting:"; -"Please accept or decline those changes." -= "Please accept or decline those changes."; + + + /* Reply */ "Reply to invitation: \"%{Summary}\"" = "Válasz a meghívásra: %{Summary}"; @@ -56,8 +52,7 @@ vtodo_class2 = "(Bizalmas feladat)"; = "%{Attendee} %{SentByText}elfogadta a meghívását."; "%{Attendee} %{SentByText}has declined your event invitation." = "%{Attendee} %{SentByText}visszautasította a meghívását."; -"%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}." -= "%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}."; + "%{Attendee} %{SentByText}has not yet decided upon your event invitation." = "%{Attendee} %{SentByText}még meggondolja a meghívását."; diff --git a/SoObjects/Appointments/Italian.lproj/Localizable.strings b/SoObjects/Appointments/Italian.lproj/Localizable.strings index 27dbbfa5d..6812b9ba0 100644 --- a/SoObjects/Appointments/Italian.lproj/Localizable.strings +++ b/SoObjects/Appointments/Italian.lproj/Localizable.strings @@ -27,7 +27,7 @@ vtodo_class2 = "(Attività confidenziale)"; /* IMIP messages */ "startDate_label" = "Inizio:"; "endDate_label" = "Fine:"; -"due_label" = "Due Date:"; + "location_label" = "Luogo:"; "summary_label" = "Summario:"; "comment_label" = "Commento:"; @@ -62,4 +62,3 @@ vtodo_class2 = "(Attività confidenziale)"; = "%{Attendee} %{SentByText}non ha ancora deciso riguardo il tuo invito all'evento."; /* Resources */ -"Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"." = "Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"."; \ No newline at end of file diff --git a/SoObjects/Appointments/Norwegian.lproj/Localizable.strings b/SoObjects/Appointments/Norwegian.lproj/Localizable.strings index aee20395d..d79267671 100644 --- a/SoObjects/Appointments/Norwegian.lproj/Localizable.strings +++ b/SoObjects/Appointments/Norwegian.lproj/Localizable.strings @@ -9,7 +9,7 @@ vtodo_class2 = "(Konfidensiell oppgave)"; /* Receipts */ "Title:" = "Tittel:"; -"Start:" = "Start:"; + "End:" = "Slutt:"; "Receipt: users invited to a meeting" = "Kvittering: brukere invitert til et møte"; @@ -25,41 +25,32 @@ vtodo_class2 = "(Konfidensiell oppgave)"; "... from the following event:" = "... fra følgende hendelse:"; /* IMIP messages */ -"startDate_label" = "Start:"; -"endDate_label" = "End:"; -"due_label" = "Due Date:"; -"location_label" = "Location:"; -"summary_label" = "Summary:"; -"comment_label" = "Comment:"; + + + + + + /* Invitation */ -"Event Invitation: \"%{Summary}\"" = "Event Invitation: \"%{Summary}\""; -"(sent by %{SentBy}) " = "(sent by %{SentBy}) "; -"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" = "%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"; + + + /* Deletion */ -"Event Cancelled: \"%{Summary}\"" = "Event Cancelled: \"%{Summary}\""; -"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" -= "%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"; + + /* Update */ -"The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed" -= "The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed"; -"The following parameters have changed in the \"%{Summary}\" meeting:" -= "The following parameters have changed in the \"%{Summary}\" meeting:"; -"Please accept or decline those changes." -= "Please accept or decline those changes."; + + + /* Reply */ -"Reply to invitation: \"%{Summary}\"" = "Reply to invitation: \"%{Summary}\""; -"%{Attendee} %{SentByText}has accepted your event invitation." -= "%{Attendee} %{SentByText}has accepted your event invitation."; -"%{Attendee} %{SentByText}has declined your event invitation." -= "%{Attendee} %{SentByText}has declined your event invitation."; -"%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}." -= "%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}."; -"%{Attendee} %{SentByText}has not yet decided upon your event invitation." -= "%{Attendee} %{SentByText}has not yet decided upon your event invitation."; + + + + + /* Resources */ -"Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"." = "Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"."; \ No newline at end of file diff --git a/SoObjects/Appointments/Polish.lproj/Localizable.strings b/SoObjects/Appointments/Polish.lproj/Localizable.strings index 3e078d6f7..c03b8dcee 100644 --- a/SoObjects/Appointments/Polish.lproj/Localizable.strings +++ b/SoObjects/Appointments/Polish.lproj/Localizable.strings @@ -62,4 +62,3 @@ vtodo_class2 = "(Zadanie poufne)"; = "%{Attendee} %{SentByText}jeszcze nie zdecydował(a) o obecności na twoim wydarzeniu."; /* Resources */ -"Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"." = "Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"."; \ No newline at end of file diff --git a/SoObjects/Appointments/Russian.lproj/Localizable.strings b/SoObjects/Appointments/Russian.lproj/Localizable.strings index ad80889c8..9176f2c68 100644 --- a/SoObjects/Appointments/Russian.lproj/Localizable.strings +++ b/SoObjects/Appointments/Russian.lproj/Localizable.strings @@ -56,8 +56,7 @@ vtodo_class2 = "(Конфиденциальная задача)"; = "%{Attendee} %{SentByText}согласился участвовать в запланированном мероприятии."; "%{Attendee} %{SentByText}has declined your event invitation." = "%{Attendee} %{SentByText}отказался участвовать в запланированном мероприятии."; -"%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}." -= "%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}."; + "%{Attendee} %{SentByText}has not yet decided upon your event invitation." = "%{Attendee} %{SentByText}не определился с желанием участвовать в запланированном мероприятии."; diff --git a/SoObjects/Appointments/Swedish.lproj/Localizable.strings b/SoObjects/Appointments/Swedish.lproj/Localizable.strings index 69d46ce56..956b76140 100644 --- a/SoObjects/Appointments/Swedish.lproj/Localizable.strings +++ b/SoObjects/Appointments/Swedish.lproj/Localizable.strings @@ -9,7 +9,7 @@ vtodo_class2 = "(Konfidentiell uppgift)"; /* Receipts */ "Title:" = "Titel:"; -"Start:" = "Start:"; + "End:" = "Slut:"; "Receipt: users invited to a meeting" = "Kvitto: användare inbjudna till ett möte"; @@ -62,4 +62,3 @@ vtodo_class2 = "(Konfidentiell uppgift)"; = "%{Attendee} %{SentByText}har inte än bestämt sig om din mötesinbjudan."; /* Resources */ -"Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"." = "Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"."; \ No newline at end of file diff --git a/SoObjects/Appointments/Ukrainian.lproj/Localizable.strings b/SoObjects/Appointments/Ukrainian.lproj/Localizable.strings index 7fe4ca8ba..af7b36f2f 100644 --- a/SoObjects/Appointments/Ukrainian.lproj/Localizable.strings +++ b/SoObjects/Appointments/Ukrainian.lproj/Localizable.strings @@ -62,4 +62,3 @@ vtodo_class2 = "(Конфіденційне завдання)"; = "%{Attendee} %{SentByText} поки не визначився з участю в події."; /* Resources */ -"Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"." = "Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"."; \ No newline at end of file diff --git a/SoObjects/Appointments/Welsh.lproj/Localizable.strings b/SoObjects/Appointments/Welsh.lproj/Localizable.strings index 2acbea8c1..6652561c9 100644 --- a/SoObjects/Appointments/Welsh.lproj/Localizable.strings +++ b/SoObjects/Appointments/Welsh.lproj/Localizable.strings @@ -8,47 +8,43 @@ vtodo_class1 = "(Tasg breifat)"; vtodo_class2 = "(Tasg gyfrinachol)"; /* Receipts */ -"Title:" = "Title:"; -"Start:" = "Start:"; -"End:" = "End:"; -"Receipt: users invited to a meeting" = "Receipt: users invited to a meeting"; -"You have invited the following attendees(s):" = "You have invited the following attendees(s):"; -"... to attend the following event:" = "... to attend the following event:"; -"Receipt: invitation updated" = "Receipt: invitation updated"; -"The following attendees(s):" = "The following attendees(s):"; -"... have been notified of the changes to the following event:" = "... have been notified of the changes to the following event:"; -"Receipt: attendees removed from an event" = "Receipt: attendees removed from an event"; -"You have removed the following attendees(s):" = "You have removed the following attendees(s):"; -"... from the following event:" = "... from the following event:"; + + + + + + + + + + + + /* IMIP messages */ -"startDate_label" = "Start:"; -"endDate_label" = "End:"; -"due_label" = "Due Date:"; -"location_label" = "Location:"; -"summary_label" = "Summary:"; -"comment_label" = "Comment:"; + + + + + + /* Invitation */ -"Event Invitation: \"%{Summary}\"" = "Event Invitation: \"%{Summary}\""; + "(sent by %{SentBy}) " = "(anfon gan %{SentBy}) "; -"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" = "%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"; + /* Deletion */ -"Event Cancelled: \"%{Summary}\"" = "Event Cancelled: \"%{Summary}\""; -"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" -= "%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"; + + /* Update */ -"The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed" -= "The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed"; -"The following parameters have changed in the \"%{Summary}\" meeting:" -= "The following parameters have changed in the \"%{Summary}\" meeting:"; -"Please accept or decline those changes." -= "Please accept or decline those changes."; + + + /* Reply */ "Reply to invitation: \"%{Summary}\"" = "Ymateb i wahoddiad: %{Summary}"; @@ -56,10 +52,8 @@ vtodo_class2 = "(Tasg gyfrinachol)"; = "%{Attendee} %{SentByText}wedi derbyn."; "%{Attendee} %{SentByText}has declined your event invitation." = "%{Attendee} %{SentByText}wedi gwrthod."; -"%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}." -= "%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}."; + "%{Attendee} %{SentByText}has not yet decided upon your event invitation." = "%{Attendee} %{SentByText}heb benderfynu ar eich gwahoddiad eto."; /* Resources */ -"Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"." = "Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"."; \ No newline at end of file diff --git a/SoObjects/Appointments/iCalEventChanges+SOGo.m b/SoObjects/Appointments/iCalEventChanges+SOGo.m index 5e5c3d383..70a0a32a4 100644 --- a/SoObjects/Appointments/iCalEventChanges+SOGo.m +++ b/SoObjects/Appointments/iCalEventChanges+SOGo.m @@ -32,7 +32,7 @@ { static NSString *properties[] = {@"organizer", @"startDate", @"endDate", @"due", @"duration", - @"rdate", @"rrule", @"exdate", @"exrule", + @"rdate", @"rrule", @"exrule", @"status", @"location", nil}; NSString **currentProperty; diff --git a/SoObjects/SOGo/SOGoSieveManager.m b/SoObjects/SOGo/SOGoSieveManager.m index 62c91f980..cb66c4b1b 100644 --- a/SoObjects/SOGo/SOGoSieveManager.m +++ b/SoObjects/SOGo/SOGoSieveManager.m @@ -837,6 +837,7 @@ static NSString *sieveScriptName = @"sogo"; } } + [client closeConnection]; return YES; } diff --git a/Tools/SOGoToolRemove.m b/Tools/SOGoToolRemove.m index 77af43cf2..155803302 100644 --- a/Tools/SOGoToolRemove.m +++ b/Tools/SOGoToolRemove.m @@ -75,7 +75,7 @@ static NSURL *tableURL = nil; - (void) usage { - fprintf (stderr, "remove user1 [user2] ...\n\n" + fprintf (stderr, "remove [] ...\n\n" " user the user of whom to remove the data\n"); } diff --git a/Tools/SOGoToolRenameUser.m b/Tools/SOGoToolRenameUser.m index 860f98e0f..9d6a22497 100644 --- a/Tools/SOGoToolRenameUser.m +++ b/Tools/SOGoToolRenameUser.m @@ -83,7 +83,7 @@ - (void) usage { - fprintf (stderr, "rename-user fromuserid touserid\n\n" + fprintf (stderr, "rename-user \n\n" " fromuserid the previous user id\n" " touserid the new user id\n\n" "Example: sogo-tool rename-user jane_doe janedoe\n"); diff --git a/UI/AdministrationUI/BrazilianPortuguese.lproj/Localizable.strings b/UI/AdministrationUI/BrazilianPortuguese.lproj/Localizable.strings index 8ec0f3b71..99a84f981 100644 --- a/UI/AdministrationUI/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/AdministrationUI/BrazilianPortuguese.lproj/Localizable.strings @@ -1,15 +1,15 @@ /* this file is in UTF-8 format! */ -"Help" = "Help"; -"Close" = "Close"; -"Modules" = "Modules"; + + + /* Modules short names */ -"ACLs" = "ACLs"; + /* Modules titles */ -"ACLs_title" = "Users folders ACLs management"; + /* Modules descriptions */ -"ACLs_description" = "

The Access Control Lists administration module allows to change the ACLs of each user's Calendars and Address books.

To modify the ACLs of a user's folder, type the name of the user in the search field at the top of the window and double-click on the desired folder.

"; + diff --git a/UI/AdministrationUI/Czech.lproj/Localizable.strings b/UI/AdministrationUI/Czech.lproj/Localizable.strings index 8ec0f3b71..99a84f981 100644 --- a/UI/AdministrationUI/Czech.lproj/Localizable.strings +++ b/UI/AdministrationUI/Czech.lproj/Localizable.strings @@ -1,15 +1,15 @@ /* this file is in UTF-8 format! */ -"Help" = "Help"; -"Close" = "Close"; -"Modules" = "Modules"; + + + /* Modules short names */ -"ACLs" = "ACLs"; + /* Modules titles */ -"ACLs_title" = "Users folders ACLs management"; + /* Modules descriptions */ -"ACLs_description" = "

The Access Control Lists administration module allows to change the ACLs of each user's Calendars and Address books.

To modify the ACLs of a user's folder, type the name of the user in the search field at the top of the window and double-click on the desired folder.

"; + diff --git a/UI/AdministrationUI/Dutch.lproj/Localizable.strings b/UI/AdministrationUI/Dutch.lproj/Localizable.strings index 8ec0f3b71..99a84f981 100644 --- a/UI/AdministrationUI/Dutch.lproj/Localizable.strings +++ b/UI/AdministrationUI/Dutch.lproj/Localizable.strings @@ -1,15 +1,15 @@ /* this file is in UTF-8 format! */ -"Help" = "Help"; -"Close" = "Close"; -"Modules" = "Modules"; + + + /* Modules short names */ -"ACLs" = "ACLs"; + /* Modules titles */ -"ACLs_title" = "Users folders ACLs management"; + /* Modules descriptions */ -"ACLs_description" = "

The Access Control Lists administration module allows to change the ACLs of each user's Calendars and Address books.

To modify the ACLs of a user's folder, type the name of the user in the search field at the top of the window and double-click on the desired folder.

"; + diff --git a/UI/AdministrationUI/French.lproj/Localizable.strings b/UI/AdministrationUI/French.lproj/Localizable.strings index e22974946..701538dc6 100644 --- a/UI/AdministrationUI/French.lproj/Localizable.strings +++ b/UI/AdministrationUI/French.lproj/Localizable.strings @@ -3,10 +3,10 @@ "Help" = "Aide"; "Close" = "Fermer"; -"Modules" = "Modules"; + /* Modules short names */ -"ACLs" = "ACLs"; + /* Modules titles */ "ACLs_title" = "Gestion des droits d'accès pour les dossiers utilisateurs"; diff --git a/UI/AdministrationUI/German.lproj/Localizable.strings b/UI/AdministrationUI/German.lproj/Localizable.strings index 1b1f2ba0a..e0ddbe786 100644 --- a/UI/AdministrationUI/German.lproj/Localizable.strings +++ b/UI/AdministrationUI/German.lproj/Localizable.strings @@ -6,7 +6,7 @@ "Modules" = "Module"; /* Modules short names */ -"ACLs" = "ACLs"; + /* Modules titles */ "ACLs_title" = "Benutzerordner ACL-Management"; diff --git a/UI/AdministrationUI/Hungarian.lproj/Localizable.strings b/UI/AdministrationUI/Hungarian.lproj/Localizable.strings index 8ec0f3b71..99a84f981 100644 --- a/UI/AdministrationUI/Hungarian.lproj/Localizable.strings +++ b/UI/AdministrationUI/Hungarian.lproj/Localizable.strings @@ -1,15 +1,15 @@ /* this file is in UTF-8 format! */ -"Help" = "Help"; -"Close" = "Close"; -"Modules" = "Modules"; + + + /* Modules short names */ -"ACLs" = "ACLs"; + /* Modules titles */ -"ACLs_title" = "Users folders ACLs management"; + /* Modules descriptions */ -"ACLs_description" = "

The Access Control Lists administration module allows to change the ACLs of each user's Calendars and Address books.

To modify the ACLs of a user's folder, type the name of the user in the search field at the top of the window and double-click on the desired folder.

"; + diff --git a/UI/AdministrationUI/Icelandic.lproj/Localizable.strings b/UI/AdministrationUI/Icelandic.lproj/Localizable.strings index 8ec0f3b71..99a84f981 100644 --- a/UI/AdministrationUI/Icelandic.lproj/Localizable.strings +++ b/UI/AdministrationUI/Icelandic.lproj/Localizable.strings @@ -1,15 +1,15 @@ /* this file is in UTF-8 format! */ -"Help" = "Help"; -"Close" = "Close"; -"Modules" = "Modules"; + + + /* Modules short names */ -"ACLs" = "ACLs"; + /* Modules titles */ -"ACLs_title" = "Users folders ACLs management"; + /* Modules descriptions */ -"ACLs_description" = "

The Access Control Lists administration module allows to change the ACLs of each user's Calendars and Address books.

To modify the ACLs of a user's folder, type the name of the user in the search field at the top of the window and double-click on the desired folder.

"; + diff --git a/UI/AdministrationUI/Italian.lproj/Localizable.strings b/UI/AdministrationUI/Italian.lproj/Localizable.strings index 8ec0f3b71..99a84f981 100644 --- a/UI/AdministrationUI/Italian.lproj/Localizable.strings +++ b/UI/AdministrationUI/Italian.lproj/Localizable.strings @@ -1,15 +1,15 @@ /* this file is in UTF-8 format! */ -"Help" = "Help"; -"Close" = "Close"; -"Modules" = "Modules"; + + + /* Modules short names */ -"ACLs" = "ACLs"; + /* Modules titles */ -"ACLs_title" = "Users folders ACLs management"; + /* Modules descriptions */ -"ACLs_description" = "

The Access Control Lists administration module allows to change the ACLs of each user's Calendars and Address books.

To modify the ACLs of a user's folder, type the name of the user in the search field at the top of the window and double-click on the desired folder.

"; + diff --git a/UI/AdministrationUI/Russian.lproj/Localizable.strings b/UI/AdministrationUI/Russian.lproj/Localizable.strings index aa983f838..d264e5c1d 100644 --- a/UI/AdministrationUI/Russian.lproj/Localizable.strings +++ b/UI/AdministrationUI/Russian.lproj/Localizable.strings @@ -12,4 +12,4 @@ "ACLs_title" = "Управление списками доступа к пользовательским папкам (ACL)"; /* Modules descriptions */ -"ACLs_description" = "

The Access Control Lists administration module allows to change the ACLs of each user's Calendars and Address books.

To modify the ACLs of a user's folder, type the name of the user in the search field at the top of the window and double-click on the desired folder.

"; + diff --git a/UI/AdministrationUI/Spanish.lproj/Localizable.strings b/UI/AdministrationUI/Spanish.lproj/Localizable.strings index e9201e884..8759f6868 100644 --- a/UI/AdministrationUI/Spanish.lproj/Localizable.strings +++ b/UI/AdministrationUI/Spanish.lproj/Localizable.strings @@ -6,7 +6,7 @@ "Modules" = "Módulos"; /* Modules short names */ -"ACLs" = "ACLs"; + /* Modules titles */ "ACLs_title" = "Gestión de ALCs para carpetas de usuarios"; diff --git a/UI/AdministrationUI/Welsh.lproj/Localizable.strings b/UI/AdministrationUI/Welsh.lproj/Localizable.strings index 8ec0f3b71..99a84f981 100644 --- a/UI/AdministrationUI/Welsh.lproj/Localizable.strings +++ b/UI/AdministrationUI/Welsh.lproj/Localizable.strings @@ -1,15 +1,15 @@ /* this file is in UTF-8 format! */ -"Help" = "Help"; -"Close" = "Close"; -"Modules" = "Modules"; + + + /* Modules short names */ -"ACLs" = "ACLs"; + /* Modules titles */ -"ACLs_title" = "Users folders ACLs management"; + /* Modules descriptions */ -"ACLs_description" = "

The Access Control Lists administration module allows to change the ACLs of each user's Calendars and Address books.

To modify the ACLs of a user's folder, type the name of the user in the search field at the top of the window and double-click on the desired folder.

"; + diff --git a/UI/Common/BrazilianPortuguese.lproj/Localizable.strings b/UI/Common/BrazilianPortuguese.lproj/Localizable.strings index 0def588e2..f80ebaf0e 100644 --- a/UI/Common/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/Common/BrazilianPortuguese.lproj/Localizable.strings @@ -10,10 +10,10 @@ "Address Book" = "Catálogo"; "Mail" = "Correio"; "Preferences" = "Preferências"; -"Administration" = "Administration"; + "Disconnect" = "Desconectar"; "Right Administration" = "Administração de Direitos"; -"Log Console (dev.)" = "Log Console (dev.)"; + "User" = "Usuário"; @@ -22,18 +22,18 @@ "noJavascriptError" = "SOGo requer Javascript para rodar. Por favor, certifique-se que a opção está disponível e habilitada nas preferências de seu navegador."; "noJavascriptRetry" = "Repetir"; -"Owner:" = "Owner:"; + "Publish the Free/Busy information" = "Divulgar a informação Livre/Ocupado"; "Add..." = "Adicionar..."; "Remove" = "Remover"; -"Subscribe User" = "Subscribe User"; -"Any Authenticated User" = "Any Authenticated User"; -"Public Access" = "Public Access"; -"Any user not listed above" = "Any user not listed above"; -"Anybody accessing this resource from the public area" = "Anybody accessing this resource from the public area"; + + + + + "Sorry, the user rights can not be configured for that object." = "Desculpe, os direitos de usuário não podem ser modificados para este objeto."; @@ -51,25 +51,24 @@ = "Você já se inscreveu nesta pasta!"; "The user rights cannot be edited for this object!" = "Os direitos do usuário não podem ser editados para este objeto!"; -"A folder by that name already exists." = "A folder by that name already exists."; -"You cannot create a list in a shared address book." - = "You cannot create a list in a shared address book."; -"Warning" = "Warning"; + + + "You are not allowed to access this module or this system. Please contact your system administrator." = "Você não está liberado para acessar este módulo ou este sistema. Por favor, contate seu administrador de sistemas."; "You don't have the required privileges to perform the operation." = "Você não tem os privilégios requeridos para realizar esta operação."; -"noEmailForDelegation" = "You must specify the address to which you want to delegate your invitation."; -"delegate is organizer" = "The delegate is the organizer. Please specify a different delegate."; -"delegate is a participant" = "The delegate is already a participant."; -"delegate is a group" = "The specified address corresponds to a group. You can only delegate to a unique person."; + + + + /* common buttons */ -"OK" = "OK"; -"Cancel" = "Cancel"; -"Yes" = "Yes"; + + + "No" = "No"; /* alarms */ diff --git a/UI/Common/Czech.lproj/Localizable.strings b/UI/Common/Czech.lproj/Localizable.strings index 95f5cb264..6dfd5f878 100644 --- a/UI/Common/Czech.lproj/Localizable.strings +++ b/UI/Common/Czech.lproj/Localizable.strings @@ -52,8 +52,7 @@ "The user rights cannot be edited for this object!" = "Uživatelská práva pro tento objekt nemohou být upravena!"; "A folder by that name already exists." = "Složka tohoto jména již existuje."; -"You cannot create a list in a shared address book." - = "You cannot create a list in a shared address book."; + "Warning" = "Upozornění"; "You are not allowed to access this module or this system. Please contact your system administrator." @@ -67,7 +66,7 @@ "delegate is a group" = "Určená adresa odpovídá skupině. Delegovat můžete pouze na osobu."; /* common buttons */ -"OK" = "OK"; + "Cancel" = "Storno"; "Yes" = "Ano"; "No" = "Ne"; diff --git a/UI/Common/Dutch.lproj/Localizable.strings b/UI/Common/Dutch.lproj/Localizable.strings index 5946a1039..2c86faf48 100644 --- a/UI/Common/Dutch.lproj/Localizable.strings +++ b/UI/Common/Dutch.lproj/Localizable.strings @@ -10,14 +10,14 @@ "Address Book" = "Adresboek"; "Mail" = "E-mail"; "Preferences" = "Instellingen"; -"Administration" = "Administration"; + "Disconnect" = "Uitloggen"; "Right Administration" = "Machtigingen beheren"; "Log Console (dev.)" = " (dev.)"; "User" = "Gebruiker"; -"Help" = "Help"; + "noJavascriptError" = "SOGo heeft Javascript nodig om te functioneren. U dient Javascript in uw browser in te schakelen."; "noJavascriptRetry" = "Opnieuw proberen"; @@ -30,10 +30,10 @@ "Subscribe User" = "Gebruiker abonneren"; -"Any Authenticated User" = "Any Authenticated User"; -"Public Access" = "Public Access"; -"Any user not listed above" = "Any user not listed above"; -"Anybody accessing this resource from the public area" = "Anybody accessing this resource from the public area"; + + + + "Sorry, the user rights can not be configured for that object." = "De machtigingen kunnen niet worden ingesteld voor dit object."; @@ -51,24 +51,23 @@ = "U bent al op deze map geabonneerd!"; "The user rights cannot be edited for this object!" = "De machtigingen kunnen niet worden aangepast voor dit object!"; -"A folder by that name already exists." = "A folder by that name already exists."; -"You cannot create a list in a shared address book." - = "You cannot create a list in a shared address book."; -"Warning" = "Warning"; + + + "You are not allowed to access this module or this system. Please contact your system administrator." = "U hebt geen toegang tot deze module of dit systeem. Neem contact op met uw systeem beheerder."; "You don't have the required privileges to perform the operation." = "Voor deze actie heeft u niet de benodigde rechten."; -"noEmailForDelegation" = "You must specify the address to which you want to delegate your invitation."; -"delegate is organizer" = "The delegate is the organizer. Please specify a different delegate."; -"delegate is a participant" = "The delegate is already a participant."; -"delegate is a group" = "The specified address corresponds to a group. You can only delegate to a unique person."; + + + + /* common buttons */ -"OK" = "OK"; -"Cancel" = "Cancel"; + + "Yes" = "Ja"; "No" = "Nee"; diff --git a/UI/Common/French.lproj/Localizable.strings b/UI/Common/French.lproj/Localizable.strings index 50dacb305..7779e387f 100644 --- a/UI/Common/French.lproj/Localizable.strings +++ b/UI/Common/French.lproj/Localizable.strings @@ -10,7 +10,7 @@ "Address Book" = "Carnet d'adresses"; "Mail" = "Courrier"; "Preferences" = "Préférences"; -"Administration" = "Administration"; + "Disconnect" = "Quitter"; "Right Administration" = "Partage"; "Log Console (dev.)" = "Journal (dév.)"; @@ -35,7 +35,7 @@ "Any user not listed above" = "Tout utilisateur du système non-listé ci-dessus"; "Anybody accessing this resource from the public area" = "Quiconque accède à cette ressource via l'espace public"; -"Sorry, the user rights can not be configured for that object." = "Sorry, the user rights can not be configured for that object."; + /* generic.js */ "Unable to subscribe to that folder!" @@ -67,7 +67,7 @@ "delegate is a group" = "L'adresse spécifiée correspond à un groupe. Vous ne pouvez déléguer qu'à une personne."; /* common buttons */ -"OK" = "OK"; + "Cancel" = "Annuler"; "Yes" = "Oui"; "No" = "Non"; diff --git a/UI/Common/German.lproj/Localizable.strings b/UI/Common/German.lproj/Localizable.strings index 31f5128de..039d617f5 100644 --- a/UI/Common/German.lproj/Localizable.strings +++ b/UI/Common/German.lproj/Localizable.strings @@ -8,9 +8,9 @@ "Home" = "Start"; "Calendar" = "Kalender"; "Address Book" = "Adressbuch"; -"Mail" = "Mail"; + "Preferences" = "Einstellungen"; -"Administration" = "Administration"; + "Disconnect" = "Beenden"; "Right Administration" = "Rechte Administration"; "Log Console (dev.)" = "Journal (dev.)"; @@ -54,7 +54,7 @@ "A folder by that name already exists." = "Ein Ordner mit diesem Namen existiert bereits."; "You cannot create a list in a shared address book." = "Es ist nicht möglich, eine Liste in einem gemeinsamen Adressbuch zu erstellen."; -"Warning" = "Warning"; + "You are not allowed to access this module or this system. Please contact your system administrator." = "Sie sind nicht berechtigt auf dieses Modul oder System zuzugreifen. Bitte kontaktieren Sie ihren Systemadministrator."; @@ -67,7 +67,7 @@ "delegate is a group" = "Die angegebene Adresse gehört einer Gruppe. Es kann nur zu einer einzelnen Person delegiert werden."; /* common buttons */ -"OK" = "OK"; + "Cancel" = "Abbrechen"; "Yes" = "Ja"; "No" = "Nein"; diff --git a/UI/Common/Hungarian.lproj/Localizable.strings b/UI/Common/Hungarian.lproj/Localizable.strings index 4f48b090b..325a1d104 100644 --- a/UI/Common/Hungarian.lproj/Localizable.strings +++ b/UI/Common/Hungarian.lproj/Localizable.strings @@ -10,10 +10,10 @@ "Address Book" = "Címjegyzék"; "Mail" = "Üzenetek"; "Preferences" = "Beállítások"; -"Administration" = "Administration"; + "Disconnect" = "Kilépés"; "Right Administration" = "Jogosultság szerkesztése"; -"Log Console (dev.)" = "Log Console (dev.)"; + "User" = "Felhasználó"; @@ -22,18 +22,18 @@ "noJavascriptError" = "A SOGo-nak Javascript futtatási környezetre van szüksége. Kérem győződjön meg, hogy böngészője támogatja-e, illetve be van-e kapcsolva ez az opció."; "noJavascriptRetry" = "Újra"; -"Owner:" = "Owner:"; + "Publish the Free/Busy information" = "Foglaltsági információ nyilvánossá tétele"; "Add..." = "Hozzáadás..."; "Remove" = "Törlés"; -"Subscribe User" = "Subscribe User"; -"Any Authenticated User" = "Any Authenticated User"; -"Public Access" = "Public Access"; -"Any user not listed above" = "Any user not listed above"; -"Anybody accessing this resource from the public area" = "Anybody accessing this resource from the public area"; + + + + + "Sorry, the user rights can not be configured for that object." = "Sajnálom, erre az objektumra nem állíthatók be felhasználói jogosultságok."; @@ -51,25 +51,24 @@ = "Erre a mappára már feliratkozott!"; "The user rights cannot be edited for this object!" = "Ezen az objektumon nem szerkeszthetőek a felhasználói jogosultságok!"; -"A folder by that name already exists." = "A folder by that name already exists."; -"You cannot create a list in a shared address book." - = "You cannot create a list in a shared address book."; -"Warning" = "Warning"; + + + "You are not allowed to access this module or this system. Please contact your system administrator." = "Önnek nem engedélyezett a hozzáférés ehhez a modulhoz vagy rendszerhez. Kérem lépjen kapcsolatba a rendszergazdával."; "You don't have the required privileges to perform the operation." = "Önnek nincs jogosultsága ehhez a művelethez."; -"noEmailForDelegation" = "You must specify the address to which you want to delegate your invitation."; -"delegate is organizer" = "The delegate is the organizer. Please specify a different delegate."; -"delegate is a participant" = "The delegate is already a participant."; -"delegate is a group" = "The specified address corresponds to a group. You can only delegate to a unique person."; + + + + /* common buttons */ -"OK" = "OK"; -"Cancel" = "Cancel"; -"Yes" = "Yes"; + + + "No" = "No"; /* alarms */ diff --git a/UI/Common/Icelandic.lproj/Localizable.strings b/UI/Common/Icelandic.lproj/Localizable.strings index 77d5f632f..afce36c45 100644 --- a/UI/Common/Icelandic.lproj/Localizable.strings +++ b/UI/Common/Icelandic.lproj/Localizable.strings @@ -13,7 +13,7 @@ "Administration" = "Umsjón"; "Disconnect" = "Aftengjast"; "Right Administration" = "Umsjón réttinda"; -"Log Console (dev.)" = "Log Console (dev.)"; + "User" = "Notandi"; diff --git a/UI/Common/Italian.lproj/Localizable.strings b/UI/Common/Italian.lproj/Localizable.strings index a1a9320b8..168ce7216 100644 --- a/UI/Common/Italian.lproj/Localizable.strings +++ b/UI/Common/Italian.lproj/Localizable.strings @@ -5,7 +5,7 @@ "Close" = "Chiudi"; "Edit User Rights" = "Modifica permessi"; -"Home" = "Home"; + "Calendar" = "Calendario"; "Address Book" = "Rubrica"; "Mail" = "Posta"; @@ -13,7 +13,7 @@ "Administration" = "Amministrazione"; "Disconnect" = "Disconnetti"; "Right Administration" = "Amministrazione permessi"; -"Log Console (dev.)" = "Log Console (dev.)"; + "User" = "Utente"; @@ -54,7 +54,7 @@ "A folder by that name already exists." = "Esiste già una cartella con questo nome."; "You cannot create a list in a shared address book." = "Non puoi creare una lista in una rubrica in sola lettura."; -"Warning" = "Warning"; + "You are not allowed to access this module or this system. Please contact your system administrator." = "Non sei abilitato ad accedere a questo modulo. Contatta il tuo amministratore di sistema."; @@ -67,9 +67,9 @@ "delegate is a group" = "L'indirizzo specifico corrisponde ad un gruppo, puoi delegare solo una persona."; /* common buttons */ -"OK" = "OK"; -"Cancel" = "Cancel"; -"Yes" = "Yes"; + + + "No" = "No"; /* alarms */ diff --git a/UI/Common/Norwegian.lproj/Localizable.strings b/UI/Common/Norwegian.lproj/Localizable.strings index 6d83d29cf..0c895ae66 100644 --- a/UI/Common/Norwegian.lproj/Localizable.strings +++ b/UI/Common/Norwegian.lproj/Localizable.strings @@ -63,17 +63,17 @@ "noEmailForDelegation" = "Du må angi adressen til personen du delegerer din invitasjon."; "delegate is organizer" = "Personen du delegerer til er arrangør. Vennligst deleger til en annen person."; -"delegate is a participant" = "The delegate is already a participant."; -"delegate is a group" = "The specified address corresponds to a group. You can only delegate to a unique person."; + + /* common buttons */ -"OK" = "OK"; + "Cancel" = "Avbryt"; "Yes" = "Ja"; "No" = "Nei"; /* alarms */ "Reminder:" = "Påminnelse:"; -"Start:" = "Start:"; + "Due Date:" = "Forfallsdato:"; "Location:" = "Lokasjon:"; diff --git a/UI/Common/Polish.lproj/Localizable.strings b/UI/Common/Polish.lproj/Localizable.strings index f0960082a..7a1f16756 100644 --- a/UI/Common/Polish.lproj/Localizable.strings +++ b/UI/Common/Polish.lproj/Localizable.strings @@ -67,7 +67,7 @@ "delegate is a group" = "Wskazany adres jest grupą. Możesz oddelegować tylko pojedynczną osobę."; /* common buttons */ -"OK" = "OK"; + "Cancel" = "Anuluj"; "Yes" = "Tak"; "No" = "Nie"; diff --git a/UI/Common/Russian.lproj/Localizable.strings b/UI/Common/Russian.lproj/Localizable.strings index dccc5f09f..cecf97cf5 100644 --- a/UI/Common/Russian.lproj/Localizable.strings +++ b/UI/Common/Russian.lproj/Localizable.strings @@ -10,16 +10,16 @@ "Address Book" = "Адресная книга"; "Mail" = "Почта"; "Preferences" = "Настройки"; -"Administration" = "Administration"; + "Disconnect" = "Выход"; "Right Administration" = "Управление доступом"; -"Log Console (dev.)" = "Log Console (dev.)"; + "User" = "Пользователь"; "Help" = "Помощь"; -"noJavascriptError" = "SOGo requires Javascript to run. Please make sure this option is available and activated within your browser preferences."; + "noJavascriptRetry" = "Повторить попытку"; "Owner:" = "Владелец:"; @@ -67,7 +67,7 @@ "delegate is a group" = "Указанный адрес - адрес группы. Вы можете делегировать приглашение лишь отдельным людям."; /* common buttons */ -"OK" = "OK"; + "Cancel" = "Отмена"; "Yes" = "Да"; "No" = "Нет"; diff --git a/UI/Common/Spanish.lproj/Localizable.strings b/UI/Common/Spanish.lproj/Localizable.strings index 43838b42d..29f8fe3fe 100644 --- a/UI/Common/Spanish.lproj/Localizable.strings +++ b/UI/Common/Spanish.lproj/Localizable.strings @@ -67,7 +67,7 @@ "delegate is a group" = "La dirección especificada corresponde a un grupo. Sólo puede delegar a una persona única."; /* common buttons */ -"OK" = "OK"; + "Cancel" = "Cancelar"; "Yes" = "Si"; "No" = "No"; diff --git a/UI/Common/Swedish.lproj/Localizable.strings b/UI/Common/Swedish.lproj/Localizable.strings index 36533fed7..966de4f6d 100644 --- a/UI/Common/Swedish.lproj/Localizable.strings +++ b/UI/Common/Swedish.lproj/Localizable.strings @@ -10,7 +10,7 @@ "Address Book" = "Adressbok"; "Mail" = "E-post"; "Preferences" = "Inställningar"; -"Administration" = "Administration"; + "Disconnect" = "Koppla ner"; "Right Administration" = "Rättighetsinställningar"; "Log Console (dev.)" = "Felkonsol"; @@ -67,13 +67,13 @@ "delegate is a group" = "Adressen du skrivit går till en grupp. Du kan bara delegera till en unik person."; /* common buttons */ -"OK" = "OK"; + "Cancel" = "Avbryt"; "Yes" = "Ja"; "No" = "Nej"; /* alarms */ "Reminder:" = "Påminnelse:"; -"Start:" = "Start:"; + "Due Date:" = "Förfallodag:"; "Location:" = "Plats:"; diff --git a/UI/Common/Welsh.lproj/Localizable.strings b/UI/Common/Welsh.lproj/Localizable.strings index 1dc5cdc63..3814eaf05 100644 --- a/UI/Common/Welsh.lproj/Localizable.strings +++ b/UI/Common/Welsh.lproj/Localizable.strings @@ -10,30 +10,30 @@ "Address Book" = "Llyfr Cyfeiriadau"; "Mail" = "Post"; "Preferences" = "Dewisiadau"; -"Administration" = "Administration"; + "Disconnect" = "Datgysylltu"; "Right Administration" = "Hawl Gweinyddu"; "Log Console (dev.)" = "Consol Log (dev.)"; "User" = "Defnyddiwr"; -"Help" = "Help"; + "noJavascriptError" = "Mae angen Javascript ar SOGo i redeg. Sicrhewch fod yr opsiwn ar gael ac yn actifedig yn newisiadau eich porwr."; "noJavascriptRetry" = "Ailgynnig"; -"Owner:" = "Owner:"; + "Publish the Free/Busy information" = "Cyhoddwch y wybodaeth Rhydd/Brysur"; "Add..." = "Ychwanegu..."; "Remove" = "Dileu"; -"Subscribe User" = "Subscribe User"; -"Any Authenticated User" = "Any Authenticated User"; -"Public Access" = "Public Access"; -"Any user not listed above" = "Any user not listed above"; -"Anybody accessing this resource from the public area" = "Anybody accessing this resource from the public area"; + + + + + "Sorry, the user rights can not be configured for that object." = "Sori, ni all hawliau'r defnyddiwr cael ei newid ar gyfer y gwrthrych hwn."; @@ -51,25 +51,24 @@ = "Yr ydych wedi tanysgrifio eisoes i'r ffolder yna!"; "The user rights cannot be edited for this object!" = "Ni all hawliau'r defnyddiwr cael eu golygu ar gyfer y gwrthrych hwn!"; -"A folder by that name already exists." = "A folder by that name already exists."; -"You cannot create a list in a shared address book." - = "You cannot create a list in a shared address book."; -"Warning" = "Warning"; + + + "You are not allowed to access this module or this system. Please contact your system administrator." = "Nid oes gennych caniatad mynediad i'r modiwl hwn na'r system hwn. Cysylltwch a'r Gweinyddwr Systemau os gwelwch yn dda."; "You don't have the required privileges to perform the operation." = "Nid oes gennych y breintiau gofynnol i berfformio'r gweithrediad."; -"noEmailForDelegation" = "You must specify the address to which you want to delegate your invitation."; -"delegate is organizer" = "The delegate is the organizer. Please specify a different delegate."; -"delegate is a participant" = "The delegate is already a participant."; -"delegate is a group" = "The specified address corresponds to a group. You can only delegate to a unique person."; + + + + /* common buttons */ -"OK" = "OK"; -"Cancel" = "Cancel"; -"Yes" = "Yes"; + + + "No" = "No"; /* alarms */ diff --git a/UI/MailPartViewers/BrazilianPortuguese.lproj/Localizable.strings b/UI/MailPartViewers/BrazilianPortuguese.lproj/Localizable.strings index d052cd055..233cc1ba0 100644 --- a/UI/MailPartViewers/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/MailPartViewers/BrazilianPortuguese.lproj/Localizable.strings @@ -23,10 +23,10 @@ request_info = "convidou você para participar de uma reunião."; Accept = "Aceitar"; Decline = "Declinar"; Tentative = "Tentativa"; -"Delegate ..." = "Delegate ..."; -"Delegated to" = "Delegated to"; + + "Update status in calendar" = "Atualizar status no calendário"; -"delegated from" = "delegated from"; + reply_info_no_attendee = "Você recebeu uma resposta de um evento agendado, mas o remetente da resposta não é um participante."; reply_info = "Esta é uma resposta de um convite feito por você."; @@ -37,10 +37,10 @@ reply_info = "Esta é uma resposta de um convite feito por você."; "Size" = "Tamanho"; -"Digital signature is not valid" = "Digital signature is not valid"; -"Message is signed" = "Message is signed"; -"Subject" = "Subject"; -"From" = "From"; -"Date" = "Date"; -"To" = "To"; -"Issuer" = "Issuer"; + + + + + + + diff --git a/UI/MailPartViewers/Czech.lproj/Localizable.strings b/UI/MailPartViewers/Czech.lproj/Localizable.strings index 46cfd979a..44599f2db 100644 --- a/UI/MailPartViewers/Czech.lproj/Localizable.strings +++ b/UI/MailPartViewers/Czech.lproj/Localizable.strings @@ -26,7 +26,7 @@ Tentative = "Nezávazně"; "Delegate ..." = "Delegovat ..."; "Delegated to" = "Delegovat na"; "Update status in calendar" = "Aktualizovat status v kalendáři"; -"delegated from" = "delegated from"; + reply_info_no_attendee = "Obdrželi jste odpověď k plánované události, ale odesílatel se události neúčastní."; reply_info = "Toto je odpověď na pozvánku k událost, kterou jste vytvořili vy."; diff --git a/UI/MailPartViewers/Dutch.lproj/Localizable.strings b/UI/MailPartViewers/Dutch.lproj/Localizable.strings index f4c92f37a..e418e56e5 100644 --- a/UI/MailPartViewers/Dutch.lproj/Localizable.strings +++ b/UI/MailPartViewers/Dutch.lproj/Localizable.strings @@ -23,10 +23,10 @@ request_info = "nodigt u uit deel te nemen aan bijgevoegde afspraak."; Accept = "Accepteren"; Decline = "Weigeren"; Tentative = "Onder voorbehoud"; -"Delegate ..." = "Delegate ..."; -"Delegated to" = "Delegated to"; + + "Update status in calendar" = "Afspraak bijwerken in agenda"; -"delegated from" = "delegated from"; + reply_info_no_attendee = "U heeft een antwoord betreffende een afspraak ontvangen van een niet-deelnemer."; reply_info = "Dit is een antwoord op een door u verstuurde uitnodiging."; @@ -37,10 +37,10 @@ reply_info = "Dit is een antwoord op een door u verstuurde uitnodiging."; "Size" = "Grootte"; -"Digital signature is not valid" = "Digital signature is not valid"; -"Message is signed" = "Message is signed"; -"Subject" = "Subject"; -"From" = "From"; -"Date" = "Date"; -"To" = "To"; -"Issuer" = "Issuer"; + + + + + + + diff --git a/UI/MailPartViewers/French.lproj/Localizable.strings b/UI/MailPartViewers/French.lproj/Localizable.strings index 1d78e8564..1a3a324d8 100644 --- a/UI/MailPartViewers/French.lproj/Localizable.strings +++ b/UI/MailPartViewers/French.lproj/Localizable.strings @@ -7,7 +7,7 @@ DELEGATED = "Délégué"; TENTATIVE = "Proposition"; organized_by_you = "vous êtes l'organisateur"; you_are_an_attendee = "vous êtes invité"; -add_info_text = "iMIP 'ADD' requests are not yet supported by SOGo."; + publish_info_text = "L'expéditeur vous informe de l'événement attaché."; cancel_info_text = "Votre invitation ou l'événement au complet a été annulé."; request_info_no_attendee = "propose une réunion entre les invités. Ce message tient seulement lieu d'avis, vous n'êtes pas indiqué comme invité."; @@ -41,6 +41,6 @@ reply_info = "Ceci est une réponse à un événement que vous avez organisé."; "Message is signed" = "Message signé"; "Subject" = "Sujet"; "From" = "Expéditeur"; -"Date" = "Date"; + "To" = "Destinataire"; "Issuer" = "Émetteur"; diff --git a/UI/MailPartViewers/Hungarian.lproj/Localizable.strings b/UI/MailPartViewers/Hungarian.lproj/Localizable.strings index 0c8dacdd1..7d0d0aff0 100644 --- a/UI/MailPartViewers/Hungarian.lproj/Localizable.strings +++ b/UI/MailPartViewers/Hungarian.lproj/Localizable.strings @@ -23,10 +23,10 @@ request_info = "meghívja önt résztvevőnek egy találkozóra."; Accept = "Elfogad"; Decline = "Elutasít"; Tentative = "Bizonytalan"; -"Delegate ..." = "Delegate ..."; -"Delegated to" = "Delegated to"; + + "Update status in calendar" = "Állapot frissítése a naptárban"; -"delegated from" = "delegated from"; + reply_info_no_attendee = "Ön választ kapott egy találkozóra, a feladó azonban nem résztvevő."; reply_info = "Ez egy válasz az ön által kiküldött meghívásra."; @@ -37,10 +37,10 @@ reply_info = "Ez egy válasz az ön által kiküldött meghívásra."; "Size" = "Méret"; -"Digital signature is not valid" = "Digital signature is not valid"; -"Message is signed" = "Message is signed"; -"Subject" = "Subject"; -"From" = "From"; -"Date" = "Date"; -"To" = "To"; -"Issuer" = "Issuer"; + + + + + + + diff --git a/UI/MailPartViewers/Polish.lproj/Localizable.strings b/UI/MailPartViewers/Polish.lproj/Localizable.strings index c4e4305bc..89ba5d472 100644 --- a/UI/MailPartViewers/Polish.lproj/Localizable.strings +++ b/UI/MailPartViewers/Polish.lproj/Localizable.strings @@ -26,7 +26,7 @@ Tentative = "Niepewny"; "Delegate ..." = "Przekaż ..."; "Delegated to" = "Przekazane do"; "Update status in calendar" = "Zaktualizuj status w kalendarzu"; -"delegated from" = "delegated from"; + reply_info_no_attendee = "Otrzymałeś odpowiedź do wydarzenia ale nadawca nie jest uczestnikiem."; reply_info = "To jest odpowiedź do utworzonego przez ciebie wydarzenia"; diff --git a/UI/MailPartViewers/Russian.lproj/Localizable.strings b/UI/MailPartViewers/Russian.lproj/Localizable.strings index 9d7179075..49ab1a770 100644 --- a/UI/MailPartViewers/Russian.lproj/Localizable.strings +++ b/UI/MailPartViewers/Russian.lproj/Localizable.strings @@ -7,7 +7,7 @@ DELEGATED = "делегировано"; TENTATIVE = "предварительное согласие"; organized_by_you = "организованные Вами"; you_are_an_attendee = "с Вашим участием"; -add_info_text = "iMIP 'ADD' requests are not yet supported by SOGo."; + publish_info_text = "Отправитель сообщает о приложенном событии."; cancel_info_text = "Ваше приглашение или все мероприятие отменено."; request_info_no_attendee = "предлагает участникам встретиться. Вы получили это сообщение как приглашенное лицо. Вы еще не включены в список подтвержденных участников."; @@ -23,10 +23,10 @@ request_info = "приглашает Вас принять участие в в Accept = "Принять"; Decline = "Отклонить"; Tentative = "предварительно согласиться"; -"Delegate ..." = "Delegate ..."; -"Delegated to" = "Delegated to"; + + "Update status in calendar" = "Обновить статус в календаре"; -"delegated from" = "delegated from"; + reply_info_no_attendee = "Вы получили ответ на запланированное мероприятие, но отправителя сообщения нет среди приглашенных."; reply_info = "Это ответ на Ваше приглашение на мероприятие."; @@ -37,10 +37,10 @@ reply_info = "Это ответ на Ваше приглашение на мер "Size" = "Размер"; -"Digital signature is not valid" = "Digital signature is not valid"; -"Message is signed" = "Message is signed"; -"Subject" = "Subject"; -"From" = "From"; -"Date" = "Date"; -"To" = "To"; -"Issuer" = "Issuer"; + + + + + + + diff --git a/UI/MailPartViewers/Ukrainian.lproj/Localizable.strings b/UI/MailPartViewers/Ukrainian.lproj/Localizable.strings index 924f91afc..7ce813e82 100644 --- a/UI/MailPartViewers/Ukrainian.lproj/Localizable.strings +++ b/UI/MailPartViewers/Ukrainian.lproj/Localizable.strings @@ -7,7 +7,7 @@ DELEGATED = "делеговано"; TENTATIVE = "попереднє погодження"; organized_by_you = "організоване Вами"; you_are_an_attendee = "за Вашої участі"; -add_info_text = "iMIP 'ADD' requests are not yet supported by SOGo."; + publish_info_text = "Відправник повідомляє про вкладену подію."; cancel_info_text = "Ваше запрошення або всі заходи скасовано."; request_info_no_attendee = "пропонує учасникам зустрітись. Ви отримали це повідомлення як запрошена особа. Ви ще не долучені до списку підтверджених учасників."; @@ -26,7 +26,7 @@ Tentative = "попередьно погодитись"; "Delegate ..." = "Делегуват ..."; "Delegated to" = "Делегувати"; "Update status in calendar" = "Поновити статус в календарі"; -"delegated from" = "delegated from"; + reply_info_no_attendee = "Ви отримали відповідь на запланований захід, але відправник повідомлення відсутній серед запрошених."; reply_info = "Це відповідь на Ваше запрошення взяти участь у заході."; diff --git a/UI/MailPartViewers/Welsh.lproj/Localizable.strings b/UI/MailPartViewers/Welsh.lproj/Localizable.strings index 955e2ac73..6c134783d 100644 --- a/UI/MailPartViewers/Welsh.lproj/Localizable.strings +++ b/UI/MailPartViewers/Welsh.lproj/Localizable.strings @@ -7,7 +7,7 @@ DELEGATED = "dirprwyedig"; TENTATIVE = "petrus"; organized_by_you = "trefnwyd gennych chi"; you_are_an_attendee = "yr ydych yn mynychu"; -add_info_text = "iMIP 'ADD' requests are not yet supported by SOGo."; + publish_info_text = "Mae'r anfonwr yn eich hysbysu o'r digwyddiad atodol."; cancel_info_text = "Cafodd eich gwahoddiad i'r holl ddigwyddiad ei ganslo."; request_info_no_attendee = "yn cynnig cyfarfod i'r holl rhai sy'n mynychu. Rydych yn derbyn yr ebost yma fel hysbysiad, nid ydych wedi cael eich rhestri fel cyfrannogwr."; @@ -23,10 +23,10 @@ request_info = "yn eich gwahodd i gyfarfod."; Accept = "Derbyn"; Decline = "Gwrthod"; Tentative = "Petrus"; -"Delegate ..." = "Delegate ..."; -"Delegated to" = "Delegated to"; + + "Update status in calendar" = "Diweddaru statws yn y calendr"; -"delegated from" = "delegated from"; + reply_info_no_attendee = "Rydych wedi derbyn ymateb i digwyddiad ond nid yw'r anfonwr yn cyfranogwr."; reply_info = "Dyma ymateb i wahoddiad i digwyddiad a wnaed gennych chi."; @@ -37,10 +37,10 @@ reply_info = "Dyma ymateb i wahoddiad i digwyddiad a wnaed gennych chi."; "Size" = "maint"; -"Digital signature is not valid" = "Digital signature is not valid"; -"Message is signed" = "Message is signed"; -"Subject" = "Subject"; -"From" = "From"; -"Date" = "Date"; -"To" = "To"; -"Issuer" = "Issuer"; + + + + + + + diff --git a/UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings b/UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings index 60d582ffc..3aa20b8bc 100644 --- a/UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings @@ -18,8 +18,8 @@ "Contacts" = "Contatos"; "Attach" = "Anexo"; "Save" = "Salvar"; -"Options" = "Options"; -"Size" = "Size"; + + /* Tooltips */ @@ -79,7 +79,7 @@ "Archive This Folder" = "Archive This Folder"; "Modify the acl of this folder" = "Modificar os direitos desta pasta"; -"Saved Messages.zip" = "Saved Messages.zip"; + "Update" = "Atualizar"; "Cancel" = "Cancelar"; @@ -89,35 +89,35 @@ "From" = "De"; "Subject" = "Assunto"; "To" = "Para"; -"Cc" = "Cc"; -"Bcc" = "Bcc"; + + "Reply-To" = "Responder-Para"; "Add address" = "Adicionar endereço"; "Attachments:" = "Anexos:"; -"Open" = "Open"; -"Select All" = "Select All"; -"Attach Web Page..." = "Attach Web Page..."; -"Attach File(s)..." = "Attach File(s)..."; + + + + "to" = "Para"; -"cc" = "Cc"; -"bcc" = "Bcc"; + + "Addressbook" = "Catálogo"; "Edit Draft..." = "Editar Rascunho..."; "Load Images" = "Carregar Imagens"; -"Return Receipt" = "Return Receipt"; -"The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?"; -"Return Receipt (displayed) - %@"= "Return Receipt (displayed) - %@"; -"This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents."; + + + + "Priority" = "Prioridade"; "highest" = "Muito Alta"; "high" = "Alta"; -"normal" = "Normal"; + "low" = "Baixa"; "lowest" = "Muito Baixa"; @@ -142,7 +142,7 @@ "View" = "Visão"; "All" = "Tudo"; "Unread" = "Não Lido"; -"No message" = "No message"; + "messages" = "mensagens"; "first" = "Primeiro"; @@ -180,7 +180,7 @@ /* Image Popup menu */ "Save Image" = "Salvar Imagem"; -"Save Attachment" = "Save Attachment"; + /* Mailbox popup menus */ "Open in New Mail Window" = "Abrir em uma Nova Janela"; @@ -196,8 +196,8 @@ "Delete Folder" = "Apagar Pasta"; "Use This Folder For" = "Usar Esta Pasta Para"; "Get Messages for Account" = "Receber Mensagens por Conta"; -"Properties..." = "Properties..."; -"Delegation..." = "Delegation..."; + + /* Use This Folder menu */ "Sent Messages" = "Enviar Mensagens"; @@ -249,13 +249,13 @@ = "Você realmente quer mover esta pasta para a Lixeira ?"; "Operation failed" = "Falha na Operação"; -"Quota" = "Quota:"; + "quotasFormat" = "%{0}% usedo em %{1} MB"; "Please select a message." = "Por favor, selecione uma mensagem."; "Please select a message to print." = "Por favor, selecione a mensagem para imprimir."; "Please select only one message to print." = "Por favor, selecione somente uma mensagem para imprimir."; -"The message you have selected doesn't exist anymore." = "The message you have selected doesn't exist anymore."; + "The folder with name \"%{0}\" could not be created." @@ -277,8 +277,7 @@ = "Copiar a mensagem em sua própria pasta é impossível!"; /* Message operations */ -"The messages could not be moved to the trash folder. Would you like to delete them immediately?" -= "The messages could not be moved to the trash folder. Would you like to delete them immediately?"; + /* Message editing */ "error_validationfailed" = "Validação falhou"; @@ -286,6 +285,6 @@ "error_missingrecipients" = "Sem destinatários selecionados"; /* Message sending */ -"cannot send message: (smtp) all recipients discarded" = "Cannot send message: all recipients are invalid."; -"cannot send message (smtp) - recipients discarded:" = "Cannot send message. The following addresses are invalid:"; -"cannot send message: (smtp) error when connecting" = "Cannot send message: error when connecting to the SMTP server."; + + + diff --git a/UI/MailerUI/Catalan.lproj/Localizable.strings b/UI/MailerUI/Catalan.lproj/Localizable.strings index e31cc14b2..98f9d15ad 100644 --- a/UI/MailerUI/Catalan.lproj/Localizable.strings +++ b/UI/MailerUI/Catalan.lproj/Localizable.strings @@ -89,7 +89,7 @@ "From" = "De"; "Subject" = "Assummpte"; "To" = "Per a"; -"Cc" = "Cc"; + "Bcc" = "C/o"; "Reply-To" = "Respondre a"; "Add address" = "Afegir adreça"; @@ -110,14 +110,14 @@ "Load Images" = "Carregar imatges"; "Return Receipt" = "Justificant de recepció"; -"The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?"; -"Return Receipt (displayed) - %@"= "Return Receipt (displayed) - %@"; -"This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents."; + + + "Priority" = "Prioritat"; "highest" = "Màxima"; "high" = "Alta"; -"normal" = "Normal"; + "low" = "Baixa"; "lowest" = "Mínima"; @@ -196,8 +196,8 @@ "Delete Folder" = "Esborrar carpeta"; "Use This Folder For" = "Usar aquesta carpeta per a"; "Get Messages for Account" = "Rebre missatges per a compte"; -"Properties..." = "Properties..."; -"Delegation..." = "Delegation..."; + + /* Use This Folder menu */ "Sent Messages" = "Enviar missatges"; @@ -225,9 +225,9 @@ /* Label popup menu */ "None" = "Cap"; -"Important" = "Important"; + "Work" = "Feina"; -"Personal" = "Personal"; + "To Do" = "Per fer"; "Later" = "Més tard"; @@ -277,8 +277,7 @@ = "No es poden copiar missatges en la mateixa carpeta."; /* Message operations */ -"The messages could not be moved to the trash folder. Would you like to delete them immediately?" -= "The messages could not be moved to the trash folder. Would you like to delete them immediately?"; + /* Message editing */ "error_validationfailed" = "Error de validació"; @@ -286,6 +285,6 @@ "error_missingrecipients" = "No heu indicat els destinataris"; /* Message sending */ -"cannot send message: (smtp) all recipients discarded" = "Cannot send message: all recipients are invalid."; -"cannot send message (smtp) - recipients discarded:" = "Cannot send message. The following addresses are invalid:"; -"cannot send message: (smtp) error when connecting" = "Cannot send message: error when connecting to the SMTP server."; + + + diff --git a/UI/MailerUI/Czech.lproj/Localizable.strings b/UI/MailerUI/Czech.lproj/Localizable.strings index 301c74541..7896883b3 100644 --- a/UI/MailerUI/Czech.lproj/Localizable.strings +++ b/UI/MailerUI/Czech.lproj/Localizable.strings @@ -11,7 +11,7 @@ "Reply" = "Odpovědět"; "Reply All" = "Odp. všem"; "Print" = "Tisk"; -"Stop" = "Stop"; + "Write" = "Napsat"; "Send" = "Odeslat"; @@ -109,10 +109,10 @@ "Edit Draft..." = "Upravit koncept..."; "Load Images" = "Nahrát obrázky"; -"Return Receipt" = "Return Receipt"; -"The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?"; -"Return Receipt (displayed) - %@"= "Return Receipt (displayed) - %@"; -"This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents."; + + + + "Priority" = "Priorita"; "highest" = "Nejvyšší"; @@ -142,7 +142,7 @@ "View" = "Zobrazit"; "All" = "Všechny"; "Unread" = "Nepřečtené"; -"No message" = "No message"; + "messages" = "zprávy"; "first" = "Nejnovější"; @@ -196,8 +196,8 @@ "Delete Folder" = "Smazat složku"; "Use This Folder For" = "Použít tuto složku pro"; "Get Messages for Account" = "Stáhnout zprávy pro účet"; -"Properties..." = "Properties..."; -"Delegation..." = "Delegation..."; + + /* Use This Folder menu */ "Sent Messages" = "Odeslané zprávy"; @@ -255,7 +255,7 @@ "Please select a message." = "Vyberte zprávu prosím."; "Please select a message to print." = "Zvolte prosím zprávu, kterou chcete tisknout."; "Please select only one message to print." = "Zvolte pouze jednu zprávu, kterou chcete tisknout."; -"The message you have selected doesn't exist anymore." = "The message you have selected doesn't exist anymore."; + "The folder with name \"%{0}\" could not be created." @@ -277,8 +277,7 @@ = "Je nemožné zkopírovat zprávu do své vlastní složky!"; /* Message operations */ -"The messages could not be moved to the trash folder. Would you like to delete them immediately?" -= "The messages could not be moved to the trash folder. Would you like to delete them immediately?"; + /* Message editing */ "error_validationfailed" = "Potvrzení selhalo"; @@ -286,6 +285,6 @@ "error_missingrecipients" = "Příjemci nebyli specifikováni"; /* Message sending */ -"cannot send message: (smtp) all recipients discarded" = "Cannot send message: all recipients are invalid."; -"cannot send message (smtp) - recipients discarded:" = "Cannot send message. The following addresses are invalid:"; -"cannot send message: (smtp) error when connecting" = "Cannot send message: error when connecting to the SMTP server."; + + + diff --git a/UI/MailerUI/Dutch.lproj/Localizable.strings b/UI/MailerUI/Dutch.lproj/Localizable.strings index 0187b0854..852ebc4ab 100644 --- a/UI/MailerUI/Dutch.lproj/Localizable.strings +++ b/UI/MailerUI/Dutch.lproj/Localizable.strings @@ -18,25 +18,25 @@ "Contacts" = "Adresboek"; "Attach" = "Bijlage"; "Save" = "Opslaan"; -"Options" = "Options"; -"Size" = "Size"; + + /* Tooltips */ -"Send this message now" = "Send this message now"; -"Select a recipient from an Address Book" = "Select a recipient from an Address Book"; -"Include an attachment" = "Include an attachment"; -"Save this message" = "Save this message"; -"Get new messages" = "Get new messages"; -"Create a new message" = "Create a new message"; -"Go to address book" = "Go to address book"; -"Reply to the message" = "Reply to the message"; -"Reply to sender and all recipients" = "Reply to sender and all recipients"; -"Forward selected message" = "Forward selected message"; -"Delete selected message or folder" = "Delete selected message or folder"; -"Mark the selected messages as junk" = "Mark the selected messages as junk"; -"Print this message" = "Print this message"; -"Stop the current transfer" = "Stop the current transfer"; + + + + + + + + + + + + + + "Attachment" = "Bijlage"; "Unread" = "Ongelezen"; "Flagged" = "Gemarkeerd"; @@ -49,7 +49,7 @@ "Mail" = "E-mail"; "Right Administration" = "Machtigingen beheren"; -"Help" = "Help"; + /* Mail account main windows */ @@ -59,7 +59,7 @@ "Write a new message" = "Een nieuw bericht opstellen"; "Share: " = "Delen: "; -"Account: " = "Account: "; + "Shared Account: " = "Gedeeld account"; /* acls */ @@ -79,7 +79,7 @@ "Archive This Folder" = "Archive This Folder"; "Modify the acl of this folder" = "Machtigingen van deze map aanpassen"; -"Saved Messages.zip" = "Saved Messages.zip"; + "Update" = "Opslaan"; "Cancel" = "Sluiten"; @@ -89,16 +89,16 @@ "From" = "Van"; "Subject" = "Onderwerp"; "To" = "Aan"; -"Cc" = "Cc"; -"Bcc" = "Bcc"; -"Reply-To" = "Reply-To"; + + + "Add address" = "Adres toevoegen"; "Attachments:" = "Bijlage:"; -"Open" = "Open"; -"Select All" = "Select All"; -"Attach Web Page..." = "Attach Web Page..."; -"Attach File(s)..." = "Attach File(s)..."; + + + + "to" = "aan"; "cc" = "cc"; @@ -110,9 +110,9 @@ "Load Images" = "Afbeeldingen laden"; "Return Receipt" = "Ontvangstbevestiging"; -"The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?"; -"Return Receipt (displayed) - %@"= "Return Receipt (displayed) - %@"; -"This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents."; + + + "Priority" = "Prioriteit"; "highest" = "Hoogste"; @@ -139,10 +139,10 @@ "Entire Message" = "Volledig bericht"; "Date" = "Datum"; -"View" = "View"; + "All" = "Alle"; "Unread" = "Ongelezen"; -"No message" = "No message"; + "messages" = "berichten"; "first" = "eerste"; @@ -165,8 +165,8 @@ "InboxFolderName" = "Postvak IN"; "DraftsFolderName" = "Concepten"; "SieveFolderName" = "Berichtregel"; -"OtherUsersFolderName" = "Other Users"; -"SharedFoldersName" = "Shared Folders"; + + "Folders" = "Mappen"; /* title line */ /* MailMoveToPopUp */ @@ -180,7 +180,7 @@ /* Image Popup menu */ "Save Image" = "Afbeelding opslaan"; -"Save Attachment" = "Save Attachment"; + /* Mailbox popup menus */ "Open in New Mail Window" = "In nieuw e-mailvenster openen"; @@ -196,8 +196,8 @@ "Delete Folder" = "Map verwijderen"; "Use This Folder For" = "De map gebruiken voor..."; "Get Messages for Account" = "Berichten ophalen voor account"; -"Properties..." = "Properties..."; -"Delegation..." = "Delegation..."; + + /* Use This Folder menu */ "Sent Messages" = "Berichten verzenden"; @@ -229,7 +229,7 @@ "Work" = "Werk"; "Personal" = "Persoonlijk"; "To Do" = "Te doen"; -"Later" = "Later"; + /* Mark popup menu */ "As Read" = "Als gelezen"; @@ -255,7 +255,7 @@ "Please select a message." = "Selecteer een bericht."; "Please select a message to print." = "Selecteer een bericht om af te drukken."; "Please select only one message to print." = "Selecteer een enkel bericht om af te drukken."; -"The message you have selected doesn't exist anymore." = "The message you have selected doesn't exist anymore."; + "The folder with name \"%{0}\" could not be created." @@ -277,8 +277,7 @@ = "Kan bericht niet naar zijn eigen map kopiëren!"; /* Message operations */ -"The messages could not be moved to the trash folder. Would you like to delete them immediately?" -= "The messages could not be moved to the trash folder. Would you like to delete them immediately?"; + /* Message editing */ "error_validationfailed" = "Validering mislukt!"; @@ -286,6 +285,6 @@ "error_missingrecipients" = "U heeft geen ontvanger opgegeven!"; /* Message sending */ -"cannot send message: (smtp) all recipients discarded" = "Cannot send message: all recipients are invalid."; -"cannot send message (smtp) - recipients discarded:" = "Cannot send message. The following addresses are invalid:"; -"cannot send message: (smtp) error when connecting" = "Cannot send message: error when connecting to the SMTP server."; + + + diff --git a/UI/MailerUI/French.lproj/Localizable.strings b/UI/MailerUI/French.lproj/Localizable.strings index aec2c38b5..f2ffc5af8 100644 --- a/UI/MailerUI/French.lproj/Localizable.strings +++ b/UI/MailerUI/French.lproj/Localizable.strings @@ -11,14 +11,14 @@ "Reply" = "Répondre"; "Reply All" = "Rép. à tous"; "Print" = "Imprimer"; -"Stop" = "Stop"; + "Write" = "Écrire"; "Send" = "Envoyer"; -"Contacts" = "Contacts"; + "Attach" = "Joindre"; "Save" = "Enregistrer"; -"Options" = "Options"; + "Size" = "Taille"; /* Tooltips */ @@ -46,7 +46,7 @@ "Home" = "Accueil"; "Calendar" = "Agenda"; "Addressbook" = "Adresses"; -"Mail" = "Mail"; + "Right Administration" = "Administration"; "Help" = "Aide"; @@ -95,10 +95,10 @@ "Add address" = "Ajouter Adresse"; "Attachments:" = "Pièces jointes :"; -"Open" = "Open"; -"Select All" = "Select All"; -"Attach Web Page..." = "Attach Web Page..."; -"Attach File(s)..." = "Attach File(s)..."; + + + + "to" = "Pour"; "cc" = "Copie à"; @@ -138,8 +138,8 @@ "To or Cc" = "Pour ou Copie à"; "Entire Message" = "Message Complet"; -"Date" = "Date"; -"View" = "View"; + + "All" = "Tous"; "Unread" = "Non lus"; "No message" = "Aucun message"; @@ -225,7 +225,7 @@ /* Label popup menu */ "None" = "Aucune"; -"Important" = "Important"; + "Work" = "Travail"; "Personal" = "Personnel"; "To Do" = "À faire"; diff --git a/UI/MailerUI/German.lproj/Localizable.strings b/UI/MailerUI/German.lproj/Localizable.strings index 1bc77d77d..7f87d4221 100644 --- a/UI/MailerUI/German.lproj/Localizable.strings +++ b/UI/MailerUI/German.lproj/Localizable.strings @@ -4,10 +4,10 @@ "Create" = "Erstellen"; "Empty Trash" = "Papierkorb leeren"; "Delete" = "Löschen"; -"Expunge" = "Expunge"; + "Forward" = "Weiterleiten"; "Get Mail" = "Abrufen"; -"Junk" = "Junk"; + "Reply" = "Antworten"; "Reply All" = "Allen Antworten"; "Print" = "Drucken"; @@ -18,7 +18,7 @@ "Contacts" = "Kontakte"; "Attach" = "Anhang"; "Save" = "Speichern"; -"Options" = "Options"; + "Size" = "Größe"; /* Tooltips */ @@ -79,7 +79,7 @@ "Archive This Folder" = "Diesen Ordner archivieren"; "Modify the acl of this folder" = "Benutzerrechte dieses Ordners verändern"; -"Saved Messages.zip" = "Saved Messages.zip"; + "Update" = "Speichern"; "Cancel" = "Abbrechen"; @@ -117,7 +117,7 @@ "Priority" = "Priorität"; "highest" = "Sehr hoch"; "high" = "Hoch"; -"normal" = "Normal"; + "low" = "Niedrig"; "lowest" = "Sehr niedrig"; @@ -142,7 +142,7 @@ "View" = "Ansicht"; "All" = "Alle"; "Unread" = "Ungelesene"; -"No message" = "No message"; + "messages" = "Nachricht(en)"; "first" = "Erste"; @@ -196,8 +196,8 @@ "Delete Folder" = "Löschen"; "Use This Folder For" = "Diesen Ordner verwenden für"; "Get Messages for Account" = "Neue Nachrichten empfangen"; -"Properties..." = "Properties..."; -"Delegation..." = "Delegation..."; + + /* Use This Folder menu */ "Sent Messages" = "Gesendete Nachrichten"; @@ -228,7 +228,7 @@ "Important" = "Wichtig"; "Work" = "Geschäftlich"; "Personal" = "Persönlich"; -"To Do" = "To Do"; + "Later" = "Später"; /* Mark popup menu */ @@ -286,6 +286,6 @@ "error_missingrecipients" = "Der Empfänger fehlt!"; /* Message sending */ -"cannot send message: (smtp) all recipients discarded" = "Cannot send message: all recipients are invalid."; -"cannot send message (smtp) - recipients discarded:" = "Cannot send message. The following addresses are invalid:"; -"cannot send message: (smtp) error when connecting" = "Cannot send message: error when connecting to the SMTP server."; + + + diff --git a/UI/MailerUI/Hungarian.lproj/Localizable.strings b/UI/MailerUI/Hungarian.lproj/Localizable.strings index 8d5b1176b..f25aa8f53 100644 --- a/UI/MailerUI/Hungarian.lproj/Localizable.strings +++ b/UI/MailerUI/Hungarian.lproj/Localizable.strings @@ -18,7 +18,7 @@ "Contacts" = "Kapcsolatok"; "Attach" = "Melléklet"; "Save" = "Mentés"; -"Options" = "Options"; + "Size" = "Méret"; /* Tooltips */ @@ -79,7 +79,7 @@ "Archive This Folder" = "Archive This Folder"; "Modify the acl of this folder" = "Mappa jogosultságainak szerkesztése"; -"Saved Messages.zip" = "Saved Messages.zip"; + "Update" = "Mentés"; "Cancel" = "Mégsem"; @@ -95,10 +95,10 @@ "Add address" = "Cím hozzáadása"; "Attachments:" = "Mellékletek:"; -"Open" = "Open"; -"Select All" = "Select All"; -"Attach Web Page..." = "Attach Web Page..."; -"Attach File(s)..." = "Attach File(s)..."; + + + + "to" = "Címzett"; "cc" = "Másolat"; @@ -109,10 +109,10 @@ "Edit Draft..." = "Piszkozat szerkesztése..."; "Load Images" = "Képek betöltése"; -"Return Receipt" = "Return Receipt"; -"The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?"; -"Return Receipt (displayed) - %@"= "Return Receipt (displayed) - %@"; -"This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents."; + + + + "Priority" = "Sürgősség"; "highest" = "nagyon sürgős"; @@ -142,7 +142,7 @@ "View" = "Nézet"; "All" = "Összes"; "Unread" = "Olvasatlan"; -"No message" = "No message"; + "messages" = "üzenetek"; "first" = "Első"; @@ -150,8 +150,8 @@ "next" = "Következő"; "last" = "Utolsó"; -"msgnumber_to" = "to"; -"msgnumber_of" = "of"; + + "Mark Unread" = "Megjelölés olvasatlanként"; "Mark Read" = "Megjelölés olvasottként"; @@ -196,8 +196,8 @@ "Delete Folder" = "Mappa törlése"; "Use This Folder For" = "Mappa használata az alábbira:"; "Get Messages for Account" = "Fiók üzeneteinek letöltése"; -"Properties..." = "Properties..."; -"Delegation..." = "Delegation..."; + + /* Use This Folder menu */ "Sent Messages" = "Elküldött üzenetek"; @@ -255,7 +255,7 @@ "Please select a message." = "Kérem válasszon egy üzenetet."; "Please select a message to print." = "Kérem válasszon ki egy üzenetet a nyomtatáshoz."; "Please select only one message to print." = "Kérem csak egy üzenetet válasszon a nyomtatáshoz."; -"The message you have selected doesn't exist anymore." = "The message you have selected doesn't exist anymore."; + "The folder with name \"%{0}\" could not be created." @@ -277,8 +277,7 @@ = "Egy üzenet nem másolható át a saját mappájába!"; /* Message operations */ -"The messages could not be moved to the trash folder. Would you like to delete them immediately?" -= "The messages could not be moved to the trash folder. Would you like to delete them immediately?"; + /* Message editing */ "error_validationfailed" = "Az ellenőrzés végrehatása nem sikerült"; @@ -286,6 +285,6 @@ "error_missingrecipients" = "Nincsenek címzettek megadva"; /* Message sending */ -"cannot send message: (smtp) all recipients discarded" = "Cannot send message: all recipients are invalid."; -"cannot send message (smtp) - recipients discarded:" = "Cannot send message. The following addresses are invalid:"; -"cannot send message: (smtp) error when connecting" = "Cannot send message: error when connecting to the SMTP server."; + + + diff --git a/UI/MailerUI/Icelandic.lproj/Localizable.strings b/UI/MailerUI/Icelandic.lproj/Localizable.strings index 4021e1bd3..1474a3371 100644 --- a/UI/MailerUI/Icelandic.lproj/Localizable.strings +++ b/UI/MailerUI/Icelandic.lproj/Localizable.strings @@ -91,7 +91,7 @@ "To" = "Til"; "Cc" = "Afrit"; "Bcc" = "Falið afrit"; -"Reply-To" = "Reply-To"; + "Add address" = "Bæta við viðtakanda"; "Attachments:" = "Viðhengi:"; @@ -111,7 +111,7 @@ "Return Receipt" = "Staðfesting á lestri"; "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "Sendandi þessa bréfs hefur beðið um að fá skilaboð þegar þú lest það. Viltu láta sendandann vita?"; -"Return Receipt (displayed) - %@"= "Return Receipt (displayed) - %@"; + "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "Þetta er móttökukvittun fyrir tölvupóstihn sem þú sendir til %@.\n\nAth: Þessi móttökukvittun staðfestir aðeins að tölvubréfið hafi verið sýnt á tölvu móttakandans. Það er engin trygging fyrir því að móttakandinn hafi lesið eða skilið innihald tölvubréfsins."; "Priority" = "Forgangur"; @@ -160,7 +160,7 @@ /* Tree */ -"SentFolderName" = "Sent"; + "TrashFolderName" = "Rusl"; "InboxFolderName" = "Innhólf"; "DraftsFolderName" = "Drög"; @@ -234,7 +234,7 @@ /* Mark popup menu */ "As Read" = "Sem lesið"; "Thread As Read" = "Umræðu sem lesna"; -"As Read By Date..." = "As Read By Date..."; + "All Read" = "Alla sem lesna"; "Flag" = "Tilkynna"; "As Junk" = "Sem ruslpóst"; @@ -243,10 +243,8 @@ /* Folder operations */ "Name :" = "Nafn :"; -"Enter the new name of your folder :" - = "Enter the new name of your folder :"; -"Do you really want to move this folder into the trash ?" - = "Do you really want to move this folder into the trash ?"; + + "Operation failed" = "Aðgerðin mistókst"; "Quota" = "Kvóti:"; diff --git a/UI/MailerUI/Italian.lproj/Localizable.strings b/UI/MailerUI/Italian.lproj/Localizable.strings index 12c198e58..80bfd8d16 100644 --- a/UI/MailerUI/Italian.lproj/Localizable.strings +++ b/UI/MailerUI/Italian.lproj/Localizable.strings @@ -11,14 +11,14 @@ "Reply" = "Rispondi"; "Reply All" = "Rispondi a tutti"; "Print" = "Stampa"; -"Stop" = "Stop"; + "Write" = "Scrivi"; "Send" = "Invia"; "Contacts" = "Contatti"; "Attach" = "Allegato"; "Save" = "Salva"; -"Options" = "Options"; + "Size" = "Dimensione"; /* Tooltips */ @@ -43,7 +43,7 @@ /* Main Frame */ -"Home" = "Home"; + "Calendar" = "Calendario"; "Addressbook" = "Rubrica"; "Mail" = "Posta"; @@ -59,7 +59,7 @@ "Write a new message" = "Scrivi un nuovo messaggio"; "Share: " = "Condividi: "; -"Account: " = "Account: "; + "Shared Account: " = "Account condiviso: "; /* acls */ @@ -89,8 +89,8 @@ "From" = "Da"; "Subject" = "Oggetto"; "To" = "A"; -"Cc" = "Cc"; -"Bcc" = "Bcc"; + + "Reply-To" = "Rispondi a"; "Add address" = "Aggiungi indirizzi"; @@ -101,8 +101,8 @@ "Attach File(s)..." = "Allega File(s)..."; "to" = "A"; -"cc" = "Cc"; -"bcc" = "Bcc"; + + "Addressbook" = "Rubrica"; @@ -196,7 +196,7 @@ "Delete Folder" = "Cancella cartella"; "Use This Folder For" = "Usa questa cartella per"; "Get Messages for Account" = "Scarica messaggi per l'account"; -"Properties..." = "Properties..."; + "Delegation..." = "Delega..."; /* Use This Folder menu */ diff --git a/UI/MailerUI/Norwegian.lproj/Localizable.strings b/UI/MailerUI/Norwegian.lproj/Localizable.strings index 96e5dcfeb..267d393ff 100644 --- a/UI/MailerUI/Norwegian.lproj/Localizable.strings +++ b/UI/MailerUI/Norwegian.lproj/Localizable.strings @@ -14,7 +14,7 @@ "Stop" = "Stopp"; "Write" = "Skriv"; -"Send" = "Send"; + "Contacts" = "Kontakter"; "Attach" = "Vedlegg"; "Save" = "Lagre"; @@ -117,7 +117,7 @@ "Priority" = "Prioritet"; "highest" = "Høyest"; "high" = "Høy"; -"normal" = "Normal"; + "low" = "Lav"; "lowest" = "Lavest"; @@ -165,8 +165,8 @@ "InboxFolderName" = "Innboks"; "DraftsFolderName" = "Kladder"; "SieveFolderName" = "Filter"; -"OtherUsersFolderName" = "Other Users"; -"SharedFoldersName" = "Shared Folders"; + + "Folders" = "Mapper"; /* title line */ /* MailMoveToPopUp */ @@ -286,6 +286,6 @@ "error_missingrecipients" = "Ingen mottagere er angitt"; /* Message sending */ -"cannot send message: (smtp) all recipients discarded" = "Cannot send message: all recipients are invalid."; -"cannot send message (smtp) - recipients discarded:" = "Cannot send message. The following addresses are invalid:"; -"cannot send message: (smtp) error when connecting" = "Cannot send message: error when connecting to the SMTP server."; + + + diff --git a/UI/MailerUI/Polish.lproj/Localizable.strings b/UI/MailerUI/Polish.lproj/Localizable.strings index fadde0062..6cf9e1260 100644 --- a/UI/MailerUI/Polish.lproj/Localizable.strings +++ b/UI/MailerUI/Polish.lproj/Localizable.strings @@ -18,7 +18,7 @@ "Contacts" = "Kontakty"; "Attach" = "Załącz"; "Save" = "Zapisz"; -"Options" = "Options"; + "Size" = "Rozmiar"; /* Tooltips */ @@ -109,10 +109,10 @@ "Edit Draft..." = "Edytuj szkic..."; "Load Images" = "Załaduj obrazki"; -"Return Receipt" = "Return Receipt"; -"The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?"; -"Return Receipt (displayed) - %@"= "Return Receipt (displayed) - %@"; -"This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents."; + + + + "Priority" = "Priorytet"; "highest" = "Najwyższy"; @@ -165,8 +165,8 @@ "InboxFolderName" = "Odebrane"; "DraftsFolderName" = "Szkice"; "SieveFolderName" = "Filtry"; -"OtherUsersFolderName" = "Other Users"; -"SharedFoldersName" = "Shared Folders"; + + "Folders" = "Foldery"; /* title line */ /* MailMoveToPopUp */ @@ -196,8 +196,8 @@ "Delete Folder" = "Usuń folder"; "Use This Folder For" = "Użyj tego foldera do"; "Get Messages for Account" = "Pobierz wiadomości z konta"; -"Properties..." = "Properties..."; -"Delegation..." = "Delegation..."; + + /* Use This Folder menu */ "Sent Messages" = "Wysłane"; @@ -277,8 +277,7 @@ = "Kopiowanie wiadomości do jej obecnego foldera nie jest możliwe!"; /* Message operations */ -"The messages could not be moved to the trash folder. Would you like to delete them immediately?" -= "The messages could not be moved to the trash folder. Would you like to delete them immediately?"; + /* Message editing */ "error_validationfailed" = "Weryfikacja zakończona niepowodzeniem"; @@ -286,6 +285,6 @@ "error_missingrecipients" = "Brak odbiorców"; /* Message sending */ -"cannot send message: (smtp) all recipients discarded" = "Cannot send message: all recipients are invalid."; -"cannot send message (smtp) - recipients discarded:" = "Cannot send message. The following addresses are invalid:"; -"cannot send message: (smtp) error when connecting" = "Cannot send message: error when connecting to the SMTP server."; + + + diff --git a/UI/MailerUI/Russian.lproj/Localizable.strings b/UI/MailerUI/Russian.lproj/Localizable.strings index f87454c9c..96b402657 100644 --- a/UI/MailerUI/Russian.lproj/Localizable.strings +++ b/UI/MailerUI/Russian.lproj/Localizable.strings @@ -18,8 +18,8 @@ "Contacts" = "Адресная книга"; "Attach" = "Вложить"; "Save" = "Сохранить"; -"Options" = "Options"; -"Size" = "Size"; + + /* Tooltips */ @@ -79,7 +79,7 @@ "Archive This Folder" = "Archive This Folder"; "Modify the acl of this folder" = "Управлять правами доступа к этой папке"; -"Saved Messages.zip" = "Saved Messages.zip"; + "Update" = "Обновить"; "Cancel" = "Отмена"; @@ -95,10 +95,10 @@ "Add address" = "Добавить адрес"; "Attachments:" = "Вложения:"; -"Open" = "Open"; -"Select All" = "Select All"; -"Attach Web Page..." = "Attach Web Page..."; -"Attach File(s)..." = "Attach File(s)..."; + + + + "to" = "Кому"; "cc" = "Копия"; @@ -109,10 +109,10 @@ "Edit Draft..." = "Редактировать черновик..."; "Load Images" = "Загрузить изображения"; -"Return Receipt" = "Return Receipt"; -"The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?"; -"Return Receipt (displayed) - %@"= "Return Receipt (displayed) - %@"; -"This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents."; + + + + "Priority" = "Важность"; "highest" = "Самый высокий"; @@ -121,7 +121,7 @@ "low" = "Низкий"; "lowest" = "Самый низкий"; -"This mail is being sent from an unsecure network!" = "This mail is being sent from an unsecure network!"; + /* Popup "show" */ @@ -142,7 +142,7 @@ "View" = "Просмотр"; "All" = "Все"; "Unread" = "Непрочитанные"; -"No message" = "No message"; + "messages" = "сообщения"; "first" = "первая"; @@ -180,7 +180,7 @@ /* Image Popup menu */ "Save Image" = "Сохранить изображение"; -"Save Attachment" = "Save Attachment"; + /* Mailbox popup menus */ "Open in New Mail Window" = "Открыть в новом окне"; @@ -196,8 +196,8 @@ "Delete Folder" = "Удалить папку"; "Use This Folder For" = "Использовать эту папку для"; "Get Messages for Account" = "Получить новые сообщения"; -"Properties..." = "Properties..."; -"Delegation..." = "Delegation..."; + + /* Use This Folder menu */ "Sent Messages" = "Отправленные сообщения"; @@ -255,7 +255,7 @@ "Please select a message." = "Пожалуйста выберите сообщение."; "Please select a message to print." = "Пожалуйста выберите сообщение для отправки на печать."; "Please select only one message to print." = "Пожалуйста выберите только одно сообщение для печати."; -"The message you have selected doesn't exist anymore." = "The message you have selected doesn't exist anymore."; + "The folder with name \"%{0}\" could not be created." @@ -286,6 +286,6 @@ "error_missingrecipients" = "Не указан адрес получателя"; /* Message sending */ -"cannot send message: (smtp) all recipients discarded" = "Cannot send message: all recipients are invalid."; -"cannot send message (smtp) - recipients discarded:" = "Cannot send message. The following addresses are invalid:"; -"cannot send message: (smtp) error when connecting" = "Cannot send message: error when connecting to the SMTP server."; + + + diff --git a/UI/MailerUI/Spanish.lproj/Localizable.strings b/UI/MailerUI/Spanish.lproj/Localizable.strings index fea4d0a05..e3e050992 100644 --- a/UI/MailerUI/Spanish.lproj/Localizable.strings +++ b/UI/MailerUI/Spanish.lproj/Localizable.strings @@ -89,7 +89,7 @@ "From" = "De"; "Subject" = "Asunto"; "To" = "Para"; -"Cc" = "Cc"; + "Bcc" = "CCo"; "Reply-To" = "Responder A"; "Add address" = "Añadir dirección"; @@ -101,7 +101,7 @@ "Attach File(s)..." = "Adjuntar fichero(s)..."; "to" = "Para"; -"cc" = "Cc"; + "bcc" = "CCo"; "Addressbook" = "Libreta de direcciones"; @@ -117,7 +117,7 @@ "Priority" = "Prioridad"; "highest" = "Muy alta"; "high" = "Alta"; -"normal" = "Normal"; + "low" = "Baja"; "lowest" = "Muy baja"; @@ -227,7 +227,7 @@ "None" = "Ninguna"; "Important" = "Importante"; "Work" = "Trabajo"; -"Personal" = "Personal"; + "To Do" = "Por hacer"; "Later" = "Más tarde"; diff --git a/UI/MailerUI/Swedish.lproj/Localizable.strings b/UI/MailerUI/Swedish.lproj/Localizable.strings index 7ac70600d..bf0016efe 100644 --- a/UI/MailerUI/Swedish.lproj/Localizable.strings +++ b/UI/MailerUI/Swedish.lproj/Localizable.strings @@ -117,7 +117,7 @@ "Priority" = "Prioritet"; "highest" = "Högst"; "high" = "Hög"; -"normal" = "Normal"; + "low" = "Låg"; "lowest" = "Lägst"; @@ -165,8 +165,8 @@ "InboxFolderName" = "Inkorgen"; "DraftsFolderName" = "Utkast"; "SieveFolderName" = "Filter"; -"OtherUsersFolderName" = "Other Users"; -"SharedFoldersName" = "Shared Folders"; + + "Folders" = "Mappar"; /* title line */ /* MailMoveToPopUp */ diff --git a/UI/MailerUI/Ukrainian.lproj/Localizable.strings b/UI/MailerUI/Ukrainian.lproj/Localizable.strings index 856b3d318..3e37a8c6a 100644 --- a/UI/MailerUI/Ukrainian.lproj/Localizable.strings +++ b/UI/MailerUI/Ukrainian.lproj/Localizable.strings @@ -277,8 +277,7 @@ = "Неможливо скопіювати повідомлення, оскільки воно вже там є!"; /* Message operations */ -"The messages could not be moved to the trash folder. Would you like to delete them immediately?" -= "The messages could not be moved to the trash folder. Would you like to delete them immediately?"; + /* Message editing */ "error_validationfailed" = "Перевірка зазнала невдачі"; diff --git a/UI/MailerUI/Welsh.lproj/Localizable.strings b/UI/MailerUI/Welsh.lproj/Localizable.strings index c42752a34..24e696478 100644 --- a/UI/MailerUI/Welsh.lproj/Localizable.strings +++ b/UI/MailerUI/Welsh.lproj/Localizable.strings @@ -11,15 +11,15 @@ "Reply" = "Ateb"; "Reply All" = "Ateb Pawb"; "Print" = "Argraffu"; -"Stop" = "Stop"; + "Write" = "Ysgrifennu"; "Send" = "Anfon"; "Contacts" = "Cysylltiadau"; "Attach" = "Atodi"; "Save" = "Cadw"; -"Options" = "Options"; -"Size" = "Size"; + + /* Tooltips */ @@ -49,7 +49,7 @@ "Mail" = "Ebost"; "Right Administration" = "Hawl Gweinyddwr"; -"Help" = "Help"; + /* Mail account main windows */ @@ -79,7 +79,7 @@ "Archive This Folder" = "Archive This Folder"; "Modify the acl of this folder" = "Newid acl y ffolder"; -"Saved Messages.zip" = "Saved Messages.zip"; + "Update" = "Diweddaru"; "Cancel" = "Canslo"; @@ -89,35 +89,35 @@ "From" = "Oddi wrth"; "Subject" = "Testun"; "To" = "At"; -"Cc" = "Cc"; -"Bcc" = "Bcc"; + + "Reply-To" = "Ymateb i"; "Add address" = "Ychwanegu cyfeiriad"; "Attachments:" = "Atodiadau:"; -"Open" = "Open"; -"Select All" = "Select All"; -"Attach Web Page..." = "Attach Web Page..."; -"Attach File(s)..." = "Attach File(s)..."; + + + + "to" = "At"; -"cc" = "Cc"; -"bcc" = "Bcc"; + + "Addressbook" = "Llyfr Cyfeiradau"; "Edit Draft..." = "Golygu Drafft..."; "Load Images" = "Llwytho Delweddau"; -"Return Receipt" = "Return Receipt"; -"The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?"; -"Return Receipt (displayed) - %@"= "Return Receipt (displayed) - %@"; -"This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents."; + + + + "Priority" = "Blaenoriaeth"; "highest" = "Uchaf"; "high" = "Uchel"; -"normal" = "Normal"; + "low" = "Isel"; "lowest" = "Lleiaf"; @@ -142,7 +142,7 @@ "View" = "Gweld"; "All" = "Oll"; "Unread" = "Heb ddarllen"; -"No message" = "No message"; + "messages" = "negeseuon"; "first" = "Cyntaf"; @@ -165,13 +165,13 @@ "InboxFolderName" = "Newydd"; "DraftsFolderName" = "Draffts"; "SieveFolderName" = "Ffilteri"; -"OtherUsersFolderName" = "Other Users"; -"SharedFoldersName" = "Shared Folders"; + + "Folders" = "Ffolderi"; /* title line */ /* MailMoveToPopUp */ -"MoveTo" = "Move …"; + /* Address Popup menu */ "Add to Address Book..." = "Ychwanegu i Llyfr Cyfeiriadau..."; @@ -180,7 +180,7 @@ /* Image Popup menu */ "Save Image" = "Cadw Delwedd"; -"Save Attachment" = "Save Attachment"; + /* Mailbox popup menus */ "Open in New Mail Window" = "Agor mewn ffenestr Neges Newydd"; @@ -196,8 +196,8 @@ "Delete Folder" = "Dileu Ffolder"; "Use This Folder For" = "Defyddio'r Ffolder yma am"; "Get Messages for Account" = "Cael negeseuon ar gyfer Cyfrif"; -"Properties..." = "Properties..."; -"Delegation..." = "Delegation..."; + + /* Use This Folder menu */ "Sent Messages" = "Negeseuon anfonwyd"; @@ -212,7 +212,7 @@ "Edit As New..." = "Golygu fel Newydd..."; "Move To" = "Symud i"; "Copy To" = "Copio i"; -"Label" = "Label"; + "Mark" = "Marc"; "Save As..." = "Cadw Fel..."; "Print Preview" = "Rhagolwg Argraffu"; @@ -250,12 +250,12 @@ "Operation failed" = "Gweithrediad wedi methu"; "Quota" = "cwota:"; -"quotasFormat" = "%{0}% used on %{1} MB"; + "Please select a message." = "Dewiswch neges."; "Please select a message to print." = "Dewiswch neges i'w argraffu."; "Please select only one message to print." = "Dewiswch un neges yn unig i'w argraffu."; -"The message you have selected doesn't exist anymore." = "The message you have selected doesn't exist anymore."; + "The folder with name \"%{0}\" could not be created." @@ -277,8 +277,7 @@ = "Mae copio neges i fewn i'w ffolder ei hun yn amhosibl!"; /* Message operations */ -"The messages could not be moved to the trash folder. Would you like to delete them immediately?" -= "The messages could not be moved to the trash folder. Would you like to delete them immediately?"; + /* Message editing */ "error_validationfailed" = "Dilysiad wedi methu"; @@ -286,6 +285,6 @@ "error_missingrecipients" = "Dim derbynnydd wedi nodi"; /* Message sending */ -"cannot send message: (smtp) all recipients discarded" = "Cannot send message: all recipients are invalid."; -"cannot send message (smtp) - recipients discarded:" = "Cannot send message. The following addresses are invalid:"; -"cannot send message: (smtp) error when connecting" = "Cannot send message: error when connecting to the SMTP server."; + + + diff --git a/UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings b/UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings index 94235dacb..550bb3c06 100644 --- a/UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings @@ -1,10 +1,10 @@ /* this file is in UTF-8 format! */ -"title" = "SOGo"; + "Username:" = "Usuário:"; "Password:" = "Senha:"; -"Domain:" = "Domain:"; + "Connect" = "Conectar"; @@ -14,7 +14,7 @@ "browserNotCompatible" = "Foi detectado que a atual versão de seu navegador não é suportado neste site. Recomentamos que use o Firefox. Clique no link abaixo para baixar a versão atual deste navegador."; "alternativeBrowsers" = "Alternativamente, você pode usar os seguinte navegadores compatíveis"; "alternativeBrowserSafari" = "Alternativamente, você pode usar o Safari."; -"Download" = "Download"; + "Language:" = "Idioma:"; "choose" = "Escolha ..."; @@ -37,38 +37,35 @@ "Welsh" = "Cymraeg"; "About" = "Sobre"; -"AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

-SOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

-SOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

-See this page for various support options."; -"Your account was locked due to too many failed attempts." = "Your account was locked due to too many failed attempts."; -"Your account was locked due to an expired password." = "Your account was locked due to an expired password."; -"Login failed due to unhandled error case: " = "Login failed due to unhandled error case: "; -"Change your Password" = "Change your Password"; -"The password was changed successfully." = "The password was changed successfully."; -"Your password has expired, please enter a new one below:" = "Your password has expired, please enter a new one below:"; -"Password must not be empty." = "Password must not be empty."; -"The passwords do not match. Please try again." = "The passwords do not match. Please try again."; -"Password Grace Period" = "Password Grace Period"; -"You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog."; -"Password about to expire" = "Password about to expire"; -"Your password is going to expire in %{0} %{1}." = "Your password is going to expire in %{0} %{1}."; -"days" = "days"; -"hours" = "hours"; -"minutes" = "minutes"; -"seconds" = "seconds"; -"Password change failed" = "Password change failed"; -"Password change failed - Permission denied" = "Password change failed - Permission denied"; -"Password change failed - Insufficient password quality" = "Password change failed - Insufficient password quality"; -"Password change failed - Password is too short" = "Password change failed - Password is too short"; -"Password change failed - Password is too young" = "Password change failed - Password is too young"; -"Password change failed - Password is in history" = "Password change failed - Password is in history"; -"Unhandled policy error: %{0}" = "Unhandled policy error: %{0}"; -"Unhandled error response" = "Unhandled error response"; -"Password change is not supported." = "Password change is not supported."; -"Unhandled HTTP error code: %{0}" = "Unhandled HTTP error code: %{0}"; -"New password:" = "New password:"; -"Confirmation:" = "Confirmation:"; -"Cancel" = "Cancel"; -"Please wait..." = "Please wait..."; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UI/MainUI/Catalan.lproj/Localizable.strings b/UI/MainUI/Catalan.lproj/Localizable.strings index 2f9426abc..fcc2bbbb6 100644 --- a/UI/MainUI/Catalan.lproj/Localizable.strings +++ b/UI/MainUI/Catalan.lproj/Localizable.strings @@ -1,10 +1,10 @@ /* this file is in UTF-8 format! */ -"title" = "SOGo"; + "Username:" = "Usuari:"; "Password:" = "Contrasenya:"; -"Domain:" = "Domain:"; + "Connect" = "Connectar"; @@ -16,8 +16,8 @@ "alternativeBrowserSafari" = "Safari."; "Download" = "Descàrrega"; -"Language:" = "Language:"; -"choose" = "Choose ..."; + + "Catalan" = "Català"; "Czech" = "Česky"; "Dutch" = "Nederlands"; @@ -37,16 +37,13 @@ "Welsh" = "Cymraeg"; "About" = "Informació"; -"AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

-SOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

-SOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

-See this page for various support options."; + "Your account was locked due to too many failed attempts." = "El vostre compte ha estat bloquejat per un excés d'intents fallits."; "Your account was locked due to an expired password." = "El vostre compte ha estat bloquejat perquè la contrasenya ha caducat."; "Login failed due to unhandled error case: " = "Connexió fallida a causa d'un error inesperat: "; "Change your Password" = "Canvieu la contrasenya"; -"The password was changed successfully." = "The password was changed successfully."; + "Your password has expired, please enter a new one below:" = "La contrasenya ha caducat; introduïu-ne una de nova:"; "Password must not be empty." = "Heu d'escriure la contrasenya."; "The passwords do not match. Please try again." = "Les contrasenyes no coincideixen. Torneu-ho a intentar."; diff --git a/UI/MainUI/Czech.lproj/Localizable.strings b/UI/MainUI/Czech.lproj/Localizable.strings index 1eb25adb1..94507d3bc 100644 --- a/UI/MainUI/Czech.lproj/Localizable.strings +++ b/UI/MainUI/Czech.lproj/Localizable.strings @@ -1,10 +1,10 @@ /* this file is in UTF-8 format! */ -"title" = "SOGo"; + "Username:" = "Uživatelské jméno:"; "Password:" = "Heslo:"; -"Domain:" = "Domain:"; + "Connect" = "Připojit"; @@ -37,16 +37,13 @@ "Welsh" = "Cymraeg"; "About" = "O"; -"AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

-SOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

-SOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

-See this page for various support options."; + "Your account was locked due to too many failed attempts." = "Váš účet byl zablokován z důvodu mnoha neúspěšných pokusů o přihlášení."; "Your account was locked due to an expired password." = "Váš účet byl zablokován z důvodu expirovaného hesla."; "Login failed due to unhandled error case: " = "Přihlášení selhalo z důvodu chyby: "; "Change your Password" = "Změňte své heslo"; -"The password was changed successfully." = "The password was changed successfully."; + "Your password has expired, please enter a new one below:" = "Vaše heslo expirovalo, prosím zadejte nové:"; "Password must not be empty." = "Heslo nesmí být prázdné."; "The passwords do not match. Please try again." = "Hesla se neshodují. Prosím zadejte znovu."; @@ -64,10 +61,10 @@ See this page for v "Password change failed - Password is too short" = "Změna hesla selhala - Příliš krátké heslo"; "Password change failed - Password is too young" = "Změna hesla selhala - Příliš nové heslo"; "Password change failed - Password is in history" = "Změna hesla selhala - Heslo je v historii"; -"Unhandled policy error: %{0}" = "Unhandled policy error: %{0}"; -"Unhandled error response" = "Unhandled error response"; + + "Password change is not supported." = "Změna hesla není podporována."; -"Unhandled HTTP error code: %{0}" = "Unhandled HTTP error code: %{0}"; + "New password:" = "Nové heslo:"; "Confirmation:" = "Potvrzení:"; "Cancel" = "Storno"; diff --git a/UI/MainUI/Dutch.lproj/Localizable.strings b/UI/MainUI/Dutch.lproj/Localizable.strings index 0495d89af..67e98433e 100644 --- a/UI/MainUI/Dutch.lproj/Localizable.strings +++ b/UI/MainUI/Dutch.lproj/Localizable.strings @@ -4,7 +4,7 @@ "Username:" = "Gebruikersnaam:"; "Password:" = "Wachtwoord:"; -"Domain:" = "Domain:"; + "Connect" = "Inloggen"; @@ -14,7 +14,7 @@ "browserNotCompatible" = "We hebben gedetecteerd dat de browser die u op dit moment gebruikt niet word ondersteund voor deze site. Onze aanbeveling is Firefox te gebruiken. Hieronder staat een link om de laatste versie van deze browser te downloaden."; "alternativeBrowsers" = "Als alternatief kun u ook de volgende compatible browsers gebruiken."; "alternativeBrowserSafari" = "Als alternatief kunt u ook Safari gebruiken."; -"Download" = "Download"; + "Language:" = "Taal:"; "choose" = "Kies..."; @@ -36,39 +36,36 @@ "Ukrainian" = "Українська"; "Welsh" = "Cymraeg"; -"About" = "About"; -"AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

-SOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

-SOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

-See this page for various support options."; -"Your account was locked due to too many failed attempts." = "Your account was locked due to too many failed attempts."; -"Your account was locked due to an expired password." = "Your account was locked due to an expired password."; -"Login failed due to unhandled error case: " = "Login failed due to unhandled error case: "; -"Change your Password" = "Change your Password"; -"The password was changed successfully." = "The password was changed successfully."; -"Your password has expired, please enter a new one below:" = "Your password has expired, please enter a new one below:"; -"Password must not be empty." = "Password must not be empty."; -"The passwords do not match. Please try again." = "The passwords do not match. Please try again."; -"Password Grace Period" = "Password Grace Period"; -"You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog."; -"Password about to expire" = "Password about to expire"; -"Your password is going to expire in %{0} %{1}." = "Your password is going to expire in %{0} %{1}."; -"days" = "days"; -"hours" = "hours"; -"minutes" = "minutes"; -"seconds" = "seconds"; -"Password change failed" = "Password change failed"; -"Password change failed - Permission denied" = "Password change failed - Permission denied"; -"Password change failed - Insufficient password quality" = "Password change failed - Insufficient password quality"; -"Password change failed - Password is too short" = "Password change failed - Password is too short"; -"Password change failed - Password is too young" = "Password change failed - Password is too young"; -"Password change failed - Password is in history" = "Password change failed - Password is in history"; -"Unhandled policy error: %{0}" = "Unhandled policy error: %{0}"; -"Unhandled error response" = "Unhandled error response"; -"Password change is not supported." = "Password change is not supported."; -"Unhandled HTTP error code: %{0}" = "Unhandled HTTP error code: %{0}"; -"New password:" = "New password:"; -"Confirmation:" = "Confirmation:"; -"Cancel" = "Cancel"; -"Please wait..." = "Please wait..."; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UI/MainUI/French.lproj/Localizable.strings b/UI/MainUI/French.lproj/Localizable.strings index e61648eb3..5831bb16b 100644 --- a/UI/MainUI/French.lproj/Localizable.strings +++ b/UI/MainUI/French.lproj/Localizable.strings @@ -1,6 +1,6 @@ /* this file is in UTF-8 format! */ -"title" = "SOGo"; + "Username:" = "Nom d'utilisateur :"; "Password:" = "Mot de passe :"; @@ -38,10 +38,7 @@ "Welsh" = "Cymraeg"; "About" = "À propos"; -"AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

-SOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

-SOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

-See this page for various support options."; + "Your account was locked due to too many failed attempts." = "Votre compte a été bloqué dû à un nombre élevé de tentative d'authentification infructueuse."; "Your account was locked due to an expired password." = "Votre compte a été bloqué car votre mot de passe est expiré."; @@ -57,7 +54,7 @@ See this page for v "Your password is going to expire in %{0} %{1}." = "Votre mot de passe va expirer dans %{0} %{1}."; "days" = "jours"; "hours" = "heures"; -"minutes" = "minutes"; + "seconds" = "secondes"; "Password change failed" = "Échec au changement"; "Password change failed - Permission denied" = "Échec au changement - mauvaises permissions"; @@ -70,6 +67,6 @@ See this page for v "Password change is not supported." = "Changement de mot de passe non-supporté."; "Unhandled HTTP error code: %{0}" = "Code HTTP non-géré: %{0}"; "New password:" = "Nouveau mot de passe:"; -"Confirmation:" = "Confirmation:"; + "Cancel" = "Annuler"; "Please wait..." = "Veuillez patienter..."; diff --git a/UI/MainUI/German.lproj/Localizable.strings b/UI/MainUI/German.lproj/Localizable.strings index 7b41adace..27874bfc5 100644 --- a/UI/MainUI/German.lproj/Localizable.strings +++ b/UI/MainUI/German.lproj/Localizable.strings @@ -1,10 +1,10 @@ /* this file is in UTF-8 format! */ -"title" = "SOGo"; + "Username:" = "Benutzername:"; "Password:" = "Passwort:"; -"Domain:" = "Domain:"; + "Connect" = "Anmelden"; @@ -37,16 +37,13 @@ "Welsh" = "Cymraeg"; "About" = "Über"; -"AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

-SOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

-SOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

-See this page for various support options."; + "Your account was locked due to too many failed attempts." = "Ihr Konto wurde wegen zu vieler fehlgeschlagener Versuche gesperrt."; "Your account was locked due to an expired password." = "Ihr Konto wurde wegen eines abgelaufenen Passworts gesperrt."; "Login failed due to unhandled error case: " = "Die Anmeldung ist aufgrund eines unbehandelten Fehlers fehlgeschlagen: "; "Change your Password" = "Passwort ändern"; -"The password was changed successfully." = "The password was changed successfully."; + "Your password has expired, please enter a new one below:" = "Ihr Passwort ist abgelaufen. Bitte geben Sie ein neues an:"; "Password must not be empty." = "Passwort darf nicht leer sein."; "The passwords do not match. Please try again." = "Die Passwörter stimmen nicht überein. Bitte noch einmal eingeben."; diff --git a/UI/MainUI/Hungarian.lproj/Localizable.strings b/UI/MainUI/Hungarian.lproj/Localizable.strings index 24f2907d6..9580a7cfb 100644 --- a/UI/MainUI/Hungarian.lproj/Localizable.strings +++ b/UI/MainUI/Hungarian.lproj/Localizable.strings @@ -1,10 +1,10 @@ /* this file is in UTF-8 format! */ -"title" = "SOGo"; + "Username:" = "Felhasználó:"; "Password:" = "Jelszó:"; -"Domain:" = "Domain:"; + "Connect" = "Kapcsolódás"; @@ -37,38 +37,35 @@ "Welsh" = "Cymraeg"; "About" = "Névjegy"; -"AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

-SOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

-SOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

-See this page for various support options."; -"Your account was locked due to too many failed attempts." = "Your account was locked due to too many failed attempts."; -"Your account was locked due to an expired password." = "Your account was locked due to an expired password."; -"Login failed due to unhandled error case: " = "Login failed due to unhandled error case: "; -"Change your Password" = "Change your Password"; -"The password was changed successfully." = "The password was changed successfully."; -"Your password has expired, please enter a new one below:" = "Your password has expired, please enter a new one below:"; -"Password must not be empty." = "Password must not be empty."; -"The passwords do not match. Please try again." = "The passwords do not match. Please try again."; -"Password Grace Period" = "Password Grace Period"; -"You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog."; -"Password about to expire" = "Password about to expire"; -"Your password is going to expire in %{0} %{1}." = "Your password is going to expire in %{0} %{1}."; -"days" = "days"; -"hours" = "hours"; -"minutes" = "minutes"; -"seconds" = "seconds"; -"Password change failed" = "Password change failed"; -"Password change failed - Permission denied" = "Password change failed - Permission denied"; -"Password change failed - Insufficient password quality" = "Password change failed - Insufficient password quality"; -"Password change failed - Password is too short" = "Password change failed - Password is too short"; -"Password change failed - Password is too young" = "Password change failed - Password is too young"; -"Password change failed - Password is in history" = "Password change failed - Password is in history"; -"Unhandled policy error: %{0}" = "Unhandled policy error: %{0}"; -"Unhandled error response" = "Unhandled error response"; -"Password change is not supported." = "Password change is not supported."; -"Unhandled HTTP error code: %{0}" = "Unhandled HTTP error code: %{0}"; -"New password:" = "New password:"; -"Confirmation:" = "Confirmation:"; -"Cancel" = "Cancel"; -"Please wait..." = "Please wait..."; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UI/MainUI/Icelandic.lproj/Localizable.strings b/UI/MainUI/Icelandic.lproj/Localizable.strings index 10842de26..43da318f6 100644 --- a/UI/MainUI/Icelandic.lproj/Localizable.strings +++ b/UI/MainUI/Icelandic.lproj/Localizable.strings @@ -1,10 +1,10 @@ /* this file is in UTF-8 format! */ -"title" = "SOGo"; + "Username:" = "Notandanafn:"; "Password:" = "Lykilorð:"; -"Domain:" = "Domain:"; + "Connect" = "Tengjast"; @@ -42,32 +42,32 @@ SOGo býður upp á auðugt vefviðmót sem byggt er á AJAX viðmóti og það SOGo er dreift í samkvæmt hugbúnaðarleyfinu GNU GPL útgáfu 2 eða nýrri og sumum hlutum er dreift samkvæmt GNU LGPL útgáfu 2. Þetta er frjáls og opinn hugbúnaður: þér er frjálst að breyta honum og dreifa honum. Það er ENGIN ÁBYRGÐ, að því marki sem leyfilegt er, lögum samkvæmt.

Sjá þessa síðu til að skoða ýmsa möguleika á þjónustu."; -"Your account was locked due to too many failed attempts." = "Your account was locked due to too many failed attempts."; -"Your account was locked due to an expired password." = "Your account was locked due to an expired password."; -"Login failed due to unhandled error case: " = "Login failed due to unhandled error case: "; + + + "Change your Password" = "Breyta lykilorði"; -"The password was changed successfully." = "The password was changed successfully."; -"Your password has expired, please enter a new one below:" = "Your password has expired, please enter a new one below:"; -"Password must not be empty." = "Password must not be empty."; -"The passwords do not match. Please try again." = "The passwords do not match. Please try again."; -"Password Grace Period" = "Password Grace Period"; -"You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog."; -"Password about to expire" = "Password about to expire"; -"Your password is going to expire in %{0} %{1}." = "Your password is going to expire in %{0} %{1}."; + + + + + + + + "days" = "daga"; "hours" = "klst."; "minutes" = "mínútur"; "seconds" = "sekúndur"; -"Password change failed" = "Password change failed"; -"Password change failed - Permission denied" = "Password change failed - Permission denied"; -"Password change failed - Insufficient password quality" = "Password change failed - Insufficient password quality"; -"Password change failed - Password is too short" = "Password change failed - Password is too short"; -"Password change failed - Password is too young" = "Password change failed - Password is too young"; -"Password change failed - Password is in history" = "Password change failed - Password is in history"; -"Unhandled policy error: %{0}" = "Unhandled policy error: %{0}"; -"Unhandled error response" = "Unhandled error response"; + + + + + + + + "Password change is not supported." = "Ekki er hægt að breyta lykilorði í póstkerfinu. Notið Ugluna."; -"Unhandled HTTP error code: %{0}" = "Unhandled HTTP error code: %{0}"; + "New password:" = "Nýtt lykilorð:"; "Confirmation:" = "Staðfesting:"; "Cancel" = "Hætta við"; diff --git a/UI/MainUI/Italian.lproj/Localizable.strings b/UI/MainUI/Italian.lproj/Localizable.strings index a2d33d482..ef4be7311 100644 --- a/UI/MainUI/Italian.lproj/Localizable.strings +++ b/UI/MainUI/Italian.lproj/Localizable.strings @@ -1,10 +1,10 @@ /* this file is in UTF-8 format! */ -"title" = "SOGo"; -"Username:" = "Username:"; -"Password:" = "Password:"; -"Domain:" = "Domain:"; + + + + "Connect" = "Entra"; @@ -37,16 +37,13 @@ "Welsh" = "Cymraeg"; "About" = "Informazioni"; -"AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

-SOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

-SOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

-See this page for various support options."; + "Your account was locked due to too many failed attempts." = "Account bloccato a causa di troppi tentativi falliti."; "Your account was locked due to an expired password." = "Account bloccato per password scaduta."; "Login failed due to unhandled error case: " = "Login fallito a causa di un errore non gestito: "; "Change your Password" = "Cambia la tua password"; -"The password was changed successfully." = "The password was changed successfully."; + "Your password has expired, please enter a new one below:" = "La tua password è scaduta, prego inserire la nuova password qui sotto:"; "Password must not be empty." = "La password non può essere vuota."; "The passwords do not match. Please try again." = "Le password non coincidono. Prego riprovare."; diff --git a/UI/MainUI/Norwegian.lproj/Localizable.strings b/UI/MainUI/Norwegian.lproj/Localizable.strings index 8f1410690..b5e874fc9 100644 --- a/UI/MainUI/Norwegian.lproj/Localizable.strings +++ b/UI/MainUI/Norwegian.lproj/Localizable.strings @@ -1,10 +1,10 @@ /* this file is in UTF-8 format! */ -"title" = "SOGo"; + "Username:" = "Brukernavn:"; "Password:" = "Passord:"; -"Domain:" = "Domain:"; + "Connect" = "Logg inn"; @@ -37,20 +37,17 @@ "Welsh" = "Cymraeg"; "About" = "Om"; -"AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

-SOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

-SOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

-See this page for various support options."; + "Your account was locked due to too many failed attempts." = "Din konto har blitt låst på grunn av for mange misslykkete innlogginger."; "Your account was locked due to an expired password." = "Din konto har blitt låst fordi ditt passord er utløpt."; -"Login failed due to unhandled error case: " = "Login failed due to unhandled error case: "; + "Change your Password" = "Endre ditt passord"; -"The password was changed successfully." = "The password was changed successfully."; + "Your password has expired, please enter a new one below:" = "Ditt passord har utløpt, vennligst fyll ut et nytt under:"; "Password must not be empty." = "Passordet må ikke være tomt."; "The passwords do not match. Please try again." = "Passordene stemmer ikke overens. Vennligst prøv igjen."; -"Password Grace Period" = "Password Grace Period"; + "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "Du har %{0} gjenværende innlogginger før din konto blir låst. Vennligst endre ditt passord i preferanse-dialogen."; "Password about to expire" = "Passordet er på tur til å utløpe"; "Your password is going to expire in %{0} %{1}." = "Ditt passord vil utløpe om %{0} %{1}."; @@ -64,10 +61,10 @@ See this page for v "Password change failed - Password is too short" = "Feil ved endring av passord - Passordet er for kort"; "Password change failed - Password is too young" = "Feil ved endring av passord - Password is too young"; "Password change failed - Password is in history" = "Feil ved endring av passord - Password is in history"; -"Unhandled policy error: %{0}" = "Unhandled policy error: %{0}"; -"Unhandled error response" = "Unhandled error response"; -"Password change is not supported." = "Password change is not supported."; -"Unhandled HTTP error code: %{0}" = "Unhandled HTTP error code: %{0}"; + + + + "New password:" = "Nytt passord:"; "Confirmation:" = "Bekreftelse:"; "Cancel" = "Avbryt"; diff --git a/UI/MainUI/Polish.lproj/Localizable.strings b/UI/MainUI/Polish.lproj/Localizable.strings index 8f9ad0604..63d346bba 100644 --- a/UI/MainUI/Polish.lproj/Localizable.strings +++ b/UI/MainUI/Polish.lproj/Localizable.strings @@ -1,10 +1,10 @@ /* this file is in UTF-8 format! */ -"title" = "SOGo"; + "Username:" = "Nazwa użytkownika:"; "Password:" = "Hasło:"; -"Domain:" = "Domain:"; + "Connect" = "Zaloguj"; @@ -37,16 +37,13 @@ "Welsh" = "Cymraeg"; "About" = "O programie"; -"AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

-SOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

-SOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

-See this page for various support options."; + "Your account was locked due to too many failed attempts." = "Twoje konto zostało zablokowane wkutek zbyt wielu nieudanych prób logowania."; "Your account was locked due to an expired password." = "Twoje konto zostało zblokowane z powodu wygaśnięcia ważności hasła."; "Login failed due to unhandled error case: " = "Logowanie nie powiodło się z powodu niezidentyfikowanego błędu: "; "Change your Password" = "Zmień swoje hasło"; -"The password was changed successfully." = "The password was changed successfully."; + "Your password has expired, please enter a new one below:" = "Ważność twojego hasła wygasła, wprowadź niżej nowe hasło:"; "Password must not be empty." = "Hasło nie może być puste."; "The passwords do not match. Please try again." = "Hasła nie są zgodne. Spróbuj jeszcze raz."; diff --git a/UI/MainUI/Russian.lproj/Localizable.strings b/UI/MainUI/Russian.lproj/Localizable.strings index 57579579e..48240a68a 100644 --- a/UI/MainUI/Russian.lproj/Localizable.strings +++ b/UI/MainUI/Russian.lproj/Localizable.strings @@ -1,10 +1,10 @@ /* this file is in UTF-8 format! */ -"title" = "SOGo"; + "Username:" = "Логин:"; "Password:" = "Пароль:"; -"Domain:" = "Domain:"; + "Connect" = "Соединение"; @@ -37,38 +37,35 @@ "Welsh" = "Cymraeg"; "About" = "О системе"; -"AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

-SOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

-SOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

-See this page for various support options."; -"Your account was locked due to too many failed attempts." = "Your account was locked due to too many failed attempts."; -"Your account was locked due to an expired password." = "Your account was locked due to an expired password."; -"Login failed due to unhandled error case: " = "Login failed due to unhandled error case: "; -"Change your Password" = "Change your Password"; -"The password was changed successfully." = "The password was changed successfully."; -"Your password has expired, please enter a new one below:" = "Your password has expired, please enter a new one below:"; -"Password must not be empty." = "Password must not be empty."; -"The passwords do not match. Please try again." = "The passwords do not match. Please try again."; -"Password Grace Period" = "Password Grace Period"; -"You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog."; -"Password about to expire" = "Password about to expire"; -"Your password is going to expire in %{0} %{1}." = "Your password is going to expire in %{0} %{1}."; -"days" = "days"; -"hours" = "hours"; -"minutes" = "minutes"; -"seconds" = "seconds"; -"Password change failed" = "Password change failed"; -"Password change failed - Permission denied" = "Password change failed - Permission denied"; -"Password change failed - Insufficient password quality" = "Password change failed - Insufficient password quality"; -"Password change failed - Password is too short" = "Password change failed - Password is too short"; -"Password change failed - Password is too young" = "Password change failed - Password is too young"; -"Password change failed - Password is in history" = "Password change failed - Password is in history"; -"Unhandled policy error: %{0}" = "Unhandled policy error: %{0}"; -"Unhandled error response" = "Unhandled error response"; -"Password change is not supported." = "Password change is not supported."; -"Unhandled HTTP error code: %{0}" = "Unhandled HTTP error code: %{0}"; -"New password:" = "New password:"; -"Confirmation:" = "Confirmation:"; -"Cancel" = "Cancel"; -"Please wait..." = "Please wait..."; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UI/MainUI/Spanish.lproj/Localizable.strings b/UI/MainUI/Spanish.lproj/Localizable.strings index a6c48c54b..158161faf 100644 --- a/UI/MainUI/Spanish.lproj/Localizable.strings +++ b/UI/MainUI/Spanish.lproj/Localizable.strings @@ -1,10 +1,10 @@ /* this file is in UTF-8 format! */ -"title" = "SOGo"; + "Username:" = "Usuario:"; "Password:" = "Contraseña:"; -"Domain:" = "Domain:"; + "Connect" = "Conectar"; @@ -46,7 +46,7 @@ Ver esta página pa "Your account was locked due to an expired password." = "Su cuenta ha sido bloqueada debido a una contraseña caducada."; "Login failed due to unhandled error case: " = "Conexión fallida debido a un error desconocido: "; "Change your Password" = "Cambie su contraseña"; -"The password was changed successfully." = "The password was changed successfully."; + "Your password has expired, please enter a new one below:" = "Su contraseña ha caducado, por favor, introduzca una nueva abajo:"; "Password must not be empty." = "La contraseña no puede estar vacía."; "The passwords do not match. Please try again." = "La contraseña no es igual. Por favor, intentelo de nuevo."; diff --git a/UI/MainUI/Swedish.lproj/Localizable.strings b/UI/MainUI/Swedish.lproj/Localizable.strings index 3ae07ac27..c2673d820 100644 --- a/UI/MainUI/Swedish.lproj/Localizable.strings +++ b/UI/MainUI/Swedish.lproj/Localizable.strings @@ -1,10 +1,10 @@ /* this file is in UTF-8 format! */ -"title" = "SOGo"; + "Username:" = "Användarnamn:"; "Password:" = "Lösenord:"; -"Domain:" = "Domain:"; + "Connect" = "Logga in"; @@ -37,16 +37,13 @@ "Welsh" = "Cymraeg"; "About" = "Om"; -"AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

-SOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

-SOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

-See this page for various support options."; + "Your account was locked due to too many failed attempts." = "Ditt konto är spärrat pga för många misslyckade inloggningsförsök."; "Your account was locked due to an expired password." = "Ditt konto är spärrat pga att lösenordet har slutat gälla."; "Login failed due to unhandled error case: " = "Inloggningen misslyckades pga ett okänt fel: "; "Change your Password" = "Ändra ditt lösenord"; -"The password was changed successfully." = "The password was changed successfully."; + "Your password has expired, please enter a new one below:" = "Ditt lösenord har slutat gälla, mata in ett nytt lösenord nedan:"; "Password must not be empty." = "Lösenordet får inte vara tomt."; "The passwords do not match. Please try again." = "Felaktigt lösenord. Försök igen."; diff --git a/UI/MainUI/Ukrainian.lproj/Localizable.strings b/UI/MainUI/Ukrainian.lproj/Localizable.strings index 50c7b6a8e..bb4053480 100644 --- a/UI/MainUI/Ukrainian.lproj/Localizable.strings +++ b/UI/MainUI/Ukrainian.lproj/Localizable.strings @@ -1,10 +1,10 @@ /* this file is in UTF-8 format! */ -"title" = "SOGo"; + "Username:" = "Лоґін:"; "Password:" = "Пароль:"; -"Domain:" = "Domain:"; + "Connect" = "Увійти"; @@ -49,7 +49,7 @@ SOGo забезпечує зручний веб-інтерфейс на осно "Your account was locked due to an expired password." = "Ваш обліковий запис заблоковано, оскільки закінчився термін дії пароля."; "Login failed due to unhandled error case: " = "Невдала спроба авторизація через невизначену помилку: "; "Change your Password" = "Змініть Ваш пароль"; -"The password was changed successfully." = "The password was changed successfully."; + "Your password has expired, please enter a new one below:" = "Закінчився термін дії Вашого пароля, будь ласка, введіть новий нижче:"; "Password must not be empty." = "Пароль не може бути порожнім."; "The passwords do not match. Please try again." = "Паролі не співпадають. Будь ласка, спробуйте ще раз."; diff --git a/UI/MainUI/Welsh.lproj/Localizable.strings b/UI/MainUI/Welsh.lproj/Localizable.strings index 81eabedf5..4cbf9aa33 100644 --- a/UI/MainUI/Welsh.lproj/Localizable.strings +++ b/UI/MainUI/Welsh.lproj/Localizable.strings @@ -1,10 +1,10 @@ /* this file is in UTF-8 format! */ -"title" = "SOGo"; + "Username:" = "Enw defnyddiwr:"; "Password:" = "Cyfrinair:"; -"Domain:" = "Domain:"; + "Connect" = "Cysylltu"; @@ -36,39 +36,36 @@ "Ukrainian" = "Українська"; "Welsh" = "Cymraeg"; -"About" = "About"; -"AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

-SOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

-SOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

-See this page for various support options."; -"Your account was locked due to too many failed attempts." = "Your account was locked due to too many failed attempts."; -"Your account was locked due to an expired password." = "Your account was locked due to an expired password."; -"Login failed due to unhandled error case: " = "Login failed due to unhandled error case: "; -"Change your Password" = "Change your Password"; -"The password was changed successfully." = "The password was changed successfully."; -"Your password has expired, please enter a new one below:" = "Your password has expired, please enter a new one below:"; -"Password must not be empty." = "Password must not be empty."; -"The passwords do not match. Please try again." = "The passwords do not match. Please try again."; -"Password Grace Period" = "Password Grace Period"; -"You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog."; -"Password about to expire" = "Password about to expire"; -"Your password is going to expire in %{0} %{1}." = "Your password is going to expire in %{0} %{1}."; -"days" = "days"; -"hours" = "hours"; -"minutes" = "minutes"; -"seconds" = "seconds"; -"Password change failed" = "Password change failed"; -"Password change failed - Permission denied" = "Password change failed - Permission denied"; -"Password change failed - Insufficient password quality" = "Password change failed - Insufficient password quality"; -"Password change failed - Password is too short" = "Password change failed - Password is too short"; -"Password change failed - Password is too young" = "Password change failed - Password is too young"; -"Password change failed - Password is in history" = "Password change failed - Password is in history"; -"Unhandled policy error: %{0}" = "Unhandled policy error: %{0}"; -"Unhandled error response" = "Unhandled error response"; -"Password change is not supported." = "Password change is not supported."; -"Unhandled HTTP error code: %{0}" = "Unhandled HTTP error code: %{0}"; -"New password:" = "New password:"; -"Confirmation:" = "Confirmation:"; -"Cancel" = "Cancel"; -"Please wait..." = "Please wait..."; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings b/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings index f403b5dec..2a9833779 100644 --- a/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings @@ -5,36 +5,34 @@ /* tabs */ "General" = "Geral"; "Calendar Options" = "Calendário"; -"Contacts Options" = "Contacts Options"; + "Mail Options" = "Correio"; -"IMAP Accounts" = "IMAP Accounts"; -"Vacation" = "Vacation"; -"Forward" = "Forward"; + + + "Password" = "Senha"; -"Categories" = "Categories"; -"Name" = "Name"; -"Color" = "Color"; -"Add" = "Add"; -"Delete" = "Delete"; + + + + + /* contacts categories */ -"contacts_category_labels" = "Colleague, Competitor, Customer, Friend, Family, Business Partner, Provider, Press, VIP"; + /* vacation (auto-reply) */ -"Enable vacation auto reply" = "Enable vacation auto reply"; + "Auto reply message :" = "AutoResponder somente uma vez a cada remetente com o seguinte texto :"; -"Email addresses (separated by commas) :" = "Email addresses (separated by commas) :"; -"Add default email addresses" = "Add default email addresses"; -"Days between responses :" = "Days between responses :"; -"Do not send responses to mailing lists" = "Do not send responses to mailing lists"; -"Please specify your message and your email addresses for which you want to enable auto reply." -= "Please specify your message and your email addresses for which you want to enable auto reply."; + + + + + /* forward messages */ -"Forward incoming messages" = "Forward incoming messages"; -"Keep a copy" = "Keep a copy"; -"Please specify an address to which you want to forward your messages." -= "Please specify an address to which you want to forward your messages."; + + + /* d & t */ "Current Time Zone :" = "Fuso Horário :"; @@ -42,46 +40,47 @@ "Long Date Format :" = "Formato da Data (Longo) :"; "Time Format :" = "Formato da Hora :"; -"default" = "Default"; -"shortDateFmt_0" = "%d-%b-%y"; -"shortDateFmt_1" = "%d-%m-%y"; -"shortDateFmt_2" = "%d/%m/%y"; -"shortDateFmt_3" = "%e/%m/%y"; -"shortDateFmt_4" = "%d-%m-%Y"; -"shortDateFmt_5" = "%d/%m/%Y"; -"shortDateFmt_6" = "%m-%d-%y"; -"shortDateFmt_7" = "%m/%d/%y"; -"shortDateFmt_8" = "%m/%e/%y"; -"shortDateFmt_9" = "%y-%m-%d"; -"shortDateFmt_10" = "%y/%m/%d"; -"shortDateFmt_11" = "%y.%m.%d"; -"shortDateFmt_12" = "%Y-%m-%d"; -"shortDateFmt_13" = "%Y/%m/%d"; -"shortDateFmt_14" = "%Y.%m.%d"; -"shortDateFmt_15" = ""; + + + + + + + + + + + + + + + + + -"longDateFmt_0" = "%A, %B %d, %Y"; -"longDateFmt_1" = "%B %d, %Y"; -"longDateFmt_2" = "%A, %d %B, %Y"; -"longDateFmt_3" = "%d %B, %Y"; -"longDateFmt_4" = ""; -"timeFmt_0" = "%I:%M %p"; -"timeFmt_1" = "%H:%M"; -"timeFmt_2" = ""; + + + + + + + + /* calendar */ "Week begins on :" = "A Semana começa em :"; "Day start time :" = "O Dia começa as :"; "Day end time :" = "O Dia termina as :"; -"Day start time must be prior to day end time." = "Day start time must be prior to day end time."; + + "First week of year :" = "Primeira semana do ano :"; "Enable reminders for Calendar items" = "Habilitar lembretes para os itens do Calendário"; "Play a sound when a reminder comes due" @@ -93,10 +92,10 @@ "firstWeekOfYear_FirstFullWeek" = "Primeira semana com 5 dias"; /* Default Calendar */ -"Default calendar :" = "Default calendar"; -"selectedCalendar" = "Selected calendar"; -"personalCalendar" = "Personal calendar"; -"firstCalendar" = "First enabled calendar"; + + + + "reminderTime_0000" = "0 minutos"; "reminderTime_0005" = "5 minutos"; @@ -104,7 +103,7 @@ "reminderTime_0015" = "15 minutos"; "reminderTime_0030" = "30 minutos"; "reminderTime_0100" = "1 hora"; -"reminderTime_0200" = "2 hours"; + "reminderTime_0400" = "4 horas"; "reminderTime_0800" = "8 horas"; "reminderTime_1200" = "1/2 dia"; @@ -113,7 +112,7 @@ /* Mailer */ "Show subscribed mailboxes only" = "Exibir somente caixas de correio inscritas"; -"Sort messages by threads" = "Sort messages by threads"; + "Check for new mail:" = "Checar novos emails:"; "messagecheck_manually" = "Manualmente"; "messagecheck_every_minute" = "A cada minuto"; @@ -133,25 +132,25 @@ "And place my signature" = "E colocar minha assinatura"; "signatureplacement_above" = "abaixo da minha resposta"; "signatureplacement_below" = "abaixo da citação"; -"Compose messages in" = "Compose messages in"; -"composemessagestype_html" = "HTML"; -"composemessagestype_text" = "Plain text"; + + + /* IMAP Accounts */ -"New Mail Account" = "New Mail Account"; -"Server Name:" = "Server Name:"; -"Port:" = "Port:"; -"User Name:" = "User Name:"; + + + + "Password:" = "Senha:"; -"Full Name:" = "Full Name:"; -"Email:" = "Email:"; + + "Signature:" = "Assinatura:"; -"(Click to create)" = "(Click to create)"; + "Signature" = "Assinatura"; -"Please enter your signature below:" = "Please enter your signature below:"; + /* Additional Parameters */ "Additional Parameters" = "Parâmetros Adicionais"; @@ -166,11 +165,11 @@ "calendar_category_labels" = "Aniversário,Negócios,Ligações,Concorrência,Cliente,Favoritos,Acompanhamento,Presentes,Feriados,Idéias,Meeting,Problemas,Miscelânea,Pessoal,Projetos,Feriado público,Posição,Fornecedores,Viagem,Férias"; /* Default module */ -"Calendar" = "Calendar"; -"Contacts" = "Address Book"; -"Mail" = "Mail"; -"Last" = "Last used"; -"Default module :" = "Default module :"; + + + + + "Language :" = "Idioma :"; "choose" = "Escolha ..."; @@ -191,81 +190,81 @@ "Welsh" = "Cymraeg"; /* Return receipts */ -"When I receive a request for a return receipt:" = "When I receive a request for a return receipt:"; -"Never send a return receipt" = "Never send a return receipt"; -"Allow return receipts for some messages" = "Allow return receipts for some messages"; -"If I'm not in the To or Cc of the message:" = "If I'm not in the To or Cc of the message:"; -"If the sender is outside my domain:" = "If the sender is outside my domain:"; -"In all other cases:" = "In all other cases:"; -"Never send" = "Never send"; -"Always send" = "Always send"; -"Ask me" = "Ask me"; + + + + + + + + + /* Return receipts */ -"When I receive a request for a return receipt:" = "When I receive a request for a return receipt:"; -"Never send a return receipt" = "Never send a return receipt"; -"Allow return receipts for some messages" = "Allow return receipts for some messages"; -"If I'm not in the To or Cc of the message:" = "If I'm not in the To or Cc of the message:"; -"If the sender is outside my domain:" = "If the sender is outside my domain:"; -"In all other cases:" = "In all other cases:"; -"Never send" = "Never send"; -"Always send" = "Always send"; -"Ask me" = "Ask me"; + + + + + + + + + /* Filters - UIxPreferences */ -"Filters" = "Filters"; -"Active" = "Active"; -"Move Up" = "Move Up"; -"Move Down" = "Move Down"; + + + + /* Filters - UIxFilterEditor */ -"Filter name:" = "Filter name:"; -"For incoming messages that" = "For incoming messages that"; -"match all of the following rules:" = "match all of the following rules:"; -"match any of the following rules:" = "match any of the following rules:"; -"match all messages" = "match all messages"; -"Perform these actions:" = "Perform these actions:"; -"Subject" = "Subject"; -"From" = "From"; -"To" = "To"; -"Cc" = "Cc"; -"To or Cc" = "To or Cc"; -"Size (Kb)" = "Size (Kb)"; -"Header" = "Header"; -"Flag the message with:" = "Flag the message with:"; -"Discard the message" = "Discard the message"; -"File the message in:" = "File the message in:"; -"Keep the message" = "Keep the message"; -"Forward the message to:" = "Forward the message to:"; -"Send a reject message:" = "Send a reject message:"; -"Send a vacation message" = "Send a vacation message"; -"Stop processing filter rules" = "Stop processing filter rules"; -"is under" = "is under"; -"is over" = "is over"; + + + + + + + + + + + + + + + + + + + + + + + "is" = "is"; -"is not" = "is not"; -"contains" = "contains"; -"does not contain" = "does not contain"; -"matches" = "matches"; -"does not match" = "does not match"; -"matches regex" = "matches regex"; -"does not match regex" = "does not match regex"; -"Seen" = "Seen"; -"Deleted" = "Deleted"; -"Answered" = "Answered"; -"Flagged" = "Flagged"; -"Junk" = "Junk"; -"Not Junk" = "Not Junk"; -"Label 1" = "Label 1"; -"Label 2" = "Label 2"; -"Label 3" = "Label 3"; -"Label 4" = "Label 4"; -"Label 5" = "Label 5"; + + + + + + + + + + + + + + + + + + "Password must not be empty." = "Le mot de passe ne doit pas être vide."; "The passwords do not match. Please try again." = "Les mots de passe ne sont pas identiques. Essayez de nouveau."; diff --git a/UI/PreferencesUI/Hungarian.lproj/Localizable.strings b/UI/PreferencesUI/Hungarian.lproj/Localizable.strings index 67778850f..dff763141 100644 --- a/UI/PreferencesUI/Hungarian.lproj/Localizable.strings +++ b/UI/PreferencesUI/Hungarian.lproj/Localizable.strings @@ -5,36 +5,34 @@ /* tabs */ "General" = "Általános"; "Calendar Options" = "Naptár"; -"Contacts Options" = "Contacts Options"; + "Mail Options" = "Levelezés"; -"IMAP Accounts" = "IMAP Accounts"; -"Vacation" = "Vacation"; -"Forward" = "Forward"; + + + "Password" = "Jelszó"; -"Categories" = "Categories"; -"Name" = "Name"; -"Color" = "Color"; -"Add" = "Add"; -"Delete" = "Delete"; + + + + + /* contacts categories */ -"contacts_category_labels" = "Colleague, Competitor, Customer, Friend, Family, Business Partner, Provider, Press, VIP"; + /* vacation (auto-reply) */ -"Enable vacation auto reply" = "Enable vacation auto reply"; + "Auto reply message :" = "Automatikus válasz minden feladónak csak egy alkalommal :"; -"Email addresses (separated by commas) :" = "Email addresses (separated by commas) :"; -"Add default email addresses" = "Add default email addresses"; -"Days between responses :" = "Days between responses :"; -"Do not send responses to mailing lists" = "Do not send responses to mailing lists"; -"Please specify your message and your email addresses for which you want to enable auto reply." -= "Please specify your message and your email addresses for which you want to enable auto reply."; + + + + + /* forward messages */ -"Forward incoming messages" = "Forward incoming messages"; -"Keep a copy" = "Keep a copy"; -"Please specify an address to which you want to forward your messages." -= "Please specify an address to which you want to forward your messages."; + + + /* d & t */ "Current Time Zone :" = "Időzóna :"; @@ -42,46 +40,47 @@ "Long Date Format :" = "Hosszú dátumformátum :"; "Time Format :" = "Időformátum :"; -"default" = "Default"; -"shortDateFmt_0" = "%d-%b-%y"; -"shortDateFmt_1" = "%d-%m-%y"; -"shortDateFmt_2" = "%d/%m/%y"; -"shortDateFmt_3" = "%e/%m/%y"; -"shortDateFmt_4" = "%d-%m-%Y"; -"shortDateFmt_5" = "%d/%m/%Y"; -"shortDateFmt_6" = "%m-%d-%y"; -"shortDateFmt_7" = "%m/%d/%y"; -"shortDateFmt_8" = "%m/%e/%y"; -"shortDateFmt_9" = "%y-%m-%d"; -"shortDateFmt_10" = "%y/%m/%d"; -"shortDateFmt_11" = "%y.%m.%d"; -"shortDateFmt_12" = "%Y-%m-%d"; -"shortDateFmt_13" = "%Y/%m/%d"; -"shortDateFmt_14" = "%Y.%m.%d"; -"shortDateFmt_15" = ""; + + + + + + + + + + + + + + + + + "longDateFmt_0" = "%Y %B %d, %A"; -"longDateFmt_1" = "%B %d, %Y"; -"longDateFmt_2" = "%A, %d %B, %Y"; -"longDateFmt_3" = "%d %B, %Y"; -"longDateFmt_4" = ""; + + + + "timeFmt_0" = "%H:%M"; "timeFmt_1" = "%I:%M %p"; -"timeFmt_2" = ""; + /* calendar */ "Week begins on :" = "Hét kezdőnapja:"; "Day start time :" = "Nap kezdete:"; "Day end time :" = "Nap vége:"; -"Day start time must be prior to day end time." = "Day start time must be prior to day end time."; + + "First week of year :" = "Év első hete:"; "Enable reminders for Calendar items" = "Emlékeztető engedélyezése a naptárbejegyzésekhez"; "Play a sound when a reminder comes due" @@ -93,10 +92,10 @@ "firstWeekOfYear_FirstFullWeek" = "Első teljes héttől"; /* Default Calendar */ -"Default calendar :" = "Default calendar"; -"selectedCalendar" = "Selected calendar"; -"personalCalendar" = "Personal calendar"; -"firstCalendar" = "First enabled calendar"; + + + + "reminderTime_0000" = "0 perc"; "reminderTime_0005" = "5 perc"; @@ -113,7 +112,7 @@ /* Mailer */ "Show subscribed mailboxes only" = "Csak azok a fiókok mutatása, amelyre feliratkozott"; -"Sort messages by threads" = "Sort messages by threads"; + "Check for new mail:" = "Új üzenetek letöltése:"; "messagecheck_manually" = "Kézi"; "messagecheck_every_minute" = "Percenként"; @@ -134,24 +133,24 @@ "signatureplacement_above" = "az üzenetem alá"; "signatureplacement_below" = "az idézet alá"; "Compose messages in" = "Üzenet formátuma"; -"composemessagestype_html" = "HTML"; + "composemessagestype_text" = "Egyszerű szöveg"; /* IMAP Accounts */ -"New Mail Account" = "New Mail Account"; -"Server Name:" = "Server Name:"; -"Port:" = "Port:"; -"User Name:" = "User Name:"; + + + + "Password:" = "Jelszó:"; -"Full Name:" = "Full Name:"; -"Email:" = "Email:"; + + "Signature:" = "Aláírás:"; -"(Click to create)" = "(Click to create)"; + "Signature" = "Aláírás"; -"Please enter your signature below:" = "Please enter your signature below:"; + /* Additional Parameters */ "Additional Parameters" = "További beállítások"; @@ -166,11 +165,11 @@ "calendar_category_labels" = "Évforduló,Születésnap,Üzleti,Meghívás,Ügyfelek,Versenytársak,Vevő,Kedvencek,Nyomonkövetés,Ajándékozás,Szabadság,Ötletek,Meeting,Ügyek,Egyéb,Személyes,Projektek,Állami ünnep,Állapot,Szállítók,Utazás,Szünidő"; /* Default module */ -"Calendar" = "Calendar"; -"Contacts" = "Address Book"; -"Mail" = "Mail"; -"Last" = "Last used"; -"Default module :" = "Default module :"; + + + + + "Language :" = "Nyelv :"; "choose" = "Válasszon ..."; @@ -191,81 +190,81 @@ "Welsh" = "Cymraeg"; /* Return receipts */ -"When I receive a request for a return receipt:" = "When I receive a request for a return receipt:"; -"Never send a return receipt" = "Never send a return receipt"; -"Allow return receipts for some messages" = "Allow return receipts for some messages"; -"If I'm not in the To or Cc of the message:" = "If I'm not in the To or Cc of the message:"; -"If the sender is outside my domain:" = "If the sender is outside my domain:"; -"In all other cases:" = "In all other cases:"; -"Never send" = "Never send"; -"Always send" = "Always send"; -"Ask me" = "Ask me"; + + + + + + + + + /* Return receipts */ -"When I receive a request for a return receipt:" = "When I receive a request for a return receipt:"; -"Never send a return receipt" = "Never send a return receipt"; -"Allow return receipts for some messages" = "Allow return receipts for some messages"; -"If I'm not in the To or Cc of the message:" = "If I'm not in the To or Cc of the message:"; -"If the sender is outside my domain:" = "If the sender is outside my domain:"; -"In all other cases:" = "In all other cases:"; -"Never send" = "Never send"; -"Always send" = "Always send"; -"Ask me" = "Ask me"; + + + + + + + + + /* Filters - UIxPreferences */ -"Filters" = "Filters"; -"Active" = "Active"; -"Move Up" = "Move Up"; -"Move Down" = "Move Down"; + + + + /* Filters - UIxFilterEditor */ -"Filter name:" = "Filter name:"; -"For incoming messages that" = "For incoming messages that"; -"match all of the following rules:" = "match all of the following rules:"; -"match any of the following rules:" = "match any of the following rules:"; -"match all messages" = "match all messages"; -"Perform these actions:" = "Perform these actions:"; -"Subject" = "Subject"; -"From" = "From"; -"To" = "To"; -"Cc" = "Cc"; -"To or Cc" = "To or Cc"; -"Size (Kb)" = "Size (Kb)"; -"Header" = "Header"; -"Flag the message with:" = "Flag the message with:"; -"Discard the message" = "Discard the message"; -"File the message in:" = "File the message in:"; -"Keep the message" = "Keep the message"; -"Forward the message to:" = "Forward the message to:"; -"Send a reject message:" = "Send a reject message:"; -"Send a vacation message" = "Send a vacation message"; -"Stop processing filter rules" = "Stop processing filter rules"; -"is under" = "is under"; -"is over" = "is over"; + + + + + + + + + + + + + + + + + + + + + + + "is" = "is"; -"is not" = "is not"; -"contains" = "contains"; -"does not contain" = "does not contain"; -"matches" = "matches"; -"does not match" = "does not match"; -"matches regex" = "matches regex"; -"does not match regex" = "does not match regex"; -"Seen" = "Seen"; -"Deleted" = "Deleted"; -"Answered" = "Answered"; -"Flagged" = "Flagged"; -"Junk" = "Junk"; -"Not Junk" = "Not Junk"; -"Label 1" = "Label 1"; -"Label 2" = "Label 2"; -"Label 3" = "Label 3"; -"Label 4" = "Label 4"; -"Label 5" = "Label 5"; + + + + + + + + + + + + + + + + + + "Password must not be empty." = "Le mot de passe ne doit pas être vide."; "The passwords do not match. Please try again." = "Les mots de passe ne sont pas identiques. Essayez de nouveau."; diff --git a/UI/PreferencesUI/Norwegian.lproj/Localizable.strings b/UI/PreferencesUI/Norwegian.lproj/Localizable.strings index cc50e232a..300fff7d0 100644 --- a/UI/PreferencesUI/Norwegian.lproj/Localizable.strings +++ b/UI/PreferencesUI/Norwegian.lproj/Localizable.strings @@ -44,44 +44,45 @@ "default" = "Standard"; -"shortDateFmt_0" = "%d-%b-%y"; -"shortDateFmt_1" = "%d-%m-%y"; -"shortDateFmt_2" = "%d/%m/%y"; -"shortDateFmt_3" = "%e/%m/%y"; -"shortDateFmt_4" = "%d-%m-%Y"; -"shortDateFmt_5" = "%d/%m/%Y"; -"shortDateFmt_6" = "%m-%d-%y"; -"shortDateFmt_7" = "%m/%d/%y"; -"shortDateFmt_8" = "%m/%e/%y"; -"shortDateFmt_9" = "%y-%m-%d"; -"shortDateFmt_10" = "%y/%m/%d"; -"shortDateFmt_11" = "%y.%m.%d"; -"shortDateFmt_12" = "%Y-%m-%d"; -"shortDateFmt_13" = "%Y/%m/%d"; -"shortDateFmt_14" = "%Y.%m.%d"; -"shortDateFmt_15" = ""; + + + + + + + + + + + + + + + + -"longDateFmt_0" = "%A, %B %d, %Y"; -"longDateFmt_1" = "%B %d, %Y"; -"longDateFmt_2" = "%A, %d %B, %Y"; -"longDateFmt_3" = "%d %B, %Y"; -"longDateFmt_4" = ""; -"timeFmt_0" = "%I:%M %p"; -"timeFmt_1" = "%H:%M"; -"timeFmt_2" = ""; + + + + + + + + /* calendar */ "Week begins on :" = "Uken begynner med:"; "Day start time :" = "Dagen begynner kl.:"; "Day end time :" = "Dagen slutter kl.:"; "Day start time must be prior to day end time." = "Dagens starttid må være før dagens sluttid."; + "First week of year :" = "Første uken i året:"; "Enable reminders for Calendar items" = "Aktivere påminnelser for kalenderelementer"; "Play a sound when a reminder comes due" @@ -93,10 +94,10 @@ "firstWeekOfYear_FirstFullWeek" = "Første hele uken i året"; /* Default Calendar */ -"Default calendar :" = "Default calendar"; -"selectedCalendar" = "Selected calendar"; -"personalCalendar" = "Personal calendar"; -"firstCalendar" = "First enabled calendar"; + + + + "reminderTime_0000" = "0 minutter"; "reminderTime_0005" = "5 minutter"; @@ -113,7 +114,7 @@ /* Mailer */ "Show subscribed mailboxes only" = "Vis bare abonnerte postbokser"; -"Sort messages by threads" = "Sort messages by threads"; + "Check for new mail:" = "Hent ny post:"; "messagecheck_manually" = "Manuelt"; "messagecheck_every_minute" = "Hvert minutt"; @@ -134,14 +135,14 @@ "signatureplacement_above" = "over mitt svar"; "signatureplacement_below" = "under mitt svar"; "Compose messages in" = "Opprett melding i"; -"composemessagestype_html" = "HTML"; + "composemessagestype_text" = "Ren text"; /* IMAP Accounts */ "New Mail Account" = "Ny epostkonto"; "Server Name:" = "Servernavn:"; -"Port:" = "Port:"; + "User Name:" = "Brukernavn:"; "Password:" = "Passord:"; diff --git a/UI/PreferencesUI/Swedish.lproj/Localizable.strings b/UI/PreferencesUI/Swedish.lproj/Localizable.strings index 09b2b68ef..730d389dd 100644 --- a/UI/PreferencesUI/Swedish.lproj/Localizable.strings +++ b/UI/PreferencesUI/Swedish.lproj/Localizable.strings @@ -44,44 +44,45 @@ "default" = "Standard"; -"shortDateFmt_0" = "%d-%b-%y"; -"shortDateFmt_1" = "%d-%m-%y"; -"shortDateFmt_2" = "%d/%m/%y"; -"shortDateFmt_3" = "%e/%m/%y"; -"shortDateFmt_4" = "%d-%m-%Y"; -"shortDateFmt_5" = "%d/%m/%Y"; -"shortDateFmt_6" = "%m-%d-%y"; -"shortDateFmt_7" = "%m/%d/%y"; -"shortDateFmt_8" = "%m/%e/%y"; -"shortDateFmt_9" = "%y-%m-%d"; -"shortDateFmt_10" = "%y/%m/%d"; -"shortDateFmt_11" = "%y.%m.%d"; -"shortDateFmt_12" = "%Y-%m-%d"; -"shortDateFmt_13" = "%Y/%m/%d"; -"shortDateFmt_14" = "%Y.%m.%d"; -"shortDateFmt_15" = ""; + + + + + + + + + + + + + + + + -"longDateFmt_0" = "%A, %B %d, %Y"; -"longDateFmt_1" = "%B %d, %Y"; -"longDateFmt_2" = "%A, %d %B, %Y"; -"longDateFmt_3" = "%d %B, %Y"; -"longDateFmt_4" = ""; -"timeFmt_0" = "%I:%M %p"; -"timeFmt_1" = "%H:%M"; -"timeFmt_2" = ""; + + + + + + + + /* calendar */ "Week begins on :" = "Veckan börjar med:"; "Day start time :" = "Dagen börjar kl:"; "Day end time :" = "Dagen slutar kl:"; "Day start time must be prior to day end time." = "Dagens starttid måste vara före dagens sluttid."; + "First week of year :" = "Första veckan på året:"; "Enable reminders for Calendar items" = "Aktivera påminnelser för kalenderposter"; "Play a sound when a reminder comes due" @@ -93,10 +94,10 @@ "firstWeekOfYear_FirstFullWeek" = "Första hela veckan på året"; /* Default Calendar */ -"Default calendar :" = "Default calendar"; -"selectedCalendar" = "Selected calendar"; -"personalCalendar" = "Personal calendar"; -"firstCalendar" = "First enabled calendar"; + + + + "reminderTime_0000" = "0 minuter"; "reminderTime_0005" = "5 minuter"; @@ -113,7 +114,7 @@ /* Mailer */ "Show subscribed mailboxes only" = "Visa endast prenumrerade postlådor"; -"Sort messages by threads" = "Sort messages by threads"; + "Check for new mail:" = "Hämta ny post:"; "messagecheck_manually" = "Manuellt"; "messagecheck_every_minute" = "Varje minut"; @@ -134,7 +135,7 @@ "signatureplacement_above" = "under mitt svar"; "signatureplacement_below" = "under det infogade meddelandet"; "Compose messages in" = "Skriv meddelanden i"; -"composemessagestype_html" = "HTML"; + "composemessagestype_text" = "Oformaterad text"; /* IMAP Accounts */ @@ -143,7 +144,7 @@ "Server Name:" = " Servernamn:"; -"Port:" = "Port:"; + "User Name:" = "Användarnamn:"; "Password:" = "Lösenord:"; diff --git a/UI/PreferencesUI/Ukrainian.lproj/Localizable.strings b/UI/PreferencesUI/Ukrainian.lproj/Localizable.strings index f5442fa85..01ecd85f1 100644 --- a/UI/PreferencesUI/Ukrainian.lproj/Localizable.strings +++ b/UI/PreferencesUI/Ukrainian.lproj/Localizable.strings @@ -17,9 +17,6 @@ "Add" = "Додати"; "Delete" = "Вилучити"; -/* "Cancel" = "Скасувати"; */ -/* "OK" = "Добре"; */ - /* contacts categories */ "contacts_category_labels" = "Робота, Конкуренти, Клієнти, Друзі, Родина, Партнери, Постачальники, Преса, ВІП"; diff --git a/UI/PreferencesUI/Welsh.lproj/Localizable.strings b/UI/PreferencesUI/Welsh.lproj/Localizable.strings index e7d9c1d2b..939da5344 100644 --- a/UI/PreferencesUI/Welsh.lproj/Localizable.strings +++ b/UI/PreferencesUI/Welsh.lproj/Localizable.strings @@ -5,36 +5,34 @@ /* tabs */ "General" = "Cyffredinol"; "Calendar Options" = "Opsiynau Calendr"; -"Contacts Options" = "Contacts Options"; + "Mail Options" = "Opsiynau Ebost"; -"IMAP Accounts" = "IMAP Accounts"; -"Vacation" = "Vacation"; -"Forward" = "Forward"; + + + "Password" = "Cyfrinair"; -"Categories" = "Categories"; -"Name" = "Name"; -"Color" = "Color"; -"Add" = "Add"; -"Delete" = "Delete"; + + + + + /* contacts categories */ -"contacts_category_labels" = "Colleague, Competitor, Customer, Friend, Family, Business Partner, Provider, Press, VIP"; + /* vacation (auto-reply) */ -"Enable vacation auto reply" = "Enable vacation auto reply"; + "Auto reply message :" = "Ymateb Awtomatig unwaith yn unig i pob anfonwr gyda'r testun canlynol :"; -"Email addresses (separated by commas) :" = "Email addresses (separated by commas) :"; -"Add default email addresses" = "Add default email addresses"; -"Days between responses :" = "Days between responses :"; -"Do not send responses to mailing lists" = "Do not send responses to mailing lists"; -"Please specify your message and your email addresses for which you want to enable auto reply." -= "Please specify your message and your email addresses for which you want to enable auto reply."; + + + + + /* forward messages */ -"Forward incoming messages" = "Forward incoming messages"; -"Keep a copy" = "Keep a copy"; -"Please specify an address to which you want to forward your messages." -= "Please specify an address to which you want to forward your messages."; + + + /* d & t */ "Current Time Zone :" = "Amser Cyfredol :"; @@ -42,46 +40,47 @@ "Long Date Format :" = "Dyddiad fformat hir :"; "Time Format :" = "Fformat amser :"; -"default" = "Default"; -"shortDateFmt_0" = "%d-%b-%y"; -"shortDateFmt_1" = "%d-%m-%y"; -"shortDateFmt_2" = "%d/%m/%y"; -"shortDateFmt_3" = "%e/%m/%y"; -"shortDateFmt_4" = "%d-%m-%Y"; -"shortDateFmt_5" = "%d/%m/%Y"; -"shortDateFmt_6" = "%m-%d-%y"; -"shortDateFmt_7" = "%m/%d/%y"; -"shortDateFmt_8" = "%m/%e/%y"; -"shortDateFmt_9" = "%y-%m-%d"; -"shortDateFmt_10" = "%y/%m/%d"; -"shortDateFmt_11" = "%y.%m.%d"; -"shortDateFmt_12" = "%Y-%m-%d"; -"shortDateFmt_13" = "%Y/%m/%d"; -"shortDateFmt_14" = "%Y.%m.%d"; -"shortDateFmt_15" = ""; + + + + + + + + + + + + + + + + + -"longDateFmt_0" = "%A, %B %d, %Y"; -"longDateFmt_1" = "%B %d, %Y"; -"longDateFmt_2" = "%A, %d %B, %Y"; -"longDateFmt_3" = "%d %B, %Y"; -"longDateFmt_4" = ""; -"timeFmt_0" = "%I:%M %p"; -"timeFmt_1" = "%H:%M"; -"timeFmt_2" = ""; + + + + + + + + /* calendar */ "Week begins on :" = "wythnos yn dechrau :"; "Day start time :" = "Amser dechrau'r diwrnod :"; "Day end time :" = "Amser diwedd y dydd :"; -"Day start time must be prior to day end time." = "Day start time must be prior to day end time."; + + "First week of year :" = "Wythnos cyntaf y flwyddyn :"; "Enable reminders for Calendar items" = "Galluogu atgoffa ar gyfer eitemau calendr"; "Play a sound when a reminder comes due" @@ -89,14 +88,14 @@ "Default reminder :" = "Atgoffa gwreiddiol :"; "firstWeekOfYear_January1" = "Dechrau ar Ionawr 1"; -"firstWeekOfYear_First4DayWeek" = "First 4-day week"; + "firstWeekOfYear_FirstFullWeek" = "Wythnos cyntaf llawn"; /* Default Calendar */ -"Default calendar :" = "Default calendar"; -"selectedCalendar" = "Selected calendar"; -"personalCalendar" = "Personal calendar"; -"firstCalendar" = "First enabled calendar"; + + + + "reminderTime_0000" = "0 munud"; "reminderTime_0005" = "5 munud"; @@ -112,8 +111,8 @@ "reminderTime_4800" = "2 ddiwrnod"; /* Mailer */ -"Show subscribed mailboxes only" = "Show subscribed mailboxes only"; -"Sort messages by threads" = "Sort messages by threads"; + + "Check for new mail:" = "Chwilio am ebost newydd:"; "messagecheck_manually" = "Corfforol"; "messagecheck_every_minute" = "Pob munud"; @@ -133,44 +132,44 @@ "And place my signature" = "A rhowch fy llofnod"; "signatureplacement_above" = "o dan fy ymateb"; "signatureplacement_below" = "o dan y dyfynnod"; -"Compose messages in" = "Compose messages in"; -"composemessagestype_html" = "HTML"; -"composemessagestype_text" = "Plain text"; + + + /* IMAP Accounts */ -"New Mail Account" = "New Mail Account"; -"Server Name:" = "Server Name:"; -"Port:" = "Port:"; -"User Name:" = "User Name:"; + + + + "Password:" = "Cyfrinair:"; -"Full Name:" = "Full Name:"; -"Email:" = "Email:"; + + "Signature:" = "Llofnod:"; -"(Click to create)" = "(Click to create)"; + "Signature" = "Llofnod"; -"Please enter your signature below:" = "Please enter your signature below:"; + /* Additional Parameters */ -"Additional Parameters" = "Additional Parameters"; + /* password */ -"New password:" = "New password:"; -"Confirmation:" = "Confirmation:"; -"Change" = "Change"; + + + /* Event+task categories */ "category_none" = "Dim"; "calendar_category_labels" = "Amrywiol,Anrhegion,Busnes,Canlyniadau,Clientau,Cwsmer,Cyflenwyr,Cystadleuaeth,Dilyn lan,Ffefrynnau,Galwadau,Gwyliau,Meeting,Gwyliau Cyhoeddus,Penblwydd,Personol,Projectau,Statws,Syniadau,Teithio"; /* Default module */ -"Calendar" = "Calendar"; -"Contacts" = "Address Book"; -"Mail" = "Mail"; -"Last" = "Last used"; -"Default module :" = "Default module :"; + + + + + "Language :" = "Iaith :"; "choose" = "Dewis ..."; @@ -191,81 +190,81 @@ "Welsh" = "Cymraeg"; /* Return receipts */ -"When I receive a request for a return receipt:" = "When I receive a request for a return receipt:"; -"Never send a return receipt" = "Never send a return receipt"; -"Allow return receipts for some messages" = "Allow return receipts for some messages"; -"If I'm not in the To or Cc of the message:" = "If I'm not in the To or Cc of the message:"; -"If the sender is outside my domain:" = "If the sender is outside my domain:"; -"In all other cases:" = "In all other cases:"; -"Never send" = "Never send"; -"Always send" = "Always send"; -"Ask me" = "Ask me"; + + + + + + + + + /* Return receipts */ -"When I receive a request for a return receipt:" = "When I receive a request for a return receipt:"; -"Never send a return receipt" = "Never send a return receipt"; -"Allow return receipts for some messages" = "Allow return receipts for some messages"; -"If I'm not in the To or Cc of the message:" = "If I'm not in the To or Cc of the message:"; -"If the sender is outside my domain:" = "If the sender is outside my domain:"; -"In all other cases:" = "In all other cases:"; -"Never send" = "Never send"; -"Always send" = "Always send"; -"Ask me" = "Ask me"; + + + + + + + + + /* Filters - UIxPreferences */ -"Filters" = "Filters"; -"Active" = "Active"; -"Move Up" = "Move Up"; -"Move Down" = "Move Down"; + + + + /* Filters - UIxFilterEditor */ -"Filter name:" = "Filter name:"; -"For incoming messages that" = "For incoming messages that"; -"match all of the following rules:" = "match all of the following rules:"; -"match any of the following rules:" = "match any of the following rules:"; -"match all messages" = "match all messages"; -"Perform these actions:" = "Perform these actions:"; -"Subject" = "Subject"; -"From" = "From"; -"To" = "To"; -"Cc" = "Cc"; -"To or Cc" = "To or Cc"; -"Size (Kb)" = "Size (Kb)"; -"Header" = "Header"; -"Flag the message with:" = "Flag the message with:"; -"Discard the message" = "Discard the message"; -"File the message in:" = "File the message in:"; -"Keep the message" = "Keep the message"; -"Forward the message to:" = "Forward the message to:"; -"Send a reject message:" = "Send a reject message:"; -"Send a vacation message" = "Send a vacation message"; -"Stop processing filter rules" = "Stop processing filter rules"; -"is under" = "is under"; -"is over" = "is over"; + + + + + + + + + + + + + + + + + + + + + + + "is" = "is"; -"is not" = "is not"; -"contains" = "contains"; -"does not contain" = "does not contain"; -"matches" = "matches"; -"does not match" = "does not match"; -"matches regex" = "matches regex"; -"does not match regex" = "does not match regex"; -"Seen" = "Seen"; -"Deleted" = "Deleted"; -"Answered" = "Answered"; -"Flagged" = "Flagged"; -"Junk" = "Junk"; -"Not Junk" = "Not Junk"; -"Label 1" = "Label 1"; -"Label 2" = "Label 2"; -"Label 3" = "Label 3"; -"Label 4" = "Label 4"; -"Label 5" = "Label 5"; + + + + + + + + + + + + + + + + + + "Password must not be empty." = "Le mot de passe ne doit pas être vide."; "The passwords do not match. Please try again." = "Les mots de passe ne sont pas identiques. Essayez de nouveau."; @@ -279,5 +278,4 @@ "Unhandled error response" = "Erreur inconnue"; "Password change is not supported." = "Changement de mot de passe non-supporté."; "Unhandled HTTP error code: %{0}" = "Code HTTP non-géré: %{0}"; -"New password:" = "New password:"; -"Confirmation:" = "Confirmation:"; \ No newline at end of file + diff --git a/UI/Scheduler/BrazilianPortuguese.lproj/Localizable.strings b/UI/Scheduler/BrazilianPortuguese.lproj/Localizable.strings index da5008e3f..d958ec403 100644 --- a/UI/Scheduler/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/Scheduler/BrazilianPortuguese.lproj/Localizable.strings @@ -10,7 +10,7 @@ "Switch to day view" = "Visualizar Dia"; "Switch to week view" = "Visualizar Semana"; "Switch to month view" = "Visualizar Mês"; -"Reload all calendars" = "Reload all calendars"; + /* Tabs */ "Date" = "Data"; @@ -41,13 +41,13 @@ "a2_Wednesday" = "Qu"; "a2_Thursday" = "Qu"; "a2_Friday" = "Se"; -"a2_Saturday" = "Sa"; -"dayLabelFormat" = "%m/%d/%Y"; + + "today" = "Hoje"; -"Previous Day" = "Previous Day"; -"Next Day" = "Next Day"; + + /* Week */ @@ -56,8 +56,8 @@ "Week %d" = "Semana %d"; -"Previous Week" = "Previous Week"; -"Next Week" = "Next Week"; + + /* Month */ @@ -89,8 +89,8 @@ "a3_November" = "Novembro"; "a3_December" = "Dezembro"; -"Previous Month" = "Previous Month"; -"Next Month" = "Next Month"; + + /* Year */ @@ -103,20 +103,20 @@ "New Calendar..." = "Novo Calendário..."; "Delete Calendar" = "Apagar Calendário"; -"Unsubscribe Calendar" = "Unsubscribe Calendar"; + "Sharing..." = "Compartilhamento..."; "Export Calendar..." = "Exportar Calendário..."; -"Import Events..." = "Import Events..."; -"Import Events" = "Import Events"; -"Select an iCalendar file (.ics)." = "Select an iCalendar file (.ics)."; -"Upload" = "Upload"; + + + + "Publish Calendar..." = "Publicar Calendário..."; "Reload Remote Calendars" = "Recarregar Calendários Remotos"; "Properties" = "Propriedades"; -"Done" = "Done"; -"An error occured while importing calendar." = "An error occured while importing calendar."; -"No event was imported." = "No event was imported."; -"A total of %{0} events were imported in the calendar." = "A total of %{0} events were imported in the calendar."; + + + + "Compose E-Mail to All Attendees" = "Compor E-Mail para Todos os Participantes"; "Compose E-Mail to Undecided Attendees" = "Compor E-Mail para os Participantes não confirmados"; @@ -126,15 +126,15 @@ /* Misc */ -"OpenGroupware.org" = "OpenGroupware.org"; + "Forbidden" = "Proibido"; /* acls */ "User rights for:" = "Direitos de:"; -"Any Authenticated User" = "Any Authenticated User"; -"Public Access" = "Public Access"; + + "label_Public" = "Público"; "label_Private" = "Privado"; @@ -186,7 +186,7 @@ "No appointments found" = "Apontamentos não encontrados"; "Meetings proposed by you" = "Reuniões propostas por você"; "Meetings proposed to you" = "Reuniões propostas para você"; -"sched_startDateFormat" = "%d/%m %H:%M"; + "action" = "Ação"; "accept" = "Aceitar"; "decline" = "Declinar"; @@ -207,8 +207,8 @@ "Title:" = "Título:"; "Calendar:" = "Calendário:"; "Name" = "Nome"; -"Email" = "Email"; -"Status:" = "Status:"; + + "% complete" = "% completado"; "Location:" = "Localização:"; "Priority:" = "Prioridade:"; @@ -226,14 +226,14 @@ "Category:" = "Categoria:"; "Repeat:" = "Repetir:"; "Reminder:" = "Lembrete:"; -"General:" = "General:"; -"Reply:" = "Reply:"; -"Target:" = "Target:"; + + + "attributes" = "atributos"; "attendees" = "participantes"; -"delegated from" = "delegated from"; + /* checkbox title */ "is private" = "é privado"; @@ -296,12 +296,12 @@ /* Priorities */ -"prio_0" = "Not specified"; + "prio_1" = "Alta 3"; "prio_2" = "Alta 2"; "prio_3" = "Alta 1"; "prio_4" = "Alta"; -"prio_5" = "Normal"; + "prio_6" = "Baixa"; "prio_7" = "Baixa 1"; "prio_8" = "Baixa 2"; @@ -404,19 +404,19 @@ "reminder_AFTER" = "depois"; "reminder_START" = "inicio do evento"; "reminder_END" = "fim do evento"; -"Reminder Details" = "Reminder Details"; -"Choose a Reminder Action" = "Choose a Reminder Action"; -"Show an Alert" = "Show an Alert"; -"Send an E-mail" = "Send an E-mail"; -"Email Organizer" = "Email Organizer"; -"Email Attendees" = "Email Attendees"; -"zoom_400" = "400%"; -"zoom_200" = "200%"; -"zoom_100" = "100%"; -"zoom_50" = "50%"; -"zoom_25" = "25%"; + + + + + + + + + + + /* transparency */ @@ -446,7 +446,7 @@ validate_endbeforestart = "A data que você informou ocorre antes da data ini "Day View" = "Visualizar Dia"; "Week View" = "Visualizar Mês"; "Month View" = "Visualizar Mês"; -"Reload" = "Reload"; + "eventPartStatModificationError" = "Seu status de participação não pode ser modificado."; @@ -485,18 +485,17 @@ validate_endbeforestart = "A data que você informou ocorre antes da data ini /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "Sugerir espaço de tempo:"; -"Zoom:" = "Zoom:"; + "Previous slot" = "Espaço anterior"; "Next slot" = "Próximo espaço"; "Previous hour" = "Hora anterior"; "Next hour" = "Próxima hora"; -"Work days only" = "Work days only"; -"The whole day" = "The whole day"; -"Between" = "Between"; + + + "and" = "and"; -"A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" -= "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?"; + /* apt list */ "Title" = "Título"; @@ -528,45 +527,45 @@ vtodo_class2 = "(Tarefa Confidencial)"; "Include in free-busy" = "Incluir na disponibilidade"; -"Synchronization" = "Synchronization"; -"Synchronize" = "Synchronize"; + + "Tag:" = "Marca:"; -"Display" = "Display"; -"Show alarms" = "Show alarms"; -"Show tasks" = "Show tasks"; -"Links to this Calendar" = "Links to this Calendar"; -"Authenticated User Access" = "Authenticated User Access"; + + + + + "CalDAV URL" = "CalDAV url"; -"WebDAV ICS URL" = "WebDAV ICS URL"; -"WebDAV XML URL" = "WebDAV XML URL"; + + /* Error messages */ -"dayFieldInvalid" = "Please specify a numerical value in the Days field greater or equal to 1."; -"weekFieldInvalid" = "Please specify a numerical value in the Week(s) field greater or equal to 1."; -"monthFieldInvalid" = "Please specify a numerical value in the Month(s) field greater or equal to 1."; -"monthDayFieldInvalid" = "Please specify a numerical value in the month day field greater or equal to 1."; -"yearFieldInvalid" = "Please specify a numerical value in the Year(s) field greater or equal to 1."; -"appointmentFieldInvalid" = "Please specify a numerical value in the Appointment(s) field greater or equal to 1."; -"recurrenceUnsupported" = "This type of recurrence is currently unsupported."; -"Please specify a calendar name." = "Please specify a calendar name."; -"tagNotDefined" = "You must specify a tag if you want to synchronize this calendar."; -"tagAlreadyExists" = "The tag you specified is already associated to another calendar."; -"tagHasChanged" = "If you change your calendar's tag, you'll need to reload the data on your mobile device.\nContinue?"; -"tagWasAdded" = "If you want to synchronize this calendar, you'll need to reload the data on your mobile device.\nContinue?"; -"tagWasRemoved" = "If you remove this calendar from synchronization, you'll need to reload the data on your mobile device.\nContinue?"; -"DestinationCalendarError" = "The source and destination calendars are the same. Please try to copy to a different calendar."; -"EventCopyError" = "The copy failed. Please try to copy to a difference calendar."; -"Open Task..." = "Open Task..."; -"Mark Completed" = "Mark Completed"; -"Delete Task" = "Delete Task"; -"Delete Event" = "Delete Event"; -"Copy event to my calendar" = "Copy event to my calendar"; -"Subscribe to a web calendar..." = "Subscribe to a web calendar..."; -"URL of the Calendar" = "URL of the Calendar"; -"Web Calendar" = "Web Calendar"; -"Reload on login" = "Reload on login"; -"Invalid number." = "Invalid number."; + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UI/Scheduler/Czech.lproj/Localizable.strings b/UI/Scheduler/Czech.lproj/Localizable.strings index e2ebdd3ff..0cc6231c5 100644 --- a/UI/Scheduler/Czech.lproj/Localizable.strings +++ b/UI/Scheduler/Czech.lproj/Localizable.strings @@ -103,7 +103,7 @@ "New Calendar..." = "Nový kalendář..."; "Delete Calendar" = "Smazat kalendář"; -"Unsubscribe Calendar" = "Unsubscribe Calendar"; + "Sharing..." = "Sdílení..."; "Export Calendar..." = "Exportovat kalendář..."; "Import Events..." = "Importovat události..."; @@ -126,7 +126,7 @@ /* Misc */ -"OpenGroupware.org" = "OpenGroupware.org"; + "Forbidden" = "Zakázaná"; /* acls */ @@ -186,7 +186,7 @@ "No appointments found" = "Nenalezeny žádné schůzky"; "Meetings proposed by you" = "Schůzky navržené Vámi"; "Meetings proposed to you" = "Schůzky navržené Vám"; -"sched_startDateFormat" = "%d/%m %H:%M"; + "action" = "Akce"; "accept" = "Přijmout"; "decline" = "Odmítnout"; @@ -208,7 +208,7 @@ "Calendar:" = "Kalendář:"; "Name" = "Jméno"; "Email" = "E-Mail"; -"Status:" = "Status:"; + "% complete" = "% hotovo"; "Location:" = "Místo:"; "Priority:" = "Priorita:"; @@ -352,10 +352,10 @@ "Week(s)" = "Týdnů"; "On" = "V"; "Month(s)" = "Měsíců"; -"The" = "The"; + "Recur on day(s)" = "Opakovat ve dnech"; "Year(s)" = "rocích"; -"cycle_of" = "of"; + "No end date" = "Bez data konce"; "Create" = "Vytvořit"; "appointment(s)" = "schůzku/y"; @@ -412,11 +412,11 @@ "Email Organizer" = "E-mail organizátorovi"; "Email Attendees" = "E-mail účastníkům"; -"zoom_400" = "400%"; -"zoom_200" = "200%"; -"zoom_100" = "100%"; -"zoom_50" = "50%"; -"zoom_25" = "25%"; + + + + + /* transparency */ @@ -539,8 +539,8 @@ vtodo_class2 = "(Důvěrný úkol)"; "Links to this Calendar" = "Odkazy na tento kalendář"; "Authenticated User Access" = "Přístup pro ověřené uživatele"; "CalDAV URL" = "CalDAV url"; -"WebDAV ICS URL" = "WebDAV ICS URL"; -"WebDAV XML URL" = "WebDAV XML URL"; + + /* Error messages */ "dayFieldInvalid" = "V políčku Dny zadejte číselnou hodnotu větší nebo rovnu 1."; @@ -550,23 +550,23 @@ vtodo_class2 = "(Důvěrný úkol)"; "yearFieldInvalid" = "V políčku Rok zadejte číselnou hodnotu větší nebo rovnu 1."; "appointmentFieldInvalid" = "V políčku Připomenutí zadejte číselnou hodnotu větší nebo rovnu 1."; "recurrenceUnsupported" = "Tento typ opakování není podporován."; -"Please specify a calendar name." = "Please specify a calendar name."; + "tagNotDefined" = "Chcete-li synchronizovat tento kalendář, musíte zadat jeho Štítek."; "tagAlreadyExists" = "Zadaný štítek je již přiřazen jinému kalendáři."; "tagHasChanged" = "Změníte-li štítek svého kalendáře, budete muset znovu načíst data do svého mobilního zařízení.\nPokračovat?"; "tagWasAdded" = "Chcete-li synchronizovat tento kalendář, budete muset znovu načíst data do svého mobilního zařízení.\nPokračovat?"; "tagWasRemoved" = "Odstraníte-li u tohoto kalendáře synchronizaci, budete muset znovu načíst data do svého mobilního zařízení.\nPokračovat?"; -"DestinationCalendarError" = "The source and destination calendars are the same. Please try to copy to a different calendar."; -"EventCopyError" = "The copy failed. Please try to copy to a difference calendar."; + + "Open Task..." = "Otevřít úkol..."; "Mark Completed" = "Označit jako dokončené"; "Delete Task" = "Smazat úkol"; "Delete Event" = "Smazat událost"; -"Copy event to my calendar" = "Copy event to my calendar"; + "Subscribe to a web calendar..." = "Odebírat vzdálený kalendář na webu"; "URL of the Calendar" = "Adresa vzdáleného kalendáře na webu"; "Web Calendar" = "Vzdálený kalendář na webu"; "Reload on login" = "Aktualizovat při přihlášení"; -"Invalid number." = "Invalid number."; + diff --git a/UI/Scheduler/Dutch.lproj/Localizable.strings b/UI/Scheduler/Dutch.lproj/Localizable.strings index 6dfa8dd6a..e826d1f2c 100644 --- a/UI/Scheduler/Dutch.lproj/Localizable.strings +++ b/UI/Scheduler/Dutch.lproj/Localizable.strings @@ -2,15 +2,15 @@ /* Tooltips */ -"Create a new event" = "Create a new event"; -"Create a new task" = "Create a new task"; -"Edit this event or task" = "Edit this event or task"; -"Delete this event or task" = "Delete this event or task"; + + + + "Go to today" = "Naar vandaag gaan"; -"Switch to day view" = "Switch to day view"; -"Switch to week view" = "Switch to week view"; -"Switch to month view" = "Switch to month view"; -"Reload all calendars" = "Reload all calendars"; + + + + /* Tabs */ "Date" = "Datum"; @@ -51,10 +51,10 @@ /* Week */ -"Week" = "Week"; + "this week" = "deze week"; -"Week %d" = "Week %d"; + "Previous Week" = "Vorige week"; "Next Week" = "Volgende week"; @@ -66,15 +66,15 @@ "January" = "Januari"; "February" = "Februari"; "March" = "Maart"; -"April" = "April"; + "May" = "Mei"; "June" = "Juni"; "July" = "Juli"; "August" = "Augustus"; -"September" = "September"; + "October" = "Oktober"; -"November" = "November"; -"December" = "December"; + + "a3_January" = "Jan"; "a3_February" = "Feb"; @@ -103,20 +103,20 @@ "New Calendar..." = "Nieuwe agenda..."; "Delete Calendar" = "Agenda verwijderen"; -"Unsubscribe Calendar" = "Unsubscribe Calendar"; + "Sharing..." = "Delen..."; "Export Calendar..." = "Agenda exporteren..."; -"Import Events..." = "Import Events..."; -"Import Events" = "Import Events"; -"Select an iCalendar file (.ics)." = "Select an iCalendar file (.ics)."; -"Upload" = "Upload"; + + + + "Publish Calendar..." = "Agenda publiceren..."; "Reload Remote Calendars" = "Externe agenda vernieuwen"; "Properties" = "Instellingen"; -"Done" = "Done"; -"An error occured while importing calendar." = "An error occured while importing calendar."; -"No event was imported." = "No event was imported."; -"A total of %{0} events were imported in the calendar." = "A total of %{0} events were imported in the calendar."; + + + + "Compose E-Mail to All Attendees" = "E-mail aan alle deelnemers opstellen"; "Compose E-Mail to Undecided Attendees" = "E-mail aan deelnemers opstellen die nog niet hebben gereageerd"; @@ -126,15 +126,15 @@ /* Misc */ -"OpenGroupware.org" = "OpenGroupware.org"; + "Forbidden" = "Toegang geweigerd"; /* acls */ "User rights for:" = "Machtigingen voor:"; -"Any Authenticated User" = "Any Authenticated User"; -"Public Access" = "Public Access"; + + "label_Public" = "Publiek"; "label_Private" = "Privaat"; @@ -186,7 +186,7 @@ "No appointments found" = "Geen afspraken gevonden"; "Meetings proposed by you" = "Door u voorgestelde vergaderingen"; "Meetings proposed to you" = "Aan u voorgestelde vergaderingen"; -"sched_startDateFormat" = "%d/%m %H:%M"; + "action" = "Actie"; "accept" = "Accepteren"; "decline" = "Weigeren"; @@ -208,32 +208,32 @@ "Calendar:" = "Agenda:"; "Name" = "Naam"; "Email" = "E-mail"; -"Status:" = "Status:"; + "% complete" = "% voltooid"; "Location:" = "Plaats:"; "Priority:" = "Prioriteit"; -"Privacy" = "Privacy"; + "Cycle" = "Herhalen"; "Cycle End" = "Einde herhaling"; "Categories" = "Categoriën"; "Classification" = "Classificatie"; "Duration" = "Duur"; "Attendees:" = "Deelnemers:"; -"Resources" = "Resources"; + "Organizer:" = "Organisator:"; "Description:" = "Omschrijving:"; -"Document:" = "Document:"; + "Category:" = "Categorie:"; "Repeat:" = "Herhalen:"; "Reminder:" = "Alarm:"; -"General:" = "General:"; -"Reply:" = "Reply:"; + + "Target:" = "Bestemming:"; "attributes" = "attributen"; "attendees" = "deelnemers"; -"delegated from" = "delegated from"; + /* checkbox title */ "is private" = "is privé"; @@ -285,7 +285,7 @@ "Browse URL" = "Naar URL gaan"; -"newAttendee" = "Add attendee"; + /* calendar modes */ @@ -397,26 +397,26 @@ "reminder_1_WEEK_BEFORE" = "1 week van tevoren"; "reminder_CUSTOM" = "aangepast..."; -"reminder_MINUTES" = "minutes"; -"reminder_HOURS" = "hours"; -"reminder_DAYS" = "days"; -"reminder_BEFORE" = "before"; -"reminder_AFTER" = "after"; -"reminder_START" = "the event starts"; -"reminder_END" = "the event ends"; -"Reminder Details" = "Reminder Details"; -"Choose a Reminder Action" = "Choose a Reminder Action"; -"Show an Alert" = "Show an Alert"; -"Send an E-mail" = "Send an E-mail"; -"Email Organizer" = "Email Organizer"; -"Email Attendees" = "Email Attendees"; -"zoom_400" = "400%"; -"zoom_200" = "200%"; -"zoom_100" = "100%"; -"zoom_50" = "50%"; -"zoom_25" = "25%"; + + + + + + + + + + + + + + + + + + /* transparency */ @@ -446,7 +446,7 @@ validate_endbeforestart = "Het begin vindt plaats vóór het einde."; "Day View" = "Dagoverzicht"; "Week View" = "Weekoverzicht"; "Month View" = "Maandoverzicht"; -"Reload" = "Reload"; + "eventPartStatModificationError" = "Uw participatiestatus kon niet worden gewijzigd."; @@ -470,7 +470,7 @@ validate_endbeforestart = "Het begin vindt plaats vóór het einde."; /* Legend */ "Participant" = "Deelnemer"; "Optional Participant" = "Gewenste deelnemer"; -"Non Participant" = "Non Participant"; + "Chair" = "Voorzitter"; "Needs action" = "Actie vereist"; @@ -485,18 +485,17 @@ validate_endbeforestart = "Het begin vindt plaats vóór het einde."; /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "Tijdzone:"; -"Zoom:" = "Zoom:"; + "Previous slot" = "Vorige"; "Next slot" = "Volgende"; "Previous hour" = "Vorig uur"; "Next hour" = "Volgend uur"; "Work days only" = "Slechts werkdagen"; "The whole day" = "De hele dag"; -"Between" = "Between"; + "and" = "en"; -"A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" -= "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?"; + /* apt list */ "Title" = "Titel"; @@ -528,45 +527,45 @@ vtodo_class2 = "(Vertrouwelijke taak)"; "Include in free-busy" = "In de beschikbaarheid insluiten"; -"Synchronization" = "Synchronization"; -"Synchronize" = "Synchronize"; + + "Tag:" = "Markering:"; -"Display" = "Display"; -"Show alarms" = "Show alarms"; -"Show tasks" = "Show tasks"; -"Links to this Calendar" = "Links to this Calendar"; -"Authenticated User Access" = "Authenticated User Access"; + + + + + "CalDAV URL" = "CalDAV url"; -"WebDAV ICS URL" = "WebDAV ICS URL"; -"WebDAV XML URL" = "WebDAV XML URL"; + + /* Error messages */ -"dayFieldInvalid" = "Please specify a numerical value in the Days field greater or equal to 1."; -"weekFieldInvalid" = "Please specify a numerical value in the Week(s) field greater or equal to 1."; -"monthFieldInvalid" = "Please specify a numerical value in the Month(s) field greater or equal to 1."; -"monthDayFieldInvalid" = "Please specify a numerical value in the month day field greater or equal to 1."; -"yearFieldInvalid" = "Please specify a numerical value in the Year(s) field greater or equal to 1."; -"appointmentFieldInvalid" = "Please specify a numerical value in the Appointment(s) field greater or equal to 1."; -"recurrenceUnsupported" = "This type of recurrence is currently unsupported."; -"Please specify a calendar name." = "Please specify a calendar name."; -"tagNotDefined" = "You must specify a tag if you want to synchronize this calendar."; -"tagAlreadyExists" = "The tag you specified is already associated to another calendar."; -"tagHasChanged" = "If you change your calendar's tag, you'll need to reload the data on your mobile device.\nContinue?"; -"tagWasAdded" = "If you want to synchronize this calendar, you'll need to reload the data on your mobile device.\nContinue?"; -"tagWasRemoved" = "If you remove this calendar from synchronization, you'll need to reload the data on your mobile device.\nContinue?"; -"DestinationCalendarError" = "The source and destination calendars are the same. Please try to copy to a different calendar."; -"EventCopyError" = "The copy failed. Please try to copy to a difference calendar."; + + + + + + + + + + + + + + + "Open Task..." = "Taak openen..."; -"Mark Completed" = "Mark Completed"; + "Delete Task" = "Taak verwijderen"; "Delete Event" = "Afspraak verwijderen"; -"Copy event to my calendar" = "Copy event to my calendar"; -"Subscribe to a web calendar..." = "Subscribe to a web calendar..."; -"URL of the Calendar" = "URL of the Calendar"; -"Web Calendar" = "Web Calendar"; -"Reload on login" = "Reload on login"; -"Invalid number." = "Invalid number."; + + + + + + diff --git a/UI/Scheduler/French.lproj/Localizable.strings b/UI/Scheduler/French.lproj/Localizable.strings index 16dc38f90..916334457 100644 --- a/UI/Scheduler/French.lproj/Localizable.strings +++ b/UI/Scheduler/French.lproj/Localizable.strings @@ -13,7 +13,7 @@ "Reload all calendars" = "Actualiser tous les agendas"; /* Tabs */ -"Date" = "Date"; + "Calendars" = "Agendas"; /* Day */ @@ -41,7 +41,7 @@ "a2_Wednesday" = "Me"; "a2_Thursday" = "Je"; "a2_Friday" = "Ve"; -"a2_Saturday" = "Sa"; + "dayLabelFormat" = "%d/%m/%Y"; "today" = "Aujourd'hui"; @@ -99,7 +99,7 @@ /* Menu */ "Calendar" = "Agenda"; -"Contacts" = "Contacts"; + "New Calendar..." = "Nouvel agenda..."; "Delete Calendar" = "Effacer l'agenda..."; @@ -126,7 +126,7 @@ /* Misc */ -"OpenGroupware.org" = "OpenGroupware.org"; + "Forbidden" = "Accès non autorisée"; /* acls */ @@ -136,7 +136,7 @@ "Any Authenticated User" = "Tout utilisateur identifié"; "Public Access" = "Accès public"; -"label_Public" = "Public"; + "label_Private" = "Privé"; "label_Confidential" = "Confidentiel"; @@ -186,8 +186,8 @@ "No appointments found" = "Aucun rendez-vous"; "Meetings proposed by you" = "Rendez-vous que vous proposez"; "Meetings proposed to you" = "Rendez-vous qui vous sont proposés"; -"sched_startDateFormat" = "%d/%m %H:%M"; -"action" = "Action"; + + "accept" = "Accepter"; "decline" = "Refuser"; "more attendees" = "Autres participants"; @@ -207,7 +207,7 @@ "Title:" = "Titre :"; "Calendar:" = "Agenda :"; "Name" = "Nom"; -"Email" = "Email"; + "Status:" = "Statut :"; "% complete" = "% d'achèvement"; "Location:" = "Lieu :"; @@ -215,8 +215,8 @@ "Privacy" = "Confidentialité"; "Cycle" = "Récurrence"; "Cycle End" = "s'arreter"; -"Categories" = "Categories"; -"Classification" = "Classification"; + + "Duration" = "Durée"; "Attendees:" = "Participants :"; "Resources" = "Ressources"; @@ -238,7 +238,7 @@ /* checkbox title */ "is private" = "Rendez-vous privé"; /* classification */ -"Public" = "Public"; + "Private" = "Privé"; /* text used in overviews and tooltips */ "empty title" = "Titre vide"; @@ -397,7 +397,7 @@ "reminder_1_WEEK_BEFORE" = "1 semaine avant"; "reminder_CUSTOM" = "Personnaliser..."; -"reminder_MINUTES" = "minutes"; + "reminder_HOURS" = "heures"; "reminder_DAYS" = "jours"; "reminder_BEFORE" = "avant"; @@ -412,11 +412,11 @@ "Email Organizer" = "À l'organisateur"; "Email Attendees" = "Aux invités"; -"zoom_400" = "400%"; -"zoom_200" = "200%"; -"zoom_100" = "100%"; -"zoom_50" = "50%"; -"zoom_25" = "25%"; + + + + + /* transparency */ @@ -485,7 +485,7 @@ validate_endbeforestart = "La date de fin est avant la date de début."; /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "Suggérer un créneau horaire :"; -"Zoom:" = "Zoom:"; + "Previous slot" = "Précédent"; "Next slot" = "Prochain"; "Previous hour" = "Heure précédente"; diff --git a/UI/Scheduler/Hungarian.lproj/Localizable.strings b/UI/Scheduler/Hungarian.lproj/Localizable.strings index d8b2fd59b..d7f4667e0 100644 --- a/UI/Scheduler/Hungarian.lproj/Localizable.strings +++ b/UI/Scheduler/Hungarian.lproj/Localizable.strings @@ -10,7 +10,7 @@ "Switch to day view" = "Napi nézetre váltás"; "Switch to week view" = "Heti nézetre váltás"; "Switch to month view" = "Havi nézetre váltás"; -"Reload all calendars" = "Reload all calendars"; + /* Tabs */ "Date" = "Dátum"; @@ -46,8 +46,8 @@ "dayLabelFormat" = "%Y.%m.%d"; "today" = "Ma"; -"Previous Day" = "Previous Day"; -"Next Day" = "Next Day"; + + /* Week */ @@ -56,8 +56,8 @@ "Week %d" = "%d. hét"; -"Previous Week" = "Previous Week"; -"Next Week" = "Next Week"; + + /* Month */ @@ -73,8 +73,8 @@ "August" = "Augusztus"; "September" = "Szeptember"; "October" = "Október"; -"November" = "November"; -"December" = "December"; + + "a3_January" = "Január"; "a3_February" = "Február"; @@ -86,11 +86,11 @@ "a3_August" = "Augusztus"; "a3_September" = "Szeptember"; "a3_October" = "Október"; -"a3_November" = "November"; -"a3_December" = "December"; -"Previous Month" = "Previous Month"; -"Next Month" = "Next Month"; + + + + /* Year */ @@ -103,20 +103,20 @@ "New Calendar..." = "Új naptár..."; "Delete Calendar" = "Naptár törlése"; -"Unsubscribe Calendar" = "Unsubscribe Calendar"; + "Sharing..." = "Megosztás..."; "Export Calendar..." = "Naptár exportálása..."; -"Import Events..." = "Import Events..."; -"Import Events" = "Import Events"; -"Select an iCalendar file (.ics)." = "Select an iCalendar file (.ics)."; -"Upload" = "Upload"; + + + + "Publish Calendar..." = "Naptár közzététele..."; "Reload Remote Calendars" = "Távoli naptárak frissítése"; "Properties" = "Tulajdonságok"; -"Done" = "Done"; -"An error occured while importing calendar." = "An error occured while importing calendar."; -"No event was imported." = "No event was imported."; -"A total of %{0} events were imported in the calendar." = "A total of %{0} events were imported in the calendar."; + + + + "Compose E-Mail to All Attendees" = "Üzenet küldése az összes résztvevőnek"; "Compose E-Mail to Undecided Attendees" = "Üzenet küldése az bizonytalan résztvevőnek"; @@ -126,15 +126,15 @@ /* Misc */ -"OpenGroupware.org" = "OpenGroupware.org"; + "Forbidden" = "Tiltott"; /* acls */ "User rights for:" = "Felhasználói jogosultságok:"; -"Any Authenticated User" = "Any Authenticated User"; -"Public Access" = "Public Access"; + + "label_Public" = "Nyilvános"; "label_Private" = "Magán"; @@ -173,7 +173,7 @@ "Save and Close" = "Mentés és bezárás"; "Close" = "Bezárás"; "Invite Attendees" = "Résztvevők meghívása"; -"Attach" = "Attach"; + "Update" = "Mentés"; "Cancel" = "Mégsem"; "show_rejected_apts" = "Visszautasított találkozók mutatása"; @@ -207,7 +207,7 @@ "Title:" = "Cím:"; "Calendar:" = "Naptár:"; "Name" = "Név"; -"Email" = "Email"; + "Status:" = "Állapot"; "% complete" = "% kész"; "Location:" = "Hely:"; @@ -226,14 +226,14 @@ "Category:" = "Kategória:"; "Repeat:" = "Ismétlés:"; "Reminder:" = "Emlékeztető:"; -"General:" = "General:"; -"Reply:" = "Reply:"; + + "Target:" = "Cél:"; "attributes" = "tulajdonságok"; "attendees" = "résztvevők"; -"delegated from" = "delegated from"; + /* checkbox title */ "is private" = "magán"; @@ -350,7 +350,7 @@ "Every" = "Minden"; "Days" = "naponként"; "Week(s)" = "hetenként"; -"On" = "On"; + "Month(s)" = "hónaponként"; "The" = "A"; "Recur on day(s)" = "Az alábbi napon"; @@ -404,19 +404,19 @@ "reminder_AFTER" = "utána"; "reminder_START" = "az esemény kezdődik"; "reminder_END" = "az esemény végződik"; -"Reminder Details" = "Reminder Details"; -"Choose a Reminder Action" = "Choose a Reminder Action"; -"Show an Alert" = "Show an Alert"; -"Send an E-mail" = "Send an E-mail"; -"Email Organizer" = "Email Organizer"; -"Email Attendees" = "Email Attendees"; -"zoom_400" = "400%"; -"zoom_200" = "200%"; -"zoom_100" = "100%"; -"zoom_50" = "50%"; -"zoom_25" = "25%"; + + + + + + + + + + + /* transparency */ @@ -446,7 +446,7 @@ validate_endbeforestart = "A megadott befejező dátum korábbi, mint a kezd "Day View" = "Napi nézet"; "Week View" = "Heti nézet"; "Month View" = "Havi nézet"; -"Reload" = "Reload"; + "eventPartStatModificationError" = "A résztvevői állapota nem módosítható."; @@ -470,7 +470,7 @@ validate_endbeforestart = "A megadott befejező dátum korábbi, mint a kezd /* Legend */ "Participant" = "Kötelező résztvevő"; "Optional Participant" = "Nem kötelező résztvevő"; -"Non Participant" = "Non Participant"; + "Chair" = "Szék"; "Needs action" = "Foglalkozni kell vele"; @@ -490,13 +490,12 @@ validate_endbeforestart = "A megadott befejező dátum korábbi, mint a kezd "Next slot" = "Következő ablak"; "Previous hour" = "Előző óra"; "Next hour" = "Következő óra"; -"Work days only" = "Work days only"; -"The whole day" = "The whole day"; -"Between" = "Between"; + + + "and" = "and"; -"A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" -= "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?"; + /* apt list */ "Title" = "Cím"; @@ -526,47 +525,47 @@ vtodo_class2 = "(Bizalmas feladat)"; "Name:" = "Név:"; "Color:" = "Szín:"; -"Include in free-busy" = "Include in free-busy"; -"Synchronization" = "Synchronization"; -"Synchronize" = "Synchronize"; + + + "Tag:" = "Cimke:"; -"Display" = "Display"; -"Show alarms" = "Show alarms"; -"Show tasks" = "Show tasks"; -"Links to this Calendar" = "Links to this Calendar"; -"Authenticated User Access" = "Authenticated User Access"; + + + + + "CalDAV URL" = "CalDAV url"; -"WebDAV ICS URL" = "WebDAV ICS URL"; -"WebDAV XML URL" = "WebDAV XML URL"; + + /* Error messages */ -"dayFieldInvalid" = "Please specify a numerical value in the Days field greater or equal to 1."; -"weekFieldInvalid" = "Please specify a numerical value in the Week(s) field greater or equal to 1."; -"monthFieldInvalid" = "Please specify a numerical value in the Month(s) field greater or equal to 1."; -"monthDayFieldInvalid" = "Please specify a numerical value in the month day field greater or equal to 1."; -"yearFieldInvalid" = "Please specify a numerical value in the Year(s) field greater or equal to 1."; -"appointmentFieldInvalid" = "Please specify a numerical value in the Appointment(s) field greater or equal to 1."; -"recurrenceUnsupported" = "This type of recurrence is currently unsupported."; -"Please specify a calendar name." = "Please specify a calendar name."; -"tagNotDefined" = "You must specify a tag if you want to synchronize this calendar."; -"tagAlreadyExists" = "The tag you specified is already associated to another calendar."; -"tagHasChanged" = "If you change your calendar's tag, you'll need to reload the data on your mobile device.\nContinue?"; -"tagWasAdded" = "If you want to synchronize this calendar, you'll need to reload the data on your mobile device.\nContinue?"; -"tagWasRemoved" = "If you remove this calendar from synchronization, you'll need to reload the data on your mobile device.\nContinue?"; -"DestinationCalendarError" = "The source and destination calendars are the same. Please try to copy to a different calendar."; -"EventCopyError" = "The copy failed. Please try to copy to a difference calendar."; -"Open Task..." = "Open Task..."; -"Mark Completed" = "Mark Completed"; -"Delete Task" = "Delete Task"; -"Delete Event" = "Delete Event"; -"Copy event to my calendar" = "Copy event to my calendar"; -"Subscribe to a web calendar..." = "Subscribe to a web calendar..."; -"URL of the Calendar" = "URL of the Calendar"; -"Web Calendar" = "Web Calendar"; -"Reload on login" = "Reload on login"; -"Invalid number." = "Invalid number."; + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/UI/Scheduler/Icelandic.lproj/Localizable.strings b/UI/Scheduler/Icelandic.lproj/Localizable.strings index 6dc96f29f..7b6c35e98 100644 --- a/UI/Scheduler/Icelandic.lproj/Localizable.strings +++ b/UI/Scheduler/Icelandic.lproj/Localizable.strings @@ -27,7 +27,7 @@ "Saturday" = "Laugardagur"; "DayOfTheMonth" = "Dagur mánaðarins"; -"Sun" = "Sun"; + "Mon" = "Mán"; "Tue" = "Þri"; "Wed" = "Mið"; @@ -35,7 +35,7 @@ "Fri" = "Fös"; "Sat" = "Lau"; -"a2_Sunday" = "Su"; + "a2_Monday" = "Má"; "a2_Tuesday" = "Þr"; "a2_Wednesday" = "Mi"; @@ -71,7 +71,7 @@ "June" = "Júní"; "July" = "Júlí"; "August" = "Ágúst"; -"September" = "September"; + "October" = "Október"; "November" = "Nóvember"; "December" = "Desember"; @@ -84,7 +84,7 @@ "a3_June" = "Júní"; "a3_July" = "Júlí"; "a3_August" = "Ágúst"; -"a3_September" = "September"; + "a3_October" = "Október"; "a3_November" = "Nóvember"; "a3_December" = "Desember"; @@ -111,7 +111,7 @@ "Select an iCalendar file (.ics)." = "Velja iCalendar skrá (.ics)."; "Upload" = "Hala upp"; "Publish Calendar..." = "Gefa dagatal út..."; -"Reload Remote Calendars" = "Reload Remote Calendars"; + "Properties" = "Eiginleikar"; "Done" = "Ljúka"; "An error occured while importing calendar." = "Villa kom upp þegar dagatalið var flutt inn."; @@ -126,7 +126,7 @@ /* Misc */ -"OpenGroupware.org" = "OpenGroupware.org"; + "Forbidden" = "Bannað"; /* acls */ @@ -186,7 +186,7 @@ "No appointments found" = "Engar tímapantanir fundust"; "Meetings proposed by you" = "Tillögur um fundi sem þú hefur lagt fram"; "Meetings proposed to you" = "Tillögur um fundi sem þú hefur fengið"; -"sched_startDateFormat" = "%d/%m %H:%M"; + "action" = "Aðgerð"; "accept" = "Samþykkja"; "decline" = "Hafna"; @@ -213,10 +213,10 @@ "Location:" = "Staðsetning:"; "Priority:" = "Mikilvægi:"; "Privacy" = "Friðhelgi"; -"Cycle" = "Cycle"; -"Cycle End" = "Cycle End"; + + "Categories" = "Flokkar"; -"Classification" = "Classification"; + "Duration" = "Tímalengd"; "Attendees:" = "Þáttakendur:"; "Resources" = "Tilföng"; @@ -227,11 +227,11 @@ "Repeat:" = "Endurtaka:"; "Reminder:" = "Áminning:"; "General:" = "Almennt:"; -"Reply:" = "Reply:"; -"Target:" = "Target:"; -"attributes" = "attributes"; + + + "attendees" = "þáttakendur"; "delegated from" = "Skipaður fulltrúi var"; @@ -257,7 +257,7 @@ /* Appointments (error messages) */ -"Conflicts found!" = "Conflicts found!"; + "Invalid iCal data!" = "Ógild ICal gögn!"; "Could not create iCal data!" = "Ekki tókst að búa til iCal gögn!"; @@ -283,7 +283,7 @@ "All day Event" = "Heilsdagsviðburður"; "check for conflicts" = "Athuga með árekstra"; -"Browse URL" = "Browse URL"; + "newAttendee" = "Bæta þáttakanda við"; @@ -327,17 +327,17 @@ /* Cycles */ -"cycle_once" = "cycle_once"; -"cycle_daily" = "cycle_daily"; -"cycle_weekly" = "cycle_weekly"; -"cycle_2weeks" = "cycle_2weeks"; -"cycle_4weeks" = "cycle_4weeks"; -"cycle_monthly" = "cycle_monthly"; -"cycle_weekday" = "cycle_weekday"; -"cycle_yearly" = "cycle_yearly"; -"cycle_end_never" = "cycle_end_never"; -"cycle_end_until" = "cycle_end_until"; + + + + + + + + + + "Recurrence pattern" = "Endurtekningarmynstur"; "Range of recurrence" = "Endurtekningartímabil"; @@ -404,7 +404,7 @@ "reminder_AFTER" = "eftir"; "reminder_START" = "viðburðurinn byrjar"; "reminder_END" = "viðburðurinn endar"; -"Reminder Details" = "Reminder Details"; + "Choose a Reminder Action" = "Velja aðgerð við áminningu"; "Show an Alert" = "Sýna viðvörun"; @@ -412,11 +412,11 @@ "Email Organizer" = "Senda til skipuleggjanda"; "Email Attendees" = "Senda þáttakendum"; -"zoom_400" = "400%"; -"zoom_200" = "200%"; -"zoom_100" = "100%"; -"zoom_50" = "50%"; -"zoom_25" = "25%"; + + + + + /* transparency */ @@ -530,7 +530,7 @@ vtodo_class2 = "(Verkefni er trúnaðarmál)"; "Synchronization" = "Samstilling"; "Synchronize" = "Samstilla"; -"Tag:" = "Tag:"; + "Display" = "Sýna"; "Show alarms" = "Sýna vekjara"; @@ -538,9 +538,9 @@ vtodo_class2 = "(Verkefni er trúnaðarmál)"; "Links to this Calendar" = "Tenglar í þetta dagatal"; "Authenticated User Access" = "Aðgangur fyrir sannvottaðan notanda"; -"CalDAV URL" = "CalDAV URL"; -"WebDAV ICS URL" = "WebDAV ICS URL"; -"WebDAV XML URL" = "WebDAV XML URL"; + + + /* Error messages */ "dayFieldInvalid" = "Hér þarf að tilgreina fyrir Dagana, tölugildi sem er 1 eða stærra."; @@ -550,7 +550,7 @@ vtodo_class2 = "(Verkefni er trúnaðarmál)"; "yearFieldInvalid" = "Hér þarf að tilgreina fyrir árið/árin, tölugildi sem er 1 eða stærra."; "appointmentFieldInvalid" = "Hér þarf að tilgreina fyrir tímapantanir, tölugildi sem er 1 eða stærra."; "recurrenceUnsupported" = "Þessa tegund endurtekningar er ekki hægt að styðja enn sem komið er."; -"Please specify a calendar name." = "Please specify a calendar name."; + "tagNotDefined" = "Þú þarft að tilgreina merki ef þú vilt samhæfa þetta dagatal."; "tagAlreadyExists" = "Merkið sem þú tilgreindir er nú þegar bendlað við annað dagatal."; "tagHasChanged" = "Ef þú breytir merkingunni á dagatalinu þínu, þarftu að endurhlaða gögnum inn á farsíman þinn.\nHalda áfram?"; diff --git a/UI/Scheduler/Italian.lproj/Localizable.strings b/UI/Scheduler/Italian.lproj/Localizable.strings index 3ddc721e9..393995380 100644 --- a/UI/Scheduler/Italian.lproj/Localizable.strings +++ b/UI/Scheduler/Italian.lproj/Localizable.strings @@ -10,7 +10,7 @@ "Switch to day view" = "Giorno"; "Switch to week view" = "Settimana"; "Switch to month view" = "Mese"; -"Reload all calendars" = "Reload all calendars"; + /* Tabs */ "Date" = "Data"; @@ -41,7 +41,7 @@ "a2_Wednesday" = "Me"; "a2_Thursday" = "Gi"; "a2_Friday" = "Ve"; -"a2_Saturday" = "Sa"; + "dayLabelFormat" = "%d/%m/%Y"; "today" = "Oggi"; @@ -109,7 +109,7 @@ "Import Events..." = "Importa gli eventi..."; "Import Events" = "Importa gli eventi"; "Select an iCalendar file (.ics)." = "Seleziona un file iCalendar (.ics)."; -"Upload" = "Upload"; + "Publish Calendar..." = "Pubblica calendario..."; "Reload Remote Calendars" = "Aggiorna calendari remoti"; "Properties" = "Proprietà"; @@ -126,7 +126,7 @@ /* Misc */ -"OpenGroupware.org" = "OpenGroupware.org"; + "Forbidden" = "Vietato"; /* acls */ @@ -186,7 +186,7 @@ "No appointments found" = "Nessun appuntamento trovato"; "Meetings proposed by you" = "Incontri proposti da te"; "Meetings proposed to you" = "Incontri a cui sei stato invitato"; -"sched_startDateFormat" = "%d/%m %H:%M"; + "action" = "Azione"; "accept" = "Accetta"; "decline" = "Declina"; @@ -207,12 +207,12 @@ "Title:" = "Titolo:"; "Calendar:" = "Calendario:"; "Name" = "Nome"; -"Email" = "Email"; + "Status:" = "Stato:"; "% complete" = "% completato"; "Location:" = "Luogo:"; "Priority:" = "Priorità:"; -"Privacy" = "Privacy"; + "Cycle" = "Ricorrenza"; "Cycle End" = "Termine ricorrenza"; "Categories" = "Categorie"; @@ -406,17 +406,17 @@ "reminder_END" = "l'evento termina"; "Reminder Details" = "Dettagli promemoria"; -"Choose a Reminder Action" = "Choose a Reminder Action"; -"Show an Alert" = "Show an Alert"; -"Send an E-mail" = "Send an E-mail"; -"Email Organizer" = "Email Organizer"; -"Email Attendees" = "Email Attendees"; -"zoom_400" = "400%"; -"zoom_200" = "200%"; -"zoom_100" = "100%"; -"zoom_50" = "50%"; -"zoom_25" = "25%"; + + + + + + + + + + /* transparency */ @@ -429,7 +429,7 @@ validate_invalid_startdate = "Data iniziale non corretta!"; validate_invalid_enddate = "Data finale non corretta!"; validate_endbeforestart = "La data finale specificata è precedente alla data di inizio."; -"Tasks" = "Tasks"; + "Show completed tasks" = "Visualizza attività completate"; /* tabs */ @@ -485,7 +485,7 @@ validate_endbeforestart = "La data finale specificata è precedente alla data /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "Periodo suggerito:"; -"Zoom:" = "Zoom:"; + "Previous slot" = "Precedente"; "Next slot" = "Successivo"; "Previous hour" = "Ora precedente"; @@ -537,10 +537,10 @@ vtodo_class2 = "(Attività confidenziale)"; "Show tasks" = "Mostra attività"; "Links to this Calendar" = "Link a questo Calendario"; -"Authenticated User Access" = "Authenticated User Access"; + "CalDAV URL" = "CalDAV url"; -"WebDAV ICS URL" = "WebDAV ICS URL"; -"WebDAV XML URL" = "WebDAV XML URL"; + + /* Error messages */ "dayFieldInvalid" = "Prego specificare nel campo Giorni un valore numerico maggiore o ugale a 1."; @@ -550,20 +550,20 @@ vtodo_class2 = "(Attività confidenziale)"; "yearFieldInvalid" = "Prego specificare nel campo Anno(i) un valore numerico maggiore o uguale a 1."; "appointmentFieldInvalid" = "Prego specificare nel campo Appuntamento(i) un valore numerico maggiore o uguale a 1."; "recurrenceUnsupported" = "Questo tipo di ricorrenza non è attualmente supportata."; -"Please specify a calendar name." = "Please specify a calendar name."; + "tagNotDefined" = "E' necessario specificare un etichetta se si vuole sincronizzare questo calendario."; "tagAlreadyExists" = "L'etichetta specificata è già associata ad un altro calendario."; "tagHasChanged" = "Cambiando l'etichetta del calendario è necessario ricaricare tutti i dati sul dispositivo mobile.\nContinuare?"; "tagWasAdded" = "Sincronizzando questo calendario sarà necessario ricaricare i dati sul dispositivo mobile.\nContinuare?"; "tagWasRemoved" = "Rimuovendo questo calendario dalla sincronizzazione, sarà necessario ricaricare i dati sul dispositivo mobile.\nCotinuare?"; -"DestinationCalendarError" = "The source and destination calendars are the same. Please try to copy to a different calendar."; -"EventCopyError" = "The copy failed. Please try to copy to a difference calendar."; + + "Open Task..." = "Apri attività..."; "Mark Completed" = "Segna come completata"; "Delete Task" = "Elimina attività"; "Delete Event" = "Elimina evento"; -"Copy event to my calendar" = "Copy event to my calendar"; + "Subscribe to a web calendar..." = "Sottoscrivi un calendario remoto..."; "URL of the Calendar" = "URL del calendario"; diff --git a/UI/Scheduler/Norwegian.lproj/Localizable.strings b/UI/Scheduler/Norwegian.lproj/Localizable.strings index 565c6c85d..a6d12852e 100644 --- a/UI/Scheduler/Norwegian.lproj/Localizable.strings +++ b/UI/Scheduler/Norwegian.lproj/Localizable.strings @@ -40,7 +40,7 @@ "a2_Tuesday" = "Ti"; "a2_Wednesday" = "On"; "a2_Thursday" = "To"; -"a2_Friday" = "Fr"; + "a2_Saturday" = "Lø"; "dayLabelFormat" = "%Y-%m-%d"; @@ -66,27 +66,27 @@ "January" = "Januar"; "February" = "Februar"; "March" = "Mars"; -"April" = "April"; -"May" = "May"; + + "June" = "Juni"; "July" = "Juli"; -"August" = "August"; -"September" = "September"; + + "October" = "Oktober"; -"November" = "November"; + "December" = "Desember"; "a3_January" = "Januar"; "a3_February" = "Februar"; "a3_March" = "Mars"; -"a3_April" = "April"; -"a3_May" = "May"; + + "a3_June" = "Juni"; "a3_July" = "Juli"; -"a3_August" = "August"; -"a3_September" = "September"; + + "a3_October" = "Oktober"; -"a3_November" = "November"; + "a3_December" = "Desember"; "Previous Month" = "Forrige måned"; @@ -126,7 +126,7 @@ /* Misc */ -"OpenGroupware.org" = "OpenGroupware.org"; + "Forbidden" = "Forbudt"; /* acls */ @@ -186,7 +186,7 @@ "No appointments found" = "Ingen avtaler funnet"; "Meetings proposed by you" = "Møter foreslått av deg"; "Meetings proposed to you" = "Møter foreslått til deg"; -"sched_startDateFormat" = "%d/%m %H:%M"; + "action" = "Handling"; "accept" = "Godta"; "decline" = "Avslå"; @@ -208,7 +208,7 @@ "Calendar:" = "Kalender:"; "Name" = "Navn"; "Email" = "E-post"; -"Status:" = "Status:"; + "% complete" = "% utført"; "Location:" = "Plass:"; "Priority:" = "Prioritet:"; @@ -301,7 +301,7 @@ "prio_2" = "Høy"; "prio_3" = "Høy"; "prio_4" = "Høy"; -"prio_5" = "Normal"; + "prio_6" = "Lav"; "prio_7" = "Lav"; "prio_8" = "Lav"; @@ -352,7 +352,7 @@ "Week(s)" = "Uke(r)"; "On" = "På"; "Month(s)" = "Måned(er)"; -"The" = "The"; + "Recur on day(s)" = "Gjentas på dag(er)"; "Year(s)" = "År"; "cycle_of" = "av"; @@ -412,11 +412,11 @@ "Email Organizer" = "E-post organisator"; "Email Attendees" = "E-post deltakere"; -"zoom_400" = "400%"; -"zoom_200" = "200%"; -"zoom_100" = "100%"; -"zoom_50" = "50%"; -"zoom_25" = "25%"; + + + + + /* transparency */ @@ -485,7 +485,7 @@ validate_endbeforestart = "Angitt sluttdato inntreffer før angitt startdato. /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "Foreslå tid:"; -"Zoom:" = "Zoom:"; + "Previous slot" = "Forrige spor"; "Next slot" = "Neste spor"; "Previous hour" = "Forrige time"; @@ -500,7 +500,7 @@ validate_endbeforestart = "Angitt sluttdato inntreffer før angitt startdato. /* apt list */ "Title" = "Tittel"; -"Start" = "Start"; + "End" = "Slutt"; "Location" = "Plass"; "(Private Event)" = "(Privat hendelse)"; @@ -537,10 +537,10 @@ vtodo_class2 = "(Konfidensiell oppgave)"; "Show tasks" = "Vis oppgaver"; "Links to this Calendar" = "Linker til denne kalenderen"; -"Authenticated User Access" = "Authenticated User Access"; + "CalDAV URL" = "CalDAV url"; -"WebDAV ICS URL" = "WebDAV ICS URL"; -"WebDAV XML URL" = "WebDAV XML URL"; + + /* Error messages */ "dayFieldInvalid" = "Angi en numerisk verdi i dagsfeltet større enn eller lik 1."; @@ -550,7 +550,7 @@ vtodo_class2 = "(Konfidensiell oppgave)"; "yearFieldInvalid" = "Angi en numerisk verdi i årsfeltet større enn eller lik 1."; "appointmentFieldInvalid" = "Angi en numerisk verdi i møtesfeltet større enn eller lik 1."; "recurrenceUnsupported" = "Denne type gjentakelse støttes ikke i dag."; -"Please specify a calendar name." = "Please specify a calendar name."; + "tagNotDefined" = "Du må angi en merkelapp om du vil synkronisere kalenderen."; "tagAlreadyExists" = "Merkelappen du spesifiserte er allerede knyttet til en annen kalender."; "tagHasChanged" = "Om du endrer merkelappen på din kalender trenger du å laste dataene i din mobiltelefon på nytt.\nFortsätta?"; @@ -563,7 +563,7 @@ vtodo_class2 = "(Konfidensiell oppgave)"; "Mark Completed" = "Merk utført"; "Delete Task" = "Slett oppgave"; "Delete Event" = "Slett hendelse"; -"Copy event to my calendar" = "Copy event to my calendar"; + "Subscribe to a web calendar..." = "Abonnere på en internett-kalender..."; "URL of the Calendar" = "URL til kalenderen"; diff --git a/UI/Scheduler/Polish.lproj/Localizable.strings b/UI/Scheduler/Polish.lproj/Localizable.strings index 3b8ced6ba..69e23e596 100644 --- a/UI/Scheduler/Polish.lproj/Localizable.strings +++ b/UI/Scheduler/Polish.lproj/Localizable.strings @@ -126,7 +126,7 @@ /* Misc */ -"OpenGroupware.org" = "OpenGroupware.org"; + "Forbidden" = "Zabronione"; /* acls */ @@ -208,7 +208,7 @@ "Calendar:" = "Kalendarz:"; "Name" = "Nazwa"; "Email" = "E-mail"; -"Status:" = "Status:"; + "% complete" = "% wykonania"; "Location:" = "Miejsce:"; "Priority:" = "Priorytet:"; @@ -352,10 +352,10 @@ "Week(s)" = "Tygodni(e)"; "On" = "w"; "Month(s)" = "Miesiące(ęcy)"; -"The" = ""; + "Recur on day(s)" = "Powtarzaj w dni"; "Year(s)" = "Lat(a)"; -"cycle_of" = ""; + "No end date" = "Bez daty końcowej"; "Create" = "Utwórz"; "appointment(s)" = "spotkanie(a)"; @@ -406,17 +406,17 @@ "reminder_END" = "końcem wydarzenia"; "Reminder Details" = "Szczegóły przypomnienia"; -"Choose a Reminder Action" = "Choose a Reminder Action"; -"Show an Alert" = "Show an Alert"; -"Send an E-mail" = "Send an E-mail"; -"Email Organizer" = "Email Organizer"; -"Email Attendees" = "Email Attendees"; -"zoom_400" = "400%"; -"zoom_200" = "200%"; -"zoom_100" = "100%"; -"zoom_50" = "50%"; -"zoom_25" = "25%"; + + + + + + + + + + /* transparency */ @@ -538,9 +538,9 @@ vtodo_class2 = "(Zadanie poufne)"; "Links to this Calendar" = "Odnośniki do tego kalendarza"; "Authenticated User Access" = "Dostęp dla zalogowanych użytkowników"; -"CalDAV URL" = "CalDAV URL"; -"WebDAV ICS URL" = "WebDAV ICS URL"; -"WebDAV XML URL" = "WebDAV XML URL"; + + + /* Error messages */ "dayFieldInvalid" = "W polu Dni wprowadź liczbę równą lub większą od 1."; @@ -550,23 +550,23 @@ vtodo_class2 = "(Zadanie poufne)"; "yearFieldInvalid" = "W polu Lata wprowadź liczbę równą lub większą od 1."; "appointmentFieldInvalid" = "W polu Spotkania wprowadź liczbę równą lub większą od 1."; "recurrenceUnsupported" = "Ten typ powtórzeń obecnie nie jest obsługiwany."; -"Please specify a calendar name." = "Please specify a calendar name."; + "tagNotDefined" = "Musisz podać znacznik, jeśli chcesz synchronizować ten kalendarz."; "tagAlreadyExists" = "Podany znacznik jest już skojarzony z innym kalendarzem."; "tagHasChanged" = "Jeśli zmienisz znacznik kalendarza, musisz przeładować dane na swoim urządzeniu mobilnym.\nKontynuować?"; "tagWasAdded" = "Jeśli chesz synchronizować ten kalendarz, będziesz musiał(a) przeładować dane na swoim urządzeniu mobilnym.\nKontynuować?"; "tagWasRemoved" = "Jeśli usuniesz ten kalendarz z synchronizacji, będziesz musiał(a) przeładować dane na swoim urządzeniu mobilnym.\nKontynuować?"; -"DestinationCalendarError" = "The source and destination calendars are the same. Please try to copy to a different calendar."; -"EventCopyError" = "The copy failed. Please try to copy to a difference calendar."; + + "Open Task..." = "Otwórz zadanie..."; "Mark Completed" = "Oznacz jako ukończone"; "Delete Task" = "Usuń zadanie"; "Delete Event" = "Usuń wydarzenie"; -"Copy event to my calendar" = "Copy event to my calendar"; + "Subscribe to a web calendar..." = "Subskrybuj kalendarz..."; "URL of the Calendar" = "URL do kalendarza"; "Web Calendar" = "Kalendarz Web"; "Reload on login" = "Przeładuj przy logowaniu"; -"Invalid number." = "Invalid number."; + diff --git a/UI/Scheduler/Russian.lproj/Localizable.strings b/UI/Scheduler/Russian.lproj/Localizable.strings index ae0b045de..41783e59c 100644 --- a/UI/Scheduler/Russian.lproj/Localizable.strings +++ b/UI/Scheduler/Russian.lproj/Localizable.strings @@ -10,7 +10,7 @@ "Switch to day view" = "Перейти к обзору дня"; "Switch to week view" = "Перейти к обзору недели"; "Switch to month view" = "Перейти к обзору месяца"; -"Reload all calendars" = "Reload all calendars"; + /* Tabs */ "Date" = "Дата"; @@ -46,8 +46,8 @@ "dayLabelFormat" = "%d/%m/%Y"; "today" = "Сегодня"; -"Previous Day" = "Previous Day"; -"Next Day" = "Next Day"; + + /* Week */ @@ -126,7 +126,7 @@ /* Misc */ -"OpenGroupware.org" = "OpenGroupware.org"; + "Forbidden" = "Запрешено"; /* acls */ @@ -150,7 +150,7 @@ "View the Date & Time" = "Показывать время и дату"; "Modify" = "Изменить"; "Respond To" = "Ответить"; -"None" = "None"; + "This person can create objects in my calendar." = "Этот участник может создавать записи в моем календаре."; @@ -186,7 +186,7 @@ "No appointments found" = "Не найдено назначенных встреч"; "Meetings proposed by you" = "Ваши предложения о встрече"; "Meetings proposed to you" = "Предложенные Вам встречи"; -"sched_startDateFormat" = "%d/%m %H:%M"; + "action" = "Действие"; "accept" = "Согласиться"; "decline" = "Отказаться"; @@ -207,7 +207,7 @@ "Title:" = "Заголовок:"; "Calendar:" = "Календарь:"; "Name" = "Имя"; -"Email" = "Email"; + "Status:" = "Статус:"; "% complete" = "% выполнено"; "Location:" = "Место:"; @@ -352,13 +352,13 @@ "Week(s)" = "недель(и)"; "On" = "На"; "Month(s)" = "месяца(цев)"; -"The" = ""; + "Recur on day(s)" = "Повторяется в дни"; "Year(s)" = "год(года)"; -"cycle_of" = ""; + "No end date" = "Нет даты завершения"; "Create" = "Создать"; -"appointment(s)" = "appointment(s)"; + "Repeat until" = "Повторять до"; "First" = "Первый"; @@ -412,11 +412,11 @@ "Email Organizer" = "Email организатору"; "Email Attendees" = "Email участникам"; -"zoom_400" = "400%"; -"zoom_200" = "200%"; -"zoom_100" = "100%"; -"zoom_50" = "50%"; -"zoom_25" = "25%"; + + + + + /* transparency */ @@ -446,7 +446,7 @@ validate_endbeforestart = "Дата начала позже даты конц "Day View" = "День"; "Week View" = "По неделям"; "Month View" = "Месяц"; -"Reload" = "Reload"; + "eventPartStatModificationError" = "Невозможно изменить статус Вашего участия."; @@ -537,10 +537,10 @@ vtodo_class2 = "(Конфиденциальное задание)"; "Show tasks" = "Показать задания"; "Links to this Calendar" = "Ссылки на этот календарь"; -"Authenticated User Access" = "Authenticated User Access"; + "CalDAV URL" = "CalDAV url"; -"WebDAV ICS URL" = "WebDAV ICS URL"; -"WebDAV XML URL" = "WebDAV XML URL"; + + /* Error messages */ "dayFieldInvalid" = "Пожалуйста, укажите числовое значение в поле дней, большее или равное 1."; @@ -550,7 +550,7 @@ vtodo_class2 = "(Конфиденциальное задание)"; "yearFieldInvalid" = "Пожалуйста, укажите числовое значение в поле лет, большее или равное 1."; "appointmentFieldInvalid" = "Пожалуйста, укажите числовое значение в поле встреч, большее или равное 1."; "recurrenceUnsupported" = "Этот тип повторений пока не поддерживается."; -"Please specify a calendar name." = "Please specify a calendar name."; + "tagNotDefined" = "Вы должны указать метку (tag) если хотите синхронизировать этот календарь."; "tagAlreadyExists" = "Указанная метка уже используется в другом календаре."; "tagHasChanged" = "Если Вы смените метку в этом календаре, то будет необходимо заново синхронизировать данные на Вашем мобильном устройстве. \nПродолжить?"; @@ -563,10 +563,10 @@ vtodo_class2 = "(Конфиденциальное задание)"; "Mark Completed" = "Пометить как завершенное"; "Delete Task" = "Удалить задачу"; "Delete Event" = "Удалить событие"; -"Copy event to my calendar" = "Copy event to my calendar"; + "Subscribe to a web calendar..." = "Подписаться на калентарь в сети..."; -"URL of the Calendar" = "URL of the Calendar"; -"Web Calendar" = "Web Calendar"; + + "Reload on login" = "Перезагружать при входе"; "Invalid number." = "Число неверно."; diff --git a/UI/Scheduler/Spanish.lproj/Localizable.strings b/UI/Scheduler/Spanish.lproj/Localizable.strings index 6b38df5e2..05a702699 100644 --- a/UI/Scheduler/Spanish.lproj/Localizable.strings +++ b/UI/Scheduler/Spanish.lproj/Localizable.strings @@ -126,7 +126,7 @@ /* Misc */ -"OpenGroupware.org" = "OpenGroupware.org"; + "Forbidden" = "Prohibido"; /* acls */ @@ -186,7 +186,7 @@ "No appointments found" = "No hay eventos encontrados"; "Meetings proposed by you" = "Eventos propuestos por Ud."; "Meetings proposed to you" = "Eventos propuestos para Ud"; -"sched_startDateFormat" = "%d/%m %H:%M"; + "action" = "Acción"; "accept" = "Aceptar"; "decline" = "Rechazar"; @@ -226,7 +226,7 @@ "Category:" = "Categoría:"; "Repeat:" = "Repetir:"; "Reminder:" = "Recordatorio:"; -"General:" = "General:"; + "Reply:" = "Responder:"; "Target:" = "URL documento:"; @@ -301,7 +301,7 @@ "prio_2" = "Alta"; "prio_3" = "Alta"; "prio_4" = "Alta"; -"prio_5" = "Normal"; + "prio_6" = "Baja"; "prio_7" = "Baja"; "prio_8" = "Baja"; @@ -412,11 +412,11 @@ "Email Organizer" = "Enviar correo al organizador"; "Email Attendees" = "Enviar correo a los asistentes"; -"zoom_400" = "400%"; -"zoom_200" = "200%"; -"zoom_100" = "100%"; -"zoom_50" = "50%"; -"zoom_25" = "25%"; + + + + + /* transparency */ @@ -524,7 +524,7 @@ vtodo_class2 = "(Tarea confidencial)"; /* Properties dialog */ "Name:" = "Nombre:"; -"Color:" = "Color:"; + "Include in free-busy" = "Incluye en tiempo libre-ocupado"; @@ -532,15 +532,15 @@ vtodo_class2 = "(Tarea confidencial)"; "Synchronize" = "Sincroniza"; "Tag:" = "Redacción:"; -"Display" = "Display"; + "Show alarms" = "Muestra alarmas"; "Show tasks" = "Muestra tareas"; "Links to this Calendar" = "Vínculos a éste calendario"; "Authenticated User Access" = "Acceso a usuario autenticado"; "CalDAV URL" = "CalDAV url"; -"WebDAV ICS URL" = "WebDAV ICS URL"; -"WebDAV XML URL" = "WebDAV XML URL"; + + /* Error messages */ "dayFieldInvalid" = "Por favor, especificar un valor númerico en el campo día superior o igual a 1."; @@ -550,7 +550,7 @@ vtodo_class2 = "(Tarea confidencial)"; "yearFieldInvalid" = "Por favor, especificar un valor númerico en el campo año superior o igual a 1."; "appointmentFieldInvalid" = "Por favor, especificar un valor númerico en el campo cita(s) superior o igual a 1."; "recurrenceUnsupported" = "Este tipo de frecuencia no esta soportado."; -"Please specify a calendar name." = "Please specify a calendar name."; + "tagNotDefined" = "Tiene que especificar un marcador si quiere sincronizar este calendario."; "tagAlreadyExists" = "El marcador especificado ya esta asociado a otro calendario."; "tagHasChanged" = "Si cambia el marcador de este calendario, necesitara recargar los datos en su teléfono móvil.\n¿Continuar?"; diff --git a/UI/Scheduler/Swedish.lproj/Localizable.strings b/UI/Scheduler/Swedish.lproj/Localizable.strings index faa76dcc2..befd2dd02 100644 --- a/UI/Scheduler/Swedish.lproj/Localizable.strings +++ b/UI/Scheduler/Swedish.lproj/Localizable.strings @@ -40,7 +40,7 @@ "a2_Tuesday" = "Ti"; "a2_Wednesday" = "On"; "a2_Thursday" = "To"; -"a2_Friday" = "Fr"; + "a2_Saturday" = "Lö"; "dayLabelFormat" = "%Y-%m-%d"; @@ -66,28 +66,28 @@ "January" = "Januari"; "February" = "Februari"; "March" = "Mars"; -"April" = "April"; + "May" = "Maj"; "June" = "Juni"; "July" = "Juli"; "August" = "Augusti"; -"September" = "September"; + "October" = "Oktober"; -"November" = "November"; -"December" = "December"; + + "a3_January" = "Januari"; "a3_February" = "Februari"; "a3_March" = "Mars"; -"a3_April" = "April"; + "a3_May" = "Maj"; "a3_June" = "Juni"; "a3_July" = "Juli"; "a3_August" = "Augusti"; -"a3_September" = "September"; + "a3_October" = "Oktober"; -"a3_November" = "November"; -"a3_December" = "December"; + + "Previous Month" = "Föregående månad"; "Next Month" = "Nästa månad"; @@ -126,7 +126,7 @@ /* Misc */ -"OpenGroupware.org" = "OpenGroupware.org"; + "Forbidden" = "Förbjuden"; /* acls */ @@ -186,7 +186,7 @@ "No appointments found" = "Inga möten hittade"; "Meetings proposed by you" = "Möten föreslagna av dig"; "Meetings proposed to you" = "Möten föreslagna till dig"; -"sched_startDateFormat" = "%d/%m %H:%M"; + "action" = "Åtgärd"; "accept" = "Acceptera"; "decline" = "Avböj"; @@ -208,7 +208,7 @@ "Calendar:" = "Kalender:"; "Name" = "Namn"; "Email" = "E-post"; -"Status:" = "Status:"; + "% complete" = "% utfört"; "Location:" = "Plats:"; "Priority:" = "Prioritet:"; @@ -301,7 +301,7 @@ "prio_2" = "Hög"; "prio_3" = "Hög"; "prio_4" = "Hög"; -"prio_5" = "Normal"; + "prio_6" = "Låg"; "prio_7" = "Låg"; "prio_8" = "Låg"; @@ -352,7 +352,7 @@ "Week(s)" = "Vecka(or)"; "On" = "På"; "Month(s)" = "Månad(er)"; -"The" = "The"; + "Recur on day(s)" = "Återkommer på dag(ar)"; "Year(s)" = "År"; "cycle_of" = "av"; @@ -412,11 +412,11 @@ "Email Organizer" = "Skicka meddelande till arrangör"; "Email Attendees" = "Skicka meddelande till deltagare"; -"zoom_400" = "400%"; -"zoom_200" = "200%"; -"zoom_100" = "100%"; -"zoom_50" = "50%"; -"zoom_25" = "25%"; + + + + + /* transparency */ @@ -485,7 +485,7 @@ validate_endbeforestart = "Angivet slutdatumet inträffar före angivet start /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "Föreslå tid:"; -"Zoom:" = "Zoom:"; + "Previous slot" = "Föregående tid"; "Next slot" = "Nästa tid"; "Previous hour" = "Föregående timme"; @@ -500,7 +500,7 @@ validate_endbeforestart = "Angivet slutdatumet inträffar före angivet start /* apt list */ "Title" = "Titel"; -"Start" = "Start"; + "End" = "Slut"; "Location" = "Plats"; "(Private Event)" = "(Privat händelse)"; @@ -537,10 +537,10 @@ vtodo_class2 = "(Konfidentiell uppgift)"; "Show tasks" = "Visa uppgifter"; "Links to this Calendar" = "Länkar till denna kalender"; -"Authenticated User Access" = "Authenticated User Access"; + "CalDAV URL" = "CalDAV url"; -"WebDAV ICS URL" = "WebDAV ICS URL"; -"WebDAV XML URL" = "WebDAV XML URL"; + + /* Error messages */ "dayFieldInvalid" = "Ange ett numeriskt värde in dagsfältet större än eller lika med 1."; @@ -550,7 +550,7 @@ vtodo_class2 = "(Konfidentiell uppgift)"; "yearFieldInvalid" = "Ange ett numeriskt värde in årsfältet större än eller lika med 1."; "appointmentFieldInvalid" = "Ange ett numeriskt värde in mötesfältet större än eller lika med 1."; "recurrenceUnsupported" = "Denna upprepningstyp stöds för närvarande inte."; -"Please specify a calendar name." = "Please specify a calendar name."; + "tagNotDefined" = "Du måste ange en etikett om du vill synkronisera kalendern."; "tagAlreadyExists" = "Etiketten du angett är redan associerad till en annan kalender."; "tagHasChanged" = "Om du ändrar etiketten på din kalender, behöver du ladda om datat i din mobiltelefon.\nFortsätta?"; @@ -563,7 +563,7 @@ vtodo_class2 = "(Konfidentiell uppgift)"; "Mark Completed" = "Märk utförd"; "Delete Task" = "Ta bort uppgift"; "Delete Event" = "Ta bort händelse"; -"Copy event to my calendar" = "Copy event to my calendar"; + "Subscribe to a web calendar..." = "Prenumrera på en webbkalender..."; "URL of the Calendar" = "URL till kalendern"; diff --git a/UI/WebServerResources/SchedulerUI.js b/UI/WebServerResources/SchedulerUI.js index 67a51dc4f..f1079d066 100644 --- a/UI/WebServerResources/SchedulerUI.js +++ b/UI/WebServerResources/SchedulerUI.js @@ -2683,7 +2683,7 @@ function appendCalendar(folderName, folderPath) { if (!owner) owner = UserLogin; - //log ("append name: " + folderName + "; path: " + folderPath + "; owner: " + owner); + log ("append name: " + folderName + "; path: " + folderPath + "; owner: " + owner); if ($(folderPath)) showAlertDialog(_("You have already subscribed to that folder!")); diff --git a/UI/WebServerResources/UIxAppointmentEditor.css b/UI/WebServerResources/UIxAppointmentEditor.css index 16ef17b77..54598487a 100644 --- a/UI/WebServerResources/UIxAppointmentEditor.css +++ b/UI/WebServerResources/UIxAppointmentEditor.css @@ -170,5 +170,10 @@ DIV#attendeesMenu .delegated .statusIcon DIV#attendeesMenu .no-partstat .statusIcon { background-position: -60px 0px; } -DIV#attendeesMenu .delegate +DIV#attendeesMenu.fakeTextArea .delegate { padding-left: 16px !important; } + +DIV#attendeesMenu .delegate SPAN +{ float: left; + width: 8px; + border: 1px; } diff --git a/UI/WebServerResources/UIxAttendeesEditor.js b/UI/WebServerResources/UIxAttendeesEditor.js index af7faf682..439af1c95 100644 --- a/UI/WebServerResources/UIxAttendeesEditor.js +++ b/UI/WebServerResources/UIxAttendeesEditor.js @@ -179,7 +179,7 @@ function performSearch(input) { // Perform address completion if (!input.value.blank()) { var urlstr = (UserFolderURL - + "Contacts/allContactSearch?excludeGroups=1&search=" + + "Contacts/allContactSearch?search=" + encodeURIComponent(input.value)); triggerAjaxRequest(urlstr, performSearchCallback, input); } diff --git a/UI/WebServerResources/UIxMailEditor.css b/UI/WebServerResources/UIxMailEditor.css index 50d08752c..fb7458e3a 100644 --- a/UI/WebServerResources/UIxMailEditor.css +++ b/UI/WebServerResources/UIxMailEditor.css @@ -169,3 +169,12 @@ UL#attachments LI IMG TEXTAREA#text { display: none; background: #fff; } + +blockquote[type=cite] { + display: block; + margin: 1em 0px; + -moz-padding-start: 1em; + -moz-border-start: solid; + border-color: blue; + border-width: thin; +} \ No newline at end of file diff --git a/UI/WebServerResources/UIxMailEditor.js b/UI/WebServerResources/UIxMailEditor.js index f207acaad..e9d84d689 100644 --- a/UI/WebServerResources/UIxMailEditor.js +++ b/UI/WebServerResources/UIxMailEditor.js @@ -405,8 +405,7 @@ function initMailEditor() { 'BulletedList', '-', 'Link', 'Unlink', 'Image', 'JustifyLeft','JustifyCenter','JustifyRight', 'JustifyBlock','Font','FontSize','-','TextColor', - 'BGColor','-','SpellChecker'] - ], + 'BGColor','-','SpellChecker']], language : localeCode, scayt_sLang : localeCode } @@ -578,6 +577,8 @@ function onWindowResize(event) { attachmentswidth = attachmentsarea.getWidth(); fromfield = $(document).getElementsByClassName('headerField', headerarea)[0]; var height = headerarea.getHeight() - fromfield.getHeight() - subjectfield.getHeight() - 10; +// var height = headerarea.getHeight() - 20; +// alert ("height = " + height + "px"); if (Prototype.Browser.IE) $("attachments").setStyle({ height: (height - 13) + 'px' }); else From 203af6a7ca8e37f8924fc05921fe6b1c9fdef90e Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Thu, 3 Nov 2011 11:55:37 +0000 Subject: [PATCH 09/38] Bis. Monotone-Parent: a46f694fb88b061ebf1cde5157986657756d6f5c Monotone-Revision: dc7f4b5bfd6f1e20c6244c01ec2af24c5f5baba3 Monotone-Author: flachapelle@inverse.ca Monotone-Date: 2011-11-03T11:55:37 Monotone-Branch: ca.inverse.sogo --- SOPE/NGCards/iCalDailyRecurrenceCalculator.m | 6 - SOPE/NGCards/iCalWeeklyRecurrenceCalculator.m | 2 +- SOPE/NGCards/iCalYearlyRecurrenceCalculator.m | 11 +- .../Localizable.strings | 58 ++-- .../Czech.lproj/Localizable.strings | 25 +- .../Dutch.lproj/Localizable.strings | 63 ++-- .../German.lproj/Localizable.strings | 8 +- .../Hungarian.lproj/Localizable.strings | 57 ++-- .../Italian.lproj/Localizable.strings | 3 +- .../Norwegian.lproj/Localizable.strings | 49 ++-- .../Polish.lproj/Localizable.strings | 1 + .../Russian.lproj/Localizable.strings | 3 +- .../Swedish.lproj/Localizable.strings | 3 +- .../Ukrainian.lproj/Localizable.strings | 1 + .../Welsh.lproj/Localizable.strings | 58 ++-- .../Appointments/iCalEventChanges+SOGo.m | 2 +- SoObjects/SOGo/SOGoSieveManager.m | 1 - Tools/SOGoToolRemove.m | 2 +- Tools/SOGoToolRenameUser.m | 2 +- .../Localizable.strings | 12 +- .../Czech.lproj/Localizable.strings | 12 +- .../Dutch.lproj/Localizable.strings | 12 +- .../French.lproj/Localizable.strings | 4 +- .../German.lproj/Localizable.strings | 2 +- .../Hungarian.lproj/Localizable.strings | 12 +- .../Icelandic.lproj/Localizable.strings | 12 +- .../Italian.lproj/Localizable.strings | 12 +- .../Russian.lproj/Localizable.strings | 2 +- .../Spanish.lproj/Localizable.strings | 2 +- .../Welsh.lproj/Localizable.strings | 12 +- .../Localizable.strings | 37 +-- UI/Common/Czech.lproj/Localizable.strings | 5 +- UI/Common/Dutch.lproj/Localizable.strings | 31 +- UI/Common/French.lproj/Localizable.strings | 6 +- UI/Common/German.lproj/Localizable.strings | 8 +- UI/Common/Hungarian.lproj/Localizable.strings | 37 +-- UI/Common/Icelandic.lproj/Localizable.strings | 2 +- UI/Common/Italian.lproj/Localizable.strings | 12 +- UI/Common/Norwegian.lproj/Localizable.strings | 8 +- UI/Common/Polish.lproj/Localizable.strings | 2 +- UI/Common/Russian.lproj/Localizable.strings | 8 +- UI/Common/Spanish.lproj/Localizable.strings | 2 +- UI/Common/Swedish.lproj/Localizable.strings | 6 +- UI/Common/Welsh.lproj/Localizable.strings | 37 +-- .../Localizable.strings | 20 +- .../Czech.lproj/Localizable.strings | 2 +- .../Dutch.lproj/Localizable.strings | 20 +- .../French.lproj/Localizable.strings | 4 +- .../Hungarian.lproj/Localizable.strings | 20 +- .../Polish.lproj/Localizable.strings | 2 +- .../Russian.lproj/Localizable.strings | 22 +- .../Ukrainian.lproj/Localizable.strings | 4 +- .../Welsh.lproj/Localizable.strings | 22 +- .../Localizable.strings | 53 ++-- UI/MailerUI/Catalan.lproj/Localizable.strings | 27 +- UI/MailerUI/Czech.lproj/Localizable.strings | 27 +- UI/MailerUI/Dutch.lproj/Localizable.strings | 85 +++--- UI/MailerUI/French.lproj/Localizable.strings | 22 +- UI/MailerUI/German.lproj/Localizable.strings | 24 +- .../Hungarian.lproj/Localizable.strings | 41 +-- .../Icelandic.lproj/Localizable.strings | 14 +- UI/MailerUI/Italian.lproj/Localizable.strings | 18 +- .../Norwegian.lproj/Localizable.strings | 14 +- UI/MailerUI/Polish.lproj/Localizable.strings | 27 +- UI/MailerUI/Russian.lproj/Localizable.strings | 40 +-- UI/MailerUI/Spanish.lproj/Localizable.strings | 8 +- UI/MailerUI/Swedish.lproj/Localizable.strings | 6 +- .../Ukrainian.lproj/Localizable.strings | 3 +- UI/MailerUI/Welsh.lproj/Localizable.strings | 65 +++-- .../Localizable.strings | 71 ++--- UI/MainUI/Catalan.lproj/Localizable.strings | 15 +- UI/MainUI/Czech.lproj/Localizable.strings | 17 +- UI/MainUI/Dutch.lproj/Localizable.strings | 71 ++--- UI/MainUI/French.lproj/Localizable.strings | 11 +- UI/MainUI/German.lproj/Localizable.strings | 11 +- UI/MainUI/Hungarian.lproj/Localizable.strings | 69 ++--- UI/MainUI/Icelandic.lproj/Localizable.strings | 44 +-- UI/MainUI/Italian.lproj/Localizable.strings | 15 +- UI/MainUI/Norwegian.lproj/Localizable.strings | 23 +- UI/MainUI/Polish.lproj/Localizable.strings | 11 +- UI/MainUI/Russian.lproj/Localizable.strings | 69 ++--- UI/MainUI/Spanish.lproj/Localizable.strings | 6 +- UI/MainUI/Swedish.lproj/Localizable.strings | 11 +- UI/MainUI/Ukrainian.lproj/Localizable.strings | 6 +- UI/MainUI/Welsh.lproj/Localizable.strings | 71 ++--- .../Localizable.strings | 263 ++++++++--------- .../Hungarian.lproj/Localizable.strings | 251 ++++++++-------- .../Norwegian.lproj/Localizable.strings | 63 ++-- .../Swedish.lproj/Localizable.strings | 63 ++-- .../Ukrainian.lproj/Localizable.strings | 3 + .../Welsh.lproj/Localizable.strings | 276 +++++++++--------- .../Localizable.strings | 163 ++++++----- UI/Scheduler/Czech.lproj/Localizable.strings | 36 +-- UI/Scheduler/Dutch.lproj/Localizable.strings | 179 ++++++------ UI/Scheduler/French.lproj/Localizable.strings | 36 +-- .../Hungarian.lproj/Localizable.strings | 163 ++++++----- .../Icelandic.lproj/Localizable.strings | 72 ++--- .../Italian.lproj/Localizable.strings | 52 ++-- .../Norwegian.lproj/Localizable.strings | 56 ++-- UI/Scheduler/Polish.lproj/Localizable.strings | 44 +-- .../Russian.lproj/Localizable.strings | 46 +-- .../Spanish.lproj/Localizable.strings | 28 +- .../Swedish.lproj/Localizable.strings | 52 ++-- UI/WebServerResources/SchedulerUI.js | 2 +- .../UIxAppointmentEditor.css | 7 +- UI/WebServerResources/UIxAttendeesEditor.js | 2 +- UI/WebServerResources/UIxMailEditor.css | 9 - UI/WebServerResources/UIxMailEditor.js | 5 +- 108 files changed, 1853 insertions(+), 1779 deletions(-) diff --git a/SOPE/NGCards/iCalDailyRecurrenceCalculator.m b/SOPE/NGCards/iCalDailyRecurrenceCalculator.m index e5f0fc1ec..728d0dec2 100644 --- a/SOPE/NGCards/iCalDailyRecurrenceCalculator.m +++ b/SOPE/NGCards/iCalDailyRecurrenceCalculator.m @@ -70,9 +70,6 @@ dayMask = nil; repeatCount = 0; - NSLog(@"*** [iCalDaily] occurrences between %@ and %@", [_r startDate], [_r endDate]); - NSLog(@"*** [iCalDaily] first occurrence starts on %@", firStart); - if ([endDate compare: firStart] == NSOrderedAscending) // Range ends before first occurrence return nil; @@ -106,7 +103,6 @@ if (lastDate != nil) { - NSLog(@"*** [iCalDaily] ends on %@", lastDate); if ([lastDate compare: startDate] == NSOrderedAscending) // Range starts after last occurrence return nil; @@ -165,7 +161,6 @@ currentEndDate = [currentStartDate addTimeInterval: [firstRange duration]]; r = [NGCalendarDateRange calendarDateRangeWithStartDate: currentStartDate endDate: currentEndDate]; - NSLog(@"*** [iCalDaily] Analysing period %i from %@ to %@", i, currentStartDate, currentEndDate); if ([_r containsDateRange: r] || [_r doesIntersectWithDateRange: r]) [ranges addObject: r]; } @@ -182,7 +177,6 @@ i++; } - NSLog(@"*** [iCalDaily] returning %i ranges", [ranges count]); return ranges; } diff --git a/SOPE/NGCards/iCalWeeklyRecurrenceCalculator.m b/SOPE/NGCards/iCalWeeklyRecurrenceCalculator.m index daa4c5234..41ed0dc0f 100644 --- a/SOPE/NGCards/iCalWeeklyRecurrenceCalculator.m +++ b/SOPE/NGCards/iCalWeeklyRecurrenceCalculator.m @@ -186,7 +186,7 @@ currentEndDate = [currentStartDate addTimeInterval: [firstRange duration]]; r = [NGCalendarDateRange calendarDateRangeWithStartDate: currentStartDate endDate: currentEndDate]; - NSLog(@"*** [iCalWeekly] Analysing period %i from %@ to %@", i, currentStartDate, currentEndDate); + if ([_r containsDateRange: r]) [ranges addObject: r]; } diff --git a/SOPE/NGCards/iCalYearlyRecurrenceCalculator.m b/SOPE/NGCards/iCalYearlyRecurrenceCalculator.m index b8cbd6025..e47ae3912 100644 --- a/SOPE/NGCards/iCalYearlyRecurrenceCalculator.m +++ b/SOPE/NGCards/iCalYearlyRecurrenceCalculator.m @@ -60,9 +60,6 @@ count = 0; referenceDate = nil; - NSLog(@"*** [iCalYearly] looking at period from %@ to %@", [_r startDate], [_r endDate]); - NSLog(@"*** [iCalYearly] reference period from %@ to %@", [firstRange startDate], [firstRange endDate]); - if ([rEnd compare: firStart] == NSOrderedAscending) // Range ends before first occurrence return nil; @@ -94,7 +91,7 @@ if ([lastDate compare: rStart] == NSOrderedAscending) // Range starts after last occurrence return nil; - if ([lastDate compare: rEnd] == NSOrderedAscending) + if ([lastDate compare: rEnd] == NSOrderedDescending) // Range ends after last occurence; adjust end date rEnd = lastDate; } @@ -192,12 +189,12 @@ rangesInMonth = [monthlyCalc recurrenceRangesWithinCalendarDateRange: rangeForMonth]; for (k = 0; k < [rangesInMonth count] && (repeatCount == 0 || count < repeatCount); k++) { - NSLog(@"*** [iCalYearly] found %@ - %@ (count = %i)", [[rangesInMonth objectAtIndex: k] startDate], [[rangesInMonth objectAtIndex: k] endDate], count); + //NSLog(@"*** YEARLY found %@ (count = %i)", [[rangesInMonth objectAtIndex: k] startDate], count); count++; if ([_r containsDateRange: [rangesInMonth objectAtIndex: k]]) { [ranges addObject: [rangesInMonth objectAtIndex: k]]; - NSLog(@"*** [iCalYearly] adding %@ (count = %i)", [[rangesInMonth objectAtIndex: k] startDate], count); + //NSLog(@"*** YEARLY adding %@ (count = %i)", [[rangesInMonth objectAtIndex: k] startDate], count); } } } @@ -218,10 +215,8 @@ end = [start addTimeInterval: [firstRange duration]]; r = [NGCalendarDateRange calendarDateRangeWithStartDate: start endDate: end]; - NSLog(@"*** [iCalYearly] possibly %@ - %@ (count = %i)", [r startDate], [r endDate], count); if ([_r containsDateRange: r] && (repeatCount == 0 || count < repeatCount)) { - NSLog(@"*** [iCalYearly] adding %@ (count = %i)", [r startDate], count); [ranges addObject: r]; count++; } diff --git a/SoObjects/Appointments/BrazilianPortuguese.lproj/Localizable.strings b/SoObjects/Appointments/BrazilianPortuguese.lproj/Localizable.strings index 8984e34df..958b2ad85 100644 --- a/SoObjects/Appointments/BrazilianPortuguese.lproj/Localizable.strings +++ b/SoObjects/Appointments/BrazilianPortuguese.lproj/Localizable.strings @@ -8,43 +8,47 @@ vtodo_class1 = "(Tarefa Privada)"; vtodo_class2 = "(Tarefa Confidencial)"; /* Receipts */ +"Title:" = "Title:"; +"Start:" = "Start:"; +"End:" = "End:"; +"Receipt: users invited to a meeting" = "Receipt: users invited to a meeting"; +"You have invited the following attendees(s):" = "You have invited the following attendees(s):"; +"... to attend the following event:" = "... to attend the following event:"; +"Receipt: invitation updated" = "Receipt: invitation updated"; +"The following attendees(s):" = "The following attendees(s):"; +"... have been notified of the changes to the following event:" = "... have been notified of the changes to the following event:"; - - - - - - - - - - - - +"Receipt: attendees removed from an event" = "Receipt: attendees removed from an event"; +"You have removed the following attendees(s):" = "You have removed the following attendees(s):"; +"... from the following event:" = "... from the following event:"; /* IMIP messages */ - - - - - - +"startDate_label" = "Start:"; +"endDate_label" = "End:"; +"due_label" = "Due Date:"; +"location_label" = "Location:"; +"summary_label" = "Summary:"; +"comment_label" = "Comment:"; /* Invitation */ - +"Event Invitation: \"%{Summary}\"" = "Event Invitation: \"%{Summary}\""; "(sent by %{SentBy}) " = "(enviado por %{SentBy}) "; - +"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" = "%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"; /* Deletion */ - - +"Event Cancelled: \"%{Summary}\"" = "Event Cancelled: \"%{Summary}\""; +"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" += "%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"; /* Update */ - - - +"The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed" += "The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed"; +"The following parameters have changed in the \"%{Summary}\" meeting:" += "The following parameters have changed in the \"%{Summary}\" meeting:"; +"Please accept or decline those changes." += "Please accept or decline those changes."; /* Reply */ "Reply to invitation: \"%{Summary}\"" = "Resposta a Evento de Convite: \"%{Summary}\""; @@ -52,8 +56,10 @@ vtodo_class2 = "(Tarefa Confidencial)"; = "%{Attendee} %{SentByText}foi aceitado seu convite ao evento."; "%{Attendee} %{SentByText}has declined your event invitation." = "%{Attendee} %{SentByText}foi declinado seu convite ao evento."; - +"%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}." += "%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}."; "%{Attendee} %{SentByText}has not yet decided upon your event invitation." = "%{Attendee} %{SentByText}foi ainda não decidiu seu convite ao evento."; /* Resources */ +"Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"." = "Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"."; \ No newline at end of file diff --git a/SoObjects/Appointments/Czech.lproj/Localizable.strings b/SoObjects/Appointments/Czech.lproj/Localizable.strings index a97943c57..294efe89b 100644 --- a/SoObjects/Appointments/Czech.lproj/Localizable.strings +++ b/SoObjects/Appointments/Czech.lproj/Localizable.strings @@ -12,25 +12,25 @@ vtodo_class2 = "(Skrytý úkol)"; "Start:" = "Začátek:"; "End:" = "Konec:"; +"Receipt: users invited to a meeting" = "Receipt: users invited to a meeting"; +"You have invited the following attendees(s):" = "You have invited the following attendees(s):"; +"... to attend the following event:" = "... to attend the following event:"; +"Receipt: invitation updated" = "Receipt: invitation updated"; +"The following attendees(s):" = "The following attendees(s):"; +"... have been notified of the changes to the following event:" = "... have been notified of the changes to the following event:"; - - - - - - - - - +"Receipt: attendees removed from an event" = "Receipt: attendees removed from an event"; +"You have removed the following attendees(s):" = "You have removed the following attendees(s):"; +"... from the following event:" = "... from the following event:"; /* IMIP messages */ "startDate_label" = "Začátek:"; "endDate_label" = "Konec:"; - +"due_label" = "Due Date:"; "location_label" = "Místo:"; - - +"summary_label" = "Summary:"; +"comment_label" = "Comment:"; /* Invitation */ "Event Invitation: \"%{Summary}\"" = "Pozvání na událost: \"%{Summary}\""; @@ -62,3 +62,4 @@ vtodo_class2 = "(Skrytý úkol)"; = "%{Attendee} %{SentByText}dosud o Vaší pozvánce k události nerozhodl/a."; /* Resources */ +"Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"." = "Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"."; \ No newline at end of file diff --git a/SoObjects/Appointments/Dutch.lproj/Localizable.strings b/SoObjects/Appointments/Dutch.lproj/Localizable.strings index 008c3f339..f3acf2d5d 100644 --- a/SoObjects/Appointments/Dutch.lproj/Localizable.strings +++ b/SoObjects/Appointments/Dutch.lproj/Localizable.strings @@ -8,43 +8,47 @@ vtodo_class1 = "(Privétaak)"; vtodo_class2 = "(Vertrouwelijke taak)"; /* Receipts */ +"Title:" = "Title:"; +"Start:" = "Start:"; +"End:" = "End:"; +"Receipt: users invited to a meeting" = "Receipt: users invited to a meeting"; +"You have invited the following attendees(s):" = "You have invited the following attendees(s):"; +"... to attend the following event:" = "... to attend the following event:"; +"Receipt: invitation updated" = "Receipt: invitation updated"; +"The following attendees(s):" = "The following attendees(s):"; +"... have been notified of the changes to the following event:" = "... have been notified of the changes to the following event:"; - - - - - - - - - - - - +"Receipt: attendees removed from an event" = "Receipt: attendees removed from an event"; +"You have removed the following attendees(s):" = "You have removed the following attendees(s):"; +"... from the following event:" = "... from the following event:"; /* IMIP messages */ - - - - - - +"startDate_label" = "Start:"; +"endDate_label" = "End:"; +"due_label" = "Due Date:"; +"location_label" = "Location:"; +"summary_label" = "Summary:"; +"comment_label" = "Comment:"; /* Invitation */ - - - +"Event Invitation: \"%{Summary}\"" = "Event Invitation: \"%{Summary}\""; +"(sent by %{SentBy}) " = "(sent by %{SentBy}) "; +"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" = "%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"; /* Deletion */ - - +"Event Cancelled: \"%{Summary}\"" = "Event Cancelled: \"%{Summary}\""; +"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" += "%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"; /* Update */ - - - +"The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed" += "The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed"; +"The following parameters have changed in the \"%{Summary}\" meeting:" += "The following parameters have changed in the \"%{Summary}\" meeting:"; +"Please accept or decline those changes." += "Please accept or decline those changes."; /* Reply */ "Reply to invitation: \"%{Summary}\"" = "Antwoord voor de gebeurtenisuitnodiging: \"%{Summary}\""; @@ -52,7 +56,10 @@ vtodo_class2 = "(Vertrouwelijke taak)"; = "%{Attendee} %{SentByText}heeft uw uitnodiging voor de gebeurtenis geaccepteerd."; "%{Attendee} %{SentByText}has declined your event invitation." = "%{Attendee} %{SentByText}heeft uw uitnodiging voor de gebeurtenis geweigerd."; - - +"%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}." += "%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}."; +"%{Attendee} %{SentByText}has not yet decided upon your event invitation." += "%{Attendee} %{SentByText}has not yet decided upon your event invitation."; /* Resources */ +"Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"." = "Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"."; \ No newline at end of file diff --git a/SoObjects/Appointments/German.lproj/Localizable.strings b/SoObjects/Appointments/German.lproj/Localizable.strings index 82f29535a..f5b5d1840 100644 --- a/SoObjects/Appointments/German.lproj/Localizable.strings +++ b/SoObjects/Appointments/German.lproj/Localizable.strings @@ -9,7 +9,7 @@ vtodo_class2 = "(Vertrauliche Aufgabe)"; /* Receipts */ "Title:" = "Titel:"; - +"Start:" = "Start:"; "End:" = "Ende:"; "Receipt: users invited to a meeting" = "Empfangsbestätigung: Benutzer zu einem Termin eingeladen"; @@ -25,7 +25,7 @@ vtodo_class2 = "(Vertrauliche Aufgabe)"; "... from the following event:" = "... von folgendem Termin:"; /* IMIP messages */ - +"startDate_label" = "Start:"; "endDate_label" = "Ende:"; "due_label" = "Fällig:"; "location_label" = "Ort:"; @@ -61,5 +61,5 @@ vtodo_class2 = "(Vertrauliche Aufgabe)"; "%{Attendee} %{SentByText}has not yet decided upon your event invitation." = "%{Attendee} %{SentByText}hat noch nicht über Ihre Termineinladung entschieden."; -/* Resources */ -"Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"." = "Maximale Zahl simultaner Buchungen (%{NumberOfSimultaneousBookings}) erreicht für Ressource \"%{Cn} %{SystemEmail}\"."; \ No newline at end of file +"Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"." = "Maximale Zahl simultaner Buchungen (%{NumberOfSimultaneousBookings}) erreicht für Ressource \"%{Cn} %{SystemEmail}\"."; + diff --git a/SoObjects/Appointments/Hungarian.lproj/Localizable.strings b/SoObjects/Appointments/Hungarian.lproj/Localizable.strings index 920b00123..6b0bed1b9 100644 --- a/SoObjects/Appointments/Hungarian.lproj/Localizable.strings +++ b/SoObjects/Appointments/Hungarian.lproj/Localizable.strings @@ -8,43 +8,47 @@ vtodo_class1 = "(Magán feladat)"; vtodo_class2 = "(Bizalmas feladat)"; /* Receipts */ +"Title:" = "Title:"; +"Start:" = "Start:"; +"End:" = "End:"; +"Receipt: users invited to a meeting" = "Receipt: users invited to a meeting"; +"You have invited the following attendees(s):" = "You have invited the following attendees(s):"; +"... to attend the following event:" = "... to attend the following event:"; +"Receipt: invitation updated" = "Receipt: invitation updated"; +"The following attendees(s):" = "The following attendees(s):"; +"... have been notified of the changes to the following event:" = "... have been notified of the changes to the following event:"; - - - - - - - - - - - - +"Receipt: attendees removed from an event" = "Receipt: attendees removed from an event"; +"You have removed the following attendees(s):" = "You have removed the following attendees(s):"; +"... from the following event:" = "... from the following event:"; /* IMIP messages */ - - - - - - +"startDate_label" = "Start:"; +"endDate_label" = "End:"; +"due_label" = "Due Date:"; +"location_label" = "Location:"; +"summary_label" = "Summary:"; +"comment_label" = "Comment:"; /* Invitation */ - +"Event Invitation: \"%{Summary}\"" = "Event Invitation: \"%{Summary}\""; "(sent by %{SentBy}) " = "(%{SentBy} által elküldve) "; - +"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" = "%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"; /* Deletion */ - - +"Event Cancelled: \"%{Summary}\"" = "Event Cancelled: \"%{Summary}\""; +"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" += "%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"; /* Update */ - - - +"The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed" += "The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed"; +"The following parameters have changed in the \"%{Summary}\" meeting:" += "The following parameters have changed in the \"%{Summary}\" meeting:"; +"Please accept or decline those changes." += "Please accept or decline those changes."; /* Reply */ "Reply to invitation: \"%{Summary}\"" = "Válasz a meghívásra: %{Summary}"; @@ -52,7 +56,8 @@ vtodo_class2 = "(Bizalmas feladat)"; = "%{Attendee} %{SentByText}elfogadta a meghívását."; "%{Attendee} %{SentByText}has declined your event invitation." = "%{Attendee} %{SentByText}visszautasította a meghívását."; - +"%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}." += "%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}."; "%{Attendee} %{SentByText}has not yet decided upon your event invitation." = "%{Attendee} %{SentByText}még meggondolja a meghívását."; diff --git a/SoObjects/Appointments/Italian.lproj/Localizable.strings b/SoObjects/Appointments/Italian.lproj/Localizable.strings index 6812b9ba0..27dbbfa5d 100644 --- a/SoObjects/Appointments/Italian.lproj/Localizable.strings +++ b/SoObjects/Appointments/Italian.lproj/Localizable.strings @@ -27,7 +27,7 @@ vtodo_class2 = "(Attività confidenziale)"; /* IMIP messages */ "startDate_label" = "Inizio:"; "endDate_label" = "Fine:"; - +"due_label" = "Due Date:"; "location_label" = "Luogo:"; "summary_label" = "Summario:"; "comment_label" = "Commento:"; @@ -62,3 +62,4 @@ vtodo_class2 = "(Attività confidenziale)"; = "%{Attendee} %{SentByText}non ha ancora deciso riguardo il tuo invito all'evento."; /* Resources */ +"Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"." = "Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"."; \ No newline at end of file diff --git a/SoObjects/Appointments/Norwegian.lproj/Localizable.strings b/SoObjects/Appointments/Norwegian.lproj/Localizable.strings index d79267671..aee20395d 100644 --- a/SoObjects/Appointments/Norwegian.lproj/Localizable.strings +++ b/SoObjects/Appointments/Norwegian.lproj/Localizable.strings @@ -9,7 +9,7 @@ vtodo_class2 = "(Konfidensiell oppgave)"; /* Receipts */ "Title:" = "Tittel:"; - +"Start:" = "Start:"; "End:" = "Slutt:"; "Receipt: users invited to a meeting" = "Kvittering: brukere invitert til et møte"; @@ -25,32 +25,41 @@ vtodo_class2 = "(Konfidensiell oppgave)"; "... from the following event:" = "... fra følgende hendelse:"; /* IMIP messages */ - - - - - - +"startDate_label" = "Start:"; +"endDate_label" = "End:"; +"due_label" = "Due Date:"; +"location_label" = "Location:"; +"summary_label" = "Summary:"; +"comment_label" = "Comment:"; /* Invitation */ - - - +"Event Invitation: \"%{Summary}\"" = "Event Invitation: \"%{Summary}\""; +"(sent by %{SentBy}) " = "(sent by %{SentBy}) "; +"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" = "%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"; /* Deletion */ - - +"Event Cancelled: \"%{Summary}\"" = "Event Cancelled: \"%{Summary}\""; +"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" += "%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"; /* Update */ - - - +"The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed" += "The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed"; +"The following parameters have changed in the \"%{Summary}\" meeting:" += "The following parameters have changed in the \"%{Summary}\" meeting:"; +"Please accept or decline those changes." += "Please accept or decline those changes."; /* Reply */ - - - - - +"Reply to invitation: \"%{Summary}\"" = "Reply to invitation: \"%{Summary}\""; +"%{Attendee} %{SentByText}has accepted your event invitation." += "%{Attendee} %{SentByText}has accepted your event invitation."; +"%{Attendee} %{SentByText}has declined your event invitation." += "%{Attendee} %{SentByText}has declined your event invitation."; +"%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}." += "%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}."; +"%{Attendee} %{SentByText}has not yet decided upon your event invitation." += "%{Attendee} %{SentByText}has not yet decided upon your event invitation."; /* Resources */ +"Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"." = "Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"."; \ No newline at end of file diff --git a/SoObjects/Appointments/Polish.lproj/Localizable.strings b/SoObjects/Appointments/Polish.lproj/Localizable.strings index c03b8dcee..3e078d6f7 100644 --- a/SoObjects/Appointments/Polish.lproj/Localizable.strings +++ b/SoObjects/Appointments/Polish.lproj/Localizable.strings @@ -62,3 +62,4 @@ vtodo_class2 = "(Zadanie poufne)"; = "%{Attendee} %{SentByText}jeszcze nie zdecydował(a) o obecności na twoim wydarzeniu."; /* Resources */ +"Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"." = "Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"."; \ No newline at end of file diff --git a/SoObjects/Appointments/Russian.lproj/Localizable.strings b/SoObjects/Appointments/Russian.lproj/Localizable.strings index 9176f2c68..ad80889c8 100644 --- a/SoObjects/Appointments/Russian.lproj/Localizable.strings +++ b/SoObjects/Appointments/Russian.lproj/Localizable.strings @@ -56,7 +56,8 @@ vtodo_class2 = "(Конфиденциальная задача)"; = "%{Attendee} %{SentByText}согласился участвовать в запланированном мероприятии."; "%{Attendee} %{SentByText}has declined your event invitation." = "%{Attendee} %{SentByText}отказался участвовать в запланированном мероприятии."; - +"%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}." += "%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}."; "%{Attendee} %{SentByText}has not yet decided upon your event invitation." = "%{Attendee} %{SentByText}не определился с желанием участвовать в запланированном мероприятии."; diff --git a/SoObjects/Appointments/Swedish.lproj/Localizable.strings b/SoObjects/Appointments/Swedish.lproj/Localizable.strings index 956b76140..69d46ce56 100644 --- a/SoObjects/Appointments/Swedish.lproj/Localizable.strings +++ b/SoObjects/Appointments/Swedish.lproj/Localizable.strings @@ -9,7 +9,7 @@ vtodo_class2 = "(Konfidentiell uppgift)"; /* Receipts */ "Title:" = "Titel:"; - +"Start:" = "Start:"; "End:" = "Slut:"; "Receipt: users invited to a meeting" = "Kvitto: användare inbjudna till ett möte"; @@ -62,3 +62,4 @@ vtodo_class2 = "(Konfidentiell uppgift)"; = "%{Attendee} %{SentByText}har inte än bestämt sig om din mötesinbjudan."; /* Resources */ +"Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"." = "Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"."; \ No newline at end of file diff --git a/SoObjects/Appointments/Ukrainian.lproj/Localizable.strings b/SoObjects/Appointments/Ukrainian.lproj/Localizable.strings index af7b36f2f..7fe4ca8ba 100644 --- a/SoObjects/Appointments/Ukrainian.lproj/Localizable.strings +++ b/SoObjects/Appointments/Ukrainian.lproj/Localizable.strings @@ -62,3 +62,4 @@ vtodo_class2 = "(Конфіденційне завдання)"; = "%{Attendee} %{SentByText} поки не визначився з участю в події."; /* Resources */ +"Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"." = "Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"."; \ No newline at end of file diff --git a/SoObjects/Appointments/Welsh.lproj/Localizable.strings b/SoObjects/Appointments/Welsh.lproj/Localizable.strings index 6652561c9..2acbea8c1 100644 --- a/SoObjects/Appointments/Welsh.lproj/Localizable.strings +++ b/SoObjects/Appointments/Welsh.lproj/Localizable.strings @@ -8,43 +8,47 @@ vtodo_class1 = "(Tasg breifat)"; vtodo_class2 = "(Tasg gyfrinachol)"; /* Receipts */ +"Title:" = "Title:"; +"Start:" = "Start:"; +"End:" = "End:"; +"Receipt: users invited to a meeting" = "Receipt: users invited to a meeting"; +"You have invited the following attendees(s):" = "You have invited the following attendees(s):"; +"... to attend the following event:" = "... to attend the following event:"; +"Receipt: invitation updated" = "Receipt: invitation updated"; +"The following attendees(s):" = "The following attendees(s):"; +"... have been notified of the changes to the following event:" = "... have been notified of the changes to the following event:"; - - - - - - - - - - - - +"Receipt: attendees removed from an event" = "Receipt: attendees removed from an event"; +"You have removed the following attendees(s):" = "You have removed the following attendees(s):"; +"... from the following event:" = "... from the following event:"; /* IMIP messages */ - - - - - - +"startDate_label" = "Start:"; +"endDate_label" = "End:"; +"due_label" = "Due Date:"; +"location_label" = "Location:"; +"summary_label" = "Summary:"; +"comment_label" = "Comment:"; /* Invitation */ - +"Event Invitation: \"%{Summary}\"" = "Event Invitation: \"%{Summary}\""; "(sent by %{SentBy}) " = "(anfon gan %{SentBy}) "; - +"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" = "%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"; /* Deletion */ - - +"Event Cancelled: \"%{Summary}\"" = "Event Cancelled: \"%{Summary}\""; +"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" += "%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"; /* Update */ - - - +"The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed" += "The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed"; +"The following parameters have changed in the \"%{Summary}\" meeting:" += "The following parameters have changed in the \"%{Summary}\" meeting:"; +"Please accept or decline those changes." += "Please accept or decline those changes."; /* Reply */ "Reply to invitation: \"%{Summary}\"" = "Ymateb i wahoddiad: %{Summary}"; @@ -52,8 +56,10 @@ vtodo_class2 = "(Tasg gyfrinachol)"; = "%{Attendee} %{SentByText}wedi derbyn."; "%{Attendee} %{SentByText}has declined your event invitation." = "%{Attendee} %{SentByText}wedi gwrthod."; - +"%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}." += "%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}."; "%{Attendee} %{SentByText}has not yet decided upon your event invitation." = "%{Attendee} %{SentByText}heb benderfynu ar eich gwahoddiad eto."; /* Resources */ +"Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"." = "Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\"."; \ No newline at end of file diff --git a/SoObjects/Appointments/iCalEventChanges+SOGo.m b/SoObjects/Appointments/iCalEventChanges+SOGo.m index 70a0a32a4..5e5c3d383 100644 --- a/SoObjects/Appointments/iCalEventChanges+SOGo.m +++ b/SoObjects/Appointments/iCalEventChanges+SOGo.m @@ -32,7 +32,7 @@ { static NSString *properties[] = {@"organizer", @"startDate", @"endDate", @"due", @"duration", - @"rdate", @"rrule", @"exrule", + @"rdate", @"rrule", @"exdate", @"exrule", @"status", @"location", nil}; NSString **currentProperty; diff --git a/SoObjects/SOGo/SOGoSieveManager.m b/SoObjects/SOGo/SOGoSieveManager.m index cb66c4b1b..62c91f980 100644 --- a/SoObjects/SOGo/SOGoSieveManager.m +++ b/SoObjects/SOGo/SOGoSieveManager.m @@ -837,7 +837,6 @@ static NSString *sieveScriptName = @"sogo"; } } - [client closeConnection]; return YES; } diff --git a/Tools/SOGoToolRemove.m b/Tools/SOGoToolRemove.m index 155803302..77af43cf2 100644 --- a/Tools/SOGoToolRemove.m +++ b/Tools/SOGoToolRemove.m @@ -75,7 +75,7 @@ static NSURL *tableURL = nil; - (void) usage { - fprintf (stderr, "remove [] ...\n\n" + fprintf (stderr, "remove user1 [user2] ...\n\n" " user the user of whom to remove the data\n"); } diff --git a/Tools/SOGoToolRenameUser.m b/Tools/SOGoToolRenameUser.m index 9d6a22497..860f98e0f 100644 --- a/Tools/SOGoToolRenameUser.m +++ b/Tools/SOGoToolRenameUser.m @@ -83,7 +83,7 @@ - (void) usage { - fprintf (stderr, "rename-user \n\n" + fprintf (stderr, "rename-user fromuserid touserid\n\n" " fromuserid the previous user id\n" " touserid the new user id\n\n" "Example: sogo-tool rename-user jane_doe janedoe\n"); diff --git a/UI/AdministrationUI/BrazilianPortuguese.lproj/Localizable.strings b/UI/AdministrationUI/BrazilianPortuguese.lproj/Localizable.strings index 99a84f981..8ec0f3b71 100644 --- a/UI/AdministrationUI/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/AdministrationUI/BrazilianPortuguese.lproj/Localizable.strings @@ -1,15 +1,15 @@ /* this file is in UTF-8 format! */ +"Help" = "Help"; +"Close" = "Close"; - - - +"Modules" = "Modules"; /* Modules short names */ - +"ACLs" = "ACLs"; /* Modules titles */ - +"ACLs_title" = "Users folders ACLs management"; /* Modules descriptions */ - +"ACLs_description" = "

The Access Control Lists administration module allows to change the ACLs of each user's Calendars and Address books.

To modify the ACLs of a user's folder, type the name of the user in the search field at the top of the window and double-click on the desired folder.

"; diff --git a/UI/AdministrationUI/Czech.lproj/Localizable.strings b/UI/AdministrationUI/Czech.lproj/Localizable.strings index 99a84f981..8ec0f3b71 100644 --- a/UI/AdministrationUI/Czech.lproj/Localizable.strings +++ b/UI/AdministrationUI/Czech.lproj/Localizable.strings @@ -1,15 +1,15 @@ /* this file is in UTF-8 format! */ +"Help" = "Help"; +"Close" = "Close"; - - - +"Modules" = "Modules"; /* Modules short names */ - +"ACLs" = "ACLs"; /* Modules titles */ - +"ACLs_title" = "Users folders ACLs management"; /* Modules descriptions */ - +"ACLs_description" = "

The Access Control Lists administration module allows to change the ACLs of each user's Calendars and Address books.

To modify the ACLs of a user's folder, type the name of the user in the search field at the top of the window and double-click on the desired folder.

"; diff --git a/UI/AdministrationUI/Dutch.lproj/Localizable.strings b/UI/AdministrationUI/Dutch.lproj/Localizable.strings index 99a84f981..8ec0f3b71 100644 --- a/UI/AdministrationUI/Dutch.lproj/Localizable.strings +++ b/UI/AdministrationUI/Dutch.lproj/Localizable.strings @@ -1,15 +1,15 @@ /* this file is in UTF-8 format! */ +"Help" = "Help"; +"Close" = "Close"; - - - +"Modules" = "Modules"; /* Modules short names */ - +"ACLs" = "ACLs"; /* Modules titles */ - +"ACLs_title" = "Users folders ACLs management"; /* Modules descriptions */ - +"ACLs_description" = "

The Access Control Lists administration module allows to change the ACLs of each user's Calendars and Address books.

To modify the ACLs of a user's folder, type the name of the user in the search field at the top of the window and double-click on the desired folder.

"; diff --git a/UI/AdministrationUI/French.lproj/Localizable.strings b/UI/AdministrationUI/French.lproj/Localizable.strings index 701538dc6..e22974946 100644 --- a/UI/AdministrationUI/French.lproj/Localizable.strings +++ b/UI/AdministrationUI/French.lproj/Localizable.strings @@ -3,10 +3,10 @@ "Help" = "Aide"; "Close" = "Fermer"; - +"Modules" = "Modules"; /* Modules short names */ - +"ACLs" = "ACLs"; /* Modules titles */ "ACLs_title" = "Gestion des droits d'accès pour les dossiers utilisateurs"; diff --git a/UI/AdministrationUI/German.lproj/Localizable.strings b/UI/AdministrationUI/German.lproj/Localizable.strings index e0ddbe786..1b1f2ba0a 100644 --- a/UI/AdministrationUI/German.lproj/Localizable.strings +++ b/UI/AdministrationUI/German.lproj/Localizable.strings @@ -6,7 +6,7 @@ "Modules" = "Module"; /* Modules short names */ - +"ACLs" = "ACLs"; /* Modules titles */ "ACLs_title" = "Benutzerordner ACL-Management"; diff --git a/UI/AdministrationUI/Hungarian.lproj/Localizable.strings b/UI/AdministrationUI/Hungarian.lproj/Localizable.strings index 99a84f981..8ec0f3b71 100644 --- a/UI/AdministrationUI/Hungarian.lproj/Localizable.strings +++ b/UI/AdministrationUI/Hungarian.lproj/Localizable.strings @@ -1,15 +1,15 @@ /* this file is in UTF-8 format! */ +"Help" = "Help"; +"Close" = "Close"; - - - +"Modules" = "Modules"; /* Modules short names */ - +"ACLs" = "ACLs"; /* Modules titles */ - +"ACLs_title" = "Users folders ACLs management"; /* Modules descriptions */ - +"ACLs_description" = "

The Access Control Lists administration module allows to change the ACLs of each user's Calendars and Address books.

To modify the ACLs of a user's folder, type the name of the user in the search field at the top of the window and double-click on the desired folder.

"; diff --git a/UI/AdministrationUI/Icelandic.lproj/Localizable.strings b/UI/AdministrationUI/Icelandic.lproj/Localizable.strings index 99a84f981..8ec0f3b71 100644 --- a/UI/AdministrationUI/Icelandic.lproj/Localizable.strings +++ b/UI/AdministrationUI/Icelandic.lproj/Localizable.strings @@ -1,15 +1,15 @@ /* this file is in UTF-8 format! */ +"Help" = "Help"; +"Close" = "Close"; - - - +"Modules" = "Modules"; /* Modules short names */ - +"ACLs" = "ACLs"; /* Modules titles */ - +"ACLs_title" = "Users folders ACLs management"; /* Modules descriptions */ - +"ACLs_description" = "

The Access Control Lists administration module allows to change the ACLs of each user's Calendars and Address books.

To modify the ACLs of a user's folder, type the name of the user in the search field at the top of the window and double-click on the desired folder.

"; diff --git a/UI/AdministrationUI/Italian.lproj/Localizable.strings b/UI/AdministrationUI/Italian.lproj/Localizable.strings index 99a84f981..8ec0f3b71 100644 --- a/UI/AdministrationUI/Italian.lproj/Localizable.strings +++ b/UI/AdministrationUI/Italian.lproj/Localizable.strings @@ -1,15 +1,15 @@ /* this file is in UTF-8 format! */ +"Help" = "Help"; +"Close" = "Close"; - - - +"Modules" = "Modules"; /* Modules short names */ - +"ACLs" = "ACLs"; /* Modules titles */ - +"ACLs_title" = "Users folders ACLs management"; /* Modules descriptions */ - +"ACLs_description" = "

The Access Control Lists administration module allows to change the ACLs of each user's Calendars and Address books.

To modify the ACLs of a user's folder, type the name of the user in the search field at the top of the window and double-click on the desired folder.

"; diff --git a/UI/AdministrationUI/Russian.lproj/Localizable.strings b/UI/AdministrationUI/Russian.lproj/Localizable.strings index d264e5c1d..aa983f838 100644 --- a/UI/AdministrationUI/Russian.lproj/Localizable.strings +++ b/UI/AdministrationUI/Russian.lproj/Localizable.strings @@ -12,4 +12,4 @@ "ACLs_title" = "Управление списками доступа к пользовательским папкам (ACL)"; /* Modules descriptions */ - +"ACLs_description" = "

The Access Control Lists administration module allows to change the ACLs of each user's Calendars and Address books.

To modify the ACLs of a user's folder, type the name of the user in the search field at the top of the window and double-click on the desired folder.

"; diff --git a/UI/AdministrationUI/Spanish.lproj/Localizable.strings b/UI/AdministrationUI/Spanish.lproj/Localizable.strings index 8759f6868..e9201e884 100644 --- a/UI/AdministrationUI/Spanish.lproj/Localizable.strings +++ b/UI/AdministrationUI/Spanish.lproj/Localizable.strings @@ -6,7 +6,7 @@ "Modules" = "Módulos"; /* Modules short names */ - +"ACLs" = "ACLs"; /* Modules titles */ "ACLs_title" = "Gestión de ALCs para carpetas de usuarios"; diff --git a/UI/AdministrationUI/Welsh.lproj/Localizable.strings b/UI/AdministrationUI/Welsh.lproj/Localizable.strings index 99a84f981..8ec0f3b71 100644 --- a/UI/AdministrationUI/Welsh.lproj/Localizable.strings +++ b/UI/AdministrationUI/Welsh.lproj/Localizable.strings @@ -1,15 +1,15 @@ /* this file is in UTF-8 format! */ +"Help" = "Help"; +"Close" = "Close"; - - - +"Modules" = "Modules"; /* Modules short names */ - +"ACLs" = "ACLs"; /* Modules titles */ - +"ACLs_title" = "Users folders ACLs management"; /* Modules descriptions */ - +"ACLs_description" = "

The Access Control Lists administration module allows to change the ACLs of each user's Calendars and Address books.

To modify the ACLs of a user's folder, type the name of the user in the search field at the top of the window and double-click on the desired folder.

"; diff --git a/UI/Common/BrazilianPortuguese.lproj/Localizable.strings b/UI/Common/BrazilianPortuguese.lproj/Localizable.strings index f80ebaf0e..0def588e2 100644 --- a/UI/Common/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/Common/BrazilianPortuguese.lproj/Localizable.strings @@ -10,10 +10,10 @@ "Address Book" = "Catálogo"; "Mail" = "Correio"; "Preferences" = "Preferências"; - +"Administration" = "Administration"; "Disconnect" = "Desconectar"; "Right Administration" = "Administração de Direitos"; - +"Log Console (dev.)" = "Log Console (dev.)"; "User" = "Usuário"; @@ -22,18 +22,18 @@ "noJavascriptError" = "SOGo requer Javascript para rodar. Por favor, certifique-se que a opção está disponível e habilitada nas preferências de seu navegador."; "noJavascriptRetry" = "Repetir"; - +"Owner:" = "Owner:"; "Publish the Free/Busy information" = "Divulgar a informação Livre/Ocupado"; "Add..." = "Adicionar..."; "Remove" = "Remover"; +"Subscribe User" = "Subscribe User"; - - - - - +"Any Authenticated User" = "Any Authenticated User"; +"Public Access" = "Public Access"; +"Any user not listed above" = "Any user not listed above"; +"Anybody accessing this resource from the public area" = "Anybody accessing this resource from the public area"; "Sorry, the user rights can not be configured for that object." = "Desculpe, os direitos de usuário não podem ser modificados para este objeto."; @@ -51,24 +51,25 @@ = "Você já se inscreveu nesta pasta!"; "The user rights cannot be edited for this object!" = "Os direitos do usuário não podem ser editados para este objeto!"; - - - +"A folder by that name already exists." = "A folder by that name already exists."; +"You cannot create a list in a shared address book." + = "You cannot create a list in a shared address book."; +"Warning" = "Warning"; "You are not allowed to access this module or this system. Please contact your system administrator." = "Você não está liberado para acessar este módulo ou este sistema. Por favor, contate seu administrador de sistemas."; "You don't have the required privileges to perform the operation." = "Você não tem os privilégios requeridos para realizar esta operação."; - - - - +"noEmailForDelegation" = "You must specify the address to which you want to delegate your invitation."; +"delegate is organizer" = "The delegate is the organizer. Please specify a different delegate."; +"delegate is a participant" = "The delegate is already a participant."; +"delegate is a group" = "The specified address corresponds to a group. You can only delegate to a unique person."; /* common buttons */ - - - +"OK" = "OK"; +"Cancel" = "Cancel"; +"Yes" = "Yes"; "No" = "No"; /* alarms */ diff --git a/UI/Common/Czech.lproj/Localizable.strings b/UI/Common/Czech.lproj/Localizable.strings index 6dfd5f878..95f5cb264 100644 --- a/UI/Common/Czech.lproj/Localizable.strings +++ b/UI/Common/Czech.lproj/Localizable.strings @@ -52,7 +52,8 @@ "The user rights cannot be edited for this object!" = "Uživatelská práva pro tento objekt nemohou být upravena!"; "A folder by that name already exists." = "Složka tohoto jména již existuje."; - +"You cannot create a list in a shared address book." + = "You cannot create a list in a shared address book."; "Warning" = "Upozornění"; "You are not allowed to access this module or this system. Please contact your system administrator." @@ -66,7 +67,7 @@ "delegate is a group" = "Určená adresa odpovídá skupině. Delegovat můžete pouze na osobu."; /* common buttons */ - +"OK" = "OK"; "Cancel" = "Storno"; "Yes" = "Ano"; "No" = "Ne"; diff --git a/UI/Common/Dutch.lproj/Localizable.strings b/UI/Common/Dutch.lproj/Localizable.strings index 2c86faf48..5946a1039 100644 --- a/UI/Common/Dutch.lproj/Localizable.strings +++ b/UI/Common/Dutch.lproj/Localizable.strings @@ -10,14 +10,14 @@ "Address Book" = "Adresboek"; "Mail" = "E-mail"; "Preferences" = "Instellingen"; - +"Administration" = "Administration"; "Disconnect" = "Uitloggen"; "Right Administration" = "Machtigingen beheren"; "Log Console (dev.)" = " (dev.)"; "User" = "Gebruiker"; - +"Help" = "Help"; "noJavascriptError" = "SOGo heeft Javascript nodig om te functioneren. U dient Javascript in uw browser in te schakelen."; "noJavascriptRetry" = "Opnieuw proberen"; @@ -30,10 +30,10 @@ "Subscribe User" = "Gebruiker abonneren"; - - - - +"Any Authenticated User" = "Any Authenticated User"; +"Public Access" = "Public Access"; +"Any user not listed above" = "Any user not listed above"; +"Anybody accessing this resource from the public area" = "Anybody accessing this resource from the public area"; "Sorry, the user rights can not be configured for that object." = "De machtigingen kunnen niet worden ingesteld voor dit object."; @@ -51,23 +51,24 @@ = "U bent al op deze map geabonneerd!"; "The user rights cannot be edited for this object!" = "De machtigingen kunnen niet worden aangepast voor dit object!"; - - - +"A folder by that name already exists." = "A folder by that name already exists."; +"You cannot create a list in a shared address book." + = "You cannot create a list in a shared address book."; +"Warning" = "Warning"; "You are not allowed to access this module or this system. Please contact your system administrator." = "U hebt geen toegang tot deze module of dit systeem. Neem contact op met uw systeem beheerder."; "You don't have the required privileges to perform the operation." = "Voor deze actie heeft u niet de benodigde rechten."; - - - - +"noEmailForDelegation" = "You must specify the address to which you want to delegate your invitation."; +"delegate is organizer" = "The delegate is the organizer. Please specify a different delegate."; +"delegate is a participant" = "The delegate is already a participant."; +"delegate is a group" = "The specified address corresponds to a group. You can only delegate to a unique person."; /* common buttons */ - - +"OK" = "OK"; +"Cancel" = "Cancel"; "Yes" = "Ja"; "No" = "Nee"; diff --git a/UI/Common/French.lproj/Localizable.strings b/UI/Common/French.lproj/Localizable.strings index 7779e387f..50dacb305 100644 --- a/UI/Common/French.lproj/Localizable.strings +++ b/UI/Common/French.lproj/Localizable.strings @@ -10,7 +10,7 @@ "Address Book" = "Carnet d'adresses"; "Mail" = "Courrier"; "Preferences" = "Préférences"; - +"Administration" = "Administration"; "Disconnect" = "Quitter"; "Right Administration" = "Partage"; "Log Console (dev.)" = "Journal (dév.)"; @@ -35,7 +35,7 @@ "Any user not listed above" = "Tout utilisateur du système non-listé ci-dessus"; "Anybody accessing this resource from the public area" = "Quiconque accède à cette ressource via l'espace public"; - +"Sorry, the user rights can not be configured for that object." = "Sorry, the user rights can not be configured for that object."; /* generic.js */ "Unable to subscribe to that folder!" @@ -67,7 +67,7 @@ "delegate is a group" = "L'adresse spécifiée correspond à un groupe. Vous ne pouvez déléguer qu'à une personne."; /* common buttons */ - +"OK" = "OK"; "Cancel" = "Annuler"; "Yes" = "Oui"; "No" = "Non"; diff --git a/UI/Common/German.lproj/Localizable.strings b/UI/Common/German.lproj/Localizable.strings index 039d617f5..31f5128de 100644 --- a/UI/Common/German.lproj/Localizable.strings +++ b/UI/Common/German.lproj/Localizable.strings @@ -8,9 +8,9 @@ "Home" = "Start"; "Calendar" = "Kalender"; "Address Book" = "Adressbuch"; - +"Mail" = "Mail"; "Preferences" = "Einstellungen"; - +"Administration" = "Administration"; "Disconnect" = "Beenden"; "Right Administration" = "Rechte Administration"; "Log Console (dev.)" = "Journal (dev.)"; @@ -54,7 +54,7 @@ "A folder by that name already exists." = "Ein Ordner mit diesem Namen existiert bereits."; "You cannot create a list in a shared address book." = "Es ist nicht möglich, eine Liste in einem gemeinsamen Adressbuch zu erstellen."; - +"Warning" = "Warning"; "You are not allowed to access this module or this system. Please contact your system administrator." = "Sie sind nicht berechtigt auf dieses Modul oder System zuzugreifen. Bitte kontaktieren Sie ihren Systemadministrator."; @@ -67,7 +67,7 @@ "delegate is a group" = "Die angegebene Adresse gehört einer Gruppe. Es kann nur zu einer einzelnen Person delegiert werden."; /* common buttons */ - +"OK" = "OK"; "Cancel" = "Abbrechen"; "Yes" = "Ja"; "No" = "Nein"; diff --git a/UI/Common/Hungarian.lproj/Localizable.strings b/UI/Common/Hungarian.lproj/Localizable.strings index 325a1d104..4f48b090b 100644 --- a/UI/Common/Hungarian.lproj/Localizable.strings +++ b/UI/Common/Hungarian.lproj/Localizable.strings @@ -10,10 +10,10 @@ "Address Book" = "Címjegyzék"; "Mail" = "Üzenetek"; "Preferences" = "Beállítások"; - +"Administration" = "Administration"; "Disconnect" = "Kilépés"; "Right Administration" = "Jogosultság szerkesztése"; - +"Log Console (dev.)" = "Log Console (dev.)"; "User" = "Felhasználó"; @@ -22,18 +22,18 @@ "noJavascriptError" = "A SOGo-nak Javascript futtatási környezetre van szüksége. Kérem győződjön meg, hogy böngészője támogatja-e, illetve be van-e kapcsolva ez az opció."; "noJavascriptRetry" = "Újra"; - +"Owner:" = "Owner:"; "Publish the Free/Busy information" = "Foglaltsági információ nyilvánossá tétele"; "Add..." = "Hozzáadás..."; "Remove" = "Törlés"; +"Subscribe User" = "Subscribe User"; - - - - - +"Any Authenticated User" = "Any Authenticated User"; +"Public Access" = "Public Access"; +"Any user not listed above" = "Any user not listed above"; +"Anybody accessing this resource from the public area" = "Anybody accessing this resource from the public area"; "Sorry, the user rights can not be configured for that object." = "Sajnálom, erre az objektumra nem állíthatók be felhasználói jogosultságok."; @@ -51,24 +51,25 @@ = "Erre a mappára már feliratkozott!"; "The user rights cannot be edited for this object!" = "Ezen az objektumon nem szerkeszthetőek a felhasználói jogosultságok!"; - - - +"A folder by that name already exists." = "A folder by that name already exists."; +"You cannot create a list in a shared address book." + = "You cannot create a list in a shared address book."; +"Warning" = "Warning"; "You are not allowed to access this module or this system. Please contact your system administrator." = "Önnek nem engedélyezett a hozzáférés ehhez a modulhoz vagy rendszerhez. Kérem lépjen kapcsolatba a rendszergazdával."; "You don't have the required privileges to perform the operation." = "Önnek nincs jogosultsága ehhez a művelethez."; - - - - +"noEmailForDelegation" = "You must specify the address to which you want to delegate your invitation."; +"delegate is organizer" = "The delegate is the organizer. Please specify a different delegate."; +"delegate is a participant" = "The delegate is already a participant."; +"delegate is a group" = "The specified address corresponds to a group. You can only delegate to a unique person."; /* common buttons */ - - - +"OK" = "OK"; +"Cancel" = "Cancel"; +"Yes" = "Yes"; "No" = "No"; /* alarms */ diff --git a/UI/Common/Icelandic.lproj/Localizable.strings b/UI/Common/Icelandic.lproj/Localizable.strings index afce36c45..77d5f632f 100644 --- a/UI/Common/Icelandic.lproj/Localizable.strings +++ b/UI/Common/Icelandic.lproj/Localizable.strings @@ -13,7 +13,7 @@ "Administration" = "Umsjón"; "Disconnect" = "Aftengjast"; "Right Administration" = "Umsjón réttinda"; - +"Log Console (dev.)" = "Log Console (dev.)"; "User" = "Notandi"; diff --git a/UI/Common/Italian.lproj/Localizable.strings b/UI/Common/Italian.lproj/Localizable.strings index 168ce7216..a1a9320b8 100644 --- a/UI/Common/Italian.lproj/Localizable.strings +++ b/UI/Common/Italian.lproj/Localizable.strings @@ -5,7 +5,7 @@ "Close" = "Chiudi"; "Edit User Rights" = "Modifica permessi"; - +"Home" = "Home"; "Calendar" = "Calendario"; "Address Book" = "Rubrica"; "Mail" = "Posta"; @@ -13,7 +13,7 @@ "Administration" = "Amministrazione"; "Disconnect" = "Disconnetti"; "Right Administration" = "Amministrazione permessi"; - +"Log Console (dev.)" = "Log Console (dev.)"; "User" = "Utente"; @@ -54,7 +54,7 @@ "A folder by that name already exists." = "Esiste già una cartella con questo nome."; "You cannot create a list in a shared address book." = "Non puoi creare una lista in una rubrica in sola lettura."; - +"Warning" = "Warning"; "You are not allowed to access this module or this system. Please contact your system administrator." = "Non sei abilitato ad accedere a questo modulo. Contatta il tuo amministratore di sistema."; @@ -67,9 +67,9 @@ "delegate is a group" = "L'indirizzo specifico corrisponde ad un gruppo, puoi delegare solo una persona."; /* common buttons */ - - - +"OK" = "OK"; +"Cancel" = "Cancel"; +"Yes" = "Yes"; "No" = "No"; /* alarms */ diff --git a/UI/Common/Norwegian.lproj/Localizable.strings b/UI/Common/Norwegian.lproj/Localizable.strings index 0c895ae66..6d83d29cf 100644 --- a/UI/Common/Norwegian.lproj/Localizable.strings +++ b/UI/Common/Norwegian.lproj/Localizable.strings @@ -63,17 +63,17 @@ "noEmailForDelegation" = "Du må angi adressen til personen du delegerer din invitasjon."; "delegate is organizer" = "Personen du delegerer til er arrangør. Vennligst deleger til en annen person."; - - +"delegate is a participant" = "The delegate is already a participant."; +"delegate is a group" = "The specified address corresponds to a group. You can only delegate to a unique person."; /* common buttons */ - +"OK" = "OK"; "Cancel" = "Avbryt"; "Yes" = "Ja"; "No" = "Nei"; /* alarms */ "Reminder:" = "Påminnelse:"; - +"Start:" = "Start:"; "Due Date:" = "Forfallsdato:"; "Location:" = "Lokasjon:"; diff --git a/UI/Common/Polish.lproj/Localizable.strings b/UI/Common/Polish.lproj/Localizable.strings index 7a1f16756..f0960082a 100644 --- a/UI/Common/Polish.lproj/Localizable.strings +++ b/UI/Common/Polish.lproj/Localizable.strings @@ -67,7 +67,7 @@ "delegate is a group" = "Wskazany adres jest grupą. Możesz oddelegować tylko pojedynczną osobę."; /* common buttons */ - +"OK" = "OK"; "Cancel" = "Anuluj"; "Yes" = "Tak"; "No" = "Nie"; diff --git a/UI/Common/Russian.lproj/Localizable.strings b/UI/Common/Russian.lproj/Localizable.strings index cecf97cf5..dccc5f09f 100644 --- a/UI/Common/Russian.lproj/Localizable.strings +++ b/UI/Common/Russian.lproj/Localizable.strings @@ -10,16 +10,16 @@ "Address Book" = "Адресная книга"; "Mail" = "Почта"; "Preferences" = "Настройки"; - +"Administration" = "Administration"; "Disconnect" = "Выход"; "Right Administration" = "Управление доступом"; - +"Log Console (dev.)" = "Log Console (dev.)"; "User" = "Пользователь"; "Help" = "Помощь"; - +"noJavascriptError" = "SOGo requires Javascript to run. Please make sure this option is available and activated within your browser preferences."; "noJavascriptRetry" = "Повторить попытку"; "Owner:" = "Владелец:"; @@ -67,7 +67,7 @@ "delegate is a group" = "Указанный адрес - адрес группы. Вы можете делегировать приглашение лишь отдельным людям."; /* common buttons */ - +"OK" = "OK"; "Cancel" = "Отмена"; "Yes" = "Да"; "No" = "Нет"; diff --git a/UI/Common/Spanish.lproj/Localizable.strings b/UI/Common/Spanish.lproj/Localizable.strings index 29f8fe3fe..43838b42d 100644 --- a/UI/Common/Spanish.lproj/Localizable.strings +++ b/UI/Common/Spanish.lproj/Localizable.strings @@ -67,7 +67,7 @@ "delegate is a group" = "La dirección especificada corresponde a un grupo. Sólo puede delegar a una persona única."; /* common buttons */ - +"OK" = "OK"; "Cancel" = "Cancelar"; "Yes" = "Si"; "No" = "No"; diff --git a/UI/Common/Swedish.lproj/Localizable.strings b/UI/Common/Swedish.lproj/Localizable.strings index 966de4f6d..36533fed7 100644 --- a/UI/Common/Swedish.lproj/Localizable.strings +++ b/UI/Common/Swedish.lproj/Localizable.strings @@ -10,7 +10,7 @@ "Address Book" = "Adressbok"; "Mail" = "E-post"; "Preferences" = "Inställningar"; - +"Administration" = "Administration"; "Disconnect" = "Koppla ner"; "Right Administration" = "Rättighetsinställningar"; "Log Console (dev.)" = "Felkonsol"; @@ -67,13 +67,13 @@ "delegate is a group" = "Adressen du skrivit går till en grupp. Du kan bara delegera till en unik person."; /* common buttons */ - +"OK" = "OK"; "Cancel" = "Avbryt"; "Yes" = "Ja"; "No" = "Nej"; /* alarms */ "Reminder:" = "Påminnelse:"; - +"Start:" = "Start:"; "Due Date:" = "Förfallodag:"; "Location:" = "Plats:"; diff --git a/UI/Common/Welsh.lproj/Localizable.strings b/UI/Common/Welsh.lproj/Localizable.strings index 3814eaf05..1dc5cdc63 100644 --- a/UI/Common/Welsh.lproj/Localizable.strings +++ b/UI/Common/Welsh.lproj/Localizable.strings @@ -10,30 +10,30 @@ "Address Book" = "Llyfr Cyfeiriadau"; "Mail" = "Post"; "Preferences" = "Dewisiadau"; - +"Administration" = "Administration"; "Disconnect" = "Datgysylltu"; "Right Administration" = "Hawl Gweinyddu"; "Log Console (dev.)" = "Consol Log (dev.)"; "User" = "Defnyddiwr"; - +"Help" = "Help"; "noJavascriptError" = "Mae angen Javascript ar SOGo i redeg. Sicrhewch fod yr opsiwn ar gael ac yn actifedig yn newisiadau eich porwr."; "noJavascriptRetry" = "Ailgynnig"; - +"Owner:" = "Owner:"; "Publish the Free/Busy information" = "Cyhoddwch y wybodaeth Rhydd/Brysur"; "Add..." = "Ychwanegu..."; "Remove" = "Dileu"; +"Subscribe User" = "Subscribe User"; - - - - - +"Any Authenticated User" = "Any Authenticated User"; +"Public Access" = "Public Access"; +"Any user not listed above" = "Any user not listed above"; +"Anybody accessing this resource from the public area" = "Anybody accessing this resource from the public area"; "Sorry, the user rights can not be configured for that object." = "Sori, ni all hawliau'r defnyddiwr cael ei newid ar gyfer y gwrthrych hwn."; @@ -51,24 +51,25 @@ = "Yr ydych wedi tanysgrifio eisoes i'r ffolder yna!"; "The user rights cannot be edited for this object!" = "Ni all hawliau'r defnyddiwr cael eu golygu ar gyfer y gwrthrych hwn!"; - - - +"A folder by that name already exists." = "A folder by that name already exists."; +"You cannot create a list in a shared address book." + = "You cannot create a list in a shared address book."; +"Warning" = "Warning"; "You are not allowed to access this module or this system. Please contact your system administrator." = "Nid oes gennych caniatad mynediad i'r modiwl hwn na'r system hwn. Cysylltwch a'r Gweinyddwr Systemau os gwelwch yn dda."; "You don't have the required privileges to perform the operation." = "Nid oes gennych y breintiau gofynnol i berfformio'r gweithrediad."; - - - - +"noEmailForDelegation" = "You must specify the address to which you want to delegate your invitation."; +"delegate is organizer" = "The delegate is the organizer. Please specify a different delegate."; +"delegate is a participant" = "The delegate is already a participant."; +"delegate is a group" = "The specified address corresponds to a group. You can only delegate to a unique person."; /* common buttons */ - - - +"OK" = "OK"; +"Cancel" = "Cancel"; +"Yes" = "Yes"; "No" = "No"; /* alarms */ diff --git a/UI/MailPartViewers/BrazilianPortuguese.lproj/Localizable.strings b/UI/MailPartViewers/BrazilianPortuguese.lproj/Localizable.strings index 233cc1ba0..d052cd055 100644 --- a/UI/MailPartViewers/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/MailPartViewers/BrazilianPortuguese.lproj/Localizable.strings @@ -23,10 +23,10 @@ request_info = "convidou você para participar de uma reunião."; Accept = "Aceitar"; Decline = "Declinar"; Tentative = "Tentativa"; - - +"Delegate ..." = "Delegate ..."; +"Delegated to" = "Delegated to"; "Update status in calendar" = "Atualizar status no calendário"; - +"delegated from" = "delegated from"; reply_info_no_attendee = "Você recebeu uma resposta de um evento agendado, mas o remetente da resposta não é um participante."; reply_info = "Esta é uma resposta de um convite feito por você."; @@ -37,10 +37,10 @@ reply_info = "Esta é uma resposta de um convite feito por você."; "Size" = "Tamanho"; - - - - - - - +"Digital signature is not valid" = "Digital signature is not valid"; +"Message is signed" = "Message is signed"; +"Subject" = "Subject"; +"From" = "From"; +"Date" = "Date"; +"To" = "To"; +"Issuer" = "Issuer"; diff --git a/UI/MailPartViewers/Czech.lproj/Localizable.strings b/UI/MailPartViewers/Czech.lproj/Localizable.strings index 44599f2db..46cfd979a 100644 --- a/UI/MailPartViewers/Czech.lproj/Localizable.strings +++ b/UI/MailPartViewers/Czech.lproj/Localizable.strings @@ -26,7 +26,7 @@ Tentative = "Nezávazně"; "Delegate ..." = "Delegovat ..."; "Delegated to" = "Delegovat na"; "Update status in calendar" = "Aktualizovat status v kalendáři"; - +"delegated from" = "delegated from"; reply_info_no_attendee = "Obdrželi jste odpověď k plánované události, ale odesílatel se události neúčastní."; reply_info = "Toto je odpověď na pozvánku k událost, kterou jste vytvořili vy."; diff --git a/UI/MailPartViewers/Dutch.lproj/Localizable.strings b/UI/MailPartViewers/Dutch.lproj/Localizable.strings index e418e56e5..f4c92f37a 100644 --- a/UI/MailPartViewers/Dutch.lproj/Localizable.strings +++ b/UI/MailPartViewers/Dutch.lproj/Localizable.strings @@ -23,10 +23,10 @@ request_info = "nodigt u uit deel te nemen aan bijgevoegde afspraak."; Accept = "Accepteren"; Decline = "Weigeren"; Tentative = "Onder voorbehoud"; - - +"Delegate ..." = "Delegate ..."; +"Delegated to" = "Delegated to"; "Update status in calendar" = "Afspraak bijwerken in agenda"; - +"delegated from" = "delegated from"; reply_info_no_attendee = "U heeft een antwoord betreffende een afspraak ontvangen van een niet-deelnemer."; reply_info = "Dit is een antwoord op een door u verstuurde uitnodiging."; @@ -37,10 +37,10 @@ reply_info = "Dit is een antwoord op een door u verstuurde uitnodiging."; "Size" = "Grootte"; - - - - - - - +"Digital signature is not valid" = "Digital signature is not valid"; +"Message is signed" = "Message is signed"; +"Subject" = "Subject"; +"From" = "From"; +"Date" = "Date"; +"To" = "To"; +"Issuer" = "Issuer"; diff --git a/UI/MailPartViewers/French.lproj/Localizable.strings b/UI/MailPartViewers/French.lproj/Localizable.strings index 1a3a324d8..1d78e8564 100644 --- a/UI/MailPartViewers/French.lproj/Localizable.strings +++ b/UI/MailPartViewers/French.lproj/Localizable.strings @@ -7,7 +7,7 @@ DELEGATED = "Délégué"; TENTATIVE = "Proposition"; organized_by_you = "vous êtes l'organisateur"; you_are_an_attendee = "vous êtes invité"; - +add_info_text = "iMIP 'ADD' requests are not yet supported by SOGo."; publish_info_text = "L'expéditeur vous informe de l'événement attaché."; cancel_info_text = "Votre invitation ou l'événement au complet a été annulé."; request_info_no_attendee = "propose une réunion entre les invités. Ce message tient seulement lieu d'avis, vous n'êtes pas indiqué comme invité."; @@ -41,6 +41,6 @@ reply_info = "Ceci est une réponse à un événement que vous avez organisé."; "Message is signed" = "Message signé"; "Subject" = "Sujet"; "From" = "Expéditeur"; - +"Date" = "Date"; "To" = "Destinataire"; "Issuer" = "Émetteur"; diff --git a/UI/MailPartViewers/Hungarian.lproj/Localizable.strings b/UI/MailPartViewers/Hungarian.lproj/Localizable.strings index 7d0d0aff0..0c8dacdd1 100644 --- a/UI/MailPartViewers/Hungarian.lproj/Localizable.strings +++ b/UI/MailPartViewers/Hungarian.lproj/Localizable.strings @@ -23,10 +23,10 @@ request_info = "meghívja önt résztvevőnek egy találkozóra."; Accept = "Elfogad"; Decline = "Elutasít"; Tentative = "Bizonytalan"; - - +"Delegate ..." = "Delegate ..."; +"Delegated to" = "Delegated to"; "Update status in calendar" = "Állapot frissítése a naptárban"; - +"delegated from" = "delegated from"; reply_info_no_attendee = "Ön választ kapott egy találkozóra, a feladó azonban nem résztvevő."; reply_info = "Ez egy válasz az ön által kiküldött meghívásra."; @@ -37,10 +37,10 @@ reply_info = "Ez egy válasz az ön által kiküldött meghívásra."; "Size" = "Méret"; - - - - - - - +"Digital signature is not valid" = "Digital signature is not valid"; +"Message is signed" = "Message is signed"; +"Subject" = "Subject"; +"From" = "From"; +"Date" = "Date"; +"To" = "To"; +"Issuer" = "Issuer"; diff --git a/UI/MailPartViewers/Polish.lproj/Localizable.strings b/UI/MailPartViewers/Polish.lproj/Localizable.strings index 89ba5d472..c4e4305bc 100644 --- a/UI/MailPartViewers/Polish.lproj/Localizable.strings +++ b/UI/MailPartViewers/Polish.lproj/Localizable.strings @@ -26,7 +26,7 @@ Tentative = "Niepewny"; "Delegate ..." = "Przekaż ..."; "Delegated to" = "Przekazane do"; "Update status in calendar" = "Zaktualizuj status w kalendarzu"; - +"delegated from" = "delegated from"; reply_info_no_attendee = "Otrzymałeś odpowiedź do wydarzenia ale nadawca nie jest uczestnikiem."; reply_info = "To jest odpowiedź do utworzonego przez ciebie wydarzenia"; diff --git a/UI/MailPartViewers/Russian.lproj/Localizable.strings b/UI/MailPartViewers/Russian.lproj/Localizable.strings index 49ab1a770..9d7179075 100644 --- a/UI/MailPartViewers/Russian.lproj/Localizable.strings +++ b/UI/MailPartViewers/Russian.lproj/Localizable.strings @@ -7,7 +7,7 @@ DELEGATED = "делегировано"; TENTATIVE = "предварительное согласие"; organized_by_you = "организованные Вами"; you_are_an_attendee = "с Вашим участием"; - +add_info_text = "iMIP 'ADD' requests are not yet supported by SOGo."; publish_info_text = "Отправитель сообщает о приложенном событии."; cancel_info_text = "Ваше приглашение или все мероприятие отменено."; request_info_no_attendee = "предлагает участникам встретиться. Вы получили это сообщение как приглашенное лицо. Вы еще не включены в список подтвержденных участников."; @@ -23,10 +23,10 @@ request_info = "приглашает Вас принять участие в в Accept = "Принять"; Decline = "Отклонить"; Tentative = "предварительно согласиться"; - - +"Delegate ..." = "Delegate ..."; +"Delegated to" = "Delegated to"; "Update status in calendar" = "Обновить статус в календаре"; - +"delegated from" = "delegated from"; reply_info_no_attendee = "Вы получили ответ на запланированное мероприятие, но отправителя сообщения нет среди приглашенных."; reply_info = "Это ответ на Ваше приглашение на мероприятие."; @@ -37,10 +37,10 @@ reply_info = "Это ответ на Ваше приглашение на мер "Size" = "Размер"; - - - - - - - +"Digital signature is not valid" = "Digital signature is not valid"; +"Message is signed" = "Message is signed"; +"Subject" = "Subject"; +"From" = "From"; +"Date" = "Date"; +"To" = "To"; +"Issuer" = "Issuer"; diff --git a/UI/MailPartViewers/Ukrainian.lproj/Localizable.strings b/UI/MailPartViewers/Ukrainian.lproj/Localizable.strings index 7ce813e82..924f91afc 100644 --- a/UI/MailPartViewers/Ukrainian.lproj/Localizable.strings +++ b/UI/MailPartViewers/Ukrainian.lproj/Localizable.strings @@ -7,7 +7,7 @@ DELEGATED = "делеговано"; TENTATIVE = "попереднє погодження"; organized_by_you = "організоване Вами"; you_are_an_attendee = "за Вашої участі"; - +add_info_text = "iMIP 'ADD' requests are not yet supported by SOGo."; publish_info_text = "Відправник повідомляє про вкладену подію."; cancel_info_text = "Ваше запрошення або всі заходи скасовано."; request_info_no_attendee = "пропонує учасникам зустрітись. Ви отримали це повідомлення як запрошена особа. Ви ще не долучені до списку підтверджених учасників."; @@ -26,7 +26,7 @@ Tentative = "попередьно погодитись"; "Delegate ..." = "Делегуват ..."; "Delegated to" = "Делегувати"; "Update status in calendar" = "Поновити статус в календарі"; - +"delegated from" = "delegated from"; reply_info_no_attendee = "Ви отримали відповідь на запланований захід, але відправник повідомлення відсутній серед запрошених."; reply_info = "Це відповідь на Ваше запрошення взяти участь у заході."; diff --git a/UI/MailPartViewers/Welsh.lproj/Localizable.strings b/UI/MailPartViewers/Welsh.lproj/Localizable.strings index 6c134783d..955e2ac73 100644 --- a/UI/MailPartViewers/Welsh.lproj/Localizable.strings +++ b/UI/MailPartViewers/Welsh.lproj/Localizable.strings @@ -7,7 +7,7 @@ DELEGATED = "dirprwyedig"; TENTATIVE = "petrus"; organized_by_you = "trefnwyd gennych chi"; you_are_an_attendee = "yr ydych yn mynychu"; - +add_info_text = "iMIP 'ADD' requests are not yet supported by SOGo."; publish_info_text = "Mae'r anfonwr yn eich hysbysu o'r digwyddiad atodol."; cancel_info_text = "Cafodd eich gwahoddiad i'r holl ddigwyddiad ei ganslo."; request_info_no_attendee = "yn cynnig cyfarfod i'r holl rhai sy'n mynychu. Rydych yn derbyn yr ebost yma fel hysbysiad, nid ydych wedi cael eich rhestri fel cyfrannogwr."; @@ -23,10 +23,10 @@ request_info = "yn eich gwahodd i gyfarfod."; Accept = "Derbyn"; Decline = "Gwrthod"; Tentative = "Petrus"; - - +"Delegate ..." = "Delegate ..."; +"Delegated to" = "Delegated to"; "Update status in calendar" = "Diweddaru statws yn y calendr"; - +"delegated from" = "delegated from"; reply_info_no_attendee = "Rydych wedi derbyn ymateb i digwyddiad ond nid yw'r anfonwr yn cyfranogwr."; reply_info = "Dyma ymateb i wahoddiad i digwyddiad a wnaed gennych chi."; @@ -37,10 +37,10 @@ reply_info = "Dyma ymateb i wahoddiad i digwyddiad a wnaed gennych chi."; "Size" = "maint"; - - - - - - - +"Digital signature is not valid" = "Digital signature is not valid"; +"Message is signed" = "Message is signed"; +"Subject" = "Subject"; +"From" = "From"; +"Date" = "Date"; +"To" = "To"; +"Issuer" = "Issuer"; diff --git a/UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings b/UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings index 3aa20b8bc..60d582ffc 100644 --- a/UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings @@ -18,8 +18,8 @@ "Contacts" = "Contatos"; "Attach" = "Anexo"; "Save" = "Salvar"; - - +"Options" = "Options"; +"Size" = "Size"; /* Tooltips */ @@ -79,7 +79,7 @@ "Archive This Folder" = "Archive This Folder"; "Modify the acl of this folder" = "Modificar os direitos desta pasta"; - +"Saved Messages.zip" = "Saved Messages.zip"; "Update" = "Atualizar"; "Cancel" = "Cancelar"; @@ -89,35 +89,35 @@ "From" = "De"; "Subject" = "Assunto"; "To" = "Para"; - - +"Cc" = "Cc"; +"Bcc" = "Bcc"; "Reply-To" = "Responder-Para"; "Add address" = "Adicionar endereço"; "Attachments:" = "Anexos:"; - - - - +"Open" = "Open"; +"Select All" = "Select All"; +"Attach Web Page..." = "Attach Web Page..."; +"Attach File(s)..." = "Attach File(s)..."; "to" = "Para"; - - +"cc" = "Cc"; +"bcc" = "Bcc"; "Addressbook" = "Catálogo"; "Edit Draft..." = "Editar Rascunho..."; "Load Images" = "Carregar Imagens"; - - - - +"Return Receipt" = "Return Receipt"; +"The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?"; +"Return Receipt (displayed) - %@"= "Return Receipt (displayed) - %@"; +"This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents."; "Priority" = "Prioridade"; "highest" = "Muito Alta"; "high" = "Alta"; - +"normal" = "Normal"; "low" = "Baixa"; "lowest" = "Muito Baixa"; @@ -142,7 +142,7 @@ "View" = "Visão"; "All" = "Tudo"; "Unread" = "Não Lido"; - +"No message" = "No message"; "messages" = "mensagens"; "first" = "Primeiro"; @@ -180,7 +180,7 @@ /* Image Popup menu */ "Save Image" = "Salvar Imagem"; - +"Save Attachment" = "Save Attachment"; /* Mailbox popup menus */ "Open in New Mail Window" = "Abrir em uma Nova Janela"; @@ -196,8 +196,8 @@ "Delete Folder" = "Apagar Pasta"; "Use This Folder For" = "Usar Esta Pasta Para"; "Get Messages for Account" = "Receber Mensagens por Conta"; - - +"Properties..." = "Properties..."; +"Delegation..." = "Delegation..."; /* Use This Folder menu */ "Sent Messages" = "Enviar Mensagens"; @@ -249,13 +249,13 @@ = "Você realmente quer mover esta pasta para a Lixeira ?"; "Operation failed" = "Falha na Operação"; - +"Quota" = "Quota:"; "quotasFormat" = "%{0}% usedo em %{1} MB"; "Please select a message." = "Por favor, selecione uma mensagem."; "Please select a message to print." = "Por favor, selecione a mensagem para imprimir."; "Please select only one message to print." = "Por favor, selecione somente uma mensagem para imprimir."; - +"The message you have selected doesn't exist anymore." = "The message you have selected doesn't exist anymore."; "The folder with name \"%{0}\" could not be created." @@ -277,7 +277,8 @@ = "Copiar a mensagem em sua própria pasta é impossível!"; /* Message operations */ - +"The messages could not be moved to the trash folder. Would you like to delete them immediately?" += "The messages could not be moved to the trash folder. Would you like to delete them immediately?"; /* Message editing */ "error_validationfailed" = "Validação falhou"; @@ -285,6 +286,6 @@ "error_missingrecipients" = "Sem destinatários selecionados"; /* Message sending */ - - - +"cannot send message: (smtp) all recipients discarded" = "Cannot send message: all recipients are invalid."; +"cannot send message (smtp) - recipients discarded:" = "Cannot send message. The following addresses are invalid:"; +"cannot send message: (smtp) error when connecting" = "Cannot send message: error when connecting to the SMTP server."; diff --git a/UI/MailerUI/Catalan.lproj/Localizable.strings b/UI/MailerUI/Catalan.lproj/Localizable.strings index 98f9d15ad..e31cc14b2 100644 --- a/UI/MailerUI/Catalan.lproj/Localizable.strings +++ b/UI/MailerUI/Catalan.lproj/Localizable.strings @@ -89,7 +89,7 @@ "From" = "De"; "Subject" = "Assummpte"; "To" = "Per a"; - +"Cc" = "Cc"; "Bcc" = "C/o"; "Reply-To" = "Respondre a"; "Add address" = "Afegir adreça"; @@ -110,14 +110,14 @@ "Load Images" = "Carregar imatges"; "Return Receipt" = "Justificant de recepció"; - - - +"The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?"; +"Return Receipt (displayed) - %@"= "Return Receipt (displayed) - %@"; +"This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents."; "Priority" = "Prioritat"; "highest" = "Màxima"; "high" = "Alta"; - +"normal" = "Normal"; "low" = "Baixa"; "lowest" = "Mínima"; @@ -196,8 +196,8 @@ "Delete Folder" = "Esborrar carpeta"; "Use This Folder For" = "Usar aquesta carpeta per a"; "Get Messages for Account" = "Rebre missatges per a compte"; - - +"Properties..." = "Properties..."; +"Delegation..." = "Delegation..."; /* Use This Folder menu */ "Sent Messages" = "Enviar missatges"; @@ -225,9 +225,9 @@ /* Label popup menu */ "None" = "Cap"; - +"Important" = "Important"; "Work" = "Feina"; - +"Personal" = "Personal"; "To Do" = "Per fer"; "Later" = "Més tard"; @@ -277,7 +277,8 @@ = "No es poden copiar missatges en la mateixa carpeta."; /* Message operations */ - +"The messages could not be moved to the trash folder. Would you like to delete them immediately?" += "The messages could not be moved to the trash folder. Would you like to delete them immediately?"; /* Message editing */ "error_validationfailed" = "Error de validació"; @@ -285,6 +286,6 @@ "error_missingrecipients" = "No heu indicat els destinataris"; /* Message sending */ - - - +"cannot send message: (smtp) all recipients discarded" = "Cannot send message: all recipients are invalid."; +"cannot send message (smtp) - recipients discarded:" = "Cannot send message. The following addresses are invalid:"; +"cannot send message: (smtp) error when connecting" = "Cannot send message: error when connecting to the SMTP server."; diff --git a/UI/MailerUI/Czech.lproj/Localizable.strings b/UI/MailerUI/Czech.lproj/Localizable.strings index 7896883b3..301c74541 100644 --- a/UI/MailerUI/Czech.lproj/Localizable.strings +++ b/UI/MailerUI/Czech.lproj/Localizable.strings @@ -11,7 +11,7 @@ "Reply" = "Odpovědět"; "Reply All" = "Odp. všem"; "Print" = "Tisk"; - +"Stop" = "Stop"; "Write" = "Napsat"; "Send" = "Odeslat"; @@ -109,10 +109,10 @@ "Edit Draft..." = "Upravit koncept..."; "Load Images" = "Nahrát obrázky"; - - - - +"Return Receipt" = "Return Receipt"; +"The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?"; +"Return Receipt (displayed) - %@"= "Return Receipt (displayed) - %@"; +"This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents."; "Priority" = "Priorita"; "highest" = "Nejvyšší"; @@ -142,7 +142,7 @@ "View" = "Zobrazit"; "All" = "Všechny"; "Unread" = "Nepřečtené"; - +"No message" = "No message"; "messages" = "zprávy"; "first" = "Nejnovější"; @@ -196,8 +196,8 @@ "Delete Folder" = "Smazat složku"; "Use This Folder For" = "Použít tuto složku pro"; "Get Messages for Account" = "Stáhnout zprávy pro účet"; - - +"Properties..." = "Properties..."; +"Delegation..." = "Delegation..."; /* Use This Folder menu */ "Sent Messages" = "Odeslané zprávy"; @@ -255,7 +255,7 @@ "Please select a message." = "Vyberte zprávu prosím."; "Please select a message to print." = "Zvolte prosím zprávu, kterou chcete tisknout."; "Please select only one message to print." = "Zvolte pouze jednu zprávu, kterou chcete tisknout."; - +"The message you have selected doesn't exist anymore." = "The message you have selected doesn't exist anymore."; "The folder with name \"%{0}\" could not be created." @@ -277,7 +277,8 @@ = "Je nemožné zkopírovat zprávu do své vlastní složky!"; /* Message operations */ - +"The messages could not be moved to the trash folder. Would you like to delete them immediately?" += "The messages could not be moved to the trash folder. Would you like to delete them immediately?"; /* Message editing */ "error_validationfailed" = "Potvrzení selhalo"; @@ -285,6 +286,6 @@ "error_missingrecipients" = "Příjemci nebyli specifikováni"; /* Message sending */ - - - +"cannot send message: (smtp) all recipients discarded" = "Cannot send message: all recipients are invalid."; +"cannot send message (smtp) - recipients discarded:" = "Cannot send message. The following addresses are invalid:"; +"cannot send message: (smtp) error when connecting" = "Cannot send message: error when connecting to the SMTP server."; diff --git a/UI/MailerUI/Dutch.lproj/Localizable.strings b/UI/MailerUI/Dutch.lproj/Localizable.strings index 852ebc4ab..0187b0854 100644 --- a/UI/MailerUI/Dutch.lproj/Localizable.strings +++ b/UI/MailerUI/Dutch.lproj/Localizable.strings @@ -18,25 +18,25 @@ "Contacts" = "Adresboek"; "Attach" = "Bijlage"; "Save" = "Opslaan"; - - +"Options" = "Options"; +"Size" = "Size"; /* Tooltips */ - - - - - - - - - - - - - - +"Send this message now" = "Send this message now"; +"Select a recipient from an Address Book" = "Select a recipient from an Address Book"; +"Include an attachment" = "Include an attachment"; +"Save this message" = "Save this message"; +"Get new messages" = "Get new messages"; +"Create a new message" = "Create a new message"; +"Go to address book" = "Go to address book"; +"Reply to the message" = "Reply to the message"; +"Reply to sender and all recipients" = "Reply to sender and all recipients"; +"Forward selected message" = "Forward selected message"; +"Delete selected message or folder" = "Delete selected message or folder"; +"Mark the selected messages as junk" = "Mark the selected messages as junk"; +"Print this message" = "Print this message"; +"Stop the current transfer" = "Stop the current transfer"; "Attachment" = "Bijlage"; "Unread" = "Ongelezen"; "Flagged" = "Gemarkeerd"; @@ -49,7 +49,7 @@ "Mail" = "E-mail"; "Right Administration" = "Machtigingen beheren"; - +"Help" = "Help"; /* Mail account main windows */ @@ -59,7 +59,7 @@ "Write a new message" = "Een nieuw bericht opstellen"; "Share: " = "Delen: "; - +"Account: " = "Account: "; "Shared Account: " = "Gedeeld account"; /* acls */ @@ -79,7 +79,7 @@ "Archive This Folder" = "Archive This Folder"; "Modify the acl of this folder" = "Machtigingen van deze map aanpassen"; - +"Saved Messages.zip" = "Saved Messages.zip"; "Update" = "Opslaan"; "Cancel" = "Sluiten"; @@ -89,16 +89,16 @@ "From" = "Van"; "Subject" = "Onderwerp"; "To" = "Aan"; - - - +"Cc" = "Cc"; +"Bcc" = "Bcc"; +"Reply-To" = "Reply-To"; "Add address" = "Adres toevoegen"; "Attachments:" = "Bijlage:"; - - - - +"Open" = "Open"; +"Select All" = "Select All"; +"Attach Web Page..." = "Attach Web Page..."; +"Attach File(s)..." = "Attach File(s)..."; "to" = "aan"; "cc" = "cc"; @@ -110,9 +110,9 @@ "Load Images" = "Afbeeldingen laden"; "Return Receipt" = "Ontvangstbevestiging"; - - - +"The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?"; +"Return Receipt (displayed) - %@"= "Return Receipt (displayed) - %@"; +"This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents."; "Priority" = "Prioriteit"; "highest" = "Hoogste"; @@ -139,10 +139,10 @@ "Entire Message" = "Volledig bericht"; "Date" = "Datum"; - +"View" = "View"; "All" = "Alle"; "Unread" = "Ongelezen"; - +"No message" = "No message"; "messages" = "berichten"; "first" = "eerste"; @@ -165,8 +165,8 @@ "InboxFolderName" = "Postvak IN"; "DraftsFolderName" = "Concepten"; "SieveFolderName" = "Berichtregel"; - - +"OtherUsersFolderName" = "Other Users"; +"SharedFoldersName" = "Shared Folders"; "Folders" = "Mappen"; /* title line */ /* MailMoveToPopUp */ @@ -180,7 +180,7 @@ /* Image Popup menu */ "Save Image" = "Afbeelding opslaan"; - +"Save Attachment" = "Save Attachment"; /* Mailbox popup menus */ "Open in New Mail Window" = "In nieuw e-mailvenster openen"; @@ -196,8 +196,8 @@ "Delete Folder" = "Map verwijderen"; "Use This Folder For" = "De map gebruiken voor..."; "Get Messages for Account" = "Berichten ophalen voor account"; - - +"Properties..." = "Properties..."; +"Delegation..." = "Delegation..."; /* Use This Folder menu */ "Sent Messages" = "Berichten verzenden"; @@ -229,7 +229,7 @@ "Work" = "Werk"; "Personal" = "Persoonlijk"; "To Do" = "Te doen"; - +"Later" = "Later"; /* Mark popup menu */ "As Read" = "Als gelezen"; @@ -255,7 +255,7 @@ "Please select a message." = "Selecteer een bericht."; "Please select a message to print." = "Selecteer een bericht om af te drukken."; "Please select only one message to print." = "Selecteer een enkel bericht om af te drukken."; - +"The message you have selected doesn't exist anymore." = "The message you have selected doesn't exist anymore."; "The folder with name \"%{0}\" could not be created." @@ -277,7 +277,8 @@ = "Kan bericht niet naar zijn eigen map kopiëren!"; /* Message operations */ - +"The messages could not be moved to the trash folder. Would you like to delete them immediately?" += "The messages could not be moved to the trash folder. Would you like to delete them immediately?"; /* Message editing */ "error_validationfailed" = "Validering mislukt!"; @@ -285,6 +286,6 @@ "error_missingrecipients" = "U heeft geen ontvanger opgegeven!"; /* Message sending */ - - - +"cannot send message: (smtp) all recipients discarded" = "Cannot send message: all recipients are invalid."; +"cannot send message (smtp) - recipients discarded:" = "Cannot send message. The following addresses are invalid:"; +"cannot send message: (smtp) error when connecting" = "Cannot send message: error when connecting to the SMTP server."; diff --git a/UI/MailerUI/French.lproj/Localizable.strings b/UI/MailerUI/French.lproj/Localizable.strings index f2ffc5af8..aec2c38b5 100644 --- a/UI/MailerUI/French.lproj/Localizable.strings +++ b/UI/MailerUI/French.lproj/Localizable.strings @@ -11,14 +11,14 @@ "Reply" = "Répondre"; "Reply All" = "Rép. à tous"; "Print" = "Imprimer"; - +"Stop" = "Stop"; "Write" = "Écrire"; "Send" = "Envoyer"; - +"Contacts" = "Contacts"; "Attach" = "Joindre"; "Save" = "Enregistrer"; - +"Options" = "Options"; "Size" = "Taille"; /* Tooltips */ @@ -46,7 +46,7 @@ "Home" = "Accueil"; "Calendar" = "Agenda"; "Addressbook" = "Adresses"; - +"Mail" = "Mail"; "Right Administration" = "Administration"; "Help" = "Aide"; @@ -95,10 +95,10 @@ "Add address" = "Ajouter Adresse"; "Attachments:" = "Pièces jointes :"; - - - - +"Open" = "Open"; +"Select All" = "Select All"; +"Attach Web Page..." = "Attach Web Page..."; +"Attach File(s)..." = "Attach File(s)..."; "to" = "Pour"; "cc" = "Copie à"; @@ -138,8 +138,8 @@ "To or Cc" = "Pour ou Copie à"; "Entire Message" = "Message Complet"; - - +"Date" = "Date"; +"View" = "View"; "All" = "Tous"; "Unread" = "Non lus"; "No message" = "Aucun message"; @@ -225,7 +225,7 @@ /* Label popup menu */ "None" = "Aucune"; - +"Important" = "Important"; "Work" = "Travail"; "Personal" = "Personnel"; "To Do" = "À faire"; diff --git a/UI/MailerUI/German.lproj/Localizable.strings b/UI/MailerUI/German.lproj/Localizable.strings index 7f87d4221..1bc77d77d 100644 --- a/UI/MailerUI/German.lproj/Localizable.strings +++ b/UI/MailerUI/German.lproj/Localizable.strings @@ -4,10 +4,10 @@ "Create" = "Erstellen"; "Empty Trash" = "Papierkorb leeren"; "Delete" = "Löschen"; - +"Expunge" = "Expunge"; "Forward" = "Weiterleiten"; "Get Mail" = "Abrufen"; - +"Junk" = "Junk"; "Reply" = "Antworten"; "Reply All" = "Allen Antworten"; "Print" = "Drucken"; @@ -18,7 +18,7 @@ "Contacts" = "Kontakte"; "Attach" = "Anhang"; "Save" = "Speichern"; - +"Options" = "Options"; "Size" = "Größe"; /* Tooltips */ @@ -79,7 +79,7 @@ "Archive This Folder" = "Diesen Ordner archivieren"; "Modify the acl of this folder" = "Benutzerrechte dieses Ordners verändern"; - +"Saved Messages.zip" = "Saved Messages.zip"; "Update" = "Speichern"; "Cancel" = "Abbrechen"; @@ -117,7 +117,7 @@ "Priority" = "Priorität"; "highest" = "Sehr hoch"; "high" = "Hoch"; - +"normal" = "Normal"; "low" = "Niedrig"; "lowest" = "Sehr niedrig"; @@ -142,7 +142,7 @@ "View" = "Ansicht"; "All" = "Alle"; "Unread" = "Ungelesene"; - +"No message" = "No message"; "messages" = "Nachricht(en)"; "first" = "Erste"; @@ -196,8 +196,8 @@ "Delete Folder" = "Löschen"; "Use This Folder For" = "Diesen Ordner verwenden für"; "Get Messages for Account" = "Neue Nachrichten empfangen"; - - +"Properties..." = "Properties..."; +"Delegation..." = "Delegation..."; /* Use This Folder menu */ "Sent Messages" = "Gesendete Nachrichten"; @@ -228,7 +228,7 @@ "Important" = "Wichtig"; "Work" = "Geschäftlich"; "Personal" = "Persönlich"; - +"To Do" = "To Do"; "Later" = "Später"; /* Mark popup menu */ @@ -286,6 +286,6 @@ "error_missingrecipients" = "Der Empfänger fehlt!"; /* Message sending */ - - - +"cannot send message: (smtp) all recipients discarded" = "Cannot send message: all recipients are invalid."; +"cannot send message (smtp) - recipients discarded:" = "Cannot send message. The following addresses are invalid:"; +"cannot send message: (smtp) error when connecting" = "Cannot send message: error when connecting to the SMTP server."; diff --git a/UI/MailerUI/Hungarian.lproj/Localizable.strings b/UI/MailerUI/Hungarian.lproj/Localizable.strings index f25aa8f53..8d5b1176b 100644 --- a/UI/MailerUI/Hungarian.lproj/Localizable.strings +++ b/UI/MailerUI/Hungarian.lproj/Localizable.strings @@ -18,7 +18,7 @@ "Contacts" = "Kapcsolatok"; "Attach" = "Melléklet"; "Save" = "Mentés"; - +"Options" = "Options"; "Size" = "Méret"; /* Tooltips */ @@ -79,7 +79,7 @@ "Archive This Folder" = "Archive This Folder"; "Modify the acl of this folder" = "Mappa jogosultságainak szerkesztése"; - +"Saved Messages.zip" = "Saved Messages.zip"; "Update" = "Mentés"; "Cancel" = "Mégsem"; @@ -95,10 +95,10 @@ "Add address" = "Cím hozzáadása"; "Attachments:" = "Mellékletek:"; - - - - +"Open" = "Open"; +"Select All" = "Select All"; +"Attach Web Page..." = "Attach Web Page..."; +"Attach File(s)..." = "Attach File(s)..."; "to" = "Címzett"; "cc" = "Másolat"; @@ -109,10 +109,10 @@ "Edit Draft..." = "Piszkozat szerkesztése..."; "Load Images" = "Képek betöltése"; - - - - +"Return Receipt" = "Return Receipt"; +"The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?"; +"Return Receipt (displayed) - %@"= "Return Receipt (displayed) - %@"; +"This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents."; "Priority" = "Sürgősség"; "highest" = "nagyon sürgős"; @@ -142,7 +142,7 @@ "View" = "Nézet"; "All" = "Összes"; "Unread" = "Olvasatlan"; - +"No message" = "No message"; "messages" = "üzenetek"; "first" = "Első"; @@ -150,8 +150,8 @@ "next" = "Következő"; "last" = "Utolsó"; - - +"msgnumber_to" = "to"; +"msgnumber_of" = "of"; "Mark Unread" = "Megjelölés olvasatlanként"; "Mark Read" = "Megjelölés olvasottként"; @@ -196,8 +196,8 @@ "Delete Folder" = "Mappa törlése"; "Use This Folder For" = "Mappa használata az alábbira:"; "Get Messages for Account" = "Fiók üzeneteinek letöltése"; - - +"Properties..." = "Properties..."; +"Delegation..." = "Delegation..."; /* Use This Folder menu */ "Sent Messages" = "Elküldött üzenetek"; @@ -255,7 +255,7 @@ "Please select a message." = "Kérem válasszon egy üzenetet."; "Please select a message to print." = "Kérem válasszon ki egy üzenetet a nyomtatáshoz."; "Please select only one message to print." = "Kérem csak egy üzenetet válasszon a nyomtatáshoz."; - +"The message you have selected doesn't exist anymore." = "The message you have selected doesn't exist anymore."; "The folder with name \"%{0}\" could not be created." @@ -277,7 +277,8 @@ = "Egy üzenet nem másolható át a saját mappájába!"; /* Message operations */ - +"The messages could not be moved to the trash folder. Would you like to delete them immediately?" += "The messages could not be moved to the trash folder. Would you like to delete them immediately?"; /* Message editing */ "error_validationfailed" = "Az ellenőrzés végrehatása nem sikerült"; @@ -285,6 +286,6 @@ "error_missingrecipients" = "Nincsenek címzettek megadva"; /* Message sending */ - - - +"cannot send message: (smtp) all recipients discarded" = "Cannot send message: all recipients are invalid."; +"cannot send message (smtp) - recipients discarded:" = "Cannot send message. The following addresses are invalid:"; +"cannot send message: (smtp) error when connecting" = "Cannot send message: error when connecting to the SMTP server."; diff --git a/UI/MailerUI/Icelandic.lproj/Localizable.strings b/UI/MailerUI/Icelandic.lproj/Localizable.strings index 1474a3371..4021e1bd3 100644 --- a/UI/MailerUI/Icelandic.lproj/Localizable.strings +++ b/UI/MailerUI/Icelandic.lproj/Localizable.strings @@ -91,7 +91,7 @@ "To" = "Til"; "Cc" = "Afrit"; "Bcc" = "Falið afrit"; - +"Reply-To" = "Reply-To"; "Add address" = "Bæta við viðtakanda"; "Attachments:" = "Viðhengi:"; @@ -111,7 +111,7 @@ "Return Receipt" = "Staðfesting á lestri"; "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "Sendandi þessa bréfs hefur beðið um að fá skilaboð þegar þú lest það. Viltu láta sendandann vita?"; - +"Return Receipt (displayed) - %@"= "Return Receipt (displayed) - %@"; "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "Þetta er móttökukvittun fyrir tölvupóstihn sem þú sendir til %@.\n\nAth: Þessi móttökukvittun staðfestir aðeins að tölvubréfið hafi verið sýnt á tölvu móttakandans. Það er engin trygging fyrir því að móttakandinn hafi lesið eða skilið innihald tölvubréfsins."; "Priority" = "Forgangur"; @@ -160,7 +160,7 @@ /* Tree */ - +"SentFolderName" = "Sent"; "TrashFolderName" = "Rusl"; "InboxFolderName" = "Innhólf"; "DraftsFolderName" = "Drög"; @@ -234,7 +234,7 @@ /* Mark popup menu */ "As Read" = "Sem lesið"; "Thread As Read" = "Umræðu sem lesna"; - +"As Read By Date..." = "As Read By Date..."; "All Read" = "Alla sem lesna"; "Flag" = "Tilkynna"; "As Junk" = "Sem ruslpóst"; @@ -243,8 +243,10 @@ /* Folder operations */ "Name :" = "Nafn :"; - - +"Enter the new name of your folder :" + = "Enter the new name of your folder :"; +"Do you really want to move this folder into the trash ?" + = "Do you really want to move this folder into the trash ?"; "Operation failed" = "Aðgerðin mistókst"; "Quota" = "Kvóti:"; diff --git a/UI/MailerUI/Italian.lproj/Localizable.strings b/UI/MailerUI/Italian.lproj/Localizable.strings index 80bfd8d16..12c198e58 100644 --- a/UI/MailerUI/Italian.lproj/Localizable.strings +++ b/UI/MailerUI/Italian.lproj/Localizable.strings @@ -11,14 +11,14 @@ "Reply" = "Rispondi"; "Reply All" = "Rispondi a tutti"; "Print" = "Stampa"; - +"Stop" = "Stop"; "Write" = "Scrivi"; "Send" = "Invia"; "Contacts" = "Contatti"; "Attach" = "Allegato"; "Save" = "Salva"; - +"Options" = "Options"; "Size" = "Dimensione"; /* Tooltips */ @@ -43,7 +43,7 @@ /* Main Frame */ - +"Home" = "Home"; "Calendar" = "Calendario"; "Addressbook" = "Rubrica"; "Mail" = "Posta"; @@ -59,7 +59,7 @@ "Write a new message" = "Scrivi un nuovo messaggio"; "Share: " = "Condividi: "; - +"Account: " = "Account: "; "Shared Account: " = "Account condiviso: "; /* acls */ @@ -89,8 +89,8 @@ "From" = "Da"; "Subject" = "Oggetto"; "To" = "A"; - - +"Cc" = "Cc"; +"Bcc" = "Bcc"; "Reply-To" = "Rispondi a"; "Add address" = "Aggiungi indirizzi"; @@ -101,8 +101,8 @@ "Attach File(s)..." = "Allega File(s)..."; "to" = "A"; - - +"cc" = "Cc"; +"bcc" = "Bcc"; "Addressbook" = "Rubrica"; @@ -196,7 +196,7 @@ "Delete Folder" = "Cancella cartella"; "Use This Folder For" = "Usa questa cartella per"; "Get Messages for Account" = "Scarica messaggi per l'account"; - +"Properties..." = "Properties..."; "Delegation..." = "Delega..."; /* Use This Folder menu */ diff --git a/UI/MailerUI/Norwegian.lproj/Localizable.strings b/UI/MailerUI/Norwegian.lproj/Localizable.strings index 267d393ff..96e5dcfeb 100644 --- a/UI/MailerUI/Norwegian.lproj/Localizable.strings +++ b/UI/MailerUI/Norwegian.lproj/Localizable.strings @@ -14,7 +14,7 @@ "Stop" = "Stopp"; "Write" = "Skriv"; - +"Send" = "Send"; "Contacts" = "Kontakter"; "Attach" = "Vedlegg"; "Save" = "Lagre"; @@ -117,7 +117,7 @@ "Priority" = "Prioritet"; "highest" = "Høyest"; "high" = "Høy"; - +"normal" = "Normal"; "low" = "Lav"; "lowest" = "Lavest"; @@ -165,8 +165,8 @@ "InboxFolderName" = "Innboks"; "DraftsFolderName" = "Kladder"; "SieveFolderName" = "Filter"; - - +"OtherUsersFolderName" = "Other Users"; +"SharedFoldersName" = "Shared Folders"; "Folders" = "Mapper"; /* title line */ /* MailMoveToPopUp */ @@ -286,6 +286,6 @@ "error_missingrecipients" = "Ingen mottagere er angitt"; /* Message sending */ - - - +"cannot send message: (smtp) all recipients discarded" = "Cannot send message: all recipients are invalid."; +"cannot send message (smtp) - recipients discarded:" = "Cannot send message. The following addresses are invalid:"; +"cannot send message: (smtp) error when connecting" = "Cannot send message: error when connecting to the SMTP server."; diff --git a/UI/MailerUI/Polish.lproj/Localizable.strings b/UI/MailerUI/Polish.lproj/Localizable.strings index 6cf9e1260..fadde0062 100644 --- a/UI/MailerUI/Polish.lproj/Localizable.strings +++ b/UI/MailerUI/Polish.lproj/Localizable.strings @@ -18,7 +18,7 @@ "Contacts" = "Kontakty"; "Attach" = "Załącz"; "Save" = "Zapisz"; - +"Options" = "Options"; "Size" = "Rozmiar"; /* Tooltips */ @@ -109,10 +109,10 @@ "Edit Draft..." = "Edytuj szkic..."; "Load Images" = "Załaduj obrazki"; - - - - +"Return Receipt" = "Return Receipt"; +"The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?"; +"Return Receipt (displayed) - %@"= "Return Receipt (displayed) - %@"; +"This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents."; "Priority" = "Priorytet"; "highest" = "Najwyższy"; @@ -165,8 +165,8 @@ "InboxFolderName" = "Odebrane"; "DraftsFolderName" = "Szkice"; "SieveFolderName" = "Filtry"; - - +"OtherUsersFolderName" = "Other Users"; +"SharedFoldersName" = "Shared Folders"; "Folders" = "Foldery"; /* title line */ /* MailMoveToPopUp */ @@ -196,8 +196,8 @@ "Delete Folder" = "Usuń folder"; "Use This Folder For" = "Użyj tego foldera do"; "Get Messages for Account" = "Pobierz wiadomości z konta"; - - +"Properties..." = "Properties..."; +"Delegation..." = "Delegation..."; /* Use This Folder menu */ "Sent Messages" = "Wysłane"; @@ -277,7 +277,8 @@ = "Kopiowanie wiadomości do jej obecnego foldera nie jest możliwe!"; /* Message operations */ - +"The messages could not be moved to the trash folder. Would you like to delete them immediately?" += "The messages could not be moved to the trash folder. Would you like to delete them immediately?"; /* Message editing */ "error_validationfailed" = "Weryfikacja zakończona niepowodzeniem"; @@ -285,6 +286,6 @@ "error_missingrecipients" = "Brak odbiorców"; /* Message sending */ - - - +"cannot send message: (smtp) all recipients discarded" = "Cannot send message: all recipients are invalid."; +"cannot send message (smtp) - recipients discarded:" = "Cannot send message. The following addresses are invalid:"; +"cannot send message: (smtp) error when connecting" = "Cannot send message: error when connecting to the SMTP server."; diff --git a/UI/MailerUI/Russian.lproj/Localizable.strings b/UI/MailerUI/Russian.lproj/Localizable.strings index 96b402657..f87454c9c 100644 --- a/UI/MailerUI/Russian.lproj/Localizable.strings +++ b/UI/MailerUI/Russian.lproj/Localizable.strings @@ -18,8 +18,8 @@ "Contacts" = "Адресная книга"; "Attach" = "Вложить"; "Save" = "Сохранить"; - - +"Options" = "Options"; +"Size" = "Size"; /* Tooltips */ @@ -79,7 +79,7 @@ "Archive This Folder" = "Archive This Folder"; "Modify the acl of this folder" = "Управлять правами доступа к этой папке"; - +"Saved Messages.zip" = "Saved Messages.zip"; "Update" = "Обновить"; "Cancel" = "Отмена"; @@ -95,10 +95,10 @@ "Add address" = "Добавить адрес"; "Attachments:" = "Вложения:"; - - - - +"Open" = "Open"; +"Select All" = "Select All"; +"Attach Web Page..." = "Attach Web Page..."; +"Attach File(s)..." = "Attach File(s)..."; "to" = "Кому"; "cc" = "Копия"; @@ -109,10 +109,10 @@ "Edit Draft..." = "Редактировать черновик..."; "Load Images" = "Загрузить изображения"; - - - - +"Return Receipt" = "Return Receipt"; +"The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?"; +"Return Receipt (displayed) - %@"= "Return Receipt (displayed) - %@"; +"This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents."; "Priority" = "Важность"; "highest" = "Самый высокий"; @@ -121,7 +121,7 @@ "low" = "Низкий"; "lowest" = "Самый низкий"; - +"This mail is being sent from an unsecure network!" = "This mail is being sent from an unsecure network!"; /* Popup "show" */ @@ -142,7 +142,7 @@ "View" = "Просмотр"; "All" = "Все"; "Unread" = "Непрочитанные"; - +"No message" = "No message"; "messages" = "сообщения"; "first" = "первая"; @@ -180,7 +180,7 @@ /* Image Popup menu */ "Save Image" = "Сохранить изображение"; - +"Save Attachment" = "Save Attachment"; /* Mailbox popup menus */ "Open in New Mail Window" = "Открыть в новом окне"; @@ -196,8 +196,8 @@ "Delete Folder" = "Удалить папку"; "Use This Folder For" = "Использовать эту папку для"; "Get Messages for Account" = "Получить новые сообщения"; - - +"Properties..." = "Properties..."; +"Delegation..." = "Delegation..."; /* Use This Folder menu */ "Sent Messages" = "Отправленные сообщения"; @@ -255,7 +255,7 @@ "Please select a message." = "Пожалуйста выберите сообщение."; "Please select a message to print." = "Пожалуйста выберите сообщение для отправки на печать."; "Please select only one message to print." = "Пожалуйста выберите только одно сообщение для печати."; - +"The message you have selected doesn't exist anymore." = "The message you have selected doesn't exist anymore."; "The folder with name \"%{0}\" could not be created." @@ -286,6 +286,6 @@ "error_missingrecipients" = "Не указан адрес получателя"; /* Message sending */ - - - +"cannot send message: (smtp) all recipients discarded" = "Cannot send message: all recipients are invalid."; +"cannot send message (smtp) - recipients discarded:" = "Cannot send message. The following addresses are invalid:"; +"cannot send message: (smtp) error when connecting" = "Cannot send message: error when connecting to the SMTP server."; diff --git a/UI/MailerUI/Spanish.lproj/Localizable.strings b/UI/MailerUI/Spanish.lproj/Localizable.strings index e3e050992..fea4d0a05 100644 --- a/UI/MailerUI/Spanish.lproj/Localizable.strings +++ b/UI/MailerUI/Spanish.lproj/Localizable.strings @@ -89,7 +89,7 @@ "From" = "De"; "Subject" = "Asunto"; "To" = "Para"; - +"Cc" = "Cc"; "Bcc" = "CCo"; "Reply-To" = "Responder A"; "Add address" = "Añadir dirección"; @@ -101,7 +101,7 @@ "Attach File(s)..." = "Adjuntar fichero(s)..."; "to" = "Para"; - +"cc" = "Cc"; "bcc" = "CCo"; "Addressbook" = "Libreta de direcciones"; @@ -117,7 +117,7 @@ "Priority" = "Prioridad"; "highest" = "Muy alta"; "high" = "Alta"; - +"normal" = "Normal"; "low" = "Baja"; "lowest" = "Muy baja"; @@ -227,7 +227,7 @@ "None" = "Ninguna"; "Important" = "Importante"; "Work" = "Trabajo"; - +"Personal" = "Personal"; "To Do" = "Por hacer"; "Later" = "Más tarde"; diff --git a/UI/MailerUI/Swedish.lproj/Localizable.strings b/UI/MailerUI/Swedish.lproj/Localizable.strings index bf0016efe..7ac70600d 100644 --- a/UI/MailerUI/Swedish.lproj/Localizable.strings +++ b/UI/MailerUI/Swedish.lproj/Localizable.strings @@ -117,7 +117,7 @@ "Priority" = "Prioritet"; "highest" = "Högst"; "high" = "Hög"; - +"normal" = "Normal"; "low" = "Låg"; "lowest" = "Lägst"; @@ -165,8 +165,8 @@ "InboxFolderName" = "Inkorgen"; "DraftsFolderName" = "Utkast"; "SieveFolderName" = "Filter"; - - +"OtherUsersFolderName" = "Other Users"; +"SharedFoldersName" = "Shared Folders"; "Folders" = "Mappar"; /* title line */ /* MailMoveToPopUp */ diff --git a/UI/MailerUI/Ukrainian.lproj/Localizable.strings b/UI/MailerUI/Ukrainian.lproj/Localizable.strings index 3e37a8c6a..856b3d318 100644 --- a/UI/MailerUI/Ukrainian.lproj/Localizable.strings +++ b/UI/MailerUI/Ukrainian.lproj/Localizable.strings @@ -277,7 +277,8 @@ = "Неможливо скопіювати повідомлення, оскільки воно вже там є!"; /* Message operations */ - +"The messages could not be moved to the trash folder. Would you like to delete them immediately?" += "The messages could not be moved to the trash folder. Would you like to delete them immediately?"; /* Message editing */ "error_validationfailed" = "Перевірка зазнала невдачі"; diff --git a/UI/MailerUI/Welsh.lproj/Localizable.strings b/UI/MailerUI/Welsh.lproj/Localizable.strings index 24e696478..c42752a34 100644 --- a/UI/MailerUI/Welsh.lproj/Localizable.strings +++ b/UI/MailerUI/Welsh.lproj/Localizable.strings @@ -11,15 +11,15 @@ "Reply" = "Ateb"; "Reply All" = "Ateb Pawb"; "Print" = "Argraffu"; - +"Stop" = "Stop"; "Write" = "Ysgrifennu"; "Send" = "Anfon"; "Contacts" = "Cysylltiadau"; "Attach" = "Atodi"; "Save" = "Cadw"; - - +"Options" = "Options"; +"Size" = "Size"; /* Tooltips */ @@ -49,7 +49,7 @@ "Mail" = "Ebost"; "Right Administration" = "Hawl Gweinyddwr"; - +"Help" = "Help"; /* Mail account main windows */ @@ -79,7 +79,7 @@ "Archive This Folder" = "Archive This Folder"; "Modify the acl of this folder" = "Newid acl y ffolder"; - +"Saved Messages.zip" = "Saved Messages.zip"; "Update" = "Diweddaru"; "Cancel" = "Canslo"; @@ -89,35 +89,35 @@ "From" = "Oddi wrth"; "Subject" = "Testun"; "To" = "At"; - - +"Cc" = "Cc"; +"Bcc" = "Bcc"; "Reply-To" = "Ymateb i"; "Add address" = "Ychwanegu cyfeiriad"; "Attachments:" = "Atodiadau:"; - - - - +"Open" = "Open"; +"Select All" = "Select All"; +"Attach Web Page..." = "Attach Web Page..."; +"Attach File(s)..." = "Attach File(s)..."; "to" = "At"; - - +"cc" = "Cc"; +"bcc" = "Bcc"; "Addressbook" = "Llyfr Cyfeiradau"; "Edit Draft..." = "Golygu Drafft..."; "Load Images" = "Llwytho Delweddau"; - - - - +"Return Receipt" = "Return Receipt"; +"The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?"; +"Return Receipt (displayed) - %@"= "Return Receipt (displayed) - %@"; +"This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents."; "Priority" = "Blaenoriaeth"; "highest" = "Uchaf"; "high" = "Uchel"; - +"normal" = "Normal"; "low" = "Isel"; "lowest" = "Lleiaf"; @@ -142,7 +142,7 @@ "View" = "Gweld"; "All" = "Oll"; "Unread" = "Heb ddarllen"; - +"No message" = "No message"; "messages" = "negeseuon"; "first" = "Cyntaf"; @@ -165,13 +165,13 @@ "InboxFolderName" = "Newydd"; "DraftsFolderName" = "Draffts"; "SieveFolderName" = "Ffilteri"; - - +"OtherUsersFolderName" = "Other Users"; +"SharedFoldersName" = "Shared Folders"; "Folders" = "Ffolderi"; /* title line */ /* MailMoveToPopUp */ - +"MoveTo" = "Move …"; /* Address Popup menu */ "Add to Address Book..." = "Ychwanegu i Llyfr Cyfeiriadau..."; @@ -180,7 +180,7 @@ /* Image Popup menu */ "Save Image" = "Cadw Delwedd"; - +"Save Attachment" = "Save Attachment"; /* Mailbox popup menus */ "Open in New Mail Window" = "Agor mewn ffenestr Neges Newydd"; @@ -196,8 +196,8 @@ "Delete Folder" = "Dileu Ffolder"; "Use This Folder For" = "Defyddio'r Ffolder yma am"; "Get Messages for Account" = "Cael negeseuon ar gyfer Cyfrif"; - - +"Properties..." = "Properties..."; +"Delegation..." = "Delegation..."; /* Use This Folder menu */ "Sent Messages" = "Negeseuon anfonwyd"; @@ -212,7 +212,7 @@ "Edit As New..." = "Golygu fel Newydd..."; "Move To" = "Symud i"; "Copy To" = "Copio i"; - +"Label" = "Label"; "Mark" = "Marc"; "Save As..." = "Cadw Fel..."; "Print Preview" = "Rhagolwg Argraffu"; @@ -250,12 +250,12 @@ "Operation failed" = "Gweithrediad wedi methu"; "Quota" = "cwota:"; - +"quotasFormat" = "%{0}% used on %{1} MB"; "Please select a message." = "Dewiswch neges."; "Please select a message to print." = "Dewiswch neges i'w argraffu."; "Please select only one message to print." = "Dewiswch un neges yn unig i'w argraffu."; - +"The message you have selected doesn't exist anymore." = "The message you have selected doesn't exist anymore."; "The folder with name \"%{0}\" could not be created." @@ -277,7 +277,8 @@ = "Mae copio neges i fewn i'w ffolder ei hun yn amhosibl!"; /* Message operations */ - +"The messages could not be moved to the trash folder. Would you like to delete them immediately?" += "The messages could not be moved to the trash folder. Would you like to delete them immediately?"; /* Message editing */ "error_validationfailed" = "Dilysiad wedi methu"; @@ -285,6 +286,6 @@ "error_missingrecipients" = "Dim derbynnydd wedi nodi"; /* Message sending */ - - - +"cannot send message: (smtp) all recipients discarded" = "Cannot send message: all recipients are invalid."; +"cannot send message (smtp) - recipients discarded:" = "Cannot send message. The following addresses are invalid:"; +"cannot send message: (smtp) error when connecting" = "Cannot send message: error when connecting to the SMTP server."; diff --git a/UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings b/UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings index 550bb3c06..94235dacb 100644 --- a/UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings @@ -1,10 +1,10 @@ /* this file is in UTF-8 format! */ - +"title" = "SOGo"; "Username:" = "Usuário:"; "Password:" = "Senha:"; - +"Domain:" = "Domain:"; "Connect" = "Conectar"; @@ -14,7 +14,7 @@ "browserNotCompatible" = "Foi detectado que a atual versão de seu navegador não é suportado neste site. Recomentamos que use o Firefox. Clique no link abaixo para baixar a versão atual deste navegador."; "alternativeBrowsers" = "Alternativamente, você pode usar os seguinte navegadores compatíveis"; "alternativeBrowserSafari" = "Alternativamente, você pode usar o Safari."; - +"Download" = "Download"; "Language:" = "Idioma:"; "choose" = "Escolha ..."; @@ -37,35 +37,38 @@ "Welsh" = "Cymraeg"; "About" = "Sobre"; +"AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

+SOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

+SOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

+See this page for various support options."; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +"Your account was locked due to too many failed attempts." = "Your account was locked due to too many failed attempts."; +"Your account was locked due to an expired password." = "Your account was locked due to an expired password."; +"Login failed due to unhandled error case: " = "Login failed due to unhandled error case: "; +"Change your Password" = "Change your Password"; +"The password was changed successfully." = "The password was changed successfully."; +"Your password has expired, please enter a new one below:" = "Your password has expired, please enter a new one below:"; +"Password must not be empty." = "Password must not be empty."; +"The passwords do not match. Please try again." = "The passwords do not match. Please try again."; +"Password Grace Period" = "Password Grace Period"; +"You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog."; +"Password about to expire" = "Password about to expire"; +"Your password is going to expire in %{0} %{1}." = "Your password is going to expire in %{0} %{1}."; +"days" = "days"; +"hours" = "hours"; +"minutes" = "minutes"; +"seconds" = "seconds"; +"Password change failed" = "Password change failed"; +"Password change failed - Permission denied" = "Password change failed - Permission denied"; +"Password change failed - Insufficient password quality" = "Password change failed - Insufficient password quality"; +"Password change failed - Password is too short" = "Password change failed - Password is too short"; +"Password change failed - Password is too young" = "Password change failed - Password is too young"; +"Password change failed - Password is in history" = "Password change failed - Password is in history"; +"Unhandled policy error: %{0}" = "Unhandled policy error: %{0}"; +"Unhandled error response" = "Unhandled error response"; +"Password change is not supported." = "Password change is not supported."; +"Unhandled HTTP error code: %{0}" = "Unhandled HTTP error code: %{0}"; +"New password:" = "New password:"; +"Confirmation:" = "Confirmation:"; +"Cancel" = "Cancel"; +"Please wait..." = "Please wait..."; diff --git a/UI/MainUI/Catalan.lproj/Localizable.strings b/UI/MainUI/Catalan.lproj/Localizable.strings index fcc2bbbb6..2f9426abc 100644 --- a/UI/MainUI/Catalan.lproj/Localizable.strings +++ b/UI/MainUI/Catalan.lproj/Localizable.strings @@ -1,10 +1,10 @@ /* this file is in UTF-8 format! */ - +"title" = "SOGo"; "Username:" = "Usuari:"; "Password:" = "Contrasenya:"; - +"Domain:" = "Domain:"; "Connect" = "Connectar"; @@ -16,8 +16,8 @@ "alternativeBrowserSafari" = "Safari."; "Download" = "Descàrrega"; - - +"Language:" = "Language:"; +"choose" = "Choose ..."; "Catalan" = "Català"; "Czech" = "Česky"; "Dutch" = "Nederlands"; @@ -37,13 +37,16 @@ "Welsh" = "Cymraeg"; "About" = "Informació"; - +"AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

+SOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

+SOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

+See this page for various support options."; "Your account was locked due to too many failed attempts." = "El vostre compte ha estat bloquejat per un excés d'intents fallits."; "Your account was locked due to an expired password." = "El vostre compte ha estat bloquejat perquè la contrasenya ha caducat."; "Login failed due to unhandled error case: " = "Connexió fallida a causa d'un error inesperat: "; "Change your Password" = "Canvieu la contrasenya"; - +"The password was changed successfully." = "The password was changed successfully."; "Your password has expired, please enter a new one below:" = "La contrasenya ha caducat; introduïu-ne una de nova:"; "Password must not be empty." = "Heu d'escriure la contrasenya."; "The passwords do not match. Please try again." = "Les contrasenyes no coincideixen. Torneu-ho a intentar."; diff --git a/UI/MainUI/Czech.lproj/Localizable.strings b/UI/MainUI/Czech.lproj/Localizable.strings index 94507d3bc..1eb25adb1 100644 --- a/UI/MainUI/Czech.lproj/Localizable.strings +++ b/UI/MainUI/Czech.lproj/Localizable.strings @@ -1,10 +1,10 @@ /* this file is in UTF-8 format! */ - +"title" = "SOGo"; "Username:" = "Uživatelské jméno:"; "Password:" = "Heslo:"; - +"Domain:" = "Domain:"; "Connect" = "Připojit"; @@ -37,13 +37,16 @@ "Welsh" = "Cymraeg"; "About" = "O"; - +"AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

+SOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

+SOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

+See this page for various support options."; "Your account was locked due to too many failed attempts." = "Váš účet byl zablokován z důvodu mnoha neúspěšných pokusů o přihlášení."; "Your account was locked due to an expired password." = "Váš účet byl zablokován z důvodu expirovaného hesla."; "Login failed due to unhandled error case: " = "Přihlášení selhalo z důvodu chyby: "; "Change your Password" = "Změňte své heslo"; - +"The password was changed successfully." = "The password was changed successfully."; "Your password has expired, please enter a new one below:" = "Vaše heslo expirovalo, prosím zadejte nové:"; "Password must not be empty." = "Heslo nesmí být prázdné."; "The passwords do not match. Please try again." = "Hesla se neshodují. Prosím zadejte znovu."; @@ -61,10 +64,10 @@ "Password change failed - Password is too short" = "Změna hesla selhala - Příliš krátké heslo"; "Password change failed - Password is too young" = "Změna hesla selhala - Příliš nové heslo"; "Password change failed - Password is in history" = "Změna hesla selhala - Heslo je v historii"; - - +"Unhandled policy error: %{0}" = "Unhandled policy error: %{0}"; +"Unhandled error response" = "Unhandled error response"; "Password change is not supported." = "Změna hesla není podporována."; - +"Unhandled HTTP error code: %{0}" = "Unhandled HTTP error code: %{0}"; "New password:" = "Nové heslo:"; "Confirmation:" = "Potvrzení:"; "Cancel" = "Storno"; diff --git a/UI/MainUI/Dutch.lproj/Localizable.strings b/UI/MainUI/Dutch.lproj/Localizable.strings index 67e98433e..0495d89af 100644 --- a/UI/MainUI/Dutch.lproj/Localizable.strings +++ b/UI/MainUI/Dutch.lproj/Localizable.strings @@ -4,7 +4,7 @@ "Username:" = "Gebruikersnaam:"; "Password:" = "Wachtwoord:"; - +"Domain:" = "Domain:"; "Connect" = "Inloggen"; @@ -14,7 +14,7 @@ "browserNotCompatible" = "We hebben gedetecteerd dat de browser die u op dit moment gebruikt niet word ondersteund voor deze site. Onze aanbeveling is Firefox te gebruiken. Hieronder staat een link om de laatste versie van deze browser te downloaden."; "alternativeBrowsers" = "Als alternatief kun u ook de volgende compatible browsers gebruiken."; "alternativeBrowserSafari" = "Als alternatief kunt u ook Safari gebruiken."; - +"Download" = "Download"; "Language:" = "Taal:"; "choose" = "Kies..."; @@ -36,36 +36,39 @@ "Ukrainian" = "Українська"; "Welsh" = "Cymraeg"; +"About" = "About"; +"AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

+SOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

+SOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

+See this page for various support options."; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +"Your account was locked due to too many failed attempts." = "Your account was locked due to too many failed attempts."; +"Your account was locked due to an expired password." = "Your account was locked due to an expired password."; +"Login failed due to unhandled error case: " = "Login failed due to unhandled error case: "; +"Change your Password" = "Change your Password"; +"The password was changed successfully." = "The password was changed successfully."; +"Your password has expired, please enter a new one below:" = "Your password has expired, please enter a new one below:"; +"Password must not be empty." = "Password must not be empty."; +"The passwords do not match. Please try again." = "The passwords do not match. Please try again."; +"Password Grace Period" = "Password Grace Period"; +"You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog."; +"Password about to expire" = "Password about to expire"; +"Your password is going to expire in %{0} %{1}." = "Your password is going to expire in %{0} %{1}."; +"days" = "days"; +"hours" = "hours"; +"minutes" = "minutes"; +"seconds" = "seconds"; +"Password change failed" = "Password change failed"; +"Password change failed - Permission denied" = "Password change failed - Permission denied"; +"Password change failed - Insufficient password quality" = "Password change failed - Insufficient password quality"; +"Password change failed - Password is too short" = "Password change failed - Password is too short"; +"Password change failed - Password is too young" = "Password change failed - Password is too young"; +"Password change failed - Password is in history" = "Password change failed - Password is in history"; +"Unhandled policy error: %{0}" = "Unhandled policy error: %{0}"; +"Unhandled error response" = "Unhandled error response"; +"Password change is not supported." = "Password change is not supported."; +"Unhandled HTTP error code: %{0}" = "Unhandled HTTP error code: %{0}"; +"New password:" = "New password:"; +"Confirmation:" = "Confirmation:"; +"Cancel" = "Cancel"; +"Please wait..." = "Please wait..."; diff --git a/UI/MainUI/French.lproj/Localizable.strings b/UI/MainUI/French.lproj/Localizable.strings index 5831bb16b..e61648eb3 100644 --- a/UI/MainUI/French.lproj/Localizable.strings +++ b/UI/MainUI/French.lproj/Localizable.strings @@ -1,6 +1,6 @@ /* this file is in UTF-8 format! */ - +"title" = "SOGo"; "Username:" = "Nom d'utilisateur :"; "Password:" = "Mot de passe :"; @@ -38,7 +38,10 @@ "Welsh" = "Cymraeg"; "About" = "À propos"; - +"AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

+SOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

+SOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

+See this page for various support options."; "Your account was locked due to too many failed attempts." = "Votre compte a été bloqué dû à un nombre élevé de tentative d'authentification infructueuse."; "Your account was locked due to an expired password." = "Votre compte a été bloqué car votre mot de passe est expiré."; @@ -54,7 +57,7 @@ "Your password is going to expire in %{0} %{1}." = "Votre mot de passe va expirer dans %{0} %{1}."; "days" = "jours"; "hours" = "heures"; - +"minutes" = "minutes"; "seconds" = "secondes"; "Password change failed" = "Échec au changement"; "Password change failed - Permission denied" = "Échec au changement - mauvaises permissions"; @@ -67,6 +70,6 @@ "Password change is not supported." = "Changement de mot de passe non-supporté."; "Unhandled HTTP error code: %{0}" = "Code HTTP non-géré: %{0}"; "New password:" = "Nouveau mot de passe:"; - +"Confirmation:" = "Confirmation:"; "Cancel" = "Annuler"; "Please wait..." = "Veuillez patienter..."; diff --git a/UI/MainUI/German.lproj/Localizable.strings b/UI/MainUI/German.lproj/Localizable.strings index 27874bfc5..7b41adace 100644 --- a/UI/MainUI/German.lproj/Localizable.strings +++ b/UI/MainUI/German.lproj/Localizable.strings @@ -1,10 +1,10 @@ /* this file is in UTF-8 format! */ - +"title" = "SOGo"; "Username:" = "Benutzername:"; "Password:" = "Passwort:"; - +"Domain:" = "Domain:"; "Connect" = "Anmelden"; @@ -37,13 +37,16 @@ "Welsh" = "Cymraeg"; "About" = "Über"; - +"AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

+SOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

+SOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

+See this page for various support options."; "Your account was locked due to too many failed attempts." = "Ihr Konto wurde wegen zu vieler fehlgeschlagener Versuche gesperrt."; "Your account was locked due to an expired password." = "Ihr Konto wurde wegen eines abgelaufenen Passworts gesperrt."; "Login failed due to unhandled error case: " = "Die Anmeldung ist aufgrund eines unbehandelten Fehlers fehlgeschlagen: "; "Change your Password" = "Passwort ändern"; - +"The password was changed successfully." = "The password was changed successfully."; "Your password has expired, please enter a new one below:" = "Ihr Passwort ist abgelaufen. Bitte geben Sie ein neues an:"; "Password must not be empty." = "Passwort darf nicht leer sein."; "The passwords do not match. Please try again." = "Die Passwörter stimmen nicht überein. Bitte noch einmal eingeben."; diff --git a/UI/MainUI/Hungarian.lproj/Localizable.strings b/UI/MainUI/Hungarian.lproj/Localizable.strings index 9580a7cfb..24f2907d6 100644 --- a/UI/MainUI/Hungarian.lproj/Localizable.strings +++ b/UI/MainUI/Hungarian.lproj/Localizable.strings @@ -1,10 +1,10 @@ /* this file is in UTF-8 format! */ - +"title" = "SOGo"; "Username:" = "Felhasználó:"; "Password:" = "Jelszó:"; - +"Domain:" = "Domain:"; "Connect" = "Kapcsolódás"; @@ -37,35 +37,38 @@ "Welsh" = "Cymraeg"; "About" = "Névjegy"; +"AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

+SOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

+SOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

+See this page for various support options."; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +"Your account was locked due to too many failed attempts." = "Your account was locked due to too many failed attempts."; +"Your account was locked due to an expired password." = "Your account was locked due to an expired password."; +"Login failed due to unhandled error case: " = "Login failed due to unhandled error case: "; +"Change your Password" = "Change your Password"; +"The password was changed successfully." = "The password was changed successfully."; +"Your password has expired, please enter a new one below:" = "Your password has expired, please enter a new one below:"; +"Password must not be empty." = "Password must not be empty."; +"The passwords do not match. Please try again." = "The passwords do not match. Please try again."; +"Password Grace Period" = "Password Grace Period"; +"You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog."; +"Password about to expire" = "Password about to expire"; +"Your password is going to expire in %{0} %{1}." = "Your password is going to expire in %{0} %{1}."; +"days" = "days"; +"hours" = "hours"; +"minutes" = "minutes"; +"seconds" = "seconds"; +"Password change failed" = "Password change failed"; +"Password change failed - Permission denied" = "Password change failed - Permission denied"; +"Password change failed - Insufficient password quality" = "Password change failed - Insufficient password quality"; +"Password change failed - Password is too short" = "Password change failed - Password is too short"; +"Password change failed - Password is too young" = "Password change failed - Password is too young"; +"Password change failed - Password is in history" = "Password change failed - Password is in history"; +"Unhandled policy error: %{0}" = "Unhandled policy error: %{0}"; +"Unhandled error response" = "Unhandled error response"; +"Password change is not supported." = "Password change is not supported."; +"Unhandled HTTP error code: %{0}" = "Unhandled HTTP error code: %{0}"; +"New password:" = "New password:"; +"Confirmation:" = "Confirmation:"; +"Cancel" = "Cancel"; +"Please wait..." = "Please wait..."; diff --git a/UI/MainUI/Icelandic.lproj/Localizable.strings b/UI/MainUI/Icelandic.lproj/Localizable.strings index 43da318f6..10842de26 100644 --- a/UI/MainUI/Icelandic.lproj/Localizable.strings +++ b/UI/MainUI/Icelandic.lproj/Localizable.strings @@ -1,10 +1,10 @@ /* this file is in UTF-8 format! */ - +"title" = "SOGo"; "Username:" = "Notandanafn:"; "Password:" = "Lykilorð:"; - +"Domain:" = "Domain:"; "Connect" = "Tengjast"; @@ -42,32 +42,32 @@ SOGo býður upp á auðugt vefviðmót sem byggt er á AJAX viðmóti og það SOGo er dreift í samkvæmt hugbúnaðarleyfinu GNU GPL útgáfu 2 eða nýrri og sumum hlutum er dreift samkvæmt GNU LGPL útgáfu 2. Þetta er frjáls og opinn hugbúnaður: þér er frjálst að breyta honum og dreifa honum. Það er ENGIN ÁBYRGÐ, að því marki sem leyfilegt er, lögum samkvæmt.

Sjá þessa síðu til að skoða ýmsa möguleika á þjónustu."; - - - +"Your account was locked due to too many failed attempts." = "Your account was locked due to too many failed attempts."; +"Your account was locked due to an expired password." = "Your account was locked due to an expired password."; +"Login failed due to unhandled error case: " = "Login failed due to unhandled error case: "; "Change your Password" = "Breyta lykilorði"; - - - - - - - - +"The password was changed successfully." = "The password was changed successfully."; +"Your password has expired, please enter a new one below:" = "Your password has expired, please enter a new one below:"; +"Password must not be empty." = "Password must not be empty."; +"The passwords do not match. Please try again." = "The passwords do not match. Please try again."; +"Password Grace Period" = "Password Grace Period"; +"You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog."; +"Password about to expire" = "Password about to expire"; +"Your password is going to expire in %{0} %{1}." = "Your password is going to expire in %{0} %{1}."; "days" = "daga"; "hours" = "klst."; "minutes" = "mínútur"; "seconds" = "sekúndur"; - - - - - - - - +"Password change failed" = "Password change failed"; +"Password change failed - Permission denied" = "Password change failed - Permission denied"; +"Password change failed - Insufficient password quality" = "Password change failed - Insufficient password quality"; +"Password change failed - Password is too short" = "Password change failed - Password is too short"; +"Password change failed - Password is too young" = "Password change failed - Password is too young"; +"Password change failed - Password is in history" = "Password change failed - Password is in history"; +"Unhandled policy error: %{0}" = "Unhandled policy error: %{0}"; +"Unhandled error response" = "Unhandled error response"; "Password change is not supported." = "Ekki er hægt að breyta lykilorði í póstkerfinu. Notið Ugluna."; - +"Unhandled HTTP error code: %{0}" = "Unhandled HTTP error code: %{0}"; "New password:" = "Nýtt lykilorð:"; "Confirmation:" = "Staðfesting:"; "Cancel" = "Hætta við"; diff --git a/UI/MainUI/Italian.lproj/Localizable.strings b/UI/MainUI/Italian.lproj/Localizable.strings index ef4be7311..a2d33d482 100644 --- a/UI/MainUI/Italian.lproj/Localizable.strings +++ b/UI/MainUI/Italian.lproj/Localizable.strings @@ -1,10 +1,10 @@ /* this file is in UTF-8 format! */ +"title" = "SOGo"; - - - - +"Username:" = "Username:"; +"Password:" = "Password:"; +"Domain:" = "Domain:"; "Connect" = "Entra"; @@ -37,13 +37,16 @@ "Welsh" = "Cymraeg"; "About" = "Informazioni"; - +"AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

+SOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

+SOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

+See this page for various support options."; "Your account was locked due to too many failed attempts." = "Account bloccato a causa di troppi tentativi falliti."; "Your account was locked due to an expired password." = "Account bloccato per password scaduta."; "Login failed due to unhandled error case: " = "Login fallito a causa di un errore non gestito: "; "Change your Password" = "Cambia la tua password"; - +"The password was changed successfully." = "The password was changed successfully."; "Your password has expired, please enter a new one below:" = "La tua password è scaduta, prego inserire la nuova password qui sotto:"; "Password must not be empty." = "La password non può essere vuota."; "The passwords do not match. Please try again." = "Le password non coincidono. Prego riprovare."; diff --git a/UI/MainUI/Norwegian.lproj/Localizable.strings b/UI/MainUI/Norwegian.lproj/Localizable.strings index b5e874fc9..8f1410690 100644 --- a/UI/MainUI/Norwegian.lproj/Localizable.strings +++ b/UI/MainUI/Norwegian.lproj/Localizable.strings @@ -1,10 +1,10 @@ /* this file is in UTF-8 format! */ - +"title" = "SOGo"; "Username:" = "Brukernavn:"; "Password:" = "Passord:"; - +"Domain:" = "Domain:"; "Connect" = "Logg inn"; @@ -37,17 +37,20 @@ "Welsh" = "Cymraeg"; "About" = "Om"; - +"AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

+SOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

+SOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

+See this page for various support options."; "Your account was locked due to too many failed attempts." = "Din konto har blitt låst på grunn av for mange misslykkete innlogginger."; "Your account was locked due to an expired password." = "Din konto har blitt låst fordi ditt passord er utløpt."; - +"Login failed due to unhandled error case: " = "Login failed due to unhandled error case: "; "Change your Password" = "Endre ditt passord"; - +"The password was changed successfully." = "The password was changed successfully."; "Your password has expired, please enter a new one below:" = "Ditt passord har utløpt, vennligst fyll ut et nytt under:"; "Password must not be empty." = "Passordet må ikke være tomt."; "The passwords do not match. Please try again." = "Passordene stemmer ikke overens. Vennligst prøv igjen."; - +"Password Grace Period" = "Password Grace Period"; "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "Du har %{0} gjenværende innlogginger før din konto blir låst. Vennligst endre ditt passord i preferanse-dialogen."; "Password about to expire" = "Passordet er på tur til å utløpe"; "Your password is going to expire in %{0} %{1}." = "Ditt passord vil utløpe om %{0} %{1}."; @@ -61,10 +64,10 @@ "Password change failed - Password is too short" = "Feil ved endring av passord - Passordet er for kort"; "Password change failed - Password is too young" = "Feil ved endring av passord - Password is too young"; "Password change failed - Password is in history" = "Feil ved endring av passord - Password is in history"; - - - - +"Unhandled policy error: %{0}" = "Unhandled policy error: %{0}"; +"Unhandled error response" = "Unhandled error response"; +"Password change is not supported." = "Password change is not supported."; +"Unhandled HTTP error code: %{0}" = "Unhandled HTTP error code: %{0}"; "New password:" = "Nytt passord:"; "Confirmation:" = "Bekreftelse:"; "Cancel" = "Avbryt"; diff --git a/UI/MainUI/Polish.lproj/Localizable.strings b/UI/MainUI/Polish.lproj/Localizable.strings index 63d346bba..8f9ad0604 100644 --- a/UI/MainUI/Polish.lproj/Localizable.strings +++ b/UI/MainUI/Polish.lproj/Localizable.strings @@ -1,10 +1,10 @@ /* this file is in UTF-8 format! */ - +"title" = "SOGo"; "Username:" = "Nazwa użytkownika:"; "Password:" = "Hasło:"; - +"Domain:" = "Domain:"; "Connect" = "Zaloguj"; @@ -37,13 +37,16 @@ "Welsh" = "Cymraeg"; "About" = "O programie"; - +"AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

+SOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

+SOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

+See this page for various support options."; "Your account was locked due to too many failed attempts." = "Twoje konto zostało zablokowane wkutek zbyt wielu nieudanych prób logowania."; "Your account was locked due to an expired password." = "Twoje konto zostało zblokowane z powodu wygaśnięcia ważności hasła."; "Login failed due to unhandled error case: " = "Logowanie nie powiodło się z powodu niezidentyfikowanego błędu: "; "Change your Password" = "Zmień swoje hasło"; - +"The password was changed successfully." = "The password was changed successfully."; "Your password has expired, please enter a new one below:" = "Ważność twojego hasła wygasła, wprowadź niżej nowe hasło:"; "Password must not be empty." = "Hasło nie może być puste."; "The passwords do not match. Please try again." = "Hasła nie są zgodne. Spróbuj jeszcze raz."; diff --git a/UI/MainUI/Russian.lproj/Localizable.strings b/UI/MainUI/Russian.lproj/Localizable.strings index 48240a68a..57579579e 100644 --- a/UI/MainUI/Russian.lproj/Localizable.strings +++ b/UI/MainUI/Russian.lproj/Localizable.strings @@ -1,10 +1,10 @@ /* this file is in UTF-8 format! */ - +"title" = "SOGo"; "Username:" = "Логин:"; "Password:" = "Пароль:"; - +"Domain:" = "Domain:"; "Connect" = "Соединение"; @@ -37,35 +37,38 @@ "Welsh" = "Cymraeg"; "About" = "О системе"; +"AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

+SOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

+SOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

+See this page for various support options."; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +"Your account was locked due to too many failed attempts." = "Your account was locked due to too many failed attempts."; +"Your account was locked due to an expired password." = "Your account was locked due to an expired password."; +"Login failed due to unhandled error case: " = "Login failed due to unhandled error case: "; +"Change your Password" = "Change your Password"; +"The password was changed successfully." = "The password was changed successfully."; +"Your password has expired, please enter a new one below:" = "Your password has expired, please enter a new one below:"; +"Password must not be empty." = "Password must not be empty."; +"The passwords do not match. Please try again." = "The passwords do not match. Please try again."; +"Password Grace Period" = "Password Grace Period"; +"You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog."; +"Password about to expire" = "Password about to expire"; +"Your password is going to expire in %{0} %{1}." = "Your password is going to expire in %{0} %{1}."; +"days" = "days"; +"hours" = "hours"; +"minutes" = "minutes"; +"seconds" = "seconds"; +"Password change failed" = "Password change failed"; +"Password change failed - Permission denied" = "Password change failed - Permission denied"; +"Password change failed - Insufficient password quality" = "Password change failed - Insufficient password quality"; +"Password change failed - Password is too short" = "Password change failed - Password is too short"; +"Password change failed - Password is too young" = "Password change failed - Password is too young"; +"Password change failed - Password is in history" = "Password change failed - Password is in history"; +"Unhandled policy error: %{0}" = "Unhandled policy error: %{0}"; +"Unhandled error response" = "Unhandled error response"; +"Password change is not supported." = "Password change is not supported."; +"Unhandled HTTP error code: %{0}" = "Unhandled HTTP error code: %{0}"; +"New password:" = "New password:"; +"Confirmation:" = "Confirmation:"; +"Cancel" = "Cancel"; +"Please wait..." = "Please wait..."; diff --git a/UI/MainUI/Spanish.lproj/Localizable.strings b/UI/MainUI/Spanish.lproj/Localizable.strings index 158161faf..a6c48c54b 100644 --- a/UI/MainUI/Spanish.lproj/Localizable.strings +++ b/UI/MainUI/Spanish.lproj/Localizable.strings @@ -1,10 +1,10 @@ /* this file is in UTF-8 format! */ - +"title" = "SOGo"; "Username:" = "Usuario:"; "Password:" = "Contraseña:"; - +"Domain:" = "Domain:"; "Connect" = "Conectar"; @@ -46,7 +46,7 @@ Ver esta página pa "Your account was locked due to an expired password." = "Su cuenta ha sido bloqueada debido a una contraseña caducada."; "Login failed due to unhandled error case: " = "Conexión fallida debido a un error desconocido: "; "Change your Password" = "Cambie su contraseña"; - +"The password was changed successfully." = "The password was changed successfully."; "Your password has expired, please enter a new one below:" = "Su contraseña ha caducado, por favor, introduzca una nueva abajo:"; "Password must not be empty." = "La contraseña no puede estar vacía."; "The passwords do not match. Please try again." = "La contraseña no es igual. Por favor, intentelo de nuevo."; diff --git a/UI/MainUI/Swedish.lproj/Localizable.strings b/UI/MainUI/Swedish.lproj/Localizable.strings index c2673d820..3ae07ac27 100644 --- a/UI/MainUI/Swedish.lproj/Localizable.strings +++ b/UI/MainUI/Swedish.lproj/Localizable.strings @@ -1,10 +1,10 @@ /* this file is in UTF-8 format! */ - +"title" = "SOGo"; "Username:" = "Användarnamn:"; "Password:" = "Lösenord:"; - +"Domain:" = "Domain:"; "Connect" = "Logga in"; @@ -37,13 +37,16 @@ "Welsh" = "Cymraeg"; "About" = "Om"; - +"AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

+SOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

+SOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

+See this page for various support options."; "Your account was locked due to too many failed attempts." = "Ditt konto är spärrat pga för många misslyckade inloggningsförsök."; "Your account was locked due to an expired password." = "Ditt konto är spärrat pga att lösenordet har slutat gälla."; "Login failed due to unhandled error case: " = "Inloggningen misslyckades pga ett okänt fel: "; "Change your Password" = "Ändra ditt lösenord"; - +"The password was changed successfully." = "The password was changed successfully."; "Your password has expired, please enter a new one below:" = "Ditt lösenord har slutat gälla, mata in ett nytt lösenord nedan:"; "Password must not be empty." = "Lösenordet får inte vara tomt."; "The passwords do not match. Please try again." = "Felaktigt lösenord. Försök igen."; diff --git a/UI/MainUI/Ukrainian.lproj/Localizable.strings b/UI/MainUI/Ukrainian.lproj/Localizable.strings index bb4053480..50c7b6a8e 100644 --- a/UI/MainUI/Ukrainian.lproj/Localizable.strings +++ b/UI/MainUI/Ukrainian.lproj/Localizable.strings @@ -1,10 +1,10 @@ /* this file is in UTF-8 format! */ - +"title" = "SOGo"; "Username:" = "Лоґін:"; "Password:" = "Пароль:"; - +"Domain:" = "Domain:"; "Connect" = "Увійти"; @@ -49,7 +49,7 @@ SOGo забезпечує зручний веб-інтерфейс на осно "Your account was locked due to an expired password." = "Ваш обліковий запис заблоковано, оскільки закінчився термін дії пароля."; "Login failed due to unhandled error case: " = "Невдала спроба авторизація через невизначену помилку: "; "Change your Password" = "Змініть Ваш пароль"; - +"The password was changed successfully." = "The password was changed successfully."; "Your password has expired, please enter a new one below:" = "Закінчився термін дії Вашого пароля, будь ласка, введіть новий нижче:"; "Password must not be empty." = "Пароль не може бути порожнім."; "The passwords do not match. Please try again." = "Паролі не співпадають. Будь ласка, спробуйте ще раз."; diff --git a/UI/MainUI/Welsh.lproj/Localizable.strings b/UI/MainUI/Welsh.lproj/Localizable.strings index 4cbf9aa33..81eabedf5 100644 --- a/UI/MainUI/Welsh.lproj/Localizable.strings +++ b/UI/MainUI/Welsh.lproj/Localizable.strings @@ -1,10 +1,10 @@ /* this file is in UTF-8 format! */ - +"title" = "SOGo"; "Username:" = "Enw defnyddiwr:"; "Password:" = "Cyfrinair:"; - +"Domain:" = "Domain:"; "Connect" = "Cysylltu"; @@ -36,36 +36,39 @@ "Ukrainian" = "Українська"; "Welsh" = "Cymraeg"; +"About" = "About"; +"AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

+SOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

+SOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

+See this page for various support options."; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +"Your account was locked due to too many failed attempts." = "Your account was locked due to too many failed attempts."; +"Your account was locked due to an expired password." = "Your account was locked due to an expired password."; +"Login failed due to unhandled error case: " = "Login failed due to unhandled error case: "; +"Change your Password" = "Change your Password"; +"The password was changed successfully." = "The password was changed successfully."; +"Your password has expired, please enter a new one below:" = "Your password has expired, please enter a new one below:"; +"Password must not be empty." = "Password must not be empty."; +"The passwords do not match. Please try again." = "The passwords do not match. Please try again."; +"Password Grace Period" = "Password Grace Period"; +"You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog."; +"Password about to expire" = "Password about to expire"; +"Your password is going to expire in %{0} %{1}." = "Your password is going to expire in %{0} %{1}."; +"days" = "days"; +"hours" = "hours"; +"minutes" = "minutes"; +"seconds" = "seconds"; +"Password change failed" = "Password change failed"; +"Password change failed - Permission denied" = "Password change failed - Permission denied"; +"Password change failed - Insufficient password quality" = "Password change failed - Insufficient password quality"; +"Password change failed - Password is too short" = "Password change failed - Password is too short"; +"Password change failed - Password is too young" = "Password change failed - Password is too young"; +"Password change failed - Password is in history" = "Password change failed - Password is in history"; +"Unhandled policy error: %{0}" = "Unhandled policy error: %{0}"; +"Unhandled error response" = "Unhandled error response"; +"Password change is not supported." = "Password change is not supported."; +"Unhandled HTTP error code: %{0}" = "Unhandled HTTP error code: %{0}"; +"New password:" = "New password:"; +"Confirmation:" = "Confirmation:"; +"Cancel" = "Cancel"; +"Please wait..." = "Please wait..."; diff --git a/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings b/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings index 2a9833779..f403b5dec 100644 --- a/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings @@ -5,34 +5,36 @@ /* tabs */ "General" = "Geral"; "Calendar Options" = "Calendário"; - +"Contacts Options" = "Contacts Options"; "Mail Options" = "Correio"; - - - +"IMAP Accounts" = "IMAP Accounts"; +"Vacation" = "Vacation"; +"Forward" = "Forward"; "Password" = "Senha"; - - - - - +"Categories" = "Categories"; +"Name" = "Name"; +"Color" = "Color"; +"Add" = "Add"; +"Delete" = "Delete"; /* contacts categories */ - +"contacts_category_labels" = "Colleague, Competitor, Customer, Friend, Family, Business Partner, Provider, Press, VIP"; /* vacation (auto-reply) */ - +"Enable vacation auto reply" = "Enable vacation auto reply"; "Auto reply message :" = "AutoResponder somente uma vez a cada remetente com o seguinte texto :"; - - - - - +"Email addresses (separated by commas) :" = "Email addresses (separated by commas) :"; +"Add default email addresses" = "Add default email addresses"; +"Days between responses :" = "Days between responses :"; +"Do not send responses to mailing lists" = "Do not send responses to mailing lists"; +"Please specify your message and your email addresses for which you want to enable auto reply." += "Please specify your message and your email addresses for which you want to enable auto reply."; /* forward messages */ - - - +"Forward incoming messages" = "Forward incoming messages"; +"Keep a copy" = "Keep a copy"; +"Please specify an address to which you want to forward your messages." += "Please specify an address to which you want to forward your messages."; /* d & t */ "Current Time Zone :" = "Fuso Horário :"; @@ -40,47 +42,46 @@ "Long Date Format :" = "Formato da Data (Longo) :"; "Time Format :" = "Formato da Hora :"; +"default" = "Default"; +"shortDateFmt_0" = "%d-%b-%y"; +"shortDateFmt_1" = "%d-%m-%y"; +"shortDateFmt_2" = "%d/%m/%y"; +"shortDateFmt_3" = "%e/%m/%y"; +"shortDateFmt_4" = "%d-%m-%Y"; +"shortDateFmt_5" = "%d/%m/%Y"; +"shortDateFmt_6" = "%m-%d-%y"; +"shortDateFmt_7" = "%m/%d/%y"; +"shortDateFmt_8" = "%m/%e/%y"; +"shortDateFmt_9" = "%y-%m-%d"; +"shortDateFmt_10" = "%y/%m/%d"; +"shortDateFmt_11" = "%y.%m.%d"; +"shortDateFmt_12" = "%Y-%m-%d"; +"shortDateFmt_13" = "%Y/%m/%d"; +"shortDateFmt_14" = "%Y.%m.%d"; - - - - - - - - - - - - - - - - - +"shortDateFmt_15" = ""; +"longDateFmt_0" = "%A, %B %d, %Y"; +"longDateFmt_1" = "%B %d, %Y"; +"longDateFmt_2" = "%A, %d %B, %Y"; +"longDateFmt_3" = "%d %B, %Y"; +"longDateFmt_4" = ""; - - - - - - - - +"timeFmt_0" = "%I:%M %p"; +"timeFmt_1" = "%H:%M"; +"timeFmt_2" = ""; /* calendar */ "Week begins on :" = "A Semana começa em :"; "Day start time :" = "O Dia começa as :"; "Day end time :" = "O Dia termina as :"; - - +"Day start time must be prior to day end time." = "Day start time must be prior to day end time."; "First week of year :" = "Primeira semana do ano :"; "Enable reminders for Calendar items" = "Habilitar lembretes para os itens do Calendário"; "Play a sound when a reminder comes due" @@ -92,10 +93,10 @@ "firstWeekOfYear_FirstFullWeek" = "Primeira semana com 5 dias"; /* Default Calendar */ - - - - +"Default calendar :" = "Default calendar"; +"selectedCalendar" = "Selected calendar"; +"personalCalendar" = "Personal calendar"; +"firstCalendar" = "First enabled calendar"; "reminderTime_0000" = "0 minutos"; "reminderTime_0005" = "5 minutos"; @@ -103,7 +104,7 @@ "reminderTime_0015" = "15 minutos"; "reminderTime_0030" = "30 minutos"; "reminderTime_0100" = "1 hora"; - +"reminderTime_0200" = "2 hours"; "reminderTime_0400" = "4 horas"; "reminderTime_0800" = "8 horas"; "reminderTime_1200" = "1/2 dia"; @@ -112,7 +113,7 @@ /* Mailer */ "Show subscribed mailboxes only" = "Exibir somente caixas de correio inscritas"; - +"Sort messages by threads" = "Sort messages by threads"; "Check for new mail:" = "Checar novos emails:"; "messagecheck_manually" = "Manualmente"; "messagecheck_every_minute" = "A cada minuto"; @@ -132,25 +133,25 @@ "And place my signature" = "E colocar minha assinatura"; "signatureplacement_above" = "abaixo da minha resposta"; "signatureplacement_below" = "abaixo da citação"; - - - +"Compose messages in" = "Compose messages in"; +"composemessagestype_html" = "HTML"; +"composemessagestype_text" = "Plain text"; /* IMAP Accounts */ +"New Mail Account" = "New Mail Account"; - - - - +"Server Name:" = "Server Name:"; +"Port:" = "Port:"; +"User Name:" = "User Name:"; "Password:" = "Senha:"; - - +"Full Name:" = "Full Name:"; +"Email:" = "Email:"; "Signature:" = "Assinatura:"; - +"(Click to create)" = "(Click to create)"; "Signature" = "Assinatura"; - +"Please enter your signature below:" = "Please enter your signature below:"; /* Additional Parameters */ "Additional Parameters" = "Parâmetros Adicionais"; @@ -165,11 +166,11 @@ "calendar_category_labels" = "Aniversário,Negócios,Ligações,Concorrência,Cliente,Favoritos,Acompanhamento,Presentes,Feriados,Idéias,Meeting,Problemas,Miscelânea,Pessoal,Projetos,Feriado público,Posição,Fornecedores,Viagem,Férias"; /* Default module */ - - - - - +"Calendar" = "Calendar"; +"Contacts" = "Address Book"; +"Mail" = "Mail"; +"Last" = "Last used"; +"Default module :" = "Default module :"; "Language :" = "Idioma :"; "choose" = "Escolha ..."; @@ -190,81 +191,81 @@ "Welsh" = "Cymraeg"; /* Return receipts */ +"When I receive a request for a return receipt:" = "When I receive a request for a return receipt:"; +"Never send a return receipt" = "Never send a return receipt"; +"Allow return receipts for some messages" = "Allow return receipts for some messages"; +"If I'm not in the To or Cc of the message:" = "If I'm not in the To or Cc of the message:"; +"If the sender is outside my domain:" = "If the sender is outside my domain:"; +"In all other cases:" = "In all other cases:"; - - - - - - - - - +"Never send" = "Never send"; +"Always send" = "Always send"; +"Ask me" = "Ask me"; /* Return receipts */ +"When I receive a request for a return receipt:" = "When I receive a request for a return receipt:"; +"Never send a return receipt" = "Never send a return receipt"; +"Allow return receipts for some messages" = "Allow return receipts for some messages"; +"If I'm not in the To or Cc of the message:" = "If I'm not in the To or Cc of the message:"; +"If the sender is outside my domain:" = "If the sender is outside my domain:"; +"In all other cases:" = "In all other cases:"; - - - - - - - - - +"Never send" = "Never send"; +"Always send" = "Always send"; +"Ask me" = "Ask me"; /* Filters - UIxPreferences */ - - - - +"Filters" = "Filters"; +"Active" = "Active"; +"Move Up" = "Move Up"; +"Move Down" = "Move Down"; /* Filters - UIxFilterEditor */ +"Filter name:" = "Filter name:"; +"For incoming messages that" = "For incoming messages that"; +"match all of the following rules:" = "match all of the following rules:"; +"match any of the following rules:" = "match any of the following rules:"; +"match all messages" = "match all messages"; +"Perform these actions:" = "Perform these actions:"; +"Subject" = "Subject"; +"From" = "From"; +"To" = "To"; +"Cc" = "Cc"; +"To or Cc" = "To or Cc"; +"Size (Kb)" = "Size (Kb)"; +"Header" = "Header"; +"Flag the message with:" = "Flag the message with:"; +"Discard the message" = "Discard the message"; +"File the message in:" = "File the message in:"; +"Keep the message" = "Keep the message"; +"Forward the message to:" = "Forward the message to:"; +"Send a reject message:" = "Send a reject message:"; +"Send a vacation message" = "Send a vacation message"; +"Stop processing filter rules" = "Stop processing filter rules"; - - - - - - - - - - - - - - - - - - - - - - - +"is under" = "is under"; +"is over" = "is over"; "is" = "is"; +"is not" = "is not"; +"contains" = "contains"; +"does not contain" = "does not contain"; +"matches" = "matches"; +"does not match" = "does not match"; +"matches regex" = "matches regex"; +"does not match regex" = "does not match regex"; - - - - - - - - - - - - - - - - - - +"Seen" = "Seen"; +"Deleted" = "Deleted"; +"Answered" = "Answered"; +"Flagged" = "Flagged"; +"Junk" = "Junk"; +"Not Junk" = "Not Junk"; +"Label 1" = "Label 1"; +"Label 2" = "Label 2"; +"Label 3" = "Label 3"; +"Label 4" = "Label 4"; +"Label 5" = "Label 5"; "Password must not be empty." = "Le mot de passe ne doit pas être vide."; "The passwords do not match. Please try again." = "Les mots de passe ne sont pas identiques. Essayez de nouveau."; diff --git a/UI/PreferencesUI/Hungarian.lproj/Localizable.strings b/UI/PreferencesUI/Hungarian.lproj/Localizable.strings index dff763141..67778850f 100644 --- a/UI/PreferencesUI/Hungarian.lproj/Localizable.strings +++ b/UI/PreferencesUI/Hungarian.lproj/Localizable.strings @@ -5,34 +5,36 @@ /* tabs */ "General" = "Általános"; "Calendar Options" = "Naptár"; - +"Contacts Options" = "Contacts Options"; "Mail Options" = "Levelezés"; - - - +"IMAP Accounts" = "IMAP Accounts"; +"Vacation" = "Vacation"; +"Forward" = "Forward"; "Password" = "Jelszó"; - - - - - +"Categories" = "Categories"; +"Name" = "Name"; +"Color" = "Color"; +"Add" = "Add"; +"Delete" = "Delete"; /* contacts categories */ - +"contacts_category_labels" = "Colleague, Competitor, Customer, Friend, Family, Business Partner, Provider, Press, VIP"; /* vacation (auto-reply) */ - +"Enable vacation auto reply" = "Enable vacation auto reply"; "Auto reply message :" = "Automatikus válasz minden feladónak csak egy alkalommal :"; - - - - - +"Email addresses (separated by commas) :" = "Email addresses (separated by commas) :"; +"Add default email addresses" = "Add default email addresses"; +"Days between responses :" = "Days between responses :"; +"Do not send responses to mailing lists" = "Do not send responses to mailing lists"; +"Please specify your message and your email addresses for which you want to enable auto reply." += "Please specify your message and your email addresses for which you want to enable auto reply."; /* forward messages */ - - - +"Forward incoming messages" = "Forward incoming messages"; +"Keep a copy" = "Keep a copy"; +"Please specify an address to which you want to forward your messages." += "Please specify an address to which you want to forward your messages."; /* d & t */ "Current Time Zone :" = "Időzóna :"; @@ -40,47 +42,46 @@ "Long Date Format :" = "Hosszú dátumformátum :"; "Time Format :" = "Időformátum :"; +"default" = "Default"; +"shortDateFmt_0" = "%d-%b-%y"; +"shortDateFmt_1" = "%d-%m-%y"; +"shortDateFmt_2" = "%d/%m/%y"; +"shortDateFmt_3" = "%e/%m/%y"; +"shortDateFmt_4" = "%d-%m-%Y"; +"shortDateFmt_5" = "%d/%m/%Y"; +"shortDateFmt_6" = "%m-%d-%y"; +"shortDateFmt_7" = "%m/%d/%y"; +"shortDateFmt_8" = "%m/%e/%y"; +"shortDateFmt_9" = "%y-%m-%d"; +"shortDateFmt_10" = "%y/%m/%d"; +"shortDateFmt_11" = "%y.%m.%d"; +"shortDateFmt_12" = "%Y-%m-%d"; +"shortDateFmt_13" = "%Y/%m/%d"; +"shortDateFmt_14" = "%Y.%m.%d"; - - - - - - - - - - - - - - - - - +"shortDateFmt_15" = ""; "longDateFmt_0" = "%Y %B %d, %A"; - - - - +"longDateFmt_1" = "%B %d, %Y"; +"longDateFmt_2" = "%A, %d %B, %Y"; +"longDateFmt_3" = "%d %B, %Y"; +"longDateFmt_4" = ""; "timeFmt_0" = "%H:%M"; "timeFmt_1" = "%I:%M %p"; - +"timeFmt_2" = ""; /* calendar */ "Week begins on :" = "Hét kezdőnapja:"; "Day start time :" = "Nap kezdete:"; "Day end time :" = "Nap vége:"; - - +"Day start time must be prior to day end time." = "Day start time must be prior to day end time."; "First week of year :" = "Év első hete:"; "Enable reminders for Calendar items" = "Emlékeztető engedélyezése a naptárbejegyzésekhez"; "Play a sound when a reminder comes due" @@ -92,10 +93,10 @@ "firstWeekOfYear_FirstFullWeek" = "Első teljes héttől"; /* Default Calendar */ - - - - +"Default calendar :" = "Default calendar"; +"selectedCalendar" = "Selected calendar"; +"personalCalendar" = "Personal calendar"; +"firstCalendar" = "First enabled calendar"; "reminderTime_0000" = "0 perc"; "reminderTime_0005" = "5 perc"; @@ -112,7 +113,7 @@ /* Mailer */ "Show subscribed mailboxes only" = "Csak azok a fiókok mutatása, amelyre feliratkozott"; - +"Sort messages by threads" = "Sort messages by threads"; "Check for new mail:" = "Új üzenetek letöltése:"; "messagecheck_manually" = "Kézi"; "messagecheck_every_minute" = "Percenként"; @@ -133,24 +134,24 @@ "signatureplacement_above" = "az üzenetem alá"; "signatureplacement_below" = "az idézet alá"; "Compose messages in" = "Üzenet formátuma"; - +"composemessagestype_html" = "HTML"; "composemessagestype_text" = "Egyszerű szöveg"; /* IMAP Accounts */ +"New Mail Account" = "New Mail Account"; - - - - +"Server Name:" = "Server Name:"; +"Port:" = "Port:"; +"User Name:" = "User Name:"; "Password:" = "Jelszó:"; - - +"Full Name:" = "Full Name:"; +"Email:" = "Email:"; "Signature:" = "Aláírás:"; - +"(Click to create)" = "(Click to create)"; "Signature" = "Aláírás"; - +"Please enter your signature below:" = "Please enter your signature below:"; /* Additional Parameters */ "Additional Parameters" = "További beállítások"; @@ -165,11 +166,11 @@ "calendar_category_labels" = "Évforduló,Születésnap,Üzleti,Meghívás,Ügyfelek,Versenytársak,Vevő,Kedvencek,Nyomonkövetés,Ajándékozás,Szabadság,Ötletek,Meeting,Ügyek,Egyéb,Személyes,Projektek,Állami ünnep,Állapot,Szállítók,Utazás,Szünidő"; /* Default module */ - - - - - +"Calendar" = "Calendar"; +"Contacts" = "Address Book"; +"Mail" = "Mail"; +"Last" = "Last used"; +"Default module :" = "Default module :"; "Language :" = "Nyelv :"; "choose" = "Válasszon ..."; @@ -190,81 +191,81 @@ "Welsh" = "Cymraeg"; /* Return receipts */ +"When I receive a request for a return receipt:" = "When I receive a request for a return receipt:"; +"Never send a return receipt" = "Never send a return receipt"; +"Allow return receipts for some messages" = "Allow return receipts for some messages"; +"If I'm not in the To or Cc of the message:" = "If I'm not in the To or Cc of the message:"; +"If the sender is outside my domain:" = "If the sender is outside my domain:"; +"In all other cases:" = "In all other cases:"; - - - - - - - - - +"Never send" = "Never send"; +"Always send" = "Always send"; +"Ask me" = "Ask me"; /* Return receipts */ +"When I receive a request for a return receipt:" = "When I receive a request for a return receipt:"; +"Never send a return receipt" = "Never send a return receipt"; +"Allow return receipts for some messages" = "Allow return receipts for some messages"; +"If I'm not in the To or Cc of the message:" = "If I'm not in the To or Cc of the message:"; +"If the sender is outside my domain:" = "If the sender is outside my domain:"; +"In all other cases:" = "In all other cases:"; - - - - - - - - - +"Never send" = "Never send"; +"Always send" = "Always send"; +"Ask me" = "Ask me"; /* Filters - UIxPreferences */ - - - - +"Filters" = "Filters"; +"Active" = "Active"; +"Move Up" = "Move Up"; +"Move Down" = "Move Down"; /* Filters - UIxFilterEditor */ +"Filter name:" = "Filter name:"; +"For incoming messages that" = "For incoming messages that"; +"match all of the following rules:" = "match all of the following rules:"; +"match any of the following rules:" = "match any of the following rules:"; +"match all messages" = "match all messages"; +"Perform these actions:" = "Perform these actions:"; +"Subject" = "Subject"; +"From" = "From"; +"To" = "To"; +"Cc" = "Cc"; +"To or Cc" = "To or Cc"; +"Size (Kb)" = "Size (Kb)"; +"Header" = "Header"; +"Flag the message with:" = "Flag the message with:"; +"Discard the message" = "Discard the message"; +"File the message in:" = "File the message in:"; +"Keep the message" = "Keep the message"; +"Forward the message to:" = "Forward the message to:"; +"Send a reject message:" = "Send a reject message:"; +"Send a vacation message" = "Send a vacation message"; +"Stop processing filter rules" = "Stop processing filter rules"; - - - - - - - - - - - - - - - - - - - - - - - +"is under" = "is under"; +"is over" = "is over"; "is" = "is"; +"is not" = "is not"; +"contains" = "contains"; +"does not contain" = "does not contain"; +"matches" = "matches"; +"does not match" = "does not match"; +"matches regex" = "matches regex"; +"does not match regex" = "does not match regex"; - - - - - - - - - - - - - - - - - - +"Seen" = "Seen"; +"Deleted" = "Deleted"; +"Answered" = "Answered"; +"Flagged" = "Flagged"; +"Junk" = "Junk"; +"Not Junk" = "Not Junk"; +"Label 1" = "Label 1"; +"Label 2" = "Label 2"; +"Label 3" = "Label 3"; +"Label 4" = "Label 4"; +"Label 5" = "Label 5"; "Password must not be empty." = "Le mot de passe ne doit pas être vide."; "The passwords do not match. Please try again." = "Les mots de passe ne sont pas identiques. Essayez de nouveau."; diff --git a/UI/PreferencesUI/Norwegian.lproj/Localizable.strings b/UI/PreferencesUI/Norwegian.lproj/Localizable.strings index 300fff7d0..cc50e232a 100644 --- a/UI/PreferencesUI/Norwegian.lproj/Localizable.strings +++ b/UI/PreferencesUI/Norwegian.lproj/Localizable.strings @@ -44,45 +44,44 @@ "default" = "Standard"; +"shortDateFmt_0" = "%d-%b-%y"; +"shortDateFmt_1" = "%d-%m-%y"; +"shortDateFmt_2" = "%d/%m/%y"; +"shortDateFmt_3" = "%e/%m/%y"; +"shortDateFmt_4" = "%d-%m-%Y"; +"shortDateFmt_5" = "%d/%m/%Y"; +"shortDateFmt_6" = "%m-%d-%y"; +"shortDateFmt_7" = "%m/%d/%y"; +"shortDateFmt_8" = "%m/%e/%y"; +"shortDateFmt_9" = "%y-%m-%d"; +"shortDateFmt_10" = "%y/%m/%d"; +"shortDateFmt_11" = "%y.%m.%d"; +"shortDateFmt_12" = "%Y-%m-%d"; +"shortDateFmt_13" = "%Y/%m/%d"; +"shortDateFmt_14" = "%Y.%m.%d"; - - - - - - - - - - - - - - - - +"shortDateFmt_15" = ""; +"longDateFmt_0" = "%A, %B %d, %Y"; +"longDateFmt_1" = "%B %d, %Y"; +"longDateFmt_2" = "%A, %d %B, %Y"; +"longDateFmt_3" = "%d %B, %Y"; +"longDateFmt_4" = ""; - - - - - - - - +"timeFmt_0" = "%I:%M %p"; +"timeFmt_1" = "%H:%M"; +"timeFmt_2" = ""; /* calendar */ "Week begins on :" = "Uken begynner med:"; "Day start time :" = "Dagen begynner kl.:"; "Day end time :" = "Dagen slutter kl.:"; "Day start time must be prior to day end time." = "Dagens starttid må være før dagens sluttid."; - "First week of year :" = "Første uken i året:"; "Enable reminders for Calendar items" = "Aktivere påminnelser for kalenderelementer"; "Play a sound when a reminder comes due" @@ -94,10 +93,10 @@ "firstWeekOfYear_FirstFullWeek" = "Første hele uken i året"; /* Default Calendar */ - - - - +"Default calendar :" = "Default calendar"; +"selectedCalendar" = "Selected calendar"; +"personalCalendar" = "Personal calendar"; +"firstCalendar" = "First enabled calendar"; "reminderTime_0000" = "0 minutter"; "reminderTime_0005" = "5 minutter"; @@ -114,7 +113,7 @@ /* Mailer */ "Show subscribed mailboxes only" = "Vis bare abonnerte postbokser"; - +"Sort messages by threads" = "Sort messages by threads"; "Check for new mail:" = "Hent ny post:"; "messagecheck_manually" = "Manuelt"; "messagecheck_every_minute" = "Hvert minutt"; @@ -135,14 +134,14 @@ "signatureplacement_above" = "over mitt svar"; "signatureplacement_below" = "under mitt svar"; "Compose messages in" = "Opprett melding i"; - +"composemessagestype_html" = "HTML"; "composemessagestype_text" = "Ren text"; /* IMAP Accounts */ "New Mail Account" = "Ny epostkonto"; "Server Name:" = "Servernavn:"; - +"Port:" = "Port:"; "User Name:" = "Brukernavn:"; "Password:" = "Passord:"; diff --git a/UI/PreferencesUI/Swedish.lproj/Localizable.strings b/UI/PreferencesUI/Swedish.lproj/Localizable.strings index 730d389dd..09b2b68ef 100644 --- a/UI/PreferencesUI/Swedish.lproj/Localizable.strings +++ b/UI/PreferencesUI/Swedish.lproj/Localizable.strings @@ -44,45 +44,44 @@ "default" = "Standard"; +"shortDateFmt_0" = "%d-%b-%y"; +"shortDateFmt_1" = "%d-%m-%y"; +"shortDateFmt_2" = "%d/%m/%y"; +"shortDateFmt_3" = "%e/%m/%y"; +"shortDateFmt_4" = "%d-%m-%Y"; +"shortDateFmt_5" = "%d/%m/%Y"; +"shortDateFmt_6" = "%m-%d-%y"; +"shortDateFmt_7" = "%m/%d/%y"; +"shortDateFmt_8" = "%m/%e/%y"; +"shortDateFmt_9" = "%y-%m-%d"; +"shortDateFmt_10" = "%y/%m/%d"; +"shortDateFmt_11" = "%y.%m.%d"; +"shortDateFmt_12" = "%Y-%m-%d"; +"shortDateFmt_13" = "%Y/%m/%d"; +"shortDateFmt_14" = "%Y.%m.%d"; - - - - - - - - - - - - - - - - +"shortDateFmt_15" = ""; +"longDateFmt_0" = "%A, %B %d, %Y"; +"longDateFmt_1" = "%B %d, %Y"; +"longDateFmt_2" = "%A, %d %B, %Y"; +"longDateFmt_3" = "%d %B, %Y"; +"longDateFmt_4" = ""; - - - - - - - - +"timeFmt_0" = "%I:%M %p"; +"timeFmt_1" = "%H:%M"; +"timeFmt_2" = ""; /* calendar */ "Week begins on :" = "Veckan börjar med:"; "Day start time :" = "Dagen börjar kl:"; "Day end time :" = "Dagen slutar kl:"; "Day start time must be prior to day end time." = "Dagens starttid måste vara före dagens sluttid."; - "First week of year :" = "Första veckan på året:"; "Enable reminders for Calendar items" = "Aktivera påminnelser för kalenderposter"; "Play a sound when a reminder comes due" @@ -94,10 +93,10 @@ "firstWeekOfYear_FirstFullWeek" = "Första hela veckan på året"; /* Default Calendar */ - - - - +"Default calendar :" = "Default calendar"; +"selectedCalendar" = "Selected calendar"; +"personalCalendar" = "Personal calendar"; +"firstCalendar" = "First enabled calendar"; "reminderTime_0000" = "0 minuter"; "reminderTime_0005" = "5 minuter"; @@ -114,7 +113,7 @@ /* Mailer */ "Show subscribed mailboxes only" = "Visa endast prenumrerade postlådor"; - +"Sort messages by threads" = "Sort messages by threads"; "Check for new mail:" = "Hämta ny post:"; "messagecheck_manually" = "Manuellt"; "messagecheck_every_minute" = "Varje minut"; @@ -135,7 +134,7 @@ "signatureplacement_above" = "under mitt svar"; "signatureplacement_below" = "under det infogade meddelandet"; "Compose messages in" = "Skriv meddelanden i"; - +"composemessagestype_html" = "HTML"; "composemessagestype_text" = "Oformaterad text"; /* IMAP Accounts */ @@ -144,7 +143,7 @@ "Server Name:" = " Servernamn:"; - +"Port:" = "Port:"; "User Name:" = "Användarnamn:"; "Password:" = "Lösenord:"; diff --git a/UI/PreferencesUI/Ukrainian.lproj/Localizable.strings b/UI/PreferencesUI/Ukrainian.lproj/Localizable.strings index 01ecd85f1..f5442fa85 100644 --- a/UI/PreferencesUI/Ukrainian.lproj/Localizable.strings +++ b/UI/PreferencesUI/Ukrainian.lproj/Localizable.strings @@ -17,6 +17,9 @@ "Add" = "Додати"; "Delete" = "Вилучити"; +/* "Cancel" = "Скасувати"; */ +/* "OK" = "Добре"; */ + /* contacts categories */ "contacts_category_labels" = "Робота, Конкуренти, Клієнти, Друзі, Родина, Партнери, Постачальники, Преса, ВІП"; diff --git a/UI/PreferencesUI/Welsh.lproj/Localizable.strings b/UI/PreferencesUI/Welsh.lproj/Localizable.strings index 939da5344..e7d9c1d2b 100644 --- a/UI/PreferencesUI/Welsh.lproj/Localizable.strings +++ b/UI/PreferencesUI/Welsh.lproj/Localizable.strings @@ -5,34 +5,36 @@ /* tabs */ "General" = "Cyffredinol"; "Calendar Options" = "Opsiynau Calendr"; - +"Contacts Options" = "Contacts Options"; "Mail Options" = "Opsiynau Ebost"; - - - +"IMAP Accounts" = "IMAP Accounts"; +"Vacation" = "Vacation"; +"Forward" = "Forward"; "Password" = "Cyfrinair"; - - - - - +"Categories" = "Categories"; +"Name" = "Name"; +"Color" = "Color"; +"Add" = "Add"; +"Delete" = "Delete"; /* contacts categories */ - +"contacts_category_labels" = "Colleague, Competitor, Customer, Friend, Family, Business Partner, Provider, Press, VIP"; /* vacation (auto-reply) */ - +"Enable vacation auto reply" = "Enable vacation auto reply"; "Auto reply message :" = "Ymateb Awtomatig unwaith yn unig i pob anfonwr gyda'r testun canlynol :"; - - - - - +"Email addresses (separated by commas) :" = "Email addresses (separated by commas) :"; +"Add default email addresses" = "Add default email addresses"; +"Days between responses :" = "Days between responses :"; +"Do not send responses to mailing lists" = "Do not send responses to mailing lists"; +"Please specify your message and your email addresses for which you want to enable auto reply." += "Please specify your message and your email addresses for which you want to enable auto reply."; /* forward messages */ - - - +"Forward incoming messages" = "Forward incoming messages"; +"Keep a copy" = "Keep a copy"; +"Please specify an address to which you want to forward your messages." += "Please specify an address to which you want to forward your messages."; /* d & t */ "Current Time Zone :" = "Amser Cyfredol :"; @@ -40,47 +42,46 @@ "Long Date Format :" = "Dyddiad fformat hir :"; "Time Format :" = "Fformat amser :"; +"default" = "Default"; +"shortDateFmt_0" = "%d-%b-%y"; +"shortDateFmt_1" = "%d-%m-%y"; +"shortDateFmt_2" = "%d/%m/%y"; +"shortDateFmt_3" = "%e/%m/%y"; +"shortDateFmt_4" = "%d-%m-%Y"; +"shortDateFmt_5" = "%d/%m/%Y"; +"shortDateFmt_6" = "%m-%d-%y"; +"shortDateFmt_7" = "%m/%d/%y"; +"shortDateFmt_8" = "%m/%e/%y"; +"shortDateFmt_9" = "%y-%m-%d"; +"shortDateFmt_10" = "%y/%m/%d"; +"shortDateFmt_11" = "%y.%m.%d"; +"shortDateFmt_12" = "%Y-%m-%d"; +"shortDateFmt_13" = "%Y/%m/%d"; +"shortDateFmt_14" = "%Y.%m.%d"; - - - - - - - - - - - - - - - - - +"shortDateFmt_15" = ""; +"longDateFmt_0" = "%A, %B %d, %Y"; +"longDateFmt_1" = "%B %d, %Y"; +"longDateFmt_2" = "%A, %d %B, %Y"; +"longDateFmt_3" = "%d %B, %Y"; +"longDateFmt_4" = ""; - - - - - - - - +"timeFmt_0" = "%I:%M %p"; +"timeFmt_1" = "%H:%M"; +"timeFmt_2" = ""; /* calendar */ "Week begins on :" = "wythnos yn dechrau :"; "Day start time :" = "Amser dechrau'r diwrnod :"; "Day end time :" = "Amser diwedd y dydd :"; - - +"Day start time must be prior to day end time." = "Day start time must be prior to day end time."; "First week of year :" = "Wythnos cyntaf y flwyddyn :"; "Enable reminders for Calendar items" = "Galluogu atgoffa ar gyfer eitemau calendr"; "Play a sound when a reminder comes due" @@ -88,14 +89,14 @@ "Default reminder :" = "Atgoffa gwreiddiol :"; "firstWeekOfYear_January1" = "Dechrau ar Ionawr 1"; - +"firstWeekOfYear_First4DayWeek" = "First 4-day week"; "firstWeekOfYear_FirstFullWeek" = "Wythnos cyntaf llawn"; /* Default Calendar */ - - - - +"Default calendar :" = "Default calendar"; +"selectedCalendar" = "Selected calendar"; +"personalCalendar" = "Personal calendar"; +"firstCalendar" = "First enabled calendar"; "reminderTime_0000" = "0 munud"; "reminderTime_0005" = "5 munud"; @@ -111,8 +112,8 @@ "reminderTime_4800" = "2 ddiwrnod"; /* Mailer */ - - +"Show subscribed mailboxes only" = "Show subscribed mailboxes only"; +"Sort messages by threads" = "Sort messages by threads"; "Check for new mail:" = "Chwilio am ebost newydd:"; "messagecheck_manually" = "Corfforol"; "messagecheck_every_minute" = "Pob munud"; @@ -132,44 +133,44 @@ "And place my signature" = "A rhowch fy llofnod"; "signatureplacement_above" = "o dan fy ymateb"; "signatureplacement_below" = "o dan y dyfynnod"; - - - +"Compose messages in" = "Compose messages in"; +"composemessagestype_html" = "HTML"; +"composemessagestype_text" = "Plain text"; /* IMAP Accounts */ +"New Mail Account" = "New Mail Account"; - - - - +"Server Name:" = "Server Name:"; +"Port:" = "Port:"; +"User Name:" = "User Name:"; "Password:" = "Cyfrinair:"; - - +"Full Name:" = "Full Name:"; +"Email:" = "Email:"; "Signature:" = "Llofnod:"; - +"(Click to create)" = "(Click to create)"; "Signature" = "Llofnod"; - +"Please enter your signature below:" = "Please enter your signature below:"; /* Additional Parameters */ - +"Additional Parameters" = "Additional Parameters"; /* password */ - - - +"New password:" = "New password:"; +"Confirmation:" = "Confirmation:"; +"Change" = "Change"; /* Event+task categories */ "category_none" = "Dim"; "calendar_category_labels" = "Amrywiol,Anrhegion,Busnes,Canlyniadau,Clientau,Cwsmer,Cyflenwyr,Cystadleuaeth,Dilyn lan,Ffefrynnau,Galwadau,Gwyliau,Meeting,Gwyliau Cyhoeddus,Penblwydd,Personol,Projectau,Statws,Syniadau,Teithio"; /* Default module */ - - - - - +"Calendar" = "Calendar"; +"Contacts" = "Address Book"; +"Mail" = "Mail"; +"Last" = "Last used"; +"Default module :" = "Default module :"; "Language :" = "Iaith :"; "choose" = "Dewis ..."; @@ -190,81 +191,81 @@ "Welsh" = "Cymraeg"; /* Return receipts */ +"When I receive a request for a return receipt:" = "When I receive a request for a return receipt:"; +"Never send a return receipt" = "Never send a return receipt"; +"Allow return receipts for some messages" = "Allow return receipts for some messages"; +"If I'm not in the To or Cc of the message:" = "If I'm not in the To or Cc of the message:"; +"If the sender is outside my domain:" = "If the sender is outside my domain:"; +"In all other cases:" = "In all other cases:"; - - - - - - - - - +"Never send" = "Never send"; +"Always send" = "Always send"; +"Ask me" = "Ask me"; /* Return receipts */ +"When I receive a request for a return receipt:" = "When I receive a request for a return receipt:"; +"Never send a return receipt" = "Never send a return receipt"; +"Allow return receipts for some messages" = "Allow return receipts for some messages"; +"If I'm not in the To or Cc of the message:" = "If I'm not in the To or Cc of the message:"; +"If the sender is outside my domain:" = "If the sender is outside my domain:"; +"In all other cases:" = "In all other cases:"; - - - - - - - - - +"Never send" = "Never send"; +"Always send" = "Always send"; +"Ask me" = "Ask me"; /* Filters - UIxPreferences */ - - - - +"Filters" = "Filters"; +"Active" = "Active"; +"Move Up" = "Move Up"; +"Move Down" = "Move Down"; /* Filters - UIxFilterEditor */ +"Filter name:" = "Filter name:"; +"For incoming messages that" = "For incoming messages that"; +"match all of the following rules:" = "match all of the following rules:"; +"match any of the following rules:" = "match any of the following rules:"; +"match all messages" = "match all messages"; +"Perform these actions:" = "Perform these actions:"; +"Subject" = "Subject"; +"From" = "From"; +"To" = "To"; +"Cc" = "Cc"; +"To or Cc" = "To or Cc"; +"Size (Kb)" = "Size (Kb)"; +"Header" = "Header"; +"Flag the message with:" = "Flag the message with:"; +"Discard the message" = "Discard the message"; +"File the message in:" = "File the message in:"; +"Keep the message" = "Keep the message"; +"Forward the message to:" = "Forward the message to:"; +"Send a reject message:" = "Send a reject message:"; +"Send a vacation message" = "Send a vacation message"; +"Stop processing filter rules" = "Stop processing filter rules"; - - - - - - - - - - - - - - - - - - - - - - - +"is under" = "is under"; +"is over" = "is over"; "is" = "is"; +"is not" = "is not"; +"contains" = "contains"; +"does not contain" = "does not contain"; +"matches" = "matches"; +"does not match" = "does not match"; +"matches regex" = "matches regex"; +"does not match regex" = "does not match regex"; - - - - - - - - - - - - - - - - - - +"Seen" = "Seen"; +"Deleted" = "Deleted"; +"Answered" = "Answered"; +"Flagged" = "Flagged"; +"Junk" = "Junk"; +"Not Junk" = "Not Junk"; +"Label 1" = "Label 1"; +"Label 2" = "Label 2"; +"Label 3" = "Label 3"; +"Label 4" = "Label 4"; +"Label 5" = "Label 5"; "Password must not be empty." = "Le mot de passe ne doit pas être vide."; "The passwords do not match. Please try again." = "Les mots de passe ne sont pas identiques. Essayez de nouveau."; @@ -278,4 +279,5 @@ "Unhandled error response" = "Erreur inconnue"; "Password change is not supported." = "Changement de mot de passe non-supporté."; "Unhandled HTTP error code: %{0}" = "Code HTTP non-géré: %{0}"; - +"New password:" = "New password:"; +"Confirmation:" = "Confirmation:"; \ No newline at end of file diff --git a/UI/Scheduler/BrazilianPortuguese.lproj/Localizable.strings b/UI/Scheduler/BrazilianPortuguese.lproj/Localizable.strings index d958ec403..da5008e3f 100644 --- a/UI/Scheduler/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/Scheduler/BrazilianPortuguese.lproj/Localizable.strings @@ -10,7 +10,7 @@ "Switch to day view" = "Visualizar Dia"; "Switch to week view" = "Visualizar Semana"; "Switch to month view" = "Visualizar Mês"; - +"Reload all calendars" = "Reload all calendars"; /* Tabs */ "Date" = "Data"; @@ -41,13 +41,13 @@ "a2_Wednesday" = "Qu"; "a2_Thursday" = "Qu"; "a2_Friday" = "Se"; +"a2_Saturday" = "Sa"; - - +"dayLabelFormat" = "%m/%d/%Y"; "today" = "Hoje"; - - +"Previous Day" = "Previous Day"; +"Next Day" = "Next Day"; /* Week */ @@ -56,8 +56,8 @@ "Week %d" = "Semana %d"; - - +"Previous Week" = "Previous Week"; +"Next Week" = "Next Week"; /* Month */ @@ -89,8 +89,8 @@ "a3_November" = "Novembro"; "a3_December" = "Dezembro"; - - +"Previous Month" = "Previous Month"; +"Next Month" = "Next Month"; /* Year */ @@ -103,20 +103,20 @@ "New Calendar..." = "Novo Calendário..."; "Delete Calendar" = "Apagar Calendário"; - +"Unsubscribe Calendar" = "Unsubscribe Calendar"; "Sharing..." = "Compartilhamento..."; "Export Calendar..." = "Exportar Calendário..."; - - - - +"Import Events..." = "Import Events..."; +"Import Events" = "Import Events"; +"Select an iCalendar file (.ics)." = "Select an iCalendar file (.ics)."; +"Upload" = "Upload"; "Publish Calendar..." = "Publicar Calendário..."; "Reload Remote Calendars" = "Recarregar Calendários Remotos"; "Properties" = "Propriedades"; - - - - +"Done" = "Done"; +"An error occured while importing calendar." = "An error occured while importing calendar."; +"No event was imported." = "No event was imported."; +"A total of %{0} events were imported in the calendar." = "A total of %{0} events were imported in the calendar."; "Compose E-Mail to All Attendees" = "Compor E-Mail para Todos os Participantes"; "Compose E-Mail to Undecided Attendees" = "Compor E-Mail para os Participantes não confirmados"; @@ -126,15 +126,15 @@ /* Misc */ - +"OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Proibido"; /* acls */ "User rights for:" = "Direitos de:"; - - +"Any Authenticated User" = "Any Authenticated User"; +"Public Access" = "Public Access"; "label_Public" = "Público"; "label_Private" = "Privado"; @@ -186,7 +186,7 @@ "No appointments found" = "Apontamentos não encontrados"; "Meetings proposed by you" = "Reuniões propostas por você"; "Meetings proposed to you" = "Reuniões propostas para você"; - +"sched_startDateFormat" = "%d/%m %H:%M"; "action" = "Ação"; "accept" = "Aceitar"; "decline" = "Declinar"; @@ -207,8 +207,8 @@ "Title:" = "Título:"; "Calendar:" = "Calendário:"; "Name" = "Nome"; - - +"Email" = "Email"; +"Status:" = "Status:"; "% complete" = "% completado"; "Location:" = "Localização:"; "Priority:" = "Prioridade:"; @@ -226,14 +226,14 @@ "Category:" = "Categoria:"; "Repeat:" = "Repetir:"; "Reminder:" = "Lembrete:"; +"General:" = "General:"; +"Reply:" = "Reply:"; - - - +"Target:" = "Target:"; "attributes" = "atributos"; "attendees" = "participantes"; - +"delegated from" = "delegated from"; /* checkbox title */ "is private" = "é privado"; @@ -296,12 +296,12 @@ /* Priorities */ - +"prio_0" = "Not specified"; "prio_1" = "Alta 3"; "prio_2" = "Alta 2"; "prio_3" = "Alta 1"; "prio_4" = "Alta"; - +"prio_5" = "Normal"; "prio_6" = "Baixa"; "prio_7" = "Baixa 1"; "prio_8" = "Baixa 2"; @@ -404,19 +404,19 @@ "reminder_AFTER" = "depois"; "reminder_START" = "inicio do evento"; "reminder_END" = "fim do evento"; +"Reminder Details" = "Reminder Details"; +"Choose a Reminder Action" = "Choose a Reminder Action"; +"Show an Alert" = "Show an Alert"; +"Send an E-mail" = "Send an E-mail"; +"Email Organizer" = "Email Organizer"; +"Email Attendees" = "Email Attendees"; - - - - - - - - - - - +"zoom_400" = "400%"; +"zoom_200" = "200%"; +"zoom_100" = "100%"; +"zoom_50" = "50%"; +"zoom_25" = "25%"; /* transparency */ @@ -446,7 +446,7 @@ validate_endbeforestart = "A data que você informou ocorre antes da data ini "Day View" = "Visualizar Dia"; "Week View" = "Visualizar Mês"; "Month View" = "Visualizar Mês"; - +"Reload" = "Reload"; "eventPartStatModificationError" = "Seu status de participação não pode ser modificado."; @@ -485,17 +485,18 @@ validate_endbeforestart = "A data que você informou ocorre antes da data ini /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "Sugerir espaço de tempo:"; - +"Zoom:" = "Zoom:"; "Previous slot" = "Espaço anterior"; "Next slot" = "Próximo espaço"; "Previous hour" = "Hora anterior"; "Next hour" = "Próxima hora"; - - - +"Work days only" = "Work days only"; +"The whole day" = "The whole day"; +"Between" = "Between"; "and" = "and"; - +"A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" += "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?"; /* apt list */ "Title" = "Título"; @@ -527,45 +528,45 @@ vtodo_class2 = "(Tarefa Confidencial)"; "Include in free-busy" = "Incluir na disponibilidade"; - - +"Synchronization" = "Synchronization"; +"Synchronize" = "Synchronize"; "Tag:" = "Marca:"; +"Display" = "Display"; +"Show alarms" = "Show alarms"; +"Show tasks" = "Show tasks"; - - - - - +"Links to this Calendar" = "Links to this Calendar"; +"Authenticated User Access" = "Authenticated User Access"; "CalDAV URL" = "CalDAV url"; - - +"WebDAV ICS URL" = "WebDAV ICS URL"; +"WebDAV XML URL" = "WebDAV XML URL"; /* Error messages */ +"dayFieldInvalid" = "Please specify a numerical value in the Days field greater or equal to 1."; +"weekFieldInvalid" = "Please specify a numerical value in the Week(s) field greater or equal to 1."; +"monthFieldInvalid" = "Please specify a numerical value in the Month(s) field greater or equal to 1."; +"monthDayFieldInvalid" = "Please specify a numerical value in the month day field greater or equal to 1."; +"yearFieldInvalid" = "Please specify a numerical value in the Year(s) field greater or equal to 1."; +"appointmentFieldInvalid" = "Please specify a numerical value in the Appointment(s) field greater or equal to 1."; +"recurrenceUnsupported" = "This type of recurrence is currently unsupported."; +"Please specify a calendar name." = "Please specify a calendar name."; +"tagNotDefined" = "You must specify a tag if you want to synchronize this calendar."; +"tagAlreadyExists" = "The tag you specified is already associated to another calendar."; +"tagHasChanged" = "If you change your calendar's tag, you'll need to reload the data on your mobile device.\nContinue?"; +"tagWasAdded" = "If you want to synchronize this calendar, you'll need to reload the data on your mobile device.\nContinue?"; +"tagWasRemoved" = "If you remove this calendar from synchronization, you'll need to reload the data on your mobile device.\nContinue?"; +"DestinationCalendarError" = "The source and destination calendars are the same. Please try to copy to a different calendar."; +"EventCopyError" = "The copy failed. Please try to copy to a difference calendar."; +"Open Task..." = "Open Task..."; +"Mark Completed" = "Mark Completed"; +"Delete Task" = "Delete Task"; +"Delete Event" = "Delete Event"; +"Copy event to my calendar" = "Copy event to my calendar"; - - - - - - - - - - - - - - - - - - - - - - - - - +"Subscribe to a web calendar..." = "Subscribe to a web calendar..."; +"URL of the Calendar" = "URL of the Calendar"; +"Web Calendar" = "Web Calendar"; +"Reload on login" = "Reload on login"; +"Invalid number." = "Invalid number."; diff --git a/UI/Scheduler/Czech.lproj/Localizable.strings b/UI/Scheduler/Czech.lproj/Localizable.strings index 0cc6231c5..e2ebdd3ff 100644 --- a/UI/Scheduler/Czech.lproj/Localizable.strings +++ b/UI/Scheduler/Czech.lproj/Localizable.strings @@ -103,7 +103,7 @@ "New Calendar..." = "Nový kalendář..."; "Delete Calendar" = "Smazat kalendář"; - +"Unsubscribe Calendar" = "Unsubscribe Calendar"; "Sharing..." = "Sdílení..."; "Export Calendar..." = "Exportovat kalendář..."; "Import Events..." = "Importovat události..."; @@ -126,7 +126,7 @@ /* Misc */ - +"OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Zakázaná"; /* acls */ @@ -186,7 +186,7 @@ "No appointments found" = "Nenalezeny žádné schůzky"; "Meetings proposed by you" = "Schůzky navržené Vámi"; "Meetings proposed to you" = "Schůzky navržené Vám"; - +"sched_startDateFormat" = "%d/%m %H:%M"; "action" = "Akce"; "accept" = "Přijmout"; "decline" = "Odmítnout"; @@ -208,7 +208,7 @@ "Calendar:" = "Kalendář:"; "Name" = "Jméno"; "Email" = "E-Mail"; - +"Status:" = "Status:"; "% complete" = "% hotovo"; "Location:" = "Místo:"; "Priority:" = "Priorita:"; @@ -352,10 +352,10 @@ "Week(s)" = "Týdnů"; "On" = "V"; "Month(s)" = "Měsíců"; - +"The" = "The"; "Recur on day(s)" = "Opakovat ve dnech"; "Year(s)" = "rocích"; - +"cycle_of" = "of"; "No end date" = "Bez data konce"; "Create" = "Vytvořit"; "appointment(s)" = "schůzku/y"; @@ -412,11 +412,11 @@ "Email Organizer" = "E-mail organizátorovi"; "Email Attendees" = "E-mail účastníkům"; - - - - - +"zoom_400" = "400%"; +"zoom_200" = "200%"; +"zoom_100" = "100%"; +"zoom_50" = "50%"; +"zoom_25" = "25%"; /* transparency */ @@ -539,8 +539,8 @@ vtodo_class2 = "(Důvěrný úkol)"; "Links to this Calendar" = "Odkazy na tento kalendář"; "Authenticated User Access" = "Přístup pro ověřené uživatele"; "CalDAV URL" = "CalDAV url"; - - +"WebDAV ICS URL" = "WebDAV ICS URL"; +"WebDAV XML URL" = "WebDAV XML URL"; /* Error messages */ "dayFieldInvalid" = "V políčku Dny zadejte číselnou hodnotu větší nebo rovnu 1."; @@ -550,23 +550,23 @@ vtodo_class2 = "(Důvěrný úkol)"; "yearFieldInvalid" = "V políčku Rok zadejte číselnou hodnotu větší nebo rovnu 1."; "appointmentFieldInvalid" = "V políčku Připomenutí zadejte číselnou hodnotu větší nebo rovnu 1."; "recurrenceUnsupported" = "Tento typ opakování není podporován."; - +"Please specify a calendar name." = "Please specify a calendar name."; "tagNotDefined" = "Chcete-li synchronizovat tento kalendář, musíte zadat jeho Štítek."; "tagAlreadyExists" = "Zadaný štítek je již přiřazen jinému kalendáři."; "tagHasChanged" = "Změníte-li štítek svého kalendáře, budete muset znovu načíst data do svého mobilního zařízení.\nPokračovat?"; "tagWasAdded" = "Chcete-li synchronizovat tento kalendář, budete muset znovu načíst data do svého mobilního zařízení.\nPokračovat?"; "tagWasRemoved" = "Odstraníte-li u tohoto kalendáře synchronizaci, budete muset znovu načíst data do svého mobilního zařízení.\nPokračovat?"; - - +"DestinationCalendarError" = "The source and destination calendars are the same. Please try to copy to a different calendar."; +"EventCopyError" = "The copy failed. Please try to copy to a difference calendar."; "Open Task..." = "Otevřít úkol..."; "Mark Completed" = "Označit jako dokončené"; "Delete Task" = "Smazat úkol"; "Delete Event" = "Smazat událost"; - +"Copy event to my calendar" = "Copy event to my calendar"; "Subscribe to a web calendar..." = "Odebírat vzdálený kalendář na webu"; "URL of the Calendar" = "Adresa vzdáleného kalendáře na webu"; "Web Calendar" = "Vzdálený kalendář na webu"; "Reload on login" = "Aktualizovat při přihlášení"; - +"Invalid number." = "Invalid number."; diff --git a/UI/Scheduler/Dutch.lproj/Localizable.strings b/UI/Scheduler/Dutch.lproj/Localizable.strings index e826d1f2c..6dfa8dd6a 100644 --- a/UI/Scheduler/Dutch.lproj/Localizable.strings +++ b/UI/Scheduler/Dutch.lproj/Localizable.strings @@ -2,15 +2,15 @@ /* Tooltips */ - - - - +"Create a new event" = "Create a new event"; +"Create a new task" = "Create a new task"; +"Edit this event or task" = "Edit this event or task"; +"Delete this event or task" = "Delete this event or task"; "Go to today" = "Naar vandaag gaan"; - - - - +"Switch to day view" = "Switch to day view"; +"Switch to week view" = "Switch to week view"; +"Switch to month view" = "Switch to month view"; +"Reload all calendars" = "Reload all calendars"; /* Tabs */ "Date" = "Datum"; @@ -51,10 +51,10 @@ /* Week */ - +"Week" = "Week"; "this week" = "deze week"; - +"Week %d" = "Week %d"; "Previous Week" = "Vorige week"; "Next Week" = "Volgende week"; @@ -66,15 +66,15 @@ "January" = "Januari"; "February" = "Februari"; "March" = "Maart"; - +"April" = "April"; "May" = "Mei"; "June" = "Juni"; "July" = "Juli"; "August" = "Augustus"; - +"September" = "September"; "October" = "Oktober"; - - +"November" = "November"; +"December" = "December"; "a3_January" = "Jan"; "a3_February" = "Feb"; @@ -103,20 +103,20 @@ "New Calendar..." = "Nieuwe agenda..."; "Delete Calendar" = "Agenda verwijderen"; - +"Unsubscribe Calendar" = "Unsubscribe Calendar"; "Sharing..." = "Delen..."; "Export Calendar..." = "Agenda exporteren..."; - - - - +"Import Events..." = "Import Events..."; +"Import Events" = "Import Events"; +"Select an iCalendar file (.ics)." = "Select an iCalendar file (.ics)."; +"Upload" = "Upload"; "Publish Calendar..." = "Agenda publiceren..."; "Reload Remote Calendars" = "Externe agenda vernieuwen"; "Properties" = "Instellingen"; - - - - +"Done" = "Done"; +"An error occured while importing calendar." = "An error occured while importing calendar."; +"No event was imported." = "No event was imported."; +"A total of %{0} events were imported in the calendar." = "A total of %{0} events were imported in the calendar."; "Compose E-Mail to All Attendees" = "E-mail aan alle deelnemers opstellen"; "Compose E-Mail to Undecided Attendees" = "E-mail aan deelnemers opstellen die nog niet hebben gereageerd"; @@ -126,15 +126,15 @@ /* Misc */ - +"OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Toegang geweigerd"; /* acls */ "User rights for:" = "Machtigingen voor:"; - - +"Any Authenticated User" = "Any Authenticated User"; +"Public Access" = "Public Access"; "label_Public" = "Publiek"; "label_Private" = "Privaat"; @@ -186,7 +186,7 @@ "No appointments found" = "Geen afspraken gevonden"; "Meetings proposed by you" = "Door u voorgestelde vergaderingen"; "Meetings proposed to you" = "Aan u voorgestelde vergaderingen"; - +"sched_startDateFormat" = "%d/%m %H:%M"; "action" = "Actie"; "accept" = "Accepteren"; "decline" = "Weigeren"; @@ -208,32 +208,32 @@ "Calendar:" = "Agenda:"; "Name" = "Naam"; "Email" = "E-mail"; - +"Status:" = "Status:"; "% complete" = "% voltooid"; "Location:" = "Plaats:"; "Priority:" = "Prioriteit"; - +"Privacy" = "Privacy"; "Cycle" = "Herhalen"; "Cycle End" = "Einde herhaling"; "Categories" = "Categoriën"; "Classification" = "Classificatie"; "Duration" = "Duur"; "Attendees:" = "Deelnemers:"; - +"Resources" = "Resources"; "Organizer:" = "Organisator:"; "Description:" = "Omschrijving:"; - +"Document:" = "Document:"; "Category:" = "Categorie:"; "Repeat:" = "Herhalen:"; "Reminder:" = "Alarm:"; - - +"General:" = "General:"; +"Reply:" = "Reply:"; "Target:" = "Bestemming:"; "attributes" = "attributen"; "attendees" = "deelnemers"; - +"delegated from" = "delegated from"; /* checkbox title */ "is private" = "is privé"; @@ -285,7 +285,7 @@ "Browse URL" = "Naar URL gaan"; - +"newAttendee" = "Add attendee"; /* calendar modes */ @@ -397,26 +397,26 @@ "reminder_1_WEEK_BEFORE" = "1 week van tevoren"; "reminder_CUSTOM" = "aangepast..."; +"reminder_MINUTES" = "minutes"; +"reminder_HOURS" = "hours"; +"reminder_DAYS" = "days"; +"reminder_BEFORE" = "before"; +"reminder_AFTER" = "after"; +"reminder_START" = "the event starts"; +"reminder_END" = "the event ends"; +"Reminder Details" = "Reminder Details"; +"Choose a Reminder Action" = "Choose a Reminder Action"; +"Show an Alert" = "Show an Alert"; +"Send an E-mail" = "Send an E-mail"; +"Email Organizer" = "Email Organizer"; +"Email Attendees" = "Email Attendees"; - - - - - - - - - - - - - - - - - - +"zoom_400" = "400%"; +"zoom_200" = "200%"; +"zoom_100" = "100%"; +"zoom_50" = "50%"; +"zoom_25" = "25%"; /* transparency */ @@ -446,7 +446,7 @@ validate_endbeforestart = "Het begin vindt plaats vóór het einde."; "Day View" = "Dagoverzicht"; "Week View" = "Weekoverzicht"; "Month View" = "Maandoverzicht"; - +"Reload" = "Reload"; "eventPartStatModificationError" = "Uw participatiestatus kon niet worden gewijzigd."; @@ -470,7 +470,7 @@ validate_endbeforestart = "Het begin vindt plaats vóór het einde."; /* Legend */ "Participant" = "Deelnemer"; "Optional Participant" = "Gewenste deelnemer"; - +"Non Participant" = "Non Participant"; "Chair" = "Voorzitter"; "Needs action" = "Actie vereist"; @@ -485,17 +485,18 @@ validate_endbeforestart = "Het begin vindt plaats vóór het einde."; /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "Tijdzone:"; - +"Zoom:" = "Zoom:"; "Previous slot" = "Vorige"; "Next slot" = "Volgende"; "Previous hour" = "Vorig uur"; "Next hour" = "Volgend uur"; "Work days only" = "Slechts werkdagen"; "The whole day" = "De hele dag"; - +"Between" = "Between"; "and" = "en"; - +"A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" += "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?"; /* apt list */ "Title" = "Titel"; @@ -527,45 +528,45 @@ vtodo_class2 = "(Vertrouwelijke taak)"; "Include in free-busy" = "In de beschikbaarheid insluiten"; - - +"Synchronization" = "Synchronization"; +"Synchronize" = "Synchronize"; "Tag:" = "Markering:"; +"Display" = "Display"; +"Show alarms" = "Show alarms"; +"Show tasks" = "Show tasks"; - - - - - +"Links to this Calendar" = "Links to this Calendar"; +"Authenticated User Access" = "Authenticated User Access"; "CalDAV URL" = "CalDAV url"; - - +"WebDAV ICS URL" = "WebDAV ICS URL"; +"WebDAV XML URL" = "WebDAV XML URL"; /* Error messages */ - - - - - - - - - - - - - - - +"dayFieldInvalid" = "Please specify a numerical value in the Days field greater or equal to 1."; +"weekFieldInvalid" = "Please specify a numerical value in the Week(s) field greater or equal to 1."; +"monthFieldInvalid" = "Please specify a numerical value in the Month(s) field greater or equal to 1."; +"monthDayFieldInvalid" = "Please specify a numerical value in the month day field greater or equal to 1."; +"yearFieldInvalid" = "Please specify a numerical value in the Year(s) field greater or equal to 1."; +"appointmentFieldInvalid" = "Please specify a numerical value in the Appointment(s) field greater or equal to 1."; +"recurrenceUnsupported" = "This type of recurrence is currently unsupported."; +"Please specify a calendar name." = "Please specify a calendar name."; +"tagNotDefined" = "You must specify a tag if you want to synchronize this calendar."; +"tagAlreadyExists" = "The tag you specified is already associated to another calendar."; +"tagHasChanged" = "If you change your calendar's tag, you'll need to reload the data on your mobile device.\nContinue?"; +"tagWasAdded" = "If you want to synchronize this calendar, you'll need to reload the data on your mobile device.\nContinue?"; +"tagWasRemoved" = "If you remove this calendar from synchronization, you'll need to reload the data on your mobile device.\nContinue?"; +"DestinationCalendarError" = "The source and destination calendars are the same. Please try to copy to a different calendar."; +"EventCopyError" = "The copy failed. Please try to copy to a difference calendar."; "Open Task..." = "Taak openen..."; - +"Mark Completed" = "Mark Completed"; "Delete Task" = "Taak verwijderen"; "Delete Event" = "Afspraak verwijderen"; +"Copy event to my calendar" = "Copy event to my calendar"; - - - - - - +"Subscribe to a web calendar..." = "Subscribe to a web calendar..."; +"URL of the Calendar" = "URL of the Calendar"; +"Web Calendar" = "Web Calendar"; +"Reload on login" = "Reload on login"; +"Invalid number." = "Invalid number."; diff --git a/UI/Scheduler/French.lproj/Localizable.strings b/UI/Scheduler/French.lproj/Localizable.strings index 916334457..16dc38f90 100644 --- a/UI/Scheduler/French.lproj/Localizable.strings +++ b/UI/Scheduler/French.lproj/Localizable.strings @@ -13,7 +13,7 @@ "Reload all calendars" = "Actualiser tous les agendas"; /* Tabs */ - +"Date" = "Date"; "Calendars" = "Agendas"; /* Day */ @@ -41,7 +41,7 @@ "a2_Wednesday" = "Me"; "a2_Thursday" = "Je"; "a2_Friday" = "Ve"; - +"a2_Saturday" = "Sa"; "dayLabelFormat" = "%d/%m/%Y"; "today" = "Aujourd'hui"; @@ -99,7 +99,7 @@ /* Menu */ "Calendar" = "Agenda"; - +"Contacts" = "Contacts"; "New Calendar..." = "Nouvel agenda..."; "Delete Calendar" = "Effacer l'agenda..."; @@ -126,7 +126,7 @@ /* Misc */ - +"OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Accès non autorisée"; /* acls */ @@ -136,7 +136,7 @@ "Any Authenticated User" = "Tout utilisateur identifié"; "Public Access" = "Accès public"; - +"label_Public" = "Public"; "label_Private" = "Privé"; "label_Confidential" = "Confidentiel"; @@ -186,8 +186,8 @@ "No appointments found" = "Aucun rendez-vous"; "Meetings proposed by you" = "Rendez-vous que vous proposez"; "Meetings proposed to you" = "Rendez-vous qui vous sont proposés"; - - +"sched_startDateFormat" = "%d/%m %H:%M"; +"action" = "Action"; "accept" = "Accepter"; "decline" = "Refuser"; "more attendees" = "Autres participants"; @@ -207,7 +207,7 @@ "Title:" = "Titre :"; "Calendar:" = "Agenda :"; "Name" = "Nom"; - +"Email" = "Email"; "Status:" = "Statut :"; "% complete" = "% d'achèvement"; "Location:" = "Lieu :"; @@ -215,8 +215,8 @@ "Privacy" = "Confidentialité"; "Cycle" = "Récurrence"; "Cycle End" = "s'arreter"; - - +"Categories" = "Categories"; +"Classification" = "Classification"; "Duration" = "Durée"; "Attendees:" = "Participants :"; "Resources" = "Ressources"; @@ -238,7 +238,7 @@ /* checkbox title */ "is private" = "Rendez-vous privé"; /* classification */ - +"Public" = "Public"; "Private" = "Privé"; /* text used in overviews and tooltips */ "empty title" = "Titre vide"; @@ -397,7 +397,7 @@ "reminder_1_WEEK_BEFORE" = "1 semaine avant"; "reminder_CUSTOM" = "Personnaliser..."; - +"reminder_MINUTES" = "minutes"; "reminder_HOURS" = "heures"; "reminder_DAYS" = "jours"; "reminder_BEFORE" = "avant"; @@ -412,11 +412,11 @@ "Email Organizer" = "À l'organisateur"; "Email Attendees" = "Aux invités"; - - - - - +"zoom_400" = "400%"; +"zoom_200" = "200%"; +"zoom_100" = "100%"; +"zoom_50" = "50%"; +"zoom_25" = "25%"; /* transparency */ @@ -485,7 +485,7 @@ validate_endbeforestart = "La date de fin est avant la date de début."; /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "Suggérer un créneau horaire :"; - +"Zoom:" = "Zoom:"; "Previous slot" = "Précédent"; "Next slot" = "Prochain"; "Previous hour" = "Heure précédente"; diff --git a/UI/Scheduler/Hungarian.lproj/Localizable.strings b/UI/Scheduler/Hungarian.lproj/Localizable.strings index d7f4667e0..d8b2fd59b 100644 --- a/UI/Scheduler/Hungarian.lproj/Localizable.strings +++ b/UI/Scheduler/Hungarian.lproj/Localizable.strings @@ -10,7 +10,7 @@ "Switch to day view" = "Napi nézetre váltás"; "Switch to week view" = "Heti nézetre váltás"; "Switch to month view" = "Havi nézetre váltás"; - +"Reload all calendars" = "Reload all calendars"; /* Tabs */ "Date" = "Dátum"; @@ -46,8 +46,8 @@ "dayLabelFormat" = "%Y.%m.%d"; "today" = "Ma"; - - +"Previous Day" = "Previous Day"; +"Next Day" = "Next Day"; /* Week */ @@ -56,8 +56,8 @@ "Week %d" = "%d. hét"; - - +"Previous Week" = "Previous Week"; +"Next Week" = "Next Week"; /* Month */ @@ -73,8 +73,8 @@ "August" = "Augusztus"; "September" = "Szeptember"; "October" = "Október"; - - +"November" = "November"; +"December" = "December"; "a3_January" = "Január"; "a3_February" = "Február"; @@ -86,11 +86,11 @@ "a3_August" = "Augusztus"; "a3_September" = "Szeptember"; "a3_October" = "Október"; +"a3_November" = "November"; +"a3_December" = "December"; - - - - +"Previous Month" = "Previous Month"; +"Next Month" = "Next Month"; /* Year */ @@ -103,20 +103,20 @@ "New Calendar..." = "Új naptár..."; "Delete Calendar" = "Naptár törlése"; - +"Unsubscribe Calendar" = "Unsubscribe Calendar"; "Sharing..." = "Megosztás..."; "Export Calendar..." = "Naptár exportálása..."; - - - - +"Import Events..." = "Import Events..."; +"Import Events" = "Import Events"; +"Select an iCalendar file (.ics)." = "Select an iCalendar file (.ics)."; +"Upload" = "Upload"; "Publish Calendar..." = "Naptár közzététele..."; "Reload Remote Calendars" = "Távoli naptárak frissítése"; "Properties" = "Tulajdonságok"; - - - - +"Done" = "Done"; +"An error occured while importing calendar." = "An error occured while importing calendar."; +"No event was imported." = "No event was imported."; +"A total of %{0} events were imported in the calendar." = "A total of %{0} events were imported in the calendar."; "Compose E-Mail to All Attendees" = "Üzenet küldése az összes résztvevőnek"; "Compose E-Mail to Undecided Attendees" = "Üzenet küldése az bizonytalan résztvevőnek"; @@ -126,15 +126,15 @@ /* Misc */ - +"OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Tiltott"; /* acls */ "User rights for:" = "Felhasználói jogosultságok:"; - - +"Any Authenticated User" = "Any Authenticated User"; +"Public Access" = "Public Access"; "label_Public" = "Nyilvános"; "label_Private" = "Magán"; @@ -173,7 +173,7 @@ "Save and Close" = "Mentés és bezárás"; "Close" = "Bezárás"; "Invite Attendees" = "Résztvevők meghívása"; - +"Attach" = "Attach"; "Update" = "Mentés"; "Cancel" = "Mégsem"; "show_rejected_apts" = "Visszautasított találkozók mutatása"; @@ -207,7 +207,7 @@ "Title:" = "Cím:"; "Calendar:" = "Naptár:"; "Name" = "Név"; - +"Email" = "Email"; "Status:" = "Állapot"; "% complete" = "% kész"; "Location:" = "Hely:"; @@ -226,14 +226,14 @@ "Category:" = "Kategória:"; "Repeat:" = "Ismétlés:"; "Reminder:" = "Emlékeztető:"; - - +"General:" = "General:"; +"Reply:" = "Reply:"; "Target:" = "Cél:"; "attributes" = "tulajdonságok"; "attendees" = "résztvevők"; - +"delegated from" = "delegated from"; /* checkbox title */ "is private" = "magán"; @@ -350,7 +350,7 @@ "Every" = "Minden"; "Days" = "naponként"; "Week(s)" = "hetenként"; - +"On" = "On"; "Month(s)" = "hónaponként"; "The" = "A"; "Recur on day(s)" = "Az alábbi napon"; @@ -404,19 +404,19 @@ "reminder_AFTER" = "utána"; "reminder_START" = "az esemény kezdődik"; "reminder_END" = "az esemény végződik"; +"Reminder Details" = "Reminder Details"; +"Choose a Reminder Action" = "Choose a Reminder Action"; +"Show an Alert" = "Show an Alert"; +"Send an E-mail" = "Send an E-mail"; +"Email Organizer" = "Email Organizer"; +"Email Attendees" = "Email Attendees"; - - - - - - - - - - - +"zoom_400" = "400%"; +"zoom_200" = "200%"; +"zoom_100" = "100%"; +"zoom_50" = "50%"; +"zoom_25" = "25%"; /* transparency */ @@ -446,7 +446,7 @@ validate_endbeforestart = "A megadott befejező dátum korábbi, mint a kezd "Day View" = "Napi nézet"; "Week View" = "Heti nézet"; "Month View" = "Havi nézet"; - +"Reload" = "Reload"; "eventPartStatModificationError" = "A résztvevői állapota nem módosítható."; @@ -470,7 +470,7 @@ validate_endbeforestart = "A megadott befejező dátum korábbi, mint a kezd /* Legend */ "Participant" = "Kötelező résztvevő"; "Optional Participant" = "Nem kötelező résztvevő"; - +"Non Participant" = "Non Participant"; "Chair" = "Szék"; "Needs action" = "Foglalkozni kell vele"; @@ -490,12 +490,13 @@ validate_endbeforestart = "A megadott befejező dátum korábbi, mint a kezd "Next slot" = "Következő ablak"; "Previous hour" = "Előző óra"; "Next hour" = "Következő óra"; - - - +"Work days only" = "Work days only"; +"The whole day" = "The whole day"; +"Between" = "Between"; "and" = "and"; - +"A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" += "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?"; /* apt list */ "Title" = "Cím"; @@ -525,47 +526,47 @@ vtodo_class2 = "(Bizalmas feladat)"; "Name:" = "Név:"; "Color:" = "Szín:"; +"Include in free-busy" = "Include in free-busy"; - - - +"Synchronization" = "Synchronization"; +"Synchronize" = "Synchronize"; "Tag:" = "Cimke:"; +"Display" = "Display"; +"Show alarms" = "Show alarms"; +"Show tasks" = "Show tasks"; - - - - - +"Links to this Calendar" = "Links to this Calendar"; +"Authenticated User Access" = "Authenticated User Access"; "CalDAV URL" = "CalDAV url"; - - +"WebDAV ICS URL" = "WebDAV ICS URL"; +"WebDAV XML URL" = "WebDAV XML URL"; /* Error messages */ +"dayFieldInvalid" = "Please specify a numerical value in the Days field greater or equal to 1."; +"weekFieldInvalid" = "Please specify a numerical value in the Week(s) field greater or equal to 1."; +"monthFieldInvalid" = "Please specify a numerical value in the Month(s) field greater or equal to 1."; +"monthDayFieldInvalid" = "Please specify a numerical value in the month day field greater or equal to 1."; +"yearFieldInvalid" = "Please specify a numerical value in the Year(s) field greater or equal to 1."; +"appointmentFieldInvalid" = "Please specify a numerical value in the Appointment(s) field greater or equal to 1."; +"recurrenceUnsupported" = "This type of recurrence is currently unsupported."; +"Please specify a calendar name." = "Please specify a calendar name."; +"tagNotDefined" = "You must specify a tag if you want to synchronize this calendar."; +"tagAlreadyExists" = "The tag you specified is already associated to another calendar."; +"tagHasChanged" = "If you change your calendar's tag, you'll need to reload the data on your mobile device.\nContinue?"; +"tagWasAdded" = "If you want to synchronize this calendar, you'll need to reload the data on your mobile device.\nContinue?"; +"tagWasRemoved" = "If you remove this calendar from synchronization, you'll need to reload the data on your mobile device.\nContinue?"; +"DestinationCalendarError" = "The source and destination calendars are the same. Please try to copy to a different calendar."; +"EventCopyError" = "The copy failed. Please try to copy to a difference calendar."; +"Open Task..." = "Open Task..."; +"Mark Completed" = "Mark Completed"; +"Delete Task" = "Delete Task"; +"Delete Event" = "Delete Event"; +"Copy event to my calendar" = "Copy event to my calendar"; - - - - - - - - - - - - - - - - - - - - - - - - - +"Subscribe to a web calendar..." = "Subscribe to a web calendar..."; +"URL of the Calendar" = "URL of the Calendar"; +"Web Calendar" = "Web Calendar"; +"Reload on login" = "Reload on login"; +"Invalid number." = "Invalid number."; diff --git a/UI/Scheduler/Icelandic.lproj/Localizable.strings b/UI/Scheduler/Icelandic.lproj/Localizable.strings index 7b6c35e98..6dc96f29f 100644 --- a/UI/Scheduler/Icelandic.lproj/Localizable.strings +++ b/UI/Scheduler/Icelandic.lproj/Localizable.strings @@ -27,7 +27,7 @@ "Saturday" = "Laugardagur"; "DayOfTheMonth" = "Dagur mánaðarins"; - +"Sun" = "Sun"; "Mon" = "Mán"; "Tue" = "Þri"; "Wed" = "Mið"; @@ -35,7 +35,7 @@ "Fri" = "Fös"; "Sat" = "Lau"; - +"a2_Sunday" = "Su"; "a2_Monday" = "Má"; "a2_Tuesday" = "Þr"; "a2_Wednesday" = "Mi"; @@ -71,7 +71,7 @@ "June" = "Júní"; "July" = "Júlí"; "August" = "Ágúst"; - +"September" = "September"; "October" = "Október"; "November" = "Nóvember"; "December" = "Desember"; @@ -84,7 +84,7 @@ "a3_June" = "Júní"; "a3_July" = "Júlí"; "a3_August" = "Ágúst"; - +"a3_September" = "September"; "a3_October" = "Október"; "a3_November" = "Nóvember"; "a3_December" = "Desember"; @@ -111,7 +111,7 @@ "Select an iCalendar file (.ics)." = "Velja iCalendar skrá (.ics)."; "Upload" = "Hala upp"; "Publish Calendar..." = "Gefa dagatal út..."; - +"Reload Remote Calendars" = "Reload Remote Calendars"; "Properties" = "Eiginleikar"; "Done" = "Ljúka"; "An error occured while importing calendar." = "Villa kom upp þegar dagatalið var flutt inn."; @@ -126,7 +126,7 @@ /* Misc */ - +"OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Bannað"; /* acls */ @@ -186,7 +186,7 @@ "No appointments found" = "Engar tímapantanir fundust"; "Meetings proposed by you" = "Tillögur um fundi sem þú hefur lagt fram"; "Meetings proposed to you" = "Tillögur um fundi sem þú hefur fengið"; - +"sched_startDateFormat" = "%d/%m %H:%M"; "action" = "Aðgerð"; "accept" = "Samþykkja"; "decline" = "Hafna"; @@ -213,10 +213,10 @@ "Location:" = "Staðsetning:"; "Priority:" = "Mikilvægi:"; "Privacy" = "Friðhelgi"; - - +"Cycle" = "Cycle"; +"Cycle End" = "Cycle End"; "Categories" = "Flokkar"; - +"Classification" = "Classification"; "Duration" = "Tímalengd"; "Attendees:" = "Þáttakendur:"; "Resources" = "Tilföng"; @@ -227,11 +227,11 @@ "Repeat:" = "Endurtaka:"; "Reminder:" = "Áminning:"; "General:" = "Almennt:"; +"Reply:" = "Reply:"; +"Target:" = "Target:"; - - - +"attributes" = "attributes"; "attendees" = "þáttakendur"; "delegated from" = "Skipaður fulltrúi var"; @@ -257,7 +257,7 @@ /* Appointments (error messages) */ - +"Conflicts found!" = "Conflicts found!"; "Invalid iCal data!" = "Ógild ICal gögn!"; "Could not create iCal data!" = "Ekki tókst að búa til iCal gögn!"; @@ -283,7 +283,7 @@ "All day Event" = "Heilsdagsviðburður"; "check for conflicts" = "Athuga með árekstra"; - +"Browse URL" = "Browse URL"; "newAttendee" = "Bæta þáttakanda við"; @@ -327,17 +327,17 @@ /* Cycles */ +"cycle_once" = "cycle_once"; +"cycle_daily" = "cycle_daily"; +"cycle_weekly" = "cycle_weekly"; +"cycle_2weeks" = "cycle_2weeks"; +"cycle_4weeks" = "cycle_4weeks"; +"cycle_monthly" = "cycle_monthly"; +"cycle_weekday" = "cycle_weekday"; +"cycle_yearly" = "cycle_yearly"; - - - - - - - - - - +"cycle_end_never" = "cycle_end_never"; +"cycle_end_until" = "cycle_end_until"; "Recurrence pattern" = "Endurtekningarmynstur"; "Range of recurrence" = "Endurtekningartímabil"; @@ -404,7 +404,7 @@ "reminder_AFTER" = "eftir"; "reminder_START" = "viðburðurinn byrjar"; "reminder_END" = "viðburðurinn endar"; - +"Reminder Details" = "Reminder Details"; "Choose a Reminder Action" = "Velja aðgerð við áminningu"; "Show an Alert" = "Sýna viðvörun"; @@ -412,11 +412,11 @@ "Email Organizer" = "Senda til skipuleggjanda"; "Email Attendees" = "Senda þáttakendum"; - - - - - +"zoom_400" = "400%"; +"zoom_200" = "200%"; +"zoom_100" = "100%"; +"zoom_50" = "50%"; +"zoom_25" = "25%"; /* transparency */ @@ -530,7 +530,7 @@ vtodo_class2 = "(Verkefni er trúnaðarmál)"; "Synchronization" = "Samstilling"; "Synchronize" = "Samstilla"; - +"Tag:" = "Tag:"; "Display" = "Sýna"; "Show alarms" = "Sýna vekjara"; @@ -538,9 +538,9 @@ vtodo_class2 = "(Verkefni er trúnaðarmál)"; "Links to this Calendar" = "Tenglar í þetta dagatal"; "Authenticated User Access" = "Aðgangur fyrir sannvottaðan notanda"; - - - +"CalDAV URL" = "CalDAV URL"; +"WebDAV ICS URL" = "WebDAV ICS URL"; +"WebDAV XML URL" = "WebDAV XML URL"; /* Error messages */ "dayFieldInvalid" = "Hér þarf að tilgreina fyrir Dagana, tölugildi sem er 1 eða stærra."; @@ -550,7 +550,7 @@ vtodo_class2 = "(Verkefni er trúnaðarmál)"; "yearFieldInvalid" = "Hér þarf að tilgreina fyrir árið/árin, tölugildi sem er 1 eða stærra."; "appointmentFieldInvalid" = "Hér þarf að tilgreina fyrir tímapantanir, tölugildi sem er 1 eða stærra."; "recurrenceUnsupported" = "Þessa tegund endurtekningar er ekki hægt að styðja enn sem komið er."; - +"Please specify a calendar name." = "Please specify a calendar name."; "tagNotDefined" = "Þú þarft að tilgreina merki ef þú vilt samhæfa þetta dagatal."; "tagAlreadyExists" = "Merkið sem þú tilgreindir er nú þegar bendlað við annað dagatal."; "tagHasChanged" = "Ef þú breytir merkingunni á dagatalinu þínu, þarftu að endurhlaða gögnum inn á farsíman þinn.\nHalda áfram?"; diff --git a/UI/Scheduler/Italian.lproj/Localizable.strings b/UI/Scheduler/Italian.lproj/Localizable.strings index 393995380..3ddc721e9 100644 --- a/UI/Scheduler/Italian.lproj/Localizable.strings +++ b/UI/Scheduler/Italian.lproj/Localizable.strings @@ -10,7 +10,7 @@ "Switch to day view" = "Giorno"; "Switch to week view" = "Settimana"; "Switch to month view" = "Mese"; - +"Reload all calendars" = "Reload all calendars"; /* Tabs */ "Date" = "Data"; @@ -41,7 +41,7 @@ "a2_Wednesday" = "Me"; "a2_Thursday" = "Gi"; "a2_Friday" = "Ve"; - +"a2_Saturday" = "Sa"; "dayLabelFormat" = "%d/%m/%Y"; "today" = "Oggi"; @@ -109,7 +109,7 @@ "Import Events..." = "Importa gli eventi..."; "Import Events" = "Importa gli eventi"; "Select an iCalendar file (.ics)." = "Seleziona un file iCalendar (.ics)."; - +"Upload" = "Upload"; "Publish Calendar..." = "Pubblica calendario..."; "Reload Remote Calendars" = "Aggiorna calendari remoti"; "Properties" = "Proprietà"; @@ -126,7 +126,7 @@ /* Misc */ - +"OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Vietato"; /* acls */ @@ -186,7 +186,7 @@ "No appointments found" = "Nessun appuntamento trovato"; "Meetings proposed by you" = "Incontri proposti da te"; "Meetings proposed to you" = "Incontri a cui sei stato invitato"; - +"sched_startDateFormat" = "%d/%m %H:%M"; "action" = "Azione"; "accept" = "Accetta"; "decline" = "Declina"; @@ -207,12 +207,12 @@ "Title:" = "Titolo:"; "Calendar:" = "Calendario:"; "Name" = "Nome"; - +"Email" = "Email"; "Status:" = "Stato:"; "% complete" = "% completato"; "Location:" = "Luogo:"; "Priority:" = "Priorità:"; - +"Privacy" = "Privacy"; "Cycle" = "Ricorrenza"; "Cycle End" = "Termine ricorrenza"; "Categories" = "Categorie"; @@ -406,17 +406,17 @@ "reminder_END" = "l'evento termina"; "Reminder Details" = "Dettagli promemoria"; +"Choose a Reminder Action" = "Choose a Reminder Action"; +"Show an Alert" = "Show an Alert"; +"Send an E-mail" = "Send an E-mail"; +"Email Organizer" = "Email Organizer"; +"Email Attendees" = "Email Attendees"; - - - - - - - - - - +"zoom_400" = "400%"; +"zoom_200" = "200%"; +"zoom_100" = "100%"; +"zoom_50" = "50%"; +"zoom_25" = "25%"; /* transparency */ @@ -429,7 +429,7 @@ validate_invalid_startdate = "Data iniziale non corretta!"; validate_invalid_enddate = "Data finale non corretta!"; validate_endbeforestart = "La data finale specificata è precedente alla data di inizio."; - +"Tasks" = "Tasks"; "Show completed tasks" = "Visualizza attività completate"; /* tabs */ @@ -485,7 +485,7 @@ validate_endbeforestart = "La data finale specificata è precedente alla data /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "Periodo suggerito:"; - +"Zoom:" = "Zoom:"; "Previous slot" = "Precedente"; "Next slot" = "Successivo"; "Previous hour" = "Ora precedente"; @@ -537,10 +537,10 @@ vtodo_class2 = "(Attività confidenziale)"; "Show tasks" = "Mostra attività"; "Links to this Calendar" = "Link a questo Calendario"; - +"Authenticated User Access" = "Authenticated User Access"; "CalDAV URL" = "CalDAV url"; - - +"WebDAV ICS URL" = "WebDAV ICS URL"; +"WebDAV XML URL" = "WebDAV XML URL"; /* Error messages */ "dayFieldInvalid" = "Prego specificare nel campo Giorni un valore numerico maggiore o ugale a 1."; @@ -550,20 +550,20 @@ vtodo_class2 = "(Attività confidenziale)"; "yearFieldInvalid" = "Prego specificare nel campo Anno(i) un valore numerico maggiore o uguale a 1."; "appointmentFieldInvalid" = "Prego specificare nel campo Appuntamento(i) un valore numerico maggiore o uguale a 1."; "recurrenceUnsupported" = "Questo tipo di ricorrenza non è attualmente supportata."; - +"Please specify a calendar name." = "Please specify a calendar name."; "tagNotDefined" = "E' necessario specificare un etichetta se si vuole sincronizzare questo calendario."; "tagAlreadyExists" = "L'etichetta specificata è già associata ad un altro calendario."; "tagHasChanged" = "Cambiando l'etichetta del calendario è necessario ricaricare tutti i dati sul dispositivo mobile.\nContinuare?"; "tagWasAdded" = "Sincronizzando questo calendario sarà necessario ricaricare i dati sul dispositivo mobile.\nContinuare?"; "tagWasRemoved" = "Rimuovendo questo calendario dalla sincronizzazione, sarà necessario ricaricare i dati sul dispositivo mobile.\nCotinuare?"; - - +"DestinationCalendarError" = "The source and destination calendars are the same. Please try to copy to a different calendar."; +"EventCopyError" = "The copy failed. Please try to copy to a difference calendar."; "Open Task..." = "Apri attività..."; "Mark Completed" = "Segna come completata"; "Delete Task" = "Elimina attività"; "Delete Event" = "Elimina evento"; - +"Copy event to my calendar" = "Copy event to my calendar"; "Subscribe to a web calendar..." = "Sottoscrivi un calendario remoto..."; "URL of the Calendar" = "URL del calendario"; diff --git a/UI/Scheduler/Norwegian.lproj/Localizable.strings b/UI/Scheduler/Norwegian.lproj/Localizable.strings index a6d12852e..565c6c85d 100644 --- a/UI/Scheduler/Norwegian.lproj/Localizable.strings +++ b/UI/Scheduler/Norwegian.lproj/Localizable.strings @@ -40,7 +40,7 @@ "a2_Tuesday" = "Ti"; "a2_Wednesday" = "On"; "a2_Thursday" = "To"; - +"a2_Friday" = "Fr"; "a2_Saturday" = "Lø"; "dayLabelFormat" = "%Y-%m-%d"; @@ -66,27 +66,27 @@ "January" = "Januar"; "February" = "Februar"; "March" = "Mars"; - - +"April" = "April"; +"May" = "May"; "June" = "Juni"; "July" = "Juli"; - - +"August" = "August"; +"September" = "September"; "October" = "Oktober"; - +"November" = "November"; "December" = "Desember"; "a3_January" = "Januar"; "a3_February" = "Februar"; "a3_March" = "Mars"; - - +"a3_April" = "April"; +"a3_May" = "May"; "a3_June" = "Juni"; "a3_July" = "Juli"; - - +"a3_August" = "August"; +"a3_September" = "September"; "a3_October" = "Oktober"; - +"a3_November" = "November"; "a3_December" = "Desember"; "Previous Month" = "Forrige måned"; @@ -126,7 +126,7 @@ /* Misc */ - +"OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Forbudt"; /* acls */ @@ -186,7 +186,7 @@ "No appointments found" = "Ingen avtaler funnet"; "Meetings proposed by you" = "Møter foreslått av deg"; "Meetings proposed to you" = "Møter foreslått til deg"; - +"sched_startDateFormat" = "%d/%m %H:%M"; "action" = "Handling"; "accept" = "Godta"; "decline" = "Avslå"; @@ -208,7 +208,7 @@ "Calendar:" = "Kalender:"; "Name" = "Navn"; "Email" = "E-post"; - +"Status:" = "Status:"; "% complete" = "% utført"; "Location:" = "Plass:"; "Priority:" = "Prioritet:"; @@ -301,7 +301,7 @@ "prio_2" = "Høy"; "prio_3" = "Høy"; "prio_4" = "Høy"; - +"prio_5" = "Normal"; "prio_6" = "Lav"; "prio_7" = "Lav"; "prio_8" = "Lav"; @@ -352,7 +352,7 @@ "Week(s)" = "Uke(r)"; "On" = "På"; "Month(s)" = "Måned(er)"; - +"The" = "The"; "Recur on day(s)" = "Gjentas på dag(er)"; "Year(s)" = "År"; "cycle_of" = "av"; @@ -412,11 +412,11 @@ "Email Organizer" = "E-post organisator"; "Email Attendees" = "E-post deltakere"; - - - - - +"zoom_400" = "400%"; +"zoom_200" = "200%"; +"zoom_100" = "100%"; +"zoom_50" = "50%"; +"zoom_25" = "25%"; /* transparency */ @@ -485,7 +485,7 @@ validate_endbeforestart = "Angitt sluttdato inntreffer før angitt startdato. /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "Foreslå tid:"; - +"Zoom:" = "Zoom:"; "Previous slot" = "Forrige spor"; "Next slot" = "Neste spor"; "Previous hour" = "Forrige time"; @@ -500,7 +500,7 @@ validate_endbeforestart = "Angitt sluttdato inntreffer før angitt startdato. /* apt list */ "Title" = "Tittel"; - +"Start" = "Start"; "End" = "Slutt"; "Location" = "Plass"; "(Private Event)" = "(Privat hendelse)"; @@ -537,10 +537,10 @@ vtodo_class2 = "(Konfidensiell oppgave)"; "Show tasks" = "Vis oppgaver"; "Links to this Calendar" = "Linker til denne kalenderen"; - +"Authenticated User Access" = "Authenticated User Access"; "CalDAV URL" = "CalDAV url"; - - +"WebDAV ICS URL" = "WebDAV ICS URL"; +"WebDAV XML URL" = "WebDAV XML URL"; /* Error messages */ "dayFieldInvalid" = "Angi en numerisk verdi i dagsfeltet større enn eller lik 1."; @@ -550,7 +550,7 @@ vtodo_class2 = "(Konfidensiell oppgave)"; "yearFieldInvalid" = "Angi en numerisk verdi i årsfeltet større enn eller lik 1."; "appointmentFieldInvalid" = "Angi en numerisk verdi i møtesfeltet større enn eller lik 1."; "recurrenceUnsupported" = "Denne type gjentakelse støttes ikke i dag."; - +"Please specify a calendar name." = "Please specify a calendar name."; "tagNotDefined" = "Du må angi en merkelapp om du vil synkronisere kalenderen."; "tagAlreadyExists" = "Merkelappen du spesifiserte er allerede knyttet til en annen kalender."; "tagHasChanged" = "Om du endrer merkelappen på din kalender trenger du å laste dataene i din mobiltelefon på nytt.\nFortsätta?"; @@ -563,7 +563,7 @@ vtodo_class2 = "(Konfidensiell oppgave)"; "Mark Completed" = "Merk utført"; "Delete Task" = "Slett oppgave"; "Delete Event" = "Slett hendelse"; - +"Copy event to my calendar" = "Copy event to my calendar"; "Subscribe to a web calendar..." = "Abonnere på en internett-kalender..."; "URL of the Calendar" = "URL til kalenderen"; diff --git a/UI/Scheduler/Polish.lproj/Localizable.strings b/UI/Scheduler/Polish.lproj/Localizable.strings index 69e23e596..3b8ced6ba 100644 --- a/UI/Scheduler/Polish.lproj/Localizable.strings +++ b/UI/Scheduler/Polish.lproj/Localizable.strings @@ -126,7 +126,7 @@ /* Misc */ - +"OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Zabronione"; /* acls */ @@ -208,7 +208,7 @@ "Calendar:" = "Kalendarz:"; "Name" = "Nazwa"; "Email" = "E-mail"; - +"Status:" = "Status:"; "% complete" = "% wykonania"; "Location:" = "Miejsce:"; "Priority:" = "Priorytet:"; @@ -352,10 +352,10 @@ "Week(s)" = "Tygodni(e)"; "On" = "w"; "Month(s)" = "Miesiące(ęcy)"; - +"The" = ""; "Recur on day(s)" = "Powtarzaj w dni"; "Year(s)" = "Lat(a)"; - +"cycle_of" = ""; "No end date" = "Bez daty końcowej"; "Create" = "Utwórz"; "appointment(s)" = "spotkanie(a)"; @@ -406,17 +406,17 @@ "reminder_END" = "końcem wydarzenia"; "Reminder Details" = "Szczegóły przypomnienia"; +"Choose a Reminder Action" = "Choose a Reminder Action"; +"Show an Alert" = "Show an Alert"; +"Send an E-mail" = "Send an E-mail"; +"Email Organizer" = "Email Organizer"; +"Email Attendees" = "Email Attendees"; - - - - - - - - - - +"zoom_400" = "400%"; +"zoom_200" = "200%"; +"zoom_100" = "100%"; +"zoom_50" = "50%"; +"zoom_25" = "25%"; /* transparency */ @@ -538,9 +538,9 @@ vtodo_class2 = "(Zadanie poufne)"; "Links to this Calendar" = "Odnośniki do tego kalendarza"; "Authenticated User Access" = "Dostęp dla zalogowanych użytkowników"; - - - +"CalDAV URL" = "CalDAV URL"; +"WebDAV ICS URL" = "WebDAV ICS URL"; +"WebDAV XML URL" = "WebDAV XML URL"; /* Error messages */ "dayFieldInvalid" = "W polu Dni wprowadź liczbę równą lub większą od 1."; @@ -550,23 +550,23 @@ vtodo_class2 = "(Zadanie poufne)"; "yearFieldInvalid" = "W polu Lata wprowadź liczbę równą lub większą od 1."; "appointmentFieldInvalid" = "W polu Spotkania wprowadź liczbę równą lub większą od 1."; "recurrenceUnsupported" = "Ten typ powtórzeń obecnie nie jest obsługiwany."; - +"Please specify a calendar name." = "Please specify a calendar name."; "tagNotDefined" = "Musisz podać znacznik, jeśli chcesz synchronizować ten kalendarz."; "tagAlreadyExists" = "Podany znacznik jest już skojarzony z innym kalendarzem."; "tagHasChanged" = "Jeśli zmienisz znacznik kalendarza, musisz przeładować dane na swoim urządzeniu mobilnym.\nKontynuować?"; "tagWasAdded" = "Jeśli chesz synchronizować ten kalendarz, będziesz musiał(a) przeładować dane na swoim urządzeniu mobilnym.\nKontynuować?"; "tagWasRemoved" = "Jeśli usuniesz ten kalendarz z synchronizacji, będziesz musiał(a) przeładować dane na swoim urządzeniu mobilnym.\nKontynuować?"; - - +"DestinationCalendarError" = "The source and destination calendars are the same. Please try to copy to a different calendar."; +"EventCopyError" = "The copy failed. Please try to copy to a difference calendar."; "Open Task..." = "Otwórz zadanie..."; "Mark Completed" = "Oznacz jako ukończone"; "Delete Task" = "Usuń zadanie"; "Delete Event" = "Usuń wydarzenie"; - +"Copy event to my calendar" = "Copy event to my calendar"; "Subscribe to a web calendar..." = "Subskrybuj kalendarz..."; "URL of the Calendar" = "URL do kalendarza"; "Web Calendar" = "Kalendarz Web"; "Reload on login" = "Przeładuj przy logowaniu"; - +"Invalid number." = "Invalid number."; diff --git a/UI/Scheduler/Russian.lproj/Localizable.strings b/UI/Scheduler/Russian.lproj/Localizable.strings index 41783e59c..ae0b045de 100644 --- a/UI/Scheduler/Russian.lproj/Localizable.strings +++ b/UI/Scheduler/Russian.lproj/Localizable.strings @@ -10,7 +10,7 @@ "Switch to day view" = "Перейти к обзору дня"; "Switch to week view" = "Перейти к обзору недели"; "Switch to month view" = "Перейти к обзору месяца"; - +"Reload all calendars" = "Reload all calendars"; /* Tabs */ "Date" = "Дата"; @@ -46,8 +46,8 @@ "dayLabelFormat" = "%d/%m/%Y"; "today" = "Сегодня"; - - +"Previous Day" = "Previous Day"; +"Next Day" = "Next Day"; /* Week */ @@ -126,7 +126,7 @@ /* Misc */ - +"OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Запрешено"; /* acls */ @@ -150,7 +150,7 @@ "View the Date & Time" = "Показывать время и дату"; "Modify" = "Изменить"; "Respond To" = "Ответить"; - +"None" = "None"; "This person can create objects in my calendar." = "Этот участник может создавать записи в моем календаре."; @@ -186,7 +186,7 @@ "No appointments found" = "Не найдено назначенных встреч"; "Meetings proposed by you" = "Ваши предложения о встрече"; "Meetings proposed to you" = "Предложенные Вам встречи"; - +"sched_startDateFormat" = "%d/%m %H:%M"; "action" = "Действие"; "accept" = "Согласиться"; "decline" = "Отказаться"; @@ -207,7 +207,7 @@ "Title:" = "Заголовок:"; "Calendar:" = "Календарь:"; "Name" = "Имя"; - +"Email" = "Email"; "Status:" = "Статус:"; "% complete" = "% выполнено"; "Location:" = "Место:"; @@ -352,13 +352,13 @@ "Week(s)" = "недель(и)"; "On" = "На"; "Month(s)" = "месяца(цев)"; - +"The" = ""; "Recur on day(s)" = "Повторяется в дни"; "Year(s)" = "год(года)"; - +"cycle_of" = ""; "No end date" = "Нет даты завершения"; "Create" = "Создать"; - +"appointment(s)" = "appointment(s)"; "Repeat until" = "Повторять до"; "First" = "Первый"; @@ -412,11 +412,11 @@ "Email Organizer" = "Email организатору"; "Email Attendees" = "Email участникам"; - - - - - +"zoom_400" = "400%"; +"zoom_200" = "200%"; +"zoom_100" = "100%"; +"zoom_50" = "50%"; +"zoom_25" = "25%"; /* transparency */ @@ -446,7 +446,7 @@ validate_endbeforestart = "Дата начала позже даты конц "Day View" = "День"; "Week View" = "По неделям"; "Month View" = "Месяц"; - +"Reload" = "Reload"; "eventPartStatModificationError" = "Невозможно изменить статус Вашего участия."; @@ -537,10 +537,10 @@ vtodo_class2 = "(Конфиденциальное задание)"; "Show tasks" = "Показать задания"; "Links to this Calendar" = "Ссылки на этот календарь"; - +"Authenticated User Access" = "Authenticated User Access"; "CalDAV URL" = "CalDAV url"; - - +"WebDAV ICS URL" = "WebDAV ICS URL"; +"WebDAV XML URL" = "WebDAV XML URL"; /* Error messages */ "dayFieldInvalid" = "Пожалуйста, укажите числовое значение в поле дней, большее или равное 1."; @@ -550,7 +550,7 @@ vtodo_class2 = "(Конфиденциальное задание)"; "yearFieldInvalid" = "Пожалуйста, укажите числовое значение в поле лет, большее или равное 1."; "appointmentFieldInvalid" = "Пожалуйста, укажите числовое значение в поле встреч, большее или равное 1."; "recurrenceUnsupported" = "Этот тип повторений пока не поддерживается."; - +"Please specify a calendar name." = "Please specify a calendar name."; "tagNotDefined" = "Вы должны указать метку (tag) если хотите синхронизировать этот календарь."; "tagAlreadyExists" = "Указанная метка уже используется в другом календаре."; "tagHasChanged" = "Если Вы смените метку в этом календаре, то будет необходимо заново синхронизировать данные на Вашем мобильном устройстве. \nПродолжить?"; @@ -563,10 +563,10 @@ vtodo_class2 = "(Конфиденциальное задание)"; "Mark Completed" = "Пометить как завершенное"; "Delete Task" = "Удалить задачу"; "Delete Event" = "Удалить событие"; - +"Copy event to my calendar" = "Copy event to my calendar"; "Subscribe to a web calendar..." = "Подписаться на калентарь в сети..."; - - +"URL of the Calendar" = "URL of the Calendar"; +"Web Calendar" = "Web Calendar"; "Reload on login" = "Перезагружать при входе"; "Invalid number." = "Число неверно."; diff --git a/UI/Scheduler/Spanish.lproj/Localizable.strings b/UI/Scheduler/Spanish.lproj/Localizable.strings index 05a702699..6b38df5e2 100644 --- a/UI/Scheduler/Spanish.lproj/Localizable.strings +++ b/UI/Scheduler/Spanish.lproj/Localizable.strings @@ -126,7 +126,7 @@ /* Misc */ - +"OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Prohibido"; /* acls */ @@ -186,7 +186,7 @@ "No appointments found" = "No hay eventos encontrados"; "Meetings proposed by you" = "Eventos propuestos por Ud."; "Meetings proposed to you" = "Eventos propuestos para Ud"; - +"sched_startDateFormat" = "%d/%m %H:%M"; "action" = "Acción"; "accept" = "Aceptar"; "decline" = "Rechazar"; @@ -226,7 +226,7 @@ "Category:" = "Categoría:"; "Repeat:" = "Repetir:"; "Reminder:" = "Recordatorio:"; - +"General:" = "General:"; "Reply:" = "Responder:"; "Target:" = "URL documento:"; @@ -301,7 +301,7 @@ "prio_2" = "Alta"; "prio_3" = "Alta"; "prio_4" = "Alta"; - +"prio_5" = "Normal"; "prio_6" = "Baja"; "prio_7" = "Baja"; "prio_8" = "Baja"; @@ -412,11 +412,11 @@ "Email Organizer" = "Enviar correo al organizador"; "Email Attendees" = "Enviar correo a los asistentes"; - - - - - +"zoom_400" = "400%"; +"zoom_200" = "200%"; +"zoom_100" = "100%"; +"zoom_50" = "50%"; +"zoom_25" = "25%"; /* transparency */ @@ -524,7 +524,7 @@ vtodo_class2 = "(Tarea confidencial)"; /* Properties dialog */ "Name:" = "Nombre:"; - +"Color:" = "Color:"; "Include in free-busy" = "Incluye en tiempo libre-ocupado"; @@ -532,15 +532,15 @@ vtodo_class2 = "(Tarea confidencial)"; "Synchronize" = "Sincroniza"; "Tag:" = "Redacción:"; - +"Display" = "Display"; "Show alarms" = "Muestra alarmas"; "Show tasks" = "Muestra tareas"; "Links to this Calendar" = "Vínculos a éste calendario"; "Authenticated User Access" = "Acceso a usuario autenticado"; "CalDAV URL" = "CalDAV url"; - - +"WebDAV ICS URL" = "WebDAV ICS URL"; +"WebDAV XML URL" = "WebDAV XML URL"; /* Error messages */ "dayFieldInvalid" = "Por favor, especificar un valor númerico en el campo día superior o igual a 1."; @@ -550,7 +550,7 @@ vtodo_class2 = "(Tarea confidencial)"; "yearFieldInvalid" = "Por favor, especificar un valor númerico en el campo año superior o igual a 1."; "appointmentFieldInvalid" = "Por favor, especificar un valor númerico en el campo cita(s) superior o igual a 1."; "recurrenceUnsupported" = "Este tipo de frecuencia no esta soportado."; - +"Please specify a calendar name." = "Please specify a calendar name."; "tagNotDefined" = "Tiene que especificar un marcador si quiere sincronizar este calendario."; "tagAlreadyExists" = "El marcador especificado ya esta asociado a otro calendario."; "tagHasChanged" = "Si cambia el marcador de este calendario, necesitara recargar los datos en su teléfono móvil.\n¿Continuar?"; diff --git a/UI/Scheduler/Swedish.lproj/Localizable.strings b/UI/Scheduler/Swedish.lproj/Localizable.strings index befd2dd02..faa76dcc2 100644 --- a/UI/Scheduler/Swedish.lproj/Localizable.strings +++ b/UI/Scheduler/Swedish.lproj/Localizable.strings @@ -40,7 +40,7 @@ "a2_Tuesday" = "Ti"; "a2_Wednesday" = "On"; "a2_Thursday" = "To"; - +"a2_Friday" = "Fr"; "a2_Saturday" = "Lö"; "dayLabelFormat" = "%Y-%m-%d"; @@ -66,28 +66,28 @@ "January" = "Januari"; "February" = "Februari"; "March" = "Mars"; - +"April" = "April"; "May" = "Maj"; "June" = "Juni"; "July" = "Juli"; "August" = "Augusti"; - +"September" = "September"; "October" = "Oktober"; - - +"November" = "November"; +"December" = "December"; "a3_January" = "Januari"; "a3_February" = "Februari"; "a3_March" = "Mars"; - +"a3_April" = "April"; "a3_May" = "Maj"; "a3_June" = "Juni"; "a3_July" = "Juli"; "a3_August" = "Augusti"; - +"a3_September" = "September"; "a3_October" = "Oktober"; - - +"a3_November" = "November"; +"a3_December" = "December"; "Previous Month" = "Föregående månad"; "Next Month" = "Nästa månad"; @@ -126,7 +126,7 @@ /* Misc */ - +"OpenGroupware.org" = "OpenGroupware.org"; "Forbidden" = "Förbjuden"; /* acls */ @@ -186,7 +186,7 @@ "No appointments found" = "Inga möten hittade"; "Meetings proposed by you" = "Möten föreslagna av dig"; "Meetings proposed to you" = "Möten föreslagna till dig"; - +"sched_startDateFormat" = "%d/%m %H:%M"; "action" = "Åtgärd"; "accept" = "Acceptera"; "decline" = "Avböj"; @@ -208,7 +208,7 @@ "Calendar:" = "Kalender:"; "Name" = "Namn"; "Email" = "E-post"; - +"Status:" = "Status:"; "% complete" = "% utfört"; "Location:" = "Plats:"; "Priority:" = "Prioritet:"; @@ -301,7 +301,7 @@ "prio_2" = "Hög"; "prio_3" = "Hög"; "prio_4" = "Hög"; - +"prio_5" = "Normal"; "prio_6" = "Låg"; "prio_7" = "Låg"; "prio_8" = "Låg"; @@ -352,7 +352,7 @@ "Week(s)" = "Vecka(or)"; "On" = "På"; "Month(s)" = "Månad(er)"; - +"The" = "The"; "Recur on day(s)" = "Återkommer på dag(ar)"; "Year(s)" = "År"; "cycle_of" = "av"; @@ -412,11 +412,11 @@ "Email Organizer" = "Skicka meddelande till arrangör"; "Email Attendees" = "Skicka meddelande till deltagare"; - - - - - +"zoom_400" = "400%"; +"zoom_200" = "200%"; +"zoom_100" = "100%"; +"zoom_50" = "50%"; +"zoom_25" = "25%"; /* transparency */ @@ -485,7 +485,7 @@ validate_endbeforestart = "Angivet slutdatumet inträffar före angivet start /* FreeBusy panel buttons and labels */ "Suggest time slot:" = "Föreslå tid:"; - +"Zoom:" = "Zoom:"; "Previous slot" = "Föregående tid"; "Next slot" = "Nästa tid"; "Previous hour" = "Föregående timme"; @@ -500,7 +500,7 @@ validate_endbeforestart = "Angivet slutdatumet inträffar före angivet start /* apt list */ "Title" = "Titel"; - +"Start" = "Start"; "End" = "Slut"; "Location" = "Plats"; "(Private Event)" = "(Privat händelse)"; @@ -537,10 +537,10 @@ vtodo_class2 = "(Konfidentiell uppgift)"; "Show tasks" = "Visa uppgifter"; "Links to this Calendar" = "Länkar till denna kalender"; - +"Authenticated User Access" = "Authenticated User Access"; "CalDAV URL" = "CalDAV url"; - - +"WebDAV ICS URL" = "WebDAV ICS URL"; +"WebDAV XML URL" = "WebDAV XML URL"; /* Error messages */ "dayFieldInvalid" = "Ange ett numeriskt värde in dagsfältet större än eller lika med 1."; @@ -550,7 +550,7 @@ vtodo_class2 = "(Konfidentiell uppgift)"; "yearFieldInvalid" = "Ange ett numeriskt värde in årsfältet större än eller lika med 1."; "appointmentFieldInvalid" = "Ange ett numeriskt värde in mötesfältet större än eller lika med 1."; "recurrenceUnsupported" = "Denna upprepningstyp stöds för närvarande inte."; - +"Please specify a calendar name." = "Please specify a calendar name."; "tagNotDefined" = "Du måste ange en etikett om du vill synkronisera kalendern."; "tagAlreadyExists" = "Etiketten du angett är redan associerad till en annan kalender."; "tagHasChanged" = "Om du ändrar etiketten på din kalender, behöver du ladda om datat i din mobiltelefon.\nFortsätta?"; @@ -563,7 +563,7 @@ vtodo_class2 = "(Konfidentiell uppgift)"; "Mark Completed" = "Märk utförd"; "Delete Task" = "Ta bort uppgift"; "Delete Event" = "Ta bort händelse"; - +"Copy event to my calendar" = "Copy event to my calendar"; "Subscribe to a web calendar..." = "Prenumrera på en webbkalender..."; "URL of the Calendar" = "URL till kalendern"; diff --git a/UI/WebServerResources/SchedulerUI.js b/UI/WebServerResources/SchedulerUI.js index f1079d066..67a51dc4f 100644 --- a/UI/WebServerResources/SchedulerUI.js +++ b/UI/WebServerResources/SchedulerUI.js @@ -2683,7 +2683,7 @@ function appendCalendar(folderName, folderPath) { if (!owner) owner = UserLogin; - log ("append name: " + folderName + "; path: " + folderPath + "; owner: " + owner); + //log ("append name: " + folderName + "; path: " + folderPath + "; owner: " + owner); if ($(folderPath)) showAlertDialog(_("You have already subscribed to that folder!")); diff --git a/UI/WebServerResources/UIxAppointmentEditor.css b/UI/WebServerResources/UIxAppointmentEditor.css index 54598487a..16ef17b77 100644 --- a/UI/WebServerResources/UIxAppointmentEditor.css +++ b/UI/WebServerResources/UIxAppointmentEditor.css @@ -170,10 +170,5 @@ DIV#attendeesMenu .delegated .statusIcon DIV#attendeesMenu .no-partstat .statusIcon { background-position: -60px 0px; } -DIV#attendeesMenu.fakeTextArea .delegate +DIV#attendeesMenu .delegate { padding-left: 16px !important; } - -DIV#attendeesMenu .delegate SPAN -{ float: left; - width: 8px; - border: 1px; } diff --git a/UI/WebServerResources/UIxAttendeesEditor.js b/UI/WebServerResources/UIxAttendeesEditor.js index 439af1c95..af7faf682 100644 --- a/UI/WebServerResources/UIxAttendeesEditor.js +++ b/UI/WebServerResources/UIxAttendeesEditor.js @@ -179,7 +179,7 @@ function performSearch(input) { // Perform address completion if (!input.value.blank()) { var urlstr = (UserFolderURL - + "Contacts/allContactSearch?search=" + + "Contacts/allContactSearch?excludeGroups=1&search=" + encodeURIComponent(input.value)); triggerAjaxRequest(urlstr, performSearchCallback, input); } diff --git a/UI/WebServerResources/UIxMailEditor.css b/UI/WebServerResources/UIxMailEditor.css index fb7458e3a..50d08752c 100644 --- a/UI/WebServerResources/UIxMailEditor.css +++ b/UI/WebServerResources/UIxMailEditor.css @@ -169,12 +169,3 @@ UL#attachments LI IMG TEXTAREA#text { display: none; background: #fff; } - -blockquote[type=cite] { - display: block; - margin: 1em 0px; - -moz-padding-start: 1em; - -moz-border-start: solid; - border-color: blue; - border-width: thin; -} \ No newline at end of file diff --git a/UI/WebServerResources/UIxMailEditor.js b/UI/WebServerResources/UIxMailEditor.js index e9d84d689..f207acaad 100644 --- a/UI/WebServerResources/UIxMailEditor.js +++ b/UI/WebServerResources/UIxMailEditor.js @@ -405,7 +405,8 @@ function initMailEditor() { 'BulletedList', '-', 'Link', 'Unlink', 'Image', 'JustifyLeft','JustifyCenter','JustifyRight', 'JustifyBlock','Font','FontSize','-','TextColor', - 'BGColor','-','SpellChecker']], + 'BGColor','-','SpellChecker'] + ], language : localeCode, scayt_sLang : localeCode } @@ -577,8 +578,6 @@ function onWindowResize(event) { attachmentswidth = attachmentsarea.getWidth(); fromfield = $(document).getElementsByClassName('headerField', headerarea)[0]; var height = headerarea.getHeight() - fromfield.getHeight() - subjectfield.getHeight() - 10; -// var height = headerarea.getHeight() - 20; -// alert ("height = " + height + "px"); if (Prototype.Browser.IE) $("attachments").setStyle({ height: (height - 13) + 'px' }); else From f8931e0e09eb79a91abe797ba5e8898bb2df93c4 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Thu, 3 Nov 2011 13:40:11 +0000 Subject: [PATCH 10/38] Monotone-Parent: c16aa62954764e28a982189ae9222645f4705921 Monotone-Revision: 51381931f3aace686a6d1f39fd9e8ff37174e41c Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-03T13:40:11 Monotone-Branch: ca.inverse.sogo --- OpenChange/GNUmakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenChange/GNUmakefile b/OpenChange/GNUmakefile index c3ecc8805..6e8d0d161 100644 --- a/OpenChange/GNUmakefile +++ b/OpenChange/GNUmakefile @@ -133,7 +133,7 @@ TEST_TOOL_NAME += $(PLREADER_TOOL) LIBMAPI_CFLAGS = $(shell pkg-config libmapi --cflags) LIBMAPISTORE_CFLAGS = $(shell pkg-config libmapistore --cflags) -DSAMBA_PREFIX="\"$(shell pkg-config libmapistore --variable=prefix)\"" -ifeq ($(LIBMAPISTORE_CFLAGS),) +ifeq ($(LIBMAPI_CFLAGS),) all install:: @echo "Cannot build the OpenChange SOGo backend (empty CFLAGS for libmapistore)" else From e67931703f50fcfbbd53a71b8f497a1462af513f Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Mon, 7 Nov 2011 15:07:37 +0000 Subject: [PATCH 11/38] Monotone-Parent: faa665d09f8735444e5cc6f1e0ca073851cbab3f Monotone-Revision: d48fed214ae2d8c0aea1b8848de745e3ee235afa Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-07T15:07:37 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 15 +++++++++++++++ OpenChange/MAPIStoreFolder.m | 27 +++++++++++---------------- OpenChange/MAPIStoreObject.m | 8 ++++++-- OpenChange/MAPIStoreVolatileMessage.m | 15 --------------- 4 files changed, 32 insertions(+), 33 deletions(-) diff --git a/ChangeLog b/ChangeLog index 32a703693..9d1dc8884 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2011-11-07 Wolfgang Sourdeau + + * OpenChange/MAPIStoreFolder.m (-addProperties:): we now override + this method instead of -addPropertiesFromRow:. Also, invoking + resetCache is no longer required since the "properties" ivar is + no longer used in this class. + + * OpenChange/MAPIStoreObject.m (-addPropertiesFromRow:): now + invokes [self addProperties:] to modify the "properties" ivar, + instead of doing it directly. This enables subclasses to only need + overriding -addProperties:. + + * OpenChange/MAPIStoreVolatileMessage.m (-addPropertiesFromRow:): + removed obsolete overloading of method. + 2011-11-02 Wolfgang Sourdeau * OpenChange/MAPIStoreMessage.m (-setReadFlag:): make overrides diff --git a/OpenChange/MAPIStoreFolder.m b/OpenChange/MAPIStoreFolder.m index 9083cbe24..ec4220b87 100644 --- a/OpenChange/MAPIStoreFolder.m +++ b/OpenChange/MAPIStoreFolder.m @@ -898,33 +898,28 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe return rc; } -- (int) addPropertiesFromRow: (struct SRow *) aRow +- (void) addProperties: (NSDictionary *) newProperties { static enum MAPITAGS bannedProps[] = { PR_MID, PR_FID, PR_PARENT_FID, PR_SOURCE_KEY, PR_PARENT_SOURCE_KEY, PR_CHANGE_KEY, 0x00000000 }; enum MAPITAGS *currentProp; - int rc; - - rc = [super addPropertiesFromRow: aRow]; + NSMutableDictionary *propsCopy; /* TODO: this should no longer be required once mapistore v2 API is in place, when we can then do this from -dealloc below */ - if ([properties count] > 0) - { - currentProp = bannedProps; - while (*currentProp) - { - [properties removeObjectForKey: MAPIPropertyKey (*currentProp)]; - currentProp++; - } - [propsMessage appendProperties: properties]; - [propsMessage save]; - [self resetProperties]; + propsCopy = [newProperties mutableCopy]; + currentProp = bannedProps; + while (*currentProp) + { + [propsCopy removeObjectForKey: MAPIPropertyKey (*currentProp)]; + currentProp++; } - return rc; + [propsMessage appendProperties: propsCopy]; + [propsMessage save]; + [propsCopy release]; } - (void) dealloc diff --git a/OpenChange/MAPIStoreObject.m b/OpenChange/MAPIStoreObject.m index bc831acf5..e40e54d99 100644 --- a/OpenChange/MAPIStoreObject.m +++ b/OpenChange/MAPIStoreObject.m @@ -451,14 +451,18 @@ static Class NSExceptionK, MAPIStoreFolderK; { struct SPropValue *cValue; NSUInteger counter; + NSMutableDictionary *newProperties; + newProperties = [NSMutableDictionary dictionaryWithCapacity: aRow->cValues]; for (counter = 0; counter < aRow->cValues; counter++) { cValue = aRow->lpProps + counter; - [properties setObject: NSObjectFromSPropValue (cValue) - forKey: MAPIPropertyKey (cValue->ulPropTag)]; + [newProperties setObject: NSObjectFromSPropValue (cValue) + forKey: MAPIPropertyKey (cValue->ulPropTag)]; } + [self addProperties: newProperties]; + return MAPISTORE_SUCCESS; } diff --git a/OpenChange/MAPIStoreVolatileMessage.m b/OpenChange/MAPIStoreVolatileMessage.m index 2c427424b..1f9286bca 100644 --- a/OpenChange/MAPIStoreVolatileMessage.m +++ b/OpenChange/MAPIStoreVolatileMessage.m @@ -80,21 +80,6 @@ Class NSNumberK; [super dealloc]; } -- (int) addPropertiesFromRow: (struct SRow *) aRow -{ - int rc; - - rc = [super addPropertiesFromRow: aRow]; - if (rc == MAPISTORE_SUCCESS) - { - [sogoObject appendProperties: properties]; - [properties removeAllObjects]; - ASSIGN (lastModificationTime, [NSDate date]); - } - - return rc; -} - - (void) addProperties: (NSDictionary *) newProperties { [super addProperties: newProperties]; From 40b8b1a463e8c466b959b7ef17bdc5fde5638229 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Mon, 7 Nov 2011 15:11:22 +0000 Subject: [PATCH 12/38] Monotone-Parent: d48fed214ae2d8c0aea1b8848de745e3ee235afa Monotone-Revision: 2cafdbe57b649f3842f8bc101e3a2eb5ff10af5c Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-07T15:11:22 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 1 + OpenChange/MAPIStoreFSMessage.m | 2 +- OpenChange/MAPIStoreMailVolatileMessage.m | 2 +- OpenChange/MAPIStoreMessage.m | 2 +- OpenChange/MAPIStoreObject.h | 1 - OpenChange/MAPIStoreObject.m | 5 ----- 6 files changed, 4 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9d1dc8884..a9b04a449 100644 --- a/ChangeLog +++ b/ChangeLog @@ -9,6 +9,7 @@ invokes [self addProperties:] to modify the "properties" ivar, instead of doing it directly. This enables subclasses to only need overriding -addProperties:. + (-resetProperties): removed useless method. * OpenChange/MAPIStoreVolatileMessage.m (-addPropertiesFromRow:): removed obsolete overloading of method. diff --git a/OpenChange/MAPIStoreFSMessage.m b/OpenChange/MAPIStoreFSMessage.m index 352c0931a..6104cc72a 100644 --- a/OpenChange/MAPIStoreFSMessage.m +++ b/OpenChange/MAPIStoreFSMessage.m @@ -80,7 +80,7 @@ [sogoObject appendProperties: properties]; [sogoObject save]; - [self resetProperties]; + [properties removeAllObjects]; } - (NSDate *) creationTime diff --git a/OpenChange/MAPIStoreMailVolatileMessage.m b/OpenChange/MAPIStoreMailVolatileMessage.m index 2ae6a131f..138c960d5 100644 --- a/OpenChange/MAPIStoreMailVolatileMessage.m +++ b/OpenChange/MAPIStoreMailVolatileMessage.m @@ -812,7 +812,7 @@ MakeMessageBody (NSDictionary *mailProperties, NSDictionary *attachmentParts, mapping = [[self context] mapping]; [mapping unregisterURLWithID: [self objectId]]; [self setIsNew: NO]; - [self resetProperties]; + [properties removeAllObjects]; [[self container] cleanupCaches]; return MAPISTORE_SUCCESS; diff --git a/OpenChange/MAPIStoreMessage.m b/OpenChange/MAPIStoreMessage.m index eb7b467fe..334a71a46 100644 --- a/OpenChange/MAPIStoreMessage.m +++ b/OpenChange/MAPIStoreMessage.m @@ -460,7 +460,7 @@ MAPIStoreExternalEntryId (NSString *cn, NSString *email) [[containerTables objectAtIndex: count] notifyChangesForChild: self]; [self setIsNew: NO]; - [self resetProperties]; + [properties removeAllObjects]; [container cleanupCaches]; return MAPISTORE_SUCCESS; diff --git a/OpenChange/MAPIStoreObject.h b/OpenChange/MAPIStoreObject.h index 31ace625c..d3b10cfbe 100644 --- a/OpenChange/MAPIStoreObject.h +++ b/OpenChange/MAPIStoreObject.h @@ -86,7 +86,6 @@ - (void) addProperties: (NSDictionary *) newProperties; - (NSDictionary *) properties; -- (void) resetProperties; /* ops */ - (int) getAvailableProperties: (struct SPropTagArray **) propertiesP diff --git a/OpenChange/MAPIStoreObject.m b/OpenChange/MAPIStoreObject.m index e40e54d99..f2ac7374e 100644 --- a/OpenChange/MAPIStoreObject.m +++ b/OpenChange/MAPIStoreObject.m @@ -235,11 +235,6 @@ static Class NSExceptionK, MAPIStoreFolderK; return properties; } -- (void) resetProperties -{ - [properties removeAllObjects]; -} - - (int) getProperty: (void **) data withTag: (enum MAPITAGS) propTag inMemCtx: (TALLOC_CTX *) memCtx From 210b31476f17d11a4a7fa7e6a1aeb697aaf78e17 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Tue, 8 Nov 2011 18:36:52 +0000 Subject: [PATCH 13/38] Monotone-Parent: 2cafdbe57b649f3842f8bc101e3a2eb5ff10af5c Monotone-Revision: 113f81e1676d886a71b93cdd6b7aff23ada6b5e4 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-08T18:36:52 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 8 ++++++++ OpenChange/MAPIStoreRecurrenceUtils.m | 19 +++++++++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index a9b04a449..921f052d6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2011-11-08 Wolfgang Sourdeau + + * OpenChange/MAPIStoreRecurrenceUtils.m + (-fillRecurrencePattern:withStartDate:andEndDate:): fixed a crash + occurring when no byday mask was specified. We also force a value + for the monthday in the case of a yearly event without a proper + one. + 2011-11-07 Wolfgang Sourdeau * OpenChange/MAPIStoreFolder.m (-addProperties:): we now override diff --git a/OpenChange/MAPIStoreRecurrenceUtils.m b/OpenChange/MAPIStoreRecurrenceUtils.m index 7f283b698..de279b4fe 100644 --- a/OpenChange/MAPIStoreRecurrenceUtils.m +++ b/OpenChange/MAPIStoreRecurrenceUtils.m @@ -305,6 +305,14 @@ rp->FirstDateTime = [moduloDate asMinutesSince1601]; byMonthDay = [[self byMonthDay] objectAtIndex: 0]; + if (!byMonthDay && (freq == iCalRecurrenceFrequenceYearly)) + { + byMonthDay = [NSString stringWithFormat: @"%d", [startDate dayOfMonth]]; + [self warnWithFormat: @"no month day specified in yearly" + @" recurrence: we deduce it from the start date: %@", + byMonthDay]; + } + if (byMonthDay) { if ([byMonthDay intValue] < 0) @@ -325,11 +333,14 @@ { rp->PatternType = PatternType_MonthNth; byDayMask = [self byDayMask]; - days = [byDayMask weekDayOccurrences]; mask = 0; - for (count = 0; count < 7; count++) - if (days[0][count]) - mask |= 1 << count; + days = [byDayMask weekDayOccurrences]; + if (days) + { + for (count = 0; count < 7; count++) + if (days[0][count]) + mask |= 1 << count; + } if (mask) { rp->PatternTypeSpecific.MonthRecurrencePattern.WeekRecurrencePattern = mask; From 13349e98683f35757778eeaadfcce69cbbd769f3 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 9 Nov 2011 14:46:08 +0000 Subject: [PATCH 14/38] Monotone-Parent: 113f81e1676d886a71b93cdd6b7aff23ada6b5e4 Monotone-Revision: e836d3ba228988acc21e87b16faa064ac0c357e4 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-09T14:46:08 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 6 ++++++ OpenChange/MAPIStoreMailVolatileMessage.m | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 921f052d6..f40765c88 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2011-11-09 Wolfgang Sourdeau + + * OpenChange/MAPIStoreMailVolatileMessage.m + (_generateMailDataWithBcc:): don't write the resulting mail body + to /tmp/mimegen.eml. + 2011-11-08 Wolfgang Sourdeau * OpenChange/MAPIStoreRecurrenceUtils.m diff --git a/OpenChange/MAPIStoreMailVolatileMessage.m b/OpenChange/MAPIStoreMailVolatileMessage.m index 138c960d5..bc62b181a 100644 --- a/OpenChange/MAPIStoreMailVolatileMessage.m +++ b/OpenChange/MAPIStoreMailVolatileMessage.m @@ -759,7 +759,7 @@ MakeMessageBody (NSDictionary *mailProperties, NSDictionary *attachmentParts, messageData = cleanedMessage; } - [messageData writeToFile: @"/tmp/mimegen.eml" atomically: NO]; + // [messageData writeToFile: @"/tmp/mimegen.eml" atomically: NO]; return messageData; } From 1fcc2c555ad17d88d9f61ee24b794aa918bff92f Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 9 Nov 2011 14:58:17 +0000 Subject: [PATCH 15/38] Monotone-Parent: e836d3ba228988acc21e87b16faa064ac0c357e4 Monotone-Revision: 8433690e83501187848cc751a754f1f1fdf2d8c5 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-09T14:58:17 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 5 +++++ OpenChange/MAPIStoreVolatileMessage.m | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index f40765c88..227bb6a70 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2011-11-09 Wolfgang Sourdeau + * OpenChange/MAPIStoreVolatileMessage.m (-addProperties:): + transfer the content of the "properties" ivar instead of the + "newProperties" parameter, so as to benefit from treatment that + could have happened in parent classes. + * OpenChange/MAPIStoreMailVolatileMessage.m (_generateMailDataWithBcc:): don't write the resulting mail body to /tmp/mimegen.eml. diff --git a/OpenChange/MAPIStoreVolatileMessage.m b/OpenChange/MAPIStoreVolatileMessage.m index 1f9286bca..56bfe6984 100644 --- a/OpenChange/MAPIStoreVolatileMessage.m +++ b/OpenChange/MAPIStoreVolatileMessage.m @@ -83,7 +83,7 @@ Class NSNumberK; - (void) addProperties: (NSDictionary *) newProperties { [super addProperties: newProperties]; - [sogoObject appendProperties: newProperties]; + [sogoObject appendProperties: properties]; [properties removeAllObjects]; ASSIGN (lastModificationTime, [NSDate date]); } From 435e6361b0dfadfe5f27c159f49d4817e1aef9f7 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 9 Nov 2011 15:02:04 +0000 Subject: [PATCH 16/38] Monotone-Parent: 8433690e83501187848cc751a754f1f1fdf2d8c5 Monotone-Revision: 8387e16ec4baa1ac1d8fd5958d3681e5bcf43e92 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-09T15:02:04 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 4 + OpenChange/GNUmakefile | 31 +- OpenChange/GNUmakefile.unrtf | 34 + OpenChange/MAPIStoreMessage.m | 104 + OpenChange/unrtf-0.21.2.diff | 11516 +++++++++++++++++++++++++++++++ OpenChange/unrtf-0.21.2.tar.gz | Bin 0 -> 617656 bytes OpenChange/unrtf_config_h | 75 + 7 files changed, 11763 insertions(+), 1 deletion(-) create mode 100644 OpenChange/GNUmakefile.unrtf create mode 100644 OpenChange/unrtf-0.21.2.diff create mode 100644 OpenChange/unrtf-0.21.2.tar.gz create mode 100644 OpenChange/unrtf_config_h diff --git a/ChangeLog b/ChangeLog index 227bb6a70..188a6da8b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2011-11-09 Wolfgang Sourdeau + * OpenChange/MAPIStoreMessage.m (-addProperties): intercept + PR_RTF_COMPRESSED attributes and convert them automatically to a + PR_HTML attribute. + * OpenChange/MAPIStoreVolatileMessage.m (-addProperties:): transfer the content of the "properties" ivar instead of the "newProperties" parameter, so as to benefit from treatment that diff --git a/OpenChange/GNUmakefile b/OpenChange/GNUmakefile index 6e8d0d161..3bd60a17b 100644 --- a/OpenChange/GNUmakefile +++ b/OpenChange/GNUmakefile @@ -7,6 +7,8 @@ include ../Version BACKEND_VERSION = 1.0.0 +UNRTF_VERSION = 0.21.2 + ### bootstrap library MAPISTORESOGO = MAPIStoreSOGo LIBRARY_NAME = $(MAPISTORESOGO) @@ -23,6 +25,12 @@ BUNDLE_NAME = $(SOGOBACKEND) BUNDLE_EXTENSION = .MAPIStore BUNDLE_INSTALL_DIR = $(SOGO_LIBDIR) +UNRTF_DIR = unrtf-$(UNRTF_VERSION) + +$(SOGOBACKEND)_CPPFLAGS += -I$(UNRTF_DIR)/src + +$(SOGOBACKEND)_SUBPROJECTS = $(UNRTF_DIR)/src + $(SOGOBACKEND)_PRINCIPAL_CLASS = MAPIApplication $(SOGOBACKEND)_OBJC_FILES += \ @@ -120,7 +128,27 @@ $(SOGOBACKEND)_OBJC_FILES += \ $(SOGOBACKEND)_RESOURCE_FILES += \ - product.plist + product.plist \ + $(UNRTF_DIR)/charmaps/SYMBOL.charmap \ + $(UNRTF_DIR)/outputs/html.conf + +### unrtf +all:: $(UNRTF_DIR)/config.h $(UNRTF_DIR)/src/GNUmakefile + +$(UNRTF_DIR): $(UNRTF_DIR).tar.gz $(UNRTF_DIR).diff + rm -rf $(UNRTF_DIR) + $(TAR) -xvzf $< + (cd $(UNRTF_DIR) && patch -p1 < ../$(UNRTF_DIR).diff) + touch $(UNRTF_DIR) + +$(UNRTF_DIR)-stamp: $(UNRTF_DIR) + touch $@ + +$(UNRTF_DIR)/config.h: $(UNRTF_DIR)-stamp unrtf_config_h + cp unrtf_config_h $(UNRTF_DIR)/config.h + +$(UNRTF_DIR)/src/GNUmakefile: $(UNRTF_DIR)-stamp GNUmakefile.unrtf + cp GNUmakefile.unrtf $@ ### pl reader PLREADER_TOOL = plreader @@ -160,6 +188,7 @@ SAMBA_LIB_DIR = $(shell pkg-config libmapistore --variable=libdir) include $(GNUSTEP_MAKEFILES)/bundle.make include $(GNUSTEP_MAKEFILES)/library.make include $(GNUSTEP_MAKEFILES)/test-tool.make +include $(GNUSTEP_MAKEFILES)/aggregate.make -include GNUmakefile.postamble endif diff --git a/OpenChange/GNUmakefile.unrtf b/OpenChange/GNUmakefile.unrtf new file mode 100644 index 000000000..eaac4764a --- /dev/null +++ b/OpenChange/GNUmakefile.unrtf @@ -0,0 +1,34 @@ +# -*-makefile-*- + +# GNUstep makefile + +include $(GNUSTEP_MAKEFILES)/common.make + +UNRTF = unrtf + +SUBPROJECT_NAME = $(UNRTF) + +$(UNRTF)_C_FILES = \ + attr.c \ + convert.c \ + error.c \ + hash.c \ + malloc.c \ + my_iconv.c \ + output.c \ + parse.c \ + unicode.c \ + user.c \ + util.c \ + word.c + +$(UNRTF)_CFLAGS = -DHAVE_CONFIG_H=1 -I. -I../ + +# Option include to set any additional variables +-include GNUmakefile.preamble + +# Include in the rules for making libraries +include $(GNUSTEP_MAKEFILES)/subproject.make + +# Option include to define any additional rules +-include GNUmakefile.postamble diff --git a/OpenChange/MAPIStoreMessage.m b/OpenChange/MAPIStoreMessage.m index 334a71a46..6c912c6e3 100644 --- a/OpenChange/MAPIStoreMessage.m +++ b/OpenChange/MAPIStoreMessage.m @@ -21,6 +21,7 @@ */ #import +#import #import #import #import @@ -42,6 +43,8 @@ #import "MAPIStoreMessage.h" +#include + #undef DEBUG #include #include @@ -49,6 +52,8 @@ #include #include +static NSString *resourcesDir = nil; + NSData * MAPIStoreInternalEntryId (NSString *username) { @@ -147,6 +152,64 @@ MAPIStoreExternalEntryId (NSString *cn, NSString *email) return entryId; } +/* rtf conversion via unrtf */ +static int +unrtf_data_output (void *data, const char *str, size_t str_len) +{ + NSMutableData *rtfData = data; + + [rtfData appendBytes: str length: str_len]; + + return str_len; +} + +static NSData * +uncompressRTF (NSData *compressedRTF) +{ + NSData *rtfData = nil; + DATA_BLOB *rtf; + TALLOC_CTX *mem_ctx; + + mem_ctx = talloc_zero (NULL, TALLOC_CTX); + rtf = talloc_zero (mem_ctx, DATA_BLOB); + + if (uncompress_rtf (mem_ctx, + (uint8_t *) [compressedRTF bytes], [compressedRTF length], + rtf) + == MAPI_E_SUCCESS) + rtfData = [NSData dataWithBytes: rtf->data length: rtf->length]; + + talloc_free (mem_ctx); + + return rtfData; +} + +static NSData * +rtf2html (NSData *compressedRTF) +{ + NSData *rtf; + NSMutableData *html = nil; + int rc; + struct unRTFOptions unrtfOptions; + + rtf = uncompressRTF (compressedRTF); + if (rtf) + { + html = [NSMutableData data]; + memset (&unrtfOptions, 0, sizeof (struct unRTFOptions)); + unrtf_set_output_device (&unrtfOptions, unrtf_data_output, html); + unrtfOptions.config_directory = [resourcesDir UTF8String]; + unrtfOptions.output_format = "html"; + unrtfOptions.nopict_mode = YES; + rc = unrtf_convert_from_string (&unrtfOptions, + [rtf bytes], [rtf length]); + if (!rc) + html = nil; + } + + return html; +} + @interface SOGoObject (MAPIStoreProtocol) - (NSString *) davEntityTag; @@ -156,6 +219,15 @@ MAPIStoreExternalEntryId (NSString *cn, NSString *email) @implementation MAPIStoreMessage ++ (void) initialize +{ + if (!resourcesDir) + { + resourcesDir = [[NSBundle bundleForClass: self] resourcePath]; + [resourcesDir retain]; + } +} + - (id) init { if ((self = [super init])) @@ -304,6 +376,38 @@ MAPIStoreExternalEntryId (NSString *cn, NSString *email) return MAPISTORE_SUCCESS; } +- (void) addProperties: (NSDictionary *) newNewProperties +{ + NSData *htmlData, *rtfData; + static NSNumber *htmlKey = nil, *rtfKey = nil; + + [super addProperties: newNewProperties]; + + if (!htmlKey) + { + htmlKey = MAPIPropertyKey (PR_HTML); + [htmlKey retain]; + } + + if (!rtfKey) + { + rtfKey = MAPIPropertyKey (PR_RTF_COMPRESSED); + [rtfKey retain]; + } + + if (![properties objectForKey: htmlKey]) + { + rtfData = [properties objectForKey: rtfKey]; + if (rtfData) + { + htmlData = rtf2html (rtfData); + [properties setObject: htmlData forKey: htmlKey]; + [properties removeObjectForKey: rtfKey]; + [properties removeObjectForKey: MAPIPropertyKey (PR_RTF_IN_SYNC)]; + } + } +} + - (MAPIStoreAttachment *) createAttachment { MAPIStoreAttachment *newAttachment; diff --git a/OpenChange/unrtf-0.21.2.diff b/OpenChange/unrtf-0.21.2.diff new file mode 100644 index 000000000..4c8cb8158 --- /dev/null +++ b/OpenChange/unrtf-0.21.2.diff @@ -0,0 +1,11516 @@ +diff -durpN unrtf-0.21.2.old/src/attr.c unrtf-0.21.2/src/attr.c +--- unrtf-0.21.2.old/src/attr.c 2010-07-03 22:30:58.000000000 -0400 ++++ unrtf-0.21.2/src/attr.c 2011-11-08 19:15:18.044195095 -0500 +@@ -1,23 +1,23 @@ + /*============================================================================= +- GNU UnRTF, a command-line program to convert RTF documents to other formats. +- Copyright (C) 2000,2001,2004 by Zachary Smith ++ GNU UnRTF, a command-line program to convert RTF documents to other formats. ++ Copyright (C) 2000,2001,2004 by Zachary Smith + +- This program is free software; you can redistribute it and/or modify +- it under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 3 of the License, or +- (at your option) any later version. ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3 of the License, or ++ (at your option) any later version. + +- This program is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- GNU General Public License for more details. ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. + +- You should have received a copy of the GNU General Public License +- along with this program; if not, write to the Free Software +- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software ++ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +- The maintainer is reachable by electronic mail at daved@physiol.usyd.edu.au +-=============================================================================*/ ++ The maintainer is reachable by electronic mail at daved@physiol.usyd.edu.au ++ =============================================================================*/ + + + /*---------------------------------------------------------------------- +@@ -57,47 +57,20 @@ + #include + #endif + ++#include "attr.h" ++#include "convert.h" + #include "malloc.h" + #include "defs.h" + #include "error.h" ++#include "output.h" ++#include "unrtf.h" + + #ifndef HAVE_ATTR_H +-#include "attr.h" + #define HAVE_ATTR_H + #endif + + #include "main.h" + +-extern void starting_body(); +-extern void starting_text(); +- +-extern int simulate_allcaps; +-extern int simulate_smallcaps; +- +- +-#define MAX_ATTRS (10000) +- +- +-/* For each RTF text block (the text within braces) we must keep +- * an AttrStack which is a stack of attributes and their optional +- * parameter. Since RTF text blocks are nested, these make up a +- * stack of stacks. And, since RTF text blocks inherit attributes +- * from parent blocks, all new AttrStacks do the same from +- * their parent AttrStack. +- */ +-typedef struct _stack { +- unsigned char attr_stack[MAX_ATTRS]; +- char *attr_stack_params[MAX_ATTRS]; +- int tos; +- struct _stack *next; +-} AttrStack; +- +-/*@null@*/ static AttrStack *stack_of_stacks = NULL; +-/*@null@*/ static AttrStack *stack_of_stacks_top = NULL; +- +- +- +- + /*======================================================================== + * Name: attr_express_begin + * Purpose: Print the HTML for beginning an attribute. +@@ -106,95 +79,96 @@ typedef struct _stack { + *=======================================================================*/ + + void +-attr_express_begin (int attr, char* param) { +- switch(attr) +- { +- case ATTR_BOLD: +- if (safe_printf(0, op->bold_begin)) fprintf(stderr, TOO_MANY_ARGS, "bold_begin");; +- break; +- case ATTR_ITALIC: +- if (safe_printf(0, op->italic_begin)) fprintf(stderr, TOO_MANY_ARGS, "italic_begin");; +- break; ++attr_express_begin (int attr, char* param, const struct OutputContext *oc) { ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; ++ switch(attr) ++ { ++ case ATTR_BOLD: ++ if (safe_printf(device, 0, oc->personality->bold_begin)) fprintf(stderr, TOO_MANY_ARGS, "bold_begin");; ++ break; ++ case ATTR_ITALIC: ++ if (safe_printf(device, 0, oc->personality->italic_begin)) fprintf(stderr, TOO_MANY_ARGS, "italic_begin");; ++ break; + +- /* Various underlines, they all resolve to HTML's */ +- case ATTR_THICK_UL: +- case ATTR_WAVE_UL: +- case ATTR_DASH_UL: +- case ATTR_DOT_UL: +- case ATTR_DOT_DASH_UL: +- case ATTR_2DOT_DASH_UL: +- case ATTR_WORD_UL: +- case ATTR_UNDERLINE: +- if (safe_printf(0, op->underline_begin)) fprintf(stderr, TOO_MANY_ARGS, "underline_begin");; +- break; ++ /* Various underlines, they all resolve to HTML's */ ++ case ATTR_THICK_UL: ++ case ATTR_WAVE_UL: ++ case ATTR_DASH_UL: ++ case ATTR_DOT_UL: ++ case ATTR_DOT_DASH_UL: ++ case ATTR_2DOT_DASH_UL: ++ case ATTR_WORD_UL: ++ case ATTR_UNDERLINE: ++ if (safe_printf(device, 0, oc->personality->underline_begin)) fprintf(stderr, TOO_MANY_ARGS, "underline_begin");; ++ break; + +- case ATTR_DOUBLE_UL: +- if (safe_printf(0, op->dbl_underline_begin)) fprintf(stderr, TOO_MANY_ARGS, "dbl_underline_begin");; +- break; ++ case ATTR_DOUBLE_UL: ++ if (safe_printf(device, 0, oc->personality->dbl_underline_begin)) fprintf(stderr, TOO_MANY_ARGS, "dbl_underline_begin");; ++ break; + +- case ATTR_FONTSIZE: +- op_begin_std_fontsize (op, atoi (param)); +- break; ++ case ATTR_FONTSIZE: ++ op_begin_std_fontsize (oc, atoi (param)); ++ break; + +- case ATTR_FONTFACE: +- if (safe_printf(1, op->font_begin,param)) fprintf(stderr, TOO_MANY_ARGS, "font_begin");; +- break; ++ case ATTR_FONTFACE: ++ if (safe_printf(device, 1, oc->personality->font_begin,param)) fprintf(stderr, TOO_MANY_ARGS, "font_begin");; ++ break; + +- case ATTR_FOREGROUND: +- if (safe_printf(1, op->foreground_begin, param)) fprintf(stderr, TOO_MANY_ARGS, "foreground_begin");; +- break; ++ case ATTR_FOREGROUND: ++ if (safe_printf(device, 1, oc->personality->foreground_begin, param)) fprintf(stderr, TOO_MANY_ARGS, "foreground_begin");; ++ break; + +- case ATTR_BACKGROUND: +- if (!simple_mode) +- if (safe_printf(1, op->background_begin,param)) fprintf(stderr, TOO_MANY_ARGS, "background_begin");; +- break; ++ case ATTR_BACKGROUND: ++ if (!oc->conversion->options->simple_mode) ++ if (safe_printf(device, 1, oc->personality->background_begin,param)) fprintf(stderr, TOO_MANY_ARGS, "background_begin");; ++ break; + +- case ATTR_SUPER: +- if (safe_printf(0, op->superscript_begin)) fprintf(stderr, TOO_MANY_ARGS, "superscript_begin");; +- break; +- case ATTR_SUB: +- if (safe_printf(0, op->subscript_begin)) fprintf(stderr, TOO_MANY_ARGS, "subscript_begin");; +- break; ++ case ATTR_SUPER: ++ if (safe_printf(device, 0, oc->personality->superscript_begin)) fprintf(stderr, TOO_MANY_ARGS, "superscript_begin");; ++ break; ++ case ATTR_SUB: ++ if (safe_printf(device, 0, oc->personality->subscript_begin)) fprintf(stderr, TOO_MANY_ARGS, "subscript_begin");; ++ break; + +- case ATTR_STRIKE: +- if (safe_printf(0, op->strikethru_begin)) fprintf(stderr, TOO_MANY_ARGS, "strikethru_begin");; +- break; ++ case ATTR_STRIKE: ++ if (safe_printf(device, 0, oc->personality->strikethru_begin)) fprintf(stderr, TOO_MANY_ARGS, "strikethru_begin");; ++ break; + +- case ATTR_DBL_STRIKE: +- if (safe_printf(0, op->dbl_strikethru_begin)) fprintf(stderr, TOO_MANY_ARGS, "dbl_strikethru_begin");; +- break; ++ case ATTR_DBL_STRIKE: ++ if (safe_printf(device, 0, oc->personality->dbl_strikethru_begin)) fprintf(stderr, TOO_MANY_ARGS, "dbl_strikethru_begin");; ++ break; + +- case ATTR_EXPAND: +- if (safe_printf(1, op->expand_begin, param)) fprintf(stderr, TOO_MANY_ARGS, "expand_begin");; +- break; ++ case ATTR_EXPAND: ++ if (safe_printf(device, 1, oc->personality->expand_begin, param)) fprintf(stderr, TOO_MANY_ARGS, "expand_begin");; ++ break; + +- case ATTR_OUTLINE: +- if (safe_printf(0, op->outline_begin)) fprintf(stderr, TOO_MANY_ARGS, "outline_begin");; +- break; +- case ATTR_SHADOW: +- if (safe_printf(0, op->shadow_begin)) fprintf(stderr, TOO_MANY_ARGS, "shadow_begin");; +- break; +- case ATTR_EMBOSS: +- if (safe_printf(0, op->emboss_begin)) fprintf(stderr, TOO_MANY_ARGS, "emboss_begin");; +- break; +- case ATTR_ENGRAVE: +- if (safe_printf(0, op->engrave_begin)) fprintf(stderr, TOO_MANY_ARGS, "engrave_begin");; +- break; ++ case ATTR_OUTLINE: ++ if (safe_printf(device, 0, oc->personality->outline_begin)) fprintf(stderr, TOO_MANY_ARGS, "outline_begin");; ++ break; ++ case ATTR_SHADOW: ++ if (safe_printf(device, 0, oc->personality->shadow_begin)) fprintf(stderr, TOO_MANY_ARGS, "shadow_begin");; ++ break; ++ case ATTR_EMBOSS: ++ if (safe_printf(device, 0, oc->personality->emboss_begin)) fprintf(stderr, TOO_MANY_ARGS, "emboss_begin");; ++ break; ++ case ATTR_ENGRAVE: ++ if (safe_printf(device, 0, oc->personality->engrave_begin)) fprintf(stderr, TOO_MANY_ARGS, "engrave_begin");; ++ break; + +- case ATTR_CAPS: +- if (op->simulate_all_caps) +- simulate_allcaps = TRUE; +- break; ++ case ATTR_CAPS: ++ if (oc->personality->simulate_all_caps) ++ oc->conversion->simulate_allcaps = TRUE; ++ break; + +- case ATTR_SMALLCAPS: +- if (op->simulate_small_caps) +- simulate_smallcaps = TRUE; +- else { +- if (op->small_caps_begin) +- if (safe_printf(0, op->small_caps_begin)) fprintf(stderr, TOO_MANY_ARGS, "small_caps_begin");; +- } +- break; +- } ++ case ATTR_SMALLCAPS: ++ if (oc->personality->simulate_small_caps) ++ oc->conversion->simulate_smallcaps = TRUE; ++ else { ++ if (oc->personality->small_caps_begin) ++ if (safe_printf(device, 0, oc->personality->small_caps_begin)) fprintf(stderr, TOO_MANY_ARGS, "small_caps_begin");; ++ } ++ break; ++ } + } + + +@@ -206,95 +180,96 @@ attr_express_begin (int attr, char* para + *=======================================================================*/ + + void +-attr_express_end (int attr, char *param) ++attr_express_end (int attr, char *param, const struct OutputContext *oc) + { +- switch(attr) +- { +- case ATTR_BOLD: +- if (safe_printf(0, op->bold_end)) fprintf(stderr, TOO_MANY_ARGS, "bold_end");; +- break; +- case ATTR_ITALIC: +- if (safe_printf(0, op->italic_end)) fprintf(stderr, TOO_MANY_ARGS, "italic_end");; +- break; ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; ++ switch(attr) ++ { ++ case ATTR_BOLD: ++ if (safe_printf(device, 0, oc->personality->bold_end)) fprintf(stderr, TOO_MANY_ARGS, "bold_end");; ++ break; ++ case ATTR_ITALIC: ++ if (safe_printf(device, 0, oc->personality->italic_end)) fprintf(stderr, TOO_MANY_ARGS, "italic_end");; ++ break; + +- /* Various underlines, they all resolve to HTML's */ +- case ATTR_THICK_UL: +- case ATTR_WAVE_UL: +- case ATTR_DASH_UL: +- case ATTR_DOT_UL: +- case ATTR_DOT_DASH_UL: +- case ATTR_2DOT_DASH_UL: +- case ATTR_WORD_UL: +- case ATTR_UNDERLINE: +- if (safe_printf(0, op->underline_end)) fprintf(stderr, TOO_MANY_ARGS, "underline_end");; +- break; ++ /* Various underlines, they all resolve to HTML's */ ++ case ATTR_THICK_UL: ++ case ATTR_WAVE_UL: ++ case ATTR_DASH_UL: ++ case ATTR_DOT_UL: ++ case ATTR_DOT_DASH_UL: ++ case ATTR_2DOT_DASH_UL: ++ case ATTR_WORD_UL: ++ case ATTR_UNDERLINE: ++ if (safe_printf(device, 0, oc->personality->underline_end)) fprintf(stderr, TOO_MANY_ARGS, "underline_end");; ++ break; + +- case ATTR_DOUBLE_UL: +- if (safe_printf(0, op->dbl_underline_end)) fprintf(stderr, TOO_MANY_ARGS, "dbl_underline_end");; +- break; ++ case ATTR_DOUBLE_UL: ++ if (safe_printf(device, 0, oc->personality->dbl_underline_end)) fprintf(stderr, TOO_MANY_ARGS, "dbl_underline_end");; ++ break; + +- case ATTR_FONTSIZE: +- op_end_std_fontsize (op, atoi (param)); +- break; ++ case ATTR_FONTSIZE: ++ op_end_std_fontsize (oc, atoi (param)); ++ break; + +- case ATTR_FONTFACE: +- if (safe_printf(0, op->font_end)) fprintf(stderr, TOO_MANY_ARGS, "font_end");; +- break; ++ case ATTR_FONTFACE: ++ if (safe_printf(device, 0, oc->personality->font_end)) fprintf(stderr, TOO_MANY_ARGS, "font_end");; ++ break; + +- case ATTR_FOREGROUND: +- if (safe_printf(0, op->foreground_end)) fprintf(stderr, TOO_MANY_ARGS, "foreground_end");; +- break; +- case ATTR_BACKGROUND: +- if (!simple_mode) +- if (safe_printf(0, op->background_end)) fprintf(stderr, TOO_MANY_ARGS, "background_end");; +- break; ++ case ATTR_FOREGROUND: ++ if (safe_printf(device, 0, oc->personality->foreground_end)) fprintf(stderr, TOO_MANY_ARGS, "foreground_end");; ++ break; ++ case ATTR_BACKGROUND: ++ if (!oc->conversion->options->simple_mode) ++ if (safe_printf(device, 0, oc->personality->background_end)) fprintf(stderr, TOO_MANY_ARGS, "background_end");; ++ break; + +- case ATTR_SUPER: +- if (safe_printf(0, op->superscript_end)) fprintf(stderr, TOO_MANY_ARGS, "superscript_end");; +- break; +- case ATTR_SUB: +- if (safe_printf(0, op->subscript_end)) fprintf(stderr, TOO_MANY_ARGS, "subscript_end");; +- break; ++ case ATTR_SUPER: ++ if (safe_printf(device, 0, oc->personality->superscript_end)) fprintf(stderr, TOO_MANY_ARGS, "superscript_end");; ++ break; ++ case ATTR_SUB: ++ if (safe_printf(device, 0, oc->personality->subscript_end)) fprintf(stderr, TOO_MANY_ARGS, "subscript_end");; ++ break; + +- case ATTR_STRIKE: +- if (safe_printf(0, op->strikethru_end)) fprintf(stderr, TOO_MANY_ARGS, "strikethru_end");; +- break; ++ case ATTR_STRIKE: ++ if (safe_printf(device, 0, oc->personality->strikethru_end)) fprintf(stderr, TOO_MANY_ARGS, "strikethru_end");; ++ break; + +- case ATTR_DBL_STRIKE: +- if (safe_printf(0, op->dbl_strikethru_end)) fprintf(stderr, TOO_MANY_ARGS, "dbl_strikethru_end");; +- break; ++ case ATTR_DBL_STRIKE: ++ if (safe_printf(device, 0, oc->personality->dbl_strikethru_end)) fprintf(stderr, TOO_MANY_ARGS, "dbl_strikethru_end");; ++ break; + +- case ATTR_OUTLINE: +- if (safe_printf(0, op->outline_end)) fprintf(stderr, TOO_MANY_ARGS, "outline_end");; +- break; +- case ATTR_SHADOW: +- if (safe_printf(0, op->shadow_end)) fprintf(stderr, TOO_MANY_ARGS, "shadow_end");; +- break; +- case ATTR_EMBOSS: +- if (safe_printf(0, op->emboss_end)) fprintf(stderr, TOO_MANY_ARGS, "emboss_end");; +- break; +- case ATTR_ENGRAVE: +- if (safe_printf(0, op->engrave_end)) fprintf(stderr, TOO_MANY_ARGS, "engrave_end");; +- break; ++ case ATTR_OUTLINE: ++ if (safe_printf(device, 0, oc->personality->outline_end)) fprintf(stderr, TOO_MANY_ARGS, "outline_end");; ++ break; ++ case ATTR_SHADOW: ++ if (safe_printf(device, 0, oc->personality->shadow_end)) fprintf(stderr, TOO_MANY_ARGS, "shadow_end");; ++ break; ++ case ATTR_EMBOSS: ++ if (safe_printf(device, 0, oc->personality->emboss_end)) fprintf(stderr, TOO_MANY_ARGS, "emboss_end");; ++ break; ++ case ATTR_ENGRAVE: ++ if (safe_printf(device, 0, oc->personality->engrave_end)) fprintf(stderr, TOO_MANY_ARGS, "engrave_end");; ++ break; + +- case ATTR_EXPAND: +- if (safe_printf(0, op->expand_end)) fprintf(stderr, TOO_MANY_ARGS, "expand_end");; +- break; ++ case ATTR_EXPAND: ++ if (safe_printf(device, 0, oc->personality->expand_end)) fprintf(stderr, TOO_MANY_ARGS, "expand_end");; ++ break; + +- case ATTR_CAPS: +- if (op->simulate_all_caps) +- simulate_allcaps = FALSE; +- break; ++ case ATTR_CAPS: ++ if (oc->personality->simulate_all_caps) ++ oc->conversion->simulate_allcaps = FALSE; ++ break; + +- case ATTR_SMALLCAPS: +- if (op->simulate_small_caps) +- simulate_smallcaps = FALSE; +- else { +- if (op->small_caps_end) +- if (safe_printf(0, op->small_caps_end)) fprintf(stderr, TOO_MANY_ARGS, "small_caps_end");; +- } +- break; +- } ++ case ATTR_SMALLCAPS: ++ if (oc->personality->simulate_small_caps) ++ oc->conversion->simulate_smallcaps = FALSE; ++ else { ++ if (oc->personality->small_caps_end) ++ if (safe_printf(device, 0, oc->personality->small_caps_end)) fprintf(stderr, TOO_MANY_ARGS, "small_caps_end");; ++ } ++ break; ++ } + } + + +@@ -307,32 +282,32 @@ attr_express_end (int attr, char *param) + *=======================================================================*/ + + void +-attr_push(int attr, char* param) ++attr_push(int attr, char* param, const struct OutputContext *oc) + { +- AttrStack *stack = stack_of_stacks_top; +- if (!stack) { +- warning_handler("No stack to push attribute onto"); +- return; +- } ++ AttrStack *stack = oc->conversion->stack_of_stacks_top; ++ if (!stack) { ++ warning_handler("No stack to push attribute onto"); ++ return; ++ } + +- if (stack->tos >= MAX_ATTRS) { +- fprintf(stderr, "Too many attributes!\n"); +- return; +- } ++ if (stack->tos >= MAX_ATTRS) { ++ fprintf(stderr, "Too many attributes!\n"); ++ return; ++ } + +- /* Make sure it's understood we're in the section. */ +- /* KLUDGE */ +- starting_body(); +- starting_text(); ++ /* Make sure it's understood we're in the section. */ ++ /* KLUDGE */ ++ starting_body(oc); ++ starting_text(oc); + +- ++stack->tos; +- stack->attr_stack[stack->tos] = attr; +- if (param) +- stack->attr_stack_params[stack->tos] = my_strdup(param); +- else +- stack->attr_stack_params[stack->tos] = NULL; ++ ++stack->tos; ++ stack->attr_stack[stack->tos] = attr; ++ if (param) ++ stack->attr_stack_params[stack->tos] = my_strdup(oc->conversion, param); ++ else ++ stack->attr_stack_params[stack->tos] = NULL; + +- attr_express_begin(attr, param); ++ attr_express_begin(attr, param, oc); + } + + +@@ -344,62 +319,25 @@ attr_push(int attr, char* param) + *=======================================================================*/ + + char * +-attr_get_param(int attr) +-{ +- int i; +- AttrStack *stack = stack_of_stacks_top; +- if (!stack) { +- warning_handler("No stack to get attribute from"); +- return; +- } +- +- i=stack->tos; +- while (i>=0) +- { +- if(stack->attr_stack [i] == attr) +- { +- if(stack->attr_stack_params [i] != NULL) +- return stack->attr_stack_params [i]; +- else +- return NULL; +- } +- i--; +- } +- return NULL; +-} +- +- +-/*======================================================================== +- * Name: attrstack_copy_all +- * Purpose: Routine to copy all attributes from one stack to another. +- * Args: Two stacks. +- * Returns: None. +- *=======================================================================*/ +- +-void +-attrstack_copy_all (AttrStack *src, AttrStack *dest) ++attr_get_param(const struct ConversionContext *cc, int attr) + { +- int i; +- int total; +- +- CHECK_PARAM_NOT_NULL(src); +- CHECK_PARAM_NOT_NULL(dest); +- +- total = src->tos + 1; +- +- for (i=0; iattr_stack [i]; +- char *param=src->attr_stack_params [i]; +- +- dest->attr_stack[i] = attr; +- if (param) +- dest->attr_stack_params[i] = my_strdup (param); +- else +- dest->attr_stack_params[i] = NULL; +- } ++ int i; ++ AttrStack *stack = cc->stack_of_stacks_top; ++ if (!stack) { ++ warning_handler("No stack to get attribute from"); ++ return NULL; ++ } + +- dest->tos = src->tos; ++ i=stack->tos; ++ while (i>=0) ++ { ++ if(stack->attr_stack[i] == attr) ++ { ++ return stack->attr_stack_params[i]; ++ } ++ i--; ++ } ++ return NULL; + } + + /*======================================================================== +@@ -414,21 +352,21 @@ attrstack_copy_all (AttrStack *src, Attr + *=======================================================================*/ + + void +-attrstack_unexpress_all (AttrStack *stack) ++attrstack_unexpress_all (AttrStack *stack, const struct OutputContext *oc) + { +- int i; ++ int i; + +- CHECK_PARAM_NOT_NULL(stack); ++ CHECK_PARAM_NOT_NULL(stack); + +- i=stack->tos; +- while (i>=0) +- { +- int attr=stack->attr_stack [i]; +- char *param=stack->attr_stack_params [i]; ++ i=stack->tos; ++ while (i>=0) ++ { ++ int attr=stack->attr_stack[i]; ++ char *param=stack->attr_stack_params[i]; + +- attr_express_end (attr, param); +- i--; +- } ++ attr_express_end (attr, param, oc); ++ i--; ++ } + } + + +@@ -440,23 +378,20 @@ attrstack_unexpress_all (AttrStack *stac + * Returns: None. + *=======================================================================*/ + void +-attrstack_push () ++attrstack_push (struct ConversionContext *cc) + { +- AttrStack *new_stack; +- AttrStack *prev_stack; +- +- new_stack = (AttrStack*) my_malloc (sizeof (AttrStack)); +- memset ((void*) new_stack, 0, sizeof (AttrStack)); ++ AttrStack *new_stack; + +- prev_stack = stack_of_stacks_top; ++ new_stack = (AttrStack*) my_malloc (sizeof (AttrStack)); ++ memset ((void*) new_stack, 0, sizeof (AttrStack)); ++ new_stack->tos = -1; + +- if (!stack_of_stacks) { +- stack_of_stacks = new_stack; +- } else { +- stack_of_stacks_top->next = new_stack; +- } +- stack_of_stacks_top = new_stack; +- new_stack->tos = -1; ++ if (!cc->stack_of_stacks) { ++ cc->stack_of_stacks = new_stack; ++ } else { ++ cc->stack_of_stacks_top->next = new_stack; ++ } ++ cc->stack_of_stacks_top = new_stack; + } + + +@@ -470,29 +405,30 @@ attrstack_push () + *=======================================================================*/ + + int +-attr_pop (int attr) ++attr_pop (int attr, const struct OutputContext *oc) + { +- AttrStack *stack = stack_of_stacks_top; ++ AttrStack *stack = oc->conversion->stack_of_stacks_top; + +- if (!stack) { +- warning_handler ("no stack to pop attribute from"); +- return FALSE; +- } ++ if (!stack) { ++ warning_handler ("no stack to pop attribute from"); ++ return FALSE; ++ } + +- if(stack->tos>=0 && stack->attr_stack[stack->tos]==attr) +- { +- char *param = stack->attr_stack_params [stack->tos]; ++ if(stack->tos>=0 && stack->attr_stack[stack->tos]==attr) ++ { ++ char *param = stack->attr_stack_params[stack->tos]; + +- attr_express_end (attr, param); ++ attr_express_end (attr, param, oc); + +- if (param) my_free(param); ++ if (param) my_free(param); ++ stack->attr_stack_params[stack->tos] = NULL; + +- stack->tos--; ++ stack->tos--; + +- return TRUE; +- } +- else +- return FALSE; ++ return TRUE; ++ } ++ else ++ return FALSE; + } + + +@@ -506,20 +442,20 @@ attr_pop (int attr) + *=======================================================================*/ + + int +-attr_read() { +- AttrStack *stack = stack_of_stacks_top; +- if (!stack) { +- warning_handler ("no stack to read attribute from"); +- return FALSE; +- } ++attr_read(const struct ConversionContext *cc) { ++ AttrStack *stack = cc->stack_of_stacks_top; ++ if (!stack) { ++ warning_handler ("no stack to read attribute from"); ++ return FALSE; ++ } + +- if(stack->tos>=0) +- { +- int attr = stack->attr_stack [stack->tos]; +- return attr; +- } +- else +- return ATTR_NONE; ++ if(stack->tos>=0) ++ { ++ int attr = stack->attr_stack[stack->tos]; ++ return attr; ++ } ++ else ++ return ATTR_NONE; + } + + +@@ -531,20 +467,21 @@ attr_read() { + *=======================================================================*/ + + void +-attr_drop_all () ++attr_drop_all (const struct ConversionContext *cc) + { +- AttrStack *stack = stack_of_stacks_top; +- if (!stack) { +- warning_handler ("no stack to drop all attributes from"); +- return; +- } ++ AttrStack *stack = cc->stack_of_stacks_top; ++ if (!stack) { ++ warning_handler ("no stack to drop all attributes from"); ++ return; ++ } + +- while (stack->tos>=0) +- { +- char *param=stack->attr_stack_params [stack->tos]; +- if (param) my_free(param); +- stack->tos--; +- } ++ while (stack->tos>=0) ++ { ++ char *param=stack->attr_stack_params[stack->tos]; ++ if (param) my_free(param); ++ stack->attr_stack_params[stack->tos] = NULL; ++ stack->tos--; ++ } + } + + +@@ -557,30 +494,34 @@ attr_drop_all () + *=======================================================================*/ + + void +-attrstack_drop () ++attrstack_drop (const struct OutputContext *oc) + { +- AttrStack *stack = stack_of_stacks_top; +- AttrStack *prev_stack; +- if (!stack) { +- warning_handler ("no attr-stack to drop"); +- return; +- } ++ AttrStack *stack = oc->conversion->stack_of_stacks_top; ++ AttrStack *prev_stack; ++ if (!stack) { ++ warning_handler ("no attr-stack to drop"); ++ return; ++ } + +- attr_pop_all (); +- prev_stack = stack_of_stacks; ++ attr_pop_all (oc); + +- while(prev_stack && prev_stack->next && prev_stack->next != stack) +- prev_stack = prev_stack->next; ++ if (stack == oc->conversion->stack_of_stacks) { ++ oc->conversion->stack_of_stacks_top = NULL; ++ oc->conversion->stack_of_stacks = NULL; ++ } ++ else { ++ prev_stack = oc->conversion->stack_of_stacks; + +- if (prev_stack) { +- stack_of_stacks_top = prev_stack; +- prev_stack->next = NULL; +- } else { +- stack_of_stacks_top = NULL; +- stack_of_stacks = NULL; +- } ++ while (prev_stack->next && prev_stack->next != stack) ++ prev_stack = prev_stack->next; + +- my_free ((void*) stack); ++ if (prev_stack) { ++ oc->conversion->stack_of_stacks_top = prev_stack; ++ prev_stack->next = NULL; ++ } ++ } ++ ++ my_free ((void*) stack); + } + + /*======================================================================== +@@ -592,21 +533,22 @@ attrstack_drop () + *=======================================================================*/ + + void +-attr_pop_all() ++attr_pop_all(const struct OutputContext *oc) + { +- AttrStack *stack = stack_of_stacks_top; +- if (!stack) { +- warning_handler ("no stack to pop from"); +- return; +- } ++ AttrStack *stack = oc->conversion->stack_of_stacks_top; ++ if (!stack) { ++ warning_handler ("no stack to pop from"); ++ return; ++ } + +- while (stack->tos>=0) { +- int attr=stack->attr_stack [stack->tos]; +- char *param=stack->attr_stack_params [stack->tos]; +- attr_express_end (attr,param); +- if (param) my_free(param); +- stack->tos--; +- } ++ while (stack->tos>=0) { ++ int attr=stack->attr_stack[stack->tos]; ++ char *param=stack->attr_stack_params[stack->tos]; ++ attr_express_end (attr,param, oc); ++ if (param) my_free(param); ++ stack->attr_stack_params[stack->tos] = NULL; ++ stack->tos--; ++ } + } + + +@@ -621,23 +563,23 @@ attr_pop_all() + *=======================================================================*/ + + void +-attrstack_express_all() { +- AttrStack *stack = stack_of_stacks_top; +- int i; ++attrstack_express_all(const struct OutputContext *oc) { ++ AttrStack *stack = oc->conversion->stack_of_stacks_top; ++ int i; + +- if (!stack) { +- warning_handler ("no stack to pop from"); +- return; +- } ++ if (!stack) { ++ warning_handler ("no stack to pop from"); ++ return; ++ } + +- i=0; +- while (i<=stack->tos) +- { +- int attr=stack->attr_stack [i]; +- char *param=stack->attr_stack_params [i]; +- attr_express_begin (attr, param); +- i++; +- } ++ i=0; ++ while (i<=stack->tos) ++ { ++ int attr=stack->attr_stack[i]; ++ char *param=stack->attr_stack_params[i]; ++ attr_express_begin (attr, param, oc); ++ i++; ++ } + } + + +@@ -652,78 +594,112 @@ attrstack_express_all() { + *=======================================================================*/ + + void +-attr_pop_dump() { +- AttrStack *stack = stack_of_stacks_top; +- int i; ++attr_pop_dump(const struct OutputContext *oc) { ++ AttrStack *stack = oc->conversion->stack_of_stacks_top; ++ int i; + +- if (!stack) return; ++ if (!stack) return; + +- i=stack->tos; +- while (i>=0) +- { +- int attr=stack->attr_stack [i]; +- attr_pop (attr); +- i--; +- } ++ i=stack->tos; ++ while (i>=0) ++ { ++ int attr=stack->attr_stack[i]; ++ attr_pop (attr, oc); ++ i--; ++ } + } + + /*======================================================================== + * Name: safe_printf + * Purpose: Prevents format string attack and writes empty string +- instead of NULL. ++ instead of NULL. + * Args: Number of parameters (without a string), string to write, +- additional parameters to print (have to be strings). ++ additional parameters to print (have to be strings). + * Returns: Returns 0 if number of not escaped '%' in string +- is not greater than nr, else returns -1 ++ is not greater than nr, else returns -1 + *=======================================================================*/ + +- + int +-safe_printf(int nr, char *string, ...) ++safe_printf(const struct unRTFOutputDevice *od, int nr, char *string, ...) + { ++ char *s, *output; ++ int i = 0, ret_code = 0, written; ++ size_t output_len = 0, output_max = 0, size_max; ++ va_list arguments; + +- char *s; +- int i = 0, ret_code = 0; +- va_list arguments; ++ if (string != NULL) ++ { ++ output_max = 1024; ++ output = malloc(output_max * sizeof (char)); ++ *output = 0; ++ va_start(arguments, string); + +- if (string == NULL) +- printf(""); +- else +- { +- va_start(arguments, string); ++ for (; nr > 0; nr--) ++ { ++ while (string[i] != '\0' && (string[i] != '%' || (string[i] == '%' && (i != 0 && string[i-1] == '\\')))) ++ { ++ if (string[i] != '\\' || string[i+1] != '%') ++ { ++ if (output_len + 1 > output_max) ++ { ++ output_max += 1024; ++ output = realloc(output, output_max * sizeof (char)); ++ } ++ output[output_len] = string[i]; ++ output_len++; ++ } ++ i++; ++ } + +- for (; nr > 0; nr--) +- { +- while (string[i] != '\0' && (string[i] != '%' || (string[i] == '%' && (i != 0 && string[i-1] == '\\')))) +- { +- if (string[i] != '\\' || string[i+1] != '%') +- printf("%c", string[i]); +- i++; +- } ++ if (string[i] != '\0') ++ { ++ s = va_arg(arguments, char *); ++ size_max = output_max - output_len; ++ written = snprintf(output + output_len, size_max, "%s", s); ++ if (written > size_max) ++ { ++ output_max += 1024 + written; ++ output = realloc(output, (output_max + 1) * sizeof (char)); ++ sprintf(output + output_len, "%s", s); ++ } ++ output_len += written; ++ i++; ++ } ++ } ++ va_end(arguments); + +- if (string[i] != '\0') +- { +- s = va_arg(arguments, char *); +- printf("%s", s); +- i++; +- } +- } +- va_end(arguments); ++ while (string[i] != '\0') ++ { ++ if (string[i] != '\\' || (string[i] == '\\' && string[i+1] != '%')) ++ { ++ if (string[i] != '%' || (string[i] == '%' && (i != 0 && string[i-1] == '\\'))) ++ { ++ if (output_len + 1 > output_max) ++ { ++ output_max += 1024; ++ output = realloc(output, output_max * sizeof (char)); ++ } ++ output[output_len] = string[i]; ++ output_len++; ++ } ++ else ++ ret_code = -1; ++ } ++ i++; ++ } + +- while (string[i] != '\0') +- { +- if (string[i] != '\\' || (string[i] == '\\' && string[i+1] != '%')) +- { +- if (string[i] != '%' || (string[i] == '%' && (i != 0 && string[i-1] == '\\'))) +- printf("%c", string[i]); +- else +- ret_code = -1; +- } +- i++; +- } +- } ++ if (output_len + 1 > output_max) ++ { ++ output_max += 1; ++ output = realloc(output, output_max * sizeof (char)); ++ } ++ output[output_len] = 0; + +- return ret_code; ++ od->print(od->data, output, output_len); ++ free(output); ++ } ++ ++ return ret_code; + } + + /*======================================================================== +@@ -731,51 +707,51 @@ safe_printf(int nr, char *string, ...) + * Purpose: See Returns + * Args: String to return and int to put into first parameter. + * Returns: Returns first parameter where first not escaped +- character % is substituted with second parameter. ++ character % is substituted with second parameter. + *=======================================================================*/ + + char * + assemble_string(char *string, int nr) + { + +- char *s, tmp[12];/* Number of characters that can be in int type (including '\0') - AF */ +- int i = 0, j = 0; ++ char *s, tmp[12];/* Number of characters that can be in int type (including '\0') - AF */ ++ int i = 0, j = 0; + +- if (string == NULL) +- return NULL; +- else { +- s = my_malloc(strlen(string) + 1 + 12/* Number of characters that can be in int type (including '\0') - AF */); +- while(string[i] != '\0' && (string[i] != '%' || (string[i] == '%' && (i != 0 && string[i-1] == '\\')))) { +- if (string[i] != '\\' || string[i+1] != '%') { +- s[j] = string[i]; +- j++; +- } +- i++; +- } ++ if (string == NULL) ++ return NULL; ++ else { ++ s = my_malloc(strlen(string) + 1 + 12/* Number of characters that can be in int type (including '\0') - AF */); ++ while(string[i] != '\0' && (string[i] != '%' || (string[i] == '%' && (i != 0 && string[i-1] == '\\')))) { ++ if (string[i] != '\\' || string[i+1] != '%') { ++ s[j] = string[i]; ++ j++; ++ } ++ i++; ++ } + +- if (string[i] != '\0') { +- sprintf(tmp, "%d", nr); +- strcpy(&s[j], tmp); +- j = j + strlen(tmp); +- } ++ if (string[i] != '\0') { ++ sprintf(tmp, "%d", nr); ++ strcpy(&s[j], tmp); ++ j = j + strlen(tmp); ++ } + +- while (string[i] != '\0') { +- if (string[i] != '\\' || (string[i] == '\\' && string[i+1] != '%')) { +- if (string[i] != '%' || (string[i] == '%' && (i != 0 && string[i-1] == '\\'))) { +- s[j] = string[i]; +- j++; +- } +- else { +- /* More than one char % occured */ +- } +- } +- i++; +- } +- } ++ while (string[i] != '\0') { ++ if (string[i] != '\\' || (string[i] == '\\' && string[i+1] != '%')) { ++ if (string[i] != '%' || (string[i] == '%' && (i != 0 && string[i-1] == '\\'))) { ++ s[j] = string[i]; ++ j++; ++ } ++ else { ++ /* More than one char % occured */ ++ } ++ } ++ i++; ++ } ++ } + +- s[j] = '\0'; ++ s[j] = '\0'; + +- return s; ++ return s; + } + + +@@ -789,39 +765,39 @@ assemble_string(char *string, int nr) + Collection * + add_to_collection(Collection *col, int nr, char *text) + { +- Collection *c = col; ++ Collection *c = col; + +- if (col == NULL) +- { +- col = (Collection *)my_malloc(sizeof(Collection)); +- col->nr = nr; +- col->text = text; +- col->next = NULL; +- } +- else +- { +- while (c->next != NULL) +- { +- if (c->nr == nr) +- { +-/* Here is a memory leak but not heavy. Do we need to care about this? +- my_free(a->alias.text); +-*/ +- c->text = text; ++ if (col == NULL) ++ { ++ col = (Collection *)my_malloc(sizeof(Collection)); ++ col->nr = nr; ++ col->text = text; ++ col->next = NULL; ++ } ++ else ++ { ++ while (c->next != NULL) ++ { ++ if (c->nr == nr) ++ { ++ /* Here is a memory leak but not heavy. Do we need to care about this? ++ my_free(a->alias.text); ++ */ ++ c->text = text; + +- return col; +- } ++ return col; ++ } + +- c = c->next; +- } ++ c = c->next; ++ } + +- c->next = (Collection *)my_malloc(sizeof(Collection)); +- c->next->nr = nr; +- c->next->text = text; +- c->next->next = NULL; +- } ++ c->next = (Collection *)my_malloc(sizeof(Collection)); ++ c->next->nr = nr; ++ c->next->text = text; ++ c->next->next = NULL; ++ } + +- return col; ++ return col; + } + + /*======================================================================== +@@ -834,15 +810,15 @@ add_to_collection(Collection *col, int n + char * + get_from_collection(Collection *c, int nr) + { +- while (c != NULL) +- { +- if (c->nr == nr) +- return c->text; ++ while (c != NULL) ++ { ++ if (c->nr == nr) ++ return c->text; + +- c = c->next; +- } ++ c = c->next; ++ } + +- return NULL; ++ return NULL; + } + + /*======================================================================== +@@ -855,13 +831,13 @@ get_from_collection(Collection *c, int n + void + free_collection(Collection *c) + { +- Collection *c2; ++ Collection *c2; + +- while (c != NULL) +- { +- c2 = c->next; +- my_free((void *)c); +- c = c2; +- } ++ while (c != NULL) ++ { ++ c2 = c->next; ++ my_free((void *)c); ++ c = c2; ++ } + } + +diff -durpN unrtf-0.21.2.old/src/attr.h unrtf-0.21.2/src/attr.h +--- unrtf-0.21.2.old/src/attr.h 2010-07-03 22:30:58.000000000 -0400 ++++ unrtf-0.21.2/src/attr.h 2011-11-08 19:15:18.044195095 -0500 +@@ -1,23 +1,23 @@ + /*============================================================================= +- GNU UnRTF, a command-line program to convert RTF documents to other formats. +- Copyright (C) 2000,2001,2004 by Zachary Smith ++ GNU UnRTF, a command-line program to convert RTF documents to other formats. ++ Copyright (C) 2000,2001,2004 by Zachary Smith + +- This program is free software; you can redistribute it and/or modify +- it under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 3 of the License, or +- (at your option) any later version. ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3 of the License, or ++ (at your option) any later version. + +- This program is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- GNU General Public License for more details. ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. + +- You should have received a copy of the GNU General Public License +- along with this program; if not, write to the Free Software +- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software ++ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +- The maintainer is reachable by electronic mail at daved@physiol.usyd.edu.au +-=============================================================================*/ ++ The maintainer is reachable by electronic mail at daved@physiol.usyd.edu.au ++ =============================================================================*/ + + + /*---------------------------------------------------------------------- +@@ -35,69 +35,77 @@ + * 09 Nov 08, arkadiusz.firus@gmail.com: adopt safe_printf & collection funcs + *--------------------------------------------------------------------*/ + ++#ifndef ATTR_H ++#define ATTR_H ++ + enum { +- ATTR_NONE=0, +- ATTR_BOLD, ATTR_ITALIC, ++ ATTR_NONE=0, ++ ATTR_BOLD, ATTR_ITALIC, + +- ATTR_UNDERLINE, ATTR_DOUBLE_UL, ATTR_WORD_UL, ++ ATTR_UNDERLINE, ATTR_DOUBLE_UL, ATTR_WORD_UL, + +- ATTR_THICK_UL, ATTR_WAVE_UL, ++ ATTR_THICK_UL, ATTR_WAVE_UL, + +- ATTR_DOT_UL, ATTR_DASH_UL, ATTR_DOT_DASH_UL, ATTR_2DOT_DASH_UL, ++ ATTR_DOT_UL, ATTR_DASH_UL, ATTR_DOT_DASH_UL, ATTR_2DOT_DASH_UL, + +- ATTR_FONTSIZE, ATTR_STD_FONTSIZE, +- ATTR_FONTFACE, +- ATTR_FOREGROUND, ATTR_BACKGROUND, +- ATTR_CAPS, +- ATTR_SMALLCAPS, ++ ATTR_FONTSIZE, ATTR_STD_FONTSIZE, ++ ATTR_FONTFACE, ++ ATTR_FOREGROUND, ATTR_BACKGROUND, ++ ATTR_CAPS, ++ ATTR_SMALLCAPS, + +- ATTR_SHADOW, +- ATTR_OUTLINE, +- ATTR_EMBOSS, +- ATTR_ENGRAVE, ++ ATTR_SHADOW, ++ ATTR_OUTLINE, ++ ATTR_EMBOSS, ++ ATTR_ENGRAVE, + +- ATTR_SUPER, ATTR_SUB, +- ATTR_STRIKE, +- ATTR_DBL_STRIKE, ++ ATTR_SUPER, ATTR_SUB, ++ ATTR_STRIKE, ++ ATTR_DBL_STRIKE, + +- ATTR_EXPAND, +- /* ATTR_CONDENSE */ ++ ATTR_EXPAND, ++ /* ATTR_CONDENSE */ + }; + + typedef struct _c + { +- int nr; +- char *text; +- struct _c *next; ++ int nr; ++ char *text; ++ struct _c *next; + } Collection; + + Collection *add_to_collection(Collection *col, int nr, char *text); + char *get_from_collection(Collection *c, int nr); + void free_collection(Collection *c); + ++struct ConversionContext; ++struct OutputContext; ++struct unRTFOutputDevice; ++ + extern void attr_push_core (int attr, char* param); + + extern void attr_pop_core (int attr); + +-extern void attr_push(int attr, char* param); ++extern void attr_push(int attr, char* param, const struct OutputContext *oc); + +-extern void attrstack_push(); +-extern void attrstack_drop(); ++extern void attrstack_push(struct ConversionContext *cc); ++extern void attrstack_drop(const struct OutputContext *oc); + extern void attrstack_express_all(); + +-extern int attr_pop(int attr); ++extern int attr_pop(int attr, const struct OutputContext *oc); + +-extern int attr_read(); ++extern int attr_read(const struct ConversionContext *cc); + + extern void attr_drop_all (); + +-extern void attr_pop_all(); ++extern void attr_pop_all(const struct OutputContext *oc); + + extern void attr_pop_dump(); + +-char * attr_get_param(int attr); ++char * attr_get_param(const struct ConversionContext *cc, int attr); + +-int safe_printf(int nr, char *string, ...); ++int safe_printf(const struct unRTFOutputDevice *device, int nr, char *string, ...); + char *assemble_string(char *string, int nr); + #define TOO_MANY_ARGS "Tag name \"%s\" do not take so many arguments" + ++#endif /* ATTR_H */ +diff -durpN unrtf-0.21.2.old/src/convert.c unrtf-0.21.2/src/convert.c +--- unrtf-0.21.2.old/src/convert.c 2011-06-07 08:00:23.000000000 -0400 ++++ unrtf-0.21.2/src/convert.c 2011-11-09 09:29:58.317540932 -0500 +@@ -1,24 +1,24 @@ + + /*=========================================================================== +- GNU UnRTF, a command-line program to convert RTF documents to other formats. +- Copyright (C) 2000,2001,2004 Zachary Thayer Smith ++ GNU UnRTF, a command-line program to convert RTF documents to other formats. ++ Copyright (C) 2000,2001,2004 Zachary Thayer Smith + +- This program is free software; you can redistribute it and/or modify +- it under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 3 of the License, or +- (at your option) any later version. ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3 of the License, or ++ (at your option) any later version. + +- This program is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- GNU General Public License for more details. ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. + +- You should have received a copy of the GNU General Public License +- along with this program; if not, write to the Free Software +- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software ++ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +- The maintainer is reachable by electronic mail at daved@physiol.usyd.edu.au +-===========================================================================*/ ++ The maintainer is reachable by electronic mail at daved@physiol.usyd.edu.au ++ ===========================================================================*/ + + + /*---------------------------------------------------------------------- +@@ -56,8 +56,8 @@ + * 31 Mar 05, daved@physiol.usyd.edu.au: strcat security bug fixed + * 06 Jan 06, marcossamaral@terra.com.br: patch from debian 0.19.3-1.1 + * 03 Mar 06, daved@physiol.usyd.edu.au: fixed creation date spelling +- and added support for accented characters in titles from +- Laurent Monin ++ and added support for accented characters in titles from ++ Laurent Monin + * 09 Mar 06, daved@physiol.usyd.edu.au: don't print null post_trans + * 18 Jun 06, daved@physiol.usyd.edu.au: fixed some incorrect comment_end + * 18 Jun 06, frolovs@internet2.ru: codepage support +@@ -68,7 +68,7 @@ + * 04 Jan 10, arkadiusz.firus@gmail.com: deal with (faulty) negative unicodes + * 04 Jan 10, daved@physiol.usyd.edu.au: suppress + * 21 Aug 10, daved@physiol.usyd.edu.au: add support for hex char doublet +- representation of special characters output by some rtf writers ++ representation of special characters output by some rtf writers + *--------------------------------------------------------------------*/ + + #ifdef HAVE_CONFIG_H +@@ -91,15 +91,21 @@ + #include + #endif + ++#ifdef HAVE_UNISTD_H ++#include ++#endif ++ + #include "defs.h" + #include "parse.h" + #include "util.h" + #include "malloc.h" +-#include "main.h" + #include "error.h" + #include "word.h" + #include "hash.h" ++#include "output.h" + #include "convert.h" ++#include "user.h" ++#include "unrtf.h" + + #ifndef HAVE_ATTR_H + #include "attr.h" +@@ -107,506 +113,460 @@ + #endif + + static CodepageInfo codepages[14] = +-{ +-/*-- cp850 --*/ +-{ +- 850, +- { +- /* 0x80 */ +- 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, +- 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5, +- /* 0x90 */ +- 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, +- 0x00ff, 0x00d6, 0x00dc, 0x00f8, 0x00a3, 0x00d8, 0x00d7, 0x0192, +- /* 0xa0 */ +- 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, +- 0x00bf, 0x00ae, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb, +- /* 0xb0 */ +- 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00c1, 0x00c2, 0x00c0, +- 0x00a9, 0x2563, 0x2551, 0x2557, 0x255d, 0x00a2, 0x00a5, 0x2510, +- /* 0xc0 */ +- 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x00e3, 0x00c3, +- 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x00a4, +- /* 0xd0 */ +- 0x00f0, 0x00d0, 0x00ca, 0x00cb, 0x00c8, 0x0131, 0x00cd, 0x00ce, +- 0x00cf, 0x2518, 0x250c, 0x2588, 0x2584, 0x00a6, 0x00cc, 0x2580, +- /* 0xe0 */ +- 0x00d3, 0x00df, 0x00d4, 0x00d2, 0x00f5, 0x00d5, 0x00b5, 0x00fe, +- 0x00de, 0x00da, 0x00db, 0x00d9, 0x00fd, 0x00dd, 0x00af, 0x00b4, +- /* 0xf0 */ +- 0x00ad, 0x00b1, 0x2017, 0x00be, 0x00b6, 0x00a7, 0x00f7, 0x00b8, +- 0x00b0, 0x00a8, 0x00b7, 0x00b9, 0x00b3, 0x00b2, 0x25a0, 0x00a0, +- } +-}, +-/*-- cp866 --*/ +-{ +- 866, +- { +- /* 0x80 */ +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- /* 0x90 */ +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- /* 0xa0 */ +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- /* 0xb0 */ +- 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, +- 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, +- /* 0xc0 */ +- 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, +- 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, +- /* 0xd0 */ +- 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, +- 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, +- /* 0xe0 */ +- 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, +- 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, +- /* 0xf0 */ +- 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040e, 0x045e, +- 0x00b0, 0x2219, 0x00b7, 0x221a, 0x2116, 0x00a4, 0x25a0, 0x00a0, +- } +-}, +-/*-- cp874 --*/ +-{ +- 874, +- { +- /* 0x80 */ +- 0x20ac, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2026, 0xfffd, 0xfffd, +- 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, +- /* 0x90 */ +- 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, +- 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, +- /* 0xa0 */ +- 0x00a0, 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07, +- 0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f, +- /* 0xb0 */ +- 0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17, +- 0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f, +- /* 0xc0 */ +- 0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27, +- 0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f, +- /* 0xd0 */ +- 0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e35, 0x0e36, 0x0e37, +- 0x0e38, 0x0e39, 0x0e3a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x0e3f, +- /* 0xe0 */ +- 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47, +- 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0e4e, 0x0e4f, +- /* 0xf0 */ +- 0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57, +- 0x0e58, 0x0e59, 0x0e5a, 0x0e5b, 0xfffd, 0xfffd, 0xfffd, 0xfffd, +- } +-}, +-/*-- cp1133 --*/ +-{ +- 1133, +- { +- /* 0x80 */ +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- /* 0x90 */ +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- /* 0xa0 */ +- 0x00a0, 0x0e81, 0x0e82, 0x0e84, 0x0e87, 0x0e88, 0x0eaa, 0x0e8a, +- 0x0e8d, 0x0e94, 0x0e95, 0x0e96, 0x0e97, 0x0e99, 0x0e9a, 0x0e9b, +- /* 0xb0 */ +- 0x0e9c, 0x0e9d, 0x0e9e, 0x0e9f, 0x0ea1, 0x0ea2, 0x0ea3, 0x0ea5, +- 0x0ea7, 0x0eab, 0x0ead, 0x0eae, 0xfffd, 0xfffd, 0xfffd, 0x0eaf, +- /* 0xc0 */ +- 0x0eb0, 0x0eb2, 0x0eb3, 0x0eb4, 0x0eb5, 0x0eb6, 0x0eb7, 0x0eb8, +- 0x0eb9, 0x0ebc, 0x0eb1, 0x0ebb, 0x0ebd, 0xfffd, 0xfffd, 0xfffd, +- /* 0xd0 */ +- 0x0ec0, 0x0ec1, 0x0ec2, 0x0ec3, 0x0ec4, 0x0ec8, 0x0ec9, 0x0eca, +- 0x0ecb, 0x0ecc, 0x0ecd, 0x0ec6, 0xfffd, 0x0edc, 0x0edd, 0x20ad, +- /* 0xe0 */ +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- /* 0xf0 */ +- 0x0ed0, 0x0ed1, 0x0ed2, 0x0ed3, 0x0ed4, 0x0ed5, 0x0ed6, 0x0ed7, +- 0x0ed8, 0x0ed9, 0xfffd, 0xfffd, 0x00a2, 0x00ac, 0x00a6, 0xfffd, +- } +-}, +-/*-- cp1250 --*/ +-{ +- 1250, + { +- /* 0x80 */ +- 0x20ac, 0xfffd, 0x201a, 0xfffd, 0x201e, 0x2026, 0x2020, 0x2021, +- 0xfffd, 0x2030, 0x0160, 0x2039, 0x015a, 0x0164, 0x017d, 0x0179, +- /* 0x90 */ +- 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, +- 0xfffd, 0x2122, 0x0161, 0x203a, 0x015b, 0x0165, 0x017e, 0x017a, +- /* 0xa0 */ +- 0x00a0, 0x02c7, 0x02d8, 0x0141, 0x00a4, 0x0104, 0x00a6, 0x00a7, +- 0x00a8, 0x00a9, 0x015e, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x017b, +- /* 0xb0 */ +- 0x00b0, 0x00b1, 0x02db, 0x0142, 0x00b4, 0x00b5, 0x00b6, 0x00b7, +- 0x00b8, 0x0105, 0x015f, 0x00bb, 0x013d, 0x02dd, 0x013e, 0x017c, +- /* 0xc0 */ +- 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, +- 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e, +- /* 0xd0 */ +- 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, +- 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df, +- /* 0xe0 */ +- 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, +- 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f, +- /* 0xf0 */ +- 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, +- 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9, +- } +-}, +-/*-- cp1251 --*/ +-{ +- 1251, +- { +- /* 0x80 */ +- 0x0402, 0x0403, 0x201a, 0x0453, 0x201e, 0x2026, 0x2020, 0x2021, +- 0x20ac, 0x2030, 0x0409, 0x2039, 0x040a, 0x040c, 0x040b, 0x040f, +- /* 0x90 */ +- 0x0452, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, +- 0xfffd, 0x2122, 0x0459, 0x203a, 0x045a, 0x045c, 0x045b, 0x045f, +- /* 0xa0 */ +- 0x00a0, 0x040e, 0x045e, 0x0408, 0x00a4, 0x0490, 0x00a6, 0x00a7, +- 0x0401, 0x00a9, 0x0404, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x0407, +- /* 0xb0 */ +- 0x00b0, 0x00b1, 0x0406, 0x0456, 0x0491, 0x00b5, 0x00b6, 0x00b7, +- 0x0451, 0x2116, 0x0454, 0x00bb, 0x0458, 0x0405, 0x0455, 0x0457, +- /* 0xc0 */ +- 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, +- 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, +- /* 0xd0 */ +- 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, +- 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, +- /* 0xe0 */ +- 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, +- 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, +- /* 0xf0 */ +- 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, +- 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, +- } +-}, +-/*-- cp1252 --*/ +-{ +- 1252, +- { +- /* 0x80 */ +- 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, +- 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0xfffd, 0x017d, 0xfffd, +- /* 0x90 */ +-/* daved - don't process 93 & 94 as we want entities */ +- 0xfffd, 0x2018, 0x2019, 0, 0, 0x2022, 0x2013, 0x2014, +- 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0xfffd, 0x017e, 0x0178, +- /* 0xa0 */ +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- /* 0xb0 */ +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- /* 0xc0 */ +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- /* 0xd0 */ +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- /* 0xe0 */ +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- /* 0xf0 */ +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- } +-}, +-/*-- cp1253 --*/ +-{ +- 1253, +- { +- /* 0x80 */ +- 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, +- 0xfffd, 0x2030, 0xfffd, 0x2039, 0xfffd, 0xfffd, 0xfffd, 0xfffd, +- /* 0x90 */ +- 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, +- 0xfffd, 0x2122, 0xfffd, 0x203a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, +- /* 0xa0 */ +- 0x00a0, 0x0385, 0x0386, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, +- 0x00a8, 0x00a9, 0xfffd, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x2015, +- /* 0xb0 */ +- 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x00b5, 0x00b6, 0x00b7, +- 0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f, +- /* 0xc0 */ +- 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, +- 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, +- /* 0xd0 */ +- 0x03a0, 0x03a1, 0xfffd, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, +- 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af, +- /* 0xe0 */ +- 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, +- 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, +- /* 0xf0 */ +- 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, +- 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0xfffd, +- } +-}, +-/*-- 1254 --*/ +-{ +- 1254, +- { +- /* 0x80 */ +- 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, +- 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0xfffd, 0xfffd, 0xfffd, +- /* 0x90 */ +- 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, +- 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0xfffd, 0xfffd, 0x0178, +- /* 0xa0 */ +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- /* 0xb0 */ +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- /* 0xc0 */ +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- /* 0xd0 */ +- 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, +- 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df, +- /* 0xe0 */ +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- /* 0xf0 */ +- 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, +- 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff, +- } +-}, +-/*-- cp1255 --*/ +-{ +- 1255, +- { +- /* 0x80 */ +- 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, +- 0x02c6, 0x2030, 0xfffd, 0x2039, 0xfffd, 0xfffd, 0xfffd, 0xfffd, +- /* 0x90 */ +- 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, +- 0x02dc, 0x2122, 0xfffd, 0x203a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, +- /* 0xa0 */ +- 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20aa, 0x00a5, 0x00a6, 0x00a7, +- 0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, +- /* 0xb0 */ +- 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, +- 0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, +- /* 0xc0 */ +- 0x05b0, 0x05b1, 0x05b2, 0x05b3, 0x05b4, 0x05b5, 0x05b6, 0x05b7, +- 0x05b8, 0x05b9, 0xfffd, 0x05bb, 0x05bc, 0x05bd, 0x05be, 0x05bf, +- /* 0xd0 */ +- 0x05c0, 0x05c1, 0x05c2, 0x05c3, 0x05f0, 0x05f1, 0x05f2, 0x05f3, +- 0x05f4, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, +- /* 0xe0 */ +- 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, +- 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, +- /* 0xf0 */ +- 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, +- 0x05e8, 0x05e9, 0x05ea, 0xfffd, 0xfffd, 0x200e, 0x200f, 0xfffd, +- } +-}, +-/*-- cp1256 --*/ +-{ +- 1256, +- { +- /* 0x80 */ +- 0x20ac, 0x067e, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, +- 0x02c6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688, +- /* 0x90 */ +- 0x06af, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, +- 0x06a9, 0x2122, 0x0691, 0x203a, 0x0153, 0x200c, 0x200d, 0x06ba, +- /* 0xa0 */ +- 0x00a0, 0x060c, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, +- 0x00a8, 0x00a9, 0x06be, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, +- /* 0xb0 */ +- 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, +- 0x00b8, 0x00b9, 0x061b, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x061f, +- /* 0xc0 */ +- 0x06c1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, +- 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, +- /* 0xd0 */ +- 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00d7, +- 0x0637, 0x0638, 0x0639, 0x063a, 0x0640, 0x0641, 0x0642, 0x0643, +- /* 0xe0 */ +- 0x00e0, 0x0644, 0x00e2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00e7, +- 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x0649, 0x064a, 0x00ee, 0x00ef, +- /* 0xf0 */ +- 0x064b, 0x064c, 0x064d, 0x064e, 0x00f4, 0x064f, 0x0650, 0x00f7, +- 0x0651, 0x00f9, 0x0652, 0x00fb, 0x00fc, 0x200e, 0x200f, 0x06d2, +- } +-}, +-{ +- 1257, +- { +- /* 0x80 */ +- 0x20ac, 0xfffd, 0x201a, 0xfffd, 0x201e, 0x2026, 0x2020, 0x2021, +- 0xfffd, 0x2030, 0xfffd, 0x2039, 0xfffd, 0x00a8, 0x02c7, 0x00b8, +- /* 0x90 */ +- 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, +- 0xfffd, 0x2122, 0xfffd, 0x203a, 0xfffd, 0x00af, 0x02db, 0xfffd, +- /* 0xa0 */ +- 0x00a0, 0xfffd, 0x00a2, 0x00a3, 0x00a4, 0xfffd, 0x00a6, 0x00a7, +- 0x00d8, 0x00a9, 0x0156, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00c6, +- /* 0xb0 */ +- 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, +- 0x00f8, 0x00b9, 0x0157, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00e6, +- /* 0xc0 */ +- 0x0104, 0x012e, 0x0100, 0x0106, 0x00c4, 0x00c5, 0x0118, 0x0112, +- 0x010c, 0x00c9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012a, 0x013b, +- /* 0xd0 */ +- 0x0160, 0x0143, 0x0145, 0x00d3, 0x014c, 0x00d5, 0x00d6, 0x00d7, +- 0x0172, 0x0141, 0x015a, 0x016a, 0x00dc, 0x017b, 0x017d, 0x00df, +- /* 0xe0 */ +- 0x0105, 0x012f, 0x0101, 0x0107, 0x00e4, 0x00e5, 0x0119, 0x0113, +- 0x010d, 0x00e9, 0x017a, 0x0117, 0x0123, 0x0137, 0x012b, 0x013c, +- /* 0xf0 */ +- 0x0161, 0x0144, 0x0146, 0x00f3, 0x014d, 0x00f5, 0x00f6, 0x00f7, +- 0x0173, 0x0142, 0x015b, 0x016b, 0x00fc, 0x017c, 0x017e, 0x02d9, +- } +-}, +-{ +- 1258, +- { +- /* 0x80 */ +- 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, +- 0x02c6, 0x2030, 0xfffd, 0x2039, 0x0152, 0xfffd, 0xfffd, 0xfffd, +- /* 0x90 */ +- 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, +- 0x02dc, 0x2122, 0xfffd, 0x203a, 0x0153, 0xfffd, 0xfffd, 0x0178, +- /* 0xa0 */ +- 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, +- 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, +- /* 0xb0 */ +- 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, +- 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, +- /* 0xc0 */ +- 0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x00c5, 0x00c6, 0x00c7, +- 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x0300, 0x00cd, 0x00ce, 0x00cf, +- /* 0xd0 */ +- 0x0110, 0x00d1, 0x0309, 0x00d3, 0x00d4, 0x01a0, 0x00d6, 0x00d7, +- 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x01af, 0x0303, 0x00df, +- /* 0xe0 */ +- 0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x00e5, 0x00e6, 0x00e7, +- 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x0301, 0x00ed, 0x00ee, 0x00ef, +- /* 0xf0 */ +- 0x0111, 0x00f1, 0x0323, 0x00f3, 0x00f4, 0x01a1, 0x00f6, 0x00f7, +- 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x01b0, 0x20ab, 0x00ff, +- } +-}, +-/*-- null --*/ +-{ +- 0, +- { +- /* 0x80 */ +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- /* 0x90 */ +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- /* 0xa0 */ +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- /* 0xb0 */ +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- /* 0xc0 */ +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- /* 0xd0 */ +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- /* 0xe0 */ +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- /* 0xf0 */ +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- } +-}, +-}; +- ++ /*-- cp850 --*/ ++ { ++ 850, ++ { ++ /* 0x80 */ ++ 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, ++ 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5, ++ /* 0x90 */ ++ 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, ++ 0x00ff, 0x00d6, 0x00dc, 0x00f8, 0x00a3, 0x00d8, 0x00d7, 0x0192, ++ /* 0xa0 */ ++ 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, ++ 0x00bf, 0x00ae, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb, ++ /* 0xb0 */ ++ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00c1, 0x00c2, 0x00c0, ++ 0x00a9, 0x2563, 0x2551, 0x2557, 0x255d, 0x00a2, 0x00a5, 0x2510, ++ /* 0xc0 */ ++ 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x00e3, 0x00c3, ++ 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x00a4, ++ /* 0xd0 */ ++ 0x00f0, 0x00d0, 0x00ca, 0x00cb, 0x00c8, 0x0131, 0x00cd, 0x00ce, ++ 0x00cf, 0x2518, 0x250c, 0x2588, 0x2584, 0x00a6, 0x00cc, 0x2580, ++ /* 0xe0 */ ++ 0x00d3, 0x00df, 0x00d4, 0x00d2, 0x00f5, 0x00d5, 0x00b5, 0x00fe, ++ 0x00de, 0x00da, 0x00db, 0x00d9, 0x00fd, 0x00dd, 0x00af, 0x00b4, ++ /* 0xf0 */ ++ 0x00ad, 0x00b1, 0x2017, 0x00be, 0x00b6, 0x00a7, 0x00f7, 0x00b8, ++ 0x00b0, 0x00a8, 0x00b7, 0x00b9, 0x00b3, 0x00b2, 0x25a0, 0x00a0, ++ } ++ }, ++ /*-- cp866 --*/ ++ { ++ 866, ++ { ++ /* 0x80 */ ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ /* 0x90 */ ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ /* 0xa0 */ ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ /* 0xb0 */ ++ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, ++ 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, ++ /* 0xc0 */ ++ 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, ++ 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, ++ /* 0xd0 */ ++ 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, ++ 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, ++ /* 0xe0 */ ++ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, ++ 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, ++ /* 0xf0 */ ++ 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040e, 0x045e, ++ 0x00b0, 0x2219, 0x00b7, 0x221a, 0x2116, 0x00a4, 0x25a0, 0x00a0, ++ } ++ }, ++ /*-- cp874 --*/ ++ { ++ 874, ++ { ++ /* 0x80 */ ++ 0x20ac, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2026, 0xfffd, 0xfffd, ++ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, ++ /* 0x90 */ ++ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, ++ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, ++ /* 0xa0 */ ++ 0x00a0, 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07, ++ 0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f, ++ /* 0xb0 */ ++ 0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17, ++ 0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f, ++ /* 0xc0 */ ++ 0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27, ++ 0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f, ++ /* 0xd0 */ ++ 0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e35, 0x0e36, 0x0e37, ++ 0x0e38, 0x0e39, 0x0e3a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x0e3f, ++ /* 0xe0 */ ++ 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47, ++ 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0e4e, 0x0e4f, ++ /* 0xf0 */ ++ 0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57, ++ 0x0e58, 0x0e59, 0x0e5a, 0x0e5b, 0xfffd, 0xfffd, 0xfffd, 0xfffd, ++ } ++ }, ++ /*-- cp1133 --*/ ++ { ++ 1133, ++ { ++ /* 0x80 */ ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ /* 0x90 */ ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ /* 0xa0 */ ++ 0x00a0, 0x0e81, 0x0e82, 0x0e84, 0x0e87, 0x0e88, 0x0eaa, 0x0e8a, ++ 0x0e8d, 0x0e94, 0x0e95, 0x0e96, 0x0e97, 0x0e99, 0x0e9a, 0x0e9b, ++ /* 0xb0 */ ++ 0x0e9c, 0x0e9d, 0x0e9e, 0x0e9f, 0x0ea1, 0x0ea2, 0x0ea3, 0x0ea5, ++ 0x0ea7, 0x0eab, 0x0ead, 0x0eae, 0xfffd, 0xfffd, 0xfffd, 0x0eaf, ++ /* 0xc0 */ ++ 0x0eb0, 0x0eb2, 0x0eb3, 0x0eb4, 0x0eb5, 0x0eb6, 0x0eb7, 0x0eb8, ++ 0x0eb9, 0x0ebc, 0x0eb1, 0x0ebb, 0x0ebd, 0xfffd, 0xfffd, 0xfffd, ++ /* 0xd0 */ ++ 0x0ec0, 0x0ec1, 0x0ec2, 0x0ec3, 0x0ec4, 0x0ec8, 0x0ec9, 0x0eca, ++ 0x0ecb, 0x0ecc, 0x0ecd, 0x0ec6, 0xfffd, 0x0edc, 0x0edd, 0x20ad, ++ /* 0xe0 */ ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ /* 0xf0 */ ++ 0x0ed0, 0x0ed1, 0x0ed2, 0x0ed3, 0x0ed4, 0x0ed5, 0x0ed6, 0x0ed7, ++ 0x0ed8, 0x0ed9, 0xfffd, 0xfffd, 0x00a2, 0x00ac, 0x00a6, 0xfffd, ++ } ++ }, ++ /*-- cp1250 --*/ ++ { ++ 1250, ++ { ++ /* 0x80 */ ++ 0x20ac, 0xfffd, 0x201a, 0xfffd, 0x201e, 0x2026, 0x2020, 0x2021, ++ 0xfffd, 0x2030, 0x0160, 0x2039, 0x015a, 0x0164, 0x017d, 0x0179, ++ /* 0x90 */ ++ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, ++ 0xfffd, 0x2122, 0x0161, 0x203a, 0x015b, 0x0165, 0x017e, 0x017a, ++ /* 0xa0 */ ++ 0x00a0, 0x02c7, 0x02d8, 0x0141, 0x00a4, 0x0104, 0x00a6, 0x00a7, ++ 0x00a8, 0x00a9, 0x015e, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x017b, ++ /* 0xb0 */ ++ 0x00b0, 0x00b1, 0x02db, 0x0142, 0x00b4, 0x00b5, 0x00b6, 0x00b7, ++ 0x00b8, 0x0105, 0x015f, 0x00bb, 0x013d, 0x02dd, 0x013e, 0x017c, ++ /* 0xc0 */ ++ 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, ++ 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e, ++ /* 0xd0 */ ++ 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, ++ 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df, ++ /* 0xe0 */ ++ 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, ++ 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f, ++ /* 0xf0 */ ++ 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, ++ 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9, ++ } ++ }, ++ /*-- cp1251 --*/ ++ { ++ 1251, ++ { ++ /* 0x80 */ ++ 0x0402, 0x0403, 0x201a, 0x0453, 0x201e, 0x2026, 0x2020, 0x2021, ++ 0x20ac, 0x2030, 0x0409, 0x2039, 0x040a, 0x040c, 0x040b, 0x040f, ++ /* 0x90 */ ++ 0x0452, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, ++ 0xfffd, 0x2122, 0x0459, 0x203a, 0x045a, 0x045c, 0x045b, 0x045f, ++ /* 0xa0 */ ++ 0x00a0, 0x040e, 0x045e, 0x0408, 0x00a4, 0x0490, 0x00a6, 0x00a7, ++ 0x0401, 0x00a9, 0x0404, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x0407, ++ /* 0xb0 */ ++ 0x00b0, 0x00b1, 0x0406, 0x0456, 0x0491, 0x00b5, 0x00b6, 0x00b7, ++ 0x0451, 0x2116, 0x0454, 0x00bb, 0x0458, 0x0405, 0x0455, 0x0457, ++ /* 0xc0 */ ++ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, ++ 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, ++ /* 0xd0 */ ++ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, ++ 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, ++ /* 0xe0 */ ++ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, ++ 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, ++ /* 0xf0 */ ++ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, ++ 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, ++ } ++ }, ++ /*-- cp1252 --*/ ++ { ++ 1252, ++ { ++ /* 0x80 */ ++ 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, ++ 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0xfffd, 0x017d, 0xfffd, ++ /* 0x90 */ ++ /* daved - don't process 93 & 94 as we want entities */ ++ 0xfffd, 0x2018, 0x2019, 0, 0, 0x2022, 0x2013, 0x2014, ++ 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0xfffd, 0x017e, 0x0178, ++ /* 0xa0 */ ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ /* 0xb0 */ ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ /* 0xc0 */ ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ /* 0xd0 */ ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ /* 0xe0 */ ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ /* 0xf0 */ ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ } ++ }, ++ /*-- cp1253 --*/ ++ { ++ 1253, ++ { ++ /* 0x80 */ ++ 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, ++ 0xfffd, 0x2030, 0xfffd, 0x2039, 0xfffd, 0xfffd, 0xfffd, 0xfffd, ++ /* 0x90 */ ++ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, ++ 0xfffd, 0x2122, 0xfffd, 0x203a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, ++ /* 0xa0 */ ++ 0x00a0, 0x0385, 0x0386, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, ++ 0x00a8, 0x00a9, 0xfffd, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x2015, ++ /* 0xb0 */ ++ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x00b5, 0x00b6, 0x00b7, ++ 0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f, ++ /* 0xc0 */ ++ 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, ++ 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, ++ /* 0xd0 */ ++ 0x03a0, 0x03a1, 0xfffd, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, ++ 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af, ++ /* 0xe0 */ ++ 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, ++ 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, ++ /* 0xf0 */ ++ 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, ++ 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0xfffd, ++ } ++ }, ++ /*-- 1254 --*/ ++ { ++ 1254, ++ { ++ /* 0x80 */ ++ 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, ++ 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0xfffd, 0xfffd, 0xfffd, ++ /* 0x90 */ ++ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, ++ 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0xfffd, 0xfffd, 0x0178, ++ /* 0xa0 */ ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ /* 0xb0 */ ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ /* 0xc0 */ ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ /* 0xd0 */ ++ 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, ++ 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df, ++ /* 0xe0 */ ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ /* 0xf0 */ ++ 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, ++ 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff, ++ } ++ }, ++ /*-- cp1255 --*/ ++ { ++ 1255, ++ { ++ /* 0x80 */ ++ 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, ++ 0x02c6, 0x2030, 0xfffd, 0x2039, 0xfffd, 0xfffd, 0xfffd, 0xfffd, ++ /* 0x90 */ ++ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, ++ 0x02dc, 0x2122, 0xfffd, 0x203a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, ++ /* 0xa0 */ ++ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20aa, 0x00a5, 0x00a6, 0x00a7, ++ 0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, ++ /* 0xb0 */ ++ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, ++ 0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, ++ /* 0xc0 */ ++ 0x05b0, 0x05b1, 0x05b2, 0x05b3, 0x05b4, 0x05b5, 0x05b6, 0x05b7, ++ 0x05b8, 0x05b9, 0xfffd, 0x05bb, 0x05bc, 0x05bd, 0x05be, 0x05bf, ++ /* 0xd0 */ ++ 0x05c0, 0x05c1, 0x05c2, 0x05c3, 0x05f0, 0x05f1, 0x05f2, 0x05f3, ++ 0x05f4, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, ++ /* 0xe0 */ ++ 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, ++ 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, ++ /* 0xf0 */ ++ 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, ++ 0x05e8, 0x05e9, 0x05ea, 0xfffd, 0xfffd, 0x200e, 0x200f, 0xfffd, ++ } ++ }, ++ /*-- cp1256 --*/ ++ { ++ 1256, ++ { ++ /* 0x80 */ ++ 0x20ac, 0x067e, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, ++ 0x02c6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688, ++ /* 0x90 */ ++ 0x06af, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, ++ 0x06a9, 0x2122, 0x0691, 0x203a, 0x0153, 0x200c, 0x200d, 0x06ba, ++ /* 0xa0 */ ++ 0x00a0, 0x060c, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, ++ 0x00a8, 0x00a9, 0x06be, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, ++ /* 0xb0 */ ++ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, ++ 0x00b8, 0x00b9, 0x061b, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x061f, ++ /* 0xc0 */ ++ 0x06c1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, ++ 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, ++ /* 0xd0 */ ++ 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00d7, ++ 0x0637, 0x0638, 0x0639, 0x063a, 0x0640, 0x0641, 0x0642, 0x0643, ++ /* 0xe0 */ ++ 0x00e0, 0x0644, 0x00e2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00e7, ++ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x0649, 0x064a, 0x00ee, 0x00ef, ++ /* 0xf0 */ ++ 0x064b, 0x064c, 0x064d, 0x064e, 0x00f4, 0x064f, 0x0650, 0x00f7, ++ 0x0651, 0x00f9, 0x0652, 0x00fb, 0x00fc, 0x200e, 0x200f, 0x06d2, ++ } ++ }, ++ { ++ 1257, ++ { ++ /* 0x80 */ ++ 0x20ac, 0xfffd, 0x201a, 0xfffd, 0x201e, 0x2026, 0x2020, 0x2021, ++ 0xfffd, 0x2030, 0xfffd, 0x2039, 0xfffd, 0x00a8, 0x02c7, 0x00b8, ++ /* 0x90 */ ++ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, ++ 0xfffd, 0x2122, 0xfffd, 0x203a, 0xfffd, 0x00af, 0x02db, 0xfffd, ++ /* 0xa0 */ ++ 0x00a0, 0xfffd, 0x00a2, 0x00a3, 0x00a4, 0xfffd, 0x00a6, 0x00a7, ++ 0x00d8, 0x00a9, 0x0156, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00c6, ++ /* 0xb0 */ ++ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, ++ 0x00f8, 0x00b9, 0x0157, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00e6, ++ /* 0xc0 */ ++ 0x0104, 0x012e, 0x0100, 0x0106, 0x00c4, 0x00c5, 0x0118, 0x0112, ++ 0x010c, 0x00c9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012a, 0x013b, ++ /* 0xd0 */ ++ 0x0160, 0x0143, 0x0145, 0x00d3, 0x014c, 0x00d5, 0x00d6, 0x00d7, ++ 0x0172, 0x0141, 0x015a, 0x016a, 0x00dc, 0x017b, 0x017d, 0x00df, ++ /* 0xe0 */ ++ 0x0105, 0x012f, 0x0101, 0x0107, 0x00e4, 0x00e5, 0x0119, 0x0113, ++ 0x010d, 0x00e9, 0x017a, 0x0117, 0x0123, 0x0137, 0x012b, 0x013c, ++ /* 0xf0 */ ++ 0x0161, 0x0144, 0x0146, 0x00f3, 0x014d, 0x00f5, 0x00f6, 0x00f7, ++ 0x0173, 0x0142, 0x015b, 0x016b, 0x00fc, 0x017c, 0x017e, 0x02d9, ++ } ++ }, ++ { ++ 1258, ++ { ++ /* 0x80 */ ++ 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, ++ 0x02c6, 0x2030, 0xfffd, 0x2039, 0x0152, 0xfffd, 0xfffd, 0xfffd, ++ /* 0x90 */ ++ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, ++ 0x02dc, 0x2122, 0xfffd, 0x203a, 0x0153, 0xfffd, 0xfffd, 0x0178, ++ /* 0xa0 */ ++ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, ++ 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, ++ /* 0xb0 */ ++ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, ++ 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, ++ /* 0xc0 */ ++ 0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x00c5, 0x00c6, 0x00c7, ++ 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x0300, 0x00cd, 0x00ce, 0x00cf, ++ /* 0xd0 */ ++ 0x0110, 0x00d1, 0x0309, 0x00d3, 0x00d4, 0x01a0, 0x00d6, 0x00d7, ++ 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x01af, 0x0303, 0x00df, ++ /* 0xe0 */ ++ 0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x00e5, 0x00e6, 0x00e7, ++ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x0301, 0x00ed, 0x00ee, 0x00ef, ++ /* 0xf0 */ ++ 0x0111, 0x00f1, 0x0323, 0x00f3, 0x00f4, 0x01a1, 0x00f6, 0x00f7, ++ 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x01b0, 0x20ab, 0x00ff, ++ } ++ }, ++ /*-- null --*/ ++ { ++ 0, ++ { ++ /* 0x80 */ ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ /* 0x90 */ ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ /* 0xa0 */ ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ /* 0xb0 */ ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ /* 0xc0 */ ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ /* 0xd0 */ ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ /* 0xe0 */ ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ /* 0xf0 */ ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ } ++ }, ++ }; + +-extern int nopict_mode; + + /* +-#define BINARY_ATTRS ++ #define BINARY_ATTRS + */ + +-my_iconv_t desc = MY_ICONV_T_CLEAR, desc2 = MY_ICONV_T_CLEAR; +- + /* Nested tables aren't supported. + */ +-static int coming_pars_that_are_tabular = 0; +-static int within_table = FALSE; +-static int have_printed_row_begin=FALSE; +-static int have_printed_cell_begin=FALSE; +-static int have_printed_row_end=FALSE; +-static int have_printed_cell_end=FALSE; +- +- +-/* Previously in word_print_core function +- */ +-static int total_chars_this_line=0; /* for simulating \tab */ +- + + /* Paragraph alignment (kludge) + */ + enum { +- ALIGN_LEFT=0, +- ALIGN_RIGHT, +- ALIGN_CENTER, +- ALIGN_JUSTIFY ++ ALIGN_LEFT=0, ++ ALIGN_RIGHT, ++ ALIGN_CENTER, ++ ALIGN_JUSTIFY + }; + +- +- +-/* This value is set by attr_push and attr_pop +- */ +-int simulate_smallcaps; +-int simulate_allcaps; +- +- + /* Most pictures must be written to files. */ + enum { +- PICT_UNKNOWN=0, +- PICT_WM, +- PICT_MAC, +- PICT_PM, +- PICT_DI, +- PICT_WB, +- PICT_JPEG, +- PICT_PNG, ++ PICT_UNKNOWN=0, ++ PICT_WM, ++ PICT_MAC, ++ PICT_PM, ++ PICT_DI, ++ PICT_WB, ++ PICT_JPEG, ++ PICT_PNG, + }; +-static int within_picture=FALSE; +-static int picture_file_number=1; +-static char picture_path[255]; +-static int picture_width; +-static int picture_height; +-static int picture_bits_per_pixel=1; +-static int picture_type=PICT_UNKNOWN; +-static int picture_wmetafile_type; +-static char *picture_wmetafile_type_str; +- +- +-static int have_printed_body=FALSE; +-static int within_header=TRUE; +- +- +- +-static char *hyperlink_base = NULL; +- +- +- +-void starting_body(); +-void starting_text(); +-void print_with_special_exprs (char *s); +- +-static int banner_printed=FALSE; + ++void starting_body(const struct OutputContext *oc); ++void starting_text(const struct OutputContext *oc); ++void print_with_special_exprs (const struct OutputContext *oc, char *s); + + /*======================================================================== + * Name: print_banner +@@ -616,15 +576,17 @@ static int banner_printed=FALSE; + *=======================================================================*/ + + void +-print_banner () { +- if (!banner_printed) { +- if (safe_printf(0, op->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); +- printf(" Translation from RTF performed by "); +- printf("UnRTF, version "); +- printf("%s ", PACKAGE_VERSION); +- if (safe_printf(0, op->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); +- } +- banner_printed=TRUE; ++print_banner (const struct OutputContext *oc) { ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; ++ ++ if (!oc->conversion->banner_printed) { ++ if (safe_printf(device, 0, oc->personality->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); ++ printf(" Translation from RTF performed by "); ++ printf("UnRTF, version "); ++ printf("%s ", PACKAGE_VERSION); ++ if (safe_printf(device, 0, oc->personality->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); ++ } ++ oc->conversion->banner_printed=TRUE; + } + + +@@ -636,16 +598,18 @@ print_banner () { + *=======================================================================*/ + + void +-starting_body () ++starting_body (const struct OutputContext *oc) + { +- if (!have_printed_body) { +- if (!inline_mode) { +- if (safe_printf(0, op->header_end)) fprintf(stderr, TOO_MANY_ARGS, "header_end"); +- if (safe_printf(0, op->body_begin)) fprintf(stderr, TOO_MANY_ARGS, "body_begin"); +- } +- within_header = FALSE; +- have_printed_body = TRUE; +- } ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; ++ ++ if (!oc->conversion->have_printed_body) { ++ if (!oc->conversion->options->inline_mode) { ++ if (safe_printf(device, 0, oc->personality->header_end)) fprintf(stderr, TOO_MANY_ARGS, "header_end"); ++ if (safe_printf(device, 0, oc->personality->body_begin)) fprintf(stderr, TOO_MANY_ARGS, "body_begin"); ++ } ++ oc->conversion->within_header = FALSE; ++ oc->conversion->have_printed_body = TRUE; ++ } + } + + +@@ -691,55 +655,44 @@ static char *month_strings[12]= { + *=======================================================================*/ + + void +-word_dump_date (Word *w) ++word_dump_date (const struct ConversionContext *cc, Word *w) + { +- int year=0, month=0, day=0, hour=0, minute=0; +- CHECK_PARAM_NOT_NULL(w); +- while (w) { +- char *s = word_string (w); +- if (*s == '\\') { +- ++s; +- if (!strncmp (s, "yr", 2) && isdigit(s[2])) { +- year = atoi (&s[2]); +- } +- else if (!strncmp (s, "mo", 2) && isdigit(s[2])) { +- month= atoi (&s[2]); +- } +- else if (!strncmp (s, "dy", 2) && isdigit(s[2])) { +- day= atoi (&s[2]); +- } +- else if (!strncmp (s, "min", 3) && isdigit(s[3])) { +- minute= atoi (&s[3]); +- } +- else if (!strncmp (s, "hr", 2) && isdigit(s[2])) { +- hour= atoi (&s[2]); +- } +- } +- w=w->next; +- } +- if (year && month && day) { +- printf("%d %s %d ", day, month_strings[month-1], year); +- } +- if (hour && minute) { +- printf("%02d:%02d ", hour, minute); +- } ++ int year=0, month=0, day=0, hour=0, minute=0; ++ CHECK_PARAM_NOT_NULL(w); ++ while (w) { ++ char *s = word_string (cc, w); ++ if (*s == '\\') { ++ ++s; ++ if (!strncmp (s, "yr", 2) && isdigit(s[2])) { ++ year = atoi (&s[2]); ++ } ++ else if (!strncmp (s, "mo", 2) && isdigit(s[2])) { ++ month= atoi (&s[2]); ++ } ++ else if (!strncmp (s, "dy", 2) && isdigit(s[2])) { ++ day= atoi (&s[2]); ++ } ++ else if (!strncmp (s, "min", 3) && isdigit(s[3])) { ++ minute= atoi (&s[3]); ++ } ++ else if (!strncmp (s, "hr", 2) && isdigit(s[2])) { ++ hour= atoi (&s[2]); ++ } ++ } ++ w=w->next; ++ } ++ if (year && month && day) { ++ printf("%d %s %d ", day, month_strings[month-1], year); ++ } ++ if (hour && minute) { ++ printf("%02d:%02d ", hour, minute); ++ } + } + + + + /*-------------------------------------------------------------------*/ + +-typedef struct { +- int num; +- char *name; +-} FontEntry; +- +-#define MAX_FONTS (8192) +-static FontEntry font_table[MAX_FONTS]; +-static int total_fonts=0; +- +- +- + /*======================================================================== + * Name: lookup_fontname + * Purpose: Fetches the name of a font from the already-read font table. +@@ -748,14 +701,14 @@ static int total_fonts=0; + *=======================================================================*/ + + char* +-lookup_fontname (int num) { +- int i; +- if (total_fonts) +- for(i=0;itotal_fonts) ++ for(i=0;itotal_fonts;i++) { ++ if (cc->font_table[i].num==num) ++ return cc->font_table[i].name; ++ } ++ return NULL; + } + + +@@ -767,73 +720,87 @@ lookup_fontname (int num) { + *=======================================================================*/ + + void +-process_font_table (Word *w) ++process_font_table (const struct OutputContext *oc, Word *w) + { +- Word *w2; ++ Word *w2; ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; + +- CHECK_PARAM_NOT_NULL(w); ++ CHECK_PARAM_NOT_NULL(w); + +- if (safe_printf(0, op->fonttable_begin)) fprintf(stderr, TOO_MANY_ARGS, "fonttable_begin"); ++ if (safe_printf(device, 0, oc->personality->fonttable_begin)) fprintf(stderr, TOO_MANY_ARGS, "fonttable_begin"); + +- while (w) { +- int num; +- char name[BUFSIZ]; +- char *tmp; ++ while (w) { ++ int num; ++ char name[BUFSIZ]; ++ char *tmp; + +- if ((w2 = w->child)) { +- tmp = word_string(w2); +- if (!strncmp("\\f", tmp, 2)) { +- num = atoi(&tmp[2]); +- name[0] = 0; ++ if ((w2 = w->child)) { ++ tmp = word_string (oc->conversion, w2); ++ if (!strncmp("\\f", tmp, 2)) { ++ num = atoi(&tmp[2]); ++ name[0] = 0; + +- w2 = w2->next; +- while (w2) { +- tmp = word_string (w2); +- if (tmp && tmp[0] != '\\') { +- if (strlen(tmp) + strlen(name) > BUFSIZ - 1) { +- printf("Invalid font table entry\n"); +- name[0] = 0; +- } +- else +- strncat(name,tmp,sizeof(name) - strlen(name) - 1); +- } +- w2 = w2->next; +- } ++ w2 = w2->next; ++ while (w2) { ++ tmp = word_string (oc->conversion, w2); ++ if (tmp && tmp[0] != '\\') { ++ if (strlen(tmp) + strlen(name) > BUFSIZ - 1) { ++ printf("Invalid font table entry\n"); ++ name[0] = 0; ++ } ++ else ++ strncat(name,tmp,sizeof(name) - strlen(name) - 1); ++ } ++ w2 = w2->next; ++ } + +- /* Chop the gall-derned semicolon. */ +- if ((tmp = strchr(name, ';'))) +- *tmp = 0; ++ /* Chop the gall-derned semicolon. */ ++ if ((tmp = strchr(name, ';'))) ++ *tmp = 0; + +- font_table[total_fonts].num=num; +- font_table[total_fonts].name=my_strdup(name); +- if (safe_printf(0, assemble_string(op->fonttable_fontnr, num))) fprintf(stderr, TOO_MANY_ARGS, "fonttable_fontnr"); +- if (safe_printf(1, op->fonttable_fontname, name)) fprintf(stderr, TOO_MANY_ARGS, "fonttable_fontname"); +- total_fonts++; +- } +- } +- w=w->next; +- } ++ oc->conversion->font_table[oc->conversion->total_fonts].num=num; ++ oc->conversion->font_table[oc->conversion->total_fonts].name=my_strdup(oc->conversion, name); ++ if (safe_printf(device, 0, assemble_string(oc->personality->fonttable_fontnr, num))) fprintf(stderr, TOO_MANY_ARGS, "fonttable_fontnr"); ++ if (safe_printf(device, 1, oc->personality->fonttable_fontname, name)) fprintf(stderr, TOO_MANY_ARGS, "fonttable_fontname"); ++ oc->conversion->total_fonts++; ++ } ++ } ++ w=w->next; ++ } + +- if (safe_printf(0, op->fonttable_end)) fprintf(stderr, TOO_MANY_ARGS, "fonttable_end"); ++ if (safe_printf(device, 0, oc->personality->fonttable_end)) fprintf(stderr, TOO_MANY_ARGS, "fonttable_end"); + +- if (safe_printf(0, op->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); +- printf("font table contains %d fonts total",total_fonts); +- if (safe_printf(0, op->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); ++ if (safe_printf(device, 0, oc->personality->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); ++ printf("font table contains %d fonts total", oc->conversion->total_fonts); ++ if (safe_printf(device, 0, oc->personality->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); + +- if (debug_mode) { +- int i; ++ if (oc->conversion->options->debug_mode) { ++ int i; + +- if (safe_printf(0, op->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); +- printf("font table dump: \n"); +- for (i=0; ipersonality->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); ++ printf("font table dump: \n"); ++ for (i=0; i< oc->conversion->total_fonts; i++) { ++ printf(" font %d = %s\n", oc->conversion->font_table[i].num, ++ oc->conversion->font_table[i].name); ++ } + +- if (safe_printf(0, op->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); +- } ++ if (safe_printf(device, 0, oc->personality->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); ++ } + } + ++static void ++fonttable_free(struct ConversionContext *cc) ++{ ++ int i; ++ ++ for (i = 0; i < cc->total_fonts; i++) { ++ if (cc->font_table[i].name) { ++ my_free(cc->font_table[i].name); ++ cc->font_table[i].name = NULL; ++ } ++ } ++ cc->total_fonts = 0; ++} + + /*======================================================================== + * Name: process_index_entry +@@ -843,24 +810,25 @@ process_font_table (Word *w) + *=======================================================================*/ + + void +-process_index_entry (Word *w) ++process_index_entry (const struct OutputContext *oc, Word *w) + { +- Word *w2; ++ Word *w2; ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; + +- CHECK_PARAM_NOT_NULL(w); ++ CHECK_PARAM_NOT_NULL(w); + +- while(w) { +- if ((w2=w->child)) { +- char *str = word_string (w2); ++ while(w) { ++ if ((w2=w->child)) { ++ char *str = word_string (oc->conversion, w2); + +- if (debug_mode && str) { +- if (safe_printf(0, op->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); +- printf("index entry word: %s ", str); +- if (safe_printf(0, op->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); +- } +- } +- w=w->next; +- } ++ if (oc->conversion->options->debug_mode && str) { ++ if (safe_printf(device, 0, oc->personality->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); ++ printf("index entry word: %s ", str); ++ if (safe_printf(device, 0, oc->personality->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); ++ } ++ } ++ w=w->next; ++ } + } + + +@@ -872,27 +840,28 @@ process_index_entry (Word *w) + *=======================================================================*/ + + void +-process_toc_entry (Word *w, int include_page_num) ++process_toc_entry (const struct OutputContext *oc, Word *w, int include_page_num) + { +- Word *w2; ++ Word *w2; ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; + +- CHECK_PARAM_NOT_NULL(w); ++ CHECK_PARAM_NOT_NULL(w); + +- while(w) { +- if ((w2=w->child)) { +- char *str = word_string (w2); ++ while(w) { ++ if ((w2=w->child)) { ++ char *str = word_string (oc->conversion, w2); + +- if (debug_mode && str) { ++ if (oc->conversion->options->debug_mode && str) { + +- if (safe_printf(0, op->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); +- printf("toc %s entry word: %s ", +- include_page_num ? "page#":"no page#", +- str); +- if (safe_printf(0, op->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); +- } +- } +- w=w->next; +- } ++ if (safe_printf(device, 0, oc->personality->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); ++ printf("toc %s entry word: %s ", ++ include_page_num ? "page#":"no page#", ++ str); ++ if (safe_printf(device, 0, oc->personality->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); ++ } ++ } ++ w=w->next; ++ } + } + + +@@ -904,183 +873,173 @@ process_toc_entry (Word *w, int include_ + *=======================================================================*/ + + void +-process_info_group (Word *w) ++process_info_group (const struct OutputContext *oc, Word *w) + { +- Word *child; ++ Word *child; ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; + +- /* amaral - 0.19.2 */ +- /* CHECK_PARAM_NOT_NULL(w); */ +- if (!w) printf("AUTHOR'S COMMENT: \\info command is null!\n"); ++ /* amaral - 0.19.2 */ ++ /* CHECK_PARAM_NOT_NULL(w); */ ++ if (!w) printf("AUTHOR'S COMMENT: \\info command is null!\n"); + +- while(w) { +- child = w->child; +- if (child) { +- Word *w2; +- char *s; ++ while(w) { ++ child = w->child; ++ if (child) { ++ Word *w2; ++ char *s; + +- s = word_string(child); ++ s = word_string (oc->conversion, child); + +- if (!inline_mode) { +- if (!strcmp("\\title", s)) { ++ if (!oc->conversion->options->inline_mode) { ++ if (!strcmp("\\title", s)) { + +- if (safe_printf(0, op->document_title_begin)) fprintf(stderr, TOO_MANY_ARGS, "document_title_begin"); +- w2=child->next; +- while (w2) { +- char *s2 = word_string(w2); +- if (s2[0] != '\\') +- { +- print_with_special_exprs (s2); +- } +- else +- { +- if (s2[1] == '\'') +- { +- int ch = h2toi (&s2[2]); ++ if (safe_printf(device, 0, oc->personality->document_title_begin)) fprintf(stderr, TOO_MANY_ARGS, "document_title_begin"); ++ w2=child->next; ++ while (w2) { ++ char *s2 = word_string (oc->conversion, w2); ++ if (s2[0] != '\\') ++ { ++ print_with_special_exprs (oc, s2); ++ } ++ else ++ { ++ if (s2[1] == '\'') ++ { ++ int ch = h2toi (&s2[2]); + +- char *s3; +- s3 = op_translate_char (op, desc, ch); +- if (!s3 || !*s3) +- { +- if (safe_printf(0, op->comment_begin)) +- fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); +- printf("char 0x%02x",ch); +- if (safe_printf(0, op->comment_end)) +- fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); +- } +- else +- { +- if (op->word_begin) +- if (safe_printf(0, op->word_begin)) +- fprintf(stderr, TOO_MANY_ARGS, "word_begin"); +- printf("%s", s3); +- if (op->word_end) +- if (safe_printf(0, op->word_end)) +- fprintf(stderr, TOO_MANY_ARGS, "word_end"); +- } +- } +- } ++ char *s3; ++ s3 = op_translate_char (oc->conversion, oc->personality, ch); ++ if (!s3 || !*s3) ++ { ++ if (safe_printf(device, 0, oc->personality->comment_begin)) ++ fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); ++ printf("char 0x%02x",ch); ++ if (safe_printf(device, 0, oc->personality->comment_end)) ++ fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); ++ } ++ else ++ { ++ if (oc->personality->word_begin) ++ if (safe_printf(device, 0, oc->personality->word_begin)) ++ fprintf(stderr, TOO_MANY_ARGS, "word_begin"); ++ printf("%s", s3); ++ if (oc->personality->word_end) ++ if (safe_printf(device, 0, oc->personality->word_end)) ++ fprintf(stderr, TOO_MANY_ARGS, "word_end"); ++ } ++ } ++ } + +- w2 = w2->next; +- } +- if (safe_printf(0, op->document_title_end)) fprintf(stderr, TOO_MANY_ARGS, "document_title_end"); +- } +- else if (!strcmp("\\keywords", s)) { +- if (safe_printf(0, op->document_keywords_begin)) fprintf(stderr, TOO_MANY_ARGS, "document_keywords_begin"); +- w2=child->next; +- while (w2) { +- char *s2 = word_string(w2); +- if (s2[0] != '\\') +- printf("%s,", s2); +- w2 = w2->next; +- } +- if (safe_printf(0, op->document_keywords_end)) fprintf(stderr, TOO_MANY_ARGS, "document_keywords_end"); +- } +- else if (!strcmp("\\author", s)) { +- if (safe_printf(0, op->document_author_begin)) fprintf(stderr, TOO_MANY_ARGS, "document_author_begin"); +- w2=child->next; +- while (w2) { +- char *s2 = word_string(w2); +- if (s2[0] != '\\') +- printf("%s", s2); +- w2 = w2->next; +- } +- if (safe_printf(0, op->document_author_end)) fprintf(stderr, TOO_MANY_ARGS, "document_author_end"); +- } +- else if (!strcmp("\\comment", s)) { +- if (safe_printf(0, op->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); +- printf("comments: "); +- w2=child->next; +- while (w2) { +- char *s2 = word_string(w2); +- if (s2[0] != '\\') +- printf("%s", s2); +- w2 = w2->next; +- } +- if (safe_printf(0, op->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); +- } +- else if (!strncmp("\\nofpages", s, 9)) { +- if (safe_printf(0, op->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); +- printf("total pages: %s",&s[9]); +- if (safe_printf(0, op->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); +- } +- else if (!strncmp("\\nofwords", s, 9)) { +- if (safe_printf(0, op->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); +- printf("total words: %s",&s[9]); +- if (safe_printf(0, op->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); +- } +- else if (!strncmp("\\nofchars", s, 9) && isdigit(s[9])) { +- if (safe_printf(0, op->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); +- printf("total chars: %s",&s[9]); +- if (safe_printf(0, op->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); +- } +- else if (!strcmp("\\creatim", s)) { +- if (safe_printf(0, op->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); +- printf("creation date: "); +- if (child->next) word_dump_date (child->next); +- if (safe_printf(0, op->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); +- } +- else if (!strcmp("\\printim", s)) { +- if (safe_printf(0, op->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); +- printf("last printed: "); +- if (child->next) word_dump_date (child->next); +- if (safe_printf(0, op->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); +- } +- else if (!strcmp("\\buptim", s)) { +- if (safe_printf(0, op->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); +- printf("last backup: "); +- if (child->next) word_dump_date (child->next); +- if (safe_printf(0, op->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); +- } +- else if (!strcmp("\\revtim", s)) { +- if (safe_printf(0, op->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); +- printf("revision date: "); +- if (child->next) word_dump_date (child->next); +- if (safe_printf(0, op->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); +- } +- } ++ w2 = w2->next; ++ } ++ if (safe_printf(device, 0, oc->personality->document_title_end)) fprintf(stderr, TOO_MANY_ARGS, "document_title_end"); ++ } ++ else if (!strcmp("\\keywords", s)) { ++ if (safe_printf(device, 0, oc->personality->document_keywords_begin)) fprintf(stderr, TOO_MANY_ARGS, "document_keywords_begin"); ++ w2=child->next; ++ while (w2) { ++ char *s2 = word_string (oc->conversion, w2); ++ if (s2[0] != '\\') ++ printf("%s,", s2); ++ w2 = w2->next; ++ } ++ if (safe_printf(device, 0, oc->personality->document_keywords_end)) fprintf(stderr, TOO_MANY_ARGS, "document_keywords_end"); ++ } ++ else if (!strcmp("\\author", s)) { ++ if (safe_printf(device, 0, oc->personality->document_author_begin)) fprintf(stderr, TOO_MANY_ARGS, "document_author_begin"); ++ w2=child->next; ++ while (w2) { ++ char *s2 = word_string (oc->conversion, w2); ++ if (s2[0] != '\\') ++ printf("%s", s2); ++ w2 = w2->next; ++ } ++ if (safe_printf(device, 0, oc->personality->document_author_end)) fprintf(stderr, TOO_MANY_ARGS, "document_author_end"); ++ } ++ else if (!strcmp("\\comment", s)) { ++ if (safe_printf(device, 0, oc->personality->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); ++ printf("comments: "); ++ w2=child->next; ++ while (w2) { ++ char *s2 = word_string (oc->conversion, w2); ++ if (s2[0] != '\\') ++ printf("%s", s2); ++ w2 = w2->next; ++ } ++ if (safe_printf(device, 0, oc->personality->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); ++ } ++ else if (!strncmp("\\nofpages", s, 9)) { ++ if (safe_printf(device, 0, oc->personality->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); ++ printf("total pages: %s",&s[9]); ++ if (safe_printf(device, 0, oc->personality->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); ++ } ++ else if (!strncmp("\\nofwords", s, 9)) { ++ if (safe_printf(device, 0, oc->personality->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); ++ printf("total words: %s",&s[9]); ++ if (safe_printf(device, 0, oc->personality->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); ++ } ++ else if (!strncmp("\\nofchars", s, 9) && isdigit(s[9])) { ++ if (safe_printf(device, 0, oc->personality->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); ++ printf("total chars: %s",&s[9]); ++ if (safe_printf(device, 0, oc->personality->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); ++ } ++ else if (!strcmp("\\creatim", s)) { ++ if (safe_printf(device, 0, oc->personality->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); ++ printf("creation date: "); ++ if (child->next) word_dump_date (oc->conversion, child->next); ++ if (safe_printf(device, 0, oc->personality->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); ++ } ++ else if (!strcmp("\\printim", s)) { ++ if (safe_printf(device, 0, oc->personality->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); ++ printf("last printed: "); ++ if (child->next) word_dump_date (oc->conversion, child->next); ++ if (safe_printf(device, 0, oc->personality->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); ++ } ++ else if (!strcmp("\\buptim", s)) { ++ if (safe_printf(device, 0, oc->personality->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); ++ printf("last backup: "); ++ if (child->next) word_dump_date (oc->conversion, child->next); ++ if (safe_printf(device, 0, oc->personality->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); ++ } ++ else if (!strcmp("\\revtim", s)) { ++ if (safe_printf(device, 0, oc->personality->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); ++ printf("revision date: "); ++ if (child->next) word_dump_date (oc->conversion, child->next); ++ if (safe_printf(device, 0, oc->personality->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); ++ } ++ } + +- /* Irregardless of whether we're in inline mode, +- * we want to process the following. +- */ +- if (!strcmp("\\hlinkbase", s)) { +- char *linkstr = NULL; ++ /* Irregardless of whether we're in inline mode, ++ * we want to process the following. ++ */ ++ if (!strcmp("\\hlinkbase", s)) { ++ char *linkstr = NULL; + +- if (safe_printf(0, op->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); +- printf("hyperlink base: "); +- if (child->next) { +- Word *nextword = child->next; ++ if (safe_printf(device, 0, oc->personality->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); ++ printf("hyperlink base: "); ++ if (child->next) { ++ Word *nextword = child->next; + +- if (nextword) +- linkstr=word_string (nextword); +- } ++ if (nextword) ++ linkstr=word_string (oc->conversion, nextword); ++ } + +- if (linkstr) +- printf("%s", linkstr); +- else +- printf("(none)"); +- if (safe_printf(0, op->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); ++ if (linkstr) ++ printf("%s", linkstr); ++ else ++ printf("(none)"); ++ if (safe_printf(device, 0, oc->personality->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); + +- /* Store the pointer, it will remain good. */ +- hyperlink_base = linkstr; +- } +- } +- w = w->next; +- } ++ /* Store the pointer, it will remain good. */ ++ oc->conversion->hyperlink_base = linkstr; ++ } ++ } ++ w = w->next; ++ } + } + + /*-------------------------------------------------------------------*/ + +-/* RTF color table colors are RGB */ +- +-typedef struct { +- unsigned char r,g,b; +-} Color; +- +-#define MAX_COLORS (1024) +-static Color color_table[MAX_COLORS]; +-static int total_colors=0; +- +- + /*======================================================================== + * Name: process_color_table + * Purpose: Processes the color table of an RTF file. +@@ -1089,59 +1048,60 @@ static int total_colors=0; + *=======================================================================*/ + + void +-process_color_table (Word *w) ++process_color_table (const struct OutputContext *oc, Word *w) + { +- int r,g,b; ++ int r,g,b; ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; + +- CHECK_PARAM_NOT_NULL(w); ++ CHECK_PARAM_NOT_NULL(w); + +- /* Sometimes, RTF color tables begin with a semicolon, +- * i.e. an empty color entry. This seems to indicate that color 0 +- * will not be used, so here I set it to black. +- */ +- r=g=b=0; ++ /* Sometimes, RTF color tables begin with a semicolon, ++ * i.e. an empty color entry. This seems to indicate that color 0 ++ * will not be used, so here I set it to black. ++ */ ++ r=g=b=0; + +- while(w) { +- char *s = word_string (w); ++ while(w) { ++ char *s = word_string (oc->conversion, w); + +- if (!strncmp("\\red",s,4)) { +- r = atoi(&s[4]); +- while(r>255) r>>=8; +- } +- else if (!strncmp("\\green",s,6)) { +- g = atoi(&s[6]); +- while(g>255) g>>=8; +- } +- else if (!strncmp("\\blue",s,5)) { +- b = atoi(&s[5]); +- while(b>255) b>>=8; +- } +- else +- /* If we find the semicolon which denotes the end of +- * a color entry then store the color, even if we don't +- * have all of it. +- */ +- if (!strcmp (";", s)) { +- color_table[total_colors].r = r; +- color_table[total_colors].g = g; +- color_table[total_colors++].b = b; +- if (debug_mode) { +- if (safe_printf(0, op->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); +- printf("storing color entry %d: %02x%02x%02x", +- total_colors-1, r,g,b); +- if (safe_printf(0, op->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); +- } +- r=g=b=0; +- } ++ if (!strncmp("\\red",s,4)) { ++ r = atoi(&s[4]); ++ while(r>255) r>>=8; ++ } ++ else if (!strncmp("\\green",s,6)) { ++ g = atoi(&s[6]); ++ while(g>255) g>>=8; ++ } ++ else if (!strncmp("\\blue",s,5)) { ++ b = atoi(&s[5]); ++ while(b>255) b>>=8; ++ } ++ else ++ /* If we find the semicolon which denotes the end of ++ * a color entry then store the color, even if we don't ++ * have all of it. ++ */ ++ if (!strcmp (";", s)) { ++ oc->conversion->color_table[oc->conversion->total_colors].r = r; ++ oc->conversion->color_table[oc->conversion->total_colors].g = g; ++ oc->conversion->color_table[oc->conversion->total_colors++].b = b; ++ if (oc->conversion->options->debug_mode) { ++ if (safe_printf(device, 0, oc->personality->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); ++ printf("storing color entry %d: %02x%02x%02x", ++ oc->conversion->total_colors-1, r,g,b); ++ if (safe_printf(device, 0, oc->personality->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); ++ } ++ r=g=b=0; ++ } + +- w=w->next; +- } ++ w=w->next; ++ } + +- if (debug_mode) { +- if (safe_printf(0, op->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); +- printf("color table had %d entries -->\n", total_colors); +- if (safe_printf(0, op->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); +- } ++ if (oc->conversion->options->debug_mode) { ++ if (safe_printf(device, 0, oc->personality->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); ++ printf("color table had %d entries -->\n", oc->conversion->total_colors); ++ if (safe_printf(device, 0, oc->personality->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); ++ } + } + + /*======================================================================== +@@ -1152,21 +1112,21 @@ process_color_table (Word *w) + *=======================================================================*/ + + static int +-cmd_cf (Word *w, int align, char has_param, int num) { +- char str[40]; ++cmd_cf (const struct OutputContext *oc, Word *w, int align, char has_param, int num) { ++ char str[40]; + +- if (!has_param || num>=total_colors) { +- warning_handler ("font color change attempted is invalid"); +- } +- else +- { +- sprintf(str,"#%02x%02x%02x", +- color_table[num].r, +- color_table[num].g, +- color_table[num].b); +- attr_push(ATTR_FOREGROUND,str); +- } +- return FALSE; ++ if (!has_param || num>=oc->conversion->total_colors) { ++ warning_handler ("font color change attempted is invalid"); ++ } ++ else ++ { ++ sprintf(str,"#%02x%02x%02x", ++ oc->conversion->color_table[num].r, ++ oc->conversion->color_table[num].g, ++ oc->conversion->color_table[num].b); ++ attr_push(ATTR_FOREGROUND,str, oc); ++ } ++ return FALSE; + } + + +@@ -1179,21 +1139,21 @@ cmd_cf (Word *w, int align, char has_par + *=======================================================================*/ + + static int +-cmd_cb (Word *w, int align, char has_param, int num) { +- char str[40]; ++cmd_cb (const struct OutputContext *oc, Word *w, int align, char has_param, int num) { ++ char str[40]; + +- if (!has_param || num>=total_colors) { +- warning_handler ("font color change attempted is invalid"); +- } +- else +- { +- sprintf(str,"#%02x%02x%02x", +- color_table[num].r, +- color_table[num].g, +- color_table[num].b); +- attr_push(ATTR_BACKGROUND,str); +- } +- return FALSE; ++ if (!has_param || num>=oc->conversion->total_colors) { ++ warning_handler ("font color change attempted is invalid"); ++ } ++ else ++ { ++ sprintf(str,"#%02x%02x%02x", ++ oc->conversion->color_table[num].r, ++ oc->conversion->color_table[num].g, ++ oc->conversion->color_table[num].b); ++ attr_push(ATTR_BACKGROUND,str, oc); ++ } ++ return FALSE; + } + + +@@ -1204,18 +1164,18 @@ cmd_cb (Word *w, int align, char has_par + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + static int +-cmd_fs (Word *w, int align, char has_param, int points) { +- char str[20]; ++cmd_fs (const struct OutputContext *oc, Word *w, int align, char has_param, int points) { ++ char str[20]; + +- if (!has_param) return FALSE; ++ if (!has_param) return FALSE; + +- /* Note, fs20 means 10pt */ +- points /= 2; ++ /* Note, fs20 means 10pt */ ++ points /= 2; + +- sprintf(str,"%d",points); +- attr_push(ATTR_FONTSIZE,str); ++ sprintf(str,"%d",points); ++ attr_push(ATTR_FONTSIZE,str, oc); + +- return FALSE; ++ return FALSE; + } + + +@@ -1229,95 +1189,99 @@ cmd_fs (Word *w, int align, char has_par + *=======================================================================*/ + + static int +-cmd_field (Word *w, int align, char has_param, int num) { +- Word *child; ++cmd_field (const struct OutputContext *oc, Word *w, int align, char has_param, int num) { ++ Word *child; ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; + +- CHECK_PARAM_NOT_NULL(w); ++ CHECK_PARAM_NOT_NULL(w); + +- while(w) { +- child = w->child; +- if (child) { +- Word *w2; +- char *s; ++ while(w) { ++ child = w->child; ++ if (child) { ++ Word *w2; ++ char *s; + +- s = word_string(child); ++ s = word_string (oc->conversion, child); + #if 1 /* daved experimenting with fldrslt */ +- if(!strcmp("\\fldrslt", s)) +- return FALSE; ++ if(!strcmp("\\fldrslt", s)) ++ return FALSE; + #endif + + +- if (!strcmp("\\*", s)) +- { +- w2=child->next; +- while (w2) +- { +- char *s2 = word_string(w2); +- if (s2 && !strcmp("\\fldinst", s2)) +- { +- Word *w3; +- char *s; +- char *s4; +- Word *w4; +- w3=w2->next; +- s = word_string(w3); +- if (s && !strcmp(s, "SYMBOL") ) +- { +- w4=w3->next; +- while(w4 && !strcmp(word_string(w4), " ")) +- w4 = w4->next; +- s4 = word_string(w4); +- if (s4) +- { +- int char_num; +- char *string; +- my_iconv_t d; +- char_num = atoi(s4); ++ if (!strcmp("\\*", s)) ++ { ++ w2=child->next; ++ while (w2) ++ { ++ char *s2 = word_string (oc->conversion, w2); ++ if (s2 && !strcmp("\\fldinst", s2)) ++ { ++ Word *w3; ++ char *s; ++ char *s4; ++ Word *w4; ++ w3=w2->next; ++ s = word_string (oc->conversion, w3); ++ if (s && !strcmp(s, "SYMBOL") ) ++ { ++ w4=w3->next; ++ while(w4 && !strcmp(word_string (oc->conversion, w4), " ")) ++ w4 = w4->next; ++ s4 = word_string (oc->conversion, w4); ++ if (s4) ++ { ++ int char_num; ++ char *string; ++ my_iconv_t d, olddesc; ++ char_num = atoi(s4); + +- if (my_iconv_is_valid((d = my_iconv_open("utf8", FONT_SYMBOL)))) +- { +- string = op_translate_char (op, d, char_num); +- if (string != NULL) +- printf("%s", string); +- my_iconv_close(d); +- } +- else +- fprintf(stderr, "unrtf: Error in translation SYMBOL character\n"); +- } +- } +- while (w3 && !w3->child) { +- w3=w3->next; +- } +- if (w3) w3=w3->child; +- while (w3) +- { +- char *s3=word_string(w3); +- if (s3 && !strcmp("HYPERLINK",s3)) { +- Word *w4; +- char *s4; +- w4=w3->next; +- while (w4 && !strcmp(" ", word_string(w4))) +- w4=w4->next; +- if (w4) { +- s4=word_string(w4); +- if (safe_printf(0, op->hyperlink_begin)) fprintf(stderr, TOO_MANY_ARGS, "hyperlink_begin"); +- printf("%s", s4); +- if (safe_printf(0, op->hyperlink_end)) fprintf(stderr, TOO_MANY_ARGS, "hyperlink_end"); +- return TRUE; +- } ++ if (my_iconv_is_valid((d = my_iconv_open(oc->conversion, "utf8", FONT_SYMBOL)))) ++ { ++ olddesc = oc->conversion->desc; ++ oc->conversion->desc = d; ++ string = op_translate_char (oc->conversion, oc->personality/* , d */, char_num); ++ if (string != NULL) ++ printf("%s", string); ++ my_iconv_close(d); ++ oc->conversion->desc = olddesc; ++ } ++ else ++ fprintf(stderr, "unrtf: Error in translation SYMBOL character\n"); ++ } ++ } ++ while (w3 && !w3->child) { ++ w3=w3->next; ++ } ++ if (w3) w3=w3->child; ++ while (w3) ++ { ++ char *s3=word_string (oc->conversion, w3); ++ if (s3 && !strcmp("HYPERLINK",s3)) { ++ Word *w4; ++ char *s4; ++ w4=w3->next; ++ while (w4 && !strcmp(" ", word_string (oc->conversion, w4))) ++ w4=w4->next; ++ if (w4) { ++ s4=word_string (oc->conversion, w4); ++ if (safe_printf(device, 0, oc->personality->hyperlink_begin)) fprintf(stderr, TOO_MANY_ARGS, "hyperlink_begin"); ++ printf("%s", s4); ++ if (safe_printf(device, 0, oc->personality->hyperlink_end)) fprintf(stderr, TOO_MANY_ARGS, "hyperlink_end"); ++ return TRUE; ++ } + +- } +- w3=w3->next; +- } +- } +- w2 = w2->next; +- } ++ } ++ w3=w3->next; ++ } ++ } ++ w2 = w2->next; ++ } + +- } +- } +- w=w->next; +- } +- return TRUE; ++ } ++ } ++ w=w->next; ++ } ++ return TRUE; + } + + /*======================================================================== +@@ -1327,59 +1291,60 @@ cmd_field (Word *w, int align, char has_ + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + static int +-cmd_f (Word *w, int align, char has_param, int num) { +- char *name; ++cmd_f (const struct OutputContext *oc, Word *w, int align, char has_param, int num) { ++ char *name; ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; + +- /* no param exit early XX */ +- if (!has_param) +- return FALSE; ++ /* no param exit early XX */ ++ if (!has_param) ++ return FALSE; + +- name = lookup_fontname(num); +- if (!name) { +- if (safe_printf(0, op->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); +- printf("invalid font number %d",num); +- if (safe_printf(0, op->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); +- } else { +- if (op->fonttable_begin != NULL) +- { +- name = my_malloc(12); +- sprintf(name, "%d", num); +- } ++ name = lookup_fontname(oc->conversion, num); ++ if (!name) { ++ if (safe_printf(device, 0, oc->personality->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); ++ printf("invalid font number %d",num); ++ if (safe_printf(device, 0, oc->personality->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); ++ } else { ++ if (oc->personality->fonttable_begin != NULL) ++ { ++ name = my_malloc(12); ++ sprintf(name, "%d", num); ++ } + #if 1 /* daved 0.21.1 */ +- /* we are going to output entities, so should not output font */ +- if(strstr(name,"Symbol") == NULL) ++ /* we are going to output entities, so should not output font */ ++ if(strstr(name,"Symbol") == NULL) + #endif +- attr_push(ATTR_FONTFACE,name); +- if (strstr(name,"Symbol") != NULL) +- { +- if (!my_iconv_is_valid(desc2)) +- desc2 = desc; +- else +- my_iconv_close(desc); ++ attr_push(ATTR_FONTFACE,name, oc); ++ if (strstr(name,"Symbol") != NULL) ++ { ++ if (!my_iconv_is_valid(oc->conversion->desc2)) ++ oc->conversion->desc2 = oc->conversion->desc; ++ else ++ my_iconv_close(oc->conversion->desc); + +- desc = my_iconv_open("UTF-8", FONT_SYMBOL); +- } +- else if (strstr(name,"Greek") != NULL) +- { +- if (!my_iconv_is_valid(desc2)) +- desc2 = desc; +- else +- my_iconv_close(desc); ++ oc->conversion->desc = my_iconv_open(oc->conversion, "UTF-8", FONT_SYMBOL); ++ } ++ else if (strstr(name,"Greek") != NULL) ++ { ++ if (!my_iconv_is_valid(oc->conversion->desc2)) ++ oc->conversion->desc2 = oc->conversion->desc; ++ else ++ my_iconv_close(oc->conversion->desc); + +- desc = my_iconv_open("UTF-8", FONT_GREEK); +- } +- else +- { +- if (my_iconv_is_valid(desc2)) +- { +- desc = my_iconv_close(desc); +- desc = desc2; +- my_iconv_t_make_invalid(&desc2); +- } +- } +- } ++ oc->conversion->desc = my_iconv_open(oc->conversion, "UTF-8", FONT_GREEK); ++ } ++ else ++ { ++ if (my_iconv_is_valid(oc->conversion->desc2)) ++ { ++ oc->conversion->desc = my_iconv_close(oc->conversion->desc); ++ oc->conversion->desc = oc->conversion->desc2; ++ my_iconv_t_make_invalid(&oc->conversion->desc2); ++ } ++ } ++ } + +- return FALSE; ++ return FALSE; + } + + +@@ -1391,22 +1356,22 @@ cmd_f (Word *w, int align, char has_para + *=======================================================================*/ + + static int +-cmd_highlight (Word *w, int align, char has_param, int num) ++cmd_highlight (const struct OutputContext *oc, Word *w, int align, char has_param, int num) + { +- char str[40]; ++ char str[40]; + +- if (!has_param || num>=total_colors) { +- warning_handler ("font background color change attempted is invalid"); +- } +- else +- { +- sprintf(str,"#%02x%02x%02x", +- color_table[num].r, +- color_table[num].g, +- color_table[num].b); +- attr_push(ATTR_BACKGROUND,str); +- } +- return FALSE; ++ if (!has_param || num>=oc->conversion->total_colors) { ++ warning_handler ("font background color change attempted is invalid"); ++ } ++ else ++ { ++ sprintf(str,"#%02x%02x%02x", ++ oc->conversion->color_table[num].r, ++ oc->conversion->color_table[num].g, ++ oc->conversion->color_table[num].b); ++ attr_push(ATTR_BACKGROUND,str, oc); ++ } ++ return FALSE; + } + + +@@ -1419,22 +1384,24 @@ cmd_highlight (Word *w, int align, char + *=======================================================================*/ + + static int +-cmd_tab (Word *w, int align, char has_param, int param) ++cmd_tab (const struct OutputContext *oc, Word *w, int align, char has_param, int param) + { +- /* Tab presents a genuine problem +- * since some output formats don't have +- * an equivalent. As a kludge fix, I shall +- * assume the font is fixed width and that +- * the tabstops are 8 characters apart. +- */ +- int need= 8-(total_chars_this_line%8); +- total_chars_this_line += need; +- while(need>0) { +- if (safe_printf(0, op->forced_space)) fprintf(stderr, TOO_MANY_ARGS, "forced_space"); +- need--; +- } +- printf("\n"); +- return FALSE; ++ /* Tab presents a genuine problem ++ * since some output formats don't have ++ * an equivalent. As a kludge fix, I shall ++ * assume the font is fixed width and that ++ * the tabstops are 8 characters apart. ++ */ ++ int need= 8-(oc->conversion->total_chars_this_line%8); ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; ++ ++ oc->conversion->total_chars_this_line += need; ++ while(need>0) { ++ if (safe_printf(device, 0, oc->personality->forced_space)) fprintf(stderr, TOO_MANY_ARGS, "forced_space"); ++ need--; ++ } ++ printf("\n"); ++ return FALSE; + } + + +@@ -1446,9 +1413,9 @@ cmd_tab (Word *w, int align, char has_pa + *=======================================================================*/ + + static int +-cmd_plain (Word *w, int align, char has_param, int param) { +- attr_pop_all(); +- return FALSE; ++cmd_plain (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ attr_pop_all(oc); ++ return FALSE; + } + + +@@ -1459,9 +1426,9 @@ cmd_plain (Word *w, int align, char has_ + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + static int +-cmd_fnil (Word *w, int align, char has_param, int param) { +- attr_push(ATTR_FONTFACE,FONTNIL_STR); +- return FALSE; ++cmd_fnil (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ attr_push(ATTR_FONTFACE,FONTNIL_STR, oc); ++ return FALSE; + } + + +@@ -1473,9 +1440,9 @@ cmd_fnil (Word *w, int align, char has_p + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + static int +-cmd_froman (Word *w, int align, char has_param, int param) { +- attr_push(ATTR_FONTFACE,FONTROMAN_STR); +- return FALSE; ++cmd_froman (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ attr_push(ATTR_FONTFACE,FONTROMAN_STR, oc); ++ return FALSE; + } + + +@@ -1487,9 +1454,9 @@ cmd_froman (Word *w, int align, char has + *=======================================================================*/ + + static int +-cmd_fswiss (Word *w, int align, char has_param, int param) { +- attr_push(ATTR_FONTFACE,FONTSWISS_STR); +- return FALSE; ++cmd_fswiss (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ attr_push(ATTR_FONTFACE,FONTSWISS_STR, oc); ++ return FALSE; + } + + +@@ -1501,9 +1468,9 @@ cmd_fswiss (Word *w, int align, char has + *=======================================================================*/ + + static int +-cmd_fmodern (Word *w, int align, char has_param, int param) { +- attr_push(ATTR_FONTFACE,FONTMODERN_STR); +- return FALSE; ++cmd_fmodern (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ attr_push(ATTR_FONTFACE,FONTMODERN_STR, oc); ++ return FALSE; + } + + +@@ -1515,9 +1482,9 @@ cmd_fmodern (Word *w, int align, char ha + *=======================================================================*/ + + static int +-cmd_fscript (Word *w, int align, char has_param, int param) { +- attr_push(ATTR_FONTFACE,FONTSCRIPT_STR); +- return FALSE; ++cmd_fscript (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ attr_push(ATTR_FONTFACE,FONTSCRIPT_STR, oc); ++ return FALSE; + } + + /*======================================================================== +@@ -1528,9 +1495,9 @@ cmd_fscript (Word *w, int align, char ha + *=======================================================================*/ + + static int +-cmd_fdecor (Word *w, int align, char has_param, int param) { +- attr_push(ATTR_FONTFACE,FONTDECOR_STR); +- return FALSE; ++cmd_fdecor (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ attr_push(ATTR_FONTFACE,FONTDECOR_STR, oc); ++ return FALSE; + } + + /*======================================================================== +@@ -1541,9 +1508,9 @@ cmd_fdecor (Word *w, int align, char has + *=======================================================================*/ + + static int +-cmd_ftech (Word *w, int align, char has_param, int param) { +- attr_push(ATTR_FONTFACE,FONTTECH_STR); +- return FALSE; ++cmd_ftech (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ attr_push(ATTR_FONTFACE,FONTTECH_STR, oc); ++ return FALSE; + } + + /*======================================================================== +@@ -1554,16 +1521,16 @@ cmd_ftech (Word *w, int align, char has_ + *=======================================================================*/ + + static int +-cmd_expand (Word *w, int align, char has_param, int param) { +- char str[10]; +- if (has_param) { +- sprintf(str, "%d", param/4); +- if (!param) +- attr_pop(ATTR_EXPAND); +- else +- attr_push(ATTR_EXPAND, str); +- } +- return FALSE; ++cmd_expand (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ char str[10]; ++ if (has_param) { ++ sprintf(str, "%d", param/4); ++ if (!param) ++ attr_pop(ATTR_EXPAND, oc); ++ else ++ attr_push(ATTR_EXPAND, str, oc); ++ } ++ return FALSE; + } + + +@@ -1575,16 +1542,16 @@ cmd_expand (Word *w, int align, char has + *=======================================================================*/ + + static int +-cmd_emboss (Word *w, int align, char has_param, int param) { +- char str[10]; +- if (has_param && !param) +- attr_pop(ATTR_EMBOSS); +- else +- { +- sprintf(str, "%d", param); +- attr_push(ATTR_EMBOSS, str); +- } +- return FALSE; ++cmd_emboss (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ char str[10]; ++ if (has_param && !param) ++ attr_pop(ATTR_EMBOSS, oc); ++ else ++ { ++ sprintf(str, "%d", param); ++ attr_push(ATTR_EMBOSS, str, oc); ++ } ++ return FALSE; + } + + +@@ -1596,16 +1563,16 @@ cmd_emboss (Word *w, int align, char has + *=======================================================================*/ + + static int +-cmd_engrave (Word *w, int align, char has_param, int param) { +- char str[10]; +- if (has_param && !param) +- attr_pop(ATTR_ENGRAVE); +- else +- { +- sprintf(str, "%d", param); +- attr_push(ATTR_ENGRAVE, str); +- } +- return FALSE; ++cmd_engrave (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ char str[10]; ++ if (has_param && !param) ++ attr_pop(ATTR_ENGRAVE, oc); ++ else ++ { ++ sprintf(str, "%d", param); ++ attr_push(ATTR_ENGRAVE, str, oc); ++ } ++ return FALSE; + } + + /*======================================================================== +@@ -1616,12 +1583,12 @@ cmd_engrave (Word *w, int align, char ha + *=======================================================================*/ + + static int +-cmd_caps (Word *w, int align, char has_param, int param) { +- if (has_param && !param) +- attr_pop(ATTR_CAPS); +- else +- attr_push(ATTR_CAPS,NULL); +- return FALSE; ++cmd_caps (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ if (has_param && !param) ++ attr_pop(ATTR_CAPS, oc); ++ else ++ attr_push(ATTR_CAPS,NULL, oc); ++ return FALSE; + } + + +@@ -1632,12 +1599,12 @@ cmd_caps (Word *w, int align, char has_p + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + static int +-cmd_scaps (Word *w, int align, char has_param, int param) { +- if (has_param && !param) +- attr_pop(ATTR_SMALLCAPS); +- else +- attr_push(ATTR_SMALLCAPS,NULL); +- return FALSE; ++cmd_scaps (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ if (has_param && !param) ++ attr_pop(ATTR_SMALLCAPS, oc); ++ else ++ attr_push(ATTR_SMALLCAPS,NULL, oc); ++ return FALSE; + } + + +@@ -1648,12 +1615,14 @@ cmd_scaps (Word *w, int align, char has_ + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + static int +-cmd_bullet (Word *w, int align, char has_param, int param) { +- if (op->chars.bullet) { +- if (safe_printf(0, op->chars.bullet)) fprintf(stderr, TOO_MANY_ARGS, "chars.bullet"); +- ++total_chars_this_line; /* \tab */ +- } +- return FALSE; ++cmd_bullet (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; ++ ++ if (oc->personality->chars.bullet) { ++ if (safe_printf(device, 0, oc->personality->chars.bullet)) fprintf(stderr, TOO_MANY_ARGS, "chars.bullet"); ++ ++oc->conversion->total_chars_this_line; /* \tab */ ++ } ++ return FALSE; + } + + /*======================================================================== +@@ -1663,12 +1632,14 @@ cmd_bullet (Word *w, int align, char has + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + static int +-cmd_ldblquote (Word *w, int align, char has_param, int param) { +- if (op->chars.left_dbl_quote) { +- if (safe_printf(0, op->chars.left_dbl_quote)) fprintf(stderr, TOO_MANY_ARGS, "chars.left_dbl_quote"); +- ++total_chars_this_line; /* \tab */ +- } +- return FALSE; ++cmd_ldblquote (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; ++ ++ if (oc->personality->chars.left_dbl_quote) { ++ if (safe_printf(device, 0, oc->personality->chars.left_dbl_quote)) fprintf(stderr, TOO_MANY_ARGS, "chars.left_dbl_quote"); ++ ++oc->conversion->total_chars_this_line; /* \tab */ ++ } ++ return FALSE; + } + + +@@ -1680,12 +1651,14 @@ cmd_ldblquote (Word *w, int align, char + *=======================================================================*/ + + static int +-cmd_rdblquote (Word *w, int align, char has_param, int param) { +- if (op->chars.right_dbl_quote) { +- if (safe_printf(0, op->chars.right_dbl_quote)) fprintf(stderr, TOO_MANY_ARGS, "chars.right_dbl_quote"); +- ++total_chars_this_line; /* \tab */ +- } +- return FALSE; ++cmd_rdblquote (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; ++ ++ if (oc->personality->chars.right_dbl_quote) { ++ if (safe_printf(device, 0, oc->personality->chars.right_dbl_quote)) fprintf(stderr, TOO_MANY_ARGS, "chars.right_dbl_quote"); ++ ++oc->conversion->total_chars_this_line; /* \tab */ ++ } ++ return FALSE; + } + + +@@ -1696,12 +1669,14 @@ cmd_rdblquote (Word *w, int align, char + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + static int +-cmd_lquote (Word *w, int align, char has_param, int param) { +- if (op->chars.left_quote) { +- if (safe_printf(0, op->chars.left_quote)) fprintf(stderr, TOO_MANY_ARGS, "chars.left_quote"); +- ++total_chars_this_line; /* \tab */ +- } +- return FALSE; ++cmd_lquote (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; ++ ++ if (oc->personality->chars.left_quote) { ++ if (safe_printf(device, 0, oc->personality->chars.left_quote)) fprintf(stderr, TOO_MANY_ARGS, "chars.left_quote"); ++ ++oc->conversion->total_chars_this_line; /* \tab */ ++ } ++ return FALSE; + } + + +@@ -1713,12 +1688,14 @@ cmd_lquote (Word *w, int align, char has + *=======================================================================*/ + + static int +-cmd_nonbreaking_space (Word *w, int align, char has_param, int param) { +- if (op->chars.nonbreaking_space) { +- if (safe_printf(0, op->chars.nonbreaking_space)) fprintf(stderr, TOO_MANY_ARGS, "chars.nonbreaking_space"); +- ++total_chars_this_line; /* \tab */ +- } +- return FALSE; ++cmd_nonbreaking_space (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; ++ ++ if (oc->personality->chars.nonbreaking_space) { ++ if (safe_printf(device, 0, oc->personality->chars.nonbreaking_space)) fprintf(stderr, TOO_MANY_ARGS, "chars.nonbreaking_space"); ++ ++oc->conversion->total_chars_this_line; /* \tab */ ++ } ++ return FALSE; + } + + +@@ -1730,12 +1707,14 @@ cmd_nonbreaking_space (Word *w, int alig + *=======================================================================*/ + + static int +-cmd_nonbreaking_hyphen (Word *w, int align, char has_param, int param) { +- if (op->chars.nonbreaking_hyphen) { +- if (safe_printf(0, op->chars.nonbreaking_hyphen)) fprintf(stderr, TOO_MANY_ARGS, "chars.nonbreaking_hyphen"); +- ++total_chars_this_line; /* \tab */ +- } +- return FALSE; ++cmd_nonbreaking_hyphen (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; ++ ++ if (oc->personality->chars.nonbreaking_hyphen) { ++ if (safe_printf(device, 0, oc->personality->chars.nonbreaking_hyphen)) fprintf(stderr, TOO_MANY_ARGS, "chars.nonbreaking_hyphen"); ++ ++oc->conversion->total_chars_this_line; /* \tab */ ++ } ++ return FALSE; + } + + +@@ -1747,12 +1726,14 @@ cmd_nonbreaking_hyphen (Word *w, int ali + *=======================================================================*/ + + static int +-cmd_optional_hyphen (Word *w, int align, char has_param, int param) { +- if (op->chars.optional_hyphen) { +- if (safe_printf(0, op->chars.optional_hyphen)) fprintf(stderr, TOO_MANY_ARGS, "chars.optional_hyphen"); +- ++total_chars_this_line; /* \tab */ +- } +- return FALSE; ++cmd_optional_hyphen (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; ++ ++ if (oc->personality->chars.optional_hyphen) { ++ if (safe_printf(device, 0, oc->personality->chars.optional_hyphen)) fprintf(stderr, TOO_MANY_ARGS, "chars.optional_hyphen"); ++ ++oc->conversion->total_chars_this_line; /* \tab */ ++ } ++ return FALSE; + } + + +@@ -1763,12 +1744,14 @@ cmd_optional_hyphen (Word *w, int align, + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + static int +-cmd_emdash (Word *w, int align, char has_param, int param) { +- if (op->chars.emdash) { +- if (safe_printf(0, op->chars.emdash)) fprintf(stderr, TOO_MANY_ARGS, "chars.emdash"); +- ++total_chars_this_line; /* \tab */ +- } +- return FALSE; ++cmd_emdash (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; ++ ++ if (oc->personality->chars.emdash) { ++ if (safe_printf(device, 0, oc->personality->chars.emdash)) fprintf(stderr, TOO_MANY_ARGS, "chars.emdash"); ++ ++oc->conversion->total_chars_this_line; /* \tab */ ++ } ++ return FALSE; + } + + +@@ -1780,12 +1763,14 @@ cmd_emdash (Word *w, int align, char has + *=======================================================================*/ + + static int +-cmd_endash (Word *w, int align, char has_param, int param) { +- if (op->chars.endash) { +- if (safe_printf(0, op->chars.endash)) fprintf(stderr, TOO_MANY_ARGS, "chars.endash"); +- ++total_chars_this_line; /* \tab */ +- } +- return FALSE; ++cmd_endash (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; ++ ++ if (oc->personality->chars.endash) { ++ if (safe_printf(device, 0, oc->personality->chars.endash)) fprintf(stderr, TOO_MANY_ARGS, "chars.endash"); ++ ++oc->conversion->total_chars_this_line; /* \tab */ ++ } ++ return FALSE; + } + + +@@ -1797,12 +1782,14 @@ cmd_endash (Word *w, int align, char has + *=======================================================================*/ + + static int +-cmd_rquote (Word *w, int align, char has_param, int param) { +- if (op->chars.right_quote) { +- if (safe_printf(0, op->chars.right_quote)) fprintf(stderr, TOO_MANY_ARGS, "chars.right_quote"); +- ++total_chars_this_line; /* \tab */ +- } +- return FALSE; ++cmd_rquote (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; ++ ++ if (oc->personality->chars.right_quote) { ++ if (safe_printf(device, 0, oc->personality->chars.right_quote)) fprintf(stderr, TOO_MANY_ARGS, "chars.right_quote"); ++ ++oc->conversion->total_chars_this_line; /* \tab */ ++ } ++ return FALSE; + } + + +@@ -1813,12 +1800,14 @@ cmd_rquote (Word *w, int align, char has + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + static int +-cmd_par (Word *w, int align, char has_param, int param) { +- if (op->line_break) { +- if (safe_printf(0, op->line_break)) fprintf(stderr, TOO_MANY_ARGS, "line_break"); +- total_chars_this_line = 0; /* \tab */ +- } +- return FALSE; ++cmd_par (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; ++ ++ if (oc->personality->line_break) { ++ if (safe_printf(device, 0, oc->personality->line_break)) fprintf(stderr, TOO_MANY_ARGS, "line_break"); ++ oc->conversion->total_chars_this_line = 0; /* \tab */ ++ } ++ return FALSE; + } + + +@@ -1830,12 +1819,14 @@ cmd_par (Word *w, int align, char has_pa + *=======================================================================*/ + + static int +-cmd_line (Word *w, int align, char has_param, int param) { +- if (op->line_break) { +- if (safe_printf(0, op->line_break)) fprintf(stderr, TOO_MANY_ARGS, "line_break"); +- total_chars_this_line = 0; /* \tab */ +- } +- return FALSE; ++cmd_line (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; ++ ++ if (oc->personality->line_break) { ++ if (safe_printf(device, 0, oc->personality->line_break)) fprintf(stderr, TOO_MANY_ARGS, "line_break"); ++ oc->conversion->total_chars_this_line = 0; /* \tab */ ++ } ++ return FALSE; + } + + +@@ -1846,12 +1837,14 @@ cmd_line (Word *w, int align, char has_p + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_page (Word *w, int align, char has_param, int param) { +- if (op->page_break) { +- if (safe_printf(0, op->page_break)) fprintf(stderr, TOO_MANY_ARGS, "page_break"); +- total_chars_this_line = 0; /* \tab */ +- } +- return FALSE; ++static int cmd_page (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; ++ ++ if (oc->personality->page_break) { ++ if (safe_printf(device, 0, oc->personality->page_break)) fprintf(stderr, TOO_MANY_ARGS, "page_break"); ++ oc->conversion->total_chars_this_line = 0; /* \tab */ ++ } ++ return FALSE; + } + + +@@ -1862,9 +1855,9 @@ static int cmd_page (Word *w, int align, + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_intbl (Word *w, int align, char has_param, int param) { +- ++coming_pars_that_are_tabular; +- return FALSE; ++static int cmd_intbl (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ ++oc->conversion->coming_pars_that_are_tabular; ++ return FALSE; + } + + +@@ -1875,31 +1868,31 @@ static int cmd_intbl (Word *w, int align + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_ulnone (Word *w, int align, char has_param, int param) { +- int attr, more=TRUE; +- ++static int cmd_ulnone (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ int attr, more=TRUE; ++ + #ifdef BINARY_ATTRS +- attr_remove_underlining()) fprintf(stderr, TOO_MANY_ARGS, ); ++ attr_remove_underlining() fprintf(stderr, TOO_MANY_ARGS, ); + #else +- do { +- attr = attr_read(); +- if (attr==ATTR_UNDERLINE || +- attr==ATTR_DOT_UL || +- attr==ATTR_DASH_UL || +- attr==ATTR_DOT_DASH_UL || +- attr==ATTR_2DOT_DASH_UL || +- attr==ATTR_WORD_UL || +- attr==ATTR_WAVE_UL || +- attr==ATTR_THICK_UL || +- attr==ATTR_DOUBLE_UL) +- { +- if (!attr_pop(ATTR_UNDERLINE)) +- ; +- } else +- more=FALSE; +- } while(more); ++ do { ++ attr = attr_read(oc->conversion); ++ if (attr==ATTR_UNDERLINE || ++ attr==ATTR_DOT_UL || ++ attr==ATTR_DASH_UL || ++ attr==ATTR_DOT_DASH_UL || ++ attr==ATTR_2DOT_DASH_UL || ++ attr==ATTR_WORD_UL || ++ attr==ATTR_WAVE_UL || ++ attr==ATTR_THICK_UL || ++ attr==ATTR_DOUBLE_UL) ++ { ++ if (!attr_pop(ATTR_UNDERLINE, oc)) ++ ; ++ } else ++ more=FALSE; ++ } while(more); + #endif +- return FALSE; ++ return FALSE; + } + + /*======================================================================== +@@ -1909,13 +1902,13 @@ static int cmd_ulnone (Word *w, int alig + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_ul (Word *w, int align, char has_param, int param) { +- if (has_param && param == 0) { +- cmd_ulnone(w, align, has_param, param); +- } else { +- attr_push(ATTR_UNDERLINE, NULL); +- } +- return FALSE; ++static int cmd_ul (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ if (has_param && param == 0) { ++ cmd_ulnone(oc, w, align, has_param, param); ++ } else { ++ attr_push(ATTR_UNDERLINE, NULL, oc); ++ } ++ return FALSE; + } + + /*======================================================================== +@@ -1925,9 +1918,9 @@ static int cmd_ul (Word *w, int align, c + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_uld (Word *w, int align, char has_param, int param) { +- attr_push(ATTR_DOUBLE_UL, NULL); +- return FALSE; ++static int cmd_uld (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ attr_push(ATTR_DOUBLE_UL, NULL, oc); ++ return FALSE; + } + + /*======================================================================== +@@ -1937,9 +1930,9 @@ static int cmd_uld (Word *w, int align, + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_uldb (Word *w, int align, char has_param, int param) { +- attr_push(ATTR_DOT_UL, NULL); +- return FALSE; ++static int cmd_uldb (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ attr_push(ATTR_DOT_UL, NULL, oc); ++ return FALSE; + } + + +@@ -1950,9 +1943,9 @@ static int cmd_uldb (Word *w, int align, + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_uldash (Word *w, int align, char has_param, int param) { +- attr_push(ATTR_DASH_UL, NULL); +- return FALSE; ++static int cmd_uldash (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ attr_push(ATTR_DASH_UL, NULL, oc); ++ return FALSE; + } + + +@@ -1963,9 +1956,9 @@ static int cmd_uldash (Word *w, int alig + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_uldashd (Word *w, int align, char has_param, int param) { +- attr_push(ATTR_DOT_DASH_UL,NULL); +- return FALSE; ++static int cmd_uldashd (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ attr_push(ATTR_DOT_DASH_UL,NULL, oc); ++ return FALSE; + } + + +@@ -1976,9 +1969,9 @@ static int cmd_uldashd (Word *w, int ali + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_uldashdd (Word *w, int align, char has_param, int param) { +- attr_push(ATTR_2DOT_DASH_UL,NULL); +- return FALSE; ++static int cmd_uldashdd (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ attr_push(ATTR_2DOT_DASH_UL,NULL, oc); ++ return FALSE; + } + + +@@ -1989,9 +1982,9 @@ static int cmd_uldashdd (Word *w, int al + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_ulw (Word *w, int align, char has_param, int param) { +- attr_push(ATTR_WORD_UL,NULL); +- return FALSE; ++static int cmd_ulw (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ attr_push(ATTR_WORD_UL,NULL, oc); ++ return FALSE; + } + + +@@ -2002,9 +1995,9 @@ static int cmd_ulw (Word *w, int align, + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_ulth (Word *w, int align, char has_param, int param) { +- attr_push(ATTR_THICK_UL,NULL); +- return FALSE; ++static int cmd_ulth (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ attr_push(ATTR_THICK_UL,NULL, oc); ++ return FALSE; + } + + +@@ -2015,9 +2008,9 @@ static int cmd_ulth (Word *w, int align, + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_ulthd (Word *w, int align, char has_param, int param) { +- attr_push(ATTR_THICK_UL, NULL); +- return FALSE; ++static int cmd_ulthd (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ attr_push(ATTR_THICK_UL, NULL, oc); ++ return FALSE; + } + + +@@ -2028,9 +2021,9 @@ static int cmd_ulthd (Word *w, int align + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_ulthdash (Word *w, int align, char has_param, int param) { +- attr_push(ATTR_THICK_UL, NULL); +- return FALSE; ++static int cmd_ulthdash (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ attr_push(ATTR_THICK_UL, NULL, oc); ++ return FALSE; + } + + +@@ -2041,9 +2034,9 @@ static int cmd_ulthdash (Word *w, int al + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_ulwave (Word *w, int align, char has_param, int param) { +- attr_push(ATTR_WAVE_UL,NULL); +- return FALSE; ++static int cmd_ulwave (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ attr_push(ATTR_WAVE_UL,NULL, oc); ++ return FALSE; + } + + +@@ -2054,12 +2047,12 @@ static int cmd_ulwave (Word *w, int alig + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_strike (Word *w, int align, char has_param, int param) { +- if (has_param && param==0) +- attr_pop(ATTR_STRIKE); +- else +- attr_push(ATTR_STRIKE,NULL); +- return FALSE; ++static int cmd_strike (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ if (has_param && param==0) ++ attr_pop(ATTR_STRIKE, oc); ++ else ++ attr_push(ATTR_STRIKE,NULL, oc); ++ return FALSE; + } + + /*======================================================================== +@@ -2069,12 +2062,12 @@ static int cmd_strike (Word *w, int alig + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_strikedl (Word *w, int align, char has_param, int param) { +- if (has_param && param==0) +- attr_pop(ATTR_DBL_STRIKE); +- else +- attr_push(ATTR_DBL_STRIKE,NULL); +- return FALSE; ++static int cmd_strikedl (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ if (has_param && param==0) ++ attr_pop(ATTR_DBL_STRIKE, oc); ++ else ++ attr_push(ATTR_DBL_STRIKE,NULL, oc); ++ return FALSE; + } + + +@@ -2085,12 +2078,12 @@ static int cmd_strikedl (Word *w, int al + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_striked (Word *w, int align, char has_param, int param) { +- if (has_param && param==0) +- attr_pop(ATTR_DBL_STRIKE); +- else +- attr_push(ATTR_DBL_STRIKE,NULL); +- return FALSE; ++static int cmd_striked (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ if (has_param && param==0) ++ attr_pop(ATTR_DBL_STRIKE, oc); ++ else ++ attr_push(ATTR_DBL_STRIKE,NULL, oc); ++ return FALSE; + } + + +@@ -2101,8 +2094,8 @@ static int cmd_striked (Word *w, int ali + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_rtf (Word *w, int align, char has_param, int param) { +- return FALSE; ++static int cmd_rtf (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ return FALSE; + } + + +@@ -2113,12 +2106,12 @@ static int cmd_rtf (Word *w, int align, + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_up (Word *w, int align, char has_param, int param) { +- if (has_param && param==0) +- attr_pop(ATTR_SUPER); +- else +- attr_push(ATTR_SUPER,NULL); +- return FALSE; ++static int cmd_up (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ if (has_param && param==0) ++ attr_pop(ATTR_SUPER, oc); ++ else ++ attr_push(ATTR_SUPER,NULL, oc); ++ return FALSE; + } + + /*======================================================================== +@@ -2128,61 +2121,63 @@ static int cmd_up (Word *w, int align, c + * Returns: Flag, always false + *=======================================================================*/ + +-static int cmd_u (Word *w, int align, char has_param, int param) { +-/* TODO: Unicode characters won't be correctly preprocessed if sizeof(int) < 4 +- * and document have unicode character which value is greater than 65536 +- */ ++static int cmd_u (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ /* TODO: Unicode characters won't be correctly preprocessed if sizeof(int) < 4 ++ * and document have unicode character which value is greater than 65536 ++ */ + +- short done=0; +- long unicode_number = (long) param; /* On 16bit architectures int is too small to store unicode characters. - AF */ +- char tmp[12]; /* Number of characters that can be in int type (including '\0'). If int size is greater than 4 bytes change this value. - AF */ +- char *alias; ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; ++ short done=0; ++ long unicode_number = (long) param; /* On 16bit architectures int is too small to store unicode characters. - AF */ ++ char tmp[12]; /* Number of characters that can be in int type (including '\0'). If int size is greater than 4 bytes change this value. - AF */ ++ char *alias; + #if DEBUG +- char *str; +- if (has_param == TRUE) +- { +- fprintf(stderr,"param is %d (x%x) (0%o)\n", param, +- param, param); +- } +- if (w->hash_index) +- { +- str=hash_get_string (w->hash_index); +- fprintf(stderr,"string is %s\n", str); +- } ++ char *str; ++ ++ if (has_param == TRUE) ++ { ++ fprintf(stderr,"param is %d (x%x) (0%o)\n", param, ++ param, param); ++ } ++ if (w->hash_index) ++ { ++ str=hash_get_string (w->hash_index); ++ fprintf(stderr,"string is %s\n", str); ++ } + #endif +- /* 0.20.3 - daved added missing function call for unprocessed chars */ +- if ((alias = get_alias(op, param)) != NULL) +- { +- printf("%s", alias); +- done++; +- } +- else +- if(!done && op->unisymbol_print) +- { +- if (unicode_number < 0) +- { ++ /* 0.20.3 - daved added missing function call for unprocessed chars */ ++ if ((alias = get_alias(oc->personality, param)) != NULL) ++ { ++ printf("%s", alias); ++ done++; ++ } ++ else ++ if(!done && oc->personality->unisymbol_print) ++ { ++ if (unicode_number < 0) ++ { + #if DEBUG +- fprintf(stderr, "Invalid unicode character number accured: %ld\n", unicode_number); ++ fprintf(stderr, "Invalid unicode character number accured: %ld\n", unicode_number); + #endif +- unicode_number += 65536; ++ unicode_number += 65536; + #if DEBUG +- fprintf(stderr, "Assumes it should be: %ld\n", unicode_number); ++ fprintf(stderr, "Assumes it should be: %ld\n", unicode_number); + #endif +- } +- sprintf(tmp, "%ld", unicode_number); +- +- if (safe_printf(1, op->unisymbol_print, tmp)) fprintf(stderr, TOO_MANY_ARGS, "unisymbol_print"); +- done++; +- } +- +- /* +- ** if we know how to represent the unicode character in the +- ** output language, we need to skip the next word, otherwise +- ** we will output that alternative. +- */ +- if (done) +- return(SKIP_ONE_WORD); +- return(FALSE); ++ } ++ sprintf(tmp, "%ld", unicode_number); ++ ++ if (safe_printf(device, 1, oc->personality->unisymbol_print, tmp)) fprintf(stderr, TOO_MANY_ARGS, "unisymbol_print"); ++ done++; ++ } ++ ++ /* ++ ** if we know how to represent the unicode character in the ++ ** output language, we need to skip the next word, otherwise ++ ** we will output that alternative. ++ */ ++ if (done) ++ return(SKIP_ONE_WORD); ++ return(FALSE); + } + + /*======================================================================== +@@ -2192,12 +2187,12 @@ static int cmd_u (Word *w, int align, ch + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_dn (Word *w, int align, char has_param, int param) { +- if (has_param && param==0) +- attr_pop(ATTR_SUB); +- else +- attr_push(ATTR_SUB,NULL); +- return FALSE; ++static int cmd_dn (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ if (has_param && param==0) ++ attr_pop(ATTR_SUB, oc); ++ else ++ attr_push(ATTR_SUB,NULL, oc); ++ return FALSE; + } + + /*======================================================================== +@@ -2207,10 +2202,10 @@ static int cmd_dn (Word *w, int align, c + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_nosupersub (Word *w, int align, char has_param, int param) { +- attr_pop(ATTR_SUPER); +- attr_pop(ATTR_SUB); +- return FALSE; ++static int cmd_nosupersub (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ attr_pop(ATTR_SUPER, oc); ++ attr_pop(ATTR_SUB, oc); ++ return FALSE; + } + + /*======================================================================== +@@ -2220,12 +2215,12 @@ static int cmd_nosupersub (Word *w, int + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_super (Word *w, int align, char has_param, int param) { +- if (has_param && param==0) +- attr_pop(ATTR_SUPER); +- else +- attr_push(ATTR_SUPER,NULL); +- return FALSE; ++static int cmd_super (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ if (has_param && param==0) ++ attr_pop(ATTR_SUPER, oc); ++ else ++ attr_push(ATTR_SUPER,NULL, oc); ++ return FALSE; + } + + /*======================================================================== +@@ -2235,12 +2230,12 @@ static int cmd_super (Word *w, int align + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_sub (Word *w, int align, char has_param, int param) { +- if (has_param && param==0) +- attr_pop(ATTR_SUB); +- else +- attr_push(ATTR_SUB,NULL); +- return FALSE; ++static int cmd_sub (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ if (has_param && param==0) ++ attr_pop(ATTR_SUB, oc); ++ else ++ attr_push(ATTR_SUB,NULL, oc); ++ return FALSE; + } + + /*======================================================================== +@@ -2250,12 +2245,12 @@ static int cmd_sub (Word *w, int align, + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_shad (Word *w, int align, char has_param, int param) { +- if (has_param && param==0) +- attr_pop(ATTR_SHADOW); +- else +- attr_push(ATTR_SHADOW,NULL); +- return FALSE; ++static int cmd_shad (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ if (has_param && param==0) ++ attr_pop(ATTR_SHADOW, oc); ++ else ++ attr_push(ATTR_SHADOW,NULL, oc); ++ return FALSE; + } + + /*======================================================================== +@@ -2266,13 +2261,13 @@ static int cmd_shad (Word *w, int align, + *=======================================================================*/ + + static int +-cmd_b (Word *w, int align, char has_param, int param) { +- if (has_param && param==0) { +- attr_pop(ATTR_BOLD); +- } +- else +- attr_push(ATTR_BOLD,NULL); +- return FALSE; ++cmd_b (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ if (has_param && param==0) { ++ attr_pop(ATTR_BOLD, oc); ++ } ++ else ++ attr_push(ATTR_BOLD,NULL, oc); ++ return FALSE; + } + + /*======================================================================== +@@ -2282,12 +2277,12 @@ cmd_b (Word *w, int align, char has_para + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_i (Word *w, int align, char has_param, int param) { +- if (has_param && param==0) +- attr_pop(ATTR_ITALIC); +- else +- attr_push(ATTR_ITALIC,NULL); +- return FALSE; ++static int cmd_i (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ if (has_param && param==0) ++ attr_pop(ATTR_ITALIC, oc); ++ else ++ attr_push(ATTR_ITALIC,NULL, oc); ++ return FALSE; + } + + /*======================================================================== +@@ -2296,8 +2291,8 @@ static int cmd_i (Word *w, int align, ch + * Args: Word, paragraph align info, and numeric param if any. + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ +-static int cmd_s (Word *w, int align, char has_param, int param) { +- return FALSE; ++static int cmd_s (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ return FALSE; + } + + /*======================================================================== +@@ -2307,12 +2302,14 @@ static int cmd_s (Word *w, int align, ch + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_sect (Word *w, int align, char has_param, int param) { +- /* XX kludge */ +- if (op->paragraph_begin) { +- if (safe_printf(0, op->paragraph_begin)) fprintf(stderr, TOO_MANY_ARGS, "paragraph_begin"); +- } +- return FALSE; ++static int cmd_sect (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; ++ ++ /* XX kludge */ ++ if (oc->personality->paragraph_begin) { ++ if (safe_printf(device, 0, oc->personality->paragraph_begin)) fprintf(stderr, TOO_MANY_ARGS, "paragraph_begin"); ++ } ++ return FALSE; + } + + /*======================================================================== +@@ -2322,14 +2319,16 @@ static int cmd_sect (Word *w, int align, + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_shp (Word *w, int align, char has_param, int param) { +- if (op->comment_begin) { +- if (safe_printf(0, op->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); +- printf("Drawn Shape (ignored--not implemented yet)"); +- if (safe_printf(0, op->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); +- } ++static int cmd_shp (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; + +- return FALSE; ++ if (oc->personality->comment_begin) { ++ if (safe_printf(device, 0, oc->personality->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); ++ printf("Drawn Shape (ignored--not implemented yet)"); ++ if (safe_printf(device, 0, oc->personality->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); ++ } ++ ++ return FALSE; + } + + /*======================================================================== +@@ -2339,12 +2338,12 @@ static int cmd_shp (Word *w, int align, + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_outl (Word *w, int align, char has_param, int param) { +- if (has_param && param==0) +- attr_pop(ATTR_OUTLINE); +- else +- attr_push(ATTR_OUTLINE,NULL); +- return FALSE; ++static int cmd_outl (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ if (has_param && param==0) ++ attr_pop(ATTR_OUTLINE, oc); ++ else ++ attr_push(ATTR_OUTLINE,NULL, oc); ++ return FALSE; + } + + /*======================================================================== +@@ -2354,12 +2353,12 @@ static int cmd_outl (Word *w, int align, + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_ansi (Word *w, int align, char has_param, int param) { +- if (my_iconv_is_valid(desc)) +- desc = my_iconv_close(desc); ++static int cmd_ansi (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ if (my_iconv_is_valid(oc->conversion->desc)) ++ oc->conversion->desc = my_iconv_close(oc->conversion->desc); + +- desc = my_iconv_open("UTF-8", "cp1252"); +- return FALSE; ++ oc->conversion->desc = my_iconv_open(oc->conversion, "UTF-8", "cp1252"); ++ return FALSE; + } + + /*======================================================================== +@@ -2369,18 +2368,18 @@ static int cmd_ansi (Word *w, int align, + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_ansicpg (Word *w, int align, char has_param, int param) ++static int cmd_ansicpg (const struct OutputContext *oc, Word *w, int align, char has_param, int param) + { +- char tmp[8]; ++ char tmp[8]; + +- snprintf(tmp, 8, "cp%d", param); ++ snprintf(tmp, 8, "cp%d", param); + +- if (my_iconv_is_valid(desc)) +- desc = my_iconv_close(desc); ++ if (my_iconv_is_valid(oc->conversion->desc)) ++ oc->conversion->desc = my_iconv_close(oc->conversion->desc); + +- desc = my_iconv_open("UTF-8", tmp); ++ oc->conversion->desc = my_iconv_open(oc->conversion, "UTF-8", tmp); + +- return FALSE; ++ return FALSE; + } + + /*======================================================================== +@@ -2390,13 +2389,13 @@ static int cmd_ansicpg (Word *w, int ali + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_pc (Word *w, int align, char has_param, int param) { +- if (my_iconv_is_valid(desc)) +- desc = my_iconv_close(desc); ++static int cmd_pc (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ if (my_iconv_is_valid(oc->conversion->desc)) ++ oc->conversion->desc = my_iconv_close(oc->conversion->desc); + +- desc = my_iconv_open("UTF-8", "cp437"); ++ oc->conversion->desc = my_iconv_open(oc->conversion, "UTF-8", "cp437"); + +- return FALSE; ++ return FALSE; + } + + /*======================================================================== +@@ -2406,14 +2405,14 @@ static int cmd_pc (Word *w, int align, c + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_pca (Word *w, int align, char has_param, int param) { ++static int cmd_pca (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { + +- if (my_iconv_is_valid(desc)) +- my_iconv_close(desc); ++ if (my_iconv_is_valid(oc->conversion->desc)) ++ my_iconv_close(oc->conversion->desc); + +- desc = my_iconv_open("UTF-8", "cp850"); ++ oc->conversion->desc = my_iconv_open(oc->conversion, "UTF-8", "cp850"); + +- return FALSE; ++ return FALSE; + } + + /*======================================================================== +@@ -2423,13 +2422,13 @@ static int cmd_pca (Word *w, int align, + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_mac (Word *w, int align, char has_param, int param) { ++static int cmd_mac (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { + +- if (my_iconv_is_valid(desc)) +- my_iconv_close(desc); ++ if (my_iconv_is_valid(oc->conversion->desc)) ++ my_iconv_close(oc->conversion->desc); + +- desc = my_iconv_open("UTF-8", "mac"); +- return FALSE; ++ oc->conversion->desc = my_iconv_open(oc->conversion, "UTF-8", "mac"); ++ return FALSE; + } + + /*======================================================================== +@@ -2439,11 +2438,11 @@ static int cmd_mac (Word *w, int align, + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_colortbl (Word *w, int align, char has_param, int param) { +- if (w->next) { +- process_color_table(w->next); +- } +- return TRUE; ++static int cmd_colortbl (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ if (w->next) { ++ process_color_table (oc, w->next); ++ } ++ return TRUE; + } + + /*======================================================================== +@@ -2453,11 +2452,11 @@ static int cmd_colortbl (Word *w, int al + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_fonttbl (Word *w, int align, char has_param, int param) { +- if (w->next) { +- process_font_table(w->next); +- } +- return TRUE; ++static int cmd_fonttbl (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ if (w->next) { ++ process_font_table (oc, w->next); ++ } ++ return TRUE; + } + + /*======================================================================== +@@ -2467,8 +2466,8 @@ static int cmd_fonttbl (Word *w, int ali + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_header (Word *w, int align, char has_param, int param) { +- return TRUE; ++static int cmd_header (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ return TRUE; + } + + /*======================================================================== +@@ -2478,8 +2477,8 @@ static int cmd_header (Word *w, int alig + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_headerl (Word *w, int align, char has_param, int param) { +- return TRUE; ++static int cmd_headerl (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ return TRUE; + } + + /*======================================================================== +@@ -2489,8 +2488,8 @@ static int cmd_headerl (Word *w, int ali + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_headerr (Word *w, int align, char has_param, int param) { +- return TRUE; ++static int cmd_headerr (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ return TRUE; + } + + /*======================================================================== +@@ -2500,8 +2499,8 @@ static int cmd_headerr (Word *w, int ali + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_headerf (Word *w, int align, char has_param, int param) { +- return TRUE; ++static int cmd_headerf (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ return TRUE; + } + + /*======================================================================== +@@ -2511,8 +2510,8 @@ static int cmd_headerf (Word *w, int ali + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_footer (Word *w, int align, char has_param, int param) { +- return TRUE; ++static int cmd_footer (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ return TRUE; + } + + /*======================================================================== +@@ -2522,8 +2521,8 @@ static int cmd_footer (Word *w, int alig + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_footerl (Word *w, int align, char has_param, int param) { +- return TRUE; ++static int cmd_footerl (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ return TRUE; + } + + /*======================================================================== +@@ -2533,8 +2532,8 @@ static int cmd_footerl (Word *w, int ali + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_footerr (Word *w, int align, char has_param, int param) { +- return TRUE; ++static int cmd_footerr (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ return TRUE; + } + + /*======================================================================== +@@ -2544,8 +2543,8 @@ static int cmd_footerr (Word *w, int ali + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_footerf (Word *w, int align, char has_param, int param) { +- return TRUE; ++static int cmd_footerf (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ return TRUE; + } + + /*======================================================================== +@@ -2555,8 +2554,8 @@ static int cmd_footerf (Word *w, int ali + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_ignore (Word *w, int align, char has_param, int param) { +- return TRUE; ++static int cmd_ignore (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ return TRUE; + } + + /*======================================================================== +@@ -2566,9 +2565,9 @@ static int cmd_ignore (Word *w, int alig + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_info (Word *w, int align, char has_param, int param) { +- process_info_group (w->next); +- return TRUE; ++static int cmd_info (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ process_info_group (oc, w->next); ++ return TRUE; + } + + /*======================================================================== +@@ -2578,11 +2577,11 @@ static int cmd_info (Word *w, int align, + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_pict (Word *w, int align, char has_param, int param) { +- within_picture=TRUE; +- picture_width = picture_height = 0; +- picture_type = PICT_WB; +- return FALSE; ++static int cmd_pict (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ oc->conversion->within_picture=TRUE; ++ oc->conversion->picture_width = oc->conversion->picture_height = 0; ++ oc->conversion->picture_type = PICT_WB; ++ return FALSE; + } + + /*======================================================================== +@@ -2592,8 +2591,8 @@ static int cmd_pict (Word *w, int align, + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_bin (Word *w, int align, char has_param, int param) { +- return FALSE; ++static int cmd_bin (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ return FALSE; + } + + +@@ -2604,9 +2603,9 @@ static int cmd_bin (Word *w, int align, + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_macpict (Word *w, int align, char has_param, int param) { +- picture_type = PICT_MAC; +- return FALSE; ++static int cmd_macpict (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ oc->conversion->picture_type = PICT_MAC; ++ return FALSE; + } + + /*======================================================================== +@@ -2616,9 +2615,9 @@ static int cmd_macpict (Word *w, int ali + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_jpegblip (Word *w, int align, char has_param, int param) { +- picture_type = PICT_JPEG; +- return FALSE; ++static int cmd_jpegblip (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ oc->conversion->picture_type = PICT_JPEG; ++ return FALSE; + } + + /*======================================================================== +@@ -2628,9 +2627,9 @@ static int cmd_jpegblip (Word *w, int al + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_pngblip (Word *w, int align, char has_param, int param) { +- picture_type = PICT_PNG; +- return FALSE; ++static int cmd_pngblip (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ oc->conversion->picture_type = PICT_PNG; ++ return FALSE; + } + + /*======================================================================== +@@ -2640,9 +2639,9 @@ static int cmd_pngblip (Word *w, int ali + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_pnmetafile (Word *w, int align, char has_param, int param) { +- picture_type = PICT_PM; +- return FALSE; ++static int cmd_pnmetafile (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ oc->conversion->picture_type = PICT_PM; ++ return FALSE; + } + + /*======================================================================== +@@ -2652,23 +2651,23 @@ static int cmd_pnmetafile (Word *w, int + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_wmetafile (Word *w, int align, char has_param, int param) { +- picture_type = PICT_WM; +- if (within_picture && has_param) { +- picture_wmetafile_type=param; +- switch(param) { +- case 1: picture_wmetafile_type_str="MM_TEXT"; break; +- case 2: picture_wmetafile_type_str="MM_LOMETRIC"; break; +- case 3: picture_wmetafile_type_str="MM_HIMETRIC"; break; +- case 4: picture_wmetafile_type_str="MM_LOENGLISH"; break; +- case 5: picture_wmetafile_type_str="MM_HIENGLISH"; break; +- case 6: picture_wmetafile_type_str="MM_TWIPS"; break; +- case 7: picture_wmetafile_type_str="MM_ISOTROPIC"; break; +- case 8: picture_wmetafile_type_str="MM_ANISOTROPIC"; break; +- default: picture_wmetafile_type_str="default:MM_TEXT"; break; +- } +- } +- return FALSE; ++static int cmd_wmetafile (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ oc->conversion->picture_type = PICT_WM; ++ if (oc->conversion->within_picture && has_param) { ++ oc->conversion->picture_wmetafile_type=param; ++ switch(param) { ++ case 1: oc->conversion->picture_wmetafile_type_str="MM_TEXT"; break; ++ case 2: oc->conversion->picture_wmetafile_type_str="MM_LOMETRIC"; break; ++ case 3: oc->conversion->picture_wmetafile_type_str="MM_HIMETRIC"; break; ++ case 4: oc->conversion->picture_wmetafile_type_str="MM_LOENGLISH"; break; ++ case 5: oc->conversion->picture_wmetafile_type_str="MM_HIENGLISH"; break; ++ case 6: oc->conversion->picture_wmetafile_type_str="MM_TWIPS"; break; ++ case 7: oc->conversion->picture_wmetafile_type_str="MM_ISOTROPIC"; break; ++ case 8: oc->conversion->picture_wmetafile_type_str="MM_ANISOTROPIC"; break; ++ default: oc->conversion->picture_wmetafile_type_str="default:MM_TEXT"; break; ++ } ++ } ++ return FALSE; + } + + /*======================================================================== +@@ -2678,10 +2677,10 @@ static int cmd_wmetafile (Word *w, int a + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_wbmbitspixel (Word *w, int align, char has_param, int param) { +- if (within_picture && has_param) +- picture_bits_per_pixel = param; +- return FALSE; ++static int cmd_wbmbitspixel (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ if (oc->conversion->within_picture && has_param) ++ oc->conversion->picture_bits_per_pixel = param; ++ return FALSE; + } + + /*======================================================================== +@@ -2691,10 +2690,10 @@ static int cmd_wbmbitspixel (Word *w, in + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_picw (Word *w, int align, char has_param, int param) { +- if (within_picture && has_param) +- picture_width = param; +- return FALSE; ++static int cmd_picw (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ if (oc->conversion->within_picture && has_param) ++ oc->conversion->picture_width = param; ++ return FALSE; + } + + /*======================================================================== +@@ -2704,10 +2703,10 @@ static int cmd_picw (Word *w, int align, + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_pich (Word *w, int align, char has_param, int param) { +- if (within_picture && has_param) +- picture_height = param; +- return FALSE; ++static int cmd_pich (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ if (oc->conversion->within_picture && has_param) ++ oc->conversion->picture_height = param; ++ return FALSE; + } + + +@@ -2718,9 +2717,9 @@ static int cmd_pich (Word *w, int align, + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_xe (Word *w, int align, char has_param, int param) { +- process_index_entry (w); +- return TRUE; ++static int cmd_xe (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ process_index_entry (oc, w); ++ return TRUE; + } + + /*======================================================================== +@@ -2730,9 +2729,9 @@ static int cmd_xe (Word *w, int align, c + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_tc (Word *w, int align, char has_param, int param) { +- process_toc_entry (w, TRUE); +- return TRUE; ++static int cmd_tc (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ process_toc_entry (oc, w, TRUE); ++ return TRUE; + } + + /*======================================================================== +@@ -2742,282 +2741,282 @@ static int cmd_tc (Word *w, int align, c + * Returns: Flag, true only if rest of Words on line should be ignored. + *=======================================================================*/ + +-static int cmd_tcn (Word *w, int align, char has_param, int param) { +- process_toc_entry (w, FALSE); +- return TRUE; ++static int cmd_tcn (const struct OutputContext *oc, Word *w, int align, char has_param, int param) { ++ process_toc_entry (oc, w, FALSE); ++ return TRUE; + } + + + typedef struct { +- char *name; +- int (*func)(Word*, int, char, int); +- char *debug_print; +-} HashItem; ++ char *name; ++ int (*func)(const struct OutputContext *, Word*, int, char, int); ++ char *debug_print; ++} CmdHashItem; + + + /* All of the possible commands that RTF might recognize. */ +-static HashItem hashArray_other [] = { +- { "*", cmd_ignore, NULL }, +- { "-", cmd_optional_hyphen, "optional hyphen" }, +- { "_", cmd_nonbreaking_hyphen, "nonbreaking hyphen" }, +- { "~", cmd_nonbreaking_space, NULL }, +- { NULL, NULL, NULL} ++static CmdHashItem hashArray_other [] = { ++ { "*", cmd_ignore, NULL }, ++ { "-", cmd_optional_hyphen, "optional hyphen" }, ++ { "_", cmd_nonbreaking_hyphen, "nonbreaking hyphen" }, ++ { "~", cmd_nonbreaking_space, NULL }, ++ { NULL, NULL, NULL} + }; +-static HashItem hashArray_a [] = { +- { "ansi", &cmd_ansi , NULL }, +- { "ansicpg", &cmd_ansicpg , NULL }, +- { NULL, NULL, NULL} ++static CmdHashItem hashArray_a [] = { ++ { "ansi", &cmd_ansi , NULL }, ++ { "ansicpg", &cmd_ansicpg , NULL }, ++ { NULL, NULL, NULL} + }; +-static HashItem hashArray_b [] = { +- { "b", &cmd_b, NULL }, +- { "bullet", &cmd_bullet, NULL }, +- { "bin", &cmd_bin, "picture is binary" }, ++static CmdHashItem hashArray_b [] = { ++ { "b", &cmd_b, NULL }, ++ { "bullet", &cmd_bullet, NULL }, ++ { "bin", &cmd_bin, "picture is binary" }, + #if 0 +- { "bgbdiag", NULL, NULL }, +- { "bgcross", NULL, NULL }, +- { "bgdcross", NULL, NULL }, +- { "bgfdiag", NULL, NULL }, +- { "bghoriz", NULL, NULL }, +- { "bgkbdiag", NULL, NULL }, +- { "bgkcross", NULL, NULL }, +- { "bgkdcross", NULL, NULL }, +- { "bgkfdiag", NULL, NULL }, +- { "bgkhoriz", NULL, NULL }, +- { "bgkvert", NULL, NULL }, +- { "bgvert", NULL, NULL }, +- { "brdrcf", NULL, NULL }, +- { "brdrdb", NULL, NULL }, +- { "brdrdot", NULL, NULL }, +- { "brdrhair", NULL, NULL }, +- { "brdrs", NULL, NULL }, +- { "brdrsh", NULL, NULL }, +- { "brdrth", NULL, NULL }, +- { "brdrw", NULL, NULL }, ++ { "bgbdiag", NULL, NULL }, ++ { "bgcross", NULL, NULL }, ++ { "bgdcross", NULL, NULL }, ++ { "bgfdiag", NULL, NULL }, ++ { "bghoriz", NULL, NULL }, ++ { "bgkbdiag", NULL, NULL }, ++ { "bgkcross", NULL, NULL }, ++ { "bgkdcross", NULL, NULL }, ++ { "bgkfdiag", NULL, NULL }, ++ { "bgkhoriz", NULL, NULL }, ++ { "bgkvert", NULL, NULL }, ++ { "bgvert", NULL, NULL }, ++ { "brdrcf", NULL, NULL }, ++ { "brdrdb", NULL, NULL }, ++ { "brdrdot", NULL, NULL }, ++ { "brdrhair", NULL, NULL }, ++ { "brdrs", NULL, NULL }, ++ { "brdrsh", NULL, NULL }, ++ { "brdrth", NULL, NULL }, ++ { "brdrw", NULL, NULL }, + #endif +- { NULL, NULL, NULL} ++ { NULL, NULL, NULL} + }; +-static HashItem hashArray_c [] = { +- { "caps", &cmd_caps, NULL }, +- { "cb", cmd_cb, NULL }, +- { "cf", cmd_cf, NULL }, +- { "colortbl", &cmd_colortbl, "color table" }, +- { "cols", NULL, "columns (not implemented)" }, +- { "column", NULL, "column break (not implemented)" }, +- { "cbpat", NULL, "Paragraph Shading" }, +- { "cellx", NULL, "Table Definitions" }, +- { "cfpat", NULL, NULL }, +- { "cgrid", NULL, NULL }, +- { "charrsid", NULL, "Revision Mark (ignore)" }, +- { "clbgbcross", NULL, NULL }, +- { "clbgbdiag", NULL, NULL }, +- { "clbgbkbdiag", NULL, NULL }, +- { "clbgbkcross", NULL, NULL }, +- { "clbgbkdcross", NULL, NULL }, +- { "clbgbkfdiag", NULL, NULL }, +- { "clbgbkhor", NULL, NULL }, +- { "clbgbkvert", NULL, NULL }, +- { "clbgdcross", NULL, NULL }, +- { "clbgfdiag", NULL, NULL }, +- { "clbghoriz", NULL, NULL }, +- { "clbgvert", NULL, NULL }, +- { "clbrdrb", NULL, NULL }, +- { "clbrdrl", NULL, NULL }, +- { "clbrdrr", NULL, NULL }, +- { "clbrdrt", NULL, NULL }, +- { "clcbpat", NULL, NULL }, +- { "clcfpat", NULL, NULL }, +- { "clmgf", NULL, NULL }, +- { "clmrg", NULL, NULL }, +- { "clshdng", NULL, NULL }, +- { NULL, NULL, NULL} ++static CmdHashItem hashArray_c [] = { ++ { "caps", &cmd_caps, NULL }, ++ { "cb", cmd_cb, NULL }, ++ { "cf", cmd_cf, NULL }, ++ { "colortbl", &cmd_colortbl, "color table" }, ++ { "cols", NULL, "columns (not implemented)" }, ++ { "column", NULL, "column break (not implemented)" }, ++ { "cbpat", NULL, "Paragraph Shading" }, ++ { "cellx", NULL, "Table Definitions" }, ++ { "cfpat", NULL, NULL }, ++ { "cgrid", NULL, NULL }, ++ { "charrsid", NULL, "Revision Mark (ignore)" }, ++ { "clbgbcross", NULL, NULL }, ++ { "clbgbdiag", NULL, NULL }, ++ { "clbgbkbdiag", NULL, NULL }, ++ { "clbgbkcross", NULL, NULL }, ++ { "clbgbkdcross", NULL, NULL }, ++ { "clbgbkfdiag", NULL, NULL }, ++ { "clbgbkhor", NULL, NULL }, ++ { "clbgbkvert", NULL, NULL }, ++ { "clbgdcross", NULL, NULL }, ++ { "clbgfdiag", NULL, NULL }, ++ { "clbghoriz", NULL, NULL }, ++ { "clbgvert", NULL, NULL }, ++ { "clbrdrb", NULL, NULL }, ++ { "clbrdrl", NULL, NULL }, ++ { "clbrdrr", NULL, NULL }, ++ { "clbrdrt", NULL, NULL }, ++ { "clcbpat", NULL, NULL }, ++ { "clcfpat", NULL, NULL }, ++ { "clmgf", NULL, NULL }, ++ { "clmrg", NULL, NULL }, ++ { "clshdng", NULL, NULL }, ++ { NULL, NULL, NULL} + }; +-static HashItem hashArray_d [] = { +- { "deff", NULL, "Default Font" }, +- { "dn", &cmd_dn, NULL }, ++static CmdHashItem hashArray_d [] = { ++ { "deff", NULL, "Default Font" }, ++ { "dn", &cmd_dn, NULL }, + #if 0 +- { "dibitmap", NULL, NULL }, ++ { "dibitmap", NULL, NULL }, + #endif +- { NULL, NULL, NULL} ++ { NULL, NULL, NULL} + }; +-static HashItem hashArray_e [] = { +- { "emdash", cmd_emdash, NULL }, +- { "endash", cmd_endash, NULL }, +- { "embo", &cmd_emboss, NULL }, +- { "expand", &cmd_expand, NULL }, +- { "expnd", &cmd_expand, NULL }, +- { NULL, NULL, NULL} ++static CmdHashItem hashArray_e [] = { ++ { "emdash", cmd_emdash, NULL }, ++ { "endash", cmd_endash, NULL }, ++ { "embo", &cmd_emboss, NULL }, ++ { "expand", &cmd_expand, NULL }, ++ { "expnd", &cmd_expand, NULL }, ++ { NULL, NULL, NULL} + }; +-static HashItem hashArray_f [] = { +- { "f", cmd_f, NULL }, +- { "fdecor", cmd_fdecor, NULL }, +- { "fmodern", cmd_fmodern, NULL }, +- { "fnil", cmd_fnil, NULL }, +- { "fonttbl", cmd_fonttbl, "font table" }, +- { "froman", cmd_froman, NULL }, +- { "fs", cmd_fs, NULL }, +- { "fscript", cmd_fscript, NULL }, +- { "fswiss", cmd_fswiss, NULL }, +- { "ftech", cmd_ftech, NULL }, +- { "field", cmd_field, NULL }, +- { "footer", cmd_footer, NULL }, +- { "footerf", cmd_footerf, NULL }, +- { "footerl", cmd_footerl, NULL }, +- { "footerr", cmd_footerr, NULL }, +- { NULL, NULL, NULL} ++static CmdHashItem hashArray_f [] = { ++ { "f", cmd_f, NULL }, ++ { "fdecor", cmd_fdecor, NULL }, ++ { "fmodern", cmd_fmodern, NULL }, ++ { "fnil", cmd_fnil, NULL }, ++ { "fonttbl", cmd_fonttbl, "font table" }, ++ { "froman", cmd_froman, NULL }, ++ { "fs", cmd_fs, NULL }, ++ { "fscript", cmd_fscript, NULL }, ++ { "fswiss", cmd_fswiss, NULL }, ++ { "ftech", cmd_ftech, NULL }, ++ { "field", cmd_field, NULL }, ++ { "footer", cmd_footer, NULL }, ++ { "footerf", cmd_footerf, NULL }, ++ { "footerl", cmd_footerl, NULL }, ++ { "footerr", cmd_footerr, NULL }, ++ { NULL, NULL, NULL} + }; +-static HashItem hashArray_h [] = { +- { "highlight", &cmd_highlight, NULL }, +- { "header", cmd_header, NULL }, +- { "headerf", cmd_headerf, NULL }, +- { "headerl", cmd_headerl, NULL }, +- { "headerr", cmd_headerr, NULL }, +- { "hl", cmd_ignore, "hyperlink within object" }, +- { NULL, NULL, NULL} ++static CmdHashItem hashArray_h [] = { ++ { "highlight", &cmd_highlight, NULL }, ++ { "header", cmd_header, NULL }, ++ { "headerf", cmd_headerf, NULL }, ++ { "headerl", cmd_headerl, NULL }, ++ { "headerr", cmd_headerr, NULL }, ++ { "hl", cmd_ignore, "hyperlink within object" }, ++ { NULL, NULL, NULL} + }; +-static HashItem hashArray_i [] = { +- { "i", &cmd_i, NULL }, +- { "info", &cmd_info, NULL }, +- { "insrsid", NULL, "Revision Mark (ignore)" }, +- { "intbl", &cmd_intbl, NULL }, +- { "impr", &cmd_engrave, NULL }, +- { NULL, NULL, NULL} ++static CmdHashItem hashArray_i [] = { ++ { "i", &cmd_i, NULL }, ++ { "info", &cmd_info, NULL }, ++ { "insrsid", NULL, "Revision Mark (ignore)" }, ++ { "intbl", &cmd_intbl, NULL }, ++ { "impr", &cmd_engrave, NULL }, ++ { NULL, NULL, NULL} + }; +-static HashItem hashArray_j [] = { +- { "jpegblip", &cmd_jpegblip, NULL }, +- { NULL, NULL, NULL} ++static CmdHashItem hashArray_j [] = { ++ { "jpegblip", &cmd_jpegblip, NULL }, ++ { NULL, NULL, NULL} + }; +-static HashItem hashArray_l [] = { +- { "ldblquote", &cmd_ldblquote, NULL }, +- { "line", &cmd_line, NULL }, +- { "lquote", &cmd_lquote, NULL }, +- { NULL, NULL, NULL} ++static CmdHashItem hashArray_l [] = { ++ { "ldblquote", &cmd_ldblquote, NULL }, ++ { "line", &cmd_line, NULL }, ++ { "lquote", &cmd_lquote, NULL }, ++ { NULL, NULL, NULL} + }; +-static HashItem hashArray_m [] = { +- { "mac", &cmd_mac , NULL }, +- { "macpict", &cmd_macpict, NULL }, +- { NULL, NULL, NULL} ++static CmdHashItem hashArray_m [] = { ++ { "mac", &cmd_mac , NULL }, ++ { "macpict", &cmd_macpict, NULL }, ++ { NULL, NULL, NULL} + }; +-static HashItem hashArray_n [] = { +- { "nosupersub", &cmd_nosupersub, NULL }, +- { NULL, NULL, NULL} ++static CmdHashItem hashArray_n [] = { ++ { "nosupersub", &cmd_nosupersub, NULL }, ++ { NULL, NULL, NULL} + }; +-static HashItem hashArray_o [] = { +- { "outl", &cmd_outl, NULL }, +- { NULL, NULL, NULL} ++static CmdHashItem hashArray_o [] = { ++ { "outl", &cmd_outl, NULL }, ++ { NULL, NULL, NULL} + }; +-static HashItem hashArray_p [] = { +- { "page", &cmd_page, NULL }, +- { "par", &cmd_par, NULL }, +- { "pc", &cmd_pc , NULL }, +- { "pca", &cmd_pca , NULL }, +- { "pich", &cmd_pich, NULL }, +- { "pict", &cmd_pict, "picture" }, +- { "picw", &cmd_picw, NULL }, +- { "plain", &cmd_plain, NULL }, +- { "pngblip", &cmd_pngblip, NULL }, +- { "pnmetafile", &cmd_pnmetafile, NULL }, ++static CmdHashItem hashArray_p [] = { ++ { "page", &cmd_page, NULL }, ++ { "par", &cmd_par, NULL }, ++ { "pc", &cmd_pc , NULL }, ++ { "pca", &cmd_pca , NULL }, ++ { "pich", &cmd_pich, NULL }, ++ { "pict", &cmd_pict, "picture" }, ++ { "picw", &cmd_picw, NULL }, ++ { "plain", &cmd_plain, NULL }, ++ { "pngblip", &cmd_pngblip, NULL }, ++ { "pnmetafile", &cmd_pnmetafile, NULL }, + #if 0 +- { "piccropb", NULL, NULL }, +- { "piccropl", NULL, NULL }, +- { "piccropr", NULL, NULL }, +- { "piccropt", NULL, NULL }, +- { "pichgoal", NULL, NULL }, +- { "pichgoal", NULL, NULL }, +- { "picscaled", NULL, NULL }, +- { "picscalex", NULL, NULL }, +- { "picwgoal", NULL, NULL }, ++ { "piccropb", NULL, NULL }, ++ { "piccropl", NULL, NULL }, ++ { "piccropr", NULL, NULL }, ++ { "piccropt", NULL, NULL }, ++ { "pichgoal", NULL, NULL }, ++ { "pichgoal", NULL, NULL }, ++ { "picscaled", NULL, NULL }, ++ { "picscalex", NULL, NULL }, ++ { "picwgoal", NULL, NULL }, + #endif +- { NULL, NULL, NULL} ++ { NULL, NULL, NULL} + }; +-static HashItem hashArray_r [] = { +- { "rdblquote", &cmd_rdblquote, NULL }, +- { "rquote", &cmd_rquote, NULL }, +- { "rtf", &cmd_rtf, NULL }, +- { NULL, NULL, NULL} ++static CmdHashItem hashArray_r [] = { ++ { "rdblquote", &cmd_rdblquote, NULL }, ++ { "rquote", &cmd_rquote, NULL }, ++ { "rtf", &cmd_rtf, NULL }, ++ { NULL, NULL, NULL} + }; +-static HashItem hashArray_s [] = { +- { "s", cmd_s, "style" }, +- { "sect", &cmd_sect, "section break"}, +- { "scaps", &cmd_scaps, NULL }, +- { "super", &cmd_super, NULL }, +- { "sub", &cmd_sub, NULL }, +- { "shad", &cmd_shad, NULL }, +- { "strike", &cmd_strike, NULL }, +- { "striked", &cmd_striked, NULL }, +- { "strikedl", &cmd_strikedl, NULL }, +- { "stylesheet", &cmd_ignore, "style sheet" }, +- { "shp", cmd_shp, "drawn shape" }, ++static CmdHashItem hashArray_s [] = { ++ { "s", cmd_s, "style" }, ++ { "sect", &cmd_sect, "section break"}, ++ { "scaps", &cmd_scaps, NULL }, ++ { "super", &cmd_super, NULL }, ++ { "sub", &cmd_sub, NULL }, ++ { "shad", &cmd_shad, NULL }, ++ { "strike", &cmd_strike, NULL }, ++ { "striked", &cmd_striked, NULL }, ++ { "strikedl", &cmd_strikedl, NULL }, ++ { "stylesheet", &cmd_ignore, "style sheet" }, ++ { "shp", cmd_shp, "drawn shape" }, + #if 0 +- { "shading", NULL, NULL }, ++ { "shading", NULL, NULL }, + #endif +- { NULL, NULL, NULL} ++ { NULL, NULL, NULL} + }; +-static HashItem hashArray_t [] = { +- { "tab", &cmd_tab, NULL }, +- { "tc", cmd_tc, "TOC entry" }, +- { "tcn", cmd_tcn, "TOC entry" }, +- { NULL, NULL, NULL} ++static CmdHashItem hashArray_t [] = { ++ { "tab", &cmd_tab, NULL }, ++ { "tc", cmd_tc, "TOC entry" }, ++ { "tcn", cmd_tcn, "TOC entry" }, ++ { NULL, NULL, NULL} + }; +-static HashItem hashArray_u [] = { +- { "u", &cmd_u, NULL }, +- { "ul", &cmd_ul, NULL }, +- { "up", &cmd_up, NULL }, +- { "uld", &cmd_uld, NULL }, +- { "uldash", &cmd_uldash, NULL }, +- { "uldashd", &cmd_uldashd, NULL }, +- { "uldashdd", &cmd_uldashdd, NULL }, +- { "uldb", &cmd_uldb, NULL }, +- { "ulnone", &cmd_ulnone, NULL }, +- { "ulth", &cmd_ulth, NULL }, +- { "ulthd", &cmd_ulthd, NULL }, +- { "ulthdash", &cmd_ulthdash, NULL }, +- { "ulw", &cmd_ulw, NULL }, +- { "ulwave", &cmd_ulwave, NULL }, +- { NULL, NULL, NULL} ++static CmdHashItem hashArray_u [] = { ++ { "u", &cmd_u, NULL }, ++ { "ul", &cmd_ul, NULL }, ++ { "up", &cmd_up, NULL }, ++ { "uld", &cmd_uld, NULL }, ++ { "uldash", &cmd_uldash, NULL }, ++ { "uldashd", &cmd_uldashd, NULL }, ++ { "uldashdd", &cmd_uldashdd, NULL }, ++ { "uldb", &cmd_uldb, NULL }, ++ { "ulnone", &cmd_ulnone, NULL }, ++ { "ulth", &cmd_ulth, NULL }, ++ { "ulthd", &cmd_ulthd, NULL }, ++ { "ulthdash", &cmd_ulthdash, NULL }, ++ { "ulw", &cmd_ulw, NULL }, ++ { "ulwave", &cmd_ulwave, NULL }, ++ { NULL, NULL, NULL} + }; + +-static HashItem hashArray_v [] = { +- { "v", NULL, "Hidden Text" }, +- { NULL, NULL, NULL } ++static CmdHashItem hashArray_v [] = { ++ { "v", NULL, "Hidden Text" }, ++ { NULL, NULL, NULL } + }; + +-static HashItem hashArray_w [] = { +- { "wbmbitspixel", &cmd_wbmbitspixel, NULL }, +- { "wmetafile", &cmd_wmetafile, NULL }, +- { NULL, NULL, NULL} ++static CmdHashItem hashArray_w [] = { ++ { "wbmbitspixel", &cmd_wbmbitspixel, NULL }, ++ { "wmetafile", &cmd_wmetafile, NULL }, ++ { NULL, NULL, NULL} + }; + +-static HashItem hashArray_x [] = { +- { "xe", cmd_xe, "index entry" }, +- { NULL, NULL, NULL} ++static CmdHashItem hashArray_x [] = { ++ { "xe", cmd_xe, "index entry" }, ++ { NULL, NULL, NULL} + }; + +-static HashItem *hash [26] = { +- hashArray_a, +- hashArray_b, +- hashArray_c, +- hashArray_d, +- hashArray_e, +- hashArray_f, +- NULL, +- hashArray_h, +- hashArray_i, +- hashArray_j, +- NULL, +- hashArray_l, +- hashArray_m, +- hashArray_n, +- hashArray_o, +- hashArray_p, +- NULL, +- hashArray_r, +- hashArray_s, +- hashArray_t, +- hashArray_u, +- hashArray_v, +- hashArray_w, +- hashArray_x, +- NULL, NULL ++static CmdHashItem *hash [26] = { ++ hashArray_a, ++ hashArray_b, ++ hashArray_c, ++ hashArray_d, ++ hashArray_e, ++ hashArray_f, ++ NULL, ++ hashArray_h, ++ hashArray_i, ++ hashArray_j, ++ NULL, ++ hashArray_l, ++ hashArray_m, ++ hashArray_n, ++ hashArray_o, ++ hashArray_p, ++ NULL, ++ hashArray_r, ++ hashArray_s, ++ hashArray_t, ++ hashArray_u, ++ hashArray_v, ++ hashArray_w, ++ hashArray_x, ++ NULL, NULL + }; + + +@@ -3038,53 +3037,56 @@ static HashItem *hash [26] = { + *=======================================================================*/ + + void +-print_with_special_exprs (char *s) { +- int ch; +- int state; ++print_with_special_exprs (const struct OutputContext *oc, char *s) { ++ int ch; ++ int state; ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; + +-enum { SMALL=0, BIG=1 }; ++ enum { SMALL=0, BIG=1 }; + +- CHECK_PARAM_NOT_NULL(s); ++ CHECK_PARAM_NOT_NULL(s); + +- state=SMALL; /* Pacify gcc, st001906 - 0.19.6 */ +- if (simulate_smallcaps) { +- if (*s >= 'a' && *s <= 'z') { +- state=SMALL; +- if (safe_printf(0, op->smaller_begin)) fprintf(stderr, TOO_MANY_ARGS, "smaller_begin"); +- } +- else +- state=BIG; +- } ++ state=SMALL; /* Pacify gcc, st001906 - 0.19.6 */ ++ if (oc->conversion->simulate_smallcaps) { ++ if (*s >= 'a' && *s <= 'z') { ++ state=SMALL; ++ if (safe_printf(device, 0, oc->personality->smaller_begin)) fprintf(stderr, TOO_MANY_ARGS, "smaller_begin"); ++ } ++ else ++ state=BIG; ++ } + +- while ((ch=*s)) { +- char *post_trans = NULL; ++ while ((ch=*s)) { ++ char *post_trans = NULL; + +- if (simulate_allcaps || simulate_smallcaps) +- ch = toupper (ch); ++ if (oc->conversion->simulate_allcaps || oc->conversion->simulate_smallcaps) ++ ch = toupper (ch); + +- if (ch >= 0x20 && ch < 0x80) { +- post_trans = op_translate_char (op, desc, ch); +- if(post_trans) +- printf("%s",post_trans); +- } ++ if (ch >= 0x20 && ch < 0x80) { ++ post_trans = op_translate_char (oc->conversion, oc->personality, ch); ++ if(post_trans) { ++ safe_printf(device, 0, post_trans); ++ free(post_trans); ++ } ++ } + +- s++; ++ s++; + +- if (simulate_smallcaps) { +- ch = *s; +- if (ch >= 'a' && ch <= 'z') { +- if (state==BIG) +- if (safe_printf(0, op->smaller_begin)) fprintf(stderr, TOO_MANY_ARGS, "smaller_begin"); +- state=SMALL; +- } +- else +- { +- if (state==SMALL) +- if (safe_printf(0, op->smaller_end)) fprintf(stderr, TOO_MANY_ARGS, "smaller_end"); +- state=BIG; +- } +- } +- } ++ if (oc->conversion->simulate_smallcaps) { ++ ch = *s; ++ if (ch >= 'a' && ch <= 'z') { ++ if (state==BIG) ++ if (safe_printf(device, 0, oc->personality->smaller_begin)) fprintf(stderr, TOO_MANY_ARGS, "smaller_begin"); ++ state=SMALL; ++ } ++ else ++ { ++ if (state==SMALL) ++ if (safe_printf(device, 0, oc->personality->smaller_end)) fprintf(stderr, TOO_MANY_ARGS, "smaller_end"); ++ state=BIG; ++ } ++ } ++ } + } + + +@@ -3097,16 +3099,18 @@ enum { SMALL=0, BIG=1 }; + *=======================================================================*/ + + static void +-begin_table() ++begin_table(const struct OutputContext *oc) + { +- within_table=TRUE; +- have_printed_row_begin = FALSE; +- have_printed_cell_begin = FALSE; +- have_printed_row_end = FALSE; +- have_printed_cell_end = FALSE; +- attrstack_push(); +- starting_body(); +- if (safe_printf(0, op->table_begin)) fprintf(stderr, TOO_MANY_ARGS, "table_begin"); ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; ++ ++ oc->conversion->within_table=TRUE; ++ oc->conversion->have_printed_row_begin = FALSE; ++ oc->conversion->have_printed_cell_begin = FALSE; ++ oc->conversion->have_printed_row_end = FALSE; ++ oc->conversion->have_printed_cell_end = FALSE; ++ attrstack_push(oc->conversion); ++ starting_body(oc); ++ if (safe_printf(device, 0, oc->personality->table_begin)) fprintf(stderr, TOO_MANY_ARGS, "table_begin"); + } + + +@@ -3119,23 +3123,25 @@ begin_table() + *=======================================================================*/ + + void +-end_table () ++end_table (const struct OutputContext *oc) + { +- if (within_table) { +- if (!have_printed_cell_end) { +- attr_pop_dump(); +- if (safe_printf(0, op->table_cell_end)) fprintf(stderr, TOO_MANY_ARGS, "table_cell_end"); +- } +- if (!have_printed_row_end) { +- if (safe_printf(0, op->table_row_end)) fprintf(stderr, TOO_MANY_ARGS, "table_row_end"); +- } +- if (safe_printf(0, op->table_end)) fprintf(stderr, TOO_MANY_ARGS, "table_end"); +- within_table=FALSE; +- have_printed_row_begin = FALSE; +- have_printed_cell_begin = FALSE; +- have_printed_row_end = FALSE; +- have_printed_cell_end = FALSE; +- } ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; ++ ++ if (oc->conversion->within_table) { ++ if (!oc->conversion->have_printed_cell_end) { ++ attr_pop_dump(); ++ if (safe_printf(device, 0, oc->personality->table_cell_end)) fprintf(stderr, TOO_MANY_ARGS, "table_cell_end"); ++ } ++ if (!oc->conversion->have_printed_row_end) { ++ if (safe_printf(device, 0, oc->personality->table_row_end)) fprintf(stderr, TOO_MANY_ARGS, "table_row_end"); ++ } ++ if (safe_printf(device, 0, oc->personality->table_end)) fprintf(stderr, TOO_MANY_ARGS, "table_end"); ++ oc->conversion->within_table=FALSE; ++ oc->conversion->have_printed_row_begin = FALSE; ++ oc->conversion->have_printed_cell_begin = FALSE; ++ oc->conversion->have_printed_row_end = FALSE; ++ oc->conversion->have_printed_cell_end = FALSE; ++ } + } + + +@@ -3148,21 +3154,23 @@ end_table () + *=======================================================================*/ + + void +-starting_text() { +- if (within_table) { +- if (!have_printed_row_begin) { +- if (safe_printf(0, op->table_row_begin)) fprintf(stderr, TOO_MANY_ARGS, "table_row_begin"); +- have_printed_row_begin=TRUE; +- have_printed_row_end=FALSE; +- have_printed_cell_begin=FALSE; +- } +- if (!have_printed_cell_begin) { +- if (safe_printf(0, op->table_cell_begin)) fprintf(stderr, TOO_MANY_ARGS, "table_cell_begin"); +- attrstack_express_all(); +- have_printed_cell_begin=TRUE; +- have_printed_cell_end=FALSE; +- } +- } ++starting_text(const struct OutputContext *oc) { ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; ++ ++ if (oc->conversion->within_table) { ++ if (!oc->conversion->have_printed_row_begin) { ++ if (safe_printf(device, 0, oc->personality->table_row_begin)) fprintf(stderr, TOO_MANY_ARGS, "table_row_begin"); ++ oc->conversion->have_printed_row_begin=TRUE; ++ oc->conversion->have_printed_row_end=FALSE; ++ oc->conversion->have_printed_cell_begin=FALSE; ++ } ++ if (!oc->conversion->have_printed_cell_begin) { ++ if (safe_printf(device, 0, oc->personality->table_cell_begin)) fprintf(stderr, TOO_MANY_ARGS, "table_cell_begin"); ++ attrstack_express_all(); ++ oc->conversion->have_printed_cell_begin=TRUE; ++ oc->conversion->have_printed_cell_end=FALSE; ++ } ++ } + } + + +@@ -3176,25 +3184,27 @@ starting_text() { + *=======================================================================*/ + + static void +-starting_paragraph_align (int align) ++starting_paragraph_align (const struct OutputContext *oc, int align) + { +- if (within_header && align != ALIGN_LEFT) +- starting_body(); ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; + +- switch (align) +- { +- case ALIGN_CENTER: +- if (safe_printf(0, op->center_begin)) fprintf(stderr, TOO_MANY_ARGS, "center_begin"); +- break; +- case ALIGN_LEFT: +- break; +- case ALIGN_RIGHT: +- if (safe_printf(0, op->align_right_begin)) fprintf(stderr, TOO_MANY_ARGS, "align_right_begin"); +- break; +- case ALIGN_JUSTIFY: +- if (safe_printf(0, op->justify_begin)) fprintf(stderr, TOO_MANY_ARGS, "justify_begin"); /* But this is correct */ +- break; +- } ++ if (oc->conversion->within_header && align != ALIGN_LEFT) ++ starting_body(oc); ++ ++ switch (align) ++ { ++ case ALIGN_CENTER: ++ if (safe_printf(device, 0, oc->personality->center_begin)) fprintf(stderr, TOO_MANY_ARGS, "center_begin"); ++ break; ++ case ALIGN_LEFT: ++ break; ++ case ALIGN_RIGHT: ++ if (safe_printf(device, 0, oc->personality->align_right_begin)) fprintf(stderr, TOO_MANY_ARGS, "align_right_begin"); ++ break; ++ case ALIGN_JUSTIFY: ++ if (safe_printf(device, 0, oc->personality->justify_begin)) fprintf(stderr, TOO_MANY_ARGS, "justify_begin"); /* But this is correct */ ++ break; ++ } + } + + +@@ -3207,21 +3217,23 @@ starting_paragraph_align (int align) + *=======================================================================*/ + + static void +-ending_paragraph_align (int align) ++ending_paragraph_align (const struct OutputContext *oc, int align) + { +- switch (align) { +- case ALIGN_CENTER: +- if (safe_printf(0, op->center_end)) fprintf(stderr, TOO_MANY_ARGS, "center_end"); +- break; +- case ALIGN_LEFT: +- break; +- case ALIGN_RIGHT: +- if (safe_printf(0, op->align_right_end)) fprintf(stderr, TOO_MANY_ARGS, "align_right_end"); +- break; +- case ALIGN_JUSTIFY: +- if (safe_printf(0, op->justify_end)) fprintf(stderr, TOO_MANY_ARGS, "justify_end"); +- break; +- } ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; ++ ++ switch (align) { ++ case ALIGN_CENTER: ++ if (safe_printf(device, 0, oc->personality->center_end)) fprintf(stderr, TOO_MANY_ARGS, "center_end"); ++ break; ++ case ALIGN_LEFT: ++ break; ++ case ALIGN_RIGHT: ++ if (safe_printf(device, 0, oc->personality->align_right_end)) fprintf(stderr, TOO_MANY_ARGS, "align_right_end"); ++ break; ++ case ALIGN_JUSTIFY: ++ if (safe_printf(device, 0, oc->personality->justify_end)) fprintf(stderr, TOO_MANY_ARGS, "justify_end"); ++ break; ++ } + } + + +@@ -3234,411 +3246,411 @@ ending_paragraph_align (int align) + *=======================================================================*/ + + static void +-word_print_core (Word *w) ++word_print_core (const struct OutputContext *oc, Word *w) + { +- char *s; +- FILE *pictfile=NULL; +- int is_cell_group=FALSE; +- int paragraph_begined=FALSE; +- int paragraph_align=ALIGN_LEFT; ++ char *s; ++ FILE *pictfile=NULL; ++ int is_cell_group=FALSE; ++ int paragraph_begined=FALSE; ++ int paragraph_align=ALIGN_LEFT; ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; + +- CHECK_PARAM_NOT_NULL(w); ++ CHECK_PARAM_NOT_NULL(w); + +- if (!coming_pars_that_are_tabular && within_table) { +- end_table(); +- } +- else if (coming_pars_that_are_tabular && !within_table) { +- begin_table(); +- } ++ if (!oc->conversion->coming_pars_that_are_tabular && oc->conversion->within_table) { ++ end_table(oc); ++ } ++ else if (oc->conversion->coming_pars_that_are_tabular && !oc->conversion->within_table) { ++ begin_table(oc); ++ } + +- /* Mark our place in the stack */ +- attrstack_push(); ++ /* Mark our place in the stack */ ++ attrstack_push(oc->conversion); + +- while (w) { ++ while (w) { + +- s = word_string (w); ++ s = word_string (oc->conversion, w); + +- if (s) { ++ if (s) { + +- /*--Ignore whitespace in header--------------------*/ +- if (*s==' ' && within_header) { +- /* no op */ +- } +- else +- /*--Handle word -----------------------------------*/ +- if (s[0] != '\\') +- { +- starting_body(); +- starting_text(); ++ /*--Ignore whitespace in header--------------------*/ ++ if (*s==' ' && oc->conversion->within_header) { ++ /* no op */ ++ } ++ else ++ /*--Handle word -----------------------------------*/ ++ if (s[0] != '\\') ++ { ++ starting_body(oc); ++ starting_text(oc); + +- if (!paragraph_begined) { +- starting_paragraph_align (paragraph_align); +- paragraph_begined=TRUE; +- } ++ if (!paragraph_begined) { ++ starting_paragraph_align (oc, paragraph_align); ++ paragraph_begined=TRUE; ++ } + +- /*----------------------------------------*/ +- if (within_picture) { +- starting_body(); +- if (!pictfile && !nopict_mode) { +- char *ext=NULL; +- switch (picture_type) { +- case PICT_WB: ext="bmp"; break; +- case PICT_WM: ext="wmf"; break; +- case PICT_MAC: ext="pict"; break; +- case PICT_JPEG: ext="jpg"; break; +- case PICT_PNG: ext="png"; break; +- case PICT_DI: ext="dib"; break; /* Device independent bitmap=??? */ +- case PICT_PM: ext="pmm"; break; /* OS/2 metafile=??? */ +- } +- sprintf(picture_path, "pict%03d.%s", +- picture_file_number++,ext); +- pictfile=fopen(picture_path,"w"); +- } ++ /*----------------------------------------*/ ++ if (oc->conversion->within_picture) { ++ starting_body(oc); ++ if (!pictfile && !oc->conversion->options->nopict_mode) { ++ char *ext=NULL; ++ switch (oc->conversion->picture_type) { ++ case PICT_WB: ext="bmp"; break; ++ case PICT_WM: ext="wmf"; break; ++ case PICT_MAC: ext="pict"; break; ++ case PICT_JPEG: ext="jpg"; break; ++ case PICT_PNG: ext="png"; break; ++ case PICT_DI: ext="dib"; break; /* Device independent bitmap=??? */ ++ case PICT_PM: ext="pmm"; break; /* OS/2 metafile=??? */ ++ } ++ sprintf(oc->conversion->picture_path, "pict%03d.%s", ++ oc->conversion->picture_file_number++,ext); ++ pictfile=fopen(oc->conversion->picture_path,"w"); ++ } + +- if (s[0]!=' ') { +- char *s2; +- if (safe_printf(0, op->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); +- printf("picture data found, "); +- if (picture_wmetafile_type_str) { +- printf("WMF type is %s, ", +- picture_wmetafile_type_str); +- } +- printf("picture dimensions are %d by %d, depth %d", +- picture_width, picture_height, picture_bits_per_pixel); +- if (safe_printf(0, op->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); +- if (picture_width && picture_height && picture_bits_per_pixel) { +- s2=s; +- while (*s2) { +- unsigned int tmp,value; +- tmp=tolower(*s2++); +- if (tmp>'9') tmp-=('a'-10); +- else tmp-='0'; +- value=16*tmp; +- tmp=tolower(*s2++); +- if (tmp>'9') tmp-=('a'-10); +- else tmp-='0'; +- value+=tmp; +- if (pictfile) { +- fprintf(pictfile,"%c", value); +- } +- } +- } +- } +- } +- /*----------------------------------------*/ +- else { +- total_chars_this_line += strlen(s); ++ if (s[0]!=' ') { ++ char *s2; ++ if (safe_printf(device, 0, oc->personality->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); ++ printf("picture data found, "); ++ if (oc->conversion->picture_wmetafile_type_str) { ++ printf("WMF type is %s, ", ++ oc->conversion->picture_wmetafile_type_str); ++ } ++ printf("picture dimensions are %d by %d, depth %d", ++ oc->conversion->picture_width, oc->conversion->picture_height, oc->conversion->picture_bits_per_pixel); ++ if (safe_printf(device, 0, oc->personality->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); ++ if (oc->conversion->picture_width && oc->conversion->picture_height && oc->conversion->picture_bits_per_pixel) { ++ s2=s; ++ while (*s2) { ++ unsigned int tmp,value; ++ tmp=tolower(*s2++); ++ if (tmp>'9') tmp-=('a'-10); ++ else tmp-='0'; ++ value=16*tmp; ++ tmp=tolower(*s2++); ++ if (tmp>'9') tmp-=('a'-10); ++ else tmp-='0'; ++ value+=tmp; ++ if (pictfile) { ++ fprintf(pictfile,"%c", value); ++ } ++ } ++ } ++ } ++ } ++ /*----------------------------------------*/ ++ else { ++ oc->conversion->total_chars_this_line += strlen(s); + +- if (op->word_begin) +- if (safe_printf(0, op->word_begin)) fprintf(stderr, TOO_MANY_ARGS, "word_begin"); ++ if (oc->personality->word_begin) ++ if (safe_printf(device, 0, oc->personality->word_begin)) fprintf(stderr, TOO_MANY_ARGS, "word_begin"); + +- print_with_special_exprs (s); ++ print_with_special_exprs (oc, s); + +- if (op->word_end) +- if (safe_printf(0, op->word_end)) fprintf(stderr, TOO_MANY_ARGS, "word_end"); +- } ++ if (oc->personality->word_end) ++ if (safe_printf(device, 0, oc->personality->word_end)) fprintf(stderr, TOO_MANY_ARGS, "word_end"); ++ } + + +- } +- /* output an escaped backslash */ +- /* do we need special handling for latex? */ +- else if (*(s+1) == '\\') +- { +- s++; +- putchar('\\'); +- } +- else if (*(s+1) == '{') +- { +- s++; +- putchar('{'); +- } +- else if (*(s+1) == '}') +- { +- s++; +- putchar('}'); +- } +- /*---Handle RTF keywords---------------------------*/ +- else { ++ } ++ /* output an escaped backslash */ ++ /* do we need special handling for latex? */ ++ else if (*(s+1) == '\\') ++ { ++ s++; ++ putchar('\\'); ++ } ++ else if (*(s+1) == '{') ++ { ++ s++; ++ putchar('{'); ++ } ++ else if (*(s+1) == '}') ++ { ++ s++; ++ putchar('}'); ++ } ++ /*---Handle RTF keywords---------------------------*/ ++ else { + +- int done=FALSE; +- s++; +-/*----Paragraph alignment----------------------------------------------------*/ +- if (!strcmp ("ql", s)) +- paragraph_align = ALIGN_LEFT; +- else if (!strcmp ("qr", s)) +- paragraph_align = ALIGN_RIGHT; +- else if (!strcmp ("qj", s)) +- paragraph_align = ALIGN_JUSTIFY; +- else if (!strcmp ("qc", s)) +- paragraph_align = ALIGN_CENTER; +- else if (!strcmp ("pard", s)) +- { +- /* Clear out all font attributes. +- */ +- attr_pop_all(); ++ int done=FALSE; ++ s++; ++ /*----Paragraph alignment----------------------------------------------------*/ ++ if (!strcmp ("ql", s)) ++ paragraph_align = ALIGN_LEFT; ++ else if (!strcmp ("qr", s)) ++ paragraph_align = ALIGN_RIGHT; ++ else if (!strcmp ("qj", s)) ++ paragraph_align = ALIGN_JUSTIFY; ++ else if (!strcmp ("qc", s)) ++ paragraph_align = ALIGN_CENTER; ++ else if (!strcmp ("pard", s)) ++ { ++ /* Clear out all font attributes. ++ */ ++ attr_pop_all(oc); + +- if (coming_pars_that_are_tabular) { +- --coming_pars_that_are_tabular; +- } ++ if (oc->conversion->coming_pars_that_are_tabular) { ++ --oc->conversion->coming_pars_that_are_tabular; ++ } + +- /* Clear out all paragraph attributes. +- */ +- ending_paragraph_align(paragraph_align); +- paragraph_align = ALIGN_LEFT; +- paragraph_begined = FALSE; +- } +-/*----Table keywords---------------------------------------------------------*/ +- else +- if (!strcmp (s, "cell")) { ++ /* Clear out all paragraph attributes. ++ */ ++ ending_paragraph_align (oc, paragraph_align); ++ paragraph_align = ALIGN_LEFT; ++ paragraph_begined = FALSE; ++ } ++ /*----Table keywords---------------------------------------------------------*/ ++ else ++ if (!strcmp (s, "cell")) { + +- is_cell_group=TRUE; +- if (!have_printed_cell_begin) { +- /* Need this with empty cells */ +- if (safe_printf(0, op->table_cell_begin)) fprintf(stderr, TOO_MANY_ARGS, "table_cell_begin"); +- attrstack_express_all(); +- } +- attr_pop_dump(); +- if (safe_printf(0, op->table_cell_end)) fprintf(stderr, TOO_MANY_ARGS, "table_cell_end"); +- have_printed_cell_begin = FALSE; +- have_printed_cell_end=TRUE; +- } +- else if (!strcmp (s, "row")) { ++ is_cell_group=TRUE; ++ if (!oc->conversion->have_printed_cell_begin) { ++ /* Need this with empty cells */ ++ if (safe_printf(device, 0, oc->personality->table_cell_begin)) fprintf(stderr, TOO_MANY_ARGS, "table_cell_begin"); ++ attrstack_express_all(); ++ } ++ attr_pop_dump(); ++ if (safe_printf(device, 0, oc->personality->table_cell_end)) fprintf(stderr, TOO_MANY_ARGS, "table_cell_end"); ++ oc->conversion->have_printed_cell_begin = FALSE; ++ oc->conversion->have_printed_cell_end=TRUE; ++ } ++ else if (!strcmp (s, "row")) { + +- if (within_table) { +- if (safe_printf(0, op->table_row_end)) fprintf(stderr, TOO_MANY_ARGS, "table_row_end"); +- have_printed_row_begin = FALSE; +- have_printed_row_end=TRUE; +- } else { +- if (debug_mode) { +- if (safe_printf(0, op->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); +- printf("end of table row"); +- if (safe_printf(0, op->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); +- } +- } +- } ++ if (oc->conversion->within_table) { ++ if (safe_printf(device, 0, oc->personality->table_row_end)) fprintf(stderr, TOO_MANY_ARGS, "table_row_end"); ++ oc->conversion->have_printed_row_begin = FALSE; ++ oc->conversion->have_printed_row_end=TRUE; ++ } else { ++ if (oc->conversion->options->debug_mode) { ++ if (safe_printf(device, 0, oc->personality->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); ++ printf("end of table row"); ++ if (safe_printf(device, 0, oc->personality->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); ++ } ++ } ++ } + +-/*----Special chars---------------------------------------------------------*/ +- else if (*s == '\'') { +- /* \'XX is a hex char code expression */ ++ /*----Special chars---------------------------------------------------------*/ ++ else if (*s == '\'') { ++ /* \'XX is a hex char code expression */ + +- int ch = h2toi (&s[1]); +- char *s2; ++ int ch = h2toi (&s[1]); ++ char *s2; + + #if 1 /* daved - 0.21.2 */ +- if(ch > h2toi("7f") && ch < h2toi("a1")) +- { +- /* 2 byte char - read 2nd */ +- int ch2; +- char *snext; +- int *doublet; +- w = w->next; +- snext = word_string (w); +- if(*snext == '\\' && *(snext+1) == '\'') +- { +- /* all looks good */ +- ch2 = h2toi(&snext[2]); ++ if(ch > h2toi("7f") && ch < h2toi("a1")) ++ { ++ /* 2 byte char - read 2nd */ ++ int ch2; ++ char *snext; ++ int *doublet; ++ w = w->next; ++ snext = word_string (oc->conversion, w); ++ if(*snext == '\\' && *(snext+1) == '\'') ++ { ++ /* all looks good */ ++ ch2 = h2toi(&snext[2]); + #if 0 +- fprintf(stderr,"ch, ch2 = %o %o\n", ch, ch2); ++ fprintf(stderr,"ch, ch2 = %o %o\n", ch, ch2); + #endif +- doublet = (int *)my_malloc(12); +- *doublet = (int)ch; +- *(doublet+1) = (int)ch2; +- *(doublet+2) = 0; ++ doublet = (int *)my_malloc(12); ++ *doublet = (int)ch; ++ *(doublet+1) = (int)ch2; ++ *(doublet+2) = 0; + #if 0 +- fprintf(stderr, "doublet = %o %o\n", *doublet, *(doublet+1)); ++ fprintf(stderr, "doublet = %o %o\n", *doublet, *(doublet+1)); + #endif +- desc2 = desc; +- desc = my_iconv_open("UTF-8", "SHIFT_JIS"); ++ oc->conversion->desc2 = oc->conversion->desc; ++ oc->conversion->desc = my_iconv_open(oc->conversion, "UTF-8", "SHIFT_JIS"); + #if 1 +- s2 = op_translate_doublet (op, desc, ch, ch2); ++ s2 = op_translate_doublet (oc->conversion, oc->personality, ch, ch2); + #else +- s2 = op_translate_str (op, desc, doublet); ++ s2 = op_translate_str (oc->conversion, oc->personality, doublet); + #endif +- free(doublet); +- desc = my_iconv_close(desc); +- desc = desc2; +- my_iconv_t_make_invalid(&desc2); +- } +- } +- else ++ free(doublet); ++ oc->conversion->desc = my_iconv_close(oc->conversion->desc); ++ oc->conversion->desc = oc->conversion->desc2; ++ my_iconv_t_make_invalid(&oc->conversion->desc2); ++ } ++ } ++ else + #endif +-//standard +- s2 = op_translate_char (op, desc, ch); +- if (!s2 || !*s2) { +- if (safe_printf(0, op->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); +- printf("char 0x%02x",ch); +- if (safe_printf(0, op->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); +- } else { +- if (op->word_begin) +- if (safe_printf(0, op->word_begin)) fprintf(stderr, TOO_MANY_ARGS, "word_begin"); +- +- printf("%s", s2); ++ //standard ++ s2 = op_translate_char (oc->conversion, oc->personality, ch); ++ if (!s2 || !*s2) { ++ if (safe_printf(device, 0, oc->personality->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); ++ printf("char 0x%02x",ch); ++ if (safe_printf(device, 0, oc->personality->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); ++ } else { ++ if (oc->personality->word_begin) ++ if (safe_printf(device, 0, oc->personality->word_begin)) fprintf(stderr, TOO_MANY_ARGS, "word_begin"); + +- if (op->word_end) +- if (safe_printf(0, op->word_end)) fprintf(stderr, TOO_MANY_ARGS, "word_end"); +- } +- } +- else +-/*----Search the RTF command hash-------------------------------------------*/ +- { +- int ch; +- int index=0; +- int have_param = FALSE, param = 0; +- HashItem *hip; +- char *p; +- int match = FALSE; /* Pacify gcc, st001906 - 0.19.6 */ ++ printf("%s", s2); + +- /* Look for a parameter */ +- p = s; +- while (*p && (!isdigit(*p) && *p != '-')) p++; +- if (*p && (isdigit(*p) || *p == '-')) { +- have_param = TRUE; +- param = atoi(p); +- } ++ if (oc->personality->word_end) ++ if (safe_printf(device, 0, oc->personality->word_end)) fprintf(stderr, TOO_MANY_ARGS, "word_end"); ++ } ++ } ++ else ++ /*----Search the RTF command hash-------------------------------------------*/ ++ { ++ int ch; ++ int index=0; ++ int have_param = FALSE, param = 0; ++ CmdHashItem *hip; ++ char *p; ++ int match = FALSE; /* Pacify gcc, st001906 - 0.19.6 */ + +- /* Generate a hash index */ +- ch = tolower(*s); +- if (ch >= 'a' && ch <= 'z') +- hip = hash[ch - 'a']; +- else +- hip = hashArray_other; ++ /* Look for a parameter */ ++ p = s; ++ while (*p && (!isdigit(*p) && *p != '-')) p++; ++ if (*p && (isdigit(*p) || *p == '-')) { ++ have_param = TRUE; ++ param = atoi(p); ++ } + +- if (!hip) { +- if (debug_mode) { +- if (safe_printf(0, op->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); +- printf("Unfamiliar RTF command: %s (HashIndex not found)", s); +- if (safe_printf(0, op->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); +- } +- } +- else { +- while (!done) { +- match = FALSE; ++ /* Generate a hash index */ ++ ch = tolower(*s); ++ if (ch >= 'a' && ch <= 'z') ++ hip = hash[ch - 'a']; ++ else ++ hip = hashArray_other; + +- if (have_param) { +- int len=p-s; +- if (!hip[index].name[len] && !strncmp(s, hip[index].name, len)) +- match = TRUE; +- } +- else +- match = !strcmp(s, hip[index].name); ++ if (!hip) { ++ if (oc->conversion->options->debug_mode) { ++ if (safe_printf(device, 0, oc->personality->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); ++ printf("Unfamiliar RTF command: %s (HashIndex not found)", s); ++ if (safe_printf(device, 0, oc->personality->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); ++ } ++ } ++ else { ++ while (!done) { ++ match = FALSE; + +- if (match) { ++ if (have_param) { ++ int len=p-s; ++ if (!hip[index].name[len] && !strncmp(s, hip[index].name, len)) ++ match = TRUE; ++ } ++ else ++ match = !strcmp(s, hip[index].name); + +- char *debug; +- int terminate_group; ++ if (match) { + +- if (hip[index].func) { +-//unicode +- terminate_group = hip[index].func (w,paragraph_align, have_param, param); +- /* daved - 0.19.4 - unicode support may need to skip only one word */ +- if (terminate_group == SKIP_ONE_WORD) +- w=w->next; +- else +- if (terminate_group) +- while(w) w=w->next; +- } ++ char *debug; ++ int terminate_group; + +- debug=hip[index].debug_print; ++ if (hip[index].func) { ++ //unicode ++ terminate_group = hip[index].func (oc, w, paragraph_align, have_param, param); ++ /* daved - 0.19.4 - unicode support may need to skip only one word */ ++ if (terminate_group == SKIP_ONE_WORD) ++ w=w->next; ++ else ++ if (terminate_group) ++ while(w) w=w->next; ++ } + +- if (debug && debug_mode) { +- if (safe_printf(0, op->comment_begin)) +- fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); +- printf("%s", debug); +- if (safe_printf(0, op->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); +- } ++ debug=hip[index].debug_print; + +- done=TRUE; +- } +- else { +- index++; +- if (!hip[index].name) +- done = TRUE; +- } +- } +- } +- if (!match) { +- if (debug_mode) { +- if (safe_printf(0, op->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); +- printf("Unfamiliar RTF command: %s", s); +- if (safe_printf(0, op->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); +- } +- } +- } +- } +-/*-------------------------------------------------------------------------*/ +- } else { ++ if (debug && oc->conversion->options->debug_mode) { ++ if (safe_printf(device, 0, oc->personality->comment_begin)) ++ fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); ++ printf("%s", debug); ++ if (safe_printf(device, 0, oc->personality->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); ++ } + +- Word *child; ++ done=TRUE; ++ } ++ else { ++ index++; ++ if (!hip[index].name) ++ done = TRUE; ++ } ++ } ++ } ++ if (!match) { ++ if (oc->conversion->options->debug_mode) { ++ if (safe_printf(device, 0, oc->personality->comment_begin)) fprintf(stderr, TOO_MANY_ARGS, "comment_begin"); ++ printf("Unfamiliar RTF command: %s", s); ++ if (safe_printf(device, 0, oc->personality->comment_end)) fprintf(stderr, TOO_MANY_ARGS, "comment_end"); ++ } ++ } ++ } ++ } ++ /*-------------------------------------------------------------------------*/ ++ } else { + +- child = w->child; ++ Word *child; + +- if (!paragraph_begined) { +- starting_paragraph_align (paragraph_align); +- paragraph_begined=TRUE; +- } ++ child = w->child; + +- if (child) +- word_print_core (child); +- } ++ if (!paragraph_begined) { ++ starting_paragraph_align (oc, paragraph_align); ++ paragraph_begined=TRUE; ++ } + +- if (w) +- w = w->next; +- } ++ if (child) ++ word_print_core (oc, child); ++ } + +- if (within_picture) { +- if(pictfile) { +- fclose(pictfile); +- if (safe_printf(0, op->imagelink_begin)) fprintf(stderr, TOO_MANY_ARGS, "imagelink_begin"); +- printf("%s", picture_path); +- if (safe_printf(0, op->imagelink_end)) fprintf(stderr, TOO_MANY_ARGS, "imagelink_end"); +- } +- within_picture=FALSE; +- } ++ if (w) ++ w = w->next; ++ } + +- /* Undo font attributes UNLESS we're doing table cells +- * since they would appear between and . +- */ ++ if (oc->conversion->within_picture) { ++ if(pictfile) { ++ fclose(pictfile); ++ if (safe_printf(device, 0, oc->personality->imagelink_begin)) fprintf(stderr, TOO_MANY_ARGS, "imagelink_begin"); ++ printf("%s", oc->conversion->picture_path); ++ if (safe_printf(device, 0, oc->personality->imagelink_end)) fprintf(stderr, TOO_MANY_ARGS, "imagelink_end"); ++ } ++ oc->conversion->within_picture=FALSE; ++ } + +- if (!is_cell_group) +- attr_pop_all(); +- else +- attr_drop_all(); ++ /* Undo font attributes UNLESS we're doing table cells ++ * since they would appear between and . ++ */ + +- /* Undo paragraph alignment +- */ +- if (paragraph_begined) +- ending_paragraph_align (paragraph_align); ++ if (!is_cell_group) ++ attr_pop_all(oc); ++ else ++ attr_drop_all(); + +- attrstack_drop(); ++ /* Undo paragraph alignment ++ */ ++ if (paragraph_begined) ++ ending_paragraph_align (oc, paragraph_align); + +- if((s = attr_get_param(ATTR_FONTFACE)) != NULL && +- strstr(s,"Symbol") != NULL) +- { +- if (!my_iconv_is_valid(desc2)) +- desc2 = desc; +- else +- desc = my_iconv_close(desc); ++ attrstack_drop(oc); + +- desc = my_iconv_open("UTF-8", FONT_SYMBOL); +- } +- else if((s = attr_get_param(ATTR_FONTFACE)) != NULL && +- strstr(s,"Greek") != NULL) +- { +- if (!my_iconv_is_valid(desc2)) +- desc2 = desc; +- else +- desc = my_iconv_close(desc); ++ if((s = attr_get_param(oc->conversion, ATTR_FONTFACE)) != NULL && ++ strstr(s,"Symbol") != NULL) ++ { ++ if (!my_iconv_is_valid(oc->conversion->desc2)) ++ oc->conversion->desc2 = oc->conversion->desc; ++ else ++ oc->conversion->desc = my_iconv_close(oc->conversion->desc); + +- desc = my_iconv_open("UTF-8", FONT_GREEK); +- } +- else +- if (my_iconv_is_valid(desc2)) /* AF - 0.21.0-rc2 */ +- { +- my_iconv_close(desc); +- desc = desc2; +- my_iconv_t_make_invalid(&desc2); +- } ++ oc->conversion->desc = my_iconv_open(oc->conversion, "UTF-8", FONT_SYMBOL); ++ } ++ else if((s = attr_get_param(oc->conversion, ATTR_FONTFACE)) != NULL && ++ strstr(s,"Greek") != NULL) ++ { ++ if (!my_iconv_is_valid(oc->conversion->desc2)) ++ oc->conversion->desc2 = oc->conversion->desc; ++ else ++ oc->conversion->desc = my_iconv_close(oc->conversion->desc); + ++ oc->conversion->desc = my_iconv_open(oc->conversion, "UTF-8", FONT_GREEK); ++ } ++ else ++ if (my_iconv_is_valid(oc->conversion->desc2)) /* AF - 0.21.0-rc2 */ ++ { ++ my_iconv_close(oc->conversion->desc); ++ oc->conversion->desc = oc->conversion->desc2; ++ my_iconv_t_make_invalid(&oc->conversion->desc2); ++ } + } + + +@@ -3652,37 +3664,226 @@ word_print_core (Word *w) + *=======================================================================*/ + + void +-word_print (Word *w) ++word_print (const struct OutputContext *oc, Word *w) + { +- CHECK_PARAM_NOT_NULL (w); ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; + +- if (!inline_mode) { ++ CHECK_PARAM_NOT_NULL (w); ++ ++ if (!oc->conversion->options->inline_mode) { + #if 1 /* AK3 - AF */ +- if (safe_printf(0, op->document_begin)) fprintf(stderr, TOO_MANY_ARGS, "document_begin"); +- if (safe_printf(0, op->header_begin)) fprintf(stderr, TOO_MANY_ARGS, "header_begin"); +- if (safe_printf(0, op->utf8_encoding)) fprintf(stderr, TOO_MANY_ARGS, "utf8_encoding"); ++ if (safe_printf(device, 0, oc->personality->document_begin)) fprintf(stderr, TOO_MANY_ARGS, "document_begin"); ++ if (safe_printf(device, 0, oc->personality->header_begin)) fprintf(stderr, TOO_MANY_ARGS, "header_begin"); ++ if (safe_printf(device, 0, oc->personality->utf8_encoding)) fprintf(stderr, TOO_MANY_ARGS, "utf8_encoding"); + #else +- printf(op->document_begin); +- printf(op->header_begin); ++ printf(oc->personality->document_begin); ++ printf(oc->personality->header_begin); + #endif +- } ++ } + +- print_banner (); ++ print_banner (oc); + +- within_header=TRUE; +- have_printed_body=FALSE; +- within_table=FALSE; +- simulate_allcaps=FALSE; +- word_print_core (w); +- end_table(); ++ oc->conversion->within_header=TRUE; ++ oc->conversion->have_printed_body=FALSE; ++ oc->conversion->within_table=FALSE; ++ oc->conversion->simulate_allcaps=FALSE; ++ word_print_core (oc, w); ++ end_table (oc); + +- if (!inline_mode) { ++ if (!oc->conversion->options->inline_mode) { + #if 1 /* AK3 - AF */ +- if (safe_printf(0, op->body_end)) fprintf(stderr, TOO_MANY_ARGS, "body_end"); +- if (safe_printf(0, op->document_end)) fprintf(stderr, TOO_MANY_ARGS, "document_end"); ++ if (safe_printf(device, 0, oc->personality->body_end)) fprintf(stderr, TOO_MANY_ARGS, "body_end"); ++ if (safe_printf(device, 0, oc->personality->document_end)) fprintf(stderr, TOO_MANY_ARGS, "document_end"); + #else +- printf(op->body_end); +- printf(op->document_end); ++ printf(oc->personality->body_end); ++ printf(oc->personality->document_end); + #endif +- } ++ } ++} ++ ++/* public functions */ ++void unrtf_set_output_device (unRTFOptions *options, unrtf_output_device_func output_func, void *output_data) ++{ ++ options->device.print = output_func; ++ options->device.data = output_data; ++} ++ ++/*======================================================================== ++ * Name: main ++ * Purpose: Main control function. ++ * Args: Args. ++ * Returns: Exit code. ++ *=======================================================================*/ ++ ++static int stdout_print(void *null, const char *data, size_t data_len) ++{ ++ return printf ("%s", data); ++} ++ ++static char *format_path(const unRTFOptions *options) ++{ ++ size_t fullname_len; ++ char *fullname; ++ int rc; ++ ++ if (!options->output_format || !options->config_directory) ++ return 0; ++ ++ fullname_len = strlen (options->output_format) + strlen (options->config_directory) + 6; ++ fullname = malloc(fullname_len + 1); ++ sprintf (fullname, "%s/%s.conf", options->config_directory, options->output_format); ++ ++ return fullname; ++} ++ ++/* TODO: make use of mmap */ ++int unrtf_convert_from_string (unRTFOptions *options, const char *input_str, size_t input_len) ++{ ++ Word *word; ++ char *path, *env_path_p; ++ ConversionContext cc; ++ OutputContext oc; ++ ++ if (!options) ++ return 0; ++ ++ if (!input_str || !input_len) ++ return 0; ++ ++ if (!options->output_format) ++ options->output_format = DEFAULT_OUTPUT; ++ if (!options->config_directory) ++ { ++ if ((env_path_p = getenv("UNRTF_SEARCH_PATH")) != NULL) ++ { ++ if (options->verbose_mode) ++ fprintf (stderr, "got environment path: %s\n", env_path_p); ++ options->config_directory = env_path_p; ++ } ++ else ++ options->config_directory = DEFAULT_UNRTF_SEARCH_PATH; ++ } ++ ++ path = format_path(options); ++ if (!path) ++ return 0; ++ ++ if (access(path, R_OK) != 0) ++ { ++ free (path); ++ return 0; ++ } ++ ++ if (!options->device.print) ++ unrtf_set_output_device (options, stdout_print, NULL); ++ ++ memset (&cc, 0, sizeof (struct ConversionContext)); ++ ++ hash_init (&cc); ++ ++ cc.read_buf = input_str; ++ cc.read_buf_end = input_len; ++ ++ cc.current_max_length = 1; ++ cc.ungot_char = -1; ++ cc.ungot_char2 = -1; ++ cc.ungot_char3 = -1; ++ ++ cc.picture_file_number=1; ++ cc.picture_bits_per_pixel=1; ++ cc.picture_type = PICT_UNKNOWN; ++ ++ cc.desc.desc = (iconv_t) -1; ++ cc.desc2.desc = (iconv_t) -1; ++ ++ cc.options = options; ++ ++ oc.personality = user_init(&cc, path); ++ oc.conversion = &cc; ++ ++ /* All the work starts here. word_read() should keep reading words until ++ * the end of the file. */ ++ word = word_read(&cc); ++ ++ if (options->dump_mode) { ++ word_dump(&cc, word); ++ printf("\n"); ++ } else { ++ /* Should we also optimize word before dump? - AF */ ++ /* word = optimize_word(oc.conversion, word); */ ++ word_print(&oc, word); ++ } ++ ++ /* marcossamaral - 0.19.9 */ ++ if (options->verbose_mode || options->debug_mode) { ++ unsigned long total=0; ++ total = hash_stats(&cc); ++ fprintf(stderr, "Done.\n"); ++ fprintf(stderr, "%lu words were hashed.\n", total); ++ } ++ ++ if (options->debug_mode) { ++ fprintf(stderr, "Total memory allocated %ld bytes.\n", ++ total_malloced()); ++ } ++ ++ hash_free(&cc); ++ word_free(word); ++ fonttable_free(oc.conversion); ++ if (my_iconv_is_valid(oc.conversion->desc)) ++ my_iconv_close(oc.conversion->desc); ++ op_free (oc.personality); ++ free (path); ++ ++ return 1; /* success */ ++} ++ ++int unrtf_convert_from_filename (unRTFOptions *options, const char *filename) ++{ ++ FILE *f; ++ size_t read_len, total_len, max_len; ++ char *content; ++ char buffer[4096]; ++ int is_stdin = 0, rc; ++ ++ if (!filename || strcmp(filename, "-") == 0) ++ { ++ is_stdin = 1; ++ f = stdin; ++ filename = ""; ++ } ++ else ++ { ++ f = fopen (filename, "r"); ++ if (!f) ++ return 0; ++ } ++ ++ if (options->verbose_mode || options->debug_mode) fprintf(stderr, "Processing %s...\n", filename); ++ ++ max_len = 4096; ++ total_len = 0; ++ content = malloc (max_len + 1); ++ do ++ { ++ read_len = fread (buffer, sizeof (char), 4096, f); ++ memcpy (content + total_len, buffer, read_len); ++ total_len += read_len; ++ if (total_len + 4096 > max_len) ++ { ++ max_len = total_len + 4096; ++ content = realloc (content, max_len + 1); ++ } ++ } ++ while (read_len == 4096); ++ ++ if (!is_stdin) ++ fclose (f); ++ ++ content[total_len] = 0; ++ rc = unrtf_convert_from_string (options, content, total_len); ++ ++ free (content); ++ ++ return rc; + } +diff -durpN unrtf-0.21.2.old/src/convert.h unrtf-0.21.2/src/convert.h +--- unrtf-0.21.2.old/src/convert.h 2010-07-03 22:30:58.000000000 -0400 ++++ unrtf-0.21.2/src/convert.h 2011-11-08 19:15:18.052195124 -0500 +@@ -36,18 +36,135 @@ + + #ifndef _CONVERT + ++#include "my_iconv.h" ++ + enum { +- CHARSET_ANSI=1, +- CHARSET_MAC, +- CHARSET_CP437, +- CHARSET_CP850, ++ CHARSET_ANSI=1, ++ CHARSET_MAC, ++ CHARSET_CP437, ++ CHARSET_CP850, + }; + + #ifndef _WORD + #include "word.h" + #endif + +-extern void word_print (Word*); ++typedef struct { ++ int num; ++ char *name; ++} FontEntry; ++ ++#define MAX_FONTS (8192) ++ ++/* RTF color table colors are RGB */ ++ ++typedef struct { ++ unsigned char r,g,b; ++} Color; ++ ++#define MAX_COLORS (1024) ++ ++/* For each RTF text block (the text within braces) we must keep ++ * an AttrStack which is a stack of attributes and their optional ++ * parameter. Since RTF text blocks are nested, these make up a ++ * stack of stacks. And, since RTF text blocks inherit attributes ++ * from parent blocks, all new AttrStacks do the same from ++ * their parent AttrStack. ++ */ ++#define MAX_ATTRS (10000) ++ ++typedef struct _stack { ++ unsigned char attr_stack[MAX_ATTRS]; ++ char *attr_stack_params[MAX_ATTRS]; ++ int tos; ++ struct _stack *next; ++} AttrStack; ++ ++typedef struct _hi { ++ struct _hi *next; ++ char *str; ++ unsigned long value; ++} HashItem; ++ ++typedef struct ConversionContext { ++ const struct unRTFOptions *options; ++ ++ HashItem *hash[256]; ++ unsigned long hash_length[256]; ++ unsigned long hash_value; ++ ++ int lineno; /* Used for error reporting and final line count. */ ++ ++ int banner_printed; ++ ++ int within_picture; ++ int picture_file_number; ++ char picture_path[256]; ++ int picture_width; ++ int picture_height; ++ int picture_bits_per_pixel; ++ int picture_type; ++ int picture_wmetafile_type; ++ char *picture_wmetafile_type_str; ++ ++ int have_printed_body; ++ int within_header; ++ ++ char *hyperlink_base; ++ ++ FontEntry font_table[MAX_FONTS]; ++ int total_fonts; ++ ++ Color color_table[MAX_COLORS]; ++ int total_colors; ++ ++ my_iconv_t desc; ++ my_iconv_t desc2; ++ ++ /* Previously in word_print_core function ++ */ ++ int total_chars_this_line; /* for simulating \tab */ ++ ++ /* This value is set by attr_push and attr_pop ++ */ ++ int simulate_smallcaps; ++ int simulate_allcaps; ++ ++ int coming_pars_that_are_tabular; ++ int within_table; ++ int have_printed_row_begin; ++ int have_printed_cell_begin; ++ int have_printed_row_end; ++ int have_printed_cell_end; ++ ++ /* attr.c */ ++ AttrStack *stack_of_stacks; ++ AttrStack *stack_of_stacks_top; ++ ++ /* word.c */ ++ int indent_level; ++ ++ /* parse.c */ ++ char *input_str; ++ unsigned long current_max_length; ++ int ungot_char; ++ int ungot_char2; ++ int ungot_char3; ++ int last_returned_ch; ++ int buffer_size; ++ ++ const char *read_buf; ++ int read_buf_end; ++ int read_buf_index; ++ ++} ConversionContext; ++ ++struct OutputContext; ++ ++extern void word_print (const struct OutputContext *, Word*); ++extern void starting_body(const struct OutputContext *); ++extern void starting_text(const struct OutputContext *); ++ + #define FONT_GREEK "cp1253" + #define FONT_SYMBOL "SYMBOL" + +diff -durpN unrtf-0.21.2.old/src/defs.h unrtf-0.21.2/src/defs.h +--- unrtf-0.21.2.old/src/defs.h 2010-07-03 22:30:58.000000000 -0400 ++++ unrtf-0.21.2/src/defs.h 2011-11-08 19:15:18.052195124 -0500 +@@ -64,9 +64,6 @@ + #define SKIP_ONE_WORD 2 + #endif + +-#define USAGE "unrtf [--version] [--verbose] [--help] [--nopict|-n] [--noremap] [--html] [--text] [--vt] [--latex] [--rtf] [-P config_search_path] [-t )] " +- +- + /* Default names for RTF's default fonts */ + #define FONTNIL_STR "Times,TimesRoman,TimesNewRoman" + #define FONTROMAN_STR "Times,Palatino" +@@ -76,3 +73,6 @@ + #define FONTDECOR_STR "ZapfChancery" + #define FONTTECH_STR "Symbol" + ++/* This one should be deduce from the configure script */ ++#define DEFAULT_UNRTF_SEARCH_PATH "/usr/local/lib/unrtf/" ++#define DEFAULT_OUTPUT "html" +diff -durpN unrtf-0.21.2.old/src/error.c unrtf-0.21.2/src/error.c +--- unrtf-0.21.2.old/src/error.c 2010-07-03 22:30:58.000000000 -0400 ++++ unrtf-0.21.2/src/error.c 2011-11-08 19:15:18.052195124 -0500 +@@ -51,27 +51,11 @@ + #include + #endif + ++#include "convert.h" + #include "defs.h" + #include "main.h" + + +- +-/*======================================================================== +- * Name: usage +- * Purpose: Prints usage information and exits with an error. +- * Args: None. +- * Returns: None. +- *=======================================================================*/ +- +-void +-usage () +-{ +- fprintf(stderr, "Usage: %s\n", USAGE); +- exit(-3); +-} +- +- +- + /*======================================================================== + * Name: error_handler + * Purpose: Prints error message and other useful info, then exits. +@@ -80,10 +64,10 @@ usage () + *=======================================================================*/ + + void +-error_handler (char* message) ++error_handler (const struct ConversionContext *cc, char* message) + { + #if 1 +- fprintf(stderr, "Error (line %d): %s\n", lineno, message); ++ fprintf(stderr, "Error (line %d): %s\n", cc->lineno, message); + #else + fprintf(stderr, "Error: %s\n", message); + #endif +diff -durpN unrtf-0.21.2.old/src/error.h unrtf-0.21.2/src/error.h +--- unrtf-0.21.2.old/src/error.h 2010-07-03 22:30:58.000000000 -0400 ++++ unrtf-0.21.2/src/error.h 2011-11-08 19:15:18.056195127 -0500 +@@ -37,9 +37,10 @@ + + #define CHECK_MALLOC_SUCCESS(XX) { if ((XX)==NULL) { fprintf (stderr, "internal error: cannot allocate memory in %s at %d\n", __FILE__, __LINE__); exit (1); }} + ++struct ConversionContext; + + extern void usage(void); +-extern void error_handler (char*); ++extern void error_handler (const struct ConversionContext *, char*); + extern void warning_handler (char*); + + +diff -durpN unrtf-0.21.2.old/src/hash.c unrtf-0.21.2/src/hash.c +--- unrtf-0.21.2.old/src/hash.c 2010-07-03 22:30:58.000000000 -0400 ++++ unrtf-0.21.2/src/hash.c 2011-11-08 19:15:18.056195127 -0500 +@@ -53,24 +53,16 @@ + #include + #endif + ++#ifdef HAVE_STDLIB_H ++#include ++#endif ++ ++#include "convert.h" + #include "error.h" + #include "main.h" + #include "malloc.h" + +- +-typedef struct _hi { +- struct _hi *next; +- char *str; +- unsigned long value; +-} HashItem; +- +- +-/* Index by first char of string */ +-static HashItem *hash[256]; +-static unsigned long hash_length[256]; +-static unsigned long hash_value=0; +- +- ++#include "hash.h" + + /*======================================================================== + * Name: hash_init +@@ -80,13 +72,13 @@ static unsigned long hash_value=0; + *=======================================================================*/ + + void +-hash_init () ++hash_init (struct ConversionContext *cc) + { +- int i; +- for (i=0; i<256; i++) { +- hash[i]=NULL; +- hash_length[i]=0; +- } ++ int i; ++ for (i=0; i<256; i++) { ++ cc->hash[i]=NULL; ++ cc->hash_length[i]=0; ++ } + } + + +@@ -101,14 +93,14 @@ hash_init () + *=======================================================================*/ + + unsigned long +-hash_stats () ++hash_stats (struct ConversionContext *cc) + { +- int i; +- unsigned long total=0; +- for (i=0; i<256; i++) { +- total += hash_length[i]; +- } +- return(total); ++ int i; ++ unsigned long total=0; ++ for (i=0; i<256; i++) { ++ total += cc->hash_length[i]; ++ } ++ return(total); + } + + +@@ -121,32 +113,32 @@ hash_stats () + *=======================================================================*/ + + static HashItem * +-hashitem_new (char *str) ++hashitem_new (struct ConversionContext *cc, char *str) + { +- HashItem *hi; +- unsigned long i; +- +- hi=(HashItem*) my_malloc(sizeof(HashItem)); +- if (!hi) +- error_handler("Out of memory"); +- memset ((void*)hi, 0, sizeof (HashItem)); +- +- hi->str = my_strdup(str); ++ HashItem *hi; ++ unsigned long i; + +- i = *str; +- if (i=='\\') i=str[1]; +- i <<= 24; +- hi->value = i | (hash_value++ & 0xffffff); +- hi->next = NULL; ++ hi=(HashItem*) my_malloc(sizeof(HashItem)); ++ if (!hi) ++ error_handler(cc, "Out of memory"); ++ memset ((void*)hi, 0, sizeof (HashItem)); ++ ++ hi->str = my_strdup(cc, str); ++ ++ i = *str; ++ if (i=='\\') i=str[1]; ++ i <<= 24; ++ hi->value = i | (cc->hash_value++ & 0xffffff); ++ hi->next = NULL; + + #if 0 +- if (debug_mode) { +- printf ("\n", +- hi->value, hi->str); +- } ++ if (debug_mode) { ++ printf ("\n", ++ hi->value, hi->str); ++ } + #endif + +- return hi; ++ return hi; + } + + +@@ -158,7 +150,7 @@ hashitem_new (char *str) + *=======================================================================*/ + + unsigned long +-hash_get_index (char *str) ++hash_get_index (struct ConversionContext *cc, char *str) + { + #if 1 /* daved - 0.19.1 */ + unsigned short index; +@@ -177,17 +169,17 @@ hash_get_index (char *str) + if (ch=='\\' && *(str+1)) + ch = *(str+1); + index = ch; +- hi = hash[index]; ++ hi = cc->hash[index]; + while (hi) { + if (!strcmp(hi->str,str)) + return hi->value; + hi=hi->next; + } + /* not in hash */ +- hi = hashitem_new (str); +- hi->next = hash[index]; +- hash [index] = hi; +- ++hash_length [index]; ++ hi = hashitem_new (cc, str); ++ hi->next = cc->hash[index]; ++ cc->hash [index] = hi; ++ ++cc->hash_length [index]; + return hi->value; + } + +@@ -201,13 +193,13 @@ hash_get_index (char *str) + *=======================================================================*/ + + char* +-hash_get_string (unsigned long value) ++hash_get_string (const struct ConversionContext *cc, unsigned long value) + { + int index; + HashItem *hi; + + index = value >> 24; +- hi = hash[index]; ++ hi = cc->hash[index]; + while (hi) { + if (hi->value == value) + return hi->str; +@@ -216,3 +208,27 @@ hash_get_string (unsigned long value) + warning_handler("Word not in hash"); + return NULL; + } ++ ++static void ++hashitem_free (HashItem *item) ++{ ++ HashItem *next = item->next; ++ ++ my_free (item->str); ++ free (item); ++ if (next) ++ hashitem_free(next); ++} ++ ++void ++hash_free (struct ConversionContext *cc) ++{ ++ int i; ++ for (i=0; i<256; i++) { ++ if (cc->hash[i]) { ++ hashitem_free(cc->hash[i]); ++ } ++ cc->hash[i]=NULL; ++ cc->hash_length[i]=0; ++ } ++} +diff -durpN unrtf-0.21.2.old/src/hash.h unrtf-0.21.2/src/hash.h +--- unrtf-0.21.2.old/src/hash.h 2010-07-03 22:30:58.000000000 -0400 ++++ unrtf-0.21.2/src/hash.h 2011-11-08 19:15:18.056195127 -0500 +@@ -32,11 +32,11 @@ + * 16 Dec 07, daved@physiol.usyd.edu.au: updated to GPL v3 + *--------------------------------------------------------------------*/ + ++struct ConversionContext; + +- +-extern void hash_init (void); +-extern unsigned long hash_stats (void); +-extern unsigned long hash_get_index (char *); +-extern char* hash_get_string (unsigned long ); +- ++extern void hash_init (struct ConversionContext *); ++extern unsigned long hash_stats (struct ConversionContext *); ++extern unsigned long hash_get_index (struct ConversionContext *, char *); ++extern char* hash_get_string (const struct ConversionContext *, unsigned long); ++extern void hash_free (struct ConversionContext *); + +diff -durpN unrtf-0.21.2.old/src/main.c unrtf-0.21.2/src/main.c +--- unrtf-0.21.2.old/src/main.c 2010-07-03 22:30:58.000000000 -0400 ++++ unrtf-0.21.2/src/main.c 2011-11-08 19:15:18.056195127 -0500 +@@ -1,23 +1,23 @@ + /*============================================================================= +- GNU UnRTF, a command-line program to convert RTF documents to other formats. +- Copyright (C) 2000, 2001, 2004 by Zachary Smith ++ GNU UnRTF, a command-line program to convert RTF documents to other formats. ++ Copyright (C) 2000, 2001, 2004 by Zachary Smith + +- This program is free software; you can redistribute it and/or modify +- it under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 3 of the License, or +- (at your option) any later version. ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3 of the License, or ++ (at your option) any later version. + +- This program is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- GNU General Public License for more details. ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. + +- You should have received a copy of the GNU General Public License +- along with this program; if not, write to the Free Software +- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software ++ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +- The maintainer is reachable by electronic mail at daved@physiol.usyd.edu.au +-=============================================================================*/ ++ The maintainer is reachable by electronic mail at daved@physiol.usyd.edu.au ++ =============================================================================*/ + + + /*---------------------------------------------------------------------- +@@ -45,7 +45,7 @@ + * 17 Dec 07, daved@physiol.usyd.edu.au: support for --noremap from + * David Santinoli + * 09 Nov 08, arkadiusz.firus@gmail.com: support for -t +- and read stdin if no input file provided ++ and read stdin if no input file provided + * 13 Dec 08, daved@physiol.usyd.edu.au: search path code + * 17 Jan 10, daved@physiol.usyd.edu.au: change search path to directory + * containing output conf and font charmap files +@@ -70,263 +70,136 @@ + #include + + #include "defs.h" +-#include "error.h" +-#include "word.h" +-#include "convert.h" +-#include "parse.h" +-#include "hash.h" +-#include "malloc.h" +-#include "path.h" ++#include "unrtf.h" + +-#include "output.h" +-#include "user.h" + #include "main.h" +-#include "util.h" +- +-int nopict_mode; /* TRUE => Do not write \pict's to files */ +-int dump_mode; /* TRUE => Output a dump of the RTF word tree */ +-int debug_mode; /* TRUE => Output debug comments within HTML */ +-int lineno; /* Used for error reporting and final line count. */ +-int simple_mode; /* TRUE => Output HTML without SPAN/DIV tags -- This would +- probably be more useful if we could pull out tags +- as well. */ +-int inline_mode; /* TRUE => Output HTML without HTML/BODY/HEAD -- This is +- buggy. I've seen it output pages of tags. */ +-/* marcossamaral - 0.19.9 */ +-int verbose_mode; /* TRUE => Output additional informations about unrtf */ +-int no_remap_mode; /* don't remap codepoints */ +- +- +-OutputPersonality *op = NULL; + + /*======================================================================== +- * Name: get_config +- * Purpose: Updates output acording to information found in file path. +- * Args: Path to configuration file, OutputPersonality, mode. +- If mode == 0 configuration file is defined by user. +- If mode == 1 configuration file is in CONFIG_DIR. +- * Returns: Updated OutputPersonality. ++ * Name: usage ++ * Purpose: Prints usage information and exits with an error. ++ * Args: None. ++ * Returns: None. + *=======================================================================*/ + +-OutputPersonality * +-get_config(char *path, OutputPersonality *op, int mode) ++void ++usage () + { +- char *absolute_path; +- char *user_path; +- char u_success=0; +- struct path_dir *path_dir_p; +- +- switch(mode) +- { +- case 0: +- if(n_path_dirs == 0) +- { +- fprintf(stderr,"no directories to search for %s\n", path); +- exit(1); +- } +- for(path_dir_p = &topdir; path_dir_p->dir_name; path_dir_p = path_dir_p->next) +- { +- char *p; +- p = path_dir_p->dir_name; +- if(*(p+strlen(p)-1) != '/') +- p = concatenate(p, "/"); +- p=concatenate(p, path); +- user_path=concatenate(p, ".conf"); +- if(access(user_path, F_OK|R_OK)) +- continue; +- op = user_init(op, user_path); +- u_success++; +- break; +- } +- if(!u_success) +- { +- fprintf(stderr, "failed to find %s.conf in search path dirs\n", path); +- exit(1); +- } +- break; +- case 1: +- path = concatenate(CONFIG_DIR, path); +- absolute_path = concatenate(path, ".conf"); +- op = user_init(op, absolute_path); +- my_free(absolute_path); +- break; +- default: +- error_handler("Error in function get_config (file main.c)."); +- } +- +- return op; ++ fprintf(stderr, "Usage: %s\n", USAGE); ++ exit(-3); + } + +-/*======================================================================== +- * Name: main +- * Purpose: Main control function. +- * Args: Args. +- * Returns: Exit code. +- *=======================================================================*/ +- + int + main (int argc, char **argv) + { +- FILE *f; +- Word * word; +- char *path = NULL; +- char *env_path_p = '\0'; +- +- int i; +- nopict_mode = debug_mode = dump_mode = inline_mode = no_remap_mode = FALSE; +- /* initialize search path to compiled-in value */ +- search_path = DEFAULT_UNRTF_SEARCH_PATH; ++ unRTFOptions unrtf_options; ++ int show_version = 0, i, free_path = 0; ++ char *path = NULL, *old_path; ++ size_t path_len; + +- if((env_path_p = getenv("UNRTF_SEARCH_PATH")) != NULL) +- { +- if(verbose_mode) +- fprintf(stderr, "got environment path: %s\n", env_path_p); +- search_path=env_path_p; +- } ++ memset (&unrtf_options, 0, sizeof (unRTFOptions)); + +- /* Handle arguments */ ++ /* Handle arguments */ + +- for (i = 1; i < argc; i++) { +- if (!strcmp("--dump", argv[i])) dump_mode = TRUE; +- else if (!strcmp("-d", argv[i])) dump_mode = TRUE; +- else if (!strcmp("--debug", argv[i])) debug_mode = TRUE; +- else if (!strcmp("--verbose", argv[i])) verbose_mode = TRUE; +- else if (!strcmp("--simple", argv[i])) simple_mode = TRUE; +- else if (!strcmp("--noremap", argv[i])) no_remap_mode = TRUE; +- else if (!strcmp("-t", argv[i])) +- { +- if ((i + 1) < argc && *argv[i + 1] != '-') +- { +- i++; +- if(!path_checked && check_dirs() == 0) +- { +- fprintf(stderr,"no config dirs for %s\n", argv[i]); +- exit(1); +- } +- op = get_config(argv[i], op, 0); +- } +- } +- else if (!strcmp("-P", argv[i])) +- { +- if(i+1 > argc) +- { +- fprintf(stderr,"-P needs a path argument\n"); +- exit(1); +- } +- search_path=argv[++i]; +- } +- else if (!strcmp("--inline", argv[i])) inline_mode = TRUE; +- else if (!strcmp("--help", argv[i])) { +- usage(); +- } +- else if (!strcmp("--version", argv[i])) { +- fprintf(stderr, "%s\n", PACKAGE_VERSION); +- fprintf(stderr, "search path is: %s\n", search_path); +- exit(0); +- } +- else if (!strcmp("--nopict", argv[i])) nopict_mode = TRUE; +- else if (!strcmp("-n", argv[i])) nopict_mode = TRUE; +- else if (!strncmp("--", argv[i], 2)) ++ for (i = 1; i < argc; i++) { ++ if (!strcmp("--dump", argv[i])) unrtf_options.dump_mode = TRUE; ++ else if (!strcmp("-d", argv[i])) unrtf_options.dump_mode = TRUE; ++ else if (!strcmp("--debug", argv[i])) unrtf_options.debug_mode = TRUE; ++ else if (!strcmp("--verbose", argv[i])) unrtf_options.verbose_mode = TRUE; ++ else if (!strcmp("--simple", argv[i])) unrtf_options.simple_mode = TRUE; ++ else if (!strcmp("--noremap", argv[i])) unrtf_options.no_remap_mode = TRUE; ++ else if (!strcmp("-t", argv[i])) ++ { ++ if ((i + 1) < argc && *argv[i + 1] != '-') ++ { ++ i++; ++ unrtf_options.output_format = argv[i]; ++ } ++ else ++ { ++ fprintf(stderr, "-t needs a path argument\n"); ++ exit(1); ++ } ++ } ++ else if (!strcmp("-P", argv[i])) ++ { ++ if ((i + 1) < argc && *argv[i + 1] != '-') ++ { ++ i++; ++ unrtf_options.config_directory = argv[i]; ++ } ++ else ++ { ++ fprintf(stderr,"-P needs a path argument\n"); ++ exit(1); ++ } ++ } ++ else if (!strcmp("--inline", argv[i])) unrtf_options.inline_mode = TRUE; ++ else if (!strcmp("--help", argv[i])) { ++ usage(); ++ } ++ else if (!strcmp("--version", argv[i])) { ++ show_version = 1; ++ } ++ else if (!strcmp("--nopict", argv[i])) unrtf_options.nopict_mode = TRUE; ++ else if (!strcmp("-n", argv[i])) unrtf_options.nopict_mode = TRUE; ++ else if (!strncmp("--", argv[i], 2)) + #if 0 /* daved 0.21.1 */ +- op = get_config(&argv[i][2], op, 1) ++ op = get_config(&cc, &argv[i][2], op, 1) + #else +- { +- if(!path_checked && check_dirs() == 0) +- { +- fprintf(stderr,"no config dirs for %s\n", argv[i]); +- exit(1); +- } +- op = get_config(&argv[i][2], op, 0); +- } ++ { ++ unrtf_options.output_format = argv[i] + 2; ++ } + #endif +- else { +- if (*argv[i] == '-') usage(); +- +- if (path) +- usage(); +- else +- path = argv[i]; +- } +- } +- +- +- +- if (op == NULL) +- op = get_config(DEFAULT_OUTPUT, op, 1); +- if(!path_checked && check_dirs() == 0) +- { +- fprintf(stderr,"no config directories\n"); +- exit(1); +- } +- +- +- hash_init(); +- +- /* Program information */ +- if (verbose_mode || debug_mode) { +- fprintf(stderr, "This is UnRTF "); +- fprintf(stderr, "version %s\n", PACKAGE_VERSION); +- fprintf(stderr, "By Dave Davey, Marcos Serrou do Amaral and Arkadiusz Firus\n"); +- fprintf(stderr, "Original Author: Zachary Smith\n"); +- show_dirs(); +- } +- +- if (debug_mode) fprintf(stderr, "Debug mode.\n"); +- if (dump_mode) fprintf(stderr, "Dump mode.\n"); +- +- /* Open file for reading. Append ".rtf" to file name if not supplied. */ +- if (path == NULL) +- f = stdin; +- else +- { +- f = fopen(path, "r"); +- if (!f) { +- char path2[200]; +- strcpy(path2, path); +- strcat(path2, ".rtf"); +- f = fopen(path2, "r"); +- if (!f) +- error_handler("Cannot open input file"); +- } +- } +- +- if (verbose_mode || debug_mode) fprintf(stderr, "Processing %s...\n", path); +- +- /* Keep track of lines processed. This is arbitrary to the user as +- * RTF ignores newlines. May be helpful in error tracking. */ +- lineno = 0; ++ else { ++ if (*argv[i] == '-') usage(); + +- /* All the work starts here. word_read() should keep reading words until +- * the end of the file. */ +- word = word_read(f); ++ if (path) ++ usage(); ++ else ++ path = argv[i]; ++ } ++ } + +- if (dump_mode) { +- word_dump(word); +- printf("\n"); +- } else { +-/* Should we also optimize word before dump? - AF */ +- word = optimize_word(word); +- word_print(word); +- } ++ if (show_version) { ++ fprintf(stderr, "%s\n", PACKAGE_VERSION); ++ fprintf(stderr, "search path is: %s\n", ++ (unrtf_options.config_directory ++ ? unrtf_options.config_directory : DEFAULT_UNRTF_SEARCH_PATH)); ++ exit(0); ++ } + +- fclose(f); ++ /* Program information */ ++ if (unrtf_options.verbose_mode || unrtf_options.debug_mode) { ++ fprintf(stderr, "This is UnRTF "); ++ fprintf(stderr, "version %s\n", PACKAGE_VERSION); ++ fprintf(stderr, "By Dave Davey, Marcos Serrou do Amaral and Arkadiusz Firus\n"); ++ fprintf(stderr, "Original Author: Zachary Smith\n"); ++ fprintf(stderr, "Configuration directory: %s\n", ++ (unrtf_options.config_directory ++ ? unrtf_options.config_directory ++ : DEFAULT_UNRTF_SEARCH_PATH)); ++ } + +- /* marcossamaral - 0.19.9 */ +- if(verbose_mode || debug_mode) { +- unsigned long total=0; +- total = hash_stats(); +- fprintf(stderr, "Done.\n"); +- fprintf(stderr, "%lu words were hashed.\n", total); +- } ++ if (unrtf_options.debug_mode) fprintf(stderr, "Debug mode.\n"); ++ if (unrtf_options.dump_mode) fprintf(stderr, "Dump mode.\n"); + +- if (debug_mode) { +- fprintf(stderr, "Total memory allocated %ld bytes.\n", +- total_malloced()); +- } ++ /* Check file access for reading. Append ".rtf" to file name if not supplied. */ ++ if (path && access(path, R_OK) != 0) { ++ path_len = strlen(path); ++ old_path = path; ++ path = malloc (path_len + 5); ++ sprintf (path, "%s.rtf", old_path); ++ if (access(path, R_OK) != 0) { ++ free (path); ++ fprintf (stderr, "Cannot access input file.\n"); ++ exit (10); ++ } ++ free_path = 1; ++ } + +- /* May as well */ +- word_free(word); ++ unrtf_convert_from_filename (&unrtf_options, path); ++ if (free_path) ++ free (path); + +- return 0; ++ return 0; + } +- +diff -durpN unrtf-0.21.2.old/src/main.h unrtf-0.21.2/src/main.h +--- unrtf-0.21.2.old/src/main.h 2010-07-03 22:30:58.000000000 -0400 ++++ unrtf-0.21.2/src/main.h 2011-11-08 19:15:18.056195127 -0500 +@@ -35,21 +35,8 @@ + * 17 Jan 10, daved@physiol.usyd.edu.au: change CONFIG_DIR to drop outputs/ + *--------------------------------------------------------------------*/ + +- +-extern int lineno; +-extern int debug_mode; +-extern int simple_mode; +-extern int inline_mode; +-extern int no_remap_mode; +- +- + #ifndef _OUTPUT + #include "output.h" + #endif + +-#define CONFIG_DIR "/usr/local/lib/unrtf/" +-#define DEFAULT_OUTPUT "html" +- +-extern OutputPersonality *op; +- +- ++#define USAGE "unrtf [--version] [--verbose] [--help] [--nopict|-n] [--noremap] [--html] [--text] [--vt] [--latex] [--rtf] [-P config_search_path] [-t )] " +diff -durpN unrtf-0.21.2.old/src/Makefile.am unrtf-0.21.2/src/Makefile.am +--- unrtf-0.21.2.old/src/Makefile.am 2010-07-03 22:30:58.000000000 -0400 ++++ unrtf-0.21.2/src/Makefile.am 2011-11-08 19:15:18.060195122 -0500 +@@ -13,7 +13,6 @@ unrtf_SOURCES = attr.c attr.h \ + malloc.c malloc.h \ + output.c output.h \ + parse.c parse.h \ +- path.c path.h \ + unicode.c unicode.h \ + user.c user.h \ + util.c util.h \ +diff -durpN unrtf-0.21.2.old/src/malloc.c unrtf-0.21.2/src/malloc.c +--- unrtf-0.21.2.old/src/malloc.c 2010-07-09 01:13:05.000000000 -0400 ++++ unrtf-0.21.2/src/malloc.c 2011-11-08 19:15:18.060195122 -0500 +@@ -135,19 +135,19 @@ total_malloced (void) { + *=======================================================================*/ + + char * +-my_strdup (char *src) { +- unsigned long len; +- char *ptr; ++my_strdup (struct ConversionContext *cc, char *src) { ++ unsigned long len; ++ char *ptr; + +- CHECK_PARAM_NOT_NULL(src); ++ CHECK_PARAM_NOT_NULL(src); + +- len = strlen(src); +- ptr = my_malloc (len+1); +- if (!ptr) +- error_handler ("out of memory in strdup()"); ++ len = strlen(src); ++ ptr = my_malloc (len+1); ++ if (!ptr) ++ error_handler (cc, "out of memory in strdup()"); + +- strcpy (ptr, src); +- return ptr; ++ sprintf (ptr, "%s", src); ++ return ptr; + } + /* added by daved */ + #include +@@ -163,5 +163,5 @@ rpl_malloc (size_t n) + { + if (n == 0) + n = 1; +-return malloc (n); ++ return malloc (n); + } +diff -durpN unrtf-0.21.2.old/src/malloc.h unrtf-0.21.2/src/malloc.h +--- unrtf-0.21.2.old/src/malloc.h 2010-07-03 22:30:58.000000000 -0400 ++++ unrtf-0.21.2/src/malloc.h 2011-11-08 19:15:18.060195122 -0500 +@@ -32,9 +32,10 @@ + * 09 Nov 08, arkadiusz.firus@gmail.com: added my_realloc + *--------------------------------------------------------------------*/ + ++struct ConversionContext; ++ + extern char * my_malloc (unsigned long); + extern void my_free (char*); + extern char * my_realloc(char*, unsigned long, unsigned long); + extern unsigned long total_malloced (void); +-extern char * my_strdup (char*); +- ++extern char * my_strdup (struct ConversionContext *, char*); +diff -durpN unrtf-0.21.2.old/src/my_iconv.c unrtf-0.21.2/src/my_iconv.c +--- unrtf-0.21.2.old/src/my_iconv.c 2010-08-16 00:12:43.000000000 -0400 ++++ unrtf-0.21.2/src/my_iconv.c 2011-11-08 19:15:18.060195122 -0500 +@@ -12,154 +12,133 @@ + #include + #include + +-#include "malloc.h" +-#include "my_iconv.h" +-#include "util.h" + #if 1 /* daved 0.21.1 */ + #include "unicode.h" +-#include "path.h" + #include + #include + #endif + +-extern int verbose_mode; ++#include "convert.h" ++#include "malloc.h" ++#include "my_iconv.h" ++#include "util.h" ++#include "unrtf.h" ++ ++#define MY_ICONV_T_CLEAR {(iconv_t) -1, NULL} + + my_iconv_t +-my_iconv_open(const char *tocode, const char *fromcode) ++my_iconv_open(const struct ConversionContext *cc, const char *tocode, const char *fromcode) + { +- char *path; +- FILE *f; +- my_iconv_t cd = MY_ICONV_T_CLEAR; +- int c, i; ++ char *path; ++ FILE *f; ++ my_iconv_t cd = MY_ICONV_T_CLEAR; ++ int c, i; + +- if ((cd.desc = iconv_open(tocode, fromcode)) == (iconv_t) -1) +- { +-#if 1 /* daved 0.21.1 */ +- struct path_dir *path_dir_p; +- char u_success=0; +- for(path_dir_p = &topdir; path_dir_p->dir_name; path_dir_p = path_dir_p->next) +- { +- char *p; +- p = path_dir_p->dir_name; +- if(*(p+strlen(p)-1) != '/') +- p = concatenate(p, "/"); +- p = concatenate(p, fromcode); +- path=concatenate(p, ".charmap"); +- if(access(path, F_OK|R_OK)) +- continue; +- u_success++; +- break; +- } +- if(!u_success) +- { +-#else +- path = concatenate(CHARMAP_DIR, fromcode); +-#endif +-#if 1 /* daved 0.21.1 */ +- } +- if((f = fopen(path, "r")) == NULL && verbose_mode) +- fprintf(stderr, "failed to open charmap file %s\n", path); +-#else +- f = fopen(path, "r"); +-#endif ++ if ((cd.desc = iconv_open(tocode, fromcode)) == (iconv_t) -1) ++ { ++ path = my_malloc((strlen(cc->options->config_directory) + strlen(fromcode) + 10) * sizeof(char)); ++ sprintf (path, "%s/%s.charmap", cc->options->config_directory, fromcode); + +- if (f != NULL) +- { +- cd.char_table = (char **)my_malloc(char_table_size * sizeof(char *)); +- c = fgetc(f); ++ if((f = fopen(path, "r")) == NULL && cc->options->verbose_mode) ++ fprintf(stderr, "failed to open charmap file %s\n", path); + +- for (i = 0; i < char_table_size && c != EOF; i++) +- { +- if (c == '<') +- cd.char_table[i] = get_unicode_char(f); +- leave_line(f); +- c = fgetc(f); +- } ++ if (f != NULL) ++ { ++ cd.char_table = (char **)my_malloc(char_table_size * sizeof(char *)); ++ c = fgetc(f); + +- fclose(f); +- } ++ for (i = 0; i < char_table_size && c != EOF; i++) ++ { ++ if (c == '<') ++ cd.char_table[i] = get_unicode_char(f); ++ leave_line(f); ++ c = fgetc(f); ++ } + +- my_free(path); +- } ++ fclose(f); ++ } + +- return cd; ++ my_free(path); ++ } ++ ++ return cd; + } + + size_t + my_iconv(my_iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft) + { +- int c, i; +- size_t result = 0; ++ int c, i; ++ size_t result = 0; + +- if (cd.desc == (iconv_t) -1) { +- if (cd.char_table != NULL) +- { +- while (*inbytesleft > 0 && *outbytesleft > 0) +- { +- c = (int) **inbuf; +- if (c < 0) +- c = 256 + c; ++ if (cd.desc == (iconv_t) -1) { ++ if (cd.char_table != NULL) ++ { ++ while (*inbytesleft > 0 && *outbytesleft > 0) ++ { ++ c = (int) **inbuf; ++ if (c < 0) ++ c = 256 + c; + +- if (cd.char_table[c] != NULL) +- { +- for (i = 0; cd.char_table[c][i] != '\0' && *outbytesleft > 0; i++) +- { +- **outbuf = cd.char_table[c][i]; +- (*outbytesleft)--; +- (*outbuf)++; +- } +- } ++ if (cd.char_table[c] != NULL) ++ { ++ for (i = 0; cd.char_table[c][i] != '\0' && *outbytesleft > 0; i++) ++ { ++ **outbuf = cd.char_table[c][i]; ++ (*outbytesleft)--; ++ (*outbuf)++; ++ } ++ } + +- (*inbuf)++; +- (*inbytesleft)--; +- result++; +- } +- } +- } +- else +- result = iconv(cd.desc, inbuf, inbytesleft, outbuf, outbytesleft); ++ (*inbuf)++; ++ (*inbytesleft)--; ++ result++; ++ } ++ } ++ } ++ else ++ result = iconv(cd.desc, inbuf, inbytesleft, outbuf, outbytesleft); + +- return result; ++ return result; + } + + my_iconv_t + my_iconv_close(my_iconv_t cd) + { +- int i; ++ int i; + +- if (cd.char_table != NULL) +- { +- for (i = 0; i < char_table_size; i++) +- { +- my_free(cd.char_table[i]); +- } ++ if (cd.char_table != NULL) ++ { ++ for (i = 0; i < char_table_size; i++) ++ { ++ my_free(cd.char_table[i]); ++ } + +- my_free((void *)cd.char_table); +- cd.char_table = NULL; +- } ++ my_free((void *)cd.char_table); ++ cd.char_table = NULL; ++ } + +- if (cd.desc != (iconv_t) -1) +- { +- iconv_close(cd.desc); +- cd.desc = (iconv_t) -1; +- } ++ if (cd.desc != (iconv_t) -1) ++ { ++ iconv_close(cd.desc); ++ cd.desc = (iconv_t) -1; ++ } + +- return cd; ++ return cd; + } + + int + my_iconv_is_valid (my_iconv_t cd) + { +- if (cd.desc != (iconv_t) -1 || cd.char_table != NULL) +- return 1; ++ if (cd.desc != (iconv_t) -1 || cd.char_table != NULL) ++ return 1; + +- return 0; ++ return 0; + } + + void + my_iconv_t_make_invalid(my_iconv_t *cd) + { +- cd->desc = (iconv_t) -1; +- cd->char_table = NULL; ++ cd->desc = (iconv_t) -1; ++ cd->char_table = NULL; + } + +diff -durpN unrtf-0.21.2.old/src/my_iconv.h unrtf-0.21.2/src/my_iconv.h +--- unrtf-0.21.2.old/src/my_iconv.h 2010-07-03 22:30:58.000000000 -0400 ++++ unrtf-0.21.2/src/my_iconv.h 2011-11-08 19:15:18.060195122 -0500 +@@ -5,6 +5,9 @@ + * Purpose: my_conv definitions + *--------------------------------------------------------------------*/ + ++#ifndef _MY_ICONV ++#define _MY_ICONV 1 ++ + #ifndef HAVE_ICONV_H + #include + #define HAVE_ICONV_H +@@ -19,9 +22,9 @@ typedef struct + char **char_table; + } my_iconv_t; + +-#define MY_ICONV_T_CLEAR {(iconv_t) -1, NULL} ++struct ConversionContext; + +-my_iconv_t my_iconv_open(const char *tocode, const char *fromcode); ++my_iconv_t my_iconv_open(const struct ConversionContext *cc, const char *tocode, const char *fromcode); + + size_t my_iconv(my_iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft); + +@@ -31,3 +34,4 @@ int my_iconv_is_valid(my_iconv_t cd); + + void my_iconv_t_make_invalid(my_iconv_t *cd); + ++#endif /* _MY_ICONV */ +diff -durpN unrtf-0.21.2.old/src/output.c unrtf-0.21.2/src/output.c +--- unrtf-0.21.2.old/src/output.c 2011-06-07 08:04:38.000000000 -0400 ++++ unrtf-0.21.2/src/output.c 2011-11-08 19:15:18.064195114 -0500 +@@ -1,23 +1,23 @@ + /*============================================================================= +- GNU UnRTF, a command-line program to convert RTF documents to other formats. +- Copyright (C) 2000,2001,2004 by Zachary Smith ++ GNU UnRTF, a command-line program to convert RTF documents to other formats. ++ Copyright (C) 2000,2001,2004 by Zachary Smith + +- This program is free software; you can redistribute it and/or modify +- it under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 3 of the License, or +- (at your option) any later version. ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3 of the License, or ++ (at your option) any later version. + +- This program is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- GNU General Public License for more details. ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. + +- You should have received a copy of the GNU General Public License +- along with this program; if not, write to the Free Software +- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software ++ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +- The maintainer is reachable by electronic mail at daved@physiol.usyd.edu.au +-=============================================================================*/ ++ The maintainer is reachable by electronic mail at daved@physiol.usyd.edu.au ++ =============================================================================*/ + + + /*---------------------------------------------------------------------- +@@ -38,7 +38,7 @@ + * David Santinoli + * 09 Nov 08, arkadiusz.firus@gmail.com: use iconv + * 21 Aug 10, daved@physiol.usyd.edu.au: add code to deal with character +- doublets (see convert.c) ++ doublets (see convert.c) + *--------------------------------------------------------------------*/ + + +@@ -64,7 +64,7 @@ + #include "output.h" + #include "main.h" + #include "convert.h" +- ++#include "unrtf.h" + + #ifndef HAVE_ATTR_H + #include "attr.h" +@@ -79,16 +79,16 @@ + *=======================================================================*/ + + OutputPersonality* +-op_create () ++op_create (const struct ConversionContext *cc) + { +- OutputPersonality* new_op; ++ OutputPersonality* new_op; + +- new_op = (OutputPersonality*) my_malloc (sizeof(OutputPersonality)); +- if (!new_op) +- error_handler ("cannot allocate output personality"); ++ new_op = (OutputPersonality*) my_malloc (sizeof(OutputPersonality)); ++ if (!new_op) ++ error_handler (cc, "cannot allocate output personality"); + +- memset ((void*) new_op, 0, sizeof (OutputPersonality)); +- return new_op; ++ memset ((void*) new_op, 0, sizeof (OutputPersonality)); ++ return new_op; + } + + /*======================================================================== +@@ -102,13 +102,15 @@ op_create () + void + op_free (OutputPersonality *op) + { +- CHECK_PARAM_NOT_NULL(op); +- +- my_free ((void*) op); +-} ++ CHECK_PARAM_NOT_NULL(op); + ++ free_user_definitions(op); + ++ if (op->aliases) ++ free_collection(op->aliases); + ++ my_free ((void*) op); ++} + + /*======================================================================== + * Name: op_translate_char +@@ -119,102 +121,110 @@ op_free (OutputPersonality *op) + *=======================================================================*/ + + char * +-op_translate_char (OutputPersonality *op, my_iconv_t cd, int ch) ++op_translate_char (const struct ConversionContext *cc, const OutputPersonality *op, int ch) + { +- short start; +- char *result=NULL; +- static char output_buffer[2]={ 0, 0 }; +- char *inbuf, *outbuf; +- size_t inbytes = (ch / 256) + 1, outbytes = inbytes * 4, i; ++ char *result=NULL; ++ static char output_buffer[2]={ 0, 0 }; ++ char *inbuf, *outbuf, *originbuf, *origoutbuf; ++ size_t inbytes = (ch / 256) + 1, outbytes = inbytes * 4, i; ++ my_iconv_t cd; + +- CHECK_PARAM_NOT_NULL(op); ++ CHECK_PARAM_NOT_NULL(op); + +- if (no_remap_mode == TRUE && ch < 256) +- { +- output_buffer[0]=ch; +- result=output_buffer; +- } +- else +- if (result == NULL) +- { +- inbuf = my_malloc(inbytes + 1); +- outbuf = my_malloc(outbytes + 1); ++ if (cc->options->no_remap_mode == TRUE && ch < 256) ++ { ++ output_buffer[0]=ch; ++ result=strdup(output_buffer); ++ } ++ else ++ if (result == NULL) ++ { ++ originbuf = inbuf = my_malloc(inbytes + 1); ++ origoutbuf = outbuf = my_malloc(outbytes + 1); + +- for (i = inbytes - 1; ch > 255; i--) +- { +- inbuf[i] = ch % 256; +- ch /= 256; +- } ++ for (i = inbytes - 1; ch > 255; i--) ++ { ++ inbuf[i] = ch % 256; ++ ch /= 256; ++ } + +- inbuf[0] = ch; +- inbuf[inbytes] = '\0'; +- i = outbytes; +- if (!my_iconv_is_valid(cd)) +- { +- cd = my_iconv_open("UTF-8", "cp1252"); ++ inbuf[0] = ch; ++ inbuf[inbytes] = '\0'; ++ i = outbytes; ++ if (!my_iconv_is_valid(cc->desc)) ++ { ++ cd = my_iconv_open(cc, "UTF-8", "cp1252"); + +- if (my_iconv(cd, &inbuf, &inbytes, &outbuf, &outbytes) == -1) +- { ++ if (my_iconv(cd, &inbuf, &inbytes, &outbuf, &outbytes) == -1) ++ { + #if 1 /* daved */ +- fprintf(stderr, "unrtf: Error in executing iconv1\n"); ++ fprintf(stderr, "unrtf: Error in executing iconv1\n"); + #else +- fprintf(stderr, "unrtf: Error in executing iconv1\n"); ++ fprintf(stderr, "unrtf: Error in executing iconv1\n"); + #endif +- return NULL; +- } ++ free (originbuf); ++ free (origoutbuf); ++ return NULL; ++ } + +- my_iconv_close(cd); +- } +- else ++ my_iconv_close(cd); ++ } ++ else + +- if (my_iconv(cd, &inbuf, &inbytes, &outbuf, &outbytes) == -1) +- { +- fprintf(stderr, "unrtf: Error in executing iconv\n"); +- return NULL; +- } +- *outbuf = '\0'; +- outbuf -= i - outbytes; +-/* Conversion from string to utf8 code number */ +- inbytes = 0; ++ if (my_iconv(cc->desc, &inbuf, &inbytes, &outbuf, &outbytes) == -1) ++ { ++ fprintf(stderr, "unrtf: Error in executing iconv\n"); ++ free (originbuf); ++ free (origoutbuf); ++ return NULL; ++ } ++ *outbuf = '\0'; ++ outbuf -= i - outbytes; ++ /* Conversion from string to utf8 code number */ ++ inbytes = 0; + +- for (i = 0; outbuf[i] != '\0'; i++) +- inbytes++; ++ for (i = 0; outbuf[i] != '\0'; i++) ++ inbytes++; + +- ch = 0; ++ ch = 0; + +- for (i = 0; i < inbytes; i++) +- { +- if (i == 0) +- switch (inbytes) +- { +- case 1: +- ch = outbuf[0]; +- break; +- case 2: +- ch = (unsigned char) outbuf[0] - 192; +- break; +- case 3: +- ch = (unsigned char) outbuf[0] - 224; +- break; +- case 4: +- ch = (unsigned char) outbuf[0] - 240; +- break; +- } +- else +- ch = (ch * 64) + ((unsigned char) outbuf[i] - 128); +- } +-/* End of conversion*/ ++ for (i = 0; i < inbytes; i++) ++ { ++ if (i == 0) ++ switch (inbytes) ++ { ++ case 1: ++ ch = outbuf[0]; ++ break; ++ case 2: ++ ch = (unsigned char) outbuf[0] - 192; ++ break; ++ case 3: ++ ch = (unsigned char) outbuf[0] - 224; ++ break; ++ case 4: ++ ch = (unsigned char) outbuf[0] - 240; ++ break; ++ } ++ else ++ ch = (ch * 64) + ((unsigned char) outbuf[i] - 128); ++ } ++ /* End of conversion*/ + +- result = get_alias(op, ch); ++ result = get_alias(op, ch); + +- if (result == NULL) +- if (ch > 127 && op->unisymbol_print) +- result = assemble_string(op->unisymbol_print, ch); +- else +- result = outbuf; +- } ++ if (result == NULL) ++ { ++ if (ch > 127 && op->unisymbol_print) ++ result = assemble_string(op->unisymbol_print, ch); ++ else ++ result = outbuf; ++ } + +- return result; ++ free (originbuf); ++ } ++ ++ return result; + } + + #if 0 /* daved - 0.21.2 */ +@@ -227,123 +237,122 @@ op_translate_char (OutputPersonality *op + *=======================================================================*/ + + char * +-op_translate_str (OutputPersonality *op, my_iconv_t cd, int * doublet) ++op_translate_str (const struct ConversionContext *cc, OutputPersonality *op, my_iconv_t cd, int * doublet) + { +- short start; +- char *result=NULL; +- static char output_buffer[3]={ 0, 0, 0 }; +- unsigned char *inbuf; +- char *outbuf; +- int ch; ++ char *result=NULL; ++ static char output_buffer[3]={ 0, 0, 0 }; ++ unsigned char *inbuf; ++ char *outbuf; ++ int ch; + +- fprintf(stderr, "doublet = %o %o\n", *doublet, *(doublet+1)); ++ fprintf(stderr, "doublet = %o %o\n", *doublet, *(doublet+1)); + #if 0 +- size_t inbytes = (ch / 256) + 1, outbytes = inbytes * 4, i; ++ size_t inbytes = (ch / 256) + 1, outbytes = inbytes * 4, i; + #else +- size_t inbytes = 3, outbytes = inbytes * 4, i; ++ size_t inbytes = 3, outbytes = inbytes * 4, i; + #endif + +- CHECK_PARAM_NOT_NULL(op); ++ CHECK_PARAM_NOT_NULL(op); + + #if 0 +- if (no_remap_mode == TRUE && ch < 256) +- { +- output_buffer[0]=ch; +- result=output_buffer; +- } +- else +- if (result == NULL) +- { ++ if (cc->options->no_remap_mode == TRUE && ch < 256) ++ { ++ output_buffer[0]=ch; ++ result=output_buffer; ++ } ++ else ++ if (result == NULL) ++ { + #endif +- inbuf = (char *) my_malloc(inbytes + 1); +- *inbuf = *doublet; +- *(inbuf+1) = (unsigned char *) *(doublet+1); +- *(inbuf+2) = 0; +- fprintf(stderr, "inbuf = %o %o\n", *inbuf, *(inbuf+1)); +- outbuf = my_malloc(outbytes + 1); ++ inbuf = (char *) my_malloc(inbytes + 1); ++ *inbuf = *doublet; ++ *(inbuf+1) = (unsigned char *) *(doublet+1); ++ *(inbuf+2) = 0; ++ fprintf(stderr, "inbuf = %o %o\n", *inbuf, *(inbuf+1)); ++ outbuf = my_malloc(outbytes + 1); + + #if 0 + +- for (i = inbytes - 1; ch > 255; i--) +- { +- inbuf[i] = ch % 256; +- ch /= 256; +- } ++ for (i = inbytes - 1; ch > 255; i--) ++ { ++ inbuf[i] = ch % 256; ++ ch /= 256; ++ } + +- inbuf[0] = ch; +- inbuf[inbytes] = '\0'; ++ inbuf[0] = ch; ++ inbuf[inbytes] = '\0'; + #endif +- i = outbytes; +- if (!my_iconv_is_valid(cd)) +- { +- cd = my_iconv_open("UTF-8", "cp1252"); ++ i = outbytes; ++ if (!my_iconv_is_valid(cd)) ++ { ++ cd = my_iconv_open("UTF-8", "cp1252"); + +- if (my_iconv(cd, &inbuf, &inbytes, &outbuf, &outbytes) == -1) +- { +- fprintf(stderr, "unrtf: Error in executing iconv1\n"); +- return NULL; +- } ++ if (my_iconv(cd, &inbuf, &inbytes, &outbuf, &outbytes) == -1) ++ { ++ fprintf(stderr, "unrtf: Error in executing iconv1\n"); ++ return NULL; ++ } + +- my_iconv_close(cd); +- } +- else +- { ++ my_iconv_close(cd); ++ } ++ else ++ { + +- if (my_iconv(cd, &inbuf, &inbytes, &outbuf, &outbytes) == -1) +- { ++ if (my_iconv(cd, &inbuf, &inbytes, &outbuf, &outbytes) == -1) ++ { + #if 1 /* daved */ +- fprintf(stderr, "unrtf: Error in executing iconv - inbytes=%d inbuf[0]=%o inbuf[1]=%o\n", inbytes, inbuf[0], inbuf[1]); ++ fprintf(stderr, "unrtf: Error in executing iconv - inbytes=%d inbuf[0]=%o inbuf[1]=%o\n", inbytes, inbuf[0], inbuf[1]); + #else +- fprintf(stderr, "unrtf: Error in executing iconv\n"); ++ fprintf(stderr, "unrtf: Error in executing iconv\n"); + #endif +- return NULL; +- } +- } +- *outbuf = '\0'; +- outbuf -= i - outbytes; +-/* Conversion from string to utf8 code number */ +- inbytes = 0; ++ return NULL; ++ } ++ } ++ *outbuf = '\0'; ++ outbuf -= i - outbytes; ++ /* Conversion from string to utf8 code number */ ++ inbytes = 0; + +- for (i = 0; outbuf[i] != '\0'; i++) +- inbytes++; ++ for (i = 0; outbuf[i] != '\0'; i++) ++ inbytes++; + +- ch = 0; ++ ch = 0; + +- for (i = 0; i < inbytes; i++) +- { +- if (i == 0) +- switch (inbytes) +- { +- case 1: +- ch = outbuf[0]; +- break; +- case 2: +- ch = (unsigned char) outbuf[0] - 192; +- break; +- case 3: +- ch = (unsigned char) outbuf[0] - 224; +- break; +- case 4: +- ch = (unsigned char) outbuf[0] - 240; +- break; +- } +- else +- ch = (ch * 64) + ((unsigned char) outbuf[i] - 128); +- } +-/* End of conversion*/ ++ for (i = 0; i < inbytes; i++) ++ { ++ if (i == 0) ++ switch (inbytes) ++ { ++ case 1: ++ ch = outbuf[0]; ++ break; ++ case 2: ++ ch = (unsigned char) outbuf[0] - 192; ++ break; ++ case 3: ++ ch = (unsigned char) outbuf[0] - 224; ++ break; ++ case 4: ++ ch = (unsigned char) outbuf[0] - 240; ++ break; ++ } ++ else ++ ch = (ch * 64) + ((unsigned char) outbuf[i] - 128); ++ } ++ /* End of conversion*/ + +- result = get_alias(op, ch); ++ result = get_alias(op, ch); + +- if (result == NULL) +- if (ch > 127 && op->unisymbol_print) +- result = assemble_string(op->unisymbol_print, ch); +- else +- result = outbuf; ++ if (result == NULL) ++ if (ch > 127 && op->unisymbol_print) ++ result = assemble_string(op->unisymbol_print, ch); ++ else ++ result = outbuf; + #if 0 /* daved 0.21.2 */ +- } ++ } + #endif + +- return result; ++ return result; + } + #endif + +@@ -357,113 +366,115 @@ op_translate_str (OutputPersonality *op, + *=======================================================================*/ + + char * +-op_translate_doublet (OutputPersonality *op, my_iconv_t cd, int ch1, int ch2) ++op_translate_doublet (const struct ConversionContext *cc, const OutputPersonality *op, int ch1, int ch2) + { +- short start; +- char *result=NULL; +- static char output_buffer[3]={ 0, 0, 0 }; +- unsigned char *inbuf; +- char *outbuf; +- int ch; ++ char *result=NULL; ++ static char output_buffer[3]={ 0, 0, 0 }; ++ char *inbuf; ++ char *outbuf; ++ int ch; ++ my_iconv_t cd; + + #if 0 +- size_t inbytes = (ch / 256) + 1, outbytes = inbytes * 4, i; ++ size_t inbytes = (ch / 256) + 1, outbytes = inbytes * 4, i; + #else +- size_t inbytes = 3, outbytes = inbytes * 4, i; ++ size_t inbytes = 3, outbytes = inbytes * 4, i; + #if 0 +- fprintf(stderr, "doublet = %o %o\n", ch1, ch2); ++ fprintf(stderr, "doublet = %o %o\n", ch1, ch2); + #endif + #endif + +- CHECK_PARAM_NOT_NULL(op); ++ CHECK_PARAM_NOT_NULL(op); + +- if (no_remap_mode == TRUE && ch < 256) +- { +- output_buffer[0]=ch1; +- output_buffer[1]=ch2; +- result=output_buffer; +- } +- else +- if (result == NULL) +- { +- inbuf = (char *) my_malloc(inbytes + 1); +- *inbuf = ch1; +- *(inbuf+1) = ch2; +- *(inbuf+2) = 0; ++ if (cc->options->no_remap_mode == TRUE && ch < 256) ++ { ++ output_buffer[0]=ch1; ++ output_buffer[1]=ch2; ++ result=output_buffer; ++ } ++ else ++ if (result == NULL) ++ { ++ inbuf = (char *) my_malloc(inbytes + 1); ++ *inbuf = ch1; ++ *(inbuf+1) = ch2; ++ *(inbuf+2) = 0; + #if 0 +- fprintf(stderr, "inbuf = %o %o\n", *inbuf, *(inbuf+1)); ++ fprintf(stderr, "inbuf = %o %o\n", *inbuf, *(inbuf+1)); + #endif +- outbuf = my_malloc(outbytes + 1); ++ outbuf = my_malloc(outbytes + 1); + +- i = outbytes; +- if (!my_iconv_is_valid(cd)) +- { +- cd = my_iconv_open("UTF-8", "cp1252"); ++ i = outbytes; ++ if (!my_iconv_is_valid(cc->desc)) ++ { ++ cd = my_iconv_open(cc, "UTF-8", "cp1252"); + +- if (my_iconv(cd, (char **)&inbuf, (size_t *)&inbytes, (char **)&outbuf, &outbytes) == -1) +- { +- fprintf(stderr, "unrtf: Error in executing iconv1\n"); +- return NULL; +- } ++ if (my_iconv(cd, (char **)&inbuf, (size_t *)&inbytes, (char **)&outbuf, &outbytes) == -1) ++ { ++ fprintf(stderr, "unrtf: Error in executing iconv1\n"); ++ return NULL; ++ } + +- my_iconv_close(cd); +- } +- else +- { ++ my_iconv_close(cd); ++ } ++ else ++ { + +- if (my_iconv(cd, (char **)&inbuf, (size_t *)&inbytes, (char **)&outbuf, &outbytes) == -1) +- { ++ if (my_iconv(cc->desc, (char **)&inbuf, (size_t *)&inbytes, (char **)&outbuf, &outbytes) == -1) ++ { + #if 1 /* daved */ +- fprintf(stderr, "unrtf: Error in executing iconv - inbytes=%d inbuf[0]=%o inbuf[1]=%o\n", inbytes, inbuf[0], inbuf[1]); ++ fprintf(stderr, "unrtf: Error in executing iconv - inbytes=%d inbuf[0]=%o inbuf[1]=%o\n", inbytes, inbuf[0], inbuf[1]); + #else +- fprintf(stderr, "unrtf: Error in executing iconv\n"); ++ fprintf(stderr, "unrtf: Error in executing iconv\n"); + #endif +- return NULL; +- } +- } +- *outbuf = '\0'; +- outbuf -= i - outbytes; +-/* Conversion from string to utf8 code number */ +- inbytes = 0; ++ return NULL; ++ } ++ } ++ *outbuf = '\0'; ++ outbuf -= i - outbytes; ++ /* Conversion from string to utf8 code number */ ++ inbytes = 0; + +- for (i = 0; outbuf[i] != '\0'; i++) +- inbytes++; ++ for (i = 0; outbuf[i] != '\0'; i++) ++ inbytes++; + +- ch = 0; ++ ch = 0; + +- for (i = 0; i < inbytes; i++) +- { +- if (i == 0) +- switch (inbytes) +- { +- case 1: +- ch = outbuf[0]; +- break; +- case 2: +- ch = (unsigned char) outbuf[0] - 192; +- break; +- case 3: +- ch = (unsigned char) outbuf[0] - 224; +- break; +- case 4: +- ch = (unsigned char) outbuf[0] - 240; +- break; +- } +- else +- ch = (ch * 64) + ((unsigned char) outbuf[i] - 128); +- } +-/* End of conversion*/ ++ for (i = 0; i < inbytes; i++) ++ { ++ if (i == 0) ++ switch (inbytes) ++ { ++ case 1: ++ ch = outbuf[0]; ++ break; ++ case 2: ++ ch = (unsigned char) outbuf[0] - 192; ++ break; ++ case 3: ++ ch = (unsigned char) outbuf[0] - 224; ++ break; ++ case 4: ++ ch = (unsigned char) outbuf[0] - 240; ++ break; ++ } ++ else ++ ch = (ch * 64) + ((unsigned char) outbuf[i] - 128); ++ } ++ /* End of conversion*/ + +- result = get_alias(op, ch); ++ result = get_alias(op, ch); + +- if (result == NULL) +- if (ch > 127 && op->unisymbol_print) +- result = assemble_string(op->unisymbol_print, ch); +- else +- result = outbuf; +- } ++ if (result == NULL) ++ { ++ if (ch > 127 && op->unisymbol_print) ++ result = assemble_string(op->unisymbol_print, ch); ++ else ++ result = outbuf; ++ } ++ } + +- return result; ++ return result; + } + #endif + /*======================================================================== +@@ -475,123 +486,113 @@ op_translate_doublet (OutputPersonality + *=======================================================================*/ + + void +-op_begin_std_fontsize (OutputPersonality *op, int size) ++op_begin_std_fontsize (const OutputContext *oc, int size) + { +- int found_std_expr = FALSE; ++ int found_std_expr = FALSE; ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; + +- CHECK_PARAM_NOT_NULL(op); ++ CHECK_PARAM_NOT_NULL(oc); + +- /* Look for an exact match with a standard point size. +- */ +- switch (size) { +- case 8: +- if (op->fontsize8_begin) { +- if (safe_printf(0, op->fontsize8_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize8_begin"); +- found_std_expr = TRUE; +- } +- break; +- case 10: +- if (op->fontsize10_begin) { +- if (safe_printf(0, op->fontsize10_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize10_begin"); +- found_std_expr = TRUE; +- } +- break; +- case 12: +- if (op->fontsize12_begin) { +- if (safe_printf(0, op->fontsize12_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize12_begin"); +- found_std_expr = TRUE; +- } +- break; +- case 14: +- if (op->fontsize14_begin) { +- if (safe_printf(0, op->fontsize14_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize14_begin"); +- found_std_expr = TRUE; +- } +- break; +- case 18: +- if (op->fontsize18_begin) { +- if (safe_printf(0, op->fontsize18_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize18_begin"); +- found_std_expr = TRUE; +- } +- break; +- case 24: +- if (op->fontsize24_begin) { +- if (safe_printf(0, op->fontsize24_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize24_begin"); +- found_std_expr = TRUE; +- } +- break; +- case 36: +- if (op->fontsize36_begin) { +- if (safe_printf(0, op->fontsize36_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize36_begin"); +- found_std_expr = TRUE; +- } +- break; +- case 48: +- if (op->fontsize48_begin) { +- if (safe_printf(0, op->fontsize48_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize48_begin"); +- found_std_expr = TRUE; +- } +- break; +- } ++ /* Look for an exact match with a standard point size. ++ */ ++ switch (size) { ++ case 8: ++ if (oc->personality->fontsize8_begin) { ++ if (safe_printf(device, 0, oc->personality->fontsize8_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize8_begin"); ++ found_std_expr = TRUE; ++ } ++ break; ++ case 10: ++ if (oc->personality->fontsize10_begin) { ++ if (safe_printf(device, 0, oc->personality->fontsize10_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize10_begin"); ++ found_std_expr = TRUE; ++ } ++ break; ++ case 12: ++ if (oc->personality->fontsize12_begin) { ++ if (safe_printf(device, 0, oc->personality->fontsize12_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize12_begin"); ++ found_std_expr = TRUE; ++ } ++ break; ++ case 14: ++ if (oc->personality->fontsize14_begin) { ++ if (safe_printf(device, 0, oc->personality->fontsize14_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize14_begin"); ++ found_std_expr = TRUE; ++ } ++ break; ++ case 18: ++ if (oc->personality->fontsize18_begin) { ++ if (safe_printf(device, 0, oc->personality->fontsize18_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize18_begin"); ++ found_std_expr = TRUE; ++ } ++ break; ++ case 24: ++ if (oc->personality->fontsize24_begin) { ++ if (safe_printf(device, 0, oc->personality->fontsize24_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize24_begin"); ++ found_std_expr = TRUE; ++ } ++ break; ++ case 36: ++ if (oc->personality->fontsize36_begin) { ++ if (safe_printf(device, 0, oc->personality->fontsize36_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize36_begin"); ++ found_std_expr = TRUE; ++ } ++ break; ++ case 48: ++ if (oc->personality->fontsize48_begin) { ++ if (safe_printf(device, 0, oc->personality->fontsize48_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize48_begin"); ++ found_std_expr = TRUE; ++ } ++ break; ++ } + +- /* If no exact match, try to write out a change to the +- * exact point size. +- */ +- if (!found_std_expr) { +- if (op->fontsize_begin) { +- char expr[16]; +- sprintf (expr, "%d", size); +- if (safe_printf (1, op->fontsize_begin, expr)) fprintf(stderr, TOO_MANY_ARGS, "fontsize_begin"); +- } else { +- /* If we cannot write out a change for the exact +- * point size, we must approximate to a standard +- * size. +- */ +- if (size<9 && op->fontsize8_begin) { +- if (safe_printf(0, op->fontsize8_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize8_begin"); +- } else +- if (size<11 && op->fontsize10_begin) { +- if (safe_printf(0, op->fontsize10_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize10_begin"); +- } else +- if (size<13 && op->fontsize12_begin) { +- if (safe_printf(0, op->fontsize12_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize12_begin"); +- } else +- if (size<16 && op->fontsize14_begin) { +- if (safe_printf(0, op->fontsize14_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize14_begin"); +- } else +- if (size<21 && op->fontsize18_begin) { +- if (safe_printf(0, op->fontsize18_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize18_begin"); +- } else +- if (size<30 && op->fontsize24_begin) { +- if (safe_printf(0, op->fontsize24_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize24_begin"); +- } else +- if (size<42 && op->fontsize36_begin) { +- if (safe_printf(0, op->fontsize36_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize36_begin"); +- } else +- if (size>40 && op->fontsize48_begin) { +- if (safe_printf(0, op->fontsize48_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize48_begin"); +- } else +- /* If we can't even produce a good approximation, +- * just try to get a font size near 12 point. +- */ +- if (op->fontsize12_begin) +- if (safe_printf(0, op->fontsize12_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize12_begin"); +- else +- if (op->fontsize14_begin) +- if (safe_printf(0, op->fontsize14_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize14_begin"); +- else +- if (op->fontsize10_begin) +- if (safe_printf(0, op->fontsize10_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize10_begin"); +- else +- if (op->fontsize18_begin) +- if (safe_printf(0, op->fontsize18_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize18_begin"); +- else +- if (op->fontsize8_begin) +- if (safe_printf(0, op->fontsize8_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize8_begin"); +- else +- error_handler ("output personality lacks sufficient font size change capability"); +- } +- } ++ /* If no exact match, try to write out a change to the ++ * exact point size. ++ */ ++ if (!found_std_expr) { ++ if (oc->personality->fontsize_begin) { ++ char expr[16]; ++ sprintf (expr, "%d", size); ++ if (safe_printf(device, 1, oc->personality->fontsize_begin, expr)) fprintf(stderr, TOO_MANY_ARGS, "fontsize_begin"); ++ } else { ++ /* If we cannot write out a change for the exact ++ * point size, we must approximate to a standard ++ * size. ++ */ ++ if (size<9 && oc->personality->fontsize8_begin) { ++ if (safe_printf(device, 0, oc->personality->fontsize8_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize8_begin"); ++ } else if (size<11 && oc->personality->fontsize10_begin) { ++ if (safe_printf(device, 0, oc->personality->fontsize10_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize10_begin"); ++ } else if (size<13 && oc->personality->fontsize12_begin) { ++ if (safe_printf(device, 0, oc->personality->fontsize12_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize12_begin"); ++ } else if (size<16 && oc->personality->fontsize14_begin) { ++ if (safe_printf(device, 0, oc->personality->fontsize14_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize14_begin"); ++ } else if (size<21 && oc->personality->fontsize18_begin) { ++ if (safe_printf(device, 0, oc->personality->fontsize18_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize18_begin"); ++ } else if (size<30 && oc->personality->fontsize24_begin) { ++ if (safe_printf(device, 0, oc->personality->fontsize24_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize24_begin"); ++ } else if (size<42 && oc->personality->fontsize36_begin) { ++ if (safe_printf(device, 0, oc->personality->fontsize36_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize36_begin"); ++ } else if (size>40 && oc->personality->fontsize48_begin) { ++ if (safe_printf(device, 0, oc->personality->fontsize48_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize48_begin"); ++ } else if (oc->personality->fontsize12_begin) { ++ /* If we can't even produce a good approximation, ++ * just try to get a font size near 12 point. ++ */ ++ if (safe_printf(device, 0, oc->personality->fontsize12_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize12_begin"); ++ } else if (oc->personality->fontsize14_begin) { ++ if (safe_printf(device, 0, oc->personality->fontsize14_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize14_begin"); ++ } else if (oc->personality->fontsize10_begin) { ++ if (safe_printf(device, 0, oc->personality->fontsize10_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize10_begin"); ++ } else if (oc->personality->fontsize18_begin) { ++ if (safe_printf(device, 0, oc->personality->fontsize18_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize18_begin"); ++ } else if (oc->personality->fontsize8_begin) { ++ if (safe_printf(device, 0, oc->personality->fontsize8_begin)) fprintf(stderr, TOO_MANY_ARGS, "fontsize8_begin"); ++ } else { ++ error_handler (oc->conversion, "output personality lacks sufficient font size change capability"); ++ } ++ } ++ } + } + + +@@ -604,123 +605,113 @@ op_begin_std_fontsize (OutputPersonality + *=======================================================================*/ + + void +-op_end_std_fontsize (OutputPersonality *op, int size) ++op_end_std_fontsize (const OutputContext *oc, int size) + { +- int found_std_expr = FALSE; ++ int found_std_expr = FALSE; ++ const struct unRTFOutputDevice *device = &oc->conversion->options->device; + +- CHECK_PARAM_NOT_NULL(op); ++ CHECK_PARAM_NOT_NULL(oc); + +- /* Look for an exact match with a standard point size. +- */ +- switch (size) { +- case 8: +- if (op->fontsize8_end) { +- if (safe_printf(0, op->fontsize8_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize8_end"); +- found_std_expr = TRUE; +- } +- break; +- case 10: +- if (op->fontsize10_end) { +- if (safe_printf(0, op->fontsize10_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize10_end"); +- found_std_expr = TRUE; +- } +- break; +- case 12: +- if (op->fontsize12_end) { +- if (safe_printf(0, op->fontsize12_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize12_end"); +- found_std_expr = TRUE; +- } +- break; +- case 14: +- if (op->fontsize14_end) { +- if (safe_printf(0, op->fontsize14_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize14_end"); +- found_std_expr = TRUE; +- } +- break; +- case 18: +- if (op->fontsize18_end) { +- if (safe_printf(0, op->fontsize18_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize18_end"); +- found_std_expr = TRUE; +- } +- break; +- case 24: +- if (op->fontsize24_end) { +- if (safe_printf(0, op->fontsize24_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize24_end"); +- found_std_expr = TRUE; +- } +- break; +- case 36: +- if (op->fontsize36_end) { +- if (safe_printf(0, op->fontsize36_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize36_end"); +- found_std_expr = TRUE; +- } +- break; +- case 48: +- if (op->fontsize48_end) { +- if (safe_printf(0, op->fontsize48_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize48_end"); +- found_std_expr = TRUE; +- } +- break; +- } ++ /* Look for an exact match with a standard point size. ++ */ ++ switch (size) { ++ case 8: ++ if (oc->personality->fontsize8_end) { ++ if (safe_printf(device, 0, oc->personality->fontsize8_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize8_end"); ++ found_std_expr = TRUE; ++ } ++ break; ++ case 10: ++ if (oc->personality->fontsize10_end) { ++ if (safe_printf(device, 0, oc->personality->fontsize10_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize10_end"); ++ found_std_expr = TRUE; ++ } ++ break; ++ case 12: ++ if (oc->personality->fontsize12_end) { ++ if (safe_printf(device, 0, oc->personality->fontsize12_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize12_end"); ++ found_std_expr = TRUE; ++ } ++ break; ++ case 14: ++ if (oc->personality->fontsize14_end) { ++ if (safe_printf(device, 0, oc->personality->fontsize14_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize14_end"); ++ found_std_expr = TRUE; ++ } ++ break; ++ case 18: ++ if (oc->personality->fontsize18_end) { ++ if (safe_printf(device, 0, oc->personality->fontsize18_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize18_end"); ++ found_std_expr = TRUE; ++ } ++ break; ++ case 24: ++ if (oc->personality->fontsize24_end) { ++ if (safe_printf(device, 0, oc->personality->fontsize24_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize24_end"); ++ found_std_expr = TRUE; ++ } ++ break; ++ case 36: ++ if (oc->personality->fontsize36_end) { ++ if (safe_printf(device, 0, oc->personality->fontsize36_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize36_end"); ++ found_std_expr = TRUE; ++ } ++ break; ++ case 48: ++ if (oc->personality->fontsize48_end) { ++ if (safe_printf(device, 0, oc->personality->fontsize48_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize48_end"); ++ found_std_expr = TRUE; ++ } ++ break; ++ } + +- /* If no exact match, try to write out a change to the +- * exact point size. +- */ +- if (!found_std_expr) { +- if (op->fontsize_end) { +- char expr[16]; +- sprintf (expr, "%d", size); +- if (safe_printf(1, op->fontsize_end, expr)) fprintf(stderr, TOO_MANY_ARGS, "fontsize_end"); +- } else { +- /* If we cannot write out a change for the exact +- * point size, we must approximate to a standard +- * size. +- */ +- if (size<9 && op->fontsize8_end) { +- if (safe_printf(0, op->fontsize8_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize8_end"); +- } else +- if (size<11 && op->fontsize10_end) { +- if (safe_printf(0, op->fontsize10_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize10_end"); +- } else +- if (size<13 && op->fontsize12_end) { +- if (safe_printf(0, op->fontsize12_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize12_end"); +- } else +- if (size<16 && op->fontsize14_end) { +- if (safe_printf(0, op->fontsize14_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize14_end"); +- } else +- if (size<21 && op->fontsize18_end) { +- if (safe_printf(0, op->fontsize18_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize18_end"); +- } else +- if (size<30 && op->fontsize24_end) { +- if (safe_printf(0, op->fontsize24_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize24_end"); +- } else +- if (size<42 && op->fontsize36_end) { +- if (safe_printf(0, op->fontsize36_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize36_end"); +- } else +- if (size>40 && op->fontsize48_end) { +- if (safe_printf(0, op->fontsize48_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize48_end"); +- } else +- /* If we can't even produce a good approximation, +- * just try to get a font size near 12 point. +- */ +- if (op->fontsize12_end) +- if (safe_printf(0, op->fontsize12_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize12_end"); +- else +- if (op->fontsize14_end) +- if (safe_printf(0, op->fontsize14_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize14_end"); +- else +- if (op->fontsize10_end) +- if (safe_printf(0, op->fontsize10_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize10_end"); +- else +- if (op->fontsize18_end) +- if (safe_printf(0, op->fontsize18_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize18_end"); +- else +- if (op->fontsize8_end) +- if (safe_printf(0, op->fontsize8_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize8_end"); +- else +- error_handler ("output personality lacks sufficient font size change capability"); +- } +- } ++ /* If no exact match, try to write out a change to the ++ * exact point size. ++ */ ++ if (!found_std_expr) { ++ if (oc->personality->fontsize_end) { ++ char expr[16]; ++ sprintf (expr, "%d", size); ++ if (safe_printf(device, 1, oc->personality->fontsize_end, expr)) fprintf(stderr, TOO_MANY_ARGS, "fontsize_end"); ++ } else { ++ /* If we cannot write out a change for the exact ++ * point size, we must approximate to a standard ++ * size. ++ */ ++ if (size<9 && oc->personality->fontsize8_end) { ++ if (safe_printf(device, 0, oc->personality->fontsize8_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize8_end"); ++ } else if (size<11 && oc->personality->fontsize10_end) { ++ if (safe_printf(device, 0, oc->personality->fontsize10_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize10_end"); ++ } else if (size<13 && oc->personality->fontsize12_end) { ++ if (safe_printf(device, 0, oc->personality->fontsize12_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize12_end"); ++ } else if (size<16 && oc->personality->fontsize14_end) { ++ if (safe_printf(device, 0, oc->personality->fontsize14_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize14_end"); ++ } else if (size<21 && oc->personality->fontsize18_end) { ++ if (safe_printf(device, 0, oc->personality->fontsize18_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize18_end"); ++ } else if (size<30 && oc->personality->fontsize24_end) { ++ if (safe_printf(device, 0, oc->personality->fontsize24_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize24_end"); ++ } else if (size<42 && oc->personality->fontsize36_end) { ++ if (safe_printf(device, 0, oc->personality->fontsize36_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize36_end"); ++ } else if (size>40 && oc->personality->fontsize48_end) { ++ if (safe_printf(device, 0, oc->personality->fontsize48_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize48_end"); ++ } else if (oc->personality->fontsize12_end) { ++ /* If we can't even produce a good approximation, ++ * just try to get a font size near 12 point. ++ */ ++ if (safe_printf(device, 0, oc->personality->fontsize12_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize12_end"); ++ } else if (oc->personality->fontsize14_end) { ++ if (safe_printf(device, 0, oc->personality->fontsize14_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize14_end"); ++ } else if (oc->personality->fontsize10_end) { ++ if (safe_printf(device, 0, oc->personality->fontsize10_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize10_end"); ++ } else if (oc->personality->fontsize18_end) { ++ if (safe_printf(device, 0, oc->personality->fontsize18_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize18_end"); ++ } else if (oc->personality->fontsize8_end) { ++ if (safe_printf(device, 0, oc->personality->fontsize8_end)) fprintf(stderr, TOO_MANY_ARGS, "fontsize8_end"); ++ } else { ++ error_handler (oc->conversion, "output personality lacks sufficient font size change capability"); ++ } ++ } ++ } + } + + #if 1 /* AK3 - AF */ +@@ -734,7 +725,7 @@ op_end_std_fontsize (OutputPersonality * + void + add_alias(OutputPersonality *op, int nr, char *text) + { +- op->aliases = (Aliases *)add_to_collection((Collection *)op->aliases, nr, text); ++ op->aliases = (Aliases *)add_to_collection((Collection *)op->aliases, nr, text); + } + + /*======================================================================== +@@ -745,9 +736,8 @@ add_alias(OutputPersonality *op, int nr, + *=======================================================================*/ + + char * +-get_alias(OutputPersonality *op, int nr) ++get_alias(const OutputPersonality *op, int nr) + { +- return get_from_collection((Collection *)op->aliases, nr); ++ return get_from_collection((Collection *)op->aliases, nr); + } + #endif +- +diff -durpN unrtf-0.21.2.old/src/output.h unrtf-0.21.2/src/output.h +--- unrtf-0.21.2.old/src/output.h 2010-08-11 21:09:02.000000000 -0400 ++++ unrtf-0.21.2/src/output.h 2011-11-08 19:15:18.064195114 -0500 +@@ -44,227 +44,228 @@ + typedef Collection Aliases; + + typedef struct { +- int cp; +- unsigned short chars[128]; ++ int cp; ++ unsigned short chars[128]; + } CodepageInfo; + ++typedef struct OutputPersonality { ++ char *comment_begin; ++ char *comment_end; + +-typedef struct { +- char *comment_begin; +- char *comment_end; +- +- char *document_begin; +- char *document_end; ++ char *document_begin; ++ char *document_end; + +- char *header_begin; +- char *header_end; ++ char *header_begin; ++ char *header_end; + +- char *document_title_begin; +- char *document_title_end; ++ char *document_title_begin; ++ char *document_title_end; + +- char *document_keywords_begin; +- char *document_keywords_end; ++ char *document_keywords_begin; ++ char *document_keywords_end; + +- char *document_author_begin; +- char *document_author_end; ++ char *document_author_begin; ++ char *document_author_end; + +- char *document_changedate_begin; +- char *document_changedate_end; ++ char *document_changedate_begin; ++ char *document_changedate_end; + +- char *body_begin; +- char *body_end; ++ char *body_begin; ++ char *body_end; + +- char *word_begin; +- char *word_end; ++ char *word_begin; ++ char *word_end; + +- char *paragraph_begin; +- char *paragraph_end; ++ char *paragraph_begin; ++ char *paragraph_end; + +- char *center_begin; +- char *center_end; ++ char *center_begin; ++ char *center_end; + +- char *align_left_begin; +- char *align_left_end; ++ char *align_left_begin; ++ char *align_left_end; + +- char *align_right_begin; +- char *align_right_end; ++ char *align_right_begin; ++ char *align_right_end; + +- char *justify_begin; +- char *justify_end; ++ char *justify_begin; ++ char *justify_end; + +- char *forced_space; +- char *line_break; +- char *page_break; ++ char *forced_space; ++ char *line_break; ++ char *page_break; + +- char *hyperlink_begin; +- char *hyperlink_end; ++ char *hyperlink_begin; ++ char *hyperlink_end; + +- char *imagelink_begin; +- char *imagelink_end; ++ char *imagelink_begin; ++ char *imagelink_end; + +- char *table_begin; +- char *table_end; ++ char *table_begin; ++ char *table_end; + +- char *table_row_begin; +- char *table_row_end; ++ char *table_row_begin; ++ char *table_row_end; + +- char *table_cell_begin; +- char *table_cell_end; ++ char *table_cell_begin; ++ char *table_cell_end; + +- /* Character attributes */ +- char *font_begin; +- char *font_end; ++ /* Character attributes */ ++ char *font_begin; ++ char *font_end; + +- char *fontsize_begin; +- char *fontsize_end; ++ char *fontsize_begin; ++ char *fontsize_end; + +- /* standard font sizes are optional */ +- char *fontsize8_begin; +- char *fontsize8_end; ++ /* standard font sizes are optional */ ++ char *fontsize8_begin; ++ char *fontsize8_end; + +- char *fontsize10_begin; +- char *fontsize10_end; ++ char *fontsize10_begin; ++ char *fontsize10_end; + +- char *fontsize12_begin; +- char *fontsize12_end; ++ char *fontsize12_begin; ++ char *fontsize12_end; + +- char *fontsize14_begin; +- char *fontsize14_end; ++ char *fontsize14_begin; ++ char *fontsize14_end; + +- char *fontsize18_begin; +- char *fontsize18_end; ++ char *fontsize18_begin; ++ char *fontsize18_end; + +- char *fontsize24_begin; +- char *fontsize24_end; ++ char *fontsize24_begin; ++ char *fontsize24_end; + +- char *fontsize36_begin; +- char *fontsize36_end; ++ char *fontsize36_begin; ++ char *fontsize36_end; + +- char *fontsize48_begin; +- char *fontsize48_end; ++ char *fontsize48_begin; ++ char *fontsize48_end; + +- char *smaller_begin; +- char *smaller_end; ++ char *smaller_begin; ++ char *smaller_end; + +- char *bigger_begin; +- char *bigger_end; ++ char *bigger_begin; ++ char *bigger_end; + +- char *foreground_begin; +- char *foreground_end; ++ char *foreground_begin; ++ char *foreground_end; + +- char *background_begin; +- char *background_end; ++ char *background_begin; ++ char *background_end; + +- char *bold_begin; +- char *bold_end; ++ char *bold_begin; ++ char *bold_end; + +- char *italic_begin; +- char *italic_end; ++ char *italic_begin; ++ char *italic_end; + +- char *underline_begin; +- char *underline_end; ++ char *underline_begin; ++ char *underline_end; + +- char *dbl_underline_begin; +- char *dbl_underline_end; ++ char *dbl_underline_begin; ++ char *dbl_underline_end; + +- char *superscript_begin; +- char *superscript_end; ++ char *superscript_begin; ++ char *superscript_end; + +- char *subscript_begin; +- char *subscript_end; ++ char *subscript_begin; ++ char *subscript_end; + +- char *strikethru_begin; +- char *strikethru_end; ++ char *strikethru_begin; ++ char *strikethru_end; + +- char *dbl_strikethru_begin; +- char *dbl_strikethru_end; ++ char *dbl_strikethru_begin; ++ char *dbl_strikethru_end; + +- char *emboss_begin; +- char *emboss_end; ++ char *emboss_begin; ++ char *emboss_end; + +- char *engrave_begin; +- char *engrave_end; ++ char *engrave_begin; ++ char *engrave_end; + +- char *shadow_begin; +- char *shadow_end; ++ char *shadow_begin; ++ char *shadow_end; + +- char *outline_begin; +- char *outline_end; ++ char *outline_begin; ++ char *outline_end; + +- char *small_caps_begin; +- char *small_caps_end; ++ char *small_caps_begin; ++ char *small_caps_end; + +- char *pointlist_begin; +- char *pointlist_end; ++ char *pointlist_begin; ++ char *pointlist_end; + +- char *pointlist_item_begin; +- char *pointlist_item_end; ++ char *pointlist_item_begin; ++ char *pointlist_item_end; + +- char *numericlist_begin; +- char *numericlist_end; ++ char *numericlist_begin; ++ char *numericlist_end; + +- char *numericlist_item_begin; +- char *numericlist_item_end; ++ char *numericlist_item_begin; ++ char *numericlist_item_end; + +- char *expand_begin; +- char *expand_end; ++ char *expand_begin; ++ char *expand_end; + +- char *toc_entry_begin; +- char *toc_entry_end; ++ char *toc_entry_begin; ++ char *toc_entry_end; + +- char *index_entry_begin; +- char *index_entry_end; ++ char *index_entry_begin; ++ char *index_entry_end; + +- char *fonttable_begin; +- char *fonttable_end; +- char *fonttable_fontnr; +- char *fonttable_fontname; ++ char *fonttable_begin; ++ char *fonttable_end; ++ char *fonttable_fontnr; ++ char *fonttable_fontname; + +- /* XX These should really be replaced by references +- * to one of the charsets. +- */ +- struct { +- char *bullet; +- char *left_quote; +- char *right_quote; +- char *left_dbl_quote; +- char *right_dbl_quote; +- char *nonbreaking_space; +- char *emdash; +- char *endash; +- char *lessthan; +- char *greaterthan; +- char *amp; +- char *copyright; +- char *trademark; +- char *nonbreaking_hyphen; +- char *optional_hyphen; +- } chars; ++ /* XX These should really be replaced by references ++ * to one of the charsets. ++ */ ++ struct { ++ char *bullet; ++ char *left_quote; ++ char *right_quote; ++ char *left_dbl_quote; ++ char *right_dbl_quote; ++ char *nonbreaking_space; ++ char *emdash; ++ char *endash; ++ char *lessthan; ++ char *greaterthan; ++ char *amp; ++ char *copyright; ++ char *trademark; ++ char *nonbreaking_hyphen; ++ char *optional_hyphen; ++ } chars; + +- int simulate_small_caps : 1; +- int simulate_all_caps : 1; +- int simulate_word_underline : 1; +- char *unisymbol_print; +- char *utf8_encoding; +- Aliases *aliases; +-} +-OutputPersonality; ++ int simulate_small_caps : 1; ++ int simulate_all_caps : 1; ++ int simulate_word_underline : 1; ++ char *unisymbol_print; ++ char *utf8_encoding; ++ Aliases *aliases; ++} OutputPersonality; + ++typedef struct OutputContext { ++ struct ConversionContext *conversion; ++ struct OutputPersonality *personality; ++} OutputContext; + +-extern OutputPersonality* op_create(void); ++extern OutputPersonality* op_create(const struct ConversionContext *); + extern void op_free (OutputPersonality*); +-extern char* op_translate_char (OutputPersonality *op, my_iconv_t cd, int ch); ++extern char* op_translate_char (const struct ConversionContext *cc, const OutputPersonality *op, int ch); + #if 1 /* daved - 0.21.2 */ +-extern char* op_translate_str (OutputPersonality *op, my_iconv_t cd, int * doublet); +-extern char* op_translate_doublet (OutputPersonality *op, my_iconv_t cd, int ch1, int ch2); ++extern char* op_translate_str (const struct ConversionContext *cc, const OutputPersonality *op, int * doublet); ++extern char* op_translate_doublet (const struct ConversionContext *cc, const OutputPersonality *op, int ch1, int ch2); + #endif + +-extern void op_begin_std_fontsize (OutputPersonality*, int); +-extern void op_end_std_fontsize (OutputPersonality*, int); ++extern void op_begin_std_fontsize (const struct OutputContext *, int); ++extern void op_end_std_fontsize (const struct OutputContext *, int); + +-void add_alias(OutputPersonality *op, int nr, char *text); +-char *get_alias(OutputPersonality *op, int nr); ++void add_alias(struct OutputPersonality *op, int nr, char *text); ++char *get_alias(const struct OutputPersonality *op, int nr); + + #define _OUTPUT + #endif +- +diff -durpN unrtf-0.21.2.old/src/parse.c unrtf-0.21.2/src/parse.c +--- unrtf-0.21.2.old/src/parse.c 2010-07-03 22:30:58.000000000 -0400 ++++ unrtf-0.21.2/src/parse.c 2011-11-09 09:52:09.593474687 -0500 +@@ -1,23 +1,23 @@ + /*============================================================================= +- GNU UnRTF, a command-line program to convert RTF documents to other formats. +- Copyright (C) 2000,2001 Zachary Thayer Smith ++ GNU UnRTF, a command-line program to convert RTF documents to other formats. ++ Copyright (C) 2000,2001 Zachary Thayer Smith + +- This program is free software; you can redistribute it and/or modify +- it under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 3 of the License, or +- (at your option) any later version. ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3 of the License, or ++ (at your option) any later version. + +- This program is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- GNU General Public License for more details. ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. + +- You should have received a copy of the GNU General Public License +- along with this program; if not, write to the Free Software +- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software ++ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +- The author is reachable by electronic mail at tuorfa@yahoo.com. +-=============================================================================*/ ++ The author is reachable by electronic mail at tuorfa@yahoo.com. ++ =============================================================================*/ + + + /*---------------------------------------------------------------------- +@@ -59,6 +59,7 @@ + #include + #endif + ++#include "convert.h" + #include "defs.h" + #include "parse.h" + #include "malloc.h" +@@ -67,14 +68,6 @@ + #include "word.h" + #include "hash.h" + +- +- +-/* local to getchar stuff */ +-static int ungot_char = -1; +-static int ungot_char2 = -1; +-static int ungot_char3 = -1; +- +- + /*======================================================================== + * Name: my_unget_char + * Purpose: My own unget routine, handling up to 3 ungot characters. +@@ -82,30 +75,16 @@ static int ungot_char3 = -1; + * Returns: None. + *=======================================================================*/ + +-static void my_unget_char (int ch) ++static void my_unget_char (struct ConversionContext *cc, int ch) + { +- if (ungot_char>=0 && ungot_char2>=0 && ungot_char3>=0) +- error_handler("More than 3 ungot chars"); ++ if (cc->ungot_char>=0 && cc->ungot_char2>=0 && cc->ungot_char3>=0) ++ error_handler(cc, "More than 3 ungot chars"); + +- ungot_char3 = ungot_char2; +- ungot_char2 = ungot_char; +- ungot_char = ch; ++ cc->ungot_char3 = cc->ungot_char2; ++ cc->ungot_char2 = cc->ungot_char; ++ cc->ungot_char = ch; + } + +- +-static int last_returned_ch=0; +- +- +-#define READ_BUF_LEN 2048 +-static int buffer_size = 0; +-static char *read_buf = NULL; +-static int read_buf_end = 0; +-static int read_buf_index = 0; +- +- +- +- +- + /*======================================================================== + * Name: my_getchar + * Purpose: Gets a character: either an ungot one, or a buffered one. +@@ -113,76 +92,54 @@ static int read_buf_index = 0; + * Returns: Character, or EOF. + *=======================================================================*/ + +-static int my_getchar (FILE* f) ++static int my_getchar (struct ConversionContext *cc) + { +- int ch; +- +- CHECK_PARAM_NOT_NULL(f); ++ int ch; + +- if (ungot_char>=0) { +- ch = ungot_char; +- ungot_char = ungot_char2; +- ungot_char2 = ungot_char3; +- ungot_char3 = -1; +- last_returned_ch = ch; +- if(ch > 255) +- { +- fprintf(stderr, "returning bad ch = '%c' (0%o)\n", +- ch, ch); +- } +- return ch; +- } +- do { +- if (read_buf_index >= read_buf_end) { +- if (!read_buf) { +- buffer_size = READ_BUF_LEN; +- read_buf = my_malloc (buffer_size); +- if (!read_buf) { +- buffer_size /= 4; +- read_buf = my_malloc (buffer_size); +- if (!read_buf) +- error_handler("Cannot allocate read buffer"); +- } +- } +- read_buf_end = fread (read_buf, 1, buffer_size, f); +- read_buf_index = 0; +- if (!read_buf_end) +- return EOF; +- } +- ch = read_buf [read_buf_index++]; ++ if (cc->ungot_char>=0) { ++ ch = cc->ungot_char; ++ cc->ungot_char = cc->ungot_char2; ++ cc->ungot_char2 = cc->ungot_char3; ++ cc->ungot_char3 = -1; ++ cc->last_returned_ch = ch; ++ if(ch > 255) ++ { ++ fprintf(stderr, "returning bad ch = '%c' (0%o)\n", ++ ch, ch); ++ } ++ return ch; ++ } ++ do { ++ if (cc->read_buf_index >= cc->read_buf_end) { ++ return EOF; ++ } ++ ch = cc->read_buf [cc->read_buf_index++]; + +- if (ch=='\n') { +- lineno++; +- /* Convert \(newline) into \par here */ +- if (last_returned_ch=='\\') { +- my_unget_char (' '); +- my_unget_char ('r'); +- my_unget_char ('a'); +- ch = 'p'; +- break; +- } +- } +- } +- while (ch=='\r' /* || ch=='\n' */ ); ++ if (ch=='\n') { ++ cc->lineno++; ++ /* Convert \(newline) into \par here */ ++ if (cc->last_returned_ch=='\\') { ++ my_unget_char (cc, ' '); ++ my_unget_char (cc, 'r'); ++ my_unget_char (cc, 'a'); ++ ch = 'p'; ++ break; ++ } ++ } ++ } ++ while (ch=='\r' /* || ch=='\n' */ ); + +- if (ch=='\t') ch = ' '; ++ if (ch=='\t') ch = ' '; + +- last_returned_ch = ch; +- if(ch > 255) +- { +- fprintf(stderr,"returning bad ch '%c' (0%o)\n", ch, ch); +- exit(1); +- } +- return ch; ++ cc->last_returned_ch = ch; ++ if(ch > 255) ++ { ++ fprintf(stderr,"returning bad ch '%c' (0%o)\n", ch, ch); ++ exit(1); ++ } ++ return ch; + } + +- +-/* local to read_word */ +-static char *input_str = NULL; +-static unsigned long current_max_length = 1; +- +- +- + /*======================================================================== + * Name: expand_word_buffer + * Purpose: Expands the buffer used to store an incoming word. +@@ -192,22 +149,22 @@ static unsigned long current_max_length + *=======================================================================*/ + + static int +-expand_word_buffer () ++expand_word_buffer (struct ConversionContext *cc) + { +- char *new_ptr; +- unsigned long old_length; +- if (!input_str) +- error_handler("No input buffer allocated"); +- old_length = current_max_length; +- current_max_length *= 2; +- new_ptr = my_malloc (current_max_length); +- if (!new_ptr) +- error_handler("Out of memory while resizing buffer"); ++ char *new_ptr; ++ unsigned long old_length; ++ if (!cc->input_str) ++ error_handler(cc, "No input buffer allocated"); ++ old_length = cc->current_max_length; ++ cc->current_max_length *= 2; ++ new_ptr = my_malloc (cc->current_max_length); ++ if (!new_ptr) ++ error_handler(cc, "Out of memory while resizing buffer"); + +- memcpy (new_ptr, input_str, old_length); +- my_free(input_str); +- input_str = new_ptr; +- return TRUE; ++ memcpy (new_ptr, cc->input_str, old_length); ++ my_free(cc->input_str); ++ cc->input_str = new_ptr; ++ return TRUE; + } + + +@@ -222,183 +179,181 @@ expand_word_buffer () + *=======================================================================*/ + + static int +-read_word (FILE *f) ++read_word (struct ConversionContext *cc) + { +- int ch, ch2; +- unsigned long ix=0; +- int have_whitespace=FALSE; +- int is_control_word=FALSE; +- int has_numeric_param=FALSE; /* if is_control_word==TRUE */ +- int need_unget=FALSE; +- +- CHECK_PARAM_NOT_NULL(f); ++ int ch, ch2; ++ unsigned long ix=0; ++ int have_whitespace=FALSE; ++ int is_control_word=FALSE; ++ int has_numeric_param=FALSE; /* if is_control_word==TRUE */ ++ int need_unget=FALSE; + +- current_max_length = 10; /* XX */ ++ cc->current_max_length = 10; /* XX */ + +- /* Get some storage for a word. +- */ +- input_str = my_malloc (current_max_length); +- if (!input_str) +- error_handler("Cannot allocate word storage"); ++ /* Get some storage for a word. ++ */ ++ cc->input_str = my_malloc (cc->current_max_length); ++ if (!cc->input_str) ++ error_handler(cc, "Cannot allocate word storage"); + +- do { +- ch = my_getchar(f); +- } +- while (ch=='\n'); ++ do { ++ ch = my_getchar(cc); ++ } ++ while (ch=='\n'); + +- if (ch==' ') +- { +- /* Compress multiple space chars down to one. +- */ +- while (ch == ' ') { +- ch = my_getchar(f); +- have_whitespace=TRUE; +- } +- if (have_whitespace) { +- my_unget_char (ch); +- input_str[0]=' '; +- input_str[1]=0; +- return 1; +- } +- } ++ if (ch==' ') ++ { ++ /* Compress multiple space chars down to one. ++ */ ++ while (ch == ' ') { ++ ch = my_getchar(cc); ++ have_whitespace=TRUE; ++ } ++ if (have_whitespace) { ++ my_unget_char (cc, ch); ++ cc->input_str[0]=' '; ++ cc->input_str[1]=0; ++ return 1; ++ } ++ } + +- switch(ch) +- { +- case EOF: +- return 0; ++ switch(ch) ++ { ++ case EOF: ++ return 0; + +- case '\\': +- ch2 = my_getchar(f); ++ case '\\': ++ ch2 = my_getchar(cc); + +- /* Look for two-character command words. +- */ +- switch (ch2) +- { +- case '\n': +- strcpy (input_str, "\\par"); +- return 4; +- case '~': +- case '{': +- case '}': +- case '\\': +- case '_': +- case '-': +- input_str[0] = '\\'; +- input_str[1] = ch2; +- input_str[2] = 0; +- return 2; +- case '\'': +- /* Preserve \'## expressions (hex char exprs) for later. +- */ +- input_str[0]='\\'; +- input_str[1]='\''; +- ix=2; +- if(ix==current_max_length) { +- if (!expand_word_buffer ()) +- error_handler("Word too long"); +- } +- ch = my_getchar(f); +- input_str[ix++]=ch; +- if(ix==current_max_length) { +- if (!expand_word_buffer ()) +- error_handler("Word too long"); +- } +- ch = my_getchar(f); +- input_str[ix++]=ch; +- if(ix==current_max_length) { +- if (!expand_word_buffer ()) +- error_handler("Word too long"); +- } +- input_str[ix]=0; +- return ix; +- } ++ /* Look for two-character command words. ++ */ ++ switch (ch2) ++ { ++ case '\n': ++ strcpy (cc->input_str, "\\par"); ++ return 4; ++ case '~': ++ case '{': ++ case '}': ++ case '\\': ++ case '_': ++ case '-': ++ cc->input_str[0] = '\\'; ++ cc->input_str[1] = ch2; ++ cc->input_str[2] = 0; ++ return 2; ++ case '\'': ++ /* Preserve \'## expressions (hex char exprs) for later. ++ */ ++ cc->input_str[0]='\\'; ++ cc->input_str[1]='\''; ++ ix=2; ++ if(ix==cc->current_max_length) { ++ if (!expand_word_buffer (cc)) ++ error_handler(cc, "Word too long"); ++ } ++ ch = my_getchar(cc); ++ cc->input_str[ix++]=ch; ++ if(ix==cc->current_max_length) { ++ if (!expand_word_buffer (cc)) ++ error_handler(cc, "Word too long"); ++ } ++ ch = my_getchar(cc); ++ cc->input_str[ix++]=ch; ++ if(ix==cc->current_max_length) { ++ if (!expand_word_buffer (cc)) ++ error_handler(cc, "Word too long"); ++ } ++ cc->input_str[ix]=0; ++ return ix; ++ } + +- is_control_word=TRUE; +- ix=1; +- input_str[0]=ch; +- ch=ch2; +- break; ++ is_control_word=TRUE; ++ ix=1; ++ cc->input_str[0]=ch; ++ ch=ch2; ++ break; + +- case '\t': +- /* In RTF, a tab char is the same as \tab. +- */ +- strcpy (input_str, "\\tab"); +- return 4; ++ case '\t': ++ /* In RTF, a tab char is the same as \tab. ++ */ ++ strcpy (cc->input_str, "\\tab"); ++ return 4; + +- case '{': +- case '}': +- case ';': +- input_str[0]=ch; +- input_str[1]=0; +- return 1; ++ case '{': ++ case '}': ++ case ';': ++ cc->input_str[0]=ch; ++ cc->input_str[1]=0; ++ return 1; + +- } ++ } + +- while (ch!=EOF) +- { +- /* Several chars always ends a word, and we need to save them. +- */ +- if (ch=='\t' || ch=='{' || ch=='}' || ch=='\\') { +- need_unget=TRUE; +- break; +- } ++ while (ch!=EOF) ++ { ++ /* Several chars always ends a word, and we need to save them. ++ */ ++ if (ch=='\t' || ch=='{' || ch=='}' || ch=='\\') { ++ need_unget=TRUE; ++ break; ++ } + +- /* A newline always ends a command word; we don't save it. +- * A newline is ignored if this is not a command word. +- */ +- if (ch=='\n') { +- if (is_control_word) +- break; +- ch = my_getchar(f); +- continue; +- } ++ /* A newline always ends a command word; we don't save it. ++ * A newline is ignored if this is not a command word. ++ */ ++ if (ch=='\n') { ++ if (is_control_word) ++ break; ++ ch = my_getchar(cc); ++ continue; ++ } + +- /* A semicolon always ends a command word; we do save it. +- * A semicolon never ends a regular word. +- */ +- if (ch==';') { +- if (is_control_word) { +- need_unget=TRUE; +- break; +- } +- } ++ /* A semicolon always ends a command word; we do save it. ++ * A semicolon never ends a regular word. ++ */ ++ if (ch==';') { ++ if (is_control_word) { ++ need_unget=TRUE; ++ break; ++ } ++ } + +- /* In this parser, a space character terminates +- * any word, and if it does not follow a command, +- * then it is a word in itself. +- */ +- if (ch==' ') { +- if (!is_control_word) +- need_unget=TRUE; +- break; +- } ++ /* In this parser, a space character terminates ++ * any word, and if it does not follow a command, ++ * then it is a word in itself. ++ */ ++ if (ch==' ') { ++ if (!is_control_word) ++ need_unget=TRUE; ++ break; ++ } + +- /* Identify a control word's numeric parameter. +- */ +- if (is_control_word) { +- if (!has_numeric_param && (isdigit(ch) || ch=='-')) +- has_numeric_param = TRUE; +- else +- if (has_numeric_param && !isdigit(ch)) { +- if (ch!=' ') +- need_unget=TRUE; +- break; +- } +- } ++ /* Identify a control word's numeric parameter. ++ */ ++ if (is_control_word) { ++ if (!has_numeric_param && (isdigit(ch) || ch=='-')) ++ has_numeric_param = TRUE; ++ else ++ if (has_numeric_param && !isdigit(ch)) { ++ if (ch!=' ') ++ need_unget=TRUE; ++ break; ++ } ++ } + +- input_str[ix++] = ch; +- if (ix==current_max_length) { +- if (!expand_word_buffer ()) +- error_handler("Word too long"); +- } +- ch = my_getchar (f); +- } ++ cc->input_str[ix++] = ch; ++ if (ix==cc->current_max_length) { ++ if (!expand_word_buffer (cc)) ++ error_handler(cc, "Word too long"); ++ } ++ ch = my_getchar (cc); ++ } + +- if (need_unget) +- my_unget_char(ch); ++ if (need_unget) ++ my_unget_char(cc, ch); + +- input_str[ix]=0; +- return ix; ++ cc->input_str[ix]=0; ++ return ix; + } + + +@@ -412,44 +367,42 @@ read_word (FILE *f) + *=======================================================================*/ + + Word * +-word_read (FILE* f) { +- Word * prev_word = NULL; +- Word * first_word = NULL; +- Word * new_word = NULL; /* temp */ +- +- CHECK_PARAM_NOT_NULL(f); +- +- do { +- if (!read_word(f)) +- return first_word; ++word_read (struct ConversionContext *cc) { ++ Word * prev_word = NULL; ++ Word * first_word = NULL; ++ Word * new_word = NULL; /* temp */ + +- if (input_str[0] == '{') { +- /* Process subwords */ ++ do { ++ if (!read_word(cc)) ++ return first_word; + +- /* Create a dummy word to point to a sublist */ +- new_word = word_new(NULL); +- if (!new_word) +- error_handler("Cannot allocate word"); ++ if (cc->input_str[0] == '{') { ++ /* Process subwords */ + +- /* Get the sublist */ +- new_word->child = word_read(f); ++ /* Create a dummy word to point to a sublist */ ++ new_word = word_new(cc, NULL); ++ if (!new_word) ++ error_handler(cc, "Cannot allocate word"); + +- } else if (input_str[0] == '}') { +- return first_word; +- } else { +- new_word = word_new(input_str); +- } ++ /* Get the sublist */ ++ new_word->child = word_read(cc); ++ ++ } else if (cc->input_str[0] == '}') { ++ return first_word; ++ } else { ++ new_word = word_new(cc, cc->input_str); ++ } + +- if (prev_word) +- prev_word->next = new_word; ++ if (prev_word) ++ prev_word->next = new_word; + +- if (!first_word) +- first_word = new_word; ++ if (!first_word) ++ first_word = new_word; + +- prev_word = new_word; ++ prev_word = new_word; + +- /* Free up the memory allocated by read_word. */ +- my_free(input_str); +- input_str = NULL; +- } while (1); ++ /* Free up the memory allocated by read_word. */ ++ my_free(cc->input_str); ++ cc->input_str = NULL; ++ } while (1); + } +diff -durpN unrtf-0.21.2.old/src/parse.h unrtf-0.21.2/src/parse.h +--- unrtf-0.21.2.old/src/parse.h 2010-07-03 22:30:58.000000000 -0400 ++++ unrtf-0.21.2/src/parse.h 2011-11-08 19:15:18.068195109 -0500 +@@ -38,8 +38,6 @@ + #include "word.h" + #endif + ++struct ConversionContext; + +-extern Word *word_read(FILE*); +- +- +- ++extern Word *word_read(struct ConversionContext *cc); +diff -durpN unrtf-0.21.2.old/src/path.c unrtf-0.21.2/src/path.c +--- unrtf-0.21.2.old/src/path.c 2010-07-03 22:30:58.000000000 -0400 ++++ unrtf-0.21.2/src/path.c 1969-12-31 19:00:00.000000000 -0500 +@@ -1,55 +0,0 @@ +-#include +-#include +-#include +-#include +- +-#include "path.h" +- +-struct path_dir *path_dir_p = &topdir; +- +-int check_dirs() +-{ +- char *p; +- char *colon; +- char *dir_name; +- int a; +- +- for(p = search_path; *p != '\0';) +- { +- dir_name = p; +- if((colon = strchr(p, ':')) != NULL) +- { +- p = colon; +- *p++ = '\0'; +- } +- else +- p += strlen(p); +- a = access(dir_name, R_OK|X_OK); +- if(a) +- continue; +- path_dir_p->dir_name = dir_name; +- if((path_dir_p->next = (struct path_dir *)malloc(sizeof (struct path_dir))) == NULL) +- { +- fprintf(stderr,"cannot malloc\n"); +- exit(1); +- } +- path_dir_p = path_dir_p->next; +- path_dir_p->dir_name = 0; +- n_path_dirs++; +- } +- path_checked = 1; +- return(n_path_dirs); +-} +- +-void show_dirs() +-{ +- if(n_path_dirs == 0) +- { +- fprintf(stderr,"no directories to show\n"); +- exit(1); +- } +- fprintf(stderr,"show_dirs: %d directories\n", n_path_dirs); +- for(path_dir_p = &topdir; path_dir_p->dir_name; path_dir_p = path_dir_p->next) +- fprintf(stderr,"directory = %s\n", path_dir_p->dir_name); +-} +- +diff -durpN unrtf-0.21.2.old/src/path.h unrtf-0.21.2/src/path.h +--- unrtf-0.21.2.old/src/path.h 2010-07-03 22:30:58.000000000 -0400 ++++ unrtf-0.21.2/src/path.h 1969-12-31 19:00:00.000000000 -0500 +@@ -1,16 +0,0 @@ +-#define DEFAULT_UNRTF_SEARCH_PATH "/usr/local/lib/unrtf/" +- +-char *search_path; +-int n_path_dirs; +-int path_checked; +- +-struct path_dir +-{ +- char *dir_name; +- struct path_dir *next; +-}; +- +-struct path_dir topdir; +- +-int check_dirs(); +-void show_dirs(); +diff -durpN unrtf-0.21.2.old/src/unrtf.h unrtf-0.21.2/src/unrtf.h +--- unrtf-0.21.2.old/src/unrtf.h 1969-12-31 19:00:00.000000000 -0500 ++++ unrtf-0.21.2/src/unrtf.h 2011-11-08 19:15:18.068195109 -0500 +@@ -0,0 +1,55 @@ ++/*=========================================================================== ++ GNU UnRTF, a command-line program to convert RTF documents to other formats. ++ Copyright (C) 2000,2001,2004 by Zachary Smith ++ Copyright (C) 2011 by Inverse ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software ++ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ ++ The maintainer is reachable by electronic mail at daved@physiol.usyd.edu.au ++===========================================================================*/ ++ ++#ifndef UNRTF_H ++#define UNRTF_H ++ ++typedef int (*unrtf_output_device_func)(void *, const char *, size_t); ++ ++struct unRTFOutputDevice { ++ unrtf_output_device_func print; ++ void *data; ++}; ++ ++typedef struct unRTFOptions { ++ struct unRTFOutputDevice device; /* stdout if NULL */ ++ const char *config_directory; ++ const char *output_format; /* DEFAULT_OUTPUT if NULL */ ++ ++ int nopict_mode; /* TRUE => Do not write \pict's to files */ ++ int dump_mode; /* TRUE => Output a dump of the RTF word tree */ ++ int debug_mode; /* TRUE => Output debug comments within HTML */ ++ int simple_mode; /* TRUE => Output HTML without SPAN/DIV tags -- This would ++ probably be more useful if we could pull out tags ++ as well. */ ++ int inline_mode; /* TRUE => Output HTML without HTML/BODY/HEAD -- This is ++ buggy. I've seen it output pages of tags. */ ++ /* marcossamaral - 0.19.9 */ ++ int verbose_mode; /* TRUE => Output additional informations about unrtf */ ++ int no_remap_mode; /* don't remap codepoints */ ++} unRTFOptions; ++ ++void unrtf_set_output_device (unRTFOptions *, unrtf_output_device_func, void *); ++int unrtf_convert_from_filename (unRTFOptions *, const char *); ++int unrtf_convert_from_string (unRTFOptions *, const char *, size_t); ++ ++#endif /* UNRTF_H */ +diff -durpN unrtf-0.21.2.old/src/user.c unrtf-0.21.2/src/user.c +--- unrtf-0.21.2.old/src/user.c 2011-06-07 08:08:17.000000000 -0400 ++++ unrtf-0.21.2/src/user.c 2011-11-08 19:15:18.068195109 -0500 +@@ -7,7 +7,7 @@ + *---------------------------------------------------------------------- + * Changes: + * 21 Aug 10, daved@physiol.usyd.edu.au: test feof() rather than EOF for +- AIX support ++ AIX support + *--------------------------------------------------------------------*/ + + #ifndef HAVE_STDIO_H +@@ -38,9 +38,9 @@ + + typedef struct my_F + { +- FILE *file; +- int line_nr; +- char *name; ++ FILE *file; ++ int line_nr; ++ char *name; + } my_FILE; + + +@@ -54,15 +54,15 @@ typedef struct my_F + my_FILE * + my_fopen(char *file_name, char *mode) + { +- my_FILE *f = (my_FILE *) malloc(sizeof(my_FILE)); ++ my_FILE *f = (my_FILE *) malloc(sizeof(my_FILE)); + +- if ((f->file = fopen(file_name, "r")) == NULL || (f->name = my_malloc((strlen(file_name) + 1) * sizeof(char))) == NULL) +- return NULL; ++ if ((f->file = fopen(file_name, "r")) == NULL || (f->name = my_malloc((strlen(file_name) + 1) * sizeof(char))) == NULL) ++ return NULL; + +- f->line_nr = 1; +- strcpy(f->name, file_name); ++ f->line_nr = 1; ++ strcpy(f->name, file_name); + +- return f; ++ return f; + } + + /*======================================================================== +@@ -75,8 +75,8 @@ my_fopen(char *file_name, char *mode) + void + my_fclose(my_FILE *f) + { +- fclose(f->file); +- my_free(f->name); ++ fclose(f->file); ++ my_free(f->name); + } + + /*======================================================================== +@@ -86,103 +86,103 @@ my_fclose(my_FILE *f) + * Returns: Definition or NULL on error. + *=======================================================================*/ + +-#define ADD_CHAR(char)\ +- if (def_buffer_length == chars_nr)\ +- {\ +- if ((def = my_realloc(def, def_buffer_length, def_buffer_length * 2)) == NULL)\ +- {\ +- perror("Cannot allocate memory.");\ +- return NULL;\ +- }\ +- def_buffer_length *= 2;\ +- }\ +- def[chars_nr] = char;\ +- chars_nr++; ++#define ADD_CHAR(char) \ ++ if (def_buffer_length == chars_nr) \ ++ { \ ++ if ((def = my_realloc(def, def_buffer_length, def_buffer_length * 2)) == NULL) \ ++ { \ ++ perror("Cannot allocate memory."); \ ++ return NULL; \ ++ } \ ++ def_buffer_length *= 2; \ ++ } \ ++ def[chars_nr] = char; \ ++ chars_nr++; + + char * + give_definition(my_FILE *file) + { +- char c, c2 = 0, c3 = 0, c4 = 0, *def, *unicode_char; +- int i; +- unsigned long def_buffer_length = STANDARD_BUFFER_LENGTH, chars_nr = 0; ++ char c, c2 = 0, c3 = 0, c4 = 0, *def, *unicode_char; ++ int i; ++ unsigned long def_buffer_length = STANDARD_BUFFER_LENGTH, chars_nr = 0; + +- if ((def = my_malloc(def_buffer_length)) == NULL) +- return NULL; ++ if ((def = my_malloc(def_buffer_length)) == NULL) ++ return NULL; + +- c = fgetc(file->file); ++ c = fgetc(file->file); + +- while (c == '\t' || c == '#') +- { +- if (c == '#') +- leave_line(file->file); +- else +- { +- c = fgetc(file->file); ++ while (c == '\t' || c == '#') ++ { ++ if (c == '#') ++ leave_line(file->file); ++ else ++ { ++ c = fgetc(file->file); + + #if 1 /* daved 0.21.2 */ +- while (c != '\n' && !feof(file->file)) ++ while (c != '\n' && !feof(file->file)) + #else +- while (c != '\n' && c != EOF) ++ while (c != '\n' && c != EOF) + #endif +- { +- if (c == 'U' && c2 == '<' && (c3 != '\\' || (c3 == '\\' && c4 == '\\'))) +- { +- unicode_char = get_unicode_char(file->file); ++ { ++ if (c == 'U' && c2 == '<' && (c3 != '\\' || (c3 == '\\' && c4 == '\\'))) ++ { ++ unicode_char = get_unicode_char(file->file); + +- for (i = 0; unicode_char[i] != '\0'; i++) +- ADD_CHAR(unicode_char[i]) +- c = fgetc(file->file); +- c2 = 0; +- c3 = 0; +- c4 = 0; +- } +- else +- { +- if (c2 == '<') +- { +- ADD_CHAR('<'); +- } ++ for (i = 0; unicode_char[i] != '\0'; i++) ++ ADD_CHAR(unicode_char[i]) ++ c = fgetc(file->file); ++ c2 = 0; ++ c3 = 0; ++ c4 = 0; ++ } ++ else ++ { ++ if (c2 == '<') ++ { ++ ADD_CHAR('<'); ++ } + +- /* daved - support \n in definitions */ +- if (c == 'n' && c2 == '\\') +- { +- ADD_CHAR('\n'); +- } +- else +- if (c != '<' && c != '\\' || (c == '\\' && c2 == '\\')) +- { +- ADD_CHAR(c) +- } ++ /* daved - support \n in definitions */ ++ if (c == 'n' && c2 == '\\') ++ { ++ ADD_CHAR('\n'); ++ } ++ else ++ if (c != '<' && c != '\\' || (c == '\\' && c2 == '\\')) ++ { ++ ADD_CHAR(c); ++ } + +- c4 = c3; +- c3 = c2; +- c2 = c; +- c = fgetc(file->file); +- } +- } ++ c4 = c3; ++ c3 = c2; ++ c2 = c; ++ c = fgetc(file->file); ++ } ++ } + +- file->line_nr++; +- ADD_CHAR('\n'); +- } ++ file->line_nr++; ++ ADD_CHAR('\n'); ++ } + +- c = fgetc(file->file); +- } ++ c = fgetc(file->file); ++ } + + #if 1 /* daved 0.21.2 */ +- if (!feof(file->file)) ++ if (!feof(file->file)) + #else +- if (c != EOF) ++ if (c != EOF) + #endif +- { +- ungetc(c, file->file); +- } ++ { ++ ungetc(c, file->file); ++ } + +- if (chars_nr > 0) +- def[chars_nr - 1] = '\0'; +- else +- def[0] = '\0'; ++ if (chars_nr > 0) ++ def[chars_nr - 1] = '\0'; ++ else ++ def[0] = '\0'; + +- return def; ++ return def; + } + + /*======================================================================== +@@ -190,49 +190,71 @@ give_definition(my_FILE *file) + * Purpose: Tries to match known tag names with first argument + * Args: Tag name, Output Personality, file to read from + * Returns: -1 on error, +- 0 on success, +- 1 when tag name "name" is unknown ++ 0 on success, ++ 1 when tag name "name" is unknown + *=======================================================================*/ + + int + match_name (char *name, OutputPersonality *op, my_FILE *file) + { +- struct definition +- { +- char *name; +- char **variable; +- } defs[] = DEFS_ARRAY(op); +- +- char *endptr; +- int i; ++ struct definition ++ { ++ char *name; ++ char **variable; ++ } defs[] = DEFS_ARRAY(op); ++ char *def, *endptr; ++ int i; + + #if 1 /* daved 0.21.0-rc2 */ +- for (i = 0; defs[i].name && strcmp(defs[i].name, name); i++); ++ for (i = 0; defs[i].name && strcmp(defs[i].name, name); i++); + +- if (!defs[i].name) ++ if (!defs[i].name) + #else +- for (i = 0; defs[i].name[0] != '\0' && strcmp(defs[i].name, name); i++); ++ for (i = 0; defs[i].name[0] != '\0' && strcmp(defs[i].name, name); i++); + +- if (defs[i].name[0] == '\0') ++ if (defs[i].name[0] == '\0') + #endif +- { +- i = strtol(name, &endptr, 10); ++ { ++ i = strtol(name, &endptr, 10); + +- if (*endptr == '\0') +- add_alias(op, i, give_definition(file)); +- else if (name[0] == '<' && name[1] == 'U') +- add_alias(op, get_unicode(&name[2]), give_definition(file)); +- else +- { +- fprintf(stderr, "unrtf: unknown name \"%s\" in line %d of \"%s\"\n", name, file->line_nr, file->name); +- return 1; +- } +- } +- else +- if ((*defs[i].variable = give_definition(file)) == NULL) +- return -1; ++ def = give_definition(file); ++ if (*endptr == '\0') ++ add_alias(op, i, def); ++ else if (name[0] == '<' && name[1] == 'U') ++ add_alias(op, get_unicode(&name[2]), def); ++ else ++ { ++ my_free (def); ++ fprintf(stderr, "unrtf: unknown name \"%s\" in line %d of \"%s\"\n", name, file->line_nr, file->name); ++ return 1; ++ } ++ my_free (def); ++ } ++ else ++ if ((*defs[i].variable = give_definition(file)) == NULL) ++ return -1; + +- return 0; ++ return 0; ++} ++ ++void ++free_user_definitions (OutputPersonality *op) ++{ ++ struct definition ++ { ++ char *name; ++ char **variable; ++ } defs[] = DEFS_ARRAY(op); ++ char *variable; ++ int i; ++ ++ for (i = 0; defs[i].name; i++) ++ { ++ variable = *defs[i].variable; ++ if (variable) ++ free(variable); ++ *defs[i].variable = NULL; ++ } + } + + /*======================================================================== +@@ -243,52 +265,55 @@ match_name (char *name, OutputPersonalit + *=======================================================================*/ + + OutputPersonality * +-user_init (OutputPersonality *op, char *definitions_file_path) ++user_init (const struct ConversionContext *cc, char *definitions_file_path) + { +- my_FILE *f; +- char name_buffer[BUFFER_SIZE]; ++ my_FILE *f; ++ char name_buffer[BUFFER_SIZE]; ++ OutputPersonality *op; + +- if (op == NULL) +- op = op_create(); ++ op = op_create(cc); + +- if ((f = my_fopen(definitions_file_path, "r")) == NULL) +- { +- perror(definitions_file_path); +- return op; +- } ++ if ((f = my_fopen(definitions_file_path, "r")) == NULL) ++ { ++ perror(definitions_file_path); ++ op_free (op); ++ op = NULL; ++ return op; ++ } + + #if 1 /* daved 0.21.2 */ +- while +- ( +- fgets(name_buffer, BUFFER_SIZE - 1, f->file) != NULL +- && +- !feof(f->file) +- ) ++ while ++ ( ++ fgets(name_buffer, BUFFER_SIZE - 1, f->file) != NULL ++ && ++ !feof(f->file) ++ ) + #else +- while (fgets(name_buffer, BUFFER_SIZE - 1, f->file) != NULL) ++ while (fgets(name_buffer, BUFFER_SIZE - 1, f->file) != NULL) + #endif +- { +- if (name_buffer[strlen(name_buffer) - 1] != '\n') +- leave_line(f->file); ++ { ++ if (name_buffer[strlen(name_buffer) - 1] != '\n') ++ leave_line(f->file); + +- f->line_nr++; ++ f->line_nr++; + +- if (name_buffer[0] != '#' && name_buffer[0] != '\n') +- { +- name_buffer[strlen(name_buffer) - 1] = '\0'; ++ if (name_buffer[0] != '#' && name_buffer[0] != '\n') ++ { ++ name_buffer[strlen(name_buffer) - 1] = '\0'; + +- if (match_name(name_buffer, op, f) == -1) +- { +- my_fclose(f); +- free(f); +- return NULL; +- } +- } +- } ++ if (match_name(name_buffer, op, f) == -1) ++ { ++ my_fclose(f); ++ free(f); ++ op_free (op); ++ return NULL; ++ } ++ } ++ } + +- my_fclose(f); +- free(f); ++ my_fclose(f); ++ free(f); + +- return op; ++ return op; + } + +diff -durpN unrtf-0.21.2.old/src/user.h unrtf-0.21.2/src/user.h +--- unrtf-0.21.2.old/src/user.h 2010-07-03 22:30:58.000000000 -0400 ++++ unrtf-0.21.2/src/user.h 2011-11-08 19:15:18.068195109 -0500 +@@ -151,9 +151,10 @@ + + #ifndef _USER + ++struct ConversionContext; + +-extern OutputPersonality* user_init(OutputPersonality *, char *tags_file_path); +- ++extern OutputPersonality* user_init(const struct ConversionContext *cc, char *tags_file_path); ++extern void free_user_definitions (OutputPersonality *op); + + #define _USER + #endif +diff -durpN unrtf-0.21.2.old/src/word.c unrtf-0.21.2/src/word.c +--- unrtf-0.21.2.old/src/word.c 2010-07-03 22:30:58.000000000 -0400 ++++ unrtf-0.21.2/src/word.c 2011-11-08 19:15:18.076195102 -0500 +@@ -1,23 +1,23 @@ + /*============================================================================= +- GNU UnRTF, a command-line program to convert RTF documents to other formats. +- Copyright (C) 2000,2001,2004 by Zachary Smith ++ GNU UnRTF, a command-line program to convert RTF documents to other formats. ++ Copyright (C) 2000,2001,2004 by Zachary Smith + +- This program is free software; you can redistribute it and/or modify +- it under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 3 of the License, or +- (at your option) any later version. ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3 of the License, or ++ (at your option) any later version. + +- This program is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- GNU General Public License for more details. ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. + +- You should have received a copy of the GNU General Public License +- along with this program; if not, write to the Free Software +- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software ++ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +- The maintainer is reachable by electronic mail at daved@physiol.usyd.edu.au +-=============================================================================*/ ++ The maintainer is reachable by electronic mail at daved@physiol.usyd.edu.au ++ =============================================================================*/ + + + /*---------------------------------------------------------------------- +@@ -69,6 +69,7 @@ + #endif + + #include "defs.h" ++#include "convert.h" + #include "parse.h" + #include "malloc.h" + #include "main.h" +@@ -77,10 +78,6 @@ + #include "hash.h" + + +-/* For word_dump */ +-static int indent_level=0; +- +- + /*======================================================================== + * Name: word_string + * Purpose: Obtains the string of a Word object. This involves accessing +@@ -90,12 +87,12 @@ static int indent_level=0; + *=======================================================================*/ + + char * +-word_string (Word *w) { +- char *str; +- CHECK_PARAM_NOT_NULL(w); +- if (w->hash_index) str = hash_get_string (w->hash_index); +- else str = NULL; +- return str; ++word_string (const struct ConversionContext *cc, Word *w) { ++ char *str; ++ CHECK_PARAM_NOT_NULL(w); ++ if (w->hash_index) str = hash_get_string (cc, w->hash_index); ++ else str = NULL; ++ return str; + } + + +@@ -108,24 +105,22 @@ word_string (Word *w) { + *=======================================================================*/ + + Word * +-word_new (char *str) { +- Word * w; ++word_new (struct ConversionContext *cc, char *str) { ++ Word * w; + +- w = (Word *) my_malloc(sizeof(Word)); +- if (!w) +- error_handler ("out of memory"); +- memset ((void*) w, 0, sizeof(Word)); +- if (!w) error_handler ("cannot allocate a Word"); ++ w = (Word *) my_malloc(sizeof(Word)); ++ if (!w) ++ error_handler (cc, "out of memory"); ++ memset ((void*) w, 0, sizeof(Word)); ++ if (!w) error_handler (cc, "cannot allocate a Word"); + +- if (str) w->hash_index = hash_get_index (str); +- else w->hash_index = 0; ++ if (str) w->hash_index = hash_get_index (cc, str); ++ else w->hash_index = 0; + +- return w; ++ return w; + } + + +- +- + /*======================================================================== + * Name: word_free + * Purpose: Deallocates a Word object. This is only called at the end of +@@ -135,20 +130,20 @@ word_new (char *str) { + *=======================================================================*/ + + void word_free (Word *w) { +- Word *prev; +- Word *w2; ++ Word *prev; ++ Word *w2; + +- CHECK_PARAM_NOT_NULL(w); ++ CHECK_PARAM_NOT_NULL(w); + +- while (w) { +- w2 = w->child; +- if (w2) +- word_free(w2); ++ while (w) { ++ w2 = w->child; ++ if (w2) ++ word_free(w2); + +- prev = w; +- w = w->next; +- my_free((char*) prev); +- } ++ prev = w; ++ w = w->next; ++ my_free((char*) prev); ++ } + } + + +@@ -165,14 +160,14 @@ void word_free (Word *w) { + static void + print_indentation (int level) + { +- int i; ++ int i; + +- if (level) { +- for (i=0;iindent_level += 2; ++ print_indentation (cc->indent_level); + +- while (w) { +- s = word_string (w); +- if (s) { +- printf ("\"%s\" ", s); +- } else { +- if (w->child) { +- word_dump (w->child); +- printf ("\n"); +- print_indentation (indent_level); +- } +- else +- warning_handler ("Word object has no string and no children"); +- } +- w = w->next; +- } ++ while (w) { ++ s = word_string (cc, w); ++ if (s) { ++ printf ("\"%s\" ", s); ++ } else { ++ if (w->child) { ++ word_dump (cc, w->child); ++ printf ("\n"); ++ print_indentation (cc->indent_level); ++ } ++ else ++ warning_handler ("Word object has no string and no children"); ++ } ++ w = w->next; ++ } + +- indent_level -= 2; ++ cc->indent_level -= 2; + } + + #if 1 /* AK6 - AF */ +@@ -223,56 +218,56 @@ word_dump (Word *w) + * Returns: Optimized word. + *=======================================================================*/ + Word * +-optimize_word(Word *w) ++optimize_word(const struct ConversionContext *cc, Word *w) + { +- char *s, *s1; +- int i = 0, len; +- Collection *c = NULL; +- Tag tags_to_opt[] = OPT_ARRAY; +- Word *root = w, *w2; ++ char *s, *s1; ++ int i = 0, len; ++ Collection *c = NULL; ++ Tag tags_to_opt[] = OPT_ARRAY; ++ Word *root = w, *w2; + +- for (; w != NULL; w = w->next) +- { ++ for (; w != NULL; w = w->next) ++ { + +- if (s = word_string(w)) +- { +- for (i = 0; tags_to_opt[i].name[0] != '\0'; i++) +- { +- if (tags_to_opt[i].has_param) +- { +- len = strlen(tags_to_opt[i].name); +- if (!strncmp(tags_to_opt[i].name, s, len) && (isdigit(s[len]) || s[len] == '-')) +- break; +- } +- else +- if (!strcmp(tags_to_opt[i].name, s)) +- break; +- } ++ if (s = word_string(cc, w)) ++ { ++ for (i = 0; tags_to_opt[i].name[0] != '\0'; i++) ++ { ++ if (tags_to_opt[i].has_param) ++ { ++ len = strlen(tags_to_opt[i].name); ++ if (!strncmp(tags_to_opt[i].name, s, len) && (isdigit(s[len]) || s[len] == '-')) ++ break; ++ } ++ else ++ if (!strcmp(tags_to_opt[i].name, s)) ++ break; ++ } + +- if (tags_to_opt[i].name[0] != '\0') +- { +- s1 = get_from_collection(c, i); ++ if (tags_to_opt[i].name[0] != '\0') ++ { ++ s1 = get_from_collection(c, i); + +- if (s != NULL && s1 != NULL && !strcmp(s1, s)) +- { +- w2->next = w->next; +- my_free((char *)w); +- w = w2; +- } +- else +- c = add_to_collection(c, i, s); +- } +- } ++ if (s != NULL && s1 != NULL && !strcmp(s1, s)) ++ { ++ w2->next = w->next; ++ my_free((char *)w); ++ w = w2; ++ } ++ else ++ c = add_to_collection(c, i, s); ++ } ++ } + +- if (w->child != NULL) +- w->child = optimize_word(w->child); ++ if (w->child != NULL) ++ w->child = optimize_word(cc, w->child); + +- w2 = w; +- } ++ w2 = w; ++ } + +-// free_collection(c); ++ free_collection(c); + +- return root; ++ return root; + } + #endif + +diff -durpN unrtf-0.21.2.old/src/word.h unrtf-0.21.2/src/word.h +--- unrtf-0.21.2.old/src/word.h 2010-07-03 22:30:58.000000000 -0400 ++++ unrtf-0.21.2/src/word.h 2011-11-08 19:15:18.076195102 -0500 +@@ -41,14 +41,15 @@ typedef struct _w { + struct _w * child; + } Word; + +-extern Word* word_new (char*); ++struct ConversionContext; ++ ++extern Word* word_new (struct ConversionContext *, char*); + extern void word_free (Word*); +-extern Word* word_read (FILE*); +-extern char* word_string (Word*); +-extern void word_dump (Word*); ++extern char* word_string (const struct ConversionContext *, Word*); ++extern void word_dump (struct ConversionContext *, Word*); + extern void word_print_html (Word*); + +-extern Word* optimize_word(Word*); ++extern Word* optimize_word(const struct ConversionContext *, Word*); + + typedef struct _t { + char *name; diff --git a/OpenChange/unrtf-0.21.2.tar.gz b/OpenChange/unrtf-0.21.2.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..421ba59f0e4e6c34375f0e7eeaf4a5bb68a5a3df GIT binary patch literal 617656 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�-)n{t$a_zwb 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

Oz+*4A_soePyPbpDRx${GvazsMq&JT6U6?yp! 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

305=bS8l#byh_54$jKHVn3_ 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 z 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

%ypQbY|zUJE^kkRpW` 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�)aaLc#FE0^DN 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 header file. */ +#define HAVE_CTYPE_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if your system has a GNU libc compatible `malloc' function, and + to 0 otherwise. */ +#define HAVE_MALLOC 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `memset' function. */ +#define HAVE_MEMSET 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDIO_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strchr' function. */ +#define HAVE_STRCHR 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the `strstr' function. */ +#define HAVE_STRSTR 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Name of package */ +#define PACKAGE "unrtf" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "bug-unrtf@gnu.org" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "unrtf" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "unrtf 0.21.2" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "unrtf" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "0.21.2" + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Version number of package */ +#define VERSION "0.21.2" + +/* Define to rpl_malloc if the replacement function should be used. */ +/* #undef malloc */ From 3a299b4106c8a5d5fe225100bfbb03c8915870d2 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 9 Nov 2011 15:02:11 +0000 Subject: [PATCH 17/38] Monotone-Parent: 8387e16ec4baa1ac1d8fd5958d3681e5bcf43e92 Monotone-Revision: 4133fa3bdfc5ea96190a7418e63c70b71d18a166 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-09T15:02:11 Monotone-Branch: ca.inverse.sogo --- .mtn-ignore | 2 -- 1 file changed, 2 deletions(-) diff --git a/.mtn-ignore b/.mtn-ignore index 9f016fef4..3a0bd502c 100644 --- a/.mtn-ignore +++ b/.mtn-ignore @@ -4,9 +4,7 @@ obj err$ build\.log imgs-.* -diff .*\.bak$ -.*\.diff$ .*\.d$ .*\.log$ .*\.ifb$ From 2681fc06cd840d31b7fe2a9fb3c5856d1d4b9967 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 9 Nov 2011 15:02:29 +0000 Subject: [PATCH 18/38] Monotone-Parent: 4133fa3bdfc5ea96190a7418e63c70b71d18a166 Monotone-Revision: cad6ada90ff5ceee70d17d329089fd9a10525383 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-09T15:02:29 Monotone-Branch: ca.inverse.sogo --- OpenChange/MAPIStoreAppointmentWrapper.m | 1 + OpenChange/MAPIStoreCalendarMessage.m | 1 + OpenChange/MAPIStoreContext.m | 1 + OpenChange/MAPIStoreFAIMessage.m | 2 ++ OpenChange/MAPIStoreFAIMessageTable.m | 2 ++ OpenChange/MAPIStoreFSBaseContext.m | 3 --- OpenChange/MAPIStoreFolder.m | 1 + OpenChange/MAPIStoreMailFolder.m | 1 + OpenChange/MAPIStoreRecurrenceUtils.h | 3 --- OpenChange/MAPIStoreRecurrenceUtils.m | 4 ++++ OpenChange/MAPIStoreTypes.h | 2 ++ OpenChange/MAPIStoreTypes.m | 11 ++++------- OpenChange/NSArray+MAPIStore.m | 1 + OpenChange/NSData+MAPIStore.m | 3 ++- OpenChange/NSDate+MAPIStore.m | 3 ++- OpenChange/NSString+MAPIStore.m | 2 ++ OpenChange/SOGoMAPIFSFolder.m | 2 ++ 17 files changed, 28 insertions(+), 15 deletions(-) diff --git a/OpenChange/MAPIStoreAppointmentWrapper.m b/OpenChange/MAPIStoreAppointmentWrapper.m index cbd62fca8..1f87abad0 100644 --- a/OpenChange/MAPIStoreAppointmentWrapper.m +++ b/OpenChange/MAPIStoreAppointmentWrapper.m @@ -53,6 +53,7 @@ #include #include #include +#include #include #include #include diff --git a/OpenChange/MAPIStoreCalendarMessage.m b/OpenChange/MAPIStoreCalendarMessage.m index 174d33f65..1113b02b1 100644 --- a/OpenChange/MAPIStoreCalendarMessage.m +++ b/OpenChange/MAPIStoreCalendarMessage.m @@ -25,6 +25,7 @@ - take the tz definitions from Outlook */ #include +#include #import #import diff --git a/OpenChange/MAPIStoreContext.m b/OpenChange/MAPIStoreContext.m index 312b20ec4..ec431228c 100644 --- a/OpenChange/MAPIStoreContext.m +++ b/OpenChange/MAPIStoreContext.m @@ -56,6 +56,7 @@ #undef DEBUG #include #include +#include #include #include #include diff --git a/OpenChange/MAPIStoreFAIMessage.m b/OpenChange/MAPIStoreFAIMessage.m index 68e9c952d..8ae940af0 100644 --- a/OpenChange/MAPIStoreFAIMessage.m +++ b/OpenChange/MAPIStoreFAIMessage.m @@ -26,6 +26,8 @@ #import "MAPIStoreFAIMessage.h" #undef DEBUG +#include +#include #include @implementation MAPIStoreFAIMessage diff --git a/OpenChange/MAPIStoreFAIMessageTable.m b/OpenChange/MAPIStoreFAIMessageTable.m index 46c23e7d7..fb7b6df1f 100644 --- a/OpenChange/MAPIStoreFAIMessageTable.m +++ b/OpenChange/MAPIStoreFAIMessageTable.m @@ -28,6 +28,8 @@ #import "MAPIStoreFAIMessageTable.h" #undef DEBUG +#include +#include #include static Class MAPIStoreFAIMessageK = Nil; diff --git a/OpenChange/MAPIStoreFSBaseContext.m b/OpenChange/MAPIStoreFSBaseContext.m index d57225056..bb34b4795 100644 --- a/OpenChange/MAPIStoreFSBaseContext.m +++ b/OpenChange/MAPIStoreFSBaseContext.m @@ -34,9 +34,6 @@ #import "MAPIStoreFSBaseContext.h" -#undef DEBUG -#include - static Class MAPIStoreFSFolderK; @implementation MAPIStoreFSBaseContext diff --git a/OpenChange/MAPIStoreFolder.m b/OpenChange/MAPIStoreFolder.m index ec4220b87..4630f7246 100644 --- a/OpenChange/MAPIStoreFolder.m +++ b/OpenChange/MAPIStoreFolder.m @@ -51,6 +51,7 @@ #include #undef DEBUG +#include #include #include #include diff --git a/OpenChange/MAPIStoreMailFolder.m b/OpenChange/MAPIStoreMailFolder.m index aac7d66e7..e99ec2059 100644 --- a/OpenChange/MAPIStoreMailFolder.m +++ b/OpenChange/MAPIStoreMailFolder.m @@ -64,6 +64,7 @@ static Class SOGoMailFolderK; #undef DEBUG +#include #include #include #include diff --git a/OpenChange/MAPIStoreRecurrenceUtils.h b/OpenChange/MAPIStoreRecurrenceUtils.h index e1f50c1e8..4fdf8c54e 100644 --- a/OpenChange/MAPIStoreRecurrenceUtils.h +++ b/OpenChange/MAPIStoreRecurrenceUtils.h @@ -26,9 +26,6 @@ #import #import -#include -#include - @class NSCalendarDate; @class iCalRepeatableEntityObject; @class iCalRecurrenceRule; diff --git a/OpenChange/MAPIStoreRecurrenceUtils.m b/OpenChange/MAPIStoreRecurrenceUtils.m index de279b4fe..4026c5b88 100644 --- a/OpenChange/MAPIStoreRecurrenceUtils.m +++ b/OpenChange/MAPIStoreRecurrenceUtils.m @@ -32,6 +32,10 @@ #import "NSDate+MAPIStore.h" #import "MAPIStoreRecurrenceUtils.h" +#include +#include +#include + @implementation iCalCalendar (MAPIStoreRecurrence) - (void) setupRecurrenceWithMasterEntity: (iCalRepeatableEntityObject *) entity diff --git a/OpenChange/MAPIStoreTypes.h b/OpenChange/MAPIStoreTypes.h index 6272f94e1..23dc03b12 100644 --- a/OpenChange/MAPIStoreTypes.h +++ b/OpenChange/MAPIStoreTypes.h @@ -26,6 +26,8 @@ #import #include +#include +#include #include @class NSData; diff --git a/OpenChange/MAPIStoreTypes.m b/OpenChange/MAPIStoreTypes.m index a278f0594..87e01792a 100644 --- a/OpenChange/MAPIStoreTypes.m +++ b/OpenChange/MAPIStoreTypes.m @@ -20,13 +20,6 @@ * Boston, MA 02111-1307, USA. */ -#undef DEBUG -#include -#include -#include -#include -#include - #import #import #import @@ -38,6 +31,10 @@ #import "MAPIStoreTypes.h" +#undef DEBUG +#include +#include + uint8_t * MAPIBoolValue (void *memCtx, BOOL value) { diff --git a/OpenChange/NSArray+MAPIStore.m b/OpenChange/NSArray+MAPIStore.m index a651888f4..000bc3ec7 100644 --- a/OpenChange/NSArray+MAPIStore.m +++ b/OpenChange/NSArray+MAPIStore.m @@ -28,6 +28,7 @@ #undef DEBUG #include +#include #include @implementation NSArray (MAPIStoreFolders) diff --git a/OpenChange/NSData+MAPIStore.m b/OpenChange/NSData+MAPIStore.m index f998ef27d..e9fe04076 100644 --- a/OpenChange/NSData+MAPIStore.m +++ b/OpenChange/NSData+MAPIStore.m @@ -24,8 +24,9 @@ #undef DEBUG #include -#include #include +#include +#include @implementation NSData (MAPIStoreDataTypes) diff --git a/OpenChange/NSDate+MAPIStore.m b/OpenChange/NSDate+MAPIStore.m index 63d83a0a7..d36ff6729 100644 --- a/OpenChange/NSDate+MAPIStore.m +++ b/OpenChange/NSDate+MAPIStore.m @@ -27,8 +27,9 @@ #import "NSDate+MAPIStore.h" #undef DEBUG -#include #include +#include +#include static NSCalendarDate *refDate = nil; diff --git a/OpenChange/NSString+MAPIStore.m b/OpenChange/NSString+MAPIStore.m index e6cf8fad7..a4a894b6a 100644 --- a/OpenChange/NSString+MAPIStore.m +++ b/OpenChange/NSString+MAPIStore.m @@ -28,6 +28,8 @@ #import "NSString+MAPIStore.h" #undef DEBUG +#include +#include #include @implementation NSString (MAPIStoreDataTypes) diff --git a/OpenChange/SOGoMAPIFSFolder.m b/OpenChange/SOGoMAPIFSFolder.m index 8389830de..67c592543 100644 --- a/OpenChange/SOGoMAPIFSFolder.m +++ b/OpenChange/SOGoMAPIFSFolder.m @@ -35,6 +35,8 @@ #import "SOGoMAPIFSFolder.h" #undef DEBUG +#include +#include #include #include #include From 572912f6c6937d8805069b6f5af178354cb66246 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 9 Nov 2011 15:16:17 +0000 Subject: [PATCH 19/38] Monotone-Parent: cad6ada90ff5ceee70d17d329089fd9a10525383 Monotone-Revision: 9d69a4f9e36ae296f0138fa950b104da3b08d845 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-09T15:16:17 Monotone-Branch: ca.inverse.sogo --- OpenChange/gen-property-selectors.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OpenChange/gen-property-selectors.py b/OpenChange/gen-property-selectors.py index 36bdc88c7..abf2fb283 100755 --- a/OpenChange/gen-property-selectors.py +++ b/OpenChange/gen-property-selectors.py @@ -81,6 +81,8 @@ h_template = """/* %(filename)s (auto-generated) - this file is part of SOGo #import #include +#include +#include #include extern const NSUInteger MAPIStorePropertyGettersCount; From 7443d6cc3bf5d9273aa6eaecb3cdeceb818103e6 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 9 Nov 2011 19:03:29 +0000 Subject: [PATCH 20/38] Monotone-Parent: 9d69a4f9e36ae296f0138fa950b104da3b08d845 Monotone-Revision: fec098bfdf37d2746490447a0b93c70840f11c4a Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-09T19:03:29 Monotone-Branch: ca.inverse.sogo --- OpenChange/unrtf-0.21.2.diff | 62 +++++++++++++++++++++--------------- 1 file changed, 37 insertions(+), 25 deletions(-) diff --git a/OpenChange/unrtf-0.21.2.diff b/OpenChange/unrtf-0.21.2.diff index 4c8cb8158..1920d0467 100644 --- a/OpenChange/unrtf-0.21.2.diff +++ b/OpenChange/unrtf-0.21.2.diff @@ -1,6 +1,18 @@ +diff -durpN unrtf-0.21.2.old/outputs/html.conf unrtf-0.21.2/outputs/html.conf +--- unrtf-0.21.2.old/outputs/html.conf 2010-08-15 08:44:09.000000000 -0400 ++++ unrtf-0.21.2/outputs/html.conf 2011-11-09 13:55:25.289763561 -0500 +@@ -5,7 +5,7 @@ comment_end + --> + + document_begin +- ++ + #Second test of comments + + diff -durpN unrtf-0.21.2.old/src/attr.c unrtf-0.21.2/src/attr.c --- unrtf-0.21.2.old/src/attr.c 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/attr.c 2011-11-08 19:15:18.044195095 -0500 ++++ unrtf-0.21.2/src/attr.c 2011-11-09 09:55:11.557465363 -0500 @@ -1,23 +1,23 @@ /*============================================================================= - GNU UnRTF, a command-line program to convert RTF documents to other formats. @@ -1250,7 +1262,7 @@ diff -durpN unrtf-0.21.2.old/src/attr.c unrtf-0.21.2/src/attr.c diff -durpN unrtf-0.21.2.old/src/attr.h unrtf-0.21.2/src/attr.h --- unrtf-0.21.2.old/src/attr.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/attr.h 2011-11-08 19:15:18.044195095 -0500 ++++ unrtf-0.21.2/src/attr.h 2011-11-09 09:55:11.561465361 -0500 @@ -1,23 +1,23 @@ /*============================================================================= - GNU UnRTF, a command-line program to convert RTF documents to other formats. @@ -1400,7 +1412,7 @@ diff -durpN unrtf-0.21.2.old/src/attr.h unrtf-0.21.2/src/attr.h +#endif /* ATTR_H */ diff -durpN unrtf-0.21.2.old/src/convert.c unrtf-0.21.2/src/convert.c --- unrtf-0.21.2.old/src/convert.c 2011-06-07 08:00:23.000000000 -0400 -+++ unrtf-0.21.2/src/convert.c 2011-11-09 09:29:58.317540932 -0500 ++++ unrtf-0.21.2/src/convert.c 2011-11-09 09:55:11.561465361 -0500 @@ -1,24 +1,24 @@ /*=========================================================================== @@ -7095,7 +7107,7 @@ diff -durpN unrtf-0.21.2.old/src/convert.c unrtf-0.21.2/src/convert.c } diff -durpN unrtf-0.21.2.old/src/convert.h unrtf-0.21.2/src/convert.h --- unrtf-0.21.2.old/src/convert.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/convert.h 2011-11-08 19:15:18.052195124 -0500 ++++ unrtf-0.21.2/src/convert.h 2011-11-09 09:55:11.565465360 -0500 @@ -36,18 +36,135 @@ #ifndef _CONVERT @@ -7239,7 +7251,7 @@ diff -durpN unrtf-0.21.2.old/src/convert.h unrtf-0.21.2/src/convert.h diff -durpN unrtf-0.21.2.old/src/defs.h unrtf-0.21.2/src/defs.h --- unrtf-0.21.2.old/src/defs.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/defs.h 2011-11-08 19:15:18.052195124 -0500 ++++ unrtf-0.21.2/src/defs.h 2011-11-09 09:55:11.565465360 -0500 @@ -64,9 +64,6 @@ #define SKIP_ONE_WORD 2 #endif @@ -7259,7 +7271,7 @@ diff -durpN unrtf-0.21.2.old/src/defs.h unrtf-0.21.2/src/defs.h +#define DEFAULT_OUTPUT "html" diff -durpN unrtf-0.21.2.old/src/error.c unrtf-0.21.2/src/error.c --- unrtf-0.21.2.old/src/error.c 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/error.c 2011-11-08 19:15:18.052195124 -0500 ++++ unrtf-0.21.2/src/error.c 2011-11-09 09:55:11.565465360 -0500 @@ -51,27 +51,11 @@ #include #endif @@ -7304,7 +7316,7 @@ diff -durpN unrtf-0.21.2.old/src/error.c unrtf-0.21.2/src/error.c #endif diff -durpN unrtf-0.21.2.old/src/error.h unrtf-0.21.2/src/error.h --- unrtf-0.21.2.old/src/error.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/error.h 2011-11-08 19:15:18.056195127 -0500 ++++ unrtf-0.21.2/src/error.h 2011-11-09 09:55:11.569465360 -0500 @@ -37,9 +37,10 @@ #define CHECK_MALLOC_SUCCESS(XX) { if ((XX)==NULL) { fprintf (stderr, "internal error: cannot allocate memory in %s at %d\n", __FILE__, __LINE__); exit (1); }} @@ -7319,7 +7331,7 @@ diff -durpN unrtf-0.21.2.old/src/error.h unrtf-0.21.2/src/error.h diff -durpN unrtf-0.21.2.old/src/hash.c unrtf-0.21.2/src/hash.c --- unrtf-0.21.2.old/src/hash.c 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/hash.c 2011-11-08 19:15:18.056195127 -0500 ++++ unrtf-0.21.2/src/hash.c 2011-11-09 09:55:11.569465360 -0500 @@ -53,24 +53,16 @@ #include #endif @@ -7524,7 +7536,7 @@ diff -durpN unrtf-0.21.2.old/src/hash.c unrtf-0.21.2/src/hash.c +} diff -durpN unrtf-0.21.2.old/src/hash.h unrtf-0.21.2/src/hash.h --- unrtf-0.21.2.old/src/hash.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/hash.h 2011-11-08 19:15:18.056195127 -0500 ++++ unrtf-0.21.2/src/hash.h 2011-11-09 09:55:11.569465360 -0500 @@ -32,11 +32,11 @@ * 16 Dec 07, daved@physiol.usyd.edu.au: updated to GPL v3 *--------------------------------------------------------------------*/ @@ -7545,7 +7557,7 @@ diff -durpN unrtf-0.21.2.old/src/hash.h unrtf-0.21.2/src/hash.h diff -durpN unrtf-0.21.2.old/src/main.c unrtf-0.21.2/src/main.c --- unrtf-0.21.2.old/src/main.c 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/main.c 2011-11-08 19:15:18.056195127 -0500 ++++ unrtf-0.21.2/src/main.c 2011-11-09 09:55:11.569465360 -0500 @@ -1,23 +1,23 @@ /*============================================================================= - GNU UnRTF, a command-line program to convert RTF documents to other formats. @@ -7967,7 +7979,7 @@ diff -durpN unrtf-0.21.2.old/src/main.c unrtf-0.21.2/src/main.c - diff -durpN unrtf-0.21.2.old/src/main.h unrtf-0.21.2/src/main.h --- unrtf-0.21.2.old/src/main.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/main.h 2011-11-08 19:15:18.056195127 -0500 ++++ unrtf-0.21.2/src/main.h 2011-11-09 09:55:11.573465361 -0500 @@ -35,21 +35,8 @@ * 17 Jan 10, daved@physiol.usyd.edu.au: change CONFIG_DIR to drop outputs/ *--------------------------------------------------------------------*/ @@ -7993,7 +8005,7 @@ diff -durpN unrtf-0.21.2.old/src/main.h unrtf-0.21.2/src/main.h +#define USAGE "unrtf [--version] [--verbose] [--help] [--nopict|-n] [--noremap] [--html] [--text] [--vt] [--latex] [--rtf] [-P config_search_path] [-t )] " diff -durpN unrtf-0.21.2.old/src/Makefile.am unrtf-0.21.2/src/Makefile.am --- unrtf-0.21.2.old/src/Makefile.am 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/Makefile.am 2011-11-08 19:15:18.060195122 -0500 ++++ unrtf-0.21.2/src/Makefile.am 2011-11-09 09:55:11.573465361 -0500 @@ -13,7 +13,6 @@ unrtf_SOURCES = attr.c attr.h \ malloc.c malloc.h \ output.c output.h \ @@ -8004,7 +8016,7 @@ diff -durpN unrtf-0.21.2.old/src/Makefile.am unrtf-0.21.2/src/Makefile.am util.c util.h \ diff -durpN unrtf-0.21.2.old/src/malloc.c unrtf-0.21.2/src/malloc.c --- unrtf-0.21.2.old/src/malloc.c 2010-07-09 01:13:05.000000000 -0400 -+++ unrtf-0.21.2/src/malloc.c 2011-11-08 19:15:18.060195122 -0500 ++++ unrtf-0.21.2/src/malloc.c 2011-11-09 09:55:11.573465361 -0500 @@ -135,19 +135,19 @@ total_malloced (void) { *=======================================================================*/ @@ -8044,7 +8056,7 @@ diff -durpN unrtf-0.21.2.old/src/malloc.c unrtf-0.21.2/src/malloc.c } diff -durpN unrtf-0.21.2.old/src/malloc.h unrtf-0.21.2/src/malloc.h --- unrtf-0.21.2.old/src/malloc.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/malloc.h 2011-11-08 19:15:18.060195122 -0500 ++++ unrtf-0.21.2/src/malloc.h 2011-11-09 09:55:11.573465361 -0500 @@ -32,9 +32,10 @@ * 09 Nov 08, arkadiusz.firus@gmail.com: added my_realloc *--------------------------------------------------------------------*/ @@ -8060,7 +8072,7 @@ diff -durpN unrtf-0.21.2.old/src/malloc.h unrtf-0.21.2/src/malloc.h +extern char * my_strdup (struct ConversionContext *, char*); diff -durpN unrtf-0.21.2.old/src/my_iconv.c unrtf-0.21.2/src/my_iconv.c --- unrtf-0.21.2.old/src/my_iconv.c 2010-08-16 00:12:43.000000000 -0400 -+++ unrtf-0.21.2/src/my_iconv.c 2011-11-08 19:15:18.060195122 -0500 ++++ unrtf-0.21.2/src/my_iconv.c 2011-11-09 09:55:11.573465361 -0500 @@ -12,154 +12,133 @@ #include #include @@ -8302,7 +8314,7 @@ diff -durpN unrtf-0.21.2.old/src/my_iconv.c unrtf-0.21.2/src/my_iconv.c diff -durpN unrtf-0.21.2.old/src/my_iconv.h unrtf-0.21.2/src/my_iconv.h --- unrtf-0.21.2.old/src/my_iconv.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/my_iconv.h 2011-11-08 19:15:18.060195122 -0500 ++++ unrtf-0.21.2/src/my_iconv.h 2011-11-09 09:55:11.573465361 -0500 @@ -5,6 +5,9 @@ * Purpose: my_conv definitions *--------------------------------------------------------------------*/ @@ -8332,7 +8344,7 @@ diff -durpN unrtf-0.21.2.old/src/my_iconv.h unrtf-0.21.2/src/my_iconv.h +#endif /* _MY_ICONV */ diff -durpN unrtf-0.21.2.old/src/output.c unrtf-0.21.2/src/output.c --- unrtf-0.21.2.old/src/output.c 2011-06-07 08:04:38.000000000 -0400 -+++ unrtf-0.21.2/src/output.c 2011-11-08 19:15:18.064195114 -0500 ++++ unrtf-0.21.2/src/output.c 2011-11-09 09:55:11.577465362 -0500 @@ -1,23 +1,23 @@ /*============================================================================= - GNU UnRTF, a command-line program to convert RTF documents to other formats. @@ -9512,7 +9524,7 @@ diff -durpN unrtf-0.21.2.old/src/output.c unrtf-0.21.2/src/output.c - diff -durpN unrtf-0.21.2.old/src/output.h unrtf-0.21.2/src/output.h --- unrtf-0.21.2.old/src/output.h 2010-08-11 21:09:02.000000000 -0400 -+++ unrtf-0.21.2/src/output.h 2011-11-08 19:15:18.064195114 -0500 ++++ unrtf-0.21.2/src/output.h 2011-11-09 09:55:11.577465362 -0500 @@ -44,227 +44,228 @@ typedef Collection Aliases; @@ -9900,7 +9912,7 @@ diff -durpN unrtf-0.21.2.old/src/output.h unrtf-0.21.2/src/output.h - diff -durpN unrtf-0.21.2.old/src/parse.c unrtf-0.21.2/src/parse.c --- unrtf-0.21.2.old/src/parse.c 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/parse.c 2011-11-09 09:52:09.593474687 -0500 ++++ unrtf-0.21.2/src/parse.c 2011-11-09 09:55:11.577465362 -0500 @@ -1,23 +1,23 @@ /*============================================================================= - GNU UnRTF, a command-line program to convert RTF documents to other formats. @@ -10571,7 +10583,7 @@ diff -durpN unrtf-0.21.2.old/src/parse.c unrtf-0.21.2/src/parse.c } diff -durpN unrtf-0.21.2.old/src/parse.h unrtf-0.21.2/src/parse.h --- unrtf-0.21.2.old/src/parse.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/parse.h 2011-11-08 19:15:18.068195109 -0500 ++++ unrtf-0.21.2/src/parse.h 2011-11-09 09:55:11.581465362 -0500 @@ -38,8 +38,6 @@ #include "word.h" #endif @@ -10664,7 +10676,7 @@ diff -durpN unrtf-0.21.2.old/src/path.h unrtf-0.21.2/src/path.h -void show_dirs(); diff -durpN unrtf-0.21.2.old/src/unrtf.h unrtf-0.21.2/src/unrtf.h --- unrtf-0.21.2.old/src/unrtf.h 1969-12-31 19:00:00.000000000 -0500 -+++ unrtf-0.21.2/src/unrtf.h 2011-11-08 19:15:18.068195109 -0500 ++++ unrtf-0.21.2/src/unrtf.h 2011-11-09 09:55:11.581465362 -0500 @@ -0,0 +1,55 @@ +/*=========================================================================== + GNU UnRTF, a command-line program to convert RTF documents to other formats. @@ -10723,7 +10735,7 @@ diff -durpN unrtf-0.21.2.old/src/unrtf.h unrtf-0.21.2/src/unrtf.h +#endif /* UNRTF_H */ diff -durpN unrtf-0.21.2.old/src/user.c unrtf-0.21.2/src/user.c --- unrtf-0.21.2.old/src/user.c 2011-06-07 08:08:17.000000000 -0400 -+++ unrtf-0.21.2/src/user.c 2011-11-08 19:15:18.068195109 -0500 ++++ unrtf-0.21.2/src/user.c 2011-11-09 09:55:11.581465362 -0500 @@ -7,7 +7,7 @@ *---------------------------------------------------------------------- * Changes: @@ -11153,7 +11165,7 @@ diff -durpN unrtf-0.21.2.old/src/user.c unrtf-0.21.2/src/user.c diff -durpN unrtf-0.21.2.old/src/user.h unrtf-0.21.2/src/user.h --- unrtf-0.21.2.old/src/user.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/user.h 2011-11-08 19:15:18.068195109 -0500 ++++ unrtf-0.21.2/src/user.h 2011-11-09 09:55:11.585465361 -0500 @@ -151,9 +151,10 @@ #ifndef _USER @@ -11169,7 +11181,7 @@ diff -durpN unrtf-0.21.2.old/src/user.h unrtf-0.21.2/src/user.h #endif diff -durpN unrtf-0.21.2.old/src/word.c unrtf-0.21.2/src/word.c --- unrtf-0.21.2.old/src/word.c 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/word.c 2011-11-08 19:15:18.076195102 -0500 ++++ unrtf-0.21.2/src/word.c 2011-11-09 09:55:11.585465361 -0500 @@ -1,23 +1,23 @@ /*============================================================================= - GNU UnRTF, a command-line program to convert RTF documents to other formats. @@ -11492,7 +11504,7 @@ diff -durpN unrtf-0.21.2.old/src/word.c unrtf-0.21.2/src/word.c diff -durpN unrtf-0.21.2.old/src/word.h unrtf-0.21.2/src/word.h --- unrtf-0.21.2.old/src/word.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/word.h 2011-11-08 19:15:18.076195102 -0500 ++++ unrtf-0.21.2/src/word.h 2011-11-09 09:55:11.585465361 -0500 @@ -41,14 +41,15 @@ typedef struct _w { struct _w * child; } Word; From eb3d3daa074a039e900638c085178491ece872c2 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 9 Nov 2011 20:06:06 +0000 Subject: [PATCH 21/38] Monotone-Parent: fec098bfdf37d2746490447a0b93c70840f11c4a Monotone-Revision: ead3fff3d76689011b8b8b7eac980671612662e5 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-09T20:06:06 Monotone-Branch: ca.inverse.sogo --- OpenChange/GNUmakefile | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/OpenChange/GNUmakefile b/OpenChange/GNUmakefile index 3bd60a17b..cd4aca1d6 100644 --- a/OpenChange/GNUmakefile +++ b/OpenChange/GNUmakefile @@ -136,19 +136,20 @@ $(SOGOBACKEND)_RESOURCE_FILES += \ all:: $(UNRTF_DIR)/config.h $(UNRTF_DIR)/src/GNUmakefile $(UNRTF_DIR): $(UNRTF_DIR).tar.gz $(UNRTF_DIR).diff - rm -rf $(UNRTF_DIR) - $(TAR) -xvzf $< - (cd $(UNRTF_DIR) && patch -p1 < ../$(UNRTF_DIR).diff) - touch $(UNRTF_DIR) + @echo " Extracting and patching $(UNRTF_DIR)..." + @rm -rf $(UNRTF_DIR) + @$(TAR) -xvzf $< > /dev/null + @(cd $(UNRTF_DIR) && patch -p1 < ../$(UNRTF_DIR).diff) > /dev/null + @touch $(UNRTF_DIR) $(UNRTF_DIR)-stamp: $(UNRTF_DIR) - touch $@ + @touch $@ $(UNRTF_DIR)/config.h: $(UNRTF_DIR)-stamp unrtf_config_h - cp unrtf_config_h $(UNRTF_DIR)/config.h + @cp unrtf_config_h $(UNRTF_DIR)/config.h $(UNRTF_DIR)/src/GNUmakefile: $(UNRTF_DIR)-stamp GNUmakefile.unrtf - cp GNUmakefile.unrtf $@ + @cp GNUmakefile.unrtf $@ ### pl reader PLREADER_TOOL = plreader From 1e9a61705cef5378d3aec994c12390fa8d20aa6c Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 9 Nov 2011 20:10:31 +0000 Subject: [PATCH 22/38] Monotone-Parent: ead3fff3d76689011b8b8b7eac980671612662e5 Monotone-Revision: 2448001ef69730541ee1c822cf80c131176b1ed0 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-09T20:10:31 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 4 ++++ OpenChange/MAPIStoreContactsMessage.m | 28 +++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 188a6da8b..9bfcc8645 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2011-11-09 Wolfgang Sourdeau + * OpenChange/MAPIStoreContactsMessage.m (-save): set the NOTE + field to the value of PR_BODY_UNICODE or, a textual version of + PR_HTML. + * OpenChange/MAPIStoreMessage.m (-addProperties): intercept PR_RTF_COMPRESSED attributes and convert them automatically to a PR_HTML attribute. diff --git a/OpenChange/MAPIStoreContactsMessage.m b/OpenChange/MAPIStoreContactsMessage.m index 764e1ea90..8b5bd75b8 100644 --- a/OpenChange/MAPIStoreContactsMessage.m +++ b/OpenChange/MAPIStoreContactsMessage.m @@ -27,10 +27,12 @@ #import #import #import -#import #import #import +#import +#import #import +#import #import "MAPIStoreContactsAttachment.h" #import "MAPIStoreContactsFolder.h" @@ -337,10 +339,16 @@ { int rc = MAPISTORE_SUCCESS; NSString *stringValue; + NSArray *values; stringValue = [[sogoObject vCard] note]; if ([stringValue length] > 0) - *data = [stringValue asUnicodeInMemCtx: memCtx]; + { + /* FIXME: this is a temporary hack: we unescape things although NGVCards + should already have done it at this stage... */ + values = [stringValue asCardAttributeValues]; + *data = [[values objectAtIndex: 0] asUnicodeInMemCtx: memCtx]; + } else rc = MAPISTORE_ERR_NOT_FOUND; @@ -1117,6 +1125,22 @@ fromProperties: [attachment properties]]; } + /* Note */ + value = [properties objectForKey: MAPIPropertyKey (PR_BODY_UNICODE)]; + if (!value) + { + value = [properties objectForKey: MAPIPropertyKey (PR_HTML)]; + if (value) + { + value = [[NSString alloc] initWithData: value + encoding: NSUTF8StringEncoding]; + [value autorelease]; + value = [value htmlToText]; + } + } + if (value) + [newCard setNote: value]; + // // we save the new/modified card // From 5be374313fc8c25ef419570722d39872eb138fee Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 9 Nov 2011 20:47:08 +0000 Subject: [PATCH 23/38] Monotone-Parent: 2448001ef69730541ee1c822cf80c131176b1ed0 Monotone-Revision: e5a4a8243c282c12538ab38c9b5c23722be35e99 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-09T20:47:08 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 7 +++++ OpenChange/MAPIStoreAppointmentWrapper.h | 4 +-- OpenChange/MAPIStoreAppointmentWrapper.m | 36 +++++++++++++++--------- OpenChange/MAPIStoreCalendarMessage.m | 23 +++++++++++++++ 4 files changed, 54 insertions(+), 16 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9bfcc8645..756534b7e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2011-11-09 Wolfgang Sourdeau + * OpenChange/MAPIStoreCalendarMessage.m (-save): set the DESCRIPTION + field to the value of PR_BODY_UNICODE or, a textual version of + PR_HTML. COMMENT would be nice later. + + * OpenChange/MAPIStoreAppointmentWrapper.m (-getPrBody:inMemCtx:): + make use of -[NSString asCardAttributeValues]. + * OpenChange/MAPIStoreContactsMessage.m (-save): set the NOTE field to the value of PR_BODY_UNICODE or, a textual version of PR_HTML. diff --git a/OpenChange/MAPIStoreAppointmentWrapper.h b/OpenChange/MAPIStoreAppointmentWrapper.h index 7f14c5401..4fcf2b4d8 100644 --- a/OpenChange/MAPIStoreAppointmentWrapper.h +++ b/OpenChange/MAPIStoreAppointmentWrapper.h @@ -92,8 +92,6 @@ extern NSTimeZone *utcTZ; inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPrMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPrBody: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPrStartDate: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidAppointmentStateFlags: (void **) data @@ -129,6 +127,8 @@ extern NSTimeZone *utcTZ; inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPrImportance: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; +- (int) getPrBody: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidIsRecurring: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidRecurring: (void **) data diff --git a/OpenChange/MAPIStoreAppointmentWrapper.m b/OpenChange/MAPIStoreAppointmentWrapper.m index 1f87abad0..216ba3795 100644 --- a/OpenChange/MAPIStoreAppointmentWrapper.m +++ b/OpenChange/MAPIStoreAppointmentWrapper.m @@ -629,20 +629,6 @@ static NSCharacterSet *hexCharacterSet = nil; return [self getYes: data inMemCtx: memCtx]; } -- (int) getPrBody: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx -{ - NSString *stringValue; - - stringValue = [event comment]; - if (!stringValue) - stringValue = @""; - - *data = [stringValue asUnicodeInMemCtx: memCtx]; - - return MAPISTORE_SUCCESS; -} - - (int) getPrStartDate: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { @@ -1035,6 +1021,28 @@ static NSCharacterSet *hexCharacterSet = nil; return MAPISTORE_SUCCESS; } +- (int) getPrBody: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + int rc = MAPISTORE_SUCCESS; + NSString *stringValue; + NSArray *values; + + /* FIXME: there is a confusion in NGCards around "comment" and "description" */ + stringValue = [event comment]; + if ([stringValue length] > 0) + { + /* FIXME: this is a temporary hack: we unescape things although NGVCards + should already have done it at this stage... */ + values = [stringValue asCardAttributeValues]; + *data = [[values objectAtIndex: 0] asUnicodeInMemCtx: memCtx]; + } + else + rc = MAPISTORE_ERR_NOT_FOUND; + + return rc; +} + - (int) getPidLidIsRecurring: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { diff --git a/OpenChange/MAPIStoreCalendarMessage.m b/OpenChange/MAPIStoreCalendarMessage.m index 1113b02b1..5de94e2d6 100644 --- a/OpenChange/MAPIStoreCalendarMessage.m +++ b/OpenChange/MAPIStoreCalendarMessage.m @@ -46,6 +46,7 @@ #import #import #import +#import #import "MAPIStoreAppointmentWrapper.h" #import "MAPIStoreCalendarAttachment.h" @@ -241,6 +242,12 @@ return [[self appointmentWrapper] getPrImportance: data inMemCtx: memCtx]; } +- (int) getPrBody: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [[self appointmentWrapper] getPrBody: data inMemCtx: memCtx]; +} + - (int) getPidLidIsRecurring: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { @@ -797,6 +804,22 @@ [newEvent setTransparency: @"OPAQUE"]; } } + + /* Comment */ + value = [properties objectForKey: MAPIPropertyKey (PR_BODY_UNICODE)]; + if (!value) + { + value = [properties objectForKey: MAPIPropertyKey (PR_HTML)]; + if (value) + { + value = [[NSString alloc] initWithData: value + encoding: NSUTF8StringEncoding]; + [value autorelease]; + value = [value htmlToText]; + } + } + if (value) + [newEvent setComment: value]; /* recurrence */ value = [properties From af48e18f3a8aa0ed69a537119e271864a4b17995 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 9 Nov 2011 20:48:20 +0000 Subject: [PATCH 24/38] Monotone-Parent: e5a4a8243c282c12538ab38c9b5c23722be35e99 Monotone-Revision: d9bec826cdc8df69ea27563722cd678c85ebcf20 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-09T20:48:20 Monotone-Branch: ca.inverse.sogo --- SOPE/NGCards/ChangeLog | 6 ++++++ SOPE/NGCards/NSString+NGCards.m | 4 ++-- SOPE/NGCards/iCalEntityObject.m | 1 + 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/SOPE/NGCards/ChangeLog b/SOPE/NGCards/ChangeLog index e176b447f..67f5bfa01 100644 --- a/SOPE/NGCards/ChangeLog +++ b/SOPE/NGCards/ChangeLog @@ -1,3 +1,9 @@ +2011-11-09 Wolfgang Sourdeau + + * NSString+NGCards.m (-escapedForCards): restored the escaping of + commas, since they might be used in fields such as + COMMENT/DESCRIPTION (iCalendar) or NOTE (vCards) + 2011-09-20 Wolfgang Sourdeau * iCalToDo.m (-setCompleted:): (hack) when invoked with a nil diff --git a/SOPE/NGCards/NSString+NGCards.m b/SOPE/NGCards/NSString+NGCards.m index 0387b9b6e..7614e100a 100644 --- a/SOPE/NGCards/NSString+NGCards.m +++ b/SOPE/NGCards/NSString+NGCards.m @@ -156,8 +156,8 @@ string = [self stringByReplacingString: @"\\" withString: @"\\\\"]; - // string = [string stringByReplacingString: @"," - // withString: @"\\,"]; + string = [string stringByReplacingString: @"," + withString: @"\\,"]; // string = [string stringByReplacingString: @":" // withString: @"\\:"]; string = [string stringByReplacingString: @";" diff --git a/SOPE/NGCards/iCalEntityObject.m b/SOPE/NGCards/iCalEntityObject.m index bbe7fa262..9aba6a262 100644 --- a/SOPE/NGCards/iCalEntityObject.m +++ b/SOPE/NGCards/iCalEntityObject.m @@ -102,6 +102,7 @@ return [[self uniqueChildWithTag: @"location"] value: 0]; } +#warning the "comment" accessors are actually "description" accessors, the "comment" ones are missing - (void) setComment: (NSString *) _value { [[self uniqueChildWithTag: @"description"] setValue: 0 to: _value]; From 8d807b7fcbcbb19dd56e9afa629eb9f52c69e7f1 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Wed, 9 Nov 2011 20:53:20 +0000 Subject: [PATCH 25/38] Monotone-Parent: d9bec826cdc8df69ea27563722cd678c85ebcf20 Monotone-Revision: 37feda6e02a5f2d56457e09508814b8b3d6ed388 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-09T20:53:20 Monotone-Branch: ca.inverse.sogo --- OpenChange/unrtf-0.21.2.diff | 85 +++++++++++++++++++----------------- 1 file changed, 44 insertions(+), 41 deletions(-) diff --git a/OpenChange/unrtf-0.21.2.diff b/OpenChange/unrtf-0.21.2.diff index 1920d0467..1c054cac1 100644 --- a/OpenChange/unrtf-0.21.2.diff +++ b/OpenChange/unrtf-0.21.2.diff @@ -1,6 +1,6 @@ diff -durpN unrtf-0.21.2.old/outputs/html.conf unrtf-0.21.2/outputs/html.conf --- unrtf-0.21.2.old/outputs/html.conf 2010-08-15 08:44:09.000000000 -0400 -+++ unrtf-0.21.2/outputs/html.conf 2011-11-09 13:55:25.289763561 -0500 ++++ unrtf-0.21.2/outputs/html.conf 2011-11-09 15:48:29.982798286 -0500 @@ -5,7 +5,7 @@ comment_end --> @@ -12,7 +12,7 @@ diff -durpN unrtf-0.21.2.old/outputs/html.conf unrtf-0.21.2/outputs/html.conf diff -durpN unrtf-0.21.2.old/src/attr.c unrtf-0.21.2/src/attr.c --- unrtf-0.21.2.old/src/attr.c 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/attr.c 2011-11-09 09:55:11.557465363 -0500 ++++ unrtf-0.21.2/src/attr.c 2011-11-09 15:48:29.990798214 -0500 @@ -1,23 +1,23 @@ /*============================================================================= - GNU UnRTF, a command-line program to convert RTF documents to other formats. @@ -1262,7 +1262,7 @@ diff -durpN unrtf-0.21.2.old/src/attr.c unrtf-0.21.2/src/attr.c diff -durpN unrtf-0.21.2.old/src/attr.h unrtf-0.21.2/src/attr.h --- unrtf-0.21.2.old/src/attr.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/attr.h 2011-11-09 09:55:11.561465361 -0500 ++++ unrtf-0.21.2/src/attr.h 2011-11-09 15:48:29.990798214 -0500 @@ -1,23 +1,23 @@ /*============================================================================= - GNU UnRTF, a command-line program to convert RTF documents to other formats. @@ -1412,7 +1412,7 @@ diff -durpN unrtf-0.21.2.old/src/attr.h unrtf-0.21.2/src/attr.h +#endif /* ATTR_H */ diff -durpN unrtf-0.21.2.old/src/convert.c unrtf-0.21.2/src/convert.c --- unrtf-0.21.2.old/src/convert.c 2011-06-07 08:00:23.000000000 -0400 -+++ unrtf-0.21.2/src/convert.c 2011-11-09 09:55:11.561465361 -0500 ++++ unrtf-0.21.2/src/convert.c 2011-11-09 15:52:04.710787385 -0500 @@ -1,24 +1,24 @@ /*=========================================================================== @@ -4576,7 +4576,7 @@ diff -durpN unrtf-0.21.2.old/src/convert.c unrtf-0.21.2/src/convert.c + } + if (w->hash_index) + { -+ str=hash_get_string (w->hash_index); ++ str=hash_get_string (oc->conversion, w->hash_index); + fprintf(stderr,"string is %s\n", str); + } #endif @@ -6856,7 +6856,7 @@ diff -durpN unrtf-0.21.2.old/src/convert.c unrtf-0.21.2/src/convert.c } -@@ -3652,37 +3664,226 @@ word_print_core (Word *w) +@@ -3652,37 +3664,225 @@ word_print_core (Word *w) *=======================================================================*/ void @@ -6942,7 +6942,6 @@ diff -durpN unrtf-0.21.2.old/src/convert.c unrtf-0.21.2/src/convert.c +{ + size_t fullname_len; + char *fullname; -+ int rc; + + if (!options->output_format || !options->config_directory) + return 0; @@ -7107,7 +7106,7 @@ diff -durpN unrtf-0.21.2.old/src/convert.c unrtf-0.21.2/src/convert.c } diff -durpN unrtf-0.21.2.old/src/convert.h unrtf-0.21.2/src/convert.h --- unrtf-0.21.2.old/src/convert.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/convert.h 2011-11-09 09:55:11.565465360 -0500 ++++ unrtf-0.21.2/src/convert.h 2011-11-09 15:48:29.998798267 -0500 @@ -36,18 +36,135 @@ #ifndef _CONVERT @@ -7251,7 +7250,7 @@ diff -durpN unrtf-0.21.2.old/src/convert.h unrtf-0.21.2/src/convert.h diff -durpN unrtf-0.21.2.old/src/defs.h unrtf-0.21.2/src/defs.h --- unrtf-0.21.2.old/src/defs.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/defs.h 2011-11-09 09:55:11.565465360 -0500 ++++ unrtf-0.21.2/src/defs.h 2011-11-09 15:48:29.998798267 -0500 @@ -64,9 +64,6 @@ #define SKIP_ONE_WORD 2 #endif @@ -7271,7 +7270,7 @@ diff -durpN unrtf-0.21.2.old/src/defs.h unrtf-0.21.2/src/defs.h +#define DEFAULT_OUTPUT "html" diff -durpN unrtf-0.21.2.old/src/error.c unrtf-0.21.2/src/error.c --- unrtf-0.21.2.old/src/error.c 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/error.c 2011-11-09 09:55:11.565465360 -0500 ++++ unrtf-0.21.2/src/error.c 2011-11-09 15:48:29.998798267 -0500 @@ -51,27 +51,11 @@ #include #endif @@ -7316,7 +7315,7 @@ diff -durpN unrtf-0.21.2.old/src/error.c unrtf-0.21.2/src/error.c #endif diff -durpN unrtf-0.21.2.old/src/error.h unrtf-0.21.2/src/error.h --- unrtf-0.21.2.old/src/error.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/error.h 2011-11-09 09:55:11.569465360 -0500 ++++ unrtf-0.21.2/src/error.h 2011-11-09 15:48:29.998798267 -0500 @@ -37,9 +37,10 @@ #define CHECK_MALLOC_SUCCESS(XX) { if ((XX)==NULL) { fprintf (stderr, "internal error: cannot allocate memory in %s at %d\n", __FILE__, __LINE__); exit (1); }} @@ -7331,7 +7330,7 @@ diff -durpN unrtf-0.21.2.old/src/error.h unrtf-0.21.2/src/error.h diff -durpN unrtf-0.21.2.old/src/hash.c unrtf-0.21.2/src/hash.c --- unrtf-0.21.2.old/src/hash.c 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/hash.c 2011-11-09 09:55:11.569465360 -0500 ++++ unrtf-0.21.2/src/hash.c 2011-11-09 15:48:29.998798267 -0500 @@ -53,24 +53,16 @@ #include #endif @@ -7536,14 +7535,16 @@ diff -durpN unrtf-0.21.2.old/src/hash.c unrtf-0.21.2/src/hash.c +} diff -durpN unrtf-0.21.2.old/src/hash.h unrtf-0.21.2/src/hash.h --- unrtf-0.21.2.old/src/hash.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/hash.h 2011-11-09 09:55:11.569465360 -0500 -@@ -32,11 +32,11 @@ ++++ unrtf-0.21.2/src/hash.h 2011-11-09 15:51:52.846788680 -0500 +@@ -32,11 +32,15 @@ * 16 Dec 07, daved@physiol.usyd.edu.au: updated to GPL v3 *--------------------------------------------------------------------*/ ++#ifndef HASH_H ++#define HASH_H 1 + +struct ConversionContext; -- -extern void hash_init (void); -extern unsigned long hash_stats (void); -extern unsigned long hash_get_index (char *); @@ -7555,9 +7556,10 @@ diff -durpN unrtf-0.21.2.old/src/hash.h unrtf-0.21.2/src/hash.h +extern char* hash_get_string (const struct ConversionContext *, unsigned long); +extern void hash_free (struct ConversionContext *); ++#endif /* HASH_H */ diff -durpN unrtf-0.21.2.old/src/main.c unrtf-0.21.2/src/main.c --- unrtf-0.21.2.old/src/main.c 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/main.c 2011-11-09 09:55:11.569465360 -0500 ++++ unrtf-0.21.2/src/main.c 2011-11-09 15:48:29.998798267 -0500 @@ -1,23 +1,23 @@ /*============================================================================= - GNU UnRTF, a command-line program to convert RTF documents to other formats. @@ -7979,7 +7981,7 @@ diff -durpN unrtf-0.21.2.old/src/main.c unrtf-0.21.2/src/main.c - diff -durpN unrtf-0.21.2.old/src/main.h unrtf-0.21.2/src/main.h --- unrtf-0.21.2.old/src/main.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/main.h 2011-11-09 09:55:11.573465361 -0500 ++++ unrtf-0.21.2/src/main.h 2011-11-09 15:48:29.998798267 -0500 @@ -35,21 +35,8 @@ * 17 Jan 10, daved@physiol.usyd.edu.au: change CONFIG_DIR to drop outputs/ *--------------------------------------------------------------------*/ @@ -8005,7 +8007,7 @@ diff -durpN unrtf-0.21.2.old/src/main.h unrtf-0.21.2/src/main.h +#define USAGE "unrtf [--version] [--verbose] [--help] [--nopict|-n] [--noremap] [--html] [--text] [--vt] [--latex] [--rtf] [-P config_search_path] [-t )] " diff -durpN unrtf-0.21.2.old/src/Makefile.am unrtf-0.21.2/src/Makefile.am --- unrtf-0.21.2.old/src/Makefile.am 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/Makefile.am 2011-11-09 09:55:11.573465361 -0500 ++++ unrtf-0.21.2/src/Makefile.am 2011-11-09 15:48:29.998798267 -0500 @@ -13,7 +13,6 @@ unrtf_SOURCES = attr.c attr.h \ malloc.c malloc.h \ output.c output.h \ @@ -8016,7 +8018,7 @@ diff -durpN unrtf-0.21.2.old/src/Makefile.am unrtf-0.21.2/src/Makefile.am util.c util.h \ diff -durpN unrtf-0.21.2.old/src/malloc.c unrtf-0.21.2/src/malloc.c --- unrtf-0.21.2.old/src/malloc.c 2010-07-09 01:13:05.000000000 -0400 -+++ unrtf-0.21.2/src/malloc.c 2011-11-09 09:55:11.573465361 -0500 ++++ unrtf-0.21.2/src/malloc.c 2011-11-09 15:48:29.998798267 -0500 @@ -135,19 +135,19 @@ total_malloced (void) { *=======================================================================*/ @@ -8056,7 +8058,7 @@ diff -durpN unrtf-0.21.2.old/src/malloc.c unrtf-0.21.2/src/malloc.c } diff -durpN unrtf-0.21.2.old/src/malloc.h unrtf-0.21.2/src/malloc.h --- unrtf-0.21.2.old/src/malloc.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/malloc.h 2011-11-09 09:55:11.573465361 -0500 ++++ unrtf-0.21.2/src/malloc.h 2011-11-09 15:48:29.998798267 -0500 @@ -32,9 +32,10 @@ * 09 Nov 08, arkadiusz.firus@gmail.com: added my_realloc *--------------------------------------------------------------------*/ @@ -8072,7 +8074,7 @@ diff -durpN unrtf-0.21.2.old/src/malloc.h unrtf-0.21.2/src/malloc.h +extern char * my_strdup (struct ConversionContext *, char*); diff -durpN unrtf-0.21.2.old/src/my_iconv.c unrtf-0.21.2/src/my_iconv.c --- unrtf-0.21.2.old/src/my_iconv.c 2010-08-16 00:12:43.000000000 -0400 -+++ unrtf-0.21.2/src/my_iconv.c 2011-11-09 09:55:11.573465361 -0500 ++++ unrtf-0.21.2/src/my_iconv.c 2011-11-09 15:48:29.998798267 -0500 @@ -12,154 +12,133 @@ #include #include @@ -8314,7 +8316,7 @@ diff -durpN unrtf-0.21.2.old/src/my_iconv.c unrtf-0.21.2/src/my_iconv.c diff -durpN unrtf-0.21.2.old/src/my_iconv.h unrtf-0.21.2/src/my_iconv.h --- unrtf-0.21.2.old/src/my_iconv.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/my_iconv.h 2011-11-09 09:55:11.573465361 -0500 ++++ unrtf-0.21.2/src/my_iconv.h 2011-11-09 15:48:29.998798267 -0500 @@ -5,6 +5,9 @@ * Purpose: my_conv definitions *--------------------------------------------------------------------*/ @@ -8344,7 +8346,7 @@ diff -durpN unrtf-0.21.2.old/src/my_iconv.h unrtf-0.21.2/src/my_iconv.h +#endif /* _MY_ICONV */ diff -durpN unrtf-0.21.2.old/src/output.c unrtf-0.21.2/src/output.c --- unrtf-0.21.2.old/src/output.c 2011-06-07 08:04:38.000000000 -0400 -+++ unrtf-0.21.2/src/output.c 2011-11-09 09:55:11.577465362 -0500 ++++ unrtf-0.21.2/src/output.c 2011-11-09 15:50:35.126792073 -0500 @@ -1,23 +1,23 @@ /*============================================================================= - GNU UnRTF, a command-line program to convert RTF documents to other formats. @@ -8393,16 +8395,17 @@ diff -durpN unrtf-0.21.2.old/src/output.c unrtf-0.21.2/src/output.c *--------------------------------------------------------------------*/ -@@ -64,7 +64,7 @@ +@@ -64,7 +64,8 @@ #include "output.h" #include "main.h" #include "convert.h" - +#include "unrtf.h" ++#include "user.h" #ifndef HAVE_ATTR_H #include "attr.h" -@@ -79,16 +79,16 @@ +@@ -79,16 +80,16 @@ *=======================================================================*/ OutputPersonality* @@ -8426,7 +8429,7 @@ diff -durpN unrtf-0.21.2.old/src/output.c unrtf-0.21.2/src/output.c } /*======================================================================== -@@ -102,13 +102,15 @@ op_create () +@@ -102,13 +103,15 @@ op_create () void op_free (OutputPersonality *op) { @@ -8446,7 +8449,7 @@ diff -durpN unrtf-0.21.2.old/src/output.c unrtf-0.21.2/src/output.c /*======================================================================== * Name: op_translate_char -@@ -119,102 +121,110 @@ op_free (OutputPersonality *op) +@@ -119,102 +122,110 @@ op_free (OutputPersonality *op) *=======================================================================*/ char * @@ -8636,7 +8639,7 @@ diff -durpN unrtf-0.21.2.old/src/output.c unrtf-0.21.2/src/output.c } #if 0 /* daved - 0.21.2 */ -@@ -227,123 +237,122 @@ op_translate_char (OutputPersonality *op +@@ -227,123 +238,122 @@ op_translate_char (OutputPersonality *op *=======================================================================*/ char * @@ -8848,7 +8851,7 @@ diff -durpN unrtf-0.21.2.old/src/output.c unrtf-0.21.2/src/output.c } #endif -@@ -357,113 +366,115 @@ op_translate_str (OutputPersonality *op, +@@ -357,113 +367,115 @@ op_translate_str (OutputPersonality *op, *=======================================================================*/ char * @@ -9047,7 +9050,7 @@ diff -durpN unrtf-0.21.2.old/src/output.c unrtf-0.21.2/src/output.c } #endif /*======================================================================== -@@ -475,123 +486,113 @@ op_translate_doublet (OutputPersonality +@@ -475,123 +487,113 @@ op_translate_doublet (OutputPersonality *=======================================================================*/ void @@ -9274,7 +9277,7 @@ diff -durpN unrtf-0.21.2.old/src/output.c unrtf-0.21.2/src/output.c } -@@ -604,123 +605,113 @@ op_begin_std_fontsize (OutputPersonality +@@ -604,123 +606,113 @@ op_begin_std_fontsize (OutputPersonality *=======================================================================*/ void @@ -9501,7 +9504,7 @@ diff -durpN unrtf-0.21.2.old/src/output.c unrtf-0.21.2/src/output.c } #if 1 /* AK3 - AF */ -@@ -734,7 +725,7 @@ op_end_std_fontsize (OutputPersonality * +@@ -734,7 +726,7 @@ op_end_std_fontsize (OutputPersonality * void add_alias(OutputPersonality *op, int nr, char *text) { @@ -9510,7 +9513,7 @@ diff -durpN unrtf-0.21.2.old/src/output.c unrtf-0.21.2/src/output.c } /*======================================================================== -@@ -745,9 +736,8 @@ add_alias(OutputPersonality *op, int nr, +@@ -745,9 +737,8 @@ add_alias(OutputPersonality *op, int nr, *=======================================================================*/ char * @@ -9524,7 +9527,7 @@ diff -durpN unrtf-0.21.2.old/src/output.c unrtf-0.21.2/src/output.c - diff -durpN unrtf-0.21.2.old/src/output.h unrtf-0.21.2/src/output.h --- unrtf-0.21.2.old/src/output.h 2010-08-11 21:09:02.000000000 -0400 -+++ unrtf-0.21.2/src/output.h 2011-11-09 09:55:11.577465362 -0500 ++++ unrtf-0.21.2/src/output.h 2011-11-09 15:48:30.002798270 -0500 @@ -44,227 +44,228 @@ typedef Collection Aliases; @@ -9912,7 +9915,7 @@ diff -durpN unrtf-0.21.2.old/src/output.h unrtf-0.21.2/src/output.h - diff -durpN unrtf-0.21.2.old/src/parse.c unrtf-0.21.2/src/parse.c --- unrtf-0.21.2.old/src/parse.c 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/parse.c 2011-11-09 09:55:11.577465362 -0500 ++++ unrtf-0.21.2/src/parse.c 2011-11-09 15:48:30.002798270 -0500 @@ -1,23 +1,23 @@ /*============================================================================= - GNU UnRTF, a command-line program to convert RTF documents to other formats. @@ -10583,7 +10586,7 @@ diff -durpN unrtf-0.21.2.old/src/parse.c unrtf-0.21.2/src/parse.c } diff -durpN unrtf-0.21.2.old/src/parse.h unrtf-0.21.2/src/parse.h --- unrtf-0.21.2.old/src/parse.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/parse.h 2011-11-09 09:55:11.581465362 -0500 ++++ unrtf-0.21.2/src/parse.h 2011-11-09 15:48:30.002798270 -0500 @@ -38,8 +38,6 @@ #include "word.h" #endif @@ -10676,7 +10679,7 @@ diff -durpN unrtf-0.21.2.old/src/path.h unrtf-0.21.2/src/path.h -void show_dirs(); diff -durpN unrtf-0.21.2.old/src/unrtf.h unrtf-0.21.2/src/unrtf.h --- unrtf-0.21.2.old/src/unrtf.h 1969-12-31 19:00:00.000000000 -0500 -+++ unrtf-0.21.2/src/unrtf.h 2011-11-09 09:55:11.581465362 -0500 ++++ unrtf-0.21.2/src/unrtf.h 2011-11-09 15:48:30.002798270 -0500 @@ -0,0 +1,55 @@ +/*=========================================================================== + GNU UnRTF, a command-line program to convert RTF documents to other formats. @@ -10735,7 +10738,7 @@ diff -durpN unrtf-0.21.2.old/src/unrtf.h unrtf-0.21.2/src/unrtf.h +#endif /* UNRTF_H */ diff -durpN unrtf-0.21.2.old/src/user.c unrtf-0.21.2/src/user.c --- unrtf-0.21.2.old/src/user.c 2011-06-07 08:08:17.000000000 -0400 -+++ unrtf-0.21.2/src/user.c 2011-11-09 09:55:11.581465362 -0500 ++++ unrtf-0.21.2/src/user.c 2011-11-09 15:48:30.002798270 -0500 @@ -7,7 +7,7 @@ *---------------------------------------------------------------------- * Changes: @@ -11165,7 +11168,7 @@ diff -durpN unrtf-0.21.2.old/src/user.c unrtf-0.21.2/src/user.c diff -durpN unrtf-0.21.2.old/src/user.h unrtf-0.21.2/src/user.h --- unrtf-0.21.2.old/src/user.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/user.h 2011-11-09 09:55:11.585465361 -0500 ++++ unrtf-0.21.2/src/user.h 2011-11-09 15:48:30.002798270 -0500 @@ -151,9 +151,10 @@ #ifndef _USER @@ -11181,7 +11184,7 @@ diff -durpN unrtf-0.21.2.old/src/user.h unrtf-0.21.2/src/user.h #endif diff -durpN unrtf-0.21.2.old/src/word.c unrtf-0.21.2/src/word.c --- unrtf-0.21.2.old/src/word.c 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/word.c 2011-11-09 09:55:11.585465361 -0500 ++++ unrtf-0.21.2/src/word.c 2011-11-09 15:48:30.002798270 -0500 @@ -1,23 +1,23 @@ /*============================================================================= - GNU UnRTF, a command-line program to convert RTF documents to other formats. @@ -11504,7 +11507,7 @@ diff -durpN unrtf-0.21.2.old/src/word.c unrtf-0.21.2/src/word.c diff -durpN unrtf-0.21.2.old/src/word.h unrtf-0.21.2/src/word.h --- unrtf-0.21.2.old/src/word.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/word.h 2011-11-09 09:55:11.585465361 -0500 ++++ unrtf-0.21.2/src/word.h 2011-11-09 15:48:30.002798270 -0500 @@ -41,14 +41,15 @@ typedef struct _w { struct _w * child; } Word; From 121154b0155a7995eee5d71f5b0e27b2cf51cece Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Thu, 10 Nov 2011 15:31:26 +0000 Subject: [PATCH 26/38] Monotone-Parent: 37feda6e02a5f2d56457e09508814b8b3d6ed388 Monotone-Revision: b0f4711fa3917d9ca82a918807fe75046c131ee1 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-10T15:31:26 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 5 + Tests/Unit/GNUmakefile | 5 +- Tests/Unit/SaxXMLReaderFactory+SOGoTests.m | 7 +- Tests/Unit/TestVersit.m | 138 +++++++++++++++++++++ 4 files changed, 149 insertions(+), 6 deletions(-) create mode 100644 Tests/Unit/TestVersit.m diff --git a/ChangeLog b/ChangeLog index 756534b7e..7fdcb0e1c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2011-11-10 Wolfgang Sourdeau + + * Tests/Unit/TestVersit.m: new test module for versit parsing and + outputting. + 2011-11-09 Wolfgang Sourdeau * OpenChange/MAPIStoreCalendarMessage.m (-save): set the DESCRIPTION diff --git a/Tests/Unit/GNUmakefile b/Tests/Unit/GNUmakefile index 760d13402..5b22f55b0 100644 --- a/Tests/Unit/GNUmakefile +++ b/Tests/Unit/GNUmakefile @@ -15,6 +15,7 @@ $(TEST_TOOL)_OBJC_FILES += \ SOGoTestRunner.m \ SaxXMLReaderFactory+SOGoTests.m \ \ + TestVersit.m \ TestiCalTimeZonePeriod.m \ TestiCalRecurrenceCalculator.m \ \ @@ -26,8 +27,8 @@ $(TEST_TOOL)_OBJC_FILES += \ TEST_TOOL_NAME = $(TEST_TOOL) -ADDITIONAL_INCLUDE_DIRS += \ - -D_GNU_SOURCE -I../SOPE/ -I../SoObjects/ -I../UI/ +TEST_TOOL_CPPFLAGS += \ + -Wall -D_GNU_SOURCE -I../SOPE/ -I../SoObjects/ -I../UI/ ADDITIONAL_LIB_DIRS += \ -L../SoObjects/SOGo -lSOGo -lNGMime -lNGCards -lGDLContentStore -lNGExtensions -lSBJson -lobjc -L/usr/local/lib -lSaxObjC diff --git a/Tests/Unit/SaxXMLReaderFactory+SOGoTests.m b/Tests/Unit/SaxXMLReaderFactory+SOGoTests.m index a2fa8f08e..885b6d912 100644 --- a/Tests/Unit/SaxXMLReaderFactory+SOGoTests.m +++ b/Tests/Unit/SaxXMLReaderFactory+SOGoTests.m @@ -38,14 +38,13 @@ - (NSArray *) saxReaderSearchPathes { NSArray *pathes, *args; - NSString *cwd, *exedir; + NSString *exedir; args = [[NSProcessInfo processInfo] arguments]; - cwd = [[NSFileManager defaultManager] currentDirectoryPath]; exedir = [[args objectAtIndex: 0] stringByDeletingLastPathComponent]; pathes = [NSArray arrayWithObject: - [NSString stringWithFormat: @"%@/%@/%@", - cwd, exedir, + [NSString stringWithFormat: @"%@/%@", + exedir, @"../../../SOPE/NGCards/versitCardsSaxDriver/"]]; return pathes; diff --git a/Tests/Unit/TestVersit.m b/Tests/Unit/TestVersit.m new file mode 100644 index 000000000..4c544cc69 --- /dev/null +++ b/Tests/Unit/TestVersit.m @@ -0,0 +1,138 @@ +/* TestVersit.m - this file is part of $PROJECT_NAME_HERE$ + * + * Copyright (C) 2011 Inverse inc + * + * Author: Wolfgang Sourdeau + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#import +#import +#import +#import + +#import "SOGoTest.h" + +@interface TestVersit : SOGoTest +@end + +@implementation TestVersit + +- (void) test_rendering +{ + CardElement *element; + CardVersitRenderer *renderer; + NSString *result; + + renderer = [CardVersitRenderer new]; + [renderer autorelease]; + + /* 1. simple value */ + element = [CardElement elementWithTag: @"elem"]; + [element setValue: 0 to: @"value"]; + result = [renderer render: element]; + testEquals(result, @"ELEM:value\r\n"); + + /* 2. two values */ + element = [CardElement elementWithTag: @"elem"]; + [element setValue: 0 to: @"value1"]; + [element setValue: 1 to: @"value2"]; + result = [renderer render: element]; + testEquals(result, @"ELEM:value1;value2\r\n"); + + /* 3. one value with commma */ + element = [CardElement elementWithTag: @"elem"]; + [element setValue: 0 to: @"value1, with a comma"]; + result = [renderer render: element]; + testEquals(result, @"ELEM:value1\\, with a comma\r\n"); + + /* 4. one value with a semicolon */ + element = [CardElement elementWithTag: @"elem"]; + [element setValue: 0 to: @"value1; with a semi-colon"]; + result = [renderer render: element]; + testEquals(result, @"ELEM:value1\\; with a semi-colon\r\n"); + + /* 4. 3 named values: + 1. with multiple subvalues + 2. with commas + 3. with semicolon */ + element = [CardElement elementWithTag: @"elem"]; + [element setNamedValue: @"named1" + to: [NSArray arrayWithObjects: @"1", @"2", @"3", nil]]; + [element setNamedValue: @"named2" + to: @"1,2,3"]; + [element setNamedValue: @"named3" + to: @"text1;text2"]; + result = [renderer render: element]; + testEquals(result, @"ELEM:NAMED1=1,2,3;NAMED2=1\\,2\\,3;NAMED3:text1\\;text2\r\n"); +} + +- (void) test_parsing +{ + CardGroup *group; + CardElement *element; + NSString *versit; + + versit = @"BEGIN:group1\r\nELEMENT:value\r\nEND:group1\r\n"; + group = [CardGroup parseSingleFromSource: versit]; + element = [group firstChildWithTag: @"element"]; + testEquals([element value: 0], @"value"); + + versit = @"BEGIN:group1\r\nELEMENT:value1;value2\r\nEND:group1\r\n"; + group = [CardGroup parseSingleFromSource: versit]; + element = [group firstChildWithTag: @"element"]; + testEquals([element value: 0], @"value1"); + testEquals([element value: 1], @"value2"); + + versit = @"BEGIN:group1\r\nELEMENT:value\\, with comma\r\nEND:group1\r\n"; + group = [CardGroup parseSingleFromSource: versit]; + element = [group firstChildWithTag: @"element"]; + testEquals([element value: 0], @"value, with comma"); + + versit = @"BEGIN:group1\r\nELEMENT:value,with comma\r\nEND:group1\r\n"; + group = [CardGroup parseSingleFromSource: versit]; + element = [group firstChildWithTag: @"element"]; + testEquals([element value: 0], ([NSArray arrayWithObjects: @"value", @"with comma", nil])); + + versit = @"BEGIN:group1\r\nELEMENT:NAMED1=subvalue;NAMED2=subvalue1,subvalue2\r\nEND:group1\r\n"; + group = [CardGroup parseSingleFromSource: versit]; + element = [group firstChildWithTag: @"element"]; + testEquals([element namedValue: @"named1"], @"subvalue"); + testEquals([element namedValue: @"named2"], + ([NSArray arrayWithObjects: @"subvalue1", @"subvalue2", nil])); + + versit = @"BEGIN:group1\r\nELEMENT;PARAM1=test:value\r\nEND:group1\r\n"; + group = [CardGroup parseSingleFromSource: versit]; + element = [group firstChildWithTag: @"element"]; + testEquals([element value: 0], @"value"); + testEquals([element value: 0 ofAttribute: @"param1"], @"test"); + + versit = @"BEGIN:group1\r\nELEMENT;PARAM1=paramvalue1,paramvalue2:value\r\nEND:group1\r\n"; + group = [CardGroup parseSingleFromSource: versit]; + element = [group firstChildWithTag: @"element"]; + testEquals([element value: 0], @"value"); + testEquals([element value: 0 ofAttribute: @"param1"], @"paramvalue1"); + testEquals([element value: 1 ofAttribute: @"param1"], @"paramvalue2"); + + versit = @"BEGIN:group1\r\nELEMENT;PARAM1=\"paramvalue1, with comma\":value\r\nEND:group1\r\n"; + group = [CardGroup parseSingleFromSource: versit]; + element = [group firstChildWithTag: @"element"]; + testEquals([element value: 0], @"value"); + testEquals([element value: 0 ofAttribute: @"param1"], @"value1, with comma"); +} + +@end From 97dcdcb97a861ccf60eaf9218d9ac0ddfb44df2e Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Thu, 10 Nov 2011 15:33:14 +0000 Subject: [PATCH 27/38] Monotone-Parent: b0f4711fa3917d9ca82a918807fe75046c131ee1 Monotone-Revision: 2b628a62ac49757d2bbeda1275fc38d69079752a Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-10T15:33:14 Monotone-Branch: ca.inverse.sogo --- SOPE/NGCards/CardVersitRenderer.m | 3 +++ 1 file changed, 3 insertions(+) diff --git a/SOPE/NGCards/CardVersitRenderer.m b/SOPE/NGCards/CardVersitRenderer.m index 419aabf43..71677fcd0 100644 --- a/SOPE/NGCards/CardVersitRenderer.m +++ b/SOPE/NGCards/CardVersitRenderer.m @@ -73,6 +73,8 @@ } [rendering appendString: [tag uppercaseString]]; + + /* parameters */ attributes = [anElement attributes]; keys = [[attributes allKeys] objectEnumerator]; while ((key = [keys nextObject])) @@ -104,6 +106,7 @@ } } + /* values */ values = [anElement values]; if ([values count] > 0) [rendering appendFormat: @":%@", From a137e1679e6e15a93195b95018007956614f827e Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Mon, 14 Nov 2011 03:26:50 +0000 Subject: [PATCH 28/38] Monotone-Parent: 2b628a62ac49757d2bbeda1275fc38d69079752a Monotone-Revision: 59d4ff7e6c2fe24e74adbe4891af30ece4f5e858 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-14T03:26:50 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 13 + OGoContentStore/OCSContactFieldExtractor.m | 43 +- OpenChange/MAPIStoreAppointmentWrapper.m | 11 +- OpenChange/MAPIStoreCalendarMessage.m | 4 +- OpenChange/MAPIStoreContactsAttachment.m | 6 +- OpenChange/MAPIStoreContactsMessage.m | 119 +++-- OpenChange/MAPIStoreRecurrenceUtils.m | 18 +- SOPE/NGCards/CardElement.h | 51 +- SOPE/NGCards/CardElement.m | 443 ++++++++---------- SOPE/NGCards/CardGroup.m | 7 +- SOPE/NGCards/CardVersitRenderer.m | 50 +- SOPE/NGCards/ChangeLog | 28 ++ SOPE/NGCards/NGCardsSaxHandler.h | 2 +- SOPE/NGCards/NGCardsSaxHandler.m | 8 +- SOPE/NGCards/NGVCard.h | 5 +- SOPE/NGCards/NGVCard.m | 103 ++-- SOPE/NGCards/NGVCardPhoto.m | 7 +- SOPE/NGCards/NGVCardReference.m | 4 +- SOPE/NGCards/NGVList.m | 38 +- SOPE/NGCards/NSArray+NGCards.h | 2 - SOPE/NGCards/NSArray+NGCards.m | 28 -- SOPE/NGCards/NSDictionary+NGCards.h | 3 + SOPE/NGCards/NSDictionary+NGCards.m | 124 +++++ SOPE/NGCards/NSString+NGCards.h | 3 +- SOPE/NGCards/NSString+NGCards.m | 88 ++-- SOPE/NGCards/iCalAlarm.m | 29 +- SOPE/NGCards/iCalAttachment.h | 3 - SOPE/NGCards/iCalAttachment.m | 10 - SOPE/NGCards/iCalCalendar.m | 21 +- SOPE/NGCards/iCalDateTime.m | 10 +- SOPE/NGCards/iCalEntityObject.h | 4 +- SOPE/NGCards/iCalEntityObject.m | 77 +-- SOPE/NGCards/iCalEvent.m | 12 +- SOPE/NGCards/iCalPerson.m | 6 +- SOPE/NGCards/iCalRecurrenceRule.m | 116 ++--- SOPE/NGCards/iCalRepeatableEntityObject.m | 2 +- SOPE/NGCards/iCalTimeZone.m | 4 +- SOPE/NGCards/iCalTimeZonePeriod.m | 5 +- SOPE/NGCards/iCalToDo.m | 7 +- SOPE/NGCards/iCalTrigger.h | 3 - SOPE/NGCards/iCalTrigger.m | 10 - SOPE/NGCards/iCalXMLRenderer.m | 104 ++-- .../Appointments/SOGoAppointmentFolder.m | 9 +- SoObjects/Appointments/iCalEvent+SOGo.m | 13 +- .../iCalRepeatableEntityObject+SOGo.m | 18 +- SoObjects/Contacts/NGVCard+SOGo.m | 80 ++-- SoObjects/Contacts/SOGoContactEntryPhoto.m | 3 +- SoObjects/Contacts/SOGoContactLDIFEntry.m | 20 +- Tests/Unit/TestVersit.m | 127 +++-- Tools/SOGoToolRemoveDoubles.m | 2 +- UI/Contacts/UIxContactEditor.m | 163 +++---- UI/Contacts/UIxContactView.m | 132 +++--- UI/Contacts/UIxListEditor.m | 2 +- UI/MailerUI/UIxMailMainFrame.m | 23 +- UI/Scheduler/UIxComponentEditor.m | 70 +-- 55 files changed, 1250 insertions(+), 1043 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7fdcb0e1c..259246505 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2011-11-13 Wolfgang Sourdeau + + * OpenChange/MAPIStoreContactsMessage.m (-getPrBody:inMemCtx:): + same as below. + + * OpenChange/MAPIStoreAppointmentWrapper.m (-getPrBody:inMemCtx:): + removed parsing hack since things are now done properly from + NGCards. + + * Tests/Unit/TestVersit.m (-test_rendering, -test_parsing): + adapted to new NGCards data structure and improved to test further + important use cases. + 2011-11-10 Wolfgang Sourdeau * Tests/Unit/TestVersit.m: new test module for versit parsing and diff --git a/OGoContentStore/OCSContactFieldExtractor.m b/OGoContentStore/OCSContactFieldExtractor.m index 60e204182..5382ef634 100644 --- a/OGoContentStore/OCSContactFieldExtractor.m +++ b/OGoContentStore/OCSContactFieldExtractor.m @@ -39,27 +39,19 @@ { NSMutableDictionary *fields; NSArray *values; - CardElement *adr; + CardElement *element; NSString *value; - unsigned int max; fields = [NSMutableDictionary dictionaryWithCapacity: 16]; value = [vCard fn]; if (value) [fields setObject: value forKey: @"c_cn"]; - values = [vCard n]; - if (values) - { - max = [values count]; - if (max > 0) - { - [fields setObject: [values objectAtIndex: 0] forKey: @"c_sn"]; - if (max > 1) - [fields setObject: [values objectAtIndex: 1] - forKey: @"c_givenName"]; - } - } + element = [vCard n]; + [fields setObject: [element flattenedValueAtIndex: 0 forKey: @""] + forKey: @"c_sn"]; + [fields setObject: [element flattenedValueAtIndex: 1 forKey: @""] + forKey: @"c_givenName"]; value = [vCard preferredTel]; if (value) [fields setObject: value forKey: @"c_telephoneNumber"]; @@ -67,18 +59,17 @@ if (![value isNotNull]) value = @""; [fields setObject: value forKey: @"c_mail"]; - values = [vCard org]; - max = [values count]; - if (max > 0) - { - [fields setObject: [values objectAtIndex: 0] forKey: @"c_o"]; - if (max > 1) - [fields setObject: [values objectAtIndex: 1] forKey: @"c_ou"]; - } - adr = [vCard preferredAdr]; - if (adr) - [fields setObject: [adr value: 3] forKey: @"c_l"]; - value = [[vCard uniqueChildWithTag: @"X-AIM"] value: 0]; + element = [vCard org]; + [fields setObject: [element flattenedValueAtIndex: 0 forKey: @""] + forKey: @"c_o"]; + [fields setObject: [element flattenedValueAtIndex: 1 forKey: @""] + forKey: @"c_ou"]; + element = [vCard preferredAdr]; + if (element && ![element isVoid]) + [fields setObject: [element flattenedValueAtIndex: 3 + forKey: @""] + forKey: @"c_l"]; + value = [[vCard uniqueChildWithTag: @"X-AIM"] flattenedValuesForKey: @""]; [fields setObject: value forKey: @"c_screenname"]; values = [[vCard categories] trimmedComponents]; if ([values count] > 0) diff --git a/OpenChange/MAPIStoreAppointmentWrapper.m b/OpenChange/MAPIStoreAppointmentWrapper.m index 216ba3795..82753c076 100644 --- a/OpenChange/MAPIStoreAppointmentWrapper.m +++ b/OpenChange/MAPIStoreAppointmentWrapper.m @@ -1026,17 +1026,11 @@ static NSCharacterSet *hexCharacterSet = nil; { int rc = MAPISTORE_SUCCESS; NSString *stringValue; - NSArray *values; /* FIXME: there is a confusion in NGCards around "comment" and "description" */ stringValue = [event comment]; if ([stringValue length] > 0) - { - /* FIXME: this is a temporary hack: we unescape things although NGVCards - should already have done it at this stage... */ - values = [stringValue asCardAttributeValues]; - *data = [[values objectAtIndex: 0] asUnicodeInMemCtx: memCtx]; - } + *data = [stringValue asUnicodeInMemCtx: memCtx]; else rc = MAPISTORE_ERR_NOT_FOUND; @@ -1411,7 +1405,8 @@ _fillAppointmentRecurrencePattern (struct AppointmentRecurrencePattern *arp, { startDate = [event startDate]; relation = [[trigger relationType] lowercaseString]; - interval = [[trigger value] durationAsTimeInterval]; + interval = [[trigger flattenedValuesForKey: @""] + durationAsTimeInterval]; if ([relation isEqualToString: @"end"]) relationDate = [event endDate]; else diff --git a/OpenChange/MAPIStoreCalendarMessage.m b/OpenChange/MAPIStoreCalendarMessage.m index 5de94e2d6..33b7ffe9d 100644 --- a/OpenChange/MAPIStoreCalendarMessage.m +++ b/OpenChange/MAPIStoreCalendarMessage.m @@ -607,7 +607,9 @@ [alarm setAction: @"DISPLAY"]; trigger = [iCalTrigger elementWithTag: @"trigger"]; [trigger setValueType: @"DURATION"]; - [trigger setValue: [NSString stringWithFormat: @"-PT%@M", delta]]; + [trigger + setSingleValue: [NSString stringWithFormat: @"-PT%@M", delta] + forKey: @""]; [alarm setTrigger: trigger]; [newEvent addToAlarms: alarm]; [alarm release]; diff --git a/OpenChange/MAPIStoreContactsAttachment.m b/OpenChange/MAPIStoreContactsAttachment.m index ff010ff7e..99cb65538 100644 --- a/OpenChange/MAPIStoreContactsAttachment.m +++ b/OpenChange/MAPIStoreContactsAttachment.m @@ -142,7 +142,8 @@ extern NSTimeZone *utcTZ; inMemCtx: (TALLOC_CTX *) memCtx { if (!photoData) - ASSIGN (photoData, [[photo value: 0] dataByDecodingBase64]); + ASSIGN (photoData, + [[photo flattenedValuesForKey: @""] dataByDecodingBase64]); *data = [photoData asBinaryInMemCtx: memCtx]; @@ -153,7 +154,8 @@ extern NSTimeZone *utcTZ; inMemCtx: (TALLOC_CTX *) memCtx { if (!photoData) - ASSIGN (photoData, [[photo value: 0] dataByDecodingBase64]); + ASSIGN (photoData, + [[photo flattenedValuesForKey: @""] dataByDecodingBase64]); *data = MAPILongValue (memCtx, [photoData length]); diff --git a/OpenChange/MAPIStoreContactsMessage.m b/OpenChange/MAPIStoreContactsMessage.m index 8b5bd75b8..f2732ecb7 100644 --- a/OpenChange/MAPIStoreContactsMessage.m +++ b/OpenChange/MAPIStoreContactsMessage.m @@ -149,18 +149,11 @@ - (int) getPrCompanyName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { - NSArray *values; - NSString *stringValue; + CardElement *org; - values = [[sogoObject vCard] org]; - stringValue = nil; - - if ([values count] > 0) - stringValue = [values objectAtIndex: 0]; - else - stringValue = @""; - - *data = [stringValue asUnicodeInMemCtx: memCtx]; + org = [[sogoObject vCard] org]; + *data = [[org flattenedValueAtIndex: 0 forKey: @""] + asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } @@ -168,18 +161,11 @@ - (int) getPrDepartmentName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { - NSArray *values; - NSString *stringValue; + CardElement *org; - values = [[sogoObject vCard] org]; - stringValue = nil; - - if ([values count] > 1) - stringValue = [values objectAtIndex: 1]; - else - stringValue = @""; - - *data = [stringValue asUnicodeInMemCtx: memCtx]; + org = [[sogoObject vCard] org]; + *data = [[org flattenedValueAtIndex: 1 forKey: @""] + asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } @@ -314,7 +300,7 @@ max = [emails count]; for (count = 0; !stringValue && count < max; count++) { - email = [[emails objectAtIndex: count] value: 0]; + email = [[emails objectAtIndex: count] flattenedValuesForKey: @""]; if ([email caseInsensitiveCompare: [card preferredEMail]] != NSOrderedSame) stringValue = email; @@ -339,16 +325,10 @@ { int rc = MAPISTORE_SUCCESS; NSString *stringValue; - NSArray *values; stringValue = [[sogoObject vCard] note]; if ([stringValue length] > 0) - { - /* FIXME: this is a temporary hack: we unescape things although NGVCards - should already have done it at this stage... */ - values = [stringValue asCardAttributeValues]; - *data = [[values objectAtIndex: 0] asUnicodeInMemCtx: memCtx]; - } + *data = [stringValue asUnicodeInMemCtx: memCtx]; else rc = MAPISTORE_ERR_NOT_FOUND; @@ -380,7 +360,7 @@ ce = [elements objectAtIndex: count]; if (!aTypeToExclude || ![ce hasAttribute: @"type" havingValue: aTypeToExclude]) - stringValue = [ce value: pos]; + stringValue = [ce flattenedValueAtIndex: pos forKey: @""]; } if (!stringValue) @@ -471,7 +451,7 @@ NSString *stringValue; stringValue = [[[sogoObject vCard] uniqueChildWithTag: @"x-aim"] - value: 0]; + flattenedValuesForKey: @""]; if (!stringValue) stringValue = @""; *data = [stringValue asUnicodeInMemCtx: memCtx]; @@ -705,7 +685,9 @@ { NSString *stringValue; - stringValue = [[[sogoObject vCard] firstChildWithTag: @"n"] value: 0]; + stringValue = [[[sogoObject vCard] firstChildWithTag: @"n"] + flattenedValueAtIndex: 0 + forKey: @""]; *data = [stringValue asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; @@ -716,7 +698,9 @@ { NSString *stringValue; - stringValue = [[[sogoObject vCard] firstChildWithTag: @"n"] value: 1]; + stringValue = [[[sogoObject vCard] firstChildWithTag: @"n"] + flattenedValueAtIndex: 1 + forKey: @""]; *data = [stringValue asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; @@ -727,7 +711,9 @@ { NSString *stringValue; - stringValue = [[[sogoObject vCard] firstChildWithTag: @"n"] value: 2]; + stringValue = [[[sogoObject vCard] firstChildWithTag: @"n"] + flattenedValueAtIndex: 2 + forKey: @""]; *data = [stringValue asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; @@ -738,7 +724,9 @@ { NSString *stringValue; - stringValue = [[[sogoObject vCard] firstChildWithTag: @"n"] value: 3]; + stringValue = [[[sogoObject vCard] firstChildWithTag: @"n"] + flattenedValueAtIndex: 3 + forKey: @""]; *data = [stringValue asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; @@ -749,7 +737,9 @@ { NSString *stringValue; - stringValue = [[[sogoObject vCard] firstChildWithTag: @"n"] value: 4]; + stringValue = [[[sogoObject vCard] firstChildWithTag: @"n"] + flattenedValueAtIndex: 4 + forKey: @""]; *data = [stringValue asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; @@ -844,9 +834,9 @@ to: photoType]; [photo setValue: 0 ofAttribute: @"encoding" to: @"b"]; - [photo setValue: 0 - to: [content stringByReplacingString: @"\n" - withString: @""]]; + [photo setSingleValue: [content stringByReplacingString: @"\n" + withString: @""] + atIndex: 0 forKey: @""]; } } } @@ -893,7 +883,7 @@ if (value) { if ([elements count] > 0) - [[elements objectAtIndex: 0] setValue: 0 to: value]; + [[elements objectAtIndex: 0] setSingleValue: value forKey: @""]; else [newCard addEmail: value types: [NSArray arrayWithObject: @"pref"]]; @@ -902,7 +892,7 @@ if (value) { if ([elements count] > 1) - [[elements objectAtIndex: 1] setValue: 0 to: value]; + [[elements objectAtIndex: 1] setSingleValue: value forKey: @""]; else [newCard addEmail: value types: nil]; } @@ -910,7 +900,7 @@ if (value) { if ([elements count] > 2) - [[elements objectAtIndex: 2] setValue: 0 to: value]; + [[elements objectAtIndex: 2] setSingleValue: value forKey: @""]; else [newCard addEmail: value types: nil]; } @@ -950,7 +940,7 @@ [element addAttribute: @"type" value: @"pref"]; } - [element setValue: 0 to: value]; + [element setSingleValue: value forKey: @""]; } elements = [newCard childrenWithTag: @"adr" @@ -968,22 +958,22 @@ [element addAttribute: @"type" value: @"pref"]; value = [properties objectForKey: MAPIPropertyKey(PidLidWorkAddressPostOfficeBox)]; if (value) - [element setValue: 0 to: value]; + [element setSingleValue: value atIndex: 0 forKey: @""]; value = [properties objectForKey: MAPIPropertyKey(PidLidWorkAddressStreet)]; if (value) - [element setValue: 2 to: value]; + [element setSingleValue: value atIndex: 2 forKey: @""]; value = [properties objectForKey: MAPIPropertyKey(PidLidWorkAddressCity)]; if (value) - [element setValue: 3 to: value]; + [element setSingleValue: value atIndex: 3 forKey: @""]; value = [properties objectForKey: MAPIPropertyKey(PidLidWorkAddressState)]; if (value) - [element setValue: 4 to: value]; + [element setSingleValue: value atIndex: 4 forKey: @""]; value = [properties objectForKey: MAPIPropertyKey(PidLidWorkAddressPostalCode)]; if (value) - [element setValue: 5 to: value]; + [element setSingleValue: value atIndex: 5 forKey: @""]; value = [properties objectForKey: MAPIPropertyKey(PidLidWorkAddressCountry)]; if (value) - [element setValue: 6 to: value]; + [element setSingleValue: value atIndex: 6 forKey: @""]; // // home postal addresses handling @@ -1009,7 +999,7 @@ [element addAttribute: @"type" value: @"pref"]; } - [element setValue: 0 to: value]; + [element setSingleValue: value forKey: @""]; } elements = [newCard childrenWithTag: @"adr" @@ -1028,22 +1018,22 @@ value = [properties objectForKey: MAPIPropertyKey(PR_HOME_ADDRESS_POST_OFFICE_BOX_UNICODE)]; if (value) - [element setValue: 0 to: value]; + [element setSingleValue: value atIndex: 0 forKey: @""]; value = [properties objectForKey: MAPIPropertyKey( PR_HOME_ADDRESS_STREET_UNICODE)]; if (value) - [element setValue: 2 to: value]; + [element setSingleValue: value atIndex: 2 forKey: @""]; value = [properties objectForKey: MAPIPropertyKey(PR_HOME_ADDRESS_CITY_UNICODE)]; if (value) - [element setValue: 3 to: value]; + [element setSingleValue: value atIndex: 3 forKey: @""]; value = [properties objectForKey: MAPIPropertyKey(PR_HOME_ADDRESS_STATE_OR_PROVINCE_UNICODE)]; if (value) - [element setValue: 4 to: value]; + [element setSingleValue: value atIndex: 4 forKey: @""]; value = [properties objectForKey: MAPIPropertyKey(PR_HOME_ADDRESS_POSTAL_CODE_UNICODE)]; if (value) - [element setValue: 5 to: value]; + [element setSingleValue: value atIndex: 5 forKey: @""]; value = [properties objectForKey: MAPIPropertyKey(PR_HOME_ADDRESS_COUNTRY_UNICODE)]; if (value) - [element setValue: 6 to: value]; + [element setSingleValue: value atIndex: 6 forKey: @""]; // @@ -1052,27 +1042,27 @@ element = [self _elementWithTag: @"tel" ofType: @"work" forCard: newCard]; value = [properties objectForKey: MAPIPropertyKey(PR_OFFICE_TELEPHONE_NUMBER_UNICODE)]; if (value) - [element setValue: 0 to: value]; + [element setSingleValue: value forKey: @""]; element = [self _elementWithTag: @"tel" ofType: @"home" forCard: newCard]; value = [properties objectForKey: MAPIPropertyKey(PR_HOME_TELEPHONE_NUMBER_UNICODE)]; if (value) - [element setValue: 0 to: value]; + [element setSingleValue: value forKey: @""]; element = [self _elementWithTag: @"tel" ofType: @"fax" forCard: newCard]; value = [properties objectForKey: MAPIPropertyKey(PR_BUSINESS_FAX_NUMBER_UNICODE)]; if (value) - [element setValue: 0 to: value]; + [element setSingleValue: value forKey: @""]; element = [self _elementWithTag: @"tel" ofType: @"pager" forCard: newCard]; value = [properties objectForKey: MAPIPropertyKey(PR_PAGER_TELEPHONE_NUMBER_UNICODE)]; if (value) - [element setValue: 0 to: value]; + [element setSingleValue: value forKey: @""]; element = [self _elementWithTag: @"tel" ofType: @"cell" forCard: newCard]; value = [properties objectForKey: MAPIPropertyKey(PR_MOBILE_TELEPHONE_NUMBER_UNICODE)]; if (value) - [element setValue: 0 to: value]; + [element setSingleValue: value forKey: @""]; // @@ -1100,15 +1090,14 @@ if (value) { [[self _elementWithTag: @"url" ofType: @"work" forCard: newCard] - setValue: 0 to: value]; + setSingleValue: value forKey: @""]; } value = [properties objectForKey: MAPIPropertyKey(PidLidInstantMessagingAddress)]; if (value) { [[newCard uniqueChildWithTag: @"x-aim"] - setValue: 0 - to: value]; + setSingleValue: value forKey: @""]; } value = [properties objectForKey: MAPIPropertyKey(PR_BIRTHDAY)]; diff --git a/OpenChange/MAPIStoreRecurrenceUtils.m b/OpenChange/MAPIStoreRecurrenceUtils.m index 4026c5b88..010066e43 100644 --- a/OpenChange/MAPIStoreRecurrenceUtils.m +++ b/OpenChange/MAPIStoreRecurrenceUtils.m @@ -96,7 +96,7 @@ [rule setFrequency: iCalRecurrenceFrequenceYearly]; [rule setRepeatInterval: rp->Period / 12]; month = [NSString stringWithFormat: @"%d", [startDate monthOfYear]]; - [rule setNamedValue: @"bymonth" to: month]; + [rule setSingleValue: month forKey: @"bymonth"]; } else [self errorWithFormat: @@ -116,7 +116,7 @@ else monthDay = [NSString stringWithFormat: @"%d", rp->PatternTypeSpecific.MonthRecurrencePattern.N]; - [rule setNamedValue: @"bymonthday" to: monthDay]; + [rule setSingleValue: monthDay forKey: @"bymonthday"]; } else if ((rp->PatternTypeSpecific.MonthRecurrencePattern.WeekRecurrencePattern == 0x3e) /* Nth week day */ @@ -139,8 +139,9 @@ else bySetPos = rp->PatternTypeSpecific.MonthRecurrencePattern.N; - [rule setNamedValue: @"bysetpos" - to: [NSString stringWithFormat: @"%d", bySetPos]]; + [rule + setSingleValue: [NSString stringWithFormat: @"%d", bySetPos] + forKey: @"bysetpos"]; } else { @@ -167,9 +168,10 @@ || (rp->PatternType & 4) == 4) { /* MonthEnd, HjMonth and HjMonthEnd */ - [rule setNamedValue: @"bymonthday" - to: [NSString stringWithFormat: @"%d", - rp->PatternTypeSpecific.Day]]; + [rule + setSingleValue: [NSString stringWithFormat: @"%d", + rp->PatternTypeSpecific.Day] + forKey: @"bymonthday"]; } else [self errorWithFormat: @"invalid value for PatternType: %.4x", @@ -348,7 +350,7 @@ if (mask) { rp->PatternTypeSpecific.MonthRecurrencePattern.WeekRecurrencePattern = mask; - bySetPos = [self namedValue: @"bysetpos"]; + bySetPos = [self flattenedValuesForKey: @"bysetpos"]; if ([bySetPos length]) rp->PatternTypeSpecific.MonthRecurrencePattern.N = ([bySetPos hasPrefix: @"-"] diff --git a/SOPE/NGCards/CardElement.h b/SOPE/NGCards/CardElement.h index 6f59d0ad1..af94a5c49 100644 --- a/SOPE/NGCards/CardElement.h +++ b/SOPE/NGCards/CardElement.h @@ -36,7 +36,7 @@ @interface CardElement : NSObject { NSString *tag; - NSMutableArray *values; + NSMutableDictionary *values; NSMutableDictionary *attributes; NSString *group; CardGroup *parent; @@ -51,31 +51,44 @@ singleType: (NSString *) aType value: (NSString *) aValue; -+ (id) elementWithTag: (NSString *) aTag - attributes: (NSDictionary *) someAttributes - values: (NSArray *) someValues; - - (void) setParent: (CardGroup *) aParent; - (id) parent; - (void) setTag: (NSString *) aTag; +- (NSString *) tag; - (void) setGroup: (NSString *) aGroup; - (NSString *) group; -- (void) addValue: (NSString *) aValue; -- (void) addValues: (NSArray *) someValues; +- (BOOL) isVoid; -- (void) setValue: (unsigned int) anInt - to: (NSString *) aValue; -- (NSString *) value: (unsigned int) anInt; +- (void) setValues: (NSMutableDictionary *) newValues; +- (NSMutableDictionary *) values; -- (void) setNamedValue: (NSString *) aValueName - to: (NSString *) aValue; -- (NSString *) namedValue: (NSString *) aValueName; +/* ELEM:...;value1,value2,...;... */ +- (void) setValues: (NSMutableArray *) newValues + atIndex: (NSUInteger) idx + forKey: (NSString *) key; -- (void) setCommaSeparatedValues: (NSArray *) values; +/* ELEM:...;value;... */ +- (void) setSingleValue: (NSString *) newValue + atIndex: (NSUInteger) idx + forKey: (NSString *) key; +/* ELEM:value */ +- (void) setSingleValue: (NSString *) newValue + forKey: (NSString *) key; +- (NSMutableArray *) valuesForKey: (NSString *) key; +- (NSMutableArray *) valuesAtIndex: (NSUInteger) idx + forKey: (NSString *) key; + +/* This joins all subvalues with "," and ordered values with ";". Handy for + retrieving data from clients which don't escape their data properly. */ +- (NSString *) flattenedValuesForKey: (NSString *) key; +- (NSString *) flattenedValueAtIndex: (NSUInteger) idx + forKey: (NSString *) key; + +/* attribute values */ - (void) setValue: (unsigned int) anInt ofAttribute: (NSString *) anAttribute to: (NSString *) aValue; @@ -87,17 +100,11 @@ - (void) addAttributes: (NSDictionary *) someAttributes; - (void) removeValue: (NSString *) aValue fromAttribute: (NSString *) anAttribute; - -- (void) addType: (NSString *) aType; - -- (NSString *) tag; -- (void) setValues: (NSArray *) newValues; -- (NSArray *) values; -- (NSDictionary *) attributes; +- (NSMutableDictionary *) attributes; - (BOOL) hasAttribute: (NSString *) aType havingValue: (NSString *) aValue; -- (BOOL) isVoid; +- (void) addType: (NSString *) aType; - (NSString *) versitString; diff --git a/SOPE/NGCards/CardElement.m b/SOPE/NGCards/CardElement.m index 49c3913b4..ec4d7404f 100644 --- a/SOPE/NGCards/CardElement.m +++ b/SOPE/NGCards/CardElement.m @@ -56,7 +56,7 @@ id newElement; newElement = [self elementWithTag: aTag]; - [newElement addValue: aValue]; + [newElement setSingleValue: aValue forKey: @""]; return newElement; } @@ -74,21 +74,6 @@ return newElement; } -+ (id) elementWithTag: (NSString *) aTag - attributes: (NSDictionary *) someAttributes - values: (NSArray *) someValues -{ - id newElement; - - newElement = [self new]; - [newElement autorelease]; - [newElement setTag: aTag]; - [newElement addAttributes: someAttributes]; - [newElement addValues: someValues]; - - return newElement; -} - - (id) init { if ((self = [super init])) @@ -96,7 +81,7 @@ parent = nil; tag = nil; group = nil; - values = [NSMutableArray new]; + values = [NSMutableDictionary new]; attributes = [NSMutableDictionary new]; } @@ -142,16 +127,172 @@ return group; } -- (void) addValue: (NSString *) aValue +/* values */ +- (void) setValues: (NSMutableDictionary *) newValues { - if (!aValue) - aValue = @""; - [values addObject: aValue]; + ASSIGN (values, newValues); } -- (void) addValues: (NSArray *) someValues +- (NSMutableDictionary *) values { - [values addObjectsFromArray: someValues]; + return values; +} + +- (void) setValues: (NSMutableArray *) newValues + atIndex: (NSUInteger) idx + forKey: (NSString *) key +{ + NSMutableArray *oldValues, *subValues; + + oldValues = [self valuesForKey: key]; + if (!oldValues) + { + oldValues = [NSMutableArray new]; + [values setObject: oldValues forKey: key]; + [oldValues release]; + } + + while ([oldValues count] < (idx + 1)) + { + subValues = [NSMutableArray new]; + [oldValues addObject: subValues]; + [subValues release]; + } + + if (!newValues) + newValues = [NSMutableArray array]; + [oldValues replaceObjectAtIndex: idx withObject: newValues]; +} + +- (void) setSingleValue: (NSString *) newValue + atIndex: (NSUInteger) idx + forKey: (NSString *) key +{ + NSMutableArray *subValues; + + if (newValue) + { + subValues = [NSMutableArray new]; + [subValues addObject: newValue]; + } + else + subValues = nil; + [self setValues: subValues atIndex: idx forKey: key]; + [subValues release]; +} + +- (void) setSingleValue: (NSString *) newValue + forKey: (NSString *) key +{ + [self setSingleValue: newValue + atIndex: 0 forKey: key]; +} + +- (NSMutableArray *) valuesForKey: (NSString *) key +{ + return [values objectForKey: [key lowercaseString]]; +} + +- (NSMutableArray *) valuesAtIndex: (NSUInteger) idx + forKey: (NSString *) key +{ + return [[self valuesForKey: key] objectAtIndex: idx]; +} + +- (NSString *) flattenedValueAtIndex: (NSUInteger) idx + forKey: (NSString *) key +{ + NSMutableArray *orderedValues, *sValues; + NSUInteger count, max; + NSMutableString *flattenedValues; + NSString *encoding, *realValue, *value; + + flattenedValues = [NSMutableString string]; + + orderedValues = [self valuesForKey: key]; + max = [orderedValues count]; + if (max > idx) + { + encoding = [[self value: 0 ofAttribute: @"encoding"] + lowercaseString]; + sValues = [orderedValues objectAtIndex: idx]; + max = [sValues count]; + for (count = 0; count < max; count++) + { + if (count > 0) + [flattenedValues appendString: @","]; + realValue = [sValues objectAtIndex: count]; + if ([encoding isEqualToString: @"quoted-printable"]) + value = [realValue stringByDecodingQuotedPrintable]; + else if ([encoding isEqualToString: @"base64"]) + value = [realValue stringByDecodingBase64]; + else + { + value = realValue; + if ([encoding length] && ![encoding isEqualToString: @"8bit"]) + [self logWithFormat: @"unknown encoding '%@'", encoding]; + } + + [flattenedValues appendString: value]; + } + } + + return flattenedValues; +} + +- (NSString *) flattenedValuesForKey: (NSString *) key +{ + NSMutableArray *orderedValues, *sValues; + NSUInteger count, max, sCount, sMax; + NSMutableString *flattenedValues; + NSString *encoding, *realValue, *value; + + encoding = [[self value: 0 ofAttribute: @"encoding"] + lowercaseString]; + + flattenedValues = [NSMutableString string]; + + orderedValues = [self valuesForKey: key]; + max = [orderedValues count]; + for (count = 0; count < max; count++) + { + if (count > 0) + [flattenedValues appendString: @";"]; + sValues = [orderedValues objectAtIndex: count]; + sMax = [sValues count]; + for (sCount = 0; sCount < sMax; sCount++) + { + if (sCount > 0) + [flattenedValues appendString: @","]; + realValue = [sValues objectAtIndex: sCount]; + if ([encoding isEqualToString: @"quoted-printable"]) + value = [realValue stringByDecodingQuotedPrintable]; + else if ([encoding isEqualToString: @"base64"]) + value = [realValue stringByDecodingBase64]; + else + { + value = realValue; + if ([encoding length] && ![encoding isEqualToString: @"8bit"]) + [self logWithFormat: @"unknown encoding '%@'", encoding]; + } + + [flattenedValues appendString: value]; + } + } + + return flattenedValues; +} + +/* attributes */ + +- (NSMutableDictionary *) attributes +{ + return attributes; +} + +- (void) setAttributesAsCopy: (NSMutableDictionary *) someAttributes +{ + ASSIGN (attributes, someAttributes); } - (void) addAttribute: (NSString *) anAttribute @@ -219,26 +360,6 @@ [self addAttribute: @"type" value: aType]; } -- (void) setValues: (NSArray *) newValues -{ - if (![newValues isKindOfClass: [NSMutableArray class]]) - { - newValues = [newValues mutableCopy]; - [newValues autorelease]; - } - ASSIGN (values, newValues); -} - -- (NSArray *) values -{ - return values; -} - -- (NSDictionary *) attributes -{ - return attributes; -} - - (BOOL) hasAttribute: (NSString *) anAttribute havingValue: (NSString *) aValue { @@ -249,141 +370,6 @@ return (attribute && [attribute hasCaseInsensitiveString: aValue]); } -- (void) setValue: (unsigned int) anInt - to: (NSString *) aValue -{ - unsigned int count, max; - - if (!aValue) - aValue = @""; - max = [values count]; - for (count = max; count <= anInt; count++) - [self addValue: @""]; - - [values replaceObjectAtIndex: anInt withObject: aValue]; -} - -- (NSString *) value: (unsigned int) anInt -{ - NSString *realValue, *value, *encoding; - - if ([values count] <= anInt) - value = @""; - else - { - realValue = [values objectAtIndex: anInt]; - encoding = [[self value: 0 ofAttribute: @"encoding"] lowercaseString]; - if ([encoding length]) - { - if ([encoding isEqualToString: @"quoted-printable"]) - value = [realValue stringByDecodingQuotedPrintable]; - else if ([encoding isEqualToString: @"base64"]) - value = [realValue stringByDecodingBase64]; - else - { - value = realValue; - if (![encoding isEqualToString: @"8bit"]) - [self logWithFormat: @"unknown encoding '%@'", encoding]; - } - } - else - value = realValue; - } - - return value; -} - -- (unsigned int) _namedValue: (NSString *) aValueName -{ - NSString *prefix, *value; - unsigned int count, max, result; - - result = NSNotFound; - - prefix = [NSString stringWithFormat: @"%@=", [aValueName uppercaseString]]; - max = [values count]; - count = 0; - - while (result == NSNotFound && count < max) - { - value = [[values objectAtIndex: count] uppercaseString]; - if ([value hasPrefix: prefix]) - result = count; - else - count++; - } - - return result; -} - -- (void) setNamedValue: (NSString *) aValueName - to: (NSString *) aValue -{ - NSString *newValue; - unsigned int index; - - if (!aValue) - aValue = @""; - newValue = [NSString stringWithFormat: @"%@=%@", - [aValueName uppercaseString], - aValue]; - index = [self _namedValue: aValueName]; - if (index == NSNotFound) - { - if ([aValue length]) - [self addValue: newValue]; - } - else - { - if ([aValue length]) - [self setValue: index to: newValue]; - else - [values removeObjectAtIndex: index]; - } -} - -- (NSString *) namedValue: (NSString *) aValueName -{ - unsigned int index; - NSRange equalSign; - NSString *value; - - index = [self _namedValue: aValueName]; - if (index == NSNotFound) - value = @""; - else - { - value = [values objectAtIndex: index]; - equalSign = [value rangeOfString: @"="]; - if (equalSign.location != NSNotFound) - value = [value substringFromIndex: equalSign.location + 1]; - } - - return value; -} - -- (void) setCommaSeparatedValues: (NSArray *) newValues -{ - NSMutableString *newValue; - NSUInteger count, max; - NSString *currentValue; - - newValue = [NSMutableString stringWithCapacity: 250]; - - max = [newValues count]; - for (count = 0; count < max; count++) - { - currentValue = [[newValues objectAtIndex: count] - stringByReplacingString: @"," - withString: @"\\,"]; - if (count > 0) - [newValue appendFormat: @",%@", currentValue]; - else - [newValue appendString: currentValue]; - } - [self setValues: [NSArray arrayWithObject: newValue]]; -} - - (void) setValue: (unsigned int) anInt ofAttribute: (NSString *) anAttribute to: (NSString *) aValue @@ -423,10 +409,7 @@ - (NSString *) description { - NSArray *attrs; NSMutableString *str; - unsigned int count, max; - NSString *attr; str = [NSMutableString stringWithCapacity:64]; [str appendFormat:@"<%p[%@]:", self, NSStringFromClass([self class])]; @@ -435,48 +418,56 @@ else [str appendFormat: @"%@\n", tag, group]; - attrs = [attributes allKeys]; - max = [attrs count]; - if (max > 0) - { - [str appendFormat: @"\n %d attributes: {\n", [attrs count]]; - for (count = 0; count < max; count++) - { - attr = [attrs objectAtIndex: count]; - [str appendFormat: @" %@: %@\n", - attr, [attributes objectForKey: attr]]; - } - [str appendFormat: @"}"]; - } - - max = [values count]; - if (max > 0) - { - [str appendFormat: @"\n %d values: {\n", [values count]]; - for (count = 0; count < max; count++) - [str appendFormat: @" %@\n", [values objectAtIndex: count]]; - [str appendFormat: @"}"]; - } - - [str appendString:@">"]; + [str appendString: [self versitString]]; return str; } -- (BOOL) isVoid +static inline BOOL +_subValuesAreVoid (NSArray *subValues) { - BOOL result; - NSString *value; - NSEnumerator *enu; + BOOL result = YES; + NSUInteger count, max; result = YES; - enu = [values objectEnumerator]; - value = [enu nextObject]; - while (value && result) + max = [subValues count]; + for (count = 0; result && count < max; count++) + result = ([[subValues objectAtIndex: count] length] == 0); + + return result; +} + +static inline BOOL +_orderedValuesAreVoid (NSArray *orderedValues) +{ + BOOL result = YES; + NSUInteger count, max; + + result = YES; + + max = [orderedValues count]; + for (count = 0; result && count < max; count++) + result = _subValuesAreVoid ([orderedValues objectAtIndex: count]); + + return result; +} + +- (BOOL) isVoid +{ + BOOL result = YES; + NSArray *keys; + NSMutableArray *orderedValues; + NSUInteger count, max; + + result = YES; + + keys = [values allKeys]; + max = [keys count]; + for (count = 0; result && count < max; count++) { - result = ([value length] == 0); - value = [enu nextObject]; + orderedValues = [values objectForKey: [keys objectAtIndex: count]]; + result = _orderedValuesAreVoid (orderedValues); } return result; @@ -523,11 +514,6 @@ return newElement; } -- (void) setAttributesAsCopy: (NSMutableDictionary *) someAttributes -{ - ASSIGN (attributes, someAttributes); -} - - (CardGroup *) searchParentOfClass: (Class) parentClass { CardGroup *current; @@ -594,7 +580,7 @@ newGroup = [group copyWithZone: aZone]; [new setGroup: newGroup]; [newGroup release]; - [new setValues: [self deepCopyOfArray: values withZone: aZone]]; + [new setValues: [self deepCopyOfDictionary: values withZone: aZone]]; [new setAttributesAsCopy: [self deepCopyOfDictionary: attributes withZone: aZone]]; @@ -604,22 +590,7 @@ /* NSMutableCopying */ - (id) mutableCopyWithZone: (NSZone *) aZone { -#warning this method really is the same as "copyWithZone:" - CardElement *new; - NSString *newTag, *newGroup; - - new = [[self class] new]; - newTag = [tag copyWithZone: aZone]; - [new setTag: newTag]; - [newTag release]; - newGroup = [group copyWithZone: aZone]; - [new setGroup: newGroup]; - [newGroup release]; - [new setValues: [self deepCopyOfArray: values withZone: aZone]]; - [new setAttributesAsCopy: [self deepCopyOfDictionary: attributes - withZone: aZone]]; - - return new; + return [self copyWithZone: aZone]; } @end diff --git a/SOPE/NGCards/CardGroup.m b/SOPE/NGCards/CardGroup.m index 8af47506b..c6ef8bb62 100644 --- a/SOPE/NGCards/CardGroup.m +++ b/SOPE/NGCards/CardGroup.m @@ -281,7 +281,7 @@ static NGCardsSaxHandler *sax = nil; havingValue: (NSString *) aValue { return [children cardElementsWithAttribute: anAttribute - havingValue: aValue]; + havingValue: aValue]; } - (NSArray *) childrenWithTag: (NSString *) aTag @@ -293,7 +293,7 @@ static NGCardsSaxHandler *sax = nil; elements = [self childrenWithTag: aTag]; return [elements cardElementsWithAttribute: anAttribute - havingValue: aValue]; + havingValue: aValue]; } - (NSArray *) childrenGroupWithTag: (NSString *) aTag @@ -313,7 +313,8 @@ static NGCardsSaxHandler *sax = nil; { if ([element isKindOfClass: [CardGroup class]]) { - value = [[element uniqueChildWithTag: aChild] value: 0]; + value = [[element uniqueChildWithTag: aChild] + flattenedValuesForKey: @""]; if ([value isEqualToString: aValue]) [elements addObject: element]; } diff --git a/SOPE/NGCards/CardVersitRenderer.m b/SOPE/NGCards/CardVersitRenderer.m index 71677fcd0..35e50d0e7 100644 --- a/SOPE/NGCards/CardVersitRenderer.m +++ b/SOPE/NGCards/CardVersitRenderer.m @@ -31,7 +31,7 @@ #import "CardGroup.h" #import "NSString+NGCards.h" -#import "NSArray+NGCards.h" +#import "NSDictionary+NGCards.h" #import "CardVersitRenderer.h" @@ -55,9 +55,8 @@ { NSMutableString *rendering; NSDictionary *attributes; - NSEnumerator *keys; - NSArray *values, *renderedAttrs; - NSString *key, *finalRendering, *tag; + NSMutableDictionary *values; + NSString *finalRendering, *tag; if (![anElement isVoid]) { @@ -76,41 +75,16 @@ /* parameters */ attributes = [anElement attributes]; - keys = [[attributes allKeys] objectEnumerator]; - while ((key = [keys nextObject])) + if ([attributes count]) { - NSString *s; - int i, c; - - renderedAttrs = [[attributes objectForKey: key] renderedForCards]; - c = [renderedAttrs count]; - if (c > 0) - { - [rendering appendFormat: @";%@=", [key uppercaseString]]; - - for (i = 0; i < c; i++) - { - s = [renderedAttrs objectAtIndex: i]; - - /* We MUST quote attribute values that have a ":" in them - and that not already quoted */ - if ([s length] > 2 && [s rangeOfString: @":"].length && - [s characterAtIndex: 0] != '"' && ![s hasSuffix: @"\""]) - s = [NSString stringWithFormat: @"\"%@\"", s]; - - [rendering appendFormat: @"%@", s]; - - if (i+1 < c) - [rendering appendString: @","]; - } - } + [rendering appendString: @";"]; + [attributes versitRenderInString: rendering asAttributes: YES]; } /* values */ values = [anElement values]; - if ([values count] > 0) - [rendering appendFormat: @":%@", - [[values renderedForCards] componentsJoinedByString: @";"]]; + [rendering appendString: @":"]; + [values versitRenderInString: rendering asAttributes: NO]; if ([rendering length] > 0) [rendering appendString: @"\r\n"]; @@ -143,12 +117,8 @@ groupTag = [groupTag uppercaseString]; [rendering appendFormat: @"BEGIN:%@\r\n", groupTag]; children = [[aGroup children] objectEnumerator]; - currentChild = [children nextObject]; - while (currentChild) - { - [rendering appendString: [self render: currentChild]]; - currentChild = [children nextObject]; - } + while ((currentChild = [children nextObject])) + [rendering appendString: [self render: currentChild]]; [rendering appendFormat: @"END:%@\r\n", groupTag]; return rendering; diff --git a/SOPE/NGCards/ChangeLog b/SOPE/NGCards/ChangeLog index 67f5bfa01..fd6b23d98 100644 --- a/SOPE/NGCards/ChangeLog +++ b/SOPE/NGCards/ChangeLog @@ -1,3 +1,31 @@ +2011-11-13 Wolfgang Sourdeau + + * iCalTrigger.m (-setValue:, value): removed useless accessors. + + * iCalAttachment.m (-setValue:, value): removed useless accessors. + + * iCalRecurrenceRule.m (-setRrule): now makes use of the existing + parsing algorithm and get the values from the parsed element. + + * iCalEntityObject.m (-setCategories:): now take an array as + parameter. + + * NSString+NGCards.m (-vCardSubvalues): new method adapted to the + new CardElement data structure, replaces + "vCardSubvaluesWithSeparator:", since we now know how to properly + separate or escape elements. + + * CardElement.m (-init): "values" in now an NSMutableDictionary. + (-setValues:, -values): new primitive accessors; + (-setValues:atIndex:forKey:, -setSingleValue:atIndex:forKey:) + (setSingleValue:forKey:): new helper setters. + (-flattenedValueAtIndex:forKey:, -flattenedValues:forKey:): new + "flattened" helper getters. "Flattening" meaning here that the + first and/or second level array are merged with "," and ";", to + support clients that badly escape(d) their output for fields + taking only one value or a specific set of values. + (-valuesForKey:,-valuesAtIndex:forKey:): new helper getters + 2011-11-09 Wolfgang Sourdeau * NSString+NGCards.m (-escapedForCards): restored the escaping of diff --git a/SOPE/NGCards/NGCardsSaxHandler.h b/SOPE/NGCards/NGCardsSaxHandler.h index 189fc777a..0dc2fa354 100644 --- a/SOPE/NGCards/NGCardsSaxHandler.h +++ b/SOPE/NGCards/NGCardsSaxHandler.h @@ -69,7 +69,7 @@ /* content */ - (void) startCollectingContent; -- (NSArray *) finishCollectingContent; +- (NSMutableDictionary *) finishCollectingContent; - (void) startGroupElement: (NSString *) _localName; - (void) endGroupElement; diff --git a/SOPE/NGCards/NGCardsSaxHandler.m b/SOPE/NGCards/NGCardsSaxHandler.m index cf5beac68..f8cddc53e 100644 --- a/SOPE/NGCards/NGCardsSaxHandler.m +++ b/SOPE/NGCards/NGCardsSaxHandler.m @@ -181,7 +181,7 @@ else if ([_localName isEqualToString: @"container"]) [self endGroupElement]; else - [currentElement addValues: [self finishCollectingContent]]; + [currentElement setValues: [self finishCollectingContent]]; } /* content */ @@ -197,9 +197,9 @@ vcs.collectContent = 1; } -- (NSArray *) finishCollectingContent +- (NSMutableDictionary *) finishCollectingContent { - NSArray *contentValues; + NSMutableDictionary *contentValues; NSString *s; vcs.collectContent = 0; @@ -211,7 +211,7 @@ free (content); content = NULL; // NSLog (@"content: '%@'", s); - contentValues = [s vCardSubvaluesWithSeparator: ';']; + contentValues = [s vCardSubvalues]; } else contentValues = nil; diff --git a/SOPE/NGCards/NGVCard.h b/SOPE/NGCards/NGVCard.h index 7e11bd6a0..1d3696c63 100644 --- a/SOPE/NGCards/NGVCard.h +++ b/SOPE/NGCards/NGVCard.h @@ -117,11 +117,12 @@ typedef enum additional: (NSString *) additional prefixes: (NSString *) prefixes suffixes: (NSString *) suffixes; -- (NSArray *) n; +/* returns an array of single values */ +- (CardElement *) n; - (void) setOrg: (NSString *) anOrg units: (NSArray *) someUnits; -- (NSArray *) org; +- (CardElement *) org; - (void) setCategories: (NSArray *) newCategories; - (NSArray *) categories; diff --git a/SOPE/NGCards/NGVCard.m b/SOPE/NGCards/NGVCard.m index 2d44cfd72..97bcc92a0 100644 --- a/SOPE/NGCards/NGVCard.m +++ b/SOPE/NGCards/NGVCard.m @@ -116,134 +116,134 @@ /* accessors */ -- (void) setVersion: (NSString *) _version +- (void) setVersion: (NSString *) _value { - [[self uniqueChildWithTag: @"version"] setValue: 0 to: _version]; + [[self uniqueChildWithTag: @"version"] setSingleValue: _value forKey: @""]; } - (NSString *) version { - return [[self uniqueChildWithTag: @"version"] value: 0]; + return [[self uniqueChildWithTag: @"version"] flattenedValuesForKey: @""]; } -- (void) setUid: (NSString *) _uid +- (void) setUid: (NSString *) _value { - [[self uniqueChildWithTag: @"uid"] setValue: 0 to: _uid]; + [[self uniqueChildWithTag: @"uid"] setSingleValue: _value forKey: @""]; } - (NSString *) uid { - return [[self uniqueChildWithTag: @"uid"] value: 0]; + return [[self uniqueChildWithTag: @"uid"] flattenedValuesForKey: @""]; } -- (void) setVClass: (NSString *) _class +- (void) setVClass: (NSString *) _value { - [[self uniqueChildWithTag: @"class"] setValue: 0 to: _class]; + [[self uniqueChildWithTag: @"class"] setSingleValue: _value forKey: @""]; } - (NSString *) vClass { - return [[self uniqueChildWithTag: @"class"] value: 0]; + return [[self uniqueChildWithTag: @"class"] flattenedValuesForKey: @""]; } - (void) setProdID: (NSString *) _value { - [[self uniqueChildWithTag: @"prodid"] setValue: 0 to: _value]; + [[self uniqueChildWithTag: @"prodid"] setSingleValue: _value forKey: @""]; } - (NSString *) prodID { - return [[self uniqueChildWithTag: @"prodid"] value: 0]; + return [[self uniqueChildWithTag: @"prodid"] flattenedValuesForKey: @""]; } - (void) setProfile: (NSString *) _value { - [[self uniqueChildWithTag: @"profile"] setValue: 0 to: _value]; + [[self uniqueChildWithTag: @"profile"] setSingleValue: _value forKey: @""]; } - (NSString *) profile { - return [[self uniqueChildWithTag: @"profile"] value: 0]; + return [[self uniqueChildWithTag: @"profile"] flattenedValuesForKey: @""]; } - (void) setSource: (NSString *) _value { - [[self uniqueChildWithTag: @"source"] setValue: 0 to: _value]; + [[self uniqueChildWithTag: @"source"] setSingleValue: _value forKey: @""]; } - (NSString *) source { - return [[self uniqueChildWithTag: @"source"] value: 0]; + return [[self uniqueChildWithTag: @"source"] flattenedValuesForKey: @""]; } - (void) setFn: (NSString *) _value { - [[self uniqueChildWithTag: @"fn"] setValue: 0 to: _value]; + [[self uniqueChildWithTag: @"fn"] setSingleValue: _value forKey: @""]; } - (NSString *) fn { - return [[self uniqueChildWithTag: @"fn"] value: 0]; + return [[self uniqueChildWithTag: @"fn"] flattenedValuesForKey: @""]; } - (void) setRole: (NSString *) _value { - [[self uniqueChildWithTag: @"role"] setValue: 0 to: _value]; + [[self uniqueChildWithTag: @"role"] setSingleValue: _value forKey: @""]; } - (NSString *) role { - return [[self uniqueChildWithTag: @"role"] value: 0]; + return [[self uniqueChildWithTag: @"role"] flattenedValuesForKey: @""]; } -- (void) setTitle: (NSString *) _title +- (void) setTitle: (NSString *) _value { - [[self uniqueChildWithTag: @"title"] setValue: 0 to: _title]; + [[self uniqueChildWithTag: @"title"] setSingleValue: _value forKey: @""]; } - (NSString *) title { - return [[self uniqueChildWithTag: @"title"] value: 0]; + return [[self uniqueChildWithTag: @"title"] flattenedValuesForKey: @""]; } - (void) setBday: (NSString *) _value { - [[self uniqueChildWithTag: @"bday"] setValue: 0 to: _value]; + [[self uniqueChildWithTag: @"bday"] setSingleValue: _value forKey: @""]; } - (NSString *) bday { - return [[self uniqueChildWithTag: @"bday"] value: 0]; + return [[self uniqueChildWithTag: @"bday"] flattenedValuesForKey: @""]; } - (void) setNote: (NSString *) _value { - [[self uniqueChildWithTag: @"note"] setValue: 0 to: _value]; + [[self uniqueChildWithTag: @"note"] setSingleValue: _value forKey: @""]; } - (NSString *) note { - return [[self uniqueChildWithTag: @"note"] value: 0]; + return [[self uniqueChildWithTag: @"note"] flattenedValuesForKey: @""]; } - (void) setTz: (NSString *) _value { - [[self uniqueChildWithTag: @"tz"] setValue: 0 to: _value]; + [[self uniqueChildWithTag: @"tz"] setSingleValue: _value forKey: @""]; } - (NSString *) tz { - return [[self uniqueChildWithTag: @"tz"] value: 0]; + return [[self uniqueChildWithTag: @"tz"] flattenedValuesForKey: @""]; } - (void) setNickname: (NSString *) _value { - [[self uniqueChildWithTag: @"nickname"] setValue: 0 to: _value]; + [[self uniqueChildWithTag: @"nickname"] setSingleValue: _value forKey: @""]; } - (NSString *) nickname { - return [[self uniqueChildWithTag: @"nickname"] value: 0]; + return [[self uniqueChildWithTag: @"nickname"] flattenedValuesForKey: @""]; } - (void) addTel: (NSString *) phoneNumber @@ -270,20 +270,20 @@ n = [self uniqueChildWithTag: @"n"]; if (family) - [n setValue: 0 to: family]; + [n setSingleValue: family atIndex: 0 forKey: @""]; if (given) - [n setValue: 1 to: given]; + [n setSingleValue: given atIndex: 1 forKey: @""]; if (additional) - [n setValue: 2 to: additional]; + [n setSingleValue: additional atIndex: 2 forKey: @""]; if (prefixes) - [n setValue: 3 to: prefixes]; + [n setSingleValue: prefixes atIndex: 3 forKey: @""]; if (suffixes) - [n setValue: 4 to: suffixes]; + [n setSingleValue: suffixes atIndex: 4 forKey: @""]; } -- (NSArray *) n +- (CardElement *) n { - return [[self uniqueChildWithTag: @"n"] values]; + return [self uniqueChildWithTag: @"n"]; } - (void) setOrg: (NSString *) anOrg @@ -294,35 +294,30 @@ org = [self uniqueChildWithTag: @"org"]; if (anOrg) - [org setValue: 0 to: anOrg]; + [org setSingleValue: anOrg atIndex: 0 forKey: @""]; if (someUnits) { max = [someUnits count]; for (count = 0; count < max; count++) - [org setValue: count + 1 to: [someUnits objectAtIndex: count]]; + [org setSingleValue: [someUnits objectAtIndex: count] + atIndex: count + 1 forKey: @""]; } } -- (NSArray *) org +- (CardElement *) org { - NSArray *elements, *org; - - elements = [self childrenWithTag: @"org"]; - if ([elements count] > 0) - org = [[elements objectAtIndex: 0] values]; - else - org = nil; - - return org; + return [self uniqueChildWithTag: @"org"]; } - (void) setCategories: (NSArray *) newCategories { CardElement *cats; + NSMutableArray *copy; cats = [self uniqueChildWithTag: @"categories"]; - - [cats setCommaSeparatedValues: newCategories]; + copy = [newCategories mutableCopy]; + [cats setValues: copy atIndex: 0 forKey: @""]; + [copy release]; } - (NSArray *) categories @@ -331,7 +326,7 @@ cats = [self uniqueChildWithTag: @"categories"]; - return [[cats value: 0] vCardSubvaluesWithSeparator: ',']; + return [cats valuesAtIndex: 0 forKey: @""]; } // - (void) setOrg: (NGVCardOrg *) _v @@ -461,12 +456,12 @@ - (NSString *) preferredEMail { - return [[self _preferredElementWithTag: @"email"] value: 0]; + return [[self _preferredElementWithTag: @"email"] flattenedValuesForKey: @""]; } - (NSString *) preferredTel { - return [[self _preferredElementWithTag: @"tel"] value: 0]; + return [[self _preferredElementWithTag: @"tel"] flattenedValuesForKey: @""]; } - (CardElement *) preferredAdr diff --git a/SOPE/NGCards/NGVCardPhoto.m b/SOPE/NGCards/NGVCardPhoto.m index 263054f59..427d50389 100644 --- a/SOPE/NGCards/NGVCardPhoto.m +++ b/SOPE/NGCards/NGVCardPhoto.m @@ -21,6 +21,7 @@ */ #import +#import #import #import @@ -61,9 +62,11 @@ { /* We bypass -[values:] because we want to obtain the undecoded value first. */ - if ([values count] > 0) + if ([values count] > 0 && [[values objectForKey: @""] count] > 0 && + [[[values objectForKey: @""] objectAtIndex: 0] count] > 0) { - value = [values objectAtIndex: 0]; + value = [[[values objectForKey: @""] objectAtIndex: 0] + componentsJoinedByString: @","]; decodedContent = [value dataByDecodingBase64]; } else diff --git a/SOPE/NGCards/NGVCardReference.m b/SOPE/NGCards/NGVCardReference.m index 31da7fa51..389fcba7f 100644 --- a/SOPE/NGCards/NGVCardReference.m +++ b/SOPE/NGCards/NGVCardReference.m @@ -48,12 +48,12 @@ - (void) setReference: (NSString *) newReference { - [self setValue: 0 to: newReference]; + [self setSingleValue: newReference forKey: @""]; } - (NSString *) reference { - return [self value: 0]; + return [self flattenedValuesForKey: @""]; } @end diff --git a/SOPE/NGCards/NGVList.m b/SOPE/NGCards/NGVList.m index 3e85fa6ea..fc9d927b1 100644 --- a/SOPE/NGCards/NGVList.m +++ b/SOPE/NGCards/NGVList.m @@ -77,45 +77,45 @@ - (void) setProdID: (NSString *) newProdID { - [[self uniqueChildWithTag: @"prodid"] setValue: 0 to: newProdID]; + [[self uniqueChildWithTag: @"prodid"] setSingleValue: newProdID forKey: @""]; } - (NSString *) prodID { - return [[self uniqueChildWithTag: @"prodid"] value: 0]; + return [[self uniqueChildWithTag: @"prodid"] flattenedValuesForKey: @""]; } - (void) setVersion: (NSString *) newVersion { - [[self uniqueChildWithTag: @"version"] setValue: 0 - to: newVersion]; + [[self uniqueChildWithTag: @"version"] setSingleValue: newVersion + forKey: @""]; } - (NSString *) version { - return [[self uniqueChildWithTag: @"version"] value: 0]; + return [[self uniqueChildWithTag: @"version"] flattenedValuesForKey: @""]; } - (void) setUid: (NSString *) newUid { - [[self uniqueChildWithTag: @"uid"] setValue: 0 - to: newUid]; + [[self uniqueChildWithTag: @"uid"] setSingleValue: newUid + forKey: @""]; } - (NSString *) uid { - return [[self uniqueChildWithTag: @"uid"] value: 0]; + return [[self uniqueChildWithTag: @"uid"] flattenedValuesForKey: @""]; } - (void) setAccessClass: (NSString *) newAccessClass { - [[self uniqueChildWithTag: @"class"] setValue: 0 - to: newAccessClass]; + [[self uniqueChildWithTag: @"class"] setSingleValue: newAccessClass + forKey: @""]; } - (NSString *) accessClass { - return [[self uniqueChildWithTag: @"class"] value: 0]; + return [[self uniqueChildWithTag: @"class"] flattenedValuesForKey: @""]; } - (NGCardsAccessClass) symbolicAccessClass @@ -141,34 +141,34 @@ - (void) setFn: (NSString *) newFn { - [[self uniqueChildWithTag: @"fn"] setValue: 0 to: newFn]; + [[self uniqueChildWithTag: @"fn"] setSingleValue: newFn forKey: @""]; } - (NSString *) fn { - return [[self uniqueChildWithTag: @"fn"] value: 0]; + return [[self uniqueChildWithTag: @"fn"] flattenedValuesForKey: @""]; } - (void) setNickname: (NSString *) newNickname { - [[self uniqueChildWithTag: @"nickname"] setValue: 0 - to: newNickname]; + [[self uniqueChildWithTag: @"nickname"] setSingleValue: newNickname + forKey: @""]; } - (NSString *) nickname { - return [[self uniqueChildWithTag: @"nickname"] value: 0]; + return [[self uniqueChildWithTag: @"nickname"] flattenedValuesForKey: @""]; } - (void) setDescription: (NSString *) newDescription { - [[self uniqueChildWithTag: @"description"] setValue: 0 - to: newDescription]; + [[self uniqueChildWithTag: @"description"] setSingleValue: newDescription + forKey: @""]; } - (NSString *) description { - return [[self uniqueChildWithTag: @"description"] value: 0]; + return [[self uniqueChildWithTag: @"description"] flattenedValuesForKey: @""]; } - (void) addCardReference: (NGVCardReference *) newCardRef diff --git a/SOPE/NGCards/NSArray+NGCards.h b/SOPE/NGCards/NSArray+NGCards.h index 9b6c23ad0..d77965165 100644 --- a/SOPE/NGCards/NSArray+NGCards.h +++ b/SOPE/NGCards/NSArray+NGCards.h @@ -35,8 +35,6 @@ - (NSArray *) cardElementsWithAttribute: (NSString *) anAttribute havingValue: (NSString *) aValue; -- (NSArray *) renderedForCards; - @end #endif /* NSARRAY_NGCARDS_H */ diff --git a/SOPE/NGCards/NSArray+NGCards.m b/SOPE/NGCards/NSArray+NGCards.m index edda2f7a7..84ff07e38 100644 --- a/SOPE/NGCards/NSArray+NGCards.m +++ b/SOPE/NGCards/NSArray+NGCards.m @@ -99,32 +99,4 @@ return matchingElements; } -- (NSArray *) renderedForCards -{ - NSMutableArray *purified; - NSString *string; - int count, max, lastInsert; - - max = [self count]; - purified = [NSMutableArray arrayWithCapacity: max]; - - lastInsert = -1; - for (count = 0; count < max; count++) - { - string = [self objectAtIndex: count]; - if ([string length] > 0) - { - while (lastInsert < (count - 1)) - { - [purified addObject: @""]; - lastInsert++; - } - [purified addObject: [string escapedForCards]]; - lastInsert = count; - } - } - - return purified; -} - @end diff --git a/SOPE/NGCards/NSDictionary+NGCards.h b/SOPE/NGCards/NSDictionary+NGCards.h index 00249762c..8def7d6a1 100644 --- a/SOPE/NGCards/NSDictionary+NGCards.h +++ b/SOPE/NGCards/NSDictionary+NGCards.h @@ -29,6 +29,9 @@ - (id) objectForCaseInsensitiveKey: (NSString *) aKey; +- (void) versitRenderInString: (NSMutableString *) aString + asAttributes: (BOOL) asAttribute; /* handling of ":" */ + @end #endif /* NSDICTIONARY_NGCARDS_H */ diff --git a/SOPE/NGCards/NSDictionary+NGCards.m b/SOPE/NGCards/NSDictionary+NGCards.m index fe890085d..9360154bd 100644 --- a/SOPE/NGCards/NSDictionary+NGCards.m +++ b/SOPE/NGCards/NSDictionary+NGCards.m @@ -20,10 +20,95 @@ * Boston, MA 02111-1307, USA. */ +#import +#import + #import "NSArray+NGCards.h" +#import "NSString+NGCards.h" #import "NSDictionary+NGCards.h" +@interface NSArray (NGCardsVersit) + +- (BOOL) _renderAsSubValuesInString: (NSMutableString *) aString + asAttributes: (BOOL) asAttributes; +- (BOOL) _renderAsOrderedValuesInString: (NSMutableString *) aString + withKey: (NSString *) key; + +@end + +@implementation NSArray (NGCardsVersit) + +- (BOOL) _renderAsSubValuesInString: (NSMutableString *) aString + asAttributes: (BOOL) asAttributes +{ + NSUInteger count, max; + NSString *subValue, *escaped; + BOOL previousWasEmpty = YES, rendered = NO; + + max = [self count]; + for (count = 0; count < max; count++) + { + if (!previousWasEmpty) + [aString appendString: @","]; + subValue = [self objectAtIndex: count]; + + /* We MUST quote attribute values that have a ":" in them + and that not already quoted */ + if (asAttributes && [subValue length] > 2 + && [subValue rangeOfString: @":"].length + && [subValue characterAtIndex: 0] != '"' + && ![subValue hasSuffix: @"\""]) + subValue = [NSString stringWithFormat: @"\"%@\"", subValue]; + + escaped = [subValue escapedForCards]; + if ([escaped length] > 0) + { + [aString appendString: escaped]; + previousWasEmpty = NO; + rendered = YES; + } + else + previousWasEmpty = YES; + } + + return rendered; +} + +- (BOOL) _renderAsOrderedValuesInString: (NSMutableString *) aString + withKey: (NSString *) key +{ + NSUInteger count, max, lastRendered = 0; + BOOL rendered = NO; + NSArray *subValues; + NSMutableString *substring; + + max = [self count]; + for (count = 0; count < max; count++) + { + subValues = [self objectAtIndex: count]; + substring = [NSMutableString string]; + if ([subValues _renderAsSubValuesInString: substring + asAttributes: NO]) + { + if (lastRendered == 0 && [key length] > 0) + [aString appendFormat: @"%@=", key]; + + while (lastRendered < count) + { + [aString appendString: @";"]; + lastRendered++; + } + [aString appendString: substring]; + rendered = YES; + } + } + + return rendered; +} + +@end + @implementation NSDictionary (NGCardsExtension) - (id) objectForCaseInsensitiveKey: (NSString *) aKey @@ -37,4 +122,43 @@ return ((realKey) ? [self objectForKey: realKey] : nil); } +- (void) versitRenderInString: (NSMutableString *) aString + asAttributes: (BOOL) asAttributes +{ + NSArray *keys; + NSUInteger count, max, rendered = 0; + NSArray *orderedValues; + NSString *key; + NSMutableString *substring; + + keys = [self allKeys]; + max = [keys count]; + for (count = 0; count < max; count++) + { + key = [keys objectAtIndex: count]; + orderedValues = [self objectForKey: key]; + substring = [NSMutableString string]; + if (asAttributes) + { + if ([orderedValues _renderAsSubValuesInString: substring + asAttributes: YES]) + { + if (rendered > 0) + [aString appendString: @";"]; + [aString appendFormat: @"%@=%@", + [key uppercaseString], substring]; + rendered++; + } + } + else if ([orderedValues _renderAsOrderedValuesInString: substring + withKey: [key uppercaseString]]) + { + if (rendered > 0) + [aString appendString: @";"]; + [aString appendString: substring]; + rendered++; + } + } +} + @end diff --git a/SOPE/NGCards/NSString+NGCards.h b/SOPE/NGCards/NSString+NGCards.h index 1fdb9bfb0..b4cca93ff 100644 --- a/SOPE/NGCards/NSString+NGCards.h +++ b/SOPE/NGCards/NSString+NGCards.h @@ -27,6 +27,7 @@ @class NSArray; @class NSCalendarDate; +@class NSMutableDictionary; @class NSTimeZone; @interface NSString (NGCardsExtensions) @@ -40,7 +41,7 @@ - (NSCalendarDate *) asCalendarDate; - (BOOL) isAllDayDate; -- (NSArray *) vCardSubvaluesWithSeparator: (unichar) separator; +- (NSMutableDictionary *) vCardSubvalues; @end diff --git a/SOPE/NGCards/NSString+NGCards.m b/SOPE/NGCards/NSString+NGCards.m index 7614e100a..e46b2e29d 100644 --- a/SOPE/NGCards/NSString+NGCards.m +++ b/SOPE/NGCards/NSString+NGCards.m @@ -21,6 +21,7 @@ */ #import +#import #import #import #import @@ -316,25 +317,35 @@ return ([self length] == 8); } -- (NSArray *) vCardSubvaluesWithSeparator: (unichar) separator +- (NSMutableDictionary *) vCardSubvalues { - NSMutableArray *components; + /* This schema enables things like this: + ELEM;...:KEY1=subvalue1;KEY2=subvalue1,subvalue2 + or + ELEM;...:subvalue1;subvalue1,subvalue2 (where KEY = @"") */ + NSMutableDictionary *values; /* key <> ordered values associations */ + NSMutableArray *orderedValues = nil; /* those are separated by ';' and contain + subvalues, may or may not be named */ + NSMutableArray *subValues = nil; /* those are separeted by ',' */ unichar *stringBuffer, *substringBuffer; - NSString *substring; + NSString *valuesKey, *substring; unichar currentChar; NSUInteger substringLength, count, max; - BOOL escaped; + BOOL escaped = NO; - components = [NSMutableArray arrayWithCapacity: 5]; + values = [NSMutableDictionary dictionary]; + valuesKey = @""; max = [self length]; - stringBuffer = NSZoneMalloc (NULL, sizeof (unichar) * max); + stringBuffer = NSZoneMalloc (NULL, sizeof (unichar) * max + 1); [self getCharacters: stringBuffer]; - substringLength = 0; - escaped = NO; + stringBuffer[max] = 0; substringBuffer = NSZoneMalloc (NULL, sizeof (unichar) * max); + substringLength = 0; + max += 1; /* we add one step to force the inclusion of the ending '\0' in + the loop */ for (count = 0; count < max; count++) { currentChar = stringBuffer[count]; @@ -343,7 +354,7 @@ escaped = NO; if (currentChar == 'n' || currentChar == 'N') substringBuffer[substringLength] = '\n'; - else if (currentChar == 'r') + else if (currentChar == 'r' || currentChar == 'R') substringBuffer[substringLength] = '\r'; else substringBuffer[substringLength] = currentChar; @@ -353,16 +364,48 @@ { if (currentChar == '\\') escaped = YES; - else if (currentChar == separator) + else if (currentChar == ',' || currentChar == ';' || currentChar == 0) { substring - = [[NSString alloc] initWithCharactersNoCopy: substringBuffer - length: substringLength - freeWhenDone: YES]; - [components addObject: substring]; - [substring release]; - substringBuffer = NSZoneMalloc (NULL, sizeof (unichar) * max); + = [[NSString alloc] initWithCharacters: substringBuffer + length: substringLength]; substringLength = 0; + + orderedValues = [values objectForKey: valuesKey]; + if (!orderedValues) + { + orderedValues = [NSMutableArray new]; + [values setObject: orderedValues forKey: valuesKey]; + [orderedValues release]; + } + if (!subValues) + { + subValues = [NSMutableArray new]; + [orderedValues addObject: subValues]; + [subValues release]; + } + if ([substring length] > 0) + [subValues addObject: substring]; + [substring release]; + + if (currentChar != ',') + { + orderedValues = nil; + subValues = nil; + valuesKey = @""; + } + } + /* hack: 16 chars is an arbitrary limit to distinguish between + "named properties" and the base64 padding character. This might + need further tweaking... */ + else if (currentChar == '=' && substringLength < 16) + { + substring + = [[NSString alloc] initWithCharacters: substringBuffer + length: substringLength]; + [substring autorelease]; + substringLength = 0; + valuesKey = [substring lowercaseString]; } else { @@ -372,21 +415,12 @@ } } - if (substringLength > 0) - { - substring = [[NSString alloc] initWithCharactersNoCopy: substringBuffer - length: substringLength - freeWhenDone: YES]; - [components addObject: substring]; - [substring release]; - } - NSZoneFree (NULL, stringBuffer); + NSZoneFree (NULL, substringBuffer); - return components; + return values; } - - (NSString *) rfc822Email { unsigned idx; diff --git a/SOPE/NGCards/iCalAlarm.m b/SOPE/NGCards/iCalAlarm.m index 2eab33947..7922f567a 100644 --- a/SOPE/NGCards/iCalAlarm.m +++ b/SOPE/NGCards/iCalAlarm.m @@ -82,41 +82,41 @@ - (void) setAction: (NSString *) _value { - [[self uniqueChildWithTag: @"action"] setValue: 0 - to: _value]; + [[self uniqueChildWithTag: @"action"] setSingleValue: _value + forKey: @""]; } - (NSString *) action { - return [[self uniqueChildWithTag: @"action"] value: 0]; + return [[self uniqueChildWithTag: @"action"] flattenedValuesForKey: @""]; } - (void) setSummary: (NSString *) _value { - [[self uniqueChildWithTag: @"summary"] setValue: 0 - to: _value]; + [[self uniqueChildWithTag: @"summary"] setSingleValue: _value + forKey: @""]; } - (NSString *) summary { - return [[self uniqueChildWithTag: @"summary"] value: 0]; + return [[self uniqueChildWithTag: @"summary"] flattenedValuesForKey: @""]; } - (void) setComment: (NSString *) _value { - [[self uniqueChildWithTag: @"description"] setValue: 0 - to: _value]; + [[self uniqueChildWithTag: @"description"] setSingleValue: _value + forKey: @""]; } - (NSString *) comment { - return [[self uniqueChildWithTag: @"description"] value: 0]; + return [[self uniqueChildWithTag: @"description"] flattenedValuesForKey: @""]; } -- (void) setRecurrenceRule: (NSString *) _recurrenceRule +- (void) setRecurrenceRule: (NSString *) _value { - [[self uniqueChildWithTag: @"rrule"] setValue: 0 - to: _recurrenceRule]; + [[self uniqueChildWithTag: @"rrule"] setSingleValue: _value + forKey: @""]; } - (void) setAttendees: (NSArray *) attendees @@ -137,7 +137,7 @@ - (NSString *) recurrenceRule { - return [[self uniqueChildWithTag: @"rrule"] value: 0]; + return [[self uniqueChildWithTag: @"rrule"] flattenedValuesForKey: @""]; } - (NSCalendarDate *) nextAlarmDate @@ -161,7 +161,8 @@ == NSOrderedSame) { relation = [aTrigger relationType]; - anInterval = [[aTrigger value] durationAsTimeInterval]; + anInterval = [[aTrigger flattenedValuesForKey: @""] + durationAsTimeInterval]; if ([relation caseInsensitiveCompare: @"END"] == NSOrderedSame) { if ([parent isKindOfClass: [iCalEvent class]]) diff --git a/SOPE/NGCards/iCalAttachment.h b/SOPE/NGCards/iCalAttachment.h index 0b326b7ca..ccba3cdb2 100644 --- a/SOPE/NGCards/iCalAttachment.h +++ b/SOPE/NGCards/iCalAttachment.h @@ -28,9 +28,6 @@ @interface iCalAttachment : CardElement -- (void) setValue: (NSString *) aValue; -- (NSString *) value; - - (void) setValueType: (NSString *) aType; - (NSString *) valueType; diff --git a/SOPE/NGCards/iCalAttachment.m b/SOPE/NGCards/iCalAttachment.m index 6963abd69..c46084986 100644 --- a/SOPE/NGCards/iCalAttachment.m +++ b/SOPE/NGCards/iCalAttachment.m @@ -26,16 +26,6 @@ /* accessors */ -- (void) setValue: (NSString *) _value -{ - [self setValue: 0 to: _value]; -} - -- (NSString *) value -{ - return [self value: 0]; -} - - (void) setValueType: (NSString *) _value { [self setValue: 0 ofAttribute: @"type" to: _value]; diff --git a/SOPE/NGCards/iCalCalendar.m b/SOPE/NGCards/iCalCalendar.m index da567a1d5..75b266641 100644 --- a/SOPE/NGCards/iCalCalendar.m +++ b/SOPE/NGCards/iCalCalendar.m @@ -69,45 +69,44 @@ /* accessors */ -- (void) setCalscale: (NSString *) _calscale +- (void) setCalscale: (NSString *) _value { - [[self uniqueChildWithTag: @"calscale"] setValue: 0 to: _calscale]; + [[self uniqueChildWithTag: @"calscale"] setSingleValue: _value forKey: @""]; } - (NSString *) calscale { - return [[self uniqueChildWithTag: @"calscale"] value: 0]; + return [[self uniqueChildWithTag: @"calscale"] flattenedValuesForKey: @""]; } -- (void) setVersion: (NSString *) _version +- (void) setVersion: (NSString *) _value { - [[self uniqueChildWithTag: @"version"] setValue: 0 to: _version]; + [[self uniqueChildWithTag: @"version"] setSingleValue: _value forKey: @""]; } - (NSString *) version { - return [[self uniqueChildWithTag: @"version"] value: 0]; + return [[self uniqueChildWithTag: @"version"] flattenedValuesForKey: @""]; } - (void) setProdID: (NSString *) _value { - [[self uniqueChildWithTag: @"prodid"] setValue: 0 to: _value]; + [[self uniqueChildWithTag: @"prodid"] setSingleValue: _value forKey: @""]; } - (NSString *) prodId { - return [[self uniqueChildWithTag: @"prodid"] value: 0]; + return [[self uniqueChildWithTag: @"prodid"] flattenedValuesForKey: @""]; } - (void) setMethod: (NSString *) _value { - [[self uniqueChildWithTag: @"method"] setValue: 0 - to: [_value uppercaseString]]; + [[self uniqueChildWithTag: @"method"] setSingleValue: _value forKey: @""]; } - (NSString *) method { - return [[self uniqueChildWithTag: @"method"] value: 0]; + return [[self uniqueChildWithTag: @"method"] flattenedValuesForKey: @""]; } - (void) addToEvents: (iCalEvent *) _event diff --git a/SOPE/NGCards/iCalDateTime.m b/SOPE/NGCards/iCalDateTime.m index f572f9881..251c46d0a 100644 --- a/SOPE/NGCards/iCalDateTime.m +++ b/SOPE/NGCards/iCalDateTime.m @@ -137,7 +137,7 @@ else timeString = @""; - [self setValue: 0 to: timeString]; + [self setSingleValue: timeString forKey: @""]; } - (void) setDateTime: (NSCalendarDate *) dateTime @@ -160,15 +160,17 @@ iCalTimeZone *iTZ; NSString *date; NSCalendarDate *initialDate, *dateTime; + NSArray *subValues; NSMutableArray *dates; //NSTimeZone *tz; unsigned count, i; - count = [[self values] count]; + subValues = [self valuesAtIndex: 0 forKey: @""]; + count = [subValues count]; dates = [NSMutableArray arrayWithCapacity: count]; for (i = 0; i < count; i++) { - date = [self value: i]; + date = [subValues objectAtIndex: i]; iTZ = [self timeZone]; if (iTZ) @@ -204,7 +206,7 @@ - (BOOL) isAllDay { - return [[self value: 0] isAllDayDate]; + return [[self flattenedValuesForKey: @""] isAllDayDate]; } @end diff --git a/SOPE/NGCards/iCalEntityObject.h b/SOPE/NGCards/iCalEntityObject.h index 36491e206..0fd9dc4f2 100644 --- a/SOPE/NGCards/iCalEntityObject.h +++ b/SOPE/NGCards/iCalEntityObject.h @@ -67,8 +67,8 @@ typedef enum - (void) setPriority: (NSString *) _value; - (NSString *) priority; -- (void) setCategories: (NSString *) _value; -- (NSString *)categories; +- (void) setCategories: (NSArray *) _value; +- (NSArray *) categories; - (void) setUserComment: (NSString *) _userComment; - (NSString *) userComment; diff --git a/SOPE/NGCards/iCalEntityObject.m b/SOPE/NGCards/iCalEntityObject.m index 9aba6a262..446eab0ef 100644 --- a/SOPE/NGCards/iCalEntityObject.m +++ b/SOPE/NGCards/iCalEntityObject.m @@ -72,55 +72,55 @@ /* accessors */ -- (void) setUid: (NSString *) _uid +- (void) setUid: (NSString *) _value { - [[self uniqueChildWithTag: @"uid"] setValue: 0 to: _uid]; + [[self uniqueChildWithTag: @"uid"] setSingleValue: _value forKey: @""]; } - (NSString *) uid { - return [[self uniqueChildWithTag: @"uid"] value: 0]; + return [[self uniqueChildWithTag: @"uid"] flattenedValuesForKey: @""]; } - (void) setSummary: (NSString *) _value { - [[self uniqueChildWithTag: @"summary"] setValue: 0 to: _value]; + [[self uniqueChildWithTag: @"summary"] setSingleValue: _value forKey: @""]; } - (NSString *) summary { - return [[self uniqueChildWithTag: @"summary"] value: 0]; + return [[self uniqueChildWithTag: @"summary"] flattenedValuesForKey: @""]; } - (void) setLocation: (NSString *) _value { - [[self uniqueChildWithTag: @"location"] setValue: 0 to: _value]; + [[self uniqueChildWithTag: @"location"] setSingleValue: _value forKey: @""]; } - (NSString *) location { - return [[self uniqueChildWithTag: @"location"] value: 0]; + return [[self uniqueChildWithTag: @"location"] flattenedValuesForKey: @""]; } #warning the "comment" accessors are actually "description" accessors, the "comment" ones are missing - (void) setComment: (NSString *) _value { - [[self uniqueChildWithTag: @"description"] setValue: 0 to: _value]; + [[self uniqueChildWithTag: @"description"] setSingleValue: _value forKey: @""]; } - (NSString *) comment { - return [[self uniqueChildWithTag: @"description"] value: 0]; + return [[self uniqueChildWithTag: @"description"] flattenedValuesForKey: @""]; } - (void) setAccessClass: (NSString *) _value { - [[self uniqueChildWithTag: @"class"] setValue: 0 to: _value]; + [[self uniqueChildWithTag: @"class"] setSingleValue: _value forKey: @""]; } - (NSString *) accessClass { - return [[self uniqueChildWithTag: @"class"] value: 0]; + return [[self uniqueChildWithTag: @"class"] flattenedValuesForKey: @""]; } - (iCalAccessClass) symbolicAccessClass @@ -146,42 +146,47 @@ - (void) setPriority: (NSString *) _value { - [[self uniqueChildWithTag: @"priority"] setValue: 0 to: _value]; + [[self uniqueChildWithTag: @"priority"] setSingleValue: _value forKey: @""]; } - (NSString *) priority { - return [[self uniqueChildWithTag: @"priority"] value: 0]; + return [[self uniqueChildWithTag: @"priority"] flattenedValuesForKey: @""]; } -- (void) setCategories: (NSString *) _value +- (void) setCategories: (NSArray *) _value { - [[self uniqueChildWithTag: @"categories"] setValue: 0 to: _value]; + NSMutableArray *copy; + + copy = [_value mutableCopy]; + [[self uniqueChildWithTag: @"categories"] setValues: copy atIndex: 0 + forKey: @""]; + [copy release]; } -- (NSString *) categories +- (NSArray *) categories { - return [[self uniqueChildWithTag: @"categories"] value: 0]; + return [[self uniqueChildWithTag: @"categories"] valuesAtIndex: 0 forKey: @""]; } - (void) setUserComment: (NSString *) _value { - [[self uniqueChildWithTag: @"usercomment"] setValue: 0 to: _value]; + [[self uniqueChildWithTag: @"usercomment"] setSingleValue: _value forKey: @""]; } - (NSString *) userComment { - return [[self uniqueChildWithTag: @"usercomment"] value: 0]; + return [[self uniqueChildWithTag: @"usercomment"] flattenedValuesForKey: @""]; } - (void) setStatus: (NSString *) _value { - [[self uniqueChildWithTag: @"status"] setValue: 0 to: _value]; + [[self uniqueChildWithTag: @"status"] setSingleValue: _value forKey: @""]; } - (NSString *) status { - return [[self uniqueChildWithTag: @"status"] value: 0]; + return [[self uniqueChildWithTag: @"status"] flattenedValuesForKey: @""]; } - (void) setSequence: (NSNumber *)_value @@ -189,15 +194,15 @@ NSString *sequence; sequence = [NSString stringWithFormat: @"%@", _value]; - [[self uniqueChildWithTag: @"sequence"] setValue: 0 - to: sequence];; + [[self uniqueChildWithTag: @"sequence"] setSingleValue: sequence + forKey: @""]; } - (NSNumber *) sequence { NSString *sequence; - sequence = [[self uniqueChildWithTag: @"sequence"] value: 0]; + sequence = [[self uniqueChildWithTag: @"sequence"] flattenedValuesForKey: @""]; return [NSNumber numberWithInt: [sequence intValue]]; } @@ -391,16 +396,16 @@ - (void) setAttach: (id) _value { - NSString *asString; + NSString *aString; if ([_value isKindOfClass: [NSString class]]) - asString = _value; + aString = _value; else if ([_value isKindOfClass: [NSURL class]]) - asString = [_value absoluteString]; + aString = [_value absoluteString]; else - asString = @""; + aString = @""; - [[self uniqueChildWithTag: @"attach"] setValue: 0 to: asString]; + [[self uniqueChildWithTag: @"attach"] setSingleValue: aString forKey: @""]; } - (NSURL *) attach @@ -408,7 +413,7 @@ NSString *stringAttach; NSURL *url; - stringAttach = [[self uniqueChildWithTag: @"attach"] value: 0]; + stringAttach = [[self uniqueChildWithTag: @"attach"] flattenedValuesForKey: @""]; url = [NSURL URLWithString: stringAttach]; if (!url && [stringAttach length] > 0) @@ -419,23 +424,23 @@ - (void) setUrl: (id) _value { - NSString *asString; + NSString *aString; if ([_value isKindOfClass: [NSString class]]) - asString = _value; + aString = _value; else if ([_value isKindOfClass: [NSURL class]]) - asString = [_value absoluteString]; + aString = [_value absoluteString]; else - asString = @""; + aString = @""; - [[self uniqueChildWithTag: @"url"] setValue: 0 to: asString]; + [[self uniqueChildWithTag: @"url"] setSingleValue: aString forKey: @""]; } - (NSURL *) url { NSString *stringUrl; - stringUrl = [[self uniqueChildWithTag: @"url"] value: 0]; + stringUrl = [[self uniqueChildWithTag: @"url"] flattenedValuesForKey: @""]; return [NSURL URLWithString: stringUrl]; } diff --git a/SOPE/NGCards/iCalEvent.m b/SOPE/NGCards/iCalEvent.m index e8754c869..9d230a2d7 100644 --- a/SOPE/NGCards/iCalEvent.m +++ b/SOPE/NGCards/iCalEvent.m @@ -104,13 +104,12 @@ - (void) setDuration: (NSString *) _value { - [[self uniqueChildWithTag: @"duration"] setValue: 0 - to: _value]; + [[self uniqueChildWithTag: @"duration"] setSingleValue: _value forKey: @""]; } - (NSString *) duration { - return [[self uniqueChildWithTag: @"duration"] value: 0]; + return [[self uniqueChildWithTag: @"duration"] flattenedValuesForKey: @""]; } - (BOOL) hasDuration @@ -148,15 +147,14 @@ return interval; } -- (void) setTransparency: (NSString *) _transparency +- (void) setTransparency: (NSString *) _value { - [[self uniqueChildWithTag: @"transp"] setValue: 0 - to: _transparency]; + [[self uniqueChildWithTag: @"transp"] setSingleValue: _value forKey: @""]; } - (NSString *) transparency { - return [[self uniqueChildWithTag: @"transp"] value: 0]; + return [[self uniqueChildWithTag: @"transp"] flattenedValuesForKey: @""]; } /* convenience */ diff --git a/SOPE/NGCards/iCalPerson.m b/SOPE/NGCards/iCalPerson.m index 9fc728e02..fbcc92570 100644 --- a/SOPE/NGCards/iCalPerson.m +++ b/SOPE/NGCards/iCalPerson.m @@ -57,13 +57,13 @@ { /* iCal.app compatibility: - "mailto" prefix must be in lowercase; */ - [self setValue: 0 - to: [NSString stringWithFormat: @"mailto:%@", _s]]; + [self setSingleValue: [NSString stringWithFormat: @"mailto:%@", _s] + forKey: @""]; } - (NSString *) email { - return [self value: 0]; + return [self flattenedValuesForKey: @""]; } - (NSString *) rfc822Email diff --git a/SOPE/NGCards/iCalRecurrenceRule.m b/SOPE/NGCards/iCalRecurrenceRule.m index 03238e42f..ff66370ab 100644 --- a/SOPE/NGCards/iCalRecurrenceRule.m +++ b/SOPE/NGCards/iCalRecurrenceRule.m @@ -194,6 +194,7 @@ #import "NSCalendarDate+NGCards.h" #import "NSString+NGCards.h" +#import "CardGroup.h" #import "iCalByDayMask.h" #import "iCalRecurrenceRule.h" @@ -234,8 +235,7 @@ NSString *iCalWeekDayString[] = { @"SU", @"MO", @"TU", @"WE", @"TH", @"FR", iCalRecurrenceRule *rule; rule = [self elementWithTag: @"rrule"]; - if ([_iCalRep length] > 0) - [rule addValues: [_iCalRep componentsSeparatedByString: @";"]]; + [rule setRrule: _iCalRep]; return rule; } @@ -269,15 +269,19 @@ NSString *iCalWeekDayString[] = { @"SU", @"MO", @"TU", @"WE", @"TH", @"FR", - (void) setRrule: (NSString *) _rrule { - NSEnumerator *newValues; - NSString *newValue; + CardGroup *mockParent; + NSString *wrappedRule; + CardElement *mockRule; - newValues = [[_rrule componentsSeparatedByString: @";"] objectEnumerator]; - newValue = [newValues nextObject]; - while (newValue) + if ([_rrule length] > 0) { - [self addValue: newValue]; - newValue = [newValues nextObject]; + wrappedRule = [NSString stringWithFormat: + @"BEGIN:MOCK\r\nRRULE:%@\r\nEND:MOCK", + _rrule]; + mockParent = [CardGroup parseSingleFromSource: wrappedRule]; + mockRule = [mockParent uniqueChildWithTag: @"rrule"]; + [values release]; + values = [[mockRule values] mutableCopy]; } } @@ -350,75 +354,73 @@ NSString *iCalWeekDayString[] = { @"SU", @"MO", @"TU", @"WE", @"TH", @"FR", - (void) setFrequency: (iCalRecurrenceFrequency) _frequency { - [self setNamedValue: @"freq" to: [self frequencyForValue: _frequency]]; + [self setSingleValue: [self frequencyForValue: _frequency] forKey: @"freq"]; } - (iCalRecurrenceFrequency) frequency { - return [self valueForFrequency: [self namedValue: @"freq"]]; -} - -- (void) setRepeatCount: (int) _repeatCount -{ - [self setNamedValue: @"count" - to: [NSString stringWithFormat: @"%d", _repeatCount]]; -} - -- (int) repeatCount -{ - return [[self namedValue: @"count"] intValue]; + return [self valueForFrequency: [self flattenedValuesForKey: @"freq"]]; } - (void) setUntilDate: (NSCalendarDate *) _untilDate { - [self setNamedValue: @"until" - to: [_untilDate icalString]]; + [self setSingleValue: [_untilDate icalString] forKey: @"until"]; } - (NSCalendarDate *) untilDate { #warning handling of default timezone needs to be implemented - return [[self namedValue: @"until"] asCalendarDate]; + return [[self flattenedValuesForKey: @"until"] asCalendarDate]; } - (void) setInterval: (NSString *) _interval { - if (_interval && [_interval intValue] == 1) - [self setNamedValue: @"interval" to: nil]; + if ([_interval intValue] < 2) + [self setSingleValue: nil forKey: @"interval"]; else - [self setNamedValue: @"interval" to: _interval]; -} - -- (void) setCount: (NSString *) _count -{ - [self setNamedValue: @"count" to: _count]; -} - -- (void) setUntil: (NSString *) _until -{ - [self setNamedValue: @"until" to: _until]; + [self setSingleValue: _interval forKey: @"interval"]; } - (void) setRepeatInterval: (int) _repeatInterval { - [self setNamedValue: @"interval" - to: [NSString stringWithFormat: @"%d", _repeatInterval]]; + [self setInterval: [NSString stringWithFormat: @"%d", _repeatInterval]]; } - (int) repeatInterval { int interval; - interval = [[self namedValue: @"interval"] intValue]; + interval = [[self flattenedValuesForKey: @"interval"] intValue]; if (interval < 1) interval = 1; return interval; } +- (void) setRepeatCount: (int) _repeatCount +{ + [self setSingleValue: [NSString stringWithFormat: @"%d", _repeatCount] + forKey: @"count"]; +} + +- (int) repeatCount +{ + return [[self flattenedValuesForKey: @"count"] intValue]; +} + +- (void) setCount: (NSString *) _count +{ + [self setSingleValue: _count forKey: @"count"]; +} + +- (void) setUntil: (NSString *) _until +{ + [self setSingleValue: _until forKey: @"until"]; +} + - (void) setWkst: (NSString *) _weekStart { - [self setNamedValue: @"wkst" to: _weekStart]; + [self setSingleValue: _weekStart forKey: @"wkst"]; } #warning we also should handle the user weekstarts @@ -426,7 +428,7 @@ NSString *iCalWeekDayString[] = { @"SU", @"MO", @"TU", @"WE", @"TH", @"FR", { NSString *start; - start = [self namedValue: @"wkst"]; + start = [self flattenedValuesForKey: @"wkst"]; if (![start length]) start = @"MO"; @@ -445,12 +447,16 @@ NSString *iCalWeekDayString[] = { @"SU", @"MO", @"TU", @"WE", @"TH", @"FR", - (void) setByDay: (NSString *) newByDay { - [self setNamedValue: @"byday" to: newByDay]; + NSMutableArray *byDays; + + byDays = [[newByDay componentsSeparatedByString: @","] mutableCopy]; + [self setValues: byDays atIndex: 0 forKey: @"byday"]; + [byDays release]; } - (NSString *) byDay { - return [self namedValue: @"byday"]; + return [self flattenedValuesForKey: @"byday"]; } - (void) setByDayMask: (iCalByDayMask *) newByDayMask @@ -472,12 +478,9 @@ NSString *iCalWeekDayString[] = { @"SU", @"MO", @"TU", @"WE", @"TH", @"FR", - (NSArray *) byMonthDay { NSArray *byMonthDay; - NSString *byMonthDayStr; - byMonthDayStr = [self namedValue: @"bymonthday"]; - if ([byMonthDayStr length]) - byMonthDay = [byMonthDayStr componentsSeparatedByString: @","]; - else + byMonthDay = [self valuesAtIndex: 0 forKey: @"bymonthday"]; + if (![byMonthDay count]) byMonthDay = nil; return byMonthDay; @@ -486,12 +489,9 @@ NSString *iCalWeekDayString[] = { @"SU", @"MO", @"TU", @"WE", @"TH", @"FR", - (NSArray *) byMonth { NSArray *byMonth; - NSString *byMonthStr; - byMonthStr = [self namedValue: @"bymonth"]; - if ([byMonthStr length]) - byMonth = [byMonthStr componentsSeparatedByString: @","]; - else + byMonth = [self valuesAtIndex: 0 forKey: @"bymonth"]; + if (![byMonth count]) byMonth = nil; return byMonth; @@ -507,9 +507,9 @@ NSString *iCalWeekDayString[] = { @"SU", @"MO", @"TU", @"WE", @"TH", @"FR", * - BYSECOND * - BYSETPOS */ - return ([[self namedValue: @"bymonthday"] length] || - [[self namedValue: @"byday"] length] || - [[self namedValue: @"bymonth"] length]); + return ([[self valuesAtIndex: 0 forKey: @"bymonthday"] count] || + [[self valuesAtIndex: 0 forKey: @"byday"] count] || + [[self valuesAtIndex: 0 forKey: @"bymonth"] count]); } - (BOOL) isInfinite diff --git a/SOPE/NGCards/iCalRepeatableEntityObject.m b/SOPE/NGCards/iCalRepeatableEntityObject.m index a6e485a86..b2e9a00e6 100644 --- a/SOPE/NGCards/iCalRepeatableEntityObject.m +++ b/SOPE/NGCards/iCalRepeatableEntityObject.m @@ -247,7 +247,7 @@ while ((dateString = [dateList nextObject])) { - exDates = [(iCalDateTime*) dateString values]; + exDates = [(iCalDateTime*) dateString valuesAtIndex: 0 forKey: @""]; for (i = 0; i < [exDates count]; i++) { dateString = [exDates objectAtIndex: i]; diff --git a/SOPE/NGCards/iCalTimeZone.m b/SOPE/NGCards/iCalTimeZone.m index 510db0759..9e645af09 100644 --- a/SOPE/NGCards/iCalTimeZone.m +++ b/SOPE/NGCards/iCalTimeZone.m @@ -179,12 +179,12 @@ static NSArray *knownTimeZones; - (void) setTzId: (NSString *) tzId { - [[self uniqueChildWithTag: @"tzid"] setValue: 0 to: tzId]; + [[self uniqueChildWithTag: @"tzid"] setSingleValue: tzId forKey: @""]; } - (NSString *) tzId { - return [[self uniqueChildWithTag: @"tzid"] value: 0]; + return [[self uniqueChildWithTag: @"tzid"] flattenedValuesForKey: @""]; } - (NSCalendarDate *) _occurrenceForPeriodNamed: (NSString *) pName diff --git a/SOPE/NGCards/iCalTimeZonePeriod.m b/SOPE/NGCards/iCalTimeZonePeriod.m index 7a774ca99..b161f55ab 100644 --- a/SOPE/NGCards/iCalTimeZonePeriod.m +++ b/SOPE/NGCards/iCalTimeZonePeriod.m @@ -20,6 +20,7 @@ * Boston, MA 02111-1307, USA. */ +#import #import #import #import @@ -63,7 +64,7 @@ seconds = 0; offsetTo = [[self uniqueChildWithTag: offsetName] - value: 0]; + flattenedValuesForKey: @""]; length = [offsetTo length]; negative = [offsetTo hasPrefix: @"-"]; if (negative) @@ -140,7 +141,7 @@ [tzStart setTimeZone: [NSTimeZone timeZoneWithName: @"GMT"]]; tmpDate = [NSCalendarDate dateWithYear: [refDate yearOfCommonEra] - month: [[rrule namedValue: @"bymonth"] intValue] + month: [[[rrule byMonth] objectAtIndex: 0] intValue] day: 1 hour: [tzStart hourOfDay] minute: [tzStart minuteOfHour] second: 0 timeZone: [NSTimeZone timeZoneWithName: @"GMT"]]; diff --git a/SOPE/NGCards/iCalToDo.m b/SOPE/NGCards/iCalToDo.m index 21a01560b..08f5d3f7b 100644 --- a/SOPE/NGCards/iCalToDo.m +++ b/SOPE/NGCards/iCalToDo.m @@ -47,13 +47,14 @@ - (void) setPercentComplete: (NSString *) _value { - [[self uniqueChildWithTag: @"percent-complete"] setValue: 0 - to: _value]; + [[self uniqueChildWithTag: @"percent-complete"] setSingleValue: _value + forKey: @""]; } - (NSString *) percentComplete { - return [[self uniqueChildWithTag: @"percent-complete"] value: 0]; + return [[self uniqueChildWithTag: @"percent-complete"] + flattenedValuesForKey: @""]; } - (void) setDue: (NSCalendarDate *) newDueDate diff --git a/SOPE/NGCards/iCalTrigger.h b/SOPE/NGCards/iCalTrigger.h index a7e12f39a..e1a446fcd 100644 --- a/SOPE/NGCards/iCalTrigger.h +++ b/SOPE/NGCards/iCalTrigger.h @@ -26,9 +26,6 @@ @interface iCalTrigger : CardElement -- (void) setValue: (NSString *) theValue; -- (NSString *) value; - - (void) setValueType: (NSString *) theType; - (NSString *) valueType; diff --git a/SOPE/NGCards/iCalTrigger.m b/SOPE/NGCards/iCalTrigger.m index f9e590e0b..11efcd4e2 100644 --- a/SOPE/NGCards/iCalTrigger.m +++ b/SOPE/NGCards/iCalTrigger.m @@ -27,16 +27,6 @@ /* accessors */ -- (void) setValue: (NSString *) theValue -{ - [self setValue: 0 to: theValue]; -} - -- (NSString *) value -{ - return [self value: 0]; -} - - (void) setValueType: (NSString *) theValue { [self setValue: 0 ofAttribute: @"value" to: theValue]; diff --git a/SOPE/NGCards/iCalXMLRenderer.m b/SOPE/NGCards/iCalXMLRenderer.m index 1911ef76a..b31f57018 100644 --- a/SOPE/NGCards/iCalXMLRenderer.m +++ b/SOPE/NGCards/iCalXMLRenderer.m @@ -21,7 +21,7 @@ */ /* This class implements most of the XML iCalendar spec as defined here: - http://tools.ietf.org/html/draft-daboo-et-al-icalendar-in-xml-04 */ + http://tools.ietf.org/html/rfc6321 */ #import #import @@ -161,28 +161,38 @@ - (NSString *) _xmlRenderValue { NSMutableString *rendering; - NSString *valueTag, *currentValue; - int count, max; - BOOL displayed; + NSArray *keys, *orderedValues, *subValues; + NSString *key, *valueTag; + NSUInteger count, max, oCount, oMax, sCount, sMax; + +#warning this code should be fix to comply better with the RFC + rendering = [NSMutableString stringWithCapacity: 64]; valueTag = [self xmlValueTag]; - rendering = [NSMutableString stringWithCapacity: 64]; - max = [values count]; - displayed = NO; + + keys = [values allKeys]; + max = [keys count]; for (count = 0; count < max; count++) { - currentValue = [[values objectAtIndex: count] - stringByEscapingXMLString]; - if ([currentValue length] > 0) + key = [keys objectAtIndex: count]; + orderedValues = [values objectForKey: key]; + oMax = [orderedValues count]; + for (oCount = 0; oCount < oMax; oCount++) { - if (!displayed) - { - [self _appendPaddingValues: count withTag: valueTag - intoString: rendering]; - displayed = YES; - } - [rendering appendFormat: @"<%@>%@", - valueTag, currentValue, valueTag]; + if ([key length] > 0) + [rendering appendFormat: @"<%@>", [key lowercaseString]]; + else + [rendering appendFormat: @"<%@>", valueTag]; + + subValues = [orderedValues objectAtIndex: oCount]; + sMax = [subValues count]; + for (sCount = 0; sCount < sMax; sCount++) + [rendering appendString: [[subValues objectAtIndex: sCount] stringByEscapingXMLString]]; + + if ([key length] > 0) + [rendering appendFormat: @"", [key lowercaseString]]; + else + [rendering appendFormat: @"", valueTag]; } } @@ -247,39 +257,39 @@ @end -@implementation iCalRecurrenceRule (iCalXMLExtension) +// @implementation iCalRecurrenceRule (iCalXMLExtension) -- (NSString *) _xmlRenderValue -{ - NSMutableString *rendering; - NSArray *valueParts; - NSString *valueTag, *currentValue; - int count, max; +// - (NSString *) _xmlRenderValue +// { +// NSMutableString *rendering; +// NSArray *valueParts; +// NSString *valueTag, *currentValue; +// int count, max; - max = [values count]; - rendering = [NSMutableString stringWithCapacity: 64]; - for (count = 0; count < max; count++) - { - currentValue = [[values objectAtIndex: count] - stringByEscapingXMLString]; - if ([currentValue length] > 0) - { - valueParts = [currentValue componentsSeparatedByString: @"="]; - if ([valueParts count] == 2) - { - valueTag = [[valueParts objectAtIndex: 0] lowercaseString]; - [rendering appendFormat: @"<%@>%@", - valueTag, - [valueParts objectAtIndex: 1], - valueTag]; - } - } - } +// max = [values count]; +// rendering = [NSMutableString stringWithCapacity: 64]; +// for (count = 0; count < max; count++) +// { +// currentValue = [[values objectAtIndex: count] +// stringByEscapingXMLString]; +// if ([currentValue length] > 0) +// { +// valueParts = [currentValue componentsSeparatedByString: @"="]; +// if ([valueParts count] == 2) +// { +// valueTag = [[valueParts objectAtIndex: 0] lowercaseString]; +// [rendering appendFormat: @"<%@>%@", +// valueTag, +// [valueParts objectAtIndex: 1], +// valueTag]; +// } +// } +// } - return rendering; -} +// return rendering; +// } -@end +// @end @implementation iCalUTCOffset (iCalXMLExtension) diff --git a/SoObjects/Appointments/SOGoAppointmentFolder.m b/SoObjects/Appointments/SOGoAppointmentFolder.m index 5561a004e..37d24370a 100644 --- a/SoObjects/Appointments/SOGoAppointmentFolder.m +++ b/SoObjects/Appointments/SOGoAppointmentFolder.m @@ -857,8 +857,9 @@ firstInstanceCalendarDateRange: (NGCalendarDateRange *) fir NSArray *rules, *exRules, *exDates, *ranges; NSArray *elements, *components; NSString *content; + NSCalendarDate *checkStartDate, *checkEndDate, *firstStartDate, + *firstEndDate; iCalDateTime *dtstart; - NSCalendarDate *checkStartDate, *checkEndDate, *firstStartDate, *firstEndDate; iCalEvent *component; iCalTimeZone *eventTimeZone; unsigned count, max, offset; @@ -898,8 +899,8 @@ firstInstanceCalendarDateRange: (NGCalendarDateRange *) fir { // Retrieve the range of the first/master event component = [components objectAtIndex: 0]; - dtstart = (iCalDateTime *)[component uniqueChildWithTag: @"dtstart"]; - firstStartDate = [[[dtstart values] lastObject] asCalendarDate]; + dtstart = (iCalDateTime *) [component uniqueChildWithTag: @"dtstart"]; + firstStartDate = [dtstart dateTime]; firstEndDate = [firstStartDate addTimeInterval: [component occurenceInterval]]; firstRange = [NGCalendarDateRange calendarDateRangeWithStartDate: firstStartDate @@ -2655,7 +2656,7 @@ firstInstanceCalendarDateRange: (NGCalendarDateRange *) fir tz = nil; element = [components objectAtIndex: i]; // Use the timezone of the start date. - startDate = (iCalDateTime *)[element uniqueChildWithTag: @"dtstart"]; + startDate = (iCalDateTime *) [element uniqueChildWithTag: @"dtstart"]; if (startDate) { timezone = [startDate timeZone]; diff --git a/SoObjects/Appointments/iCalEvent+SOGo.m b/SoObjects/Appointments/iCalEvent+SOGo.m index 4cb974c1e..a9b4e1a76 100644 --- a/SoObjects/Appointments/iCalEvent+SOGo.m +++ b/SoObjects/Appointments/iCalEvent+SOGo.m @@ -271,21 +271,16 @@ */ - (NGCalendarDateRange *) firstOccurenceRange { - iCalDateTime *firstStartDate; NSCalendarDate *start, *end; NGCalendarDateRange *firstRange; firstRange = nil; - firstStartDate = (iCalDateTime *)[self uniqueChildWithTag: @"dtstart"]; - if ([[firstStartDate values] count] > 0) - { - start = [[[firstStartDate values] lastObject] asCalendarDate]; - end = [start addTimeInterval: [self occurenceInterval]]; + start = [self startDate]; + end = [start addTimeInterval: [self occurenceInterval]]; - firstRange = [NGCalendarDateRange calendarDateRangeWithStartDate: start - endDate: end]; - } + firstRange = [NGCalendarDateRange calendarDateRangeWithStartDate: start + endDate: end]; return firstRange; } diff --git a/SoObjects/Appointments/iCalRepeatableEntityObject+SOGo.m b/SoObjects/Appointments/iCalRepeatableEntityObject+SOGo.m index 00276a1d6..e57d02faf 100644 --- a/SoObjects/Appointments/iCalRepeatableEntityObject+SOGo.m +++ b/SoObjects/Appointments/iCalRepeatableEntityObject+SOGo.m @@ -27,10 +27,12 @@ #import #import +#import #import #import #import #import +#import #import #import "iCalRepeatableEntityObject+SOGo.h" @@ -40,10 +42,12 @@ - (NSArray *) _indexedRules: (NSArray *) rules { NSMutableArray *ma; - unsigned int i, count; - NSString *valuesString; + NSUInteger i, count; + NSMutableString *ruleString; iCalRecurrenceRule *rule; +#warning we could return an NSArray instead and feed it as such to the iCalRecurrenceRule in SOGoAppointmentFolder... + ma = nil; count = [rules count]; @@ -53,9 +57,11 @@ for (i = 0; i < count; i++) { rule = [rules objectAtIndex:i]; -#warning we could return an NSArray instead and feed it as such to the iCalRecurrenceRule in SOGoAppointmentFolder... - valuesString = [[rule values] componentsJoinedByString: @";"]; - [ma addObject: valuesString]; + ruleString = [NSMutableString new]; + [[rule values] versitRenderInString: ruleString + asAttributes: NO]; + [ma addObject: ruleString]; + [ruleString release]; } } @@ -138,7 +144,7 @@ else { startDate = theOccurenceDate; - if ([self isAllDay]) + if ([self isKindOfClass: [iCalEvent class]] && [(iCalEvent *) self isAllDay]) { // The event lasts all-day and has no timezone (floating); we convert the range of the first event // to the occurence's timezone. diff --git a/SoObjects/Contacts/NGVCard+SOGo.m b/SoObjects/Contacts/NGVCard+SOGo.m index 7f0a72dc5..811ade06d 100644 --- a/SoObjects/Contacts/NGVCard+SOGo.m +++ b/SoObjects/Contacts/NGVCard+SOGo.m @@ -38,6 +38,7 @@ NSArray *array; NSMutableArray *marray; NSMutableDictionary *entry; + CardElement *element; id tmp; entry = [NSMutableDictionary dictionary]; @@ -49,13 +50,14 @@ @"organizationalPerson", @"inetOrgPerson", @"mozillaAbPersonObsolete", nil] forKey: @"objectclass"]; - - tmp = ([[self n] count] > 1 ? [[self n] objectAtIndex: 1] : nil); - if (tmp) + + element = [self n]; + tmp = [element flattenedValueAtIndex: 1 forKey: @""]; + if ([tmp length] > 0) [entry setObject: tmp forKey: @"givenName"]; - tmp = ([[self n] count] ? [[self n] objectAtIndex: 0] : nil); - if (tmp) + tmp = [element flattenedValueAtIndex: 0 forKey: @""]; + if ([tmp length] > 0) [entry setObject: tmp forKey: @"sn"]; tmp = [self fn]; @@ -74,11 +76,12 @@ marray = [NSMutableArray arrayWithArray: [self childrenWithTag: @"email"]]; [marray removeObjectsInArray: [self childrenWithTag: @"email" - andAttribute: @"type" - havingValue: @"pref"]]; + andAttribute: @"type" + havingValue: @"pref"]]; if ([marray count]) { - buffer = [[marray objectAtIndex: [marray count]-1] value: 0]; + buffer = [[marray objectAtIndex: [marray count]-1] + flattenedValuesForKey: @""]; if ([buffer caseInsensitiveCompare: [self preferredEMail]] != NSOrderedSame) [entry setObject: buffer forKey: @"mozillaSecondEmail"]; @@ -86,58 +89,75 @@ array = [self childrenWithTag: @"tel" andAttribute: @"type" havingValue: @"home"]; if ([array count]) - [entry setObject: [[array objectAtIndex: 0] value: 0] forKey: @"homePhone"]; + [entry setObject: [[array objectAtIndex: 0] flattenedValuesForKey: @""] + forKey: @"homePhone"]; array = [self childrenWithTag: @"tel" andAttribute: @"type" havingValue: @"fax"]; if ([array count]) - [entry setObject: [[array objectAtIndex: 0] value: 0] forKey: @"fax"]; + [entry setObject: [[array objectAtIndex: 0] flattenedValuesForKey: @""] + forKey: @"fax"]; array = [self childrenWithTag: @"tel" andAttribute: @"type" havingValue: @"cell"]; if ([array count]) - [entry setObject: [[array objectAtIndex: 0] value: 0] forKey: @"mobile"]; + [entry setObject: [[array objectAtIndex: 0] flattenedValuesForKey: @""] + forKey: @"mobile"]; array = [self childrenWithTag: @"tel" andAttribute: @"type" havingValue: @"pager"]; if ([array count]) - [entry setObject: [[array objectAtIndex: 0] value: 0] forKey: @"pager"]; + [entry setObject: [[array objectAtIndex: 0] flattenedValuesForKey: @""] + forKey: @"pager"]; array = [self childrenWithTag: @"adr" andAttribute: @"type" havingValue: @"home"]; if ([array count]) { tmp = [array objectAtIndex: 0]; - [entry setObject: [tmp value: 1] forKey: @"mozillaHomeStreet2"]; - [entry setObject: [tmp value: 2] forKey: @"homeStreet"]; - [entry setObject: [tmp value: 3] forKey: @"mozillaHomeLocalityName"]; - [entry setObject: [tmp value: 4] forKey: @"mozillaHomeState"]; - [entry setObject: [tmp value: 5] forKey: @"mozillaHomePostalCode"]; - [entry setObject: [tmp value: 6] forKey: @"mozillaHomeCountryName"]; + [entry setObject: [tmp flattenedValueAtIndex: 1 forKey: @""] + forKey: @"mozillaHomeStreet2"]; + [entry setObject: [tmp flattenedValueAtIndex: 2 forKey: @""] + forKey: @"homeStreet"]; + [entry setObject: [tmp flattenedValueAtIndex: 3 forKey: @""] + forKey: @"mozillaHomeLocalityName"]; + [entry setObject: [tmp flattenedValueAtIndex: 4 forKey: @""] + forKey: @"mozillaHomeState"]; + [entry setObject: [tmp flattenedValueAtIndex: 5 forKey: @""] + forKey: @"mozillaHomePostalCode"]; + [entry setObject: [tmp flattenedValueAtIndex: 6 forKey: @""] + forKey: @"mozillaHomeCountryName"]; } - array = [self org]; - if (array && [array count]) - [entry setObject: [array objectAtIndex: 0] forKey: @"o"]; + element = [self org]; + tmp = [element flattenedValueAtIndex: 0 forKey: @""]; + if ([tmp length] > 0) + [entry setObject: tmp forKey: @"o"]; array = [self childrenWithTag: @"adr" andAttribute: @"type" havingValue: @"work"]; if ([array count]) { tmp = [array objectAtIndex: 0]; - [entry setObject: [tmp value: 1] forKey: @"mozillaWorkStreet2"]; - [entry setObject: [tmp value: 2] forKey: @"street"]; - [entry setObject: [tmp value: 3] forKey: @"l"]; - [entry setObject: [tmp value: 4] forKey: @"st"]; - [entry setObject: [tmp value: 5] forKey: @"postalCode"]; - [entry setObject: [tmp value: 6] forKey: @"c"]; + [entry setObject: [tmp flattenedValueAtIndex: 1 forKey: @""] + forKey: @"mozillaWorkStreet2"]; + [entry setObject: [tmp flattenedValueAtIndex: 2 forKey: @""] + forKey: @"street"]; + [entry setObject: [tmp flattenedValueAtIndex: 3 forKey: @""] + forKey: @"l"]; + [entry setObject: [tmp flattenedValueAtIndex: 4 forKey: @""] + forKey: @"st"]; + [entry setObject: [tmp flattenedValueAtIndex: 5 forKey: @""] + forKey: @"postalCode"]; + [entry setObject: [tmp flattenedValueAtIndex: 6 forKey: @""] + forKey: @"c"]; } array = [self childrenWithTag: @"tel" andAttribute: @"type" havingValue: @"work"]; if ([array count]) - [entry setObject: [[array objectAtIndex: 0] value: 0] + [entry setObject: [[array objectAtIndex: 0] flattenedValuesForKey: @""] forKey: @"telephoneNumber"]; array = [self childrenWithTag: @"url" andAttribute: @"type" havingValue: @"work"]; if ([array count]) - [entry setObject: [[array objectAtIndex: 0] value: 0] + [entry setObject: [[array objectAtIndex: 0] flattenedValuesForKey: @""] forKey: @"workurl"]; array = [self childrenWithTag: @"url" andAttribute: @"type" havingValue: @"home"]; if ([array count]) - [entry setObject: [[array objectAtIndex: 0] value: 0] + [entry setObject: [[array objectAtIndex: 0] flattenedValuesForKey: @""] forKey: @"homeurl"]; tmp = [self note]; diff --git a/SoObjects/Contacts/SOGoContactEntryPhoto.m b/SoObjects/Contacts/SOGoContactEntryPhoto.m index 850ce59f5..d90750460 100644 --- a/SoObjects/Contacts/SOGoContactEntryPhoto.m +++ b/SoObjects/Contacts/SOGoContactEntryPhoto.m @@ -77,7 +77,8 @@ if ([photo isInline]) data = [photo decodedContent]; else - data = [[photo value: 0] dataUsingEncoding: NSISOLatin1StringEncoding]; + data = [[photo flattenedValuesForKey: @""] + dataUsingEncoding: NSISOLatin1StringEncoding]; if (data) { response = [localContext response]; diff --git a/SoObjects/Contacts/SOGoContactLDIFEntry.m b/SoObjects/Contacts/SOGoContactLDIFEntry.m index 994a5181b..17d562709 100644 --- a/SoObjects/Contacts/SOGoContactLDIFEntry.m +++ b/SoObjects/Contacts/SOGoContactLDIFEntry.m @@ -178,36 +178,34 @@ if (!country) country = [ldifEntry objectForKey: @"countryname"]; - element = [CardElement elementWithTag: @"adr" - attributes: nil values: nil]; + element = [CardElement elementWithTag: @"adr"]; [element setValue: 0 ofAttribute: @"type" to: @"work"]; if (streetAddress) - [element setValue: 2 to: streetAddress]; + [element setSingleValue: streetAddress atIndex: 2 forKey: @""]; if (location) - [element setValue: 3 to: location]; + [element setSingleValue: location atIndex: 3 forKey: @""]; if (region) - [element setValue: 4 to: region]; + [element setSingleValue: region atIndex: 4 forKey: @""]; if (postalCode) - [element setValue: 5 to: postalCode]; + [element setSingleValue: postalCode atIndex: 5 forKey: @""]; if (country) - [element setValue: 6 to: country]; + [element setSingleValue: country atIndex: 6 forKey: @""]; if (streetAddress || location || region || postalCode || country) [vcard addChild: element]; // We handle the org/orgunit stuff - element = [CardElement elementWithTag: @"org" - attributes: nil values: nil]; + element = [CardElement elementWithTag: @"org"]; org = [ldifEntry objectForKey: @"o"]; orgunit = [ldifEntry objectForKey: @"ou"]; if (!orgunit) orgunit = [ldifEntry objectForKey: @"orgunit"]; if (org) - [element setValue: 0 to: org]; + [element setSingleValue: org atIndex: 0 forKey: @""]; if (orgunit) - [element setValue: 1 to: orgunit]; + [element setSingleValue: orgunit atIndex: 1 forKey: @""]; if (org || orgunit) [vcard addChild: element]; diff --git a/Tests/Unit/TestVersit.m b/Tests/Unit/TestVersit.m index 4c544cc69..41cb7e67a 100644 --- a/Tests/Unit/TestVersit.m +++ b/Tests/Unit/TestVersit.m @@ -43,42 +43,95 @@ /* 1. simple value */ element = [CardElement elementWithTag: @"elem"]; - [element setValue: 0 to: @"value"]; + [element setSingleValue: @"value" forKey: @""]; result = [renderer render: element]; testEquals(result, @"ELEM:value\r\n"); /* 2. two values */ element = [CardElement elementWithTag: @"elem"]; - [element setValue: 0 to: @"value1"]; - [element setValue: 1 to: @"value2"]; + [element setSingleValue: @"value2" atIndex: 1 + forKey: @""]; + [element setSingleValue: @"value1" atIndex: 0 + forKey: @""]; result = [renderer render: element]; testEquals(result, @"ELEM:value1;value2\r\n"); /* 3. one value with commma */ element = [CardElement elementWithTag: @"elem"]; - [element setValue: 0 to: @"value1, with a comma"]; + [element setSingleValue: @"value1, with a comma" forKey: @""]; result = [renderer render: element]; testEquals(result, @"ELEM:value1\\, with a comma\r\n"); /* 4. one value with a semicolon */ element = [CardElement elementWithTag: @"elem"]; - [element setValue: 0 to: @"value1; with a semi-colon"]; + [element setSingleValue: @"value1; with a semi-colon" forKey: @""]; result = [renderer render: element]; testEquals(result, @"ELEM:value1\\; with a semi-colon\r\n"); - /* 4. 3 named values: + /* 5. 3 named values: 1. with multiple subvalues 2. with commas 3. with semicolon */ element = [CardElement elementWithTag: @"elem"]; - [element setNamedValue: @"named1" - to: [NSArray arrayWithObjects: @"1", @"2", @"3", nil]]; - [element setNamedValue: @"named2" - to: @"1,2,3"]; - [element setNamedValue: @"named3" - to: @"text1;text2"]; + [element setValues: [NSArray arrayWithObjects: @"1", @"2", @"3", nil] + atIndex: 0 forKey: @"named1"]; + [element setSingleValue: @"1,2,3" forKey: @"named2"]; + [element setSingleValue: @"text1;text2" forKey: @"named3"]; result = [renderer render: element]; - testEquals(result, @"ELEM:NAMED1=1,2,3;NAMED2=1\\,2\\,3;NAMED3:text1\\;text2\r\n"); + testEquals(result, @"ELEM:NAMED1=1,2,3;NAMED2=1\\,2\\,3;NAMED3=text1\\;text2\r\n"); + + /* 6. values with 1 ordered value with a whitespace starting subvalues */ + element = [CardElement elementWithTag: @"elem"]; + [element setValues: [NSArray arrayWithObjects: @"", @"1", nil] + atIndex: 0 forKey: @""]; + result = [renderer render: element]; + testEquals(result, @"ELEM:1\r\n"); + + /* 7. values with 1 ordered value with a subvalue, a whitespace and another subvalue */ + element = [CardElement elementWithTag: @"elem"]; + [element setValues: [NSArray arrayWithObjects: @"1", @"", @"2", nil] + atIndex: 0 forKey: @""]; + result = [renderer render: element]; + testEquals(result, @"ELEM:1,2\r\n"); + + /* 8.a. values with 1 empty ordered value and another non-empty one */ + element = [CardElement elementWithTag: @"elem"]; + [element setValues: [NSArray arrayWithObjects: nil] + atIndex: 0 forKey: @""]; + [element setValues: [NSArray arrayWithObjects: @"1", nil] + atIndex: 1 forKey: @""]; + result = [renderer render: element]; + testEquals(result, @"ELEM:;1\r\n"); + + /* 8.b. a variant thereof: array with spaces */ + [element setValues: [NSArray arrayWithObjects: @"", @"", nil] + atIndex: 0 forKey: @""]; + result = [renderer render: element]; + testEquals(result, @"ELEM:;1\r\n"); + + /* 8.c. a variant thereof: nil array */ + [element setValues: nil atIndex: 0 forKey: @""]; + result = [renderer render: element]; + testEquals(result, @"ELEM:;1\r\n"); + + /* 9. values with 1 non-empty ordered value and another empty one */ + element = [CardElement elementWithTag: @"elem"]; + [element setValues: [NSArray arrayWithObjects: @"1", nil] + atIndex: 0 forKey: @""]; + [element setValues: [NSArray arrayWithObjects: nil] + atIndex: 1 forKey: @""]; + result = [renderer render: element]; + testEquals(result, @"ELEM:1\r\n"); + + /* 10. named values with 1 nil value, 1 empty value and another non-nil one */ + element = [CardElement elementWithTag: @"elem"]; + [element setSingleValue: nil forKey: @"empty"]; + [element setSingleValue: nil forKey: @"empty2"]; + [element setSingleValue: @"coucou" forKey: @"nonempty"]; + result = [renderer render: element]; + testEquals(result, @"ELEM:NONEMPTY=coucou\r\n"); + + /** tests about parameters handling could be nice */ } - (void) test_parsing @@ -87,52 +140,62 @@ CardElement *element; NSString *versit; - versit = @"BEGIN:group1\r\nELEMENT:value\r\nEND:group1\r\n"; + versit = @"BEGIN:GROUP1\r\nELEMENT:value\r\nEND:GROUP1"; group = [CardGroup parseSingleFromSource: versit]; + testEquals([group versitString], versit); element = [group firstChildWithTag: @"element"]; - testEquals([element value: 0], @"value"); + testEquals([element flattenedValueAtIndex: 0 forKey: @""], @"value"); - versit = @"BEGIN:group1\r\nELEMENT:value1;value2\r\nEND:group1\r\n"; + versit = @"BEGIN:GROUP1\r\nELEMENT:value1;value2\r\nEND:GROUP1"; group = [CardGroup parseSingleFromSource: versit]; + testEquals([group versitString], versit); element = [group firstChildWithTag: @"element"]; - testEquals([element value: 0], @"value1"); - testEquals([element value: 1], @"value2"); + testEquals([element flattenedValueAtIndex: 0 forKey: @""], @"value1"); + testEquals([element flattenedValueAtIndex: 1 forKey: @""], @"value2"); - versit = @"BEGIN:group1\r\nELEMENT:value\\, with comma\r\nEND:group1\r\n"; + versit = @"BEGIN:GROUP1\r\nELEMENT:value\\, with comma\r\nEND:GROUP1"; group = [CardGroup parseSingleFromSource: versit]; + testEquals([group versitString], versit); element = [group firstChildWithTag: @"element"]; - testEquals([element value: 0], @"value, with comma"); + testEquals([element flattenedValueAtIndex: 0 forKey: @""], @"value, with comma"); - versit = @"BEGIN:group1\r\nELEMENT:value,with comma\r\nEND:group1\r\n"; + versit = @"BEGIN:GROUP1\r\nELEMENT:value,with comma\r\nEND:GROUP1"; group = [CardGroup parseSingleFromSource: versit]; + testEquals([group versitString], versit); element = [group firstChildWithTag: @"element"]; - testEquals([element value: 0], ([NSArray arrayWithObjects: @"value", @"with comma", nil])); + testEquals([element valuesAtIndex: 0 forKey: @""], ([NSArray arrayWithObjects: @"value", @"with comma", nil])); - versit = @"BEGIN:group1\r\nELEMENT:NAMED1=subvalue;NAMED2=subvalue1,subvalue2\r\nEND:group1\r\n"; + versit = @"BEGIN:GROUP1\r\nELEMENT:NAMED1=subvalue;NAMED2=subvalue1,subvalue2\r\nEND:GROUP1"; group = [CardGroup parseSingleFromSource: versit]; + /* we avoid this test here as nothing guarantees that the order of named + values will be preserved... */ + // testEquals([group versitString], versit); element = [group firstChildWithTag: @"element"]; - testEquals([element namedValue: @"named1"], @"subvalue"); - testEquals([element namedValue: @"named2"], + testEquals([element flattenedValueAtIndex: 0 forKey: @"NAMED1"], @"subvalue"); + testEquals([element valuesAtIndex: 0 forKey: @"named2"], ([NSArray arrayWithObjects: @"subvalue1", @"subvalue2", nil])); - versit = @"BEGIN:group1\r\nELEMENT;PARAM1=test:value\r\nEND:group1\r\n"; + versit = @"BEGIN:GROUP1\r\nELEMENT;PARAM1=test:value\r\nEND:GROUP1"; group = [CardGroup parseSingleFromSource: versit]; + testEquals([group versitString], versit); element = [group firstChildWithTag: @"element"]; - testEquals([element value: 0], @"value"); + testEquals([element flattenedValueAtIndex: 0 forKey: @""], @"value"); testEquals([element value: 0 ofAttribute: @"param1"], @"test"); - versit = @"BEGIN:group1\r\nELEMENT;PARAM1=paramvalue1,paramvalue2:value\r\nEND:group1\r\n"; + versit = @"BEGIN:GROUP1\r\nELEMENT;PARAM1=paramvalue1,paramvalue2:value\r\nEND:GROUP1"; group = [CardGroup parseSingleFromSource: versit]; + testEquals([group versitString], versit); element = [group firstChildWithTag: @"element"]; - testEquals([element value: 0], @"value"); + testEquals([element flattenedValueAtIndex: 0 forKey: @""], @"value"); testEquals([element value: 0 ofAttribute: @"param1"], @"paramvalue1"); testEquals([element value: 1 ofAttribute: @"param1"], @"paramvalue2"); - versit = @"BEGIN:group1\r\nELEMENT;PARAM1=\"paramvalue1, with comma\":value\r\nEND:group1\r\n"; + versit = @"BEGIN:GROUP1\r\nELEMENT;PARAM1=paramvalue1\\, with comma:value\r\nEND:GROUP1"; group = [CardGroup parseSingleFromSource: versit]; + testEquals([group versitString], versit); element = [group firstChildWithTag: @"element"]; - testEquals([element value: 0], @"value"); - testEquals([element value: 0 ofAttribute: @"param1"], @"value1, with comma"); + testEquals([element flattenedValueAtIndex: 0 forKey: @""], @"value"); + testEquals([element value: 0 ofAttribute: @"param1"], @"paramvalue1, with comma"); } @end diff --git a/Tools/SOGoToolRemoveDoubles.m b/Tools/SOGoToolRemoveDoubles.m index 4f90de62c..a4be92c3f 100644 --- a/Tools/SOGoToolRemoveDoubles.m +++ b/Tools/SOGoToolRemoveDoubles.m @@ -64,7 +64,7 @@ cardReferences = [[self cardReferences] objectEnumerator]; while ((currentReference = [cardReferences nextObject])) - [cardNames addObject: [currentReference value: 0]]; + [cardNames addObject: [currentReference flattenedValuesForKey: @""]]; return cardNames; } diff --git a/UI/Contacts/UIxContactEditor.m b/UI/Contacts/UIxContactEditor.m index c97d58390..dfbc48644 100644 --- a/UI/Contacts/UIxContactEditor.m +++ b/UI/Contacts/UIxContactEditor.m @@ -366,7 +366,7 @@ for (i = 0; i < [elements count]; i++) { ce = [elements objectAtIndex: i]; - value = [ce value: 0]; + value = [ce flattenedValuesForKey: @""]; if (!aTypeToExclude) break; @@ -398,13 +398,13 @@ if (max > 0) { - potential = [[elements objectAtIndex: 0] value: 0]; + potential = [[elements objectAtIndex: 0] flattenedValuesForKey: @""]; if (!workMail) { if (homeMail && homeMail == potential) { if (max > 1) - workMail = [[elements objectAtIndex: 1] value: 0]; + workMail = [[elements objectAtIndex: 1] flattenedValuesForKey: @""]; } else workMail = potential; @@ -412,7 +412,7 @@ if (!homeMail && max > 1) { if (workMail && workMail == potential) - homeMail = [[elements objectAtIndex: 1] value: 0]; + homeMail = [[elements objectAtIndex: 1] flattenedValuesForKey: @""]; else homeMail = potential; } @@ -430,32 +430,32 @@ [self _setSnapshotValue: @"homeMail" to: homeMail]; [self _setSnapshotValue: @"mozillaUseHtmlMail" - to: [[card uniqueChildWithTag: @"x-mozilla-html"] value: 0]]; + to: [[card uniqueChildWithTag: @"x-mozilla-html"] flattenedValuesForKey: @""]]; } - (void) _setupOrgFields { NSMutableArray *orgServices; - NSArray *org; - NSRange aRange; - unsigned int max; + CardElement *org; + NSString *service; + NSUInteger count, max; org = [card org]; - max = [org count]; - if (max > 0) + [self _setSnapshotValue: @"workCompany" + to: [org flattenedValueAtIndex: 0 forKey: @""]]; + max = [[org valuesForKey: @""] count]; + if (max > 1) { - [self _setSnapshotValue: @"workCompany" to: [org objectAtIndex: 0]]; - if (max > 1) + orgServices = [NSMutableArray arrayWithCapacity: max]; + for (count = 1; count < max; count++) { - aRange = NSMakeRange (1, max - 1); - orgServices = [NSMutableArray arrayWithArray: [org subarrayWithRange: aRange]]; - - while ([orgServices containsObject: @""]) - [orgServices removeObject: @""]; - - [self _setSnapshotValue: @"workService" - to: [orgServices componentsJoinedByString: @", "]]; + service = [org flattenedValueAtIndex: count forKey: @""]; + if ([service length] > 0) + [orgServices addObject: service]; } + + [self _setSnapshotValue: @"workService" + to: [orgServices componentsJoinedByString: @", "]]; } } @@ -481,21 +481,14 @@ - (void) initSnapshot { - NSArray *n, *elements; + NSArray *elements; CardElement *element; - unsigned int max; - n = [card n]; - if (n) - { - max = [n count]; - if (max > 0) - { - [self _setSnapshotValue: @"sn" to: [n objectAtIndex: 0]]; - if (max > 1) - [self _setSnapshotValue: @"givenName" to: [n objectAtIndex: 1]]; - } - } + element = [card n]; + [self _setSnapshotValue: @"sn" + to: [element flattenedValueAtIndex: 0 forKey: @""]]; + [self _setSnapshotValue: @"givenName" + to: [element flattenedValueAtIndex: 1 forKey: @""]]; [self _setSnapshotValue: @"fn" to: [card fn]]; [self _setSnapshotValue: @"nickname" to: [card nickname]]; @@ -538,7 +531,7 @@ [self _setupEmailFields]; [self _setSnapshotValue: @"screenName" - to: [[card uniqueChildWithTag: @"x-aim"] value: 0]]; + to: [[card uniqueChildWithTag: @"x-aim"] flattenedValuesForKey: @""]]; elements = [card childrenWithTag: @"adr" andAttribute: @"type" havingValue: @"work"]; @@ -546,17 +539,17 @@ { element = [elements objectAtIndex: 0]; [self _setSnapshotValue: @"workExtendedAddress" - to: [element value: 1]]; + to: [element flattenedValueAtIndex: 1 forKey: @""]]; [self _setSnapshotValue: @"workStreetAddress" - to: [element value: 2]]; + to: [element flattenedValueAtIndex: 2 forKey: @""]]; [self _setSnapshotValue: @"workCity" - to: [element value: 3]]; + to: [element flattenedValueAtIndex: 3 forKey: @""]]; [self _setSnapshotValue: @"workState" - to: [element value: 4]]; + to: [element flattenedValueAtIndex: 4 forKey: @""]]; [self _setSnapshotValue: @"workPostalCode" - to: [element value: 5]]; + to: [element flattenedValueAtIndex: 5 forKey: @""]]; [self _setSnapshotValue: @"workCountry" - to: [element value: 6]]; + to: [element flattenedValueAtIndex: 6 forKey: @""]]; } elements = [card childrenWithTag: @"adr" @@ -565,17 +558,17 @@ { element = [elements objectAtIndex: 0]; [self _setSnapshotValue: @"homeExtendedAddress" - to: [element value: 1]]; + to: [element flattenedValueAtIndex: 1 forKey: @""]]; [self _setSnapshotValue: @"homeStreetAddress" - to: [element value: 2]]; + to: [element flattenedValueAtIndex: 2 forKey: @""]]; [self _setSnapshotValue: @"homeCity" - to: [element value: 3]]; + to: [element flattenedValueAtIndex: 3 forKey: @""]]; [self _setSnapshotValue: @"homeState" - to: [element value: 4]]; + to: [element flattenedValueAtIndex: 4 forKey: @""]]; [self _setSnapshotValue: @"homePostalCode" - to: [element value: 5]]; + to: [element flattenedValueAtIndex: 5 forKey: @""]]; [self _setSnapshotValue: @"homeCountry" - to: [element value: 6]]; + to: [element flattenedValueAtIndex: 6 forKey: @""]]; } elements = [card childrenWithTag: @"url"]; @@ -591,7 +584,7 @@ [elements count] > 0) { [self _setSnapshotValue: @"homeURL" - to: [[elements objectAtIndex: 0] value: 0]]; + to: [[elements objectAtIndex: 0] flattenedValuesForKey: @""]]; } // If we do have a "work" URL but no "home" URL but two // values URLs present, let's add the second one as the home URL @@ -603,11 +596,11 @@ for (i = 0; i < [elements count]; i++) { - if ([[[elements objectAtIndex: i] value: 0] + if ([[[elements objectAtIndex: i] flattenedValuesForKey: @""] caseInsensitiveCompare: [snapshot objectForKey: @"workURL"]] != NSOrderedSame) { [self _setSnapshotValue: @"homeURL" - to: [[elements objectAtIndex: i] value: 0]]; + to: [[elements objectAtIndex: i] flattenedValuesForKey: @""]]; break; } } @@ -615,7 +608,7 @@ [self _setSnapshotValue: @"calFBURL" - to: [[card uniqueChildWithTag: @"FBURL"] value: 0]]; + to: [[card uniqueChildWithTag: @"FBURL"] flattenedValuesForKey: @""]]; [self _setSnapshotValue: @"title" to: [card title]]; [self _setupOrgFields]; @@ -686,7 +679,7 @@ photoURL = [NSString stringWithFormat: @"%@/photo%d", baseInlineURL, count]; else - photoURL = [photo value: 0]; + photoURL = [photo flattenedValuesForKey: @""]; [photosURL addObject: photoURL]; } } @@ -721,17 +714,16 @@ CardElement *phone; phone = [self _elementWithTag: @"tel" ofType: @"work"]; - [phone setValue: 0 to: [snapshot objectForKey: @"telephoneNumber"]]; + [phone setSingleValue: [snapshot objectForKey: @"telephoneNumber"] forKey: @""]; phone = [self _elementWithTag: @"tel" ofType: @"home"]; - [phone setValue: 0 to: [snapshot objectForKey: @"homeTelephoneNumber"]]; + [phone setSingleValue: [snapshot objectForKey: @"homeTelephoneNumber"] forKey: @""]; phone = [self _elementWithTag: @"tel" ofType: @"cell"]; - [phone setValue: 0 to: [snapshot objectForKey: @"mobile"]]; + [phone setSingleValue: [snapshot objectForKey: @"mobile"] forKey: @""]; phone = [self _elementWithTag: @"tel" ofType: @"fax"]; - [phone setValue: 0 - to: [snapshot objectForKey: @"facsimileTelephoneNumber"]]; + [phone setSingleValue: [snapshot objectForKey: @"facsimileTelephoneNumber"] + forKey: @""]; phone = [self _elementWithTag: @"tel" ofType: @"pager"]; - [phone setValue: 0 - to: [snapshot objectForKey: @"pager"]]; + [phone setSingleValue: [snapshot objectForKey: @"pager"] forKey: @""]; } - (void) _saveEmails @@ -739,9 +731,9 @@ CardElement *workMail, *homeMail; workMail = [self _elementWithTag: @"email" ofType: @"work"]; - [workMail setValue: 0 to: [snapshot objectForKey: @"workMail"]]; + [workMail setSingleValue: [snapshot objectForKey: @"workMail"] forKey: @""]; homeMail = [self _elementWithTag: @"email" ofType: @"home"]; - [homeMail setValue: 0 to: [snapshot objectForKey: @"homeMail"]]; + [homeMail setSingleValue: [snapshot objectForKey: @"homeMail"] forKey: @""]; if (preferredEmail) { if ([preferredEmail isEqualToString: @"work"]) @@ -751,8 +743,8 @@ } [[card uniqueChildWithTag: @"x-mozilla-html"] - setValue: 0 - to: [snapshot objectForKey: @"mozillaUseHtmlMail"]]; + setSingleValue: [snapshot objectForKey: @"mozillaUseHtmlMail"] + forKey: @""]; } - (void) _saveSnapshot @@ -773,20 +765,32 @@ [card setTz: [snapshot objectForKey: @"tz"]]; element = [self _elementWithTag: @"adr" ofType: @"home"]; - [element setValue: 1 to: [snapshot objectForKey: @"homeExtendedAddress"]]; - [element setValue: 2 to: [snapshot objectForKey: @"homeStreetAddress"]]; - [element setValue: 3 to: [snapshot objectForKey: @"homeCity"]]; - [element setValue: 4 to: [snapshot objectForKey: @"homeState"]]; - [element setValue: 5 to: [snapshot objectForKey: @"homePostalCode"]]; - [element setValue: 6 to: [snapshot objectForKey: @"homeCountry"]]; + [element setSingleValue: [snapshot objectForKey: @"homeExtendedAddress"] + atIndex: 1 forKey: @""]; + [element setSingleValue: [snapshot objectForKey: @"homeStreetAddress"] + atIndex: 2 forKey: @""]; + [element setSingleValue: [snapshot objectForKey: @"homeCity"] + atIndex: 3 forKey: @""]; + [element setSingleValue: [snapshot objectForKey: @"homeState"] + atIndex: 4 forKey: @""]; + [element setSingleValue: [snapshot objectForKey: @"homePostalCode"] + atIndex: 5 forKey: @""]; + [element setSingleValue: [snapshot objectForKey: @"homeCountry"] + atIndex: 6 forKey: @""]; element = [self _elementWithTag: @"adr" ofType: @"work"]; - [element setValue: 1 to: [snapshot objectForKey: @"workExtendedAddress"]]; - [element setValue: 2 to: [snapshot objectForKey: @"workStreetAddress"]]; - [element setValue: 3 to: [snapshot objectForKey: @"workCity"]]; - [element setValue: 4 to: [snapshot objectForKey: @"workState"]]; - [element setValue: 5 to: [snapshot objectForKey: @"workPostalCode"]]; - [element setValue: 6 to: [snapshot objectForKey: @"workCountry"]]; + [element setSingleValue: [snapshot objectForKey: @"workExtendedAddress"] + atIndex: 1 forKey: @""]; + [element setSingleValue: [snapshot objectForKey: @"workStreetAddress"] + atIndex: 2 forKey: @""]; + [element setSingleValue: [snapshot objectForKey: @"workCity"] + atIndex: 3 forKey: @""]; + [element setSingleValue: [snapshot objectForKey: @"workState"] + atIndex: 4 forKey: @""]; + [element setSingleValue: [snapshot objectForKey: @"workPostalCode"] + atIndex: 5 forKey: @""]; + [element setSingleValue: [snapshot objectForKey: @"workCountry"] + atIndex: 6 forKey: @""]; element = [CardElement simpleElementWithTag: @"fburl" value: [snapshot objectForKey: @"calFBURL"]]; @@ -799,13 +803,13 @@ [self _savePhoneValues]; [self _saveEmails]; [[self _elementWithTag: @"url" ofType: @"home"] - setValue: 0 to: [snapshot objectForKey: @"homeURL"]]; + setSingleValue: [snapshot objectForKey: @"homeURL"] forKey: @""]; [[self _elementWithTag: @"url" ofType: @"work"] - setValue: 0 to: [snapshot objectForKey: @"workURL"]]; + setSingleValue: [snapshot objectForKey: @"workURL"] forKey: @""]; [[card uniqueChildWithTag: @"x-aim"] - setValue: 0 - to: [snapshot objectForKey: @"screenName"]]; + setSingleValue: [snapshot objectForKey: @"screenName"] + forKey: @""]; } - (id ) saveAction @@ -814,7 +818,6 @@ id result; NSString *jsRefreshMethod; SoSecurityManager *sm; - NSException *ex; contact = [self clientObject]; card = [contact vCard]; @@ -836,7 +839,7 @@ if (![sm validatePermission: SoPerm_AddDocumentsImagesAndFiles onObject: componentAddressBook inContext: context]) - ex = [contact moveToFolder: (SOGoGCSFolder *)componentAddressBook]; // TODO: handle exception + [contact moveToFolder: (SOGoGCSFolder *)componentAddressBook]; // TODO: handle exception } } diff --git a/UI/Contacts/UIxContactView.m b/UI/Contacts/UIxContactView.m index 7728b54e7..3c4583c61 100644 --- a/UI/Contacts/UIxContactView.m +++ b/UI/Contacts/UIxContactView.m @@ -58,14 +58,6 @@ /* accessors */ -- (NSString *) _cardStringWithLabel: (NSString *) label - value: (NSString *) value -{ - return [self _cardStringWithLabel: label - value: value - url: nil]; -} - - (NSString *) _cardStringWithLabel: (NSString *) label value: (NSString *) value url: (NSString *) url @@ -89,6 +81,14 @@ return cardString; } +- (NSString *) _cardStringWithLabel: (NSString *) label + value: (NSString *) value +{ + return [self _cardStringWithLabel: label + value: value + url: nil]; +} + - (NSString *) displayName { return [self _cardStringWithLabel: @"Display Name:" @@ -103,25 +103,24 @@ - (NSString *) fullName { - NSArray *n; - NSString *fn; - unsigned int max; + CardElement *n; + NSString *fn, *firstName, *lastName; fn = [card fn]; if ([fn length] == 0) { n = [card n]; - if (n) - { - max = [n count]; - if (max > 0) - { - if (max > 1) - fn = [NSString stringWithFormat: @"%@ %@", [n objectAtIndex: 1], [n objectAtIndex: 0]]; - else - fn = [n objectAtIndex: 0]; - } - } + lastName = [n flattenedValueAtIndex: 0 forKey: @""]; + firstName = [n flattenedValueAtIndex: 1 forKey: @""]; + if ([firstName length] > 0) + { + if ([lastName length] > 0) + fn = [NSString stringWithFormat: @"%@ %@", firstName, lastName]; + else + fn = firstName; + } + else + fn = lastName; } return fn; @@ -172,7 +171,7 @@ for (i = 0; i < [emails count]; i++) { - email = [[emails objectAtIndex: i] value: 0]; + email = [[emails objectAtIndex: i] flattenedValuesForKey: @""]; if ([email caseInsensitiveCompare: [card preferredEMail]] != NSOrderedSame) { @@ -192,7 +191,7 @@ { NSString *screenName, *goim; - screenName = [[card uniqueChildWithTag: @"x-aim"] value: 0]; + screenName = [[card uniqueChildWithTag: @"x-aim"] flattenedValuesForKey: @""]; if ([screenName length] > 0) goim = [NSString stringWithFormat: @"%@", screenName, screenName]; @@ -250,7 +249,7 @@ for (i = 0; i < [elements count]; i++) { ce = [elements objectAtIndex: i]; - phone = [ce value: 0]; + phone = [ce flattenedValuesForKey: @""]; if (!aTypeToExclude) break; @@ -315,17 +314,23 @@ - (NSString *) homePobox { - return [self _cardStringWithLabel: nil value: [homeAdr value: 0]]; + return [self _cardStringWithLabel: nil + value: [homeAdr flattenedValueAtIndex: 0 + forKey: @""]]; } - (NSString *) homeExtendedAddress { - return [self _cardStringWithLabel: nil value: [homeAdr value: 1]]; + return [self _cardStringWithLabel: nil + value: [homeAdr flattenedValueAtIndex: 1 + forKey: @""]]; } - (NSString *) homeStreetAddress { - return [self _cardStringWithLabel: nil value: [homeAdr value: 2]]; + return [self _cardStringWithLabel: nil + value: [homeAdr flattenedValueAtIndex: 2 + forKey: @""]]; } - (NSString *) homeCityAndProv @@ -333,8 +338,8 @@ NSString *city, *prov; NSMutableString *data; - city = [homeAdr value: 3]; - prov = [homeAdr value: 4]; + city = [homeAdr flattenedValueAtIndex: 3 forKey: @""]; + prov = [homeAdr flattenedValueAtIndex: 4 forKey: @""]; data = [NSMutableString string]; [data appendString: city]; @@ -350,8 +355,8 @@ NSString *postalCode, *country; NSMutableString *data; - postalCode = [homeAdr value: 5]; - country = [homeAdr value: 6]; + postalCode = [homeAdr flattenedValueAtIndex: 5 forKey: @""]; + country = [homeAdr flattenedValueAtIndex: 6 forKey: @""]; data = [NSMutableString string]; [data appendString: postalCode]; @@ -391,7 +396,7 @@ andAttribute: @"type" havingValue: aType]; if ([elements count] > 0) - url = [[elements objectAtIndex: 0] value: 0]; + url = [[elements objectAtIndex: 0] flattenedValuesForKey: @""]; else url = nil; @@ -416,7 +421,7 @@ workURL = nil; if ([elements count] > 0) - workURL = [[elements objectAtIndex: 0] value: 0]; + workURL = [[elements objectAtIndex: 0] flattenedValuesForKey: @""]; elements = [card childrenWithTag: @"url"]; @@ -424,9 +429,10 @@ { for (i = 0; i < [elements count]; i++) { - if ([[[elements objectAtIndex: i] value: 0] caseInsensitiveCompare: workURL] != NSOrderedSame) + if ([[[elements objectAtIndex: i] flattenedValuesForKey: @""] + caseInsensitiveCompare: workURL] != NSOrderedSame) { - s = [[elements objectAtIndex: i] value: 0]; + s = [[elements objectAtIndex: i] flattenedValuesForKey: @""]; break; } } @@ -434,7 +440,7 @@ } else if (!workURL && [elements count] > 0) { - s = [[elements objectAtIndex: 0] value: 0]; + s = [[elements objectAtIndex: 0] flattenedValuesForKey: @""]; } if (s && [s length] > 0) @@ -474,18 +480,23 @@ - (NSString *) workService { NSMutableArray *orgServices; - NSArray *org; - NSRange aRange; - NSString *services; + NSArray *values; + CardElement *org; + NSString *service, *services; + NSUInteger count, max; org = [card org]; - if (org && [org count] > 1) + values = [org valuesForKey: @""]; + max = [values count]; + if (max > 1) { - aRange = NSMakeRange(1, [org count]-1); - orgServices = [NSMutableArray arrayWithArray: [org subarrayWithRange: aRange]]; - - while ([orgServices containsObject: @""]) - [orgServices removeObject: @""]; + orgServices = [NSMutableArray arrayWithCapacity: max]; + for (count = 1; count < max; count++) + { + service = [org flattenedValueAtIndex: count forKey: @""]; + if ([service length] > 0) + [orgServices addObject: service]; + } services = [orgServices componentsJoinedByString: @", "]; } @@ -497,13 +508,12 @@ - (NSString *) workCompany { - NSArray *org; + CardElement *org; NSString *company; org = [card org]; - if (org && [org count] > 0) - company = [org objectAtIndex: 0]; - else + company = [org flattenedValueAtIndex: 0 forKey: @""]; + if ([company length] == 0) company = nil; return [self _cardStringWithLabel: nil value: company]; @@ -511,17 +521,23 @@ - (NSString *) workPobox { - return [self _cardStringWithLabel: nil value: [workAdr value: 0]]; + return [self _cardStringWithLabel: nil + value: [workAdr flattenedValueAtIndex: 0 + forKey: @""]]; } - (NSString *) workExtendedAddress { - return [self _cardStringWithLabel: nil value: [workAdr value: 1]]; + return [self _cardStringWithLabel: nil + value: [workAdr flattenedValueAtIndex: 1 + forKey: @""]]; } - (NSString *) workStreetAddress { - return [self _cardStringWithLabel: nil value: [workAdr value: 2]]; + return [self _cardStringWithLabel: nil + value: [workAdr flattenedValueAtIndex: 2 + forKey: @""]]; } - (NSString *) workCityAndProv @@ -529,8 +545,8 @@ NSString *city, *prov; NSMutableString *data; - city = [workAdr value: 3]; - prov = [workAdr value: 4]; + city = [workAdr flattenedValueAtIndex: 3 forKey: @""]; + prov = [workAdr flattenedValueAtIndex: 4 forKey: @""]; data = [NSMutableString string]; [data appendString: city]; @@ -546,8 +562,8 @@ NSString *postalCode, *country; NSMutableString *data; - postalCode = [workAdr value: 5]; - country = [workAdr value: 6]; + postalCode = [workAdr flattenedValueAtIndex: 5 forKey: @""]; + country = [workAdr flattenedValueAtIndex: 6 forKey: @""]; data = [NSMutableString string]; [data appendString: postalCode]; @@ -681,7 +697,7 @@ photoURL = [NSString stringWithFormat: @"%@/photo%d", baseInlineURL, count]; else - photoURL = [photo value: 0]; + photoURL = [photo flattenedValuesForKey: @""]; [photosURL addObject: photoURL]; } } diff --git a/UI/Contacts/UIxListEditor.m b/UI/Contacts/UIxListEditor.m index 0ab577aa7..adb04de20 100644 --- a/UI/Contacts/UIxListEditor.m +++ b/UI/Contacts/UIxListEditor.m @@ -184,7 +184,7 @@ [newWorkMail setTag: @"email"]; [newWorkMail addType: @"work"]; [newCard addChild: newWorkMail]; - [newWorkMail setValue: 0 to: workMail]; + [newWorkMail setSingleValue: workMail forKey: @""]; [newCard setFn: fn]; // Add vCard to current folder diff --git a/UI/MailerUI/UIxMailMainFrame.m b/UI/MailerUI/UIxMailMainFrame.m index a03336e58..8183089e9 100644 --- a/UI/MailerUI/UIxMailMainFrame.m +++ b/UI/MailerUI/UIxMailMainFrame.m @@ -268,10 +268,9 @@ - (NSString *) formattedMailtoString: (NGVCard *) card { - NSString *email; + NSString *firstName, *lastName, *email; NSMutableString *fn, *rc = nil; - NSArray *n; - unsigned int max; + CardElement *n; if ([card isKindOfClass: [NGVCard class]]) email = [card preferredEMail]; @@ -291,17 +290,17 @@ && [card isKindOfClass: [NGVCard class]]) { n = [card n]; - if (n) + lastName = [n flattenedValueAtIndex: 0 forKey: @""]; + firstName = [n flattenedValueAtIndex: 1 forKey: @""]; + if ([firstName length] > 0) { - max = [n count]; - if (max > 0) - { - if (max > 1) - fn = [NSMutableString stringWithFormat: @"%@ %@", [n objectAtIndex: 1], [n objectAtIndex: 0]]; - else - fn = [NSMutableString stringWithString: [n objectAtIndex: 0]]; - } + if ([lastName length] > 0) + fn = [NSMutableString stringWithFormat: @"%@ %@", firstName, lastName]; + else + fn = [NSMutableString stringWithString: firstName]; } + else if ([lastName length] > 0) + fn = [NSMutableString stringWithString: lastName]; } if ([fn length] > 0) { diff --git a/UI/Scheduler/UIxComponentEditor.m b/UI/Scheduler/UIxComponentEditor.m index 2e1b84c87..367478dda 100644 --- a/UI/Scheduler/UIxComponentEditor.m +++ b/UI/Scheduler/UIxComponentEditor.m @@ -292,13 +292,13 @@ iRANGE(2); - (void) _loadCategories { - NSString *compCategories, *simpleCategory; + NSString *simpleCategory; + NSArray *compCategories; compCategories = [component categories]; - if ([compCategories length] > 0) + if ([compCategories count] > 0) { - simpleCategory = [[compCategories componentsSeparatedByString: @","] - objectAtIndex: 0]; + simpleCategory = [compCategories objectAtIndex: 0]; ASSIGN (category, simpleCategory); } } @@ -405,7 +405,7 @@ iRANGE(2); { repeatType = @"3"; - if ([[rule namedValue: @"bymonth"] length]) + if ([[rule flattenedValuesForKey: @"bymonth"] length]) { if ([[rule byDay] length]) { @@ -420,13 +420,13 @@ iRANGE(2); [self setRepeat2: @"1"]; [self setRepeat5: [NSString stringWithFormat: @"%d", firstOccurrence]]; [self setRepeat6: [NSString stringWithFormat: @"%d", [dayMask firstDay]]]; - [self setRepeat7: [NSString stringWithFormat: @"%d", [[rule namedValue: @"bymonth"] intValue]-1]]; + [self setRepeat7: [NSString stringWithFormat: @"%d", [[rule flattenedValuesForKey: @"bymonth"] intValue]-1]]; } else { [self setRepeat2: @"0"]; - [self setRepeat3: [rule namedValue: @"bymonthday"]]; - [self setRepeat4: [NSString stringWithFormat: @"%d", [[rule namedValue: @"bymonth"] intValue]-1]]; + [self setRepeat3: [rule flattenedValuesForKey: @"bymonthday"]]; + [self setRepeat4: [NSString stringWithFormat: @"%d", [[rule flattenedValuesForKey: @"bymonth"] intValue]-1]]; } } else if ([rule repeatInterval] == 1) @@ -440,7 +440,7 @@ iRANGE(2); { repeat = @"CUSTOM"; [self setRange1: @"1"]; - [self setRange2: [rule namedValue: @"count"]]; + [self setRange2: [rule flattenedValuesForKey: @"count"]]; } else if ([rule untilDate]) { @@ -519,7 +519,7 @@ iRANGE(2); || [reminderAction isEqualToString: @"email"]) && [[aTrigger valueType] caseInsensitiveCompare: @"DURATION"] == NSOrderedSame) { - duration = [aTrigger value]; + duration = [aTrigger flattenedValuesForKey: @""]; i = [reminderValues indexOfObject: duration]; if (i == NSNotFound || [reminderAction isEqualToString: @"email"]) @@ -611,8 +611,7 @@ iRANGE(2); ASSIGN (privacy, [component accessClass]); ASSIGN (priority, [component priority]); ASSIGN (status, [component status]); - ASSIGN (categories, - [[component categories] vCardSubvaluesWithSeparator: ',']); + ASSIGN (categories, [component categories]); if ([[[component organizer] rfc822Email] length]) { ASSIGN (organizer, [component organizer]); @@ -1853,6 +1852,7 @@ RANGE(2); { int type, range; + NSMutableArray *values; // We decode the range range = [[self range1] intValue]; @@ -1990,14 +1990,21 @@ RANGE(2); occurence = [[self repeat3] intValue] + 1; if (occurence > 5) // the first/second/third/fourth/fifth .. occurence = -1; // the last .. - [theRule setNamedValue: @"byday" - to: [NSString stringWithFormat: @"%d%@", - occurence, day]]; + [theRule setSingleValue: [NSString stringWithFormat: @"%d%@", + occurence, day] + forKey: @"byday"]; } else { if ([[self repeat5] intValue] > 0) - [theRule setNamedValue: @"bymonthday" to: [self repeat5]]; + { + values = [[[self repeat5] + componentsSeparatedByString: @","] + mutableCopy]; + [theRule setValues: values + atIndex: 0 forKey: @"bymonthday"]; + [values release]; + } } } } @@ -2037,22 +2044,27 @@ RANGE(2); occurence = [[self repeat5] intValue] + 1; if (occurence > 5) // the first/second/third/fourth/fifth .. occurence = -1; // the last .. - [theRule setNamedValue: @"byday" - to: [NSString stringWithFormat: @"%d%@", - occurence, day]]; - [theRule setNamedValue: @"bymonth" - to: [NSString stringWithFormat: @"%d", - [[self repeat7] intValue] + 1]]; + [theRule setSingleValue: [NSString stringWithFormat: @"%d%@", + occurence, day] + forKey: @"byday"]; + [theRule setSingleValue: [NSString stringWithFormat: @"%d", + [[self repeat7] intValue] + 1] + forKey: @"bymonth"]; } else { if ([[self repeat3] intValue] > 0 && [[self repeat4] intValue] > 0) { - [theRule setNamedValue: @"bymonthday" - to: [self repeat3]]; - [theRule setNamedValue: @"bymonth" - to: [NSString stringWithFormat: @"%d", ([[self repeat4] intValue]+1)]]; + values = [[[self repeat3] + componentsSeparatedByString: @","] + mutableCopy]; + [theRule setValues: values atIndex: 0 + forKey: @"bymonthday"]; + [values release]; + [theRule setSingleValue: [NSString stringWithFormat: @"%d", + [[self repeat4] intValue] + 1] + forKey: @"bymonth"]; } } } @@ -2111,7 +2123,7 @@ RANGE(2); [component setComment: comment]; [component setAttach: attachUrl]; [component setAccessClass: privacy]; - [component setCategories: category]; + [component setCategories: categories]; [self _handleAttendeesEdition]; [self _handleOrganizer]; clientObject = [self clientObject]; @@ -2146,7 +2158,7 @@ RANGE(2); if ([aValue length]) { // Predefined alarm [anAlarm setAction: @"DISPLAY"]; - [aTrigger setValue: aValue]; + [aTrigger setSingleValue: aValue forKey: @""]; } else { // Custom alarm @@ -2177,7 +2189,7 @@ RANGE(2); aValue = [aValue stringByAppendingFormat: @"%i%@", [reminderQuantity intValue], [reminderUnit substringToIndex: 1]]; - [aTrigger setValue: aValue]; + [aTrigger setSingleValue: aValue forKey: @""]; [aTrigger setRelationType: reminderRelation]; } else From 531ed59298b5d7e7049a1506e2d6fd04b8351248 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Mon, 14 Nov 2011 05:01:26 +0000 Subject: [PATCH 29/38] ah\\, coucou\\; test! Monotone-Parent: 59d4ff7e6c2fe24e74adbe4891af30ece4f5e858 Monotone-Revision: c05e0091913ed81140571dab045abdaf56a77ef8 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-14T05:01:26 Monotone-Branch: ca.inverse.sogo --- SOPE/GDLContentStore/ChangeLog | 6 ++ SOPE/GDLContentStore/GCSFolder.m | 116 ++++++++++++++++++------------- 2 files changed, 72 insertions(+), 50 deletions(-) diff --git a/SOPE/GDLContentStore/ChangeLog b/SOPE/GDLContentStore/ChangeLog index 155d4e62a..5be5f1ad4 100644 --- a/SOPE/GDLContentStore/ChangeLog +++ b/SOPE/GDLContentStore/ChangeLog @@ -1,3 +1,9 @@ +2011-11-14 Wolfgang Sourdeau + + * GCSFolder.m + (_generateUpdateStatementForRow:adaptor:fields:tableName:whereColumn:isEqualTo:andColumn:isEqualTo:): + same as below. + 2011-10-21 Francis Lachapelle * GCSFolder.m diff --git a/SOPE/GDLContentStore/GCSFolder.m b/SOPE/GDLContentStore/GCSFolder.m index c9cf89c61..24e6af857 100644 --- a/SOPE/GDLContentStore/GCSFolder.m +++ b/SOPE/GDLContentStore/GCSFolder.m @@ -602,40 +602,48 @@ static GCSStringFormatter *stringFormatter = nil; - (NSString *)_formatRowValue:(id)_value { - if (![_value isNotNull]) - return @"NULL"; - - if ([_value isKindOfClass:NSStringClass]) - return [stringFormatter stringByFormattingString:_value]; - - if ([_value isKindOfClass:NSNumberClass]) { -#if GNUSTEP_BASE_LIBRARY - _value = [_value stringValue]; - return ([(NSString *)_value hasPrefix:@"Y"] || - [(NSString *)_value hasPrefix:@"N"]) - ? (id)([_value boolValue] ? @"1" : @"0") - : _value; -#endif - return [_value stringValue]; - } - if ([_value isKindOfClass:NSCalendarDateClass]) { /* be smart ... convert to timestamp. Note: we loose precision. */ char buf[256]; snprintf(buf, sizeof(buf), "%i", (int)[_value timeIntervalSince1970]); return [NSString stringWithCString:buf]; } - - [self errorWithFormat:@"cannot handle value class: %@", [_value class]]; - return nil; + else { + return _value; + } } -- (NSString *)_generateInsertStatementForRow:(NSDictionary *)_row - tableName:(NSString *)_table +- (NSString *) _sqlTypeForColumn: (NSString *) _field withFieldInfos: (NSArray *) _fields +{ + NSString *sqlType; + NSEnumerator *fields; + GCSFieldInfo *fieldInfo; + + sqlType = nil; + fields = [_fields objectEnumerator]; + while ((fieldInfo = [fields nextObject])) + { + if ([[fieldInfo columnName] caseInsensitiveCompare: _field] == NSOrderedSame) + { + sqlType = [fieldInfo sqlType]; + break; + } + } + + return sqlType; +} + +- (NSString *) _generateInsertStatementForRow:(NSDictionary *)_row + adaptor:(EOAdaptor *)_adaptor + fields:(NSArray *)_fields + tableName:(NSString *)_table { // TODO: move to NSDictionary category? NSMutableString *sql; + NSString *fieldName, *sqlType; NSArray *keys; + EOAttribute *attribute; + id value; unsigned i, count; if (_row == nil || _table == nil) @@ -656,12 +664,25 @@ static GCSStringFormatter *stringFormatter = nil; [sql appendString:@") VALUES ("]; for (i = 0, count = [keys count]; i < count; i++) { - id value; + fieldName = [keys objectAtIndex:i]; + sqlType = [self _sqlTypeForColumn: fieldName withFieldInfos: _fields]; - if (i != 0) [sql appendString:@", "]; - value = [_row objectForKey:[keys objectAtIndex:i]]; - value = [self _formatRowValue:value]; - [sql appendString:value]; + if (sqlType) + { + value = [self _formatRowValue: [_row objectForKey: fieldName]]; + attribute = AUTORELEASE([[EOAttribute alloc] init]); + [attribute setName: fieldName]; + [attribute setColumnName: fieldName]; + [attribute setExternalType: sqlType]; + + if (i != 0) [sql appendString:@", "]; + [sql appendString:[_adaptor formatValue: value forAttribute: attribute]]; + } + else + { + [self errorWithFormat:@"%s: no type found for column name %@", + __PRETTY_FUNCTION__, fieldName]; + } } [sql appendString:@")"]; @@ -699,7 +720,7 @@ static GCSStringFormatter *stringFormatter = nil; if (sqlType) { - value = [_row objectForKey: fieldName]; + value = [self _formatRowValue: [_row objectForKey: fieldName]]; attribute = AUTORELEASE([[EOAttribute alloc] init]); [attribute setName: fieldName]; [attribute setColumnName: fieldName]; @@ -717,41 +738,32 @@ static GCSStringFormatter *stringFormatter = nil; } } + sqlType = [self _sqlTypeForColumn: _colname withFieldInfos: _fields]; + attribute = AUTORELEASE([[EOAttribute alloc] init]); + [attribute setName: _colname]; + [attribute setColumnName: _colname]; + [attribute setExternalType: sqlType]; [sql appendString:@" WHERE "]; [sql appendString:_colname]; [sql appendString:@" = "]; - [sql appendString:[self _formatRowValue:_value]]; + [sql appendString:[_adaptor formatValue: [self _formatRowValue:_value] forAttribute: attribute]]; if (_colname2 != nil) { [sql appendString:@" AND "]; + + sqlType = [self _sqlTypeForColumn: _colname2 withFieldInfos: _fields]; + attribute = AUTORELEASE([[EOAttribute alloc] init]); + [attribute setName: _colname2]; + [attribute setColumnName: _colname2]; + [attribute setExternalType: sqlType]; [sql appendString:_colname2]; [sql appendString:@" = "]; - [sql appendString:[self _formatRowValue:_value2]]; + [sql appendString:[_adaptor formatValue: [self _formatRowValue:_value2] forAttribute: attribute]]; } return sql; } -- (NSString *) _sqlTypeForColumn: (NSString *) _field withFieldInfos: (NSArray *) _fields -{ - NSString *sqlType; - NSEnumerator *fields; - GCSFieldInfo *fieldInfo; - - sqlType = nil; - fields = [_fields objectEnumerator]; - while ((fieldInfo = [fields nextObject])) - { - if ([[fieldInfo columnName] caseInsensitiveCompare: _field] == NSOrderedSame) - { - sqlType = [fieldInfo sqlType]; - break; - } - } - - return sqlType; -} - - (EOEntity *) _entityWithName: (NSString *) _name { EOAttribute *attribute; @@ -976,6 +988,8 @@ static GCSStringFormatter *stringFormatter = nil; ? [quickChannel insertRowX: quickRow forEntity: quickTableEntity] : [quickChannel evaluateExpressionX: [self _generateInsertStatementForRow: quickRow + adaptor: [[quickChannel adaptorContext] adaptor] + fields: [folderInfo quickFields] tableName: [self quickTableName]]]); if (!error) @@ -983,6 +997,8 @@ static GCSStringFormatter *stringFormatter = nil; ? [storeChannel insertRowX: contentRow forEntity: storeTableEntity] : [storeChannel evaluateExpressionX: [self _generateInsertStatementForRow: contentRow + adaptor: [[storeChannel adaptorContext] adaptor] + fields: [folderInfo fields] tableName: [self storeTableName]]]); } else From d51294fbd0e686ca41da46ef45c537b8586a1e7b Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Mon, 14 Nov 2011 17:34:25 +0000 Subject: [PATCH 30/38] applied changes from dac752317ac0c81975ef28320e87acabbe394823 through 56f352efadfe2c0d5853cf5995e81a1cca3e4f21 Monotone-Parent: c05e0091913ed81140571dab045abdaf56a77ef8 Monotone-Revision: 2d37a348bb30785e625961561e533e2b11097a03 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-14T17:34:25 Monotone-Branch: ca.inverse.sogo --- SOPE/GDLContentStore/ChangeLog | 4 + SOPE/GDLContentStore/GCSFolder.m | 158 ++++++++++++++++++------------- 2 files changed, 98 insertions(+), 64 deletions(-) diff --git a/SOPE/GDLContentStore/ChangeLog b/SOPE/GDLContentStore/ChangeLog index 5be5f1ad4..8a9cc08dd 100644 --- a/SOPE/GDLContentStore/ChangeLog +++ b/SOPE/GDLContentStore/ChangeLog @@ -3,6 +3,10 @@ * GCSFolder.m (_generateUpdateStatementForRow:adaptor:fields:tableName:whereColumn:isEqualTo:andColumn:isEqualTo:): same as below. + (_attributeForColumn:): new helper method that automatically + constructs an EOAttribute for a colum name passed as parameter. + (_formatRowValue:withAdaptor:andAttribute:): now invokes + -[EOAdaptor formatValue:forAttribute:] to avoid a call from the caller. 2011-10-21 Francis Lachapelle diff --git a/SOPE/GDLContentStore/GCSFolder.m b/SOPE/GDLContentStore/GCSFolder.m index 24e6af857..7d87f17e1 100644 --- a/SOPE/GDLContentStore/GCSFolder.m +++ b/SOPE/GDLContentStore/GCSFolder.m @@ -600,17 +600,15 @@ static GCSStringFormatter *stringFormatter = nil; /* writing content */ -- (NSString *)_formatRowValue:(id)_value { - +- (NSString *)_formatRowValue:(id)_value +withAdaptor: (EOAdaptor *)_adaptor +andAttribute: (EOAttribute *)_attribute +{ if ([_value isKindOfClass:NSCalendarDateClass]) { - /* be smart ... convert to timestamp. Note: we loose precision. */ - char buf[256]; - snprintf(buf, sizeof(buf), "%i", (int)[_value timeIntervalSince1970]); - return [NSString stringWithCString:buf]; - } - else { - return _value; + _value = [NSString stringWithFormat: @"%d", (int)[_value timeIntervalSince1970]]; } + + return [_adaptor formatValue: _value forAttribute: _attribute]; } - (NSString *) _sqlTypeForColumn: (NSString *) _field withFieldInfos: (NSArray *) _fields @@ -633,14 +631,36 @@ static GCSStringFormatter *stringFormatter = nil; return sqlType; } +- (EOAttribute *) _attributeForColumn: (NSString *) _field +{ + NSString *sqlType; + EOAttribute *attribute; + + sqlType = [self _sqlTypeForColumn: _field + withFieldInfos: [folderInfo quickFields]]; + if (!sqlType) + sqlType = [self _sqlTypeForColumn: _field + withFieldInfos: [folderInfo fields]]; + if (sqlType) + { + attribute = AUTORELEASE([[EOAttribute alloc] init]); + [attribute setName: _field]; + [attribute setColumnName: _field]; + [attribute setExternalType: sqlType]; + } + else + attribute = nil; + + return attribute; +} + - (NSString *) _generateInsertStatementForRow:(NSDictionary *)_row adaptor:(EOAdaptor *)_adaptor - fields:(NSArray *)_fields tableName:(NSString *)_table { // TODO: move to NSDictionary category? NSMutableString *sql; - NSString *fieldName, *sqlType; + NSString *fieldName; NSArray *keys; EOAttribute *attribute; id value; @@ -665,18 +685,13 @@ static GCSStringFormatter *stringFormatter = nil; for (i = 0, count = [keys count]; i < count; i++) { fieldName = [keys objectAtIndex:i]; - sqlType = [self _sqlTypeForColumn: fieldName withFieldInfos: _fields]; - - if (sqlType) + attribute = [self _attributeForColumn: fieldName]; + if (attribute) { - value = [self _formatRowValue: [_row objectForKey: fieldName]]; - attribute = AUTORELEASE([[EOAttribute alloc] init]); - [attribute setName: fieldName]; - [attribute setColumnName: fieldName]; - [attribute setExternalType: sqlType]; - if (i != 0) [sql appendString:@", "]; - [sql appendString:[_adaptor formatValue: value forAttribute: attribute]]; + value = [self _formatRowValue: [_row objectForKey: fieldName] + withAdaptor: _adaptor andAttribute: attribute]; + [sql appendString: value]; } else { @@ -691,7 +706,6 @@ static GCSStringFormatter *stringFormatter = nil; - (NSString *)_generateUpdateStatementForRow:(NSDictionary *)_row adaptor:(EOAdaptor *)_adaptor - fields:(NSArray *)_fields tableName:(NSString *)_table whereColumn:(NSString *)_colname isEqualTo:(id)_value andColumn:(NSString *)_colname2 isEqualTo:(id)_value2 @@ -699,7 +713,7 @@ static GCSStringFormatter *stringFormatter = nil; // TODO: move to NSDictionary category? NSMutableString *sql; NSArray *keys; - NSString *fieldName, *sqlType; + NSString *fieldName; EOAttribute *attribute; id value; unsigned i, count; @@ -716,20 +730,16 @@ static GCSStringFormatter *stringFormatter = nil; for (i = 0, count = [keys count]; i < count; i++) { fieldName = [keys objectAtIndex:i]; - sqlType = [self _sqlTypeForColumn: fieldName withFieldInfos: _fields]; - if (sqlType) + attribute = [self _attributeForColumn: fieldName]; + if (attribute) { - value = [self _formatRowValue: [_row objectForKey: fieldName]]; - attribute = AUTORELEASE([[EOAttribute alloc] init]); - [attribute setName: fieldName]; - [attribute setColumnName: fieldName]; - [attribute setExternalType: sqlType]; - if (i != 0) [sql appendString:@", "]; [sql appendString:fieldName]; [sql appendString:@" = "]; - [sql appendString:[_adaptor formatValue: value forAttribute: attribute]]; + value = [self _formatRowValue: [_row objectForKey: fieldName] + withAdaptor: _adaptor andAttribute: attribute]; + [sql appendString: value]; } else { @@ -738,27 +748,23 @@ static GCSStringFormatter *stringFormatter = nil; } } - sqlType = [self _sqlTypeForColumn: _colname withFieldInfos: _fields]; - attribute = AUTORELEASE([[EOAttribute alloc] init]); - [attribute setName: _colname]; - [attribute setColumnName: _colname]; - [attribute setExternalType: sqlType]; [sql appendString:@" WHERE "]; [sql appendString:_colname]; [sql appendString:@" = "]; - [sql appendString:[_adaptor formatValue: [self _formatRowValue:_value] forAttribute: attribute]]; + attribute = [self _attributeForColumn: _colname]; + value = [self _formatRowValue: _value + withAdaptor: _adaptor andAttribute: attribute]; + [sql appendString: value]; if (_colname2 != nil) { [sql appendString:@" AND "]; - sqlType = [self _sqlTypeForColumn: _colname2 withFieldInfos: _fields]; - attribute = AUTORELEASE([[EOAttribute alloc] init]); - [attribute setName: _colname2]; - [attribute setColumnName: _colname2]; - [attribute setExternalType: sqlType]; [sql appendString:_colname2]; [sql appendString:@" = "]; - [sql appendString:[_adaptor formatValue: [self _formatRowValue:_value2] forAttribute: attribute]]; + attribute = [self _attributeForColumn: _colname2]; + value = [self _formatRowValue: _value2 + withAdaptor: _adaptor andAttribute: attribute]; + [sql appendString: value]; } return sql; @@ -821,19 +827,30 @@ static GCSStringFormatter *stringFormatter = nil; andColumn:(NSString *)_colname2 isEqualTo:(id)_value2 entity: (EOEntity *)_entity + withAdaptor: (EOAdaptor *)_adaptor { EOSQLQualifier *qualifier; + EOAttribute *attribute1, *attribute2; + attribute1 = [_entity attributeNamed: _colname]; if (_colname2 == nil) { qualifier = [[EOSQLQualifier alloc] initWithEntity: _entity - qualifierFormat: @"%A = %@", _colname, [self _formatRowValue:_value]]; + qualifierFormat: @"%A = %@", _colname, + [self _formatRowValue:_value + withAdaptor: _adaptor andAttribute: attribute1]]; } else { + attribute2 = [_entity attributeNamed: _colname2]; qualifier = [[EOSQLQualifier alloc] initWithEntity: _entity - qualifierFormat: @"%A = %@ AND %A = %@", _colname, [self _formatRowValue:_value], - _colname2, [self _formatRowValue:_value2]]; + qualifierFormat: @"%A = %@ AND %A = %@", + _colname, + [self _formatRowValue:_value + withAdaptor: _adaptor andAttribute: attribute1], + _colname2, + [self _formatRowValue:_value2 + withAdaptor: _adaptor andAttribute: attribute2]]; } return AUTORELEASE(qualifier); @@ -842,15 +859,21 @@ static GCSStringFormatter *stringFormatter = nil; - (void) _purgeRecordWithName: (NSString *) recordName { NSString *delSql, *table; + EOAdaptorContext *adaptorCtx; EOAdaptorChannel *channel; + EOAttribute *attribute; channel = [self acquireStoreChannel]; - [[channel adaptorContext] beginTransaction]; + adaptorCtx = [channel adaptorContext]; + [adaptorCtx beginTransaction]; table = [self storeTableName]; + attribute = [self _attributeForColumn: @"c_name"]; delSql = [NSString stringWithFormat: @"DELETE FROM %@" @" WHERE c_name = %@", table, - [self _formatRowValue: recordName]]; + [self _formatRowValue: recordName + withAdaptor: [adaptorCtx adaptor] + andAttribute: attribute]]; [channel evaluateExpressionX: delSql]; [[channel adaptorContext] commitTransaction]; @@ -989,7 +1012,6 @@ static GCSStringFormatter *stringFormatter = nil; : [quickChannel evaluateExpressionX: [self _generateInsertStatementForRow: quickRow adaptor: [[quickChannel adaptorContext] adaptor] - fields: [folderInfo quickFields] tableName: [self quickTableName]]]); if (!error) @@ -998,7 +1020,6 @@ static GCSStringFormatter *stringFormatter = nil; : [storeChannel evaluateExpressionX: [self _generateInsertStatementForRow: contentRow adaptor: [[storeChannel adaptorContext] adaptor] - fields: [folderInfo fields] tableName: [self storeTableName]]]); } else @@ -1008,10 +1029,10 @@ static GCSStringFormatter *stringFormatter = nil; ? [quickChannel updateRowX: quickRow describedByQualifier: [self _qualifierUsingWhereColumn: @"c_name" isEqualTo: _name andColumn: nil isEqualTo: nil - entity: quickTableEntity]] + entity: quickTableEntity + withAdaptor: [[storeChannel adaptorContext] adaptor]]] : [quickChannel evaluateExpressionX: [self _generateUpdateStatementForRow: quickRow adaptor: [[quickChannel adaptorContext] adaptor] - fields: [folderInfo quickFields] tableName: [self quickTableName] whereColumn: @"c_name" isEqualTo: _name andColumn: nil isEqualTo: nil]]); @@ -1021,10 +1042,10 @@ static GCSStringFormatter *stringFormatter = nil; describedByQualifier: [self _qualifierUsingWhereColumn: @"c_name" isEqualTo: _name andColumn: (_baseVersion != 0 ? (id)@"c_version" : (id)nil) isEqualTo: (_baseVersion != 0 ? [NSNumber numberWithUnsignedInt:_baseVersion] : (NSNumber *)nil) - entity: storeTableEntity]] + entity: storeTableEntity + withAdaptor: [[storeChannel adaptorContext] adaptor]]] : [storeChannel evaluateExpressionX: [self _generateUpdateStatementForRow: contentRow adaptor: [[storeChannel adaptorContext] adaptor] - fields: [folderInfo fields] tableName:[self storeTableName] whereColumn: @"c_name" isEqualTo: _name andColumn: (_baseVersion != 0 ? (id)@"c_version" : (id)nil) @@ -1084,6 +1105,7 @@ static GCSStringFormatter *stringFormatter = nil; - (NSException *)deleteContentWithName:(NSString *)_name { EOAdaptorChannel *storeChannel, *quickChannel; + EOAdaptorContext *adaptorCtx; NSException *error; NSString *delsql; NSCalendarDate *nowDate; @@ -1119,7 +1141,8 @@ static GCSStringFormatter *stringFormatter = nil; } if (!ofFlags.sameTableForQuick) [[quickChannel adaptorContext] beginTransaction]; - [[storeChannel adaptorContext] beginTransaction]; + adaptorCtx = [storeChannel adaptorContext]; + [adaptorCtx beginTransaction]; /* delete rows */ nowDate = [NSCalendarDate calendarDate]; @@ -1129,7 +1152,9 @@ static GCSStringFormatter *stringFormatter = nil; delsql = [delsql stringByAppendingFormat:@", c_lastmodified = %u", (unsigned int) [nowDate timeIntervalSince1970]]; delsql = [delsql stringByAppendingString:@" WHERE c_name="]; - delsql = [delsql stringByAppendingString:[self _formatRowValue:_name]]; + delsql = [delsql stringByAppendingString: [self _formatRowValue:_name + withAdaptor: [adaptorCtx adaptor] + andAttribute: [self _attributeForColumn: @"c_name"]]]; if ((error = [storeChannel evaluateExpressionX:delsql]) != nil) { [self errorWithFormat: @"%s: cannot delete content '%@': %@", @@ -1139,7 +1164,9 @@ static GCSStringFormatter *stringFormatter = nil; /* content row deleted, now delete the quick row */ delsql = [@"DELETE FROM " stringByAppendingString:[self quickTableName]]; delsql = [delsql stringByAppendingString:@" WHERE c_name="]; - delsql = [delsql stringByAppendingString:[self _formatRowValue:_name]]; + delsql = [delsql stringByAppendingString: [self _formatRowValue:_name + withAdaptor: [adaptorCtx adaptor] + andAttribute: [self _attributeForColumn: @"c_name"]]]; if ((error = [quickChannel evaluateExpressionX:delsql]) != nil) { [self errorWithFormat: @"%s: cannot delete quick row '%@': %@", @@ -1152,7 +1179,7 @@ static GCSStringFormatter *stringFormatter = nil; } /* release channels and return */ - [[storeChannel adaptorContext] commitTransaction]; + [adaptorCtx commitTransaction]; [self releaseChannel:storeChannel]; if (!ofFlags.sameTableForQuick) { @@ -1254,24 +1281,27 @@ static GCSStringFormatter *stringFormatter = nil; isEqualTo: (id) _value { EOAdaptorChannel *quickChannel; + EOAdaptorContext *adaptorCtx; NSException *error; quickChannel = [self acquireQuickChannel]; - [[quickChannel adaptorContext] beginTransaction]; + adaptorCtx = [quickChannel adaptorContext]; + [adaptorCtx beginTransaction]; error = [quickChannel updateRowX: _fields describedByQualifier: [self _qualifierUsingWhereColumn: _colname - isEqualTo: _value andColumn: nil isEqualTo: nil - entity: [self _quickTableEntity]]]; + isEqualTo: _value andColumn: nil isEqualTo: nil + entity: [self _quickTableEntity] + withAdaptor: [adaptorCtx adaptor]]]; if (error) { - [[quickChannel adaptorContext] rollbackTransaction]; + [adaptorCtx rollbackTransaction]; [self logWithFormat: @"ERROR(%s): cannot update content : %@", __PRETTY_FUNCTION__, error]; } else { - [[quickChannel adaptorContext] commitTransaction]; + [adaptorCtx commitTransaction]; } [self releaseChannel: quickChannel]; From 3ebd8a6950c54ec63e06d8a4d9c90502e53d43e6 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Mon, 14 Nov 2011 17:54:12 +0000 Subject: [PATCH 31/38] Monotone-Parent: 2d37a348bb30785e625961561e533e2b11097a03 Monotone-Revision: 0ae67852a55731562efb14a29543618b73de4795 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-14T17:54:12 Monotone-Branch: ca.inverse.sogo --- SoObjects/Appointments/SOGoCalendarComponent.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SoObjects/Appointments/SOGoCalendarComponent.m b/SoObjects/Appointments/SOGoCalendarComponent.m index 65935d164..917bf7cf9 100644 --- a/SoObjects/Appointments/SOGoCalendarComponent.m +++ b/SoObjects/Appointments/SOGoCalendarComponent.m @@ -210,7 +210,7 @@ [component setComment: @""]; [component setUserComment: @""]; [component setLocation: @""]; - [component setCategories: @""]; + [component setCategories: [NSArray array]]; [component setUrl: @""]; [component removeAllAttendees]; [component removeAllAlarms]; From f00f6d461d3e23f870175034021285b1d6116275 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Tue, 15 Nov 2011 11:07:32 +0000 Subject: [PATCH 32/38] applied changes from b084746023f24f274a1e8a852e8a36bb19bb35ce through a87ea6ce03f4b86eb7fdb3d1e53dedbd652bfc0d Monotone-Parent: 0ae67852a55731562efb14a29543618b73de4795 Monotone-Revision: 659d2d19fb87e1aba4c3549ab61033ded76a4c34 Monotone-Author: flachapelle@inverse.ca Monotone-Date: 2011-11-15T11:07:32 Monotone-Branch: ca.inverse.sogo --- UI/MainUI/Norwegian.lproj/Localizable.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/UI/MainUI/Norwegian.lproj/Localizable.strings b/UI/MainUI/Norwegian.lproj/Localizable.strings index 8f1410690..7eae5a5d8 100644 --- a/UI/MainUI/Norwegian.lproj/Localizable.strings +++ b/UI/MainUI/Norwegian.lproj/Localizable.strings @@ -5,6 +5,7 @@ "Username:" = "Brukernavn:"; "Password:" = "Passord:"; "Domain:" = "Domain:"; +"Remember username" = "Husk brukernavn"; "Connect" = "Logg inn"; From 5a7ecd8615464f3e1aef826978800d27e879cc66 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Tue, 15 Nov 2011 11:47:02 +0000 Subject: [PATCH 33/38] Monotone-Parent: 659d2d19fb87e1aba4c3549ab61033ded76a4c34 Monotone-Revision: 4fa9d5f232411da95f6ddd4d8c85a15ca4aa18d8 Monotone-Author: flachapelle@inverse.ca Monotone-Date: 2011-11-15T11:47:02 Monotone-Branch: ca.inverse.sogo --- Tests/Unit/TestVersit.m | 201 ---------------------------------------- 1 file changed, 201 deletions(-) delete mode 100644 Tests/Unit/TestVersit.m diff --git a/Tests/Unit/TestVersit.m b/Tests/Unit/TestVersit.m deleted file mode 100644 index 41cb7e67a..000000000 --- a/Tests/Unit/TestVersit.m +++ /dev/null @@ -1,201 +0,0 @@ -/* TestVersit.m - this file is part of $PROJECT_NAME_HERE$ - * - * Copyright (C) 2011 Inverse inc - * - * Author: Wolfgang Sourdeau - * - * This file is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This file is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#import -#import -#import -#import - -#import "SOGoTest.h" - -@interface TestVersit : SOGoTest -@end - -@implementation TestVersit - -- (void) test_rendering -{ - CardElement *element; - CardVersitRenderer *renderer; - NSString *result; - - renderer = [CardVersitRenderer new]; - [renderer autorelease]; - - /* 1. simple value */ - element = [CardElement elementWithTag: @"elem"]; - [element setSingleValue: @"value" forKey: @""]; - result = [renderer render: element]; - testEquals(result, @"ELEM:value\r\n"); - - /* 2. two values */ - element = [CardElement elementWithTag: @"elem"]; - [element setSingleValue: @"value2" atIndex: 1 - forKey: @""]; - [element setSingleValue: @"value1" atIndex: 0 - forKey: @""]; - result = [renderer render: element]; - testEquals(result, @"ELEM:value1;value2\r\n"); - - /* 3. one value with commma */ - element = [CardElement elementWithTag: @"elem"]; - [element setSingleValue: @"value1, with a comma" forKey: @""]; - result = [renderer render: element]; - testEquals(result, @"ELEM:value1\\, with a comma\r\n"); - - /* 4. one value with a semicolon */ - element = [CardElement elementWithTag: @"elem"]; - [element setSingleValue: @"value1; with a semi-colon" forKey: @""]; - result = [renderer render: element]; - testEquals(result, @"ELEM:value1\\; with a semi-colon\r\n"); - - /* 5. 3 named values: - 1. with multiple subvalues - 2. with commas - 3. with semicolon */ - element = [CardElement elementWithTag: @"elem"]; - [element setValues: [NSArray arrayWithObjects: @"1", @"2", @"3", nil] - atIndex: 0 forKey: @"named1"]; - [element setSingleValue: @"1,2,3" forKey: @"named2"]; - [element setSingleValue: @"text1;text2" forKey: @"named3"]; - result = [renderer render: element]; - testEquals(result, @"ELEM:NAMED1=1,2,3;NAMED2=1\\,2\\,3;NAMED3=text1\\;text2\r\n"); - - /* 6. values with 1 ordered value with a whitespace starting subvalues */ - element = [CardElement elementWithTag: @"elem"]; - [element setValues: [NSArray arrayWithObjects: @"", @"1", nil] - atIndex: 0 forKey: @""]; - result = [renderer render: element]; - testEquals(result, @"ELEM:1\r\n"); - - /* 7. values with 1 ordered value with a subvalue, a whitespace and another subvalue */ - element = [CardElement elementWithTag: @"elem"]; - [element setValues: [NSArray arrayWithObjects: @"1", @"", @"2", nil] - atIndex: 0 forKey: @""]; - result = [renderer render: element]; - testEquals(result, @"ELEM:1,2\r\n"); - - /* 8.a. values with 1 empty ordered value and another non-empty one */ - element = [CardElement elementWithTag: @"elem"]; - [element setValues: [NSArray arrayWithObjects: nil] - atIndex: 0 forKey: @""]; - [element setValues: [NSArray arrayWithObjects: @"1", nil] - atIndex: 1 forKey: @""]; - result = [renderer render: element]; - testEquals(result, @"ELEM:;1\r\n"); - - /* 8.b. a variant thereof: array with spaces */ - [element setValues: [NSArray arrayWithObjects: @"", @"", nil] - atIndex: 0 forKey: @""]; - result = [renderer render: element]; - testEquals(result, @"ELEM:;1\r\n"); - - /* 8.c. a variant thereof: nil array */ - [element setValues: nil atIndex: 0 forKey: @""]; - result = [renderer render: element]; - testEquals(result, @"ELEM:;1\r\n"); - - /* 9. values with 1 non-empty ordered value and another empty one */ - element = [CardElement elementWithTag: @"elem"]; - [element setValues: [NSArray arrayWithObjects: @"1", nil] - atIndex: 0 forKey: @""]; - [element setValues: [NSArray arrayWithObjects: nil] - atIndex: 1 forKey: @""]; - result = [renderer render: element]; - testEquals(result, @"ELEM:1\r\n"); - - /* 10. named values with 1 nil value, 1 empty value and another non-nil one */ - element = [CardElement elementWithTag: @"elem"]; - [element setSingleValue: nil forKey: @"empty"]; - [element setSingleValue: nil forKey: @"empty2"]; - [element setSingleValue: @"coucou" forKey: @"nonempty"]; - result = [renderer render: element]; - testEquals(result, @"ELEM:NONEMPTY=coucou\r\n"); - - /** tests about parameters handling could be nice */ -} - -- (void) test_parsing -{ - CardGroup *group; - CardElement *element; - NSString *versit; - - versit = @"BEGIN:GROUP1\r\nELEMENT:value\r\nEND:GROUP1"; - group = [CardGroup parseSingleFromSource: versit]; - testEquals([group versitString], versit); - element = [group firstChildWithTag: @"element"]; - testEquals([element flattenedValueAtIndex: 0 forKey: @""], @"value"); - - versit = @"BEGIN:GROUP1\r\nELEMENT:value1;value2\r\nEND:GROUP1"; - group = [CardGroup parseSingleFromSource: versit]; - testEquals([group versitString], versit); - element = [group firstChildWithTag: @"element"]; - testEquals([element flattenedValueAtIndex: 0 forKey: @""], @"value1"); - testEquals([element flattenedValueAtIndex: 1 forKey: @""], @"value2"); - - versit = @"BEGIN:GROUP1\r\nELEMENT:value\\, with comma\r\nEND:GROUP1"; - group = [CardGroup parseSingleFromSource: versit]; - testEquals([group versitString], versit); - element = [group firstChildWithTag: @"element"]; - testEquals([element flattenedValueAtIndex: 0 forKey: @""], @"value, with comma"); - - versit = @"BEGIN:GROUP1\r\nELEMENT:value,with comma\r\nEND:GROUP1"; - group = [CardGroup parseSingleFromSource: versit]; - testEquals([group versitString], versit); - element = [group firstChildWithTag: @"element"]; - testEquals([element valuesAtIndex: 0 forKey: @""], ([NSArray arrayWithObjects: @"value", @"with comma", nil])); - - versit = @"BEGIN:GROUP1\r\nELEMENT:NAMED1=subvalue;NAMED2=subvalue1,subvalue2\r\nEND:GROUP1"; - group = [CardGroup parseSingleFromSource: versit]; - /* we avoid this test here as nothing guarantees that the order of named - values will be preserved... */ - // testEquals([group versitString], versit); - element = [group firstChildWithTag: @"element"]; - testEquals([element flattenedValueAtIndex: 0 forKey: @"NAMED1"], @"subvalue"); - testEquals([element valuesAtIndex: 0 forKey: @"named2"], - ([NSArray arrayWithObjects: @"subvalue1", @"subvalue2", nil])); - - versit = @"BEGIN:GROUP1\r\nELEMENT;PARAM1=test:value\r\nEND:GROUP1"; - group = [CardGroup parseSingleFromSource: versit]; - testEquals([group versitString], versit); - element = [group firstChildWithTag: @"element"]; - testEquals([element flattenedValueAtIndex: 0 forKey: @""], @"value"); - testEquals([element value: 0 ofAttribute: @"param1"], @"test"); - - versit = @"BEGIN:GROUP1\r\nELEMENT;PARAM1=paramvalue1,paramvalue2:value\r\nEND:GROUP1"; - group = [CardGroup parseSingleFromSource: versit]; - testEquals([group versitString], versit); - element = [group firstChildWithTag: @"element"]; - testEquals([element flattenedValueAtIndex: 0 forKey: @""], @"value"); - testEquals([element value: 0 ofAttribute: @"param1"], @"paramvalue1"); - testEquals([element value: 1 ofAttribute: @"param1"], @"paramvalue2"); - - versit = @"BEGIN:GROUP1\r\nELEMENT;PARAM1=paramvalue1\\, with comma:value\r\nEND:GROUP1"; - group = [CardGroup parseSingleFromSource: versit]; - testEquals([group versitString], versit); - element = [group firstChildWithTag: @"element"]; - testEquals([element flattenedValueAtIndex: 0 forKey: @""], @"value"); - testEquals([element value: 0 ofAttribute: @"param1"], @"paramvalue1, with comma"); -} - -@end From 53e125bd7a99d3a09598c0a0615f2aee072ae6ee Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 16 Nov 2011 15:13:53 +0000 Subject: [PATCH 34/38] See ChangeLog Monotone-Parent: 92cceaf860bbf56d983063471093858a3871ec23 Monotone-Revision: e38c570559610854b85c2c517053417779a76964 Monotone-Author: ludovic@Sophos.ca Monotone-Date: 2011-11-16T15:13:53 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 5 +++++ SoObjects/SOGo/SOGoSieveManager.m | 22 ++++++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index e00378f4f..1f0ab2025 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2011-11-16 Ludovic Marcotte + + * SoObjects/SOGo/SOGoSieveManager.m (-updateFiltersForLogin:...) + We now handle connection exceptions to avoid crashing sogod. + 2011-11-13 Wolfgang Sourdeau * OpenChange/MAPIStoreContactsMessage.m (-getPrBody:inMemCtx:): diff --git a/SoObjects/SOGo/SOGoSieveManager.m b/SoObjects/SOGo/SOGoSieveManager.m index 62c91f980..4f32f969e 100644 --- a/SoObjects/SOGo/SOGoSieveManager.m +++ b/SoObjects/SOGo/SOGoSieveManager.m @@ -629,7 +629,7 @@ static NSString *sieveScriptName = @"sogo"; NGSieveClient *client; NSString *filterScript, *v, *sieveServer; int sievePort; - BOOL b; + BOOL b, connected; dd = [user domainDefaults]; if (!([dd sieveScriptsEnabled] || [dd vacationEnabled] || [dd forwardEnabled])) @@ -637,6 +637,8 @@ static NSString *sieveScriptName = @"sogo"; req = [NSMutableArray arrayWithCapacity: 15]; ud = [user userDefaults]; + + connected = YES; b = NO; script = [NSMutableString string]; @@ -793,7 +795,23 @@ static NSString *sieveScriptName = @"sogo"; [client closeConnection]; return NO; } - result = [client login: theLogin authname: theAuthName password: thePassword]; + + NS_DURING + { + result = [client login: theLogin authname: theAuthName password: thePassword]; + } + NS_HANDLER + { + connected = NO; + } + NS_ENDHANDLER + + if (!connected) + { + NSLog(@"Sieve connection failed on %@", [address description]); + return NO; + } + if (![[result valueForKey:@"result"] boolValue]) { NSLog(@"failure. Attempting with a renewed password (no authname supported)"); thePassword = [theAccount imap4PasswordRenewed: YES]; From d1cd50c0e3ee0b0c10a96792bce5316c5ea3459f Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 17 Nov 2011 12:43:51 +0000 Subject: [PATCH 35/38] Fix for bug #1483 Monotone-Parent: e38c570559610854b85c2c517053417779a76964 Monotone-Revision: 9d44b483787d6b5bf34a75581975d592ab901570 Monotone-Author: ludovic@Sophos.ca Monotone-Date: 2011-11-17T12:43:51 Monotone-Branch: ca.inverse.sogo --- SoObjects/SOGo/SOGoGCSFolder.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SoObjects/SOGo/SOGoGCSFolder.m b/SoObjects/SOGo/SOGoGCSFolder.m index 96bb3890f..59a8fd16b 100644 --- a/SoObjects/SOGo/SOGoGCSFolder.m +++ b/SoObjects/SOGo/SOGoGCSFolder.m @@ -1986,7 +1986,7 @@ static NSArray *childRecordFields = nil; [r appendFormat: @""]; [r appendString: baseURL]; - [r appendString: [object objectForKey: @"c_name"]]; + [r appendString: [[object objectForKey: @"c_name"] stringByEscapingURL]]; [r appendString: @""]; // NSLog (@"(appendPropstats...): %@", [NSDate date]); @@ -2032,7 +2032,7 @@ static NSArray *childRecordFields = nil; for (count = 0; count < max; count++) { element = [refs objectAtIndex: count]; - currentURL = [[element firstChild] nodeValue]; + currentURL = [[[element firstChild] nodeValue] stringByUnescapingURL]; [urls addObject: currentURL]; } From 6f13029d21f863a3f0f716d272f923c4cd02dc65 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Thu, 17 Nov 2011 16:15:38 +0000 Subject: [PATCH 36/38] Monotone-Parent: e38c570559610854b85c2c517053417779a76964 Monotone-Revision: 419d3afdcfcc1cddf8eef1f0311d418b03b0d1a0 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-17T16:15:38 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 7 +++ OpenChange/MAPIStoreAppointmentWrapper.h | 7 ++- OpenChange/MAPIStoreAppointmentWrapper.m | 13 ++++-- OpenChange/MAPIStoreCalendarMessage.m | 7 ++- OpenChange/MAPIStoreMailMessage.m | 15 +++++-- OpenChange/MAPIStoreMailVolatileMessage.m | 5 ++- OpenChange/MAPIStoreMessage.h | 4 +- OpenChange/MAPIStoreMessage.m | 52 ++++++++++++++--------- 8 files changed, 76 insertions(+), 34 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1f0ab2025..9410748b3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2011-11-17 Wolfgang Sourdeau + + * OpenChange/MAPIStoreMessage.m (MAPIStoreInternalEntryId): now + takes a ldb_context * parameter pointing to the samdb, which + enables us: 1) to return the real legacyExchangeDN 2) to make use + of sAMAccountName as search parameter for the username. + 2011-11-16 Ludovic Marcotte * SoObjects/SOGo/SOGoSieveManager.m (-updateFiltersForLogin:...) diff --git a/OpenChange/MAPIStoreAppointmentWrapper.h b/OpenChange/MAPIStoreAppointmentWrapper.h index 4fcf2b4d8..fa1cb8f20 100644 --- a/OpenChange/MAPIStoreAppointmentWrapper.h +++ b/OpenChange/MAPIStoreAppointmentWrapper.h @@ -39,6 +39,7 @@ extern NSTimeZone *utcTZ; @interface MAPIStoreAppointmentWrapper : NSObject { + struct mapistore_connection_info *connInfo; iCalCalendar *calendar; iCalEvent *event; NSTimeZone *timeZone; @@ -56,11 +57,13 @@ extern NSTimeZone *utcTZ; + (id) wrapperWithICalEvent: (iCalEvent *) newEvent andUser: (SOGoUser *) newUser andSenderEmail: (NSString *) newSenderEmail - inTimeZone: (NSTimeZone *) newTimeZone; + inTimeZone: (NSTimeZone *) newTimeZone + withConnectionInfo: (struct mapistore_connection_info *) newConnInfo; - (id) initWithICalEvent: (iCalEvent *) newEvent andUser: (SOGoUser *) newUser andSenderEmail: (NSString *) newSenderEmail - inTimeZone: (NSTimeZone *) newTimeZone; + inTimeZone: (NSTimeZone *) newTimeZone + withConnectionInfo: (struct mapistore_connection_info *) newConnInfo; /* getters */ - (void) fillMessageData: (struct mapistore_message *) dataPtr diff --git a/OpenChange/MAPIStoreAppointmentWrapper.m b/OpenChange/MAPIStoreAppointmentWrapper.m index 82753c076..493c5b527 100644 --- a/OpenChange/MAPIStoreAppointmentWrapper.m +++ b/OpenChange/MAPIStoreAppointmentWrapper.m @@ -80,13 +80,15 @@ static NSCharacterSet *hexCharacterSet = nil; andUser: (SOGoUser *) newUser andSenderEmail: (NSString *) newSenderEmail inTimeZone: (NSTimeZone *) newTimeZone + withConnectionInfo: (struct mapistore_connection_info *) newConnInfo { MAPIStoreAppointmentWrapper *wrapper; wrapper = [[self alloc] initWithICalEvent: newEvent andUser: newUser andSenderEmail: newSenderEmail - inTimeZone: newTimeZone]; + inTimeZone: newTimeZone + withConnectionInfo: newConnInfo]; [wrapper autorelease]; return wrapper; @@ -96,6 +98,7 @@ static NSCharacterSet *hexCharacterSet = nil; { if ((self = [super init])) { + connInfo = NULL; calendar = nil; event = nil; timeZone = nil; @@ -178,9 +181,11 @@ static NSCharacterSet *hexCharacterSet = nil; andUser: (SOGoUser *) newUser andSenderEmail: (NSString *) newSenderEmail inTimeZone: (NSTimeZone *) newTimeZone + withConnectionInfo: (struct mapistore_connection_info *) newConnInfo { if ((self = [self init])) { + connInfo = newConnInfo; ASSIGN (event, newEvent); ASSIGN (calendar, [event parent]); ASSIGN (timeZone, newTimeZone); @@ -256,7 +261,7 @@ static NSCharacterSet *hexCharacterSet = nil; { username = [contactInfos objectForKey: @"c_uid"]; recipient->username = [username asUnicodeInMemCtx: msgData]; - entryId = MAPIStoreInternalEntryId (username); + entryId = MAPIStoreInternalEntryId (connInfo->sam_ctx, username); } else { @@ -357,7 +362,7 @@ static NSCharacterSet *hexCharacterSet = nil; { username = [contactInfos objectForKey: @"c_uid"]; recipient->username = [username asUnicodeInMemCtx: msgData]; - entryId = MAPIStoreInternalEntryId (username); + entryId = MAPIStoreInternalEntryId (connInfo->sam_ctx, username); } else { @@ -727,7 +732,7 @@ static NSCharacterSet *hexCharacterSet = nil; if (contactInfos) { username = [contactInfos objectForKey: @"c_uid"]; - entryId = MAPIStoreInternalEntryId (username); + entryId = MAPIStoreInternalEntryId (connInfo->sam_ctx, username); } else entryId = MAPIStoreExternalEntryId (cn, email); diff --git a/OpenChange/MAPIStoreCalendarMessage.m b/OpenChange/MAPIStoreCalendarMessage.m index 33b7ffe9d..73729cc66 100644 --- a/OpenChange/MAPIStoreCalendarMessage.m +++ b/OpenChange/MAPIStoreCalendarMessage.m @@ -104,15 +104,18 @@ - (MAPIStoreAppointmentWrapper *) appointmentWrapper { iCalEvent *event; + MAPIStoreContext *context; if (!appointmentWrapper) { event = [sogoObject component: NO secure: NO]; + context = [self context]; ASSIGN (appointmentWrapper, [MAPIStoreAppointmentWrapper wrapperWithICalEvent: event - andUser: [[self context] activeUser] + andUser: [context activeUser] andSenderEmail: nil - inTimeZone: [self ownerTimeZone]]); + inTimeZone: [self ownerTimeZone] + withConnectionInfo: [context connectionInfo]]); } return appointmentWrapper; diff --git a/OpenChange/MAPIStoreMailMessage.m b/OpenChange/MAPIStoreMailMessage.m index 7ab44bd2b..6c148f5b1 100644 --- a/OpenChange/MAPIStoreMailMessage.m +++ b/OpenChange/MAPIStoreMailMessage.m @@ -263,6 +263,7 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) iCalCalendar *calendar; iCalEvent *event; NSString *stringValue, *senderEmail; + MAPIStoreContext *context; if (!appointmentWrapper) { @@ -280,11 +281,13 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) senderEmail = [[from objectAtIndex: 0] email]; else senderEmail = nil; + context = [self context]; appointmentWrapper = [MAPIStoreAppointmentWrapper wrapperWithICalEvent: event - andUser: [[self context] activeUser] + andUser: [context activeUser] andSenderEmail: senderEmail - inTimeZone: [self ownerTimeZone]]; + inTimeZone: [self ownerTimeZone] + withConnectionInfo: [context connectionInfo]]; [appointmentWrapper retain]; } } @@ -721,6 +724,7 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) NSDictionary *contactInfos; NGMailAddress *ngAddress; NSData *entryId; + struct ldb_context *samCtx; int rc; if (fullMail) @@ -743,7 +747,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) if (contactInfos) { username = [contactInfos objectForKey: @"c_uid"]; - entryId = MAPIStoreInternalEntryId (username); + samCtx = [[self context] connectionInfo]->sam_ctx; + entryId = MAPIStoreInternalEntryId (samCtx, username); } else entryId = MAPIStoreExternalEntryId (cn, email); @@ -1349,9 +1354,11 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) NSData *entryId; NSDictionary *contactInfos; SOGoUserManager *mgr; + struct ldb_context *samCtx; struct mapistore_message *msgData; struct mapistore_message_recipient *recipient; + samCtx = [[self context] connectionInfo]->sam_ctx; [super getMessageData: &msgData inMemCtx: memCtx]; if (!headerSetup) @@ -1397,7 +1404,7 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) { username = [contactInfos objectForKey: @"c_uid"]; recipient->username = [username asUnicodeInMemCtx: msgData]; - entryId = MAPIStoreInternalEntryId (username); + entryId = MAPIStoreInternalEntryId (samCtx, username); } else { diff --git a/OpenChange/MAPIStoreMailVolatileMessage.m b/OpenChange/MAPIStoreMailVolatileMessage.m index bc62b181a..b23eefd6d 100644 --- a/OpenChange/MAPIStoreMailVolatileMessage.m +++ b/OpenChange/MAPIStoreMailVolatileMessage.m @@ -249,10 +249,13 @@ static NSString *recTypes[] = { @"orig", @"to", @"cc", @"bcc" }; NSData *entryId; NSDictionary *allRecipients, *dict, *contactInfos; SOGoUserManager *mgr; + struct ldb_context *samCtx; struct mapistore_message *msgData; struct mapistore_message_recipient *recipient; enum ulRecipClass type; + samCtx = [[self context] connectionInfo]->sam_ctx; + [super getMessageData: &msgData inMemCtx: memCtx]; allRecipients = [[sogoObject properties] objectForKey: @"recipients"]; @@ -295,7 +298,7 @@ static NSString *recTypes[] = { @"orig", @"to", @"cc", @"bcc" }; { username = [contactInfos objectForKey: @"c_uid"]; recipient->username = [username asUnicodeInMemCtx: msgData]; - entryId = MAPIStoreInternalEntryId (username); + entryId = MAPIStoreInternalEntryId (samCtx, username); } else { diff --git a/OpenChange/MAPIStoreMessage.h b/OpenChange/MAPIStoreMessage.h index 85c3d2d9b..9270fb973 100644 --- a/OpenChange/MAPIStoreMessage.h +++ b/OpenChange/MAPIStoreMessage.h @@ -35,9 +35,11 @@ @class MAPIStoreAttachmentTable; @class MAPIStoreFolder; +struct ldb_context; + #import "MAPIStoreObject.h" -extern NSData *MAPIStoreInternalEntryId (NSString *username); +extern NSData *MAPIStoreInternalEntryId (struct ldb_context *, NSString *username); extern NSData *MAPIStoreExternalEntryId (NSString *cn, NSString *email); @interface MAPIStoreMessage : MAPIStoreObject diff --git a/OpenChange/MAPIStoreMessage.m b/OpenChange/MAPIStoreMessage.m index 6c912c6e3..b5c9d3fe7 100644 --- a/OpenChange/MAPIStoreMessage.m +++ b/OpenChange/MAPIStoreMessage.m @@ -55,14 +55,18 @@ static NSString *resourcesDir = nil; NSData * -MAPIStoreInternalEntryId (NSString *username) +MAPIStoreInternalEntryId (struct ldb_context *samCtx, NSString *username) { - NSMutableData *entryId; - static uint8_t providerUid[] = { 0xdc, 0xa7, 0x40, 0xc8, - 0xc0, 0x42, 0x10, 0x1a, - 0xb4, 0xb9, 0x08, 0x00, - 0x2b, 0x2f, 0xe1, 0x82 }; - NSString *x500dn; + NSMutableData *entryId = nil; + TALLOC_CTX *memCtx; + struct ldb_result *res = NULL; + const char * const attrs[] = { "legacyExchangeDN", NULL }; + const char *legacyDn; + int ret; + static const uint8_t const providerUid[] = { 0xdc, 0xa7, 0x40, 0xc8, + 0xc0, 0x42, 0x10, 0x1a, + 0xb4, 0xb9, 0x08, 0x00, + 0x2b, 0x2f, 0xe1, 0x82 }; /* structure: flags: 32 @@ -71,20 +75,28 @@ MAPIStoreInternalEntryId (NSString *username) type: 32 X500DN: variable */ - entryId = [NSMutableData dataWithCapacity: 256]; - [entryId appendUInt32: 0]; // flags - [entryId appendBytes: providerUid length: 16]; // provideruid - [entryId appendUInt32: 1]; // version - [entryId appendUInt32: 0]; // type (local mail user) + memCtx = talloc_zero(NULL, TALLOC_CTX); - /* X500DN */ - /* FIXME: the DN will likely work on DEMO installations for now but we - really should get the dn prefix from the server */ - x500dn = [NSString stringWithFormat: @"/O=FIRST ORGANIZATION" - @"/OU=FIRST ADMINISTRATIVE GROUP" - @"/CN=RECIPIENTS/CN=%@", username]; - [entryId appendData: [x500dn dataUsingEncoding: NSISOLatin1StringEncoding]]; - [entryId appendUInt8: 0]; + /* Search mapistoreURI given partial URI */ + ret = ldb_search (samCtx, memCtx, &res, ldb_get_default_basedn(samCtx), + LDB_SCOPE_SUBTREE, attrs, + "(&(objectClass=user)(sAMAccountName=%s))", + [username UTF8String]); + if (ret == LDB_SUCCESS && res->count == 1) + { + legacyDn = ldb_msg_find_attr_as_string (res->msgs[0], attrs[0], NULL); + if (legacyDn) + { + entryId = [NSMutableData dataWithCapacity: 256]; + [entryId appendUInt32: 0]; // flags + [entryId appendBytes: providerUid length: 16]; // provideruid + [entryId appendUInt32: 1]; // version + [entryId appendUInt32: 0]; // type (local mail user) + [entryId appendBytes: legacyDn length: strlen (legacyDn) + 1]; // x500dn + } + } + + talloc_free(memCtx); return entryId; } From 601c63ae6f4a7de7cb99c5843c7068d053f3a1cd Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Thu, 17 Nov 2011 18:30:48 +0000 Subject: [PATCH 37/38] Monotone-Parent: 1cc1f0928d45b737424141e1efb38e5b729b89d7 Monotone-Revision: 12ff4c07aa1f796a3312a4e79566255dbd94aece Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-17T18:30:48 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 5 +++ OpenChange/MAPIStoreSamDBUtils.h | 34 ++++++++++++++++++ OpenChange/MAPIStoreSamDBUtils.m | 62 ++++++++++++++++++++++++++++++++ 3 files changed, 101 insertions(+) create mode 100644 OpenChange/MAPIStoreSamDBUtils.h create mode 100644 OpenChange/MAPIStoreSamDBUtils.m diff --git a/ChangeLog b/ChangeLog index 9410748b3..5de14ea5e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2011-11-17 Wolfgang Sourdeau + * OpenChange/MAPIStoreSamDBUtils.m: new module containing helpers + pertaining to the SamDB. + (MAPIStoreSamDBUserAttribute): new function that returns the value + of a specified key from a user record matching one simple criteria. + * OpenChange/MAPIStoreMessage.m (MAPIStoreInternalEntryId): now takes a ldb_context * parameter pointing to the samdb, which enables us: 1) to return the real legacyExchangeDN 2) to make use diff --git a/OpenChange/MAPIStoreSamDBUtils.h b/OpenChange/MAPIStoreSamDBUtils.h new file mode 100644 index 000000000..d8220992f --- /dev/null +++ b/OpenChange/MAPIStoreSamDBUtils.h @@ -0,0 +1,34 @@ +/* MAPIStoreSamDBUtils.h - this file is part of SOGo + * + * Copyright (C) 2011 Inverse inc + * + * Author: Wolfgang Sourdeau + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef MAPISTORESAMDBUTILS_H +#define MAPISTORESAMDBUTILS_H + +@class NSString; +struct ldb_context; + +NSString *MAPIStoreSamDBUserAttribute (struct ldb_context *samCtx, + NSString *userKey, + NSString *value, + NSString *attributeName); + +#endif /* MAPISTORESAMDBUTILS_H */ diff --git a/OpenChange/MAPIStoreSamDBUtils.m b/OpenChange/MAPIStoreSamDBUtils.m new file mode 100644 index 000000000..ed8d6a0b5 --- /dev/null +++ b/OpenChange/MAPIStoreSamDBUtils.m @@ -0,0 +1,62 @@ +/* MAPIStoreSamDBUtils.m - this file is part of SOGo + * + * Copyright (C) 2011 Inverse inc + * + * Author: Wolfgang Sourdeau + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#import +#include +#include + +#import "MAPIStoreSamDBUtils.h" + +NSString * +MAPIStoreSamDBUserAttribute (struct ldb_context *samCtx, + NSString *userKey, + NSString *value, + NSString *attributeName) +{ + NSString *resultValue = nil; + const char *attrs[] = { "", NULL }; + NSString *searchFormat; + const char *result; + struct ldb_result *res = NULL; + TALLOC_CTX *memCtx; + int ret; + + memCtx = talloc_zero(NULL, TALLOC_CTX); + + attrs[0] = [attributeName UTF8String]; + searchFormat + = [NSString stringWithFormat: @"(&(objectClass=user)(%@=%%s))", userKey]; + ret = ldb_search (samCtx, memCtx, &res, ldb_get_default_basedn(samCtx), + LDB_SCOPE_SUBTREE, attrs, + [searchFormat UTF8String], + [value UTF8String]); + if (ret == LDB_SUCCESS && res->count == 1) + { + result = ldb_msg_find_attr_as_string (res->msgs[0], attrs[0], NULL); + if (result) + resultValue = [NSString stringWithUTF8String: result]; + } + + talloc_free (memCtx); + + return resultValue; +} From cb4341db75433148156d4f2a94e962b62be3da3e Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Thu, 17 Nov 2011 18:39:42 +0000 Subject: [PATCH 38/38] Monotone-Parent: 12ff4c07aa1f796a3312a4e79566255dbd94aece Monotone-Revision: dd0644b62704e75dfed8a39a7e286d593f0014e0 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-17T18:39:42 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 2 + OpenChange/MAPIStoreAppointmentWrapper.m | 2 +- OpenChange/MAPIStoreMailMessage.m | 1 + OpenChange/MAPIStoreMailVolatileMessage.m | 1 + OpenChange/MAPIStoreMessage.h | 5 - OpenChange/MAPIStoreMessage.m | 111 +--------------------- OpenChange/MAPIStoreSamDBUtils.h | 3 + OpenChange/MAPIStoreSamDBUtils.m | 103 ++++++++++++++++++++ 8 files changed, 112 insertions(+), 116 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5de14ea5e..9d97a55a7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,6 +4,8 @@ pertaining to the SamDB. (MAPIStoreSamDBUserAttribute): new function that returns the value of a specified key from a user record matching one simple criteria. + (MAPIStoreInternalEntrydId, MAPIStoreExternalEntryId): moved + functions from MAPIStoreMessage.m. * OpenChange/MAPIStoreMessage.m (MAPIStoreInternalEntryId): now takes a ldb_context * parameter pointing to the samdb, which diff --git a/OpenChange/MAPIStoreAppointmentWrapper.m b/OpenChange/MAPIStoreAppointmentWrapper.m index 493c5b527..c1f0e8b90 100644 --- a/OpenChange/MAPIStoreAppointmentWrapper.m +++ b/OpenChange/MAPIStoreAppointmentWrapper.m @@ -37,8 +37,8 @@ #import #import -#import "MAPIStoreMessage.h" #import "MAPIStoreRecurrenceUtils.h" +#import "MAPIStoreSamDBUtils.h" #import "MAPIStoreTypes.h" #import "NSData+MAPIStore.h" #import "NSDate+MAPIStore.h" diff --git a/OpenChange/MAPIStoreMailMessage.m b/OpenChange/MAPIStoreMailMessage.m index 6c148f5b1..8c165cc6e 100644 --- a/OpenChange/MAPIStoreMailMessage.m +++ b/OpenChange/MAPIStoreMailMessage.m @@ -48,6 +48,7 @@ #import "MAPIStoreMailAttachment.h" #import "MAPIStoreMailFolder.h" #import "MAPIStoreMapping.h" +#import "MAPIStoreSamDBUtils.h" #import "MAPIStoreTypes.h" #import "MAPIStoreMailMessage.h" diff --git a/OpenChange/MAPIStoreMailVolatileMessage.m b/OpenChange/MAPIStoreMailVolatileMessage.m index b23eefd6d..5952eb405 100644 --- a/OpenChange/MAPIStoreMailVolatileMessage.m +++ b/OpenChange/MAPIStoreMailVolatileMessage.m @@ -54,6 +54,7 @@ #import "MAPIStoreMailFolder.h" #import "MAPIStoreMIME.h" #import "MAPIStoreMapping.h" +#import "MAPIStoreSamDBUtils.h" #import "MAPIStoreTypes.h" #import "NSData+MAPIStore.h" #import "NSObject+MAPIStore.h" diff --git a/OpenChange/MAPIStoreMessage.h b/OpenChange/MAPIStoreMessage.h index 9270fb973..83dfa57a2 100644 --- a/OpenChange/MAPIStoreMessage.h +++ b/OpenChange/MAPIStoreMessage.h @@ -35,13 +35,8 @@ @class MAPIStoreAttachmentTable; @class MAPIStoreFolder; -struct ldb_context; - #import "MAPIStoreObject.h" -extern NSData *MAPIStoreInternalEntryId (struct ldb_context *, NSString *username); -extern NSData *MAPIStoreExternalEntryId (NSString *cn, NSString *email); - @interface MAPIStoreMessage : MAPIStoreObject { NSArray *attachmentKeys; diff --git a/OpenChange/MAPIStoreMessage.m b/OpenChange/MAPIStoreMessage.m index b5c9d3fe7..f2c78814e 100644 --- a/OpenChange/MAPIStoreMessage.m +++ b/OpenChange/MAPIStoreMessage.m @@ -36,6 +36,7 @@ #import "MAPIStoreContext.h" #import "MAPIStoreFolder.h" #import "MAPIStorePropertySelectors.h" +#import "MAPIStoreSamDBUtils.h" #import "MAPIStoreTypes.h" #import "NSData+MAPIStore.h" #import "NSObject+MAPIStore.h" @@ -54,116 +55,6 @@ static NSString *resourcesDir = nil; -NSData * -MAPIStoreInternalEntryId (struct ldb_context *samCtx, NSString *username) -{ - NSMutableData *entryId = nil; - TALLOC_CTX *memCtx; - struct ldb_result *res = NULL; - const char * const attrs[] = { "legacyExchangeDN", NULL }; - const char *legacyDn; - int ret; - static const uint8_t const providerUid[] = { 0xdc, 0xa7, 0x40, 0xc8, - 0xc0, 0x42, 0x10, 0x1a, - 0xb4, 0xb9, 0x08, 0x00, - 0x2b, 0x2f, 0xe1, 0x82 }; - - /* structure: - flags: 32 - provideruid: 32 * 4 - version: 32 - type: 32 - X500DN: variable */ - - memCtx = talloc_zero(NULL, TALLOC_CTX); - - /* Search mapistoreURI given partial URI */ - ret = ldb_search (samCtx, memCtx, &res, ldb_get_default_basedn(samCtx), - LDB_SCOPE_SUBTREE, attrs, - "(&(objectClass=user)(sAMAccountName=%s))", - [username UTF8String]); - if (ret == LDB_SUCCESS && res->count == 1) - { - legacyDn = ldb_msg_find_attr_as_string (res->msgs[0], attrs[0], NULL); - if (legacyDn) - { - entryId = [NSMutableData dataWithCapacity: 256]; - [entryId appendUInt32: 0]; // flags - [entryId appendBytes: providerUid length: 16]; // provideruid - [entryId appendUInt32: 1]; // version - [entryId appendUInt32: 0]; // type (local mail user) - [entryId appendBytes: legacyDn length: strlen (legacyDn) + 1]; // x500dn - } - } - - talloc_free(memCtx); - - return entryId; -} - -NSData * -MAPIStoreExternalEntryId (NSString *cn, NSString *email) -{ - NSMutableData *entryId; - static uint8_t providerUid[] = { 0x81, 0x2b, 0x1f, 0xa4, - 0xbe, 0xa3, 0x10, 0x19, - 0x9d, 0x6e, 0x00, 0xdd, - 0x01, 0x0f, 0x54, 0x02 }; - uint8_t flags21, flags22; - - /* structure: - flags: 32 - provideruid: 32 * 4 - version: 16 - { - PaD: 1 - MAE: 2 - Format: 4 - M: 1 - U: 1 - R: 2 - L: 1 - Pad: 4 - } - DisplayName: variable - AddressType: variable - EmailAddress: variable */ - - entryId = [NSMutableData dataWithCapacity: 256]; - [entryId appendUInt32: 0]; // flags - [entryId appendBytes: providerUid length: 16]; // provideruid - [entryId appendUInt16: 0]; // version - - flags21 = 0; /* PaD, MAE, R, Pad = 0 */ - flags21 |= 0x16; /* Format: text and HTML */ - flags21 |= 0x01; /* M: mime format */ - - flags22 = 0x90; /* U: unicode, L: no lookup */ - [entryId appendUInt8: flags21]; - [entryId appendUInt8: flags22]; - - /* DisplayName */ - if (!cn) - cn = @""; - [entryId - appendData: [cn dataUsingEncoding: NSUTF16LittleEndianStringEncoding]]; - [entryId appendUInt16: 0]; - - /* AddressType */ - [entryId - appendData: [@"SMTP" dataUsingEncoding: NSUTF16LittleEndianStringEncoding]]; - [entryId appendUInt16: 0]; - - /* EMailAddress */ - if (!email) - email = @""; - [entryId - appendData: [email dataUsingEncoding: NSUTF16LittleEndianStringEncoding]]; - [entryId appendUInt16: 0]; - - return entryId; -} - /* rtf conversion via unrtf */ static int unrtf_data_output (void *data, const char *str, size_t str_len) diff --git a/OpenChange/MAPIStoreSamDBUtils.h b/OpenChange/MAPIStoreSamDBUtils.h index d8220992f..c58a12686 100644 --- a/OpenChange/MAPIStoreSamDBUtils.h +++ b/OpenChange/MAPIStoreSamDBUtils.h @@ -24,11 +24,14 @@ #define MAPISTORESAMDBUTILS_H @class NSString; + struct ldb_context; NSString *MAPIStoreSamDBUserAttribute (struct ldb_context *samCtx, NSString *userKey, NSString *value, NSString *attributeName); +NSData *MAPIStoreInternalEntryId (struct ldb_context *, NSString *username); +NSData *MAPIStoreExternalEntryId (NSString *cn, NSString *email); #endif /* MAPISTORESAMDBUTILS_H */ diff --git a/OpenChange/MAPIStoreSamDBUtils.m b/OpenChange/MAPIStoreSamDBUtils.m index ed8d6a0b5..4d7caff63 100644 --- a/OpenChange/MAPIStoreSamDBUtils.m +++ b/OpenChange/MAPIStoreSamDBUtils.m @@ -20,10 +20,13 @@ * Boston, MA 02111-1307, USA. */ +#import #import #include #include +#import "NSData+MAPIStore.h" + #import "MAPIStoreSamDBUtils.h" NSString * @@ -60,3 +63,103 @@ MAPIStoreSamDBUserAttribute (struct ldb_context *samCtx, return resultValue; } + +NSData * +MAPIStoreInternalEntryId (struct ldb_context *samCtx, NSString *username) +{ + static const uint8_t const providerUid[] = { 0xdc, 0xa7, 0x40, 0xc8, + 0xc0, 0x42, 0x10, 0x1a, + 0xb4, 0xb9, 0x08, 0x00, + 0x2b, 0x2f, 0xe1, 0x82 }; + NSMutableData *entryId; + NSData *legacyDNData; + NSString *legacyDN; + + /* structure: + flags: 32 + provideruid: 32 * 4 + version: 32 + type: 32 + X500DN: variable */ + + legacyDN = MAPIStoreSamDBUserAttribute (samCtx, @"sAMAccountName", username, + @"legacyExchangeDN"); + if (legacyDN) + { + entryId = [NSMutableData dataWithCapacity: 256]; + [entryId appendUInt32: 0]; // flags + [entryId appendBytes: providerUid length: 16]; // provideruid + [entryId appendUInt32: 1]; // version + [entryId appendUInt32: 0]; // type (local mail user) + legacyDNData = [legacyDN dataUsingEncoding: NSASCIIStringEncoding]; + [entryId appendData: legacyDNData]; // x500dn + [entryId appendUInt8: 0]; // end of string + } + else + entryId = nil; + + return entryId; +} + +NSData * +MAPIStoreExternalEntryId (NSString *cn, NSString *email) +{ + NSMutableData *entryId; + static uint8_t providerUid[] = { 0x81, 0x2b, 0x1f, 0xa4, + 0xbe, 0xa3, 0x10, 0x19, + 0x9d, 0x6e, 0x00, 0xdd, + 0x01, 0x0f, 0x54, 0x02 }; + uint8_t flags21, flags22; + + /* structure: + flags: 32 + provideruid: 32 * 4 + version: 16 + { + PaD: 1 + MAE: 2 + Format: 4 + M: 1 + U: 1 + R: 2 + L: 1 + Pad: 4 + } + DisplayName: variable + AddressType: variable + EmailAddress: variable */ + + entryId = [NSMutableData dataWithCapacity: 256]; + [entryId appendUInt32: 0]; // flags + [entryId appendBytes: providerUid length: 16]; // provideruid + [entryId appendUInt16: 0]; // version + + flags21 = 0; /* PaD, MAE, R, Pad = 0 */ + flags21 |= 0x16; /* Format: text and HTML */ + flags21 |= 0x01; /* M: mime format */ + + flags22 = 0x90; /* U: unicode, L: no lookup */ + [entryId appendUInt8: flags21]; + [entryId appendUInt8: flags22]; + + /* DisplayName */ + if (!cn) + cn = @""; + [entryId + appendData: [cn dataUsingEncoding: NSUTF16LittleEndianStringEncoding]]; + [entryId appendUInt16: 0]; + + /* AddressType */ + [entryId + appendData: [@"SMTP" dataUsingEncoding: NSUTF16LittleEndianStringEncoding]]; + [entryId appendUInt16: 0]; + + /* EMailAddress */ + if (!email) + email = @""; + [entryId + appendData: [email dataUsingEncoding: NSUTF16LittleEndianStringEncoding]]; + [entryId appendUInt16: 0]; + + return entryId; +}