From 440897027ed5d6050c3d3540799f485a80553405 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Tue, 3 Aug 2010 14:36:33 +0000 Subject: [PATCH 01/12] SOGo v1.3.1 branch Monotone-Parent: 86a177d4a05deda193edc7d9e0fedca89758cadd Monotone-Revision: ec4781f04b708ab2a5944c8097cb08a1e608213e Monotone-Author: ludovic@Sophos.ca Monotone-Date: 2010-08-03T14:36:33 --- ChangeLog | 4 ++++ SOPE/NGCards/NSString+NGCards.m | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 236fd4b74..6591ba18b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2010-08-03 Ludovic Marcotte + + * Applied patch for bug #690 + 2010-07-28 Francis Lachapelle * UI/WebServerResources/MailerUI.js (deleteCachedMailboxByType, diff --git a/SOPE/NGCards/NSString+NGCards.m b/SOPE/NGCards/NSString+NGCards.m index 2ce0ce664..7e2cbef7b 100644 --- a/SOPE/NGCards/NSString+NGCards.m +++ b/SOPE/NGCards/NSString+NGCards.m @@ -51,7 +51,7 @@ static NSString *commaSeparator = nil; foldedString = [NSMutableString string]; length = [self length]; - if (length < 76) + if (length < 77) [foldedString appendString: self]; else { @@ -59,7 +59,7 @@ static NSString *commaSeparator = nil; [foldedString appendFormat: @"%@\r\n", [self substringWithRange: subStringRange]]; subStringRange = NSMakeRange (75, 74); - while ((length - subStringRange.location) > 74) + while ((length - subStringRange.location) > 75) { [foldedString appendFormat: @" %@\r\n", [self substringWithRange: subStringRange]]; From fd07a9b028960eeb6906b2797b6c2568f481a07a Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Tue, 3 Aug 2010 14:49:28 +0000 Subject: [PATCH 02/12] See ChangeLog Monotone-Parent: ec4781f04b708ab2a5944c8097cb08a1e608213e Monotone-Revision: b7ca5a591c7686be57e44bf98aae0c7b148afa20 Monotone-Author: ludovic@Sophos.ca Monotone-Date: 2010-08-03T14:49:28 --- ChangeLog | 1 + SoObjects/SOGo/GNUmakefile.preamble | 2 +- SoObjects/SOGo/SQLSource.m | 12 ++++++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 6591ba18b..dda920ef7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,7 @@ 2010-08-03 Ludovic Marcotte * Applied patch for bug #690 + * Applied patch for bug #703 2010-07-28 Francis Lachapelle diff --git a/SoObjects/SOGo/GNUmakefile.preamble b/SoObjects/SOGo/GNUmakefile.preamble index dbe5f3cbc..afd4c9796 100644 --- a/SoObjects/SOGo/GNUmakefile.preamble +++ b/SoObjects/SOGo/GNUmakefile.preamble @@ -19,7 +19,7 @@ SOGo_LIBRARIES_DEPEND_UPON += \ -lNGCards \ -lNGMime \ -lNGStreams -lNGExtensions -lEOControl \ - -lXmlRpc -lDOM -lSaxObjC \ + -lXmlRpc -lDOM -lSaxObjC -lcrypt \ -lNGLdap ADDITIONAL_TOOL_LIBS += \ diff --git a/SoObjects/SOGo/SQLSource.m b/SoObjects/SOGo/SQLSource.m index 251456e15..aacb36869 100644 --- a/SoObjects/SOGo/SQLSource.m +++ b/SoObjects/SOGo/SQLSource.m @@ -35,6 +35,8 @@ #import #import +#include + #include #include @@ -139,6 +141,16 @@ { return [plainPassword isEqualToString: encryptedPassword]; } + else if ([_userPasswordAlgorithm caseInsensitiveCompare: @"crypt"] == NSOrderedSame) + { + NSString *s; + char *buf; + + buf = (char *)crypt([plainPassword UTF8String], [encryptedPassword UTF8String]); + s = [NSString stringWithUTF8String: buf]; + + return [s isEqualToString: encryptedPassword]; + } else if ([_userPasswordAlgorithm caseInsensitiveCompare: @"md5"] == NSOrderedSame) { NSString *s; From a1c61e5aeb1aadb6afd247554263120492c02777 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Tue, 3 Aug 2010 15:13:58 +0000 Subject: [PATCH 03/12] See ChangeLog Monotone-Parent: b7ca5a591c7686be57e44bf98aae0c7b148afa20 Monotone-Revision: c9c9702c0e5884249b52a03e2a48d4fd554c6217 Monotone-Author: ludovic@Sophos.ca Monotone-Date: 2010-08-03T15:13:58 --- ChangeLog | 1 + SoObjects/Appointments/GNUmakefile | 2 +- .../Polish.lproj/Localizable.strings | 62 ++ SoObjects/Contacts/GNUmakefile | 2 +- .../Contacts/Polish.lproj/Localizable.strings | 1 + SoObjects/Mailer/GNUmakefile | 2 + SoObjects/Mailer/SOGoMailForward.h | 3 + SoObjects/Mailer/SOGoMailForward.m | 3 + .../SOGoMailPolishForward.html | 13 + .../SOGoMailPolishForward.wod | 79 +++ .../SOGoMailPolishReply.html | 16 + .../SOGoMailPolishReply.wod | 106 ++++ SoObjects/Mailer/SOGoMailReply.h | 3 + SoObjects/Mailer/SOGoMailReply.m | 3 + SoObjects/SOGo/SOGoDefaults.plist | 3 +- Tests/Integration/all.py | 2 +- UI/AdministrationUI/GNUmakefile | 2 +- .../Polish.lproj/Localizable.strings | 15 + UI/Common/GNUmakefile | 2 +- UI/Common/Polish.lproj/Localizable.strings | 72 +++ .../Localizable.strings | 1 + UI/Contacts/Czech.lproj/Localizable.strings | 1 + UI/Contacts/Dutch.lproj/Localizable.strings | 1 + UI/Contacts/English.lproj/Localizable.strings | 1 + UI/Contacts/French.lproj/Localizable.strings | 1 + UI/Contacts/GNUmakefile | 2 +- UI/Contacts/German.lproj/Localizable.strings | 1 + .../Hungarian.lproj/Localizable.strings | 1 + UI/Contacts/Italian.lproj/Localizable.strings | 1 + UI/Contacts/Polish.lproj/Localizable.strings | 197 ++++++ UI/Contacts/Russian.lproj/Localizable.strings | 1 + UI/Contacts/Spanish.lproj/Localizable.strings | 1 + UI/Contacts/Swedish.lproj/Localizable.strings | 1 + .../Ukrainian.lproj/Localizable.strings | 1 + UI/Contacts/Welsh.lproj/Localizable.strings | 1 + UI/MailPartViewers/GNUmakefile | 2 +- .../Polish.lproj/Localizable.strings | 45 ++ .../Localizable.strings | 1 + UI/MailerUI/Czech.lproj/Localizable.strings | 1 + UI/MailerUI/Dutch.lproj/Localizable.strings | 1 + UI/MailerUI/English.lproj/Localizable.strings | 1 + UI/MailerUI/French.lproj/Localizable.strings | 1 + UI/MailerUI/GNUmakefile | 2 +- UI/MailerUI/German.lproj/Localizable.strings | 1 + .../Hungarian.lproj/Localizable.strings | 1 + UI/MailerUI/Italian.lproj/Localizable.strings | 1 + UI/MailerUI/Polish.lproj/Localizable.strings | 272 +++++++++ UI/MailerUI/Russian.lproj/Localizable.strings | 1 + UI/MailerUI/Spanish.lproj/Localizable.strings | 1 + UI/MailerUI/Swedish.lproj/Localizable.strings | 1 + .../Ukrainian.lproj/Localizable.strings | 1 + UI/MailerUI/Welsh.lproj/Localizable.strings | 1 + .../Localizable.strings | 1 + UI/MainUI/Czech.lproj/Localizable.strings | 1 + UI/MainUI/Dutch.lproj/Localizable.strings | 1 + UI/MainUI/English.lproj/Localizable.strings | 1 + UI/MainUI/French.lproj/Localizable.strings | 1 + UI/MainUI/GNUmakefile | 2 +- UI/MainUI/German.lproj/Localizable.strings | 1 + UI/MainUI/Hungarian.lproj/Localizable.strings | 1 + UI/MainUI/Italian.lproj/Localizable.strings | 1 + UI/MainUI/Polish.lproj/Locale | 35 ++ UI/MainUI/Polish.lproj/Localizable.strings | 73 +++ UI/MainUI/Russian.lproj/Localizable.strings | 1 + UI/MainUI/Spanish.lproj/Localizable.strings | 1 + UI/MainUI/Swedish.lproj/Localizable.strings | 1 + UI/MainUI/Welsh.lproj/Localizable.strings | 1 + .../Localizable.strings | 1 + .../Czech.lproj/Localizable.strings | 1 + .../Dutch.lproj/Localizable.strings | 1 + .../English.lproj/Localizable.strings | 1 + .../French.lproj/Localizable.strings | 1 + UI/PreferencesUI/GNUmakefile | 2 +- .../German.lproj/Localizable.strings | 1 + .../Hungarian.lproj/Localizable.strings | 1 + .../Italian.lproj/Localizable.strings | 1 + .../Polish.lproj/Localizable.strings | 223 +++++++ .../Russian.lproj/Localizable.strings | 1 + .../Spanish.lproj/Localizable.strings | 1 + .../Swedish.lproj/Localizable.strings | 1 + .../Welsh.lproj/Localizable.strings | 1 + UI/SOGoUI/SOGoACLAdvisory.h | 9 + UI/SOGoUI/SOGoACLAdvisory.m | 9 + UI/SOGoUI/SOGoFolderAdvisory.h | 6 + UI/SOGoUI/SOGoFolderAdvisory.m | 6 + UI/Scheduler/GNUmakefile | 2 +- UI/Scheduler/Polish.lproj/Localizable.strings | 561 ++++++++++++++++++ .../SOGoACLPolishAdditionAdvisory.wox | 28 + .../SOGoACLPolishModificationAdvisory.wox | 28 + UI/Templates/SOGoACLPolishRemovalAdvisory.wox | 26 + .../SOGoFolderPolishAdditionAdvisory.wox | 23 + .../SOGoFolderPolishRemovalAdvisory.wox | 23 + 92 files changed, 2005 insertions(+), 13 deletions(-) create mode 100644 SoObjects/Appointments/Polish.lproj/Localizable.strings create mode 100644 SoObjects/Contacts/Polish.lproj/Localizable.strings create mode 100644 SoObjects/Mailer/SOGoMailPolishForward.wo/SOGoMailPolishForward.html create mode 100644 SoObjects/Mailer/SOGoMailPolishForward.wo/SOGoMailPolishForward.wod create mode 100644 SoObjects/Mailer/SOGoMailPolishReply.wo/SOGoMailPolishReply.html create mode 100644 SoObjects/Mailer/SOGoMailPolishReply.wo/SOGoMailPolishReply.wod create mode 100644 UI/AdministrationUI/Polish.lproj/Localizable.strings create mode 100644 UI/Common/Polish.lproj/Localizable.strings create mode 100644 UI/Contacts/Polish.lproj/Localizable.strings create mode 100644 UI/MailPartViewers/Polish.lproj/Localizable.strings create mode 100644 UI/MailerUI/Polish.lproj/Localizable.strings create mode 100644 UI/MainUI/Polish.lproj/Locale create mode 100644 UI/MainUI/Polish.lproj/Localizable.strings create mode 100644 UI/PreferencesUI/Polish.lproj/Localizable.strings create mode 100644 UI/Scheduler/Polish.lproj/Localizable.strings create mode 100644 UI/Templates/SOGoACLPolishAdditionAdvisory.wox create mode 100644 UI/Templates/SOGoACLPolishModificationAdvisory.wox create mode 100644 UI/Templates/SOGoACLPolishRemovalAdvisory.wox create mode 100644 UI/Templates/SOGoFolderPolishAdditionAdvisory.wox create mode 100644 UI/Templates/SOGoFolderPolishRemovalAdvisory.wox diff --git a/ChangeLog b/ChangeLog index dda920ef7..f9379420d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,7 @@ * Applied patch for bug #690 * Applied patch for bug #703 + * Applied patch for bug #714 2010-07-28 Francis Lachapelle diff --git a/SoObjects/Appointments/GNUmakefile b/SoObjects/Appointments/GNUmakefile index 6e1ba960e..d31fe2de0 100644 --- a/SoObjects/Appointments/GNUmakefile +++ b/SoObjects/Appointments/GNUmakefile @@ -47,7 +47,7 @@ Appointments_RESOURCE_FILES += \ Version \ product.plist \ -Appointments_LANGUAGES = BrazilianPortuguese Czech Dutch English French German Hungarian Italian Russian Spanish Swedish Ukrainian Welsh +Appointments_LANGUAGES = BrazilianPortuguese Czech Dutch English French German Hungarian Italian Polish Russian Spanish Swedish Ukrainian Welsh Appointments_LOCALIZED_RESOURCE_FILES = Localizable.strings diff --git a/SoObjects/Appointments/Polish.lproj/Localizable.strings b/SoObjects/Appointments/Polish.lproj/Localizable.strings new file mode 100644 index 000000000..7bfdf7b6c --- /dev/null +++ b/SoObjects/Appointments/Polish.lproj/Localizable.strings @@ -0,0 +1,62 @@ +"Personal Calendar" = "Kalendarz osobisty"; +vevent_class0 = "(Wydarzenie publiczne)"; +vevent_class1 = "(Wydarzenie prywatne)"; +vevent_class2 = "(Wydarzenie poufne)"; + +vtodo_class0 = "(Zadanie publiczne)"; +vtodo_class1 = "(Zadanie prywatne)"; +vtodo_class2 = "(Zadanie poufne)"; + +/* Receipts */ +"Title:" = "Tytuł:"; +"Start:" = "Początek:"; +"End:" = "Koniec:"; + +"Receipt: users invited to a meeting" = "Potwierdzenie: użytkownicy zaproszeni na spotkanie"; +"You have invited the following attendees(s):" = "Następujący uczestnicy zostali zaproszeni przez Ciebie:"; +"... to attend the following event:" = "... aby wziąć udział w następującym wydarzeniu:"; + +"Receipt: invitation updated" = "Potwierdzenie: aktualizacja zaproszenia"; +"The following attendees(s):" = "Następujący uczestnicy:"; +"... have been notified of the changes to the following event:" = "... zostali poinformowani o zmianach następującego wydarzenia:"; + +"Receipt: attendees removed from an event" = "Potwierdzenie: urzestnicy usunięci z wydarzenia"; +"You have removed the following attendees(s):" = "Następujący użytkownicy zostali usunięci przez ciebie:"; +"... from the following event:" = "... z następującego wydarzenia:"; + +/* IMIP messages */ +"startDate_label" = "Początek:"; +"endDate_label" = "Koniec:"; +"due_label" = "Termin:"; +"location_label" = "Miejsce:"; +"summary_label" = "Podsumowanie:"; +"comment_label" = "Komentarz:"; + +/* Invitation */ +"Event Invitation: \"%{Summary}\"" = "Zaproszenie na wydarzenie: \"%{Summary}\""; +"(sent by %{SentBy}) " = "(wysłane przez %{SentBy}) "; +"%{Organizer} %{SentByText}has invited you to %{Summary}." = "%{Organizer} %{SentByText}zaprosił cię na %{Summary}."; + +/* Deletion */ +"Event Cancelled: \"%{Summary}\"" = "Wydarzenie anulowane: \"%{Summary}\""; +"%{Organizer} %{SentByText}has cancelled this event: %{Summary}." += "%{Organizer} %{SentByText}anulował(a) to wydarzenie: %{Summary}."; + +/* Update */ +"The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed" += "Wydarzenie \"%{Summary}\" z dnia %{OldStartDate} z godz. %{OldStartTime} zostało zmienione"; +"The following parameters have changed in the \"%{Summary}\" meeting:" += "Zmienione zostały poniższe parametry spotkania \"%{Summary}\":"; +"Please accept or decline those changes." += "Zaakceptuj lub odrzuć te zmiany."; + +/* Reply */ +"Reply to invitation: \"%{Summary}\"" = "Odpowiedź na zaproszenie: \"%{Summary}\""; +"%{Attendee} %{SentByText}has accepted your event invitation." += "%{Attendee} %{SentByText}zaakceptował(a) twoje zaproszenie na wydarzenie."; +"%{Attendee} %{SentByText}has declined your event invitation." += "%{Attendee} %{SentByText}odrzucił(a) twoje zaproszenie na wydarzenie."; +"%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}." += "%{Attendee} %{SentByText}oddelegował(a) %{Delegate} na twoje wydarzenie."; +"%{Attendee} %{SentByText}has not yet decided upon your event invitation." += "%{Attendee} %{SentByText}jeszcze nie zdecydował(a) o obecności na twoim wydarzeniu."; diff --git a/SoObjects/Contacts/GNUmakefile b/SoObjects/Contacts/GNUmakefile index cbbfa2e0a..17f14d343 100644 --- a/SoObjects/Contacts/GNUmakefile +++ b/SoObjects/Contacts/GNUmakefile @@ -25,7 +25,7 @@ Contacts_RESOURCE_FILES += \ Version \ product.plist \ -Contacts_LANGUAGES = BrazilianPortuguese Czech Dutch English French German Hungarian Italian Russian Spanish Swedish Ukrainian Welsh +Contacts_LANGUAGES = BrazilianPortuguese Czech Dutch English French German Hungarian Italian Polish Russian Spanish Swedish Ukrainian Welsh Contacts_LOCALIZED_RESOURCE_FILES = Localizable.strings diff --git a/SoObjects/Contacts/Polish.lproj/Localizable.strings b/SoObjects/Contacts/Polish.lproj/Localizable.strings new file mode 100644 index 000000000..1e5341c06 --- /dev/null +++ b/SoObjects/Contacts/Polish.lproj/Localizable.strings @@ -0,0 +1 @@ +"Personal Address Book" = "Osobista książka adresowa"; diff --git a/SoObjects/Mailer/GNUmakefile b/SoObjects/Mailer/GNUmakefile index 828d708bd..acfe45445 100644 --- a/SoObjects/Mailer/GNUmakefile +++ b/SoObjects/Mailer/GNUmakefile @@ -60,6 +60,8 @@ Mailer_RESOURCE_FILES += \ SOGoMailHungarianReply.wo \ SOGoMailItalianForward.wo \ SOGoMailItalianReply.wo \ + SOGoMailPolishForward.wo \ + SOGoMailPolishReply.wo \ SOGoMailRussianForward.wo \ SOGoMailRussianReply.wo \ SOGoMailSpanishForward.wo \ diff --git a/SoObjects/Mailer/SOGoMailForward.h b/SoObjects/Mailer/SOGoMailForward.h index bcfa41d22..e9aa3b3ad 100644 --- a/SoObjects/Mailer/SOGoMailForward.h +++ b/SoObjects/Mailer/SOGoMailForward.h @@ -66,6 +66,9 @@ @interface SOGoMailSpanishForward : SOGoMailForward @end +@interface SOGoMailPolishForward : SOGoMailForward +@end + @interface SOGoMailRussianForward : SOGoMailForward @end diff --git a/SoObjects/Mailer/SOGoMailForward.m b/SoObjects/Mailer/SOGoMailForward.m index d1f7261d7..cd152a289 100644 --- a/SoObjects/Mailer/SOGoMailForward.m +++ b/SoObjects/Mailer/SOGoMailForward.m @@ -259,6 +259,9 @@ @implementation SOGoMailSpanishForward @end +@implementation SOGoMailPolishForward +@end + @implementation SOGoMailRussianForward @end diff --git a/SoObjects/Mailer/SOGoMailPolishForward.wo/SOGoMailPolishForward.html b/SoObjects/Mailer/SOGoMailPolishForward.wo/SOGoMailPolishForward.html new file mode 100644 index 000000000..0b2851965 --- /dev/null +++ b/SoObjects/Mailer/SOGoMailPolishForward.wo/SOGoMailPolishForward.html @@ -0,0 +1,13 @@ +<#newLine/> +<#newLine/> +<#newLine/> +-------- Oryginalna wiadomość --------<#newLine/> +Temat: <#subject/><#newLine/> +Data: <#date/><#newLine/> +Od: <#from/><#newLine/> +<#hasReplyTo>Odpowiedź do: <#replyTo/><#hasOrganization>Organizacja: <#organization/>Do: <#to/><#newLine/> +<#hasCc>DW: <#cc/><#hasNewsGroups>Grupy dyskusyjne: <#newsgroups/><#hasReferences>Odniesienia: <#references/><#newLine/> +<#newLine/> +<#messageBody/><#newLine/> +<#newLine/> +<#signature/><#newLine/> diff --git a/SoObjects/Mailer/SOGoMailPolishForward.wo/SOGoMailPolishForward.wod b/SoObjects/Mailer/SOGoMailPolishForward.wo/SOGoMailPolishForward.wod new file mode 100644 index 000000000..7787fa18e --- /dev/null +++ b/SoObjects/Mailer/SOGoMailPolishForward.wo/SOGoMailPolishForward.wod @@ -0,0 +1,79 @@ +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; +} diff --git a/SoObjects/Mailer/SOGoMailPolishReply.wo/SOGoMailPolishReply.html b/SoObjects/Mailer/SOGoMailPolishReply.wo/SOGoMailPolishReply.html new file mode 100644 index 000000000..e2e085a4a --- /dev/null +++ b/SoObjects/Mailer/SOGoMailPolishReply.wo/SOGoMailPolishReply.html @@ -0,0 +1,16 @@ +<#replyPlacementOnTop><#newLine/> +<#newLine/> +<#signaturePlacementOnTop><#newLine/> +<#signature/><#newLine/> +<#outlookMode>-------- Oryginalna wiadomość --------<#newLine/> +Temat: <#subject/><#newLine/> +Data: <#date/><#newLine/> +Od: <#from/><#newLine/> +<#hasReplyTo>Odpowiedź do: <#replyTo/><#hasOrganization>Organizacja: <#organization/>Do: <#to/><#newLine/> +<#hasCc>DW: <#cc/><#hasNewsGroups>Grupy dyskusyjne: <#newsgroups/><#hasReferences>Odniesienia: <#references/><#newLine/> +<#standardMode>Dnia <#date/>, <#from/> napisał(a):<#newLine/> +<#newLine/> +<#messageBody/><#newLine/> +<#replyPlacementOnBottom><#newLine/> +<#newLine/> +<#signaturePlacementOnBottom><#signature/><#newLine/> diff --git a/SoObjects/Mailer/SOGoMailPolishReply.wo/SOGoMailPolishReply.wod b/SoObjects/Mailer/SOGoMailPolishReply.wo/SOGoMailPolishReply.wod new file mode 100644 index 000000000..3fbed6d61 --- /dev/null +++ b/SoObjects/Mailer/SOGoMailPolishReply.wo/SOGoMailPolishReply.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 31fb41779..1ac0bb4b5 100644 --- a/SoObjects/Mailer/SOGoMailReply.h +++ b/SoObjects/Mailer/SOGoMailReply.h @@ -71,6 +71,9 @@ @interface SOGoMailSpanishReply : SOGoMailReply @end +@interface SOGoMailPolishReply : SOGoMailReply +@end + @interface SOGoMailRussianReply : SOGoMailReply @end diff --git a/SoObjects/Mailer/SOGoMailReply.m b/SoObjects/Mailer/SOGoMailReply.m index e29485437..b5c622774 100644 --- a/SoObjects/Mailer/SOGoMailReply.m +++ b/SoObjects/Mailer/SOGoMailReply.m @@ -128,6 +128,9 @@ @implementation SOGoMailSpanishReply @end +@implementation SOGoMailPolishReply +@end + @implementation SOGoMailRussianReply @end diff --git a/SoObjects/SOGo/SOGoDefaults.plist b/SoObjects/SOGo/SOGoDefaults.plist index e16e80e45..fd654ebc3 100644 --- a/SoObjects/SOGo/SOGoDefaults.plist +++ b/SoObjects/SOGo/SOGoDefaults.plist @@ -15,7 +15,6 @@ SOGoCacheCleanupInterval = 300.0; SOGoMemcachedHost = "localhost"; - SOGoMemcachedPort = 11211; SOGoUIxDebugEnabled = NO; @@ -33,7 +32,7 @@ SOGoLanguage = "English"; SOGoSupportedLanguages = ( "Czech", "Welsh", "English", "Spanish", "French", "German", "Italian", "Hungarian", - "Dutch", "BrazilianPortuguese", "Russian", + "Dutch", "BrazilianPortuguese", "Polish", "Russian", "Ukrainian", "Swedish"); SOGoTimeZone = "UTC"; diff --git a/Tests/Integration/all.py b/Tests/Integration/all.py index a85826788..27679be04 100755 --- a/Tests/Integration/all.py +++ b/Tests/Integration/all.py @@ -15,7 +15,7 @@ if __name__ == "__main__": # Duplicated from UIxPreferences.m languages = ["Czech", "Dutch", "English", "French", "German", "Hungarian", "Italian", "BrazilianPortuguese", - "Russian", "Spanish", "Swedish", "Ukrainian", "Welsh"] + "Polish", "Russian", "Spanish", "Swedish", "Ukrainian", "Welsh"] # We can disable testing all languages testLanguages = False diff --git a/UI/AdministrationUI/GNUmakefile b/UI/AdministrationUI/GNUmakefile index f4a50487b..be712ee7e 100644 --- a/UI/AdministrationUI/GNUmakefile +++ b/UI/AdministrationUI/GNUmakefile @@ -6,7 +6,7 @@ BUNDLE_NAME = AdministrationUI AdministrationUI_PRINCIPAL_CLASS = AdministrationUIProduct -AdministrationUI_LANGUAGES = BrazilianPortuguese Czech Dutch English French German Hungarian Italian Russian Spanish Swedish Ukrainian Welsh +AdministrationUI_LANGUAGES = BrazilianPortuguese Czech Dutch English French German Hungarian Italian Polish Russian Spanish Swedish Ukrainian Welsh AdministrationUI_OBJC_FILES = \ AdministrationUIProduct.m \ diff --git a/UI/AdministrationUI/Polish.lproj/Localizable.strings b/UI/AdministrationUI/Polish.lproj/Localizable.strings new file mode 100644 index 000000000..7aeed3748 --- /dev/null +++ b/UI/AdministrationUI/Polish.lproj/Localizable.strings @@ -0,0 +1,15 @@ +/* this file is in UTF-8 format! */ + +"Help" = "Pomoc"; +"Close" = "Zamknij"; + +"Modules" = "Moduły"; + +/* Modules short names */ +"ACLs" = "ACLe"; + +/* Modules titles */ +"ACLs_title" = "Zarządzanie uprawnieniami ACL folderów użytkowników"; + +/* Modules descriptions */ +"ACLs_description" = "

Moduł zarządzania uprawnieniami ACL (ang. Access Control Lists) pozwala zmienić uprawnienia ACL na folderach poczty i książkach adresowych każdego użytkownika.

Aby zmodyfikować uprawnienie ACL foldera użytkownika, wpisz nazwę tego użytkownika w pole wyszukiwania w górnej części okna i kliknij podwójnie na wybranym folderze.

"; diff --git a/UI/Common/GNUmakefile b/UI/Common/GNUmakefile index 99c7b5b68..e0d55c256 100644 --- a/UI/Common/GNUmakefile +++ b/UI/Common/GNUmakefile @@ -6,7 +6,7 @@ BUNDLE_NAME = CommonUI CommonUI_PRINCIPAL_CLASS = CommonUIProduct -CommonUI_LANGUAGES = BrazilianPortuguese Czech Dutch English French German Hungarian Italian Russian Spanish Swedish Ukrainian Welsh +CommonUI_LANGUAGES = BrazilianPortuguese Czech Dutch English French German Hungarian Italian Polish Russian Spanish Swedish Ukrainian Welsh CommonUI_OBJC_FILES += \ CommonUIProduct.m \ diff --git a/UI/Common/Polish.lproj/Localizable.strings b/UI/Common/Polish.lproj/Localizable.strings new file mode 100644 index 000000000..f80278b6d --- /dev/null +++ b/UI/Common/Polish.lproj/Localizable.strings @@ -0,0 +1,72 @@ +/* this file is in UTF-8 format! */ + +/* toolbars */ +"Save" = "Zapisz"; +"Close" = "Zamknij"; +"Edit User Rights" = "Edytuj uprawnienia użytkownika"; + +"Home" = "Strona domowa"; +"Calendar" = "Kalendarz"; +"Address Book" = "Książka adresowa"; +"Mail" = "Poczta"; +"Preferences" = "Ustawienia"; +"Administration" = "Administracja"; +"Disconnect" = "Wyloguj"; +"Right Administration" = "Administracja uprawnień"; +"Log Console (dev.)" = "Konsola błędów (dev.)"; + +"User" = "Użytkownik"; + +"Help" = "Pomoc"; + +"noJavascriptError" = "Do pracy z SOGo wymagane jest włączenie obsługi Javascript. Upewnij się, że ta funkcja jest dostępna i włączona w ustawieniach twojej przeglądarki WWW."; +"noJavascriptRetry" = "Ponów"; + +"Owner:" = "Właściciel:"; +"Publish the Free/Busy information" = "Opublikuj informację wolny/zajęty"; + +"Add..." = "Dodaj..."; +"Remove" = "Usuń"; + +"Subscribe User" = "Subskrybuj użytkownika"; + +"Any Authenticated User" = "Każdy zalogowany użytkownik"; +"Public Access" = "Dostęp publiczny"; +"Any user not listed above" = "Każdy użytkownik spoza powyższej listy"; +"Anybody accessing this resource from the public area" = "Każdy korzystający z tego zasobu z obszaru publicznego"; + +"Sorry, the user rights can not be configured for that object." = "Uprawnienia użytkownika na tym obiekcie nie mogą być konfigurowane."; + +/* generic.js */ +"Unable to subscribe to that folder!" + = "Nie można subskrybować tego foldera!"; +"You cannot subscribe to a folder that you own!" + = "Nie możesz subskrybować foldera, który jest twoją własnością!"; +"Unable to unsubscribe from that folder!" + = "Nie można wyłączyć subskrypcji tego foldera!"; +"You cannot unsubscribe from a folder that you own!" + = "Nie możesz wyłączyć subskrypcji foldera, który jest twoją własnością!"; +"Unable to rename that folder!" = "Nie można zmienić nazwy tego foldera!"; +"You have already subscribed to that folder!" + = "Już subskrybujesz ten folder!"; +"The user rights cannot be edited for this object!" + = "Uprawnienia użytkownika na tym obiekcie nie mogą być edytowane!"; +"A folder by that name already exists." = "Folder o tej nazwie już istnieje."; +"You cannot create a list in a shared address book." + = "Nie możesz tworzyć list w udostępnionej książce adresowej."; + +"You are not allowed to access this module or this system. Please contact your system administrator." += "Nie masz pozwolenia na dostęp do tego modułu lub tego systemu. Skontaktuj się ze swoim administratorem."; +"You don't have the required privileges to perform the operation." += "Nie masz potrzebnych uprawnień do wykonania tej operacji."; + +"noEmailForDelegation" = "Musisz podać adres, na który chcesz delegować twoje zaproszenie."; +"delegate is organizer" = "Wskazany delegat jest organizatorem. Wskaż innego delegata."; +"delegate is a participant" = "Delegat jest już uczestnikiem."; +"delegate is a group" = "Wskazany adres jest grupą. Możesz oddelegować tylko pojedynczną osobę."; + +/* alarms */ +"Reminder:" = "Przypomnienie:"; +"Start:" = "Początek:"; +"Due Date:" = "Termin:"; +"Location:" = "Miejsce:"; diff --git a/UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings b/UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings index 6391d8dbb..65761b375 100644 --- a/UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings @@ -51,6 +51,7 @@ "Edit the selected card" = "Edita o contato selecionado"; "Send a mail message" = "Envia uma mensagem de email"; "Delete selected card or address book" = "Apaga o contato ou catálogo selecionado"; +"Reload all contacts" = "Reload all contacts"; "htmlMailFormat_UNKNOWN" = "Desconhecido"; "htmlMailFormat_FALSE" = "Texto Puro"; diff --git a/UI/Contacts/Czech.lproj/Localizable.strings b/UI/Contacts/Czech.lproj/Localizable.strings index e48aded25..5c9eccf01 100644 --- a/UI/Contacts/Czech.lproj/Localizable.strings +++ b/UI/Contacts/Czech.lproj/Localizable.strings @@ -51,6 +51,7 @@ "Edit the selected card" = "Upravit označený kontakt"; "Send a mail message" = "Poslat zprávu"; "Delete selected card or address book" = "Smazat označený kontakt nebo složku kontaktů"; +"Reload all contacts" = "Reload all contacts"; "htmlMailFormat_UNKNOWN" = "Neznámý"; "htmlMailFormat_FALSE" = "Plain Text"; diff --git a/UI/Contacts/Dutch.lproj/Localizable.strings b/UI/Contacts/Dutch.lproj/Localizable.strings index 91c107c8f..faa571191 100644 --- a/UI/Contacts/Dutch.lproj/Localizable.strings +++ b/UI/Contacts/Dutch.lproj/Localizable.strings @@ -51,6 +51,7 @@ "Edit the selected card" = "Edit the selected card"; "Send a mail message" = "Send a mail message"; "Delete selected card or address book" = "Delete selected card or address book"; +"Reload all contacts" = "Reload all contacts"; "htmlMailFormat_UNKNOWN" = "Onbekend"; "htmlMailFormat_FALSE" = "Platte tekst"; diff --git a/UI/Contacts/English.lproj/Localizable.strings b/UI/Contacts/English.lproj/Localizable.strings index a7eb56eff..278d3e445 100644 --- a/UI/Contacts/English.lproj/Localizable.strings +++ b/UI/Contacts/English.lproj/Localizable.strings @@ -51,6 +51,7 @@ "Edit the selected card" = "Edit the selected card"; "Send a mail message" = "Send a mail message"; "Delete selected card or address book" = "Delete selected card or address book"; +"Reload all contacts" = "Reload all contacts"; "htmlMailFormat_UNKNOWN" = "Unknown"; "htmlMailFormat_FALSE" = "Plain Text"; diff --git a/UI/Contacts/French.lproj/Localizable.strings b/UI/Contacts/French.lproj/Localizable.strings index 57127b264..9ef6fb1ee 100644 --- a/UI/Contacts/French.lproj/Localizable.strings +++ b/UI/Contacts/French.lproj/Localizable.strings @@ -51,6 +51,7 @@ "Edit the selected card" = "Modifier la fiche sélectionnée"; "Send a mail message" = "Rédiger un courrier à la sélection"; "Delete selected card or address book" = "Supprimer la fiche sélectionnée"; +"Reload all contacts" = "Reload all contacts"; "htmlMailFormat_UNKNOWN" = "Inconnu"; "htmlMailFormat_FALSE" = "Texte simple (sans HTML)"; diff --git a/UI/Contacts/GNUmakefile b/UI/Contacts/GNUmakefile index 4ed21619e..95fe34723 100644 --- a/UI/Contacts/GNUmakefile +++ b/UI/Contacts/GNUmakefile @@ -6,7 +6,7 @@ BUNDLE_NAME = ContactsUI ContactsUI_PRINCIPAL_CLASS = ContactsUIProduct -ContactsUI_LANGUAGES = BrazilianPortuguese Czech Dutch English French German Hungarian Italian Russian Spanish Swedish Ukrainian Welsh +ContactsUI_LANGUAGES = BrazilianPortuguese Czech Dutch English French German Hungarian Italian Polish Russian Spanish Swedish Ukrainian Welsh ContactsUI_OBJC_FILES = \ UIxContactsUserFolders.m \ diff --git a/UI/Contacts/German.lproj/Localizable.strings b/UI/Contacts/German.lproj/Localizable.strings index 206cf5a66..eada261f1 100644 --- a/UI/Contacts/German.lproj/Localizable.strings +++ b/UI/Contacts/German.lproj/Localizable.strings @@ -50,6 +50,7 @@ "Edit the selected card" = "Gewählte Karte bearbeiten"; "Send a mail message" = "Neue Nachricht verfassen"; "Delete selected card or address book" = "Gewählte Karte oder Adressbuch löschen"; +"Reload all contacts" = "Reload all contacts"; "htmlMailFormat_UNKNOWN" = "Unbekannt"; "htmlMailFormat_FALSE" = "Reintext"; diff --git a/UI/Contacts/Hungarian.lproj/Localizable.strings b/UI/Contacts/Hungarian.lproj/Localizable.strings index c5a87aaca..59c5452c1 100644 --- a/UI/Contacts/Hungarian.lproj/Localizable.strings +++ b/UI/Contacts/Hungarian.lproj/Localizable.strings @@ -51,6 +51,7 @@ "Edit the selected card" = "A kijelölt névjegy szerkesztése"; "Send a mail message" = "Email üzenet küldése"; "Delete selected card or address book" = "Kijelölt névjegy vagy címjegyzék törlése"; +"Reload all contacts" = "Reload all contacts"; "htmlMailFormat_UNKNOWN" = "Ismeretlen"; "htmlMailFormat_FALSE" = "Egyszerű szöveg"; diff --git a/UI/Contacts/Italian.lproj/Localizable.strings b/UI/Contacts/Italian.lproj/Localizable.strings index 16e3d74bd..b5215b018 100644 --- a/UI/Contacts/Italian.lproj/Localizable.strings +++ b/UI/Contacts/Italian.lproj/Localizable.strings @@ -51,6 +51,7 @@ "Edit the selected card" = "Modifica il contatto selezionato"; "Send a mail message" = "Invia un'email"; "Delete selected card or address book" = "Cancella il contatto selezionato"; +"Reload all contacts" = "Reload all contacts"; "htmlMailFormat_UNKNOWN" = "Sconosciuto"; "htmlMailFormat_FALSE" = "Testo normale"; diff --git a/UI/Contacts/Polish.lproj/Localizable.strings b/UI/Contacts/Polish.lproj/Localizable.strings new file mode 100644 index 000000000..4e322adb5 --- /dev/null +++ b/UI/Contacts/Polish.lproj/Localizable.strings @@ -0,0 +1,197 @@ +/* this file is in UTF-8 format! */ + +"Contact" = "Kontakt"; +"Address" = "Adres"; +"Photos" = "Zdjęcia"; +"Other" = "Inne"; + +"Address Books" = "Książki adresowe"; +"Addressbook" = "Książka adresowa"; +"Addresses" = "Adresy"; +"Update" = "Aktualizacja"; +"Cancel" = "Anuluj"; +"Common" = "Wspólne"; +"Contact editor" = "Edytor kontaktów"; +"Contact viewer" = "Przeglądarka kontaktów"; +"Email" = "E-mail"; +"Screen Name" = "Nazwa ekranowa"; +"Extended" = "Rozszerzone"; +"Fax" = "Fax"; +"Firstname" = "Imię"; +"Home" = "Dom"; +"HomePhone" = "Telefon domowy"; +"Lastname" = "Nazwisko"; +"Location" = "Miejscowość"; +"MobilePhone" = "Telefon komórkowy"; +"Name" = "Nazwa"; +"OfficePhone" = "Telefon do biura"; +"Organization" = "Organizacja"; +"Work Phone" = "Telefon do pracy"; +"Phone" = "Telefon"; +"Phones" = "Telefony"; +"Postal" = "Adres korespondencyjny"; +"Save" = "Zapisz"; +"Internet" = "Internet"; +"Unit" = "Jednostka"; +"delete" = "usuń"; +"edit" = "edytuj"; +"invalidemailwarn" = "Podany adres e-mail jest nieprawidłowy"; +"invaliddatewarn" = "Podana data jest nieprawidłowa."; +"new" = "nowy"; +"Preferred Phone" = "Preferowany telefon"; + +"Move To" = "Przenieś do"; +"Copy To" = "Kopiuj do"; +"Add to:" = "Dodaj do:"; + +/* Tooltips */ + +"Create a new address book card" = "Utwórz nowy kontakt w książce adresowej"; +"Create a new list" = "Utwórz nową listę"; +"Edit the selected card" = "Edytuj zaznaczoną kartę"; +"Send a mail message" = "Wyślij wiadomość e-mail"; +"Delete selected card or address book" = "Usuń zaznaczony kontakt lub książkę adresową"; +"Reload all contacts" = "Przeładuj wszystkie kontakty"; + +"htmlMailFormat_UNKNOWN" = "Nieznany"; +"htmlMailFormat_FALSE" = "czysty tekst"; +"htmlMailFormat_TRUE" = "HTML"; + +"Name or Email" = "Nazwa lub e-mail"; +"Personal Addressbook" = "Osobista książka adresowa"; +"Search in Addressbook" = "Szukaj w książce adresowej"; + +"New Card" = "Nowy kontakt"; +"New List" = "Nowa lista"; +"Properties" = "Właściwości"; +"Sharing..." = "Udostępnianie..."; +"Write" = "Napisz"; +"Delete" = "Usuń"; +"Instant Message" = "Szybka wiadomość"; +"Add..." = "Dodaj..."; +"Remove" = "Usuń"; + +"Please wait..." = "Zaczekaj chwilę..."; +"No possible subscription" = "Brak możliwej subskrypcji"; + +"Preferred" = "Preferowane"; +"Card for %@" = "Kontakt %@"; +"Display:" = "Wyświetl:"; +"Display Name:" = "Nazwa wyświetlana:"; +"Email:" = "E-mail:"; +"Additional Email:" = "Dodatkowy E-mail:"; + +"Phone Number:" = "Numer telefonu:"; +"Prefers to receive messages formatted as:" = "Preferuje wiadomości w formacie:"; +"Screen Name:" = "Nazwa ekranowa:"; + +"First:" = "Imię:"; +"Last:" = "Nazwisko:"; +"Nickname:" = "Pseudonim:"; + +"Telephone" = "Telefon"; +"Work:" = "Praca:"; +"Home:" = "Dom:"; +"Fax:" = "Fax:"; +"Mobile:" = "Telefon kom.:"; +"Pager:" = "Pager:"; + +"Title:" = "Tytuł:"; +"Service:" = "Usługa:"; +"Company:" = "Firma:"; +"Department:" = "Oddział:"; +"Organization:" = "Organizacja:"; +"Address:" = "Adres:"; +"City:" = "Miejscowość:"; +"State_Province:" = "Województwo:"; +"ZIP_Postal Code:" = "Kod pocztowy:"; +"Country:" = "Kraj:"; +"Web Page:" = "Strona WWW:"; + +"Work" = "Praca"; +"Other Infos" = "Inne informacje"; + +"Note:" = "Uwagi:"; +"Timezone:" = "Strefa czasowa:"; +"Birthday:" = "Urodziny:"; +"Birthday (yyyy-mm-dd):" = "Urodziny (yyyy-mm-dd):"; +"Freebusy URL:" = "URL statusu wolny-zajęty:"; + +"Add as..." = "Dodaj jako..."; +"Recipient" = "Odbiorca"; +"Carbon Copy" = "Do wiadomości"; +"Blind Carbon Copy" = "Ukryte do wiadomości"; + +"New Addressbook..." = "Nowa książka adresowa..."; +"Subscribe to an Addressbook..." = "Subskrybuj książkę adresową..."; +"Remove the selected Addressbook" = "Usuń zaznaczoną książkę adresową"; + +"Name of the Address Book" = "Nazwa książki adresowej"; +"Are you sure you want to delete the selected address book?" += "Czy na pewno chcesz skasować zaznaczoną książkę adresową?"; +"You cannot remove nor unsubscribe from a public addressbook." += "Nie możesz usunąć ani zrezygnować z subskrypcji publicznej książki adresowej."; +"You cannot remove nor unsubscribe from your personal addressbook." += "Nie możesz usunąć ani zrezygnować z subskrypbji osobistej książki adresowej."; + +"Are you sure you want to delete the selected contacts?" += "Czy na pewno chcesz skasować zaznaczone kontakty?"; + +"You cannot delete the card of \"%{0}\"." += "Nie możesz skasować kontaktu do \"%{0}\"."; + +"Address Book Name" = "Nazwa książki adresowej"; + +"You cannot subscribe to a folder that you own!" += "Nie możesz zrezygnować z subskrypcji foldera, którego jesteś właścicielem."; +"Unable to subscribe to that folder!" += "Nie można włączyć subskrypcji tego foldera."; + +"User rights for:" = "Uprawnienia użytkownika:"; + +"Any Authenticated User" = "Każdy zalogowany użytkownik"; +"Public Access" = "Dostęp publiczny"; + +"This person can add cards to this addressbook." += "Ta osoba może dodawać kontakty do tej książki adresowej."; +"This person can edit the cards of this addressbook." += "Ta osoba może edytować kontakty w tej książce adresowej."; +"This person can list the content of this addressbook." += "Ta osoba może przeglądać zawartość tej książki adresowej."; +"This person can read the cards of this addressbook." += "Ta osoba może odczytywać kontakty z tej książki adresowej."; +"This person can erase cards from this addressbook." += "Ta osoba może usuwać kontakty z tej książki adresowej."; + +"The selected contact has no email address." += "Wskazany kontakt nie ma adresu e-mail."; + +"Please select a contact." = "Zaznacz kontakt."; + +/* Error messages for move and copy */ + +"SoAccessDeniedException" = "Nie masz prawa zapisu do tej książki adresowej."; +"Forbidden" = "Nie masz prawa zapisu do tej książki adresowej."; +"Invalid Contact" = "Wskazany kontakt już nie istnieje."; +"Unknown Destination Folder" = "Wybrana docelowa książka adresowa już nie istnieje."; + +/* Lists */ +"List details" = "Szczegóły listy"; +"List name:" = "Nazwa listy:"; +"List nickname:" = "Nick listy:"; +"List description:" = "Opis listy:"; +"Members" = "Członkowie"; +"Contacts" = "Kontakty"; +"Add" = "Dodaj"; +"Lists can't be moved or copied." = "Listy nie mogą być przeniesione ani skopiowane."; +"Export" = "Eksport"; +"Export Address Book..." = "Eksportuj książkę adresową..."; +"Import Cards" = "Importuj kontakty"; +"Select a vCard or LDIF file." = "Wskaż plik vCard lub LDIF."; +"Upload" = "Wyślij"; +"Done" = "Zrobione"; +"An error occured while importing contacts." = "W trakcie importu kontaktów pojawił się błąd."; +"No card was imported." = "Nie zaimportowano żadnego kontaktu."; +"A total of %{0} cards were imported in the addressbook." = "Liczba wszystkich kontaktów zaimportowanych do książki adresowej: %{0}."; + +"Reload" = "Przeładuj"; diff --git a/UI/Contacts/Russian.lproj/Localizable.strings b/UI/Contacts/Russian.lproj/Localizable.strings index 41e431a1c..1b7660ce8 100644 --- a/UI/Contacts/Russian.lproj/Localizable.strings +++ b/UI/Contacts/Russian.lproj/Localizable.strings @@ -45,6 +45,7 @@ "Edit the selected card" = "Edit the selected card"; "Send a mail message" = "Send a mail message"; "Delete selected card or address book" = "Delete selected card or address book"; +"Reload all contacts" = "Reload all contacts"; "htmlMailFormat_UNKNOWN" = "Unknown"; "htmlMailFormat_FALSE" = "Plain Text"; diff --git a/UI/Contacts/Spanish.lproj/Localizable.strings b/UI/Contacts/Spanish.lproj/Localizable.strings index ec4787009..fb2a215c2 100644 --- a/UI/Contacts/Spanish.lproj/Localizable.strings +++ b/UI/Contacts/Spanish.lproj/Localizable.strings @@ -51,6 +51,7 @@ "Edit the selected card" = "Modificar el contacto seleccionado"; "Send a mail message" = "Enviar un correo"; "Delete selected card or address book" = "Borrar contacto o libreta de direcciones seleccionados"; +"Reload all contacts" = "Reload all contacts"; "htmlMailFormat_UNKNOWN" = "Desconocido"; "htmlMailFormat_FALSE" = "Texto plano"; diff --git a/UI/Contacts/Swedish.lproj/Localizable.strings b/UI/Contacts/Swedish.lproj/Localizable.strings index 355a7fc5d..8760af7ef 100644 --- a/UI/Contacts/Swedish.lproj/Localizable.strings +++ b/UI/Contacts/Swedish.lproj/Localizable.strings @@ -51,6 +51,7 @@ "Edit the selected card" = "Redigera markerat adresskort"; "Send a mail message" = "Skicka ett meddelande"; "Delete selected card or address book" = "Ta bort markerat adresskort eller adressbok"; +"Reload all contacts" = "Reload all contacts"; "htmlMailFormat_UNKNOWN" = "Okänt"; "htmlMailFormat_FALSE" = "Oformaterad Text"; diff --git a/UI/Contacts/Ukrainian.lproj/Localizable.strings b/UI/Contacts/Ukrainian.lproj/Localizable.strings index e6a20b400..65cca6252 100644 --- a/UI/Contacts/Ukrainian.lproj/Localizable.strings +++ b/UI/Contacts/Ukrainian.lproj/Localizable.strings @@ -50,6 +50,7 @@ "Edit the selected card" = "Зміна вибраної картки"; "Send a mail message" = "Створення повідомлення"; "Delete selected card or address book" = "Вилучення вибраної картки або адресної книги"; +"Reload all contacts" = "Reload all contacts"; "htmlMailFormat_UNKNOWN" = "Невідомо"; "htmlMailFormat_FALSE" = "Звичайний текст"; diff --git a/UI/Contacts/Welsh.lproj/Localizable.strings b/UI/Contacts/Welsh.lproj/Localizable.strings index c22616c2c..7e4d2a062 100644 --- a/UI/Contacts/Welsh.lproj/Localizable.strings +++ b/UI/Contacts/Welsh.lproj/Localizable.strings @@ -45,6 +45,7 @@ "Edit the selected card" = "Golygu'r cerdyn dewisol"; "Send a mail message" = "Anfon neges ebost"; "Delete selected card or address book" = "Dileu y cerdyn dewisol neu'r llyfr cyfeiriadau"; +"Reload all contacts" = "Reload all contacts"; "htmlMailFormat_UNKNOWN" = "Anhysbys"; "htmlMailFormat_FALSE" = "Testun plaen"; diff --git a/UI/MailPartViewers/GNUmakefile b/UI/MailPartViewers/GNUmakefile index b90a7ede9..09f44363c 100644 --- a/UI/MailPartViewers/GNUmakefile +++ b/UI/MailPartViewers/GNUmakefile @@ -6,7 +6,7 @@ BUNDLE_NAME = MailPartViewers MailPartViewers_PRINCIPAL_CLASS = MailPartViewersProduct -MailPartViewers_LANGUAGES = BrazilianPortuguese Czech Dutch English French German Hungarian Italian Russian Spanish Swedish Ukrainian Welsh +MailPartViewers_LANGUAGES = BrazilianPortuguese Czech Dutch English French German Hungarian Italian Polish Russian Spanish Swedish Ukrainian Welsh MailPartViewers_OBJC_FILES += \ MailPartViewersProduct.m \ diff --git a/UI/MailPartViewers/Polish.lproj/Localizable.strings b/UI/MailPartViewers/Polish.lproj/Localizable.strings new file mode 100644 index 000000000..93ee633ce --- /dev/null +++ b/UI/MailPartViewers/Polish.lproj/Localizable.strings @@ -0,0 +1,45 @@ +ACCEPTED = "zaakceptowane"; +COMPLETED = "zakończone"; +DECLINED = "odrzucone"; +DELEGATED = "przekazane"; +IN-PROCESS = "przetwarzane"; +NEEDS-ACTION = "wymaga akcji"; +TENTATIVE = "niepewny"; +organized_by_you = "organizowane przez ciebie"; +you_are_an_attendee = "jesteś uczestnikiem"; +add_info_text = "żądania iMIP 'ADD' nie są jeszcze obsługiwane przez SOGo."; +publish_info_text = "Nadawca informuje cię o załączonym wydarzeniu."; +cancel_info_text = "Twoje zaproszenie lub całe wydarzenie zostało anulowane."; +request_info_no_attendee = "proponuje uczestnikom spotkanie. Otrzymujesz tę wiadomość jako powiadomienie, nie jesteś planowany jako uczestnik."; +Appointment = "Spotkanie"; + +Organizer = "Organizator"; +Time = "Czas"; +Attendees = "Uczestnicy"; +request_info = "zaprasza cię na spotkanie."; +"Add to calendar" = "Dodaj do kalendarza"; +"Delete from calendar" = "Usuń z kalendarza"; +"Update status" = "Zaktualizuj status"; +Accept = "Akceptuj"; +Decline = "Odmów"; +Tentative = "Niepewny"; +"Delegate ..." = "Przekaż ..."; +"Delegated to" = "Przekazane do"; +"Update status in calendar" = "Zaktualizuj status w kalendarzu"; + +reply_info_no_attendee = "Otrzymałeś odpowiedź do wydarzenia ale nadawca nie jest uczestnikiem."; +reply_info = "To jest odpowiedź do utworzonego przez ciebie wydarzenia"; + +"to" = "do"; + +"Untitled" = "Bez tytułu"; + +"Size" = "Rozmiar"; + +"Digital signature is not valid" = "Podpis elektroniczny nie jest poprawny"; +"Message is signed" = "Wiadomość jest podpisana"; +"Subject" = "Temat"; +"From" = "Od"; +"Date" = "Data"; +"To" = "Do"; +"Issuer" = "Wystawca"; diff --git a/UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings b/UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings index 32bd6e2d7..ac9de99c3 100644 --- a/UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings @@ -136,6 +136,7 @@ "View" = "Visão"; "All" = "Tudo"; "Unread" = "Não Lido"; +"No message" = "No message"; "messages" = "mensagens"; "first" = "Primeiro"; diff --git a/UI/MailerUI/Czech.lproj/Localizable.strings b/UI/MailerUI/Czech.lproj/Localizable.strings index ae90276f1..6732c4285 100644 --- a/UI/MailerUI/Czech.lproj/Localizable.strings +++ b/UI/MailerUI/Czech.lproj/Localizable.strings @@ -136,6 +136,7 @@ "View" = "Zobrazit"; "All" = "Všechny"; "Unread" = "Nepřečtené"; +"No message" = "No message"; "messages" = "zprávy"; "first" = "Nejnovější"; diff --git a/UI/MailerUI/Dutch.lproj/Localizable.strings b/UI/MailerUI/Dutch.lproj/Localizable.strings index f29698795..25f1817a0 100644 --- a/UI/MailerUI/Dutch.lproj/Localizable.strings +++ b/UI/MailerUI/Dutch.lproj/Localizable.strings @@ -136,6 +136,7 @@ "View" = "View"; "All" = "Alle"; "Unread" = "Ongelezen"; +"No message" = "No message"; "messages" = "berichten"; "first" = "eerste"; diff --git a/UI/MailerUI/English.lproj/Localizable.strings b/UI/MailerUI/English.lproj/Localizable.strings index 257b29193..2f41dcc15 100644 --- a/UI/MailerUI/English.lproj/Localizable.strings +++ b/UI/MailerUI/English.lproj/Localizable.strings @@ -136,6 +136,7 @@ "View" = "View"; "All" = "All"; "Unread" = "Unread"; +"No message" = "No message"; "messages" = "messages"; "first" = "First"; diff --git a/UI/MailerUI/French.lproj/Localizable.strings b/UI/MailerUI/French.lproj/Localizable.strings index e93d3b52e..fa5d3d137 100644 --- a/UI/MailerUI/French.lproj/Localizable.strings +++ b/UI/MailerUI/French.lproj/Localizable.strings @@ -136,6 +136,7 @@ "View" = "View"; "All" = "Tous"; "Unread" = "Non lus"; +"No message" = "No message"; "messages" = "message(s)"; "first" = "Premier"; diff --git a/UI/MailerUI/GNUmakefile b/UI/MailerUI/GNUmakefile index b9bd1588a..6d0dbbd3d 100644 --- a/UI/MailerUI/GNUmakefile +++ b/UI/MailerUI/GNUmakefile @@ -6,7 +6,7 @@ BUNDLE_NAME = MailerUI MailerUI_PRINCIPAL_CLASS = MailerUIProduct -MailerUI_LANGUAGES = BrazilianPortuguese Czech Dutch English French German Hungarian Italian Russian Spanish Swedish Ukrainian Welsh +MailerUI_LANGUAGES = BrazilianPortuguese Czech Dutch English French German Hungarian Italian Polish Russian Spanish Swedish Ukrainian Welsh MailerUI_OBJC_FILES += \ MailerUIProduct.m \ diff --git a/UI/MailerUI/German.lproj/Localizable.strings b/UI/MailerUI/German.lproj/Localizable.strings index 3ea2339d9..f31d3bab9 100644 --- a/UI/MailerUI/German.lproj/Localizable.strings +++ b/UI/MailerUI/German.lproj/Localizable.strings @@ -136,6 +136,7 @@ "View" = "Ansicht"; "All" = "Alle"; "Unread" = "Ungelesene"; +"No message" = "No message"; "messages" = "Nachricht(en)"; "first" = "Erste"; diff --git a/UI/MailerUI/Hungarian.lproj/Localizable.strings b/UI/MailerUI/Hungarian.lproj/Localizable.strings index c9d0fcd79..2fabea2b6 100644 --- a/UI/MailerUI/Hungarian.lproj/Localizable.strings +++ b/UI/MailerUI/Hungarian.lproj/Localizable.strings @@ -136,6 +136,7 @@ "View" = "Nézet"; "All" = "Összes"; "Unread" = "Olvasatlan"; +"No message" = "No message"; "messages" = "üzenetek"; "first" = "Első"; diff --git a/UI/MailerUI/Italian.lproj/Localizable.strings b/UI/MailerUI/Italian.lproj/Localizable.strings index 72bda1a92..8eb0e648c 100644 --- a/UI/MailerUI/Italian.lproj/Localizable.strings +++ b/UI/MailerUI/Italian.lproj/Localizable.strings @@ -136,6 +136,7 @@ "View" = "Vista"; "All" = "Tutti"; "Unread" = "Non letti"; +"No message" = "No message"; "messages" = "messaggi"; "first" = "Primo"; diff --git a/UI/MailerUI/Polish.lproj/Localizable.strings b/UI/MailerUI/Polish.lproj/Localizable.strings new file mode 100644 index 000000000..8dd760398 --- /dev/null +++ b/UI/MailerUI/Polish.lproj/Localizable.strings @@ -0,0 +1,272 @@ +/* this file is in UTF-8 format! */ + +/* Icon's label */ +"Create" = "Utwórz"; +"Empty Trash" = "Opróżnij kosz"; +"Delete" = "Usuń"; +"Expunge" = "Wyczyść ostatecznie"; +"Forward" = "Przekaż"; +"Get Mail" = "Pobierz pocztę"; +"Junk" = "Śmieć"; +"Reply" = "Odpowiedz"; +"Reply All" = "Odpowiedz wszystkim"; +"Print" = "Drukuj"; +"Stop" = "Zatrzymaj"; +"Write" = "Napisz"; + +"Send" = "Wyślij"; +"Contacts" = "Kontakty"; +"Attach" = "Załącz"; +"Save" = "Zapisz"; +"Priority" = "Priorytet"; +"Size" = "Rozmiar"; + +/* Tooltips */ + +"Send this message now" = "Wyślij teraz tę wiadomość"; +"Select a recipient from an Address Book" = "Wybierz odbiorcę z książki adresowej"; +"Include an attachment" = "Dodaj załącznik"; +"Save this message" = "Zapisz tę wiadomość"; +"Get new messages" = "Pobierz nową wiadomość"; +"Create a new message" = "Utwórz nową wiadomość"; +"Go to address book" = "Idź do książki adresowej"; +"Reply to the message" = "Odpowiedz na wiadomość"; +"Reply to sender and all recipients" = "Odpowiedz nadawcy i wszystkim odbiorcom"; +"Forward selected message" = "Przekaż zaznaczoną wiadomość"; +"Delete selected message or folder" = "Usuń zaznaczoną wiadomość lub folder"; +"Mark the selected messages as junk" = "Oznacz zaznaczone wiadomości jako śmieci"; +"Print this message" = "Wydrukuj tę wiadomość"; +"Stop the current transfer" = "Zatrzymaj bieżący transfer"; +"Attachment" = "Załącznik"; +"Unread" = "Nieprzeczytane"; +"Flagged" = "Oflagowane"; + +/* Main Frame */ + +"Home" = "Strona główna"; +"Calendar" = "Kalendarz"; +"Addressbook" = "Książka adresowa"; +"Mail" = "Poczta"; +"Right Administration" = "Uprawnienia"; + +"Help" = "Pomoc"; + +/* Mail account main windows */ + +"Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Witaj w programie SOGo Mailer. Używaj drzewa folderów po lewej stronie by przeglądać swoje konta pocztowe!"; + +"Read messages" = "Wiadomości przeczytane"; +"Write a new message" = "Napisz nową wiadomość"; + +"Share: " = "Udostępnianie: "; +"Account: " = "Konto: "; +"Shared Account: " = "Udostępnione konto: "; + +/* acls */ +"Default Roles" = "Domyślne role"; +"User rights for:" = "Uprawnienia użytkownika dla:"; + +"List and see this folder" = "Wylistuj i zobacz ten folder"; +"Read mails from this folder" = "Czytaj wiadomości z tego foldera"; +"Mark mails read and unread" = "Zaznacz wiadomości jako przeczytane lub nie przeczytane"; +"Modify the flags of the mails in this folder" = "Zmień oflagowanie wiadomości w tym folderze"; +"Insert, copy and move mails into this folder" = "Wstaw, kopiuj lub przenieś wiadomości do tego foldera"; +"Post mails" = "Wyślij wiadomości"; +"Add subfolders to this folder" = "Utwórz podfoldery w tym folderze"; +"Remove this folder" = "Usuń ten folder"; +"Erase mails from this folder" = "Usuń wiadomości z tego foldera"; +"Expunge this folder" = "Wyczyść ostatecznie ten folder"; +"Archive This Folder" = "Zarchiwizuj ten folder"; +"Modify the acl of this folder" = "Modyfikuj uprawnienia ACL tego foldera"; + +"Saved Messages.zip" = "Zapisano Messages.zip"; + +"Update" = "Zaktualizuj"; +"Cancel" = "Anuluj"; + +/* Mail edition */ + +"From" = "Od"; +"Subject" = "Temat"; +"To" = "Do"; +"Cc" = "DW"; +"Bcc" = "UDW"; +"Reply-To" = "Odpowiedź do"; +"Add address" = "Dodaj adres"; + +"Attachments:" = "Załączniki:"; +"Open" = "Otwórz"; +"Select All" = "Zaznacz wszystkie"; +"Attach Web Page..." = "Załącz stronę Web..."; +"Attach File(s)..." = "Załącz plik(i)..."; + +"to" = "Do"; +"cc" = "DW"; +"bcc" = "UDW"; + +"Addressbook" = "Książka adresowa"; + +"Edit Draft..." = "Edytuj szkic..."; +"Load Images" = "Załaduj obrazki"; + +"highest" = "Najwyższy"; +"high" = "Wysoki"; +"normal" = "Normalny"; +"low" = "Niski"; +"lowest" = "Najniższy"; + +"This mail is being sent from an unsecure network!" = "Ta wiadomość jest wysyłana z niezabezpieczonej sieci!"; + +/* Popup "show" */ + +"all" = "wszystkie"; +"read" = "przeczytane"; +"unread" = "nie przeczytane"; +"deleted" = "usunięte"; +"flagged" = "oflagowane"; + +/* MailListView */ + +"Sender" = "Nadawca"; +"Subject or Sender" = "Temat lub nadawca"; +"To or Cc" = "Do lub DW"; +"Entire Message" = "Cała wiadomość"; + +"Date" = "Data"; +"View" = "Widok"; +"All" = "Wszystkie"; +"Unread" = "Nie przeczytane"; +"No message" = "Brak wiadomości"; +"messages" = "wiadomości"; + +"first" = "Pierwsza"; +"previous" = "Poprzednia"; +"next" = "Następna"; +"last" = "Ostatnia"; + +"msgnumber_to" = "do"; +"msgnumber_of" = "z"; + +"Mark Unread" = "Oznacz jako nie przeczytane"; +"Mark Read" = "Oznacz jako przeczytane"; + +"Untitled" = "Bez tytułu"; + +/* Tree */ + +"SentFolderName" = "Wysłane"; +"TrashFolderName" = "Kosz"; +"InboxFolderName" = "Odebrane"; +"DraftsFolderName" = "Szkice"; +"SieveFolderName" = "Filtry"; +"Folders" = "Foldery"; /* title line */ + +/* MailMoveToPopUp */ + +"MoveTo" = "Przenieś …"; + +/* Address Popup menu */ +"Add to Address Book..." = "Dodaj do książki adresowej..."; +"Compose Mail To" = "Utwórz wiadomość do"; +"Create Filter From Message..." = "Utwórz filtr z wiadomości..."; + +/* Image Popup menu */ +"Save Image" = "Zapisz obrazek"; +"Save Attachment" = "Zapisz załącznik"; + +/* Mailbox popup menus */ +"Open in New Mail Window" = "Otwórz w nowym oknie"; +"Copy Folder Location" = "Kopiuj położenie foldera"; +"Subscribe..." = "Subskrybuj..."; +"Mark Folder Read..." = "Oznacz folder jako przeczytany..."; +"New Folder..." = "Nowy folder..."; +"Compact This Folder" = "Kompaktuj ten folder"; +"Search Messages..." = "Szukaj wiadomości..."; +"Sharing..." = "Udostępnianie..."; +"New Subfolder..." = "Nowy podfolder..."; +"Rename Folder..." = "Zmień nazwę foldera..."; +"Delete Folder" = "Usuń folder"; +"Use This Folder For" = "Użyj tego foldera do"; +"Get Messages for Account" = "Pobierz wiadomości z konta"; + +/* Use This Folder menu */ +"Sent Messages" = "Wysłane"; +"Drafts" = "Szkice"; +"Deleted Messages" = "Usunięte"; + +/* Message list popup menu */ +"Open Message In New Window" = "Otwórz wiadomość w nowym oknie"; +"Reply to Sender Only" = "Odpowiedz tylko nadawcy"; +"Reply to All" = "Odpowiedz wszystkim"; +"Forward" = "Przekaż"; +"Edit As New..." = "Edytuj jako nową..."; +"Move To" = "Przenieś do"; +"Copy To" = "Kopiuj do"; +"Label" = "Etykieta"; +"Mark" = "Oznacz"; +"Save As..." = "Zapisz jako..."; +"Print Preview" = "Podgląd wydruku"; +"View Message Source" = "Pokaż źródło wiadomości"; +"Print..." = "Drukuj..."; +"Delete Message" = "Usuń wiadomość"; +"Delete Selected Messages" = "Usuń zaznaczone wiadomości"; + +"This Folder" = "Ten folder"; + +/* Label popup menu */ +"None" = "Brak"; +"Important" = "Ważne"; +"Work" = "Praca"; +"Personal" = "Osobiste"; +"To Do" = "Do zrobienia"; +"Later" = "Później"; + +/* Mark popup menu */ +"As Read" = "Jako przeczytane"; +"Thread As Read" = "Wątek jako przeczytany"; +"As Read By Date..." = "jako przeczytane do daty..."; +"All Read" = "wszystkie przeczytane"; +"Flag" = "Flaga"; +"As Junk" = "Jako śmieć"; +"As Not Junk" = "Jako nie-śmieć"; +"Run Junk Mail Controls" = "Uruchom kontrole wiadomości śmieci"; + +/* Folder operations */ +"Name :" = "Nazwa :"; +"Enter the new name of your folder :" + = "Wprowadź nową nazwę twojego foldera :"; +"Do you really want to move this folder into the trash ?" + = "Czy na pewno chcesz przenieść ten folder do kosza ?"; +"Operation failed" = "Operacja nie powiodła się"; + +"Quota" = "Limit:"; +"quotasFormat" = "użyte %{0}% z %{1} MB"; + +"Please select a message." = "Zaznacz wiadomość."; +"Please select a message to print." = "Zaznacz wiadomość do drukowania."; +"Please select only one message to print." = "Zaznacz tylko jedną wiadomość do drukowania."; +"The message you have selected doesn't exist anymore." = "Zaznaczona wiadomość już nie istnieje."; + + +"The folder with name \"%{0}\" could not be created." += "Nie można było utworzyć foldera o nazwie \"%{0}\"."; +"This folder could not be renamed to \"%{0}\"." += "Nie można było zmienić nazwy foldera na \"%{0}\"."; +"The folder could not be deleted." += "Nie można było usunąć foldera."; +"The trash could not be emptied." += "Nie można było opróżnić kosza."; +"The folder functionality could not be changed." += "Nie można było zmienić funkcjonalności foldera."; + +"You need to choose a non-virtual folder!" = "Musisz wybrać folder, który nie jest wirtualny!"; + +"Moving a message into its own folder is impossible!" += "Przenoszenie wiadomości do jej obecnego foldera nie jest możliwe!"; +"Copying a message into its own folder is impossible!" += "Kopiowanie wiadomości do jej obecnego foldera nie jest możliwe!"; + +/* Message editing */ +"error_validationfailed" = "Weryfikacja zakończona niepowodzeniem"; +"error_missingsubject" = "Brak tematu"; +"error_missingrecipients" = "Brak odbiorców"; diff --git a/UI/MailerUI/Russian.lproj/Localizable.strings b/UI/MailerUI/Russian.lproj/Localizable.strings index 8a40d5c85..3e9739d99 100644 --- a/UI/MailerUI/Russian.lproj/Localizable.strings +++ b/UI/MailerUI/Russian.lproj/Localizable.strings @@ -136,6 +136,7 @@ "View" = "Просмотр"; "All" = "Все"; "Unread" = "Непрочитанные"; +"No message" = "No message"; "messages" = "сообщения"; "first" = "первая"; diff --git a/UI/MailerUI/Spanish.lproj/Localizable.strings b/UI/MailerUI/Spanish.lproj/Localizable.strings index bc71d01d3..c83a033a9 100644 --- a/UI/MailerUI/Spanish.lproj/Localizable.strings +++ b/UI/MailerUI/Spanish.lproj/Localizable.strings @@ -136,6 +136,7 @@ "View" = "Vista"; "All" = "Todo"; "Unread" = "No leído"; +"No message" = "No message"; "messages" = "mensajes"; "first" = "Primero"; diff --git a/UI/MailerUI/Swedish.lproj/Localizable.strings b/UI/MailerUI/Swedish.lproj/Localizable.strings index c2432e8b8..c193721a1 100644 --- a/UI/MailerUI/Swedish.lproj/Localizable.strings +++ b/UI/MailerUI/Swedish.lproj/Localizable.strings @@ -136,6 +136,7 @@ "View" = "Visa"; "All" = "Alla"; "Unread" = "Oläst"; +"No message" = "No message"; "messages" = "meddelanden"; "first" = "Första"; diff --git a/UI/MailerUI/Ukrainian.lproj/Localizable.strings b/UI/MailerUI/Ukrainian.lproj/Localizable.strings index bbe92db97..18795da8a 100644 --- a/UI/MailerUI/Ukrainian.lproj/Localizable.strings +++ b/UI/MailerUI/Ukrainian.lproj/Localizable.strings @@ -136,6 +136,7 @@ "View" = "Перегляд"; "All" = "Всі"; "Unread" = "Непрочитані"; +"No message" = "No message"; "messages" = "повідомлення"; "first" = "перша"; diff --git a/UI/MailerUI/Welsh.lproj/Localizable.strings b/UI/MailerUI/Welsh.lproj/Localizable.strings index d911866cd..2ffb7f51b 100644 --- a/UI/MailerUI/Welsh.lproj/Localizable.strings +++ b/UI/MailerUI/Welsh.lproj/Localizable.strings @@ -136,6 +136,7 @@ "View" = "Gweld"; "All" = "Oll"; "Unread" = "Heb ddarllen"; +"No message" = "No message"; "messages" = "negeseuon"; "first" = "Cyntaf"; diff --git a/UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings b/UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings index faadf6ad5..8e7192d66 100644 --- a/UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings @@ -29,6 +29,7 @@ "Spanish" = "Español"; "Swedish" = "Svenska"; "Welsh" = "Cymraeg"; +"Polish" = "Polski"; "About" = "Sobre"; "AboutBox" = "SOGo is a groupware server built around OpenGroupware.org (OGo) and the SOPE application server. It focuses on scalability.

diff --git a/UI/MainUI/Czech.lproj/Localizable.strings b/UI/MainUI/Czech.lproj/Localizable.strings index 92256a6ed..48c3a0f14 100644 --- a/UI/MainUI/Czech.lproj/Localizable.strings +++ b/UI/MainUI/Czech.lproj/Localizable.strings @@ -29,6 +29,7 @@ "Spanish" = "Español"; "Swedish" = "Svenska"; "Welsh" = "Cymraeg"; +"Polish" = "Polski"; "About" = "O"; "AboutBox" = "SOGo is a groupware server built around OpenGroupware.org (OGo) and the SOPE application server. It focuses on scalability.

diff --git a/UI/MainUI/Dutch.lproj/Localizable.strings b/UI/MainUI/Dutch.lproj/Localizable.strings index f1e4d9470..d8c723e78 100644 --- a/UI/MainUI/Dutch.lproj/Localizable.strings +++ b/UI/MainUI/Dutch.lproj/Localizable.strings @@ -29,6 +29,7 @@ "Spanish" = "Español"; "Swedish" = "Svenska"; "Welsh" = "Cymraeg"; +"Polish" = "Polski"; "About" = "About"; "AboutBox" = "SOGo is a groupware server built around OpenGroupware.org (OGo) and the SOPE application server. It focuses on scalability.

diff --git a/UI/MainUI/English.lproj/Localizable.strings b/UI/MainUI/English.lproj/Localizable.strings index 016709ab1..40097e8a6 100644 --- a/UI/MainUI/English.lproj/Localizable.strings +++ b/UI/MainUI/English.lproj/Localizable.strings @@ -29,6 +29,7 @@ "Spanish" = "Español"; "Swedish" = "Svenska"; "Welsh" = "Cymraeg"; +"Polish" = "Polski"; "About" = "About"; "AboutBox" = "SOGo is a groupware server built around OpenGroupware.org (OGo) and the SOPE application server. It focuses on scalability.

diff --git a/UI/MainUI/French.lproj/Localizable.strings b/UI/MainUI/French.lproj/Localizable.strings index 63be98cd5..6812c3162 100644 --- a/UI/MainUI/French.lproj/Localizable.strings +++ b/UI/MainUI/French.lproj/Localizable.strings @@ -29,6 +29,7 @@ "Spanish" = "Español"; "Swedish" = "Svenska"; "Welsh" = "Cymraeg"; +"Polish" = "Polski"; "About" = "À propos"; "AboutBox" = "SOGo is a groupware server built around OpenGroupware.org (OGo) and the SOPE application server. It focuses on scalability.

diff --git a/UI/MainUI/GNUmakefile b/UI/MainUI/GNUmakefile index 3df5051dd..cad3e3cac 100644 --- a/UI/MainUI/GNUmakefile +++ b/UI/MainUI/GNUmakefile @@ -6,7 +6,7 @@ BUNDLE_NAME = MainUI MainUI_PRINCIPAL_CLASS = MainUIProduct -MainUI_LANGUAGES = BrazilianPortuguese Czech Dutch English French German Hungarian Italian Russian Spanish Swedish Ukrainian Welsh +MainUI_LANGUAGES = BrazilianPortuguese Czech Dutch English French German Hungarian Italian Polish Russian Spanish 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 c550e7810..57148ae88 100644 --- a/UI/MainUI/German.lproj/Localizable.strings +++ b/UI/MainUI/German.lproj/Localizable.strings @@ -29,6 +29,7 @@ "Spanish" = "Español"; "Swedish" = "Svenska"; "Welsh" = "Cymraeg"; +"Polish" = "Polski"; "About" = "About"; "AboutBox" = "SOGo is a groupware server built around OpenGroupware.org (OGo) and the SOPE application server. It focuses on scalability.

diff --git a/UI/MainUI/Hungarian.lproj/Localizable.strings b/UI/MainUI/Hungarian.lproj/Localizable.strings index 421655c8c..2a2599e4b 100644 --- a/UI/MainUI/Hungarian.lproj/Localizable.strings +++ b/UI/MainUI/Hungarian.lproj/Localizable.strings @@ -29,6 +29,7 @@ "Spanish" = "Español"; "Swedish" = "Svenska"; "Welsh" = "Cymraeg"; +"Polish" = "Polski"; "About" = "Névjegy"; "AboutBox" = "A SOGo az OpenGroupware.org (OGo) és a SOPE alkalmazás szerverre épülő csoportmunka szerver, amely a skálázhatóságra összpontosít.

diff --git a/UI/MainUI/Italian.lproj/Localizable.strings b/UI/MainUI/Italian.lproj/Localizable.strings index 83e66aec9..f7b23b3c1 100644 --- a/UI/MainUI/Italian.lproj/Localizable.strings +++ b/UI/MainUI/Italian.lproj/Localizable.strings @@ -29,6 +29,7 @@ "Spanish" = "Español"; "Swedish" = "Svenska"; "Welsh" = "Cymraeg"; +"Polish" = "Polski"; "About" = "About"; "AboutBox" = "SOGo is a groupware server built around OpenGroupware.org (OGo) and the SOPE application server. It focuses on scalability.

diff --git a/UI/MainUI/Polish.lproj/Locale b/UI/MainUI/Polish.lproj/Locale new file mode 100644 index 000000000..5f6beb365 --- /dev/null +++ b/UI/MainUI/Polish.lproj/Locale @@ -0,0 +1,35 @@ +/* Polish */ +{ + NSLanguageName = "Polish"; + NSFormalName = "Polski"; + NSLocaleCode = "pl"; /* ISO 639-1 */ + NSLanguageCode = "pol"; /* ISO 639-2 */ + NSParentContext = ""; + + NSAMPMDesignation = (AM, PM); + NSCurrencySymbol = "zł"; + NSDateFormatString = "%A, %B %e %Y"; + NSDateTimeOrdering = YMDH; + NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); + NSDecimalSeparator = ","; + NSEarlierTimeDesignations = ("przed", "ostatni", "po", "temu"); + NSHourNameDesignations = ((0, "północ"), (10, "rano"), (12, "południe", "lunch"), (14, "popołudnie"), (19, "wieczór")); + NSInternationalCurrencyString = PLN; /* ISO 4217 */ + NSLaterTimeDesignations = ("następny"); + NSMonthNameArray = ("Styczeń", "Luty", "Marzec", "Kwiecień", "Maj", "Czerwiec", "Lipiec", "Sierpień", "Wrzesień", "Październik", "Listopad", "Grudzień"); + NSNextDayDesignations = ("jutro"); + NSNextNextDayDesignations = ("następny dzień"); + NSPriorDayDesignations = ("wczoraj"); + NSShortDateFormatString = "%e/%m/%y"; + NSShortMonthNameArray = ("Sty", "Lut", "Mar", "Kwi", "Maj", "Cze", "Lip", "Sie", "Wrz", "Paź", "Lis", "Gru"); + NSShortTimeDateFormatString = "%y-%m-%e %H:%M"; + NSShortWeekDayNameArray = ("Nie", "Pon", "Wto", "Śro", "Czw", "Pią", "Sob"); + NSThisDayDesignations = ("dzisiaj", "teraz"); + NSThousandsSeparator = " "; + NSTimeDateFormatString = "%A, %e %B %Y %H:%M:%S %Z"; + NSTimeFormatString = "%H:%M:%S"; + NSWeekDayNameArray = ("Niedziela", "Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek", "Sobota"); + NSYearMonthWeekDesignations = ("rok", "miesiąc", "tydzień"); + NSPositiveCurrencyFormatString = "9,999.00$"; + NSNegativeCurrencyFormatString = "-9,999.00$"; +} diff --git a/UI/MainUI/Polish.lproj/Localizable.strings b/UI/MainUI/Polish.lproj/Localizable.strings new file mode 100644 index 000000000..86333e94a --- /dev/null +++ b/UI/MainUI/Polish.lproj/Localizable.strings @@ -0,0 +1,73 @@ +/* this file is in UTF-8 format! */ + +"title" = "SOGo"; + +"Username:" = "Nazwa użytkownika:"; +"Password:" = "Hasło:"; + +"Connect" = "Zaloguj"; + +"Wrong username or password." = "Zła nazwa użytkownika lub hasło."; +"cookiesNotEnabled" = "Nie możesz się zalogować ponieważ twoja przeglądarka ma zablokowaną obsługę ciasteczek (cookies). Włącz obsługę ciasteczek w ustawieniach twojej przeglądarki i spróbuj ponownie."; + +"browserNotCompatible" = "Używasz przeglądarki WWW, która nie jest obecnie obsługiwana przez tę stronę. Rekomendowaną przeglądarką jest Firefox. Kliknij poniższy odnośnik aby pobrać najnowszą wersję tej przeglądarki."; +"alternativeBrowsers" = "Alternatywnie możesz także używać następujących przeglądarek"; +"alternativeBrowserSafari" = "Alternatywnie możesz używać również przeglądarki Safari."; +"Download" = "Pobierz"; + +"Language:" = "Język:"; +"choose" = "Wybierz ..."; +"Czech" = "Česky"; +"Dutch" = "Nederlands"; +"English" = "English"; +"French" = "Français"; +"German" = "Deutsch"; +"Hungarian" = "Magyar"; +"Italian" = "Italiano"; +"BrazilianPortuguese" = "Português brasileiro"; +"Russian" = "Русский"; +"Spanish" = "Español"; +"Swedish" = "Svenska"; +"Welsh" = "Cymraeg"; +"Polish" = "Polski"; + + +"About" = "O programie"; +"AboutBox" = "SOGo jest serwerem pracy grupowej zbudowanym w oparciu o systemy OpenGroupware.org (OGo) oraz SOPE. Głównym celem SOGo jest skalowalność.

+SOGo oferuje bogaty, oparty na technologii AJAX interfejs webowy oraz wspiera wiele aplikacji klienckich dzięki korzystaniu ze standardowych protokołów takich jak CalDAV, CardDAV i GroupDAV.

+Copyright © 2006-2010 Inverse inc.
+Copyright © 2002-2005 SKYRIX Software AG
+Tłumaczenie 2010 IB

+To oprogramowanie rozpowszechniane jest w oparciu o licencję GNU GPL version 2.
+Elementy tego oprogramowania rozpowszechniane są w oparciu o licencję GNU LGPL version 2.

+To oprogramowanie jest wolne: możesz je modyfikować i dystrybuować. Nie ma ŻADNYCH GWARANCJI, w zakresie dozwolonym przez prawo."; + +"Your account was locked due to too many failed attempts." = "Twoje konto zostało zablokowane wkutek zbyt wielu nieudanych prób logowania."; +"Your account was locked due to an expired password." = "Twoje konto zostało zblokowane z powodu wygaśnięcia ważności hasła."; +"Login failed due to unhandled error case: " = "Logowanie nie powiodło się z powodu niezidentyfikowanego błędu: "; +"Change your Password" = "Zmień swoje hasło"; +"Your password has expired, please enter a new one below:" = "Ważność twojego hasła wygasła, wprowadź niżej nowe hasło:"; +"Password must not be empty." = "Hasło nie może być puste."; +"The passwords do not match. Please try again." = "Hasła nie są zgodne. Spróbuj jeszcze raz."; +"Password Grace Period" = "Okres pobłażliwości hasła"; +"You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "Pozostało Ci %{0} logowań zanim konto zostanie zablokowane. Zmień swoje hasło w oknie właściwości."; +"Password about to expire" = "Wkrótce wygaśnie ważność hasła"; +"Your password is going to expire in %{0} %{1}." = "Ważność twojego hasła wygaśnie za %{0} %{1}."; +"days" = "dni"; +"hours" = "godz."; +"minutes" = "min."; +"seconds" = "sek."; +"Password change failed" = "Zmiana hasła nie powiodła się"; +"Password change failed - Permission denied" = "Zmiana hasła nie powiodła się - odmowa dostępu"; +"Password change failed - Insufficient password quality" = "Zmiana hasła nie powiodła się - niewystarczająca jakość hasła"; +"Password change failed - Password is too short" = "Zmiana hasła nie powiodła się - hasło jest zbyt krótkie"; +"Password change failed - Password is too young" = "Zmiana hasła nie powiodła się - hasło jest zbyt świeże"; +"Password change failed - Password is in history" = "Zmiana hasła nie powiodła się - hasło znajduje się w historii"; +"Unhandled policy error: %{0}" = "Niezidentyfikowany błąd zabezpieczeń: %{0}"; +"Unhandled error response" = "Niezidentyfikowany błąd"; +"Password change is not supported." = "Zmiana hasła nie jest obsługiwana."; +"Unhandled HTTP error code: %{0}" = "Nieobsługiwany kod błędu HTTP: %{0}"; +"New password:" = "Nowe hasło:"; +"Confirmation:" = "Potwierdzenie:"; +"Cancel" = "Anuluj"; +"Please wait..." = "Zaczekaj proszę..."; diff --git a/UI/MainUI/Russian.lproj/Localizable.strings b/UI/MainUI/Russian.lproj/Localizable.strings index f8406047f..0cb5826ab 100644 --- a/UI/MainUI/Russian.lproj/Localizable.strings +++ b/UI/MainUI/Russian.lproj/Localizable.strings @@ -29,6 +29,7 @@ "Spanish" = "Español"; "Swedish" = "Svenska"; "Welsh" = "Cymraeg"; +"Polish" = "Polski"; "About" = "О системе"; "AboutBox" = "SOGo is a groupware server built around OpenGroupware.org (OGo) and the SOPE application server. It focuses on scalability.

diff --git a/UI/MainUI/Spanish.lproj/Localizable.strings b/UI/MainUI/Spanish.lproj/Localizable.strings index 70f46b1e7..f957f5f01 100644 --- a/UI/MainUI/Spanish.lproj/Localizable.strings +++ b/UI/MainUI/Spanish.lproj/Localizable.strings @@ -29,6 +29,7 @@ "Spanish" = "Español"; "Swedish" = "Svenska"; "Welsh" = "Cymraeg"; +"Polish" = "Polski"; "About" = "About"; "AboutBox" = "SOGo is a groupware server built around OpenGroupware.org (OGo) and the SOPE application server. It focuses on scalability.

diff --git a/UI/MainUI/Swedish.lproj/Localizable.strings b/UI/MainUI/Swedish.lproj/Localizable.strings index cd388f719..3e4f05192 100644 --- a/UI/MainUI/Swedish.lproj/Localizable.strings +++ b/UI/MainUI/Swedish.lproj/Localizable.strings @@ -29,6 +29,7 @@ "Spanish" = "Español"; "Swedish" = "Svenska"; "Welsh" = "Cymraeg"; +"Polish" = "Polski"; "About" = "Om"; "AboutBox" = "SOGo is a groupware server built around OpenGroupware.org (OGo) and the SOPE application server. It focuses on scalability.

diff --git a/UI/MainUI/Welsh.lproj/Localizable.strings b/UI/MainUI/Welsh.lproj/Localizable.strings index 9352ee248..ad2f37bdb 100644 --- a/UI/MainUI/Welsh.lproj/Localizable.strings +++ b/UI/MainUI/Welsh.lproj/Localizable.strings @@ -29,6 +29,7 @@ "Spanish" = "Español"; "Swedish" = "Svenska"; "Welsh" = "Cymraeg"; +"Polish" = "Polski"; "About" = "About"; "AboutBox" = "SOGo is a groupware server built around OpenGroupware.org (OGo) and the SOPE application server. It focuses on scalability.

diff --git a/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings b/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings index 41cbb743b..9e3f6ea93 100644 --- a/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings @@ -166,6 +166,7 @@ "Spanish" = "Español"; "Swedish" = "Svenska"; "Welsh" = "Cymraeg"; +"Polish" = "Polski"; /* Filters - UIxPreferences */ "Filters" = "Filters"; diff --git a/UI/PreferencesUI/Czech.lproj/Localizable.strings b/UI/PreferencesUI/Czech.lproj/Localizable.strings index 10888253a..ba8a24068 100644 --- a/UI/PreferencesUI/Czech.lproj/Localizable.strings +++ b/UI/PreferencesUI/Czech.lproj/Localizable.strings @@ -166,6 +166,7 @@ "Spanish" = "Español"; "Swedish" = "Svenska"; "Welsh" = "Cymraeg"; +"Polish" = "Polski"; /* Filters - UIxPreferences */ "Filters" = "Filters"; diff --git a/UI/PreferencesUI/Dutch.lproj/Localizable.strings b/UI/PreferencesUI/Dutch.lproj/Localizable.strings index aea9a6e5f..8c08509a3 100644 --- a/UI/PreferencesUI/Dutch.lproj/Localizable.strings +++ b/UI/PreferencesUI/Dutch.lproj/Localizable.strings @@ -166,6 +166,7 @@ "Spanish" = "Español"; "Swedish" = "Svenska"; "Welsh" = "Cymraeg"; +"Polish" = "Polski"; /* Filters - UIxPreferences */ "Filters" = "Filters"; diff --git a/UI/PreferencesUI/English.lproj/Localizable.strings b/UI/PreferencesUI/English.lproj/Localizable.strings index e8652979c..a98f18216 100644 --- a/UI/PreferencesUI/English.lproj/Localizable.strings +++ b/UI/PreferencesUI/English.lproj/Localizable.strings @@ -166,6 +166,7 @@ "Spanish" = "Español"; "Swedish" = "Svenska"; "Welsh" = "Cymraeg"; +"Polish" = "Polski"; /* Filters - UIxPreferences */ "Filters" = "Filters"; diff --git a/UI/PreferencesUI/French.lproj/Localizable.strings b/UI/PreferencesUI/French.lproj/Localizable.strings index 240fcb650..fb3785625 100644 --- a/UI/PreferencesUI/French.lproj/Localizable.strings +++ b/UI/PreferencesUI/French.lproj/Localizable.strings @@ -164,6 +164,7 @@ "Spanish" = "Español"; "Swedish" = "Svenska"; "Welsh" = "Cymraeg"; +"Polish" = "Polski"; /* Filters - UIxPreferences */ "Filters" = "Filtres"; diff --git a/UI/PreferencesUI/GNUmakefile b/UI/PreferencesUI/GNUmakefile index 0329f3739..3d98fec2d 100644 --- a/UI/PreferencesUI/GNUmakefile +++ b/UI/PreferencesUI/GNUmakefile @@ -6,7 +6,7 @@ BUNDLE_NAME = PreferencesUI PreferencesUI_PRINCIPAL_CLASS = PreferencesUIProduct -PreferencesUI_LANGUAGES = BrazilianPortuguese Czech Dutch English French German Hungarian Italian Russian Spanish Swedish Ukrainian Welsh +PreferencesUI_LANGUAGES = BrazilianPortuguese Czech Dutch English French German Hungarian Italian Polish Russian Spanish 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 cb5b7ab50..b901d183e 100644 --- a/UI/PreferencesUI/German.lproj/Localizable.strings +++ b/UI/PreferencesUI/German.lproj/Localizable.strings @@ -166,6 +166,7 @@ "Spanish" = "Español"; "Swedish" = "Svenska"; "Welsh" = "Cymraeg"; +"Polish" = "Polski"; /* Filters - UIxPreferences */ "Filters" = "Filter"; diff --git a/UI/PreferencesUI/Hungarian.lproj/Localizable.strings b/UI/PreferencesUI/Hungarian.lproj/Localizable.strings index fe3e7bcf5..92b820c23 100644 --- a/UI/PreferencesUI/Hungarian.lproj/Localizable.strings +++ b/UI/PreferencesUI/Hungarian.lproj/Localizable.strings @@ -149,6 +149,7 @@ "Russian" = "Русский"; "Spanish" = "Español"; "Welsh" = "Cymraeg"; +"Polish" = "Polski"; /* Filters - UIxPreferences */ "Filters" = "Filters"; diff --git a/UI/PreferencesUI/Italian.lproj/Localizable.strings b/UI/PreferencesUI/Italian.lproj/Localizable.strings index c942365fc..ebb1d13fb 100644 --- a/UI/PreferencesUI/Italian.lproj/Localizable.strings +++ b/UI/PreferencesUI/Italian.lproj/Localizable.strings @@ -166,6 +166,7 @@ "Spanish" = "Español"; "Swedish" = "Svenska"; "Welsh" = "Cymraeg"; +"Polish" = "Polski"; /* Filters - UIxPreferences */ "Filters" = "Filters"; diff --git a/UI/PreferencesUI/Polish.lproj/Localizable.strings b/UI/PreferencesUI/Polish.lproj/Localizable.strings new file mode 100644 index 000000000..cb9ce259f --- /dev/null +++ b/UI/PreferencesUI/Polish.lproj/Localizable.strings @@ -0,0 +1,223 @@ +/* toolbar */ +"Save and Close" = "Zapisz i zamknij"; +"Close" = "Zamknij"; + +/* tabs */ +"General" = "Ogólne"; +"Calendar Options" = "Opcje kalendarza"; +"Mail Options" = "Opcje poczty"; +"Signature" = "Podpis"; +"Vacation" = "Nieobecność"; +"Forward" = "Przekazywanie"; +"Identities" = "Tożsamości"; +"Password" = "Hasło"; +"Categories" = "Kategorie"; +"Name" = "Nazwa"; +"Color" = "Kolor"; +"Add" = "Dodaj"; +"Delete" = "Usuń"; + +/* vacation (auto-reply) */ +"Enable vacation auto reply" = "Włącz autoodpowiedź podczas nieobecności"; +"Auto reply message :" = "Treść autoodpowiedzi :"; +"Email addresses (separated by commas) :" = "Adresy e-mail (oddzielone przecinkami) :"; +"Add default email addresses" = "Dodaj domyślne adresy e-mail"; +"Days between responses :" = "Dni pomiędzy odpowiedziami :"; +"Do not send responses to mailing lists" = "Nie wysyłaj odpowiedzi do grup pocztowych"; +"Please specify your message and your email addresses for which you want to enable auto reply." += "Podaj treść wiadomości i twoje adresy e-mail, dla których chcesz włączyć autoodpowiedź."; + +/* forward messages */ +"Forward incoming messages" = "Przekaż przychodzące wiadomości"; +"Forward to address :" = "Przekaż na adres :"; +"Keep a copy" = "Zatrzymaj kopię"; +"Please specify an address to which you want to forward your messages." += "Podaj adres, na który chcesz przekazywać wiadomości."; + +/* d & t */ +"Current Time Zone :" = "Bieżąca strefa czasowa :"; +"Short Date Format :" = "Krótki format daty :"; +"Long Date Format :" = "Długi format daty :"; +"Time Format :" = "Format czasu :"; + +"default" = "Domyślne"; + +"shortDateFmt_0" = "%d-%b-%y"; + +"shortDateFmt_1" = "%d-%m-%y"; +"shortDateFmt_2" = "%d/%m/%y"; +"shortDateFmt_3" = "%e/%m/%y"; + +"shortDateFmt_4" = "%d-%m-%Y"; +"shortDateFmt_5" = "%d/%m/%Y"; + +"shortDateFmt_6" = "%m-%d-%y"; +"shortDateFmt_7" = "%m/%d/%y"; +"shortDateFmt_8" = "%m/%e/%y"; + +"shortDateFmt_9" = "%y-%m-%d"; +"shortDateFmt_10" = "%y/%m/%d"; +"shortDateFmt_11" = "%y.%m.%d"; + +"shortDateFmt_12" = "%Y-%m-%d"; +"shortDateFmt_13" = "%Y/%m/%d"; +"shortDateFmt_14" = "%Y.%m.%d"; + +"shortDateFmt_15" = ""; + +"longDateFmt_0" = "%A, %B %d, %Y"; +"longDateFmt_1" = "%B %d, %Y"; +"longDateFmt_2" = "%A, %d %B, %Y"; +"longDateFmt_3" = "%d %B, %Y"; +"longDateFmt_4" = ""; + +"timeFmt_0" = "%I:%M %p"; +"timeFmt_1" = "%H:%M"; +"timeFmt_2" = ""; + +/* calendar */ +"Week begins on :" = "Pierwszy dzień tygodnia :"; +"Day start time :" = "Początek dnia :"; +"Day end time :" = "Koniec dnia :"; +"Day start time must be prior to day end time." = "Początek dnia musi wypadać wcześniej niż koniec dnia."; +"First week of year :" = "Pierwszy tydzień roku :"; +"Enable reminders for Calendar items" = "Włącz przypomnienia pozycji kalendarza"; +"Play a sound when a reminder comes due" += "Odtwórz dźwięk w momencie przypomnienia"; +"Default reminder :" = "Domyślne przypomnienie :"; + +"firstWeekOfYear_January1" = "rozpoczyna się 1 stycznia"; +"firstWeekOfYear_First4DayWeek" = "pierwszy 4-dniowy tydzień"; +"firstWeekOfYear_FirstFullWeek" = "pierwszy pełny tydzień"; + +"reminderTime_0000" = "0 minut"; +"reminderTime_0005" = "5 minut"; +"reminderTime_0010" = "10 minut"; +"reminderTime_0015" = "15 minut"; +"reminderTime_0030" = "30 minut"; +"reminderTime_0100" = "1 godzina"; +"reminderTime_0200" = "2 godziny"; +"reminderTime_0400" = "4 godziny"; +"reminderTime_0800" = "8 godzin"; +"reminderTime_1200" = "1/2 dnia"; +"reminderTime_2400" = "1 dzień"; +"reminderTime_4800" = "2 dni"; + +/* Mailer */ +"Show subscribed mailboxes only" = "Pokaż tylko subskrybowane konta pocztowe"; +"Check for new mail:" = "Sprawdzaj nowe wiadomości:"; +"messagecheck_manually" = "ręcznie"; +"messagecheck_every_minute" = "co minutę"; +"messagecheck_every_2_minutes" = "co 2 minuty"; +"messagecheck_every_5_minutes" = "co 5 minut"; +"messagecheck_every_10_minutes" = "co 10 minut"; +"messagecheck_every_20_minutes" = "co 20 minut"; +"messagecheck_every_30_minutes" = "co 30 minut"; +"messagecheck_once_per_hour" = "raz na godzinę"; + +"Forward messages:" = "Przekaż wiadomości:"; +"messageforward_inline" = "w treści"; +"messageforward_attached" = "jako załącznik"; + +/* Identities */ +"Default identity:" = "Domyślna tożsamość:"; +"Manage identities..." = "Zarządzaj tożsamościami..."; +"replyplacement_above" = "Rozpocznij moją odpowiedź powyżej cytatu"; +"replyplacement_below" = "Rozpocznij moją odpowiedź poniżej cytatu"; +"And place my signature" = "i wstaw mój podpis"; +"signatureplacement_above" = "poniżej odpowiedzi"; +"signatureplacement_below" = "poniżej cytatu"; +"Compose messages in" = "Twórz wiadomości"; +"composemessagestype_html" = "HTML"; +"composemessagestype_text" = "czysty tekst"; + +"composeMessageChanged" = "Zmiana konfiguracji tworzenia wiadomości wymaga natychmiastowego zapisania twoich ustawień. Kontynuować?"; + +/* Additional Parameters */ +"Additional Parameters" = "Dodatkowe parametry"; + +/* password */ +"New password:" = "Nowe hasło:"; +"Confirmation:" = "Potwierdzenie:"; +"Change" = "Zmiana"; + +/* Event+task categories */ +"category_none" = "Brak"; +"category_labels" = "Rocznica,Urodziny,Biznes,Telefony,Klienci,Konkurencja,Klient,Ulubione,Nawiązanie,Podarunki,Święta,Idee,Spotkania,Problemy,Różne,Osobiste,Projekty,Święta,Status,Dostawcy,Podróż,Wakacje"; + +/* Default module */ +"Calendar" = "Kalendarz"; +"Contacts" = "Książka adresowa"; +"Mail" = "Poczta"; +"Last" = "Ostatnio używane"; +"Default module :" = "Tryb domyślny :"; + +"Language :" = "Język :"; +"choose" = "Wybierz ..."; +"Czech" = "Česky"; +"Dutch" = "Nederlands"; +"English" = "English"; +"French" = "Français"; +"German" = "Deutsch"; +"Hungarian" = "Magyar"; +"Italian" = "Italiano"; +"BrazilianPortuguese" = "Português brasileiro"; +"Russian" = "Русский"; +"Spanish" = "Español"; +"Swedish" = "Svenska"; +"Welsh" = "Cymraeg"; +"Polish" = "Polski"; + + +/* Filters - UIxPreferences */ +"Filters" = "Filtry"; +"Active" = "Aktywny"; +"Move Up" = "Przenieś do góry"; +"Move Down" = "Przenieś w dół"; + +/* Filters - UIxFilterEditor */ +"Filter name:" = "Nazwa filtra:"; +"For incoming messages that" = "Dla przychodzących wiadomości, które"; +"match all of the following rules:" = "spełnią wszystkie poniższe reguły:"; +"match any of the following rules:" = "spełnią którąkolwiek z poniższych reguł:"; +"match all messages" = "dopasowanie wszystkich wiadomości"; +"Perform these actions:" = "Wykonaj akcje:"; + +"Subject" = "Temat"; +"From" = "Od"; +"To" = "Do"; +"Cc" = "DW"; +"To or Cc" = "Do lub DW"; +"Size (Kb)" = "Rozmiar (KB)"; +"Header" = "Nagłówek"; +"Flag the message with:" = "Oflaguj wiadomość:"; +"Discard the message" = "Odrzuć wiadomość"; +"File the message in:" = "Zapisz wiadomość w:"; +"Keep the message" = "Zatrzymaj wiadomość"; +"Forward the message to:" = "przekaż wiadomość do:"; +"Send a reject message:" = "Wyślij odmowę:"; +"Send a vacation message" = "Wyślij informację o nieobecności"; +"Stop processing filter rules" = "Zakończ przetwarzanie reguł filtra"; + +"is under" = "jest podniżej"; +"is over" = "jest ponad"; +"is" = "jest"; +"is not" = "nie jest"; +"contains" = "zawiera"; +"does not contain" = "nie zawiera"; +"matches" = "pasuje do"; +"does not match" = "nie pasuje do"; +"matches regex" = "pasuje do regex"; +"does not match regex" = "nie pasuje do regex"; + +"Seen" = "Obejrzane"; +"Deleted" = "Usunięte"; +"Answered" = "Odpowiedziane"; +"Flagged" = "Oflagowane"; +"Junk" = "Śmieć"; +"Not Junk" = "Nie śmieć"; +"Label 1" = "Etykieta 1"; +"Label 2" = "Etykieta 2"; +"Label 3" = "Etykieta 3"; +"Label 4" = "Etykieta 4"; +"Label 5" = "Etykieta 5"; diff --git a/UI/PreferencesUI/Russian.lproj/Localizable.strings b/UI/PreferencesUI/Russian.lproj/Localizable.strings index 8a35041ed..bc06151de 100644 --- a/UI/PreferencesUI/Russian.lproj/Localizable.strings +++ b/UI/PreferencesUI/Russian.lproj/Localizable.strings @@ -171,6 +171,7 @@ "Spanish" = "Español"; "Swedish" = "Svenska"; "Welsh" = "Cymraeg"; +"Polish" = "Polski"; /* Filters - UIxPreferences */ "Filters" = "Filters"; diff --git a/UI/PreferencesUI/Spanish.lproj/Localizable.strings b/UI/PreferencesUI/Spanish.lproj/Localizable.strings index 2606c05d9..858cad3fb 100644 --- a/UI/PreferencesUI/Spanish.lproj/Localizable.strings +++ b/UI/PreferencesUI/Spanish.lproj/Localizable.strings @@ -168,6 +168,7 @@ "Spanish" = "Español"; "Swedish" = "Svenska"; "Welsh" = "Cymraeg"; +"Polish" = "Polski"; /* Filters - UIxPreferences */ "Filters" = "Filters"; diff --git a/UI/PreferencesUI/Swedish.lproj/Localizable.strings b/UI/PreferencesUI/Swedish.lproj/Localizable.strings index ff0550a61..a518df9bb 100644 --- a/UI/PreferencesUI/Swedish.lproj/Localizable.strings +++ b/UI/PreferencesUI/Swedish.lproj/Localizable.strings @@ -166,6 +166,7 @@ "Spanish" = "Español"; "Swedish" = "Svenska"; "Welsh" = "Cymraeg"; +"Polish" = "Polski"; /* Filters - UIxPreferences */ "Filters" = "Filters"; diff --git a/UI/PreferencesUI/Welsh.lproj/Localizable.strings b/UI/PreferencesUI/Welsh.lproj/Localizable.strings index 66186da04..d4666b79e 100644 --- a/UI/PreferencesUI/Welsh.lproj/Localizable.strings +++ b/UI/PreferencesUI/Welsh.lproj/Localizable.strings @@ -166,6 +166,7 @@ "Spanish" = "Español"; "Swedish" = "Svenska"; "Welsh" = "Cymraeg"; +"Polish" = "Polski"; /* Filters - UIxPreferences */ "Filters" = "Filters"; diff --git a/UI/SOGoUI/SOGoACLAdvisory.h b/UI/SOGoUI/SOGoACLAdvisory.h index f980cb771..e22b5f627 100644 --- a/UI/SOGoUI/SOGoACLAdvisory.h +++ b/UI/SOGoUI/SOGoACLAdvisory.h @@ -137,6 +137,15 @@ @interface SOGoACLItalianRemovalAdvisory : SOGoACLRemovalAdvisory @end +@interface SOGoACLPolishAdditionAdvisory : SOGoACLAdditionAdvisory +@end + +@interface SOGoACLPolishModificationAdvisory : SOGoACLModificationAdvisory +@end + +@interface SOGoACLPolishRemovalAdvisory : SOGoACLRemovalAdvisory +@end + @interface SOGoACLRussianAdditionAdvisory : SOGoACLAdditionAdvisory @end diff --git a/UI/SOGoUI/SOGoACLAdvisory.m b/UI/SOGoUI/SOGoACLAdvisory.m index c9f987142..e5f51473b 100644 --- a/UI/SOGoUI/SOGoACLAdvisory.m +++ b/UI/SOGoUI/SOGoACLAdvisory.m @@ -331,6 +331,15 @@ @implementation SOGoACLItalianRemovalAdvisory @end +@implementation SOGoACLPolishAdditionAdvisory +@end + +@implementation SOGoACLPolishModificationAdvisory +@end + +@implementation SOGoACLPolishRemovalAdvisory +@end + @implementation SOGoACLRussianAdditionAdvisory @end diff --git a/UI/SOGoUI/SOGoFolderAdvisory.h b/UI/SOGoUI/SOGoFolderAdvisory.h index 2ecc02821..911759fda 100644 --- a/UI/SOGoUI/SOGoFolderAdvisory.h +++ b/UI/SOGoUI/SOGoFolderAdvisory.h @@ -101,6 +101,12 @@ @interface SOGoFolderItalianRemovalAdvisory : SOGoFolderRemovalAdvisory @end +@interface SOGoFolderPolishAdditionAdvisory : SOGoFolderAdditionAdvisory +@end + +@interface SOGoFolderPolishRemovalAdvisory : SOGoFolderRemovalAdvisory +@end + @interface SOGoFolderRussianAdditionAdvisory : SOGoFolderAdditionAdvisory @end diff --git a/UI/SOGoUI/SOGoFolderAdvisory.m b/UI/SOGoUI/SOGoFolderAdvisory.m index d357b9689..90fa6ca6a 100644 --- a/UI/SOGoUI/SOGoFolderAdvisory.m +++ b/UI/SOGoUI/SOGoFolderAdvisory.m @@ -272,6 +272,12 @@ @implementation SOGoFolderItalianRemovalAdvisory @end +@implementation SOGoFolderPolishAdditionAdvisory +@end + +@implementation SOGoFolderPolishRemovalAdvisory +@end + @implementation SOGoFolderRussianAdditionAdvisory @end diff --git a/UI/Scheduler/GNUmakefile b/UI/Scheduler/GNUmakefile index edbc797c3..8bb0ead8c 100644 --- a/UI/Scheduler/GNUmakefile +++ b/UI/Scheduler/GNUmakefile @@ -6,7 +6,7 @@ BUNDLE_NAME = SchedulerUI SchedulerUI_PRINCIPAL_CLASS = SchedulerUIProduct -SchedulerUI_LANGUAGES = BrazilianPortuguese Czech Dutch English French German Hungarian Italian Russian Spanish Swedish Ukrainian Welsh +SchedulerUI_LANGUAGES = BrazilianPortuguese Czech Dutch English French German Hungarian Italian Polish Russian Spanish Swedish Ukrainian Welsh SchedulerUI_OBJC_FILES = \ SchedulerUIProduct.m \ diff --git a/UI/Scheduler/Polish.lproj/Localizable.strings b/UI/Scheduler/Polish.lproj/Localizable.strings new file mode 100644 index 000000000..c7925bf1d --- /dev/null +++ b/UI/Scheduler/Polish.lproj/Localizable.strings @@ -0,0 +1,561 @@ +/* this file is in UTF-8 format! */ + +/* Tooltips */ + +"Create a new event" = "Utwórz nowe wydarzenie"; +"Create a new task" = "Utwórz nowe zadanie"; +"Edit this event or task" = "Edytuj to wydarzenie lub zadanie"; +"Delete this event or task" = "Usuń to wydarzenie lub zadanie"; +"Go to today" = "Przejdź do dnia dzisiejszego"; +"Switch to day view" = "Przełącz do widoku dnia"; +"Switch to week view" = "Przełącz do widoku tygodnia"; +"Switch to month view" = "Przełącz do widoku miesiąca"; +"Reload all calendars" = "Przeładuj wszystkie kalendarze"; + +/* Tabs */ +"Date" = "Data"; +"Calendars" = "Kalendarze"; + +/* Day */ + +"Sunday" = "Niedziela"; +"Monday" = "Poniedziałek"; +"Tuesday" = "Wtorek"; +"Wednesday" = "Środa"; +"Thursday" = "Czwartek"; +"Friday" = "Piątek"; +"Saturday" = "Sobota"; +"DayOfTheMonth" = "Dzień miesiąca"; + +"Sun" = "Nie"; +"Mon" = "Pon"; +"Tue" = "Wto"; +"Wed" = "Śro"; +"Thu" = "Czw"; +"Fri" = "Pią"; +"Sat" = "Sob"; + +"a2_Sunday" = "Ni"; +"a2_Monday" = "Pn"; +"a2_Tuesday" = "Wt"; +"a2_Wednesday" = "Śr"; +"a2_Thursday" = "Cz"; +"a2_Friday" = "Pi"; +"a2_Saturday" = "So"; + +"dayLabelFormat" = "%Y-%m-%d"; +"today" = "Dzisiaj"; + +"Previous Day" = "Poprzedni dzień"; +"Next Day" = "Następny dzień"; + +/* Week */ + +"Week" = "Tydzień"; +"this week" = "ten tydzień"; + +"Week %d" = "Tydzień %d"; + +"Previous Week" = "Poprzedni tydzień"; +"Next Week" = "Następny tydzień"; + +/* Month */ + +"this month" = "ten miesiąc"; + +"January" = "Styczeń"; +"February" = "Luty"; +"March" = "Marzec"; +"April" = "Kwiecień"; +"May" = "Maj"; +"June" = "Czerwiec"; +"July" = "Lipiec"; +"August" = "Sierpień"; +"September" = "Wrzesień"; +"October" = "Październik"; +"November" = "Listopad"; +"December" = "Grudzień"; + +"a3_January" = "Styczeń"; +"a3_February" = "Luty"; +"a3_March" = "Marzec"; +"a3_April" = "Kwiecień"; +"a3_May" = "Maj"; +"a3_June" = "Czerwiec"; +"a3_July" = "Lipiec"; +"a3_August" = "Sierpień"; +"a3_September" = "Wrzesień"; +"a3_October" = "Październik"; +"a3_November" = "Listopad"; +"a3_December" = "Grudzień"; + +"Previous Month" = "Poprzedni miesiąc"; +"Next Month" = "Następny miesiąc"; + +/* Year */ + +"this year" = "ten rok"; + +/* Menu */ + +"Calendar" = "Kalendarz"; +"Contacts" = "Kontakty"; + +"New Calendar..." = "Nowy kalendarz..."; +"Delete Calendar" = "Usuń kalendarz..."; +"Unsubscribe Calendar" = "Wyłącz subskrypcję kalendarza"; +"Sharing..." = "Udostępnianie..."; +"Export Calendar..." = "Eksportuj kalendarz..."; +"Import Events..." = "Importuj wydarzenia..."; +"Import Events" = "Importuj wydarzenia"; +"Select an iCalendar file (.ics)." = "Wybierz plik iCalendar (.ics)."; +"Upload" = "Wyślij"; +"Publish Calendar..." = "Opublikuj kalendarz..."; +"Reload Remote Calendars" = "Przeładuj zdalne kalendarze"; +"Properties" = "Właściwości"; +"Done" = "Zrobione"; +"An error occured while importing calendar." = "Błąd w trakcie importu kalendarza."; +"No event was imported." = "Nie zaimportowano żadnego wydarzenia."; +"A total of %{0} events were imported in the calendar." = "Do kalendarza zaimportowano razem %{0} wydarzeń(nia)."; + +"Compose E-Mail to All Attendees" = "Utwórz wiadomość e-mail do wszystkich uczestników"; +"Compose E-Mail to Undecided Attendees" = "Utwórz wiadomość e-mail do niezdecydowanych uczestników"; + +/* Folders */ +"Personal calendar" = "Kalendarz osobisty"; + +/* Misc */ + +"OpenGroupware.org" = "OpenGroupware.org"; +"Forbidden" = "Zabronione"; + +/* acls */ + +"User rights for:" = "Uprawnienia użytkownika:"; + +"Any Authenticated User" = "Każdy zalogowany użytkownik"; +"Public Access" = "Dostęp publiczny"; + +"label_Public" = "Publiczne"; +"label_Private" = "Prywatne"; +"label_Confidential" = "Poufne"; + +"label_Viewer" = "Pokaż wszystko"; +"label_DAndTViewer" = "Pokaż datę i czas"; +"label_Modifier" = "Zmień"; +"label_Responder" = "Odpowiedz na"; +"label_None" = "Brak"; + +"View All" = "Pokaż wszystko"; +"View the Date & Time" = "Pokaż datę i czas"; +"Modify" = "Zmień"; +"Respond To" = "Odpowiedz na"; +"None" = "Brak"; + +"This person can create objects in my calendar." += "Ta osoba może tworzyć obiekty w moim kalendarzu."; +"This person can erase objects from my calendar." += "Ta osoba może usuwać obiekty z mojego kalendarza."; + +/* Button Titles */ + +"New Calendar..." = "Nowy kalendarz..."; +"Subscribe to a Calendar..." = "Subskrybuj kalendarz..."; +"Remove the selected Calendar" = "Usuń zaznaczony kalendarz"; + +"Name of the Calendar" = "Nazwa kalendarza"; + +"new" = "Nowy"; +"printview" = "Widok wydruku"; +"edit" = "Edytuj"; +"delete" = "Usuń"; +"proposal" = "Propozycja"; +"Save and Close" = "Zapisz i zamknij"; +"Close" = "Zamknij"; +"Invite Attendees" = "Zaproś uczestników"; +"Attach" = "Załącz"; +"Update" = "Zaktualizuj"; +"Cancel" = "Anuluj"; +"show_rejected_apts" = "Pokaż odrzucone spotkania"; +"hide_rejected_apts" = "Ukryj odrzucone spotkania"; + + +/* Schedule */ + +"Schedule" = "Harmonogram"; +"No appointments found" = "Brak spotkań"; +"Meetings proposed by you" = "Spotkania zaproponowane przez ciebie"; +"Meetings proposed to you" = "Spotkania zaproponowane tobie"; +"sched_startDateFormat" = "%m/%d %H:%M"; +"action" = "Akcja"; +"accept" = "Zaakceptuj"; +"decline" = "Odmów"; +"more attendees" = "Więcej uczestników"; +"Hide already accepted and rejected appointments" = "Ukryj zaakceptowane i odrzucone spoktania"; +"Show already accepted and rejected appointments" = "Pokaż zaakceptowane i odrzucone spotkania"; + + +/* Appointments */ + +"Appointment viewer" = "Przeglądarka spoktań"; +"Appointment editor" = "Edytor spotkań"; +"Appointment proposal" = "Propozycja spotkania"; +"Appointment on" = "Spotkanie w"; +"Start:" = "Początek:"; +"End:" = "Koniec:"; +"Due Date:" = "Termin:"; +"Title:" = "Tytuł:"; +"Calendar:" = "Kalendarz:"; +"Name" = "Nazwa"; +"Email" = "E-mail"; +"Status:" = "Status:"; +"% complete" = "% wykonania"; +"Location:" = "Miejsce:"; +"Priority:" = "Priorytet:"; +"Privacy" = "Prywatność"; +"Cycle" = "Powtarzaj"; +"Cycle End" = "Koniec powtarzania"; +"Categories" = "Kategorie"; +"Classification" = "Klasyfikacja"; +"Duration" = "Czas trwania"; +"Attendees:" = "Uczestnicy:"; +"Resources" = "Zasoby"; +"Organizer:" = "Organizator:"; +"Description:" = "Opis:"; +"Document:" = "Dokument:"; +"Category:" = "Kategoria:"; +"Repeat:" = "Powtórz:"; +"Reminder:" = "Przypomnienie:"; +"General:" = "Ogólne:"; +"Reply:" = "Odpowiedź:"; + +"Target:" = "Cel:"; + +"attributes" = "atrybuty"; +"attendees" = "uczestnicy"; +"delegated from" = "oddelegowane przez"; + +/* checkbox title */ +"is private" = "jest prywatne"; +/* classification */ +"Public" = "Publiczne"; +"Private" = "Prywtne"; +/* text used in overviews and tooltips */ +"empty title" = "Pusty tytuł"; +"private appointment" = "Spotkanie prywatne"; + +"Change..." = "Zmień..."; + +/* Appointments (participation state) */ + +"partStat_NEEDS-ACTION" = "Potwierdzę poźniej"; +"partStat_ACCEPTED" = "Wezmę udział"; +"partStat_DECLINED" = "Nie wezmę udziału"; +"partStat_TENTATIVE" = "Być może wezmę udział"; +"partStat_DELEGATED" = "Oddeleguję"; +"partStat_OTHER" = "Inne"; + +/* Appointments (error messages) */ + +"Conflicts found!" = "Znaleziono konflikty!"; +"Invalid iCal data!" = "Niepoprawne dane iCal!"; +"Could not create iCal data!" = "Nie można było utworzyć danych iCal!"; + +/* Searching */ + +"view_all" = "Wszystko"; +"view_today" = "Dzisiaj"; +"view_next7" = "Następne 7 dni"; +"view_next14" = "Następne 14 dni"; +"view_next31" = "Następne 31 dni"; +"view_thismonth" = "Ten miesiąc"; +"view_future" = "wszystkie przyszłe wydarzenia"; +"view_selectedday" = "Zaznaczony dzień"; + +"View:" = "Widok:"; +"Title or Description" = "Tytuł lub opis"; + +"Search" = "Szukaj"; +"Search attendees" = "Szukaj uczestników"; +"Search resources" = "Szukaj zasoby"; +"Search appointments" = "Szukaj spotkania"; + +"All day Event" = "Wydarzenie całodniowe"; +"check for conflicts" = "Sprawdź konflikty"; + +"Browse URL" = "Przeglądaj URL"; + +"newAttendee" = "Dodaj uczestnika"; + +/* calendar modes */ + +"Overview" = "Przegląd"; +"Chart" = "Wykres"; +"List" = "Lista"; +"Columns" = "Kolumny"; + +/* Priorities */ + +"prio_0" = "Nieokreślony"; +"prio_1" = "Wysoki"; +"prio_2" = "Wysoki"; +"prio_3" = "Wysoki"; +"prio_4" = "Wysoki"; +"prio_5" = "Normalny"; +"prio_6" = "Niski"; +"prio_7" = "Niski"; +"prio_8" = "Niski"; +"prio_9" = "Niski"; + +/* access classes (privacy) */ +"PUBLIC_vevent" = "Wydarzenie publiczne"; +"CONFIDENTIAL_vevent" = "Wydarzenie poufne"; +"PRIVATE_vevent" = "Wydarzenie prywatne"; +"PUBLIC_vtodo" = "Zadanie publiczne"; +"CONFIDENTIAL_vtodo" = "Zadanie poufne"; +"PRIVATE_vtodo" = "Zadanie prywatne"; + +/* status type */ +"status_" = "Nieokreślone"; +"status_NOT-SPECIFIED" = "Nieokreślone"; +"status_TENTATIVE" = "Niepewne"; +"status_CONFIRMED" = "Potwierdzone"; +"status_CANCELLED" = "Anulowane"; +"status_NEEDS-ACTION" = "Wymaga akcji"; +"status_IN-PROCESS" = "Trwa"; +"status_COMPLETED" = "Zakończone"; + +/* Cycles */ + +"cycle_once" = "powtórz raz"; +"cycle_daily" = "powtadzaj codziennie"; +"cycle_weekly" = "powtarzaj co tydzień"; +"cycle_2weeks" = "powtarzaj co 2 tygodnie"; +"cycle_4weeks" = "powtarzaj co 4 tygodnie"; +"cycle_monthly" = "powtarzaj co miesiąc"; +"cycle_weekday" = "powtarzaj w dni powszednie"; +"cycle_yearly" = "powtarzaj co rok"; + +"cycle_end_never" = "powtarzaj bezterminowo"; +"cycle_end_until" = "powtarzaj do"; + +"Recurrence pattern" = "Schemat powtórzeń"; +"Range of recurrence" = "Zakres powtórzeń"; + +"Repeat" = "Powtórz"; +"Daily" = "Codziennie"; +"Weekly" = "Co tydzień"; +"Monthly" = "Co miesiąc"; +"Yearly" = "Co rok"; +"Every" = "Co"; +"Days" = "Dni"; +"Week(s)" = "Tygodni(e)"; +"On" = "w"; +"Month(s)" = "Miesiące(ęcy)"; +"The" = ""; +"Recur on day(s)" = "Powtarzaj w dni"; +"Year(s)" = "Lat(a)"; +"cycle_of" = ""; +"No end date" = "Bez daty końcowej"; +"Create" = "Utwórz"; +"appointment(s)" = "spotkanie(a)"; +"Repeat until" = "Powtarzaj do"; + +"First" = "Pierwszy"; +"Second" = "Drugi"; +"Third" = "Trzeci"; +"Fourth" = "Czwarty"; +"Fift" = "Piąty"; +"Last" = "Ostatni"; + +/* Appointment categories */ + +"category_none" = "Brak"; +"category_labels" = "Rocznica,Urodziny,Biznes,Telefony,Klienci,Konkurencja,Klient,Ulubione,Nawiązania,Podarunki,Święta,Idee,Spotkanie,Problemy,Różne,Osobiste,Projekty,Święta publiczne,Status,Dostawcy,Podróż,Wakacje"; + +"repeat_NEVER" = "Bez powtórzeń"; +"repeat_DAILY" = "Codziennie"; +"repeat_WEEKLY" = "Co tydzień"; +"repeat_BI-WEEKLY" = "Co dwa tygodnie"; +"repeat_EVERY WEEKDAY" = "W dni powszednie"; +"repeat_MONTHLY" = "Co miesiąc"; +"repeat_YEARLY" = "Co rok"; +"repeat_CUSTOM" = "Inaczej..."; + +"reminder_NONE" = "Bez przypomnienia"; +"reminder_5_MINUTES_BEFORE" = "5 minut przed"; +"reminder_10_MINUTES_BEFORE" = "10 minut przed"; +"reminder_15_MINUTES_BEFORE" = "15 minut przed"; +"reminder_30_MINUTES_BEFORE" = "30 minut przed"; +"reminder_45_MINUTES_BEFORE" = "45 minut przed"; +"reminder_1_HOUR_BEFORE" = "1 godzinę przed"; +"reminder_2_HOURS_BEFORE" = "2 godziny przed"; +"reminder_5_HOURS_BEFORE" = "5 godzin przed"; +"reminder_15_HOURS_BEFORE" = "15 godzin przed"; +"reminder_1_DAY_BEFORE" = "1 dzień przed"; +"reminder_2_DAYS_BEFORE" = "2 dni przed"; +"reminder_1_WEEK_BEFORE" = "1 tydzień przed"; +"reminder_CUSTOM" = "Inaczej..."; + +"reminder_MINUTES" = "minut(y)"; +"reminder_HOURS" = "godzin(y)"; +"reminder_DAYS" = "dni"; +"reminder_BEFORE" = "przed"; +"reminder_AFTER" = "po"; +"reminder_START" = "rozpoczęciem wydarzenia"; +"reminder_END" = "końcem wydarzenia"; +"Reminder Details" = "Szczegóły przypomnienia"; + +"zoom_400" = "400%"; +"zoom_200" = "200%"; +"zoom_100" = "100%"; +"zoom_50" = "50%"; +"zoom_25" = "25%"; + +/* transparency */ + +"Show Time as Free" = "Pokaż czas jako wolny"; + +/* validation errors */ + +validate_notitle = "Nie podano tytułu, kontynuować?"; +validate_invalid_startdate = "Niepoprawna wartość w polu daty początkowej!"; +validate_invalid_enddate = "Niepoprawna wartość w polu daty końcowej!"; +validate_endbeforestart = "Podana data końca jest wcześniejsza niż data początku."; + +"Tasks" = "Zadania"; +"Show completed tasks" = "Pokaż ukończone zadania"; + +/* tabs */ +"Task" = "Zadanie"; +"Event" = "Wydarzenie"; +"Recurrence" = "Powtórzenia"; + +/* toolbar */ +"New Event" = "Nowe wydarzenie"; +"New Task" = "Nowe zadanie"; +"Edit" = "Edytuj"; +"Delete" = "Usuń"; +"Go to Today" = "Idź do dzisiaj"; +"Day View" = "Widok dnia"; +"Week View" = "Widok tygodnia"; +"Month View" = "Widok miesiąca"; +"Reload" = "Przeładuj"; + +"eventPartStatModificationError" = "Twój status uczestnictwa nie mógł być zmodyfikowany."; + +/* menu */ +"New Event..." = "Nowe wydarzenie..."; +"New Task..." = "Nowe zadanie..."; +"Edit Selected Event..." = "Edytuj zaznaczone wydarzenie..."; +"Delete Selected Event" = "Usuń zaznaczone wydarzenie"; +"Select All" = "Zaznacz wszystkie"; +"Workweek days only" = "Tylko dni powszednie"; +"Tasks in View" = "Zadania w widoku"; + +"eventDeleteConfirmation" = "Usunięcie tego wydarzenia będzie trwałe.\nCzy chcesz kontynuować?"; +"taskDeleteConfirmation" = "Usunięcie tego zadania będzie trwałe.\nCzy chcesz kontynuować?"; + +"You cannot remove nor unsubscribe from your personal calendar." += "Nie możesz usunąć ani zrezygnować z subskrypcji kalendarza osobistego."; +"Are you sure you want to delete the calendar \"%{0}\"?" += "Czy na pewno chcesz usunąć kalendarz \"%{0}\"?"; + +/* Legend */ +"Participant" = "Uczestnik"; +"Optional Participant" = "Uczestnik opcjonalny"; +"Non Participant" = "Nie uczestniczy"; +"Chair" = "Prowadzący"; + +"Needs action" = "Wymaga akcji"; +"Accepted" = "Zaakceptowane"; +"Declined" = "Odmówione"; +"Tentative" = "Niepewne"; + +"Free" = "Wolny"; +"Busy" = "Zajęty"; +"Maybe busy" = "Być może zajęty"; +"No free-busy information" = "Brak informacji wolny-zajęty"; + +/* FreeBusy panel buttons and labels */ +"Suggest time slot:" = "Proponuj przedział czasowy:"; +"Zoom:" = "Powiększenie:"; +"Previous slot" = "Poprzedni przedział"; +"Next slot" = "Następny przedział"; +"Previous hour" = "Poprzednia godzina"; +"Next hour" = "Nastęna godzina"; +"Work days only" = "Tylko dni robocze"; +"The whole day" = "Cały dzień"; +"Between" = "Pomiędzy"; +"and" = "i"; + +"A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" += "Istnieje konflikt czasowy z jednym lub większą liczbą uczestników.\nCzy chcesz zachować obecne ustawienia mimo wszystko?"; + +/* apt list */ +"Title" = "Tytuł"; +"Start" = "Początek"; +"End" = "Koniec"; +"Location" = "Miejsce"; +"(Private Event)" = "(Wydarzenie prywatne)"; + +vevent_class0 = "(Wydarzenie publiczne)"; +vevent_class1 = "(Wydarzenie prywatne)"; +vevent_class2 = "(Wydarzenie poufne)"; + +vtodo_class0 = "(Zadanie publiczne)"; +vtodo_class1 = "(Zadanie prywatne)"; +vtodo_class2 = "(Zadanie poufne)"; + +"closeThisWindowMessage" = "Dziękuję! Możesz teraz zamknąć to okno lub wyświetlić twoje "; +"Multicolumn Day View" = "Wielokolumnowy widok dnia"; + +"Please select an event or a task." = "Zaznacz wydarzenie lub zadanie."; + +"editRepeatingItem" = "Element który edytujesz ma powtórzenia. Czy chcesz edytować wszystkie czy tylko pojedyncze wystąpienie?"; +"button_thisOccurrenceOnly" = "Tylko to wystąpienie"; +"button_allOccurrences" = "Wszystkie wystąpienia"; + +/* Properties dialog */ +"Name:" = "Nazwa:"; +"Color:" = "Kolor:"; + +"Include in free-busy" = "Uwzględnij w wolny-zajęty"; + +"Synchronization" = "Synchronizacja"; +"Synchronize" = "Synchronizuj"; +"Tag:" = "Znacznik:"; + +"Display" = "Pokaż"; +"Show alarms" = "Pokaż alarmy"; +"Show tasks" = "Pokaż zadania"; + +"Links to this Calendar" = "Odnośniki do tego kalendarza"; +"Authenticated User Access" = "Dostęp dla zalogowanych użytkowników"; +"CalDAV URL" = "CalDAV URL"; +"WebDAV ICS URL" = "WebDAV ICS URL"; +"WebDAV XML URL" = "WebDAV XML URL"; + +/* Error messages */ +"dayFieldInvalid" = "W polu Dni wprowadź liczbę równą lub większą od 1."; +"weekFieldInvalid" = "W polu Tygodnie wprowadź liczbę równą lub większą od 1."; +"monthFieldInvalid" = "W polu Miesiące wprowadź liczbę równą lub większą od 1."; +"monthDayFieldInvalid" = "W polu Dzień miesiąca wprowadź liczbę równą lub większą od 1."; +"yearFieldInvalid" = "W polu Lata wprowadź liczbę równą lub większą od 1."; +"appointmentFieldInvalid" = "W polu Spotkania wprowadź liczbę równą lub większą od 1."; +"recurrenceUnsupported" = "Ten typ powtórzeń obecnie nie jest obsługiwany."; +"tagNotDefined" = "Musisz podać znacznik, jeśli chcesz synchronizować ten kalendarz."; +"tagAlreadyExists" = "Podany znacznik jest już skojarzony z innym kalendarzem."; +"tagHasChanged" = "Jeśli zmienisz znacznik kalendarza, musisz przeładować dane na swoim urządzeniu mobilnym.\nKontynuować?"; +"tagWasAdded" = "Jeśli chesz synchronizować ten kalendarz, będziesz musiał(a) przeładować dane na swoim urządzeniu mobilnym.\nKontynuować?"; +"tagWasRemoved" = "Jeśli usuniesz ten kalendarz z synchronizacji, będziesz musiał(a) przeładować dane na swoim urządzeniu mobilnym.\nKontynuować?"; + +"Open Task..." = "Otwórz zadanie..."; +"Mark Completed" = "Oznacz jako ukończone"; +"Delete Task" = "Usuń zadanie"; +"Delete Event" = "Usuń wydarzenie"; + +"Subscribe to a web calendar..." = "Subskrybuj kalendarz..."; +"URL of the Calendar" = "URL do kalendarza"; +"Web Calendar" = "Kalendarz Web"; +"Reload on login" = "Przeładuj przy logowaniu"; diff --git a/UI/Templates/SOGoACLPolishAdditionAdvisory.wox b/UI/Templates/SOGoACLPolishAdditionAdvisory.wox new file mode 100644 index 000000000..5c7ea19f5 --- /dev/null +++ b/UI/Templates/SOGoACLPolishAdditionAdvisory.wox @@ -0,0 +1,28 @@ + + + + + + dodał(a) ciebie + + + + dodał(a) ciebie do listy dostępu do jego(jej) foldera . + + + + diff --git a/UI/Templates/SOGoACLPolishModificationAdvisory.wox b/UI/Templates/SOGoACLPolishModificationAdvisory.wox new file mode 100644 index 000000000..1ea014e79 --- /dev/null +++ b/UI/Templates/SOGoACLPolishModificationAdvisory.wox @@ -0,0 +1,28 @@ + + + + + + zmodyfikował(a) uprawnienia dostępu + + + + zmodyfikował(a) twoje uprawnienia do jego(jej) foldera . + + + + diff --git a/UI/Templates/SOGoACLPolishRemovalAdvisory.wox b/UI/Templates/SOGoACLPolishRemovalAdvisory.wox new file mode 100644 index 000000000..57dc944d4 --- /dev/null +++ b/UI/Templates/SOGoACLPolishRemovalAdvisory.wox @@ -0,0 +1,26 @@ + + + + + + usunął(ęła) cię + + + + usunął(ęła) cię z listy dostępu do jego(jej) foldera . + + + + diff --git a/UI/Templates/SOGoFolderPolishAdditionAdvisory.wox b/UI/Templates/SOGoFolderPolishAdditionAdvisory.wox new file mode 100644 index 000000000..0b8a73991 --- /dev/null +++ b/UI/Templates/SOGoFolderPolishAdditionAdvisory.wox @@ -0,0 +1,23 @@ + + + + + + został utworzony + + + +Folder został utworzony. + + + + diff --git a/UI/Templates/SOGoFolderPolishRemovalAdvisory.wox b/UI/Templates/SOGoFolderPolishRemovalAdvisory.wox new file mode 100644 index 000000000..c517f6602 --- /dev/null +++ b/UI/Templates/SOGoFolderPolishRemovalAdvisory.wox @@ -0,0 +1,23 @@ + + + + + + został usunięty + + + +Folder został usunięty. + + + + From 393805d3610ea1caf82698dacba679028e491430 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Tue, 3 Aug 2010 16:19:07 +0000 Subject: [PATCH 04/12] See ChangeLog Monotone-Parent: c9c9702c0e5884249b52a03e2a48d4fd554c6217 Monotone-Revision: 7d8a4bb1274aeaf7155bc47f5fc5b5afe1f90d14 Monotone-Author: ludovic@Sophos.ca Monotone-Date: 2010-08-03T16:19:07 --- ChangeLog | 2 + .../SOGoMailUkrainianForward.html | 13 +++ .../SOGoMailUkrainianForward.wod | 79 +++++++++++++++++++ UI/Common/Ukrainian.lproj/Localizable.strings | 6 +- .../Ukrainian.lproj/Localizable.strings | 3 - .../Ukrainian.lproj/Localizable.strings | 1 - .../Ukrainian.lproj/Localizable.strings | 3 +- .../Localizable.strings | 16 ++-- UI/MainUI/Czech.lproj/Localizable.strings | 6 +- UI/MainUI/Dutch.lproj/Localizable.strings | 6 +- UI/MainUI/English.lproj/Localizable.strings | 6 +- UI/MainUI/French.lproj/Localizable.strings | 6 +- UI/MainUI/German.lproj/Localizable.strings | 6 +- UI/MainUI/Hungarian.lproj/Localizable.strings | 6 +- UI/MainUI/Italian.lproj/Localizable.strings | 6 +- UI/MainUI/Russian.lproj/Localizable.strings | 6 +- UI/MainUI/Spanish.lproj/Localizable.strings | 6 +- UI/MainUI/Swedish.lproj/Localizable.strings | 6 +- UI/MainUI/Welsh.lproj/Localizable.strings | 6 +- .../Localizable.strings | 2 +- .../Czech.lproj/Localizable.strings | 8 +- .../Dutch.lproj/Localizable.strings | 2 +- .../English.lproj/Localizable.strings | 2 +- .../French.lproj/Localizable.strings | 2 +- .../German.lproj/Localizable.strings | 2 +- .../Hungarian.lproj/Localizable.strings | 2 +- .../Italian.lproj/Localizable.strings | 2 +- .../Russian.lproj/Localizable.strings | 2 +- .../Spanish.lproj/Localizable.strings | 2 +- .../Swedish.lproj/Localizable.strings | 2 +- .../Welsh.lproj/Localizable.strings | 2 +- .../Ukrainian.lproj/Localizable.strings | 10 +-- 32 files changed, 153 insertions(+), 76 deletions(-) create mode 100644 SoObjects/Mailer/SOGoMailUkrainianForward.wo/SOGoMailUkrainianForward.wo/SOGoMailUkrainianForward.html create mode 100644 SoObjects/Mailer/SOGoMailUkrainianForward.wo/SOGoMailUkrainianForward.wo/SOGoMailUkrainianForward.wod diff --git a/ChangeLog b/ChangeLog index f9379420d..daeccbfa7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,8 @@ * Applied patch for bug #690 * Applied patch for bug #703 * Applied patch for bug #714 + * Updated Ukrainian translation - patch from + Oleksa Stasevych 2010-07-28 Francis Lachapelle diff --git a/SoObjects/Mailer/SOGoMailUkrainianForward.wo/SOGoMailUkrainianForward.wo/SOGoMailUkrainianForward.html b/SoObjects/Mailer/SOGoMailUkrainianForward.wo/SOGoMailUkrainianForward.wo/SOGoMailUkrainianForward.html new file mode 100644 index 000000000..efeb00aed --- /dev/null +++ b/SoObjects/Mailer/SOGoMailUkrainianForward.wo/SOGoMailUkrainianForward.wo/SOGoMailUkrainianForward.html @@ -0,0 +1,13 @@ +<#newLine/> +<#newLine/> +<#newLine/> +-------- Початкове повідомлення --------<#newLine/> +Тема: <#subject/><#newLine/> +Дата: <#date/><#newLine/> +Від: <#from/><#newLine/> +<#hasReplyTo>Відповісти: <#replyTo/><#hasOrganization>Організація: <#organization/>Кому: <#to/><#newLine/> +<#hasCc>Копія: <#cc/><#hasNewsGroups>Групи новин: <#newsgroups/><#hasReferences>Посилання: <#references/><#newLine/> +<#newLine/> +<#messageBody/><#newLine/> +<#newLine/> +<#signature/><#newLine/> diff --git a/SoObjects/Mailer/SOGoMailUkrainianForward.wo/SOGoMailUkrainianForward.wo/SOGoMailUkrainianForward.wod b/SoObjects/Mailer/SOGoMailUkrainianForward.wo/SOGoMailUkrainianForward.wo/SOGoMailUkrainianForward.wod new file mode 100644 index 000000000..7787fa18e --- /dev/null +++ b/SoObjects/Mailer/SOGoMailUkrainianForward.wo/SOGoMailUkrainianForward.wo/SOGoMailUkrainianForward.wod @@ -0,0 +1,79 @@ +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; +} diff --git a/UI/Common/Ukrainian.lproj/Localizable.strings b/UI/Common/Ukrainian.lproj/Localizable.strings index 663cb14b1..7ac70dacb 100644 --- a/UI/Common/Ukrainian.lproj/Localizable.strings +++ b/UI/Common/Ukrainian.lproj/Localizable.strings @@ -28,13 +28,9 @@ "Add..." = "Додати..."; "Remove" = "Вилучити"; +"Default Roles" = "Контроль доступу для всіх"; "Subscribe User" = "Підписати користувача"; -"Any Authenticated User" = "Any Authenticated User"; -"Public Access" = "Public Access"; -"Any user not listed above" = "Any user not listed above"; -"Anybody accessing this resource from the public area" = "Anybody accessing this resource from the public area"; - "Sorry, the user rights can not be configured for that object." = "Вибачте, для цього об’єкту неможливо налаштувати права доступу."; /* generic.js */ diff --git a/UI/Contacts/Ukrainian.lproj/Localizable.strings b/UI/Contacts/Ukrainian.lproj/Localizable.strings index 65cca6252..708d33f20 100644 --- a/UI/Contacts/Ukrainian.lproj/Localizable.strings +++ b/UI/Contacts/Ukrainian.lproj/Localizable.strings @@ -2,7 +2,6 @@ "Contact" = "Контакт"; "Address" = "Адреса"; -"Photos" = "Photos"; "Other" = "Інше"; "Address Books" = "Адресні книги"; @@ -50,7 +49,6 @@ "Edit the selected card" = "Зміна вибраної картки"; "Send a mail message" = "Створення повідомлення"; "Delete selected card or address book" = "Вилучення вибраної картки або адресної книги"; -"Reload all contacts" = "Reload all contacts"; "htmlMailFormat_UNKNOWN" = "Невідомо"; "htmlMailFormat_FALSE" = "Звичайний текст"; @@ -113,7 +111,6 @@ "Note:" = "Примітки:"; "Timezone:" = "Часова зона:"; "Birthday:" = "День народження:"; -"Birthday (yyyy-mm-dd):" = "День народження (yyyy-mm-dd):"; "Freebusy URL:" = "Freebusy URL:"; "Add as..." = "Додати як..."; diff --git a/UI/MailPartViewers/Ukrainian.lproj/Localizable.strings b/UI/MailPartViewers/Ukrainian.lproj/Localizable.strings index 8ac165cc5..5f8f08be3 100644 --- a/UI/MailPartViewers/Ukrainian.lproj/Localizable.strings +++ b/UI/MailPartViewers/Ukrainian.lproj/Localizable.strings @@ -26,7 +26,6 @@ Tentative = "попередьно погодитись"; "Delegate ..." = "Делегуват ..."; "Delegated to" = "Делегувати"; "Update status in calendar" = "Поновити статус в календарі"; -"delegated from" = "delegated from"; reply_info_no_attendee = "Ви отримали відповідь на запланований захід, але відправник повідомлення відсутній серед запрошених."; reply_info = "Це відповідь на Ваше запрошення взяти участь у заході."; diff --git a/UI/MailerUI/Ukrainian.lproj/Localizable.strings b/UI/MailerUI/Ukrainian.lproj/Localizable.strings index 18795da8a..96264d1ee 100644 --- a/UI/MailerUI/Ukrainian.lproj/Localizable.strings +++ b/UI/MailerUI/Ukrainian.lproj/Localizable.strings @@ -45,7 +45,7 @@ "Home" = "Початок"; "Calendar" = "Календар"; -"Addressbook" = "Адресна книга"; +"Addressbook" = "Адресна"; "Mail" = "Пошта"; "Right Administration" = "Права доступу"; @@ -136,7 +136,6 @@ "View" = "Перегляд"; "All" = "Всі"; "Unread" = "Непрочитані"; -"No message" = "No message"; "messages" = "повідомлення"; "first" = "перша"; diff --git a/UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings b/UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings index 8e7192d66..3e4e9fd83 100644 --- a/UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings @@ -28,16 +28,16 @@ "Russian" = "Русский"; "Spanish" = "Español"; "Swedish" = "Svenska"; +"Ukrainian" = "Українська"; "Welsh" = "Cymraeg"; -"Polish" = "Polski"; "About" = "Sobre"; -"AboutBox" = "SOGo is a groupware server built around OpenGroupware.org (OGo) and the SOPE application server. It focuses on scalability.

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

-Copyright © 2006-2010 Inverse inc.
-Copyright © 2002-2005 SKYRIX Software AG

-This software are distributed under the GNU GPL version 2.
-Parts of this software are distributed under the GNU LGPL version 2.

+"AboutBox" = "SOGo is a groupware server built around OpenGroupware.org (OGo) and the SOPE application server. It focuses on scalability.

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

+Copyright © 2006-2009 Inverse inc.
+Copyright © 2002-2005 SKYRIX Software AG

+This software are distributed under the GNU GPL version 2.
+Parts of this software 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."; "Your account was locked due to too many failed attempts." = "Your account was locked due to too many failed attempts."; @@ -68,4 +68,4 @@ This is free software: you are free to change and redistribute it. There is NO W "New password:" = "New password:"; "Confirmation:" = "Confirmation:"; "Cancel" = "Cancel"; -"Please wait..." = "Please wait..."; \ No newline at end of file +"Please wait..." = "Please wait..."; diff --git a/UI/MainUI/Czech.lproj/Localizable.strings b/UI/MainUI/Czech.lproj/Localizable.strings index 48c3a0f14..aacbed433 100644 --- a/UI/MainUI/Czech.lproj/Localizable.strings +++ b/UI/MainUI/Czech.lproj/Localizable.strings @@ -28,13 +28,13 @@ "Russian" = "Русский"; "Spanish" = "Español"; "Swedish" = "Svenska"; +"Ukrainian" = "Українська"; "Welsh" = "Cymraeg"; -"Polish" = "Polski"; "About" = "O"; "AboutBox" = "SOGo is a groupware server built around OpenGroupware.org (OGo) and the SOPE application server. It focuses on scalability.

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

-Copyright (c) 2006-2010 Inverse inc.
+Copyright (c) 2006-2009 Inverse inc.
Copyright (c) 2002-2005 SKYRIX Software AG

This software are distributed under the GNU GPL version 2.
Parts of this software are distributed under the GNU LGPL version 2.

@@ -68,4 +68,4 @@ This is free software: you are free to change and redistribute it. There is NO W "New password:" = "Nové heslo:"; "Confirmation:" = "Potvrzení:"; "Cancel" = "Odvolat"; -"Please wait..." = "Prosím čekejte..."; \ No newline at end of file +"Please wait..." = "Prosím čekejte..."; diff --git a/UI/MainUI/Dutch.lproj/Localizable.strings b/UI/MainUI/Dutch.lproj/Localizable.strings index d8c723e78..8c38cacf9 100644 --- a/UI/MainUI/Dutch.lproj/Localizable.strings +++ b/UI/MainUI/Dutch.lproj/Localizable.strings @@ -28,13 +28,13 @@ "Russian" = "Русский"; "Spanish" = "Español"; "Swedish" = "Svenska"; +"Ukrainian" = "Українська"; "Welsh" = "Cymraeg"; -"Polish" = "Polski"; "About" = "About"; "AboutBox" = "SOGo is a groupware server built around OpenGroupware.org (OGo) and the SOPE application server. It focuses on scalability.

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

-Copyright © 2006-2010 Inverse inc.
+Copyright © 2006-2009 Inverse inc.
Copyright © 2002-2005 SKYRIX Software AG

This software are distributed under the GNU GPL version 2.
Parts of this software are distributed under the GNU LGPL version 2.

@@ -68,4 +68,4 @@ This is free software: you are free to change and redistribute it. There is NO W "New password:" = "New password:"; "Confirmation:" = "Confirmation:"; "Cancel" = "Cancel"; -"Please wait..." = "Please wait..."; \ No newline at end of file +"Please wait..." = "Please wait..."; diff --git a/UI/MainUI/English.lproj/Localizable.strings b/UI/MainUI/English.lproj/Localizable.strings index 40097e8a6..4ee96f770 100644 --- a/UI/MainUI/English.lproj/Localizable.strings +++ b/UI/MainUI/English.lproj/Localizable.strings @@ -28,13 +28,13 @@ "Russian" = "Русский"; "Spanish" = "Español"; "Swedish" = "Svenska"; +"Ukrainian" = "Українська"; "Welsh" = "Cymraeg"; -"Polish" = "Polski"; "About" = "About"; "AboutBox" = "SOGo is a groupware server built around OpenGroupware.org (OGo) and the SOPE application server. It focuses on scalability.

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

-Copyright © 2006-2010 Inverse inc.
+Copyright © 2006-2009 Inverse inc.
Copyright © 2002-2005 SKYRIX Software AG

This software are distributed under the GNU GPL version 2.
Parts of this software are distributed under the GNU LGPL version 2.

@@ -68,4 +68,4 @@ This is free software: you are free to change and redistribute it. There is NO W "New password:" = "New password:"; "Confirmation:" = "Confirmation:"; "Cancel" = "Cancel"; -"Please wait..." = "Please wait..."; \ No newline at end of file +"Please wait..." = "Please wait..."; diff --git a/UI/MainUI/French.lproj/Localizable.strings b/UI/MainUI/French.lproj/Localizable.strings index 6812c3162..4efc928e7 100644 --- a/UI/MainUI/French.lproj/Localizable.strings +++ b/UI/MainUI/French.lproj/Localizable.strings @@ -28,13 +28,13 @@ "Russian" = "Русский"; "Spanish" = "Español"; "Swedish" = "Svenska"; +"Ukrainian" = "Українська"; "Welsh" = "Cymraeg"; -"Polish" = "Polski"; "About" = "À propos"; "AboutBox" = "SOGo is a groupware server built around OpenGroupware.org (OGo) and the SOPE application server. It focuses on scalability.

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

-Copyright © 2006-2010 Inverse inc.
+Copyright © 2006-2009 Inverse inc.
Copyright © 2002-2005 SKYRIX Software AG

This software are distributed under the GNU GPL version 2.
Parts of this software are distributed under the GNU LGPL version 2.

@@ -68,4 +68,4 @@ This is free software: you are free to change and redistribute it. There is NO W "New password:" = "Nouveau mot de passe:"; "Confirmation:" = "Confirmation:"; "Cancel" = "Annuler"; -"Please wait..." = "Veuillez patienter..."; \ No newline at end of file +"Please wait..." = "Veuillez patienter..."; diff --git a/UI/MainUI/German.lproj/Localizable.strings b/UI/MainUI/German.lproj/Localizable.strings index 57148ae88..0c8bce8b4 100644 --- a/UI/MainUI/German.lproj/Localizable.strings +++ b/UI/MainUI/German.lproj/Localizable.strings @@ -28,13 +28,13 @@ "Russian" = "Русский"; "Spanish" = "Español"; "Swedish" = "Svenska"; +"Ukrainian" = "Українська"; "Welsh" = "Cymraeg"; -"Polish" = "Polski"; "About" = "About"; "AboutBox" = "SOGo is a groupware server built around OpenGroupware.org (OGo) and the SOPE application server. It focuses on scalability.

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

-Copyright © 2006-2010 Inverse inc.
+Copyright © 2006-2009 Inverse inc.
Copyright © 2002-2005 SKYRIX Software AG

This software are distributed under the GNU GPL version 2.
Parts of this software are distributed under the GNU LGPL version 2.

@@ -68,4 +68,4 @@ This is free software: you are free to change and redistribute it. There is NO W "New password:" = "Neues Passwort:"; "Confirmation:" = "Bestätigung:"; "Cancel" = "Abbrechen"; -"Please wait..." = "Bitte warten..."; \ No newline at end of file +"Please wait..." = "Bitte warten..."; diff --git a/UI/MainUI/Hungarian.lproj/Localizable.strings b/UI/MainUI/Hungarian.lproj/Localizable.strings index 2a2599e4b..e3620c5d0 100644 --- a/UI/MainUI/Hungarian.lproj/Localizable.strings +++ b/UI/MainUI/Hungarian.lproj/Localizable.strings @@ -28,13 +28,13 @@ "Russian" = "Русский"; "Spanish" = "Español"; "Swedish" = "Svenska"; +"Ukrainian" = "Українська"; "Welsh" = "Cymraeg"; -"Polish" = "Polski"; "About" = "Névjegy"; "AboutBox" = "A SOGo az OpenGroupware.org (OGo) és a SOPE alkalmazás szerverre épülő csoportmunka szerver, amely a skálázhatóságra összpontosít.

A SOGo egy AJAX alapú webes felültet biztosít, továbbá több desktop kliens programot is támogat olyan szabványos protokollokon keresztül, mint a CalDAV, a CardDAV és a GroupDAV.

-Copyright © 2006-2010 Inverse inc.
+Copyright © 2006-2009 Inverse inc.
Copyright © 2002-2005 SKYRIX Software AG

A szoftver a GNU GPL version 2. licensz alapján kerül terjesztésre
A szoftver egyes részei a GNU LGPL version 2. licensz alapján kerülnek terjesztésre.

@@ -68,4 +68,4 @@ Ez egy ingyenes szoftver: ön jogosult változtatni és továbbterjeszteni. Ninc "New password:" = "New password:"; "Confirmation:" = "Confirmation:"; "Cancel" = "Cancel"; -"Please wait..." = "Please wait..."; \ No newline at end of file +"Please wait..." = "Please wait..."; diff --git a/UI/MainUI/Italian.lproj/Localizable.strings b/UI/MainUI/Italian.lproj/Localizable.strings index f7b23b3c1..cc22340f0 100644 --- a/UI/MainUI/Italian.lproj/Localizable.strings +++ b/UI/MainUI/Italian.lproj/Localizable.strings @@ -28,13 +28,13 @@ "Russian" = "Русский"; "Spanish" = "Español"; "Swedish" = "Svenska"; +"Ukrainian" = "Українська"; "Welsh" = "Cymraeg"; -"Polish" = "Polski"; "About" = "About"; "AboutBox" = "SOGo is a groupware server built around OpenGroupware.org (OGo) and the SOPE application server. It focuses on scalability.

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

-Copyright © 2006-2010 Inverse inc.
+Copyright © 2006-2009 Inverse inc.
Copyright © 2002-2005 SKYRIX Software AG

This software are distributed under the GNU GPL version 2.
Parts of this software are distributed under the GNU LGPL version 2.

@@ -68,4 +68,4 @@ This is free software: you are free to change and redistribute it. There is NO W "New password:" = "New password:"; "Confirmation:" = "Confirmation:"; "Cancel" = "Cancel"; -"Please wait..." = "Please wait..."; \ No newline at end of file +"Please wait..." = "Please wait..."; diff --git a/UI/MainUI/Russian.lproj/Localizable.strings b/UI/MainUI/Russian.lproj/Localizable.strings index 0cb5826ab..6a2e6d71c 100644 --- a/UI/MainUI/Russian.lproj/Localizable.strings +++ b/UI/MainUI/Russian.lproj/Localizable.strings @@ -28,13 +28,13 @@ "Russian" = "Русский"; "Spanish" = "Español"; "Swedish" = "Svenska"; +"Ukrainian" = "Українська"; "Welsh" = "Cymraeg"; -"Polish" = "Polski"; "About" = "О системе"; "AboutBox" = "SOGo is a groupware server built around OpenGroupware.org (OGo) and the SOPE application server. It focuses on scalability.

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

-Copyright © 2006-2010 Inverse inc.
+Copyright © 2006-2009 Inverse inc.
Copyright © 2002-2005 SKYRIX Software AG

This software are distributed under the GNU GPL version 2.
Parts of this software are distributed under the GNU LGPL version 2.

@@ -68,4 +68,4 @@ This is free software: you are free to change and redistribute it. There is NO W "New password:" = "New password:"; "Confirmation:" = "Confirmation:"; "Cancel" = "Cancel"; -"Please wait..." = "Please wait..."; \ No newline at end of file +"Please wait..." = "Please wait..."; diff --git a/UI/MainUI/Spanish.lproj/Localizable.strings b/UI/MainUI/Spanish.lproj/Localizable.strings index f957f5f01..7849a94c1 100644 --- a/UI/MainUI/Spanish.lproj/Localizable.strings +++ b/UI/MainUI/Spanish.lproj/Localizable.strings @@ -28,13 +28,13 @@ "Russian" = "Русский"; "Spanish" = "Español"; "Swedish" = "Svenska"; +"Ukrainian" = "Українська"; "Welsh" = "Cymraeg"; -"Polish" = "Polski"; "About" = "About"; "AboutBox" = "SOGo is a groupware server built around OpenGroupware.org (OGo) and the SOPE application server. It focuses on scalability.

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

-Copyright © 2006-2010 Inverse inc.
+Copyright © 2006-2009 Inverse inc.
Copyright © 2002-2005 SKYRIX Software AG

This software are distributed under the GNU GPL version 2.
Parts of this software are distributed under the GNU LGPL version 2.

@@ -68,4 +68,4 @@ This is free software: you are free to change and redistribute it. There is NO W "New password:" = "New password:"; "Confirmation:" = "Confirmation:"; "Cancel" = "Cancel"; -"Please wait..." = "Please wait..."; \ No newline at end of file +"Please wait..." = "Please wait..."; diff --git a/UI/MainUI/Swedish.lproj/Localizable.strings b/UI/MainUI/Swedish.lproj/Localizable.strings index 3e4f05192..7b3ac4c45 100644 --- a/UI/MainUI/Swedish.lproj/Localizable.strings +++ b/UI/MainUI/Swedish.lproj/Localizable.strings @@ -28,13 +28,13 @@ "Russian" = "Русский"; "Spanish" = "Español"; "Swedish" = "Svenska"; +"Ukrainian" = "Українська"; "Welsh" = "Cymraeg"; -"Polish" = "Polski"; "About" = "Om"; "AboutBox" = "SOGo is a groupware server built around OpenGroupware.org (OGo) and the SOPE application server. It focuses on scalability.

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

-Copyright © 2006-2010 Inverse inc.
+Copyright © 2006-2009 Inverse inc.
Copyright © 2002-2005 SKYRIX Software AG

This software are distributed under the GNU GPL version 2.
Parts of this software are distributed under the GNU LGPL version 2.

@@ -68,4 +68,4 @@ This is free software: you are free to change and redistribute it. There is NO W "New password:" = "New password:"; "Confirmation:" = "Confirmation:"; "Cancel" = "Cancel"; -"Please wait..." = "Please wait..."; \ No newline at end of file +"Please wait..." = "Please wait..."; diff --git a/UI/MainUI/Welsh.lproj/Localizable.strings b/UI/MainUI/Welsh.lproj/Localizable.strings index ad2f37bdb..48b28ebf0 100644 --- a/UI/MainUI/Welsh.lproj/Localizable.strings +++ b/UI/MainUI/Welsh.lproj/Localizable.strings @@ -28,13 +28,13 @@ "Russian" = "Русский"; "Spanish" = "Español"; "Swedish" = "Svenska"; +"Ukrainian" = "Українська"; "Welsh" = "Cymraeg"; -"Polish" = "Polski"; "About" = "About"; "AboutBox" = "SOGo is a groupware server built around OpenGroupware.org (OGo) and the SOPE application server. It focuses on scalability.

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

-Copyright © 2006-2010 Inverse inc.
+Copyright © 2006-2009 Inverse inc.
Copyright © 2002-2005 SKYRIX Software AG

This software are distributed under the GNU GPL version 2.
Parts of this software are distributed under the GNU LGPL version 2.

@@ -68,4 +68,4 @@ This is free software: you are free to change and redistribute it. There is NO W "New password:" = "New password:"; "Confirmation:" = "Confirmation:"; "Cancel" = "Cancel"; -"Please wait..." = "Please wait..."; \ No newline at end of file +"Please wait..." = "Please wait..."; diff --git a/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings b/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings index 9e3f6ea93..f771cad8d 100644 --- a/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings @@ -165,8 +165,8 @@ "Russian" = "Русский"; "Spanish" = "Español"; "Swedish" = "Svenska"; +"Ukrainian" = "Українська"; "Welsh" = "Cymraeg"; -"Polish" = "Polski"; /* Filters - UIxPreferences */ "Filters" = "Filters"; diff --git a/UI/PreferencesUI/Czech.lproj/Localizable.strings b/UI/PreferencesUI/Czech.lproj/Localizable.strings index ba8a24068..123d898c2 100644 --- a/UI/PreferencesUI/Czech.lproj/Localizable.strings +++ b/UI/PreferencesUI/Czech.lproj/Localizable.strings @@ -81,10 +81,10 @@ "Day end time :" = "Konec dne :"; "Day start time must be prior to day end time." = "Day start time must be prior to day end time."; "First week of year :" = "První týden roku :"; -"Enable reminders for Calendar items" = "Povolit připomínky pro položky v kalendáři"; +"Enable reminders for Calendar items" = "Povolit upomínky pro položky v kalendáři"; "Play a sound when a reminder comes due" -= "Přehrát zvuk s připomenutím"; -"Default reminder :" = "Výchozí připomenutí :"; += "Přehrát zvuk s upomínkou"; +"Default reminder :" = "Výchozí upomínka :"; "firstWeekOfYear_January1" = "Začíná 1. ledna"; "firstWeekOfYear_First4DayWeek" = "První 4-denní týden"; @@ -165,8 +165,8 @@ "Russian" = "Русский"; "Spanish" = "Español"; "Swedish" = "Svenska"; +"Ukrainian" = "Українська"; "Welsh" = "Cymraeg"; -"Polish" = "Polski"; /* Filters - UIxPreferences */ "Filters" = "Filters"; diff --git a/UI/PreferencesUI/Dutch.lproj/Localizable.strings b/UI/PreferencesUI/Dutch.lproj/Localizable.strings index 8c08509a3..c98f57615 100644 --- a/UI/PreferencesUI/Dutch.lproj/Localizable.strings +++ b/UI/PreferencesUI/Dutch.lproj/Localizable.strings @@ -165,8 +165,8 @@ "Russian" = "Русский"; "Spanish" = "Español"; "Swedish" = "Svenska"; +"Ukrainian" = "Українська"; "Welsh" = "Cymraeg"; -"Polish" = "Polski"; /* Filters - UIxPreferences */ "Filters" = "Filters"; diff --git a/UI/PreferencesUI/English.lproj/Localizable.strings b/UI/PreferencesUI/English.lproj/Localizable.strings index a98f18216..5487450a5 100644 --- a/UI/PreferencesUI/English.lproj/Localizable.strings +++ b/UI/PreferencesUI/English.lproj/Localizable.strings @@ -165,8 +165,8 @@ "Russian" = "Русский"; "Spanish" = "Español"; "Swedish" = "Svenska"; +"Ukrainian" = "Українська"; "Welsh" = "Cymraeg"; -"Polish" = "Polski"; /* Filters - UIxPreferences */ "Filters" = "Filters"; diff --git a/UI/PreferencesUI/French.lproj/Localizable.strings b/UI/PreferencesUI/French.lproj/Localizable.strings index fb3785625..c7dba8922 100644 --- a/UI/PreferencesUI/French.lproj/Localizable.strings +++ b/UI/PreferencesUI/French.lproj/Localizable.strings @@ -163,8 +163,8 @@ "Russian" = "Русский"; "Spanish" = "Español"; "Swedish" = "Svenska"; +"Ukrainian" = "Українська"; "Welsh" = "Cymraeg"; -"Polish" = "Polski"; /* Filters - UIxPreferences */ "Filters" = "Filtres"; diff --git a/UI/PreferencesUI/German.lproj/Localizable.strings b/UI/PreferencesUI/German.lproj/Localizable.strings index b901d183e..93e792eaf 100644 --- a/UI/PreferencesUI/German.lproj/Localizable.strings +++ b/UI/PreferencesUI/German.lproj/Localizable.strings @@ -165,8 +165,8 @@ "Russian" = "Русский"; "Spanish" = "Español"; "Swedish" = "Svenska"; +"Ukrainian" = "Українська"; "Welsh" = "Cymraeg"; -"Polish" = "Polski"; /* Filters - UIxPreferences */ "Filters" = "Filter"; diff --git a/UI/PreferencesUI/Hungarian.lproj/Localizable.strings b/UI/PreferencesUI/Hungarian.lproj/Localizable.strings index 92b820c23..65e422008 100644 --- a/UI/PreferencesUI/Hungarian.lproj/Localizable.strings +++ b/UI/PreferencesUI/Hungarian.lproj/Localizable.strings @@ -148,8 +148,8 @@ "BrazilianPortuguese" = "Português brasileiro"; "Russian" = "Русский"; "Spanish" = "Español"; +"Ukrainian" = "Українська"; "Welsh" = "Cymraeg"; -"Polish" = "Polski"; /* Filters - UIxPreferences */ "Filters" = "Filters"; diff --git a/UI/PreferencesUI/Italian.lproj/Localizable.strings b/UI/PreferencesUI/Italian.lproj/Localizable.strings index ebb1d13fb..53e40bd47 100644 --- a/UI/PreferencesUI/Italian.lproj/Localizable.strings +++ b/UI/PreferencesUI/Italian.lproj/Localizable.strings @@ -165,8 +165,8 @@ "Russian" = "Русский"; "Spanish" = "Español"; "Swedish" = "Svenska"; +"Ukrainian" = "Українська"; "Welsh" = "Cymraeg"; -"Polish" = "Polski"; /* Filters - UIxPreferences */ "Filters" = "Filters"; diff --git a/UI/PreferencesUI/Russian.lproj/Localizable.strings b/UI/PreferencesUI/Russian.lproj/Localizable.strings index bc06151de..fbd2410eb 100644 --- a/UI/PreferencesUI/Russian.lproj/Localizable.strings +++ b/UI/PreferencesUI/Russian.lproj/Localizable.strings @@ -170,8 +170,8 @@ "Russian" = "Русский"; "Spanish" = "Español"; "Swedish" = "Svenska"; +"Ukrainian" = "Українська"; "Welsh" = "Cymraeg"; -"Polish" = "Polski"; /* Filters - UIxPreferences */ "Filters" = "Filters"; diff --git a/UI/PreferencesUI/Spanish.lproj/Localizable.strings b/UI/PreferencesUI/Spanish.lproj/Localizable.strings index 858cad3fb..5d04e1a9f 100644 --- a/UI/PreferencesUI/Spanish.lproj/Localizable.strings +++ b/UI/PreferencesUI/Spanish.lproj/Localizable.strings @@ -167,8 +167,8 @@ "Russian" = "Русский"; "Spanish" = "Español"; "Swedish" = "Svenska"; +"Ukrainian" = "Українська"; "Welsh" = "Cymraeg"; -"Polish" = "Polski"; /* Filters - UIxPreferences */ "Filters" = "Filters"; diff --git a/UI/PreferencesUI/Swedish.lproj/Localizable.strings b/UI/PreferencesUI/Swedish.lproj/Localizable.strings index a518df9bb..bdd4f37ad 100644 --- a/UI/PreferencesUI/Swedish.lproj/Localizable.strings +++ b/UI/PreferencesUI/Swedish.lproj/Localizable.strings @@ -165,8 +165,8 @@ "Russian" = "Русский"; "Spanish" = "Español"; "Swedish" = "Svenska"; +"Ukrainian" = "Українська"; "Welsh" = "Cymraeg"; -"Polish" = "Polski"; /* Filters - UIxPreferences */ "Filters" = "Filters"; diff --git a/UI/PreferencesUI/Welsh.lproj/Localizable.strings b/UI/PreferencesUI/Welsh.lproj/Localizable.strings index d4666b79e..2c482ab56 100644 --- a/UI/PreferencesUI/Welsh.lproj/Localizable.strings +++ b/UI/PreferencesUI/Welsh.lproj/Localizable.strings @@ -165,8 +165,8 @@ "Russian" = "Русский"; "Spanish" = "Español"; "Swedish" = "Svenska"; +"Ukrainian" = "Українська"; "Welsh" = "Cymraeg"; -"Polish" = "Polski"; /* Filters - UIxPreferences */ "Filters" = "Filters"; diff --git a/UI/Scheduler/Ukrainian.lproj/Localizable.strings b/UI/Scheduler/Ukrainian.lproj/Localizable.strings index c4d9e2c6f..b09838aca 100644 --- a/UI/Scheduler/Ukrainian.lproj/Localizable.strings +++ b/UI/Scheduler/Ukrainian.lproj/Localizable.strings @@ -483,10 +483,7 @@ validate_endbeforestart = "Дата закінчення передує да "Next slot" = "Наступний діапазон"; "Previous hour" = "Попередня година"; "Next hour" = "Наступна година"; -"Work days only" = "Лише робочий час"; -"The whole day" = "The whole day"; -"Between" = "Between"; -"and" = "and"; +"Only office hours" = "Лише робочий час"; /* apt list */ "Title" = "Назва"; @@ -524,11 +521,6 @@ vtodo_class2 = "(Конфіденційне завдання)"; "Show alarms" = "Сповіщення"; "Show tasks" = "Завдання"; -"Links to this Calendar" = "Links to this Calendar"; -"CalDAV url" = "CalDAV url"; -"WebDAV ICS URL" = "WebDAV ICS URL"; -"WebDAV XML URL" = "WebDAV XML URL"; - /* Error messages */ "dayFieldInvalid" = "Будь ласка, зазначте числове значення в полі дні, що більше або рівно 1."; "weekFieldInvalid" = "Будь ласка, зазначте числове значення в полі тиждень(і), що більше або рівно 1."; From 71f4bf49fb32dd79d674b7636f7620ccf29b8f52 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Tue, 3 Aug 2010 18:06:12 +0000 Subject: [PATCH 05/12] Updated NEWS Monotone-Parent: 7d8a4bb1274aeaf7155bc47f5fc5b5afe1f90d14 Monotone-Revision: 24e454f441615d0319e5f67c544f95be83282adb Monotone-Author: ludovic@Sophos.ca Monotone-Date: 2010-08-03T18:06:12 --- NEWS | 4 +++- SoObjects/Appointments/SOGoAptMailNotification.m | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 25621b4d1..5899a341e 100644 --- a/NEWS +++ b/NEWS @@ -1,7 +1,9 @@ 1.3-201008xx (1.3.1) -------------------- - added migration scripts for Horde (email signatures and address books) - +- added Polish translation +- added crypt support to SQL sources +- updated Ukrainian translation 1.3-20100721 (1.3.0) -------------------- diff --git a/SoObjects/Appointments/SOGoAptMailNotification.m b/SoObjects/Appointments/SOGoAptMailNotification.m index ec52b25e7..fa7f3faa6 100644 --- a/SoObjects/Appointments/SOGoAptMailNotification.m +++ b/SoObjects/Appointments/SOGoAptMailNotification.m @@ -1,6 +1,6 @@ /* + Copyright (C) 2006-2010 Inverse inc. Copyright (C) 2000-2005 SKYRIX Software AG - Copyright (C) 2006-2009 Inverse inc. This file is part of SOGo. From dbe7f83a6723b9acd42838d6d3e10708a51a86d6 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Tue, 3 Aug 2010 23:37:12 +0000 Subject: [PATCH 06/12] Updated the documentation with regard to ticket #711 Monotone-Parent: 24e454f441615d0319e5f67c544f95be83282adb Monotone-Revision: a8ea4c892d2814713d84f3190401e5d4381c4701 Monotone-Author: ludovic@Sophos.ca Monotone-Date: 2010-08-03T23:37:12 --- Documentation/SOGo Installation Guide.odt | Bin 146636 -> 147210 bytes .../SOGo Mobile Devices Configuration.odt | Bin 21266 -> 20760 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Documentation/SOGo Installation Guide.odt b/Documentation/SOGo Installation Guide.odt index ac252874936fd9aefa9af8926fd154d641f5f974..0271fffd74f5f0ddaa3aa55a07ad5eae9ceb0da9 100644 GIT binary patch delta 37806 zcmagFV|1p$)-4*NW81cEJL%ZAosQqwPRB+k>Daby+kRv7_TJyQ_;b(sRkLcYQ48Z4 zqh_sV)Z{Bn)E5lmPdRW1bPy025D?Z5aDhZb8HoRk$;hC@Y4+S;@bLe`!ho>+hfNmy zFPpf|`hQ!o{|}G`<@{d^adIIj>i>gR{})ca0_FMdVlW+83mq8fSKfbTX$*y+1c2!d zL{JfQs9gZUGR1@mT;Z&;7pO?#nq83io(MT_=rErrgib8h>|Zz3P!$U2NZCRsC;v4W zi@Tic4Xs+{b=?3%sKLDZ#z1X+&sJeBSolN9g`bC!ymQ3s;vfW8WTcJ?nc&dr8UeNj zw%+uFXmBPHb`cEFyv%prtT)+^$Cep8pUc_gEWa5dH-0%&I}HSmWH8AoM^Q71&rz34 z^1XxIe-kZ07ose+rxJ(${Ar}hRg#V@XQFT!LFP>5;`|j`hN@5~_7cSPQw|!26oUL^ z3K>^$*osUwRO(%A^qLn9cA4|WS#?;r;tDX0CYY!zbjpO7MO_^1`J`nfKoW&HR)80 z3(+YlX$lHH0ux@x501x26b4wxVtk6&i~C$3Y5AQ82@~bX`lZAnl}&o}}X<44B>3G?sh&kO?Oz-FQjRe30gKygXV* z*Kt%w+9XI!;hXHR?mehhE+>OqDo{dt-dR{2DQ=FwF)7eyhz=ZXf0*pd%lc zFVm53p-LCnIBXkjBOjfgUdNrSpS>HNMKQL@)8BxwsM6nIpg4YoX8Y;N3@6IDj{j>a zh&{#n?VPnq)z?v86v^G~HE%x%KWaZrbBlMjMeuOYUV>*vS zpt8KT1Jm=9AH$b-Q`z?LX$PVi-tM^^CXHD^2UJC$hBQ4YGv zU_p25m{v=7B-Wz}r1IpEqL+0f0~(`S1vHcZK!k_+>#WZr41m|u*myzbWmKVRdw4`QWnbG1 zXy3N;&e!#(DH(WW=jYv`9PYd||EsFSPx>*^-P6 zyUkW7^xuY9HY8e|mWChmiVbVr(@5tQmfe==NZ>nJt(c+*ua?l~GFvop#4CjXcJVQw z(I~0yFbTzC5f!$QJnE{_!umUd5-ZSRP$X>m379`^i!G?9M-ZE%@;twRY}7(cQ-A0ET#< z$a#l5C43Pouvx6y!(lU<3Avs|cJO-q_=Ii0lSiR{zoZk$5ckuVf^={pIK{|>uuWzM zO;JHFu7OsQvQ1%9P`W3!0_3F(Nmm2nrx?(?wdE*bx5o@ApK!dvF%dJEc#6y_ zZl4F$8?GEse{WhIc(E5ymF(_EANC0BQ!O~fh0IP;Gpvvqxz@GP*fe8A(tAV9q?tiq z61Qv%Y-L-0(#=h8_#Ax<(VYM-=cimt=Nnt{Gk-lijg5&WIHJ`^QSB2*QSdy#ZRFlo4iosZWh&EmCt~sq7m>tFhz3y1* zUj&iv6dJnr`P*Q%-J*a;09(6w_rCBiQ=+r&-)n|uofoox1aSPRW)r`u8c zv!|60%1cV;Tbr7!xVo^eHPd8{O_@2HG}o~;QyI;3?jm0s4SWlCkPUe}YA>u!Wuz>l z3T`F#KbNa7znj$x3On37RXZNWbIxkNl|rtu(!>k$em!$)7+>1^0uTL^TOJTczF4L4noRN?#4a4FmfP`wiYU_0-R&wFeG`kUa<{#9-q2qXhbElA6k_GE zwwNS7+zewTN;^^@$~iE^aJRh4dg%Uiq`;S7-Hx|vG;G-%{!(&(zAIIGTKtSUQhK&c z5ZcN~7JBpYCcQ_@1?&#8A#r-nG^G1;C#rebu39Y+cWYVZ z>doP?irRLBicWdmZe_jgas16dlP>vjrN=qEyk%ksW`X2oBZgxi4t;=O9thn zr>lR~-YF?9D)Y~Dx+JUW?Rq@6Xq}6sFtF^_>Y{)@NW+hlChw4xYgGAx%!kN2Ie*TiH=7c z#{x{&i&9BoDZnRSHzSR18sw|F7p9DBSg(dQJ+vF~(s1u0*;(9bu0=}H2=6Lsr}m&| zp!>$K!PF=4k9psdzEx}Lo-PykfHF}IdDz7x2DRchOFzqJHo+L2!HB4|KPa4jS>Q7~ zoPwtD+l^8-R*N}1J$X+`M3@XnJyaYRwqWOT;UbQSA;3I@rmg)!GWbEfaquPM@yEeEf4z zDphFWHjU_*;#vwR0>x#wEulISW#*yEwBwQ*AFLWmOi$cfI+HulX$CS)G^o$T5 z0d9k$0MJW$l#pPCT{1T&RyfFKl0;V6`)Mw_ttikB@?exh<>4!1gUGW?7W*m>6H&?J-fLJbFisGNR3r5)^@7vAKEFrN3cw zYobF5L_Huot?CAWH;z8f{!;7m(kqu!hcyPx-sVpK7G)fQyPSQ}0}EV#r!*0~+d98% z0+>nJu{8Oupy)Ed@`Wy5$_O|+T1XJtWYbNyLR+)5#f zdCukETgLyT*gTH%0|y*$!M7qeZkxKxD{WPjMBkq$%42J4i@LbwgbJ2}*tj2Wl8J+I zj=q>lXp1%VPH{==;`zR^HQ}k9kuX~og{_!E3`QI`x2-AVzbo7NYIc^<#dAj#z`a(QcX5RG$d2X2* zxpwDNZq`1Z$qb*xUP)(T&HnS;(+_4+LIra67kT{4O3bCK1IhYbSqPJ8T|U_;w*Zc= zjj^y-Z~g1$iN@@gme-Fg?N6Cs75SP%lCq|J(rfcBTyj8^ zc>3+uuU(x>xzx#^!BFdVycDvw7C^%7jQ|@nPsqacJfs<45JhD{LP?(1fJTP+zYh;! z4qbN+51;~6w(P6sa+;Iqdrkd*#Wz9dS}RXGhnx<)6&-)hJnAWa#F`gaR@t1;29Tr_ zxZN45T#?$pN^x{ajDKKm0txQk9hJUP4t4dTUWa8hRv5>q+TGrc&(Gvs06!UX{5gso z(+)p$dHsAIA1HX%QWbZ!1^i^b>i#Sc)#P@Q$1l#GbySoxjSV%ry(KR#q?zq9p0qYC z-KU`s=m>t}4ma3$YZ^{@@orf7J}z1IG}upTI?_KbSxEaBWO+6@Td1F;Kp41GzTlY9 z`jkGEQ#~sJyHtJlj(|K(0KOUIgiW>p0dP+Ycw$pTwcPu>H;1@`Jf`UK278~8cTl5y|%Jwajx8Nkz}P@nWsK#_DJ@=LvqWeQV<0XQ!*4n!6rC+BGRk#lKl6S*1L7 z@l5+7?4!#aMZ5-!o)#vcIAYyq!i*dXtE^WQzQ(F3JLDsilfNnDC5wJkmj(SktJeO< z6RdG+>Q#>4CIMDWb`0~iRQyej6AHEbM)D%M$oEq)mPGsJhsHWlQgwOKzn3f(qhz@r zeBU*-4ENpD#8nBUiHyzOyHDtr^yNng^9Wuh;gLi{s;nXbT|Be&JL$Q+$%#N*#y1O_ zZ|ZI~V_YJ3sUx~P?eWsUne+fF!&$%qS#rw)g{?IV+); z=|JOv_PA|lm^JZznv30YKP;dfxP5(s`Q#e71B}1E*t+7=dIjr2+?5L;URStnllJnl zSW~<4+^*^G2ppZo=Y(Q0E=G0Br+cYvQAD`G|IJfaWtb*ts%jz{YaTQI{q? z#lul|{LkQj$1ndM_^1B^KW%^p_}@A>=%Q?18GOoIy`VboqI}AX^s0&MvM|}UHDOB3 zbhRd$C3(j?_LSsXN40{E!g)kFc+>oosasQ=dj<3EMa z95VQ4p+5Aa{`6eFYJlOa0KOlmUH|E$(`5SB9S2S8XYeyBPmP{7Sbp^c4F4y9waGyL8Wg8DMNwm>7bxT&vfu$p62gL@s7) zVr-NdR;lRQRd}hddT)DjD7Mqa_48!OTmeD!zp<8 zbQ&A%s`Bn5D5ojN!TY2q%rv4XpuhMDv(}JulH*@X03c5#{hkzWw$``GVj;Cn?q-)p z02?D0a5as{F2BZ#=A0|jsgI3urv3b+LLjEV>w4mHDY6l0KcA2#V`YGJ}zM9D=* zDx9!^hU+yz%eSU&txwmBT_D*#I5(`0zT^2L03L2gJ{ZXX88=Q$N}5eiuH$C2TOj>L z?2jK;9Yd;d*-|Z;x`F3GM*Ly^=gN0cHqU)%5xP}8Ah zS6-a3y_ZIvrq_vfYc-^8MqjF3uI+B^9#o_3YV()nz75^u_{#uf8)#g7a4xe{Oz%us z0Nr0Jrv$N`D+SRos|xRK&O7=Jp@n`Deh05(v%$@uSs;JkZwP|_ekkXA`Muq2jm)h3 zyzo_4<^CA?5L> zrw@NfX07l2bQKt^-P@>z2gYT*sQ&D$0qnd}b29Q{Yl~e$?vN7nGVS0V2fqaqUh6W7 z^G*iDhJK35d+JPgYRkP2CdBlfv`fRkg9~j#f5}I=C!H>K;ivAC{Im7 z;p9I+NnK*2vtb7#>0 zuiW?JS;W5GtQUZ-vExZd*WXSbE;u92My1QNNFdt-B;-ZOg_*u6vb?0J%j0j3!zSQ* z(U|o6_6@@w`%&OK_W?PVY1o(4uY3$)MXnQrMpUhjmZWevN)J6fJ`io%)Gl9WmCm8BFg}6tVfRp|6yAKZ_yml+@7u!@g&%*^zmeTGhUuh&QtKG92!tIgAlO@-rMBN@|K6ys&zIt&u{g5S$@QgWui zD!pu>q0=3ZVI7NYR)E0QBAL&9qxDIa%$6!tkO4!tND8wXm~9?CG-p4wh(;w>Tr{iTg(a)G+&a-E{V!&Ah{tTX5&J>~j7 z0vn*fD05zgsY`hy_@Z?z;-xI?Aa%i(WyK_kIrWwg@un>L=#LHNIp~(_*CP3k(hN-? zBw&ih|GghCHr;WZ`DDwC|LNoBF<3|#&T){~o<{jh9$w;^ zK%c5t91K3#0-vhTGluhkj%=eIU-Ipn9I%@K+c(Jp%DwW1;eR~Rk2(^R1cDr==X~V@ znmMCzAw015bE2L-fHu)Fh4t%iZyi#JG@e5RkMy za*4c|o(LVYwgk4YYlR2G5FZ%a01u(t$OMstY<4*+L64jq z1v$bo-~fcj2ob)DZMTzgHlV^V7x4WD?E8`7?SM}l?$g{5&`JSw>2n)Cv)c)Yn=TD{ zhF_+s$v(exYbl3IieC`uQ5+is{TD%oF`tDjeJ`VFb@kT57YcneeL;p#jLIV5k|DP)S6jGx~DaI0ejDkeV^5mgdya{!}0x0Y}OJ*K@ zjt7|c;#y;2a5qLVdnIMDySH)(7eZw8n9>)sv}H;)9V9_aDV9fyz=GKH<31 z@?S`iLi7wXIgKEfH8r+?_7X{&60HhAyA!YS+TVKrq2XmuqzCQ0>?ic}Z-jb#3&!5K z=L&f6KPOO#%^;QMuHCP70^~c3UGD~7RFExTqajGkxV}`GrX%gJ?&PUA>JH$jHxda$ zgAnHHcUD-@vp;f;QAiXrv^Cq=j{X+IU;%^kqQz&~7l)Ewo3q+q--B;4{DP8NzTIu@ z6YJg3vxM>~@eBEb)Z{vwv`db3E2Ee|0gn6y1f#M zu_fogEn{A~z2$!NH^-~R)S_>Lw@$Zqw%yawW&YolOxM3dv9Fu^|2p>U$7r*{16EAO zc^n$Yd4J_AKhRAVb>DIiJktlNv^h(D{yW~uW+=e5oG3}hAjm1G5W7~1VH*&ubM`-gqzJ%n42jAGdPigAIgexjYM&oEbyX@8r{wMuZ$!K zw(Q_)M2>hN?uncWw8UP{f_utBn#fVRJx7|24$W;?+d!R8xUNYQJ8E6}CT;dCw{*-f zj6^d;B^2g0o}PphsVEOvc?LnhZX=AMJ&VW>@ai`Y1EO9yV!(P@qN|OrCG<|bSfjS(hx{v0))56JVa$?#x-d#b>aR$sbx3i^$Q{s-8KXk8qD zI;Pm$F72_dL{<=QWT~i?z0r4J5)4GaEO)L4U_XiQuuU&ia*hnk?n1sMK;eT+WZ9G( z1rAv+U@o}yzEtv=3i;HD8DNwB;dX;L)CtZuzUU+?1NiuC=^@*~z^~utUbemIdD~2I ze8D~APUb7X!ud3lKbgPix#y4Gp(l2bX+4A6oLiZO?@^tD@%j2E#g^zca(qQ3q?w`j zPr(qc2xkQ!#wG%P5%uce)Onts=6LS@VE#1o5V}Ifrq9QF<&265@sfAyb)*bdCf!RM zi$tB70Vu=}UKH(zGLmbdF>1z8ozb<_kXR&cmWhNC42$R$Oq%YCN+9bKNe@Y#B486T zBF4Gt-CV{LBZU1E0N8myr>GtCi3^z2J&%+k(?kaUU3@z}oIkS_EpxfLa{%D-FKr|V z!PV)g?1IjGH*-#u@@2lB=1_}OM|`5!2W?4f08Z$86H#+**BgGUkf>hXW!+K!_P4YY zCk@U0C!EA8=}7|dM)W-$F~@U5;)Mji625N+*BN3_xbm5!i!WQ*)F!ZJ} z_J>sHtsw7V8D6ULCCBmkxzQX@RHU4GQE!PBOz;e+5K?S^kU7f-ez*OgC~=Zl!WOi9 z08e)so`Rg{I$iSY-H@k7#AgA%U&aSghzSCcP{=knGU8K6VwUp^SP}m(cr*h`_cQ;^X z-qDOf5lEbc!x&cDGFN2-jf9&nLiv7BvV6QhU1?-(Eov_q)x7!W>@t74+)mZhXiKFz zW=7Aw0u4+UQZHI<#138@Nt=! zb*I7@wC-vawpb^5H{nH-Ysek8dt~dj6wE1mGJ^oQU4>RJOzy zD_ON*Us^xrp;&KKX_@TZ5wfsc-Gob(b0tH|@XG~k>v!X(l^@TQn@G5mJ^a zfLGJ9OxKe9uS3Fd$zWlK}4Tfr5W#jfHGh)vGcI&-T0 zNS_>t^y^XH%H%J-gp3?8<2}8S8FKxV+KAG0hMcTjs7FqLsk371Ie+0T@FUvd#>P>$ zF|W97qSC$CXR~_6CP$J>-EAa|oGs~!g-U-Cr>|jB)h7uyh7C&$)PtDCO=QhfyEq>E z0}T!vYD+|HwpyV66j8_z(CS|_q)j(QQ*_gi@vB_on8E6PnT<#b<{ah{xHWn+uu*VA z+xPHCHFbIj(@VK%!J3fke4c`=pH5zn3DO4Z=tFkhF;RUA>Fk&tjz6V zPbl26!DF4>s2b`a;D{@1Ns@vj{JIU(^ecUU>j@ZOt*1iZ|Ms=DgjZDsm^=Oyr6wVzZ~9!G&(tsv!G+2qPSQKs~BAypgV5o_u0KlgEj53aLuKM|7hcK9*A6C z>YEoB6gT2*uHwP~0F}ao>J@-D5dNM6Xi!uo_SWI~FN-=9l21DZcu48zXAR~eN`ULd>2$2osG!FBd{UbC(x7m| zgXv8&XUzQR_Jb?b!@X;Wf@APTK&VD~4`$3pJ*;NZ<=E2+XH)$>>rE(S)6hI$^l zC&>U^QW;IDHq1FC427UpjKk#ueT3f%ILr2r&z=!y*348<@pNH zC>0^q>kfDUT6cu%G&-9ndknP98Oi-0L`8;jZCNP_6j7^1q2lSTEc4zhxK?s8+v*UZWxE%0^hV!SJC*XeuZ zxhb1RP43wH4}RzM!y+a;oIUZ%l4>6JDsbG)&R4$xaMO@vJd{-uZ0m%DuOLL~Hhx5k zk1YxLcQ1qJL6Z|34T9@HFROsoKZ%TIc{(Pc=_Q(#(!x!h+p*4zPjAXn+*)|wR#APlNNtl|$@`RTmmzs=A%ZH^!(Zx(NZPm-0VG4FW z{MU2M1`|`PfL84qDgW{mHzIhADORHwUlzay$fb7Pxv~R-iD{XM6V>Jj?R(9)n?Pe) z;nYwx5!L_D4b7FO3e~#_;N7rI5!vB#=I*V zhqSB;;@YGb2bHQSgnK{Oxr;?b5@Yrimehh}xK8F%n`E0gM{f@`ZXvZqGV_zryn`ub zD0#O{GWn+}Il}yO_<&3=Qzy?8_`$jn0BXNeAcJZO1AB6CF+%UOoTA7yeboDSy)^Tk zUY^zY`(dP!4UewEqqU$sllmet{B!iueM#~q7!>;rsv;tI*Q1G~H#DCXRgYf;$aUgqL0#7BPc;ft{6GaaA;Li*$oqB{>o^=F+|Ye88u9w6 z3n2yth$I_v+6M@C@hPLIg911@!@V(UsxPGB!MsqY66hk@$b7nE1YU9@mq#ADkhKb2 z?zB2fdNLl~o=N%D`mPwtWKE$sC}TY>G46)brQyoub>6DoISDtQ5PVr)OtYDna{mX5 zyq-=a#!m~}10zuii5rjR_;q?_g!V5b`e*c)6vxTghenxUJi)sYu}L)+Fe58RTHN?o zmueD+$J2Ew=dN%|xZqVpZ1-rEATm5jQ$u-9M4mioR12tDB1W`?GSP#;>y1GP1DG1+ z7@pqyhl372enoBoj_;c%IFTDrF-TZPCE{+dU+$apl8&eV?2a4)Ev#Qy^byRYiNU`K z?g(iY5&arvJi)VxtqrMj3q5HE{6GXg2zD?iHdF*V3c3#z)MW!J%~iq~B;*l(5AhPz zG83Hu=6BvV!B^f2k_cAN%l3n>Fu^GcIqY6!&%F0eAO# zv1Xq1q+_`NNy2@FEwAZQV{?e<#Fw2qcql?jj>-K>+@pvT{<)L&-dpc5GAjJOTvQ>- zly*`i^wdhQ42H*Ot;u95tQir}KvWS_To$xJt2)2V_c-CU;%C%J_~+<2Jcoo<1QEp( zdX0&w7iXK#`Az?Q>M`+3Y@+@Hc*^bGUCAk!RFvePn&r2t^C&CaEXGs z^juq-@f%V$L|Tlw)_9_;I6uw_W@V37N+Q+6BFg_DVmS#Cv|)`kCc43J5}arkuvJuY z{xrJ*QDSsPa|j9(Q@e)U5rN9$aTSPpaPX;W^u~_fddl>!TK*YrGKn#GdJ1%~>?W3c zFs~;CNVU~>^Y?R z+-dDFDjfLRy1W?fIaJ<4vKN}co6 zt*QCJus7o*~nno)s1{v^Xl3~#&4#`msSNuDl z*JmE%*{Y8RNlulXq}ZnqM=NrdnEIuKlu#l~$sV}w~_VF3~ zLcnmlauGObx-4HIq{P5Q{PtLosYcLEmoUK{z-J*yP@BHd4C71B|9YDyF#6t57~zBV z8TAlb#H=M=;Dh)s!ji0h7kS zS|QgX6s!c2Q%@iT!m*5@qdFhe}mcH zTod|Aj}1q>fd@p8I)*k9c(r0iYCweq)v>s@X_~;;Z7b^$pZc4MNIO`(OgrI(+PDM5 zNnDG3Pe+Xd{pAp5Cb%mjf-La?Ftu9DTq{zlGP0jLfcFhx>91=?!B5z&GQHgDNX{zx zdGMu-iNbPHnbr{-g|Pl{V@N3-Z1gRGMAX^CYRv?ez>^={eUA{oL(BN&!Ayzw@yHI~ zQl1j74025<``0}Euu^7`xYn^9AI1}Cx6JbsCSl}d*?W|XMFk;h31aX7bLy&lFj8p{ z-o^}JV0^>`sU{HOQ2ZUKgd>M+`r8gpMR#PZQ6ekwb5xi8a?J5xYP?Ri-~_E2q%+h? z&|iDU%lC2z7)O1f_|NvZG*TywkyKeQ2v3(b@OI*&)ZxK9*OajZb{7*0@$7ra}$cowB)#fL5 zEk*ZgCP14-5napzkkF|Pi{U(MKvelVyyAD=v=CSwaHdf#hO_|?IF}Vlj|}O}BGKzX z&#FU}{&pXkC`$uYs8@Q3HNa2Qpm%GX?<#XFUo4#TW+!gG@6tZfzx;x$8INa-HEJj&lA!I5=IspSO-@Gre^BN@A}-;M%J7uqpIZ~q3XaancD7H&f$MLjBFWxcb_r50(KI7BFh z!Atj*QrMGj_3Reg0-@PTp;z73Q`scUFNzq$$W_4|9`1#pJe|5xtX8p?Ui2=fF4I&w zn&V>wDCLFoG{-)kliyS<#??g$?@>JOcQ{d0E2;os16p@M7~)nC`(h{zctfl=AI@e3 z2pq$V(m(FtohI#zM2~fS%@*?fA3nmPPKmWXQ(u{7CHRo+ioCA{CXW%t5b-4x&{~>* z06Uc`S~DLg$?{(cs+b@>?6*Zgm+$+QUO04=i>=2=7f2~Tsf?)Z*Vrx+Yq1g`eVLRw z=dJ*KEt|tBDvE7piL)ba%FfZ*p`*b`GA^EI>7{a}B!d2$W01r}7QbDw}|lwzmhz|!j=9GWsh!&|G+bdGLIqu#&*2O z;7mY$LhE`A>Xj_0)*IH{S*+i(X7AXt5NHCdy9ik7#(8M|*7g4d4fXwf2zO{bZ@p3P zksZ(Ff;}j?SD+?^4c|syU}T(etN9MDa~M!9|F9{Npv)XNr6iC|yI)R|#pk!^u+jnz zems%o5<|rsec=a%>DhZM-7V=*O+7n%-x=N&ZNwJW!(R6bdT&Zr!D?&V4t>M#AzKPS zt3}OdIh~j+DtAYVOKPs9i6@!J9Tl4Wa>zrGG7jK9=~Pqki=PDib~5@(PU`iwGoW*a z4mPxpslgaQFR@+GnuYm%t(OHcup(4VRC}O^FhMGW0R1M%r}M;0q&&fzNDHf9B}+MF z7Uk^C4o1mC)~`8S6mjLSshxOCZ=warAGEH80eFF=66Wt@-wTtnrf~zY7p(A5G4KWX7M z6ji#XtPyM-OIL|A*wrboUg_v$CA2H8?1cv*%8Ok@1?*?>mOJplHL7njIMjb>g%zu{ zB8<&3&@0*qm+&{760n8?RLcOrazR}i`7zSAT#FQ1=e8i?E-i@(e9t9rNUr*S%ZNZU zR}MjTnnMhOPJ%;SlO5}TXu4oy$~~1Om8zt$BD>2Sug8T%mKA5C!QI-J$%(5gyGr${4oX};=WzyS3hZ-D|VAY@2Pnz%3x&`q4SzZ9dq~+D@Iu&*B z_BPWO*Gem}^=XCgeZlPa?edwPPPeQM;x1pzB`cYSq z;_g2O39!3!yr^vq@NpHpxdasg23@+Gq2cL?eq5JKjz140O)BRB#z0F6jtZ<%jG13E z1P~1qD4Te(FQXqv69P|=0^9&Y8la(Iy|L@gU8=TASyNumG+%(sE90$^2*d5fEoE2e zcR?7mr{Im}X|Zjk80+xu^k+KX2A_b^Y&~O~0F_v}`4}sL-=KK#e?Y-mO)s(8=yOBS z!+<35;-K08j}?P2!Qxj2U#7E*cv$gkVI z2%%LKnAh9k64J z*uhys!R_gueTFf#6vRZ%bl-{c`Zg~#zz0=UeL^3Zg+B`*wfXma;=K7BcyNUV6^VgB zMf-z?ws_6xgiIE#j}KW*RF0Evl^aurdaC5(QptNe+20ld^y#=Yzgp>IQfv6``wtPk2DP=U15eFiXk{NHyIGf3UW z9dHe>SVf~8+V;>`3_dwk5pKV%QO+p3x6SInohR@B45oDvzFnPO*KDkn5^%zY)3Q^b zB(=LkKRn**wR-VDQLsuf)9ZB=RSp&lX$mzgZn!vUhr&!xW%s9)Z&l_8iA)!-nT_~Q zM4PP*af(NZJK5EG(QQuU2N?APoi%0swVlozU zGmE$Z+S#6C2Dg&keIeooafICywp^yv_i?{Em$`d*Kc1uGukDYui1z$|@@!j<>@=$f zI#eHc#82lNNNMK>Xd7>m@7Z@-;TQM1mBz(i0fZVK4pZ<}&W8RWC$Do4l$PQEj0ye$ zTZ5OKvcc!}0=pHJFtE{SWSkU*k>8nAF&`5E^sIirU^D;f+zhrw_wGbOn!vymaJc4> z=Da^S6BWNuOUina^yJlUqy>%1xHqlz8X)+P2LRE(X^AEN`YvDQemo+S#=s|)_-9uc zx{W{fNR%8X>B+ijbd2rai6{1$$C|AK;|vsdXjDd^(c+en1V?N}VU+(p-k^Lw?uGsf zfQ^euSRZ&@rO{-&^$f(%k}J=b)HqC1OBywqCbcLUx8EE5<#qAbJ;nk45chpU;+x4P zQl>&Wgf2$D@;*4a3xM{S$Hqp%(#(uMji@6GW1^oVh~$Oy2M&6A9EXag8|tgY)^{RnGd@Hgh|{b%XS^^2h+M4e>_fDO%kdu`P(A-Qljwi5v-b%xDzA2wC?25j;^ zNxjbTDYD$4sfFo7gRM9dj&rze+;PygMZ*}#M1d(4E)34hua!cyCi zpMIPYH{dT|CuAgF0lMQ*YnYo3Nt(b?8C%rI3kqDdo$8`OQ=I#B9Jo4mr1BFc>E{7svj*Uq@y!eCCUCJKqcq;{s70P z>jx)xWPCgAA9vvT!I7MqJ)zCyc|(~v!P%-BIlN&B+(0MGo7UTO3V(3o3EN+H;~K)aRix!= zZ@RCOiB&Pmev{if<#nA0R%C_~bCOrNMX|q2ifngQE63DLlLi0$0Z?qR%i62)mX=== zhfLhBdX1;rs}N!Gcz=CJcW#>xrGa3dqD)BeMBPN$aqSQByE^qO;k4*bvR)2` zZ5ZS8Z(JJ<6QC;}5SaE^A7d&#Q#FKBL6D=ZKk?-nkNiQX!^^4+q_C|gi{@EP&eB#M z!B#0EuT)bC?SB0@v+0@AZpK-N@-T^}>4`M_k{73a0+?{#8?dfCSekA-d$y!E&L&@9 zRZEL?3w^r*08MXkr~az1CDVWGt_D5)PnniEl~u7X|GZ+nGtBfShgw9f$jQ-Ks@}y> zEpU0Y+$XFUQ1M38r&_~$+ETP{hooqYWu>$N%)M^lF<$q7A&V1eOb+)+or%VwM2WWx zvh_#K{L}w?!+B!?PfTc-qb^*210K1T8YC`+o|D6QK2$I_}?gaiGB`$$m^+w5cxW?0v1W3r&Au^B|RAXId`1L zDOpmWIpKZ`nbn+_)DO8ln@go0N|Sap%?1<>2)hU$#fg;Qp5&;p@+`3GHFq5G?7p~1 zqzxSXi0-QTfR!D{7&e04j;WJ>9y=L+vt9nR2;HLHWooYSofIuIrU#(NF+60vM>msu z02q|YZJL###LcQ;VPk{oY=cV2Hs5raWSxA>kWymn7V{! zr``SXbDp1s`L2%wJpxWmmHzt!M!S1!9^CYQ0jNM% zzbV_Os3uZzlJ#WMOUcF;@3DletRTxv$@52ntcmgqB4qBWp(qy{ zr>QA)iIkdViM@GB;w)_Slu4WgfmlbJ_x6Zk!<+KSvpj%f@=W$G3kB>lR)fT4=P!U= zUdgk6@0o#de1yKSwDuW+8i}Jo``}va3%vEm95v4FJy4wjEZjBrJvd|XoEdl{R8gmp z;XA@&t;}8dN}47?WSaCRj)T`u0V+6j>r3ReI;}>x)~u(N(~L^?WhQa{ zvVesIg&j!Ommk< z--O@oXH;te5hC^tR)CtSgJTJv7cdil|AUnbC$8Mk9t)?8@q4Y7-G@VgRdfT6E^H46 zXIfSi+ z0^6LYHJFlDc?$#P^mFaQD&w07SMfX9YN7rSmLEV4F!lTgD$9&N5g3y|;r2s+dw^Cs z{OW4;1ZQ9_H=5(E5XhwZm|WffZy8Z_X4~RRjbbH2siUo*KcMFtViVgx5^Urmzz=Al zxL#PHY8%uaoXairm-Toh3!gV_mi$ft7Ds4kPeN?PnJDWa9*{Zh)Me1(I)rZz22>PU zi@IFP;dBiP>k+1?=tkcos*^Q;Gqar9A8vl&_`ksYNIkNf9a1<8h>s;?Ald=(ZHs)5 zoSqS*R85~gVrygD(1u|+#tZ4NQfwK)bp|Z%#U0-mA_*q(8I8sV91jiIMgq>1H^A;f z^JiH=5|!zoeu?N&T{4A%yu!DRkonArj6B~CXR-!L+#dy~W+)Cf&=gpI7)B3-QOZ1c z0FMHDfM$#`=i)jgvV1lGc}#6B#HIPrho9ghI}C7 z3q-CXUwA9@yyTT1;FgYmjoSgVBODHLxUmrq#l;XHzz9L&u-@CJ~v87eB%)>K>u)qc}oy9pw)^tPrsvRV-pu(hY#30xSi8QIU=sy4w|tT6i@M zor_o-RnHrZVY9?dFkY2L*FL*_tUK)z&k-?qJio3dDzxw|CUYyq=ruIZJvE7B&jbZb>GXpqgL6E8_$Mc7>11=f3ZfATICo+q z`D#;G-3V+XQCrq07P?rnTHu3HgA$S>Vj~v_wi_bNlV&1_nMgLkJ&vACtGfkH%l#vT z7Y`|_3a%OPIB^o9sz(+tMOBtPbqU;vE^b{2EkwmpK>mg`Xl5HA9vJ2Kkdxf{G?d2=VW|DI;Bo z2e9H*klrJ@9?0$w6;4M$AJ;Pk1<`Zk8>X{B1F1!S?`j8c-=kh%nKwu2UWmHHSn0aI zxUGJ;#Z7Q|arq!hb>cdFz9L>1DLCTX2L--41W}@vm|iR_pSJ@1n6D~B%SHYg-$VlG z=*absqK?}9Bmddz;n?wKYB&FXNMBTH^>BP%T0tDDg!?=&Aq!1AOperCa z70iv0^`K3aO>w=cNG?J3(eSH|-K&lV!7ok~Cxt(M8uknwXGrLAD%UbBYmP`sM-#>o zW%%_#zZdn{Wu3uHsR?|SsE)f>5r0OM)TF(Cng5}=><8SOdgGWEAFVbU3lDVQfsxhD z2v(+@zCo!42tt;HRpAYvV@2UH2~H=}aONg9n0LZR>@vydzJppLF)d{j(y;S0h*DZa zfG&hv`}xz=nr;QWqPyTpzc{DWDh_gr|N7^sH^FJU)ojoY^sk?g{roiMQ)F#3uma$J zn~S^mo&!{jp=B#{UT=cJ{sq8M#P?I*@U`2#L2T+4C&SQT(yBy!c})U-8FQ z?&6QF+{GVTn-+g;?L_g%R@rG9@v+=N0GHQ(jF=kolfYBFtLUhSY!uQ;1Y5}B5J-Um zqZy=1R?;U&pgaI_$i>@3raJkzU`vdDX3Kd+vsvpb;cics+`1F(g&U>ziCbXny9eUN zB+sw8$8HdD$sJc6Xorcyr`&dwtz9#y#!HR|x35Y)AI*ce9*w%>fYjTKPP#DNO7a03 zhMVRctm!DW!h1kw>0Dbic=1TIkWSjeDL1pYUofd9f{{)7cVLff$M9wGXEEk~-1~Wh zBFl9TSxS3N9cr@NllaQ4mn>IH@@XZxm6F^#Nv@pIMy{OF#s=C-y)@>%^OdTfMp+Sl zsH(idzKeybl?vKx%TyZFHk+1a^=v>5#|Li{CW0UV1dq$a-b_Sn@8#F* z3rM&S)74O;l8G*3kc|xE>7Qguk^DVdr}{>>);eh)*A_a}jw!TE}813`M6Ete)Q|u3A zY?7SLO1{iOQ%~GGS>R}D zYW!XaD9pzkxEBa({O$&Zkbb^cK2IS5Z&tO*rLsc`k15wNr zQ=uU#BMSj+)lZo3%+Wmo6emk<4T}JNNYlxM~Xs1Cz@_r79q?P z3{2cK2{uYPn4|fpt0}!9;jXT&|2%Z@!_6Hqtm{O7*`A#N?q1%Em$&?ryj5Sk+;O>K zo6hPa@T&m~Urpon+o_Lr+u1lnm9FHLVx`0vT$9yj)XQNGlT}{u9xtFJIMtn8H>FthY2uwtjgL#;=!XH%V<-O_ z|6+50qXtfkGU{C%l`KByy>A3VWl;LO@u;{DMa-}6%D{B9`!uFice!cR&1YJ5bDLJ( z+@@7`Q`4%unQ8U89D&j;+q9ZLg*yo5@`Pk!WSoO?RW5pf$^lrkw%FiWEg*mY?Qa|z zc-1=YNBwmARChCdsyqrS*$_zZ;~fODFnwWv&Yoh<&k+-@`x!~;H8QI?F}#CN7UxwA z^ho$(DLK*FUno75QW|JYeEcM|OW?S6ZE8&vR~#aJYjo zCYmb6K}S$lr&L@YD=&L~dC|h@73CO8_bwE*mecw*?~*k?-<7(MDPI^lDZQsR_9Ya50VZvip2H1M z-ylTYC@bZ!zQHBpwy=Xhpuws9L`@4GORE}N9I~85dw;Tuv7rd}#nRNmGy$d`^--3m z>0CcVN{{GwZL z`Z8{p|LiO$g@yYitIt(`;pVVqo~yz@h;#LC_P8`N1$3?QTEA{~nAEJ>U+r=B+({Uj zC+9}P8ooKiW0@Z3-}VusgkH?&#Z^p;9<&9yvrFfw_3Sg}Hcb~6bb&wHSF?k6^OY!)nP9*5X*%#k`1V&_4G8#WA1eUv3cU847lMKsEK1DLT0$cSj zHk)4XI&C+2apSdr6QQEKNL`p;SP@!`tXUUbuID`;=et3Q&ZE)zc3hRYLf1)TxsD7u z2aABOxW$mRoke*13KG!Hw8Qs~F&JRyqVo_8{UHWyE84AZi}tYZ0XvnAm9o1@?`N<( zD%xik%kxyUOX?JRXaCBg!VFI>ai0IiY3WD(F9t96@Q(L?s@pvv7mumvF3+_i#y#`# zkyM))PHoo$C7EhvJc@-%8zL$j8vspV>kQ1=!*+9`d7tOTdKO+WS`%-1k>Y1ZY4W}2 zPYvIC^(5Kn>qMPB5o+I)=FXBP?Z+K$NAQa2ld?Uyb$Jxn7UMNI`nE%@wfE$?tK^AV z+pXtd)dUKEgu|HS^h((>eey;mL^eceW4;EiQsW||Yhpg+e+Y)g$ab;5^Bc{0gm=mO z5Ds`uMOvYZ^EMIcaoT%}%|ssP_Za&A<9vD|YjhX+`(3@;MYi!fJskF2I0&TP%6`_~L>@GC?@ZK(| z7DK6j5Tdb!G@2BO78pwb0v%|FHTcH&CWE0?Z@ekiRa+&{?w+zrq^x(Y_0s5yYP=rS z8xdJGnkA4`eNR{A`QvRr2!Xh6`adwXgDU^Mpriz8O#xKNvxH}dzTzbV-Ec^)1rz+N z^G4Td@UTS{@dNE{;=-_-(_(E;ilvewQsGU1|3_w&Q-J14%ukD|T7y9;n~UI&lp_oa z;*=?p3}&#djMn9L^Y}N7;QtG%k^U^F*KvmyK*ZJp#;35o7rKh~6UQlK6`R@?X+*JS zkENA*1Ksbv=Z}nXN$wLfk-=*M?EDsfOt2~BwIsn{Q?B_B?`!zK7q0H? zXu8XLpRsQz!AxwDOnKQoU{Uws0Y0QdP-%#sY}a%qR;2m#VKrJ0mIGgK=}(n^t(K>+ zpoTQ{WSUAvu_t?sD%da1I>sz*sWOSY{Yb^)?J-Ob{#-hMQXfA#!sc$0BFF3SxS}1u zdEuvPM->z$*8e`rRNXyL@qED97e||P+fO)W#CXg$k|m%4=NJeJ9Q>rI|h3vF$Ms zy3c-Q35pVLukVkn?cCV|*9a#*+wo%?AK0iYiU53ng7+u*Yd*mj-e~LvOlZpYFy8LL zdao$PCc$e<_cNH8J8?Ym;b%LY!*H~Dy|hgaCqB5z+00gc^PbJsn8XKv3U{{0`|pWD zo7&xEG>Ur`XKEUGKjc)2y?pqUdNVO3*3qhn)DAG~upIURZiVe)$cxj z4nj7r%AKp~;v4xz!m%LAQD7Yk&9NWQ%V_6lYyaZdUuhmY`00bp(}?szYl4{qPv1RUODwi}|JgDq{}A%FkqVY&vt zJRSguKfb#wI{ch>{gdY~9PzLyWgJHbn5MX$^c>s7iVe)Klr$!P9d1flF`UbD*ShD! zZ!-FuqUgI4p&dZkJ9psN!LaB^xUZMq2(SE|X@)ssI`E&OgDtdVJrhk?iw>xCI6aGd zoE9DJGn~~sQOhqstldA%x`CRo zZECn7{^3)9KNiDrxb1{t=D>5P_Q%xI2EI2LQ*{r{sp-|xBnV~Zgn>zUq3xQXX2iS^ zN8dHpg2EU{I#7p2ybewB#uXz!!wvCUgN1&I8lwMR)kE+$L!@OVIg^U(tBP-<%w zu{OP#7t+T!nfw)dOKfk6?Jcogv&8mt@s-KNEm*RDlK&TDw#uK8{MdM;ZTS?IPf?bq zVU<m4V_(;bkxkulb{HPc>ySoh~%e<)FZ;AFfT8pKn=vezN@Iz;ODdmUnHIz)lj^XeUC z#TtsHdYzB);z-`E%E=_JwA?Pw*Tm4-Q@ic~o+=B?>M#t)RuxCottvHH#=jFWhxK@h zVf;MC1U3XxjiFR9C=y*Joli_duuY#4*injqS}+lPaBz7e;26ml16|7lmO#b4)8Mfe>s}6o=4qaf+JCs9+`{?zwrNbYy7`_67^zlo?#J~#IP7plMLGpwlPWcKzuj!S^w-nV1+n= zZV>tEoc<3sjK*6!3l|nhD>*q-j ziXKwx!LxbrmY%zNcV)YiFMJo6m22Mn#D#ZthNn&nMi zvNV}63k%1Fx-OutcpdY1S+FK^^jnOk5t8{V>tDUCw+}L9BS@YC%nnP=^^X!k?MjZ=#iDe-N5y|Pqbw(k7dz+<9>mfog`tR zy>n}1yLJ%zyivHAFAo=>f@~F`G{yrP$$t%sOm(HwuPMfE%#Jg7g5PN7FVP$93u!$Q86j>9;`XM@dvj6 zMr6I@8)01hRZuq!*Z$Ri;BAQW!2no1C61l-1rty|Pp=>%v%Zdv68MDwEJN9uSsu)s zm^AB)10Z`B-8>xf5{1&0XYk?>@ky~s_j@GrDNIMF|I2lMUro4?si;<9Ac_axT9hMSs61Hp~xQ(dD=BfFc zycHH`!7$U@MrW>LfCZX-vAqp&95j~D8 zLV{r+I;af4B0Yc@#y&ezeBHA#nwSZJ65uKfm#j|0u>C8TFoYz47Qn9n>O4R$6)xdE zIUm=daYm|{$VnMsx{ncT?hug9HC`YggYA0TYA!Wd-%sF~p6BF|^=R_R_q361Sq_^T z=#aqE5)e^;pf`5rnnT|M0l>78*F(l+G44E~)zT4^{SHKnOnE$`(dDgvm-d!ho2L9I zCqx9_!ED!8(qS3R1aNTYmI@8E*fc}HDlZAky#_|`pg@+(<+)CQB{Q3f%Q{X)`q`3R zws^^pUA?VqKQP|JHc)<<8iC@Z!@yKVm;Ex0X&u~uRc{O`M2# zJI3^Zf4ThjLbH4u;pc5Zfc4r`!>Hgwh(p7_N1$_89lKX8aTWK=kEjgJ;F04^n6Vr( ze7c^0-TnEhqTTq0>2UUW%P;i6*Shwj5G0nw4{q$wh98Fmu(6(SV$Z`H}uvUUAt6}KZ=ZLT6`+=O-M1J4@>k{?%p28;8EzfqM_230KB9+63&my)M| z>d;Z3Ayf9jvtS)47DQzN+fuq6p#$ouuGjRg9<+WIoVEbkkcK`b*IMLB zs~=6Gcylpm$$W>Zh^dt;1_8O=n7M_216#|06{?Ot_F;HGw38h|`CcJ{&=OaZLGsO> zLJI0MB0WUJ?HINq;p%zu8O0_Xh2D`^V#Y8PQhA1`=kP=Fkp>~h*3%*wqBcg3kgR&si?}5XY<55a( z1^KQLq)6YCh~z5|GwgEVkP@x5YmvP0hXI^r4A2H?mkeV30?({3g9Ii4qOL+6+ZvUyf*?JRy_Y0Qve<+%2-%A*6z0fI)jYxDXexB8xv98m3)JKuQaX&&hs^F<&3K@sjf zcR_jax0VD`_`4`aFYd1smK96>cqT6-VijC|5xTki;D?i?rB+@{bGZ>N6}AtAh;qLMfsnRP>qLHu@4@ z65HnWl{{pbHFXgWLYGwL2ca*M?-xCW$(%XMU?Xhh^HIVQWg^;tfplM3y7s}NquIXIi+05Jb2PgdIpI|329W#KlamJ}1j1Hmo1HE{dsvv&&eE-E(oLwA7Bf66oKya1u{OaO@*#t}1`hAv2!o5GT0 zb%kU%2cRnec=T+4E21s|0a9q;8Pe-@%xOJ1GcOK~GenXfzplpLZ@RWBE^b>$im!ES zGD8YB8a4Q5*DxXJwaN)L?|~zqYRXGR6KOw_7NexzZJInw%=ZV@)2K09-!R$Sz^iRT zk6$W@QwI`5RWvFP#@RIf((}D3a95>JxC~_VrN%%ip5VZL(;=pF)3}KcUu97fz=CMG z9pZ;i!bmcGyT_s{ZoOG*q_!xDTzkL5bOyjg5cO=Ir;}gd9U3?8H@1ReZjTS%p2xWp zG9jMSOnxbUiElCnnGNkbEP!}<{ugfUY8O~b?JpoIY*0sa?L0~-m@>yX0{UVDpVkfP z;$$qEilKhG3~>2{QYk6!AoHAXewZDT;<2GjE(_`hnQ$VPE^sRGSm7|4 zqBvn7eKN{U(&@x5yNLs8*?|eb_;d%A(TxENY1xPc6-lxWuh_OIiwMQAF+gLCTg0{r zT4>0B+<<~-YW@phB@nihW{i-w31|!}>e~0-6b-%#fk^o&{9=f5pH#K(6uL^_fG^W! zys4|tWPr*R{lX$B$;6Q*A+t0FrwjJM5C-;0WiN1pb;B4<0-h|9n#C95FnIo~I9 zDJ39*{@5j$z&_GN5aJeK#umIJ7%6Qu%8QJD^Jd~ND^ppHV?97j&ogG>T&w5eROL$f zQeUp@Amn<{+u#5GAN(<1jAiIyBG7ljlPZcQXjnZV!}8Y+`yTB&8u%ld@;^R-kq9TS ztcl*Cri9*Hd*IR;afOA9UYP`+kr%^1(yy5Fw#mHM0Vzd+5_906G{q@@Ww8ZwK@F>a zY8j7JRD-G)BGarYNu|0(`&#u%4$Vx##1eCDjshIpe8B6~H-Ad&LtRn|Ty(ycogcaT zX=kT|^CBzkmT*?&Q1N*wWAHnM*&*7EpnVoniYny?$_+xYu-!=(A-`@Ku4umOb0v_T z=UgqkQtVtUIY5Q>XVZH-k=wZn%06X(*j}>SH^F6CB4dUuS+I&3bUYXG{$34Dm7G9iE0ho z*ABr+;3>}B zK+NoS6~_X-G^j@tUOwDPl?B<@X}8v`MPcNsl_64JBnc^ffoh07!JM2z=Jsy$V{ z-yjm^=WI>A5;lI0r0Zr=&~kPNTnQN+>v8~_5BP0?kQ7_E8e76@3kQS$jpfY~Q9KXL zP&`a|)B9I&>D$iniYir@&uD{x+|imE)ia7dxAO4k`EgpYt*qXO7kohjzUIh28Bxkg zu0$Bsc>z`~%!9Tr@KNP@L?ymO>4Fj@eHuz2yCOG2TqZ?URzYV7vNU-!XqzVQGDTpm zrclTe`q2xO8W*9@dkJWPV+7;?1~@?+qT$m|(n52?3p`+>+5Cc~_94!H4#-1b@2M~t zZg%{BB$lus6FOV?k)pd_@6Z1nXov5qk`5*Mp9c>>gnyQ4SK0cXl;X-@yyHVvXdBhO z@yl{I#?%Wlt^kkF#MZ<}Hrk-7}Jxx)sAiTC(|kd4&T&Z=lkji2LB*i$(EB>k3nT@za* zzy1FKP)i30{UvBj?`i-5c(DTjP)h>@6aWAS2mmp=13kAm3<4Pe1Twn=J(pDt0ziKR zhon}L|ERywFDtGjNCFgik#?KJ51EKKI5;>roO5v5Z@xY5BI^;RS%~6?i92;B7L0uq zgz@HK^2^89_G0qw%RhXB*6YxR_W|Z;V?bSrzqXb+~smPqpbzOegT*4(}+R^ z{tQNt43^E@sXG&}JD3Ag`UtE{QoP@-U~0@7kb{O)v&W6GMm%mbtns%XHP(L(3S1TM zJTMpUJdpeDK)%(;WHEb(8|i=Ey)AVi-IU@NTh(=aifCWDsyBZLZ4Ne5=2lw8ko zZf5Ma1bt`)Kcry}QwiK}1@}SZ7aT`B71J=BJHrq*d?acrpi?qwE#})<3KNv(1tDv5 z2Zg!g73Q_gcah$_NUH$dq(Oh61jXdcXV}!RqT7!lJbX2=xEGW>FCLL1xX)7%XGF+Y zp-B_RhpEh_lzN*GO%XFJ*lxWU_7V9E1#2%2)>Hgr@=`eMHNp;i4SZ+^(2ug0-!Nk< zK3nWJVadbfLk`jpr`-xg?!>~DCBSxJbdp;qmV||vP6n|wj&{acXQqFnv=4Fy%}20B zJ8+}G!CKDs|1J$d^zNggf7v2;CvEly#xM=BQfG%S%gzn)1B@PF9{NBrh}<@Cm{(|@ zhQ#U`gOn}$A$BN$XDyN^4Jlp{lTUd(<@gu;NfR|M>+-9iHO}pdJ??Hq; zWsE$<=%THattoaDO0IULK*d@m1u_S|M^SJc^7>F`qLzaR{21cZn79V(XO2qkL~3vb zj$|-tbRp0!5C(pG2v_JDrqXJ@x?N#(v%x#5^GKAbZ0!tbCc1w-m^!K$)-Q30lW1tY z`=C|kI-r3zXQwQOyWzZ>_tYt);b*$AlYeKW13_j0*I*ypI0V$vylKI1$2)qsU zIU-|VEeHdM7$}I6Z6S0@#wvy2GnRFZMV^ZmlG72|NC5IMiBdaXRn#Di14t4nQW}yc zBZw3<=3s>-jgpM$iJt5NoY38v%|3&e4Ka}_%RW$q(uaRZp6+pyx<-tmEc}8gb-g5~ z-y#ri_F#iQ!I*yV(LT;o5+8q8OdsYrakW3=5Q~z|5K6NoIBlGOfmmSX9XWE*_T_jK zO?(*95~Emwk`yl@c+?;*S`}!EHj21pYQ?HdOs$Z@q*a|T33QbZhGZ$4FDp&LSwQ5GxU{P)f{#=p6RqSb-vtWJG_VhYoC~=ujIRf2kShX9yEJM;n-L zNez}5;JJb20gD1n9DuZpbPW3Cc`o^~v%5zddbf!1Fq0Wow08SZgp~fH56^r9x6cTpXl}4_6Vgh7R zyu5!+Sxb-b&*Mn;S92^y;4qWK zuh)eiAP6LPtW^azU8Y&KT8&~d85!Us{_x3jKCMu2QmK@o;xKKP-gtAJMtH6#>jVv> zVj4zqr8u)JNDSwxUya{4CBFwaYbBO0ZkK-`FqW)}`*tM4lglfRkby>2 zG0ct>baWo2htN3>x_iucNwb`+;5BWbajIaoqjxBp5RrW&J#eUu6Gfc(n#6QvH_?Bp z=&W)hH-^!hG(geLhcLFhH&``~Bg!|V_*&&VlCaJ)(cIaRc#XJ`R~Q-F$5eV;0%p}= zu5A-09?8T-_jO)pgDQ@IRd+RPERRIdvE~vNvP(Qbrgp1(VY%WF z7d3~)dWmLr-_qS_dKUn+zp*6i3?EaNEwRWG2vijVcU;Qq5%0OBOcC#nxKI^Nx+Vve zj~%DDkV5K))q@d3nhEY<>@-k*B7XikTR~lf@_qDdaS`(k0BBe5Q)?R6Y;e+ zbMd(nnuw2L;@pTJ8Lri^qRO)1+=<)dUVyqP>C!c@t9JM7*|3F1NcX!n55TK6zx8i^ABn zjrUds;#VXA1KaAf<6W@yZ)L4l$xx~N>g;r;ck|m3&ixbzK&nbzpuYrP$$hmp$M0Gd zi095*vr{zJ;jbnvrflsM5|6@Acj~>koC6-4mvWlXx~own8v}nfHfmk_CmkanhPlkq zjl1sqly`&nDK))&7D#@{U@Ah_V@t3@;Ar@I9J@~PgeuW1vD76O*GMeQ3*Ohx37ZSf zi@T>Z-`_yi`8wR}(_RM*3Ng?0*o*Dy@Qi0*8{y&auHpZ|HBe#o5mN1ZX2mhIXwfSa z^cqfkIAU;tW4eDV>X2$pQQe&&-%*-uL5wGTGjc72^G>dGn4g{!FA7wnl4X6HrLs4x zYLqr#yObZLz15FDy=vcGl>mB#lT{C--ajpj35W9)9BnH4K85U|6>N=k9#T22IuRMt zlEFq;V(A+)V;qQQdnAV1Q+c&xt-Uj0IiyE9PHl5-$0N0<2xn~`JAf9?@8-!ad;v)8%Ci5_nFE_73G+%9FGoAI~f&+8wHI=dc*{eB-skQyd? zj!Sc6fq{QnHJIY!s%)TV7bW>&u=cP|Pi`8-fC8*=0F;LvqKMagRO0 zsA8RfvSbh=&ee|fEs8@)6mX9fCuI*YFwxWVOB#?v7?8&b<$$yX!AC0Z!<+NrJ=Rvj zgCD8FYGNx4V^snAX;1Mo%#dAmMhIUGTNS^6Y}J4LGZ_*Y<&(F-sWxHtCvW*lSDg)@ z^(O}P=V5H>o;N7l`WeP6eoLXJvajjChAEG5hPB^?-HwM{JKyIW_c-i7;ECJ?7^XgL z7tReXf6!IC<$eck?|p%T2f)Ot$fFOy$GWC5Uk++D;Y{uKuW%j4p(^J%*YjUt7V?}^ zUMYXxYF7&0!75gaw*yv;1wY2RmLDdeZ*r`qmr3L|K(4c@h!nopGbMu_%sHb~e`haG zH5A0)g({i`g4o}p)Mj--Ii7vo+#f~ohyVXn2?W_|IPx6D+fa6bNbZA@Mng)Hq(;PC zK0n2JR&NVQt+nnA2GQAwl&s08pIFPJ21tK%HxACy;^J-${V7NCwe#U}a4HY*`*l`xxup^N?Sm7>QHN}xq9jS(s@KmIBr_`A`HzQFrAB!TED33tV z&9kHE_SsQ%_v|Qo@$4vCJUfb(&yFJ3xh6@~CYjC{^xWY{N-mIU6>ke;Kc#=#f%rS=X-fp!(Qby8P;MCZDcryZJocNlSlPgTui&*83`dlASwI0M#Z+TX+=WxqRzbd>0pR zy%*EvjaK%22&`JUjl(xgGXHA<-dJQ|+(oI%ccPoPKw|>Sg7US`|HpIS*_j0= zY%|2?RG*41r%)xgDFp*#^nMe@SbYS?^m@e*6IR^0D6D6{i$$>k|F3v;)164)HXy0( zR{!dK!c1j^N<;=~J^z)f^^ehE@WttTM6eF5P z(@C>b#Lv3E%7&tGYV&BNOmztRjtt;K~M22@3c}-GVPph2MQ%2(Cm;e2b z+8Ey1tkbfQjt9lx|?%xQmx5%hB^pofXS zPuV-Q?wy!+3E$*|nER|D>vQ6N9j5GB$9tNn6&50uxhaSxw<~p|thv>Xk~EJR=%}e2 zJynh}mvg3?qR-TS5%J~!08mQ@2&D-E-&PL*08w!O08mQ<1QY-O2mk;wy8}Jt$T$s* z1ONbx1ONaC0001OWpuao90HgE0x~g|j~@av1u-~HG&PsU9|9;1I4v+UR53X^GBr9g zG?)Az0+2R1F(M#sWprUWcW-iJEn{zWZgf2&H#IOaA|P#LbYVJUXkl_;V{~P5En{zW zZgf2&G&wLdGnWt{0w$N}AOffaGP?skmy{s_DSww&R1?a(#jzrYD2gH=AWb@mNEbL# zlTZycA_0`%!T}|a&{5Ds4<%Bg5JbA6*F*uSA(%t&y_ZlDI^^>DU+b>>a@T#k^D^^W z^Dwi%HT&CpKA9Nl-C*WoW?*2r0R(7+&*wGebj$16NDvzyAmMa7AvC%85iw z)jF^F-Nh8}p|~y~oXG^#bbQb#^O=&Jv3;pP7`83agok>$U!?d9apw0^fQi2V_kR_B z>$HJ$YjhInXSosZ1mGsgjOhT})Qr#s&vk#qcW}PPwxK6)%;;Rc&z-=2OAGuL3-E%h z(3RHzg#P7!=?D4QQ?{q@wNe&T4tZ%g)P%8%R%iHKgXJBzOXFm#9`H~Mq(-A29{dcg zaX1qG_t^NTk+c0O^)UFY#Rsg*dw-RmQq2UeE#4zr?ig2gr+#h}m%eU*!Sh_vg2V%Z zwAI+=4&4{v+$~$i(x0Lr=Kc%+-9`Qrs0(aOP_jrzPHLa7YmADQOX9EfxpukrfV=*rs`rI%7p%*j^INLD2Kb*(*)G+@I$6ig z!0wpF&+BLKIBXjmdU|r?tqXEO8n(naN&ZsV?4uGnAgc9Z9xkAiq0+EcJ-9i{o5Yq; zYiCaK9D*$E<1e7NI39$%8-MR6O5Npd+N&s^ws`VdK2oAlCiVK66y-Y%-Vbvb-fu`2 z?lququh%wC(*U4T(r^(}^0=wO{-)q@zMds-pCvAAC0Vlm0SEjnYGZzA*J1+WYn>^5 z6c?Vo9&nr!dJ9T9NFsrFG+f@Bb_y~BC4%R6tWp;u7s?hXJy zAiQ>>c4(Uy^MwhLEc`rGXJN0)B4**~nI+c2BJ~P{+KDnw3pu2Sqc$ED>44pGi5RFj zvZ!cNkbdyg$`}NUk$-f_eY8qk;W7pJy>%-ja}_CaD>aE;w`r`H9C$fbykEz4P|EeI zkK`H?fu9Y<_Ae$?qfAp^$2GPy)o>Jj!O(&)rQAPYaVKE=3WQvMQ}O+7Jr;;AY*=Hh z=8;h$WWoCnL+&D4HNl0mw_d@LPmONB@>o_h2rohpKKNSf zm7SPJC!Q8kScCaK(x%F#X>DC~RFvP=#-URLq+1$f0EuDfkdhccN$CcMW@v_xl#&{{ zLrFnWLXnOk1wp!z?ij+0%kSRn@2>Csb@txpJm+2SAN#ER?0weuN=<#)xR)=uTh#rA zqPjQva!2m%HomoIjX62Ji|Fg?s1ee)M8%qNTjeqEm-hWJ?Pm>2v}!3?tP*{m)cp4V zZ?NGl^t4uFX<7r8ewWjQlXZzRAa1V}Awr9_O$8cCxG06+HP8D7JB^n?l$i=FXY|A3 z3IZV>4&mf)poOVEt8%GPbPaUKdyI8(@yxmb^DB3!3xpE0>y=8yn(bDoW^vrkPy1(C z(TL*>>mu#CFQHA_hJJihz7@zc3lMs!9f^$`roM$#iIC6po|B}8|3j!WG^TnEYySW-|ks>%j z>eJd06nP&@?~OOm``HZZv0P!GC1@}#aF|$wXRl;V*85{6_t;SbWZ|7O1+QD>XMhVB zn@)W)ja#VlYL-|y z&oS0(-CWF%wAteQZ#odIdp3Rlb@a*ZBzxlATb7u!o*m&i`>8~TV1u`!fNUZYd- z>DBB%H+OwuFDOMY0|X_drRW<+Dk{~&TY6rjYLvd|_hj9*OE_KS6sBr_tk12Dg$Kk; zqFHl9mtJpao%ERCcIqX?>(DG`_e;0U>T5F<`HFS=eTb|f$*DA66-7s|9`m+3{{YFl z7H+32C&{ zPOhD|xAVUD^hU<(9FbsamK=#m4;FxBN6yd~^2p!#f?sHtA6^FXZoYcBqdak{N;G-W z0c_kxT%gXJ1?VOKdXGrz_WcHO|5B=HD`$)Kbn1 z3vuSxU=9)`T%SK8w_r4U`01n0VpW#M3t+*x-&qqT4mKXon%B*jogKJ!rt@%8AIu|E zBJB3nPLO>~LFPJ3Y&P+sTi*;*RV{U$6t!Yx`-L}=&%EF}#K>AiSGsrTn)kU-K^fGT z4jDaSw_h^?<`dJ;I+}G_(u|8QH7f6DJzw>{c@Tmj!=IknZ1y&ef=pFDxFegXh(}F(9(`{^}Mw>a?-Uv9F_6;Tj3cD(9EBW?$Kai8> z7i*B_6ZeyIu4;1_`=t*_-UpkV{i7&-xQ$Z#dzLPX^b#(1lLI*a%E*h;ftqBKDs&)= zD4P8xor@&!K>tS_QjmGx#cVDgoPyBeVgUFY~H>DdT$OG;ndy_8$KnM)a%==S%<*h1(ULUobmV= zeNT;WN}Y}m_c7t0^fqq0COy_LuN^{EKP!Kj(@FJF#2aPu^9jTIg_q=Sw(mN9Qj$lMYF}V>+Bck_yoKRzB3T??LPs`hQXP#NUt}SkE?A-(PxuM{fv7*OS9p-{9papEF93Gds3^Yz+ev zbcNl%tn!Fio^Q5aMb!%RwOV=KPI4=3Z)PNWIuLWkog9^n4VjP23g)L^kxbV_NPddX z>N!6iY>QWTSCIo^^U41zwCC{|i>NS#Dx7DSY^Qk>Y13`wvooFoZ9|Mmi8nTpcnQol zq@|Y?hgZTmCbOWq+V3LLFHJv>UI=LAD6>G$jXRS}?>QFOcX z(91&v>GFWO@iUd8pO3-b5hdQ(ORYpjd%Ut|PVj*LY!~CuN|Q&qURm9xvX|uiw*dI> z)yg=ipG<5f6wMlJP%1a+clD@74aO$RxWtHxCUdn;xuMEWX-J+?zb{h!X%;V&(Ut|h zwz8{P_-M|b)_*l-u@|{4do*Dmrz<=>;1$|AxL42k3>(<>R77tlKhN%J^vlx}YYA|@ zWg83J?r~Z;Xqui85}25O7 zf+IFW?O{*&c8LNt&l@|HW;b>dkDYm9_ah|2L=Qs8jSe!I@NMU!6o9Jg zsq)dtiy1fJL{eSP?5FBxV@6faxSVg=Cn_MDIF_UcE0>h5iy>np4uHetjy2zPs@8Y- zZTai(K5KcGd8so{O0Y2xSwrA1^Xl0c-c#Mxkj)i2CjCrUX8{dEnW`` zaD#a+%b0pp!OOFdwmR^l3-${ig_v!y7zQ@T@bxpk&4`jys$d(!H)9q+kT>*Z`DoBS`4A_+|X2U;YUC-R%FX>48(cb^+a ziPjoyOU;-0@bP27oOQ_|%WX+OB&~(jGgOgB2hr1g<9NBqM;#ajFW)tOs+Gxd)ULG@ zb*TeX#V#jsPVUYF&r1c>rr1*D#+oo+J1C$xvTvE>&SIzTo_u>9b`yZPnIP1ekD=UefESx8JFo&Yl)zb zSCL=zB*ka>*TMFs$ycfc@BoHKI6fKDSuzl;@S`Xlw)6}0cTA7e?8_j!i|NaW{~gog z+$Gcn?h@*VK0W{g+-(^|5b)V#v`?%EvaXVrk|m8Wg4vk`I&PdHSpa?@oo*Q3^;IJ2 zrU#SzbYM;@TfJr9Sc!(pzGMZn%OReMThh7l+EITq8kK49+RnT$y{C%DzV>mISf;u+ zS`2Xr3&2i=Iy#RP6c78r(ykVy3UO#6JT^X0*jqyX~HqIKFnvTN$QeE9T*RuxC zYSC4(@6TJ;C+`~`XL!%TIOrI-tO-I1pYEMKYkyO3ETML$yZF(2?~eJO zv2RU17^OwX;c)imO4zt!`6#wyXrd(=kH5o+`nlPk^0g>TkzgtQgp(9ydsr0F#mXzE zC)2oJc8&Aw9OC%y)P;UOOiXb?LG!{#jb@O2b~Wz{yiCWblDn&mUNzaLP6t#hl!F8E zEiTl`Dui))dvQE_g-3qo%=Ia>+ce2{4+X7*8L3`qblR%s!&acNTY}PC)k18=G0c&x zjs`i;eDGad>RaZ|pM_&$y||s`*2UCVn0Q1?Oo<~FMNbCu8R|H{aNRt`syU*7_=~sY zTi+*vcM(i%NO4vKP!gq@7o=j=T0~nYxXfWO(JtNwqKy;i5tJ72Q3ol*+-_;j#wHeI zlug{&up*ts!kCjNfzAaamuczBMpa4jy=;WY!<)EchH3{0=sN5`8HbZ9pZ(pITJ+XrcCP zDG?am8Pe2?6udTaaOwN@gPUO~N}jVc_WmGW^Tcf|pJqG#kQL7rPNan860u%{R=LqE ze69-H(SnTMJC_~Q9gvhBp4~Ik|&A9+&KxhfGzYy^+t-LRQg~>pCgrBjpET{GaUr5BgND; z4|lFS2FeyJ53*8hOS07>4Chpp8OtVx!`i5*08__T@d+isuY@QG0IT;Rv!=FTSmQO( zVlbuC(68EsW!n3O@1uzfvshO3D>*RGFL3dssv@{QjHrcKJr5#=G3ueYkzq6veJgy0 zGR!B;sf3#Uq;Oo1Q)N@FCHoNialS)cn6{ed*^77Iv7UzV>f}E5mAZliAN31Vz<-sQ z?ywPk`qab5NH4tN%s!hn%(AxMYpVJp6OK{JepFQ@UZ`RwvCfqgE?p6Xsk=aFRfhSZ zod|q5W6i=BLXJ=VB(#sd2&~Anq1BLSD`^!wtr1O^e!lpyQ!1sx7BS0ooFPl6-LR~3 zOVQtZiCt8A5i|An3q=s=SxO>o3cgfMGY7T@?TJDT!_3LA;2nV)L8*L&=C~>XhZ#}c zB%^(*dDgG5>z)dTU_m9HKn)zVj_J;*8>Du*Fys7hbejFBApXGzPe-*T9&EdxEHMuX zgl&qi?3VM=?R>J|g;JPH(auDxZd_tZ`XD2Hk|M}+m3EL1*P8>toc%rw>QUl`?$+cU z?z(4X}<1dj6{BKbj3{d`Khyeq134eQZW(<~#zB_jIuEz-&@R;GZ>hF3g{5#Ws z2QxxK3_$(ovkdQM;wnS{G^m-Qowb#lJFlyyHRSFkH5nS&UH#Rc`{HkQ81KJ0cQc#& zh-xtaCC={ye>261Q855H=#>5r?~e23^@6_oU#!1xCCYzbl{`W)hy&OReq;Upp9%i4 w>Pi5B=4R#YZs%y@_W$8$Da#L~+(Sbx1Mc+y0-s6SsQ>@~ delta 37236 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 diff --git a/Documentation/SOGo Mobile Devices Configuration.odt b/Documentation/SOGo Mobile Devices Configuration.odt index 7ff650d1696b4e0e18b0bcf77205dc7ed5e47c3e..2a8d1a850890d285a8724b45f83815fcfb77d0ff 100644 GIT binary patch delta 16646 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 z Date: Wed, 11 Aug 2010 14:52:11 +0000 Subject: [PATCH 07/12] See ChangeLog Monotone-Parent: a8ea4c892d2814713d84f3190401e5d4381c4701 Monotone-Revision: 2be823800b3a3aa4e40219b1fbfa546bd5cc1db3 Monotone-Author: ludovic@Sophos.ca Monotone-Date: 2010-08-11T14:52:11 --- ChangeLog | 9 + .../Appointments/SOGoAppointmentFolder.m | 3 +- .../Appointments/SOGoAppointmentFolders.m | 4 +- .../Appointments/SOGoAppointmentObject.h | 11 +- .../Appointments/SOGoAppointmentObject.m | 759 +++++++++--------- .../Appointments/SOGoComponentOccurence.m | 2 +- .../Appointments/iCalEntityObject+SOGo.m | 2 +- .../Appointments/iCalEventChanges+SOGo.m | 3 +- SoObjects/SOGo/SOGoContentObject.m | 7 +- SoObjects/SOGo/SOGoObject.h | 1 + 10 files changed, 412 insertions(+), 389 deletions(-) diff --git a/ChangeLog b/ChangeLog index daeccbfa7..e4862968a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2010-08-11 Ludovic Marcotte + + * SoObjects/Appointments/SOGoAppointmentObject.m + Removed all the old calendar-schedule code and + instead, implemented calendar-auto-schedule. The old + code will always succeed and the new code reuses + all the business logic used for the Web interface + of SOGo. + 2010-08-03 Ludovic Marcotte * Applied patch for bug #690 diff --git a/SoObjects/Appointments/SOGoAppointmentFolder.m b/SoObjects/Appointments/SOGoAppointmentFolder.m index 70a8e3aaf..50808a32b 100644 --- a/SoObjects/Appointments/SOGoAppointmentFolder.m +++ b/SoObjects/Appointments/SOGoAppointmentFolder.m @@ -2216,7 +2216,8 @@ firstInstanceCalendarDateRange: (NGCalendarDateRange *) fir if (primaryClasses) [classes addObjectsFromArray: primaryClasses]; [classes addObject: @"calendar-access"]; - [classes addObject: @"calendar-schedule"]; + //[classes addObject: @"calendar-schedule"]; + [classes addObject: @"calendar-auto-schedule"]; return classes; } diff --git a/SoObjects/Appointments/SOGoAppointmentFolders.m b/SoObjects/Appointments/SOGoAppointmentFolders.m index dcacacbf5..8011e27e6 100644 --- a/SoObjects/Appointments/SOGoAppointmentFolders.m +++ b/SoObjects/Appointments/SOGoAppointmentFolders.m @@ -380,7 +380,9 @@ static SoSecurityManager *sm = nil; if (primaryClasses) [classes addObjectsFromArray: primaryClasses]; [classes addObject: @"calendar-access"]; - [classes addObject: @"calendar-schedule"]; + //[classes addObject: @"calendar-schedule"]; + [classes addObject: @"calendar-auto-schedule"]; + return classes; } diff --git a/SoObjects/Appointments/SOGoAppointmentObject.h b/SoObjects/Appointments/SOGoAppointmentObject.h index 49c496246..9f13025e4 100644 --- a/SoObjects/Appointments/SOGoAppointmentObject.h +++ b/SoObjects/Appointments/SOGoAppointmentObject.h @@ -1,6 +1,6 @@ /* Copyright (C) 2004-2005 SKYRIX Software AG - Copyright (C) 2007-2008 Inverse inc. + Copyright (C) 2007-2010 Inverse inc. This file is part of OpenGroupware.org. @@ -53,11 +53,10 @@ withDelegate: (iCalPerson *) delegate forRecurrenceId: (NSCalendarDate *) _recurrenceId; -- (void) takeAttendeeStatus: (iCalPerson *) attendee - withDelegate: (iCalPerson *) delegate - from: (SOGoUser *) originator - withRecurrenceId: (NSCalendarDate*) recurrenceId; - +// +// Old CalDAV scheduling (draft 4 and below) methods. We keep them since we still +// advertise for its support but we do everything within the calendar-auto-scheduling code +// - (NSArray *) postCalDAVEventRequestTo: (NSArray *) recipients from: (NSString *) originator; - (NSArray *) postCalDAVEventReplyTo: (NSArray *) recipients from: (NSString *) originator; - (NSArray *) postCalDAVEventCancelTo: (NSArray *) recipients from: (NSString *) originator; diff --git a/SoObjects/Appointments/SOGoAppointmentObject.m b/SoObjects/Appointments/SOGoAppointmentObject.m index 2e775624a..324cfd755 100644 --- a/SoObjects/Appointments/SOGoAppointmentObject.m +++ b/SoObjects/Appointments/SOGoAppointmentObject.m @@ -31,6 +31,7 @@ #import #import #import +#import #import #import #import @@ -510,6 +511,31 @@ } } +// +// Workflow : +----------------------+ +// | | +// [saveComponent:]---> _handleAddedUsers:fromEvent: <-+ | +// | | v +// +------------> _handleUpdatedEvent:fromOldEvent: ---> _addOrUpdateEvent:forUID:owner: <-----------+ +// | | ^ | +// v v | | +// _handleRemoveUsers:withRecurrenceId: _handleSequenceUpdateInEvent:ignoringAttendees:fromOldEvent: | +// | | +// | [DELETEAction:] | +// | | {_handleAdded/Updated...}<--+ | +// | v | | +// | [prepareDeleteOccurence:] [PUTAction:] | +// | | | | | +// v v v v | +// _removeEventFromUID:owner:withRecurrenceId: [changeParticipationStatus:withDelegate:forRecurrenceId:] | +// | | | +// | v | +// +------------------------> _handleAttendee:withDelegate:ownerUser:statusChange:inEvent: ---> [sendResponseToOrganizer:from:] +// | +// v +// _updateAttendee:withDelegate:ownerUser:forEventUID:withRecurrenceId:withSequence:forUID:shouldAddSentBy: +// +// - (void) saveComponent: (iCalEvent *) newEvent { iCalEvent *oldEvent, *oldMasterEvent; @@ -626,8 +652,8 @@ // If no occurence found, create one event = [eventObject newOccurenceWithID: recurrenceTime]; } - - if ([[event sequence] compare: sequence] == NSOrderedSame) + + if ([[event sequence] intValue] <= [sequence intValue]) { SOGoUser *currentUser; @@ -809,7 +835,7 @@ NSString *delegatedUID = nil; NSMutableArray *delegates; - + if (removeDelegate) { delegates = [NSMutableArray array]; @@ -867,10 +893,14 @@ forObject: event to: delegates]; } - // We generate the updated iCalendar file and we save it - // in the database. - newContent = [[event parent] versitString]; - ex = [self saveContentString: newContent]; + // We generate the updated iCalendar file and we save it in the database. + // We do this ONLY when using SOGo from the Web interface. Over DAV, it'll + // be handled directly in PUTAction: + if ([[context request] handledByDefaultHandler]) + { + newContent = [[event parent] versitString]; + ex = [self saveContentString: newContent]; + } // If the current user isn't the organizer of the event // that has just been updated, we update the event and @@ -950,373 +980,71 @@ } // -// The originator here is the owner of the calendar where -// the event was created. Lightning sends us exactly this -// and handles the SENT-BY itself. We might have to review -// this if the originator ever becomes the user on whom -// the act is performed (ie. Alice creates an event in Bob's -// calendar and invites Thomas). +// Old CalDAV scheduling (draft 4 and below) methods. We keep them since we still +// advertise for its support but we do everything within the calendar-auto-scheduling code // - (NSArray *) postCalDAVEventRequestTo: (NSArray *) recipients from: (NSString *) originator { - NSMutableArray *elements; NSEnumerator *recipientsEnum; - NSString *recipient, *uid, *ownerUID; - iCalEvent *newEvent, *oldEvent, *emailEvent; - iCalPerson *person, *eventOwner; - BOOL isUpdate, hasChanged; + NSMutableArray *elements; + NSString *recipient; elements = [NSMutableArray array]; - ownerUID = [[SOGoUserManager sharedUserManager] - getUIDForEmail: originator]; - eventOwner = [self iCalPersonWithUID: ownerUID]; - emailEvent = [self component: NO secure: NO]; - newEvent = [self component: NO secure: NO]; - [newEvent removeAllAlarms]; - [[newEvent parent] setMethod: @""]; recipientsEnum = [recipients objectEnumerator]; + while ((recipient = [recipientsEnum nextObject])) if ([[recipient lowercaseString] hasPrefix: @"mailto:"]) { - person = [iCalPerson new]; - [person setValue: 0 to: recipient]; - uid = [person uid]; - oldEvent = nil; - hasChanged = YES; - isUpdate = NO; - - if (uid) - { - // We check if we must send an invitation update - // rather than just a normal invitation. - NSCalendarDate *recurrenceId; - NSString *iCalString; - SOGoAppointmentObject *oldEventObject, *ownerEventObject; - iCalCalendar *calendar; - - oldEventObject = [self _lookupEvent: [newEvent uid] forUID: uid]; - calendar = [oldEventObject calendar: NO secure: NO]; - ownerEventObject = nil; - - recurrenceId = [newEvent recurrenceId]; - - if (![oldEventObject isNew]) - { - // We are updating an existing event. - // If the event containts a recurrence-id, replace the proper - // occurrence of the recurrent event. - iCalEvent *currentOccurence; - iCalEventChanges *changes; - NSArray *occurences; - NSCalendarDate *currentId; - NSString *recurrenceTime; - unsigned int i; - - if (recurrenceId == nil) - oldEvent = [oldEventObject component: NO secure: NO]; - else - { - // If recurrenceId is defined, find the specified occurence - // within the repeating vEvent and remove it. - occurences = [calendar events]; - for (i = 1; i < [occurences count]; i++) - { - currentOccurence = [occurences objectAtIndex: i]; - currentId = [currentOccurence recurrenceId]; - if ([currentId compare: recurrenceId] == NSOrderedSame) - { - oldEvent = currentOccurence; - [[calendar children] removeObject: currentOccurence]; - break; - } - } - - if (oldEvent == nil) - { - // If no occurence found, create one. - recurrenceTime = [NSString stringWithFormat: @"%f", [recurrenceId timeIntervalSince1970]]; - oldEvent = (iCalEvent *)[oldEventObject newOccurenceWithID: recurrenceTime]; - } - - // Add the event as a new occurrence, without the organizer. - [newEvent setOrganizer: nil]; - [calendar addChild: newEvent]; - } - - // Identify changes in order to send a notification to the attendee - // if necessary and with the proper template. - changes = [newEvent getChangesRelativeToEvent: oldEvent]; - if ([[oldEvent sequence] compare: [newEvent sequence]] != NSOrderedSame - && [changes sequenceShouldBeIncreased]) - isUpdate = YES; - else - hasChanged = NO; - } - else if (recurrenceId) - { - NSArray *attendees; - unsigned int i; - BOOL found; - - // We must add an occurence to a non-existing event -- simply retrieve - // the event from the organizer's calendar - if (ownerEventObject == nil) - ownerEventObject = [self _lookupEvent: [newEvent uid] - forUID: ownerUID]; - - newEvent = [ownerEventObject component: NO secure: NO]; - attendees = [newEvent attendees]; - found = NO; - - /* We check if the attendee that was added to a single - occurence is present in the master component. If not, we - add it with a participation status set to "DECLINED" */ - for (i = 0; i < [attendees count]; i++) - { - if ([[attendees objectAtIndex: i] hasSameEmailAddress: person]) - { - found = YES; - break; - } - } - - if (!found) - { - [person setParticipationStatus: iCalPersonPartStatDeclined]; - [person setRsvp: @"TRUE"]; - [person setRole: @"REQ-PARTICIPANT"]; - [newEvent addToAttendees: person]; - if ([[newEvent organizer] isVoid]) - [newEvent setOrganizer: eventOwner]; - [ownerEventObject saveContentString: [[newEvent parent] versitString]]; - } - } - - // We generate the updated iCalendar file and we save it - // in the database. - iCalString = [[newEvent parent] versitString]; - [oldEventObject saveContentString: iCalString]; - } -#warning fix this when sendEmailUsing blabla has been cleaned up - if (hasChanged) - { - [self sendEMailUsingTemplateNamed: (isUpdate ? @"Update" : @"Invitation") - forObject: emailEvent - previousObject: oldEvent - toAttendees: [NSArray arrayWithObject: person]]; - } - - [person release]; - [elements - addObject: [self _caldavSuccessCodeWithRecipient: recipient]]; + [elements addObject: [self _caldavSuccessCodeWithRecipient: recipient]]; } - [self sendReceiptEmailUsingTemplateNamed: (isUpdate - ? @"Update" : @"Invitation") - forObject: emailEvent - to: [newEvent attendees]]; - return elements; } -// -// See our comment about the originator in the method above. -// - (NSArray *) postCalDAVEventCancelTo: (NSArray *) recipients from: (NSString *) originator { - NSMutableArray *elements; NSEnumerator *recipientsEnum; - NSString *recipient, *ownerUID, *uid; - iCalEvent *event; - iCalPerson *person; + NSMutableArray *elements; + + NSString *recipient; elements = [NSMutableArray array]; - ownerUID = [[SOGoUserManager sharedUserManager] - getUIDForEmail: originator]; - event = [self component: NO secure: NO]; recipientsEnum = [recipients objectEnumerator]; + while ((recipient = [recipientsEnum nextObject])) if ([[recipient lowercaseString] hasPrefix: @"mailto:"]) { - person = [iCalPerson new]; - [person setValue: 0 to: recipient]; - uid = [person uid]; - if (uid) - [self _removeEventFromUID: uid - owner: ownerUID - withRecurrenceId: [event recurrenceId]]; -#warning fix this when sendEmailUsing blabla has been cleaned up - [self sendEMailUsingTemplateNamed: @"Deletion" - forObject: event - previousObject: nil - toAttendees: [NSArray arrayWithObject: person]]; - [person release]; - [elements - addObject: [self _caldavSuccessCodeWithRecipient: recipient]]; + [elements addObject: [self _caldavSuccessCodeWithRecipient: recipient]]; } - [self sendReceiptEmailUsingTemplateNamed: @"Deletion" - forObject: event - to: [event attendees]]; - return elements; } - -// -// This method is invoked by CalDAV clients such as -// Mozilla Lightning. We assume the SENT-BY has -// already been added, if required. -// -// It is used to update the status of an attendee. -// The originator is the actualy owner of the calendar -// where the update took place. The status must then -// be propagated to the organizer and the other attendees. -// -- (void) takeAttendeeStatus: (iCalPerson *) attendee - withDelegate: (iCalPerson *) delegate - from: (SOGoUser *) ownerUser - withRecurrenceId: (NSCalendarDate*) recurrenceId -{ - iCalPerson *localAttendee; - iCalEvent *event; - NSString *recurrenceTime; - - if (recurrenceId == nil) - // We must update the master event only. - event = [self component: NO secure: NO]; - else - { - // If recurrenceId is defined, find the specified occurence - // within the repeating vEvent. - recurrenceTime = [NSString stringWithFormat: @"%f", [recurrenceId timeIntervalSince1970]]; - event = (iCalEvent*)[self lookupOccurence: recurrenceTime]; - - if (event == nil) - // If no occurence found, create one - event = (iCalEvent*)[self newOccurenceWithID: recurrenceTime]; - } - - // Find attendee within event - localAttendee = [event findAttendeeWithEmail: [attendee rfc822Email]]; - if (localAttendee) - { - // Update the attendee's status -#warning this code should probably not exist, as a REPLY POST will be followed \ - by a PUT - [localAttendee setPartStat: [attendee partStat]]; - [localAttendee setDelegatedTo: [attendee delegatedTo]]; - [localAttendee setDelegatedFrom: [attendee delegatedFrom]]; - [self saveComponent: event]; - - NSArray *attendees; - iCalPerson *att; - NSString *uid; - int i; - - /* We update the copy of the organizer, only if it's a local user. */ - uid = [[event organizer] uid]; - if (uid) - [self _updateAttendee: attendee - withDelegate: delegate - ownerUser: ownerUser - forEventUID: [event uid] - withRecurrenceId: [event recurrenceId] - withSequence: [event sequence] - forUID: uid - shouldAddSentBy: NO]; - - attendees = [event attendees]; - for (i = 0; i < [attendees count]; i++) - { - att = [attendees objectAtIndex: i]; - uid = [att uid]; - if (uid - && !(att == attendee || att == delegate - /* We skip the update that correspond to the owner since - the CalDAV client will already have updated the actual - event. */ - || [ownerUser hasEmail: [att rfc822Email]])) - [self _updateAttendee: attendee - withDelegate: delegate - ownerUser: ownerUser - forEventUID: [event uid] - withRecurrenceId: [event recurrenceId] - withSequence: [event sequence] - forUID: uid - shouldAddSentBy: NO]; - } - } - else - [self errorWithFormat: @"attendee not found: '%@'", attendee]; -} - - (NSArray *) postCalDAVEventReplyTo: (NSArray *) recipients from: (NSString *) originator { - NSMutableArray *elements; NSEnumerator *recipientsEnum; - NSString *recipient, *uid, *eventUID, *delegateEmail; - iCalEvent *event; - iCalPerson *attendee, *person, *delegate; - SOGoAppointmentObject *recipientEvent; - SOGoUser *ownerUser; + NSMutableArray *elements; + NSString *recipient; elements = [NSMutableArray array]; - event = [self component: NO secure: NO]; - [[event parent] setMethod: @""]; - ownerUser = [SOGoUser userWithLogin: [[SOGoUserManager sharedUserManager] - getUIDForEmail: originator]]; - attendee = [event userAsAttendee: ownerUser]; - eventUID = [event uid]; - - delegate = nil; - delegateEmail = [attendee delegatedTo]; - if ([delegateEmail length]) - { - delegateEmail = [delegateEmail substringFromIndex: 7]; - if ([delegateEmail length]) - delegate - = [event findAttendeeWithEmail: delegateEmail]; - } - recipientsEnum = [recipients objectEnumerator]; + while ((recipient = [recipientsEnum nextObject])) if ([[recipient lowercaseString] hasPrefix: @"mailto:"]) { - person = [iCalPerson new]; - [person setValue: 0 to: recipient]; - uid = [person uid]; - if (uid) - { - recipientEvent = [self _lookupEvent: eventUID forUID: uid]; - if ([recipientEvent isNew]) - [recipientEvent saveComponent: event]; - else - [recipientEvent takeAttendeeStatus: attendee - withDelegate: delegate - from: ownerUser - withRecurrenceId: [event recurrenceId]]; - } - - // Send reply to recipient/organizer - [self sendIMIPReplyForEvent: event - from: ownerUser - to: person]; - [person release]; - [elements - addObject: [self _caldavSuccessCodeWithRecipient: recipient]]; + [elements addObject: [self _caldavSuccessCodeWithRecipient: recipient]]; } return elements; } // -// This method is invoked only from the SOGo Web interface. +// // - (NSException *) changeParticipationStatus: (NSString *) status withDelegate: (iCalPerson *) delegate @@ -1405,59 +1133,59 @@ return ex; } +// +// +// - (void) prepareDeleteOccurence: (iCalEvent *) occurence { iCalEvent *event; SOGoUser *ownerUser, *currentUser; NSArray *attendees; NSCalendarDate *recurrenceId; - - if ([[context request] handledByDefaultHandler]) + + ownerUser = [SOGoUser userWithLogin: owner]; + event = [self component: NO secure: NO]; + + if (occurence == nil) { - ownerUser = [SOGoUser userWithLogin: owner]; - event = [self component: NO secure: NO]; - - if (occurence == nil) - { - // No occurence specified; use the master event. - occurence = event; - recurrenceId = nil; - } - else - // Retrieve this occurence ID. - recurrenceId = [occurence recurrenceId]; - - if ([event userIsOrganizer: ownerUser]) - { - // The organizer deletes an occurence. - currentUser = [context activeUser]; - attendees = [occurence attendeesWithoutUser: currentUser]; - -#warning Make sure this is correct .. - if (![attendees count] && event != occurence) - attendees = [event attendeesWithoutUser: currentUser]; - - if ([attendees count]) - { - // Remove the event from all attendees calendars - // and send them an email. - [self _handleRemovedUsers: attendees - withRecurrenceId: recurrenceId]; - [self sendEMailUsingTemplateNamed: @"Deletion" - forObject: [occurence itipEntryWithMethod: @"cancel"] - previousObject: nil - toAttendees: attendees]; - [self sendReceiptEmailUsingTemplateNamed: @"Deletion" - forObject: occurence - to: attendees]; - } - } - else if ([occurence userIsAttendee: ownerUser]) - // The current user deletes the occurence; let the organizer know that - // the user has declined this occurence. - [self changeParticipationStatus: @"DECLINED" withDelegate: nil - forRecurrenceId: recurrenceId]; + // No occurence specified; use the master event. + occurence = event; + recurrenceId = nil; } + else + // Retrieve this occurence ID. + recurrenceId = [occurence recurrenceId]; + + if ([event userIsOrganizer: ownerUser]) + { + // The organizer deletes an occurence. + currentUser = [context activeUser]; + attendees = [occurence attendeesWithoutUser: currentUser]; + +#warning Make sure this is correct .. + if (![attendees count] && event != occurence) + attendees = [event attendeesWithoutUser: currentUser]; + + if ([attendees count]) + { + // Remove the event from all attendees calendars + // and send them an email. + [self _handleRemovedUsers: attendees + withRecurrenceId: recurrenceId]; + [self sendEMailUsingTemplateNamed: @"Deletion" + forObject: [occurence itipEntryWithMethod: @"cancel"] + previousObject: nil + toAttendees: attendees]; + [self sendReceiptEmailUsingTemplateNamed: @"Deletion" + forObject: occurence + to: attendees]; + } + } + else if ([occurence userIsAttendee: ownerUser]) + // The current user deletes the occurence; let the organizer know that + // the user has declined this occurence. + [self changeParticipationStatus: @"DECLINED" withDelegate: nil + forRecurrenceId: recurrenceId]; } - (NSException *) prepareDelete @@ -1603,6 +1331,66 @@ [rq setContent: [[calendar versitString] dataUsingEncoding: [rq contentEncoding]]]; } + +// +// If theRecurrenceId is nil, it returns immediately the +// first event that has a RECURRENCE-ID. +// +// Otherwise, it return values that matches. +// +- (iCalEvent *) _eventFromRecurrenceId: (NSCalendarDate *) theRecurrenceId + events: (NSArray *) allEvents +{ + iCalEvent *event; + int i; + + for (i = 0; i < [allEvents count]; i++) + { + event = [allEvents objectAtIndex: i]; + + if ([event recurrenceId] && !theRecurrenceId) + return event; + + if ([event recurrenceId] && [[event recurrenceId] compare: theRecurrenceId] == NSOrderedSame) + return event; + } + + return nil; +} + +// +// +// +- (NSCalendarDate *) _addedExDate: (iCalEvent *) oldEvent + newEvent: (iCalEvent *) newEvent +{ + NSArray *oldExDates, *newExDates; + NSMutableArray *dates; + int i; + + dates = [NSMutableArray array]; + + newExDates = [newEvent childrenWithTag: @"exdate"]; + for (i = 0; i < [newExDates count]; i++) + [dates addObject: [[newExDates objectAtIndex: i] dateTime]]; + + oldExDates = [oldEvent childrenWithTag: @"exdate"]; + for (i = 0; i < [oldExDates count]; i++) + [dates removeObject: [[oldExDates objectAtIndex: i] dateTime]]; + + return [dates lastObject]; +} + + +// +// +// +- (id) DELETEAction: (WOContext *) _ctx +{ + [self prepareDeleteOccurence: nil]; + return [super DELETEAction: _ctx]; +} + // // If we see "X-SOGo: NoGroupsDecomposition" in the HTTP headers, we // simply invoke super's PUTAction. @@ -1614,10 +1402,16 @@ { NSArray *roles; WORequest *rq; - + id response; + rq = [_ctx request]; - - roles = [[context activeUser] rolesForObject: self inContext: context]; + roles = [[context activeUser] rolesForObject: self inContext: context]; + + // + // We check if we gave only the "Respond To" right and someone is actually + // responding to one of our invitation. In this case, _setupResponseCalendarInRequest + // will only take the new attendee status and actually discard any other modifications. + // if ([roles containsObject: @"ComponentResponder"] && ![roles containsObject: @"ComponentModifier"]) [self _setupResponseCalendarInRequest: rq]; @@ -1638,7 +1432,224 @@ } } - return [super PUTAction: _ctx]; + // + // We first check if it's a new event + // + if ([self isNew]) + { + iCalCalendar *calendar; + iCalEvent *event; + SOGoUser *ownerUser; + + calendar = [iCalCalendar parseSingleFromSource: [rq contentAsString]]; + event = [[calendar events] objectAtIndex: 0]; + ownerUser = [SOGoUser userWithLogin: owner]; + + // + // New event and we're the organizer -- send invitation to all attendees + // + if ([event userIsOrganizer: ownerUser]) + { + NSArray *attendees; + + attendees = [event attendeesWithoutUser: ownerUser]; + if ([attendees count]) + { + [self _handleAddedUsers: attendees fromEvent: event]; + [self sendEMailUsingTemplateNamed: @"Invitation" + forObject: [event itipEntryWithMethod: @"request"] + previousObject: nil + toAttendees: attendees]; + [self sendReceiptEmailUsingTemplateNamed: @"Invitation" + forObject: event to: attendees]; + } + } + // + // We aren't the organizer but we're an attendee. That can happen when + // we receive an external invitation (IMIP/ITIP) and we accept it + // from a CUA - it gets added to a specific CalDAV calendar using a PUT + // + else if ([event userIsAttendee: ownerUser]) + { + [self sendIMIPReplyForEvent: event + from: ownerUser + to: [event organizer]]; + } + } + else + { + iCalCalendar *oldCalendar, *newCalendar; + iCalEvent *oldEvent, *newEvent; + iCalEventChanges *changes; + NSMutableArray *oldEvents, *newEvents; + NSCalendarDate *recurrenceId; + NSException *error; + BOOL master; + int i; + + // + // We must check for etag changes prior doing anything since an attendee could + // have changed its participation status and the organizer didn't get the + // copy and is trying to do a modification to the event. + // + error = [self matchesRequestConditionInContext: _ctx]; + + if (error) + return (WOResponse *)error; + + // + // We check what has changed in the event and react accordingly. + // + newCalendar = [iCalCalendar parseSingleFromSource: [rq contentAsString]]; + newEvents = [NSMutableArray arrayWithArray: [newCalendar events]]; + + oldCalendar = [self calendar: NO secure: NO]; + oldEvents = [NSMutableArray arrayWithArray: [oldCalendar events]]; + recurrenceId = nil; + master = NO; + + for (i = [newEvents count]-1; i >= 0; i--) + { + newEvent = [newEvents objectAtIndex: i]; + + if ([newEvent recurrenceId]) + { + // Find the corresponding RECURRENCE-ID in the old calendar + // If not present, we assume it was created before the PUT + oldEvent = [self _eventFromRecurrenceId: [newEvent recurrenceId] + events: oldEvents]; + + // If present, we look for changes + changes = [iCalEventChanges changesFromEvent: oldEvent toEvent: newEvent]; + + if ([changes sequenceShouldBeIncreased] | [changes hasAttendeeChanges]) + { + // We found a RECURRENCE-ID with changes, we consider it + recurrenceId = [newEvent recurrenceId]; + break; + } + else + { + [newEvents removeObject: oldEvent]; + [oldEvents removeObject: newEvent]; + } + } + + oldEvent = nil; + newEvent = nil; + } + + // If no changes were observed, let's see if we have any left overs + // in the oldEvents or in the newEvents array + if (!oldEvent && !newEvent) + { + // We check if we only have to deal with the MASTER event + if ([newEvents count] == [oldEvents count]) + { + oldEvent = [oldEvents objectAtIndex: 0]; + newEvent = [newEvents objectAtIndex: 0]; + master = YES; + } + // A RECURRENCE-ID was added + else if ([newEvents count] > [oldEvents count]) + { + oldEvent = nil; + newEvent = [self _eventFromRecurrenceId: nil events: newEvents]; + recurrenceId = [newEvent recurrenceId]; + } + // A RECURRENCE-ID was removed + else + { + oldEvent = [self _eventFromRecurrenceId: nil events: oldEvents]; + newEvent = nil; + recurrenceId = [oldEvent recurrenceId]; + } + } + + // We check if the PUT call is actually an PART-STATE change + // from one of the attendees - here's the logic : + // + // if owner == organizer + // + // if [context activeUser] == organizer + // [send the invitation update] + // else + // [react on SENT-BY as someone else is acting for the organizer] + // + // + if ([[newEvent attendees] count] || [[oldEvent attendees] count]) + { + if ([[[newEvent organizer] uid] caseInsensitiveCompare: owner] == NSOrderedSame) + { + [self _handleUpdatedEvent: newEvent fromOldEvent: oldEvent]; + + // A RECURRENCE-ID was removed so there has to be a change in the master event + // We could also have an EXDATE added in the master component of the attendees + // so we always compare the MASTER event. + if (!master) + { + newEvent = [newEvents objectAtIndex: 0]; + oldEvent = [oldEvents objectAtIndex: 0]; + [self _handleUpdatedEvent: newEvent fromOldEvent: oldEvent]; + } + } + // + // else => attendee is responding + // + // if [context activeUser] == attendee + // [we change the PART-STATE] + // else + // [react on SENT-BY as someone else is acting for the attendee] + else + { + iCalPerson *attendee, *delegate; + NSString *delegateEmail; + + attendee = [newEvent userAsAttendee: [SOGoUser userWithLogin: owner]]; + + delegate = nil; + delegateEmail = [attendee delegatedTo]; + + if ([delegateEmail length]) + { + delegateEmail = [delegateEmail substringFromIndex: 7]; + if ([delegateEmail length]) + delegate = [newEvent findAttendeeWithEmail: delegateEmail]; + } + + changes = [iCalEventChanges changesFromEvent: oldEvent toEvent: newEvent]; + + // The current user deletes the occurence; let the organizer know that + // the user has declined this occurence. + if ([[changes updatedProperties] containsObject: @"exdate"]) + { + [self changeParticipationStatus: @"DECLINED" + withDelegate: nil // (specify delegate?) + forRecurrenceId: [self _addedExDate: oldEvent newEvent: newEvent]]; + } + else + [self changeParticipationStatus: [attendee partStat] + withDelegate: delegate + forRecurrenceId: recurrenceId]; + + // A RECURRENCE-ID was removed so there has to be a change in the master event + // We could also have an EXDATE added in the master component of the attendees + // so we always compare the MASTER event. + if (!master) + { + newEvent = [newEvents objectAtIndex: 0]; + oldEvent = [oldEvents objectAtIndex: 0]; + [self changeParticipationStatus: [attendee partStat] withDelegate: delegate]; + } + } + } + } + + // This will save the event into the database and also handle + // E-Tags properly, as well as content versioning. + response = [super PUTAction: _ctx]; + + return response; } @end /* SOGoAppointmentObject */ diff --git a/SoObjects/Appointments/SOGoComponentOccurence.m b/SoObjects/Appointments/SOGoComponentOccurence.m index 6c74a647c..831181307 100644 --- a/SoObjects/Appointments/SOGoComponentOccurence.m +++ b/SoObjects/Appointments/SOGoComponentOccurence.m @@ -1,6 +1,6 @@ /* SOGoComponentOccurence.m - this file is part of SOGo * - * Copyright (C) 2008 Inverse inc. + * Copyright (C) 2008-2010 Inverse inc. * * Author: Wolfgang Sourdeau * diff --git a/SoObjects/Appointments/iCalEntityObject+SOGo.m b/SoObjects/Appointments/iCalEntityObject+SOGo.m index b5d21f6a4..831ac3d3a 100644 --- a/SoObjects/Appointments/iCalEntityObject+SOGo.m +++ b/SoObjects/Appointments/iCalEntityObject+SOGo.m @@ -1,6 +1,6 @@ /* iCalEntityObject+SOGo.m - this file is part of SOGo * - * Copyright (C) 2007 Inverse inc. + * Copyright (C) 2007-2010 Inverse inc. * * Author: Wolfgang Sourdeau * diff --git a/SoObjects/Appointments/iCalEventChanges+SOGo.m b/SoObjects/Appointments/iCalEventChanges+SOGo.m index 9385f13f9..5e5c3d383 100644 --- a/SoObjects/Appointments/iCalEventChanges+SOGo.m +++ b/SoObjects/Appointments/iCalEventChanges+SOGo.m @@ -1,6 +1,6 @@ /* iCalEventChanges+SOGo.m - this file is part of SOGo * - * Copyright (C) 2007 Inverse inc. + * Copyright (C) 2007-2010 Inverse inc. * * Author: Wolfgang Sourdeau * @@ -34,7 +34,6 @@ @"due", @"duration", @"rdate", @"rrule", @"exdate", @"exrule", @"status", @"location", - //@"summary", @"comment", nil}; NSString **currentProperty; BOOL updateRequired; diff --git a/SoObjects/SOGo/SOGoContentObject.m b/SoObjects/SOGo/SOGoContentObject.m index e60b23e85..de10e398c 100644 --- a/SoObjects/SOGo/SOGoContentObject.m +++ b/SoObjects/SOGo/SOGoContentObject.m @@ -1,14 +1,15 @@ /* + Copyright (C) 2006-2010 Inverse inc. Copyright (C) 2004-2005 SKYRIX Software AG - This file is part of OpenGroupware.org. + This file is part of SOGo. - OGo is free software; you can redistribute it and/or modify it under + SOGo is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. - OGo is distributed in the hope that it will be useful, but WITHOUT ANY + SOGo 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 Lesser General Public License for more details. diff --git a/SoObjects/SOGo/SOGoObject.h b/SoObjects/SOGo/SOGoObject.h index 44e30bfa4..5afa123a2 100644 --- a/SoObjects/SOGo/SOGoObject.h +++ b/SoObjects/SOGo/SOGoObject.h @@ -115,6 +115,7 @@ /* operations */ - (NSException *)delete; +- (id) DELETEAction: (id) _ctx; - (id)GETAction:(id)_ctx; /* etag support */ From 15526db83182eb7e12f3690d599d4956d6e1c516 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 11 Aug 2010 16:23:47 +0000 Subject: [PATCH 08/12] See ChangeLog Monotone-Parent: 2be823800b3a3aa4e40219b1fbfa546bd5cc1db3 Monotone-Revision: 89320b31db49181dce46dc16f17984d806609750 Monotone-Author: ludovic@Sophos.ca Monotone-Date: 2010-08-11T16:23:47 --- ChangeLog | 3 +++ SOPE/NGCards/iCalRecurrenceRule.m | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index e4862968a..e78f0b166 100644 --- a/ChangeLog +++ b/ChangeLog @@ -6,6 +6,9 @@ code will always succeed and the new code reuses all the business logic used for the Web interface of SOGo. + * SOPE/NGCards/iCalRecurrenceRule.m + Modified setInterval: so that when the value is + equal to 1, we do NOT set it. 2010-08-03 Ludovic Marcotte diff --git a/SOPE/NGCards/iCalRecurrenceRule.m b/SOPE/NGCards/iCalRecurrenceRule.m index 1abc726bc..763a896dd 100644 --- a/SOPE/NGCards/iCalRecurrenceRule.m +++ b/SOPE/NGCards/iCalRecurrenceRule.m @@ -383,7 +383,10 @@ NSString *iCalWeekDayString[] = { @"SU", @"MO", @"TU", @"WE", @"TH", @"FR", - (void) setInterval: (NSString *) _interval { - [self setNamedValue: @"interval" to: _interval]; + if (_interval && [_interval intValue] == 1) + [self setNamedValue: @"interval" to: nil]; + else + [self setNamedValue: @"interval" to: _interval]; } - (void) setCount: (NSString *) _count From 5c291627a4209c6e16b6eeaf05a98fe6f73b90f0 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 11 Aug 2010 17:23:59 +0000 Subject: [PATCH 09/12] See ChangeLog Monotone-Parent: 89320b31db49181dce46dc16f17984d806609750 Monotone-Revision: 3567e5aef4045091a835f8185e4f1ff94e748c78 Monotone-Author: ludovic@Sophos.ca Monotone-Date: 2010-08-11T17:23:59 --- ChangeLog | 3 +++ UI/Common/UIxAclEditor.m | 2 +- UI/Common/UIxObjectActions.m | 2 +- UI/WebServerResources/UIxAclEditor.js | 9 +++++++-- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index e78f0b166..7b28e7d09 100644 --- a/ChangeLog +++ b/ChangeLog @@ -9,6 +9,9 @@ * SOPE/NGCards/iCalRecurrenceRule.m Modified setInterval: so that when the value is equal to 1, we do NOT set it. + * UI/WebServerResources/UIxAclEditor.js + In addUserCallback(), we remove the owner of the + resource if it was added. 2010-08-03 Ludovic Marcotte diff --git a/UI/Common/UIxAclEditor.m b/UI/Common/UIxAclEditor.m index 0eadb9f02..e825a8bcd 100644 --- a/UI/Common/UIxAclEditor.m +++ b/UI/Common/UIxAclEditor.m @@ -1,6 +1,6 @@ /* UIxAclEditor.m - this file is part of SOGo * - * Copyright (C) 2006-2009 Inverse inc. + * Copyright (C) 2006-2010 Inverse inc. * * Author: Wolfgang Sourdeau * diff --git a/UI/Common/UIxObjectActions.m b/UI/Common/UIxObjectActions.m index 4a6c540ac..ba76d2a0e 100644 --- a/UI/Common/UIxObjectActions.m +++ b/UI/Common/UIxObjectActions.m @@ -1,6 +1,6 @@ /* UIxObjectActions.m - this file is part of SOGo * - * Copyright (C) 2007 Inverse inc. + * Copyright (C) 2007-2010 Inverse inc. * * Author: Wolfgang Sourdeau * diff --git a/UI/WebServerResources/UIxAclEditor.js b/UI/WebServerResources/UIxAclEditor.js index ecd76c4e7..f206abcf6 100644 --- a/UI/WebServerResources/UIxAclEditor.js +++ b/UI/WebServerResources/UIxAclEditor.js @@ -36,14 +36,19 @@ function addUser(userName, userID) { var elements = url.split("/"); elements[elements.length-1] = ("addUserInAcls?uid=" + userID); - triggerAjaxRequest(elements.join("/"), addUserCallback); + triggerAjaxRequest(elements.join("/"), addUserCallback, newNode); result = true; } return result; } function addUserCallback(http) { - // Ignore response + if (http.readyState == 4) { + if (!isHttpStatus204(http.status)) { + var node = http.callbackData; + node.parentNode.removeChild(node); + } + } } function setEventsOnUserNode(node) { From 798076e6faf4c301bb21f8485a61d7b78edef4ad Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 11 Aug 2010 18:29:05 +0000 Subject: [PATCH 10/12] See ChangeLog Monotone-Parent: 3567e5aef4045091a835f8185e4f1ff94e748c78 Monotone-Revision: e43c9b00bdea42b8d8040a8c2bb1123e3a5230ec Monotone-Author: ludovic@Sophos.ca Monotone-Date: 2010-08-11T18:29:05 --- ChangeLog | 6 +++++- SoObjects/SOGo/NSString+Utilities.m | 4 ++-- UI/MailerUI/UIxMailFolderActions.m | 2 +- UI/WebServerResources/JavascriptAPIExtensions.js | 4 ++-- UI/WebServerResources/MailerUI.js | 5 ++--- 5 files changed, 12 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7b28e7d09..b7eab5285 100644 --- a/ChangeLog +++ b/ChangeLog @@ -11,7 +11,11 @@ equal to 1, we do NOT set it. * UI/WebServerResources/UIxAclEditor.js In addUserCallback(), we remove the owner of the - resource if it was added. + resource if it was added. This fixes #682. + * We now correctly encode/decode the '&' + character in the mailbox name when copying and moving + messages and also when opening mailboxes. This + fixes #716. 2010-08-03 Ludovic Marcotte diff --git a/SoObjects/SOGo/NSString+Utilities.m b/SoObjects/SOGo/NSString+Utilities.m index 62366309b..108bc508f 100644 --- a/SoObjects/SOGo/NSString+Utilities.m +++ b/SoObjects/SOGo/NSString+Utilities.m @@ -263,12 +263,12 @@ static int cssEscapingCount; int count; strings = [NSArray arrayWithObjects: @"_U_", @"_D_", @"_H_", @"_A_", @"_S_", - @"_C_", @"_CO_", @"_SP_", @"_SQ_", nil]; + @"_C_", @"_CO_", @"_SP_", @"_SQ_", @"_AM_", nil]; [strings retain]; cssEscapingStrings = [strings asPointersOfObjects]; characters = [NSArray arrayWithObjects: @"_", @".", @"#", @"@", @"*", @":", - @",", @" ", @"'", nil]; + @",", @" ", @"'", @"&", nil]; cssEscapingCount = [strings count]; cssEscapingCharacters = NSZoneMalloc (NULL, (cssEscapingCount + 1) diff --git a/UI/MailerUI/UIxMailFolderActions.m b/UI/MailerUI/UIxMailFolderActions.m index f04d3283f..4d0653287 100644 --- a/UI/MailerUI/UIxMailFolderActions.m +++ b/UI/MailerUI/UIxMailFolderActions.m @@ -1,6 +1,6 @@ /* UIxMailFolderActions.m - this file is part of SOGo * - * Copyright (C) 2007-2009 Inverse inc. + * Copyright (C) 2007-2010 Inverse inc. * * Author: Wolfgang Sourdeau * diff --git a/UI/WebServerResources/JavascriptAPIExtensions.js b/UI/WebServerResources/JavascriptAPIExtensions.js index 9da6233e5..f0dda1572 100644 --- a/UI/WebServerResources/JavascriptAPIExtensions.js +++ b/UI/WebServerResources/JavascriptAPIExtensions.js @@ -60,8 +60,8 @@ String.prototype.asDate = function () { }; String.prototype.asCSSIdentifier = function() { - var characters = [ '_' , '\\.', '#' , '@' , '\\*', ':' , ',' , ' ' , "'" ]; - var escapeds = [ '_U_', '_D_', '_H_', '_A_', '_S_', '_C_', '_CO_', '_SP_', '_SQ_' ]; + var characters = [ '_' , '\\.', '#' , '@' , '\\*', ':' , ',' , ' ' , "'", '&' ]; + var escapeds = [ '_U_', '_D_', '_H_', '_A_', '_S_', '_C_', '_CO_', '_SP_', '_SQ_', '_AM_' ]; var newString = this; for (var i = 0; i < characters.length; i++) { diff --git a/UI/WebServerResources/MailerUI.js b/UI/WebServerResources/MailerUI.js index a32c13810..204f0e1aa 100644 --- a/UI/WebServerResources/MailerUI.js +++ b/UI/WebServerResources/MailerUI.js @@ -551,7 +551,7 @@ function onMailboxMenuMove(event) { deleteCachedMailbox(targetMailbox); var url = ApplicationBaseURL + encodeURI(Mailer.currentMailbox) + "/moveMessages"; - var parameters = "uid=" + uids.join(",") + "&folder=" + targetMailbox; + var parameters = "uid=" + uids.join(",") + "&folder=" + encodeURIComponent(targetMailbox); var data = { "id": uids, "mailbox": Mailer.currentMailbox, "path": paths, "folder": targetMailbox, "refresh": true }; triggerAjaxRequest(url, folderRefreshCallback, data, parameters, { "Content-type": "application/x-www-form-urlencoded" }); @@ -570,7 +570,6 @@ function onMailboxMenuCopy(event) { targetMailbox = this.mailbox.fullName(); else // from DnD targetMailbox = this.readAttribute("dataname"); - for (var i = 0; i < rows.length; i++) { var uid = rows[i].readAttribute("id").substr(4); var path = Mailer.currentMailbox + "/" + uid; @@ -582,7 +581,7 @@ function onMailboxMenuCopy(event) { deleteCachedMailbox(targetMailbox); var url = ApplicationBaseURL + encodeURI(Mailer.currentMailbox) + "/copyMessages"; - var parameters = "uid=" + uids.join(",") + "&folder=" + targetMailbox; + var parameters = "uid=" + uids.join(",") + "&folder=" + encodeURIComponent(targetMailbox); var data = { "id": uids, "mailbox": Mailer.currentMailbox, "path": paths, "folder": targetMailbox, "refresh": false }; triggerAjaxRequest(url, folderRefreshCallback, data, parameters, { "Content-type": "application/x-www-form-urlencoded" }); From a6df60d4d8b3f7ea298589514da18a1e82d59d59 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 12 Aug 2010 15:31:17 +0000 Subject: [PATCH 11/12] See ChangeLog Monotone-Parent: e43c9b00bdea42b8d8040a8c2bb1123e3a5230ec Monotone-Revision: 5016da15e7302739b395754fe5a9d170409343ae Monotone-Author: ludovic@Sophos.ca Monotone-Date: 2010-08-12T15:31:17 --- ChangeLog | 6 ++++++ UI/WebServerResources/MailerUI.js | 4 +++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index b7eab5285..5f16b1b4b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2010-08-11 Francis Lachapelle + + * UI/WebServerResources/MailerUI.js (refreshMessage): if the + current mailbox is the sent folder, refresh the mailbox instead of + only the message. + 2010-08-11 Ludovic Marcotte * SoObjects/Appointments/SOGoAppointmentObject.m diff --git a/UI/WebServerResources/MailerUI.js b/UI/WebServerResources/MailerUI.js index 204f0e1aa..f471cc827 100644 --- a/UI/WebServerResources/MailerUI.js +++ b/UI/WebServerResources/MailerUI.js @@ -1571,7 +1571,9 @@ function refreshCurrentFolder() { /* Called after sending an email */ function refreshMessage(mailbox, messageUID) { - if (mailbox == Mailer.currentMailbox) { + if (Mailer.currentMailboxType == 'sent') + refreshCurrentFolder(); + else if (mailbox == Mailer.currentMailbox) { Mailer.dataTable.invalidate(messageUID); } } From 89d3d4b413a75bad1a09eeb5688156d0f0c040c9 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 12 Aug 2010 17:56:18 +0000 Subject: [PATCH 12/12] See ChangeLog Monotone-Parent: 5016da15e7302739b395754fe5a9d170409343ae Monotone-Revision: f6a0b62965278336b461dac36045bfae5fc07f0a Monotone-Author: ludovic@Sophos.ca Monotone-Date: 2010-08-12T17:56:18 --- ChangeLog | 18 +++++++++++++ NEWS | 1 + UI/Common/UIxPageFrame.m | 9 +++++++ UI/MainUI/SOGoRootPage.m | 5 ++++ UI/MainUI/product.plist | 7 +++++- UI/Templates/UIxPageFrame.wox | 6 +++++ UI/WebServerResources/generic.js | 43 ++++++++++++++++++++++++-------- 7 files changed, 78 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5f16b1b4b..223e5b6e0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +2010-08-12 Wolfgang Sourdeau + + * UI/WebServerResources/generic.js: (onAjaxRequestStateChange): + when using CAS authentication and when the return code is 0 and + when the request status is 4, chances are that the initial ajax + request failed due to the expiration of the CAS ticket entry in + memcached. In FF 3.5 and above, a bug prevents the initial cookie + from being given back to the reauthentication redirect from an + AJAX request. Therefore we open a window that will do this for us + and will close one the authentication has succeeded again. + + * UI/MainUI/SOGoRootPage.m (-revoverAction): new fake action that + perform the CAS redirection and then trigger the respawn of the + initial request. + + * UI/Common/UIxPageFrame.m (-usesCASAuthentication): new accessor + used for recovery of redirected requests. + 2010-08-11 Francis Lachapelle * UI/WebServerResources/MailerUI.js (refreshMessage): if the diff --git a/NEWS b/NEWS index 5899a341e..0d7412b5b 100644 --- a/NEWS +++ b/NEWS @@ -4,6 +4,7 @@ - added Polish translation - added crypt support to SQL sources - updated Ukrainian translation +- added the caldav-auto-schedule capability 1.3-20100721 (1.3.0) -------------------- diff --git a/UI/Common/UIxPageFrame.m b/UI/Common/UIxPageFrame.m index cc81a8e3f..ec6b0bb08 100644 --- a/UI/Common/UIxPageFrame.m +++ b/UI/Common/UIxPageFrame.m @@ -400,6 +400,15 @@ && [user isSuperUser]); } +- (BOOL) usesCASAuthentication +{ + SOGoSystemDefaults *sd; + + sd = [SOGoSystemDefaults sharedSystemDefaults]; + + return [[sd authenticationType] isEqualToString: @"cas"]; +} + - (NSString *) userIdentification { /* The "identification" term is used in the human sense here. */ diff --git a/UI/MainUI/SOGoRootPage.m b/UI/MainUI/SOGoRootPage.m index 842da7402..18cba979e 100644 --- a/UI/MainUI/SOGoRootPage.m +++ b/UI/MainUI/SOGoRootPage.m @@ -435,4 +435,9 @@ return response; } +- (id) recoverAction +{ + return [self jsCloseWithRefreshMethod: @"recoverRequest();"]; +} + @end /* SOGoRootPage */ diff --git a/UI/MainUI/product.plist b/UI/MainUI/product.plist index 7bb31f229..0def5f8f3 100644 --- a/UI/MainUI/product.plist +++ b/UI/MainUI/product.plist @@ -106,10 +106,15 @@ }; }; methods = { - view = { + view = { protectedBy = ""; pageName = "SOGoRootPage"; }; + recover = { + protectedBy = "View"; + pageName = "SOGoRootPage"; + actionName = "recover"; + }; index = { protectedBy = ""; pageName = "SOGoRootPage"; diff --git a/UI/Templates/UIxPageFrame.wox b/UI/Templates/UIxPageFrame.wox index df00f15f2..ca5a71775 100644 --- a/UI/Templates/UIxPageFrame.wox +++ b/UI/Templates/UIxPageFrame.wox @@ -122,6 +122,12 @@ var IsSuperUser = false; + var usesCASAuthentication = true; + + var usesCASAuthentication = false; + var UserFolderURL = ''; diff --git a/UI/WebServerResources/generic.js b/UI/WebServerResources/generic.js index 91be90dbc..0ff1b1c12 100644 --- a/UI/WebServerResources/generic.js +++ b/UI/WebServerResources/generic.js @@ -27,6 +27,7 @@ var logConsole; var logWindow = null; var queryParameters; +var recoveryRequest = null; var menus = new Array(); var search = {}; @@ -246,15 +247,26 @@ function createHTTPClient() { function onAjaxRequestStateChange(http) { try { - if (http.readyState == 4 - && activeAjaxRequests > 0) { - if (!http.aborted) - http.callback(http); - activeAjaxRequests--; - checkAjaxRequestsState(); - http.onreadystatechange = Prototype.emptyFunction; - http.callback = Prototype.emptyFunction; - http.callbackData = null; + if (http.readyState == 4) { + if (http.status == 0 && usesCASAuthentication) { + activeAjaxRequests--; + checkAjaxRequestsState(); + recoveryRequest = http; + var urlstr = ApplicationBaseURL; + if (!urlstr.endsWith('/')) + urlstr += '/'; + urlstr += ("../../recover"); + window.open(urlstr, "_blank"); + } + else if (activeAjaxRequests > 0) { + if (!http.aborted) + http.callback(http); + activeAjaxRequests--; + checkAjaxRequestsState(); + http.onreadystatechange = Prototype.emptyFunction; + http.callback = Prototype.emptyFunction; + http.callbackData = null; + } } } catch(e) { @@ -276,6 +288,16 @@ function onAjaxRequestStateChange(http) { } } +function recoverRequest() { + if (recoveryRequest) { + triggerAjaxRequest(recoveryRequest.url, + recoveryRequest.callback, + recoveryRequest.callbackData, + recoveryRequest.paramHeaders); + recoveryRequest = null; + } +} + /* taken from Lightning */ function getContrastingTextColor(bgColor) { var calcColor = bgColor.substring(1); @@ -299,9 +321,10 @@ function triggerAjaxRequest(url, callback, userdata, content, headers) { http.open("POST", url, true); http.url = url; + http.paramHeaders = headers; http.callback = callback; http.callbackData = userdata; - http.onreadystatechange = function() { onAjaxRequestStateChange(http);}; + http.onreadystatechange = function() { onAjaxRequestStateChange(http); }; // = function() { // // log ("state changed (" + http.readyState + "): " + url); // };