diff --git a/.tx/config b/.tx/config index 9a5f5d566..aaff32706 100644 --- a/.tx/config +++ b/.tx/config @@ -18,10 +18,12 @@ trans.fr = UI/MailerUI/French.lproj/Localizable.strings trans.hu = UI/MailerUI/Hungarian.lproj/Localizable.strings trans.is = UI/MailerUI/Icelandic.lproj/Localizable.strings trans.it = UI/MailerUI/Italian.lproj/Localizable.strings +trans.mk_MK = UI/MailerUI/Macedonian.lproj/Localizable.strings trans.nb_NO = UI/MailerUI/NorwegianBokmal.lproj/Localizable.strings trans.nl = UI/MailerUI/Dutch.lproj/Localizable.strings trans.nn_NO = UI/MailerUI/NorwegianNynorsk.lproj/Localizable.strings trans.pl = UI/MailerUI/Polish.lproj/Localizable.strings +trans.pt = UI/MailerUI/Portuguese.lproj/Localizable.strings trans.pt_BR = UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings trans.ru = UI/MailerUI/Russian.lproj/Localizable.strings trans.sk = UI/MailerUI/Slovak.lproj/Localizable.strings @@ -47,10 +49,12 @@ trans.fr = UI/PreferencesUI/French.lproj/Localizable.strings trans.hu = UI/PreferencesUI/Hungarian.lproj/Localizable.strings trans.is = UI/PreferencesUI/Icelandic.lproj/Localizable.strings trans.it = UI/PreferencesUI/Italian.lproj/Localizable.strings +trans.mk_MK = UI/PreferencesUI/Macedonian.lproj/Localizable.strings trans.nb_NO = UI/PreferencesUI/NorwegianBokmal.lproj/Localizable.strings trans.nl = UI/PreferencesUI/Dutch.lproj/Localizable.strings trans.nn_NO = UI/PreferencesUI/NorwegianNynorsk.lproj/Localizable.strings trans.pl = UI/PreferencesUI/Polish.lproj/Localizable.strings +trans.pt = UI/PreferencesUI/Portuguese.lproj/Localizable.strings trans.pt_BR = UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings trans.ru = UI/PreferencesUI/Russian.lproj/Localizable.strings trans.sk = UI/PreferencesUI/Slovak.lproj/Localizable.strings @@ -76,10 +80,12 @@ trans.fr = UI/Scheduler/French.lproj/Localizable.strings trans.hu = UI/Scheduler/Hungarian.lproj/Localizable.strings trans.is = UI/Scheduler/Icelandic.lproj/Localizable.strings trans.it = UI/Scheduler/Italian.lproj/Localizable.strings +trans.mk_MK = UI/Scheduler/Macedonian.lproj/Localizable.strings trans.nb_NO = UI/Scheduler/NorwegianBokmal.lproj/Localizable.strings trans.nl = UI/Scheduler/Dutch.lproj/Localizable.strings trans.nn_NO = UI/Scheduler/NorwegianNynorsk.lproj/Localizable.strings trans.pl = UI/Scheduler/Polish.lproj/Localizable.strings +trans.pt = UI/Scheduler/Portuguese.lproj/Localizable.strings trans.pt_BR = UI/Scheduler/BrazilianPortuguese.lproj/Localizable.strings trans.ru = UI/Scheduler/Russian.lproj/Localizable.strings trans.sk = UI/Scheduler/Slovak.lproj/Localizable.strings @@ -105,10 +111,12 @@ trans.fr = UI/Contacts/French.lproj/Localizable.strings trans.hu = UI/Contacts/Hungarian.lproj/Localizable.strings trans.is = UI/Contacts/Icelandic.lproj/Localizable.strings trans.it = UI/Contacts/Italian.lproj/Localizable.strings +trans.mk_MK = UI/Contacts/Macedonian.lproj/Localizable.strings trans.nb_NO = UI/Contacts/NorwegianBokmal.lproj/Localizable.strings trans.nl = UI/Contacts/Dutch.lproj/Localizable.strings trans.nn_NO = UI/Contacts/NorwegianNynorsk.lproj/Localizable.strings trans.pl = UI/Contacts/Polish.lproj/Localizable.strings +trans.pt = UI/Contacts/Portuguese.lproj/Localizable.strings trans.pt_BR = UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings trans.ru = UI/Contacts/Russian.lproj/Localizable.strings trans.sk = UI/Contacts/Slovak.lproj/Localizable.strings @@ -134,10 +142,12 @@ trans.fr = UI/MainUI/French.lproj/Localizable.strings trans.hu = UI/MainUI/Hungarian.lproj/Localizable.strings trans.is = UI/MainUI/Icelandic.lproj/Localizable.strings trans.it = UI/MainUI/Italian.lproj/Localizable.strings +trans.mk_MK = UI/MainUI/Macedonian.lproj/Localizable.strings trans.nb_NO = UI/MainUI/NorwegianBokmal.lproj/Localizable.strings trans.nl = UI/MainUI/Dutch.lproj/Localizable.strings trans.nn_NO = UI/MainUI/NorwegianNynorsk.lproj/Localizable.strings trans.pl = UI/MainUI/Polish.lproj/Localizable.strings +trans.pt = UI/MainUI/Portuguese.lproj/Localizable.strings trans.pt_BR = UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings trans.ru = UI/MainUI/Russian.lproj/Localizable.strings trans.sk = UI/MainUI/Slovak.lproj/Localizable.strings @@ -163,10 +173,12 @@ trans.fr = UI/Common/French.lproj/Localizable.strings trans.hu = UI/Common/Hungarian.lproj/Localizable.strings trans.is = UI/Common/Icelandic.lproj/Localizable.strings trans.it = UI/Common/Italian.lproj/Localizable.strings +trans.mk_MK = UI/Common/Macedonian.lproj/Localizable.strings trans.nb_NO = UI/Common/NorwegianBokmal.lproj/Localizable.strings trans.nl = UI/Common/Dutch.lproj/Localizable.strings trans.nn_NO = UI/Common/NorwegianNynorsk.lproj/Localizable.strings trans.pl = UI/Common/Polish.lproj/Localizable.strings +trans.pt = UI/Common/Portuguese.lproj/Localizable.strings trans.pt_BR = UI/Common/BrazilianPortuguese.lproj/Localizable.strings trans.ru = UI/Common/Russian.lproj/Localizable.strings trans.sk = UI/Common/Slovak.lproj/Localizable.strings @@ -192,10 +204,12 @@ trans.fr = UI/AdministrationUI/French.lproj/Localizable.strings trans.hu = UI/AdministrationUI/Hungarian.lproj/Localizable.strings trans.is = UI/AdministrationUI/Icelandic.lproj/Localizable.strings trans.it = UI/AdministrationUI/Italian.lproj/Localizable.strings +trans.mk_MK = UI/AdministrationUI/Macedonian.lproj/Localizable.strings trans.nb_NO = UI/AdministrationUI/NorwegianBokmal.lproj/Localizable.strings trans.nl = UI/AdministrationUI/Dutch.lproj/Localizable.strings trans.nn_NO = UI/AdministrationUI/NorwegianNynorsk.lproj/Localizable.strings trans.pl = UI/AdministrationUI/Polish.lproj/Localizable.strings +trans.pt = UI/AdministrationUI/Portuguese.lproj/Localizable.strings trans.pt_BR = UI/AdministrationUI/BrazilianPortuguese.lproj/Localizable.strings trans.ru = UI/AdministrationUI/Russian.lproj/Localizable.strings trans.sk = UI/AdministrationUI/Slovak.lproj/Localizable.strings @@ -221,10 +235,12 @@ trans.fr = SoObjects/Appointments/French.lproj/Localizable.strings trans.hu = SoObjects/Appointments/Hungarian.lproj/Localizable.strings trans.is = SoObjects/Appointments/Icelandic.lproj/Localizable.strings trans.it = SoObjects/Appointments/Italian.lproj/Localizable.strings +trans.mk_MK = SoObjects/Appointments/Macedonian.lproj/Localizable.strings trans.nb_NO = SoObjects/Appointments/NorwegianBokmal.lproj/Localizable.strings trans.nl = SoObjects/Appointments/Dutch.lproj/Localizable.strings trans.nn_NO = SoObjects/Appointments/NorwegianNynorsk.lproj/Localizable.strings trans.pl = SoObjects/Appointments/Polish.lproj/Localizable.strings +trans.pt = SoObjects/Appointments/Portuguese.lproj/Localizable.strings trans.pt_BR = SoObjects/Appointments/BrazilianPortuguese.lproj/Localizable.strings trans.ru = SoObjects/Appointments/Russian.lproj/Localizable.strings trans.sk = SoObjects/Appointments/Slovak.lproj/Localizable.strings @@ -250,10 +266,12 @@ trans.fr = SoObjects/Contacts/French.lproj/Localizable.strings trans.hu = SoObjects/Contacts/Hungarian.lproj/Localizable.strings trans.is = SoObjects/Contacts/Icelandic.lproj/Localizable.strings trans.it = SoObjects/Contacts/Italian.lproj/Localizable.strings +trans.mk_MK = SoObjects/Contacts/Macedonian.lproj/Localizable.strings trans.nb_NO = SoObjects/Contacts/NorwegianBokmal.lproj/Localizable.strings trans.nl = SoObjects/Contacts/Dutch.lproj/Localizable.strings trans.nn_NO = SoObjects/Contacts/NorwegianNynorsk.lproj/Localizable.strings trans.pl = SoObjects/Contacts/Polish.lproj/Localizable.strings +trans.pt = SoObjects/Contacts/Portuguese.lproj/Localizable.strings trans.pt_BR = SoObjects/Contacts/BrazilianPortuguese.lproj/Localizable.strings trans.ru = SoObjects/Contacts/Russian.lproj/Localizable.strings trans.sk = SoObjects/Contacts/Slovak.lproj/Localizable.strings @@ -279,10 +297,12 @@ trans.fr = SoObjects/Mailer/French.lproj/Localizable.strings trans.hu = SoObjects/Mailer/Hungarian.lproj/Localizable.strings trans.is = SoObjects/Mailer/Icelandic.lproj/Localizable.strings trans.it = SoObjects/Mailer/Italian.lproj/Localizable.strings +trans.mk_MK = SoObjects/Mailer/Macedonian.lproj/Localizable.strings trans.nb_NO = SoObjects/Mailer/NorwegianBokmal.lproj/Localizable.strings trans.nl = SoObjects/Mailer/Dutch.lproj/Localizable.strings trans.nn_NO = SoObjects/Mailer/NorwegianNynorsk.lproj/Localizable.strings trans.pl = SoObjects/Mailer/Polish.lproj/Localizable.strings +trans.pt = SoObjects/Mailer/Portuguese.lproj/Localizable.strings trans.pt_BR = SoObjects/Mailer/BrazilianPortuguese.lproj/Localizable.strings trans.ru = SoObjects/Mailer/Russian.lproj/Localizable.strings trans.sk = SoObjects/Mailer/Slovak.lproj/Localizable.strings @@ -308,10 +328,12 @@ trans.fr = UI/MailPartViewers/French.lproj/Localizable.strings trans.hu = UI/MailPartViewers/Hungarian.lproj/Localizable.strings trans.is = UI/MailPartViewers/Icelandic.lproj/Localizable.strings trans.it = UI/MailPartViewers/Italian.lproj/Localizable.strings +trans.mk_MK = UI/MailPartViewers/Macedonian.lproj/Localizable.strings trans.nb_NO = UI/MailPartViewers/NorwegianBokmal.lproj/Localizable.strings trans.nl = UI/MailPartViewers/Dutch.lproj/Localizable.strings trans.nn_NO = UI/MailPartViewers/NorwegianNynorsk.lproj/Localizable.strings trans.pl = UI/MailPartViewers/Polish.lproj/Localizable.strings +trans.pt = UI/MailPartViewers/Portuguese.lproj/Localizable.strings trans.pt_BR = UI/MailPartViewers/BrazilianPortuguese.lproj/Localizable.strings trans.ru = UI/MailPartViewers/Russian.lproj/Localizable.strings trans.sk = UI/MailPartViewers/Slovak.lproj/Localizable.strings diff --git a/ActiveSync/GNUmakefile.preamble b/ActiveSync/GNUmakefile.preamble index c302ad8be..545cdf46b 100644 --- a/ActiveSync/GNUmakefile.preamble +++ b/ActiveSync/GNUmakefile.preamble @@ -1 +1,4 @@ -# compilation settings +ifeq ($(HAS_LIBRARY_ssl),yes) +ADDITIONAL_CPPFLAGS += -DHAVE_OPENSSL=1 +BUNDLE_LIBS += -lcrypto +endif diff --git a/ActiveSync/NGVCard+ActiveSync.m b/ActiveSync/NGVCard+ActiveSync.m index eb62b9722..45fb93142 100644 --- a/ActiveSync/NGVCard+ActiveSync.m +++ b/ActiveSync/NGVCard+ActiveSync.m @@ -48,11 +48,42 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. @implementation NGVCard (ActiveSync) +// +// This function is called for each elements which can be ghosted according to specs. +// https://msdn.microsoft.com/en-us/library/gg650908%28v=exchg.80%29.aspx +// +- (BOOL) _isGhosted: (NSString *) element + inContext: (WOContext *) context +{ + NSArray *supportedElements; + + supportedElements = [context objectForKey: @"SupportedElements"]; + + // If the client does not include a Supported element in the initial Sync command request for + // a folder, then all of the elements that can be ghosted are considered not ghosted. + if (!supportedElements) + return NO; + + // If the client includes an empty Supported element in the initial Sync command request for + // a folder, then all elements that can be ghosted are considered ghosted. + if (![supportedElements count]) + return YES; + + // If the client includes a Supported element that contains child elements in the initial + // Sync command request for a folder, then each child element of that Supported element is + // considered not ghosted. All elements that can be ghosted that are not included as child + // elements of the Supported element are considered ghosted. + if (!([supportedElements indexOfObject: element] == NSNotFound)) + return YES; + + return NO; +} + - (NSString *) activeSyncRepresentationInContext: (WOContext *) context { NSArray *emails, *addresses, *categories, *elements; CardElement *n, *homeAdr, *workAdr; - NSMutableString *s; + NSMutableString *s, *a; NSString *url; id o; @@ -63,7 +94,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. if ((o = [n flattenedValueAtIndex: 0 forKey: @""])) [s appendFormat: @"%@", [o activeSyncRepresentationInContext: context]]; - + if ((o = [n flattenedValueAtIndex: 1 forKey: @""])) [s appendFormat: @"%@", [o activeSyncRepresentationInContext: context]]; @@ -146,16 +177,22 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. if ([addresses count]) { homeAdr = [addresses objectAtIndex: 0]; + a = [NSMutableString string]; if ((o = [homeAdr flattenedValueAtIndex: 2 forKey: @""])) - [s appendFormat: @"%@", [o activeSyncRepresentationInContext: context]]; + [a appendString: o]; + + if ((o = [homeAdr flattenedValueAtIndex: 1 forKey: @""]) && [o length]) + [a appendFormat: @"\n%@", o]; + [s appendFormat: @"%@", [a activeSyncRepresentationInContext: context]]; + if ((o = [homeAdr flattenedValueAtIndex: 3 forKey: @""])) [s appendFormat: @"%@", [o activeSyncRepresentationInContext: context]]; if ((o = [homeAdr flattenedValueAtIndex: 4 forKey: @""])) [s appendFormat: @"%@", [o activeSyncRepresentationInContext: context]]; - + if ((o = [homeAdr flattenedValueAtIndex: 5 forKey: @""])) [s appendFormat: @"%@", [o activeSyncRepresentationInContext: context]]; @@ -171,9 +208,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. if ([addresses count]) { workAdr = [addresses objectAtIndex: 0]; + a = [NSMutableString string]; if ((o = [workAdr flattenedValueAtIndex: 2 forKey: @""])) - [s appendFormat: @"%@", [o activeSyncRepresentationInContext: context]]; + [a appendString: o]; + + if ((o = [workAdr flattenedValueAtIndex: 1 forKey: @""]) && [o length]) + [a appendFormat: @"\n%@", o]; + + [s appendFormat: @"%@", [a activeSyncRepresentationInContext: context]]; if ((o = [workAdr flattenedValueAtIndex: 3 forKey: @""])) [s appendFormat: @"%@", [o activeSyncRepresentationInContext: context]]; @@ -217,6 +260,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. inContext: (WOContext *) context { CardElement *element; + NSMutableArray *addressLines; id o; // Contact's note @@ -226,6 +270,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Categories if ((o = [theValues objectForKey: @"Categories"]) && [o length]) [self setCategories: o]; + else + [[self children] removeObjectsInArray: [self childrenWithTag: @"Categories"]]; // Birthday if ((o = [theValues objectForKey: @"Birthday"])) @@ -233,6 +279,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. o = [o calendarDate]; [self setBday: [o descriptionWithCalendarFormat: @"%Y-%m-%d" timeZone: nil locale: nil]]; } + else if (![self _isGhosted: @"Birthday" inContext: context]) + { + [self setBday: @""]; + } + // // Business address information @@ -244,18 +295,48 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // BusinessCountry // element = [self elementWithTag: @"adr" ofType: @"work"]; - [element setSingleValue: @"" - atIndex: 1 forKey: @""]; - [element setSingleValue: [theValues objectForKey: @"BusinessStreet"] - atIndex: 2 forKey: @""]; - [element setSingleValue: [theValues objectForKey: @"BusinessCity"] - atIndex: 3 forKey: @""]; - [element setSingleValue: [theValues objectForKey: @"BusinessState"] - atIndex: 4 forKey: @""]; - [element setSingleValue: [theValues objectForKey: @"BusinessPostalCode"] - atIndex: 5 forKey: @""]; - [element setSingleValue: [theValues objectForKey: @"BusinessCountry"] - atIndex: 6 forKey: @""]; + + if ((o = [theValues objectForKey: @"BusinessStreet"]) || ![self _isGhosted: @"BusinessStreet" inContext: context]) + { + addressLines = [NSMutableArray arrayWithArray: [o componentsSeparatedByString: @"\n"]]; + + [element setSingleValue: @"" + atIndex: 1 forKey: @""]; + [element setSingleValue: [addressLines count] ? [addressLines objectAtIndex: 0] : @"" + atIndex: 2 forKey: @""]; + + // Extended address line. If there are more than 2 address lines we add them to the extended address line. + if ([addressLines count] > 1) + { + [addressLines removeObjectAtIndex: 0]; + [element setSingleValue: [addressLines componentsJoinedByString: @" "] + atIndex: 1 forKey: @""]; + } + } + + if ((o = [theValues objectForKey: @"BusinessCity"]) || ![self _isGhosted: @"BusinessCity" inContext: context]) + { + [element setSingleValue: [theValues objectForKey: @"BusinessCity"] + atIndex: 3 forKey: @""]; + } + + if ((o = [theValues objectForKey: @"BusinessState"]) || ![self _isGhosted: @"BusinessState" inContext: context]) + { + [element setSingleValue: [theValues objectForKey: @"BusinessState"] + atIndex: 4 forKey: @""]; + } + + if ((o = [theValues objectForKey: @"BusinessPostalCode"]) || ![self _isGhosted: @"BusinessPostalCode" inContext: context]) + { + [element setSingleValue: [theValues objectForKey: @"BusinessPostalCode"] + atIndex: 5 forKey: @""]; + } + + if ((o = [theValues objectForKey: @"BusinessCountry"]) || ![self _isGhosted: @"BusinessCountry" inContext: context]) + { + [element setSingleValue: [theValues objectForKey: @"BusinessCountry"] + atIndex: 6 forKey: @""]; + } // // Home address information @@ -267,35 +348,69 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // HomeCountry // element = [self elementWithTag: @"adr" ofType: @"home"]; - [element setSingleValue: @"" - atIndex: 1 forKey: @""]; - [element setSingleValue: [theValues objectForKey: @"HomeStreet"] - atIndex: 2 forKey: @""]; - [element setSingleValue: [theValues objectForKey: @"HomeCity"] - atIndex: 3 forKey: @""]; - [element setSingleValue: [theValues objectForKey: @"HomeState"] - atIndex: 4 forKey: @""]; - [element setSingleValue: [theValues objectForKey: @"HomePostalCode"] - atIndex: 5 forKey: @""]; - [element setSingleValue: [theValues objectForKey: @"HomeCountry"] - atIndex: 6 forKey: @""]; + + if ((o = [theValues objectForKey: @"HomeStreet"]) || ![self _isGhosted: @"HomeStreet" inContext: context]) + { + addressLines = [NSMutableArray arrayWithArray: [o componentsSeparatedByString: @"\n"]]; + + [element setSingleValue: @"" + atIndex: 1 forKey: @""]; + [element setSingleValue: [addressLines count] ? [addressLines objectAtIndex: 0] : @"" + atIndex: 2 forKey: @""]; + + // Extended address line. If there are more then 2 address lines we add them to the extended address line. + if ([addressLines count] > 1) + { + [addressLines removeObjectAtIndex: 0]; + [element setSingleValue: [addressLines componentsJoinedByString: @" "] + atIndex: 1 forKey: @""]; + } + } + + if ((o = [theValues objectForKey: @"HomeCity"]) || ![self _isGhosted: @"HomeCity" inContext: context]) + { + [element setSingleValue: [theValues objectForKey: @"HomeCity"] + atIndex: 3 forKey: @""]; + } + + if ((o = [theValues objectForKey: @"HomeState"]) || ![self _isGhosted: @"HomeState" inContext: context]) + { + [element setSingleValue: [theValues objectForKey: @"HomeState"] + atIndex: 4 forKey: @""]; + } + + if ((o = [theValues objectForKey: @"HomePostalCode"]) || ![self _isGhosted: @"HomePostalCode" inContext: context]) + { + [element setSingleValue: [theValues objectForKey: @"HomePostalCode"] + atIndex: 5 forKey: @""]; + } + + if ((o = [theValues objectForKey: @"HomeCountry"]) || ![self _isGhosted: @"HomeCountry" inContext: context]) + { + [element setSingleValue: [theValues objectForKey: @"HomeCountry"] + atIndex: 6 forKey: @""]; + } // Company's name if ((o = [theValues objectForKey: @"CompanyName"])) [self setOrg: o units: nil]; + else if (![self _isGhosted: @"CompanyName" inContext: context]) + [self setOrg: @"" units: nil]; // Department if ((o = [theValues objectForKey: @"Department"])) [self setOrg: nil units: [NSArray arrayWithObjects:o,nil]]; + else if (![self _isGhosted: @"Department" inContext: context]) + [self setOrg: nil units: [NSArray arrayWithObjects:@"",nil]]; // Email addresses - if ((o = [theValues objectForKey: @"Email1Address"])) + if ((o = [theValues objectForKey: @"Email1Address"]) || ![self _isGhosted: @"Email1Address" inContext: context]) { element = [self elementWithTag: @"email" ofType: @"work"]; [element setSingleValue: [o pureEMailAddress] forKey: @""]; } - if ((o = [theValues objectForKey: @"Email2Address"])) + if ((o = [theValues objectForKey: @"Email2Address"]) || ![self _isGhosted: @"Email2Address" inContext: context]) { element = [self elementWithTag: @"email" ofType: @"home"]; [element setSingleValue: [o pureEMailAddress] forKey: @""]; @@ -303,7 +418,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // SOGo currently only supports 2 email addresses ... but AS clients might send 3 // FIXME: revise this when the GUI revamp is done in SOGo - if ((o = [theValues objectForKey: @"Email3Address"])) + if ((o = [theValues objectForKey: @"Email3Address"]) || ![self _isGhosted: @"Email3Address" inContext: context]) { element = [self elementWithTag: @"email" ofType: @"three"]; [element setSingleValue: [o pureEMailAddress] forKey: @""]; @@ -313,45 +428,62 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // MiddleName // Suffix (II) // Title (Mr.) - [self setFn: [theValues objectForKey: @"FileAs"]]; + if ((o = [theValues objectForKey: @"FileAs"]) || ![self _isGhosted: @"FileAs" inContext: context]) + [self setFn: [theValues objectForKey: @"FileAs"]]; [self setNWithFamily: [theValues objectForKey: @"LastName"] given: [theValues objectForKey: @"FirstName"] additional: nil prefixes: nil suffixes: nil]; // IM information - [[self uniqueChildWithTag: @"x-aim"] - setSingleValue: [theValues objectForKey: @"IMAddress"] - forKey: @""]; + if ((o = [theValues objectForKey: @"IMAddress"]) || ![self _isGhosted: @"IMAddress" inContext: context]) + [[self uniqueChildWithTag: @"x-aim"] + setSingleValue: [theValues objectForKey: @"IMAddress"] + forKey: @""]; // // Phone numbrrs // - element = [self elementWithTag: @"tel" ofType: @"work"]; - [element setSingleValue: [theValues objectForKey: @"BusinessPhoneNumber"] forKey: @""]; + if ((o = [theValues objectForKey: @"BusinessPhoneNumber"]) || ![self _isGhosted: @"BusinessPhoneNumber" inContext: context]) + { + element = [self elementWithTag: @"tel" ofType: @"work"]; + [element setSingleValue: [theValues objectForKey: @"BusinessPhoneNumber"] forKey: @""]; + } - element = [self elementWithTag: @"tel" ofType: @"home"]; - [element setSingleValue: [theValues objectForKey: @"HomePhoneNumber"] forKey: @""]; + if ((o = [theValues objectForKey: @"HomePhoneNumber"]) || ![self _isGhosted: @"HomePhoneNumber" inContext: context]) + { + element = [self elementWithTag: @"tel" ofType: @"home"]; + [element setSingleValue: [theValues objectForKey: @"HomePhoneNumber"] forKey: @""]; + } - element = [self elementWithTag: @"tel" ofType: @"cell"]; - [element setSingleValue: [theValues objectForKey: @"MobilePhoneNumber"] forKey: @""]; + if ((o = [theValues objectForKey: @"MobilePhoneNumber"]) || ![self _isGhosted: @"MobilePhoneNumber" inContext: context]) + { + element = [self elementWithTag: @"tel" ofType: @"cell"]; + [element setSingleValue: [theValues objectForKey: @"MobilePhoneNumber"] forKey: @""]; + } - element = [self elementWithTag: @"tel" ofType: @"fax"]; - [element setSingleValue: [theValues objectForKey: @"BusinessFaxNumber"] forKey: @""]; + if ((o = [theValues objectForKey: @"BusinessFaxNumber"]) || ![self _isGhosted: @"BusinessFaxNumber" inContext: context]) + { + element = [self elementWithTag: @"tel" ofType: @"fax"]; + [element setSingleValue: [theValues objectForKey: @"BusinessFaxNumber"] forKey: @""]; + } - element = [self elementWithTag: @"tel" ofType: @"pager"]; - [element setSingleValue: [theValues objectForKey: @"PagerNumber"] forKey: @""]; + if ((o = [theValues objectForKey: @"PagerNumber"]) || ![self _isGhosted: @"PagerNumber" inContext: context]) + { + element = [self elementWithTag: @"tel" ofType: @"pager"]; + [element setSingleValue: [theValues objectForKey: @"PagerNumber"] forKey: @""]; + } // Job's title - if ((o = [theValues objectForKey: @"JobTitle"])) + if ((o = [theValues objectForKey: @"JobTitle"]) || ![self _isGhosted: @"JobTitle" inContext: context]) [self setTitle: o]; // WebPage (work) - if ((o = [theValues objectForKey: @"WebPage"])) + if ((o = [theValues objectForKey: @"WebPage"]) || ![self _isGhosted: @"WebPage" inContext: context]) [[self elementWithTag: @"url" ofType: @"work"] setSingleValue: o forKey: @""]; - if ((o = [theValues objectForKey: @"NickName"])) + if ((o = [theValues objectForKey: @"NickName"]) || ![self _isGhosted: @"NickName" inContext: context]) [self setNickname: o]; if ((o = [theValues objectForKey: @"Picture"])) diff --git a/ActiveSync/SOGoActiveSyncDispatcher+Sync.m b/ActiveSync/SOGoActiveSyncDispatcher+Sync.m index c43afa6b8..836d9ee79 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher+Sync.m +++ b/ActiveSync/SOGoActiveSyncDispatcher+Sync.m @@ -112,13 +112,73 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. @implementation SOGoActiveSyncDispatcher (Sync) +- (void) _setOrUnsetSyncRequest: (BOOL) set + collections: (NSArray *) collections +{ + SOGoCacheGCSObject *o; + NSNumber *processIdentifier; + NSString *key; + int i; + + processIdentifier = [NSNumber numberWithInt: [[NSProcessInfo processInfo] processIdentifier]]; + + o = [SOGoCacheGCSObject objectWithName: [context objectForKey: @"DeviceId"] inContainer: nil useCache: NO]; + [o setObjectType: ActiveSyncGlobalCacheObject]; + [o setTableUrl: [self folderTableURL]]; + [o reloadIfNeeded]; + + if (set) + { + RELEASE(syncRequest); + syncRequest = [NSNumber numberWithUnsignedInt: [[NSCalendarDate date] timeIntervalSince1970]]; + RETAIN(syncRequest); + + [[o properties] setObject: syncRequest forKey: @"SyncRequest"]; + + for (i = 0; i < [collections count]; i++) + { + key = [NSString stringWithFormat: @"SyncRequest+%@", [[[(id)[[collections objectAtIndex: i] getElementsByTagName: @"CollectionId"] lastObject] textValue] stringByUnescapingURL]]; + [[o properties] setObject: processIdentifier forKey: key]; + } + } + else + { + [[o properties] removeObjectForKey: @"SyncRequest"]; + for (i = 0; i < [collections count]; i++) + { + key = [NSString stringWithFormat: @"SyncRequest+%@", [[[(id)[[collections objectAtIndex: i] getElementsByTagName: @"CollectionId"] lastObject] textValue] stringByUnescapingURL]]; + [[o properties] removeObjectForKey: key]; + } + } + + [o save]; +} + - (void) _setFolderMetadata: (NSDictionary *) theFolderMetadata forKey: (NSString *) theFolderKey { + NSNumber *processIdentifier, *processIdentifierInCache; SOGoCacheGCSObject *o; NSDictionary *values; NSString *key; + if ([theFolderKey hasPrefix: @"folder"]) + key = [NSString stringWithFormat: @"SyncRequest+mail/%@", [theFolderKey substringFromIndex: 6]]; + else + key = [NSString stringWithFormat: @"SyncRequest+%@", theFolderKey]; + + processIdentifier = [NSNumber numberWithInt: [[NSProcessInfo processInfo] processIdentifier]]; + processIdentifierInCache = [[self globalMetadataForDevice] objectForKey: key]; + + // Don't update the cache if another request is processing the same collection. + if (!([processIdentifierInCache isEqual: processIdentifier])) + { + if (debugOn) + [self logWithFormat: @"EAS - We lost our lock - discard folder cache update %@ %@ <> %@", key, processIdentifierInCache, processIdentifier]; + + return; + } + key = [NSString stringWithFormat: @"%@+%@", [context objectForKey: @"DeviceId"], theFolderKey]; values = [theFolderMetadata copy]; @@ -132,6 +192,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [[o properties] removeObjectForKey: @"DateCache"]; [[o properties] removeObjectForKey: @"MoreAvailable"]; [[o properties] removeObjectForKey: @"BodyPreferenceType"]; + [[o properties] removeObjectForKey: @"SupportedElements"]; [[o properties] removeObjectForKey: @"SuccessfulMoveItemsOps"]; [[o properties] removeObjectForKey: @"InitialLoadSequence"]; @@ -404,8 +465,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [o takeActiveSyncValues: allChanges inContext: context]; [sogoObject saveComponent: o]; - [syncCache setObject: [NSString stringWithFormat:@"%f", [[sogoObject lastModified] timeIntervalSince1970]] forKey: serverId]; - + if ([syncCache objectForKey: serverId]) + [syncCache setObject: [NSString stringWithFormat:@"%f", [[sogoObject lastModified] timeIntervalSince1970]] forKey: serverId]; } break; case ActiveSyncEventFolder: @@ -415,27 +476,27 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [o takeActiveSyncValues: allChanges inContext: context]; [sogoObject saveComponent: o]; - [syncCache setObject: [NSString stringWithFormat:@"%f", [[sogoObject lastModified] timeIntervalSince1970]] forKey: serverId]; - + if ([syncCache objectForKey: serverId]) + [syncCache setObject: [NSString stringWithFormat:@"%f", [[sogoObject lastModified] timeIntervalSince1970]] forKey: serverId]; } break; case ActiveSyncMailFolder: default: { NSDictionary *result; - NSString *modseq; + NSNumber *modseq; [sogoObject takeActiveSyncValues: allChanges inContext: context]; result = [sogoObject fetchParts: [NSArray arrayWithObject: @"MODSEQ"]]; modseq = [[[result objectForKey: @"RawResponse"] objectForKey: @"fetch"] objectForKey: @"modseq"]; - if (modseq) - [syncCache setObject: modseq forKey: serverId]; + if (modseq && [syncCache objectForKey: serverId]) + [syncCache setObject: [modseq stringValue] forKey: serverId]; } } - [self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]]; + [self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]]; [theBuffer appendString: @""]; @@ -578,36 +639,44 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. withFilterType: (NSCalendarDate *) theFilterType inBuffer: (NSMutableString *) theBuffer lastServerKey: (NSString **) theLastServerKey - + defaultInterval: (unsigned int) theDefaultInterval { NSMutableDictionary *folderMetadata, *dateCache, *syncCache; NSString *davCollectionTagToStore; NSAutoreleasePool *pool; NSMutableString *s; - BOOL more_available; + BOOL cleanup_needed, more_available; int i, max; s = [NSMutableString string]; - - more_available = NO; + cleanup_needed = more_available = NO; folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: theCollection withType: theFolderType]]; - // If this is a new sync operation, DateCache and SyncCache needs to be deleted + // If this is a new sync operation, DateCache and SyncCache need to be deleted if ([theSyncKey isEqualToString: @"-1"]) { [folderMetadata setObject: [NSMutableDictionary dictionary] forKey: @"SyncCache"]; [folderMetadata setObject: [NSMutableDictionary dictionary] forKey: @"DateCache"]; } + else if ([folderMetadata objectForKey: @"SyncKey"] && !([theSyncKey isEqualToString: [folderMetadata objectForKey: @"SyncKey"]])) + { + // The syncKey received from the client doesn't match the syncKey we have in cache - client might have missed a response. + // We need to cleanup this mess. + [self logWithFormat: @"Cache cleanup needed for device %@ - user: %@ syncKey: %@ cache: %@", [context objectForKey: @"DeviceId"], [[context activeUser] login], theSyncKey, [folderMetadata objectForKey: @"SyncKey"]]; + cleanup_needed = YES; + } syncCache = [folderMetadata objectForKey: @"SyncCache"]; dateCache = [folderMetadata objectForKey: @"DateCache"]; if ((theFolderType == ActiveSyncMailFolder || theFolderType == ActiveSyncEventFolder || theFolderType == ActiveSyncTaskFolder) && - !([folderMetadata objectForKey: @"MoreAvailable"]) && // previous sync operation reached the windowSize or maximumSyncReponseSize - !([theSyncKey isEqualToString: @"-1"]) && // new sync operation - theFilterType) + (cleanup_needed || + ( !([folderMetadata objectForKey: @"MoreAvailable"]) && // previous sync operation reached the windowSize or maximumSyncReponseSize + !([folderMetadata objectForKey: @"InitialLoadSequence"]))) && + theFilterType + ) { NSArray *allKeys; NSString *key; @@ -623,14 +692,36 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. if ([[dateCache objectForKey:key] compare: theFilterType] == NSOrderedAscending) { - [s appendString: @""]; - [s appendFormat: @"%@", key]; - [s appendString: @""]; + if ([syncCache objectForKey:key]) + { + if (debugOn) + [self logWithFormat: @"EAS - SoftDelete %@", key]; - [syncCache removeObjectForKey: key]; - [dateCache removeObjectForKey: key]; + [s appendString: @""]; + [s appendFormat: @"%@", key]; + [s appendString: @""]; + + [syncCache removeObjectForKey: key]; + //[dateCache removeObjectForKey: key]; - softdelete_count++; + softdelete_count++; + } + else if (cleanup_needed) + { + if (debugOn) + [self logWithFormat: @"EAS - SoftDelete cleanup %@", key]; + + // With this we make sure that a SoftDelete is set again on next sync. + [syncCache setObject: @"0" forKey: key]; + } + else + { + if (debugOn) + [self logWithFormat: @"EAS - SoftDelete final delete %@", key]; + + // Now we are save to remove the dateCache entry. + [dateCache removeObjectForKey: key]; + } } if (softdelete_count >= theWindowSize || (theMaxSyncResponseSize > 0 && [s length] >= theMaxSyncResponseSize)) @@ -657,8 +748,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // if ([theSyncKey isEqualToString: [theCollection davCollectionTag]] && !([s length])) return; - - more_available = NO; davCollectionTagToStore = [theCollection davCollectionTag]; @@ -687,7 +776,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. initialLoadInProgress = NO; if ([theSyncKey isEqualToString: @"-1"]) - [folderMetadata setObject: davCollectionTagToStore forKey: @"InitialLoadSequence"]; + [folderMetadata setObject: davCollectionTagToStore forKey: @"InitialLoadSequence"]; if ([folderMetadata objectForKey: @"InitialLoadSequence"]) { @@ -707,6 +796,53 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Check for the WindowSize max = [allComponents count]; + // + // Cleanup the mess + // + if (cleanup_needed) + { + + for (i = 0; i < max; i++) + { + component = [allComponents objectAtIndex: i]; + deleted = [[component objectForKey: @"c_deleted"] intValue]; + + if (!deleted && ![[component objectForKey: @"c_component"] isEqualToString: component_name]) + continue; + + uid = [[component objectForKey: @"c_name"] sanitizedServerIdWithType: theFolderType]; + + if (deleted) + { + if (debugOn) + [self logWithFormat: @"EAS - Cache cleanup: DELETE %@", uid]; + + // For deletes we have to recreate a cache entry to make sure the delete is sent again. + [syncCache setObject: @"0" forKey: uid]; + } + else + { + if ([syncCache objectForKey: uid] && [[component objectForKey: @"c_creationdate"] intValue] > [theSyncKey intValue]) + { + if (debugOn) + [self logWithFormat: @"EAS - Cache cleanup: ADD %@", uid]; + + // Cleanup the cache to make sure the add is sent again. + [syncCache removeObjectForKey: uid]; + [dateCache removeObjectForKey: uid]; + } + else + { + if (debugOn) + [self logWithFormat: @"EAS - Cache cleanup: CHANGE %@", uid]; + + // Update cache entry to make sure the change is sent again. + [syncCache setObject: @"0" forKey: uid]; + } + } + } + } + return_count = 0; for (i = 0; i < max; i++) @@ -865,11 +1001,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOGoMailObject *mailObject; NSArray *allMessages, *a; + NSString *firstUIDAdded; int j, k, return_count, highestmodseq; BOOL found_in_cache, initialLoadInProgress; - initialLoadInProgress = NO; + initialLoadInProgress = NO; + found_in_cache = NO; + firstUIDAdded = nil; if ([theSyncKey isEqualToString: @"-1"]) { @@ -900,7 +1039,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. for (i = 0; i < max; i++) { [allCacheObjects addObject: [SOGoSyncCacheObject syncCacheObjectWithUID: [[[allMessages objectAtIndex: i] allKeys] lastObject] - sequence: [[[allMessages objectAtIndex: i] allValues] lastObject]]]; + sequence: [[[allMessages objectAtIndex: i] allValues] lastObject]]]; } sortedBySequence = [[NSMutableArray alloc] initWithDictionary: syncCache]; @@ -909,15 +1048,82 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [allCacheObjects sortUsingSelector: @selector(compareSequence:)]; - //NSLog(@"sortedBySequence (%d) - lastObject: %@", [sortedBySequence count], [sortedBySequence lastObject]); - //NSLog(@"allCacheObjects (%d) - lastObject: %@", [allCacheObjects count], [allCacheObjects lastObject]); + if (debugOn) + { + [self logWithFormat: @"EAS - sortedBySequence (%d) - lastObject: %@", [sortedBySequence count], [sortedBySequence lastObject]]; + [self logWithFormat: @"EAS - allCacheObjects (%d) - lastObject: %@", [allCacheObjects count], [allCacheObjects lastObject]]; + } lastCacheObject = [sortedBySequence lastObject]; + + // + // Cleanup the mess + // + if (cleanup_needed) + { + NSMutableArray *sortedByUID; + int uidnextFromCache; + + sortedByUID = [[NSMutableArray alloc] initWithDictionary: syncCache]; + [sortedByUID sortUsingSelector: @selector(compareUID:)]; + + // Get the uid from SyncKey in cache. The uid is the first uid added to cache by the last sync request. + a = [[folderMetadata objectForKey: @"SyncKey"] componentsSeparatedByString: @"-"]; + uidnextFromCache = [[a objectAtIndex: 0] intValue]; + + if (debugOn) + [self logWithFormat: @"EAS - Cache cleanup: from uid: %d to uid: %d", uidnextFromCache, [[[sortedByUID lastObject] uid] intValue]]; + + // Remove all entries from cache beginning with the first uid added by the last sync request. + for (j = uidnextFromCache; j <= [[[sortedByUID lastObject] uid] intValue]; j++) + { + if (debugOn) + [self logWithFormat: @"EAS - Cache cleanup: ADD %d", j]; + + [syncCache removeObjectForKey: [NSString stringWithFormat:@"%d", j]]; + [dateCache removeObjectForKey: [NSString stringWithFormat:@"%d", j]]; + } + + RELEASE(sortedByUID); + + for (j = 0; j < [allCacheObjects count]; j++) + { + // Update the modseq in cache, sence othersie, it would be identical to the modseq from server + //and we would skip the cache when generating the response. + if ([syncCache objectForKey: [[allCacheObjects objectAtIndex: j] uid]] && ![[[allCacheObjects objectAtIndex: j] sequence] isEqual: [NSNull null]]) + { + if (debugOn) + [self logWithFormat: @"EAS - Cache cleanup: CHANGE %@", [[allCacheObjects objectAtIndex: j] uid]]; + + [syncCache setObject: @"0" forKey:[[allCacheObjects objectAtIndex: j] uid]]; + } + else if ([[[allCacheObjects objectAtIndex: j] sequence] isEqual: [NSNull null]]) + { + if (debugOn) + [self logWithFormat: @"EAS - Cache cleanup: DELETE %@", [[allCacheObjects objectAtIndex: j] uid]]; + + // For deletes we have to recreate a cache entry to have the included in the response. + [syncCache setObject: @"0" forKey:[[allCacheObjects objectAtIndex: j] uid]]; + } + } + } - if ([folderMetadata objectForKey: @"MoreAvailable"] && lastCacheObject) + if (!cleanup_needed && + [folderMetadata objectForKey: @"MoreAvailable"] && + lastCacheObject && + !([[lastCacheObject sequence] isEqual: @"0"])) // Sequence 0 is set during cache cleanup. { for (j = 0; j < [allCacheObjects count]; j++) { + if (([[[allCacheObjects objectAtIndex: j] sequence] isEqual: [NSNull null]] && [syncCache objectForKey: [[allCacheObjects objectAtIndex: j] uid]]) || + (![[[allCacheObjects objectAtIndex: j] sequence] isEqual: [NSNull null]] && ![syncCache objectForKey: [[allCacheObjects objectAtIndex: j] uid]])) + { + // We need to continue with adds or deletes from here. + found_in_cache = YES; + j--; + break; + } + if ([[lastCacheObject uid] isEqual: [[allCacheObjects objectAtIndex: j] uid]]) { // Found out where we're at, let's continue from there... @@ -932,12 +1138,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. if (found_in_cache) k = j+1; else - { - k = 0; - j = 0; - } - - //NSLog(@"found in cache: %d k = %d", found_in_cache, k); + j = k = 0; + + if (debugOn) + [self logWithFormat: @"EAS - found in cache: %d k = %d", found_in_cache, k]; return_count = 0; @@ -951,20 +1155,35 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NSString *lastSequence; more_available = YES; + if (!firstUIDAdded) + { + a = [davCollectionTagToStore componentsSeparatedByString: @"-"]; + firstUIDAdded = [a objectAtIndex: 0]; + RETAIN(firstUIDAdded); + } lastSequence = ([[aCacheObject sequence] isEqual: [NSNull null]] ? [NSString stringWithFormat:@"%d", highestmodseq] : [aCacheObject sequence]); - *theLastServerKey = [[NSString alloc] initWithFormat: @"%@-%@", [aCacheObject uid], lastSequence]; - //NSLog(@"Reached windowSize - lastUID will be: %@", *theLastServerKey); + *theLastServerKey = [[NSString alloc] initWithFormat: @"%@-%@", firstUIDAdded, lastSequence]; + + if (debugOn) + [self logWithFormat: @"EAS - Reached windowSize - lastUID will be: %@", *theLastServerKey]; + DESTROY(pool); break; } aCacheObject = [allCacheObjects objectAtIndex: k]; - // If found in cache, it's either a Change or a Delete + if (debugOn) + [self logWithFormat: @"EAS - Dealing with cacheObject: %@", aCacheObject]; + + // If found in cache, it's either a Change or a Delete operation. if ([syncCache objectForKey: [aCacheObject uid]]) { if ([[aCacheObject sequence] isEqual: [NSNull null]]) { + if (debugOn) + [self logWithFormat: @"EAS - DELETE!"]; + // Deleted [s appendString: @""]; [s appendFormat: @"%@", [aCacheObject uid]]; @@ -982,9 +1201,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. mailObject = [theCollection lookupName: [aCacheObject uid] inContext: context acquire: 0]; - + if (![[aCacheObject sequence] isEqual: [syncCache objectForKey: [aCacheObject uid]]]) { + if (debugOn) + [self logWithFormat: @"EAS - CHANGE!"]; + [s appendString: @""]; [s appendFormat: @"%@", [aCacheObject uid]]; [s appendString: @""]; @@ -1000,6 +1222,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. } else { + if (debugOn) + [self logWithFormat: @"EAS - ADD!"]; + // Added if (![[aCacheObject sequence] isEqual: [NSNull null]]) { @@ -1032,11 +1257,22 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [syncCache setObject: [aCacheObject sequence] forKey: [aCacheObject uid]]; [dateCache setObject: [NSCalendarDate date] forKey: [aCacheObject uid]]; + + // Save the frist UID we add. We will use it for the synckey late. + if (!firstUIDAdded) + { + firstUIDAdded = [aCacheObject uid]; + RETAIN(firstUIDAdded); + if (debugOn) + [self logWithFormat: @"EAS - first uid added %@", firstUIDAdded]; + } + return_count++; } else { - //NSLog(@"skipping old deleted UID: %@", [aCacheObject uid]); + if (debugOn) + [self logWithFormat: @"EAS - skipping old deleted UID: %@", [aCacheObject uid]]; } } @@ -1045,16 +1281,25 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. if (more_available) { - [folderMetadata setObject: [NSNumber numberWithBool: YES] forKey: @"MoreAvailable"]; + [folderMetadata setObject: [NSNumber numberWithInt: YES] forKey: @"MoreAvailable"]; [folderMetadata setObject: *theLastServerKey forKey: @"SyncKey"]; } else { [folderMetadata removeObjectForKey: @"MoreAvailable"]; - [folderMetadata setObject: davCollectionTagToStore forKey: @"SyncKey"]; + + if (firstUIDAdded) + { + a = [davCollectionTagToStore componentsSeparatedByString: @"-"]; + [folderMetadata setObject: [[NSString alloc] initWithFormat: @"%@-%@", firstUIDAdded, [a objectAtIndex: 1]] forKey: @"SyncKey"]; + RELEASE(firstUIDAdded); + } + else + [folderMetadata setObject: davCollectionTagToStore forKey: @"SyncKey"]; } [self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]]; + RELEASE(*theLastServerKey); } // default: @@ -1153,15 +1398,16 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. changeDetected: (BOOL *) changeDetected maxSyncResponseSize: (int) theMaxSyncResponseSize { - NSString *collectionId, *realCollectionId, *syncKey, *davCollectionTag, *bodyPreferenceType, *mimeSupport, *lastServerKey, *syncKeyInCache; - SOGoMicrosoftActiveSyncFolderType folderType; - id collection, value; - - NSMutableString *changeBuffer, *commandsBuffer; - BOOL getChanges, first_sync; - unsigned int windowSize, v, status; + NSString *collectionId, *realCollectionId, *syncKey, *davCollectionTag, *bodyPreferenceType, *mimeSupport, *lastServerKey, *syncKeyInCache, *folderKey; NSMutableDictionary *folderMetadata, *folderOptions; - + NSMutableArray *supportedElements, *supportedElementNames; + NSMutableString *changeBuffer, *commandsBuffer; + id collection, value; + + SOGoMicrosoftActiveSyncFolderType folderType; + unsigned int windowSize, v, status, i; + BOOL getChanges, first_sync; + changeBuffer = [NSMutableString string]; commandsBuffer = [NSMutableString string]; @@ -1184,7 +1430,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. //[theBuffer appendString: @""]; return; } - + + // + // First check if we have any concurrent Sync requests going on for this device. + // If we do and we are still within our maximumSyncInterval, we let our EAS + // device know to retry. + // + folderKey = [self _getNameInCache: collection withType: folderType]; + folderMetadata = [self _folderMetadataForKey: folderKey]; + // We check for a window size, default to 100 if not specfied or out of bounds windowSize = [[[(id)[theDocumentElement getElementsByTagName: @"WindowSize"] lastObject] textValue] intValue]; @@ -1209,13 +1463,35 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. first_sync = NO; - folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: collection withType: folderType]]; - if ([syncKey isEqualToString: @"0"]) { davCollectionTag = @"-1"; first_sync = YES; *changeDetected = YES; + + supportedElementNames = [[[NSMutableArray alloc] init] autorelease]; + value = [theDocumentElement getElementsByTagName: @"Supported"]; + + if ([value count]) + { + supportedElements = (id)[[value lastObject] childNodes]; + + if ([supportedElements count]) + { + for (i = 0; i < [supportedElements count]; i++) + { + if ([[supportedElements objectAtIndex: i] nodeType] == DOM_ELEMENT_NODE) + [supportedElementNames addObject: [[supportedElements objectAtIndex: i] tagName]]; + } + } + + [folderMetadata setObject: supportedElementNames forKey: @"SupportedElements"]; + + [self _setFolderMetadata: folderMetadata forKey: folderKey]; + + if (debugOn) + [self logWithFormat: @"EAS - %d %@: supportedElements saved: %@", [supportedElements count], [collection nameInContainer], supportedElementNames]; + } } else if ((![syncKey isEqualToString: @"-1"]) && !([folderMetadata objectForKey: @"SyncCache"])) { @@ -1240,6 +1516,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // By default, send MIME mails. See #3146 for details. if (!bodyPreferenceType) bodyPreferenceType = @"4"; + + mimeSupport = [[folderMetadata objectForKey: @"FolderOptions"] objectForKey: @"MIMESupport"]; + + if (!mimeSupport) + mimeSupport = @"1"; } else { @@ -1265,11 +1546,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. { folderOptions = [[NSDictionary alloc] initWithObjectsAndKeys: mimeSupport, @"MIMESupport", bodyPreferenceType, @"BodyPreferenceType", nil]; [folderMetadata setObject: folderOptions forKey: @"FolderOptions"]; - [self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: collection withType: folderType]]; + [self _setFolderMetadata: folderMetadata forKey: folderKey]; } } [context setObject: bodyPreferenceType forKey: @"BodyPreferenceType"]; + [context setObject: mimeSupport forKey: @"MIMESupport"]; + [context setObject: [folderMetadata objectForKey: @"SupportedElements"] forKey: @"SupportedElements"]; // // We process the commands from the request @@ -1308,10 +1591,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. withFolderType: folderType withFilterType: [NSCalendarDate dateFromFilterType: [[(id)[theDocumentElement getElementsByTagName: @"FilterType"] lastObject] textValue]] inBuffer: changeBuffer - lastServerKey: &lastServerKey]; + lastServerKey: &lastServerKey + defaultInterval: [[SOGoSystemDefaults sharedSystemDefaults] maximumSyncInterval]]; } - folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: collection withType: folderType]]; + folderMetadata = [self _folderMetadataForKey: folderKey]; // If we got any changes or if we have applied any commands // let's regenerate our SyncKey based on the collection tag. @@ -1470,19 +1754,24 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOGoSystemDefaults *defaults; id aCollection; NSMutableString *output, *s; + NSMutableDictionary *globalMetadata; + NSNumber *syncRequestInCache, *processIdentifier; + NSString *key; NSArray *allCollections; NSData *d; - int i, j, defaultInterval, heartbeatInterval, internalInterval, maxSyncResponseSize; + int i, j, defaultInterval, heartbeatInterval, internalInterval, maxSyncResponseSize, total_sleep; BOOL changeDetected; - changeDetected = NO; - - maxSyncResponseSize = [[SOGoSystemDefaults sharedSystemDefaults] maximumSyncResponseSize]; - // We initialize our output buffer output = [[NSMutableString alloc] init]; + defaults = [SOGoSystemDefaults sharedSystemDefaults]; + defaultInterval = [defaults maximumSyncInterval]; + processIdentifier = [NSNumber numberWithInt: [[NSProcessInfo processInfo] processIdentifier]]; + + allCollections = (id)[theDocumentElement getElementsByTagName: @"Collection"]; + [output appendString: @""]; [output appendString: @""]; [output appendString: @""]; @@ -1497,12 +1786,16 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [output appendString: @""]; d = [[output dataUsingEncoding: NSUTF8StringEncoding] xml2wbxml]; [theResponse setContent: d]; + RELEASE(output); return; } + + // Let other requests know about the collections we are dealing with. + [self _setOrUnsetSyncRequest: YES collections: allCollections]; - defaults = [SOGoSystemDefaults sharedSystemDefaults]; + changeDetected = NO; + maxSyncResponseSize = [[SOGoSystemDefaults sharedSystemDefaults] maximumSyncResponseSize]; heartbeatInterval = [[[(id)[theDocumentElement getElementsByTagName: @"HeartbeatInterval"] lastObject] textValue] intValue]; - defaultInterval = [defaults maximumSyncInterval]; internalInterval = [defaults internalSyncInterval]; // If the request doesn't contain "HeartbeatInterval" there is no reason to delay the response. @@ -1512,17 +1805,20 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // We check to see if our heartbeat interval falls into the supported ranges. if (heartbeatInterval > defaultInterval || heartbeatInterval < 1) { + int limit; // Interval is too long, inform the client. heartbeatInterval = defaultInterval; - // Outlook doesn't like this... - //[output appendFormat: @"%d", defaultInterval]; + // When Status = 14, the Wait interval is specified in minutes while + // defaultInterval is specifed in seconds. Adjust accordinlgy. + limit = defaultInterval/60; + if (limit < 1) limit = 1; + if (limit > 59) limit = 59; + //[output appendFormat: @"%d", limit]; //[output appendFormat: @"%d", 14]; } [output appendString: @""]; - - allCollections = (id)[theDocumentElement getElementsByTagName: @"Collection"]; // We enter our loop detection change for (i = 0; i < (heartbeatInterval/internalInterval); i++) @@ -1532,25 +1828,62 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. for (j = 0; j < [allCollections count]; j++) { aCollection = [allCollections objectAtIndex: j]; - + [self processSyncCollection: aCollection inBuffer: s changeDetected: &changeDetected maxSyncResponseSize: maxSyncResponseSize]; - if (maxSyncResponseSize > 0 && [s length] >= maxSyncResponseSize) + // Don't return a response if another Sync is waiting. + globalMetadata = [self globalMetadataForDevice]; + key = [NSString stringWithFormat: @"SyncRequest+%@", [[[(id)[aCollection getElementsByTagName: @"CollectionId"] lastObject] textValue] stringByUnescapingURL]]; + + if (!([[globalMetadata objectForKey: key] isEqual: processIdentifier])) + { + if (debugOn) + [self logWithFormat: @"EAS - Discard response %@", [self globalMetadataForDevice]]; + + [theResponse setStatus: 503]; + + RELEASE(output); + return; + } + + if ((maxSyncResponseSize > 0 && [s length] >= maxSyncResponseSize)) break; } if (changeDetected) { - [self logWithFormat: @"Change detected, we push the content."]; + [self logWithFormat: @"Change detected during Sync, we push the content."]; break; } else if (heartbeatInterval > 1) { - [self logWithFormat: @"Sleeping %d seconds while detecting changes...", internalInterval]; - sleep(internalInterval); + total_sleep = 0; + + while (total_sleep < internalInterval) + { + // We check if we must break the current synchronization since an other Sync + // has just arrived. + syncRequestInCache = [[self globalMetadataForDevice] objectForKey: @"SyncRequest"]; + if (!([syncRequest isEqualToNumber: syncRequestInCache])) + { + if (debugOn) + [self logWithFormat: @"EAS - Heartbeat stopped %@", [self globalMetadataForDevice]]; + + // Make sure we end the heardbeat-loop. + heartbeatInterval = internalInterval = 1; + + break; + } + else + { + [self logWithFormat: @"Sleeping %d seconds while detecting changes in Sync...", internalInterval-total_sleep]; + sleep(5); + total_sleep += 5; + } + } } else { @@ -1558,8 +1891,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. } } - - // Only send a response if there are changes or MS-ASProtocolVersion is either 2.5 or 12.0 oterwise send an empty response. + // + // Only send a response if there are changes or MS-ASProtocolVersion is either 2.5 or 12.0, + // otherwise send an empty response. + // if (changeDetected || [[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"] || [[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"12.0"]) { // We always return the last generated response. diff --git a/ActiveSync/SOGoActiveSyncDispatcher.h b/ActiveSync/SOGoActiveSyncDispatcher.h index affe9e5b9..76b4acbe7 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher.h +++ b/ActiveSync/SOGoActiveSyncDispatcher.h @@ -1,6 +1,6 @@ /* -Copyright (c) 2014, Inverse inc. +Copyright (c) 2014-2015, Inverse inc. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -31,16 +31,25 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "SOGoActiveSyncConstants.h" +@class NSCalendarDate; @class NSException; +@class NSMutableDictionary; @class NSURL; +@class NSNumber; @interface SOGoActiveSyncDispatcher : NSObject { NSURL *folderTableURL; NSDictionary *imapFolderGUIDS; id context; + + NSNumber *syncRequest; + + BOOL debugOn; } +- (NSMutableDictionary *) globalMetadataForDevice; + - (id) collectionFromId: (NSString *) theCollectionId type: (SOGoMicrosoftActiveSyncFolderType) theFolderType; diff --git a/ActiveSync/SOGoActiveSyncDispatcher.m b/ActiveSync/SOGoActiveSyncDispatcher.m index 7fd80aab2..7f2f11657 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher.m +++ b/ActiveSync/SOGoActiveSyncDispatcher.m @@ -30,8 +30,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "SOGoActiveSyncDispatcher.h" #import +#import #import #import +#if GNUSTEP_BASE_MINOR_VERSION >= 21 +#import +#endif #import #import #import @@ -134,6 +138,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include +#ifdef HAVE_OPENSSL +#include +#include +#include +#endif + @interface SOGoActiveSyncDispatcher (Sync) - (NSMutableDictionary *) _folderMetadataForKey: (NSString *) theFolderKey; @@ -143,8 +153,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. @implementation SOGoActiveSyncDispatcher -static BOOL debugOn = NO; - - (id) init { [super init]; @@ -152,6 +160,7 @@ static BOOL debugOn = NO; debugOn = [[SOGoSystemDefaults sharedSystemDefaults] easDebugEnabled]; folderTableURL = nil; imapFolderGUIDS = nil; + syncRequest = nil; return self; } @@ -159,6 +168,7 @@ static BOOL debugOn = NO; { RELEASE(folderTableURL); RELEASE(imapFolderGUIDS); + RELEASE(syncRequest); [super dealloc]; } @@ -171,16 +181,16 @@ static BOOL debugOn = NO; [o setTableUrl: [self folderTableURL]]; [o reloadIfNeeded]; - [[o properties] removeAllObjects]; - [[o properties] addEntriesFromDictionary: [NSDictionary dictionaryWithObject: theSyncKey forKey: @"FolderSyncKey"]]; + [[o properties] setObject: theSyncKey + forKey: @"FolderSyncKey"]; [o save]; } -- (NSMutableDictionary *) _globalMetadataForDevice +- (NSMutableDictionary *) globalMetadataForDevice { SOGoCacheGCSObject *o; - o = [SOGoCacheGCSObject objectWithName: [context objectForKey: @"DeviceId"] inContainer: nil]; + o = [SOGoCacheGCSObject objectWithName: [context objectForKey: @"DeviceId"] inContainer: nil useCache: NO]; [o setObjectType: ActiveSyncGlobalCacheObject]; [o setTableUrl: [self folderTableURL]]; [o reloadIfNeeded]; @@ -204,7 +214,7 @@ static BOOL debugOn = NO; if (theFilter) { o = [SOGoCacheGCSObject objectWithName: [NSString stringWithFormat: @"%@+%@", [context objectForKey: @"DeviceId"], theCollectionId] inContainer: nil]; - [o setObjectType: ActiveSyncGlobalCacheObject]; + [o setObjectType: ActiveSyncFolderCacheObject]; [o setTableUrl: [self folderTableURL]]; [o reloadIfNeeded]; @@ -697,26 +707,25 @@ static BOOL debugOn = NO; - (void) processFolderSync: (id ) theDocumentElement inResponse: (WOResponse *) theResponse { - NSString *key, *cKey, *nkey, *name, *serverId, *parentId, *nameInCache, *personalFolderName, *syncKey, *folderType; + NSString *key, *cKey, *nkey, *name, *serverId, *parentId, *nameInCache, *personalFolderName, *syncKey, *folderType, *operation; + NSMutableDictionary *cachedGUIDs, *metadata; + NSMutableArray *folders, *processedFolders; NSDictionary *folderMetadata, *imapGUIDs; NSArray *allFoldersMetadata, *allKeys; - NSMutableDictionary *cachedGUIDs, *metadata; SOGoMailAccounts *accountsFolder; SOGoMailAccount *accountFolder; NSMutableString *s, *commands; SOGoUserFolder *userFolder; - NSMutableArray *folders, *processedFolders; SoSecurityManager *sm; SOGoCacheGCSObject *o; id currentFolder; NSData *d; int status, command_count, i, type, fi, count; - BOOL first_sync; sm = [SoSecurityManager sharedSecurityManager]; - metadata = [self _globalMetadataForDevice]; + metadata = [self globalMetadataForDevice]; syncKey = [[(id)[theDocumentElement getElementsByTagName: @"SyncKey"] lastObject] textValue]; s = [NSMutableString string]; @@ -830,32 +839,38 @@ static BOOL debugOn = NO; } else { - if ([cKey rangeOfString: @"vevent" options: NSCaseInsensitiveSearch].location != NSNotFound || - [cKey rangeOfString: @"vtodo" options: NSCaseInsensitiveSearch].location != NSNotFound) - folderType = @"Calendar"; - else - folderType = @"Contacts"; + if ([cKey rangeOfString: @"vevent" options: NSCaseInsensitiveSearch].location != NSNotFound || + [cKey rangeOfString: @"vtodo" options: NSCaseInsensitiveSearch].location != NSNotFound) + folderType = @"Calendar"; + else + folderType = @"Contacts"; - if ([ cKey rangeOfString: @"/"].location != NSNotFound) - currentFolder = [[[[context activeUser] homeFolderInContext: context] lookupName: folderType inContext: context acquire: NO] + if ([ cKey rangeOfString: @"/"].location != NSNotFound) + currentFolder = [[[[context activeUser] homeFolderInContext: context] lookupName: folderType inContext: context acquire: NO] lookupName: [cKey substringFromIndex: [cKey rangeOfString: @"/"].location+1] inContext: context acquire: NO]; - // remove the folder from device if it doesn't exists or it has not the proper permissions - if (!currentFolder || - [sm validatePermission: SoPerm_DeleteObjects - onObject: currentFolder - inContext: context] || - [sm validatePermission: SoPerm_AddDocumentsImagesAndFiles - onObject: currentFolder - inContext: context]) - { - [commands appendFormat: @"%@", [cKey stringByEscapingURL] ]; - command_count++; - [o destroy]; - } - } - } - } + // We skip personal GCS folders - we always want to synchronize these + if ([currentFolder isKindOfClass: [SOGoGCSFolder class]] && + [[currentFolder nameInContainer] isEqualToString: @"personal"]) + continue; + + // Remove the folder from device if it doesn't exist, we don't want to sync it, or it doesn't have the proper permissions + if (!currentFolder || + ![currentFolder synchronize] || + [sm validatePermission: SoPerm_DeleteObjects + onObject: currentFolder + inContext: context] || + [sm validatePermission: SoPerm_AddDocumentsImagesAndFiles + onObject: currentFolder + inContext: context]) + { + [commands appendFormat: @"%@", [cKey stringByEscapingURL] ]; + command_count++; + [o destroy]; + } + } + } + } // Handle addition and changes for (i = 0; i < [allFoldersMetadata count]; i++) @@ -943,6 +958,7 @@ static BOOL debugOn = NO; [[o properties] removeObjectForKey: @"DateCache"]; [[o properties] removeObjectForKey: @"MoreAvailable"]; [[o properties] removeObjectForKey: @"BodyPreferenceType"]; + [[o properties] removeObjectForKey: @"SupportedElements"]; [[o properties] removeObjectForKey: @"SuccessfulMoveItemsOps"]; [[o properties] removeObjectForKey: @"InitialLoadSequence"]; [o save]; @@ -953,17 +969,29 @@ static BOOL debugOn = NO; personalFolderName = [[[context activeUser] personalCalendarFolderInContext: context] nameInContainer]; folders = [[[[[context activeUser] homeFolderInContext: context] lookupName: @"Calendar" inContext: context acquire: NO] subFolders] mutableCopy]; + [folders autorelease]; + [folders addObjectsFromArray: [[[[context activeUser] homeFolderInContext: context] lookupName: @"Contacts" inContext: context acquire: NO] subFolders]]; - // Inside this loop we remove all the folder without write/delete permissions + // We remove all the folders that aren't GCS-ones, that we don't want to synchronize and + // the ones without write/delete permissions. count = [folders count]-1; for (; count >= 0; count--) { - if ([sm validatePermission: SoPerm_DeleteObjects - onObject: [folders objectAtIndex: count] + currentFolder = [folders objectAtIndex: count]; + + // We skip personal GCS folders - we always want to synchronize these + if ([currentFolder isKindOfClass: [SOGoGCSFolder class]] && + [[currentFolder nameInContainer] isEqualToString: @"personal"]) + continue; + + if (![currentFolder isKindOfClass: [SOGoGCSFolder class]] || + ![currentFolder synchronize] || + [sm validatePermission: SoPerm_DeleteObjects + onObject: currentFolder inContext: context] || [sm validatePermission: SoPerm_AddDocumentsImagesAndFiles - onObject: [folders objectAtIndex: count] + onObject: currentFolder inContext: context]) { [folders removeObjectAtIndex: count]; @@ -971,7 +999,6 @@ static BOOL debugOn = NO; } count = [folders count]-1; - NSString *operation; for (fi = 0; fi <= count ; fi++) { @@ -1029,6 +1056,7 @@ static BOOL debugOn = NO; [[o properties] removeObjectForKey: @"DateCache"]; [[o properties] removeObjectForKey: @"MoreAvailable"]; [[o properties] removeObjectForKey: @"BodyPreferenceType"]; + [[o properties] removeObjectForKey: @"SupportedElements"]; [[o properties] removeObjectForKey: @"SuccessfulMoveItemsOps"]; [[o properties] removeObjectForKey: @"InitialLoadSequence"]; } @@ -1053,6 +1081,7 @@ static BOOL debugOn = NO; [[o properties] removeObjectForKey: @"DateCache"]; [[o properties] removeObjectForKey: @"MoreAvailable"]; [[o properties] removeObjectForKey: @"BodyPreferenceType"]; + [[o properties] removeObjectForKey: @"SupportedElements"]; [[o properties] removeObjectForKey: @"SuccessfulMoveItemsOps"]; [[o properties] removeObjectForKey: @"InitialLoadSequence"]; } @@ -1263,7 +1292,7 @@ static BOOL debugOn = NO; - (void) processItemOperations: (id ) theDocumentElement inResponse: (WOResponse *) theResponse { - NSString *fileReference, *realCollectionId, *serverId, *bodyPreferenceType, *collectionId; + NSString *fileReference, *realCollectionId, *serverId, *bodyPreferenceType, *mimeSupport, *collectionId; NSMutableString *s; NSArray *fetchRequests; id aFetch; @@ -1376,6 +1405,8 @@ static BOOL debugOn = NO; serverId = [[(id)[theDocumentElement getElementsByTagName: @"ServerId"] lastObject] textValue]; bodyPreferenceType = [[(id)[[(id)[theDocumentElement getElementsByTagName: @"BodyPreference"] lastObject] getElementsByTagName: @"Type"] lastObject] textValue]; [context setObject: bodyPreferenceType forKey: @"BodyPreferenceType"]; + mimeSupport = [[(id)[theDocumentElement getElementsByTagName: @"MIMESupport"] lastObject] textValue]; + [context setObject: mimeSupport forKey: @"MIMESupport"]; currentCollection = [self collectionFromId: realCollectionId type: folderType]; @@ -2033,13 +2064,13 @@ static BOOL debugOn = NO; if ([foldersWithChanges count]) { - [self logWithFormat: @"Change detected, we push the content."]; + [self logWithFormat: @"Change detected using Ping, we let the EAS client know to send a Sync."]; status = 2; break; } else { - [self logWithFormat: @"Sleeping %d seconds while detecting changes...", internalInterval]; + [self logWithFormat: @"Sleeping %d seconds while detecting changes in Ping...", internalInterval]; sleep(internalInterval); } } @@ -2103,6 +2134,123 @@ static BOOL debugOn = NO; [theResponse setContent: d]; } +// +// +// +#ifdef HAVE_OPENSSL +- (unsigned int) validateCert: (NSString *) theCert +{ + NSData *d; + + const unsigned char *data; + X509_STORE_CTX *ctx; + X509_LOOKUP *lookup; + X509_STORE *store; + X509 *cert; + + BOOL success; + size_t len; + int rc; + + success = NO; + + d = [theCert dataByDecodingBase64]; + data = (unsigned char *)[d bytes]; + len = [d length]; + + cert = d2i_X509(NULL, &data, len); + if (!cert) + { + [self logWithFormat: @"EAS - validateCert failed for device %@: d2i_X509 failed", [context objectForKey: @"DeviceId"]]; + return 17; + } + + store = X509_STORE_new(); + OpenSSL_add_all_algorithms(); + + if (store) + { + lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file()); + if (lookup) + { + X509_LOOKUP_load_file(lookup, NULL, X509_FILETYPE_DEFAULT); + lookup = X509_STORE_add_lookup(store, X509_LOOKUP_hash_dir()); + if (lookup) + { + X509_LOOKUP_add_dir(lookup, NULL, X509_FILETYPE_DEFAULT); + ERR_clear_error(); + success = YES; + } + } + } + + if (!success) + { + if (store) + { + X509_STORE_free(store); + store = NULL; + } + } + + ctx = X509_STORE_CTX_new(); + if (!ctx) + { + [self logWithFormat: @"EAS - validateCert failed for device %@: X509_STORE_CTX_new failed", [context objectForKey: @"DeviceId"]]; + return 17; + } + + if (X509_STORE_CTX_init(ctx, store, cert, NULL) != 1) + { + [self logWithFormat: @"EAS - validateCert failed for device %@: X509_STORE_CTX_init failed", [context objectForKey: @"DeviceId"]]; + X509_STORE_CTX_free(ctx); + return 17; + } + + rc = X509_verify_cert(ctx); + X509_STORE_CTX_free(ctx); + X509_free(cert); + + if (rc) + { + return 1; + } + else + { + [self logWithFormat: @"EAS - validateCert failed for device %@: err=%d", [context objectForKey: @"DeviceId"], X509_STORE_CTX_get_error(ctx)]; + return 17; + } +} +#else +- (unsigned int) validateCert: (NSString *) theCert +{ + return 17; +} +#endif + +- (void) processValidateCert: (id ) theDocumentElement + inResponse: (WOResponse *) theResponse +{ + NSMutableString *s; + NSString *cert; + NSData *d; + + cert = [[(id)[theDocumentElement getElementsByTagName: @"Certificate"] lastObject] textValue]; + + s = [NSMutableString string]; + [s appendString: @""]; + [s appendString: @""]; + [s appendString: @""]; + [s appendString: @"1"]; + [s appendFormat: @"%d", [self validateCert: cert]]; + [s appendString: @""]; + + d = [[s dataUsingEncoding: NSUTF8StringEncoding] xml2wbxml]; + + [theResponse setContent: d]; +} + + // // // @@ -2419,39 +2567,85 @@ static BOOL debugOn = NO; NGMimeMessageParser *parser; NGMimeMessage *message; NSException *error; - NSData *data; - NGMutableHashMap *map; - NGMimeMessage *messageToSend; - NGMimeMessageGenerator *generator; + NSMutableData *data; + NSData *new_from_header; NSDictionary *identity; NSString *fullName, *email; + + const char *bytes; + int i, len; + BOOL found_header; // We get the mail's data - data = [[[[(id)[theDocumentElement getElementsByTagName: @"MIME"] lastObject] textValue] stringByDecodingBase64] dataUsingEncoding: NSUTF8StringEncoding]; + data = [NSMutableData dataWithData: [[[[(id)[theDocumentElement getElementsByTagName: @"MIME"] lastObject] textValue] stringByDecodingBase64] dataUsingEncoding: NSUTF8StringEncoding]]; // We extract the recipients parser = [[NGMimeMessageParser alloc] init]; message = [parser parsePartFromData: data]; RELEASE(parser); - map = [NGHashMap hashMapWithDictionary: [message headers]]; - identity = [[context activeUser] primaryIdentity]; fullName = [identity objectForKey: @"fullName"]; email = [identity objectForKey: @"email"]; + if ([fullName length]) - [map setObject: [NSString stringWithFormat: @"%@ <%@>", fullName, email] forKey: @"from"]; + new_from_header = [[NSString stringWithFormat: @"From: %@ <%@>\r\n", [fullName asQPSubjectString: @"utf-8"], email] dataUsingEncoding:NSUTF8StringEncoding]; else - [map setObject: email forKey: @"from"]; + new_from_header = [[NSString stringWithFormat: @"From: %@\r\n", email] dataUsingEncoding:NSUTF8StringEncoding]; - messageToSend = [[[NGMimeMessage alloc] initWithHeader: map] autorelease]; + bytes = [data bytes]; + len = [data length]; + i = 0; + found_header = NO; - [messageToSend setBody: [message body]]; + // Search for the from-header + while (i < len) + { + if (i == 0 && + (*bytes == 'f' || *bytes == 'F') && + (*(bytes+1) == 'r' || *(bytes+1) == 'R') && + (*(bytes+2) == 'o' || *(bytes+2) == 'O') && + (*(bytes+3) == 'm' || *(bytes+3) == 'M') && + (*(bytes+4) == ':')) + { + found_header = YES; + break; + } + + if (((*bytes == '\r') && (*(bytes+1) == '\n')) && + (*(bytes+2) == 'f' || *(bytes+2) == 'F') && + (*(bytes+3) == 'r' || *(bytes+3) == 'R') && + (*(bytes+4) == 'o' || *(bytes+4) == 'O') && + (*(bytes+5) == 'm' || *(bytes+5) == 'M') && + (*(bytes+6) == ':')) + { + found_header = YES; + i = i + 2; // \r\n + break; + } + + bytes++; + i++; + } + + // Update/Add the From header in the MIMEBody of the SendMail request. + // Any other way to modify the mail body would break s/mime emails. + if (found_header) + { + // Change the From header + [data replaceBytesInRange: NSMakeRange(i, [[message headerForKey: @"from"] length]+8) // start of the From header found - length of the parsed from-header-value + 8 (From:+\r\n+1) + withBytes: [new_from_header bytes] + length: [new_from_header length]]; + } + else + { + // Add a From header + [data replaceBytesInRange: NSMakeRange(0, 0) + withBytes: [new_from_header bytes] + length: [new_from_header length]]; + } - generator = [[[NGMimeMessageGenerator alloc] init] autorelease]; - data = [generator generateMimeFromPart: messageToSend]; - error = [self _sendMail: data recipients: [message allRecipients] saveInSentItems: ([(id)[theDocumentElement getElementsByTagName: @"SaveInSentItems"] count] ? YES : NO)]; @@ -2948,8 +3142,24 @@ static BOOL debugOn = NO; options: NSCaseInsensitiveSearch].location == NSNotFound) { NSString *value; - - value = [[NSDate date] descriptionWithCalendarFormat: @"%a, %d %b %Y %H:%M:%S %z" timeZone: [NSTimeZone timeZoneWithName: @"GMT"] locale: nil]; +#if GNUSTEP_BASE_MINOR_VERSION < 21 + value = [[NSDate date] descriptionWithCalendarFormat: @"%a, %d %b %Y %H:%M:%S %z" + timeZone: [NSTimeZone timeZoneWithName: @"GMT"] + locale: nil]; +#else + value = [[NSDate date] descriptionWithCalendarFormat: @"%a, %d %b %Y %H:%M:%S %z" + timeZone: [NSTimeZone timeZoneWithName: @"GMT"] + locale: [NSDictionary dictionaryWithObjectsAndKeys: + [NSArray arrayWithObjects: @"Jan", @"Feb", @"Mar", @"Apr", + @"May", @"Jun", @"Jul", @"Aug", + @"Sep", @"Oct", @"Nov", @"Dec", nil], + @"NSShortMonthNameArray", + [NSArray arrayWithObjects: @"Sun", @"Mon", @"Tue", @"Wed", @"Thu", + @"Fri", @"Sat", nil], + @"NSShortWeekDayNameArray", + nil]]; + +#endif s = [NSString stringWithFormat: @"Date: %@\n%@", value, [theRequest contentAsString]]; } else @@ -3040,8 +3250,7 @@ static BOOL debugOn = NO; return nil; urlString = [[user domainDefaults] folderInfoURL]; - parts = [[urlString componentsSeparatedByString: @"/"] - mutableCopy]; + parts = [[urlString componentsSeparatedByString: @"/"] mutableCopy]; [parts autorelease]; if ([parts count] == 5) { diff --git a/ActiveSync/SOGoMailObject+ActiveSync.m b/ActiveSync/SOGoMailObject+ActiveSync.m index 6b2e1b03a..763ed20f2 100644 --- a/ActiveSync/SOGoMailObject+ActiveSync.m +++ b/ActiveSync/SOGoMailObject+ActiveSync.m @@ -476,14 +476,16 @@ struct GlobalObjectId { // // - (NSData *) _preferredBodyDataUsingType: (int) theType + mimeSupport: (int) theMimeSupport nativeType: (int *) theNativeType { NSString *type, *subtype, *encoding; NSData *d; + BOOL isSMIME; type = [[[self bodyStructure] valueForKey: @"type"] lowercaseString]; subtype = [[[self bodyStructure] valueForKey: @"subtype"] lowercaseString]; - + isSMIME = NO; d = nil; // We determine the native type @@ -494,8 +496,14 @@ struct GlobalObjectId { else if ([type isEqualToString: @"multipart"]) *theNativeType = 4; + if (([subtype isEqualToString: @"signed"] || [subtype isEqualToString: @"pkcs7-mime"] ) && theMimeSupport > 0) + { + *theNativeType = 4; + isSMIME = YES; + } + // We get the right part based on the preference - if (theType == 1 || theType == 2) + if ((theType == 1 || theType == 2) && !isSMIME) { if ([type isEqualToString: @"text"] && ![subtype isEqualToString: @"calendar"]) { @@ -536,12 +544,12 @@ struct GlobalObjectId { d = [self _preferredBodyDataInMultipartUsingType: theType nativeTypeFound: theNativeType]; } } - else if (theType == 4) + else if (theType == 4 || isSMIME) { // We sanitize the content *ONLY* for Outlook clients and if the content-transfer-encoding is 8bit. Outlook has strange issues // with quoted-printable/base64 encoded text parts. It just doesn't decode them. encoding = [[self lookupInfoForBodyPart: @""] objectForKey: @"encoding"]; - if ([[context objectForKey: @"DeviceType"] isEqualToString: @"WindowsOutlook15"] || ([encoding caseInsensitiveCompare: @"8bit"] == NSOrderedSame)) + if ((encoding && ([encoding caseInsensitiveCompare: @"8bit"] == NSOrderedSame)) && !isSMIME) d = [self _sanitizedMIMEMessage]; else d = [self content]; @@ -656,16 +664,18 @@ struct GlobalObjectId { { NSData *d, *globalObjId; NSArray *attachmentKeys; - NSMutableString *s; - - uint32_t v; - NSString *p; - - id value; - iCalCalendar *calendar; + NSString *p, *subtype; + NSMutableString *s; + id value; - int preferredBodyType, nativeBodyType; + int preferredBodyType, mimeSupport, nativeBodyType; + uint32_t v; + + subtype = [[[self bodyStructure] valueForKey: @"subtype"] lowercaseString]; + + preferredBodyType = [[context objectForKey: @"BodyPreferenceType"] intValue]; + mimeSupport = [[context objectForKey: @"MIMESupport"] intValue]; s = [NSMutableString string]; @@ -862,7 +872,12 @@ struct GlobalObjectId { else { // MesssageClass and ContentClass - [s appendFormat: @"%@", @"IPM.Note"]; + if ([subtype isEqualToString: @"signed"]) + [s appendFormat: @"%@", @"IPM.Note.SMIME.MultipartSigned"]; + else if ([subtype isEqualToString: @"pkcs7-mime"]) + [s appendFormat: @"%@", @"IPM.Note.SMIME"]; + else + [s appendFormat: @"%@", @"IPM.Note"]; [s appendFormat: @"%@", @"urn:content-classes:message"]; } @@ -876,10 +891,8 @@ struct GlobalObjectId { [s appendFormat: @"%@", @"65001"]; // Body - namespace 17 - preferredBodyType = [[context objectForKey: @"BodyPreferenceType"] intValue]; - nativeBodyType = 1; - d = [self _preferredBodyDataUsingType: preferredBodyType nativeType: &nativeBodyType]; + d = [self _preferredBodyDataUsingType: preferredBodyType mimeSupport: mimeSupport nativeType: &nativeBodyType]; if (calendar && !d) { @@ -981,9 +994,12 @@ struct GlobalObjectId { { [s appendString: @""]; - // Set the correct type if client requested text/html but we got text/plain + // Set the correct type if client requested text/html but we got text/plain. + // For s/mime mails type is always 4 if mimeSupport is 1 or 2. if (preferredBodyType == 2 && nativeBodyType == 1) [s appendString: @"1"]; + else if (([subtype isEqualToString: @"signed"] || [subtype isEqualToString: @"pkcs7-mime"] ) && mimeSupport > 0) + [s appendString: @"4"]; else [s appendFormat: @"%d", preferredBodyType]; @@ -1001,7 +1017,8 @@ struct GlobalObjectId { // Attachments -namespace 16 attachmentKeys = [self fetchFileAttachmentKeys]; - if ([attachmentKeys count]) + + if ([attachmentKeys count] && !([subtype isEqualToString: @"signed"])) { int i; @@ -1071,9 +1088,15 @@ struct GlobalObjectId { if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"14.0"] || [[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"14.1"]) { + id value; NSString *reference; - reference = [[[[self mailHeaders] objectForKey: @"references"] componentsSeparatedByString: @" "] objectAtIndex: 0]; + value = [[self mailHeaders] objectForKey: @"references"]; + + if ([value isKindOfClass: [NSArray class]]) + reference = [[[value objectAtIndex: 0] componentsSeparatedByString: @" "] objectAtIndex: 0]; + else + reference = [[value componentsSeparatedByString: @" "] objectAtIndex: 0]; if ([reference length] > 0) [s appendFormat: @"%@", [[reference dataUsingEncoding: NSUTF8StringEncoding] activeSyncRepresentationInContext: context]]; diff --git a/ActiveSync/SOGoSyncCacheObject.h b/ActiveSync/SOGoSyncCacheObject.h index c6ba61068..a86d1067b 100644 --- a/ActiveSync/SOGoSyncCacheObject.h +++ b/ActiveSync/SOGoSyncCacheObject.h @@ -37,6 +37,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. @interface SOGoSyncCacheObject : NSObject { + @public id _uid; id _sequence; } diff --git a/ActiveSync/SOGoSyncCacheObject.m b/ActiveSync/SOGoSyncCacheObject.m index 63c545b34..79761a343 100644 --- a/ActiveSync/SOGoSyncCacheObject.m +++ b/ActiveSync/SOGoSyncCacheObject.m @@ -32,9 +32,17 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #import #import +#import + +static Class NSNullK; @implementation SOGoSyncCacheObject ++ (void) initialize +{ + NSNullK = [NSNull class]; +} + - (id) init { if ((self = [super init])) @@ -46,14 +54,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. return self; } -+ (id) syncCacheObjectWithUID: (id) theUID sequence: (id) theSequence; ++ (id) syncCacheObjectWithUID: (id) theUID sequence: (id) theSequence { id o; o = [[self alloc] init]; - - [o setUID: theUID]; - [o setSequence: theSequence]; + + [o setUID: [NSNumber numberWithInt: [theUID intValue]]]; + [o setSequence: ([theSequence isKindOfClass: NSNullK] ? theSequence : [NSNumber numberWithInt: [theSequence intValue]])]; return [o autorelease]; } @@ -67,7 +75,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - (id) uid { - return _uid; + return [_uid description]; } - (void) setUID: (id) theUID @@ -77,7 +85,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - (id) sequence { - return _sequence; + return ([_sequence isKindOfClass: NSNullK] ? _sequence : [_sequence description]); } - (void) setSequence: (id) theSequence @@ -88,7 +96,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - (NSComparisonResult) compareUID: (SOGoSyncCacheObject *) theSyncCacheObject { - return [[self uid] compare: [theSyncCacheObject uid]]; + return [self->_uid compare: theSyncCacheObject->_uid]; } // @@ -97,21 +105,21 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // - (NSComparisonResult) compareSequence: (SOGoSyncCacheObject *) theSyncCacheObject { - if ([[self sequence] isEqual: [NSNull null]] && - [[theSyncCacheObject sequence] isEqual: [NSNull null]]) + if ([self->_sequence isEqual: [NSNull null]] && + [theSyncCacheObject->_sequence isEqual: [NSNull null]]) return [self compareUID: theSyncCacheObject]; - if (![[self sequence] isEqual: [NSNull null]] && [[theSyncCacheObject sequence] isEqual: [NSNull null]]) + if (![self->_sequence isEqual: [NSNull null]] && [theSyncCacheObject->_sequence isEqual: [NSNull null]]) return NSOrderedDescending; - if ([[self sequence] isEqual: [NSNull null]] && ![[theSyncCacheObject sequence] isEqual: [NSNull null]]) + if ([self->_sequence isEqual: [NSNull null]] && ![theSyncCacheObject->_sequence isEqual: [NSNull null]]) return NSOrderedAscending; // Must check this here, to avoid comparing NSNull objects - if ([[self sequence] compare: [theSyncCacheObject sequence]] == NSOrderedSame) + if ([self->_sequence compare: theSyncCacheObject->_sequence] == NSOrderedSame) return [self compareUID: theSyncCacheObject]; - return [[self sequence] compare: [theSyncCacheObject sequence]]; + return [self->_sequence compare: theSyncCacheObject->_sequence]; } - (NSString *) description @@ -120,3 +128,4 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. } @end + diff --git a/ActiveSync/iCalAlarm+ActiveSync.m b/ActiveSync/iCalAlarm+ActiveSync.m index 33e6dbb73..62a3ad146 100644 --- a/ActiveSync/iCalAlarm+ActiveSync.m +++ b/ActiveSync/iCalAlarm+ActiveSync.m @@ -58,7 +58,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // don't send negative reminder - not supported if (delta > 0) - [s appendFormat: @"%d", delta]; + [s appendFormat: @"%d", (int)delta]; } return s; diff --git a/ActiveSync/iCalEvent+ActiveSync.m b/ActiveSync/iCalEvent+ActiveSync.m index 2156b1eac..d590e11a6 100644 --- a/ActiveSync/iCalEvent+ActiveSync.m +++ b/ActiveSync/iCalEvent+ActiveSync.m @@ -285,7 +285,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. { [s appendString: @""]; [s appendFormat: @"%d", 1]; - [s appendFormat: @"%d", [o length]]; + [s appendFormat: @"%d", (int)[o length]]; [s appendFormat: @"%@", o]; [s appendString: @""]; } diff --git a/ActiveSync/iCalRecurrenceRule+ActiveSync.m b/ActiveSync/iCalRecurrenceRule+ActiveSync.m index a9060fe27..225bbd90a 100644 --- a/ActiveSync/iCalRecurrenceRule+ActiveSync.m +++ b/ActiveSync/iCalRecurrenceRule+ActiveSync.m @@ -140,7 +140,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Simple reccurrence rule of type "Monthly" type = 2; [s appendFormat: @"%d", - [[[self parent] startDate] dayOfMonth]]; + (int)[[[self parent] startDate] dayOfMonth]]; } } else if ([self frequency] == iCalRecurrenceFrequenceYearly) diff --git a/ActiveSync/iCalToDo+ActiveSync.m b/ActiveSync/iCalToDo+ActiveSync.m index e9417752c..94e0f9756 100644 --- a/ActiveSync/iCalToDo+ActiveSync.m +++ b/ActiveSync/iCalToDo+ActiveSync.m @@ -140,7 +140,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. { [s appendString: @""]; [s appendFormat: @"%d", 1]; - [s appendFormat: @"%d", [o length]]; + [s appendFormat: @"%d", (int)[o length]]; [s appendFormat: @"%@", o]; [s appendString: @""]; } diff --git a/ChangeLog b/ChangeLog index f8bf36f28..9592f2aaf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,1218 @@ +commit 7644d6fb4dcd75559c5b93b920ca3c3fd5820880 +Author: Francis Lachapelle +Date: Wed Nov 18 09:42:05 2015 -0500 + + Preparation for release 2.3.3a + +M NEWS +M Version + +commit 4b8a9bcc3bc8a9c3910ba9f3527711b88090acc8 +Author: Francis Lachapelle +Date: Mon Nov 16 09:02:37 2015 -0500 + + Always show user's name in top banner + +M UI/Templates/UIxPageFrame.wox + +commit a9984d948744e58e04ad43b599aacdcddf20950a +Author: Francis Lachapelle +Date: Mon Nov 16 09:01:05 2015 -0500 + + Fix regression when saving mail folders state + +M UI/MailerUI/UIxMailMainFrame.m + +commit 2a90102a81475757017d7700f79fdd4fb04947cc +Author: Francis Lachapelle +Date: Wed Nov 11 15:51:33 2015 -0500 + + Update translations + +M UI/MailerUI/Macedonian.lproj/Localizable.strings +M UI/MainUI/Arabic.lproj/Localizable.strings +M UI/MainUI/Basque.lproj/Localizable.strings +M UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings +M UI/MainUI/Catalan.lproj/Localizable.strings +M UI/MainUI/ChineseTaiwan.lproj/Localizable.strings +M UI/MainUI/Czech.lproj/Localizable.strings +M UI/MainUI/Danish.lproj/Localizable.strings +M UI/MainUI/Dutch.lproj/Localizable.strings +M UI/MainUI/English.lproj/Localizable.strings +M UI/MainUI/Finnish.lproj/Localizable.strings +M UI/MainUI/French.lproj/Localizable.strings +M UI/MainUI/German.lproj/Localizable.strings +M UI/MainUI/Hungarian.lproj/Localizable.strings +M UI/MainUI/Icelandic.lproj/Localizable.strings +M UI/MainUI/Italian.lproj/Localizable.strings +M UI/MainUI/Macedonian.lproj/Localizable.strings +M UI/MainUI/NorwegianBokmal.lproj/Localizable.strings +M UI/MainUI/NorwegianNynorsk.lproj/Localizable.strings +M UI/MainUI/Polish.lproj/Localizable.strings +M UI/MainUI/Portuguese.lproj/Localizable.strings +M UI/MainUI/Russian.lproj/Localizable.strings +M UI/MainUI/Slovak.lproj/Localizable.strings +M UI/MainUI/Slovenian.lproj/Localizable.strings +M UI/MainUI/SpanishArgentina.lproj/Localizable.strings +M UI/MainUI/SpanishSpain.lproj/Localizable.strings +M UI/MainUI/Swedish.lproj/Localizable.strings +M UI/MainUI/Ukrainian.lproj/Localizable.strings +M UI/MainUI/Welsh.lproj/Localizable.strings +M UI/PreferencesUI/Arabic.lproj/Localizable.strings +M UI/PreferencesUI/Catalan.lproj/Localizable.strings +M UI/PreferencesUI/ChineseTaiwan.lproj/Localizable.strings +M UI/PreferencesUI/Czech.lproj/Localizable.strings +M UI/PreferencesUI/English.lproj/Localizable.strings +M UI/PreferencesUI/Finnish.lproj/Localizable.strings +M UI/PreferencesUI/French.lproj/Localizable.strings +M UI/PreferencesUI/German.lproj/Localizable.strings +M UI/PreferencesUI/Hungarian.lproj/Localizable.strings +M UI/PreferencesUI/Icelandic.lproj/Localizable.strings +M UI/PreferencesUI/Italian.lproj/Localizable.strings +M UI/PreferencesUI/Macedonian.lproj/Localizable.strings +M UI/PreferencesUI/NorwegianBokmal.lproj/Localizable.strings +M UI/PreferencesUI/Portuguese.lproj/Localizable.strings +M UI/PreferencesUI/Slovak.lproj/Localizable.strings +M UI/PreferencesUI/Slovenian.lproj/Localizable.strings +M UI/PreferencesUI/SpanishArgentina.lproj/Localizable.strings +M UI/PreferencesUI/SpanishSpain.lproj/Localizable.strings +M UI/PreferencesUI/Ukrainian.lproj/Localizable.strings +M UI/PreferencesUI/Welsh.lproj/Localizable.strings + +commit fbc73dc3bca266fd20500fcefd485a87ce350118 +Author: Francis Lachapelle +Date: Wed Nov 11 14:06:11 2015 -0500 + + Update ChangeLog + +M ChangeLog + +commit 1d78b2df96357de32775e098e40be04e88e52247 +Author: Francis Lachapelle +Date: Wed Nov 11 14:04:19 2015 -0500 + + Preparation for release 2.3.3 + +M Documentation/docinfo.xml +M Documentation/includes/global-attributes.asciidoc +M NEWS + +commit 6aef713d288b1663b38219b181f368824372163d +Author: Francis Lachapelle +Date: Wed Nov 11 14:02:25 2015 -0500 + + Update prototype.js to v1.7.3 + +M UI/WebServerResources/prototype.js + +commit 71db3945cbab757d0284f0f9c8b12276c18a3edf +Author: Francis Lachapelle +Date: Wed Nov 11 14:01:30 2015 -0500 + + Update CKEditor to version 4.5.4 + +M UI/WebServerResources/ckeditor/build-config.js +M UI/WebServerResources/ckeditor/ckeditor.js +M UI/WebServerResources/ckeditor/config.js +A UI/WebServerResources/ckeditor/lang/mk.js +A UI/WebServerResources/ckeditor/lang/pt.js +M UI/WebServerResources/ckeditor/plugins/about/dialogs/about.js +M UI/WebServerResources/ckeditor/plugins/clipboard/dialogs/paste.js +M UI/WebServerResources/ckeditor/plugins/colordialog/dialogs/colordialog.js +M UI/WebServerResources/ckeditor/plugins/div/dialogs/div.js +M UI/WebServerResources/ckeditor/plugins/image/dialogs/image.js +M UI/WebServerResources/ckeditor/plugins/link/dialogs/anchor.js +M UI/WebServerResources/ckeditor/plugins/link/dialogs/link.js +M UI/WebServerResources/ckeditor/plugins/scayt/dialogs/options.js +M UI/WebServerResources/ckeditor/plugins/table/dialogs/table.js +M UI/WebServerResources/ckeditor/plugins/tabletools/dialogs/tableCell.js +M UI/WebServerResources/ckeditor/plugins/wsc/dialogs/wsc.js +M UI/WebServerResources/ckeditor/plugins/wsc/dialogs/wsc_ie.js + +commit da230410be141ab5e5a52a1849e10e471d1266f4 +Author: Francis Lachapelle +Date: Wed Nov 11 13:31:58 2015 -0500 + + Handle ExpandedFolders settings like in v3 + + This implies a transition where ExpandedFolders can be either a string + or an array. + +M UI/MailerUI/UIxMailMainFrame.m + +commit 82114f75aa619666a8fbbc103a7909d4d4d98048 +Author: Francis Lachapelle +Date: Wed Nov 11 12:58:26 2015 -0500 + + Fix Macedonian et Portuguese translations + +M UI/PreferencesUI/Macedonian.lproj/Localizable.strings +M UI/PreferencesUI/Portuguese.lproj/Localizable.strings + +commit f8d31a6413081da6c866bc8333288ff2de4e2cc1 +Author: Francis Lachapelle +Date: Wed Nov 11 12:04:19 2015 -0500 + + Update NEWS file + +M NEWS + +commit 707aabde153ee1c0f841fa91e42fa8a276741726 +Author: Francis Lachapelle +Date: Wed Nov 11 12:04:04 2015 -0500 + + Update Slovenian translation + +M UI/AdministrationUI/Slovenian.lproj/Localizable.strings + +commit ceec497aeca6da36ce67825ee8d33238b8008b04 +Author: Francis Lachapelle +Date: Wed Nov 11 11:50:32 2015 -0500 + + Fix Portuguese translation + +M UI/Contacts/Portuguese.lproj/Localizable.strings +M UI/PreferencesUI/Portuguese.lproj/Localizable.strings + +commit 46f93d862949b40e9106cdc9e936d42923b35553 +Author: Francis Lachapelle +Date: Wed Nov 11 11:50:06 2015 -0500 + + Fix Macedonian translation + +M UI/Contacts/Macedonian.lproj/Localizable.strings +M UI/PreferencesUI/Macedonian.lproj/Localizable.strings + +commit f2347e13d732af4e7ddf1f10b3195b673034ef7a +Author: Francis Lachapelle +Date: Wed Nov 11 11:49:36 2015 -0500 + + Fix localizable strings in contact editor + +M UI/Templates/ContactsUI/UIxContactEditor.wox + +commit 106f8ec3145cbe06340b164cb8f8c83093249814 +Author: Francis Lachapelle +Date: Wed Nov 11 09:46:21 2015 -0500 + + Improve Portuguese translation + +M UI/PreferencesUI/Arabic.lproj/Localizable.strings +M UI/PreferencesUI/Basque.lproj/Localizable.strings +M UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings +M UI/PreferencesUI/Catalan.lproj/Localizable.strings +M UI/PreferencesUI/ChineseTaiwan.lproj/Localizable.strings +M UI/PreferencesUI/Czech.lproj/Localizable.strings +M UI/PreferencesUI/Dutch.lproj/Localizable.strings +M UI/PreferencesUI/English.lproj/Localizable.strings +M UI/PreferencesUI/Finnish.lproj/Localizable.strings +M UI/PreferencesUI/French.lproj/Localizable.strings +M UI/PreferencesUI/German.lproj/Localizable.strings +M UI/PreferencesUI/Hungarian.lproj/Localizable.strings +M UI/PreferencesUI/Icelandic.lproj/Localizable.strings +M UI/PreferencesUI/Italian.lproj/Localizable.strings +M UI/PreferencesUI/NorwegianNynorsk.lproj/Localizable.strings +M UI/PreferencesUI/Polish.lproj/Localizable.strings +M UI/PreferencesUI/Russian.lproj/Localizable.strings +M UI/PreferencesUI/Slovak.lproj/Localizable.strings +M UI/PreferencesUI/Slovenian.lproj/Localizable.strings +M UI/PreferencesUI/SpanishArgentina.lproj/Localizable.strings +M UI/PreferencesUI/SpanishSpain.lproj/Localizable.strings +M UI/PreferencesUI/Swedish.lproj/Localizable.strings +M UI/PreferencesUI/Ukrainian.lproj/Localizable.strings +M UI/PreferencesUI/Welsh.lproj/Localizable.strings + +commit f58554a70051b647a8fd33db01c5175dad0be34c +Author: Francis Lachapelle +Date: Wed Nov 11 09:31:54 2015 -0500 + + Add Macedonian translation + +M .tx/config +M SoObjects/Appointments/GNUmakefile +A SoObjects/Appointments/Macedonian.lproj/Localizable.strings +M SoObjects/Contacts/GNUmakefile +A SoObjects/Contacts/Macedonian.lproj/Localizable.strings +M SoObjects/Mailer/GNUmakefile +A SoObjects/Mailer/Macedonian.lproj/Localizable.strings +M SoObjects/Mailer/SOGoMailForward.h +M SoObjects/Mailer/SOGoMailForward.m +A SoObjects/Mailer/SOGoMailMacedonianForward.wo/SOGoMailMacedonianForward.html +A SoObjects/Mailer/SOGoMailMacedonianForward.wo/SOGoMailMacedonianForward.wod +A SoObjects/Mailer/SOGoMailMacedonianReply.wo/SOGoMailMacedonianReply.html +A SoObjects/Mailer/SOGoMailMacedonianReply.wo/SOGoMailMacedonianReply.wod +M SoObjects/Mailer/SOGoMailReply.h +M SoObjects/Mailer/SOGoMailReply.m +M SoObjects/SOGo/SOGoDefaults.plist +M Tests/Integration/preferences.py +M UI/AdministrationUI/GNUmakefile +A UI/AdministrationUI/Macedonian.lproj/Localizable.strings +M UI/Common/GNUmakefile +A UI/Common/Macedonian.lproj/Localizable.strings +M UI/Contacts/GNUmakefile +A UI/Contacts/Macedonian.lproj/Localizable.strings +M UI/MailPartViewers/GNUmakefile +A UI/MailPartViewers/Macedonian.lproj/Localizable.strings +M UI/MailerUI/GNUmakefile +A UI/MailerUI/Macedonian.lproj/Localizable.strings +M UI/MainUI/Arabic.lproj/Localizable.strings +M UI/MainUI/Basque.lproj/Localizable.strings +M UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings +M UI/MainUI/Catalan.lproj/Localizable.strings +M UI/MainUI/ChineseTaiwan.lproj/Localizable.strings +M UI/MainUI/Czech.lproj/Localizable.strings +M UI/MainUI/Danish.lproj/Localizable.strings +M UI/MainUI/Dutch.lproj/Localizable.strings +M UI/MainUI/English.lproj/Localizable.strings +M UI/MainUI/Finnish.lproj/Localizable.strings +M UI/MainUI/French.lproj/Localizable.strings +M UI/MainUI/GNUmakefile +M UI/MainUI/German.lproj/Localizable.strings +M UI/MainUI/Hungarian.lproj/Localizable.strings +M UI/MainUI/Icelandic.lproj/Localizable.strings +M UI/MainUI/Italian.lproj/Localizable.strings +A UI/MainUI/Macedonian.lproj/Locale +A UI/MainUI/Macedonian.lproj/Localizable.strings +M UI/MainUI/NorwegianBokmal.lproj/Localizable.strings +M UI/MainUI/NorwegianNynorsk.lproj/Localizable.strings +M UI/MainUI/Polish.lproj/Localizable.strings +M UI/MainUI/Portuguese.lproj/Localizable.strings +M UI/MainUI/Russian.lproj/Localizable.strings +M UI/MainUI/Slovenian.lproj/Localizable.strings +M UI/MainUI/SpanishArgentina.lproj/Localizable.strings +M UI/MainUI/SpanishSpain.lproj/Localizable.strings +M UI/MainUI/Swedish.lproj/Localizable.strings +M UI/MainUI/Ukrainian.lproj/Localizable.strings +M UI/MainUI/Welsh.lproj/Localizable.strings +M UI/PreferencesUI/Arabic.lproj/Localizable.strings +M UI/PreferencesUI/Basque.lproj/Localizable.strings +M UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings +M UI/PreferencesUI/Catalan.lproj/Localizable.strings +M UI/PreferencesUI/ChineseTaiwan.lproj/Localizable.strings +M UI/PreferencesUI/Czech.lproj/Localizable.strings +M UI/PreferencesUI/Danish.lproj/Localizable.strings +M UI/PreferencesUI/Dutch.lproj/Localizable.strings +M UI/PreferencesUI/English.lproj/Localizable.strings +M UI/PreferencesUI/Finnish.lproj/Localizable.strings +M UI/PreferencesUI/French.lproj/Localizable.strings +M UI/PreferencesUI/GNUmakefile +M UI/PreferencesUI/German.lproj/Localizable.strings +M UI/PreferencesUI/Hungarian.lproj/Localizable.strings +M UI/PreferencesUI/Icelandic.lproj/Localizable.strings +M UI/PreferencesUI/Italian.lproj/Localizable.strings +A UI/PreferencesUI/Macedonian.lproj/Localizable.strings +M UI/PreferencesUI/NorwegianBokmal.lproj/Localizable.strings +M UI/PreferencesUI/NorwegianNynorsk.lproj/Localizable.strings +M UI/PreferencesUI/Polish.lproj/Localizable.strings +M UI/PreferencesUI/Portuguese.lproj/Localizable.strings +M UI/PreferencesUI/Russian.lproj/Localizable.strings +M UI/PreferencesUI/Slovak.lproj/Localizable.strings +M UI/PreferencesUI/Slovenian.lproj/Localizable.strings +M UI/PreferencesUI/SpanishArgentina.lproj/Localizable.strings +M UI/PreferencesUI/SpanishSpain.lproj/Localizable.strings +M UI/PreferencesUI/Swedish.lproj/Localizable.strings +M UI/PreferencesUI/Ukrainian.lproj/Localizable.strings +M UI/PreferencesUI/Welsh.lproj/Localizable.strings +M UI/Scheduler/GNUmakefile +A UI/Scheduler/Macedonian.lproj/Localizable.strings +A UI/Templates/SOGoACLMacedonianAdditionAdvisory.wox +A UI/Templates/SOGoACLMacedonianModificationAdvisory.wox +A UI/Templates/SOGoACLMacedonianRemovalAdvisory.wox +A UI/Templates/SOGoFolderMacedonianAdditionAdvisory.wox +A UI/Templates/SOGoFolderMacedonianRemovalAdvisory.wox + +commit 76b8de180514bdd1a6b53bde37bd464848bce0a3 +Author: Francis Lachapelle +Date: Tue Nov 10 16:33:11 2015 -0500 + + Add Portuguese translation + +M .tx/config +M SoObjects/Appointments/GNUmakefile +A SoObjects/Appointments/Portuguese.lproj/Localizable.strings +M SoObjects/Contacts/GNUmakefile +A SoObjects/Contacts/Portuguese.lproj/Localizable.strings +M SoObjects/Mailer/GNUmakefile +A SoObjects/Mailer/Portuguese.lproj/Localizable.strings +M SoObjects/Mailer/SOGoMailForward.h +M SoObjects/Mailer/SOGoMailForward.m +A SoObjects/Mailer/SOGoMailPortugueseForward.wo/SOGoMailPortugueseForward.html +A SoObjects/Mailer/SOGoMailPortugueseForward.wo/SOGoMailPortugueseForward.wod +A SoObjects/Mailer/SOGoMailPortugueseReply.wo/SOGoMailPortugueseReply.html +A SoObjects/Mailer/SOGoMailPortugueseReply.wo/SOGoMailPortugueseReply.wod +M SoObjects/Mailer/SOGoMailReply.h +M SoObjects/Mailer/SOGoMailReply.m +M SoObjects/SOGo/SOGoDefaults.plist +M Tests/Integration/preferences.py +M UI/AdministrationUI/GNUmakefile +A UI/AdministrationUI/Portuguese.lproj/Localizable.strings +M UI/Common/GNUmakefile +A UI/Common/Portuguese.lproj/Localizable.strings +M UI/Contacts/GNUmakefile +A UI/Contacts/Portuguese.lproj/Localizable.strings +M UI/MailPartViewers/GNUmakefile +A UI/MailPartViewers/Portuguese.lproj/Localizable.strings +M UI/MailerUI/GNUmakefile +A UI/MailerUI/Portuguese.lproj/Localizable.strings +M UI/MainUI/Arabic.lproj/Localizable.strings +M UI/MainUI/Basque.lproj/Localizable.strings +M UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings +M UI/MainUI/Catalan.lproj/Localizable.strings +M UI/MainUI/ChineseTaiwan.lproj/Localizable.strings +M UI/MainUI/Czech.lproj/Localizable.strings +M UI/MainUI/Danish.lproj/Localizable.strings +M UI/MainUI/Dutch.lproj/Localizable.strings +M UI/MainUI/English.lproj/Localizable.strings +M UI/MainUI/Finnish.lproj/Localizable.strings +M UI/MainUI/French.lproj/Localizable.strings +M UI/MainUI/GNUmakefile +M UI/MainUI/German.lproj/Localizable.strings +M UI/MainUI/Hungarian.lproj/Localizable.strings +M UI/MainUI/Icelandic.lproj/Localizable.strings +M UI/MainUI/Italian.lproj/Localizable.strings +M UI/MainUI/NorwegianBokmal.lproj/Localizable.strings +M UI/MainUI/NorwegianNynorsk.lproj/Localizable.strings +M UI/MainUI/Polish.lproj/Localizable.strings +A UI/MainUI/Portuguese.lproj/Locale +A UI/MainUI/Portuguese.lproj/Localizable.strings +M UI/MainUI/Russian.lproj/Localizable.strings +M UI/MainUI/Slovenian.lproj/Localizable.strings +M UI/MainUI/SpanishArgentina.lproj/Localizable.strings +M UI/MainUI/SpanishSpain.lproj/Localizable.strings +M UI/MainUI/Swedish.lproj/Localizable.strings +M UI/MainUI/Ukrainian.lproj/Localizable.strings +M UI/MainUI/Welsh.lproj/Localizable.strings +M UI/PreferencesUI/Arabic.lproj/Localizable.strings +M UI/PreferencesUI/Basque.lproj/Localizable.strings +M UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings +M UI/PreferencesUI/Catalan.lproj/Localizable.strings +M UI/PreferencesUI/ChineseTaiwan.lproj/Localizable.strings +M UI/PreferencesUI/Czech.lproj/Localizable.strings +M UI/PreferencesUI/Dutch.lproj/Localizable.strings +M UI/PreferencesUI/English.lproj/Localizable.strings +M UI/PreferencesUI/Finnish.lproj/Localizable.strings +M UI/PreferencesUI/French.lproj/Localizable.strings +M UI/PreferencesUI/GNUmakefile +M UI/PreferencesUI/German.lproj/Localizable.strings +M UI/PreferencesUI/Hungarian.lproj/Localizable.strings +M UI/PreferencesUI/Icelandic.lproj/Localizable.strings +M UI/PreferencesUI/Italian.lproj/Localizable.strings +M UI/PreferencesUI/NorwegianNynorsk.lproj/Localizable.strings +M UI/PreferencesUI/Polish.lproj/Localizable.strings +A UI/PreferencesUI/Portuguese.lproj/Localizable.strings +M UI/PreferencesUI/Russian.lproj/Localizable.strings +M UI/PreferencesUI/Slovak.lproj/Localizable.strings +M UI/PreferencesUI/Slovenian.lproj/Localizable.strings +M UI/PreferencesUI/SpanishArgentina.lproj/Localizable.strings +M UI/PreferencesUI/SpanishSpain.lproj/Localizable.strings +M UI/PreferencesUI/Swedish.lproj/Localizable.strings +M UI/PreferencesUI/Ukrainian.lproj/Localizable.strings +M UI/PreferencesUI/Welsh.lproj/Localizable.strings +M UI/Scheduler/GNUmakefile +A UI/Scheduler/Portuguese.lproj/Localizable.strings +A UI/Templates/SOGoACLPortugueseAdditionAdvisory.wox +A UI/Templates/SOGoACLPortugueseModificationAdvisory.wox +A UI/Templates/SOGoACLPortugueseRemovalAdvisory.wox +A UI/Templates/SOGoFolderPortugueseAdditionAdvisory.wox +A UI/Templates/SOGoFolderPortugueseRemovalAdvisory.wox + +commit 64456c10e5539550b49b699babef6422e19df5df +Author: Ludovic Marcotte +Date: Mon Nov 9 14:30:58 2015 -0500 + + (fix) additional fix for #3356 + +M ActiveSync/SOGoActiveSyncDispatcher.m + +commit ef7de7c10d6d0b722850347e88fb3d620588a66b +Author: Ludovic Marcotte +Date: Fri Nov 6 13:33:36 2015 -0500 + + (fix) fixed addressbrook-only source entires having a c_uid set + +M NEWS +M SoObjects/Contacts/SOGoContactSourceFolder.m + +commit 106c6a24ae1a2254a8a983de829a89e1c0313bae +Author: Francis Lachapelle +Date: Fri Nov 6 09:40:36 2015 -0500 + + (js) Fix dialogs when partially visible + + Fixes #2646, #3378 + +M NEWS +M UI/WebServerResources/SchedulerUI.js + +commit 863f182e844fcb1f3a8f7d5a07a2dffee9a39d17 +Author: Ludovic Marcotte +Date: Fri Nov 6 09:25:49 2015 -0500 + + (fix) fixed wrong comparison of meta vs. META tag in HTML mails + +M NEWS +M UI/MailPartViewers/UIxMailPartHTMLViewer.m + +commit ba37353e42163a1411f7b32e74d571d8ad4a5135 +Author: Francis Lachapelle +Date: Fri Nov 6 09:14:09 2015 -0500 + + (fix) Position of popup menu + + Fixes #3381 + +M UI/WebServerResources/UIxAppointmentEditor.css +M UI/WebServerResources/generic.js + +commit 1915748e33ab3f652cb34d07c989cde079cb0d13 +Author: Francis Lachapelle +Date: Fri Nov 6 09:03:20 2015 -0500 + + Bump version to 2.3.3 + +M Version + +commit b170ae866f72cbb6be64a3fd0cf10518194d5c62 +Author: Ludovic Marcotte +Date: Fri Nov 6 08:56:23 2015 -0500 + + (fix) small fixes + +M ActiveSync/SOGoActiveSyncDispatcher.m +M SoObjects/SOGo/SOGoCacheGCSObject.m + +commit 7c69e37449b72bbf55f3c5d1017c75e36dfc590e +Author: Francis Lachapelle +Date: Fri Nov 6 08:45:42 2015 -0500 + + (fix) JavaScript syntax error in attendees editor + +M NEWS +M UI/WebServerResources/UIxAttendeesEditor.js + +commit 7f26d47cd110a3a6b2502a811cf220e194d033f7 +Author: Ludovic Marcotte +Date: Thu Nov 5 15:39:08 2015 -0500 + + We drop Lucid. + +M Documentation/SOGoInstallationGuide.asciidoc + +commit b55ec52bfe1ba32bc43bb7bc124dbc84d7f79e11 +Author: Ludovic Marcotte +Date: Thu Nov 5 15:21:13 2015 -0500 + + (fix) handle emails having an attachment as their content + +M NEWS +M SoObjects/Mailer/SOGoMailObject.m + +commit f919df050a4e566ef09e564d69bdc67f2f4d00ec +Author: Ludovic Marcotte +Date: Thu Nov 5 14:58:58 2015 -0500 + + (fix) one more fix for #3118 + +M ActiveSync/SOGoActiveSyncDispatcher.m + +commit c2e4f7441d9dec4bbbf4825621c9354c123b8250 +Author: Ludovic Marcotte +Date: Thu Nov 5 13:57:51 2015 -0500 + + (fix) double declaration of same method + +M SoObjects/Appointments/SOGoCalendarComponent.m + +commit ca274649841493cba9f6a6bc856fc45596413ed8 +Author: Ludovic Marcotte +Date: Thu Nov 5 13:43:48 2015 -0500 + + (fix) added type cast + +M ActiveSync/iCalRecurrenceRule+ActiveSync.m + +commit e4fae417b9a6f93127b99519ac3473ef69b4655d +Author: Euan Thoms +Date: Wed Nov 4 06:02:45 2015 +0800 + + Stage 8 of clang compiler warning patches. + + Update WORequest+SOGo.m + +M SoObjects/SOGo/WORequest+SOGo.m + +commit eda84c7b5d6cc6060ae9f3981a9865ae9210493b +Author: Euan Thoms +Date: Fri Nov 6 01:29:26 2015 +0800 + + Stage1b (v2 branch) of clang compiler warning patches. + +M ActiveSync/iCalAlarm+ActiveSync.m +M ActiveSync/iCalEvent+ActiveSync.m +M ActiveSync/iCalToDo+ActiveSync.m +M Main/SOGo+DAV.m +M SOPE/GDLContentStore/GCSChannelManager.m +M SOPE/NGCards/CardElement.m +M SOPE/NGCards/CardGroup.m +M SOPE/NGCards/NSCalendarDate+NGCards.m +M SOPE/NGCards/iCalMonthlyRecurrenceCalculator.m +M SOPE/NGCards/iCalRecurrenceRule.m +M SOPE/NGCards/versitCardsSaxDriver/VSSaxDriver.m +M SoObjects/Appointments/MSExchangeFreeBusy.m +M SoObjects/Appointments/SOGoAppointmentFolder.h +M SoObjects/Appointments/SOGoAppointmentFolder.m +M SoObjects/Appointments/SOGoAppointmentObject.m +M SoObjects/Appointments/SOGoCalendarComponent.m +M SoObjects/Appointments/iCalAlarm+SOGo.m +M SoObjects/Appointments/iCalEvent+SOGo.h +M SoObjects/Appointments/iCalEvent+SOGo.m +M SoObjects/Contacts/NGVCard+SOGo.m +M SoObjects/Contacts/SOGoContactEntryPhoto.m +M SoObjects/Contacts/SOGoContactFolders.m +M SoObjects/Contacts/SOGoContactGCSEntry.m +M SoObjects/Contacts/SOGoContactGCSList.m +M SoObjects/Contacts/SOGoContactSourceFolder.m +M SoObjects/Mailer/NSString+Mail.m +M SoObjects/Mailer/SOGoMailBodyPart.m +M SoObjects/Mailer/SOGoMailFolder.m +M SoObjects/Mailer/SOGoMailForward.m +M SoObjects/Mailer/SOGoMailLabel.m +M SoObjects/Mailer/SOGoMailObject.m +M SoObjects/SOGo/BSONCodec.m +M SoObjects/SOGo/LDAPSource.m +M SoObjects/SOGo/NSCalendarDate+SOGo.m +M SoObjects/SOGo/NSDictionary+DAV.m +M SoObjects/SOGo/NSString+Utilities.m +M SoObjects/SOGo/SOGoCacheGCSObject.m +M SoObjects/SOGo/SOGoContentObject.m +M SoObjects/SOGo/SOGoFolder.m +M SoObjects/SOGo/SOGoGCSFolder.m +M SoObjects/SOGo/SOGoGroup.m +M SoObjects/SOGo/SOGoObject.m +M Tests/Unit/SOGoTest.m +M Tests/Unit/TestNGMailAddressParser.m +M Tests/Unit/TestNGMimeAddressHeaderFieldGenerator.m +M Tests/Unit/TestNGMimeMessageGenerator.m +M Tests/Unit/TestVersit.m +M Tests/Unit/TestiCalRecurrenceCalculator.m +M Tests/Unit/TestiCalTimeZonePeriod.m +M Tools/SOGoEAlarmsNotifier.m +M Tools/SOGoSockDOperation.m +M Tools/SOGoToolCreateFolder.m +M Tools/SOGoToolExpireUserSessions.m +M Tools/SOGoToolManageEAS.m +M Tools/SOGoToolRemoveDoubles.m +M Tools/SOGoToolRenameUser.m +M Tools/SOGoToolUserPreferences.m +M Tools/sogo-tool.m +M UI/Common/UIxToolbar.m +M UI/Contacts/UIxContactActions.m +M UI/Contacts/UIxContactFolderActions.m +M UI/Contacts/UIxContactFolderProperties.m +M UI/Contacts/UIxContactView.m +M UI/MailPartViewers/UIxMailPartHTMLViewer.m +M UI/MailPartViewers/UIxMailPartMixedViewer.m +M UI/MailPartViewers/UIxMailPartViewer.m +M UI/MailerUI/UIxMailFolderActions.m +M UI/MailerUI/UIxMailListActions.h +M UI/MailerUI/UIxMailMainFrame.m +M UI/MailerUI/UIxMailView.m +M UI/MainUI/SOGoMicrosoftActiveSyncActions.m +M UI/PreferencesUI/UIxPreferences.m +M UI/SOGoUI/SOGoAptFormatter.m +M UI/Scheduler/UIxCalDateSelector.m +M UI/Scheduler/UIxCalDayTable.h +M UI/Scheduler/UIxCalDayTable.m +M UI/Scheduler/UIxCalDayView.m +M UI/Scheduler/UIxCalListingActions.m +M UI/Scheduler/UIxCalMonthView.m +M UI/Scheduler/UIxCalViewPrint.m +M UI/Scheduler/UIxComponentEditor.m +M UI/Scheduler/UIxRecurrenceEditor.m + +commit 9d310237246ba79a316a4cb006368ddd53c20a87 +Author: Ludovic Marcotte +Date: Thu Nov 5 11:11:18 2015 -0500 + + (fix) additional fix for #3118 + +M ActiveSync/SOGoActiveSyncDispatcher.m +M SoObjects/SOGo/SOGoCacheGCSObject.h + +commit 41e80bb1057f19840c10a40ea32e4fe00437797c +Author: Ludovic Marcotte +Date: Thu Nov 5 09:48:17 2015 -0500 + + Updated NEWS file regarding PR#120 + +M NEWS + +commit 7a5e550510a809e19f951e338dd42bf8e337e861 +Author: Ludovic Marcotte +Date: Thu Nov 5 09:36:11 2015 -0500 + + (fix) manually added patch from PR#113 to avoid many "broken" commits + +M SoObjects/Appointments/SOGoCalendarComponent.m +M SoObjects/SOGo/SOGoParentFolder.m + +commit 0605fdf02a0c8bcaa8b2f365d3aa973b9fd55b08 +Author: Euan Thoms +Date: Wed Nov 4 03:40:53 2015 +0800 + + Delete .orig files left over from applying patches to Stage 2. + +D SOPE/NGCards/iCalPerson.m.orig +D SoObjects/Contacts/SOGoContactSourceFolder.m.orig +D SoObjects/SOGo/SOGoCacheGCSFolder.m.orig +D SoObjects/SOGo/SQLSource.m.orig + +commit d3290dbb8ddcc1dd8f3ac0c66d64b5d933d5a0f4 +Author: Euan Thoms +Date: Wed Nov 4 03:36:34 2015 +0800 + + Stage 2 of clang compiler warning patches. + +M SOPE/NGCards/iCalPerson.m +A SOPE/NGCards/iCalPerson.m.orig +M SoObjects/Contacts/SOGoContactSourceFolder.m +A SoObjects/Contacts/SOGoContactSourceFolder.m.orig +M SoObjects/SOGo/SOGoCacheGCSFolder.m +A SoObjects/SOGo/SOGoCacheGCSFolder.m.orig +M SoObjects/SOGo/SQLSource.m +A SoObjects/SOGo/SQLSource.m.orig + +commit 34f626b84c69603e7fd4c2c8301d83309c3d0af3 +Author: Ludovic Marcotte +Date: Wed Nov 4 09:21:42 2015 -0500 + + (fix) small fixes around web calendars + sync + +M UI/Scheduler/UIxCalendarProperties.m + +commit e173c6d621073e5674893ed09aa35b0d707e014a +Author: Euan Thoms +Date: Wed Nov 4 06:13:01 2015 +0800 + + Stage 9 of clang compiler warning patches. + +M SoObjects/SOGo/NSData+Crypto.m + +commit 1425bb1c7574be44e7a2f1f2f45b7133f08eb44d +Author: Euan Thoms +Date: Wed Nov 4 05:28:03 2015 +0800 + + Stage 5 of clang compiler warning patches. + +M SoObjects/Appointments/SOGoAppointmentObject.m +M Tools/SOGoToolRestore.m + +commit 5b65eaa57259d415ec4d8139899f5722029d79fc +Author: Euan Thoms +Date: Wed Nov 4 04:59:27 2015 +0800 + + Stage 4 of clang compiler warning patches. + +M SoObjects/SOGo/SOGoCacheGCSFolder.h +M SoObjects/SOGo/SOGoCacheObject.h + +commit 892bd693d7ee901bc1c7947e0785ff0787fc112a +Author: Euan Thoms +Date: Wed Nov 4 03:59:40 2015 +0800 + + Stage 3 of clang compiler warning patches. + + Conflicts: + + UI/PreferencesUI/UIxJSONPreferences.m + +M SoObjects/Appointments/iCalRepeatableEntityObject+SOGo.m +M SoObjects/Mailer/NSDictionary+Mail.m +M SoObjects/Mailer/SOGoMailBaseObject.m +M SoObjects/SOGo/SOGoCache.h +M UI/Common/WODirectAction+SOGo.m +M UI/Contacts/UIxContactFolderActions.m +M UI/MailPartViewers/UIxMailPartICalActions.m +M UI/MainUI/SOGoMicrosoftActiveSyncActions.m +M UI/PreferencesUI/UIxJSONPreferences.m + +commit 6812cb08dcbf08bebfb32fcb34b58b351243337f +Author: Francis Lachapelle +Date: Tue Nov 3 08:57:51 2015 -0500 + + Display missing events when printing working hours + +M NEWS +M UI/WebServerResources/UIxCalViewPrint.js + +commit b62167dd00851661c9d43b87cc6d66cde7f87f2e +Author: Francis Lachapelle +Date: Tue Nov 3 08:27:50 2015 -0500 + + Fix Brazilian (Portuguese) translation + + Fixes #3355 + +M UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings + +commit 1013c473cd72762b6587281d069245ef8daeec16 +Author: Ludovic Marcotte +Date: Mon Oct 26 10:25:11 2015 -0400 + + (feat) support for ghosted elements on contacts over EAS + +M ActiveSync/NGVCard+ActiveSync.m +M NEWS + +commit b8d77259cdb17c43bac8c7790dd7f9f36e9c58e8 +Author: Ludovic Marcotte +Date: Mon Oct 26 10:15:35 2015 -0400 + + (feat) we now save the supported elements in EAS collections + +M ActiveSync/SOGoActiveSyncDispatcher+Sync.m +M ActiveSync/SOGoActiveSyncDispatcher.m + +commit 40cb81fd0b9b6156fb81a9cc0545699663a68416 +Author: Ludovic Marcotte +Date: Mon Oct 26 10:08:00 2015 -0400 + + (fix) prevent postal address showing on single line over EAS (#2614) + +M ActiveSync/NGVCard+ActiveSync.m +M NEWS + +commit b378d258cbe732cb583c91b86b4d65516933d8ab +Author: Ludovic Marcotte +Date: Fri Oct 23 15:54:33 2015 -0400 + + (fix) add unit test from PR #105 + +M Tests/Unit/GNUmakefile +A Tests/Unit/TestNGMailAddressParser.m + +commit 3ba1e33eb66b49c563588f69149400cbe1d65b4a +Author: Ludovic Marcotte +Date: Fri Oct 23 15:39:49 2015 -0400 + + (fix) perms fixes on scripts + +M Scripts/sql-update-1.3.11_to_1.3.12-mysql.sh +M Scripts/sql-update-1.3.16_to_1.3.17-mysql.sh +M Scripts/sql-update-1.3.3_to_1.3.4-mysql.sh +M Scripts/sql-update-1.3.3_to_1.3.4.sh +M Scripts/sql-update-20080303.sh + +commit 40a1d5fdbf326d4fbd4c8739d2a6f9b5861b8af0 +Author: Ludovic Marcotte +Date: Fri Oct 23 14:34:19 2015 -0400 + + (fix) inline images sent from SOGo webmail are not displayed in Mozilla Thunderbird (#3271) + +M NEWS +M SoObjects/Mailer/SOGoDraftObject.m + +commit 1b44218a3565fa69f15c5e1f3b69bbdf6ab9f1d3 +Author: Ludovic Marcotte +Date: Fri Oct 23 12:44:43 2015 -0400 + + (fix) avoid crash when replying to a mail with no recipients (#3359) + +M NEWS +M SoObjects/Mailer/SOGoDraftObject.m + +commit df211af604793a61065d3a4f38c922ada6ae089c +Author: Ludovic Marcotte +Date: Fri Oct 23 11:32:04 2015 -0400 + + (fix) fixed br_pt translation + updated transifex (#3355) + +M UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings + +commit 2c723070c69899055b456119f6e8f42c279d0c57 +Author: Ludovic Marcotte +Date: Wed Oct 21 10:54:15 2015 -0400 + + (fix) we now return all cards when we receive an empty addressbook-query REPORT + +M NEWS +M SoObjects/Contacts/SOGoFolder+CardDAV.h +M SoObjects/Contacts/SOGoFolder+CardDAV.m + +commit 6f5bb3882cf5f332d97950dcb7785c6233af31cc +Author: Enrique J. Hernández Blasco +Date: Wed Oct 21 10:53:08 2015 +0200 + + oc-mail: Sync expunged messages on first cache sync + + There is a use case where this has caused crashes: + + A message was hard-deleted using an IMAP client, this is the first + message you deleted in that folder and you have cleared offline + items in the client so a full sync is asked by upper layer. + + In that situation, the SyncLastDeleteChangeNumber version property + is not set and return 0 in [getDeletedKeysFromChangeNumber:andCN:inTableType] + making OpenChange to crash while it is asking for deleted fmids + since a given change number. + + This is a regression from 18d7070c4a44a8437. + +M OpenChange/MAPIStoreMailFolder.m + +commit fc9b175f25460b870335c397b03086e347e1af5a +Author: Ludovic Marcotte +Date: Tue Oct 20 15:33:18 2015 -0400 + + (feat) now possible to choose which folders to sync over EAS + +M ActiveSync/SOGoActiveSyncDispatcher.m +M NEWS + +commit 1716e46210ab1deec5ee346f03816fd189c37f6f +Author: Ludovic Marcotte +Date: Tue Oct 20 08:48:39 2015 -0400 + + (fix) last fixes for cache coherency + +M ActiveSync/SOGoActiveSyncDispatcher+Sync.m +M ActiveSync/SOGoActiveSyncDispatcher.h +M ActiveSync/SOGoActiveSyncDispatcher.m + +commit 8800cdf64115c013ce141640f8c1c481f77dcd11 +Author: Juan Vallés +Date: Fri Oct 16 11:11:50 2015 +0200 + + oc-calendar: force cache synchronisation for a message before aborting + + Sometimes we're trying to get the `objectVersion` of a calendar message, + but this message's entry is not in the cache. The method + `synchroniseCache` won't work in this case, so we try to force the + synchronisation of that particular message in order to get the change + number before aborting. + +M OpenChange/MAPIStoreGCSFolder.h +M OpenChange/MAPIStoreGCSFolder.m +M OpenChange/MAPIStoreGCSMessage.m + +commit d998786ea61d39c3ad3bfa27a9587bc1c12ad279 +Author: Enrique J. Hernández Blasco +Date: Tue Oct 20 09:56:11 2015 +0200 + + oc-mail: Always increase the CN when setting the message read flag + + And perform the real IMAP operation on save method as described by + [MS-OXCFXICS] and [MS-OXCMSG] Section 2.2.3.3, these operations must be + committed when SaveChangesMessage is called. + + As it is expected by Outlook to increase the change number when + performing the `SetMessageReadFlag` ROP, if it is not done, the client + tries indefinitely to store that. + +M OpenChange/MAPIStoreMailMessage.m + +commit 498cec767b7433d9de21708bff601618db15fde8 +Author: Juan Vallés +Date: Fri Oct 16 12:08:50 2015 +0200 + + Revert "Store c_content in sogo_cache_folder as a BLOB" + + This reverts commit b32951384568dc705d16cde4be910a886cb58b49. It was + causing issues and we'll need to do more testing on this optimisation. + +M SoObjects/SOGo/GCSSpecialQueries+SOGoCacheObject.m +M SoObjects/SOGo/SOGoCacheGCSObject.m + +commit 8cb580633d16b13447d85230fd3a0907f4695905 +Author: Ludovic Marcotte +Date: Thu Oct 15 15:54:25 2015 -0400 + + (fix) oh well, old crappy distros + +M ActiveSync/SOGoActiveSyncDispatcher.m + +commit 2b1e06088199c52a2e1f0086329866f6113bd2c7 +Author: Ludovic Marcotte +Date: Thu Oct 15 15:31:46 2015 -0400 + + (feat) initial S/MIME support for EAS (#3327) + +M ActiveSync/GNUmakefile.preamble +M ActiveSync/SOGoActiveSyncDispatcher+Sync.m +M ActiveSync/SOGoActiveSyncDispatcher.m +M ActiveSync/SOGoMailObject+ActiveSync.m +M NEWS +M SoObjects/Mailer/SOGoMailObject.m + +commit 3702e79a007faddca77c9a5b9a5c0061b598cdf9 +Author: Ludovic Marcotte +Date: Thu Oct 15 12:51:30 2015 -0400 + + (fix) don't escape quoted strings during versit generation + +M NEWS +M SOPE/NGCards/NSString+NGCards.m + +commit beb484da102196a491c6f0c6332e99af02b0ccf4 +Author: Ludovic Marcotte +Date: Wed Oct 14 09:57:56 2015 -0400 + + (fix) make sure English is always used when generating Date headers using EAS (#3356) + +M ActiveSync/SOGoActiveSyncDispatcher.m +M NEWS + +commit a54cc22da8c690c7ec4b9c03b99349be7b326262 +Author: Ludovic Marcotte +Date: Wed Oct 14 09:29:52 2015 -0400 + + (fix) we no longer always rewrite emails for Outlook when using EAS + +M ActiveSync/SOGoMailObject+ActiveSync.m +M NEWS + +commit 7f92aca0bd1ffc91767755f1a10621205f428cda +Author: Ludovic Marcotte +Date: Wed Oct 14 09:27:34 2015 -0400 + + (fix) handle references correctly over EAS (#3365) + +M ActiveSync/SOGoMailObject+ActiveSync.m +M NEWS + +commit 8d85ca13df1e9d0e127e44c86b75f7248c159d16 +Author: Ludovic Marcotte +Date: Wed Oct 14 09:21:32 2015 -0400 + + (fix) numerous EAS fixes when connections are dropped before the EAS client receives the response (#3058, #2849) + +M ActiveSync/SOGoActiveSyncDispatcher+Sync.m +M ActiveSync/SOGoActiveSyncDispatcher.h +M ActiveSync/SOGoActiveSyncDispatcher.m +M ActiveSync/SOGoSyncCacheObject.h +M ActiveSync/SOGoSyncCacheObject.m +M NEWS +M SoObjects/Mailer/SOGoMailFolder.m +M SoObjects/SOGo/SOGoCacheGCSObject.h +M SoObjects/SOGo/SOGoCacheGCSObject.m + +commit c55eab640411a08d118130913313c91b87ca938e +Author: Xavy Bahillo +Date: Thu Oct 1 18:16:59 2015 +0200 + + Changed Spanish string for view all (events/tasks) + + As current string was referring only to events + +M UI/Scheduler/SpanishSpain.lproj/Localizable.strings + +commit eebf878e896bd7b1395e4b2bdcb7a93d320c80ca +Author: Enrique J. Hernández Blasco +Date: Wed Sep 30 11:35:12 2015 +0200 + + Ignore recurrence-id vevents without dtstart and outside date range + + Happened in an imported vevent from Mozilla Thunderbird. + + The crash was: + + Sep 14 15:49:38 sogod [21063]: <0x6442DBF8[SOGoAppointmentFolder]:personal> missing 'c_startdate' in record? + Sep 14 15:49:38 sogod [21063]: <0x6442DBF8[SOGoAppointmentFolder]:personal> missing 'c_enddate' in record? + 2015-09-14 15:49:38.927 sogod[21063] NGCalendarDateRange.m:37 Assertion failed in NGCalendarDateRange(instance), method initWithStartDate:endDate:. startDate MUST NOT be nil! + EXCEPTION: NAME:NSInternalInconsistencyException REASON:NGCalendarDateRange.m:37 Assertion failed in NGCalendarDateRange(instance), method initWithStartDate:endDate:. startDate MUST NOT be nil! INFO:(null) + + The relevant ICS file lines are the following ones: + + BEGIN:VEVENT + UID:040000008200E00074C5B7101A82E00800000000901646A7234BCE01000000000000000010000000E9152C8FF1C27D488C91967FAAFCC2B0 + RECURRENCE-ID:20140513T100000Z + DURATION:PT1H + CLASS:PUBLIC + ATTENDEE;PARTSTAT=NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE;CN=krsny >> + Ann Thierry K:mailto:krsny@example.com + END:VEVENT + +M SoObjects/Appointments/SOGoAppointmentFolder.m + +commit c01b21e402af6d7f4bee720d68a89a5d22c397be +Author: Javier Amor García +Date: Sun Sep 27 12:32:17 2015 +0200 + + oc-mail: Fixed false positive in [MAPIStoreAttachment hasContentId] + + This method does not longer returns true if the content id + was a empty string. + In some case the old false positive triggered the removal of + attachments when sending messages. + +M OpenChange/MAPIStoreMailVolatileMessage.m + +commit c8c7aaa45975ac18d4e6139df7300d3956c5b998 +Author: Ludovic Marcotte +Date: Fri Sep 25 15:21:06 2015 -0400 + + (feat) GUI code to set or now sync flag on address book. + + Also thrashed entirely the sync tag concept. Funambol is dead, thank god for that. + +M NEWS +M UI/Contacts/UIxContactFolderProperties.m +M UI/Contacts/product.plist +M UI/Scheduler/UIxCalendarProperties.h +M UI/Scheduler/UIxCalendarProperties.m +M UI/Templates/ContactsUI/UIxContactFolderProperties.wox +M UI/Templates/SchedulerUI/UIxCalendarProperties.wox +M UI/WebServerResources/UIxCalendarProperties.js +M UI/WebServerResources/UIxContactFolderProperties.js + +commit 5409cb292789f6ff01a469dcc73f1ba63ee97953 +Author: Ludovic Marcotte +Date: Fri Sep 25 15:18:22 2015 -0400 + + (feat) moved FolderSynchronize code to GCS + +M SoObjects/Appointments/SOGoAppointmentFolder.h +M SoObjects/Appointments/SOGoAppointmentFolder.m +M SoObjects/SOGo/SOGoGCSFolder.h +M SoObjects/SOGo/SOGoGCSFolder.m + +commit b32951384568dc705d16cde4be910a886cb58b49 +Author: Juan Vallés +Date: Fri Sep 25 12:14:32 2015 +0200 + + Store c_content in sogo_cache_folder as a BLOB + + This reduces considerably the query time for that column, which can be + rather large. + +M SoObjects/SOGo/GCSSpecialQueries+SOGoCacheObject.m +M SoObjects/SOGo/SOGoCacheGCSObject.m + +commit 0ca6e7c6d32b37fac3c4a692c5c3abd6cdf80b16 +Author: Jesús García Sáez +Date: Thu Sep 24 18:56:07 2015 +0200 + + Fix freebusy for multidomain environments + + When returning contacts we have to supply also the domain field. + Because in a multidomain environment UIDField is unique only in + the domain so an user must be identified as uid@domain. + + So when creating http requests from client side, we have to use + uid@domain instead of only uid so the SOGoUser created on server + side when parsing the requests is created properly. + +M SoObjects/Contacts/SOGoContactSourceFolder.m +M UI/WebServerResources/UIxAttendeesEditor.js + +commit 8a3adeadd2be77606cf48c4ee3ff7c75e9e69854 +Author: Francis Lachapelle +Date: Mon Sep 21 20:37:50 2015 -0400 + + Rename Slovenian template + + Closes #104 + +A UI/Templates/SOGoACLSlovenianModificationAdvisory.wox +D UI/Templates/SOGoACLSolvenianModificationAdvisory.wox + +commit c8acba8f5a8eb43c6b4a5ff2b648af82bbf8fd59 +Author: Ludovic Marcotte +Date: Thu Sep 10 20:07:42 2015 -0400 + + (fix) safe-guard against not-yet-created calendar of local users + +M SoObjects/Appointments/SOGoAppointmentFolder.m + +commit deca6e383a8a117b3b318d89e5b9c038df968656 +Author: Enrique J. Hernández Blasco +Date: Fri Sep 18 21:45:00 2015 +0200 + + oc: Include 0x683d0040 as another unknown FAI message property + + And returning right type. + + We have sorted the FAI properties by number and set the available + name as a comment to ease the tracking afterwards. + +M OpenChange/MAPIStoreDBMessage.m + +commit f3ac7b83344c9cfce9e21efd3707436e1c356b7d +Author: Enrique J. Hernández Blasco +Date: Fri Sep 18 21:40:01 2015 +0200 + + oc: Return FAI available properties on instance method as well + + The operation RopFastTransferSourceCopyTo calls the available + properties for a message using the instance method. It seems the + preferred method by Outlook to synchronise a FAI message. OpenChange + calls the message to get the available properties, so the instance + method is called. As it is specialised to return the custom hack + FAI properties, we have to call that class method instead of using + generic one available at NSObject (MAPIStoreProperties) class. + + This avoids crashing the Outlook client after we synchronise the + calendar folder after changing the timeframe view (eg from day view + to month view). + +M OpenChange/MAPIStoreDBMessage.m + +commit ad8941ba56487693f152d872ca314c190cea43b6 +Author: Francis Lachapelle +Date: Fri Sep 18 13:48:36 2015 -0400 + + Fix URL escaping unti test + +M Tests/Unit/TestNSString+URLEscaping.m + +commit 2bccfcb725e9269e01df11ef3b2c03eba675fc4c +Author: Ludovic Marcotte +Date: Thu Sep 17 16:28:42 2015 -0400 + + (fix) additional fix for issue #3152 + +M ActiveSync/SOGoActiveSyncDispatcher.m + +commit 4d174b4c6cebf3c3bb8679855f2925f8330827e9 +Author: Ludovic Marcotte +Date: Thu Sep 17 16:02:21 2015 -0400 + + (fix) typo in previous commit + +M ActiveSync/SOGoActiveSyncDispatcher+Sync.m + +commit 3b15a79c0ade39070fc4b7e736dfae5e0504ed2e +Author: Ludovic Marcotte +Date: Thu Sep 17 15:58:38 2015 -0400 + + (fix) memory leak when sync'ing GCS collections + +M ActiveSync/SOGoActiveSyncDispatcher+Sync.m + +commit b4c2857bb54f1603e74608488fa6568332787069 +Author: Ludovic Marcotte +Date: Wed Sep 16 15:18:10 2015 -0400 + + (fix) typo in version number for doc + +M Documentation/docinfo.xml + +commit 6f2eae5d67a0c8fc8a21bc0810baff94a8993cd8 +Author: Ludovic Marcotte +Date: Wed Sep 16 14:37:56 2015 -0400 + + Bump version to 2.3.2 + +M Version + +commit 9a7ea26b800b1ae59be4c5a73d826aa2f6ba9164 +Author: Ludovic Marcotte +Date: Wed Sep 16 13:45:28 2015 -0400 + + Update ChangeLog + +M ChangeLog + commit 38c9a229c0f389b4a1354fd697fa41bd555802e2 Author: Ludovic Marcotte Date: Wed Sep 16 13:44:59 2015 -0400 @@ -89,6 +1304,35 @@ M NEWS M SoObjects/SOGo/SOGoDefaults.plist M UI/PreferencesUI/UIxPreferences.m +commit ba68bd8935227fd98c43f13ede349ff081c5a254 +Author: Juan Vallés +Date: Mon Sep 14 15:40:34 2015 +0200 + + Make folderKey encoding consistent + + The folder names are encoded through the `asCSSIdentifier` and + `stringByEncodingImap4FolderName` functions when we store them as folder + keys. In addition, the prefix "folder" is added to the key. + + The order in which these operations were done when storing the folder + keys (and reverted when retrieving them) wasn't consistent trough the + code. This led to problems such as creating twice a folder with a digit + at the beginning of its name. + + The folder name goes now through the following operations when being + stored as a key (the retrieval reverts these in the reverse order): + + * `stringByEncodingImap4FolderName` + * `asCSSIdentifier` + * Add "folder" prefix + +M OpenChange/MAPIStoreMailContext.m +M SoObjects/Mailer/SOGoMailAccount.m +M SoObjects/Mailer/SOGoMailFolder.m +M UI/MailerUI/UIxMailFolderActions.m +M UI/MailerUI/UIxMailMainFrame.m +M UI/WebServerResources/MailerUI.js + commit 6bccd2eea036114177c59fcfa943f63c067a63d9 Author: Ludovic Marcotte Date: Mon Sep 14 11:06:18 2015 -0400 @@ -106,6 +1350,17 @@ Date: Mon Sep 14 10:55:50 2015 -0400 M NEWS M SOPE/NGCards/iCalTimeZonePeriod.m +commit 734aba5ddbb6094fe4e7429b6d3d0cefe7344985 +Author: Juan Vallés +Date: Mon Sep 14 15:53:07 2015 +0200 + + oc: Fix asCSSIdentifier in openchange_user_cleanup + + The method lacked the check for the initial character, which adds an + underscore at the beginning of the strings that start with a digit. + +M Scripts/openchange_user_cleanup + commit 42f10e19295276cf5e9e017845928d5e5fb64a94 Author: Ludovic Marcotte Date: Thu Sep 10 20:07:42 2015 -0400 diff --git a/Documentation/SOGoInstallationGuide.asciidoc b/Documentation/SOGoInstallationGuide.asciidoc index de828a6d7..6851dad81 100644 --- a/Documentation/SOGoInstallationGuide.asciidoc +++ b/Documentation/SOGoInstallationGuide.asciidoc @@ -170,7 +170,7 @@ supported by SOGo: * Red Hat Enterprise Linux (RHEL) Server 5, 6 and 7 * Community ENTerprise Operating System (CentOS) 5, 6 and 7 * Debian GNU/Linux 6.0 (Squeeze) to 8.0 (Jessie) -* Ubuntu 10.04 (Lucid) to 14.04 (Trusty) +* Ubuntu 12.04 (Precise) to 14.04 (Trusty) Make sure the required components are started automatically at boot time and that they are running before proceeding with the SOGo configuration. diff --git a/Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc b/Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc index 3ad0aef2b..7d767ccfc 100644 --- a/Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc +++ b/Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc @@ -388,7 +388,7 @@ Run the following commands as root:  ---- samba-tool domain provision --realm=example.com \ - --domain=OPENCHANGE \ + --domain=EXAMPLE \ --adminpass='%1OpenChange' \ --server-role='domain controller' diff --git a/Documentation/docinfo.xml b/Documentation/docinfo.xml index 7597faa1c..3faa889fe 100644 --- a/Documentation/docinfo.xml +++ b/Documentation/docinfo.xml @@ -1,7 +1,7 @@ -Version 2.3.2 - September 2015 -for version 2.3.2 -2015-09-16 +Version 2.3.3 - November 2015 +for version 2.3.3 +2015-11-11 Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". diff --git a/Documentation/includes/global-attributes.asciidoc b/Documentation/includes/global-attributes.asciidoc index 41b170e4b..275b05fc0 100644 --- a/Documentation/includes/global-attributes.asciidoc +++ b/Documentation/includes/global-attributes.asciidoc @@ -13,6 +13,6 @@ // TODO have the build system take care of this -:release_version: 2.3.2 +:release_version: 2.3.3 // vim: set syntax=asciidoc tabstop=2 shiftwidth=2 expandtab: diff --git a/Main/SOGo+DAV.m b/Main/SOGo+DAV.m index 256abdba9..994e742e6 100644 --- a/Main/SOGo+DAV.m +++ b/Main/SOGo+DAV.m @@ -267,7 +267,7 @@ NSObject *list; NSObject *valueNode; NSArray *elements; - NSString *property, *match; + NSString *property=nil, *match=nil; list = [searchElement getElementsByTagName: @"prop"]; if ([list length]) diff --git a/NEWS b/NEWS index 25ac09c6f..397c1c391 100644 --- a/NEWS +++ b/NEWS @@ -1,11 +1,60 @@ -2.3.3 (2015-mm-dd) +2.3.4 (YYYY-MM-DD) ------------------ New features + - Enhancements + - limit the maximum width of toolbar buttons + Bug fixes + - JavaScript exception when printing events from calendars with no assigned color (#3203) + +2.3.3a (2015-11-18) +------------------- + +Bug fixes + - expanded mail folders list is not saved (#3386) + - cleanup translations + +2.3.3 (2015-11-11) +------------------ + +New features + - initial S/MIME support for EAS (#3327) + - now possible to choose which folders to sync over EAS + +Enhancements + - we no longer always entirely rewrite messages for Outlook 2013 when using EAS + - support for ghosted elements on contacts over EAS + - added Macedonian (mk_MK) translation - thanks to Miroslav Jovanovic + - added Portuguese (pt) translation - thanks to Eduardo Crispim + +Bug fixes + - numerous EAS fixes when connections are dropped before the EAS client receives the response (#3058, #2849) + - correctly handle the References header over EAS (#3365) + - make sure English is always used when generating Date headers using EAS (#3356) + - don't escape quoted strings during versit generation + - we now return all cards when we receive an empty addressbook-query REPORT + - avoid crash when replying to a mail with no recipients (#3359) + - inline images sent from SOGo webmail are not displayed in Mozilla Thunderbird (#3271) + - prevent postal address showing on single line over EAS (#2614) + - display missing events when printing working hours only + - fix corner case making server crash when syncing hard deleted messages when clear offline items was set up (Zentyal) + - avoid infinite Outlook client loops trying to set read flag when it is already set (Zentyal) + - avoid crashing when calendar metadata is missing in the cache (Zentyal) + - fix recurrence pattern event corner case created by Mozilla Thunderbird which made server crash (Zentyal) + - fix corner case that removes attachments on sending messages from Outlook (Zentyal) + - freebusy on web interface works again in multidomain environments (Zentyal) + - fix double creation of folders in Outlook when the folder name starts with a digit (Zentyal) + - avoid crashing Outlook after setting a custom view in a calendar folder (Zentyal) + - handle emails having an attachment as their content + - fixed JavaScript syntax error in attendees editor + - fixed wrong comparison of meta vs. META tag in HTML mails + - fixed popup menu position when moved to the left (#3381) + - fixed dialog position when at the bottom of the window (#2646, #3378) + - fixed addressbrook-only source entires having a c_uid set 2.3.2 (2015-09-16) ------------------ diff --git a/OpenChange/MAPIStoreAuthenticator.h b/OpenChange/MAPIStoreAuthenticator.h index fc41d25d1..ce88a60be 100644 --- a/OpenChange/MAPIStoreAuthenticator.h +++ b/OpenChange/MAPIStoreAuthenticator.h @@ -46,6 +46,9 @@ forURL: (NSURL *) server forceRenew: (BOOL) renew; +- (NSString *) passwordInContext: (WOContext *) context; + + @end #endif /* MAPISTOREAUTHENTICATOR_H */ diff --git a/OpenChange/MAPIStoreAuthenticator.m b/OpenChange/MAPIStoreAuthenticator.m index c3174a615..41e4ed081 100644 --- a/OpenChange/MAPIStoreAuthenticator.m +++ b/OpenChange/MAPIStoreAuthenticator.m @@ -72,4 +72,8 @@ return imapPassword; } +- (NSString *) passwordInContext: (WOContext *) context +{ + return password; +} @end diff --git a/SOPE/GDLContentStore/GCSChannelManager.m b/SOPE/GDLContentStore/GCSChannelManager.m index d04d70446..360901e97 100644 --- a/SOPE/GDLContentStore/GCSChannelManager.m +++ b/SOPE/GDLContentStore/GCSChannelManager.m @@ -500,7 +500,7 @@ static NSTimeInterval ChannelCollectionTimer = 5 * 60; ms = [NSMutableString stringWithCapacity: 256]; [ms appendFormat: @"<0x%p[%@]: ", self, NSStringFromClass ([self class])]; - [ms appendFormat: @" #adaptors=%d", [urlToAdaptor count]]; + [ms appendFormat: @" #adaptors=%d", (int)[urlToAdaptor count]]; [ms appendString: @">"]; return ms; diff --git a/SOPE/NGCards/CardElement.m b/SOPE/NGCards/CardElement.m index 00d7c7b35..ce410e1bc 100644 --- a/SOPE/NGCards/CardElement.m +++ b/SOPE/NGCards/CardElement.m @@ -414,7 +414,7 @@ if (group) [str appendFormat: @"%@ (group: %@)\n", tag, group]; else - [str appendFormat: @"%@\n", tag, group]; + [str appendFormat: @"%@\n", tag]; [str appendString: [self versitString]]; diff --git a/SOPE/NGCards/CardGroup.m b/SOPE/NGCards/CardGroup.m index b3c21e9d9..301cfb2b8 100644 --- a/SOPE/NGCards/CardGroup.m +++ b/SOPE/NGCards/CardGroup.m @@ -409,7 +409,7 @@ static NGCardsSaxHandler *sax = nil; max = [children count]; if (max > 0) { - [str appendFormat: @"\n %d children: {\n", [children count]]; + [str appendFormat: @"\n %d children: {\n", (int)[children count]]; for (count = 0; count < max; count++) [str appendFormat: @" %@\n", [[children objectAtIndex: count] description]]; diff --git a/SOPE/NGCards/NSCalendarDate+NGCards.m b/SOPE/NGCards/NSCalendarDate+NGCards.m index b34471695..f70a12f42 100644 --- a/SOPE/NGCards/NSCalendarDate+NGCards.m +++ b/SOPE/NGCards/NSCalendarDate+NGCards.m @@ -32,16 +32,16 @@ - (NSString *) iCalFormattedDateTimeString { return [NSString stringWithFormat: @"%.4d%.2d%.2dT%.2d%.2d%.2d", - [self yearOfCommonEra], [self monthOfYear], - [self dayOfMonth], [self hourOfDay], - [self minuteOfHour], [self secondOfMinute]]; + (int)[self yearOfCommonEra], (int)[self monthOfYear], + (int)[self dayOfMonth], (int)[self hourOfDay], + (int)[self minuteOfHour], (int)[self secondOfMinute]]; } - (NSString *) iCalFormattedDateString { return [NSString stringWithFormat: @"%.4d%.2d%.2d", - [self yearOfCommonEra], [self monthOfYear], - [self dayOfMonth]]; + (int)[self yearOfCommonEra], (int)[self monthOfYear], + (int)[self dayOfMonth]]; } @end diff --git a/SOPE/NGCards/NSString+NGCards.m b/SOPE/NGCards/NSString+NGCards.m index 9e851ac2e..02c1c3d0b 100644 --- a/SOPE/NGCards/NSString+NGCards.m +++ b/SOPE/NGCards/NSString+NGCards.m @@ -158,16 +158,31 @@ NSMutableString *string; unsigned int len, i; unichar c; + BOOL isQuoted; len = [self length]; string = [NSMutableString stringWithCapacity: len * 1.5]; + isQuoted = NO; for (i = 0; i < len; i++) { c = [self characterAtIndex: i]; + if (isQuoted) + { + if (c == '"') + isQuoted = NO; + + [string appendFormat: @"%C", c]; + continue; + } + switch (c) { + case '"': + isQuoted = YES; + [string appendFormat: @"%C", c]; + break; case '\\': [string appendString: @"\\\\"]; break; diff --git a/SOPE/NGCards/iCalMonthlyRecurrenceCalculator.m b/SOPE/NGCards/iCalMonthlyRecurrenceCalculator.m index 3b6577ee8..0694cc6c2 100644 --- a/SOPE/NGCards/iCalMonthlyRecurrenceCalculator.m +++ b/SOPE/NGCards/iCalMonthlyRecurrenceCalculator.m @@ -348,7 +348,7 @@ static inline unsigned iCalDoWForNSDoW (int dow) if ([byDayMask occursOnDay: currentWeekDay]) { if ([bySetPos containsObject: - [NSString stringWithFormat: @"%d", currentPos]]) + [NSString stringWithFormat: @"%d", (int)currentPos]]) monthDays[monthDay+1] = YES; currentPos++; } @@ -362,7 +362,7 @@ static inline unsigned iCalDoWForNSDoW (int dow) if ([byDayMask occursOnDay: currentWeekDay]) { if ([bySetPos containsObject: - [NSString stringWithFormat: @"%d", currentPos]]) + [NSString stringWithFormat: @"%d", (int)currentPos]]) monthDays[monthDay] = YES; currentPos--; } diff --git a/SOPE/NGCards/iCalPerson.m b/SOPE/NGCards/iCalPerson.m index fbcc92570..f5b908a50 100644 --- a/SOPE/NGCards/iCalPerson.m +++ b/SOPE/NGCards/iCalPerson.m @@ -256,7 +256,7 @@ - (BOOL)isEqual:(id)_other { if(_other == nil) return NO; - if([_other class] != self->isa) + if([_other class] != object_getClass(self)) return NO; if([_other hash] != [self hash]) return NO; diff --git a/SOPE/NGCards/iCalRecurrenceRule.m b/SOPE/NGCards/iCalRecurrenceRule.m index 5e99429e7..dc9ed28fa 100644 --- a/SOPE/NGCards/iCalRecurrenceRule.m +++ b/SOPE/NGCards/iCalRecurrenceRule.m @@ -309,10 +309,10 @@ NSString *iCalWeekDayString[] = { @"SU", @"MO", @"TU", @"WE", @"TH", @"FR", else if ([frequency isEqualToString:@"SECONDLY"]) freq = iCalRecurrenceFrequenceSecondly; else - freq = NSNotFound; + freq = (iCalRecurrenceFrequency)NSNotFound; } else - freq = NSNotFound; + freq = (iCalRecurrenceFrequency)NSNotFound; return freq; } diff --git a/SOPE/NGCards/versitCardsSaxDriver/VSSaxDriver.m b/SOPE/NGCards/versitCardsSaxDriver/VSSaxDriver.m index d9b906c8e..0e56a2d51 100644 --- a/SOPE/NGCards/versitCardsSaxDriver/VSSaxDriver.m +++ b/SOPE/NGCards/versitCardsSaxDriver/VSSaxDriver.m @@ -1045,7 +1045,7 @@ static NSCharacterSet *whitespaceCharSet = nil; if (debugOn) { NSLog(@"%s: trying to decode data (0x%p,len=%d) ...", - __PRETTY_FUNCTION__, _data, [_data length]); + __PRETTY_FUNCTION__, _data, (int)[_data length]); } if ((len = [_data length]) == 0) @@ -1164,7 +1164,7 @@ static NSCharacterSet *whitespaceCharSet = nil; if (debugOn) { NSLog(@"%s: trying to parse string (0x%p,len=%d) ...", - __PRETTY_FUNCTION__, _source, [_source length]); + __PRETTY_FUNCTION__, _source, (int)[_source length]); } if (!_sysId) _sysId = @""; [self _parseString: _source]; diff --git a/Scripts/sql-update-1.3.11_to_1.3.12-mysql.sh b/Scripts/sql-update-1.3.11_to_1.3.12-mysql.sh old mode 100644 new mode 100755 diff --git a/Scripts/sql-update-1.3.16_to_1.3.17-mysql.sh b/Scripts/sql-update-1.3.16_to_1.3.17-mysql.sh old mode 100644 new mode 100755 diff --git a/Scripts/sql-update-1.3.3_to_1.3.4-mysql.sh b/Scripts/sql-update-1.3.3_to_1.3.4-mysql.sh old mode 100644 new mode 100755 diff --git a/Scripts/sql-update-1.3.3_to_1.3.4.sh b/Scripts/sql-update-1.3.3_to_1.3.4.sh old mode 100644 new mode 100755 diff --git a/Scripts/sql-update-20080303.sh b/Scripts/sql-update-20080303.sh old mode 100644 new mode 100755 diff --git a/SoObjects/Appointments/GNUmakefile b/SoObjects/Appointments/GNUmakefile index 257104e14..78e6b7889 100644 --- a/SoObjects/Appointments/GNUmakefile +++ b/SoObjects/Appointments/GNUmakefile @@ -54,7 +54,7 @@ Appointments_RESOURCE_FILES += \ MSExchangeFreeBusySOAPResponseMap.plist \ MSExchangeFreeBusySOAPRequest.wo -Appointments_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan ChineseTaiwan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak Slovenian SpanishSpain SpanishArgentina Swedish Ukrainian Welsh +Appointments_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan ChineseTaiwan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian Macedonian NorwegianBokmal NorwegianNynorsk Polish Portuguese Russian Slovak Slovenian SpanishSpain SpanishArgentina Swedish Ukrainian Welsh Appointments_LOCALIZED_RESOURCE_FILES = Localizable.strings diff --git a/SoObjects/Appointments/MSExchangeFreeBusy.m b/SoObjects/Appointments/MSExchangeFreeBusy.m index 57ae29e5d..de55e534f 100644 --- a/SoObjects/Appointments/MSExchangeFreeBusy.m +++ b/SoObjects/Appointments/MSExchangeFreeBusy.m @@ -344,7 +344,7 @@ size_t curl_body_function_freebusy(void *ptr, size_t size, size_t nmemb, void *i NSMutableString *s; s = [NSMutableString stringWithCapacity: 64]; - [s appendFormat:@"<0x%08X[%@]:", self, NSStringFromClass([self class])]; + [s appendFormat:@"<0x%08X[%@]:", (unsigned int)self, NSStringFromClass([self class])]; if (freeBusyViewType) [s appendFormat:@" freeBusyViewType='%@'", freeBusyViewType]; if (mergedFreeBusy) diff --git a/SoObjects/Appointments/Macedonian.lproj/Localizable.strings b/SoObjects/Appointments/Macedonian.lproj/Localizable.strings new file mode 100644 index 000000000..9ecb8973f --- /dev/null +++ b/SoObjects/Appointments/Macedonian.lproj/Localizable.strings @@ -0,0 +1,67 @@ +"Inviting the following persons is prohibited:" = "Канењето на Ñледните лица е забрането:"; +"Personal Calendar" = "Личен календар"; +vevent_class0 = "(Јавен наÑтан)"; +vevent_class1 = "(Приватен наÑтан)"; +vevent_class2 = "(Доверлив наÑтан)"; + +vtodo_class0 = "(Јавна задача)"; +vtodo_class1 = "(Приватна задача)"; +vtodo_class2 = "(Доверлива задача)"; + +/* Receipts */ +"The event \"%{Summary}\" was created" = "ÐаÑтанот \"%{Summary}\" беше креиран"; +"The event \"%{Summary}\" was deleted" = "ÐаÑтанот \"%{Summary}\" беше избришан"; +"The event \"%{Summary}\" was updated" = "ÐаÑтанот \"%{Summary}\" беше оÑвежен"; +"The following attendees(s) were notified:" = "Следниот учеÑник(ци) Ñе извеÑтени:"; +"The following attendees(s) were added:" = "Следните учеÑници беа додадени:"; +"The following attendees(s) were removed:" = "Следните учеÑници беа отÑтранети:"; + +/* IMIP messages */ +"calendar_label" = "Календар:"; +"startDate_label" = "Почеток:"; +"endDate_label" = "Крај:"; +"due_label" = "Краен датум:"; +"location_label" = "Локација:"; +"summary_label" = "Резиме:"; +"comment_label" = "Коментар:"; + +/* Invitation */ +"Event Invitation: \"%{Summary}\"" = "Покана за наÑтанот: \"%{Summary}\""; +"(sent by %{SentBy}) " = "(иÑпратено од %{SentBy}) "; +"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}" = "%{Organizer} %{SentByText}ве покани на %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}"; +"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" = "%{Organizer} %{SentByText}ве покани на %{Summary}.\n\nПочеток: %{StartDate} во %{StartTime}\nКрај: %{EndDate} во %{EndTime}\nОпиÑ: %{Description}"; + +/* Deletion */ +"Event Cancelled: \"%{Summary}\"" = "ÐаÑтанот е откажан: \"%{Summary}\""; +"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}" += "%{Organizer} %{SentByText}ја откажа поканата: %{Summary}.\n\nПочеток: %{StartDate}\nКрај: %{EndDate}\nОпиÑ: %{Description}"; +"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" += "%{Organizer} %{SentByText}го откажа наÑтанот: %{Summary}.\n\nПочеток: %{StartDate} во %{StartTime}\nКрај: %{EndDate} во %{EndTime}\nОпиÑ: %{Description}"; + +/* Update */ +"The appointment \"%{Summary}\" for the %{OldStartDate} has changed" += "СоÑтанокот \"%{Summary}\" за %{OldStartDate} е променет"; +"The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed" += "СоÑтанокот \"%{Summary}\" за %{OldStartDate} на %{OldStartTime} Ñе промени"; +"The following parameters have changed in the \"%{Summary}\" meeting:" += "Следните параметри Ñе променија во \"%{Summary}\" ÑоÑтанок:"; +"Please accept or decline those changes." += "Прифатете ги ли отфрлете ги измените."; + +/* Reply */ +"Accepted invitation: \"%{Summary}\"" = "Прифатена покана: \"%{Summary}\""; +"Declined invitation: \"%{Summary}\"" = "Одбиена покана: \"%{Summary}\""; +"Delegated invitation: \"%{Summary}\"" = "Делегирана покана: \"%{Summary}\""; +"Not yet decided on invitation: \"%{Summary}\"" = "Уште не одлучиле по поканата: \"%{Summary}\""; +"%{Attendee} %{SentByText}has accepted your event invitation." += "%{Attendee} %{SentByText}ја прифати вашата покана."; +"%{Attendee} %{SentByText}has declined your event invitation." += "%{Attendee} %{SentByText}ја одби вашаа покана."; +"%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}." += "%{Attendee} %{SentByText}ја делегираше поканата на %{Delegate}."; +"%{Attendee} %{SentByText}has not yet decided upon your event invitation." += "%{Attendee} %{SentByText}уште нема одлучено по вашата покана."; + +/* Resources */ +"Cannot access resource: \"%{Cn} %{SystemEmail}\"" = "Ðе можам да ги приÑтапам реÑурÑите: \"%{Cn} %{SystemEmail}\""; +"Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\". The conflicting event is \"%{EventTitle}\", and starts on %{StartDate}." = "МакÑималниот број на едновремени закажувања (%{NumberOfSimultaneousBookings}) е поÑтигнат за реÑурÑот \"%{Cn} %{SystemEmail}\". Конфликтниот наÑтан е \"%{EventTitle}\", и почнува на %{StartDate}."; diff --git a/SoObjects/Appointments/Portuguese.lproj/Localizable.strings b/SoObjects/Appointments/Portuguese.lproj/Localizable.strings new file mode 100644 index 000000000..b96a84cab --- /dev/null +++ b/SoObjects/Appointments/Portuguese.lproj/Localizable.strings @@ -0,0 +1,67 @@ +"Inviting the following persons is prohibited:" = "Convidando as seguintes pessoas é proibido:"; +"Personal Calendar" = "Calendário Pessoal"; +vevent_class0 = "(Evento Público)"; +vevent_class1 = "(Evento Privado)"; +vevent_class2 = "(Evento Confidencial)"; + +vtodo_class0 = "(Tarefa Pública)"; +vtodo_class1 = "(Tarefa Privada)"; +vtodo_class2 = "(Tarefa Confidencial)"; + +/* Receipts */ +"The event \"%{Summary}\" was created" = "O evento \"%{Summary}\" foi criado"; +"The event \"%{Summary}\" was deleted" = "O evento \"%{Summary}\" foi removido"; +"The event \"%{Summary}\" was updated" = "O evento \"%{Summary}\" foi atualizado"; +"The following attendees(s) were notified:" = "Os seguintes participantes foram notificados:"; +"The following attendees(s) were added:" = "Os seguintes participantes foram adicionados:"; +"The following attendees(s) were removed:" = "Os seguintes participantes foram removidos:"; + +/* IMIP messages */ +"calendar_label" = "Calendário:"; +"startDate_label" = "Início:"; +"endDate_label" = "Fim:"; +"due_label" = "Data de Vencimento:"; +"location_label" = "Local:"; +"summary_label" = "Resumo:"; +"comment_label" = "Comentário:"; + +/* Invitation */ +"Event Invitation: \"%{Summary}\"" = "Convite do Evento: \"%{Summary}\""; +"(sent by %{SentBy}) " = "(enviado por %{SentBy}) "; +"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}" = "%{Organizer} %{SentByText}convidou-o para %{Summary}.\n\nInicio: %{StartDate}\nFim: %{EndDate}\nDescrição: %{Description}"; +"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" = "%{Organizer} %{SentByText} convidou-o para %{Summary}.\n\nInício: %{StartDate} as %{StartTime}\nFim: %{EndDate} as %{EndTime}\nDescrição: %{Description}"; + +/* Deletion */ +"Event Cancelled: \"%{Summary}\"" = "Evento Cancelado: \"%{Summary}\""; +"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}" += "%{Organizer} %{SentByText}cancelou este evento: %{Summary}.\n\nInicio: %{StartDate}\nFim: %{EndDate}\nDescrição: %{Description}"; +"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" += "%{Organizer} %{SentByText} cancelou este evento: %{Summary}.\n\nInício: %{StartDate} às %{StartTime}\nFim: %{EndDate} as %{EndTime}\nDescrição: %{Description}"; + +/* Update */ +"The appointment \"%{Summary}\" for the %{OldStartDate} has changed" += "O compromisso \"%{Summary}\" de %{OldStartDate} mudou"; +"The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed" += "O Compromisso \"%{Summary}\" de %{OldStartDate} as %{OldStartTime} mudou"; +"The following parameters have changed in the \"%{Summary}\" meeting:" += "Os seguintes parâmetros mudaram na reunião \"%{Summary}\" :\n\n"; +"Please accept or decline those changes." += "Por favor, aceitar ou recusar as alterações."; + +/* Reply */ +"Accepted invitation: \"%{Summary}\"" = "Convite aceite: \"%{Summary}\""; +"Declined invitation: \"%{Summary}\"" = "Convite recusado: \"%{Summary}\""; +"Delegated invitation: \"%{Summary}\"" = "Convite delegado: \"%{Summary}\""; +"Not yet decided on invitation: \"%{Summary}\"" = "Convite ainda não decidido: \"%{Summary}\""; +"%{Attendee} %{SentByText}has accepted your event invitation." += "%{Attendee} %{SentByText} aceitou seu convite ao evento."; +"%{Attendee} %{SentByText}has declined your event invitation." += "%{Attendee} %{SentByText} rejeitou seu convite ao evento."; +"%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}." += "%{Attendee} %{SentByText} delegou o convite para %{Delegate}."; +"%{Attendee} %{SentByText}has not yet decided upon your event invitation." += "%{Attendee} %{SentByText} ainda não decidiu seu convite ao evento."; + +/* Resources */ +"Cannot access resource: \"%{Cn} %{SystemEmail}\"" = "Não foi possível aceder ao recurso: \"%{Cn} %{SystemEmail}\""; +"Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\". The conflicting event is \"%{EventTitle}\", and starts on %{StartDate}." = "O número máximo de reservas simultâneas (%{NumberOfSimultaneousBookings}) acabou para o recurso \"%{Cn} %{SystemEmail}\". O evento em conflito é \"%{EventTitle}\", e inicia em %{StartDate}."; diff --git a/SoObjects/Appointments/SOGoAppointmentFolder.h b/SoObjects/Appointments/SOGoAppointmentFolder.h index 7139b53ea..2ec2c6bb2 100644 --- a/SoObjects/Appointments/SOGoAppointmentFolder.h +++ b/SoObjects/Appointments/SOGoAppointmentFolder.h @@ -157,9 +157,6 @@ typedef enum { - (BOOL) showCalendarTasks; - (void) setShowCalendarTasks: (BOOL) new; -- (NSString *) syncTag; -- (void) setSyncTag: (NSString *) newSyncTag; - - (BOOL) includeInFreeBusy; - (void) setIncludeInFreeBusy: (BOOL) newInclude; diff --git a/SoObjects/Appointments/SOGoAppointmentFolder.m b/SoObjects/Appointments/SOGoAppointmentFolder.m index cff8d8c03..b9c12e32d 100644 --- a/SoObjects/Appointments/SOGoAppointmentFolder.m +++ b/SoObjects/Appointments/SOGoAppointmentFolder.m @@ -84,6 +84,7 @@ #import "SOGoAppointmentFolders.h" #import "SOGoFreeBusyObject.h" #import "SOGoTaskObject.h" +#import "SOGoWebAppointmentFolder.h" #import "SOGoAppointmentFolder.h" @@ -2345,7 +2346,7 @@ firstInstanceCalendarDateRange: (NGCalendarDateRange *) fir request = [context request]; if (!([request isIPhone] || [request isICal4])) { - gdRT = [self groupDavResourceType]; + gdRT = (NSArray *)[self groupDavResourceType]; gdVEventCol = [NSArray arrayWithObjects: [gdRT objectAtIndex: 0], XMLNS_GROUPDAV, nil]; [colType addObject: gdVEventCol]; diff --git a/SoObjects/Appointments/SOGoAppointmentObject.m b/SoObjects/Appointments/SOGoAppointmentObject.m index 158a53f6b..13256f57d 100644 --- a/SoObjects/Appointments/SOGoAppointmentObject.m +++ b/SoObjects/Appointments/SOGoAppointmentObject.m @@ -45,6 +45,7 @@ #import #import #import +#import #import #import @@ -747,11 +748,14 @@ inRecurrenceExceptionsForEvent: (iCalEvent *) theEvent { e = [events objectAtIndex: i]; if ([e recurrenceId]) - for (j = 0; j < [theAttendees count]; j++) - if (shouldAdd) + for (j = 0; j < [theAttendees count]; j++) { + if (shouldAdd) { [e addToAttendees: [theAttendees objectAtIndex: j]]; - else + } + else { [e removeFromAttendees: [theAttendees objectAtIndex: j]]; + } + } } } @@ -1037,7 +1041,7 @@ inRecurrenceExceptionsForEvent: (iCalEvent *) theEvent if ([delegateEmail length]) otherDelegate = [event findAttendeeWithEmail: delegateEmail]; else - otherDelegate = NO; + otherDelegate = nil; /* we handle the addition/deletion of delegate users */ addDelegate = NO; @@ -1075,7 +1079,7 @@ inRecurrenceExceptionsForEvent: (iCalEvent *) theEvent if ([delegateEmail length]) otherDelegate = [event findAttendeeWithEmail: delegateEmail]; else - otherDelegate = NO; + otherDelegate = nil; } } if (addDelegate) @@ -1232,7 +1236,7 @@ inRecurrenceExceptionsForEvent: (iCalEvent *) theEvent if ([delegateEmail length]) otherDelegate = [event findAttendeeWithEmail: delegateEmail]; else - otherDelegate = NO; + otherDelegate = nil; } [self sendEMailUsingTemplateNamed: @"Deletion" @@ -1990,7 +1994,7 @@ inRecurrenceExceptionsForEvent: (iCalEvent *) theEvent if ([container resourceNameForEventUID: eventUID]) { return [NSException exceptionWithHTTPStatus: 403 - reason: [NSString stringWithFormat: @"Event UID already in use. (%s)", eventUID]]; + reason: [NSString stringWithFormat: @"Event UID already in use. (%@)", eventUID]]; } // diff --git a/SoObjects/Appointments/SOGoCalendarComponent.m b/SoObjects/Appointments/SOGoCalendarComponent.m index ce600715b..762139774 100644 --- a/SoObjects/Appointments/SOGoCalendarComponent.m +++ b/SoObjects/Appointments/SOGoCalendarComponent.m @@ -140,6 +140,14 @@ return aclManager; } +- (NSException *) changeParticipationStatus: (NSString *) newPartStat + withDelegate: (iCalPerson *) delegate + alarm: (iCalAlarm *) alarm +{ + // Required for protocol + return nil; +} + - (id) init { if ((self = [super init])) @@ -171,7 +179,7 @@ - (Class *) parsingClass { - return [iCalCalendar class]; + return (Class *)[iCalCalendar class]; } - (NSString *) davContentType diff --git a/SoObjects/Appointments/iCalAlarm+SOGo.m b/SoObjects/Appointments/iCalAlarm+SOGo.m index cb1cc57c0..4f98fc5eb 100644 --- a/SoObjects/Appointments/iCalAlarm+SOGo.m +++ b/SoObjects/Appointments/iCalAlarm+SOGo.m @@ -102,9 +102,9 @@ } if ([reminderReference caseInsensitiveCompare: @"BEFORE"] == NSOrderedSame) - aValue = [NSString stringWithString: @"-P"]; + aValue = (NSString *) @"-P"; else - aValue = [NSString stringWithString: @"P"]; + aValue = (NSString *) @"P"; if ([reminderUnit caseInsensitiveCompare: @"MINUTES"] == NSOrderedSame || [reminderUnit caseInsensitiveCompare: @"HOURS"] == NSOrderedSame) diff --git a/SoObjects/Appointments/iCalEvent+SOGo.h b/SoObjects/Appointments/iCalEvent+SOGo.h index d04d89427..fa14ba55c 100644 --- a/SoObjects/Appointments/iCalEvent+SOGo.h +++ b/SoObjects/Appointments/iCalEvent+SOGo.h @@ -28,7 +28,7 @@ @interface iCalEvent (SOGoExtensions) - (BOOL) isStillRelevant; -- (unsigned int) occurenceInterval; +- (NSTimeInterval) occurenceInterval; - (void) updateRecurrenceRulesUntilDate: (NSCalendarDate *) previousEndDate; @end diff --git a/SoObjects/Appointments/iCalEvent+SOGo.m b/SoObjects/Appointments/iCalEvent+SOGo.m index a19dcf3cd..7948f7c23 100644 --- a/SoObjects/Appointments/iCalEvent+SOGo.m +++ b/SoObjects/Appointments/iCalEvent+SOGo.m @@ -259,7 +259,7 @@ - (NSTimeInterval) occurenceInterval { - return [[self endDate] timeIntervalSinceDate: [self startDate]]; + return (NSTimeInterval)[[self endDate] timeIntervalSinceDate: [self startDate]]; } /** diff --git a/SoObjects/Appointments/iCalRepeatableEntityObject+SOGo.m b/SoObjects/Appointments/iCalRepeatableEntityObject+SOGo.m index c9f66a6b1..f5540c466 100644 --- a/SoObjects/Appointments/iCalRepeatableEntityObject+SOGo.m +++ b/SoObjects/Appointments/iCalRepeatableEntityObject+SOGo.m @@ -36,6 +36,7 @@ #import #import "iCalRepeatableEntityObject+SOGo.h" +#import "iCalCalendar+SOGo.h" @implementation iCalRepeatableEntityObject (SOGoExtensions) diff --git a/SoObjects/Contacts/GNUmakefile b/SoObjects/Contacts/GNUmakefile index 510c38c1f..f888d3451 100644 --- a/SoObjects/Contacts/GNUmakefile +++ b/SoObjects/Contacts/GNUmakefile @@ -27,7 +27,7 @@ Contacts_OBJC_FILES = \ Contacts_RESOURCE_FILES += \ product.plist \ -Contacts_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan ChineseTaiwan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak Slovenian SpanishSpain SpanishArgentina Swedish Ukrainian Welsh +Contacts_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan ChineseTaiwan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian Macedonian NorwegianBokmal NorwegianNynorsk Polish Portuguese Russian Slovak Slovenian SpanishSpain SpanishArgentina Swedish Ukrainian Welsh Contacts_LOCALIZED_RESOURCE_FILES = Localizable.strings diff --git a/SoObjects/Contacts/Macedonian.lproj/Localizable.strings b/SoObjects/Contacts/Macedonian.lproj/Localizable.strings new file mode 100644 index 000000000..843e12432 --- /dev/null +++ b/SoObjects/Contacts/Macedonian.lproj/Localizable.strings @@ -0,0 +1,2 @@ +"Personal Address Book" = "Лична адреÑна книга"; +"Collected Address Book" = "Собрана адреÑна книга"; diff --git a/SoObjects/Contacts/NGVCard+SOGo.m b/SoObjects/Contacts/NGVCard+SOGo.m index 83e646c06..6a0a6cf5d 100644 --- a/SoObjects/Contacts/NGVCard+SOGo.m +++ b/SoObjects/Contacts/NGVCard+SOGo.m @@ -297,7 +297,7 @@ convention: if (year && month && day) [self setBday: [NSString stringWithFormat: @"%.4d-%.2d-%.2d", - year, month, day]]; + (int)year, (int)month, (int)day]]; else [self setBday: @""]; @@ -614,11 +614,11 @@ convention: birthDay = [[self bday] asCalendarDate]; if (birthDay) { - stringValue = [NSString stringWithFormat: @"%.4d", [birthDay yearOfCommonEra]]; + stringValue = [NSString stringWithFormat: @"%.4d", (int)[birthDay yearOfCommonEra]]; [self _setValue: @"birthyear" to: stringValue inLDIFRecord: ldifRecord]; - stringValue = [NSString stringWithFormat: @"%.2d", [birthDay monthOfYear]]; + stringValue = [NSString stringWithFormat: @"%.2d", (int)[birthDay monthOfYear]]; [self _setValue: @"birthmonth" to: stringValue inLDIFRecord: ldifRecord]; - stringValue = [NSString stringWithFormat: @"%.2d", [birthDay dayOfMonth]]; + stringValue = [NSString stringWithFormat: @"%.2d", (int)[birthDay dayOfMonth]]; [self _setValue: @"birthday" to: stringValue inLDIFRecord: ldifRecord]; } [self _setValue: @"description" to: [self note] inLDIFRecord: ldifRecord]; diff --git a/SoObjects/Contacts/Portuguese.lproj/Localizable.strings b/SoObjects/Contacts/Portuguese.lproj/Localizable.strings new file mode 100644 index 000000000..9f9c1e535 --- /dev/null +++ b/SoObjects/Contacts/Portuguese.lproj/Localizable.strings @@ -0,0 +1,2 @@ +"Personal Address Book" = "Livro de Endereços Pessoais"; +"Collected Address Book" = "Catálogos Coleccionados"; diff --git a/SoObjects/Contacts/SOGoContactEntryPhoto.m b/SoObjects/Contacts/SOGoContactEntryPhoto.m index 0cbf83cf6..6ae248e08 100644 --- a/SoObjects/Contacts/SOGoContactEntryPhoto.m +++ b/SoObjects/Contacts/SOGoContactEntryPhoto.m @@ -59,7 +59,7 @@ [response setHeader: [self davContentType] forKey: @"content-type"]; [response setHeader: [NSString stringWithFormat:@" %d", - [data length]] + (int)[data length]] forKey: @"content-length"]; [response setContent: data]; } diff --git a/SoObjects/Contacts/SOGoContactFolders.m b/SoObjects/Contacts/SOGoContactFolders.m index b0428f7f4..e7984b172 100644 --- a/SoObjects/Contacts/SOGoContactFolders.m +++ b/SoObjects/Contacts/SOGoContactFolders.m @@ -268,9 +268,9 @@ Class SOGoContactSourceFolderK; SOGoUser *currentUser; id source; - if ([sourceID isEqualToString: @"personal"]) - result = [NSException exceptionWithHTTPStatus: 403 - reason: (@"folder '%@' cannot be deleted", sourceID)]; + if ([sourceID isEqualToString: @"personal"]){ + result = [NSException exceptionWithHTTPStatus: 403 reason: [NSString stringWithFormat: (@"folder '%@' cannot be deleted"), sourceID]]; + } else { result = nil; diff --git a/SoObjects/Contacts/SOGoContactGCSEntry.m b/SoObjects/Contacts/SOGoContactGCSEntry.m index 4b5d5bd21..dfaa66426 100644 --- a/SoObjects/Contacts/SOGoContactGCSEntry.m +++ b/SoObjects/Contacts/SOGoContactGCSEntry.m @@ -50,7 +50,7 @@ - (Class *) parsingClass { - return [NGVCard class]; + return (Class *)[NGVCard class]; } /* content */ diff --git a/SoObjects/Contacts/SOGoContactGCSList.m b/SoObjects/Contacts/SOGoContactGCSList.m index 61e68bf85..ad1b3277b 100644 --- a/SoObjects/Contacts/SOGoContactGCSList.m +++ b/SoObjects/Contacts/SOGoContactGCSList.m @@ -45,7 +45,7 @@ - (Class *) parsingClass { - return [NGVList class]; + return (Class *)[NGVList class]; } diff --git a/SoObjects/Contacts/SOGoContactSourceFolder.m b/SoObjects/Contacts/SOGoContactSourceFolder.m index 5f9acea4b..b92b953a1 100644 --- a/SoObjects/Contacts/SOGoContactSourceFolder.m +++ b/SoObjects/Contacts/SOGoContactSourceFolder.m @@ -47,6 +47,7 @@ #import #import #import +#import #import #import #import @@ -95,7 +96,7 @@ { if (![newDisplayName length]) newDisplayName = newName; - ASSIGN (displayName, newDisplayName); + ASSIGN (displayName, (NSMutableString *)newDisplayName); } return self; @@ -225,8 +226,16 @@ NSObject *recordSource; newRecord = [NSMutableDictionary dictionaryWithCapacity: 8]; - [newRecord setObject: [oldRecord objectForKey: @"c_uid"] - forKey: @"c_uid"]; + + // We set the c_uid only for authentication sources. SOGoUserSources set + // with canAuthenticate = NO and isAddressBook = YES have absolutely *NO REASON* + // to have entries with a c_uid. These can collide with real uids. + if ([[[[SOGoUserManager sharedUserManager] metadataForSourceID: [source sourceID]] objectForKey: @"canAuthenticate"] boolValue]) + { + [newRecord setObject: [oldRecord objectForKey: @"c_uid"] + forKey: @"c_uid"]; + } + [newRecord setObject: [oldRecord objectForKey: @"c_name"] forKey: @"c_name"]; @@ -665,7 +674,7 @@ BOOL otherIsPersonal; otherIsPersonal = ([otherFolder isKindOfClass: [SOGoContactGCSFolder class]] - || ([otherFolder isKindOfClass: isa] && [otherFolder isPersonalSource])); + || ([otherFolder isKindOfClass: object_getClass(self)] && [otherFolder isPersonalSource])); if (isPersonalSource) { diff --git a/SoObjects/Contacts/SOGoFolder+CardDAV.h b/SoObjects/Contacts/SOGoFolder+CardDAV.h index 2e0e88b0f..4ab4278ce 100644 --- a/SoObjects/Contacts/SOGoFolder+CardDAV.h +++ b/SoObjects/Contacts/SOGoFolder+CardDAV.h @@ -1,8 +1,6 @@ /* NSObject+CardDAV.h - this file is part of SOGo * - * Copyright (C) 2007 Inverse inc. - * - * Author: Ludovic Marcotte + * Copyright (C) 2007-2015 Inverse inc. * * 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 diff --git a/SoObjects/Contacts/SOGoFolder+CardDAV.m b/SoObjects/Contacts/SOGoFolder+CardDAV.m index 2644e228f..3c9130670 100644 --- a/SoObjects/Contacts/SOGoFolder+CardDAV.m +++ b/SoObjects/Contacts/SOGoFolder+CardDAV.m @@ -1,8 +1,6 @@ /* NSObject+CardDAV.m - this file is part of SOGo * - * Copyright (C) 2007-2011 Inverse inc. - * - * Author: Ludovic Marcotte + * Copyright (C) 2007-2015 Inverse inc. * * 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 @@ -187,6 +185,10 @@ [filters addObject: filter]; } + // If no filters are provided, we return everything. + if (![filters count]) + [filters addObject: [NSDictionary dictionaryWithObject: @"." forKey: @"mail"]]; + return filters; } diff --git a/SoObjects/Mailer/GNUmakefile b/SoObjects/Mailer/GNUmakefile index da5092ea6..f25e20edd 100644 --- a/SoObjects/Mailer/GNUmakefile +++ b/SoObjects/Mailer/GNUmakefile @@ -72,12 +72,16 @@ Mailer_RESOURCE_FILES += \ SOGoMailIcelandicReply.wo \ SOGoMailItalianForward.wo \ SOGoMailItalianReply.wo \ + SOGoMailMacedonianForward.wo \ + SOGoMailMacedonianReply.wo \ SOGoMailNorwegianBokmalForward.wo \ SOGoMailNorwegianBokmalReply.wo \ SOGoMailNorwegianNynorskForward.wo \ SOGoMailNorwegianNynorskReply.wo \ SOGoMailPolishForward.wo \ SOGoMailPolishReply.wo \ + SOGoMailPortugueseForward.wo \ + SOGoMailPortugueseReply.wo \ SOGoMailRussianForward.wo \ SOGoMailRussianReply.wo \ SOGoMailSlovakForward.wo \ @@ -95,7 +99,7 @@ Mailer_RESOURCE_FILES += \ SOGoMailWelshForward.wo \ SOGoMailWelshReply.wo -Mailer_LANGUAGES = Arabic Basque BrazilianPortuguese ChineseTaiwan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovenian Slovenian SpanishSpain SpanishArgentina Swedish Ukrainian Welsh +Mailer_LANGUAGES = Arabic Basque BrazilianPortuguese ChineseTaiwan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian Macedonian NorwegianBokmal NorwegianNynorsk Polish Portuguese Russian Slovenian Slovenian SpanishSpain SpanishArgentina Swedish Ukrainian Welsh Mailer_LOCALIZED_RESOURCE_FILES = Localizable.strings diff --git a/SoObjects/Mailer/Macedonian.lproj/Localizable.strings b/SoObjects/Mailer/Macedonian.lproj/Localizable.strings new file mode 100644 index 000000000..3b4067e1e --- /dev/null +++ b/SoObjects/Mailer/Macedonian.lproj/Localizable.strings @@ -0,0 +1,2 @@ +"OtherUsersFolderName" = "Други кориÑници"; +"SharedFoldersName" = "Делени папки"; diff --git a/SoObjects/Mailer/NSDictionary+Mail.m b/SoObjects/Mailer/NSDictionary+Mail.m index 74311f292..177ad38ac 100644 --- a/SoObjects/Mailer/NSDictionary+Mail.m +++ b/SoObjects/Mailer/NSDictionary+Mail.m @@ -20,6 +20,7 @@ #import #import +#import #import "NSDictionary+Mail.h" diff --git a/SoObjects/Mailer/NSString+Mail.m b/SoObjects/Mailer/NSString+Mail.m index 1efdcb62f..f0e19046a 100644 --- a/SoObjects/Mailer/NSString+Mail.m +++ b/SoObjects/Mailer/NSString+Mail.m @@ -533,7 +533,7 @@ messageID = [NSMutableString string]; [messageID appendFormat: @"<%@", [SOGoObject globallyUniqueObjectId]]; pGUID = [[NSProcessInfo processInfo] globallyUniqueString]; - [messageID appendFormat: @"@%u>", [pGUID hash]]; + [messageID appendFormat: @"@%u>", (unsigned int)[pGUID hash]]; return [messageID lowercaseString]; } diff --git a/SoObjects/Mailer/Portuguese.lproj/Localizable.strings b/SoObjects/Mailer/Portuguese.lproj/Localizable.strings new file mode 100644 index 000000000..a1593eb84 --- /dev/null +++ b/SoObjects/Mailer/Portuguese.lproj/Localizable.strings @@ -0,0 +1,2 @@ +"OtherUsersFolderName" = "Outros Utilizadores"; +"SharedFoldersName" = "Pastas Partilhadas"; diff --git a/SoObjects/Mailer/SOGoDraftObject.m b/SoObjects/Mailer/SOGoDraftObject.m index 6967a6262..11da52e80 100644 --- a/SoObjects/Mailer/SOGoDraftObject.m +++ b/SoObjects/Mailer/SOGoDraftObject.m @@ -179,6 +179,7 @@ static NSString *headerKeys[] = {@"subject", @"to", @"cc", @"bcc", static NGMimeType *MultiMixedType = nil; static NGMimeType *MultiAlternativeType = nil; +static NGMimeType *MultiRelatedType = nil; static NSString *userAgent = nil; + (void) initialize @@ -189,6 +190,9 @@ static NSString *userAgent = nil; MultiAlternativeType = [NGMimeType mimeType: @"multipart" subType: @"alternative"]; [MultiAlternativeType retain]; + MultiRelatedType = [NGMimeType mimeType: @"multipart" subType: @"related"]; + [MultiRelatedType retain]; + userAgent = [NSString stringWithFormat: @"SOGoMail %@", SOGoVersion]; [userAgent retain]; @@ -699,7 +703,8 @@ static NSString *userAgent = nil; for (count = max - 1; count >= 0; count--) { currentAddress = [addresses objectAtIndex: count]; - if ([currentRecipient + if (![currentAddress baseEMail] || + [currentRecipient caseInsensitiveCompare: [currentAddress baseEMail]] == NSOrderedSame) { @@ -1678,16 +1683,20 @@ static NSString *userAgent = nil; NGMimeMessage *message; NGMutableHashMap *map; NSString *newText; + BOOL has_inline_images; message = nil; - + has_inline_images = NO; bodyParts = [NSMutableArray array]; if (_extractImages) { newText = [text htmlByExtractingImages: bodyParts]; if ([bodyParts count]) - [self setText: newText]; + { + [self setText: newText]; + has_inline_images = YES; + } } map = [self mimeHeaderMapWithHeaders: _headers @@ -1704,10 +1713,20 @@ static NSString *userAgent = nil; /* no attachments */ message = [self mimeMessageForContentWithHeaderMap: map]; else - /* attachments, create multipart/mixed */ - message = [self mimeMultiPartMessageWithHeaderMap: map - andBodyParts: bodyParts]; - //[self debugWithFormat: @"message: %@", message]; + { + // attachments, create multipart/mixed or multipart/related if + // we have inline image to avoid Thunderbird bug #61815 (https://bugzilla.mozilla.org/show_bug.cgi?id=61815) + if (has_inline_images) + { + [map removeAllObjectsForKey: @"content-type"]; + [map addObject: MultiRelatedType forKey: @"content-type"]; + } + + message = [self mimeMultiPartMessageWithHeaderMap: map + andBodyParts: bodyParts]; + + //[self debugWithFormat: @"message: %@", message]; + } } return message; diff --git a/SoObjects/Mailer/SOGoMailBaseObject.m b/SoObjects/Mailer/SOGoMailBaseObject.m index 863491e2e..4948abe7e 100644 --- a/SoObjects/Mailer/SOGoMailBaseObject.m +++ b/SoObjects/Mailer/SOGoMailBaseObject.m @@ -32,9 +32,11 @@ #import #import #import +#import #import #import +#import #import "SOGoMailAccount.h" #import "SOGoMailManager.h" diff --git a/SoObjects/Mailer/SOGoMailBodyPart.m b/SoObjects/Mailer/SOGoMailBodyPart.m index 2fb075f4c..71d2dd385 100644 --- a/SoObjects/Mailer/SOGoMailBodyPart.m +++ b/SoObjects/Mailer/SOGoMailBodyPart.m @@ -396,7 +396,7 @@ static BOOL debugOn = NO; mimeType = @"application/octet-stream"; [response setHeader: mimeType forKey: @"content-type"]; - [response setHeader: [NSString stringWithFormat:@"%d", [data length]] + [response setHeader: [NSString stringWithFormat:@"%d", (int)[data length]] forKey: @"content-length"]; if (asAttachment) diff --git a/SoObjects/Mailer/SOGoMailFolder.m b/SoObjects/Mailer/SOGoMailFolder.m index 12a81d6ae..529a138e7 100644 --- a/SoObjects/Mailer/SOGoMailFolder.m +++ b/SoObjects/Mailer/SOGoMailFolder.m @@ -1645,7 +1645,7 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) sortOrderings = [NSMutableArray array]; - if ([self _sortElementIsAscending: sortElement]) + if ([self _sortElementIsAscending: (NGDOMNodeWithChildren *)sortElement]) sortOrderingOrder = EOCompareAscending; else sortOrderingOrder = EOCompareDescending; @@ -2077,7 +2077,7 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) // * 5 FETCH (UID 559 MODSEQ (17)) // * 6 FETCH (UID 560 MODSEQ (18)) // * 7 FETCH (UID 561 MODSEQ (19)) - +// // // fetchUIDsOfVanishedItems .. // diff --git a/SoObjects/Mailer/SOGoMailForward.h b/SoObjects/Mailer/SOGoMailForward.h index d4c516959..f31e8cb05 100644 --- a/SoObjects/Mailer/SOGoMailForward.h +++ b/SoObjects/Mailer/SOGoMailForward.h @@ -82,6 +82,9 @@ @interface SOGoMailItalianForward : SOGoMailForward @end +@interface SOGoMailMacedonianForward : SOGoMailForward +@end + @interface SOGoMailNorwegianBokmalForward : SOGoMailForward @end @@ -100,6 +103,9 @@ @interface SOGoMailPolishForward : SOGoMailForward @end +@interface SOGoMailPortugueseForward : SOGoMailForward +@end + @interface SOGoMailRussianForward : SOGoMailForward @end diff --git a/SoObjects/Mailer/SOGoMailForward.m b/SoObjects/Mailer/SOGoMailForward.m index 3450539d5..d27d1b9a5 100644 --- a/SoObjects/Mailer/SOGoMailForward.m +++ b/SoObjects/Mailer/SOGoMailForward.m @@ -73,10 +73,10 @@ - (NSString *) newLine { - NSString *rc = [NSString stringWithString: @" "]; + NSString *rc = @" "; if (htmlComposition) - rc = [NSString stringWithString: @"
"]; + rc = @"
"; return rc; } @@ -293,6 +293,9 @@ @implementation SOGoMailItalianForward @end +@implementation SOGoMailMacedonianForward +@end + @implementation SOGoMailNorwegianBokmalForward @end @@ -311,6 +314,9 @@ @implementation SOGoMailPolishForward @end +@implementation SOGoMailPortugueseForward +@end + @implementation SOGoMailRussianForward @end diff --git a/SoObjects/Mailer/SOGoMailLabel.m b/SoObjects/Mailer/SOGoMailLabel.m index 1d822e90b..8a88c1bd8 100644 --- a/SoObjects/Mailer/SOGoMailLabel.m +++ b/SoObjects/Mailer/SOGoMailLabel.m @@ -74,7 +74,7 @@ int i; allLabels = [NSMutableArray array]; - allKeys = [[theDefaults allKeys] sortedArrayUsingSelector: @selector (caseInsensitiveCompare:)]; + allKeys = (NSMutableArray *)[[theDefaults allKeys] sortedArrayUsingSelector: @selector (caseInsensitiveCompare:)]; for (i = 0; i < [allKeys count]; i++) { diff --git a/SoObjects/Mailer/SOGoMailMacedonianForward.wo/SOGoMailMacedonianForward.html b/SoObjects/Mailer/SOGoMailMacedonianForward.wo/SOGoMailMacedonianForward.html new file mode 100644 index 000000000..ef3f4389b --- /dev/null +++ b/SoObjects/Mailer/SOGoMailMacedonianForward.wo/SOGoMailMacedonianForward.html @@ -0,0 +1,16 @@ +<#newLine/> +<#newLine/> +<#signaturePlacementOnTop><#newLine/> +<#signature/><#newLine/> +-------- Оригинална порака --------<#newLine/> +Тема: <#subject/><#newLine/> +Датум: <#date/><#newLine/> +Од: <#from/><#newLine/> +<#hasReplyTo>Reply-To: <#replyTo/><#hasOrganization>Organization: <#organization/>To: <#to/><#newLine/> +<#hasCc>CC: <#cc/><#hasNewsGroups>Newsgroups: <#newsgroups/><#hasReferences>References: <#references/><#newLine/> +<#newLine/> +<#messageBody/><#newLine/> +<#signaturePlacementOnBottom><#newLine/> +<#newLine/> +<#signature/> +<#newLine/> diff --git a/SoObjects/Mailer/SOGoMailMacedonianForward.wo/SOGoMailMacedonianForward.wod b/SoObjects/Mailer/SOGoMailMacedonianForward.wo/SOGoMailMacedonianForward.wod new file mode 100644 index 000000000..f2436acc9 --- /dev/null +++ b/SoObjects/Mailer/SOGoMailMacedonianForward.wo/SOGoMailMacedonianForward.wod @@ -0,0 +1,88 @@ +subject: WOString { + value = subject; + escapeHTML = NO; +} + +date: WOString { + value = date; + escapeHTML = NO; +} + +from: WOString { + value = from; + escapeHTML = NO; +} + +newLine: WOString { + value = newLine; + escapeHTML = NO; +} + +hasReplyTo: WOConditional { + condition = hasReplyTo; +} + +replyTo: WOString { + value = replyTo; + escapeHTML = NO; +} + +hasOrganization: WOConditional { + condition = hasOrganization; +} + +organization: WOString { + value = organization; + escapeHTML = NO; +} + +to: WOString { + value = to; + escapeHTML = NO; +} + +hasCc: WOConditional { + condition = hasCc; +} + +cc: WOString { + value = cc; + escapeHTML = NO; +} + +hasNewsGroups: WOConditional { + condition = hasNewsGroups; +} + +newsgroups: WOString { + value = newsgroups; + escapeHTML = NO; +} + +hasReferences: WOConditional { + condition = hasReferences; +} + +references: WOString { + value = references; + escapeHTML = NO; +} + +messageBody: WOString { + value = messageBody; + escapeHTML = NO; +} + +signature: WOString { + value = signature; + escapeHTML = NO; +} + +signaturePlacementOnTop: WOConditional { + condition = signaturePlacementOnTop; +} + +signaturePlacementOnBottom: WOConditional { + condition = signaturePlacementOnTop; + negate = YES; +} diff --git a/SoObjects/Mailer/SOGoMailMacedonianReply.wo/SOGoMailMacedonianReply.html b/SoObjects/Mailer/SOGoMailMacedonianReply.wo/SOGoMailMacedonianReply.html new file mode 100644 index 000000000..9b8e20c4e --- /dev/null +++ b/SoObjects/Mailer/SOGoMailMacedonianReply.wo/SOGoMailMacedonianReply.html @@ -0,0 +1,16 @@ +<#replyPlacementOnTop><#newLine/> +<#newLine/> +<#signaturePlacementOnTop><#newLine/> +<#signature/><#newLine/> +<#outlookMode>-------- Оригинална порака --------<#newLine/> +Тема: <#subject/><#newLine/> +Датум: <#date/><#newLine/> +Од: <#from/><#newLine/> +<#hasReplyTo>Reply-To: <#replyTo/><#hasOrganization>Organization: <#organization/>To: <#to/><#newLine/> +<#hasCc>CC: <#cc/><#hasNewsGroups>Newsgroups: <#newsgroups/><#hasReferences>References: <#references/><#newLine/> +<#standardMode>On <#date/>, <#from/> wrote:<#newLine/> +<#newLine/> +<#messageBody/><#newLine/> +<#replyPlacementOnBottom><#newLine/> +<#newLine/> +<#signaturePlacementOnBottom><#signature/><#newLine/> diff --git a/SoObjects/Mailer/SOGoMailMacedonianReply.wo/SOGoMailMacedonianReply.wod b/SoObjects/Mailer/SOGoMailMacedonianReply.wo/SOGoMailMacedonianReply.wod new file mode 100644 index 000000000..3fbed6d61 --- /dev/null +++ b/SoObjects/Mailer/SOGoMailMacedonianReply.wo/SOGoMailMacedonianReply.wod @@ -0,0 +1,106 @@ +outlookMode: WOConditional { + condition = outlookMode; +} + +standardMode: WOConditional { + condition = outlookMode; + negate = YES; +} + +subject: WOString { + value = subject; + escapeHTML = NO; +} + +date: WOString { + value = date; + escapeHTML = NO; +} + +from: WOString { + value = from; + escapeHTML = NO; +} + +newLine: WOString { + value = newLine; + escapeHTML = NO; +} + +hasReplyTo: WOConditional { + condition = hasReplyTo; +} + +replyTo: WOString { + value = replyTo; + escapeHTML = NO; +} + +hasOrganization: WOConditional { + condition = hasOrganization; +} + +organization: WOString { + value = organization; + escapeHTML = NO; +} + +to: WOString { + value = to; + escapeHTML = NO; +} + +hasCc: WOConditional { + condition = hasCc; +} + +cc: WOString { + value = cc; + escapeHTML = NO; +} + +hasNewsGroups: WOConditional { + condition = hasNewsGroups; +} + +newsgroups: WOString { + value = newsgroups; + escapeHTML = NO; +} + +hasReferences: WOConditional { + condition = hasReferences; +} + +references: WOString { + value = references; + escapeHTML = NO; +} + +messageBody: WOString { + value = messageBody; + escapeHTML = NO; +} + +signature: WOString { + value = signature; + escapeHTML = NO; +} + +replyPlacementOnTop: WOConditional { + condition = replyPlacementOnTop; +} + +replyPlacementOnBottom: WOConditional { + condition = replyPlacementOnTop; + negate = YES; +} + +signaturePlacementOnTop: WOConditional { + condition = signaturePlacementOnTop; +} + +signaturePlacementOnBottom: WOConditional { + condition = signaturePlacementOnTop; + negate = YES; +} diff --git a/SoObjects/Mailer/SOGoMailObject.m b/SoObjects/Mailer/SOGoMailObject.m index 2aabcaa75..dd4ee0358 100644 --- a/SoObjects/Mailer/SOGoMailObject.m +++ b/SoObjects/Mailer/SOGoMailObject.m @@ -389,6 +389,13 @@ static BOOL debugSoParts = NO; [[[info valueForKey: @"subtype"] lowercaseString] isEqualToString: @"calendar"]) return info; + // deal with mails that contain only an attachment, for example: + // application/pkcs7-mime + // application/pdf + // etc. + if ([[[info valueForKey: @"type"] lowercaseString] isEqualToString: @"application"]) + return info; + /* For each path component, eg 1,1,3 @@ -766,6 +773,7 @@ static BOOL debugSoParts = NO; [part objectForKey: @"subtype"]]; if (!filename) + { // We might end up here because of MUA that actually strips the // Content-Disposition (and thus, the filename) when mails containing // attachments have been forwarded. Thunderbird (2.x) does just that @@ -774,9 +782,15 @@ static BOOL debugSoParts = NO; [mimeType hasPrefix: @"audio/"] || [mimeType hasPrefix: @"image/"] || [mimeType hasPrefix: @"video/"]) + { filename = [NSString stringWithFormat: @"unknown_%@", path]; - else if ([mimeType isEqualToString: @"message/rfc822"]) - filename = [NSString stringWithFormat: @"email_%@.eml", path]; + } + else + { + if ([mimeType isEqualToString: @"message/rfc822"]) + filename = [NSString stringWithFormat: @"email_%@.eml", path]; + } + } if (filename) @@ -809,7 +823,7 @@ static BOOL debugSoParts = NO; NSMutableDictionary *currentPart; NSString *newPath; NSArray *subparts; - NSString *type; + NSString *type, *subtype; NSUInteger i; type = [[part objectForKey: @"type"] lowercaseString]; @@ -820,19 +834,27 @@ static BOOL debugSoParts = NO; { currentPart = [subparts objectAtIndex: i-1]; if (path) - newPath = [NSString stringWithFormat: @"%@.%d", path, i]; + newPath = [NSString stringWithFormat: @"%@.%d", path, (int)i]; else - newPath = [NSString stringWithFormat: @"%d", i]; + newPath = [NSString stringWithFormat: @"%d", (int)i]; [self _fetchFileAttachmentKeysInPart: currentPart intoArray: keys withPath: newPath - andPrefix: [NSString stringWithFormat: @"%@/%i", prefix, i]]; + andPrefix: [NSString stringWithFormat: @"%@/%i", prefix, (int)i]]; } } else { if (!path) - path = @"1"; + { + path = @"1"; + + // We set the path to 0 in case of a smime mail if not provided. + subtype = [[part objectForKey: @"subtype"] lowercaseString]; + if ([subtype isEqualToString: @"pkcs7-mime"]) + path = @"0"; + } + [self _fetchFileAttachmentKey: part intoArray: keys withPath: path @@ -1026,6 +1048,14 @@ static BOOL debugSoParts = NO; return obj; } } + // Handles cases where the email is itself an attachment, so its Content-Type + // is application/*, image/* etc. + else if ([_key isEqualToString: @"asAttachment"] && + (obj = [self lookupImap4BodyPartKey: @"0" inContext:_ctx]) != nil) + { + [obj setAsAttachment]; + return obj; + } /* return 404 to stop acquisition */ return [NSException exceptionWithHTTPStatus:404 /* Not Found */ diff --git a/SoObjects/Mailer/SOGoMailPortugueseForward.wo/SOGoMailPortugueseForward.html b/SoObjects/Mailer/SOGoMailPortugueseForward.wo/SOGoMailPortugueseForward.html new file mode 100644 index 000000000..2ff0e65b2 --- /dev/null +++ b/SoObjects/Mailer/SOGoMailPortugueseForward.wo/SOGoMailPortugueseForward.html @@ -0,0 +1,16 @@ +<#newLine/> +<#newLine/> +<#signaturePlacementOnTop><#newLine/> +<#signature/><#newLine/> +-------- Mensagem Original --------<#newLine/> +Assunto: <#subject/><#newLine/> +Data: <#date/><#newLine/> +De: <#from/><#newLine/> +<#hasReplyTo>Responder-Para: <#replyTo/><#hasOrganization>Organização: <#organization/>Para: <#to/><#newLine/> +<#hasCc>CC: <#cc/><#hasNewsGroups>Newsgroups: <#newsgroups/><#hasReferences>Referências: <#references/><#newLine/> +<#newLine/> +<#messageBody/><#newLine/> +<#signaturePlacementOnBottom><#newLine/> +<#newLine/> +<#signature/> +<#newLine/> diff --git a/SoObjects/Mailer/SOGoMailPortugueseForward.wo/SOGoMailPortugueseForward.wod b/SoObjects/Mailer/SOGoMailPortugueseForward.wo/SOGoMailPortugueseForward.wod new file mode 100644 index 000000000..f2436acc9 --- /dev/null +++ b/SoObjects/Mailer/SOGoMailPortugueseForward.wo/SOGoMailPortugueseForward.wod @@ -0,0 +1,88 @@ +subject: WOString { + value = subject; + escapeHTML = NO; +} + +date: WOString { + value = date; + escapeHTML = NO; +} + +from: WOString { + value = from; + escapeHTML = NO; +} + +newLine: WOString { + value = newLine; + escapeHTML = NO; +} + +hasReplyTo: WOConditional { + condition = hasReplyTo; +} + +replyTo: WOString { + value = replyTo; + escapeHTML = NO; +} + +hasOrganization: WOConditional { + condition = hasOrganization; +} + +organization: WOString { + value = organization; + escapeHTML = NO; +} + +to: WOString { + value = to; + escapeHTML = NO; +} + +hasCc: WOConditional { + condition = hasCc; +} + +cc: WOString { + value = cc; + escapeHTML = NO; +} + +hasNewsGroups: WOConditional { + condition = hasNewsGroups; +} + +newsgroups: WOString { + value = newsgroups; + escapeHTML = NO; +} + +hasReferences: WOConditional { + condition = hasReferences; +} + +references: WOString { + value = references; + escapeHTML = NO; +} + +messageBody: WOString { + value = messageBody; + escapeHTML = NO; +} + +signature: WOString { + value = signature; + escapeHTML = NO; +} + +signaturePlacementOnTop: WOConditional { + condition = signaturePlacementOnTop; +} + +signaturePlacementOnBottom: WOConditional { + condition = signaturePlacementOnTop; + negate = YES; +} diff --git a/SoObjects/Mailer/SOGoMailPortugueseReply.wo/SOGoMailPortugueseReply.html b/SoObjects/Mailer/SOGoMailPortugueseReply.wo/SOGoMailPortugueseReply.html new file mode 100644 index 000000000..bc032f3f7 --- /dev/null +++ b/SoObjects/Mailer/SOGoMailPortugueseReply.wo/SOGoMailPortugueseReply.html @@ -0,0 +1,17 @@ +<#signaturePlacementOnTop> + + +<#signature/> + +<#outlookMode>-------- Mensagem Original -------- +Assunto: <#subject/> +Data: <#date/> +De: <#from/> +<#hasReplyTo>Responder-Para: <#replyTo/><#hasOrganization>Organização: <#organization/>Para: <#to/> +<#hasCc>CC: <#cc/><#hasNewsGroups>Newsgroups: <#newsgroups/><#hasReferences>Referências: <#references/> +<#standardMode>Em <#date/>, <#from/> escreveu: + +<#messageBody/> + + +<#signaturePlacementOnBottom><#signature/> diff --git a/SoObjects/Mailer/SOGoMailPortugueseReply.wo/SOGoMailPortugueseReply.wod b/SoObjects/Mailer/SOGoMailPortugueseReply.wo/SOGoMailPortugueseReply.wod new file mode 100644 index 000000000..3fbed6d61 --- /dev/null +++ b/SoObjects/Mailer/SOGoMailPortugueseReply.wo/SOGoMailPortugueseReply.wod @@ -0,0 +1,106 @@ +outlookMode: WOConditional { + condition = outlookMode; +} + +standardMode: WOConditional { + condition = outlookMode; + negate = YES; +} + +subject: WOString { + value = subject; + escapeHTML = NO; +} + +date: WOString { + value = date; + escapeHTML = NO; +} + +from: WOString { + value = from; + escapeHTML = NO; +} + +newLine: WOString { + value = newLine; + escapeHTML = NO; +} + +hasReplyTo: WOConditional { + condition = hasReplyTo; +} + +replyTo: WOString { + value = replyTo; + escapeHTML = NO; +} + +hasOrganization: WOConditional { + condition = hasOrganization; +} + +organization: WOString { + value = organization; + escapeHTML = NO; +} + +to: WOString { + value = to; + escapeHTML = NO; +} + +hasCc: WOConditional { + condition = hasCc; +} + +cc: WOString { + value = cc; + escapeHTML = NO; +} + +hasNewsGroups: WOConditional { + condition = hasNewsGroups; +} + +newsgroups: WOString { + value = newsgroups; + escapeHTML = NO; +} + +hasReferences: WOConditional { + condition = hasReferences; +} + +references: WOString { + value = references; + escapeHTML = NO; +} + +messageBody: WOString { + value = messageBody; + escapeHTML = NO; +} + +signature: WOString { + value = signature; + escapeHTML = NO; +} + +replyPlacementOnTop: WOConditional { + condition = replyPlacementOnTop; +} + +replyPlacementOnBottom: WOConditional { + condition = replyPlacementOnTop; + negate = YES; +} + +signaturePlacementOnTop: WOConditional { + condition = signaturePlacementOnTop; +} + +signaturePlacementOnBottom: WOConditional { + condition = signaturePlacementOnTop; + negate = YES; +} diff --git a/SoObjects/Mailer/SOGoMailReply.h b/SoObjects/Mailer/SOGoMailReply.h index e2af0fcaf..abf75e095 100644 --- a/SoObjects/Mailer/SOGoMailReply.h +++ b/SoObjects/Mailer/SOGoMailReply.h @@ -81,6 +81,9 @@ @interface SOGoMailItalianReply : SOGoMailReply @end +@interface SOGoMailMacedonianReply : SOGoMailReply +@end + @interface SOGoMailNorwegianBokmalReply : SOGoMailReply @end @@ -99,6 +102,9 @@ @interface SOGoMailPolishReply : SOGoMailReply @end +@interface SOGoMailPortugueseReply : SOGoMailReply +@end + @interface SOGoMailRussianReply : SOGoMailReply @end diff --git a/SoObjects/Mailer/SOGoMailReply.m b/SoObjects/Mailer/SOGoMailReply.m index d0bd38801..3d19b3405 100644 --- a/SoObjects/Mailer/SOGoMailReply.m +++ b/SoObjects/Mailer/SOGoMailReply.m @@ -131,6 +131,9 @@ @implementation SOGoMailItalianReply @end +@implementation SOGoMailMacedonianReply +@end + @implementation SOGoMailNorwegianBokmalReply @end @@ -149,6 +152,9 @@ @implementation SOGoMailPolishReply @end +@implementation SOGoMailPortugueseReply +@end + @implementation SOGoMailRussianReply @end diff --git a/SoObjects/SOGo/BSONCodec.m b/SoObjects/SOGo/BSONCodec.m index ce4c01e24..0e68f966c 100644 --- a/SoObjects/SOGo/BSONCodec.m +++ b/SoObjects/SOGo/BSONCodec.m @@ -310,7 +310,7 @@ static NSDictionary *BSONTypes() case 'q': return 0x12; default: - [NSException raise: NSInvalidArgumentException format: @"%@::%s - invalid encoding type '%c'", [self class], _cmd, encoding]; + [NSException raise: NSInvalidArgumentException format: @"%@::%@ - invalid encoding type '%c'", [self class], NSStringFromSelector(_cmd), encoding]; } return 0; } @@ -385,7 +385,7 @@ static NSDictionary *BSONTypes() } - [NSException raise: NSInvalidArgumentException format: @"%@::%s - invalid encoding type '%c'", [self class], _cmd, encoding]; + [NSException raise: NSInvalidArgumentException format: @"%@::%@ - invalid encoding type '%c'", [self class], NSStringFromSelector(_cmd), encoding]; return nil; } diff --git a/SoObjects/SOGo/LDAPSource.m b/SoObjects/SOGo/LDAPSource.m index d537c6aec..55115efdd 100644 --- a/SoObjects/SOGo/LDAPSource.m +++ b/SoObjects/SOGo/LDAPSource.m @@ -1703,7 +1703,7 @@ _makeLDAPChanges (NGLdapConnection *ldapConnection, hostname: hostname port: [NSString stringWithFormat: @"%d", port] encryption: encryption - bindAsCurrentUser: NO]; + bindAsCurrentUser: [NSString stringWithFormat: @"%d", NO]]; [ab setBaseDN: [entry dn] IDField: @"cn" CNField: @"displayName" diff --git a/SoObjects/SOGo/NSCalendarDate+SOGo.m b/SoObjects/SOGo/NSCalendarDate+SOGo.m index 4ba4cd4ed..c2bac7996 100644 --- a/SoObjects/SOGo/NSCalendarDate+SOGo.m +++ b/SoObjects/SOGo/NSCalendarDate+SOGo.m @@ -88,9 +88,9 @@ static NSString *rfc822Months[] = {@"", @"Jan", @"Feb", @"Mar", @"Apr", NSString *str; str = [NSString stringWithFormat: @"%.4d%.2d%.2d", - [self yearOfCommonEra], - [self monthOfYear], - [self dayOfMonth]]; + (int)[self yearOfCommonEra], + (int)[self monthOfYear], + (int)[self dayOfMonth]]; return str; } @@ -107,9 +107,9 @@ static NSString *rfc822Months[] = {@"", @"Jan", @"Feb", @"Mar", @"Apr", return [NSString stringWithFormat: @"%@, %.2d %@ %d %.2d:%.2d:%.2d %+.4d", - rfc822Days[[self dayOfWeek]], [self dayOfMonth], - rfc822Months[[self monthOfYear]], [self yearOfCommonEra], - [self hourOfDay], [self minuteOfHour], [self secondOfMinute], + rfc822Days[[self dayOfWeek]], (int)[self dayOfMonth], + rfc822Months[[self monthOfYear]], (int)[self yearOfCommonEra], + (int)[self hourOfDay], (int)[self minuteOfHour], (int)[self secondOfMinute], timeZoneShift]; } diff --git a/SoObjects/SOGo/NSData+Crypto.m b/SoObjects/SOGo/NSData+Crypto.m index 5e2f3640a..5c0a03a06 100644 --- a/SoObjects/SOGo/NSData+Crypto.m +++ b/SoObjects/SOGo/NSData+Crypto.m @@ -23,7 +23,7 @@ * Boston, MA 02111-1307, USA. */ -#ifndef __OpenBSD__ +#if !defined(__OpenBSD__) && !defined(__FreeBSD__) #include #endif diff --git a/SoObjects/SOGo/NSDictionary+DAV.m b/SoObjects/SOGo/NSDictionary+DAV.m index 722e20511..a2d52e71e 100644 --- a/SoObjects/SOGo/NSDictionary+DAV.m +++ b/SoObjects/SOGo/NSDictionary+DAV.m @@ -46,7 +46,7 @@ { NSString *newTag; - newTag = [NSString stringWithFormat: @"n%d", [namespaces count]]; + newTag = [NSString stringWithFormat: @"n%d", (int)[namespaces count]]; [namespaces setObject: newTag forKey: newNS]; return newTag; diff --git a/SoObjects/SOGo/NSString+Utilities.m b/SoObjects/SOGo/NSString+Utilities.m index 3895cd923..6dbcb9689 100644 --- a/SoObjects/SOGo/NSString+Utilities.m +++ b/SoObjects/SOGo/NSString+Utilities.m @@ -309,7 +309,7 @@ static int cssEscapingCount; c == 0xD || (c >= 0x20 && c <= 0xD7FF) || (c >= 0xE000 && c <= 0xFFFD) || - (c >= 0x10000 && c <= 0x10FFFF)) + (c >= (unichar)0x10000 && c <= (unichar)0x10FFFF)) { *(start+j) = c; j++; diff --git a/SoObjects/SOGo/SOGoCache.h b/SoObjects/SOGo/SOGoCache.h index 69ef6f942..12e665ea7 100644 --- a/SoObjects/SOGo/SOGoCache.h +++ b/SoObjects/SOGo/SOGoCache.h @@ -21,6 +21,7 @@ #ifndef SOGOCACHE_H #define SOGOCACHE_H +#import #import #include diff --git a/SoObjects/SOGo/SOGoCacheGCSFolder.h b/SoObjects/SOGo/SOGoCacheGCSFolder.h index 3495dc0d6..c51dd598f 100644 --- a/SoObjects/SOGo/SOGoCacheGCSFolder.h +++ b/SoObjects/SOGo/SOGoCacheGCSFolder.h @@ -40,6 +40,8 @@ - (NSMutableString *) pathForChild: (NSString *) childName; +- (void) addUserInAcls: (NSString *) user; + - (NSArray *) toOneRelationshipKeys; - (NSArray *) toManyRelationshipKeys; diff --git a/SoObjects/SOGo/SOGoCacheGCSFolder.m b/SoObjects/SOGo/SOGoCacheGCSFolder.m index b29287fcb..2e483bc32 100644 --- a/SoObjects/SOGo/SOGoCacheGCSFolder.m +++ b/SoObjects/SOGo/SOGoCacheGCSFolder.m @@ -364,7 +364,7 @@ Class SOGoCacheGCSObjectK = Nil; if (record) { if ([[record objectForKey: @"c_type"] intValue] == MAPIFolderCacheObject) - objectClass = isa; + objectClass = object_getClass(self); else objectClass = SOGoCacheGCSObjectK; diff --git a/SoObjects/SOGo/SOGoCacheGCSObject.h b/SoObjects/SOGo/SOGoCacheGCSObject.h index b456c1775..a2ffe5bf0 100644 --- a/SoObjects/SOGo/SOGoCacheGCSObject.h +++ b/SoObjects/SOGo/SOGoCacheGCSObject.h @@ -55,6 +55,9 @@ typedef enum { - (void) reloadIfNeeded; - (void) save; +- (NSException *) destroy; + ++ (id) objectWithName: (NSString *) key inContainer: (id) theContainer useCache: (BOOL) useCache; /* accessors */ - (NSMutableString *) path; /* full filename */ diff --git a/SoObjects/SOGo/SOGoCacheGCSObject.m b/SoObjects/SOGo/SOGoCacheGCSObject.m index a2251173a..a6a5c52a3 100644 --- a/SoObjects/SOGo/SOGoCacheGCSObject.m +++ b/SoObjects/SOGo/SOGoCacheGCSObject.m @@ -87,7 +87,7 @@ static EOAttribute *textColumn = nil; { tableUrl = nil; initialized = NO; - objectType = -1; + objectType = (SOGoCacheObjectType) -1; deleted = NO; version = 0; } @@ -103,11 +103,22 @@ static EOAttribute *textColumn = nil; } + (id) objectWithName: (NSString *) key inContainer: (id) theContainer +{ + return [self objectWithName: key + inContainer: theContainer + useCache: YES]; +} + ++ (id) objectWithName: (NSString *) key inContainer: (id) theContainer useCache: (BOOL) useCache { SOGoCache *cache; id o; cache = [SOGoCache sharedCache]; + + if (!useCache) + [cache unregisterObjectWithName: key inContainer: theContainer]; + o = [cache objectNamed: key inContainer: theContainer]; if (!o) @@ -383,7 +394,7 @@ static EOAttribute *textColumn = nil; @"SELECT * FROM %@ WHERE c_path = %@", tableName, pathValue]; if (startVersion > -1) - [sql appendFormat: @" AND c_version > %d", startVersion]; + [sql appendFormat: @" AND c_version > %d", (int)startVersion]; /* execution */ records = [self performSQLQuery: sql]; @@ -411,15 +422,13 @@ static EOAttribute *textColumn = nil; tableName = [self tableName]; adaptor = [self tableChannelAdaptor]; - pathValue = [adaptor formatValue: [NSString stringWithFormat: @"/%@", deviceId] - forAttribute: textColumn]; /* query */ sql = [NSMutableString stringWithFormat: @"SELECT * FROM %@ WHERE c_type = %d AND c_deleted <> 1", tableName, objectType]; if (startVersion > -1) - [sql appendFormat: @" AND c_version > %d", startVersion]; + [sql appendFormat: @" AND c_version > %d", (int)startVersion]; if (deviceId) { pathValue = [adaptor formatValue: [NSString stringWithFormat: @"/%@%", deviceId] @@ -546,7 +555,7 @@ static EOAttribute *textColumn = nil; lastModifiedValue = (NSInteger) [lastModified timeIntervalSince1970]; - if (objectType == -1) + if (objectType == (SOGoCacheObjectType) -1) [NSException raise: @"SOGoCacheIOException" format: @"object type has not been set for object '%@'", self]; @@ -576,7 +585,7 @@ static EOAttribute *textColumn = nil; @")"), tableName, pathValue, parentPathValue, objectType, - creationDateValue, lastModifiedValue, + (int)creationDateValue, (int)lastModifiedValue, propsValue]; isNew = NO; } @@ -590,7 +599,7 @@ static EOAttribute *textColumn = nil; @" c_version = %d, c_content = %@" @" WHERE c_path = %@"), tableName, - lastModifiedValue, deletedValue, version, propsValue, + (int)lastModifiedValue, (int)deletedValue, (int)version, propsValue, pathValue]; } diff --git a/SoObjects/SOGo/SOGoCacheObject.h b/SoObjects/SOGo/SOGoCacheObject.h index d8b01c468..0d0a78492 100644 --- a/SoObjects/SOGo/SOGoCacheObject.h +++ b/SoObjects/SOGo/SOGoCacheObject.h @@ -42,8 +42,6 @@ - (NSCalendarDate *) creationDate; - (NSCalendarDate *) lastModified; -- (NSException *) destroy; - @end #endif /* SOGOCACHEOBJECT_H */ diff --git a/SoObjects/SOGo/SOGoContentObject.m b/SoObjects/SOGo/SOGoContentObject.m index 088fe522e..2092deacc 100644 --- a/SoObjects/SOGo/SOGoContentObject.m +++ b/SoObjects/SOGo/SOGoContentObject.m @@ -94,7 +94,7 @@ { [self subclassResponsibility: _cmd]; - return nil; + return (Class *) nil; } - (void) _setRecord: (NSDictionary *) objectRecord @@ -254,6 +254,9 @@ - (NSException *) moveToFolder: (SOGoGCSFolder *) newFolder { [self subclassResponsibility: _cmd]; + + // TODO: Add exception handling code and return it + return (NSException *) nil; } - (NSException *) delete @@ -345,7 +348,7 @@ /* attempt a save */ - error = [self saveComponent: [[self parsingClass] parseSingleFromSource: [rq contentAsString]] + error = [self saveComponent: [(id)[self parsingClass] parseSingleFromSource: [rq contentAsString]] baseVersion: baseVersion]; if (error) response = (WOResponse *) error; @@ -410,7 +413,7 @@ else length = 0; - return [NSString stringWithFormat: @"%u", length]; + return [NSString stringWithFormat: @"%u", (unsigned int)length]; } - (NSException *) davMoveToTargetObject: (id) _target diff --git a/SoObjects/SOGo/SOGoDefaults.plist b/SoObjects/SOGo/SOGoDefaults.plist index 572f90e73..614959f75 100644 --- a/SoObjects/SOGo/SOGoDefaults.plist +++ b/SoObjects/SOGo/SOGoDefaults.plist @@ -41,7 +41,7 @@ SOGoLanguage = "English"; SOGoSupportedLanguages = ( "Arabic", "Basque", "Catalan", "ChineseTaiwan", "Czech", "Dutch", "Danish", "Welsh", "English", "SpanishSpain", "SpanishArgentina", "Finnish", "French", "German", - "Icelandic", "Italian", "Hungarian", "BrazilianPortuguese", + "Icelandic", "Italian", "Macedonian", "Hungarian", "Portuguese", "BrazilianPortuguese", "NorwegianBokmal", "NorwegianNynorsk", "Polish", "Russian", "Slovak", "Slovenian", "Ukrainian", "Swedish" ); diff --git a/SoObjects/SOGo/SOGoFolder.m b/SoObjects/SOGo/SOGoFolder.m index b089c258a..ac9d019c8 100644 --- a/SoObjects/SOGo/SOGoFolder.m +++ b/SoObjects/SOGo/SOGoFolder.m @@ -107,7 +107,7 @@ - (void) setDisplayName: (NSString *) newDisplayName { - ASSIGN (displayName, newDisplayName); + ASSIGN (displayName, (NSMutableString *)newDisplayName); } - (NSString *) displayName diff --git a/SoObjects/SOGo/SOGoGCSFolder.m b/SoObjects/SOGo/SOGoGCSFolder.m index 8e245bd9a..adbcb348e 100644 --- a/SoObjects/SOGo/SOGoGCSFolder.m +++ b/SoObjects/SOGo/SOGoGCSFolder.m @@ -399,12 +399,12 @@ static NSArray *childRecordFields = nil; if (!displayName) { if (activeUserIsOwner) - displayName = [self _displayNameFromOwner]; + displayName = (NSMutableString *)[self _displayNameFromOwner]; else { - displayName = [self _displayNameFromSubscriber]; + displayName = (NSMutableString *)[self _displayNameFromSubscriber]; if (!displayName) - displayName = [self _displayNameFromOwner]; + displayName = (NSMutableString *)[self _displayNameFromOwner]; } [displayName retain]; } @@ -852,7 +852,7 @@ static NSArray *childRecordFields = nil; { currentID = [ids objectAtIndex: count]; names = [[currentID componentsSeparatedByString: @"/"] objectEnumerator]; - deleteObject = self; + deleteObject = (SOGoContentObject *)self; while ((currentName = [names nextObject])) { deleteObject = [deleteObject lookupName: currentName diff --git a/SoObjects/SOGo/SOGoGroup.m b/SoObjects/SOGo/SOGoGroup.m index cacdd7770..c72095fb6 100644 --- a/SoObjects/SOGo/SOGoGroup.m +++ b/SoObjects/SOGo/SOGoGroup.m @@ -135,7 +135,7 @@ { NSArray *allSources; NGLdapEntry *entry; - NSObject *source; + NSObject *source; id o; NSEnumerator *gclasses; NSString *gclass; @@ -154,7 +154,7 @@ for (i = 0; i < [allSources count]; i++) { - source = [[SOGoUserManager sharedUserManager] sourceWithID: [allSources objectAtIndex: i]]; + source = (NSObject *) [[SOGoUserManager sharedUserManager] sourceWithID: [allSources objectAtIndex: i]]; // Our different sources might not all implements groups support if ([source respondsToSelector: theSelector]) diff --git a/SoObjects/SOGo/SOGoObject.m b/SoObjects/SOGo/SOGoObject.m index df5bc6afc..a6c2e16b0 100644 --- a/SoObjects/SOGo/SOGoObject.m +++ b/SoObjects/SOGo/SOGoObject.m @@ -1069,7 +1069,7 @@ [_ms appendFormat:@" name=%@", nameInContainer]; if (container) [_ms appendFormat:@" container=0x%08X/%@", - container, [container valueForKey:@"nameInContainer"]]; + (unsigned int)container, [container valueForKey:@"nameInContainer"]]; } - (NSString *) description @@ -1077,7 +1077,7 @@ NSMutableString *ms; ms = [NSMutableString stringWithCapacity:64]; - [ms appendFormat:@"<0x%08X[%@]:", self, NSStringFromClass([self class])]; + [ms appendFormat:@"<0x%08X[%@]:", (unsigned int) self, NSStringFromClass([self class])]; [self appendAttributesToDescription:ms]; [ms appendString:@">"]; @@ -1087,7 +1087,7 @@ - (NSString *) loggingPrefix { return [NSString stringWithFormat:@"<0x%08X[%@]:%@>", - self, NSStringFromClass([self class]), + (unsigned int) self, NSStringFromClass([self class]), [self nameInContainer]]; } diff --git a/SoObjects/SOGo/SOGoParentFolder.m b/SoObjects/SOGo/SOGoParentFolder.m index 501f90f9f..eb454dc97 100644 --- a/SoObjects/SOGo/SOGoParentFolder.m +++ b/SoObjects/SOGo/SOGoParentFolder.m @@ -433,7 +433,7 @@ static SoSecurityManager *sm = nil; error = [self appendPersonalSources]; if (!error) if ([self respondsToSelector:@selector(appendCollectedSources)]) - error = [self appendCollectedSources]; + error = [self performSelector:@selector(appendCollectedSources)]; if (!error) error = [self appendSystemSources]; // TODO : Not really a testcase, see function if (error) diff --git a/SoObjects/SOGo/SQLSource.m b/SoObjects/SOGo/SQLSource.m index aa881b9d3..2e117f54d 100644 --- a/SoObjects/SOGo/SQLSource.m +++ b/SoObjects/SOGo/SQLSource.m @@ -880,7 +880,7 @@ reason = [NSString stringWithFormat: @"method '%@' is not available" @" for class '%@'", NSStringFromSelector (_cmd), - NSStringFromClass (isa)]; + NSStringFromClass (object_getClass(self))]; return [NSException exceptionWithName: @"SQLSourceIOException" reason: reason @@ -893,7 +893,7 @@ reason = [NSString stringWithFormat: @"method '%@' is not available" @" for class '%@'", NSStringFromSelector (_cmd), - NSStringFromClass (isa)]; + NSStringFromClass (object_getClass(self))]; return [NSException exceptionWithName: @"SQLSourceIOException" reason: reason @@ -906,7 +906,7 @@ reason = [NSString stringWithFormat: @"method '%@' is not available" @" for class '%@'", NSStringFromSelector (_cmd), - NSStringFromClass (isa)]; + NSStringFromClass (object_getClass(self))]; return [NSException exceptionWithName: @"SQLSourceIOException" reason: reason @@ -932,7 +932,7 @@ reason = [NSString stringWithFormat: @"method '%@' is not available" @" for class '%@'", NSStringFromSelector (_cmd), - NSStringFromClass (isa)]; + NSStringFromClass (object_getClass(self))]; return [NSException exceptionWithName: @"SQLSourceIOException" reason: reason @@ -947,7 +947,7 @@ reason = [NSString stringWithFormat: @"method '%@' is not available" @" for class '%@'", NSStringFromSelector (_cmd), - NSStringFromClass (isa)]; + NSStringFromClass (object_getClass(self))]; return [NSException exceptionWithName: @"SQLSourceIOException" reason: reason @@ -961,7 +961,7 @@ reason = [NSString stringWithFormat: @"method '%@' is not available" @" for class '%@'", NSStringFromSelector (_cmd), - NSStringFromClass (isa)]; + NSStringFromClass (object_getClass(self))]; return [NSException exceptionWithName: @"SQLSourceIOException" reason: reason diff --git a/SoObjects/SOGo/WORequest+SOGo.m b/SoObjects/SOGo/WORequest+SOGo.m index f528343dd..d7c750b65 100644 --- a/SoObjects/SOGo/WORequest+SOGo.m +++ b/SoObjects/SOGo/WORequest+SOGo.m @@ -180,14 +180,21 @@ cc = [self clientCapabilities]; b = ( - [[cc userAgent] rangeOfString: @"CFNetwork"].location != NSNotFound - && [[cc userAgent] rangeOfString: @"Darwin"].location != NSNotFound - || ( - [[cc userAgent] rangeOfString: @"CFNetwork"].location != NSNotFound - || [[cc userAgent] rangeOfString: @"Mac OS X"].location != NSNotFound - ) - && [[cc userAgent] rangeOfString: @"AddressBook"].location != NSNotFound - ); + ( + [[cc userAgent] rangeOfString: @"CFNetwork"].location != NSNotFound + && [[cc userAgent] rangeOfString: @"Darwin"].location != NSNotFound + ) + || + ( + [[cc userAgent] rangeOfString: @"CFNetwork"].location != NSNotFound + && [[cc userAgent] rangeOfString: @"AddressBook"].location != NSNotFound + ) + || + ( + [[cc userAgent] rangeOfString: @"Mac OS X"].location != NSNotFound + && [[cc userAgent] rangeOfString: @"AddressBook"].location != NSNotFound + ) + ); return b; } diff --git a/Tests/Integration/preferences.py b/Tests/Integration/preferences.py index e8d715a9a..3bab30cb4 100644 --- a/Tests/Integration/preferences.py +++ b/Tests/Integration/preferences.py @@ -12,7 +12,7 @@ import sogoLogin # this should probably be fetched magically... SOGoSupportedLanguages = [ "Arabic", "Basque", "Catalan", "ChineseTaiwan", "Czech", "Dutch", "Danish", "Welsh", "English", "Finnish", "SpanishSpain", "SpanishArgentina", "French", "German", - "Icelandic", "Italian", "Hungarian", "BrazilianPortuguese", + "Icelandic", "Italian", "Macedonian", "Hungarian", "Portuguese", "BrazilianPortuguese", "NorwegianBokmal", "NorwegianNynorsk", "Polish", "Russian", "Slovak", "Slovenian", "Ukrainian", "Swedish" ]; daysBetweenResponseList=[1,2,3,5,7,14,21,30] diff --git a/Tests/Unit/GNUmakefile b/Tests/Unit/GNUmakefile index 70f3ff242..b3b666270 100644 --- a/Tests/Unit/GNUmakefile +++ b/Tests/Unit/GNUmakefile @@ -27,7 +27,8 @@ $(TEST_TOOL)_OBJC_FILES += \ TestNSData+Crypto.m \ TestNSString+Crypto.m \ TestNSString+URLEscaping.m \ - TestNSString+Utilities.m + TestNSString+Utilities.m \ + TestNGMailAddressParser.m TEST_TOOL_NAME = $(TEST_TOOL) diff --git a/Tests/Unit/SOGoTest.m b/Tests/Unit/SOGoTest.m index ddee98f30..48dafb17c 100644 --- a/Tests/Unit/SOGoTest.m +++ b/Tests/Unit/SOGoTest.m @@ -245,10 +245,10 @@ NSString *_stringForCharacterAtIndex(NSUInteger index, NSString *str, NSUInteger sc2 = _stringForCharacterAtIndex(i, str2, length2); if ([sc1 isEqualToString: sc2]) - finalSTR = [finalSTR stringByAppendingFormat: @"%u |%@|\n", i, sc1]; + finalSTR = [finalSTR stringByAppendingFormat: @"%lu |%@|\n", i, sc1]; else { - finalSTR = [finalSTR stringByAppendingFormat: @"%u |%@|%@|<--\n", i, sc1, sc2]; + finalSTR = [finalSTR stringByAppendingFormat: @"%lu |%@|%@|<--\n", i, sc1, sc2]; differencesFound = YES; } } diff --git a/Tests/Unit/TestNGMailAddressParser.m b/Tests/Unit/TestNGMailAddressParser.m new file mode 100644 index 000000000..e5118e464 --- /dev/null +++ b/Tests/Unit/TestNGMailAddressParser.m @@ -0,0 +1,129 @@ +/* TestNGMailAddressParser.m - this file is part of SOGo + * + * Copyright (C) 2015 Inverse inc. + * + * 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 "SOGoTest.h" + +@interface TestNGMailAddressParser : SOGoTest +@end + +@implementation TestNGMailAddressParser + +/* important: this file must be encoded in iso-8859-1, due to issues with the + objc compiler */ +- (void) test_singleEmailParsing_value_ +{ + NSArray *rawAddresses = [NSArray arrayWithObjects: + @"johndown@test.com", // email alone + @"", // email between brackets + @"\"\" ", // doubled +// @"\"johndown@inverse.ca\" ", // with and without br. + @"=?utf-8?q?=C3=80=C3=B1in=C3=A9oblabla?= ", // accented full name + @"=?utf-8?q?=C3=80=C3=B1in=C3=A9oblabla_Bla_Bl=C3=A9?= ", // accented and multiword + @"John Down \"Bla Bla\" ", // partly quoted + @"John Down ", // full name + email + @"John, Down ", // full name with comma + email + @"john", // name only, no domain + nil ]; + NSArray *expectedAddresses = [NSArray arrayWithObjects: + @"johndown@test.com", // email alone + @"johndown@test.com", // email between brackets + @"johndown@test.com", // doubled +// @"\"johndown@inverse.ca\" ", // with and without br. + @"johndown@test.com", // accented full name + @"johndown@test.com", // accented + // and multiword + + /* NOTE: the following are wrong but tolerated for now */ + @"johndown@test.com", // partly quoted + @"johndown@test.com", // full name + email + @"johndown@test.com", // full name with comma + email + @"john", // name only, no domain + nil ]; + NSString *rawAddress, *currentExp, *result, *error; + NGMailAddressParser *parser; + NGMailAddress *parsedRecipient; + + int count = 0; + for (count = 0; count < [rawAddresses count]; count++) + { + rawAddress = [rawAddresses objectAtIndex:count]; + currentExp = [expectedAddresses objectAtIndex:count]; + parser = [NGMailAddressParser mailAddressParserWithString: rawAddress]; + parsedRecipient = [parser parse]; + result = [parsedRecipient address]; + error = [NSString + stringWithFormat: @"received '%@' instead of '%@' for '%@'", + result, currentExp, rawAddress]; + testWithMessage([result isEqualToString: currentExp], error); + } +} + +- (void) test_multipleEmailParsing_value_ +{ + NSArray *rawAddresses = [NSArray arrayWithObjects: + @"johndown@test.com", // email alone + @"test1a@test.com, test1b@here.now", + @"\"johndown@inverse.ca\" ", // with and without br. + @"John One , John Two ", // TWO full names + email + @"Three, John , Four, John ", // TWO full names with comma + email + @"john, down", // Two partial names + @"Three A , Three B , Three C ", // Three mails + nil ]; + NSArray *expectedAddresses = [NSArray arrayWithObjects: + [NSArray arrayWithObjects: @"johndown@test.com", nil], // email alone + [NSArray arrayWithObjects: @"test1a@test.com", @"test1b@here.now", nil], // test1 a/b + [NSArray arrayWithObjects: @"johndown@test.com", nil], // with and without br. + [NSArray arrayWithObjects: @"test2a@test.com", @"test2b@here.now", nil], // test2 a/b + [NSArray arrayWithObjects: @"test3a@test.com", @"test3b@here.now", nil], // test3 a/b + [NSArray arrayWithObjects: @"john", @"down", nil], + [NSArray arrayWithObjects: @"threea@test.com", @"threeb@test.com", @"threec@test.com", nil], // test a/b/c + nil ]; + NSString *currentRaw, *currentExp, *result, *error; + NGMailAddressParser *parser = nil; + NSArray *parsedRecipients = nil; + NSArray *expectedRecipients = nil; + NGMailAddress *parsedRecipient = nil; + + int count = 0; + for (count = 0; count < [rawAddresses count]; count++) + { + currentRaw = [rawAddresses objectAtIndex: count]; + expectedRecipients = [expectedAddresses objectAtIndex: count]; + parser = [NGMailAddressParser mailAddressParserWithString: currentRaw]; + parsedRecipients = [parser parseAddressList]; + int innercount; + for (innercount = 0; innercount < [parsedRecipients count]; innercount++) + { + parsedRecipient = [parsedRecipients objectAtIndex:innercount]; + result = [parsedRecipient address]; + currentExp = [expectedRecipients objectAtIndex:innercount]; + error = [NSString + stringWithFormat: @"received '%@' instead of '%@' for '%@'", + result, currentExp, currentRaw]; + testWithMessage([result isEqualToString: currentExp], error); + } + + } +} +@end + diff --git a/Tests/Unit/TestNGMimeAddressHeaderFieldGenerator.m b/Tests/Unit/TestNGMimeAddressHeaderFieldGenerator.m index 3a5fe5fdf..ef34ae149 100644 --- a/Tests/Unit/TestNGMimeAddressHeaderFieldGenerator.m +++ b/Tests/Unit/TestNGMimeAddressHeaderFieldGenerator.m @@ -39,8 +39,8 @@ @"", // email between brackets @"\"\" ", // doubled @"\"wolfgang@inverse.ca\" ", // with and without br. - @"Àñinéoblabla ", // accented full name - @"Àñinéoblabla Bla Blé ", // accented and multiword + @"=?utf-8?q?=C3=80=C3=B1in=C3=A9oblabla?= ", // accented full name + @"=?utf-8?q?=C3=80=C3=B1in=C3=A9oblabla_Bla_Bl=C3=A9?= ", // accented and multiword @"Wolfgang Sourdeau \"Bla Bla\" ", // partly quoted @"Wolfgang Sourdeau ", // full name + email nil }; @@ -50,8 +50,7 @@ @"\"\" ", // doubled @"\"wolfgang@inverse.ca\" ", // with and without br. @"=?utf-8?q?=C3=80=C3=B1in=C3=A9oblabla?= ", // accented full name - @"=?utf-8?q?=C3=80=C3=B1in=C3=A9oblabla_Bla_Bl=C3=A9?= ", // accented - // and multiword + @"=?utf-8?q?=C3=80=C3=B1in=C3=A9oblabla_Bla_Bl=C3=A9?= ", // accented and multiword /* NOTE: the following are wrong but tolerated for now */ @"Wolfgang Sourdeau \"Bla Bla\" ", // partly quoted diff --git a/Tests/Unit/TestNGMimeMessageGenerator.m b/Tests/Unit/TestNGMimeMessageGenerator.m index 51b4e4745..f440bda97 100644 --- a/Tests/Unit/TestNGMimeMessageGenerator.m +++ b/Tests/Unit/TestNGMimeMessageGenerator.m @@ -117,7 +117,7 @@ NSString *diff = [self stringFromDiffBetween: [NSString stringWithString: resultString] and: [NSString stringWithString: expected]]; NSString *testErrorMsg = [NSString - stringWithFormat: @">> For %@ header received:\n%@[END]\n>> instead of:\n%@[END]\n>> for:\n%@\n>> diff:\n%@\n>> lengthReceived: %u lengthExpected: %u", + stringWithFormat: @">> For %@ header received:\n%@[END]\n>> instead of:\n%@[END]\n>> for:\n%@\n>> diff:\n%@\n>> lengthReceived: %lu lengthExpected: %lu", header, resultString, expected, diff --git a/Tests/Unit/TestVersit.m b/Tests/Unit/TestVersit.m index 92ddf02bb..e09dce49f 100644 --- a/Tests/Unit/TestVersit.m +++ b/Tests/Unit/TestVersit.m @@ -34,6 +34,10 @@ - (void) test_rendering { + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wobjc-string-compare" + CardElement *element; CardVersitRenderer *renderer; NSString *result; @@ -137,10 +141,17 @@ testEquals(result, @"ELEM:NONEMPTY=coucou\r\n"); /** tests about parameters handling could be nice */ + +#pragma clang diagnostic pop + } - (void) test_parsing { + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wobjc-string-compare" + CardGroup *group; CardElement *element; NSString *versit; @@ -201,6 +212,9 @@ element = [group firstChildWithTag: @"element"]; testEquals([element flattenedValueAtIndex: 0 forKey: @""], @"value"); testEquals([element value: 0 ofAttribute: @"param1"], @"paramvalue1, with comma"); + +#pragma clang diagnostic pop + } @end diff --git a/Tests/Unit/TestiCalRecurrenceCalculator.m b/Tests/Unit/TestiCalRecurrenceCalculator.m index dcd9529d9..ae1d34f3d 100644 --- a/Tests/Unit/TestiCalRecurrenceCalculator.m +++ b/Tests/Unit/TestiCalRecurrenceCalculator.m @@ -107,7 +107,7 @@ [currentOccurrence descriptionWithCalendarFormat: dateFormat]]; testWithMessage([currentOccurrence isDateOnSameDay: [[occurrences objectAtIndex: j] startDate]], error); } - error = [NSString stringWithFormat: @"Unexpected number of occurrences for recurrence rule %@ (found %i, expected %i)", + error = [NSString stringWithFormat: @"Unexpected number of occurrences for recurrence rule %@ (found %ld, expected %ld)", [currentRule objectAtIndex: 1], [occurrences count], [currentRule count] - 2]; @@ -211,7 +211,7 @@ [currentOccurrence descriptionWithCalendarFormat: dateFormat]]; testWithMessage([currentOccurrence isDateOnSameDay: [[occurrences objectAtIndex: j] startDate]], error); } - error = [NSString stringWithFormat: @"Unexpected number of occurrences for recurrence rule %@ (found %i, expected %i)", + error = [NSString stringWithFormat: @"Unexpected number of occurrences for recurrence rule %@ (found %ld, expected %ld)", [currentRule objectAtIndex: 1], [occurrences count], [currentRule count] - 2]; @@ -376,7 +376,7 @@ [currentOccurrence descriptionWithCalendarFormat: dateFormat]]; testWithMessage([currentOccurrence isDateOnSameDay: [[occurrences objectAtIndex: j] startDate]], error); } - error = [NSString stringWithFormat: @"Unexpected number of occurrences for recurrence rule %@ (found %i, expected %i)", + error = [NSString stringWithFormat: @"Unexpected number of occurrences for recurrence rule %@ (found %ld, expected %ld)", [currentRule objectAtIndex: 1], [occurrences count], [currentRule count] - 2]; diff --git a/Tests/Unit/TestiCalTimeZonePeriod.m b/Tests/Unit/TestiCalTimeZonePeriod.m index 02325e9bc..b6eb1b1b7 100644 --- a/Tests/Unit/TestiCalTimeZonePeriod.m +++ b/Tests/Unit/TestiCalTimeZonePeriod.m @@ -80,8 +80,8 @@ testWithMessage ((NSInteger) [testDate timeIntervalSince1970] == occurrenceSeconds[count], ([NSString stringWithFormat: - @"test %d: seconds do not match:" - @" delta = %d", count, delta])); + @"test %ld: seconds do not match:" + @" delta = %ld", count, delta])); } } diff --git a/Tools/SOGoEAlarmsNotifier.m b/Tools/SOGoEAlarmsNotifier.m index ad8cc8f7a..382e25675 100644 --- a/Tools/SOGoEAlarmsNotifier.m +++ b/Tools/SOGoEAlarmsNotifier.m @@ -81,8 +81,8 @@ timestamp = (int) [[NSDate date] timeIntervalSince1970]; pGUID = [[NSProcessInfo processInfo] globallyUniqueString]; - messageID = [NSString stringWithFormat: @"<%0X-%0X-%0X-%0X@%u>", - pid, timestamp, sequence, random(), [pGUID hash]]; + messageID = [NSString stringWithFormat: @"<%0X-%0X-%0X-%0X@%lu>", + pid, timestamp, sequence, (unsigned int)random(), [pGUID hash]]; return [messageID lowercaseString]; } diff --git a/Tools/SOGoSockDOperation.m b/Tools/SOGoSockDOperation.m index c3604b865..56cae6b35 100644 --- a/Tools/SOGoSockDOperation.m +++ b/Tools/SOGoSockDOperation.m @@ -145,7 +145,7 @@ Class SOGoContactSourceFolderKlass = Nil; [self _appendEntry: [resultEntries objectAtIndex: count] toResult: result]; - [result appendFormat: @"RESULT\ncode: %", resultCode]; + [result appendFormat: @"RESULT\ncode: %d", resultCode]; [responseSocket safeWriteData: [result dataUsingEncoding: NSASCIIStringEncoding]]; } diff --git a/Tools/SOGoToolCreateFolder.m b/Tools/SOGoToolCreateFolder.m index 423ec7266..2eba46e8b 100644 --- a/Tools/SOGoToolCreateFolder.m +++ b/Tools/SOGoToolCreateFolder.m @@ -97,7 +97,7 @@ rc = [self createFolder: folder withFM: fm]; if (!rc) { - NSLog (@"Create directory failed at path %s", folder); + NSLog (@"Create directory failed at path %@", folder); return NO; } diff --git a/Tools/SOGoToolExpireUserSessions.m b/Tools/SOGoToolExpireUserSessions.m index 98d40470e..dbe78d6d9 100644 --- a/Tools/SOGoToolExpireUserSessions.m +++ b/Tools/SOGoToolExpireUserSessions.m @@ -143,7 +143,7 @@ else { if (verbose) - NSLog(@"No session to remove", sessionsToDelete); + NSLog(@"No session to remove"); } [cm releaseChannel: channel]; diff --git a/Tools/SOGoToolManageEAS.m b/Tools/SOGoToolManageEAS.m index 0e01da733..115f49eb6 100644 --- a/Tools/SOGoToolManageEAS.m +++ b/Tools/SOGoToolManageEAS.m @@ -227,7 +227,7 @@ typedef enum NSMutableString *sql; - sql = [NSMutableString stringWithFormat: @"DELETE FROM %@" @" WHERE c_path like '/%@%'", [oc tableName], deviceId]; + sql = [NSMutableString stringWithFormat: @"DELETE FROM %@ WHERE c_path like '/%@'", [oc tableName], deviceId]; [oc performBatchSQLQueries: [NSArray arrayWithObject: sql]]; rc = YES; diff --git a/Tools/SOGoToolRemoveDoubles.m b/Tools/SOGoToolRemoveDoubles.m index c26254a6a..4d6a36115 100644 --- a/Tools/SOGoToolRemoveDoubles.m +++ b/Tools/SOGoToolRemoveDoubles.m @@ -175,7 +175,7 @@ now = [NSCalendarDate date]; delSql = [NSString stringWithFormat: @"UPDATE %@" - @" SET c_deleted = 1, c_lastmodified = %d," + @" SET c_deleted = 1, c_lastmodified = %lu," @" c_content = ''" @" WHERE c_name = '%@'", tableName, diff --git a/Tools/SOGoToolRenameUser.m b/Tools/SOGoToolRenameUser.m index 937424d76..cf260134e 100644 --- a/Tools/SOGoToolRenameUser.m +++ b/Tools/SOGoToolRenameUser.m @@ -148,7 +148,7 @@ if (sqlError) { [ac rollbackTransaction]; - NSLog([sqlError reason]); + NSLog(@"%@", [sqlError reason]); } else rc = [ac commitTransaction]; @@ -201,7 +201,7 @@ if (sqlError) { [ac rollbackTransaction]; - NSLog([sqlError reason]); + NSLog(@"%@", [sqlError reason]); } else rc = [ac commitTransaction]; diff --git a/Tools/SOGoToolRestore.m b/Tools/SOGoToolRestore.m index 712c680ba..5f1527cc8 100644 --- a/Tools/SOGoToolRestore.m +++ b/Tools/SOGoToolRestore.m @@ -574,6 +574,7 @@ NSLog (@" %@ (%@)", folderKey, [currentFolder objectForKey: @"displayname"]); } + rc = YES; } else { diff --git a/Tools/SOGoToolUserPreferences.m b/Tools/SOGoToolUserPreferences.m index 4f981cb4f..a51505f53 100644 --- a/Tools/SOGoToolUserPreferences.m +++ b/Tools/SOGoToolUserPreferences.m @@ -115,7 +115,7 @@ typedef enum [theKey caseInsensitiveCompare: @"Vacation"] == NSOrderedSame) { /* credentials file handling */ - NSString *credsFilename, *authname, *authpwd; + NSString *credsFilename, *authname=nil, *authpwd=nil; SOGoCredentialsFile *cf; credsFilename = [[NSUserDefaults standardUserDefaults] stringForKey: @"p"]; diff --git a/Tools/sogo-tool.m b/Tools/sogo-tool.m index bc4755416..85c87d528 100644 --- a/Tools/sogo-tool.m +++ b/Tools/sogo-tool.m @@ -149,7 +149,7 @@ command, [currentTool objectAtIndex: 1]]; } - NSLog (helpString); + NSLog (@"%@", helpString); } - (void) registerTools diff --git a/UI/AdministrationUI/GNUmakefile b/UI/AdministrationUI/GNUmakefile index 450973525..0bb4829d4 100644 --- a/UI/AdministrationUI/GNUmakefile +++ b/UI/AdministrationUI/GNUmakefile @@ -6,7 +6,7 @@ BUNDLE_NAME = AdministrationUI AdministrationUI_PRINCIPAL_CLASS = AdministrationUIProduct -AdministrationUI_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan ChineseTaiwan Czech Danish Dutch English Finnish French German Hungarian Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak Slovenian SpanishSpain SpanishArgentina Swedish Ukrainian Welsh +AdministrationUI_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan ChineseTaiwan Czech Danish Dutch English Finnish French German Hungarian Italian Macedonian NorwegianBokmal NorwegianNynorsk Polish Portuguese Russian Slovak Slovenian SpanishSpain SpanishArgentina Swedish Ukrainian Welsh AdministrationUI_OBJC_FILES = \ AdministrationUIProduct.m \ diff --git a/UI/AdministrationUI/Macedonian.lproj/Localizable.strings b/UI/AdministrationUI/Macedonian.lproj/Localizable.strings new file mode 100644 index 000000000..56e617650 --- /dev/null +++ b/UI/AdministrationUI/Macedonian.lproj/Localizable.strings @@ -0,0 +1,15 @@ +/* this file is in UTF-8 format! */ + +"Help" = "Помош"; +"Close" = "Затвори"; + +"Modules" = "Модули"; + +/* Modules short names */ +"ACLs" = "КПЛа"; + +/* Modules titles */ +"ACLs_title" = "Управување Ñо КПЛа за кориÑнички папки"; + +/* Modules descriptions */ +"ACLs_description" = "

Модулот за админиÑтрацијата на контролните приÑтапни лиÑти овозможува да Ñе променат КПЛ на Ñекој кориÑнички календар и адреÑна книга.

Да Ñе промени КПЛа на кориÑничка папка, откуцај го името на кориÑникот во полето за пребарување на врвот од прозорецот и двојно кликни на поÑакуваната папка.

"; diff --git a/UI/AdministrationUI/Portuguese.lproj/Localizable.strings b/UI/AdministrationUI/Portuguese.lproj/Localizable.strings new file mode 100644 index 000000000..77b5d071e --- /dev/null +++ b/UI/AdministrationUI/Portuguese.lproj/Localizable.strings @@ -0,0 +1,15 @@ +/* this file is in UTF-8 format! */ + +"Help" = "Ajuda"; +"Close" = "Fechar"; + +"Modules" = "Módulos"; + +/* Modules short names */ +"ACLs" = "ACLs"; + +/* Modules titles */ +"ACLs_title" = "Gerenciamento de ACLs para Utilizadores"; + +/* Modules descriptions */ +"ACLs_description" = "

O módulo administrativo das Listas de Controlo de Acessos permitem alterar os ACLs de Calendário e Contactos de cada utilizador.

Para modificar as ACLs do utilizador, digite o nome no campo de pesquisa, no topo da janela e dê um duplo-click na opção desejada.

"; diff --git a/UI/AdministrationUI/Slovenian.lproj/Localizable.strings b/UI/AdministrationUI/Slovenian.lproj/Localizable.strings index ca15c0653..5269c464e 100644 --- a/UI/AdministrationUI/Slovenian.lproj/Localizable.strings +++ b/UI/AdministrationUI/Slovenian.lproj/Localizable.strings @@ -9,7 +9,7 @@ "ACLs" = "ACLi"; /* Modules titles */ -"ACLs_title" = "Urejanje uporabniških map ACL"; +"ACLs_title" = "Urejanje uporabniških pravic na mapah"; /* 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/GNUmakefile b/UI/Common/GNUmakefile index 4f03c40fd..fda8cba2a 100644 --- a/UI/Common/GNUmakefile +++ b/UI/Common/GNUmakefile @@ -6,7 +6,7 @@ BUNDLE_NAME = CommonUI CommonUI_PRINCIPAL_CLASS = CommonUIProduct -CommonUI_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan ChineseTaiwan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak Slovenian SpanishSpain SpanishArgentina Swedish Ukrainian Welsh +CommonUI_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan ChineseTaiwan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian Macedonian NorwegianBokmal NorwegianNynorsk Polish Portuguese Russian Slovak Slovenian SpanishSpain SpanishArgentina Swedish Ukrainian Welsh CommonUI_OBJC_FILES += \ CommonUIProduct.m \ diff --git a/UI/Common/Macedonian.lproj/Localizable.strings b/UI/Common/Macedonian.lproj/Localizable.strings new file mode 100644 index 000000000..43110896f --- /dev/null +++ b/UI/Common/Macedonian.lproj/Localizable.strings @@ -0,0 +1,118 @@ +/* this file is in UTF-8 format! */ + +/* toolbars */ +"Save" = "Сними"; +"Close" = "Затвори"; +"Edit User Rights" = "Уреди ги кориÑничките права"; + +"Home" = "Дома"; +"Calendar" = "Календар"; +"Address Book" = "ÐдреÑна книга"; +"Mail" = "ЕлектронÑка пошта"; +"Preferences" = "ПодеÑувања"; +"Administration" = "ÐдминиÑтрација"; +"Disconnect" = "Откачи"; +"Right Administration" = "ÐдминиÑтрација на права"; +"Log Console (dev.)" = "Конзола на логови (развој)"; + +"User" = "КориÑник"; +"Vacation message is enabled" = "Пораката за отÑатноÑÑ‚ е активна"; + +"Help" = "Помош"; + +"noJavascriptError" = "SOGo бара Javascript за да работи. Бидете Ñигурни дека оваа поција е овозможена и активирана во вашиот прелиÑтувач."; +"noJavascriptRetry" = "Обиди Ñе повторно"; + +"Owner:" = "СопÑтвеник:"; +"Publish the Free/Busy information" = "Публикувај ја информацијата за Ñлободното/зафатено време"; + +"Add..." = "Додади..."; +"Remove" = "ОтÑтрани"; + +"Subscribe User" = "Запиши го кориÑникот"; + +"Any Authenticated User" = "Било кој автентициран кориÑник"; +"Public Access" = "јавен доÑтап"; +"Any user not listed above" = "Било кој кориÑник кој не долу излиÑтан"; +"Anybody accessing this resource from the public area" = "Било кој може да го приÑтапи реÑурÑот од јавната мрежа"; + +"Sorry, the user rights can not be configured for that object." = "Жалам, кориÑничките привилегии не можат да Ñе конфигурираат за овој објект."; + +"Any user with an account on this system will be able to access your mailbox \"%{0}\". Are you certain you trust them all?" + = "Секој кориÑник Ñо Ñметка на овој ÑиÑтем ќе биде во можноÑÑ‚ да приÑтапува на вашето Ñандаче за пошта \"%{0}\". Дали Ñте Ñигурни дека можете да им верувате на Ñите?"; +"Any user with an account on this system will be able to access your calendar \"%{0}\". Are you certain you trust them all?" + = "Било кој кориÑник Ñо Ñметка на овој ÑиÑтем че биде во можноÑÑ‚ да го приÑтапи вашиот календар \"%{0}\". дали Ñте Ñигурни дека можете да им верувате на Ñите?"; +"Potentially anyone on the Internet will be able to access your calendar \"%{0}\", even if they do not have an account on this system. Is this information suitable for the public Internet?" + = "Потенцијално Ñекој на интернет ќе може да го приÑтапи вашиот календар \"%{0}\", иако немаат Ñметка на овој ÑиÑтем. Дали оваа информација е погодна за јавен интернет?"; +"Any user with an account on this system will be able to access your address book \"%{0}\". Are you certain you trust them all?" + = "Секој кориÑник Ñо Ñметка на овој ÑиÑтем ќе биде во можноÑÑ‚ да приÑтапува на вашиот ÑдреÑар \"%{0}\". дали Ñте Ñигурни дека можете да им верувате на Ñите?"; +"Potentially anyone on the Internet will be able to access your address book \"%{0}\", even if they do not have an account on this system. Is this information suitable for the public Internet?" + = "Потенцијално било кој на интеернет ќе може да го доÑтапи адреÑарот \"%{0}\", дури и ако нема Ñметка на ÑиÑтемот. Дали оваа информација е погодна за јавен интернет?"; +"Give Access" = "Дади приÑтап"; +"Keep Private" = "Сочувај го приватно"; + +/* generic.js */ +"Unable to subscribe to that folder!" + = "Ðе е можно да Ñе претплатите на оваа папка!"; +"You cannot subscribe to a folder that you own!" + = "Ðе можете да Ñе претплатите на папката која е ваша!"; +"Unable to unsubscribe from that folder!" + = "Ðе е можно да Ñе отпишете од папката!"; +"You cannot unsubscribe from a folder that you own!" + = "Ðе е можно да Ñе отпишете од папката која е ваша!"; +"Unable to rename that folder!" = "Ðе е можно да ја преименувате папката!"; +"You have already subscribed to that folder!" + = "Веќе Ñте претплатени на папката!"; +"The user rights cannot be edited for this object!" + = "КориÑничките права не можат да Ñе уредат на овој објект!"; +"A folder by that name already exists." = "Папка Ñо вакво име веќе поÑтои."; +"You cannot create a list in a shared address book." + = "Ðе можете да креирате лиÑта во Ñподелен адреÑар."; +"Warning" = "Предупредување"; +"Can't contact server" = "ÐаÑтана грешка при контактирање на Ñерверот. Подоцна обидете Ñе повторно."; + +"You are not allowed to access this module or this system. Please contact your system administrator." += "Вам не вие дозволено да го приÑтапите овој модул или овој ÑиÑтем. Контактирајте го вашиот ÑиÑтем админиÑтратор."; +"You don't have the required privileges to perform the operation." += "Ги немате потребните привилегии за да ја извршите операцијата."; + +"noEmailForDelegation" = "Морате да ја Ñпецифицирате адреÑата на која Ñакате да ги делегирате вашите покани."; +"delegate is organizer" = "Делегираниот е и организатор. Ве молиме одберете друг делегат."; +"delegate is a participant" = "Овој делегат е веќе учеÑник."; +"delegate is a group" = "ÐдреÑата не коренÑпондира Ñо групата. Можете да делегирате на единÑтвена личноÑÑ‚."; + +"Snooze for " = "Паузирај го за"; +"5 minutes" = "5 минути"; +"10 minutes" = "10 минути"; +"15 minutes" = "15 минути"; +"30 minutes" = "30 минути"; +"45 minutes" = "45 минути"; +"1 hour" = "1 чаÑ"; +"1 day" = "1 ден"; + +/* common buttons */ +"OK" = "Во ред"; +"Cancel" = "Откажи"; +"Yes" = "Да"; +"No" = "Ðе"; + +/* alarms */ +"Reminder:" = "ПотÑетник:"; +"Start:" = "Почеток:"; +"Due Date:" = "Краен датум:"; +"Location:" = "Локација:"; + +/* mail labels */ +"Important" = "Важно"; +"Work" = "Работа"; +"Personal" = "Лично"; +"To Do" = "Да Ñе направи"; +"Later" = "Подоцна"; + +"a2_Sunday" = "Ðед"; +"a2_Monday" = "Пон"; +"a2_Tuesday" = "Вто"; +"a2_Wednesday" = "Сре"; +"a2_Thursday" = "Чет"; +"a2_Friday" = "Пет"; +"a2_Saturday" = "Саб"; diff --git a/UI/Common/Portuguese.lproj/Localizable.strings b/UI/Common/Portuguese.lproj/Localizable.strings new file mode 100644 index 000000000..1a78a4e6a --- /dev/null +++ b/UI/Common/Portuguese.lproj/Localizable.strings @@ -0,0 +1,118 @@ +/* this file is in UTF-8 format! */ + +/* toolbars */ +"Save" = "Gravar"; +"Close" = "Fechar"; +"Edit User Rights" = "Editar direitos do utilizador"; + +"Home" = "Início"; +"Calendar" = "Calendário"; +"Address Book" = "Contactos"; +"Mail" = "Correio"; +"Preferences" = "Preferências"; +"Administration" = "Administração"; +"Disconnect" = "Sair"; +"Right Administration" = "Administração de permissões"; +"Log Console (dev.)" = "Log Console (dev.)"; + +"User" = "Utilizador"; +"Vacation message is enabled" = "Mensagem de ausência está ativa"; + +"Help" = "Ajuda"; + +"noJavascriptError" = "SOGo requer Javascript para correr. Por favor, certifique-se que a opção está disponível e habilitada nas preferências de seu navegador."; +"noJavascriptRetry" = "Repetir"; + +"Owner:" = "Proprietário:"; +"Publish the Free/Busy information" = "Divulgar a informação Livre/Ocupado"; + +"Add..." = "Adicionar..."; +"Remove" = "Remover"; + +"Subscribe User" = "Utilizador Inscrito"; + +"Any Authenticated User" = "Qualquer Utilizador Autenticado"; +"Public Access" = "Acesso Público"; +"Any user not listed above" = "Qualquer utilizador não listado abaixo"; +"Anybody accessing this resource from the public area" = "Ninguém acedendo a este recurso de uma área pública"; + +"Sorry, the user rights can not be configured for that object." = "Desculpe, os accessos do utilizador não podem ser modificados para este objeto."; + +"Any user with an account on this system will be able to access your mailbox \"%{0}\". Are you certain you trust them all?" + = "Qualquer utilizador com uma conta neste sistema será capaz de aceder à sua caixa postal \"% {0}\". Tem a certeza que confia em todos?"; +"Any user with an account on this system will be able to access your calendar \"%{0}\". Are you certain you trust them all?" + = "Qualquer utilizador com uma conta neste sistema poderá aceder seu calendário \"%{0}\". Você tem certeza que confia em todos?"; +"Potentially anyone on the Internet will be able to access your calendar \"%{0}\", even if they do not have an account on this system. Is this information suitable for the public Internet?" + = "Qualquer um na Internet poderá aceder ao seu calendário \"%{0}\". Estas informações podem ser publicadas na Internet?"; +"Any user with an account on this system will be able to access your address book \"%{0}\". Are you certain you trust them all?" + = "Qualquer utilizador com uma conta neste sistema será capaz de aceder seu catálogo de endereços \"% {0}\". Tem a certeza que confia em todos?"; +"Potentially anyone on the Internet will be able to access your address book \"%{0}\", even if they do not have an account on this system. Is this information suitable for the public Internet?" + = "Qualquer pessoa na Internet será capaz de aceder ao seu catálogo de endereços \"% {0}\", mesmo se não tiver uma conta no sistema. Esta informação pode ser tornar pública na Internet?"; +"Give Access" = "Conceder Acesso"; +"Keep Private" = "Manter Privado"; + +/* generic.js */ +"Unable to subscribe to that folder!" + = "Não foi possível inscrever-se nesta pasta!"; +"You cannot subscribe to a folder that you own!" + = "Você não se pode inscrever numa pasta que é proprietário!"; +"Unable to unsubscribe from that folder!" + = "Não foi possível anular a subscrição desta pasta!"; +"You cannot unsubscribe from a folder that you own!" + = "Você não pode anular subscrição de uma pasta que você é proprietário!"; +"Unable to rename that folder!" = "Não foi possível renomear esta pasta!"; +"You have already subscribed to that folder!" + = "Você já se inscreveu nesta pasta!"; +"The user rights cannot be edited for this object!" + = "Os direitos do utilizador não podem ser editados para este objeto!"; +"A folder by that name already exists." = "Este nome já existe."; +"You cannot create a list in a shared address book." + = "Você não pode criar uma lista num catálogo de endereços público"; +"Warning" = "Aviso"; +"Can't contact server" = "Um erro ocorreu na ligação ao servidor. Por favor, tente mais tarde."; + +"You are not allowed to access this module or this system. Please contact your system administrator." += "Você não está autrizado para aceder a 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 necessários para realizar esta operação."; + +"noEmailForDelegation" = "Você deve informar o endereço ao qual deseja delegar seu convite."; +"delegate is organizer" = "O delegado é o organizador. Por favor, especifique um delegado diferente."; +"delegate is a participant" = "O delegado já é um participante."; +"delegate is a group" = "O endereço especificado corresponde a um grupo. Você só pode delegar a uma pessoa única."; + +"Snooze for " = "Uma pausa de"; +"5 minutes" = "5 minutos"; +"10 minutes" = "10 minutos"; +"15 minutes" = "15 minutos"; +"30 minutes" = "30 minutos"; +"45 minutes" = "45 minutos"; +"1 hour" = "1 hora"; +"1 day" = "1 dia"; + +/* common buttons */ +"OK" = "OK"; +"Cancel" = "Cancelar"; +"Yes" = "Sim"; +"No" = "No"; + +/* alarms */ +"Reminder:" = "Lembrete:"; +"Start:" = "Inicio:"; +"Due Date:" = "Data de vencimento:"; +"Location:" = "Localização:"; + +/* mail labels */ +"Important" = "Importante"; +"Work" = "Trabalho"; +"Personal" = "Pessoal"; +"To Do" = "A fazer"; +"Later" = "Adiar"; + +"a2_Sunday" = "Do"; +"a2_Monday" = "Se"; +"a2_Tuesday" = "Te"; +"a2_Wednesday" = "Qu"; +"a2_Thursday" = "Qu"; +"a2_Friday" = "Se"; +"a2_Saturday" = "Sa"; diff --git a/UI/Common/UIxToolbar.m b/UI/Common/UIxToolbar.m index b4376b311..3deda0ce5 100644 --- a/UI/Common/UIxToolbar.m +++ b/UI/Common/UIxToolbar.m @@ -166,7 +166,7 @@ [self errorWithFormat: @"not toolbar configuration found on SoObject: %@ (%@)", [self clientObject], [[self clientObject] soClass]]; - toolbarConfig = [[NSNull null] retain]; + toolbarConfig = (NSArray *)[[NSNull null] retain]; return nil; } diff --git a/UI/Common/WODirectAction+SOGo.m b/UI/Common/WODirectAction+SOGo.m index 805acbe8c..fada54f17 100644 --- a/UI/Common/WODirectAction+SOGo.m +++ b/UI/Common/WODirectAction+SOGo.m @@ -22,6 +22,7 @@ #import #import +#import #import #import @@ -33,6 +34,8 @@ #import #import +#import + #import "WODirectAction+SOGo.h" @implementation WODirectAction (SOGoExtension) diff --git a/UI/Contacts/GNUmakefile b/UI/Contacts/GNUmakefile index 01521a8bc..e386089d6 100644 --- a/UI/Contacts/GNUmakefile +++ b/UI/Contacts/GNUmakefile @@ -6,7 +6,7 @@ BUNDLE_NAME = ContactsUI ContactsUI_PRINCIPAL_CLASS = ContactsUIProduct -ContactsUI_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan ChineseTaiwan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak Slovenian SpanishSpain SpanishArgentina Swedish Ukrainian Welsh +ContactsUI_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan ChineseTaiwan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian Macedonian NorwegianBokmal NorwegianNynorsk Polish Portuguese Russian Slovak Slovenian SpanishSpain SpanishArgentina Swedish Ukrainian Welsh ContactsUI_OBJC_FILES = \ UIxContactsUserFolders.m \ diff --git a/UI/Contacts/Macedonian.lproj/Localizable.strings b/UI/Contacts/Macedonian.lproj/Localizable.strings new file mode 100644 index 000000000..b84658a31 --- /dev/null +++ b/UI/Contacts/Macedonian.lproj/Localizable.strings @@ -0,0 +1,215 @@ +/* this file is in UTF-8 format! */ + +"Contact" = "Контакт"; +"Address" = "ÐдреÑа"; +"Photos" = "Фотографија"; +"Other" = "ОÑтанато"; + +"Address Books" = "ÐдреÑари"; +"Addressbook" = "ÐдреÑар"; +"Addresses" = "ÐдреÑи"; +"Update" = "ОÑвежи"; +"Cancel" = "Откажи"; +"Common" = "Заеднички"; +"Contact editor" = "Уредувач на контакти"; +"Contact viewer" = "Прегледувач на контакти"; +"Email" = "ЕлектронÑка пошта"; +"Screen Name" = "Прекар"; +"Extended" = "Проширен"; +"Fax" = "ФакÑ"; +"Firstname" = "Име"; +"Home" = "Дома"; +"HomePhone" = "Домашен телефон"; +"Lastname" = "Презиме"; +"Location" = "Локација"; +"MobilePhone" = "Мобилен телефон"; +"Name" = "Име"; +"OfficePhone" = "Службен телефон"; +"Organization" = "Организација"; +"Work Phone" = "Телефон на работа"; +"Phone" = "Телефон"; +"Phones" = "Телефони"; +"Postal" = "ПоштенÑки број"; +"Save" = "Сними"; +"Internet" = "Интернет"; +"Unit" = "Одделение"; +"delete" = "избриши"; +"edit" = "уреди"; +"invalidemailwarn" = "Дотичната порака е невалидна"; +"new" = "нов"; +"Preferred Phone" = "Префериран телефонÑки број"; + +"Move To" = "Префрли во "; +"Copy To" = "Копирај во"; +"Add to:" = "Додади во:"; + +/* Tooltips */ + +"Create a new address book card" = "Креирај нова адеÑна картичка"; +"Create a new list" = "Креирај нова лиÑта"; +"Edit the selected card" = "Уреди ја одбраната картичка"; +"Send a mail message" = "ИÑпрати електронÑка порака"; +"Delete selected card or address book" = "Избриши ја одбраната картичка или адреÑна книга"; +"Reload all contacts" = "Повторно вчитај ги Ñите контакти"; + +"htmlMailFormat_UNKNOWN" = "Ðепознат"; +"htmlMailFormat_FALSE" = "Обичен текÑÑ‚"; +"htmlMailFormat_TRUE" = "HTML"; + +"Name or Email" = "Име или електронÑка адреÑа"; +"Category" = "Категорија"; +"Personal Addressbook" = "Личен адреÑар"; +"Search in Addressbook" = "Пребарај во адреÑарот"; + +"New Card" = "Ðова картичка"; +"New List" = "Ðова лиÑта"; +"Edit" = "Уреди"; +"Properties" = "ОÑобини..."; +"Sharing..." = "Делење..."; +"Write" = "Запиши"; +"Delete" = "Избриши"; +"Instant Message" = "ИнÑтантна порака"; +"Add..." = "Додади..."; +"Remove" = "Избриши"; + +"Please wait..." = "Ве молам почекајте..."; +"No possible subscription" = "Претплатата не е можна"; + +"Preferred" = "Преферирана"; +"Display" = "Прикажи"; +"Display Name:" = "Прикажи име:"; +"Email:" = "ЕлектронÑка адреÑа:"; +"Additional Email:" = "Дополнителна електронÑка адреÑа:"; + +"Phone Number:" = "ТелефонÑки број:"; +"Prefers to receive messages formatted as:" = "Претпочита да прима пораки форматирани како:"; +"Screen Name:" = "Прекар"; +"Categories:" = "Категории:"; + +"First:" = "Прв:"; +"Last:" = "ПоÑледен:"; +"Nickname" = "Прекар"; + +"Telephone" = "Телефон:"; +"Work:" = "Работа:"; +"Home:" = "Дома:"; +"Fax:" = "ФакÑ:"; +"Mobile:" = "Мобилен:"; +"Pager:" = "Пејџер:"; + +/* categories */ +"contacts_category_labels" = "Колега, конкурент, клиент, пријател, фамилија, деловен партнер, провајдер, новинар, ВИП"; +"Categories" = "Категории"; +"New category" = "Ðова категорија"; + +/* adresses */ +"Title:" = "ÐаÑлов:"; +"Service:" = "СервиÑ:"; +"Company:" = "Компанија:"; +"Department:" = "Сектор:"; +"Organization:" = "Организација:"; +"Address:" = "ÐдреÑа:"; +"City" = "Град"; +"State_Province:" = "Држава/провинција:"; +"ZIP_Postal Code:" = "ПоштенÑки број:"; +"Country" = "Земја"; +"Web Page:" = "Веб Ñтраница:"; + +"Work" = "Работа"; +"Other Infos" = "Други информации"; + +"Note" = "Забелешка"; +"Timezone:" = "ВременÑка зона:"; +"Birthday" = "Роденден"; +"Birthday (yyyy-mm-dd)" = "Роденден (гггг-мм-дд)"; +"Freebusy URL:" = "Слободно-зафатено URL:"; + +"Add as..." = "Додади како:"; +"Recipient" = "Примач"; +"Carbon Copy" = "Копија"; +"Blind Carbon Copy" = "Скриена копија"; + +"New Addressbook..." = "Ðов адреÑар"; +"Subscribe to an Addressbook..." = "Прептлати Ñе на адреÑарот..."; +"Remove the selected Addressbook" = "Избриши го избраниот адреÑар"; + +"Name of the Address Book" = "Име на адреÑарот"; +"Are you sure you want to delete the selected address book?" += "Дали Ñте Ñигурни дека Ñакате да го избришете адреÑарот?"; +"You cannot remove nor unsubscribe from a public addressbook." += "Ðеможете да го отÑтраните или отпишете од јавниот адреÑар."; +"You cannot remove nor unsubscribe from your personal addressbook." += "Ðе можете да Ñе изземете или отпишете од вашиот личен адреÑар."; + +"Are you sure you want to delete the selected contacts?" += "Дали Ñте Ñигурни дека Ñакате да ги избришете одбраните контакти?"; + +"You cannot delete the card of \"%{0}\"." += "Ðе можете да ја избришете картичката на \"%{0}\"."; + + + +"You cannot subscribe to a folder that you own!" += "Ðе можете да Ñе претплатите на папката која е ваша."; +"Unable to subscribe to that folder!" += "Ðе е можно да Ñе претплатите на оваа папка."; + +/* acls */ +"Access rights to" = "ПриÑтапни права за"; +"For user" = "За кориÑникот"; + +"Any Authenticated User" = "Било кој автентициран кориÑник"; +"Public Access" = "Јавен приÑтап"; + +"This person can add cards to this addressbook." += "КориÑникот може да додава картички во овој адреÑар."; +"This person can edit the cards of this addressbook." += "КориÑникот може да ги уредува картичките во овој адреÑар."; +"This person can list the content of this addressbook." += "КориÑникот може да ја лиÑта Ñодржината на адреÑарот."; +"This person can read the cards of this addressbook." += "КориÑникот може да ги чита картичките во овој адреÑар."; +"This person can erase cards from this addressbook." += "КориÑникот може да брише картички во овој адреÑар."; + +"The selected contact has no email address." += "Одбраниот контакт нема електронÑка адреÑа."; + +"Please select a contact." = "Одберете контакт."; + +/* Error messages for move and copy */ + +"SoAccessDeniedException" = "Ðе можете да запишувате во овој адреÑар."; +"Forbidden" = "Ðе можете да запишувате во овој адреÑар."; +"Invalid Contact" = "Одбраниот контакт повеќе не поÑтои."; +"Unknown Destination Folder" = "Одбраниот адреÑар повеќе не поÑтои како одредница."; + +/* Lists */ +"List details" = "Детали за лиÑтата"; +"List name:" = "Име на лиÑтата:"; +"List nickname:" = "ЛиÑта на прекари:"; +"List description:" = "ЛиÑта на опиÑи:"; +"Members" = "Членови"; +"Contacts" = "Контакти"; +"Add" = "Додади"; +"Lists can't be moved or copied." = "ЛиÑтите не можат да бидат префрлени или копирани."; +"Export" = "Извези"; +"Export Address Book..." = "ИзвеÑи го адреÑарот..."; +"View Raw Source" = "Види го Ñировиот извор"; +"Import Cards" = "Увези ја картичката"; +"Select a vCard or LDIF file." = "Одбери vCard или LDIF датотека."; +"Upload" = "Префрли"; +"Uploading" = "Префрлам"; +"Done" = "Завршено"; +"An error occured while importing contacts." = "ÐаÑтана грешка при увезувањето на контактите."; +"No card was imported." = "Ðиту една картичка не е увезена."; +"A total of %{0} cards were imported in the addressbook." = "Во адреÑарот Ñе увезени вкупно %{0} картички."; + +"Reload" = "Обнови"; + +/* Properties window */ +"Address Book Name:" = "Име на адреÑарот"; +"Links to this Address Book" = "Линк кон оваа адреÑна книга"; +"Authenticated User Access" = "Ðвторизиран кориÑнички приÑтап"; +"CardDAV URL: " = "CalDAV URL:"; + diff --git a/UI/Contacts/Portuguese.lproj/Localizable.strings b/UI/Contacts/Portuguese.lproj/Localizable.strings new file mode 100644 index 000000000..9b2e5e17c --- /dev/null +++ b/UI/Contacts/Portuguese.lproj/Localizable.strings @@ -0,0 +1,215 @@ +/* this file is in UTF-8 format! */ + +"Contact" = "Contacto"; +"Address" = "Endereço"; +"Photos" = "Fotos"; +"Other" = "Outros"; + +"Address Books" = "Catálogo de endereços"; +"Addressbook" = "Catálogo de endereço"; +"Addresses" = "Contacto"; +"Update" = "Atualizar"; +"Cancel" = "Cancelar"; +"Common" = "Comum"; +"Contact editor" = "Editor de Contatos"; +"Contact viewer" = "Visualizador de Contatos"; +"Email" = "Email"; +"Screen Name" = "Nome de Apresentação"; +"Extended" = "Extendido"; +"Fax" = "Fax"; +"Firstname" = "Primeiro Nome"; +"Home" = "Residencia"; +"HomePhone" = "Telefone Residencia"; +"Lastname" = "Último Nome"; +"Location" = "Localização"; +"MobilePhone" = "Telefone móvel"; +"Name" = "Nome"; +"OfficePhone" = "Telefone de escritório"; +"Organization" = "Organização"; +"Work Phone" = "Telefone de trabalho"; +"Phone" = "Telefone"; +"Phones" = "Telefones"; +"Postal" = "Código postal"; +"Save" = "Gravar"; +"Internet" = "Internet"; +"Unit" = "Sector"; +"delete" = "apagar"; +"edit" = "editar"; +"invalidemailwarn" = "O email é inválido"; +"new" = "novo"; +"Preferred Phone" = "Telefone Preferencial"; + +"Move To" = "Mover para"; +"Copy To" = "Copiar para"; +"Add to:" = "Adicionar a:"; + +/* Tooltips */ + +"Create a new address book card" = "Cria um novo contato"; +"Create a new list" = "Cria uma nova lista"; +"Edit the selected card" = "Edita o contacto selecionado"; +"Send a mail message" = "Envia uma mensagem de email"; +"Delete selected card or address book" = "Apaga o contacto ou catálogo selecionado"; +"Reload all contacts" = "Actualizar todos os contactos"; + +"htmlMailFormat_UNKNOWN" = "Desconhecido"; +"htmlMailFormat_FALSE" = "Apenas texto"; +"htmlMailFormat_TRUE" = "HTML"; + +"Name or Email" = "Nome ou Email"; +"Category" = "Categoria"; +"Personal Addressbook" = "Catálogo Pessoal"; +"Search in Addressbook" = "Localizar no Catálogo"; + +"New Card" = "Novo Contato"; +"New List" = "Nova Lista"; +"Edit" = "Editar"; +"Properties" = "Propriedades"; +"Sharing..." = "Partilhando..."; +"Write" = "Escrever"; +"Delete" = "Apagar"; +"Instant Message" = "Mensagem Instantânea"; +"Add..." = "Adicionar..."; +"Remove" = "Remover"; + +"Please wait..." = "Por favor, aguarde..."; +"No possible subscription" = "Sem possibilidades de inscrição"; + +"Preferred" = "Preferido"; +"Display" = "Exibir"; +"Display Name:" = "Exibir Nome:"; +"Email:" = "Endereço de Email:"; +"Additional Email:" = "Email adicional:"; + +"Phone Number:" = "Numero de telegone:"; +"Prefers to receive messages formatted as:" = "Preferências na recepção de mensagens no formato:"; +"Screen Name:" = "Nome de apresentado:"; +"Categories:" = "Categorias:"; + +"First:" = "Primeiro Nome:"; +"Last:" = "Último Nome:"; +"Nickname" = "Apelido"; + +"Telephone" = "Telefone"; +"Work:" = "Trabalho:"; +"Home:" = "Residencia:"; +"Fax:" = "Fax:"; +"Mobile:" = "Móvel:"; +"Pager:" = "Pager:"; + +/* categories */ +"contacts_category_labels" = "Colega, Concorrência, Cliente, Amigo, Familia, Parceiro económico, Fornecedor, Impressa, VIP"; +"Categories" = "Categorias"; +"New category" = "New categoria"; + +/* adresses */ +"Title:" = "Título:"; +"Service:" = "Serviço:"; +"Company:" = "Empresa:"; +"Department:" = "Departmento:"; +"Organization:" = "Organização:"; +"Address:" = "Endereço:"; +"City" = "Cidade"; +"State_Province:" = "Região:"; +"ZIP_Postal Code:" = "Código postal:"; +"Country" = "País"; +"Web Page:" = "Página web:"; + +"Work" = "Trabalho"; +"Other Infos" = "Outras Informações"; + +"Note:" = "Notas:"; +"Timezone:" = "Fuso Horário:"; +"Birthday" = "Aniversário"; +"Birthday (yyyy-mm-dd)" = "Aniversário (yyyy-mm-dd)"; +"Freebusy URL:" = "URL Livre/Ocupado:"; + +"Add as..." = "Adicionar como..."; +"Recipient" = "Beneficiário"; +"Carbon Copy" = "Cópia em bloco"; +"Blind Carbon Copy" = "Cópia em bloco Oculta"; + +"New Addressbook..." = "Novo Catálogo..."; +"Subscribe to an Addressbook..." = "Inscrever-se num Catálogo..."; +"Remove the selected Addressbook" = "Remover o Catálogo selecionado"; + +"Name of the Address Book" = "Nome do Catálogo"; +"Are you sure you want to delete the selected address book?" += "Você tem certeza que quer apagar o catálogo selecionado?"; +"You cannot remove nor unsubscribe from a public addressbook." += "Você não pode apagar nem retirar-se de uma catálogo público."; +"You cannot remove nor unsubscribe from your personal addressbook." += "Você não pode apagar nem retirar-se de uma catálogo pessoal."; + +"Are you sure you want to delete the selected contacts?" += "Você tem certeza que quer apagar os contatos selecionados?"; + +"You cannot delete the card of \"%{0}\"." += "Você não pode apagar o contato de \"%{0}\"."; + + + +"You cannot subscribe to a folder that you own!" += "Você não pode inscrever-se numa pasta que você é dono."; +"Unable to subscribe to that folder!" += "Não foi possível inscrever-se nesta pasta."; + +/* acls */ +"Access rights to" = "Direitos de acesso para"; +"For user" = "Para usuário"; + +"Any Authenticated User" = "Qualquer utilizador autenticado"; +"Public Access" = "Acesso Publico"; + +"This person can add cards to this addressbook." += "Essa pessoa pode adicionar contatos ao meu catálogo."; +"This person can edit the cards of this addressbook." += "Essa pessoa pode editar contatos deste catálogo."; +"This person can list the content of this addressbook." += "Essa pessoa pode listar o conteudo deste catálogo."; +"This person can read the cards of this addressbook." += "Essa pessoa pode ler os contatos deste catálogo."; +"This person can erase cards from this addressbook." += "Essa pessoa pode apagar contatos deste catálogo."; + +"The selected contact has no email address." += "O contato selecionado não tem endereço de email."; + +"Please select a contact." = "Por favor, selecione um contato."; + +/* Error messages for move and copy */ + +"SoAccessDeniedException" = "Você não pode gravar neste catálogo."; +"Forbidden" = "Você não pode gravar neste catálogo."; +"Invalid Contact" = "O contato selecionado não existe."; +"Unknown Destination Folder" = "O catálogo de destino selecionado não existe."; + +/* Lists */ +"List details" = "List details"; +"List name:" = "List name:"; +"List nickname:" = "List nickname:"; +"List description:" = "List description:"; +"Members" = "Members"; +"Contacts" = "Contacts"; +"Add" = "Add"; +"Lists can't be moved or copied." = "Lists can't be moved or copied."; +"Export" = "Export"; +"Export Address Book..." = "Export Address Book..."; +"View Raw Source" = "Visualizar Fonte"; +"Import Cards" = "Import Cards"; +"Select a vCard or LDIF file." = "Select a vCard or LDIF file."; +"Upload" = "Upload"; +"Uploading" = "Carregando"; +"Done" = "Done"; +"An error occured while importing contacts." = "An error occured while importing contacts."; +"No card was imported." = "No card was imported."; +"A total of %{0} cards were imported in the addressbook." = "A total of %{0} cards were imported in the addressbook."; + +"Reload" = "Atualizar"; + +/* Properties window */ +"Address Book Name:" = "Nome do Catálogo:"; +"Links to this Address Book" = "Link para este Catálogo"; +"Authenticated User Access" = "Acesso de Usuário Autenticado"; +"CardDAV URL: " = "CardDAV URL:"; + diff --git a/UI/Contacts/UIxContactActions.m b/UI/Contacts/UIxContactActions.m index b1d9e1269..9706e402c 100644 --- a/UI/Contacts/UIxContactActions.m +++ b/UI/Contacts/UIxContactActions.m @@ -141,7 +141,7 @@ content = [NSMutableString string]; response = [context response]; - [content appendFormat: [[self clientObject] contentAsString]]; + [content appendFormat: @"%@", [[self clientObject] contentAsString]]; [response setHeader: @"text/plain; charset=utf-8" forKey: @"content-type"]; [response appendContentString: content]; diff --git a/UI/Contacts/UIxContactFolderActions.m b/UI/Contacts/UIxContactFolderActions.m index 974e7d5d0..d19d826c8 100644 --- a/UI/Contacts/UIxContactFolderActions.m +++ b/UI/Contacts/UIxContactFolderActions.m @@ -28,10 +28,14 @@ #import #import #import +#define COMPILING_NGOBJWEB 1 /* we want httpRequest for parsing multi-part + form data */ #import +#undef COMPILING_NGOBJWEB #import #import #import +#import #import #import @@ -78,9 +82,9 @@ inContext: [self context] acquire: NO]; if ([currentChild respondsToSelector: @selector (vCard)]) - [content appendFormat: [[currentChild ldifRecord] ldifRecordAsString]]; + [content appendFormat: @"%@", [[currentChild ldifRecord] ldifRecordAsString]]; else if ([currentChild respondsToSelector: @selector (vList)]) - [content appendFormat: [[currentChild vList] ldifString]]; + [content appendFormat: @"%@", [[currentChild vList] ldifString]]; [content appendString: @"\n"]; } diff --git a/UI/Contacts/UIxContactFolderProperties.m b/UI/Contacts/UIxContactFolderProperties.m index 1f5a92a01..cf93a83eb 100644 --- a/UI/Contacts/UIxContactFolderProperties.m +++ b/UI/Contacts/UIxContactFolderProperties.m @@ -19,6 +19,8 @@ */ #import +#import +#import #import "UIxContactFolderProperties.h" @@ -48,7 +50,7 @@ return [addressBook displayName]; } -- (NSString *) setAddressBookName: (NSString *) newName +- (void) setAddressBookName: (NSString *) newName { [addressBook renameTo: newName]; } diff --git a/UI/Contacts/UIxContactView.m b/UI/Contacts/UIxContactView.m index 4a4541794..94d475e6f 100644 --- a/UI/Contacts/UIxContactView.m +++ b/UI/Contacts/UIxContactView.m @@ -350,7 +350,7 @@ data = [NSMutableString string]; [data appendString: postalCode]; if ([postalCode length] > 0 && [country length] > 0) - [data appendFormat: @", ", country]; + [data appendFormat: @", "]; [data appendString: country]; return [self _cardStringWithLabel: nil value: data]; @@ -562,7 +562,7 @@ data = [NSMutableString string]; [data appendString: postalCode]; if ([postalCode length] > 0 && [country length] > 0) - [data appendFormat: @" ", country]; + [data appendFormat: @" "]; [data appendString: country]; return [self _cardStringWithLabel: nil value: data]; diff --git a/UI/MailPartViewers/GNUmakefile b/UI/MailPartViewers/GNUmakefile index bbaa636e6..5b1f13a1b 100644 --- a/UI/MailPartViewers/GNUmakefile +++ b/UI/MailPartViewers/GNUmakefile @@ -6,7 +6,7 @@ BUNDLE_NAME = MailPartViewers MailPartViewers_PRINCIPAL_CLASS = MailPartViewersProduct -MailPartViewers_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan ChineseTaiwan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak Slovenian SpanishSpain SpanishArgentina Swedish Ukrainian Welsh +MailPartViewers_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan ChineseTaiwan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian Macedonian NorwegianBokmal NorwegianNynorsk Polish Portuguese Russian Slovak Slovenian SpanishSpain SpanishArgentina Swedish Ukrainian Welsh MailPartViewers_OBJC_FILES += \ MailPartViewersProduct.m \ diff --git a/UI/MailPartViewers/Macedonian.lproj/Localizable.strings b/UI/MailPartViewers/Macedonian.lproj/Localizable.strings new file mode 100644 index 000000000..13643908d --- /dev/null +++ b/UI/MailPartViewers/Macedonian.lproj/Localizable.strings @@ -0,0 +1,48 @@ +ACCEPTED = "прифатено"; +COMPLETED = "комплетирано"; +DECLINED = "одбиено"; +DELEGATED = "делегирано"; +"IN-PROCESS" = "во тек"; +"NEEDS-ACTION" = "потребна е активноÑÑ‚"; +TENTATIVE = "не е Ñигурно"; +organized_by_you = "организирано од ваÑ"; +you_are_an_attendee = "вие Ñте учеÑник"; +add_info_text = "iMIP 'ADD' барања Ñеуште не Ñе подржани од SOGo."; +publish_info_text = "ИÑпраќачот ве информира за прикачениот наÑтан."; +cancel_info_text = "Вашата покана или целиот наÑтан е откажан."; +request_info_no_attendee = "предлага ÑоÑтанок на учеÑниците. Вие ја примивте оваа порака како извеÑтување, не Ñте предвидени како учеÑник."; +Appointment = "Закажување"; +"Status Update" = "ОÑвежи го ÑтатуÑот"; +was = "беше"; + +Organizer = "Организатор"; +Time = "Време"; +Attendees = "УчеÑници"; +request_info = "ве поканува да учеÑтвувате на ÑоÑтанокот."; +"Add to calendar" = "Додади во календарот"; +"Delete from calendar" = "Избриши од календарот"; +"Update status" = "ОÑвежи го ÑтатуÑот"; +Accept = "Прифати"; +Decline = "Одбиј"; +Tentative = "УÑловно"; +"Delegate ..." = "Делегирај ..."; +"Delegated to" = "Делегирано на"; +"Update status in calendar" = "ОÑвежи го ÑтатуÑот во календарот"; +"delegated from" = "делегирано од"; + +reply_info_no_attendee = "Вие добивте одговор на закажан наÑтан но иÑпраќачот на одговорот не е учеÑник."; +reply_info = "Ова е одговор на покана за наÑтан креиран од ваÑ."; + +"to" = "до"; + +"Untitled" = "Без наÑлов"; + +"Size" = "Големина"; + +"Digital signature is not valid" = "ЕлектронÑкиот Ð¿Ð¾Ñ‚Ð¿Ð¸Ñ Ðµ невалиден"; +"Message is signed" = "Пораката е потпишана"; +"Subject" = "Тема"; +"From" = "Од"; +"Date" = "Датум"; +"To" = "До"; +"Issuer" = "Издавач"; diff --git a/UI/MailPartViewers/Portuguese.lproj/Localizable.strings b/UI/MailPartViewers/Portuguese.lproj/Localizable.strings new file mode 100644 index 000000000..e03c76a5c --- /dev/null +++ b/UI/MailPartViewers/Portuguese.lproj/Localizable.strings @@ -0,0 +1,48 @@ +ACCEPTED = "aceite"; +COMPLETED = "finalizado"; +DECLINED = "rejeitado"; +DELEGATED = "apagado"; +"IN-PROCESS" = "em processamento"; +"NEEDS-ACTION" = "acções necessárias"; +TENTATIVE = "tentativa"; +organized_by_you = "organizado por si"; +you_are_an_attendee = "você é um participante"; +add_info_text = "As solicitações iMIP 'ADD' ainda não são suportadas pelo SOGo."; +publish_info_text = "O solicitante informa-o sobre um evento anexo."; +cancel_info_text = "O seu convite ou evento foi cancelado."; +request_info_no_attendee = "está propondo uma reunião aos participantes. Está recebendo este email como uma notificação, não está agendado como um particiopante."; +Appointment = "Compromisso"; +"Status Update" = "Estado da Atualização"; +was = "foi"; + +Organizer = "Organizador"; +Time = "Hora"; +Attendees = "Participantes"; +request_info = "convidou-o para participar numa reunião."; +"Add to calendar" = "Adicionar ao calendário"; +"Delete from calendar" = "Apagar do calendário"; +"Update status" = "Atualizar estado"; +Accept = "Aceitar"; +Decline = "Rejeitar"; +Tentative = "Tentativa"; +"Delegate ..." = "Delegado ..."; +"Delegated to" = "Delegado para"; +"Update status in calendar" = "Atualizar estado no calendário"; +"delegated from" = "delegado de"; + +reply_info_no_attendee = "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 si."; + +"to" = "para"; + +"Untitled" = "Sem título"; + +"Size" = "Tamanho"; + +"Digital signature is not valid" = "Assinatura digital inválida"; +"Message is signed" = "A Mensagem está assinada"; +"Subject" = "Assunto"; +"From" = "De"; +"Date" = "Data"; +"To" = "Para"; +"Issuer" = "Emissor"; diff --git a/UI/MailPartViewers/UIxMailPartHTMLViewer.m b/UI/MailPartViewers/UIxMailPartHTMLViewer.m index f1ead5ffd..d464fbfc2 100644 --- a/UI/MailPartViewers/UIxMailPartHTMLViewer.m +++ b/UI/MailPartViewers/UIxMailPartHTMLViewer.m @@ -161,10 +161,10 @@ static NSData* _sanitizeContent(NSData *theData) if (i < len-5) { if ((*bytes == '<') && - (*(bytes+1) == 'm' || *(bytes+2) == 'M') && - (*(bytes+2) == 'e' || *(bytes+3) == 'E') && - (*(bytes+3) == 't' || *(bytes+4) == 'T') && - (*(bytes+4) == 'a' || *(bytes+5) == 'A') && + (*(bytes+1) == 'm' || *(bytes+1) == 'M') && + (*(bytes+2) == 'e' || *(bytes+2) == 'E') && + (*(bytes+3) == 't' || *(bytes+3) == 'T') && + (*(bytes+4) == 'a' || *(bytes+4) == 'A') && (*(bytes+5) == ' ')) in_meta = YES; } @@ -741,7 +741,7 @@ static NSData* _sanitizeContent(NSData *theData) /* SaxLexicalHandler */ - (void) comment: (unichar *) _chars - length: (NSUInteger) _len + length: (int) _len { showWhoWeAre(); if (inStyle) @@ -807,7 +807,7 @@ static NSData* _sanitizeContent(NSData *theData) } [dump appendFormat: @"--- end ---\n"]; - NSLog(dump); + NSLog(@"%@",dump); [dump release]; } diff --git a/UI/MailPartViewers/UIxMailPartICalActions.m b/UI/MailPartViewers/UIxMailPartICalActions.m index 567412818..9f233515c 100644 --- a/UI/MailPartViewers/UIxMailPartICalActions.m +++ b/UI/MailPartViewers/UIxMailPartICalActions.m @@ -46,6 +46,7 @@ #import #import #import +#import #import #import "UIxMailPartICalActions.h" diff --git a/UI/MailPartViewers/UIxMailPartMixedViewer.m b/UI/MailPartViewers/UIxMailPartMixedViewer.m index 39544c0d8..707650c93 100644 --- a/UI/MailPartViewers/UIxMailPartMixedViewer.m +++ b/UI/MailPartViewers/UIxMailPartMixedViewer.m @@ -57,7 +57,7 @@ - (NSString *)childPartName { char buf[8]; - sprintf(buf, "%d", [self childIndex] + 1); + sprintf(buf, "%d", (int)[self childIndex] + 1); return [NSString stringWithCString:buf]; } diff --git a/UI/MailPartViewers/UIxMailPartViewer.m b/UI/MailPartViewers/UIxMailPartViewer.m index c973acbb6..1fc29721d 100644 --- a/UI/MailPartViewers/UIxMailPartViewer.m +++ b/UI/MailPartViewers/UIxMailPartViewer.m @@ -270,7 +270,7 @@ if ([filename length]) // We replace any slash by a dash since Apache won't allow encoded slashes by default. // See http://httpd.apache.org/docs/2.2/mod/core.html#allowencodedslashes - filename = [filename stringByReplacingString: @"/" withString: @"-"]; + filename = (NSMutableString *)[filename stringByReplacingString: @"/" withString: @"-"]; else [filename appendFormat: @"%@-%@", [self labelForKey: @"Untitled"], diff --git a/UI/MailerUI/GNUmakefile b/UI/MailerUI/GNUmakefile index 2e8892603..2af49a213 100644 --- a/UI/MailerUI/GNUmakefile +++ b/UI/MailerUI/GNUmakefile @@ -6,7 +6,7 @@ BUNDLE_NAME = MailerUI MailerUI_PRINCIPAL_CLASS = MailerUIProduct -MailerUI_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan ChineseTaiwan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak Slovenian SpanishSpain SpanishArgentina Swedish Ukrainian Welsh +MailerUI_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan ChineseTaiwan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian Macedonian NorwegianBokmal NorwegianNynorsk Polish Portuguese Russian Slovak Slovenian SpanishSpain SpanishArgentina Swedish Ukrainian Welsh MailerUI_OBJC_FILES += \ MailerUIProduct.m \ diff --git a/UI/MailerUI/Macedonian.lproj/Localizable.strings b/UI/MailerUI/Macedonian.lproj/Localizable.strings new file mode 100644 index 000000000..eab73da5d --- /dev/null +++ b/UI/MailerUI/Macedonian.lproj/Localizable.strings @@ -0,0 +1,307 @@ +/* this file is in UTF-8 format! */ + +/* Icon's label */ +"Create" = "Креирај"; +"Empty Trash" = "ИÑпразни го ѓубрето"; +"Delete" = "Избриши"; +"Expunge" = "Уништи"; +"Forward" = "Препрати"; +"Get Mail" = "Зами пошта"; +"Junk" = "Ѓубре"; +"Reply" = "Одговори"; +"Reply All" = "Одговори на Ñите"; +"Print" = "Отпечати"; +"Stop" = "Стоп"; +"Write" = "Запиши"; +"Search" = "Барај"; + +"Send" = "ИÑпрати"; +"Contacts" = "Контакти"; +"Attach" = "Прикачи"; +"Save" = "Зачувај"; +"Options" = "Опции"; +"Close" = "Затвори"; +"Size" = "Големина"; + +/* Tooltips */ + +"Send this message now" = "ИÑпрати ја пораката Ñега"; +"Select a recipient from an Address Book" = "Одбери примач од контактите"; +"Include an attachment" = "Прикачи прилог"; +"Save this message" = "Зачувај ја пораката"; +"Get new messages" = "Земи ги новите пораки"; +"Create a new message" = "Креирај нова порака"; +"Go to address book" = "Оди кон адреÑарот"; +"Reply to the message" = "Одговори на пораката"; +"Reply to sender and all recipients" = "Одговори на иÑпраќачот и Ñите приматели"; +"Forward selected message" = "Препратија одбраната порака"; +"Delete selected message or folder" = "Избриши ја Ñелектрираната порака или папка"; +"Mark the selected messages as junk" = "Означи ги пораките како Ѓубре"; +"Print this message" = "Отпечати ја пораката"; +"Stop the current transfer" = "Запри го тековниот транÑфер"; +"Attachment" = "Прилог"; +"Unread" = "Ðепрочитано"; +"Flagged" = "Означена"; +"Search multiple mailboxes" = "Пребарај повеќе поштенÑки Ñандачиња"; + +/* Main Frame */ + +"Home" = "дома"; +"Calendar" = "Календар"; +"Addressbook" = "ÐдреÑар"; +"Mail" = "Пошта"; +"Right Administration" = "ÐдминиÑтрација на права"; + +"Help" = "Помош"; + +/* Mail account main windows */ + +"Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Добредојдовте на СОГо мејлерот. КориÑтете го дрвото Ñо папки на левата Ñтрана за да Ñе движите низ вашите Ñметки за пошта!"; + +"Read messages" = "Читај пораки"; +"Write a new message" = "Ðапиши нова порака"; + +"Share: " = "Дели:"; +"Account: " = "Сметка:"; +"Shared Account: " = "Делени Ñметки:"; + +/* acls */ +"Access rights to" = "ПриÑтапни права за"; +"For user" = "За кориÑник"; + +"Any Authenticated User" = "Било кој автентициран кориÑник"; + +"List and see this folder" = "ИзлиÑтај и погледни ја оваа папка"; +"Read mails from this folder" = "Читај ги пораките од оваа папка"; +"Mark mails read and unread" = "Означи ги пораките како прочитани и непрочитани"; +"Modify the flags of the mails in this folder" = "Промени ги знаменцата на пораките во оваа папка"; +"Insert, copy and move mails into this folder" = "ВнеÑи, копирај и префрли пораки во оваа папка"; +"Post mails" = "ИÑпрати пораки"; +"Add subfolders to this folder" = "Додади под папка во оваа папка"; +"Remove this folder" = "Избриши ја оваа папка"; +"Erase mails from this folder" = "Избриши ги пораките од оваа папка"; +"Expunge this folder" = "Уништи ја оваа папка"; +"Export This Folder" = "Извези ја оваа папка"; +"Modify the acl of this folder" = "Измени ги приÑтапните права на оваа папка"; + +"Saved Messages.zip" = "Снимени Messages.zip"; + +"Update" = "ОÑвежи"; +"Cancel" = "Откажи"; + +/* Mail edition */ + +"From" = "Од"; +"Subject" = "Тема"; +"To" = "До"; +"Cc" = "Цц"; +"Bcc" = "Бцц"; +"Reply-To" = "Одговори на"; +"Add address" = "Додади адреÑа"; +"Body" = "Тело"; + +"Open" = "Отвори"; +"Select All" = "Одбери Ñе"; +"Attach Web Page..." = "Прикачи веб Ñтрана..."; +"file" = "датотека"; +"files" = "датотеки"; +"Save all" = "Ñними Ñе"; + +"to" = "До"; +"cc" = "Цц"; +"bcc" = "Бцц"; + +"Edit Draft..." = "Уреди го драфтот"; +"Load Images" = "Вчитај Ñлики"; + +"Return Receipt" = "Препорачано"; +"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) - %@"= "Повратен примач (прикажан) - %@"; +"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." = "Ова е повратница за пораката која ја иÑпративте на %@.\n\nзабелешка: Оваа повратница Ñамо укажува дека пораката била прикажана на екранот на примателот. Ðема никаква гаранција дека примачот ја прочитал пораката или пак разбрал Ñодржината на иÑтата."; + +"Priority" = "Приоритет"; +"highest" = "ÐајвиÑок"; +"high" = "ВиÑок"; +"normal" = "Ðормален"; +"low" = "Ðизок"; +"lowest" = "Ðајнизок"; + +"This mail is being sent from an unsecure network!" = "Оваа порака е иÑпратена од небезбедна мрежа!"; + +"Address Book:" = "ÐдреÑар:"; +"Search For:" = "Барај го:"; + +/* Popup "show" */ + +"all" = "Ñите"; +"read" = "прочитани"; +"unread" = "непрочитани"; +"deleted" = "избришани"; +"flagged" = "означени"; + +/* MailListView */ + +"Sender" = "ИÑпраќач"; +"Subject or Sender" = "Тема или иÑпраќач"; +"To or Cc" = "До или Цц"; +"Entire Message" = "Целата порака"; + +"Date" = "Датум"; +"View" = "Поглед"; +"All" = "Сите"; +"No message" = "Ðема порака"; +"messages" = "пораки"; + +"first" = "Прва"; +"previous" = "Претходна"; +"next" = "Следна"; +"last" = "ПоÑледна"; + +"msgnumber_to" = "до"; +"msgnumber_of" = "од"; + +"Mark Unread" = "Означи како непрочитана"; +"Mark Read" = "Означи прочитана"; + +"Untitled" = "Без наÑлов"; + +/* Tree */ + +"SentFolderName" = "ИÑпратени"; +"TrashFolderName" = "Ѓубре"; +"InboxFolderName" = "Примени"; +"DraftsFolderName" = "Драфтови"; +"SieveFolderName" = "Филтри"; +"Folders" = "Папки"; /* title line */ + +/* MailMoveToPopUp */ + +"MoveTo" = "Префрли …"; + +/* Address Popup menu */ +"Add to Address Book..." = "Додади во адреÑарот..."; +"Compose Mail To" = "Компонирај порака до"; +"Create Filter From Message..." = "Креирај филтер од пораката..."; + +/* Image Popup menu */ +"Save Image" = "Сними Ñлика"; +"Save Attachment" = "Сними прилог"; + +/* Mailbox popup menus */ +"Open in New Mail Window" = "Отвори во нов прозорец за пораки"; +"Copy Folder Location" = "Копирај ја локацијата на папката"; +"Subscribe..." = "Прептлати Ñе..."; +"Mark Folder Read" = "Означи ја папката како прочитана"; +"New Folder..." = "Ðова папка..."; +"Compact This Folder" = "Компактирај ја оваа папка"; +"Search Messages..." = "Пребарај ги пораките..."; +"Sharing..." = "Споделување..."; +"New Subfolder..." = "Ðова под папка..."; +"Rename Folder..." = "Преименувај ја папката..."; +"Delete Folder" = "Избриши ја папката"; +"Use This Folder For" = "КориÑти ја папката за"; +"Get Messages for Account" = "Земи ги пораките за Ñметката"; +"Properties..." = "ОÑобини..."; +"Delegation..." = "Делегација..."; + +/* Use This Folder menu */ +"Sent Messages" = "ИÑпрати пораки"; +"Drafts" = "Драфтови"; +"Deleted Messages" = "Избришани пораки"; + +/* Message list popup menu */ +"Open Message In New Window" = "Отвори ја пораката во нов прозор"; +"Reply to Sender Only" = "Одговори му Ñамо на иÑпраќачот"; +"Reply to All" = "Одговори на Ñите"; +"Edit As New..." = "Уреди како нова..."; +"Move To" = "Префрли во"; +"Copy To" = "ИÑкопирај во"; +"Label" = "Лабела"; +"Mark" = "Означи"; +"Save As..." = "Сними како..."; +"Print Preview" = "Преглед пред печатење"; +"View Message Source" = "Види ја изворно пораката"; +"Print..." = "Отпечати..."; +"Delete Message" = "Избриши порака"; +"Delete Selected Messages" = "Избриши ги означените пораки"; + +"This Folder" = "Оваа папка"; + +/* Label popup menu */ +"None" = "Ðиту една"; + +/* Mark popup menu */ +"As Read" = "Како прочитана"; +"Thread As Read" = "ПрепиÑката како прочитана"; +"As Read By Date..." = "Прочитано по датум..."; +"All Read" = "Сето прочитано"; +"Flag" = "Знаменце"; +"As Junk" = "Како ѓубре"; +"As Not Junk" = "Ðе е ѓубре"; +"Run Junk Mail Controls" = "Изврши ги контролите за ѓубре"; + +"Search messages in" = "Пребарај ги пораките во"; +"Search" = "Барај"; +"Search subfolders" = "Пребарај под папки"; +"Match any of the following" = "Одговара на било што од Ñледното"; +"Match all of the following" = "Одговара на Ñе од Ñледното"; +"contains" = "Ñодржи"; +"does not contain" = "не Ñодржи"; +"No matches found" = "Ðе Ñе пронајдени Ñовпаѓања"; +"results found" = "пронајдени резултати"; +"result found" = "пронајден резултат"; +"Please specify at least one filter" = "Одберете барем еден филтер"; + +/* Folder operations */ +"Name :" = "Име :"; +"Enter the new name of your folder" = "ВнеÑи ново име за вашата папка"; +"Do you really want to move this folder into the trash ?" + = "ÐавиÑтина Ñакате папката да ја фрлите во кантата за ѓубре ?"; +"Operation failed" = "ÐеуÑпешна операција"; + +"Quota" = "Квота:"; +"quotasFormat" = "%{0}% used on %{1} MB"; + +"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 folder with name \"%{0}\" could not be created." += "Папката Ñо име \"%{0}\" не може да биде креирана."; +"This folder could not be renamed to \"%{0}\"." += "Оваа папка не може да биде преименувана во \"%{0}\"."; +"The folder could not be deleted." += "Оваа папка не може да Ñе избрише."; +"The trash could not be emptied." += "Кантата за ѓубре не може да Ñе иÑпразни."; +"The folder functionality could not be changed." += "Улогата на папката не може да биде променета."; + +"You need to choose a non-virtual folder!" = "Треба да изберете папка која не е виртуелна!"; + +"Moving a message into its own folder is impossible!" += "Префлањето на пораката во ÑопÑтвената папка не е можно!"; +"Copying a message into its own folder is impossible!" += "Копирањето на пораката во ÑопÑтвената папка не е можно!"; + +/* Message operations */ +"The messages could not be moved to the trash folder. Would you like to delete them immediately?" += "Пораките не можат да Ñе префрлат во папката за ѓубре. Дали Ñаката веднаш да ги избришам?"; + +/* Message editing */ +"error_missingsubject" = "Пораката нема тема. Дали Ñте Ñигурни дека Ñакате да ја иÑпратите?"; +"error_missingrecipients" = "Одберете барем еден примател."; +"Send Anyway" = "ИÑпрати во Ñекој Ñлучај"; +"Error while saving the draft:" = "Грешка при Ñнимањето на привремениот документ:"; +"Error while uploading the file \"%{0}\":" = "Грешка при прикажување на фајл \"%{0}\":"; +"There is an active file upload. Closing the window will interrupt it." = "Во тек е активно прикачување на фајл. Затварањето на прозорецот ќе го прекине прикачувањето."; + +/* Message sending */ +"cannot send message: (smtp) all recipients discarded" = "Ðе моѓам да ја пратам пораката: Ñите приматели Ñе невалидни."; +"cannot send message (smtp) - recipients discarded:" = "Ðе можам да ја иÑпратам пораката. Следните адреÑи Ñе невалидни:"; +"cannot send message: (smtp) error when connecting" = "Ðе можам да ја иÑпртам пораката: грешка при поврзувањето Ñо SMPT Ñерверот."; + +/* Contacts list in mail editor */ +"Email" = "ЕлектронÑка порака"; +"Name" = "Име"; diff --git a/UI/MailerUI/Portuguese.lproj/Localizable.strings b/UI/MailerUI/Portuguese.lproj/Localizable.strings new file mode 100644 index 000000000..e9393fc9c --- /dev/null +++ b/UI/MailerUI/Portuguese.lproj/Localizable.strings @@ -0,0 +1,308 @@ +/* this file is in UTF-8 format! */ + +/* Icon's label */ +"Create" = "Criar"; +"Empty Trash" = "Esvaziar Lixo"; +"Delete" = "Apagar"; +"Expunge" = "Expurgar"; +"Forward" = "Reencaminhar"; +"Get Mail" = "Receber"; +"Junk" = "Lixo Eletrônico"; +"Reply" = "Responder"; +"Reply All" = "Responder a Todos"; +"Print" = "Imprimir"; +"Stop" = "Parar"; +"Write" = "Escrever"; +"Search" = "Pesquisar"; + +"Send" = "Enviar"; +"Contacts" = "Contatos"; +"Attach" = "Anexo"; +"Save" = "Gravar"; +"Options" = "Opções"; +"Close" = "Fechar"; +"Size" = "Tamanho"; + +/* Tooltips */ + +"Send this message now" = "Enviar esta mensagem agora"; +"Select a recipient from an Address Book" = "Seleciona um destinatário a partir de um Catálogo de Endereços"; +"Include an attachment" = "Incluir um anexo"; +"Save this message" = "Gravar esta mensagem"; +"Get new messages" = "Receber novas mensagens"; +"Create a new message" = "Cria uma nova mensagem"; +"Go to address book" = "Ir para Catálogo de Endereços"; +"Reply to the message" = "Responder a esta mensagem"; +"Reply to sender and all recipients" = "Responder ao remetente e a todos os destinatários"; +"Forward selected message" = "Reencaminhar a mensagem selecionada"; +"Delete selected message or folder" = "Apagar a mensagem ou pasta seleccionada"; +"Mark the selected messages as junk" = "Marca a mensagem selecionada como Lixo Eletrônico"; +"Print this message" = "Imprimir esta mensagem"; +"Stop the current transfer" = "Interromper a transferência"; +"Attachment" = "Anexos"; +"Unread" = "Não Lido"; +"Flagged" = "Sinalizado"; +"Search multiple mailboxes" = "Pesquisar múltiplas caixas de correio"; + +/* Main Frame */ + +"Home" = "Início"; +"Calendar" = "Calendário"; +"Addressbook" = "Contactos"; +"Mail" = "Correio"; +"Right Administration" = "Administração de permissões"; + +"Help" = "Ajuda"; + +/* Mail account main windows */ + +"Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Bem-Vindo ao SOGo WebMail. Use as pastas à esquerda para exibir suas contas de email!"; + +"Read messages" = "Ler mensagens"; +"Write a new message" = "Escrever uma nova mensagem"; + +"Share: " = "Partilha: "; +"Account: " = "Conta: "; +"Shared Account: " = "Conta partilhada: "; + +/* acls */ +"Access rights to" = "Permissões de acesso para"; +"For user" = "Para utilizador"; + +"Any Authenticated User" = "Qualquer Utilizador Autenticado"; + +"List and see this folder" = "Listar e ver esta pasta"; +"Read mails from this folder" = "Ler emails desta pasta"; +"Mark mails read and unread" = "Marcar emails como lido e não lido"; +"Modify the flags of the mails in this folder" = "Modificar a sinalização dos emails nesta pasta"; +"Insert, copy and move mails into this folder" = "Inserir, copiar e mover emails nesta pasta"; +"Post mails" = "Remetar emails"; +"Add subfolders to this folder" = "Adicionar subpastas a esta pasta"; +"Remove this folder" = "Apagar esta pasta"; +"Erase mails from this folder" = "Apagar emails desta pasta"; +"Expunge this folder" = "Expurgar esta pasta"; +"Export This Folder" = "Exportar esta pasta"; +"Modify the acl of this folder" = "Modificar as permissões desta pasta"; + +"Saved Messages.zip" = "Mensagens Gravadas.zip"; + +"Update" = "Actualizar"; +"Cancel" = "Cancelar"; + +/* Mail edition */ + +"From" = "De"; +"Subject" = "Assunto"; +"To" = "Para"; +"Cc" = "Cc"; +"Bcc" = "Bcc"; +"Reply-To" = "Responder-Para"; +"Add address" = "Adicionar endereço"; +"Body" = "Corpo"; + +"Open" = "Abrir"; +"Select All" = "Seleccionar Tudo"; +"Attach Web Page..." = "Anexar Página Web..."; +"file" = "arquivo"; +"files" = "arquivos"; +"Save all" = "Gravar tudo"; + +"to" = "Para"; +"cc" = "Cc"; +"bcc" = "Bcc"; + +"Edit Draft..." = "Editar Rascunho..."; +"Load Images" = "Carregar Imagens"; + +"Return Receipt" = "Endereço de Resposta"; +"The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "O remetente desta mensagem pediu para ser notificado quando ler esta mensagem. Deseja notificar o remetente?"; +"Return Receipt (displayed) - %@"= "Endereço de Resposta - %@"; +"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." = "Este é o Endereço de Resposta do e-mail que enviou para %@.\n\nNota: Este Endereço de Resposta permite saber que a mensagem foi visualizada pelo destinatário. Não há garantia de que o destinatário tenha lido ou entendido o conteúdo da mensagem."; + +"Priority" = "Prioridade"; +"highest" = "Muito Alta"; +"high" = "Alta"; +"normal" = "Normal"; +"low" = "Baixa"; +"lowest" = "Muito Baixa"; + +"This mail is being sent from an unsecure network!" = "Este email está sendo enviado por uma rede não segura!"; + +"Address Book:" = "Contactos:"; +"Search For:" = "Pesquisar Por:"; + +/* Popup "show" */ + +"all" = "todos"; +"read" = "lido"; +"unread" = "não lido"; +"deleted" = "apagados"; +"flagged" = "sinalizados"; + +/* MailListView */ + +"Sender" = "Remetente"; +"Subject or Sender" = "Assunto ou Remetente"; +"To or Cc" = "Para ou Cc"; +"Entire Message" = "Mensagem Inteira"; + +"Date" = "Data"; +"View" = "Vista"; +"All" = "Tudo"; +"No message" = "Sem mensagem"; +"messages" = "mensagens"; + +"first" = "Primeiro"; +"previous" = "Anterior"; +"next" = "Próximo"; +"last" = "Último"; + +"msgnumber_to" = "para"; +"msgnumber_of" = "de"; + +"Mark Unread" = "Marcar como Não Lido"; +"Mark Read" = "Marcar como Lido"; + +"Untitled" = "Sem título"; + +/* Tree */ + +"SentFolderName" = "Enviados"; +"TrashFolderName" = "Lixo"; +"InboxFolderName" = "Entrada"; +"DraftsFolderName" = "Rascunhos"; +"SieveFolderName" = "Filtros"; +"Folders" = "Pastas"; /* title line */ + +/* MailMoveToPopUp */ + +"MoveTo" = "Mover …"; + +/* Address Popup menu */ +"Add to Address Book..." = "Adicionar a Catálogo..."; +"Compose Mail To" = "Escrever Mensagem Para"; +"Create Filter From Message..." = "Criar Filtro Da Mensagem..."; + +/* Image Popup menu */ +"Save Image" = "Gravar Imagem"; +"Save Attachment" = "Gravar Anexo."; + +/* Mailbox popup menus */ +"Open in New Mail Window" = "Abrir numa Nova Janela"; +"Copy Folder Location" = "Copiar o Local da Pasta"; +"Subscribe..." = "Subscrever..."; +"Mark Folder Read" = "Marcar Pasta como Lido..."; +"New Folder..." = "Nova Pasta..."; +"Compact This Folder" = "Compactar Esta Pasta"; +"Search Messages..." = "Procurar Mensagens..."; +"Sharing..." = "Partilhando..."; +"New Subfolder..." = "Nova Subpasta..."; +"Rename Folder..." = "Renomear Pasta..."; +"Delete Folder" = "Apagar Pasta"; +"Use This Folder For" = "Usar Esta Pasta Para"; +"Get Messages for Account" = "Receber Mensagens por Conta"; +"Properties..." = "Propriedades..."; +"Delegation..." = "Delegação..."; + +/* Use This Folder menu */ +"Sent Messages" = "Enviar Mensagens"; +"Drafts" = "Rascunhos"; +"Deleted Messages" = "Mensagens Apagadas"; + +/* Message list popup menu */ +"Open Message In New Window" = "Abrir Mensagens numa nova Nova Janela"; +"Reply to Sender Only" = "Responder somente para o Remetente"; +"Reply to All" = "Responder a Todos"; +"Edit As New..." = "Editar Como Novo..."; +"Move To" = "Mover Para"; +"Copy To" = "Copiar Para"; +"Label" = "Etiqueta"; +"Mark" = "Marcar"; +"Save As..." = "Gravar Como..."; +"Print Preview" = "Pré-visualizar Impressão"; +"View Message Source" = "Ver Código-Fonte da Mensagem"; +"Print..." = "Imprimir..."; +"Delete Message" = "Apagar Mensagem"; +"Delete Selected Messages" = "Apagar Mensagens Selecionadas"; + +"This Folder" = "Esta Pasta"; + +/* Label popup menu */ +"None" = "Nenhum"; + +/* Mark popup menu */ +"As Read" = "Como Lido"; +"Thread As Read" = "Tarefa Como Lida"; +"As Read By Date..." = "Como Lido Por Data..."; +"All Read" = "Tudo Lido"; +"Flag" = "Sinalizado"; +"As Junk" = "Como Lixo Eletrônico"; +"As Not Junk" = "Como Não é Lixo Eletrônico"; +"Run Junk Mail Controls" = "Executar Controlo de Lixo Eletrônico"; + +"Search messages in:" = "Pesquisar mensagens em:"; +"Search" = "Pesquisar"; +"Search subfolders" = "Pesquisar sub-pastas"; +"Match any of the following" = "Corresponder qualquer uma das seguintes"; +"Match all of the following" = "Corresponder todas as seguintes"; +"contains" = "contêm"; +"does not contain" = "não contêm"; +"No matches found" = "Nenhuma correspondencia encontrada"; +"results found" = "Resultados encontrados"; +"result found" = "Resultado encontrado"; +"Please specify at least one filter" = "Por favor, especifique pelo menos um filtro"; + +/* Folder operations */ +"Name :" = "Nome :"; +"Enter the new name of your folder :" + = "Introduza o novo nome de sua pasta :"; +"Do you really want to move this folder into the trash ?" + = "Você realmente quer mover esta pasta para o Lixo ?"; +"Operation failed" = "Falha na Operação"; + +"Quota" = "Quota:"; +"quotasFormat" = "%{0}% utilizado de %{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 apenas uma mensagem para imprimir."; +"The message you have selected doesn't exist anymore." = "A mensagem que você seleccionou não existe mais."; + +"The folder with name \"%{0}\" could not be created." += "A pasta com o nome \"%{0}\" não pode ser criada."; +"This folder could not be renamed to \"%{0}\"." += "Esta pasta não pode ser renomeada para \"%{0}\"."; +"The folder could not be deleted." += "A pasta não pode ser apagada."; +"The trash could not be emptied." += "O Lixo não pode ser esvaziado."; +"The folder functionality could not be changed." += "A funcionalidade da pasta não pode ser alterada"; + +"You need to choose a non-virtual folder!" = "Você precisa escolher uma pasta não-virtual!"; + +"Moving a message into its own folder is impossible!" += "Mover a mensagem na própria pasta é impossível!"; +"Copying a message into its own folder is impossible!" += "Copiar a mensagem na própria pasta é impossível!"; + +/* Message operations */ +"The messages could not be moved to the trash folder. Would you like to delete them immediately?" += "As mensagens não podem ser movidas para a pasta do lixo. Gostaria de eliminar imediatamente?"; + +/* Message editing */ +"error_missingsubject" = "Falta o Assunto"; +"error_missingrecipients" = "Sem destinatários seleccionados"; +"Send Anyway" = "Enviar na mesma"; +"Error while saving the draft:" = "Erro ao gravar o rascunho:"; +"Error while uploading the file \"%{0}\":" = "Erro ao carregar o arquivo \"%{0}\":"; +"There is an active file upload. Closing the window will interrupt it." = "Este arquivo está a ser carregado. Se fechar a janela irá interromper o processo."; + +/* Message sending */ +"cannot send message: (smtp) all recipients discarded" = "Não é possível enviar a mensagem: todos os destinatários são inválidos."; +"cannot send message (smtp) - recipients discarded:" = "Não é possível enviar a mensagem. Os seguintes endereços estão inválidos:"; +"cannot send message: (smtp) error when connecting" = "Não é possível enviar a mensagem: erro ao conectar ao servidor SMTP."; + +/* Contacts list in mail editor */ +"Email" = "Email"; +"Name" = "Nome"; diff --git a/UI/MailerUI/UIxMailFolderActions.m b/UI/MailerUI/UIxMailFolderActions.m index 80fd4fa20..3c7c1edb4 100644 --- a/UI/MailerUI/UIxMailFolderActions.m +++ b/UI/MailerUI/UIxMailFolderActions.m @@ -383,7 +383,7 @@ - (WOResponse *) moveMessagesAction { SOGoMailFolder *co; - SOGoUserSettings *us; + SOGoUserSettings *us=nil; WOResponse *response; NSArray *uids; NSString *value, *destinationFolder; diff --git a/UI/MailerUI/UIxMailListActions.h b/UI/MailerUI/UIxMailListActions.h index 26a917778..8d0f2dda5 100644 --- a/UI/MailerUI/UIxMailListActions.h +++ b/UI/MailerUI/UIxMailListActions.h @@ -43,7 +43,6 @@ } - (NSString *) defaultSortKey; -- (NSString *) imap4SortKey; - (NSString *) imap4SortOrdering; - (EOQualifier *) searchQualifier; - (NSString *) msgLabels; diff --git a/UI/MailerUI/UIxMailMainFrame.m b/UI/MailerUI/UIxMailMainFrame.m index e6ee428e5..5c78c4d25 100644 --- a/UI/MailerUI/UIxMailMainFrame.m +++ b/UI/MailerUI/UIxMailMainFrame.m @@ -335,12 +335,17 @@ - (WOResponse *) getFoldersStateAction { - NSString *expandedFolders; + id o; + NSArray *expandedFolders; [self _setupContext]; - expandedFolders = [moduleSettings objectForKey: @"ExpandedFolders"]; + o = [moduleSettings objectForKey: @"ExpandedFolders"]; + if ([o isKindOfClass: [NSString class]]) + expandedFolders = [o componentsSeparatedByString: @","]; + else + expandedFolders = o; - return [self responseWithStatus: 200 andString: expandedFolders]; + return [self responseWithStatus: 200 andJSONRepresentation: expandedFolders]; } - (NSString *) verticalDragHandleStyle @@ -398,16 +403,18 @@ - (WOResponse *) saveFoldersStateAction { WORequest *request; - NSString *expandedFolders; + NSArray *expandedFolders; + NSString *json; [self _setupContext]; request = [context request]; - expandedFolders = [request formValueForKey: @"expandedFolders"]; - - [moduleSettings setObject: expandedFolders - forKey: @"ExpandedFolders"]; - - [us synchronize]; + json = [request formValueForKey: @"expandedFolders"]; + if ([json length]) + { + expandedFolders = [json objectFromJSONString]; + [moduleSettings setObject: expandedFolders forKey: @"ExpandedFolders"]; + [us synchronize]; + } return [self responseWithStatus: 204]; } @@ -627,7 +634,7 @@ - (NSString *) columnsDisplayCount { - return [NSString stringWithFormat: @"%d", [[self columnsDisplayOrder] count]]; + return [NSString stringWithFormat: @"%d", (int)[[self columnsDisplayOrder] count]]; } - (void) setCurrentColumn: (NSDictionary *) newCurrentColumn diff --git a/UI/MailerUI/UIxMailView.m b/UI/MailerUI/UIxMailView.m index 110fac61b..453169327 100644 --- a/UI/MailerUI/UIxMailView.m +++ b/UI/MailerUI/UIxMailView.m @@ -53,6 +53,7 @@ #import #import // cyclic #import +#import #import "WOContext+UIxMailer.h" diff --git a/UI/MainUI/Arabic.lproj/Localizable.strings b/UI/MainUI/Arabic.lproj/Localizable.strings index 9501bd65e..568c685c1 100644 --- a/UI/MainUI/Arabic.lproj/Localizable.strings +++ b/UI/MainUI/Arabic.lproj/Localizable.strings @@ -33,9 +33,11 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; +"Portuguese" = "Português"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; diff --git a/UI/MainUI/Basque.lproj/Localizable.strings b/UI/MainUI/Basque.lproj/Localizable.strings index 1c8cc1327..1c42656c4 100644 --- a/UI/MainUI/Basque.lproj/Localizable.strings +++ b/UI/MainUI/Basque.lproj/Localizable.strings @@ -20,6 +20,7 @@ "Language" = "Hizkuntza"; "choose" = "Aukeratu ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "ChineseTaiwan" = "Chinese (Taiwan)"; "Czech" = "ÄŒesky"; @@ -32,9 +33,11 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; +"Portuguese" = "Português"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; diff --git a/UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings b/UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings index b9d376927..714e5e5a9 100644 --- a/UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings @@ -33,15 +33,17 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; -"NorwegianBokmal" = "Noruega (Norsk bokmÃ¥l)"; -"NorwegianNynorsk" = "Noruega (Norsk nynorsk)"; +"Macedonian" = "МакедонÑки"; +"NorwegianBokmal" = "Norsk bokmÃ¥l"; +"NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; +"Portuguese" = "Português"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "Slovenian" = "SlovenÅ¡Äina"; -"SpanishSpain" = "Espanhol (Espanha)"; -"SpanishArgentina" = "Espanhol (Argentina)"; +"SpanishSpain" = "Español (España)"; +"SpanishArgentina" = "Español (Argentina)"; "Swedish" = "Svenska"; "Ukrainian" = "УкраїнÑька"; "Welsh" = "Cymraeg"; diff --git a/UI/MainUI/Catalan.lproj/Localizable.strings b/UI/MainUI/Catalan.lproj/Localizable.strings index 83d0ed6a1..495df5095 100644 --- a/UI/MainUI/Catalan.lproj/Localizable.strings +++ b/UI/MainUI/Catalan.lproj/Localizable.strings @@ -33,9 +33,11 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; +"Portuguese" = "Português"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; diff --git a/UI/MainUI/ChineseTaiwan.lproj/Localizable.strings b/UI/MainUI/ChineseTaiwan.lproj/Localizable.strings index 36eb103ed..e36b4fcfb 100644 --- a/UI/MainUI/ChineseTaiwan.lproj/Localizable.strings +++ b/UI/MainUI/ChineseTaiwan.lproj/Localizable.strings @@ -33,9 +33,11 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; +"Portuguese" = "Português"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; diff --git a/UI/MainUI/Czech.lproj/Localizable.strings b/UI/MainUI/Czech.lproj/Localizable.strings index 17e168ac0..2ad6e066c 100644 --- a/UI/MainUI/Czech.lproj/Localizable.strings +++ b/UI/MainUI/Czech.lproj/Localizable.strings @@ -33,9 +33,11 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; +"Portuguese" = "Português"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; diff --git a/UI/MainUI/Danish.lproj/Localizable.strings b/UI/MainUI/Danish.lproj/Localizable.strings index 6c40e18cc..9ba97a7b5 100644 --- a/UI/MainUI/Danish.lproj/Localizable.strings +++ b/UI/MainUI/Danish.lproj/Localizable.strings @@ -33,15 +33,17 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; -"NorwegianBokmal" = "Norsk"; -"NorwegianNynorsk" = "Nynorsk"; +"Macedonian" = "МакедонÑки"; +"NorwegianBokmal" = "Norsk bokmÃ¥l"; +"NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; +"Portuguese" = "Português"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "Slovenian" = "SlovenÅ¡Äina"; -"SpanishSpain" = "Spansk (Spanien)"; -"SpanishArgentina" = "Spansk (Argentina)"; +"SpanishSpain" = "Español (España)"; +"SpanishArgentina" = "Español (Argentina)"; "Swedish" = "Svenska"; "Ukrainian" = "УкраїнÑька"; "Welsh" = "Cymraeg"; diff --git a/UI/MainUI/Dutch.lproj/Localizable.strings b/UI/MainUI/Dutch.lproj/Localizable.strings index b84ff789f..5aff9ddb1 100644 --- a/UI/MainUI/Dutch.lproj/Localizable.strings +++ b/UI/MainUI/Dutch.lproj/Localizable.strings @@ -33,9 +33,11 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; -"NorwegianBokmal" = "Norsk BokmÃ¥l"; +"Macedonian" = "МакедонÑки"; +"NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; +"Portuguese" = "Português"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; diff --git a/UI/MainUI/English.lproj/Localizable.strings b/UI/MainUI/English.lproj/Localizable.strings index 36eb103ed..e36b4fcfb 100644 --- a/UI/MainUI/English.lproj/Localizable.strings +++ b/UI/MainUI/English.lproj/Localizable.strings @@ -33,9 +33,11 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; +"Portuguese" = "Português"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; diff --git a/UI/MainUI/Finnish.lproj/Localizable.strings b/UI/MainUI/Finnish.lproj/Localizable.strings index 21458c5c2..cb9875f16 100644 --- a/UI/MainUI/Finnish.lproj/Localizable.strings +++ b/UI/MainUI/Finnish.lproj/Localizable.strings @@ -33,9 +33,11 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; +"Portuguese" = "Português"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; diff --git a/UI/MainUI/French.lproj/Localizable.strings b/UI/MainUI/French.lproj/Localizable.strings index 3131bf5df..554b85816 100644 --- a/UI/MainUI/French.lproj/Localizable.strings +++ b/UI/MainUI/French.lproj/Localizable.strings @@ -2,9 +2,9 @@ "title" = "SOGo"; -"Username" = "Nom d'utilisateur "; -"Password" = "Mot de passe "; -"Domain" = "Domaine "; +"Username" = "Nom d'utilisateur"; +"Password" = "Mot de passe"; +"Domain" = "Domaine"; "Remember username" = "Se souvenir de moi"; "Connect" = "Connexion"; @@ -33,9 +33,11 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; +"Portuguese" = "Português"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; diff --git a/UI/MainUI/GNUmakefile b/UI/MainUI/GNUmakefile index f25dc04ef..998961abd 100644 --- a/UI/MainUI/GNUmakefile +++ b/UI/MainUI/GNUmakefile @@ -6,7 +6,7 @@ BUNDLE_NAME = MainUI MainUI_PRINCIPAL_CLASS = MainUIProduct -MainUI_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan ChineseTaiwan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak Slovenian SpanishSpain SpanishArgentina Swedish Ukrainian Welsh +MainUI_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan ChineseTaiwan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian Macedonian NorwegianBokmal NorwegianNynorsk Polish Portuguese Russian Slovak Slovenian SpanishSpain SpanishArgentina Swedish Ukrainian Welsh MainUI_OBJC_FILES += \ MainUIProduct.m \ diff --git a/UI/MainUI/German.lproj/Localizable.strings b/UI/MainUI/German.lproj/Localizable.strings index fa7d2ce07..1e0a12ad2 100644 --- a/UI/MainUI/German.lproj/Localizable.strings +++ b/UI/MainUI/German.lproj/Localizable.strings @@ -33,15 +33,17 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; -"NorwegianBokmal" = "Norsk BokmÃ¥l"; -"NorwegianNynorsk" = "Norsk Nynorsk"; +"Macedonian" = "МакедонÑки"; +"NorwegianBokmal" = "Norsk bokmÃ¥l"; +"NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; +"Portuguese" = "Português"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "Slovenian" = "SlovenÅ¡Äina"; "SpanishSpain" = "Español (España)"; -"SpanishArgentina" = "Español (Argentinien)"; +"SpanishArgentina" = "Español (Argentina)"; "Swedish" = "Svenska"; "Ukrainian" = "УкраїнÑька"; "Welsh" = "Cymraeg"; diff --git a/UI/MainUI/Hungarian.lproj/Localizable.strings b/UI/MainUI/Hungarian.lproj/Localizable.strings index 85acf770b..d400e508f 100644 --- a/UI/MainUI/Hungarian.lproj/Localizable.strings +++ b/UI/MainUI/Hungarian.lproj/Localizable.strings @@ -33,9 +33,11 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; +"Portuguese" = "Português"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; diff --git a/UI/MainUI/Icelandic.lproj/Localizable.strings b/UI/MainUI/Icelandic.lproj/Localizable.strings index 778dc07e9..bdb1c3afc 100644 --- a/UI/MainUI/Icelandic.lproj/Localizable.strings +++ b/UI/MainUI/Icelandic.lproj/Localizable.strings @@ -32,9 +32,11 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; +"Portuguese" = "Português"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; diff --git a/UI/MainUI/Italian.lproj/Localizable.strings b/UI/MainUI/Italian.lproj/Localizable.strings index 469c6468a..f65ce392e 100644 --- a/UI/MainUI/Italian.lproj/Localizable.strings +++ b/UI/MainUI/Italian.lproj/Localizable.strings @@ -33,9 +33,11 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; +"Portuguese" = "Português"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; diff --git a/UI/MainUI/Macedonian.lproj/Locale b/UI/MainUI/Macedonian.lproj/Locale new file mode 100644 index 000000000..9e7aaded3 --- /dev/null +++ b/UI/MainUI/Macedonian.lproj/Locale @@ -0,0 +1,35 @@ +/* Macedonian */ +{ + NSLanguageName = "Macedonian"; + NSFormalName = "МакедонÑки"; + NSLocaleCode = "mk"; /* ISO 639-1 */ + NSLanguageCode = "mkd"; /* ISO 639-2 */ + NSParentContext = ""; + + NSAMPMDesignation = (AM, PM); + NSCurrencySymbol = "MKD"; + NSDateFormatString = "%A, %B %e, %Y"; + NSDateTimeOrdering = DMYH; + NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); + NSDecimalSeparator = ","; + NSEarlierTimeDesignations = ("претходно", "поÑледен", "минато", "пред"); + NSHourNameDesignations = ((0, "полноќ"), (10, "утро"), (12, "пладне", "ручек"), (14, "попладне"), (19, "вечера")); + NSInternationalCurrencyString = "MKD"; /* ISO 4217 */ + NSLaterTimeDesignations = ("Ñледен"); + NSMonthNameArray = ("Јануари", "Февруари", "Март", "Ðприл", "Мај", "Јуни", "Јули", "ÐвгуÑÑ‚", "Септември", "Октомври", "Ðоември", "Декември"); + NSNextDayDesignations = ("утре"); + NSNextNextDayDesignations = ("утре"); + NSPriorDayDesignations = ("вчера"); + NSShortDateFormatString = "%m/%e/%y"; + NSShortMonthNameArray = ("Јан", "Фев", "Мар", "Ðпр", "Мај", "Јун", "Јул", "Ðвг", "Сеп", "Окт", "Ðое", "Дек"); + NSShortTimeDateFormatString = "%m/%e/%y %I:%M %p"; + NSShortWeekDayNameArray = ("Ðед", "Пон", "Вто", "Сре", "Чет", "Пет", "Саб"); + NSThisDayDesignations = ("денеÑ", "Ñега"); + NSThousandsSeparator = "."; + NSTimeDateFormatString = "%A, %B %e, %Y %I:%M:%S %p %Z"; + NSTimeFormatString = "%I:%M:%S %p"; + NSWeekDayNameArray = ("Ðедела", "Понеделник", "Вторник", "Среда", "Четврток", "Петок", "Сабота"); + NSYearMonthWeekDesignations = ("година", "меÑец", "недела"); + NSPositiveCurrencyFormatString = "9.999,00 МКД"; + NSNegativeCurrencyFormatString = "-9.999,00 МКД"; +} diff --git a/UI/MainUI/Macedonian.lproj/Localizable.strings b/UI/MainUI/Macedonian.lproj/Localizable.strings new file mode 100644 index 000000000..953a7ad9b --- /dev/null +++ b/UI/MainUI/Macedonian.lproj/Localizable.strings @@ -0,0 +1,83 @@ +/* this file is in UTF-8 format! */ + +"title" = "SOGo"; + +"Username:" = "КориÑничко име:"; +"Password:" = "Лозинка:"; +"Domain:" = "Домејн:"; +"Remember username" = "Запомни го кориÑничкото име"; + +"Connect" = "Поврзи Ñе"; + +"Wrong username or password." = "Погрешно кориÑничко име или лозинка."; +"cookiesNotEnabled" = "Ðе можете да Ñе најавите поради тоа што колачињата на вашиот прелиÑтувач не Ñе активирани. Ве молиме да ги овозможите колачињата во опциите на вашиот прелиÑтувач и да Ñе обидете повторно."; + +"browserNotCompatible" = "Забележивме дека вашиот прелиÑтувач во моментов не е поддржан од овој Ñајт. Ðаша препорака е да кориÑтите Firefox. Клинете врз овој линк да ја преземете поÑледната верзија на овој прелиÑтувач."; +"alternativeBrowsers" = "Како алтернатива иÑто така можете да кориÑтите еден оф компатибилните прелиÑтувачи"; +"alternativeBrowserSafari" = "Како крајна можноÑÑ‚, можете иÑто така да го кориÑтите Safari."; +"Download" = "Преземи"; + +"Language:" = "Јазик:"; +"choose" = "Одбери ..."; +"Arabic" = "العربية"; +"Basque" = "Euskara"; +"Catalan" = "Català"; +"ChineseTaiwan" = "Chinese (Taiwan)"; +"Czech" = "ÄŒesky"; +"Danish" = "Dansk (Danmark)"; +"Dutch" = "Nederlands"; +"English" = "English"; +"Finnish" = "Suomi"; +"French" = "Français"; +"German" = "Deutsch"; +"Hungarian" = "Magyar"; +"Icelandic" = "Ãslenska"; +"Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; +"NorwegianBokmal" = "Norsk bokmÃ¥l"; +"NorwegianNynorsk" = "Norsk nynorsk"; +"Polish" = "Polski"; +"Portuguese" = "Português"; +"BrazilianPortuguese" = "Português brasileiro"; +"Russian" = "РуÑÑкий"; +"Slovak" = "Slovensky"; +"Slovenian" = "SlovenÅ¡Äina"; +"SpanishSpain" = "Español (España)"; +"SpanishArgentina" = "Español (Argentina)"; +"Swedish" = "Svenska"; +"Ukrainian" = "УкраїнÑька"; +"Welsh" = "Cymraeg"; + +"About" = "За"; +"AboutBox" = "Развиено од Inverse, SOGo е комплетен групвер Ñервер Ñо Ñ„Ð¾ÐºÑƒÑ Ð½Ð° ÑкалабилноÑÑ‚ и едноÑтавноÑÑ‚.

\nSOGo овозможува богат AJAX-базиран Web Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÑ˜Ñ Ð¸ поддржува повеќе нативни клиенти кориÑтејќи Ñтандардни протоколи како на пример CalDAV и CardDAV.

\nSOGo е диÑтрибуиран под GNU GPL верзија 2 или подоцнежна и делови Ñе диÑтрибуиирани под GNU LGPL version 2. Ова е беÑплатен Ñофтвер: вие Ñте Ñлободни да го менувате и редиÑтрибуирате. Ðема гаранција, до ниво дозволено Ñо закон.

\nПогледни ја Ñтраницава за разни можноÑти на поддршка."; + +"Your account was locked due to too many failed attempts." = "Вашиот налог е блокиран поради премногу погрешни обиди."; +"Your account was locked due to an expired password." = "Вашата Ñметка е блокирана поради иÑтечена лозинка."; +"Login failed due to unhandled error case: " = "Ðајавувањето е неуÑпешно поради непозната грешка:"; +"Change your Password" = "Сменете ја вашата лозинка"; +"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." = "Лозинките не Ñе иÑти. Обидете Ñе повторно."; +"Password Grace Period" = "Ð“Ñ€ÐµÑ˜Ñ Ð¿ÐµÑ€Ð¸Ð¾Ð´ на лозинката"; +"You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "Ви преоÑтанаа %{0} обиди за најавување пред да Ñе блокира Ñметката. Ве молиме Ñменете ја лозинката во дадениот дијалог."; +"Password about to expire" = "Лозинката Ñао што не иÑтекла"; +"Your password is going to expire in %{0} %{1}." = "Вашата лозинка ќе иÑтеча за %{0} %{1}."; +"days" = "денови"; +"hours" = "чаÑови"; +"minutes" = "минути"; +"seconds" = "Ñекунди"; +"Password change failed" = "Промената на лозинката е неуÑпешна"; +"Password change failed - Permission denied" = "Промената на лозинката е неуÑпешна - недозволен приÑтап"; +"Password change failed - Insufficient password quality" = "Промената на лозинката е неуÑпешна - недоволен квалитет на лозинката"; +"Password change failed - Password is too short" = "Промената на лозинката е неуÑпешна - Лозинката е премногу кратка"; +"Password change failed - Password is too young" = "Промената на лозинката е неуÑпешна - Лозинката е премногу млада"; +"Password change failed - Password is in history" = "Промената на лозинката е неуÑпешна - Лозинката веќе Ñте ја кориÑтеле"; +"Unhandled policy error: %{0}" = "Ðепозната грешка на полиÑа: %{0}"; +"Unhandled error response" = "Ðепозната грешка"; +"Password change is not supported." = "Промената на лозинката не е подржана."; +"Unhandled HTTP error code: %{0}" = "Ðепозната HTTP грешка: %{0}"; +"New password:" = "Ðова лозинка:"; +"Confirmation:" = "Потврда:"; +"Cancel" = "Откажи"; +"Please wait..." = "Ве молиме почекајте..."; diff --git a/UI/MainUI/NorwegianBokmal.lproj/Localizable.strings b/UI/MainUI/NorwegianBokmal.lproj/Localizable.strings index 2c70931c3..bc32129c3 100644 --- a/UI/MainUI/NorwegianBokmal.lproj/Localizable.strings +++ b/UI/MainUI/NorwegianBokmal.lproj/Localizable.strings @@ -33,9 +33,11 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; +"Portuguese" = "Português"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; diff --git a/UI/MainUI/NorwegianNynorsk.lproj/Localizable.strings b/UI/MainUI/NorwegianNynorsk.lproj/Localizable.strings index 3481093e3..669158bf8 100644 --- a/UI/MainUI/NorwegianNynorsk.lproj/Localizable.strings +++ b/UI/MainUI/NorwegianNynorsk.lproj/Localizable.strings @@ -33,9 +33,11 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; +"Portuguese" = "Português"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; diff --git a/UI/MainUI/Polish.lproj/Localizable.strings b/UI/MainUI/Polish.lproj/Localizable.strings index 62105b655..dd8c656e1 100644 --- a/UI/MainUI/Polish.lproj/Localizable.strings +++ b/UI/MainUI/Polish.lproj/Localizable.strings @@ -33,9 +33,11 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; +"Portuguese" = "Português"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; diff --git a/UI/MainUI/Portuguese.lproj/Locale b/UI/MainUI/Portuguese.lproj/Locale new file mode 100644 index 000000000..eab1d0149 --- /dev/null +++ b/UI/MainUI/Portuguese.lproj/Locale @@ -0,0 +1,35 @@ +/* Portuguese */ +{ + NSLanguageName = "Portuguese"; + NSFormalName = "Portuguese"; + NSLocaleCode = "pt_PT"; /* ISO-639-1 */ + NSLanguageCode = "por"; /* ISO 639-2 */ + NSParentContext = ""; + + NSAMPMDesignation = (AM, PM); + NSCurrencySymbol = " €"; + NSDateFormatString = "%A, %B de %e de %Y"; + NSDateTimeOrdering = DMYH; + NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); + NSDecimalSeparator = ","; + NSEarlierTimeDesignations = (anterior, "último", passado, "atrás"); + NSHourNameDesignations = ((0, meia-noite), (10, "manhã"), (12, meio-dia, "almoço"), (14, tarde), (19, noite)); + NSInternationalCurrencyString = EUR; /* ISO 4217 */ + NSLaterTimeDesignations = ("próxima"); + NSMonthNameArray = (Janeiro, Fevereiro, "Março", Abril, Maio, Junho, Julho, Agosto, Setembro, Outubro, Novembro, Dezembro); + NSNextDayDesignations = ("amanhã"); + NSNextNextDayDesignations = ("dia seguinte"); + NSPriorDayDesignations = (ontem); + NSShortDateFormatString = "%e/%m/%y"; + NSShortMonthNameArray = (Jan, Fev, Mar, Abr, Mai, Jun, Jul, Ago, Set, Out, Nov, Dez); + NSShortTimeDateFormatString = "%e/%m/%y %H%M"; + NSShortWeekDayNameArray = (Dom, Seg, Ter, Qua, Qui, Sex, Sab); + NSThisDayDesignations = (hoje, agora); + NSThousandsSeparator = "."; + NSTimeDateFormatString = "%A, %B de %e de %Y %I:%M:%S %p %Z"; + NSTimeFormatString = "%H:%M:%S"; + NSWeekDayNameArray = (Domingo, Segunda, "Terça", Quarta, Quinta, Sexta, "Sábado"); + NSYearMonthWeekDesignations = (ano, "mês", semana); + NSPositiveCurrencyFormatString = "€ 9.999,00"; + NSNegativeCurrencyFormatString = "(€ -9.999,00)"; +} diff --git a/UI/MainUI/Portuguese.lproj/Localizable.strings b/UI/MainUI/Portuguese.lproj/Localizable.strings new file mode 100644 index 000000000..0c6522492 --- /dev/null +++ b/UI/MainUI/Portuguese.lproj/Localizable.strings @@ -0,0 +1,83 @@ +/* this file is in UTF-8 format! */ + +"title" = "SOGo"; + +"Username:" = "Utilizador:"; +"Password:" = "Senha:"; +"Domain:" = "Domínio:"; +"Remember username" = "Memorizar login"; + +"Connect" = "Conectar"; + +"Wrong username or password." = "Utilizador ou Senha Inválida."; +"cookiesNotEnabled" = "Você não pode logar por a opção cookies está desabilitada. Por favor, habilite os cookies nas configurações de seu navegador e tente novamente."; + +"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 ..."; +"Arabic" = "العربية"; +"Basque" = "Euskara"; +"Catalan" = "Català"; +"ChineseTaiwan" = "Chinese (Taiwan)"; +"Czech" = "ÄŒesky"; +"Danish" = "Dansk (Danmark)"; +"Dutch" = "Nederlands"; +"English" = "English"; +"Finnish" = "Suomi"; +"French" = "Français"; +"German" = "Deutsch"; +"Hungarian" = "Magyar"; +"Icelandic" = "Ãslenska"; +"Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; +"NorwegianBokmal" = "Norsk bokmÃ¥l"; +"NorwegianNynorsk" = "Norsk nynorsk"; +"Polish" = "Polski"; +"Portuguese" = "Português"; +"BrazilianPortuguese" = "Português brasileiro"; +"Russian" = "РуÑÑкий"; +"Slovak" = "Slovensky"; +"Slovenian" = "SlovenÅ¡Äina"; +"SpanishSpain" = "Español (España)"; +"SpanishArgentina" = "Español (Argentina)"; +"Swedish" = "Svenska"; +"Ukrainian" = "УкраїнÑька"; +"Welsh" = "Cymraeg"; + +"About" = "Sobre"; +"AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

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

⎠\nSOGo 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.

⎠\nSee this page for various support options."; + +"Your account was locked due to too many failed attempts." = "A sua conta foi bloqueada devido a muitas tentativas falhadas."; +"Your account was locked due to an expired password." = "A sua conta foi bloqueada devido a uma senha expirada."; +"Login failed due to unhandled error case: " = "O Login falhou pelo seguinte erro:"; +"Change your Password" = "Altere sua Senha"; +"The password was changed successfully." = "Senha alterada com sucesso."; +"Your password has expired, please enter a new one below:" = "A sua senha expirou, por favor, insira uma nova abaixo:"; +"Password must not be empty." = "A Senha não pode estar vazia."; +"The passwords do not match. Please try again." = "As senhas não coincidem. Por favor, tente novamente."; +"Password Grace Period" = "Periodo de carência da Senha"; +"You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "Você tem %{0} logins restantes antes de bloquear a sua conta. Por favor, altere sua senha no menu preferências."; +"Password about to expire" = "Senha prestes a expirar"; +"Your password is going to expire in %{0} %{1}." = "A sua senha vai expirar em %{0} %{1}."; +"days" = "dias"; +"hours" = "horas"; +"minutes" = "minutos"; +"seconds" = "segundos"; +"Password change failed" = "Alteração da senha falhou"; +"Password change failed - Permission denied" = "Alteração da senha falhou - Permissão negada"; +"Password change failed - Insufficient password quality" = "Alteração da senha falhou - Senha muito fraca"; +"Password change failed - Password is too short" = "Alteração da senha falhou - Senha muito curta"; +"Password change failed - Password is too young" = "Alteração da senha falhou - Senha usada recentemente"; +"Password change failed - Password is in history" = "Password is too young - Senha está no histórico"; +"Unhandled policy error: %{0}" = "Política de erro não tratada: %{0}"; +"Unhandled error response" = "Erro de resposta não tratado"; +"Password change is not supported." = "Alteração da senha não suportada."; +"Unhandled HTTP error code: %{0}" = "Erro HTTP não tratado: %{0}"; +"New password:" = "Nova senha:"; +"Confirmation:" = "Confirmação:"; +"Cancel" = "Cancelar"; +"Please wait..." = "Por favor, aguarde..."; diff --git a/UI/MainUI/Russian.lproj/Localizable.strings b/UI/MainUI/Russian.lproj/Localizable.strings index fde95a6ae..627bb7ddc 100644 --- a/UI/MainUI/Russian.lproj/Localizable.strings +++ b/UI/MainUI/Russian.lproj/Localizable.strings @@ -33,9 +33,11 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; +"Portuguese" = "Português"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; diff --git a/UI/MainUI/SOGoMicrosoftActiveSyncActions.m b/UI/MainUI/SOGoMicrosoftActiveSyncActions.m index c487d5cce..ea9566dee 100644 --- a/UI/MainUI/SOGoMicrosoftActiveSyncActions.m +++ b/UI/MainUI/SOGoMicrosoftActiveSyncActions.m @@ -30,6 +30,9 @@ #import #import +#import +#import + @interface SOGoMicrosoftActiveSyncActions : WODirectAction @end @@ -47,7 +50,7 @@ id dispatcher; Class clazz; - request = [context request]; + request = (WORequest *)[context request]; response = [self responseWithStatus: 200]; bundle = [NSBundle bundleForClass: NSClassFromString(@"ActiveSyncProduct")]; diff --git a/UI/MainUI/Slovak.lproj/Localizable.strings b/UI/MainUI/Slovak.lproj/Localizable.strings index f2272dd65..40d0532c4 100644 --- a/UI/MainUI/Slovak.lproj/Localizable.strings +++ b/UI/MainUI/Slovak.lproj/Localizable.strings @@ -20,29 +20,33 @@ "Language" = "Jazyk"; "choose" = "Výber ..."; "Arabic" = "العربية"; -"Catalan" = "Katalánsky"; +"Basque" = "Euskara"; +"Catalan" = "Català"; +"ChineseTaiwan" = "Chinese (Taiwan)"; "Czech" = "ÄŒesky"; "Danish" = "Dansk (Danmark)"; -"Dutch" = "Holandsky"; -"English" = "Anglicky"; +"Dutch" = "Nederlands"; +"English" = "English"; "Finnish" = "Suomi"; -"French" = "Francúzsky"; -"German" = "Nemecky"; -"Hungarian" = "MaÄarsky"; -"Icelandic" = "IslandÄina"; -"Italian" = "Taliansky"; -"NorwegianBokmal" = "NórÄina bokmÃ¥l"; -"NorwegianNynorsk" = "NórÄina nynorsk"; -"Polish" = "Poľština"; -"BrazilianPortuguese" = "Portugalská brazílÅ¡tina"; -"Russian" = "RuÅ¡tina"; +"French" = "Français"; +"German" = "Deutsch"; +"Hungarian" = "Magyar"; +"Icelandic" = "Ãslenska"; +"Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; +"NorwegianBokmal" = "Norsk bokmÃ¥l"; +"NorwegianNynorsk" = "Norsk nynorsk"; +"Polish" = "Polski"; +"Portuguese" = "Português"; +"BrazilianPortuguese" = "Português brasileiro"; +"Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "Slovenian" = "SlovenÅ¡Äina"; -"SpanishSpain" = "Å panielÄina (Å panielsko)"; -"SpanishArgentina" = "Å panielÄina (Argentína)"; -"Swedish" = "Å védÄina"; -"Ukrainian" = "UkrajinÄina"; -"Welsh" = "GalÄina"; +"SpanishSpain" = "Español (España)"; +"SpanishArgentina" = "Español (Argentina)"; +"Swedish" = "Svenska"; +"Ukrainian" = "УкраїнÑька"; +"Welsh" = "Cymraeg"; "About" = "O"; "AboutBox" = "Vyvinuté Inverse, SOGo je plne vybavený groupware server s dôrazom na Å¡kálovateľnosÅ¥ a jednoduchosÅ¥.

\nSOGo ponúka bohaté Web rozhranie na báze AJAX-u a natívne podporuje mnoho klientov použitím štandardov ako sú CalDAV a CardDAV.

\nSOGo je distribuované pod licenciou GNU GPL verzie 2 alebo novÅ¡ej a niektoré Äasti pod licenciou GNU LGPL verzie 2. Toto je voľne šíritelný softvér: môžete ho meniÅ¥ a šíriÅ¥ Äalej. Neexistuje ŽIADNA ZÃRUKA, v rozsahu povolenom zákonom.

\nPozrite si túto stránku pre rôzne možnosti podpory."; diff --git a/UI/MainUI/Slovenian.lproj/Localizable.strings b/UI/MainUI/Slovenian.lproj/Localizable.strings index 9d7f33379..13e20e588 100644 --- a/UI/MainUI/Slovenian.lproj/Localizable.strings +++ b/UI/MainUI/Slovenian.lproj/Localizable.strings @@ -20,6 +20,7 @@ "Language" = "Jezik"; "choose" = "Izberi ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "ChineseTaiwan" = "Chinese (Taiwan)"; "Czech" = "ÄŒesky"; @@ -32,9 +33,11 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; +"Portuguese" = "Português"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; diff --git a/UI/MainUI/SpanishArgentina.lproj/Localizable.strings b/UI/MainUI/SpanishArgentina.lproj/Localizable.strings index 804006ff9..150cf9879 100644 --- a/UI/MainUI/SpanishArgentina.lproj/Localizable.strings +++ b/UI/MainUI/SpanishArgentina.lproj/Localizable.strings @@ -33,9 +33,11 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; +"Portuguese" = "Português"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; diff --git a/UI/MainUI/SpanishSpain.lproj/Localizable.strings b/UI/MainUI/SpanishSpain.lproj/Localizable.strings index 479321ffb..c91a5896e 100644 --- a/UI/MainUI/SpanishSpain.lproj/Localizable.strings +++ b/UI/MainUI/SpanishSpain.lproj/Localizable.strings @@ -33,9 +33,11 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; +"Portuguese" = "Português"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; diff --git a/UI/MainUI/Swedish.lproj/Localizable.strings b/UI/MainUI/Swedish.lproj/Localizable.strings index e8c165a34..b4b074c0f 100644 --- a/UI/MainUI/Swedish.lproj/Localizable.strings +++ b/UI/MainUI/Swedish.lproj/Localizable.strings @@ -32,9 +32,11 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; +"Portuguese" = "Português"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; diff --git a/UI/MainUI/Ukrainian.lproj/Localizable.strings b/UI/MainUI/Ukrainian.lproj/Localizable.strings index f18b55f22..bbf1ca544 100644 --- a/UI/MainUI/Ukrainian.lproj/Localizable.strings +++ b/UI/MainUI/Ukrainian.lproj/Localizable.strings @@ -33,9 +33,11 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; -"NorwegianNynorsk" = "Norsk bokmÃ¥l"; +"NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; +"Portuguese" = "Português"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; diff --git a/UI/MainUI/Welsh.lproj/Localizable.strings b/UI/MainUI/Welsh.lproj/Localizable.strings index d9e58ef44..205508fd6 100644 --- a/UI/MainUI/Welsh.lproj/Localizable.strings +++ b/UI/MainUI/Welsh.lproj/Localizable.strings @@ -32,9 +32,11 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; +"Portuguese" = "Português"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; diff --git a/UI/PreferencesUI/Arabic.lproj/Localizable.strings b/UI/PreferencesUI/Arabic.lproj/Localizable.strings index b3ed4f16e..31e323b06 100644 --- a/UI/PreferencesUI/Arabic.lproj/Localizable.strings +++ b/UI/PreferencesUI/Arabic.lproj/Localizable.strings @@ -12,7 +12,7 @@ "Forward" = "ارسال الى"; "Password" = "كلمة السر"; "Categories" = "Ø§Ù„ÙØ¦Ø§Øª"; -"Name" = "اسم "; +"Name" = "اسم"; "Color" = "اللون"; "Add" = "Ø¥Ø¶Ø§ÙØ©"; "Delete" = "مسح"; @@ -185,7 +185,7 @@ /* Event+task classifications */ "Default events classification" ="تصني٠الأحداث Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠØ©"; -"Default tasks classification" ="تصني٠المهام Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠØ© "; +"Default tasks classification" ="تصني٠المهام Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠØ©"; "PUBLIC_item" = "علني"; "CONFIDENTIAL_item" = "سري"; "PRIVATE_item" = "خاص"; @@ -199,7 +199,7 @@ "Contacts" = "Ø¯ÙØªØ± العناوين"; "Mail" = "بريد"; "Last" = "أخر إستخدام"; -"Default Module " = "وحدة نمطية Ø§ÙØªØ±Ø§Ø¶ÙŠØ© "; +"Default Module " = "وحدة نمطية Ø§ÙØªØ±Ø§Ø¶ÙŠØ©"; "Language" ="اللغة"; "choose" = "اختيار ..."; @@ -217,9 +217,11 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "Polish" = "Polski"; +"Portuguese" = "Português"; "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; @@ -260,7 +262,7 @@ "Subject" = "موضوع"; "From" = "من"; "To" = "إلى"; -"Cc" = "نسخة "; +"Cc" = "نسخة"; "To or Cc" = "إلى أو نسخة"; "Size (Kb)" = "الحجم (كيلو بايت)"; "Header" = "قمة"; @@ -275,7 +277,7 @@ "is under" = "هو تحت"; "is over" = "هو Ùوق"; -"is" = "هو "; +"is" = "هو"; "is not" = "هو لا"; "contains" = "يحتوي"; "does not contain" = "لا يحتوي"; diff --git a/UI/PreferencesUI/Basque.lproj/Localizable.strings b/UI/PreferencesUI/Basque.lproj/Localizable.strings index bfdd4d1cf..776a85242 100644 --- a/UI/PreferencesUI/Basque.lproj/Localizable.strings +++ b/UI/PreferencesUI/Basque.lproj/Localizable.strings @@ -229,10 +229,12 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "BrazilianPortuguese" = "Português brasileiro"; "Polish" = "Polski"; +"Portuguese" = "Português"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "Slovenian" = "SlovenÅ¡Äina"; diff --git a/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings b/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings index af865affe..b328bade8 100644 --- a/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings @@ -203,7 +203,7 @@ /* Event+task categories */ "category_none" = "Nenhum"; -"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"; +"calendar_category_labels" = "Celebração Anual,Aniversário,Negócios,Ligações,Clientes,Concorrência,Comprador,Favoritos,Acompanhamento,Presentes,Feriados,Idéias,Reunião,Problemas,Miscelânea,Pessoal,Projetos,Feriado,Posição,Fornecedores,Viagem,Férias"; /* Default module */ "Calendar" = "Calendário"; @@ -229,10 +229,12 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "BrazilianPortuguese" = "Português brasileiro"; "Polish" = "Polski"; +"Portuguese" = "Português"; "Russian" = "РуÑÑкий"; "Slovak" = "Eslovaco"; "SpanishSpain" = "Español (España)"; diff --git a/UI/PreferencesUI/Catalan.lproj/Localizable.strings b/UI/PreferencesUI/Catalan.lproj/Localizable.strings index 94265f14b..49d324285 100644 --- a/UI/PreferencesUI/Catalan.lproj/Localizable.strings +++ b/UI/PreferencesUI/Catalan.lproj/Localizable.strings @@ -30,7 +30,7 @@ "Disable auto reply on" = "Desactivar la resposta automàtica en"; "Please specify your message and your email addresses for which you want to enable auto reply." = "Especifiqueu el missatge i les adreces de correu per a les quals voleu activar la resposta automàtica."; -"Your vacation message must not end with a single dot on a line." = "El seu missatge d'autoresposta per vacances no ha d'acabar amb un punt en una línia a part. "; +"Your vacation message must not end with a single dot on a line." = "El seu missatge d'autoresposta per vacances no ha d'acabar amb un punt en una línia a part."; "End date of your auto reply must be in the future." = "La data de finalització de la seva resposta automàtica ha d'estar en el futur."; @@ -134,7 +134,7 @@ "Show subscribed mailboxes only" = "Mostrar només les bústies subscrites"; "Sort messages by threads" = "Ordenar els missatges per temes"; "When sending mail, add unknown recipients to my" = "En enviar un missatge, afegeix els destinataris desconeguts al meu"; -"Check for new mail:" = "Comprovar nou correu: "; +"Check for new mail:" = "Comprovar nou correu:"; "refreshview_manually" = "Manualment"; "refreshview_every_minute" = "Cada minut"; "refreshview_every_2_minutes" = "Cada 2 minuts"; @@ -177,15 +177,15 @@ "Full Name" = "Nom complet"; "Email" = "Correu electrònic"; -"Reply To Email" = "Respondre a aquesta adreça de correu "; +"Reply To Email" = "Respondre a aquesta adreça de correu"; "Signature" = "Signatura"; "(Click to create)" = "(Clic per a crear-la)"; "Signature" = "Signatura"; "Please enter your signature below:" = "Si us plau, poseu la signatura a sota:"; -"Please specify a valid sender address." = "Per favor, especifique una adreça vàlida per al remitent. "; -"Please specify a valid reply-to address." = "Per favor, especifique una adreça de resposta vàlida. "; +"Please specify a valid sender address." = "Per favor, especifique una adreça vàlida per al remitent."; +"Please specify a valid reply-to address." = "Per favor, especifique una adreça de resposta vàlida."; /* Additional Parameters */ "Additional Parameters" = "Paràmetres addicionals"; @@ -198,9 +198,9 @@ /* Event+task classifications */ "Default events classification" ="Classificació per defecte dels esdeveniments"; "Default tasks classification" ="Classificació per defecte de les tasques"; -"PUBLIC_item" = "Públic "; -"CONFIDENTIAL_item" = "Confidencial "; -"PRIVATE_item" = "Privat "; +"PUBLIC_item" = "Públic"; +"CONFIDENTIAL_item" = "Confidencial"; +"PRIVATE_item" = "Privat"; /* Event+task categories */ "category_none" = "Cap"; @@ -211,7 +211,7 @@ "Contacts" = "Llibreta d'adreces"; "Mail" = "Correu"; "Last" = "Últim usat"; -"Default Module " = "Pàgina per defecte "; +"Default Module " = "Pàgina per defecte"; "SOGo Version" ="Versió del SOGo"; "Language" ="Language"; @@ -230,10 +230,12 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "BrazilianPortuguese" = "Português brasileiro"; "Polish" = "Polski"; +"Portuguese" = "Português"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "Slovenian" = "SlovenÅ¡Äina"; diff --git a/UI/PreferencesUI/ChineseTaiwan.lproj/Localizable.strings b/UI/PreferencesUI/ChineseTaiwan.lproj/Localizable.strings index 547d283c2..9f48a77cd 100644 --- a/UI/PreferencesUI/ChineseTaiwan.lproj/Localizable.strings +++ b/UI/PreferencesUI/ChineseTaiwan.lproj/Localizable.strings @@ -216,7 +216,9 @@ "Language" ="語言"; "choose" = "鏿“‡..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; +"ChineseTaiwan" = "Chinese (Taiwan)"; "Czech" = "ÄŒesky"; "Danish" = "Dansk (Danmark)"; "Dutch" = "Nederlands"; @@ -227,12 +229,15 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "BrazilianPortuguese" = "Português brasileiro"; "Polish" = "Polski"; +"Portuguese" = "Português"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; +"Slovenian" = "SlovenÅ¡Äina"; "SpanishSpain" = "Español (España)"; "SpanishArgentina" = "Español (Argentina)"; "Swedish" = "Svenska"; diff --git a/UI/PreferencesUI/Czech.lproj/Localizable.strings b/UI/PreferencesUI/Czech.lproj/Localizable.strings index 964738409..bf8697b51 100644 --- a/UI/PreferencesUI/Czech.lproj/Localizable.strings +++ b/UI/PreferencesUI/Czech.lproj/Localizable.strings @@ -210,7 +210,7 @@ "Contacts" = "Adresář"; "Mail" = "PoÅ¡ta"; "Last" = "Naposledy použitý"; -"Default Module " = "Výchozí modul "; +"Default Module " = "Výchozí modul"; "SOGo Version" ="SOGo verze"; "Language" ="Jazyk"; @@ -229,10 +229,12 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "BrazilianPortuguese" = "Portugues brasileiro"; "Polish" = "Polski"; +"Portuguese" = "Português"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "Slovenian" = "SlovenÅ¡Äina"; diff --git a/UI/PreferencesUI/Danish.lproj/Localizable.strings b/UI/PreferencesUI/Danish.lproj/Localizable.strings index f30f3066f..3ecb7a20c 100644 --- a/UI/PreferencesUI/Danish.lproj/Localizable.strings +++ b/UI/PreferencesUI/Danish.lproj/Localizable.strings @@ -217,6 +217,7 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk"; "NorwegianNynorsk" = "Nynorsk"; "BrazilianPortuguese" = "Português brasileiro"; diff --git a/UI/PreferencesUI/Dutch.lproj/Localizable.strings b/UI/PreferencesUI/Dutch.lproj/Localizable.strings index 0500dd1d9..33a6c7a87 100644 --- a/UI/PreferencesUI/Dutch.lproj/Localizable.strings +++ b/UI/PreferencesUI/Dutch.lproj/Localizable.strings @@ -229,10 +229,12 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk BokmÃ¥l"; "NorwegianNynorsk" = "Norsk Nynorsk"; "BrazilianPortuguese" = "Português brasileiro"; "Polish" = "Polski"; +"Portuguese" = "Português"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "Slovenian" = "SlovenÅ¡Äina"; diff --git a/UI/PreferencesUI/English.lproj/Localizable.strings b/UI/PreferencesUI/English.lproj/Localizable.strings index 8036e6166..2f1e2ed9c 100644 --- a/UI/PreferencesUI/English.lproj/Localizable.strings +++ b/UI/PreferencesUI/English.lproj/Localizable.strings @@ -229,10 +229,12 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; -"BrazilianPortuguese" = "Português brasileiro"; "Polish" = "Polski"; +"Portuguese" = "Português"; +"BrazilianPortuguese" = "Português brasileiro"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "Slovenian" = "SlovenÅ¡Äina"; diff --git a/UI/PreferencesUI/Finnish.lproj/Localizable.strings b/UI/PreferencesUI/Finnish.lproj/Localizable.strings index 780d98acf..466a13f0b 100644 --- a/UI/PreferencesUI/Finnish.lproj/Localizable.strings +++ b/UI/PreferencesUI/Finnish.lproj/Localizable.strings @@ -229,10 +229,12 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "BrazilianPortuguese" = "Português brasileiro"; "Polish" = "Polski"; +"Portuguese" = "Português"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "Slovenian" = "SlovenÅ¡Äina"; @@ -250,13 +252,13 @@ "refreshview_every_10_minutes" = "10 minuutin välein"; "refreshview_every_20_minutes" = "20 minuutin välein"; "refreshview_every_30_minutes" = "Puolen tunnin välein"; -"refreshview_once_per_hour" = "Kerran tunnissa "; +"refreshview_once_per_hour" = "Kerran tunnissa"; /* Return receipts */ "When I receive a request for a return receipt" = "Kun saan kuittauspyynnön"; "Never send a return receipt" = "Alä koskaan lähetä kuittausta"; "Allow return receipts for some messages" = "Salli kuittaukset joillekin viesteille"; -"If I'm not in the To or Cc of the message" = "Jos en ole viestin To tai Cc -kentissä "; +"If I'm not in the To or Cc of the message" = "Jos en ole viestin To tai Cc -kentissä"; "If the sender is outside my domain" = "Jos lähettäjä on oman toimialueeni ulkopuolelta"; "In all other cases" = "Kaikissa muissa tapauksissa"; @@ -326,7 +328,7 @@ "Password change failed - Password is too short" = "Salasanan vaihto epäonnistui - Liian lyhyt salasana"; "Password change failed - Password is too young" = "Salasanan vaihto epäonnistui - Salasana on liian nuori"; "Password change failed - Password is in history" = "Salasanan vaihto epäonnistui - Salasanaa on käytetty aiemmin"; -"Unhandled policy error: %{0}" = "Käsittelemätön sääntövirhe: %{0} "; +"Unhandled policy error: %{0}" = "Käsittelemätön sääntövirhe: %{0}"; "Unhandled error response" = "Käsittelemätön virhevastaus"; "Password change is not supported." = "Salasanan vaihto ei ole tuettu."; "Unhandled HTTP error code: %{0}" = "Käsittelämätön HTTP virhekoodi: %{0}"; diff --git a/UI/PreferencesUI/French.lproj/Localizable.strings b/UI/PreferencesUI/French.lproj/Localizable.strings index 2be47f50c..76b93179e 100644 --- a/UI/PreferencesUI/French.lproj/Localizable.strings +++ b/UI/PreferencesUI/French.lproj/Localizable.strings @@ -140,7 +140,7 @@ "Sort messages by threads" = "Grouper les discussions"; "When sending mail, add unknown recipients to my" = "Lors de l'envoi d'un message, ajouter les destinataires inconnus au carnet"; -"Forward messages" = "Transférer les messages "; +"Forward messages" = "Transférer les messages"; "messageforward_inline" = "intégrés"; "messageforward_attached" = "en pièces jointes"; @@ -167,17 +167,17 @@ /* IMAP Accounts */ "New Mail Account" = "Nouveau compte"; -"Server Name" = "Serveur "; -"Port" = "Port "; -"Encryption" = "Chiffrement "; +"Server Name" = "Serveur"; +"Port" = "Port"; +"Encryption" = "Chiffrement"; "None" = "Aucun"; -"User Name" = "Utilisateur "; -"Password" = "Mot de passe "; +"User Name" = "Utilisateur"; +"Password" = "Mot de passe"; -"Full Name" = "Nom complet "; -"Email" = "Email "; -"Reply To Email" = "Adresse de retour "; -"Signature" = "Signature "; +"Full Name" = "Nom complet"; +"Email" = "Email"; +"Reply To Email" = "Adresse de retour"; +"Signature" = "Signature"; "(Click to create)" = "(Signature vide)"; "Signature" = "Signature"; @@ -210,7 +210,7 @@ "Contacts" = "Carnet d'adresses"; "Mail" = "Courrier"; "Last" = "Dernier utilisé"; -"Default Module " = "Module par défaut "; +"Default Module " = "Module par défaut"; "SOGo Version" ="Version"; "Language" ="Langue"; @@ -229,10 +229,12 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "BrazilianPortuguese" = "Português brasileiro"; "Polish" = "Polski"; +"Portuguese" = "Português"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "Slovenian" = "SlovenÅ¡Äina"; diff --git a/UI/PreferencesUI/GNUmakefile b/UI/PreferencesUI/GNUmakefile index 450ede6ec..8f02f34b4 100644 --- a/UI/PreferencesUI/GNUmakefile +++ b/UI/PreferencesUI/GNUmakefile @@ -6,7 +6,7 @@ BUNDLE_NAME = PreferencesUI PreferencesUI_PRINCIPAL_CLASS = PreferencesUIProduct -PreferencesUI_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan ChineseTaiwan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak Slovenian SpanishSpain SpanishArgentina Swedish Ukrainian Welsh +PreferencesUI_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan ChineseTaiwan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian Macedonian NorwegianBokmal NorwegianNynorsk Polish Portuguese Russian Slovak Slovenian SpanishSpain SpanishArgentina Swedish Ukrainian Welsh PreferencesUI_OBJC_FILES = \ PreferencesUIProduct.m \ diff --git a/UI/PreferencesUI/German.lproj/Localizable.strings b/UI/PreferencesUI/German.lproj/Localizable.strings index 48bd15efc..2a1fc413d 100644 --- a/UI/PreferencesUI/German.lproj/Localizable.strings +++ b/UI/PreferencesUI/German.lproj/Localizable.strings @@ -144,7 +144,7 @@ "messageforward_inline" = "Eingebunden"; "messageforward_attached" = "Als Anhang"; -"When replying to a message" = "Wenn auf eine Nachricht geantwortet wird "; +"When replying to a message" = "Wenn auf eine Nachricht geantwortet wird"; "replyplacement_above" = "Antwort oberhalb des Zitates beginnen"; "replyplacement_below" = "Antwort unterhalb des Zitates beginnen"; "And place my signature" = "Und setze meine Signatur"; @@ -229,10 +229,12 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "BrazilianPortuguese" = "Português brasileiro"; "Polish" = "Polski"; +"Portuguese" = "Português"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "Slovenian" = "SlovenÅ¡Äina"; diff --git a/UI/PreferencesUI/Hungarian.lproj/Localizable.strings b/UI/PreferencesUI/Hungarian.lproj/Localizable.strings index ce7ae70e6..16c224661 100644 --- a/UI/PreferencesUI/Hungarian.lproj/Localizable.strings +++ b/UI/PreferencesUI/Hungarian.lproj/Localizable.strings @@ -137,7 +137,7 @@ "Labels" = "Címkék"; "Label" = "Címke"; "Show subscribed mailboxes only" = "Csak azok a fiókok mutatása, amelyre feliratkozott"; -"Sort messages by threads" = "Üzenetek beszélgetések szerinti rendezése "; +"Sort messages by threads" = "Üzenetek beszélgetések szerinti rendezése"; "When sending mail, add unknown recipients to my" = "Levél küldésekor az ismeretlen címeket adja hozzá a következÅ‘höz"; "Forward messages" = "Üzenetek továbbítása"; @@ -229,12 +229,15 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "BrazilianPortuguese" = "Português brasileiro"; "Polish" = "Polski"; +"Portuguese" = "Português"; "Russian" = "РуÑÑкий"; -"Slovak" = "Szlovén"; +"Slovak" = "Slovensky"; +"Slovenian" = "SlovenÅ¡Äina"; "SpanishSpain" = "Español (España)"; "SpanishArgentina" = "Español (Argentina)"; "Swedish" = "Svenska"; diff --git a/UI/PreferencesUI/Icelandic.lproj/Localizable.strings b/UI/PreferencesUI/Icelandic.lproj/Localizable.strings index 05088a434..733f8d73a 100644 --- a/UI/PreferencesUI/Icelandic.lproj/Localizable.strings +++ b/UI/PreferencesUI/Icelandic.lproj/Localizable.strings @@ -137,7 +137,7 @@ "User Name" = "Notandanafn"; "Password" = "Lykilorð"; -"Full Name" = "Fullt nafn "; +"Full Name" = "Fullt nafn"; "Email" = "Tölvupóstfang"; "Signature" = "Undirritun"; "(Click to create)" = "(Smella til að búa til)"; @@ -169,7 +169,7 @@ "Contacts" = "Nafnaskrá"; "Mail" = "Póstur"; "Last" = "Síðast notað"; -"Default Module " = "Sjálfgefið viðmót "; +"Default Module " = "Sjálfgefið viðmót"; "Language" ="Tungumál"; "choose" = "Velja..."; @@ -187,10 +187,12 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "BrazilianPortuguese" = "Português brasileiro"; "Polish" = "Polski"; +"Portuguese" = "Português"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "Slovenian" = "SlovenÅ¡Äina"; diff --git a/UI/PreferencesUI/Italian.lproj/Localizable.strings b/UI/PreferencesUI/Italian.lproj/Localizable.strings index 0df2c568a..5f606739d 100644 --- a/UI/PreferencesUI/Italian.lproj/Localizable.strings +++ b/UI/PreferencesUI/Italian.lproj/Localizable.strings @@ -30,7 +30,7 @@ "Disable auto reply on" = "Disabilita il risponditore automatico"; "Please specify your message and your email addresses for which you want to enable auto reply." = "Prego specificare il tuo messaggio e l'indirizzo email per il quale vuoi abilitare il risponditore automatico."; -"Your vacation message must not end with a single dot on a line." = "Il messaggio dell'auto-risponditore non deve finire con un singolo punto per linea "; +"Your vacation message must not end with a single dot on a line." = "Il messaggio dell'auto-risponditore non deve finire con un singolo punto per linea"; "End date of your auto reply must be in the future." = "La data di fine del risponditore automatico deve essere nel futuro"; @@ -190,7 +190,7 @@ "Contacts" = "Rubrica"; "Mail" = "Posta"; "Last" = "Ultimo usato"; -"Default Module " = "Modulo di default "; +"Default Module " = "Modulo di default"; "Language" ="Lingua"; "choose" = "Scegli..."; @@ -208,10 +208,12 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "BrazilianPortuguese" = "Português brasileiro"; "Polish" = "Polski"; +"Portuguese" = "Português"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "Slovenian" = "SlovenÅ¡Äina"; diff --git a/UI/PreferencesUI/Macedonian.lproj/Localizable.strings b/UI/PreferencesUI/Macedonian.lproj/Localizable.strings new file mode 100644 index 000000000..542f329c1 --- /dev/null +++ b/UI/PreferencesUI/Macedonian.lproj/Localizable.strings @@ -0,0 +1,334 @@ +/* toolbar */ +"Save and Close" = "Сними и затвори"; +"Close" = "Затвори"; + +/* tabs */ +"General" = "Општо"; +"Calendar Options" = "Опции за календарот"; +"Contacts Options" = "Опции за адреÑната книга"; +"Mail Options" = "Опции за електронÑката пошта"; +"IMAP Accounts" = "IMAP Ñметки"; +"Vacation" = "Одмор"; +"Forward" = "Ðапред"; +"Password" = "Лозинка"; +"Categories" = "Категории"; +"Appointments invitations" = "Покани за ÑоÑтаноци"; +"Name" = "Име"; +"Color" = "Боја"; +"Add" = "Додади"; +"Delete" = "Избриши"; + +/* contacts categories */ +"contacts_category_labels" = "Колега, конкурент, клиент, пријател, фамилија, деловен партнер, провајдер, новинар, ВИП"; + +/* vacation (auto-reply) */ +"Enable vacation auto reply" = "Овозможи автоматÑки одговор поради одмор"; +"Auto reply message" = "Порака за автоматÑки одговор"; +"Email addresses (separated by commas)" = "ЕлектронÑки адреÑи (раздвоени Ñо запирки)"; +"Add default email addresses" = "Додади ја оÑновната адреÑа за електронÑка пошта"; +"Days between responses" = "Денови помеѓу одговорите"; +"Do not send responses to mailing lists" = "Ðе иÑпраќај одговори кон мејлинг лиÑти"; +"Disable auto reply on" = "ИÑклучи го автоматÑкиот одговор"; +"Always send vacation message response" = "Секогаш иÑпрати порака кога Ñи на одмор"; +"Please specify your message and your email addresses for which you want to enable auto reply." += "Креирајте ја вашата порака и електронÑка адреÑа за која Ñакате да го овозможите автоматÑкото одговарање."; +"Your vacation message must not end with a single dot on a line." = "Вашата порака кога Ñте отÑатен не Ñмее да заврши Ñо една точка во линијата."; +"End date of your auto reply must be in the future." += "Крајниот датум на вашиот автоматÑки одговор мора да биде во иднина."; + +/* forward messages */ +"Forward incoming messages" = "Препрати ги пораките кои доаѓаат"; +"Keep a copy" = "Задржи копија"; +"Please specify an address to which you want to forward your messages." += "Определете ја електронÑката адреÑа на која Ñакате да ги препраќате пораките."; +"You are not allowed to forward your messages to an external email address." = "Ðе ви е дозволено да ја проÑледите пораката кон надворешна електронÑка адреÑа."; +"You are not allowed to forward your messages to an internal email address." = "Ðе ви е дозволено да ја проÑледите пораката кон интерна електронÑка адреÑа."; + + +/* d & t */ +"Current Time Zone" = "Тековна временÑка зона"; +"Short Date Format" = "Краток формат за датум"; +"Long Date Format" = "Долг формат за даум"; +"Time Format" = "Формат за време"; + +"default" = "Стандардно"; + +"shortDateFmt_0" = "%d-%b-%y"; + +"shortDateFmt_1" = "%d-%b-%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" = ""; +"longDateFmt_5" = ""; +"longDateFmt_6" = ""; +"longDateFmt_7" = ""; +"longDateFmt_8" = ""; +"longDateFmt_9" = ""; +"longDateFmt_10" = ""; + +"timeFmt_0" = "%I:%M %p"; +"timeFmt_1" = "%H:%M"; +"timeFmt_2" = ""; +"timeFmt_3" = ""; +"timeFmt_4" = ""; + +/* calendar */ +"Week begins on" = "Ðеделата запонува на"; +"Day start time" = "Почетен датум"; +"Day end time" = "Краен датум"; +"Day start time must be prior to day end time." = "Почетокот мора да биде пред завршетокот (денови)."; +"Show time as busy outside working hours" = "Прикажи го надвор од работното време како зафатено"; +"First week of year" = "Прва недела од годината"; +"Enable reminders for Calendar items" = "Овозможи ги потÑетниците за календарот"; +"Play a sound when a reminder comes due" = "Звучно потÑети кога ќе дојде потÑетникот"; +"Default reminder" = "Стандарден потÑетник"; + +"firstWeekOfYear_January1" = "Започнува на 1ви Јануари"; +"firstWeekOfYear_First4DayWeek" = "Првата 4-дневна недела"; +"firstWeekOfYear_FirstFullWeek" = "Првата цела недела"; + +"Prevent from being invited to appointments" = "Избегни да бидеш повикан на ÑоÑтаноци"; +"White list for appointment invitations" = "Бела лиÑта на покани за ÑоÑтанок"; +"Contacts Names" = "Имиња на контактите"; + +/* Default Calendar */ +"Default calendar" = "Стандарден календар"; +"selectedCalendar" = "Одбери го календарот"; +"personalCalendar" = "Личен календар"; +"firstCalendar" = "Првиот активен календар"; + +"reminder_NONE" = "Без потÑетник"; +"reminder_5_MINUTES_BEFORE" = "5 минути пред"; +"reminder_10_MINUTES_BEFORE" = "10 минути пред"; +"reminder_15_MINUTES_BEFORE" = "15 минути пред"; +"reminder_30_MINUTES_BEFORE" = "30 минути пред"; +"reminder_45_MINUTES_BEFORE" = "45 минути пред"; +"reminder_1_HOUR_BEFORE" = "1 Ñ‡Ð°Ñ Ð¿Ñ€ÐµÐ´"; +"reminder_2_HOURS_BEFORE" = "2 чаÑа пред"; +"reminder_5_HOURS_BEFORE" = "5 чаÑа пред"; +"reminder_15_HOURS_BEFORE" = "15 чаÑа пред"; +"reminder_1_DAY_BEFORE" = "1 ден пред"; +"reminder_2_DAYS_BEFORE" = "2 дена пред"; +"reminder_1_WEEK_BEFORE" = "1 недела пред"; + +/* Mailer */ +"Labels" = "Лабели"; +"Label" = "Лабела"; +"Show subscribed mailboxes only" = "Прикажи ги Ñамо претплатените поштенÑки Ñандачиња"; +"Sort messages by threads" = "Сортирај ги пораките Ñпоред конверзацијата"; +"When sending mail, add unknown recipients to my" = "Кога иÑпраќаш порака, додади ги непознатите приматели во мојата"; + +"Forward messages" = "Препрати ги пораките"; +"messageforward_inline" = "Во текÑтот"; +"messageforward_attached" = "Како прилог"; + +"When replying to a message" = "Кога одговарам на порака"; +"replyplacement_above" = "Започни гоодговорот над цитатот"; +"replyplacement_below" = "Започни го одговорот под цитатот"; +"And place my signature" = "И Ñтави го мојот потпиÑ"; +"signatureplacement_above" = "под мојот одговор"; +"signatureplacement_below" = "под цитатот"; +"Compose messages in" = "Уреди ја пораката во"; +"composemessagestype_html" = "HTML"; +"composemessagestype_text" = "обичен текÑÑ‚"; +"Display remote inline images" = "Прикажи ги фотографиите кои треба да Ñе преземат"; +"displayremoteinlineimages_never" = "Ðикогаш"; +"displayremoteinlineimages_always" = "Секогаш"; + +"Auto save every" = "ÐвтоматÑки Ñними Ñекој(и)"; +"minutes" = "минути"; + +/* Contact */ +"Personal Address Book" = "Лична адреÑна книга"; +"Collected Address Book" = "Собрана адреÑна книга"; + +/* IMAP Accounts */ +"New Mail Account" = "Ðова Ñметка за електронÑка пошта"; + +"Server Name" = "Име на Ñерверот"; +"Port" = "Порт"; +"Encryption" = "Шифрирање"; +"None" = "Ðиедна"; +"User Name" = "КориÑничко име"; +"Password" = "Лозинка"; + +"Full Name" = "ЦелоÑно име"; +"Email" = "ЕлектронÑка пошта"; +"Reply To Email" = "Одговори на поракта"; +"Signature" = "ПотпиÑ"; +"(Click to create)" = "(Кликни да Ñе креира)"; + +"Signature" = "ПотпиÑ"; +"Please enter your signature below:" = "ВнеÑете го долу вашиот потпиÑ:"; + +"Please specify a valid sender address." = "Обезбедете валидна адреÑа на иÑпраќачот."; +"Please specify a valid reply-to address." = "Обезбедете валидна електронÑка адреÑа за “одговори на“."; + +/* Additional Parameters */ +"Additional Parameters" = "Дополнителни параметри"; + +/* password */ +"New password" = "Ðова лозинка"; +"Confirmation" = "Потврда"; +"Change" = "Промена"; + +/* Event+task classifications */ +"Default events classification" = "Стандардна клаÑификација на наÑтани"; +"Default tasks classification" = "Стандардна клаÑификација на задачи"; +"PUBLIC_item" = "Јавно"; +"CONFIDENTIAL_item" = "Доверливо"; +"PRIVATE_item" = "Приватно"; + +/* Event+task categories */ +"category_none" = "Ðиту еден"; +"calendar_category_labels" = "Годишница,Роденден,Деловно,Повици,Clients,Конкуренција,КориÑник,Фаворити,Да Ñе Ñледи,Подарок,Празници,Идеи,СоÑтаноци,Проблеми,Разно,Лични,Проекти,Јавни празници,СтатуÑ,Добавувачи,Патување,Одмор"; + +/* Default module */ +"Calendar" = "Календар"; +"Contacts" = "ÐдреÑна книга"; +"Mail" = "ЕлектронÑка пошта"; +"Last" = "ПоÑледно кориÑтено"; +"Default Module" = "Стандарден модул"; +"SOGo Version" = "Верзија на SOGo"; + +"Language" = "Јазик"; +"choose" = "Одбери ..."; +"Arabic" = "العربية"; +"Basque" = "Euskara"; +"Catalan" = "Català"; +"ChineseTaiwan" = "Chinese (Taiwan)"; +"Czech" = "ÄŒesky"; +"Danish" = "Dansk (Danmark)"; +"Dutch" = "Nederlands"; +"English" = "English"; +"Finnish" = "Suomi"; +"French" = "Français"; +"German" = "Deutsch"; +"Hungarian" = "Magyar"; +"Icelandic" = "Ãslenska"; +"Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; +"NorwegianBokmal" = "Norsk bokmÃ¥l"; +"NorwegianNynorsk" = "Norsk nynorsk"; +"BrazilianPortuguese" = "Português brasileiro"; +"Polish" = "Polski"; +"Portuguese" = "Português"; +"Russian" = "РуÑÑкий"; +"Slovak" = "Slovensky"; +"Slovenian" = "SlovenÅ¡Äina"; +"SpanishSpain" = "Español (España)"; +"SpanishArgentina" = "Español (Argentina)"; +"Swedish" = "Svenska"; +"Ukrainian" = "УкраїнÑька"; +"Welsh" = "Cymraeg"; + +"Refresh View" = "ОÑвежи го погледот"; +"refreshview_manually" = "Рачно"; +"refreshview_every_minute" = "Секоја минута"; +"refreshview_every_2_minutes" = "Секои 2 минути"; +"refreshview_every_5_minutes" = "Секои 5 минути"; +"refreshview_every_10_minutes" = "Секои 10 минути"; +"refreshview_every_20_minutes" = "Секои 20 минути"; +"refreshview_every_30_minutes" = "Секои 30 минути"; +"refreshview_once_per_hour" = "Ðа Ñекој чаÑ"; + +/* Return receipts */ +"When I receive a request for a return receipt" = "Кога ќе добијам потврда за прием"; +"Never send a return receipt" = "Ðикогаш не иÑпраќај потврда за прием"; +"Allow return receipts for some messages" = "Дозволи потврда за прием за некои пораки"; +"If I'm not in the To or Cc of the message" = "Ðко не Ñум во До или Копија на пораката"; +"If the sender is outside my domain" = "Ðко иÑпраќачот е надвор од мојот домејн"; +"In all other cases" = "Во Ñите други Ñлучаи"; + +"Never send" = "Ðикогаш не иÑпраќај"; +"Always send" = "Секогаш иÑпрати"; +"Ask me" = "Прашај ме"; + +/* Filters - UIxPreferences */ +"Filters" = "Филтри"; +"Active" = "Ðктивен"; +"Move Up" = "Качи го горе"; +"Move Down" = "Сини го долу"; +"Connection error" = "Грешка при поврзување"; +"Service temporarily unavailable" = "УÑлугата е привремено недоÑтапна"; + +/* Filters - UIxFilterEditor */ +"Filter name:" = "Име на филтерот:"; +"For incoming messages that" = "За пораките кои приÑтигаат кои"; +"match all of the following rules:" = "одговараа на Ñите Ñледни правила:"; +"match any of the following rules:" = "одговараат на некои од Ñледните правила:"; +"match all messages" = "одговараат Ñите пораки"; +"Perform these actions:" = "Изврши ги Ñледните активноÑти:"; +"Untitled Filter" = "Ðеименуван филтер"; + +"Subject" = "Тема"; +"From" = "Од"; +"To" = "До"; +"Cc" = "Копија"; +"To or Cc" = "До или копија"; +"Size (Kb)" = "Големина (Kb)"; +"Header" = "Заглавје"; +"Body" = "Тело"; +"Flag the message with:" = "Означи ја пораката Ñо:"; +"Discard the message" = "Отфрли ја поракта"; +"File the message in:" = "СмеÑти ја пораката во:"; +"Keep the message" = "Зачувај ја пораката"; +"Forward the message to:" = "Препратија пораката до:"; +"Send a reject message:" = "ИÑпрати порака за отфрлање:"; +"Send a vacation message" = "ИÑпрати автоматÑка порака кога Ñи на одмор"; +"Stop processing filter rules" = "Запри го процеÑирањето на правилата за филтрирање"; + +"is under" = "е под"; +"is over" = "е над"; +"is" = "е"; +"is not" = "не е"; +"contains" = "Ñодржи"; +"does not contain" = "не Ñодржи"; +"matches" = "Ñе Ñовпаѓа"; +"does not match" = "не Ñе Ñовпаѓа"; +"matches regex" = "Се Ñовпаѓа Ñо регуларни изрази"; +"does not match regex" = "не Ñе Ñовпаѓа Ñо регуларните изрази"; + +"Seen" = "Видена"; +"Deleted" = "Избришана"; +"Answered" = "Одговорена"; +"Flagged" = "Означена"; +"Junk" = "Ѓубре"; +"Not Junk" = "Ðе е ѓубре"; + +/* Password policy */ +"The password was changed successfully." = "Лозинката е уÑпешно Ñменета."; +"Password must not be empty." = "Лозинката не може да е празна."; +"The passwords do not match. Please try again." = "Лозинките не Ñе Ñовпаѓаат. Обидете Ñе повторно."; +"Password change failed" = "Промената на лозинката не е уÑпешна"; +"Password change failed - Permission denied" = "Промената на лозинката не е уÑпешна - недозволен приÑтап"; +"Password change failed - Insufficient password quality" = "Промената на лозинката е неуÑпешна - недоволен квалитет на лозинката"; +"Password change failed - Password is too short" = "Промената на лозинката е неуÑпешна - Лозинката е премногу кратка"; +"Password change failed - Password is too young" = "Промената на лозинката е неуÑпешна - Лозинката е премногу млада"; +"Password change failed - Password is in history" = "Промената на лозинката е неуÑпешна - Лозинката веќе Ñте ја кориÑтеле"; +"Unhandled policy error: %{0}" = "Ðепозната грешка на полиÑа: %{0}"; +"Unhandled error response" = "Ðепозната грешка"; +"Password change is not supported." = "Промената на лозинката не е подржана."; +"Unhandled HTTP error code: %{0}" = "Ðепозната HTTP грешка: %{0}"; diff --git a/UI/PreferencesUI/NorwegianBokmal.lproj/Localizable.strings b/UI/PreferencesUI/NorwegianBokmal.lproj/Localizable.strings index 6cec64783..2a5b5bd41 100644 --- a/UI/PreferencesUI/NorwegianBokmal.lproj/Localizable.strings +++ b/UI/PreferencesUI/NorwegianBokmal.lproj/Localizable.strings @@ -32,7 +32,7 @@ "Always send vacation message response" = "Alltid send ferie melding"; "Please specify your message and your email addresses for which you want to enable auto reply." = "Skriv melding og angi din e-postadresse som du vil aktivere auto-svar for."; -"Your vacation message must not end with a single dot on a line." = "Fraværsmeldingen kan ikke slutte med ett ensomt punktum pÃ¥ en linje. "; +"Your vacation message must not end with a single dot on a line." = "Fraværsmeldingen kan ikke slutte med ett ensomt punktum pÃ¥ en linje."; "End date of your auto reply must be in the future." = "Slutt-dato for auto-svar mÃ¥ være i framtiden."; @@ -144,7 +144,7 @@ "messageforward_inline" = "Innsatt"; "messageforward_attached" = "Som Vedlegg"; -"When replying to a message" = "Ved svar pÃ¥ melding "; +"When replying to a message" = "Ved svar pÃ¥ melding"; "replyplacement_above" = "Start svaret ovenfor"; "replyplacement_below" = "Start svaret under"; "And place my signature" = "Legg til min signatur"; @@ -229,12 +229,15 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "BrazilianPortuguese" = "Português brasileiro"; -"Polish" = "Polsk"; +"Polish" = "Polski"; +"Portuguese" = "Português"; "Russian" = "РуÑÑкий"; -"Slovak" = "Slovensk"; +"Slovak" = "Slovensky"; +"Slovenian" = "SlovenÅ¡Äina"; "SpanishSpain" = "Español (España)"; "SpanishArgentina" = "Español (Argentina)"; "Swedish" = "Svenska"; diff --git a/UI/PreferencesUI/NorwegianNynorsk.lproj/Localizable.strings b/UI/PreferencesUI/NorwegianNynorsk.lproj/Localizable.strings index e1d9bae0e..35808f568 100644 --- a/UI/PreferencesUI/NorwegianNynorsk.lproj/Localizable.strings +++ b/UI/PreferencesUI/NorwegianNynorsk.lproj/Localizable.strings @@ -194,10 +194,12 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "BrazilianPortuguese" = "Português brasileiro"; "Polish" = "Polski"; +"Portuguese" = "Português"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "Slovenian" = "SlovenÅ¡Äina"; diff --git a/UI/PreferencesUI/Polish.lproj/Localizable.strings b/UI/PreferencesUI/Polish.lproj/Localizable.strings index db83009b2..492ae470d 100644 --- a/UI/PreferencesUI/Polish.lproj/Localizable.strings +++ b/UI/PreferencesUI/Polish.lproj/Localizable.strings @@ -229,10 +229,12 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "BrazilianPortuguese" = "Português brasileiro"; "Polish" = "Polski"; +"Portuguese" = "Português"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovenská"; "SpanishSpain" = "Español (España)"; diff --git a/UI/PreferencesUI/Portuguese.lproj/Localizable.strings b/UI/PreferencesUI/Portuguese.lproj/Localizable.strings new file mode 100644 index 000000000..facc5a3ff --- /dev/null +++ b/UI/PreferencesUI/Portuguese.lproj/Localizable.strings @@ -0,0 +1,330 @@ +/* toolbar */ +"Save and Close" = "Gravar e Fechar"; +"Close" = "Fechar"; + +/* tabs */ +"General" = "Geral"; +"Calendar Options" = "Calendário"; +"Contacts Options" = "Opções de Contatos"; +"Mail Options" = "Correio"; +"IMAP Accounts" = "Contas IMAP"; +"Vacation" = "Férias"; +"Forward" = "Reencaminhar"; +"Password" = "Senha"; +"Categories" = "Categorias"; +"Appointments invitations" = "Convites de Compromissos"; +"Name" = "Nome"; +"Color" = "Cor"; +"Add" = "Adicionar"; +"Delete" = "Excluir"; + +/* contacts categories */ +"contacts_category_labels" = "Colega, Concorrente, Cliente, Amigo, Família, Parceiro de Negócios, Provedor, Imprensa, VIP"; + +/* vacation (auto-reply) */ +"Enable vacation auto reply" = "Habilitar auto resposta de férias"; +"Auto reply message" = "AutoResponder somente uma vez a cada remetente com o seguinte texto"; +"Email addresses (separated by commas)" = "Endereço de e-mail (separado por vírgulas)"; +"Add default email addresses" = "Adicionar endereço de e-mail padrão"; +"Days between responses" = "Dias entre respostas"; +"Do not send responses to mailing lists" = "Não envie respostas para lista de e-mails"; +"Disable auto reply on" = "Desativar resposta automática em"; +"Please specify your message and your email addresses for which you want to enable auto reply." += "Por favor especifique a sua mensagem e os seus endereços de e-mail para o qual você deseja ativar resposta automática."; +"Your vacation message must not end with a single dot on a line." = "A sua mensagem de férias não deve terminar com um ponto final na linha."; +"End date of your auto reply must be in the future." += "A data final da resposta automática deve estar no futuro."; + +/* forward messages */ +"Forward incoming messages" = "Reencaminhar mensagens recebidas"; +"Keep a copy" = "Manter uma cópia"; +"Please specify an address to which you want to forward your messages." += "Por favor especificar um endereço para o qual você deseja encaminhar suas mensagens."; + +/* d & t */ +"Current Time Zone" = "Fuso Horário"; +"Short Date Format" = "Formato da Data (Curto)"; +"Long Date Format" = "Formato da Data (Longo)"; +"Time Format" = "Formato da Hora"; + +"default" = "Padrão"; + +"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" = ""; +"longDateFmt_5" = ""; +"longDateFmt_6" = ""; +"longDateFmt_7" = ""; +"longDateFmt_8" = ""; +"longDateFmt_9" = ""; +"longDateFmt_10" = ""; + +"timeFmt_0" = "%I:%M %p"; +"timeFmt_1" = "%H:%M"; +"timeFmt_2" = ""; +"timeFmt_3" = ""; +"timeFmt_4" = ""; + +/* calendar */ +"Week begins on" = "A Semana começa em"; +"Day start time" = "O Dia começa às"; +"Day end time" = "O Dia termina às"; +"Day start time must be prior to day end time." = "Dia de inicio deve ser anterior ao dia de fim."; +"Show time as busy outside working hours" = "Exibir horas como ocupadas quando fora do horário de serviço"; +"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" = "Executar um som quando existir um lembrete"; +"Default reminder" = "Lembrete padrão"; + +"firstWeekOfYear_January1" = "Inicia em 01 de janeiro"; +"firstWeekOfYear_First4DayWeek" = "Primeira semana com 4 dias"; +"firstWeekOfYear_FirstFullWeek" = "Primeira semana com 5 dias"; + +"Prevent from being invited to appointments" = "Impedir de ser convidado para um compromisso"; +"White list for appointment invitations" = "Lista branca para convites de compromissos"; +"Contacts Names" = "Nomes de Contatos"; + +/* Default Calendar */ +"Default calendar" = "Calendário Padrão"; +"selectedCalendar" = "Calendário selecionado"; +"personalCalendar" = "Calendário pessoal"; +"firstCalendar" = "Calendário habilizado pela primeira vez"; + +"reminder_NONE" = "Não lembrar"; +"reminder_5_MINUTES_BEFORE" = "5 minutos"; +"reminder_10_MINUTES_BEFORE" = "10 minutos"; +"reminder_15_MINUTES_BEFORE" = "15 minutos"; +"reminder_30_MINUTES_BEFORE" = "30 minutos"; +"reminder_45_MINUTES_BEFORE" = "45 minutos antes"; +"reminder_1_HOUR_BEFORE" = "1 hora"; +"reminder_2_HOURS_BEFORE" = "2 horas"; +"reminder_5_HOURS_BEFORE" = "5 horas"; +"reminder_15_HOURS_BEFORE" = "15 horas"; +"reminder_1_DAY_BEFORE" = "1 dia"; +"reminder_2_DAYS_BEFORE" = "2 dias"; +"reminder_1_WEEK_BEFORE" = "1 semana antes"; + +/* Mailer */ +"Labels" = "Etiquetas"; +"Label" = "Etiqueta"; +"Show subscribed mailboxes only" = "Exibir somente caixas de correio inscritas"; +"Sort messages by threads" = "Ordenar mensagens por tópicos"; +"When sending mail, add unknown recipients to my" = "Ao enviar e-mail, adicionar destinatários desconhecidos ao meu"; + +"Forward messages" = "Encaminhar mensagens"; +"messageforward_inline" = "No corpo da mensagem"; +"messageforward_attached" = "Como anexo"; + +"When replying to a message" = "Ao responder a uma mensagem"; +"replyplacement_above" = "Começar minha resposta acima das citações"; +"replyplacement_below" = "Começar minha resposta abaixo das citações"; +"And place my signature" = "E colocar minha assinatura"; +"signatureplacement_above" = "abaixo da minha resposta"; +"signatureplacement_below" = "abaixo da citação"; +"Compose messages in" = "Escrever mensagens em"; +"composemessagestype_html" = "HTML"; +"composemessagestype_text" = "Texto puro"; +"Display remote inline images" = "Exibir imagens remotas"; +"displayremoteinlineimages_never" = "Nunca"; +"displayremoteinlineimages_always" = "Sempre"; + +"Auto save every" = "Gravar automatáticamente cada"; +"minutes" = "minutos"; + +/* Contact */ +"Personal Address Book" = "Contactos Pessoais"; +"Collected Address Book" = "Contactos Coleccionados"; + +/* IMAP Accounts */ +"New Mail Account" = "Nova conta de e-mail"; + +"Server Name" = "Nome do Servidor"; +"Port" = "Porta"; +"Encryption" = "Encriptação"; +"None" = "Nenhum"; +"User Name" = "Nome do Utilizador"; +"Password" = "Senha"; + +"Full Name" = "Nome Completo"; +"Email" = "E-mail"; +"Reply To Email" = "Responder para o Email"; +"Signature" = "Assinatura"; +"(Click to create)" = "(Click para criar)"; + +"Signature" = "Assinatura"; +"Please enter your signature below:" = "Por favor, digite sua assinatura abaixo:"; + +"Please specify a valid sender address." = "Por favor, especifique um endereço de email válido."; +"Please specify a valid reply-to address." = "Por favor,especifique um endereço de resposta válido."; + +/* Additional Parameters */ +"Additional Parameters" = "Parâmetros Adicionais"; + +/* password */ +"New password" = "Nova senha"; +"Confirmation" = "Confirmação"; +"Change" = "Alterar"; + +/* Event+task classifications */ +"Default events classification" = "Classificação padrão do compromisso"; +"Default tasks classification" = "Classificação padrão da tarefa"; +"PUBLIC_item" = "Público"; +"CONFIDENTIAL_item" = "Confidencial"; +"PRIVATE_item" = "Particular"; + +/* Event+task categories */ +"category_none" = "Nenhum"; +"calendar_category_labels" = "Celebração Anual,Aniversário,Negócios,Ligações,Clientes,Concorrência,Comprador,Favoritos,Acompanhamento,Presentes,Feriados,Idéias,Meeting,Problemas,Miscelânea,Pessoal,Projetos,Feriado público,Posição,Fornecedores,Viagem,Férias"; + +/* Default module */ +"Calendar" = "Calendário"; +"Contacts" = "Contactos"; +"Mail" = "Correio"; +"Last" = "Último usado"; +"Default Module" = "Módulo Padrão"; +"SOGo Version" = "Versão SOGo"; + +"Language" = "Idioma"; +"choose" = "Escolha ..."; +"Arabic" = "العربية"; +"Basque" = "Euskara"; +"Catalan" = "Català"; +"ChineseTaiwan" = "Chinese (Taiwan)"; +"Czech" = "ÄŒesky"; +"Danish" = "Dansk (Danmark)"; +"Dutch" = "Nederlands"; +"English" = "English"; +"Finnish" = "Suomi"; +"French" = "Français"; +"German" = "Deutsch"; +"Hungarian" = "Magyar"; +"Icelandic" = "Ãslenska"; +"Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; +"NorwegianBokmal" = "Norsk bokmÃ¥l"; +"NorwegianNynorsk" = "Norsk nynorsk"; +"BrazilianPortuguese" = "Português brasileiro"; +"Polish" = "Polski"; +"Portuguese" = "Português"; +"Russian" = "РуÑÑкий"; +"Slovak" = "Slovensky"; +"Slovenian" = "SlovenÅ¡Äina"; +"SpanishSpain" = "Español (España)"; +"SpanishArgentina" = "Español (Argentina)"; +"Swedish" = "Svenska"; +"Ukrainian" = "УкраїнÑька"; +"Welsh" = "Cymraeg"; + +"Refresh View" = "Actualizar a Visualização"; +"refreshview_manually" = "Manualmente"; +"refreshview_every_minute" = "A cada minuto"; +"refreshview_every_2_minutes" = "A cada 2 minutos"; +"refreshview_every_5_minutes" = "A cada 5 minutos"; +"refreshview_every_10_minutes" = "A cada 10 minutos"; +"refreshview_every_20_minutes" = "A cada 20 minutos"; +"refreshview_every_30_minutes" = "A cada 30 minutos"; +"refreshview_once_per_hour" = "Uma vez por hora"; + +/* Return receipts */ +"When I receive a request for a return receipt" = "Quando eu receber uma confirmação de leitura"; +"Never send a return receipt" = "Nunca enviar confirmação"; +"Allow return receipts for some messages" = "Permitir confirmação para algumas mensagens"; +"If I'm not in the To or Cc of the message" = "Se eu não estiver no Para ou Cc da mensagem"; +"If the sender is outside my domain" = "Se o remetente está fora do meu domínio"; +"In all other cases" = "Em todos os outros casos"; + +"Never send" = "Nunca enviar"; +"Always send" = "Sempre enviar"; +"Ask me" = "Pergunte-me"; + +/* Filters - UIxPreferences */ +"Filters" = "Filtros"; +"Active" = "Ativo"; +"Move Up" = "Mover para cima"; +"Move Down" = "Move para baixo"; +"Connection error" = "Erro de conexão"; +"Service temporarily unavailable" = "Serviço temporariamente indisponível"; + +/* Filters - UIxFilterEditor */ +"Filter name:" = "Nome do filtro:"; +"For incoming messages that" = "Para mensagens recebidas que"; +"match all of the following rules:" = "correspondem a todas as seguintes regras:"; +"match any of the following rules:" = "corresponde a nenhuma das seguintes regras:"; +"match all messages" = "corresponder a todas as mensagens"; +"Perform these actions:" = "Realizar essas ações:"; +"Untitled Filter" = "Filtro sem título"; + +"Subject" = "Assunto"; +"From" = "De"; +"To" = "Para"; +"Cc" = "Cc"; +"To or Cc" = "Para ou Cc"; +"Size (Kb)" = "Tamanho (Kb)"; +"Header" = "Cabeçalho"; +"Body" = "Corpo"; +"Flag the message with:" = "Marcar a mensagem com:"; +"Discard the message" = "Descartar a mensagem"; +"File the message in:" = "Arquivo da mensagem em:"; +"Keep the message" = "Manter a mensagem"; +"Forward the message to:" = "Rencaminhar a mensagem para:"; +"Send a reject message:" = "Enviar uma mensagem de rejeição:"; +"Send a vacation message" = "Enviar uma mensagem de ausência"; +"Stop processing filter rules" = "Parar o processamento dos filtros"; + +"is under" = "abaixo"; +"is over" = "acima"; +"is" = "é"; +"is not" = "não é"; +"contains" = "contêm"; +"does not contain" = "não contêm"; +"matches" = "corresponde"; +"does not match" = "não corresponde"; +"matches regex" = "coincide com a expressão"; +"does not match regex" = "não coincide com a expressão"; + +"Seen" = "Visto"; +"Deleted" = "Removido"; +"Answered" = "Respondido"; +"Flagged" = "Marcado"; +"Junk" = "Lixo"; +"Not Junk" = "Não é Lixo"; + +/* Password policy */ +"The password was changed successfully." = "Senha alterada com sucesso."; +"Password must not be empty." = "A senha não pode ser vazia."; +"The passwords do not match. Please try again." = "A senha não coincide. Por favor tente novamente."; +"Password change failed" = "Alteração de senha falhada"; +"Password change failed - Permission denied" = "Alteração de senha falhada - não tem permissões"; +"Password change failed - Insufficient password quality" = "Alteraçao de senha falhada - Qualidade da senha insuficiente"; +"Password change failed - Password is too short" = "Alteração de senha falhada - Senha é demasiado curta"; +"Password change failed - Password is too young" = "Alteração de senha falhada - Senha é demasiado comprida"; +"Password change failed - Password is in history" = "Alteração de senha falhada - Senha já foi utilizada no passado"; +"Unhandled policy error: %{0}" = "Erro de politica não controlada: %{0}"; +"Unhandled error response" = "Erro de resposta não controlada"; +"Password change is not supported." = "A alteração de senha não é suportada."; +"Unhandled HTTP error code: %{0}" = "Erro de HTTP não controlado, código: %{0}"; diff --git a/UI/PreferencesUI/Russian.lproj/Localizable.strings b/UI/PreferencesUI/Russian.lproj/Localizable.strings index 73eecd64e..9be953f32 100644 --- a/UI/PreferencesUI/Russian.lproj/Localizable.strings +++ b/UI/PreferencesUI/Russian.lproj/Localizable.strings @@ -229,10 +229,12 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "BrazilianPortuguese" = "Português brasileiro"; "Polish" = "Polski"; +"Portuguese" = "Português"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "Slovenian" = "SlovenÅ¡Äina"; diff --git a/UI/PreferencesUI/Slovak.lproj/Localizable.strings b/UI/PreferencesUI/Slovak.lproj/Localizable.strings index d3c4a31eb..cab0677d1 100644 --- a/UI/PreferencesUI/Slovak.lproj/Localizable.strings +++ b/UI/PreferencesUI/Slovak.lproj/Localizable.strings @@ -150,7 +150,7 @@ "And place my signature" = "A vlož môj podpis"; "signatureplacement_above" = "pod odpoveÄou"; "signatureplacement_below" = "pod citáciou"; -"Compose messages in" = "Vytvor správu v "; +"Compose messages in" = "Vytvor správu v"; "composemessagestype_html" = "HTML"; "composemessagestype_text" = "ÄŒistý text"; "Display remote inline images" = "ZobraziÅ¥ externe pripojené obrázky"; @@ -226,10 +226,12 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "BrazilianPortuguese" = "Português brasileiro"; "Polish" = "Polski"; +"Portuguese" = "Português"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "Slovenian" = "SlovenÅ¡Äina"; @@ -288,7 +290,7 @@ "is under" = "je pod"; "is over" = "je nad"; "is" = "je"; -"is not" = "nie je "; +"is not" = "nie je"; "contains" = "obsahuje"; "does not contain" = "neobsahuje"; "matches" = "zodpovedá"; diff --git a/UI/PreferencesUI/Slovenian.lproj/Localizable.strings b/UI/PreferencesUI/Slovenian.lproj/Localizable.strings index 3e7d70165..65e16c571 100644 --- a/UI/PreferencesUI/Slovenian.lproj/Localizable.strings +++ b/UI/PreferencesUI/Slovenian.lproj/Localizable.strings @@ -216,6 +216,7 @@ "Language" ="Jezik"; "choose" = "Izberi ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "ChineseTaiwan" = "Chinese (Taiwan)"; "Czech" = "ÄŒesky"; @@ -228,10 +229,12 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "BrazilianPortuguese" = "Português brasileiro"; "Polish" = "Polski"; +"Portuguese" = "Português"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "Slovenian" = "SlovenÅ¡Äina"; diff --git a/UI/PreferencesUI/SpanishArgentina.lproj/Localizable.strings b/UI/PreferencesUI/SpanishArgentina.lproj/Localizable.strings index a325aa53c..525f79e51 100644 --- a/UI/PreferencesUI/SpanishArgentina.lproj/Localizable.strings +++ b/UI/PreferencesUI/SpanishArgentina.lproj/Localizable.strings @@ -203,7 +203,7 @@ "Contacts" = "Libreta de direcciones"; "Mail" = "Correo"; "Last" = "Ultimo usado"; -"Default Module " = "Módulo por defecto "; +"Default Module " = "Módulo por defecto"; "SOGo Version" ="Versión de SOGo"; "Language" ="Idioma"; @@ -222,10 +222,12 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "BrazilianPortuguese" = "Português brasileiro"; "Polish" = "Polski"; +"Portuguese" = "Português"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "Slovenian" = "SlovenÅ¡Äina"; diff --git a/UI/PreferencesUI/SpanishSpain.lproj/Localizable.strings b/UI/PreferencesUI/SpanishSpain.lproj/Localizable.strings index 357701090..3bb1d19bc 100644 --- a/UI/PreferencesUI/SpanishSpain.lproj/Localizable.strings +++ b/UI/PreferencesUI/SpanishSpain.lproj/Localizable.strings @@ -210,7 +210,7 @@ "Contacts" = "Libreta de direcciones"; "Mail" = "Correo"; "Last" = "Ultimo usado"; -"Default Module " = "Módulo por defecto "; +"Default Module " = "Módulo por defecto"; "SOGo Version" ="Versión de SOGo"; "Language" ="Idioma"; @@ -229,12 +229,15 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "BrazilianPortuguese" = "Português brasileiro"; "Polish" = "Polski"; +"Portuguese" = "Português"; "Russian" = "РуÑÑкий"; -"Slovak" = "Eslovaquia"; +"Slovak" = "Slovensky"; +"Slovenian" = "SlovenÅ¡Äina"; "SpanishSpain" = "Español (España)"; "SpanishArgentina" = "Español (Argentina)"; "Swedish" = "Svenska"; diff --git a/UI/PreferencesUI/Swedish.lproj/Localizable.strings b/UI/PreferencesUI/Swedish.lproj/Localizable.strings index 5b654e532..e74a1800a 100644 --- a/UI/PreferencesUI/Swedish.lproj/Localizable.strings +++ b/UI/PreferencesUI/Swedish.lproj/Localizable.strings @@ -196,10 +196,12 @@ Servernamn:"; "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "BrazilianPortuguese" = "Português brasileiro"; "Polish" = "Polski"; +"Portuguese" = "Português"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "Slovenian" = "SlovenÅ¡Äina"; diff --git a/UI/PreferencesUI/UIxJSONPreferences.m b/UI/PreferencesUI/UIxJSONPreferences.m index 11bd05b36..33a97f708 100644 --- a/UI/PreferencesUI/UIxJSONPreferences.m +++ b/UI/PreferencesUI/UIxJSONPreferences.m @@ -29,6 +29,11 @@ #import #import #import +#import +#import + +#import +#import #import "UIxJSONPreferences.h" diff --git a/UI/PreferencesUI/UIxPreferences.m b/UI/PreferencesUI/UIxPreferences.m index 5558c7d77..0de77d28f 100644 --- a/UI/PreferencesUI/UIxPreferences.m +++ b/UI/PreferencesUI/UIxPreferences.m @@ -1366,15 +1366,15 @@ static NSArray *reminderValues = nil; if ([account updateFilters]) // If Sieve is not enabled, the SOGoSieveManager will immediatly return a positive answer // See [SOGoSieveManager updateFiltersForAccount:withUsername:andPassword:] - results = [self responseWithStatus: 200 + results = (id )[self responseWithStatus: 200 andJSONRepresentation: [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:hasChanged], @"hasChanged", nil]]; else - results = [self responseWithStatus: 502 + results = (id )[self responseWithStatus: 502 andJSONRepresentation: [NSDictionary dictionaryWithObjectsAndKeys: @"Connection error", @"textStatus", nil]]; } else - results = [self responseWithStatus: 503 + results = (id )[self responseWithStatus: 503 andJSONRepresentation: [NSDictionary dictionaryWithObjectsAndKeys: @"Service temporarily unavailable", @"textStatus", nil]]; } else diff --git a/UI/PreferencesUI/Ukrainian.lproj/Localizable.strings b/UI/PreferencesUI/Ukrainian.lproj/Localizable.strings index fb68f09c1..395333b7a 100644 --- a/UI/PreferencesUI/Ukrainian.lproj/Localizable.strings +++ b/UI/PreferencesUI/Ukrainian.lproj/Localizable.strings @@ -188,7 +188,7 @@ "Contacts" = "ÐдреÑна книга"; "Mail" = "Електронна пошта"; "Last" = "ОÑтаннє"; -"Default Module " = "Модуль за замовчаннÑм "; +"Default Module " = "Модуль за замовчаннÑм"; "Language" ="Мова"; "choose" = "Choose ..."; @@ -206,10 +206,12 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "BrazilianPortuguese" = "Português brasileiro"; "Polish" = "Polski"; +"Portuguese" = "Português"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "Slovenian" = "SlovenÅ¡Äina"; diff --git a/UI/PreferencesUI/Welsh.lproj/Localizable.strings b/UI/PreferencesUI/Welsh.lproj/Localizable.strings index 3c289b703..01d2710bf 100644 --- a/UI/PreferencesUI/Welsh.lproj/Localizable.strings +++ b/UI/PreferencesUI/Welsh.lproj/Localizable.strings @@ -176,7 +176,7 @@ "Contacts" = "Address Book"; "Mail" = "Mail"; "Last" = "Last used"; -"Default Module " = "Default module "; +"Default Module " = "Default module"; "Language" ="Iaith"; "choose" = "Dewis ..."; @@ -194,10 +194,12 @@ "Hungarian" = "Magyar"; "Icelandic" = "Ãslenska"; "Italian" = "Italiano"; +"Macedonian" = "МакедонÑки"; "NorwegianBokmal" = "Norsk bokmÃ¥l"; "NorwegianNynorsk" = "Norsk nynorsk"; "BrazilianPortuguese" = "Português brasileiro"; "Polish" = "Polski"; +"Portuguese" = "Português"; "Russian" = "РуÑÑкий"; "Slovak" = "Slovensky"; "Slovenian" = "SlovenÅ¡Äina"; diff --git a/UI/SOGoUI/SOGoAptFormatter.m b/UI/SOGoUI/SOGoAptFormatter.m index dbd49401d..163606d42 100644 --- a/UI/SOGoUI/SOGoAptFormatter.m +++ b/UI/SOGoUI/SOGoAptFormatter.m @@ -155,14 +155,14 @@ */ [_buf appendFormat:@"%02i:%02i", - [_date hourOfDay], - [_date minuteOfHour]]; + (int)[_date hourOfDay], + (int)[_date minuteOfHour]]; if (_refDate && ![_date isDateOnSameDay:_refDate]) { [_buf appendFormat:@" (%02i-%02i", - [_date monthOfYear], - [_date dayOfMonth]]; + (int)[_date monthOfYear], + (int)[_date dayOfMonth]]; if ([_date yearOfCommonEra] != [_refDate yearOfCommonEra]) - [_buf appendFormat:@"-%04i", [_date yearOfCommonEra]]; + [_buf appendFormat:@"-%04i", (int)[_date yearOfCommonEra]]; [_buf appendString:@")"]; } } diff --git a/UI/Scheduler/English.lproj/Localizable.strings b/UI/Scheduler/English.lproj/Localizable.strings index 8cc0ee7c2..306072be8 100644 --- a/UI/Scheduler/English.lproj/Localizable.strings +++ b/UI/Scheduler/English.lproj/Localizable.strings @@ -10,6 +10,7 @@ "Go to today" = "Go to today"; "Switch to day view" = "Switch to day view"; "Switch to week view" = "Switch to week view"; +"Switch to multi-columns day view" = "Switch to multi-columns day view"; "Switch to month view" = "Switch to month view"; "Reload all calendars" = "Reload all calendars"; diff --git a/UI/Scheduler/GNUmakefile b/UI/Scheduler/GNUmakefile index e376c5a9a..28f77bf68 100644 --- a/UI/Scheduler/GNUmakefile +++ b/UI/Scheduler/GNUmakefile @@ -6,7 +6,7 @@ BUNDLE_NAME = SchedulerUI SchedulerUI_PRINCIPAL_CLASS = SchedulerUIProduct -SchedulerUI_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan ChineseTaiwan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak Slovenian SpanishSpain SpanishArgentina Swedish Ukrainian Welsh +SchedulerUI_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan ChineseTaiwan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian Macedonian NorwegianBokmal NorwegianNynorsk Polish Portuguese Russian Slovak Slovenian SpanishSpain SpanishArgentina Swedish Ukrainian Welsh SchedulerUI_OBJC_FILES = \ SchedulerUIProduct.m \ diff --git a/UI/Scheduler/Macedonian.lproj/Localizable.strings b/UI/Scheduler/Macedonian.lproj/Localizable.strings new file mode 100644 index 000000000..7fd72c6c1 --- /dev/null +++ b/UI/Scheduler/Macedonian.lproj/Localizable.strings @@ -0,0 +1,565 @@ +/* this file is in UTF-8 format! */ + +/* Tooltips */ + +"Create a new event" = "Креирај нов наÑтан"; +"Create a new task" = "Креирај нова задача"; +"Edit this event or task" = "Уреди го овој наÑтан или задача"; +"Print the current calendar view" = "Печати го тековниот поглед на календарот"; +"Delete this event or task" = "Избриши го овој наÑтан или задача"; +"Go to today" = "Оди на денеÑ"; +"Switch to day view" = "Префрли на дневен преглед"; +"Switch to week view" = "Префрли на неделен преглед"; +"Switch to month view" = "Префрли на меÑечен преглед"; +"Reload all calendars" = "Повторно вчитај ги Ñите календари"; + +/* Tabs */ +"Date" = "Датум"; +"Calendars" = "Календари"; + +/* Day */ + +"DayOfTheMonth" = "Ден од меÑецот"; +"dayLabelFormat" = "%m/%d/%Y"; +"today" = "ДенеÑ"; + +"Previous Day" = "Претходниот ден"; +"Next Day" = "Следниот ден"; + +/* Week */ + +"Week" = "Ðедела"; +"this week" = "оваа недела"; + +"Week %d" = "Ðедела %d"; + +"Previous Week" = "Претходната недела"; +"Next Week" = "Следната недела"; + +/* Month */ + +"this month" = "овој меÑец"; + +"Previous Month" = "Претходниот меÑец"; +"Next Month" = "Следниот меÑец"; + +/* Year */ + +"this year" = "оваа година"; + +/* Menu */ + +"Calendar" = "Календар"; +"Contacts" = "Контакти"; + +"New Calendar..." = "Ðов календар..."; +"Delete Calendar" = "Избриши календар..."; +"Unsubscribe Calendar" = "Отпиши Ñе од Календарот"; +"Sharing..." = "Споделување..."; +"Export Calendar..." = "Извези го календарот..."; +"Import Events..." = "Увези ги наÑтаните..."; +"Import Events" = "Увези ги наÑтаните"; +"Select an iCalendar file (.ics)." = "Одбери iCalendar датотека (.ics)."; +"Upload" = "Преземи"; +"Uploading" = "Префрлам"; +"Publish Calendar..." = "Објави го календарот..."; +"Reload Remote Calendars" = "ОÑвежи го далечинÑките календари"; +"Properties" = "ОÑобини..."; +"Done" = "Завршено"; +"An error occurred while importing calendar." = "ÐаÑтана грешка при увозот на календарот."; +"No event was imported." = "Ðитуе еден наÑтан не е увезен."; +"A total of %{0} events were imported in the calendar." = "Вкупно %{0} од наÑтаните Ñе увезени во календарот."; + +"Compose E-Mail to All Attendees" = "Креирај порака до Ñите учеÑници"; +"Compose E-Mail to Undecided Attendees" = "Креирај порака за Ñите неизјаÑнети учеÑници"; + +/* Folders */ +"Personal calendar" = "Личен календар"; + +/* Misc */ + +"OpenGroupware.org" = "OpenGroupware.org"; +"Forbidden" = "Забрането"; + +/* acls */ + +"Access rights to" = "ПриÑтапни права за"; +"For user" = "За кориÑник"; + +"Any Authenticated User" = "Било кој автентициран кориÑник"; +"Public Access" = "Јавен приÑтап"; + +"label_Public" = "Јавно"; +"label_Private" = "Приватно"; +"label_Confidential" = "Доверливо"; + +"label_Viewer" = "Види ги Ñите"; +"label_DAndTViewer" = "Види го датумот & времето"; +"label_Modifier" = "Измени"; +"label_Responder" = "Одговори на"; +"label_None" = "Ðиту едно"; + +"View All" = "Види ги Ñите"; +"View the Date & Time" = "Види го датумот & времето"; +"Modify" = "Измени"; +"Respond To" = "Одговори на"; +"None" = "Ðиту еден"; + +"This person can create objects in my calendar." += "Овој кориÑник може да креира објекти во мојот календар."; +"This person can erase objects from my calendar." += "Овој кориÑник може да брише објекти во мојот календар."; + +/* Button Titles */ + +"Subscribe to a Calendar..." = "Претплати Ñе на календарот..."; +"Remove the selected Calendar" = "ОтÑтрани го одбраниот календар"; + +"Name of the Calendar" = "Име на календарот"; + +"new" = "Ðов"; +"Print view" = "Преглед пред печатење"; +"edit" = "Уреди"; +"delete" = "Избриши"; +"proposal" = "Предлог"; +"Save and Close" = "Сними и затвори"; +"Close" = "Затвори"; +"Invite Attendees" = "Покани учеÑници"; +"Attach" = "Приложи"; +"Update" = "ОÑвежи"; +"Cancel" = "Откажи"; +"show_rejected_apts" = "Прикажи ги одбиените ÑоÑтаноци"; +"hide_rejected_apts" = "Сокриј ги одбиените ÑоÑтаноци"; + + +/* Schedule */ + +"Schedule" = "Закажи"; +"No appointments found" = "Ðе Ñе пронајдени ÑоÑтаноци"; +"Meetings proposed by you" = "Средбата е предложена од ваÑ"; +"Meetings proposed to you" = "Средбата ви е предложена"; +"sched_startDateFormat" = "%d/%m %H:%M"; +"action" = "Ðкција"; +"accept" = "Прифати"; +"decline" = "Одбиј"; +"more attendees" = "Повеќе учеÑници"; +"Hide already accepted and rejected appointments" = "Сокриј ги веќе прифатените и одбиените ÑоÑтаноци"; +"Show already accepted and rejected appointments" = "Прикажи ги веќе прифатените и одбиени ÑоÑтаноци"; + +/* Print view */ + +"LIST" = "ЛиÑта"; +"Print Settings" = "ПодеÑување на печатењето"; +"Title:" = "ÐаÑлов:"; +"Layout:" = "Изглед:"; +"What to Print" = "Што да печатам"; +"Options" = "Опции"; +"Tasks with no due date" = "Задача без краен рок"; +"Display working hours only" = "Прикажи го Ñамо работното време"; +"Completed tasks" = "Завршени задачи"; +"Display events and tasks colors" = "Прикажи ги наÑтаните и боите на задачите"; +"Borders" = "Ивици"; +"Backgrounds" = "Позадини"; + +/* Appointments */ + +"Appointment viewer" = "Преглед на ÑоÑтаноци"; +"Appointment editor" = "Уредувач на ÑоÑтаноци"; +"Appointment proposal" = "Предлог ÑоÑтанок"; +"Appointment on" = "СоÑтанок на"; +"Start:" = "Почеток:"; +"End:" = "Крај:"; +"Due Date:" = "До датум:"; +"Title:" = "ÐаÑлов:"; +"Calendar:" = "Календар:"; +"Name" = "Име"; +"Email" = "ЕлектронÑка адреÑа"; +"Status:" = "СтатуÑ:"; +"% complete" = "% complete"; +"Location:" = "Локација:"; +"Priority:" = "Приоритет:"; +"Privacy" = "ПриватноÑÑ‚"; +"Cycle" = "ЦиклуÑ"; +"Cycle End" = "ЦиклуÑот завршува"; +"Categories" = "Категории"; +"Classification" = "КлаÑификација"; +"Duration" = "Траење"; +"Attendees:" = "УчеÑници:"; +"Resources" = "РеÑурÑи"; +"Organizer:" = "Организатор:"; +"Description:" = "ОпиÑ:"; +"Document:" = "Документ:"; +"Category:" = "Категорија:"; +"Repeat:" = "Повторување:"; +"Reminder:" = "ПотÑетник:"; +"General:" = "Општо:"; +"Reply:" = "Одговори:"; +"Created by:" = "Креирано од:"; + + +"Target:" = "Цел:"; + +"attributes" = "атрибути"; +"attendees" = "учеÑници"; +"delegated from" = "делегирано од"; + +/* checkbox title */ +"is private" = "е приватно"; +/* classification */ +"Public" = "Јавно"; +"Private" = "Приватно"; +/* text used in overviews and tooltips */ +"empty title" = "Празен наÑлов"; +"private appointment" = "Приватен ÑоÑтанок"; + +"Change..." = "Измени..."; + +/* Appointments (participation state) */ + +"partStat_NEEDS-ACTION" = "Ќе потврдам подоцна"; +"partStat_ACCEPTED" = "Ќе приÑуÑтвувам"; +"partStat_DECLINED" = "Ðема да приÑуÑтвувам"; +"partStat_TENTATIVE" = "Можеби ќе приÑуÑтвувам"; +"partStat_DELEGATED" = "Ќе делегирам"; +"partStat_OTHER" = "ОÑтанато"; + +/* Appointments (error messages) */ + +"Conflicts found!" = "Пронајдени Ñе конфликти!"; +"Invalid iCal data!" = "Ðевалидни iCal податоци!"; +"Could not create iCal data!" = "Ðе можам да креирам iCal податоци!"; + +/* Searching */ + +"view_all" = "Сите"; +"view_today" = "ДенеÑ"; +"view_next7" = "Следните 7 дена"; +"view_next14" = "Следните 14 дена"; +"view_next31" = "Следните 31 дена"; +"view_thismonth" = "Овој меÑец"; +"view_future" = "Сите идни наÑтани"; +"view_selectedday" = "Одбраниот ден"; + +"view_not_started" = "Ðезапочнати задачи"; +"view_overdue" = "Пречекорени задачи"; +"view_incomplete" = "Ðекомплетирани задачи"; + +"View:" = "Поглед:"; +"Title, category or location" = "ÐаÑлов, категорија или локација"; +"Entire content" = "Целата Ñодржина"; + +"Search" = "Барај"; +"Search attendees" = "Барај приÑутни"; +"Search resources" = "Барак реÑурÑи"; +"Search appointments" = "Барај ÑоÑтаноци"; + +"All day Event" = "Целодневен наÑтан"; +"check for conflicts" = "Провери дали има конфликти"; + +"Browse URL" = "Види го URL"; + +"newAttendee" = "Додади учеÑник"; + +/* calendar modes */ + +"Overview" = "Преглед"; +"Chart" = "Графикон"; +"List" = "ЛиÑта"; +"Columns" = "Колони"; + +/* Priorities */ + +"prio_0" = "Ðе е Ñпецифицирано"; +"prio_1" = "ВиÑоко"; +"prio_2" = "ВиÑоко"; +"prio_3" = "ВиÑоко"; +"prio_4" = "ВиÑоко"; +"prio_5" = "Ðормално"; +"prio_6" = "ÐиÑко"; +"prio_7" = "ÐиÑко"; +"prio_8" = "ÐиÑко"; +"prio_9" = "ÐиÑко"; + +/* access classes (privacy) */ +"PUBLIC_vevent" = "Јавен наÑтан"; +"CONFIDENTIAL_vevent" = "Доверлив наÑтан"; +"PRIVATE_vevent" = "Привате наÑтан"; +"PUBLIC_vtodo" = "Јавна задача"; +"CONFIDENTIAL_vtodo" = "Доверлива задача"; +"PRIVATE_vtodo" = "Приватна задача"; + +/* status type */ +"status_" = "Ðе е Ñпецифицирано"; +"status_NOT-SPECIFIED" = "Ðе е Ñпецифицирано"; +"status_TENTATIVE" = "Можеби"; +"status_CONFIRMED" = "Потврдено"; +"status_CANCELLED" = "Откажано"; +"status_NEEDS-ACTION" = "Треба активноÑÑ‚"; +"status_IN-PROCESS" = "Во тек"; +"status_COMPLETED" = "Завршено на "; + +/* 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" = "Шема која Ñе повторува"; +"Range of recurrence" = "ОпÑег на повторување"; + +"Repeat" = "Повтори"; +"Daily" = "Дневно"; +"Weekly" = "Ðеделно"; +"Monthly" = "МеÑечно"; +"Yearly" = "Годишно"; +"Every" = "Секоја"; +"Days" = "Денови"; +"Week(s)" = "Ðедели"; +"On" = "Ðа"; +"Month(s)" = "МеÑеци"; +/* [Event recurrence editor] Ex: _The_ first Sunday */ +"The" = "The"; +"Recur on day(s)" = "Се повторува на ден(ови)"; +"Year(s)" = "Година(ни)"; +/* [Event recurrence editor] Ex: Every first Sunday _of_ April */ +"cycle_of" = "од"; +"No end date" = "Ðема краен датум"; +"Create" = "Креирај"; +"appointment(s)" = "закажување(а)"; +"Repeat until" = "Повтори до"; + +"First" = "Прв"; +"Second" = "Втор"; +"Third" = "Трет"; +"Fourth" = "Четврт"; +"Fift" = "Пет"; +"Last" = "ПоÑледен"; + +/* Appointment categories */ + +"category_none" = "Ðиту еден"; +"category_labels" = "Годишница,Роденден,Деловно,Повици,Конкуренција,КориÑник,Фаворити,Да Ñе Ñледи,Подарок,Празници,Идеи,СоÑтаноци,Проблеми,Разно,Лични,Проекти,Јавни празници,СтатуÑ,Добавувачи,Патување,Одмор"; + +"repeat_NEVER" = "Ðе повторувај"; +"repeat_DAILY" = "Дневно"; +"repeat_WEEKLY" = "Ðеделно"; +"repeat_BI-WEEKLY" = "Дво-неделно"; +"repeat_EVERY WEEKDAY" = "Секоја Ñабота и недела"; +"repeat_MONTHLY" = "МеÑечни"; +"repeat_YEARLY" = "Годишно"; +"repeat_CUSTOM" = "Специфично..."; + +"reminder_NONE" = "Без потÑетник"; +"reminder_5_MINUTES_BEFORE" = "5 минути пред"; +"reminder_10_MINUTES_BEFORE" = "10 минути пред"; +"reminder_15_MINUTES_BEFORE" = "15 минути пред"; +"reminder_30_MINUTES_BEFORE" = "30 минути пред"; +"reminder_45_MINUTES_BEFORE" = "45 минути пред"; +"reminder_1_HOUR_BEFORE" = "1 Ñ‡Ð°Ñ Ð¿Ñ€ÐµÐ´"; +"reminder_2_HOURS_BEFORE" = "2 чаÑа пред"; +"reminder_5_HOURS_BEFORE" = "5 чаÑа пред"; +"reminder_15_HOURS_BEFORE" = "15 чаÑа пред"; +"reminder_1_DAY_BEFORE" = "1 ден пред"; +"reminder_2_DAYS_BEFORE" = "2 дена пред"; +"reminder_1_WEEK_BEFORE" = "1 недела пред"; +"reminder_CUSTOM" = "Специфично..."; + +"reminder_MINUTES" = "минути"; +"reminder_HOURS" = "чаÑови"; +"reminder_DAYS" = "денови"; +"reminder_BEFORE" = "пред"; +"reminder_AFTER" = "по"; +"reminder_START" = "наÑтанот понува"; +"reminder_END" = "наÑтанот завршува"; +"Reminder Details" = "Детали за потÑетникот"; + +"Choose a Reminder Action" = "Одбери активноÑÑ‚ на потÑетување"; +"Show an Alert" = "Прикажи аларм"; +"Send an E-mail" = "ИÑпрати електронÑка порака"; +"Email Organizer" = "Организатор на пораки"; +"Email Attendees" = "УчеÑници во пораката"; + +"zoom_400" = "400%"; +"zoom_200" = "200%"; +"zoom_100" = "100%"; +"zoom_50" = "50%"; +"zoom_25" = "25%"; + +/* transparency */ + +"Show Time as Free" = "Прикажи го времето како Ñлободно"; + +/* email notifications */ +"Send Appointment Notifications" = "ИÑпрати извеÑтување за ÑоÑтанок"; + +/* validation errors */ + +validate_notitle = "Ðема наÑлов, да продолжам?"; +validate_invalid_startdate = "Ðекоректно поле за почетен датум!"; +validate_invalid_enddate = "Ðекоректно поле за краен датум!"; +validate_endbeforestart = "ВнеÑениот краен датум е пред почетниот датум."; + +"Events" = "ÐаÑтани"; +"Tasks" = "Задачи"; +"Show completed tasks" = "Прикажи ги завршените задачи"; + +/* tabs */ +"Task" = "Задачи"; +"Event" = "ÐаÑтани"; +"Recurrence" = "Повторувања"; + +/* toolbar */ +"New Event" = "Ðов наÑтан"; +"New Task" = "Ðова задача"; +"Edit" = "Уреди"; +"Delete" = "Избриши"; +"Go to Today" = "Оди на денеÑ"; +"Day View" = "Дневен поглед"; +"Week View" = "Ðеделен поглед"; +"Month View" = "МеÑечен поглед"; +"Reload" = "Обнови"; + +"eventPartStatModificationError" = "Вашиот ÑÑ‚Ð°Ñ‚ÑƒÑ Ð·Ð° учеÑтво не може да Ñе измени."; + +/* menu */ +"New Event..." = "Ðов наÑтан..."; +"New Task..." = "Ðова задача..."; +"Edit Selected Event..." = "Уреди го одбраниот наÑтан..."; +"Delete Selected Event" = "Избриши го означениот наÑтан"; +"Select All" = "Одбери Ñе"; +"Workweek days only" = "Само работни денови"; +"Tasks in View" = "Поглед на задачи"; + +"eventDeleteConfirmation" = "Следниот наÑтан(и) ќе биде избришан:"; +"taskDeleteConfirmation" = "Следниот наÑтан(и) ќе биде избришан:"; +"Would you like to continue?" = "Да продолжам?"; + +"You cannot remove nor unsubscribe from your personal calendar." += "Ðе можете да Ñе изземете или отпишете од вашиот личен календар."; +"Are you sure you want to delete the calendar \"%{0}\"?" += "Дали Ñте Ñигурни дека Ñакате да го избришете \"%{0}\" календар?"; + +/* Legend */ +"Participant" = "УчеÑници"; +"Optional Participant" = "Ðезадолжителни учеÑници"; +"Non Participant" = "Ðе е учеÑник"; +"Chair" = "ПретÑедавач"; + +"Needs action" = "Треба активноÑÑ‚"; +"Accepted" = "Прифатено"; +"Declined" = "Одбиено"; +"Tentative" = "Ðеодредено"; + +"Free" = "Слободно"; +"Busy" = "Зафатено"; +"Maybe busy" = "Можеби зафатено"; +"No free-busy information" = "Ðема информација за Ñлободно-зафатено време"; + +/* FreeBusy panel buttons and labels */ +"Suggest time slot:" = "Сугерирај временÑки Ñлот:"; +"Zoom:" = "Зум:"; +"Previous slot" = "Претходниот Ñлот"; +"Next slot" = "Следниот Ñлот"; +"Previous hour" = "Претходниот чаÑ"; +"Next hour" = "Следниот чаÑ"; +"Work days only" = "Само работни денови"; +"The whole day" = "Целиот ден"; +"Between" = "Помеѓу"; +"and" = "и"; + +"A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" += "ПоÑтои конфликт Ñо временÑките Ñлотови Ñо еден или повеќе учеÑници.\nДали Ñакате и покрај тоа да ги Ñочувате тековните поÑтавки?"; + +/* apt list */ +"Title" = "ÐаÑлов"; +"Start" = "Почеток"; +"End" = "Крај"; +"Due Date" = "Краен датум"; +"Location" = "Локација"; + +"(Private Event)" = "(Приватен наÑтан)"; + +vevent_class0 = "(Јавен наÑтан)"; +vevent_class1 = "(Приватен наÑтан)"; +vevent_class2 = "(Доверлив наÑтан)"; + +"Priority" = "Приоритет"; +"Category" = "Категорија"; + +vtodo_class0 = "(Јавна задача)"; +vtodo_class1 = "(Приватна задача)"; +vtodo_class2 = "(Доверлива задача)"; + +"closeThisWindowMessage" = "Благодарам! Сега можете да го затворите прозорецот или да го погледате вашиот"; +"Multicolumn Day View" = "Дневен поглед во повеќе колони"; + +"Please select an event or a task." = "Одберете наÑтан или задача."; + +"editRepeatingItem" = "Предметот кој го уредувате е повторлив наÑтан. дали Ñакате да ги уредите Ñите појавувања или оваа една единÑтвена инÑтанца?"; +"button_thisOccurrenceOnly" = "Само ова појавување"; +"button_allOccurrences" = "Сите појавувања"; + +/* Properties dialog */ +"Name:" = "Име:"; +"Color:" = "Боја:"; + +"Include in free-busy" = "Вклучи во Ñлободно-зафатено"; + +"Synchronization" = "Синхронизација"; +"Synchronize" = "Синхронизирај"; +"Tag:" = "Таг:"; + +"Display" = "Приказ"; +"Show alarms" = "Прикажи ги алармите"; +"Show tasks" = "Прикажи ги задачите"; + +"Notifications" = "ИзвеÑтувања"; +"Receive a mail when I modify my calendar" = "Прими порака кога Ñ˜Ð°Ñ Ð³Ð¾ модификувам мојот календар"; +"Receive a mail when someone else modifies my calendar" = "Прими порака кога некој друг ќе го мидификува мојот календар"; +"When I modify my calendar, send a mail to:" = "Кога ќе го модификувам мојот календар, иÑпрати порака на:"; + +"Links to this Calendar" = "Линкво кон овој календар"; +"Authenticated User Access" = "Ðвторизиран кориÑнички приÑтап"; +"CalDAV URL" = "CalDAV URL:"; +"WebDAV ICS URL" = "WebDAV ICS URL"; +"WebDAV XML URL" = "WebDAV XML URL"; + +/* Error messages */ +"dayFieldInvalid" = "ВнеÑете нумеричка вредноÑÑ‚ во полето за денови која е поголема или еднаква на 1."; +"weekFieldInvalid" = "ВнеÑете нумеричка вредноÑÑ‚ во полето за недели која е поголема или еднаква на 1."; +"monthFieldInvalid" = "ВнеÑете нумеричка вредноÑÑ‚ во полето за меÑеци која е поголема или еднаква на 1."; +"monthDayFieldInvalid" = "Обезбеди нумеричка вредноÑÑ‚ во меÑец ден поле кое е поголемо или еднакво на 1."; +"yearFieldInvalid" = "Обезбедете конкретна нумеричка вредноÑÑ‚ во полето на години или поголем од 1."; +"appointmentFieldInvalid" = "ВнеÑете нумеричка вредноÑÑ‚ во полето за закажувања која е поголема или еднаква на 1."; +"recurrenceUnsupported" = "Овој тип на повторувања моментално не е поддржана."; +"Please specify a calendar name." = "Определете име на календарот."; +"tagNotDefined" = "Морате да Ñпецифицирате таг ако Ñакате да го Ñинхранизира овој календар."; +"tagAlreadyExists" = "Тагот кој го зинеÑовте е веќе аÑоциран Ñо друг календар."; +"tagHasChanged" = "Ðко го проените тагот на вашиот календар, ќе треба да ги превчитате податоците на вашиот мобилен уред.\nДа продолжам?"; +"tagWasAdded" = "Ðко Ñакате да г Ñинхронизирате овој календар, ќе треба да ги превчитате податоците на вашиот мобилен уред.\nДа продолжам?"; +"tagWasRemoved" = "Ðко го отÑтраните овој календар од Ñинхронизација ќе треба да ги превчитате податоците на вашиот мобилен уред.\nДа продолжам?"; +"DestinationCalendarError" = "Изворниот и целниот календар Ñе иÑти. Обидете Ñе да копирате во друг календар."; +"EventCopyError" = "Кориањето е неуÑпешно. Обидете Ñе да копирате во друг календар."; +"Please select at least one calendar" = "Одберете барем еден календар."; + +"Open Task..." = "Отворена задача..."; +"Mark Completed" = "Означи завршени"; +"Delete Task" = "Избриши задача"; +"Delete Event" = "Избриши наÑтан"; +"Copy event to my calendar" = "Копирај го наÑтанот во мојот календар"; +"View Raw Source" = "Види го Ñировиот извор"; + +"Subscribe to a web calendar..." = "Претплатете Ñе на веб календар..."; +"URL of the Calendar" = "URL на календарот"; +"Web Calendar" = "Веб календар"; +"Reload on login" = "Ðаново вчитај при најавување"; +"Invalid number." = "Погрешен број."; +"Please identify yourself to %{0}" = "Ве молам идентификувајте Ñе до %{0}"; diff --git a/UI/Scheduler/Portuguese.lproj/Localizable.strings b/UI/Scheduler/Portuguese.lproj/Localizable.strings new file mode 100644 index 000000000..48f7c0939 --- /dev/null +++ b/UI/Scheduler/Portuguese.lproj/Localizable.strings @@ -0,0 +1,564 @@ +/* this file is in UTF-8 format! */ + +/* Tooltips */ + +"Create a new event" = "Criar um novo evento"; +"Create a new task" = "Criar uma nova tarefa"; +"Edit this event or task" = "Editar este evento ou tarefa"; +"Print the current calendar view" = "Imprimir a visualização do calendário atual"; +"Delete this event or task" = "Apagar este evento ou tarefa"; +"Go to today" = "Ir para hoje"; +"Switch to day view" = "Visualizar Dia"; +"Switch to week view" = "Visualizar Semana"; +"Switch to month view" = "Visualizar Mês"; +"Reload all calendars" = "Recarregar todos os calendários"; + +/* Tabs */ +"Date" = "Data"; +"Calendars" = "Calendários"; + +/* Day */ + +"DayOfTheMonth" = "Dia do mês"; +"dayLabelFormat" = "%m/%d/%Y"; +"today" = "Hoje"; + +"Previous Day" = "Dia Anterior"; +"Next Day" = "Próximo Dia"; + +/* Week */ + +"Week" = "Semana"; +"this week" = "esta semana"; + +"Week %d" = "Semana %d"; + +"Previous Week" = "Semana Anterior"; +"Next Week" = "Próxima Semana"; + +/* Month */ + +"this month" = "este mês"; + +"Previous Month" = "Mês Anterior"; +"Next Month" = "Próximo Mês"; + +/* Year */ + +"this year" = "este ano"; + +/* Menu */ + +"Calendar" = "Calendário"; +"Contacts" = "Contatos"; + +"New Calendar..." = "Novo Calendário..."; +"Delete Calendar" = "Apagar Calendário"; +"Unsubscribe Calendar" = "Cancelar Calendário"; +"Sharing..." = "Partilhando..."; +"Export Calendar..." = "Exportar Calendário..."; +"Import Events..." = "Importar Eventos..."; +"Import Events" = "Importar Eventos"; +"Select an iCalendar file (.ics)." = "Selecione um arquivo iCalendar (.ics)."; +"Upload" = "Carregar"; +"Uploading" = "Carregando"; +"Publish Calendar..." = "Publicar Calendário..."; +"Reload Remote Calendars" = "Recarregar Calendários Remotos"; +"Properties" = "Propriedades"; +"Done" = "Efectuado"; +"An error occurred while importing calendar." = "Um erro ocorreu na importação do calendário."; +"No event was imported." = "Nenhum evento importado."; +"A total of %{0} events were imported in the calendar." = "Um total de %{0} eventos foram importados no calendário."; + +"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"; + +/* Folders */ +"Personal calendar" = "Calendário Pessoal"; + +/* Misc */ + +"OpenGroupware.org" = "OpenGroupware.org"; +"Forbidden" = "Proibido"; + +/* acls */ + +"Access rights to" = "Permissões de acesso para"; +"For user" = "Para utilizador"; + +"Any Authenticated User" = "Qualquer utilizador autenticado"; +"Public Access" = "Acesso Público"; + +"label_Public" = "Público"; +"label_Private" = "Privado"; +"label_Confidential" = "Confidencial"; + +"label_Viewer" = "Ver Tudo"; +"label_DAndTViewer" = "Ver Data e Hora"; +"label_Modifier" = "Modificar"; +"label_Responder" = "Responder Para"; +"label_None" = "Nenhum"; + +"View All" = "Ver Tudo"; +"View the Date & Time" = "Ver Data e Hora"; +"Modify" = "Modificar"; +"Respond To" = "Responder Para"; +"None" = "Nenhum"; + +"This person can create objects in my calendar." += "Esta pessoa pode criar objetos no meu calendário."; +"This person can erase objects from my calendar." += "Esta pessoa pode apagar objetos no meu calendário."; + +/* Button Titles */ + +"Subscribe to a Calendar..." = "Inscrever-se num Calendário..."; +"Remove the selected Calendar" = "Remover o Calendário seleccionado"; + +"Name of the Calendar" = "Nome deste Calendário"; + +"new" = "Novo"; +"Print view" = "Visualização de Impressão"; +"edit" = "Editar"; +"delete" = "Apagar"; +"proposal" = "Proposta"; +"Save and Close" = "Gravar e Fechar"; +"Close" = "Fechar"; +"Invite Attendees" = "Convidar Participantes"; +"Attach" = "Adicionar atalho"; +"Update" = "Atualizar"; +"Cancel" = "Cancelar"; +"show_rejected_apts" = "Exibir compromissos rejeitados"; +"hide_rejected_apts" = "Ocultar compromissos rejeitados"; + + +/* Schedule */ + +"Schedule" = "Agenda"; +"No appointments found" = "Compromissos não encontrados"; +"Meetings proposed by you" = "Reuniões propostas por si"; +"Meetings proposed to you" = "Reuniões propostas para si"; +"sched_startDateFormat" = "%d/%m %H:%M"; +"action" = "Acção"; +"accept" = "Aceitar"; +"decline" = "Rejeitar"; +"more attendees" = "Mais Participantes"; +"Hide already accepted and rejected appointments" = "Ocultar compromissos já aceites e rejeitados"; +"Show already accepted and rejected appointments" = "Exibir compromissos já aceites e rejeitados"; + +/* Print view */ + +"LIST" = "Lista"; +"Print Settings" = "Configurações de Impressão"; +"Title:" = "Título:"; +"Layout:" = "Disposição:"; +"What to Print" = "O que imprimir"; +"Options" = "Opções"; +"Tasks with no due date" = "Tarefas sem data de vencimento"; +"Display working hours only" = "Exibir somente o horário de trabalho"; +"Completed tasks" = "Tarefas efectuadas"; +"Display events and tasks colors" = "Exibir eventos e tarefas com cores"; +"Borders" = "Margens"; +"Backgrounds" = "Plano de fundo"; + +/* Appointments */ + +"Appointment viewer" = "Visualizador de Compromissos"; +"Appointment editor" = "Editor de Compromissos"; +"Appointment proposal" = "Compromisso Proposto"; +"Appointment on" = "Compromisso a"; +"Start:" = "Inicio:"; +"End:" = "Fim:"; +"Due Date:" = "Data:"; +"Title:" = "Título:"; +"Calendar:" = "Calendário:"; +"Name" = "Nome"; +"Email" = "Correio"; +"Status:" = "Estado:"; +"% complete" = "% efectuado"; +"Location:" = "Localização:"; +"Priority:" = "Prioridade:"; +"Privacy" = "Privacidade"; +"Cycle" = "Ciclo"; +"Cycle End" = "Ciclo Final"; +"Categories" = "Categorias"; +"Classification" = "Classificação"; +"Duration" = "Duração"; +"Attendees:" = "Participantes:"; +"Resources" = "Recursos"; +"Organizer:" = "Organizador:"; +"Description:" = "Descrição:"; +"Document:" = "Documento:"; +"Category:" = "Categoria:"; +"Repeat:" = "Repetir:"; +"Reminder:" = "Lembrete:"; +"General:" = "Geral:"; +"Reply:" = "Responder:"; +"Created by:" = "Criado por:"; + + +"Target:" = "Destino:"; + +"attributes" = "atributos"; +"attendees" = "participantes"; +"delegated from" = "delegado por"; + +/* checkbox title */ +"is private" = "é privado"; +/* classification */ +"Public" = "Público"; +"Private" = "Privado"; +/* text used in overviews and tooltips */ +"empty title" = "Título Vazio"; +"private appointment" = "Compromisso privado"; + +"Change..." = "Alterar..."; + +/* Appointments (participation state) */ + +"partStat_NEEDS-ACTION" = "Ações necessárias"; +"partStat_ACCEPTED" = "Vou participar"; +"partStat_DECLINED" = "Não vou participar"; +"partStat_TENTATIVE" = "Confirmarei depois"; +"partStat_DELEGATED" = "Delegado"; +"partStat_OTHER" = "Outro"; + +/* Appointments (error messages) */ + +"Conflicts found!" = "Conflitos encontrados!"; +"Invalid iCal data!" = "Dados iCal inválidos!"; +"Could not create iCal data!" = "Não foi possível criar dados iCal!"; + +/* Searching */ + +"view_all" = "Tudo"; +"view_today" = "Hoje"; +"view_next7" = "Próximos 7 dias"; +"view_next14" = "Próximos 14 dias"; +"view_next31" = "Próximos 31 dias"; +"view_thismonth" = "Este Mês"; +"view_future" = "Todos os Eventos Futuros"; +"view_selectedday" = "Dia Selecionado"; + +"view_not_started" = "Tarefas não iniciadas"; +"view_overdue" = "Tarefas em atraso"; +"view_incomplete" = "Tarefas incompletas"; + +"View:" = "Vista:"; +"Title, category or location" = "Título, categoria ou localização"; +"Entire content" = "Todo o conteúdo"; + +"Search" = "Pesquisar"; +"Search attendees" = "Pesquisar participantes"; +"Search resources" = "Pesquisar recursos"; +"Search appointments" = "Pesquisar compromissos"; + +"All day Event" = "Evento diário"; +"check for conflicts" = "Verificar conflitos"; + +"Browse URL" = "Abrir URL"; + +"newAttendee" = "Adicionar participante"; + +/* calendar modes */ + +"Overview" = "Visão Geral"; +"Chart" = "Gráfico"; +"List" = "Lista"; +"Columns" = "Colunas"; + +/* Priorities */ + +"prio_0" = "Não especificado"; +"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"; +"prio_9" = "Baixa 3"; + +/* access classes (privacy) */ +"PUBLIC_vevent" = "Evento Público"; +"CONFIDENTIAL_vevent" = "Evento Confidencial"; +"PRIVATE_vevent" = "Evento Privado"; +"PUBLIC_vtodo" = "Tarefa Pública"; +"CONFIDENTIAL_vtodo" = "Tarefa Confidencial"; +"PRIVATE_vtodo" = "Tarefa Privada"; + +/* status type */ +"status_" = "Não especificado"; +"status_NOT-SPECIFIED" = "Não especificado"; +"status_TENTATIVE" = "Tentativa"; +"status_CONFIRMED" = "Confirmado"; +"status_CANCELLED" = "Cancelado"; +"status_NEEDS-ACTION" = "Ações Necessárias"; +"status_IN-PROCESS" = "Em Processamento"; +"status_COMPLETED" = "Completado"; + +/* Cycles */ + +"cycle_once" = "Uma Vez"; +"cycle_daily" = "Diariamente"; +"cycle_weekly" = "Semanalmente"; +"cycle_2weeks" = "2 semanas"; +"cycle_4weeks" = "4 semanas"; +"cycle_monthly" = "Mensalmente"; +"cycle_weekday" = "Dia da Semana"; +"cycle_yearly" = "Anualmente"; + +"cycle_end_never" = "Sem fim"; +"cycle_end_until" = "Finalizar até"; + +"Recurrence pattern" = "Padrão de Repetição"; +"Range of recurrence" = "Intervalo de Repetição"; + +"Repeat" = "Repetir"; +"Daily" = "Diariamente"; +"Weekly" = "Semanalmente"; +"Monthly" = "Mensalmente"; +"Yearly" = "Anualmente"; +"Every" = "A cada"; +"Days" = "Dias"; +"Week(s)" = "Semana(s)"; +"On" = "Em"; +"Month(s)" = "Mês(es)"; +"The" = "O/A"; +"Recur on day(s)" = "Retorne em dia(s)"; +"Year(s)" = "Ano(s)"; +"cycle_of" = "de"; +"No end date" = "Sem data final"; +"Create" = "Criar"; +"appointment(s)" = "compromissos(s)"; +"Repeat until" = "Repetir até"; + +"First" = "Primeiro"; +"Second" = "Segundo"; +"Third" = "Terceiro"; +"Fourth" = "Quarto"; +"Fift" = "Quinto"; +"Last" = "Último"; + +/* Appointment categories */ + +"category_none" = "Nenhum"; +"category_labels" = "Aniversário,Negócios,Ligações,Concorrência,Cliente,Favoritos,Acompanhamento,Presentes,Feriados,Idéias,Problemas,Miscelânea,Meeting,Pessoal,Projetos,Feriado público,Posição,Fornecedores,Viagem,Férias"; + +"repeat_NEVER" = "Sem repetição"; +"repeat_DAILY" = "Diariamente"; +"repeat_WEEKLY" = "Semanalmente"; +"repeat_BI-WEEKLY" = "Bi-semanal"; +"repeat_EVERY WEEKDAY" = "Cada dia útil"; +"repeat_MONTHLY" = "Mensalmente"; +"repeat_YEARLY" = "Anualmente"; +"repeat_CUSTOM" = "Personalizar..."; + +"reminder_NONE" = "Não lembrar"; +"reminder_5_MINUTES_BEFORE" = "5 minutos antes"; +"reminder_10_MINUTES_BEFORE" = "10 minutos antes"; +"reminder_15_MINUTES_BEFORE" = "15 minutos antes"; +"reminder_30_MINUTES_BEFORE" = "30 minutos antes"; +"reminder_45_MINUTES_BEFORE" = "45 minutos antes"; +"reminder_1_HOUR_BEFORE" = "1 hora antes"; +"reminder_2_HOURS_BEFORE" = "2 horas antes"; +"reminder_5_HOURS_BEFORE" = "5 horas antes"; +"reminder_15_HOURS_BEFORE" = "15 horas antes"; +"reminder_1_DAY_BEFORE" = "1 dia antes"; +"reminder_2_DAYS_BEFORE" = "2 dias antes"; +"reminder_1_WEEK_BEFORE" = "1 semana antes"; +"reminder_CUSTOM" = "Personalizar..."; + +"reminder_MINUTES" = "minutos"; +"reminder_HOURS" = "horas"; +"reminder_DAYS" = "dias"; +"reminder_BEFORE" = "antes"; +"reminder_AFTER" = "depois"; +"reminder_START" = "inicio do evento"; +"reminder_END" = "fim do evento"; +"Reminder Details" = "Detalhes do Lembrete"; + +"Choose a Reminder Action" = "Escolha uma ação"; +"Show an Alert" = "Exibir um Alerta"; +"Send an E-mail" = "Enviar um E-mail"; +"Email Organizer" = "Organizador de Email"; +"Email Attendees" = "Email Participantes"; + +"zoom_400" = "400%"; +"zoom_200" = "200%"; +"zoom_100" = "100%"; +"zoom_50" = "50%"; +"zoom_25" = "25%"; + +/* transparency */ + +"Show Time as Free" = "Exibir Hora como Livre"; + +/* email notifications */ +"Send Appointment Notifications" = "Enviar Notificações de Apontamento"; + +/* validation errors */ + +validate_notitle = "Nenhum título informado, continue?"; +validate_invalid_startdate = "Campo Data Inicial incorreto!"; +validate_invalid_enddate = "Campo Data Final incorreto!"; +validate_endbeforestart = "A data que informou ocorre antes da data inicial."; + +"Events" = "Eventos"; +"Tasks" = "Tarefas"; +"Show completed tasks" = "Exibir tarefas efectuadas"; + +/* tabs */ +"Task" = "Tarefa"; +"Event" = "Evento"; +"Recurrence" = "Recorrencia"; + +/* toolbar */ +"New Event" = "Novo Evento"; +"New Task" = "Nova Tarefa"; +"Edit" = "Editar"; +"Delete" = "Apagar"; +"Go to Today" = "Ir para Hoje"; +"Day View" = "Visualizar Dia"; +"Week View" = "Visualizar Semana"; +"Month View" = "Visualizar Mês"; +"Reload" = "Recarregar"; + +"eventPartStatModificationError" = "O seu estado de participação não pode ser modificado."; + +/* menu */ +"New Event..." = "Novo Evento..."; +"New Task..." = "Nova Tarefa..."; +"Edit Selected Event..." = "Editar o Evento Selecionado..."; +"Delete Selected Event" = "Apagar o Evento Selecionado"; +"Select All" = "Selecionar Tudo"; +"Workweek days only" = "Apenas semanas úteis"; +"Tasks in View" = "Tarefas na vista"; + +"eventDeleteConfirmation" = "O(s) seguinte(s) evento(s) será(ão) apagado(s):"; +"taskDeleteConfirmation" = "Apagar permanentemente esta tarefa."; +"Would you like to continue?" = "Pretende continuar?"; + +"You cannot remove nor unsubscribe from your personal calendar." += "Você não pode remover nem retirar-se do seu calendário pessoal."; +"Are you sure you want to delete the calendar \"%{0}\"?" += "Você tem certeza que quer apagar o calendário \"%{0}\"?"; + +/* Legend */ +"Participant" = "Participante"; +"Optional Participant" = "Participante Opcional"; +"Non Participant" = "Não Participante"; +"Chair" = "Cadeira"; + +"Needs action" = "Ações necessárias"; +"Accepted" = "Aceite"; +"Declined" = "Rejeitado"; +"Tentative" = "Tentativa"; + +"Free" = "Livre"; +"Busy" = "Ocupado"; +"Maybe busy" = "Talvez ocupado"; +"No free-busy information" = "Sem informação Livre/Ocupado"; + +/* 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" = "Somente dias de trabalho"; +"The whole day" = "O dia inteiro"; +"Between" = "Entre"; +"and" = "e"; + +"A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" += "Existe um conflito de tempo com um ou mais participantes.\nGostaria de manter as configurações atuais?"; + +/* apt list */ +"Title" = "Título"; +"Start" = "Início"; +"End" = "Fim"; +"Due Date" = "Data de Vencimento"; +"Location" = "Localização"; + +"(Private Event)" = "(Evento Privado)"; + +vevent_class0 = "(Evento Público)"; +vevent_class1 = "(Evento Privado)"; +vevent_class2 = "(Evento Confidencial)"; + +"Priority" = "Prioridade"; +"Category" = "Categoria"; + +vtodo_class0 = "(Tarefa Pública)"; +vtodo_class1 = "(Tarefa Privada)"; +vtodo_class2 = "(Tarefa Confidencial)"; + +"closeThisWindowMessage" = "Obrigado! Agora já pode fechar esta janela ou visualização "; +"Multicolumn Day View" = "Visão Diária Multicolunas"; + +"Please select an event or a task." = "Por favor, selecione um evento ou tarefa."; + +"editRepeatingItem" = "O item que está editando é um item repetitivo. Você quer editar todas as ocorrências deste ou somente este?"; +"button_thisOccurrenceOnly" = "Somente esta ocorrência"; +"button_allOccurrences" = "Todas as ocorrências"; + +/* Properties dialog */ +"Name:" = "Nome:"; +"Color:" = "Cor:"; + +"Include in free-busy" = "Incluir na disponibilidade"; + +"Synchronization" = "Sincronização"; +"Synchronize" = "Sincronizar"; +"Tag:" = "Marca:"; + +"Display" = "Exibir"; +"Show alarms" = "Exibir alarmes"; +"Show tasks" = "Exibir tarefas"; + +"Notifications" = "Notificações"; +"Receive a mail when I modify my calendar" = "Receber um email quando eu modificar meu calendário"; +"Receive a mail when someone else modifies my calendar" = "Receber um email quando alguem modificar meu calendário"; +"When I modify my calendar, send a mail to:" = "Quando eu modificar meu calendário, enviar um email para:"; + +"Links to this Calendar" = "Links para este Calendário"; +"Authenticated User Access" = "Acesso a Utilizador Autenticado"; +"CalDAV URL" = "CalDAV URL:"; +"WebDAV ICS URL" = "WebDAV ICS URL"; +"WebDAV XML URL" = "WebDAV XML URL"; + +/* Error messages */ +"dayFieldInvalid" = "Por favor, especifique um valor numérico no campo Dias, maior ou igual a 1."; +"weekFieldInvalid" = "Por favor, especifique um valor numérico no campo Semana(s), maior ou igual a 1."; +"monthFieldInvalid" = "Por favor, especifique um valor numérico no campo Mes(es), maior ou igual a 1."; +"monthDayFieldInvalid" = "Por favor, especifique um valor numéricio no campo Dia do Mes, maior ou igual a 1."; +"yearFieldInvalid" = "Por favor, especifique um valor numéricio no campo Ano(s), maior ou igual a 1."; +"appointmentFieldInvalid" = "Por favor, especifique um valor numéricio no campo Apontamento(s) maior ou igual a 1."; +"recurrenceUnsupported" = "Este tipo de recorrência não é suportado."; +"Please specify a calendar name." = "Por favor, especifique um nome de calendário."; +"tagNotDefined" = "Você deve especificar um dispositivo se deseja sincronizar este calendário."; +"tagAlreadyExists" = "Este dispositivo especificado já está associado a outro calendário."; +"tagHasChanged" = "Se você trocar o dispositivo deste calendário, será necessário sincronizar novamente seus dados no dispositivo móvel.\nContinuar?"; +"tagWasAdded" = "Se você quisar sincronizar este calendário, será necessário sincronizar novamente seus dados no dispositivo móvel.\nContinuar?"; +"tagWasRemoved" = "Se você remover este calendário da sincronização, será necessário sincronizar novamente seus dados no dispositivo móvel.\nContinuar?"; +"DestinationCalendarError" = "Os calendários de origem e destino são os mesmos. Por favor, tente copiar para outro calendário diferente."; +"EventCopyError" = "A cópia falhou. Por favor, tente copiar para um calendário diferente."; +"Please select at least one calendar" = "Por favor, selecione pelo menos um calendário"; + + +"Open Task..." = "Abrir Tarefa..."; +"Mark Completed" = "Marcar como Concluída"; +"Delete Task" = "Remover Tarefa"; +"Delete Event" = "Remover Evento"; +"Copy event to my calendar" = "Copiar evento para o meu calendário"; +"View Raw Source" = "Visualizar Fonte"; + +"Subscribe to a web calendar..." = "Inscrever-se num calendário web..."; +"URL of the Calendar" = "URL do Calendário"; +"Web Calendar" = "Calendário Web"; +"Reload on login" = "Recarregar no login"; +"Invalid number." = "Número inválido."; +"Please identify yourself to %{0}" = "Por favor, identifique-se para %{0}"; diff --git a/UI/Scheduler/UIxCalDateSelector.m b/UI/Scheduler/UIxCalDateSelector.m index 2b2559fe3..a9bb518f3 100644 --- a/UI/Scheduler/UIxCalDateSelector.m +++ b/UI/Scheduler/UIxCalDateSelector.m @@ -117,7 +117,7 @@ date = [self startDate]; - return [NSString stringWithFormat: @"%.2d", [date monthOfYear]]; + return [NSString stringWithFormat: @"%.2d", (int)[date monthOfYear]]; } - (NSString *) headerMonthString @@ -136,7 +136,7 @@ date = [self startDate]; - return [NSString stringWithFormat: @"%d", [date yearOfCommonEra]]; + return [NSString stringWithFormat: @"%d", (int)[date yearOfCommonEra]]; } - (NSString *) localizedDayOfWeekName diff --git a/UI/Scheduler/UIxCalDayTable.h b/UI/Scheduler/UIxCalDayTable.h index 57d91e846..ceaed3b56 100644 --- a/UI/Scheduler/UIxCalDayTable.h +++ b/UI/Scheduler/UIxCalDayTable.h @@ -39,7 +39,8 @@ NSArray *weekDays; NSString *currentView, *timeFormat, *currentTableHour; NSCalendarDate *startDate, *currentTableDay; - NSMutableArray *daysToDisplay, *calendarsToDisplay, *currentCalendar, *hoursToDisplay; + NSMutableArray *daysToDisplay, *calendarsToDisplay, *hoursToDisplay; + NSMutableDictionary *currentCalendar; unsigned int numberOfDays; } @@ -55,7 +56,7 @@ - (NSArray *) calendarsToDisplay; - (void) setCurrentTableDay: (NSCalendarDate *) aTableDay; - (NSCalendarDate *) currentTableDay; -- (NSMutableArray *) currentCalendar; +- (NSMutableDictionary *) currentCalendar; @end diff --git a/UI/Scheduler/UIxCalDayTable.m b/UI/Scheduler/UIxCalDayTable.m index 7cfde1b1f..bea4ad518 100644 --- a/UI/Scheduler/UIxCalDayTable.m +++ b/UI/Scheduler/UIxCalDayTable.m @@ -37,6 +37,9 @@ #import #import +#import +#import + #import "UIxCalDayTable.h" @class SOGoAppointment; @@ -191,7 +194,7 @@ NSMutableDictionary *calendar; unsigned int count, foldersCount; NSString *folderName, *fDisplayName; - BOOL *isActive; + BOOL isActive; co = [self clientObject]; folders = [co subFolders]; @@ -200,8 +203,8 @@ for (count = 0; count < foldersCount; count++) { folder = [folders objectAtIndex: count]; - isActive = [NSNumber numberWithBool: [folder isActive]]; - if ([isActive intValue] != 0) { + isActive = [folder isActive]; + if (isActive != NO) { calendar = [NSMutableDictionary dictionary]; folderName = [folder nameInContainer]; fDisplayName = [folder displayName]; @@ -214,7 +217,7 @@ [calendar setObject: fDisplayName forKey: @"displayName"]; [calendar setObject: folderName forKey: @"folder"]; [calendar setObject: [folder calendarColor] forKey: @"color"]; - [calendar setObject: isActive forKey: @"active"]; + [calendar setObject: [NSNumber numberWithBool:isActive] forKey: @"active"]; [calendar setObject: [folder ownerInContext: context] forKey: @"owner"]; [calendarsToDisplay addObject: calendar]; @@ -235,12 +238,12 @@ return currentTableDay; } -- (void) setCurrentCalendar: (NSMutableArray *) aCalendar +- (void) setCurrentCalendar: (NSMutableDictionary *) aCalendar { ASSIGN(currentCalendar, aCalendar); } -- (NSMutableArray *) currentCalendar +- (NSMutableDictionary *) currentCalendar { return currentCalendar; } diff --git a/UI/Scheduler/UIxCalDayView.m b/UI/Scheduler/UIxCalDayView.m index 8dca83462..8f2644370 100644 --- a/UI/Scheduler/UIxCalDayView.m +++ b/UI/Scheduler/UIxCalDayView.m @@ -164,7 +164,7 @@ date = [self selectedDate]; hmString = [NSString stringWithFormat:@"%.2d%.2d", - [date hourOfDay], [date minuteOfHour]]; + (int)[date hourOfDay], (int)[date minuteOfHour]]; qp = [[self queryParameters] mutableCopy]; [self setSelectedDateQueryParameter:date inDictionary:qp]; [qp setObject: hmString forKey:@"hm"]; diff --git a/UI/Scheduler/UIxCalListingActions.m b/UI/Scheduler/UIxCalListingActions.m index bb94e7c4f..87f1e6168 100644 --- a/UI/Scheduler/UIxCalListingActions.m +++ b/UI/Scheduler/UIxCalListingActions.m @@ -316,7 +316,7 @@ static NSArray *tasksFields = nil; NSString *owner, *role, *calendarName, *filters, *iCalString; NSRange match; iCalCalendar *calendar; - iCalObject *master; + iCalEntityObject *master; SOGoAppointmentFolder *currentFolder; SOGoAppointmentFolders *clientObject; SOGoUser *ownerUser; @@ -350,7 +350,7 @@ static NSArray *tasksFields = nil; else if ([criteria isEqualToString:@"entireContent"]) { // First search : Through the quick table inside the location, category and title columns - quickInfos = [currentFolder fetchCoreInfosFrom: startDate + quickInfos = (NSMutableArray *)[currentFolder fetchCoreInfosFrom: startDate to: endDate title: value component: component @@ -366,7 +366,7 @@ static NSArray *tasksFields = nil; } // Second research : Every objects except for those already in the quickInfos array - allInfos = [currentFolder fetchCoreInfosFrom: startDate + allInfos = (NSMutableArray *)[currentFolder fetchCoreInfosFrom: startDate to: endDate title: nil component: component]; @@ -383,7 +383,7 @@ static NSArray *tasksFields = nil; { iCalString = [[allInfos objectAtIndex:i] objectForKey:@"c_content"]; calendar = [iCalCalendar parseSingleFromSource: iCalString]; - master = [calendar firstChildWithTag:component]; + master = (iCalEntityObject *)[calendar firstChildWithTag:component]; if (master) { if ([[master comment] length] > 0) { @@ -1089,7 +1089,7 @@ _computeBlocksPosition (NSArray *blocks) if ([currentView isEqualToString: @"multicolumndayview"]) { - calendars = [self _selectedCalendars]; + calendars = (NSMutableArray *)[self _selectedCalendars]; eventsByCalendars = [NSMutableArray arrayWithCapacity:[calendars count]]; for (i = 0; i < [calendars count]; i++) // For each calendar { diff --git a/UI/Scheduler/UIxCalMonthView.m b/UI/Scheduler/UIxCalMonthView.m index c0c51097f..be35a5b75 100644 --- a/UI/Scheduler/UIxCalMonthView.m +++ b/UI/Scheduler/UIxCalMonthView.m @@ -299,7 +299,7 @@ [classes appendFormat: @"day weekOf%d week%dof%d day%d", numberOfWeeks, - [weeksToDisplay indexOfObject: currentWeek], + (int)[weeksToDisplay indexOfObject: currentWeek], numberOfWeeks, dayOfWeek]; if (realDayOfWeek == 0 || realDayOfWeek == 6) [classes appendString: @" weekEndDay"]; diff --git a/UI/Scheduler/UIxCalViewPrint.m b/UI/Scheduler/UIxCalViewPrint.m index 813e2e2ad..c49fd8a18 100644 --- a/UI/Scheduler/UIxCalViewPrint.m +++ b/UI/Scheduler/UIxCalViewPrint.m @@ -49,6 +49,7 @@ static NSArray *layoutItems = nil; - (void) dealloc { [item release]; + [super dealloc]; } - (void) setItem: (NSString *) newItem @@ -68,7 +69,7 @@ static NSArray *layoutItems = nil; - (NSString *) itemPrintLayoutText { - return [self labelForKey: [NSString stringWithFormat: item]]; + return [self labelForKey: [NSString stringWithFormat: @"%@", item]]; } // diff --git a/UI/Scheduler/UIxCalendarProperties.m b/UI/Scheduler/UIxCalendarProperties.m index 46c2c8048..771bf8a37 100644 --- a/UI/Scheduler/UIxCalendarProperties.m +++ b/UI/Scheduler/UIxCalendarProperties.m @@ -91,6 +91,9 @@ - (BOOL) synchronizeCalendar { + if ([self isWebCalendar]) + return NO; + return [self mustSynchronize] || [calendar synchronize]; } @@ -101,7 +104,7 @@ - (BOOL) mustSynchronize { - return [[calendar nameInContainer] isEqualToString: @"personal"]; + return ([[calendar nameInContainer] isEqualToString: @"personal"] || [self isWebCalendar]); } - (BOOL) showCalendarAlarms diff --git a/UI/Scheduler/UIxComponentEditor.m b/UI/Scheduler/UIxComponentEditor.m index a7581e57c..531daa076 100644 --- a/UI/Scheduler/UIxComponentEditor.m +++ b/UI/Scheduler/UIxComponentEditor.m @@ -2472,7 +2472,7 @@ RANGE(2); content = [NSMutableString string]; response = [context response]; - [content appendFormat: [[self clientObject] contentAsString]]; + [content appendFormat: @"%@", [[self clientObject] contentAsString]]; [response setHeader: @"text/plain; charset=utf-8" forKey: @"content-type"]; [response appendContentString: content]; diff --git a/UI/Scheduler/UIxRecurrenceEditor.m b/UI/Scheduler/UIxRecurrenceEditor.m index d4449b40a..45f3d7324 100644 --- a/UI/Scheduler/UIxRecurrenceEditor.m +++ b/UI/Scheduler/UIxRecurrenceEditor.m @@ -148,7 +148,7 @@ [shortWeekDaysList retain]; } - id = [NSString stringWithFormat: @"weekDay%i", [shortWeekDaysList indexOfObject: item]]; + id = [NSString stringWithFormat: @"weekDay%i", (int)[shortWeekDaysList indexOfObject: item]]; return id; } diff --git a/UI/Templates/ContactsUI/UIxContactEditor.wox b/UI/Templates/ContactsUI/UIxContactEditor.wox index 893b94ddd..06b4e759f 100644 --- a/UI/Templates/ContactsUI/UIxContactEditor.wox +++ b/UI/Templates/ContactsUI/UIxContactEditor.wox @@ -57,7 +57,7 @@
-
-
-
-