Merge to 2.3.20

This commit is contained in:
Francis Lachapelle
2017-03-10 11:14:52 -05:00
217 changed files with 5077 additions and 734 deletions
+11
View File
@@ -15,6 +15,7 @@ trans.es_ES = UI/MailerUI/SpanishSpain.lproj/Localizable.strings
trans.eu = UI/MailerUI/Basque.lproj/Localizable.strings
trans.fi = UI/MailerUI/Finnish.lproj/Localizable.strings
trans.fr = UI/MailerUI/French.lproj/Localizable.strings
trans.he = UI/MailerUI/Hebrew.lproj/Localizable.strings
trans.hr_HR = UI/MailerUI/Croatian.lproj/Localizable.strings
trans.hu = UI/MailerUI/Hungarian.lproj/Localizable.strings
trans.is = UI/MailerUI/Icelandic.lproj/Localizable.strings
@@ -50,6 +51,7 @@ trans.es_ES = UI/PreferencesUI/SpanishSpain.lproj/Localizable.strings
trans.eu = UI/PreferencesUI/Basque.lproj/Localizable.strings
trans.fi = UI/PreferencesUI/Finnish.lproj/Localizable.strings
trans.fr = UI/PreferencesUI/French.lproj/Localizable.strings
trans.he = UI/PreferencesUI/Hebrew.lproj/Localizable.strings
trans.hr_HR = UI/PreferencesUI/Croatian.lproj/Localizable.strings
trans.hu = UI/PreferencesUI/Hungarian.lproj/Localizable.strings
trans.is = UI/PreferencesUI/Icelandic.lproj/Localizable.strings
@@ -85,6 +87,7 @@ trans.es_ES = UI/Scheduler/SpanishSpain.lproj/Localizable.strings
trans.eu = UI/Scheduler/Basque.lproj/Localizable.strings
trans.fi = UI/Scheduler/Finnish.lproj/Localizable.strings
trans.fr = UI/Scheduler/French.lproj/Localizable.strings
trans.he = UI/Scheduler/Hebrew.lproj/Localizable.strings
trans.hr_HR = UI/Scheduler/Croatian.lproj/Localizable.strings
trans.hu = UI/Scheduler/Hungarian.lproj/Localizable.strings
trans.is = UI/Scheduler/Icelandic.lproj/Localizable.strings
@@ -120,6 +123,7 @@ trans.es_ES = UI/Contacts/SpanishSpain.lproj/Localizable.strings
trans.eu = UI/Contacts/Basque.lproj/Localizable.strings
trans.fi = UI/Contacts/Finnish.lproj/Localizable.strings
trans.fr = UI/Contacts/French.lproj/Localizable.strings
trans.he = UI/Contacts/Hebrew.lproj/Localizable.strings
trans.hr_HR = UI/Contacts/Croatian.lproj/Localizable.strings
trans.hu = UI/Contacts/Hungarian.lproj/Localizable.strings
trans.is = UI/Contacts/Icelandic.lproj/Localizable.strings
@@ -155,6 +159,7 @@ trans.es_ES = UI/MainUI/SpanishSpain.lproj/Localizable.strings
trans.eu = UI/MainUI/Basque.lproj/Localizable.strings
trans.fi = UI/MainUI/Finnish.lproj/Localizable.strings
trans.fr = UI/MainUI/French.lproj/Localizable.strings
trans.he = UI/MainUI/Hebrew.lproj/Localizable.strings
trans.hr_HR = UI/MainUI/Croatian.lproj/Localizable.strings
trans.hu = UI/MainUI/Hungarian.lproj/Localizable.strings
trans.is = UI/MainUI/Icelandic.lproj/Localizable.strings
@@ -190,6 +195,7 @@ trans.es_ES = UI/Common/SpanishSpain.lproj/Localizable.strings
trans.eu = UI/Common/Basque.lproj/Localizable.strings
trans.fi = UI/Common/Finnish.lproj/Localizable.strings
trans.fr = UI/Common/French.lproj/Localizable.strings
trans.he = UI/Common/Hebrew.lproj/Localizable.strings
trans.hr_HR = UI/Common/Croatian.lproj/Localizable.strings
trans.hu = UI/Common/Hungarian.lproj/Localizable.strings
trans.is = UI/Common/Icelandic.lproj/Localizable.strings
@@ -225,6 +231,7 @@ trans.es_ES = UI/AdministrationUI/SpanishSpain.lproj/Localizable.strings
trans.eu = UI/AdministrationUI/Basque.lproj/Localizable.strings
trans.fi = UI/AdministrationUI/Finnish.lproj/Localizable.strings
trans.fr = UI/AdministrationUI/French.lproj/Localizable.strings
trans.he = UI/AdministrationUI/Hebrew.lproj/Localizable.strings
trans.hr_HR = UI/AdministrationUI/Croatian.lproj/Localizable.strings
trans.hu = UI/AdministrationUI/Hungarian.lproj/Localizable.strings
trans.is = UI/AdministrationUI/Icelandic.lproj/Localizable.strings
@@ -260,6 +267,7 @@ trans.es_ES = SoObjects/Appointments/SpanishSpain.lproj/Localizable.strings
trans.eu = SoObjects/Appointments/Basque.lproj/Localizable.strings
trans.fi = SoObjects/Appointments/Finnish.lproj/Localizable.strings
trans.fr = SoObjects/Appointments/French.lproj/Localizable.strings
trans.he = SoObjects/Appointments/Hebrew.lproj/Localizable.strings
trans.hr_HR = SoObjects/Appointments/Croatian.lproj/Localizable.strings
trans.hu = SoObjects/Appointments/Hungarian.lproj/Localizable.strings
trans.is = SoObjects/Appointments/Icelandic.lproj/Localizable.strings
@@ -295,6 +303,7 @@ trans.es_ES = SoObjects/Contacts/SpanishSpain.lproj/Localizable.strings
trans.eu = SoObjects/Contacts/Basque.lproj/Localizable.strings
trans.fi = SoObjects/Contacts/Finnish.lproj/Localizable.strings
trans.fr = SoObjects/Contacts/French.lproj/Localizable.strings
trans.he = SoObjects/Contacts/Hebrew.lproj/Localizable.strings
trans.hr_HR = SoObjects/Contacts/Croatian.lproj/Localizable.strings
trans.hu = SoObjects/Contacts/Hungarian.lproj/Localizable.strings
trans.is = SoObjects/Contacts/Icelandic.lproj/Localizable.strings
@@ -330,6 +339,7 @@ trans.es_ES = SoObjects/Mailer/SpanishSpain.lproj/Localizable.strings
trans.eu = SoObjects/Mailer/Basque.lproj/Localizable.strings
trans.fi = SoObjects/Mailer/Finnish.lproj/Localizable.strings
trans.fr = SoObjects/Mailer/French.lproj/Localizable.strings
trans.he = SoObjects/Mailer/Hebrew.lproj/Localizable.strings
trans.hr_HR = SoObjects/Mailer/Croatian.lproj/Localizable.strings
trans.hu = SoObjects/Mailer/Hungarian.lproj/Localizable.strings
trans.is = SoObjects/Mailer/Icelandic.lproj/Localizable.strings
@@ -365,6 +375,7 @@ trans.es_ES = UI/MailPartViewers/SpanishSpain.lproj/Localizable.strings
trans.eu = UI/MailPartViewers/Basque.lproj/Localizable.strings
trans.fi = UI/MailPartViewers/Finnish.lproj/Localizable.strings
trans.fr = UI/MailPartViewers/French.lproj/Localizable.strings
trans.he = UI/MailPartViewers/Hebrew.lproj/Localizable.strings
trans.hr_HR = UI/MailPartViewers/Croatian.lproj/Localizable.strings
trans.hu = UI/MailPartViewers/Hungarian.lproj/Localizable.strings
trans.is = UI/MailPartViewers/Icelandic.lproj/Localizable.strings
+9
View File
@@ -151,6 +151,10 @@ static NSArray *easCommandParameters = nil;
const char* qs_bytes;
queryString = [[components objectAtIndex: 0] dataByDecodingBase64];
if (![queryString length])
return nil;
qs_bytes = (const char*)[queryString bytes];
return [NSString stringWithFormat:@"%.1f", (float)((uint8_t)qs_bytes[0]/10)];
@@ -199,6 +203,11 @@ static NSArray *easCommandParameters = nil;
// Command code, 1 byte, ie.: cmd=
cmd_code = qs_bytes[1];
// Check whether the command code is within the known range.
if (cmd_code < 0 || cmd_code > 22)
return nil;
[components addObject: [NSString stringWithFormat: @"cmd=%@", [easCommandCodes objectAtIndex: cmd_code]]];
// Device ID length and Device ID (variable)
+8
View File
@@ -3971,6 +3971,14 @@ void handle_eas_terminate(int signum)
// Get the device ID, device type and "stash" them
deviceId = [[theRequest uri] deviceId];
if ([deviceId isEqualToString: @"Unknown"])
{
[(WOResponse *)theResponse setStatus: 500];
[self logWithFormat: @"EAS - No device id provided, ignoring request."];
return nil;
}
[context setObject: deviceId forKey: @"DeviceId"];
[context setObject: [[theRequest uri] deviceType] forKey: @"DeviceType"];
[context setObject: [[theRequest uri] attachmentName] forKey: @"AttachmentName"];
+1 -1
View File
@@ -934,7 +934,7 @@ struct GlobalObjectId {
else if ([method isEqualToString: @"COUNTER"])
className = @"IPM.Schedule.Meeting.Resp.Tent";
else if ([method isEqualToString: @"CANCEL"])
className = @"IPM.Schedule.Meeting.Cancelled";
className = @"IPM.Schedule.Meeting.Canceled";
else
className = @"IPM.Appointment";
+508
View File
@@ -1,3 +1,511 @@
commit fbc6bb71a89cbfabed4b1dea1a129dc722bbbfd1
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Thu Mar 9 13:57:27 2017 -0500
(fix) don't abort on unhandled requests
M Main/SOGo.m
commit 4ecff8a437547729ee83305736802fbaadb912d3
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Thu Mar 9 12:31:54 2017 -0500
(i18n) Update translations and add Hebrew
M .tx/config
M NEWS
A SoObjects/Appointments/Hebrew.lproj/Localizable.strings
M SoObjects/Appointments/TurkishTurkey.lproj/Localizable.strings
A SoObjects/Contacts/Hebrew.lproj/Localizable.strings
M SoObjects/Mailer/GNUmakefile
A SoObjects/Mailer/Hebrew.lproj/Localizable.strings
M SoObjects/Mailer/SOGoMailForward.h
M SoObjects/Mailer/SOGoMailForward.m
A SoObjects/Mailer/SOGoMailHebrewForward.wo/SOGoMailHebrewForward.html
A SoObjects/Mailer/SOGoMailHebrewForward.wo/SOGoMailHebrewForward.wod
A SoObjects/Mailer/SOGoMailHebrewReply.wo/SOGoMailHebrewReply.html
A SoObjects/Mailer/SOGoMailHebrewReply.wo/SOGoMailHebrewReply.wod
M SoObjects/Mailer/SOGoMailReply.h
M SoObjects/Mailer/SOGoMailReply.m
M SoObjects/SOGo/SOGoDefaults.plist
M Tests/Integration/preferences.py
A UI/AdministrationUI/Hebrew.lproj/Localizable.strings
M UI/Common/Czech.lproj/Localizable.strings
A UI/Common/Hebrew.lproj/Localizable.strings
M UI/Common/Russian.lproj/Localizable.strings
M UI/Common/Slovak.lproj/Localizable.strings
M UI/Common/TurkishTurkey.lproj/Localizable.strings
M UI/Contacts/English.lproj/Localizable.strings
M UI/Contacts/French.lproj/Localizable.strings
M UI/Contacts/German.lproj/Localizable.strings
A UI/Contacts/Hebrew.lproj/Localizable.strings
M UI/Contacts/Polish.lproj/Localizable.strings
M UI/Contacts/TurkishTurkey.lproj/Localizable.strings
A UI/MailPartViewers/Hebrew.lproj/Localizable.strings
M UI/MailerUI/Czech.lproj/Localizable.strings
M UI/MailerUI/English.lproj/Localizable.strings
M UI/MailerUI/French.lproj/Localizable.strings
M UI/MailerUI/German.lproj/Localizable.strings
A UI/MailerUI/Hebrew.lproj/Localizable.strings
M UI/MailerUI/Polish.lproj/Localizable.strings
M UI/MailerUI/Russian.lproj/Localizable.strings
M UI/MailerUI/Slovak.lproj/Localizable.strings
M UI/MailerUI/TurkishTurkey.lproj/Localizable.strings
M UI/MainUI/Arabic.lproj/Localizable.strings
M UI/MainUI/Basque.lproj/Localizable.strings
M UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings
M UI/MainUI/Catalan.lproj/Localizable.strings
M UI/MainUI/ChineseTaiwan.lproj/Locale
M UI/MainUI/ChineseTaiwan.lproj/Localizable.strings
M UI/MainUI/Croatian.lproj/Localizable.strings
M UI/MainUI/Czech.lproj/Localizable.strings
M UI/MainUI/Danish.lproj/Localizable.strings
M UI/MainUI/Dutch.lproj/Localizable.strings
M UI/MainUI/English.lproj/Localizable.strings
M UI/MainUI/Finnish.lproj/Localizable.strings
M UI/MainUI/French.lproj/Localizable.strings
M UI/MainUI/German.lproj/Localizable.strings
A UI/MainUI/Hebrew.lproj/Locale
A UI/MainUI/Hebrew.lproj/Localizable.strings
M UI/MainUI/Hungarian.lproj/Localizable.strings
M UI/MainUI/Icelandic.lproj/Localizable.strings
M UI/MainUI/Italian.lproj/Localizable.strings
M UI/MainUI/Lithuanian.lproj/Localizable.strings
M UI/MainUI/Macedonian.lproj/Localizable.strings
M UI/MainUI/NorwegianBokmal.lproj/Localizable.strings
M UI/MainUI/NorwegianNynorsk.lproj/Localizable.strings
M UI/MainUI/Polish.lproj/Localizable.strings
M UI/MainUI/Portuguese.lproj/Localizable.strings
M UI/MainUI/Russian.lproj/Localizable.strings
M UI/MainUI/Serbian.lproj/Localizable.strings
M UI/MainUI/Slovak.lproj/Localizable.strings
M UI/MainUI/Slovenian.lproj/Localizable.strings
M UI/MainUI/SpanishArgentina.lproj/Localizable.strings
M UI/MainUI/SpanishSpain.lproj/Localizable.strings
M UI/MainUI/Swedish.lproj/Localizable.strings
M UI/MainUI/TurkishTurkey.lproj/Localizable.strings
M UI/MainUI/Ukrainian.lproj/Localizable.strings
M UI/MainUI/Welsh.lproj/Locale
M UI/MainUI/Welsh.lproj/Localizable.strings
M UI/PreferencesUI/Arabic.lproj/Localizable.strings
M UI/PreferencesUI/Basque.lproj/Localizable.strings
M UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings
M UI/PreferencesUI/Catalan.lproj/Localizable.strings
M UI/PreferencesUI/ChineseTaiwan.lproj/Localizable.strings
M UI/PreferencesUI/Croatian.lproj/Localizable.strings
M UI/PreferencesUI/Czech.lproj/Localizable.strings
M UI/PreferencesUI/Danish.lproj/Localizable.strings
M UI/PreferencesUI/Dutch.lproj/Localizable.strings
M UI/PreferencesUI/English.lproj/Localizable.strings
M UI/PreferencesUI/Finnish.lproj/Localizable.strings
M UI/PreferencesUI/French.lproj/Localizable.strings
M UI/PreferencesUI/German.lproj/Localizable.strings
A UI/PreferencesUI/Hebrew.lproj/Localizable.strings
M UI/PreferencesUI/Hungarian.lproj/Localizable.strings
M UI/PreferencesUI/Icelandic.lproj/Localizable.strings
M UI/PreferencesUI/Italian.lproj/Localizable.strings
M UI/PreferencesUI/Lithuanian.lproj/Localizable.strings
M UI/PreferencesUI/Macedonian.lproj/Localizable.strings
M UI/PreferencesUI/NorwegianBokmal.lproj/Localizable.strings
M UI/PreferencesUI/NorwegianNynorsk.lproj/Localizable.strings
M UI/PreferencesUI/Polish.lproj/Localizable.strings
M UI/PreferencesUI/Portuguese.lproj/Localizable.strings
M UI/PreferencesUI/Russian.lproj/Localizable.strings
M UI/PreferencesUI/Serbian.lproj/Localizable.strings
M UI/PreferencesUI/Slovak.lproj/Localizable.strings
M UI/PreferencesUI/Slovenian.lproj/Localizable.strings
M UI/PreferencesUI/SpanishArgentina.lproj/Localizable.strings
M UI/PreferencesUI/SpanishSpain.lproj/Localizable.strings
M UI/PreferencesUI/Swedish.lproj/Localizable.strings
M UI/PreferencesUI/TurkishTurkey.lproj/Localizable.strings
M UI/PreferencesUI/Ukrainian.lproj/Localizable.strings
M UI/PreferencesUI/Welsh.lproj/Localizable.strings
M UI/SOGoUI/SOGoFolderAdvisory.h
M UI/SOGoUI/SOGoFolderAdvisory.m
M UI/Scheduler/French.lproj/Localizable.strings
A UI/Scheduler/Hebrew.lproj/Localizable.strings
M UI/Scheduler/Polish.lproj/Localizable.strings
M UI/Scheduler/TurkishTurkey.lproj/Localizable.strings
A UI/Templates/SOGoACLHebrewAdditionAdvisory.wox
A UI/Templates/SOGoACLHebrewModificationAdvisory.wox
A UI/Templates/SOGoACLHebrewRemovalAdvisory.wox
A UI/Templates/SOGoFolderHebrewAdditionAdvisory.wox
A UI/Templates/SOGoFolderHebrewRemovalAdvisory.wox
M configure
commit e5b4a12f8a0816e2f116f113452659687a081e10
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Thu Mar 9 11:52:04 2017 -0500
(js) Update CKEditor to version 4.6.2
M NEWS
M UI/WebServerResources/ckeditor/LICENSE.md
M UI/WebServerResources/ckeditor/build-config.js
M UI/WebServerResources/ckeditor/ckeditor.js
M UI/WebServerResources/ckeditor/contents.css
M UI/WebServerResources/ckeditor/lang/ar.js
M UI/WebServerResources/ckeditor/lang/ca.js
M UI/WebServerResources/ckeditor/lang/cs.js
M UI/WebServerResources/ckeditor/lang/cy.js
M UI/WebServerResources/ckeditor/lang/da.js
M UI/WebServerResources/ckeditor/lang/de.js
M UI/WebServerResources/ckeditor/lang/en.js
M UI/WebServerResources/ckeditor/lang/es.js
M UI/WebServerResources/ckeditor/lang/eu.js
M UI/WebServerResources/ckeditor/lang/fi.js
M UI/WebServerResources/ckeditor/lang/fr.js
M UI/WebServerResources/ckeditor/lang/hr.js
M UI/WebServerResources/ckeditor/lang/hu.js
M UI/WebServerResources/ckeditor/lang/is.js
M UI/WebServerResources/ckeditor/lang/it.js
M UI/WebServerResources/ckeditor/lang/lt.js
M UI/WebServerResources/ckeditor/lang/mk.js
M UI/WebServerResources/ckeditor/lang/nb.js
M UI/WebServerResources/ckeditor/lang/nl.js
M UI/WebServerResources/ckeditor/lang/no.js
M UI/WebServerResources/ckeditor/lang/pl.js
M UI/WebServerResources/ckeditor/lang/pt-br.js
M UI/WebServerResources/ckeditor/lang/pt.js
M UI/WebServerResources/ckeditor/lang/ru.js
M UI/WebServerResources/ckeditor/lang/sk.js
M UI/WebServerResources/ckeditor/lang/sl.js
M UI/WebServerResources/ckeditor/lang/sr.js
M UI/WebServerResources/ckeditor/lang/sv.js
M UI/WebServerResources/ckeditor/lang/tr.js
M UI/WebServerResources/ckeditor/lang/uk.js
M UI/WebServerResources/ckeditor/lang/zh-cn.js
M UI/WebServerResources/ckeditor/lang/zh.js
M UI/WebServerResources/ckeditor/plugins/about/dialogs/about.js
M UI/WebServerResources/ckeditor/plugins/clipboard/dialogs/paste.js
M UI/WebServerResources/ckeditor/plugins/colordialog/dialogs/colordialog.css
M UI/WebServerResources/ckeditor/plugins/colordialog/dialogs/colordialog.js
M UI/WebServerResources/ckeditor/plugins/dialog/dialogDefinition.js
M UI/WebServerResources/ckeditor/plugins/image/dialogs/image.js
M UI/WebServerResources/ckeditor/plugins/link/dialogs/anchor.js
M UI/WebServerResources/ckeditor/plugins/link/dialogs/link.js
M UI/WebServerResources/ckeditor/plugins/pastefromword/filter/default.js
M UI/WebServerResources/ckeditor/plugins/table/dialogs/table.js
M UI/WebServerResources/ckeditor/plugins/tabletools/dialogs/tableCell.js
M UI/WebServerResources/ckeditor/skins/minimalist/editor.css
M UI/WebServerResources/ckeditor/skins/minimalist/editor_gecko.css
M UI/WebServerResources/ckeditor/skins/minimalist/editor_ie.css
M UI/WebServerResources/ckeditor/skins/minimalist/editor_ie7.css
M UI/WebServerResources/ckeditor/skins/minimalist/editor_ie8.css
M UI/WebServerResources/ckeditor/skins/minimalist/editor_iequirks.css
M UI/WebServerResources/ckeditor/styles.js
commit 41ea0341a89e19f2ab22ae2a41ff042a6bce40d1
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Wed Mar 8 16:04:07 2017 -0500
Fix typo in Scheduler
Fixes #4072
M UI/Scheduler/English.lproj/Localizable.strings
commit 9df8eb367a0a1da3e6a64113f6a3f74fb1dc9f16
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Wed Mar 8 15:58:47 2017 -0500
(js) Prevent 304 HTTP status code in IE
Fixes #4066
M NEWS
M UI/WebServerResources/generic.js
commit 4f73005d1de693873aac3ac05779d752bfbdf517
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Wed Mar 8 09:31:19 2017 -0500
(fix) wrong var type declaration
M SoObjects/Appointments/SOGoAppointmentObject.m
commit 45255cd27ff43c4fe981f1a24de03ef51a0930ba
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Wed Mar 8 08:52:40 2017 -0500
(fix) brought bcc handling code from v3
M SoObjects/Mailer/SOGoDraftObject.m
M SoObjects/SOGo/SOGoMailer.m
commit 8c7a2cb2ebf004fd4d1c4ca79013a520bbdd281b
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Tue Mar 7 15:13:04 2017 -0500
(js) Fix SCAYT automatic language selection
M NEWS
M UI/WebServerResources/UIxMailEditor.js
M UI/WebServerResources/UIxPreferences.js
M UI/WebServerResources/generic.js
commit 2428c3cb3d1bad910f11d57ab96b90ff691716c5
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Tue Mar 7 10:47:53 2017 -0500
Updated NEWS
M NEWS
commit 05ab2015c65aea27b55ca603c880fef6da00e7bb
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Tue Mar 7 10:45:44 2017 -0500
(fix) remove attendees that have the same identity of the organizer (fixes #3905)
M SoObjects/Appointments/SOGoAppointmentObject.m
commit 847313fe25dfc633bbe7765efdf780e4fcbfc0cb
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Fri Mar 3 14:14:49 2017 -0500
Updated NEWS
M NEWS
commit 84deb2fe451dd1d9eedff3e806883568ae4281c4
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Fri Mar 3 14:13:25 2017 -0500
(fix) fixed handling of exdates and proper intersection for fbinfo (fixes #4051)
M SOPE/NGCards/iCalRecurrenceCalculator.m
M SOPE/NGCards/iCalYearlyRecurrenceCalculator.m
M SoObjects/Appointments/SOGoAppointmentFolder.m
commit 2f56bb43be0cf6e1552b81471e0a4b978f327a6d
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Wed Feb 22 11:35:07 2017 -0500
(fix) keep UID during MOVE
M SoObjects/Appointments/SOGoCalendarComponent.m
commit 3cfbaecbf84d49df8a2cc2127834ae3292ca8250
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Wed Feb 22 11:00:01 2017 -0500
(fix) minor fixes in tools
M Tools/SOGoToolCheckupUser.m
M Tools/SOGoToolManageACL.m
commit 48861491c15f7c46ce46bbbff1cd350e88df15e6
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Tue Feb 21 10:15:34 2017 -0500
Updated NEWS
M NEWS
commit 6720b9aaed6769f4a31e0e2f46bcc87115135f39
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Tue Feb 21 10:12:55 2017 -0500
(fix) safety checks, fixed remove ALL and added add ALL
M Tools/SOGoToolManageACL.m
commit 505079dfda899b4441cd2f4978c7d596e6a0c67c
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Mon Feb 20 18:57:46 2017 -0500
(feat) new sogo-tool manage-acl feature to get/add/remove ACLs from GCS folders
M Tools/GNUmakefile
A Tools/SOGoToolManageACL.m
commit e0497448e6d3b16864b2f670ebd50d6a6d7a213a
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Mon Feb 20 13:37:23 2017 -0500
(feat) added delete capability to sogo-tool checkup
M Tools/SOGoToolCheckupUser.m
commit f4394ad8b56418112261051ebed826dc11fa3b4c
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Mon Feb 20 10:05:52 2017 -0500
(fix) set the memcache retry timeout to 5 seconds
M SoObjects/SOGo/SOGoCache.m
commit 3c2fa1c7690894d62b0b05ca796ff2a69965fe63
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Mon Feb 20 09:54:20 2017 -0500
(fix) enable tcp_nodelay for memcache
M SoObjects/SOGo/SOGoCache.m
commit 12fb067f47147975588b10f6adb14e03092d8618
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Thu Feb 9 14:42:10 2017 -0500
Updated NEWS
M NEWS
commit bad4abeba7276c0fdb8169c13fdb4a83306cf1eb
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Thu Feb 9 14:39:24 2017 -0500
(feat) new sogo-tool checkup command to make sure user's data is sane
Conflicts:
Tools/GNUmakefile
M Tools/GNUmakefile
M Tools/SOGoSockD.h
M Tools/SOGoSockD.m
M Tools/SOGoSockDOperation.h
M Tools/SOGoSockDOperation.m
M Tools/SOGoSockDScanner.h
M Tools/SOGoSockDScanner.m
A Tools/SOGoToolCheckupUser.m
M Tools/SOGoToolRemove.m
M Tools/SOGoToolRemoveDoubles.m
M Tools/SOGoToolRenameUser.m
M Tools/sogo-ealarms-notify.m
M Tools/sogo-slapd-sockd.m
commit 0c61de49ee9718f0a1602e966d6ea823c797d4c2
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Fri Feb 3 15:26:55 2017 -0500
(fix) properly handle canceled appointments
M ActiveSync/SOGoMailObject+ActiveSync.m
M NEWS
commit 7436d54f9ecda105c0c1d2004f641c8887d9828c
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Wed Feb 1 13:05:19 2017 -0500
Updated NEWS
M NEWS
commit 4bb5d15cfaf65c83465e623a728912d297fc6742
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Wed Feb 1 13:03:27 2017 -0500
(fix) improve EAS parameters parsing (fixes #4003)
M ActiveSync/NSString+ActiveSync.m
M ActiveSync/SOGoActiveSyncDispatcher.m
commit 94a94e3c2a050a785fa1c48dbcf355661eedf0e9
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Fri Jan 27 15:57:43 2017 -0500
Fix condition when enabling Vacation message
M SoObjects/SOGo/SOGoSieveManager.m
commit 01983f60d1432c768b2074580491bc728f687b2c
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Tue Jan 31 15:59:58 2017 -0500
(fix) cache sogo_folder_info records and avoid phantom subscriptions (fixes #4010)
M SOPE/GDLContentStore/GCSFolderManager.h
M SOPE/GDLContentStore/GCSFolderManager.m
M SoObjects/SOGo/SOGoGCSFolder.m
M SoObjects/SOGo/SOGoParentFolder.m
commit 9a1f91ead2312c11974b36071c5ef0b9e8bac5be
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Mon Jan 30 08:40:01 2017 -0500
Revert "(fix) properly honor "include in freebusy" (fixes #3354)"
This reverts commit 42c2c66caa557b381944a8abb60bdd5b9dc036be.
M SoObjects/Appointments/SOGoAppointmentFolder.m
commit 6cff413e4d2b2a3cf39fa3c8046889d7efa2fe8b
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Mon Jan 23 11:37:52 2017 -0500
Fix for Sieve test
M Tests/Integration/test-sieve.py
commit 9539b8ce6e9a296aa542fafc20bd9157ec69dd91
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Fri Jan 20 11:08:24 2017 -0500
Add support for date extension of Sieve
Fixes #1530, #1949
M NEWS
M SoObjects/SOGo/SOGoSieveManager.m
commit 86c0f32fe6cd11c66a83d7ce173d7417b9c2c904
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Wed Jan 18 16:16:19 2017 -0500
(fix) improve doc around SOGoTimeZone (fixes #3995)
M Documentation/SOGoInstallationGuide.asciidoc
M Scripts/sogo.conf
commit b01988b6a66ba6faa964309ae2fea5ee54fb8591
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Fri Jan 13 13:19:11 2017 -0500
Updated NEWS
M NEWS
commit 59281f02c1f89d6da5bbb16695e8c70d2d03aaa3
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Fri Jan 13 13:16:01 2017 -0500
(fix) return if not content is there, to avoid random crash
M SoObjects/Appointments/SOGoCalendarComponent.m
commit a42d6ce450adbb9c062bb8bf541c4411c05f4a66
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Fri Jan 13 13:17:20 2017 -0500
(fix) remove all alarms before IMIP reply (fixes #3925)
M SoObjects/Appointments/SOGoCalendarComponent.m
commit 494b2d7b7ef454f071ffa37db5e76b8d571a4856
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Mon Jan 9 16:09:09 2017 -0500
(fix) some more memory info
M Main/SOGo.m
commit ccb176d996d94fa08e041c480df2eb9c78524731
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Mon Jan 9 16:03:32 2017 -0500
(fix) be a bit more verbose about memory usage
M Main/SOGo.m
commit 5afb4b7dd3d0df4edd5a3662b51116d3f9eb7276
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Fri Jan 6 20:56:37 2017 -0500
Update ChangeLog
M ChangeLog
commit bdcba43f1053c111ae476c8f75e167ddb4e61137
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Fri Jan 6 20:56:10 2017 -0500
+1 -1
View File
@@ -482,7 +482,7 @@ SOGoSAML2LogoutEnabled must be set to YES. If unset, the user will be
redirected to a blank page.
|D |SOGoTimeZone
|Parameter used to set a default time zone for users. The default
|Mandatory parameter used to set a default time zone for users. The default
timezone is set to UTC. The Olson database is a standard database that
takes all the time zones around the world into account and represents
them along with their history. On GNU/Linux systems, time zone
+3 -3
View File
@@ -1,7 +1,7 @@
<!-- TODO have the build system take care of this -->
<releaseinfo>Version 2.3.19 - January 2017</releaseinfo>
<subtitle>for version 2.3.19</subtitle>
<date>2017-01-09</date>
<releaseinfo>Version 2.3.20 - March 2017</releaseinfo>
<subtitle>for version 2.3.20</subtitle>
<date>2017-03-10</date>
<legalnotice>
<para>Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".</para>
@@ -13,6 +13,6 @@
// TODO have the build system take care of this
:release_version: 2.3.19
:release_version: 2.3.20
// vim: set syntax=asciidoc tabstop=2 shiftwidth=2 expandtab:
+9 -3
View File
@@ -124,7 +124,7 @@ static BOOL debugLeaks;
vMemSizeLimit = [defaults vmemLimit];
if (vMemSizeLimit > 0)
[self logWithFormat: @"vmem size check enabled: shutting down app when "
@"vmem > %d MB", vMemSizeLimit];
@"vmem > %d MB. Currently at %d MB", vMemSizeLimit, [[NSProcessInfo processInfo] virtualMemorySize]/1048576];
/* SoClass security declarations */
sInfo = [self soClassSecurityInfo];
@@ -147,6 +147,8 @@ static BOOL debugLeaks;
/* load products */
[[SOGoProductLoader productLoader] loadAllProducts: YES];
if (vMemSizeLimit > 0)
[self logWithFormat: @"All products loaded - current memory usage at %d MB", [[NSProcessInfo processInfo] virtualMemorySize]/1048576];
}
- (id) init
@@ -401,8 +403,12 @@ static BOOL debugLeaks;
- (WOResponse *) handleException: (NSException *) _exc
inContext: (WOContext *) _ctx
{
printf("EXCEPTION: %s\n", [[_exc description] cString]);
abort();
WOResponse *resp;
NSLog(@"EXCEPTION: %s\n", [[_exc description] cString]);
resp = [WOResponse responseWithRequest: [_ctx request]];
[resp setStatus: 501];
return resp;
}
/* runtime maintenance */
+21
View File
@@ -1,3 +1,24 @@
2.3.20 (2017-03-10)
-------------------
New features
- [core] new sogo-tool checkup command to make sure user's data is sane
- [core] new sogo-tool manage-acl command to manage calendar/address book ACLs
- [web] use "date" extension of Sieve to enable/disable vacation auto-reply (#1530, #1949)
Enhancements
- [web] added Hebrew (he) translation - thanks to Raz Aidlitz
- [web] updated CKEditor to version 4.6.2
Bug fixes
- [core] remove all alarms before sending IMIP replies (#3925)
- [core] fixed handling of exdates and proper intersection for fbinfo (#4051)
- [core] remove attendees that have the same identity as the organizer (#3905)
- [eas] improved EAS parameters parsing (#4003)
- [eas] properly handle canceled appointments
- [web] fixed SCAYT automatic language selection in HTML editor
- [web] prevent 304 HTTP status code for Ajax requests on IE (#4066)
2.3.19 (2017-01-09)
-------------------
+1
View File
@@ -65,6 +65,7 @@
- (BOOL)folderExistsAtPath:(NSString *)_path;
- (NSArray *)listSubFoldersAtPath:(NSString *)_path recursive:(BOOL)_flag;
- (NSDictionary *) recordAtPath: (NSString *) _path;
- (GCSFolder *)folderAtPath:(NSString *)_path;
- (NSException *)createFolderOfType:(NSString *)_type withName:(NSString *)_name atPath:(NSString *)_path;
+8 -3
View File
@@ -634,7 +634,7 @@ static NSCharacterSet *asciiAlphaNumericCS = nil;
return result;
}
- (GCSFolder *) folderAtPath: (NSString *) _path
- (NSDictionary *) recordAtPath: (NSString *) _path
{
NSMutableString *sql;
NSArray *fnames, *records;
@@ -691,8 +691,13 @@ static NSCharacterSet *asciiAlphaNumericCS = nil;
[self debugWithFormat:@"found no record for path: '%@'", _path];
return nil;
}
return [self folderForRecord:record];
return record;
}
- (GCSFolder *) folderAtPath: (NSString *) _path
{
return [self folderForRecord: [self recordAtPath: _path]];
}
- (NSString *) baseTableNameWithUID: (NSString *) _uid
+7 -2
View File
@@ -161,10 +161,12 @@ static Class yearlyCalcClass = Nil;
+ (NSArray *) _dates: (NSArray *) dateList
withinRange: (NGCalendarDateRange *) limits
startingWithDate: (NGCalendarDateRange *) first
{
NSMutableArray *newDates;
NSEnumerator *dates;
NSCalendarDate *currentDate;
NGCalendarDateRange *currentRange;
newDates = [NSMutableArray array];
@@ -173,7 +175,10 @@ static Class yearlyCalcClass = Nil;
{
if ([currentDate isKindOfClass: NSStringClass])
currentDate = [(NSString *) currentDate asCalendarDate];
if ([limits containsDate: currentDate])
currentRange = [NGCalendarDateRange calendarDateRangeWithStartDate: currentDate
endDate: [currentDate dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: [first duration]]];
if ([limits doesIntersectWithDateRange: currentRange])
[newDates addObject: currentDate];
}
@@ -191,7 +196,7 @@ static Class yearlyCalcClass = Nil;
unsigned int count, maxRanges;
NSComparisonResult compare;
dates = [[self _dates: exdates withinRange: limits] objectEnumerator];
dates = [[self _dates: exdates withinRange: limits startingWithDate: first] objectEnumerator];
while ((currentDate = [dates nextObject]))
{
maxRanges = [ranges count];
@@ -191,7 +191,7 @@
for (k = 0; k < [rangesInMonth count] && (repeatCount == 0 || count < repeatCount); k++) {
//NSLog(@"*** YEARLY found %@ (count = %i)", [[rangesInMonth objectAtIndex: k] startDate], count);
count++;
if ([_r containsDateRange: [rangesInMonth objectAtIndex: k]])
if ([_r doesIntersectWithDateRange: [rangesInMonth objectAtIndex: k]])
{
[ranges addObject: [rangesInMonth objectAtIndex: k]];
//NSLog(@"*** YEARLY adding %@ (count = %i)", [[rangesInMonth objectAtIndex: k] startDate], count);
@@ -215,7 +215,7 @@
end = [start addTimeInterval: [firstRange duration]];
r = [NGCalendarDateRange calendarDateRangeWithStartDate: start
endDate: end];
if ([_r containsDateRange: r] && (repeatCount == 0 || count < repeatCount))
if ([_r doesIntersectWithDateRange: r] && (repeatCount == 0 || count < repeatCount))
{
[ranges addObject: r];
count++;
+1 -1
View File
@@ -109,7 +109,7 @@
//SOGoMailAuxiliaryUserAccountsEnabled = YES;
//SOGoTrustProxyAuthentication = NO;
/* General */
/* General - SOGoTimeZone *MUST* be defined */
//SOGoLanguage = English;
//SOGoTimeZone = America/Montreal;
//SOGoCalendarDefaultRoles = (
@@ -0,0 +1,60 @@
"Inviting the following persons is prohibited:" = "לא ניתן להזמין את אנשי הקשר הבאים: ";
"Personal Calendar" = "לוח שנה אישי";
vevent_class0 = "(אירוע פומבי)";
vevent_class1 = "(אירוע פרטי)";
vevent_class2 = "(אירוע סודי)";
vtodo_class0 = "(משימה פומבית)";
vtodo_class1 = "(משימה פרטית)";
vtodo_class2 = "(משימה סודית)";
/* Receipts */
"The event \"%{Summary}\" was created" = "האירוע \"{Summary}%\" נוצר";
"The event \"%{Summary}\" was deleted" = "האירוע \"{Summary}%\" נמחק";
"The event \"%{Summary}\" was updated" = "האירוע \"{Summary}%\" עודכן";
"The following attendees(s) were notified" = "המשתתפים הבאים קיבלו התראה";
"The following attendees(s) were added" = "המשתתפים הבאים הוספו";
"The following attendees(s) were removed" = "המשתתפים הבאים הוסרו";
/* IMIP messages */
"calendar_label" = "לוח שנה";
"startDate_label" = "התחלה";
"endDate_label" = "סיום";
"due_label" = "תאריך להגשה";
"location_label" = "מיקום";
"summary_label" = "תקציר";
"comment_label" = "הערה";
/* Invitation */
"Event Invitation: \"%{Summary}\"" = "הזמנה לאירוע: \"{Summary}%\"";
"(sent by %{SentBy}) " = "(מאת {SentBy}%)";
"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}" = "{Organizer}% {SentByText}% הוזמנתם ל {Summary}%.\n\nהתחלה: {StartDate}%\nסיום: {EndDate}%\nתאור: {Description}%";
"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" = "{Organizer}% {SentByText}% הוזמנתם ל {Summary}%.\n\nהתחלה: {StartDate}% ב {StartTime}%\nסיום: {EndDate}% ב {EndTime}%\nתאור: {Description}%";
/* Deletion */
"Event Cancelled: \"%{Summary}\"" = "אירוע מבוטל: \"{Summary}%\"";
"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}"
= "{Organizer}% {SentByText}% ביטלו את האירוע: {Summary}%.\n\nהתחלה: {StartDate}%\nסיום: {EndDate}%\nתאור: {Description}%";
"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"
= "{Organizer}% {SentByText}% ביטלו את האירוע: {Summary}%.\n\nהתחלה: {StartDate}% ב {StartTime}%\nסיום: {EndDate}% ב {EndTime}%\nתאור: {Description}%";
/* Update */
"The appointment \"%{Summary}\" for the %{OldStartDate} has changed"
= "הפגישה \"{Summary}%\" עבור {OldStartDate}% שונתה";
"The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed"
= "הפגישה \"{Summary}%\" עבור {OldStartDate}% ב {OldStartTime}% השתנתה";
"The following parameters have changed in the \"%{Summary}\" meeting:"
= "הפרמטרים הבאים השתנו בפגישה \"{Summary}%\":";
"Please accept or decline those changes."
= "נא לאשר או לבטל את השינויים";
/* Reply */
"Accepted invitation: \"%{Summary}\"" = "הזמנה אושרה: \"{Summary}%\"";
"Declined invitation: \"%{Summary}\"" = "הזמנה נדחתה: \"{Summary}%\"";
"Delegated invitation: \"%{Summary}\"" = "הזמנה הואצלה: \"{Summary}%\"";
"Not yet decided on invitation: \"%{Summary}\"" = "טרם הוחלט לגבי הזמנה: \"{Summary}%\"";
"%{Attendee} %{SentByText}has accepted your event invitation."
= "{Attendee}% {SentByText}% אישר את הזמנתך.";
"%{Attendee} %{SentByText}has declined your event invitation."
= "{Attendee}% {SentByText}% דחה את הזמנתך.";
"%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}."
= "{Attendee}% {SentByText}% ההזמנה הואצלה ל {Delegate}%.";
"%{Attendee} %{SentByText}has not yet decided upon your event invitation."
= "{Attendee}% {SentByText}% טרם הוחלט לגבי הזמנתך.";
/* Resources */
"Cannot access resource: \"%{Cn} %{SystemEmail}\"" = "לא ניתן לגשת למשאב: \"{Cn}% {SystemEmail}%\"";
"Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\". The conflicting event is \"%{EventTitle}\", and starts on %{StartDate}." = "כמות מקסימלית של הזמנות בו זמנית ({NumberOfSimultaneousBookings}%) עבור המשאב \"{Cn}% {SystemEmail}%\". קיימת התנגשות באירוע \"{EventTitle}%\", המתחיל ב {StartDate}%.";
@@ -1305,17 +1305,13 @@ firstInstanceCalendarDateRange: (NGCalendarDateRange *) fir
{
NSMutableArray *ma;
NSDictionary *row;
NSCalendarDate *rangeEndDate;
unsigned int count, max;
max = [_records count];
ma = [NSMutableArray arrayWithCapacity: max];
// Adjust the range so it ends at midnight. This is necessary when calculating
// recurrences of all-day events.
rangeEndDate = [[_r endDate] dateByAddingYears:0 months:0 days:0 hours:0 minutes:0 seconds:1];
_r = [NGCalendarDateRange calendarDateRangeWithStartDate: [_r startDate]
endDate: rangeEndDate];
endDate: [_r endDate]];
for (count = 0; count < max; count++)
{
+17 -3
View File
@@ -1776,6 +1776,7 @@ inRecurrenceExceptionsForEvent: (iCalEvent *) theEvent
NSArray *allEvents;
iCalEvent *event;
NSUInteger i;
int j;
allEvents = [rqCalendar events];
@@ -1808,12 +1809,27 @@ inRecurrenceExceptionsForEvent: (iCalEvent *) theEvent
if (uid)
{
NSDictionary *defaultIdentity;
NSArray *allAttendees;
iCalPerson *attendee;
SOGoUser *organizer;
organizer = [SOGoUser userWithLogin: uid];
defaultIdentity = [organizer defaultIdentity];
[[event organizer] setCn: [defaultIdentity objectForKey: @"fullName"]];
[[event organizer] setEmail: [defaultIdentity objectForKey: @"email"]];
// We now check if one of the attendee is also the organizer. If so,
// we remove it. See bug #3905 (https://sogo.nu/bugs/view.php?id=3905)
// for more details. This is a Calendar app bug on Apple Yosemite.
allAttendees = [event attendees];
for (j = [allAttendees count]-1; j >= 0; j--)
{
attendee = [allAttendees objectAtIndex: j];
if ([organizer hasEmail: [attendee rfc822Email]])
[event removeFromAttendees: attendee];
}
}
}
}
@@ -1981,9 +1997,7 @@ inRecurrenceExceptionsForEvent: (iCalEvent *) theEvent
[self _decomposeGroupsInRequestCalendar: calendar];
if ([[ownerUser domainDefaults] iPhoneForceAllDayTransparency] && [rq isIPhone])
{
[self _adjustTransparencyInRequestCalendar: calendar];
}
[self _adjustTransparencyInRequestCalendar: calendar];
[self _adjustEventsInRequestCalendar: calendar];
[self adjustClassificationInRequestCalendar: calendar];
+29 -4
View File
@@ -618,7 +618,10 @@
if (content)
ASSIGN (originalCalendar, [iCalCalendar parseSingleFromSource: content]);
else
[self warnWithFormat: @"content not available, we will crash"];
{
[self warnWithFormat: @"content not available, we don't update the event"];
return;
}
}
oldMaster = (iCalRepeatableEntityObject *)
@@ -935,6 +938,9 @@
if ([[context objectForKey: @"DeviceType"] isEqualToString: @"WindowsOutlook15"])
return;
// remove all alarms to avoid bug #3925
[event removeAllAlarms];
dd = [from domainDefaults];
if ([dd appointmentSendEMailNotifications] && [event isStillRelevant])
{
@@ -1231,12 +1237,31 @@
- (NSException *) moveToFolder: (SOGoGCSFolder *) newFolder
{
SOGoCalendarComponent *newComponent;
NSException *ex;
id o;
ex = [self copyToFolder: newFolder];
// Lookup to see if the event exists in the target calendar. During a MOVE, we do
// keep the ID of the event intact.
o = [newFolder lookupName: [self nameInContainer]
inContext: context
acquire: NO];
if (!ex)
ex = [self delete];
if ([o isKindOfClass: [NSException class]])
{
newComponent = [[self class] objectWithName: [self nameInContainer]
inContainer: newFolder];
ex = [newComponent saveCalendar: [self calendar: NO secure: NO]];
if (!ex)
ex = [self delete];
}
else
{
ex = [NSException exceptionWithHTTPStatus: 409
reason: @"Target exists - MOVE disallowed."];
}
return ex;
}
@@ -18,7 +18,7 @@ vtodo_class2 = "(Gizli görev)";
"calendar_label" = "Takvim";
"startDate_label" = "Başlangıç";
"endDate_label" = "Bitiş";
"due_label" = "Son Tarih";
"due_label" = "Kapanış Tarihi";
"location_label" = "Konum";
"summary_label" = "Özet";
"comment_label" = "Açıklama";
@@ -0,0 +1,2 @@
"Personal Address Book" = "אנשי קשר";
"Collected Address Book" = "אנשי קשר אשר נוצרו משליחת הודעה";
+2
View File
@@ -69,6 +69,8 @@ Mailer_RESOURCE_FILES += \
SOGoMailCroatianReply.wo \
SOGoMailGermanForward.wo \
SOGoMailGermanReply.wo \
SOGoMailHebrewForward.wo \
SOGoMailHebrewReply.wo \
SOGoMailHungarianForward.wo \
SOGoMailHungarianReply.wo \
SOGoMailIcelandicForward.wo \
@@ -0,0 +1,2 @@
"OtherUsersFolderName" = "משתשמשים אחרים";
"SharedFoldersName" = "תיקיות משותפות";
+1 -39
View File
@@ -1928,15 +1928,11 @@ static NSString *userAgent = nil;
//
- (NSException *) sendMailAndCopyToSent: (BOOL) copyToSent
{
NSMutableData *cleaned_message;
SOGoMailFolder *sentFolder;
SOGoDomainDefaults *dd;
NSURL *sourceIMAP4URL;
NSException *error;
NSData *message;
NSRange r1;
unsigned int limit;
// We strip the BCC fields prior sending any mails
NGMimeMessageGenerator *generator;
@@ -1944,43 +1940,9 @@ static NSString *userAgent = nil;
generator = [[[NGMimeMessageGenerator alloc] init] autorelease];
message = [generator generateMimeFromPart: [self mimeMessage]];
//
// We now look for the Bcc: header. If it is present, we remove it.
// Some servers, like qmail, do not remove it automatically.
//
#warning FIXME - we should fix the case issue when we switch to Pantomime
cleaned_message = [NSMutableData dataWithData: message];
// We search only in the headers so we start at 0 until
// we find \r\n\r\n, which is the headers delimiter
r1 = [cleaned_message rangeOfCString: "\r\n\r\n"];
limit = r1.location-1;
r1 = [cleaned_message rangeOfCString: "\r\nbcc: "
options: 0
range: NSMakeRange(0,limit)];
if (r1.location != NSNotFound)
{
// We search for the first \r\n AFTER the Bcc: header and
// replace the whole thing with \r\n.
unsigned int i;
for (i = r1.location+7; i < limit; i++)
{
if ([cleaned_message characterAtIndex: i] == '\r' &&
(i+1 < limit && [cleaned_message characterAtIndex: i+1] == '\n') &&
(i+2 < limit && !isspace([cleaned_message characterAtIndex: i+2])))
break;
}
[cleaned_message replaceBytesInRange: NSMakeRange(r1.location, i-r1.location)
withBytes: NULL
length: 0];
}
dd = [[context activeUser] domainDefaults];
error = [[SOGoMailer mailerWithDomainDefaults: dd]
sendMailData: cleaned_message
sendMailData: message
toRecipients: [self allBareRecipients]
sender: [self sender]
withAuthenticator: [self authenticatorInContext: context]
+3
View File
@@ -76,6 +76,9 @@
@interface SOGoMailGermanForward : SOGoMailForward
@end
@interface SOGoMailHebrewForward : SOGoMailForward
@end
@interface SOGoMailHungarianForward : SOGoMailForward
@end
+3
View File
@@ -287,6 +287,9 @@
@implementation SOGoMailGermanForward
@end
@implementation SOGoMailHebrewForward
@end
@implementation SOGoMailHungarianForward
@end
@@ -0,0 +1,16 @@
<#newLine/>
<#newLine/>
<#signaturePlacementOnTop><#newLine/>
<#signature/><#newLine/></#signaturePlacementOnTop>
-------- הודעה מקורית --------<#newLine/>
נושא: <#subject/><#newLine/>
תאריך: <#date/><#newLine/>
מאת: <#from/><#newLine/>
<#hasReplyTo>השב: <#replyTo/></#hasReplyTo><#hasOrganization>אירגון: <#organization/></#hasOrganization>אל: <#to/><#newLine/>
<#hasCc>מכותב: <#cc/></#hasCc><#hasNewsGroups>קבוצות חדשות: <#newsgroups/></#hasNewsGroups><#hasReferences>תזכור: <#references/></#hasReferences><#newLine/>
<#newLine/>
<#messageBody/><#newLine/>
<#signaturePlacementOnBottom><#newLine/>
<#newLine/>
<#signature/></#signaturePlacementOnBottom>
<#newLine/>
@@ -0,0 +1,88 @@
subject: WOString {
value = subject;
escapeHTML = NO;
}
date: WOString {
value = date;
escapeHTML = NO;
}
from: WOString {
value = from;
escapeHTML = NO;
}
newLine: WOString {
value = newLine;
escapeHTML = NO;
}
hasReplyTo: WOConditional {
condition = hasReplyTo;
}
replyTo: WOString {
value = replyTo;
escapeHTML = NO;
}
hasOrganization: WOConditional {
condition = hasOrganization;
}
organization: WOString {
value = organization;
escapeHTML = NO;
}
to: WOString {
value = to;
escapeHTML = NO;
}
hasCc: WOConditional {
condition = hasCc;
}
cc: WOString {
value = cc;
escapeHTML = NO;
}
hasNewsGroups: WOConditional {
condition = hasNewsGroups;
}
newsgroups: WOString {
value = newsgroups;
escapeHTML = NO;
}
hasReferences: WOConditional {
condition = hasReferences;
}
references: WOString {
value = references;
escapeHTML = NO;
}
messageBody: WOString {
value = messageBody;
escapeHTML = NO;
}
signature: WOString {
value = signature;
escapeHTML = NO;
}
signaturePlacementOnTop: WOConditional {
condition = signaturePlacementOnTop;
}
signaturePlacementOnBottom: WOConditional {
condition = signaturePlacementOnTop;
negate = YES;
}
@@ -0,0 +1,16 @@
<#replyPlacementOnTop><#newLine/>
<#newLine/>
</#replyPlacementOnTop><#signaturePlacementOnTop><#newLine/>
<#signature/><#newLine/>
</#signaturePlacementOnTop><#outlookMode>-------- הודעה מקורית --------<#newLine/>
נושא: <#subject/><#newLine/>
תאריך: <#date/><#newLine/>
מאת: <#from/><#newLine/>
<#hasReplyTo>השב: <#replyTo/></#hasReplyTo><#hasOrganization>אירגון: <#organization/></#hasOrganization>אל: <#to/><#newLine/>
<#hasCc>מכותב: <#cc/></#hasCc><#hasNewsGroups>קבוצות חדשות: <#newsgroups/></#hasNewsGroups><#hasReferences>תזכור: <#references/></#hasReferences></#outlookMode><#newLine/>
<#standardMode>פועל <#date/>, <#from/> כתב:</#standardMode><#newLine/>
<#newLine/>
<#messageBody/><#newLine/>
<#replyPlacementOnBottom><#newLine/>
<#newLine/>
</#replyPlacementOnBottom><#signaturePlacementOnBottom><#signature/></#signaturePlacementOnBottom><#newLine/>
@@ -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;
}
+3
View File
@@ -75,6 +75,9 @@
@interface SOGoMailGermanReply : SOGoMailReply
@end
@interface SOGoMailHebrewReply : SOGoMailReply
@end
@interface SOGoMailHungarianReply : SOGoMailReply
@end
+3
View File
@@ -123,6 +123,9 @@
@implementation SOGoMailGermanReply
@end
@implementation SOGoMailHebrewReply
@end
@implementation SOGoMailHungarianReply
@end
+3 -1
View File
@@ -114,7 +114,9 @@ static memcached_st *handle = NULL;
if (handle)
{
memcached_behavior_set(handle, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1);
memcached_behavior_set(handle, MEMCACHED_BEHAVIOR_TCP_NODELAY, 1);
memcached_behavior_set(handle, MEMCACHED_BEHAVIOR_RETRY_TIMEOUT, 5);
sd = [SOGoSystemDefaults sharedSystemDefaults];
// We define the default value for cleaning up cached users'
+1
View File
@@ -53,6 +53,7 @@
"Finnish",
"French",
"German",
"Hebrew",
"Hungarian",
"Icelandic",
"Italian",
+18 -1
View File
@@ -439,7 +439,23 @@ static NSArray *childRecordFields = nil;
- (GCSFolder *) ocsFolderForPath: (NSString *) _path
{
return [[self folderManager] folderAtPath: _path];
NSDictionary *record;
SOGoCache *cache;
cache = [SOGoCache sharedCache];
record = [[cache valueForKey: _path] objectFromJSONString];
if (!record)
{
record = [[self folderManager] recordAtPath: _path];
if (!record)
return nil;
[cache setValue: [record jsonRepresentation] forKey: _path];
}
return [[self folderManager] folderForRecord: record];
}
- (BOOL) folderIsMandatory
@@ -590,6 +606,7 @@ static NSArray *childRecordFields = nil;
[self removeFolderSettings: moduleSettings
withReference: [self folderReference]];
[us synchronize];
[[SOGoCache sharedCache] removeValueForKey: ocsPath];
if ([[context request] handledByDefaultHandler])
[self sendFolderAdvisoryTemplate: @"Removal"];
+151
View File
@@ -40,6 +40,111 @@
#import "SOGoMailer.h"
//
// Useful extension that comes from Pantomime which is also
// released under the LGPL. We should eventually merge
// this with the same category found in SOPE's NGSmtpClient.m
// or simply drop sope-mime in favor of Pantomime
//
@interface NSMutableData (DataCleanupExtension)
- (unichar) characterAtIndex: (int) theIndex;
- (NSRange) rangeOfCString: (const char *) theCString;
- (NSRange) rangeOfCString: (const char *) theCString
options: (unsigned int) theOptions
range: (NSRange) theRange;
@end
@implementation NSMutableData (DataCleanupExtension)
- (unichar) characterAtIndex: (int) theIndex
{
const char *bytes;
int i, len;
len = [self length];
if (len == 0 || theIndex >= len)
{
[[NSException exceptionWithName: NSRangeException
reason: @"Index out of range."
userInfo: nil] raise];
return (unichar)0;
}
bytes = [self bytes];
for (i = 0; i < theIndex; i++)
{
bytes++;
}
return (unichar)*bytes;
}
- (NSRange) rangeOfCString: (const char *) theCString
{
return [self rangeOfCString: theCString
options: 0
range: NSMakeRange(0,[self length])];
}
-(NSRange) rangeOfCString: (const char *) theCString
options: (unsigned int) theOptions
range: (NSRange) theRange
{
const char *b, *bytes;
int i, len, slen;
if (!theCString)
{
return NSMakeRange(NSNotFound,0);
}
bytes = [self bytes];
len = [self length];
slen = strlen(theCString);
b = bytes;
if (len > theRange.location + theRange.length)
{
len = theRange.location + theRange.length;
}
if (theOptions == NSCaseInsensitiveSearch)
{
i = theRange.location;
b += i;
for (; i <= len-slen; i++, b++)
{
if (!strncasecmp(theCString,b,slen))
{
return NSMakeRange(i,slen);
}
}
}
else
{
i = theRange.location;
b += i;
for (; i <= len-slen; i++, b++)
{
if (!memcmp(theCString,b,slen))
{
return NSMakeRange(i,slen);
}
}
}
return NSMakeRange(NSNotFound,0);
}
@end
@implementation SOGoMailer
+ (SOGoMailer *) mailerWithDomainDefaults: (SOGoDomainDefaults *) dd
@@ -241,6 +346,52 @@
reason: @"cannot send message: no sender set"];
else
{
NSMutableData *cleaned_message;
NSRange r1;
unsigned int limit;
//
// We now look for the Bcc: header. If it is present, we remove it.
// Some servers, like qmail, do not remove it automatically.
//
#warning FIXME - we should fix the case issue when we switch to Pantomime
cleaned_message = [NSMutableData dataWithData: data];
// We search only in the headers so we start at 0 until
// we find \r\n\r\n, which is the headers delimiter
r1 = [cleaned_message rangeOfCString: "\r\n\r\n"];
limit = r1.location-1;
// We check if the mail actually *starts* with the Bcc: header
r1 = [cleaned_message rangeOfCString: "Bcc: "
options: 0
range: NSMakeRange(0,5)];
// It does not, let's search in the entire headers
if (r1.location == NSNotFound)
r1 = [cleaned_message rangeOfCString: "\r\nBcc: "
options: 0
range: NSMakeRange(0,limit)];
if (r1.location != NSNotFound)
{
// We search for the first \r\n AFTER the Bcc: header and
// replace the whole thing with \r\n.
unsigned int i;
for (i = r1.location+7; i < limit; i++)
{
if ([cleaned_message characterAtIndex: i] == '\r' &&
(i+1 < limit && [cleaned_message characterAtIndex: i+1] == '\n') &&
(i+2 < limit && !isspace([cleaned_message characterAtIndex: i+2])))
break;
}
[cleaned_message replaceBytesInRange: NSMakeRange(r1.location, i-r1.location+2)
withBytes: NULL
length: 0];
}
if ([mailingMechanism isEqualToString: @"sendmail"])
result = [self _sendmailSendData: data
toRecipients: recipients
+1 -7
View File
@@ -297,14 +297,8 @@ static SoSecurityManager *sm = nil;
// This is important because user A could delete folder X, and user B has subscribed to it.
// If the "default roles" are enabled for calendars/address books, -validatePersmission:.. will
// work (grabbing the default role) and the deleted resource will be incorrectly returned.
//
// FIXME - 2015/01/29 - this fix (24c6c8c91d421594bd51f07904d4cd3911cd187c) was reverted. Normally, we should add
// [subscribedFolder ocsFolderForPath: [subscribedFolder ocsPath]] to check the existence of the folder but it causes
// massive SQL traffic.
//
// The proper fix would be to check upon login and only upon login if GCS folders that we're subscribed to are still existent.
//
if (subscribedFolder
&& [subscribedFolder ocsFolderForPath: [subscribedFolder ocsPath]]
&& ![sm validatePermission: SOGoPerm_AccessObject
onObject: subscribedFolder
inContext: context])
+67 -26
View File
@@ -1,6 +1,6 @@
/* SOGoSieveManager.m - this file is part of SOGo
*
* Copyright (C) 2010-2015 Inverse inc.
* Copyright (C) 2010-2017 Inverse inc.
*
* Author: Inverse <info@inverse.ca>
*
@@ -20,9 +20,7 @@
* Boston, MA 02111-1307, USA.
*/
#import <Foundation/NSArray.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSString.h>
#import <Foundation/NSCalendarDate.h>
#import <Foundation/NSURL.h>
#import <Foundation/NSValue.h>
@@ -366,7 +364,7 @@ static NSString *sieveScriptName = @"sogo";
}
else
scriptError = @"Rule lacks a 'value' parameter";
return (scriptError == nil);
}
@@ -784,7 +782,8 @@ static NSString *sieveScriptName = @"sogo";
SOGoDomainDefaults *dd;
NGSieveClient *client;
NSString *filterScript, *v;
BOOL b;
BOOL b, dateCapability;
unsigned int now;
dd = [user domainDefaults];
if (!([dd sieveScriptsEnabled] || [dd vacationEnabled] || [dd forwardEnabled]))
@@ -797,7 +796,7 @@ static NSString *sieveScriptName = @"sogo";
if (!client)
return NO;
// We adjust the "methodRequirements" based on the server's
// We adjust the "methodRequirements" based on the server's
// capabilities. Cyrus exposes "imapflags" while Dovecot (and
// potentially others) expose "imap4flags" as specified in RFC5332
if ([client hasCapability: @"imap4flags"])
@@ -806,7 +805,9 @@ static NSString *sieveScriptName = @"sogo";
[methodRequirements setObject: @"imap4flags" forKey: @"removeflag"];
[methodRequirements setObject: @"imap4flags" forKey: @"flag"];
}
dateCapability = [client hasCapability: @"date"] && [client hasCapability: @"relational"];
//
// Now let's generate the script
//
@@ -832,16 +833,24 @@ static NSString *sieveScriptName = @"sogo";
// We handle vacation messages.
// See http://ietfreport.isoc.org/idref/draft-ietf-sieve-vacation/
values = [ud vacationOptions];
now = [[NSCalendarDate calendarDate] timeIntervalSince1970];
if (values && [[values objectForKey: @"enabled"] boolValue])
if (values && [[values objectForKey: @"enabled"] boolValue] &&
(![[values objectForKey: @"startDateEnabled"] boolValue] ||
dateCapability || [[values objectForKey: @"startDate"] intValue] < now) &&
(![[values objectForKey: @"endDateEnabled"] boolValue] ||
dateCapability || [[values objectForKey: @"endDate"] intValue] > now))
{
NSCalendarDate *startDate, *endDate;
NSMutableArray *allConditions;
NSMutableString *vacation_script;
NSArray *addresses;
NSString *text;
BOOL ignore, alwaysSend;
int days, i;
allConditions = [NSMutableArray array];
days = [[values objectForKey: @"daysBetweenResponse"] intValue];
addresses = [values objectForKey: @"autoReplyEmailAddresses"];
alwaysSend = [[values objectForKey: @"alwaysSend"] boolValue];
@@ -853,32 +862,64 @@ static NSString *sieveScriptName = @"sogo";
days = 7;
vacation_script = [NSMutableString string];
[req addObjectUniquely: @"vacation"];
// Skip mailing lists
if (ignore)
[vacation_script appendString: @"if allof ( not exists [\"list-help\", \"list-unsubscribe\", \"list-subscribe\", \"list-owner\", \"list-post\", \"list-archive\", \"list-id\", \"Mailing-List\"], not header :comparator \"i;ascii-casemap\" :is \"Precedence\" [\"list\", \"bulk\", \"junk\"], not header :comparator \"i;ascii-casemap\" :matches \"To\" \"Multiple recipients of*\" ) {"];
{
[allConditions addObject: @"not exists [\"list-help\", \"list-unsubscribe\", \"list-subscribe\", \"list-owner\", \"list-post\", \"list-archive\", \"list-id\", \"Mailing-List\"]"];
[allConditions addObject: @"not header :comparator \"i;ascii-casemap\" :is \"Precedence\" [\"list\", \"bulk\", \"junk\"]"];
[allConditions addObject: @"not header :comparator \"i;ascii-casemap\" :matches \"To\" \"Multiple recipients of*\""];
}
// Start date of auto-reply
if ([[values objectForKey: @"startDateEnabled"] boolValue] && dateCapability)
{
[req addObjectUniquely: @"date"];
[req addObjectUniquely: @"relational"];
startDate = [NSCalendarDate dateWithTimeIntervalSince1970:
[[values objectForKey: @"startDate"] intValue]];
[allConditions addObject: [NSString stringWithFormat: @"currentdate :value \"ge\" \"date\" \"%@\"",
[startDate descriptionWithCalendarFormat: @"%Y-%m-%d"]]];
}
// End date of auto-reply
if ([[values objectForKey: @"endDateEnabled"] boolValue] && dateCapability)
{
[req addObjectUniquely: @"date"];
[req addObjectUniquely: @"relational"];
endDate = [NSCalendarDate dateWithTimeIntervalSince1970:
[[values objectForKey: @"endDate"] intValue]];
[allConditions addObject: [NSString stringWithFormat: @"currentdate :value \"le\" \"date\" \"%@\"",
[endDate descriptionWithCalendarFormat: @"%Y-%m-%d"]]];
}
// Apply conditions
if ([allConditions count])
[vacation_script appendFormat: @"if allof ( %@ ) { ",
[allConditions componentsJoinedByString: @", "]];
[vacation_script appendFormat: @"vacation :days %d :addresses [", days];
for (i = 0; i < [addresses count]; i++)
{
[vacation_script appendFormat: @"\"%@\"", [addresses objectAtIndex: i]];
if (i == [addresses count]-1)
[vacation_script appendString: @"] "];
else
[vacation_script appendString: @", "];
}
[vacation_script appendFormat: @"text:\r\n%@\r\n.\r\n;\r\n", text];
if (ignore)
// Closing bracket of conditions
if ([allConditions count])
[vacation_script appendString: @"}\r\n"];
//
// See http://sogo.nu/bugs/view.php?id=2332 for details
// See https://sogo.nu/bugs/view.php?id=2332 for details
//
if (alwaysSend)
[script insertString: vacation_script atIndex: 0];
@@ -896,7 +937,7 @@ static NSString *sieveScriptName = @"sogo";
int i;
b = YES;
addresses = [values objectForKey: @"forwardAddress"];
if ([addresses isKindOfClass: [NSString class]])
addresses = [NSArray arrayWithObject: addresses];
@@ -907,11 +948,11 @@ static NSString *sieveScriptName = @"sogo";
if (v && [v length] > 0)
[script appendFormat: @"redirect \"%@\";\r\n", v];
}
if ([[values objectForKey: @"keepCopy"] boolValue])
[script appendString: @"keep;\r\n"];
}
if ([req count])
{
header = [NSString stringWithFormat: @"require [\"%@\"];\r\n",
@@ -925,7 +966,7 @@ static NSString *sieveScriptName = @"sogo";
result = [client setActiveScript: @""];
// We delete the existing Sieve script
result = [client deleteScript: sieveScriptName];
if (![[result valueForKey:@"result"] boolValue]) {
[self logWithFormat: @"WARNING: Could not delete Sieve script - continuing...: %@", result];
}
@@ -935,13 +976,13 @@ static NSString *sieveScriptName = @"sogo";
if (b && [script length])
{
result = [client putScript: sieveScriptName script: script];
if (![[result valueForKey:@"result"] boolValue]) {
[self logWithFormat: @"Could not upload Sieve script: %@", result];
[client closeConnection];
[client closeConnection];
return NO;
}
result = [client setActiveScript: sieveScriptName];
if (![[result valueForKey:@"result"] boolValue]) {
[self logWithFormat: @"Could not enable Sieve script: %@", result];
+1 -1
View File
@@ -11,7 +11,7 @@ import sogoLogin
# must be kept in sync with SoObjects/SOGo/SOGoDefaults.plist
# this should probably be fetched magically...
SOGoSupportedLanguages = [ "Arabic", "Basque", "Catalan", "ChineseTaiwan", "Croatian", "Czech", "Dutch", "Danish", "Welsh", "English", "Finnish",
"SpanishSpain", "SpanishArgentina", "French", "German",
"SpanishSpain", "SpanishArgentina", "French", "German", "Hebrew",
"Icelandic", "Italian", "Lithuanian", "Macedonian", "Hungarian", "Portuguese", "BrazilianPortuguese",
"NorwegianBokmal", "NorwegianNynorsk", "Polish", "Russian", "Serbian", "Slovak",
"Slovenian", "Swedish", "TurkishTurkey", "Ukrainian" ];
+2 -2
View File
@@ -9,7 +9,7 @@ import utilities
import webdavlib
sieve_simple_vacation="""require ["vacation"];\r\nvacation :days %(days)d :addresses ["%(mailaddr)s"] text:\r\n%(vacation_msg)s\r\n.\r\n;\r\n"""
sieve_vacation_ignoreLists="""require ["vacation"];\r\nif allof ( not exists ["list-help", "list-unsubscribe", "list-subscribe", "list-owner", "list-post", "list-archive", "list-id", "Mailing-List"], not header :comparator "i;ascii-casemap" :is "Precedence" ["list", "bulk", "junk"], not header :comparator "i;ascii-casemap" :matches "To" "Multiple recipients of*" ) {vacation :days %(days)d :addresses ["%(mailaddr)s"] text:\r\n%(vacation_msg)s\r\n.\r\n;\r\n}\r\n"""
sieve_vacation_ignoreLists="""require ["vacation"];\r\nif allof ( not exists ["list-help", "list-unsubscribe", "list-subscribe", "list-owner", "list-post", "list-archive", "list-id", "Mailing-List"], not header :comparator "i;ascii-casemap" :is "Precedence" ["list", "bulk", "junk"], not header :comparator "i;ascii-casemap" :matches "To" "Multiple recipients of*" ) { vacation :days %(days)d :addresses ["%(mailaddr)s"] text:\r\n%(vacation_msg)s\r\n.\r\n;\r\n}\r\n"""
sieve_simple_forward="""redirect "%(redirect_mailaddr)s";\r\n"""
sieve_forward_keep="""redirect "%(redirect_mailaddr)s";\r\nkeep;\r\n"""
sieve_simple_filter="""require ["fileinto"];\r\nif anyof (header :contains "subject" "%(subject)s") {\r\n fileinto "%(folderName)s";\r\n}\r\n"""
@@ -54,7 +54,7 @@ class sieveTest(unittest.TestCase):
for (script, isActive) in sieveScriptList:
if (script == "sogo"):
sieveFoundsogo=1
sieveFoundsogo=1
self.assertEqual(isActive, True, "sogo sieve script is not active!")
(ret, createdSieveScript) = self.ms.getscript(script)
self.assertEqual(ret, "OK", "Couldn't get sogo sieve script")
+2
View File
@@ -21,9 +21,11 @@ $(SOGO_TOOL)_OBJC_FILES += \
SOGoToolRemove.m \
SOGoToolRemoveDoubles.m \
SOGoToolRenameUser.m \
SOGoToolCheckupUser.m \
SOGoToolRestore.m \
SOGoToolCreateFolder.m \
SOGoToolUserPreferences.m \
SOGoToolManageACL.m \
SOGoToolManageEAS.m \
SOGoToolTruncateCalendar.m
TOOL_NAME += $(SOGO_TOOL)
+1 -3
View File
@@ -1,8 +1,6 @@
/* SOGoSockD.h - this file is part of SOGo
*
* Copyright (C) 2010 Inverse inc.
*
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
* Copyright (C) 2010-2017 Inverse inc.
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
+1 -3
View File
@@ -1,8 +1,6 @@
/* SOGoSockD.m - this file is part of SOGo
*
* Copyright (C) 2010 Inverse inc.
*
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
* Copyright (C) 2010-2017 Inverse inc.
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
+1 -3
View File
@@ -1,8 +1,6 @@
/* SOGoSockDOperation.h - this file is part of SOGo
*
* Copyright (C) 2010 Inverse inc.
*
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
* Copyright (C) 2010-2017 Inverse inc.
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
+1 -3
View File
@@ -1,8 +1,6 @@
/* SOGoSockDOperation.m - this file is part of SOGo
*
* Copyright (C) 2010 Inverse inc.
*
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
* Copyright (C) 2010-2017 Inverse inc.
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
+1 -3
View File
@@ -1,8 +1,6 @@
/* SOGoSockDScanner.h - this file is part of SOGo
*
* Copyright (C) 2010 Inverse inc.
*
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
* Copyright (C) 2010-2017 Inverse inc.
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
+1 -3
View File
@@ -1,9 +1,7 @@
/* SOGoSockDScanner.m - this file is part of SOGo
*
* Copyright (C) 2010 Inverse inc.
*
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
* Copyright (C) 2010-2017 Inverse inc.
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
+337
View File
@@ -0,0 +1,337 @@
/* SOGoToolCheckup.m - this file is part of SOGo
*
* Copyright (C) 2017 Inverse inc.
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#import <Foundation/NSAutoreleasePool.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSEnumerator.h>
#import <Foundation/NSString.h>
#import <GDLAccess/EOAdaptorChannel.h>
#import <GDLContentStore/GCSChannelManager.h>
#import <GDLContentStore/GCSFolderManager.h>
#import <GDLContentStore/GCSFolder.h>
#import <GDLContentStore/NSURL+GCS.h>
#import <SOGo/SOGoUserManager.h>
#import <SOGo/NSArray+Utilities.h>
#import <SOGo/SOGoUser.h>
#import <SOGo/SOGoSystemDefaults.h>
#import <NGCards/iCalCalendar.h>
#import <NGCards/NGVCard.h>
#import "SOGoTool.h"
@interface SOGoToolCheckup : SOGoTool
{
NSArray *usersToCheckup;
BOOL delete;
}
@end
@implementation SOGoToolCheckup
+ (NSString *) command
{
return @"checkup";
}
+ (NSString *) description
{
return @"checkup integrity of user(s) data)";
}
- (id) init
{
if ((self = [super init]))
{
usersToCheckup = nil;
delete = NO;
}
return self;
}
- (void) dealloc
{
[usersToCheckup release];
[super dealloc];
}
- (void) usage
{
fprintf (stderr, "checkup [-d] user...\n\n"
" -d delete the corrupted records\n"
" user the user to check the records or ALL for everybody\n\n"
"Example: sogo-tool checkup jdoe\n");
}
- (BOOL) fetchUserIDs: (NSArray *) users
{
NSAutoreleasePool *pool;
SOGoUserManager *lm;
NSDictionary *infos;
NSString *user;
id allUsers;
int count, max;
lm = [SOGoUserManager sharedUserManager];
max = [users count];
user = [users objectAtIndex: 0];
if (max == 1 && [user isEqualToString: @"ALL"])
{
GCSFolderManager *fm;
GCSChannelManager *cm;
NSURL *folderLocation;
EOAdaptorChannel *fc;
NSArray *attrs;
NSMutableArray *allSqlUsers;
NSString *sql;
fm = [GCSFolderManager defaultFolderManager];
cm = [fm channelManager];
folderLocation = [fm folderInfoLocation];
fc = [cm acquireOpenChannelForURL: folderLocation];
if (fc)
{
allSqlUsers = [NSMutableArray new];
sql = [NSString stringWithFormat: @"SELECT DISTINCT c_path2 FROM %@",
[folderLocation gcsTableName]];
[fc evaluateExpressionX: sql];
attrs = [fc describeResults: NO];
while ((infos = [fc fetchAttributes: attrs withZone: NULL]))
{
user = [infos objectForKey: @"c_path2"];
if (user)
[allSqlUsers addObject: user];
}
[cm releaseChannel: fc];
users = allSqlUsers;
max = [users count];
[allSqlUsers autorelease];
}
}
pool = [[NSAutoreleasePool alloc] init];
allUsers = [NSMutableArray new];
for (count = 0; count < max; count++)
{
if (count > 0 && count%100 == 0)
{
DESTROY(pool);
pool = [[NSAutoreleasePool alloc] init];
}
user = [users objectAtIndex: count];
infos = [lm contactInfosForUserWithUIDorEmail: user];
if (infos)
[allUsers addObject: infos];
else
{
// We haven't found the user based on the GCS table name
// Let's try to strip the domain part and search again.
// This can happen when using SOGoEnableDomainBasedUID (YES)
// but login in SOGo using a UID without domain (DomainLessLogin gets set)
NSRange r;
r = [user rangeOfString: @"@"];
if (r.location != NSNotFound)
{
user = [user substringToIndex: r.location];
infos = [lm contactInfosForUserWithUIDorEmail: user];
if (infos)
[allUsers addObject: infos];
else
NSLog (@"user '%@' unknown", user);
}
else
NSLog (@"user '%@' unknown", user);
}
}
[allUsers autorelease];
ASSIGN (usersToCheckup, allUsers);
DESTROY(pool);
return ([usersToCheckup count] > 0);
}
- (BOOL) parseArguments
{
BOOL rc;
int max;
max = [arguments count];
if (max > 0)
{
delete = [[arguments objectAtIndex: 0] isEqualToString: @"-d"];
if (delete && max > 1)
arguments = RETAIN([arguments subarrayWithRange: NSMakeRange(1, max-1)]);
rc = [self fetchUserIDs: arguments];
}
else
{
[self usage];
rc = NO;
}
return rc;
}
- (BOOL) checkupFolder: (NSString *) folder
withFM: (GCSFolderManager *) fm
{
NSString *content, *c_name;
GCSFolder *gcsFolder;
NSArray *objects;
unsigned int i, count;
BOOL rc, is_calendar;
gcsFolder = [fm folderAtPath: folder];
is_calendar = ([[gcsFolder folderTypeName] caseInsensitiveCompare: @"Appointment"] == NSOrderedSame);
objects = [gcsFolder fetchFields: [NSArray arrayWithObjects: @"c_name", @"c_content", nil] fetchSpecification: nil];
count = [objects count];
for (i = 0; i < count; i++)
{
content = [[[objects objectAtIndex: i] objectForKey: @"c_content"] stringByTrimmingSpaces];
c_name = [[objects objectAtIndex: i] objectForKey: @"c_name"];
if (is_calendar)
{
// We check for
// BEGIN:VCALENDAR
// ..
// END:VCALENDAR
iCalCalendar *calendar;
if ([content length] < 30 ||
[[content substringToIndex: 15] caseInsensitiveCompare: @"BEGIN:VCALENDAR"] != NSOrderedSame ||
[[content substringFromIndex: [content length]-13] caseInsensitiveCompare: @"END:VCALENDAR"] != NSOrderedSame)
{
NSLog(@"Corrupted calendar item (missing tags) in path %@ with c_name = %@", folder, c_name);
if (delete)
[gcsFolder deleteContentWithName: c_name];
rc = NO;
}
else
{
calendar = [iCalCalendar parseSingleFromSource: content];
if (!calendar)
{
NSLog(@"Corrupted calendar item (unparsable) in path %@ with c_name = %@", folder, c_name);
if (delete)
[gcsFolder deleteContentWithName: c_name];
rc = NO;
}
}
}
else
{
NGVCard *card;
card = [NGVCard parseSingleFromSource: content];
if (!card)
{
NSLog(@"Corrupted card item (unparsable) in path %@ with c_name = %@", folder, c_name);
if (delete)
[gcsFolder deleteContentWithName: c_name];
rc = NO;
}
}
}
return rc;
}
- (BOOL) checkupUserFolders: (NSString *) uid
{
GCSFolderManager *fm;
NSArray *folders;
int count, max;
NSString *basePath, *folder;
NSLog(@"Checking folders of user %@", uid);
fm = [GCSFolderManager defaultFolderManager];
basePath = [NSString stringWithFormat: @"/Users/%@", uid];
folders = [fm listSubFoldersAtPath: basePath recursive: YES];
max = [folders count];
for (count = 0; count < max; count++)
{
folder = [NSString stringWithFormat: @"%@/%@", basePath, [folders objectAtIndex: count]];
[self checkupFolder: folder withFM: fm];
}
return YES;
}
- (BOOL) checkupUser: (NSDictionary *) theUser
{
NSString *gcsUID, *domain;
SOGoSystemDefaults *sd;
sd = [SOGoSystemDefaults sharedSystemDefaults];
domain = [theUser objectForKey: @"c_domain"];
gcsUID = [theUser objectForKey: @"c_uid"];
if ([sd enableDomainBasedUID] && [gcsUID rangeOfString: @"@"].location == NSNotFound)
gcsUID = [NSString stringWithFormat: @"%@@%@", gcsUID, domain];
return [self checkupUserFolders: gcsUID];
}
- (BOOL) proceed
{
NSAutoreleasePool *pool;
int count, max;
BOOL rc;
rc = YES;
pool = [NSAutoreleasePool new];
max = [usersToCheckup count];
for (count = 0; rc && count < max; count++)
{
rc = [self checkupUser: [usersToCheckup objectAtIndex: count]];
if ((count % 10) == 0)
[pool emptyPool];
}
[pool release];
return rc;
}
- (BOOL) run
{
return ([self parseArguments] && [self proceed]);
}
@end
+408
View File
@@ -0,0 +1,408 @@
/* SOGoToolManageACL.m - this file is part of SOGo
*
* Copyright (C) 2017 Inverse inc.
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#import <Foundation/NSAutoreleasePool.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSEnumerator.h>
#import <Foundation/NSString.h>
#import <GDLAccess/EOAdaptorChannel.h>
#import <GDLContentStore/EOQualifier+GCS.h>
#import <GDLContentStore/GCSChannelManager.h>
#import <GDLContentStore/GCSFolderManager.h>
#import <GDLContentStore/GCSFolder.h>
#import <GDLContentStore/NSURL+GCS.h>
#import <SOGo/SOGoCache.h>
#import <SOGo/SOGoUserManager.h>
#import <SOGo/NSArray+Utilities.h>
#import <SOGo/NSString+Utilities.h>
#import <SOGo/SOGoUser.h>
#import <SOGo/SOGoSystemDefaults.h>
#import <NGCards/iCalCalendar.h>
#import <NGCards/NGVCard.h>
#import "SOGoTool.h"
typedef enum
{
ManageACLUnknown = -1,
ManageACLGet = 0,
ManageACLAdd = 1,
ManageACLRemove = 2,
} SOGoManageACLCommand;
@interface SOGoToolManageACL : SOGoTool
{
SOGoManageACLCommand command;
NSString *owner;
NSString *folder;
NSString *user;
NSArray *rights;
}
@end
@implementation SOGoToolManageACL
+ (NSString *) command
{
return @"manage-acl";
}
+ (NSString *) description
{
return @"manage user's ACL";
}
- (id) init
{
if ((self = [super init]))
{
command = ManageACLUnknown;
owner = nil;
folder = nil;
user = nil;
rights = nil;
}
return self;
}
- (void) dealloc
{
[owner release];
[folder release];
[user release];
[rights release];
[super dealloc];
}
- (void) usage
{
fprintf (stderr, "manage-acl get|add|remove owner folder user <rights>\n\n"
" get get ACL information of folder for user\n"
" add add ACL information of folder for user\n"
" remove remove all ACL information of folder for user\n"
" owner the user owning the folder\n"
" folder the folder - Calendar/<ID> or Contacst/<ID>\n"
" user the user to get/set rights for - 'ALL', '<default>', 'anonymous' are supported\n"
" rights rights to add\n\n"
"Example: sogo-tool manage-acl get jdoe Calendar/personal\n\n"
"Note: You can add only one access right at the time. To set them all at once,\n"
" invoke 'remove' first to remove them all.\n\n");
}
- (BOOL) parseArguments
{
NSString *s;
BOOL rc;
int max;
max = [arguments count];
if (max > 3 && max < 6)
{
s = [arguments objectAtIndex: 0];
if ([s isEqualToString: @"get"])
command = ManageACLGet;
else if ([s isEqualToString: @"add"])
{
command = ManageACLAdd;
rights = RETAIN([[arguments objectAtIndex: 4] objectFromJSONString]);
}
else if ([s isEqualToString: @"remove"])
command = ManageACLRemove;
else
{
[self usage];
return NO;
}
owner = RETAIN([arguments objectAtIndex: 1]);
folder = RETAIN([arguments objectAtIndex: 2]);
user = RETAIN([arguments objectAtIndex: 3]);
rc = YES;
}
else
{
[self usage];
rc = NO;
}
return rc;
}
- (NSArray *) _fetchUserIDs
{
NSMutableArray *allUsers, *allSQLUsers;
NSAutoreleasePool *pool;
SOGoUserManager *lm;
NSDictionary *infos;
NSString *u;
int count, max;
lm = [SOGoUserManager sharedUserManager];
allSQLUsers = [[NSMutableArray alloc] init];
allUsers = [[NSMutableArray alloc] init];
if ([user isEqualToString: @"ALL"])
{
GCSChannelManager *cm;
NSURL *folderLocation;
GCSFolderManager *fm;
EOAdaptorChannel *fc;
NSArray *attrs;
NSString *sql;
fm = [GCSFolderManager defaultFolderManager];
cm = [fm channelManager];
folderLocation = [fm folderInfoLocation];
fc = [cm acquireOpenChannelForURL: folderLocation];
if (fc)
{
allSQLUsers = [NSMutableArray new];
sql = [NSString stringWithFormat: @"SELECT DISTINCT c_path2 FROM %@",
[folderLocation gcsTableName]];
[fc evaluateExpressionX: sql];
attrs = [fc describeResults: NO];
while ((infos = [fc fetchAttributes: attrs withZone: NULL]))
{
u = [infos objectForKey: @"c_path2"];
if (u)
[allSQLUsers addObject: u];
}
[cm releaseChannel: fc];
}
// We add our system users
[allSQLUsers addObject: @"<default>"];
if ([[SOGoSystemDefaults sharedSystemDefaults] enablePublicAccess])
[allSQLUsers addObject: @"anonymous"];
}
else
[allSQLUsers addObject: user];
pool = [[NSAutoreleasePool alloc] init];
max = [allSQLUsers count];
for (count = 0; count < max; count++)
{
if (count > 0 && count%100 == 0)
{
DESTROY(pool);
pool = [[NSAutoreleasePool alloc] init];
}
u = [allSQLUsers objectAtIndex: count];
// We skip lookup for our 'system users' but keep them to set ACLs
if ([u isEqualToString: @"anonymous"] || [u isEqualToString: @"<default>"])
{
[allUsers addObject: u];
continue;
}
// Skip the owner
if ([u isEqualToString: owner])
continue;
infos = [lm contactInfosForUserWithUIDorEmail: u];
if (infos)
[allUsers addObject: [infos objectForKey: @"c_uid"]];
else
{
// We haven't found the user based on the GCS table name
// Let's try to strip the domain part and search again.
// This can happen when using SOGoEnableDomainBasedUID (YES)
// but login in SOGo using a UID without domain (DomainLessLogin gets set)
NSRange r;
r = [u rangeOfString: @"@"];
if (r.location != NSNotFound)
{
u = [u substringToIndex: r.location];
infos = [lm contactInfosForUserWithUIDorEmail: u];
if (infos)
[allUsers addObject: [infos objectForKey: @"c_uid"]];
else
NSLog (@"user '%@' unknown", u);
}
else
NSLog (@"user '%@' unknown", u);
}
}
DESTROY(pool);
RELEASE(allSQLUsers);
return AUTORELEASE(allUsers);
}
- (void) addACLForUser: (NSString *) theUser
folder: (GCSFolder *) theFolder
{
NSString *currentRole, *SQL, *path, *u;
EOAdaptorChannel *channel;
NSArray *allUsers;
int i, j;
channel = [theFolder acquireAclChannel];
path = [NSString stringWithFormat: @"%@/%@", owner, folder];
allUsers = [self _fetchUserIDs];
for (i = 0; i < [allUsers count]; i++)
{
u = [allUsers objectAtIndex: i];
NSLog(@"Settings rights for user %@", u);
for (j = 0; j < [rights count]; j++)
{
currentRole = [rights objectAtIndex: j];
if ([GCSFolderManager singleStoreMode])
SQL = [NSString stringWithFormat: @"INSERT INTO %@"
@" (c_object, c_uid, c_role, c_folder_id)"
@" VALUES ('/%@', '%@', '%@', %@)",
[theFolder aclTableName],
path, u, currentRole, [theFolder folderId]];
else
SQL = [NSString stringWithFormat: @"INSERT INTO %@"
@" (c_object, c_uid, c_role)"
@" VALUES ('/%@', '%@', '%@')",
[theFolder aclTableName],
path, u, currentRole];
[channel evaluateExpressionX: SQL];
}
}
}
- (void) getACLForUser: (NSString *) theUser
folder: (GCSFolder *) theFolder
{
NSArray *allRights, *allKeys;
NSMutableDictionary *d;
EOQualifier *qualifier;
NSDictionary *right;
NSString *qs;
id o;
int i;
if ([theUser isEqualToString: @"ALL"])
qualifier = nil;
else
{
qs = [NSString stringWithFormat: @"c_uid = '%@'", theUser];
qualifier = [EOQualifier qualifierWithQualifierFormat: qs];
}
allRights = [theFolder fetchAclMatchingQualifier: qualifier];
d = [NSMutableDictionary dictionary];
for (i = 0; i < [allRights count]; i++)
{
right = [allRights objectAtIndex: i];
if ((o = [d objectForKey: [right objectForKey: @"c_uid"]]))
[o addObject: [right objectForKey: @"c_role"]];
else
[d setObject: [NSMutableArray arrayWithObject: [right objectForKey: @"c_role"]]
forKey: [right objectForKey: @"c_uid"]];
}
allKeys = [d allKeys];
for (i = 0; i < [allKeys count]; i++)
{
o = [allKeys objectAtIndex: i];
NSLog(@"Rights for %@ %@", o, [[d objectForKey: o] jsonRepresentation]);
}
}
- (void) removeACLForUser: (NSString *) theUser
folder: (GCSFolder *) theFolder
{
EOQualifier *qualifier;
NSString *qs, *path;
if ([theUser isEqualToString: @"ALL"])
qs = [NSString stringWithFormat: @"c_uid LIKE '\%'", theUser];
else
{
qs = [NSString stringWithFormat: @"c_uid = '%@'", theUser];
}
qualifier = [EOQualifier qualifierWithQualifierFormat: qs];
[theFolder deleteAclMatchingQualifier: qualifier];
// We clear the cache. We first strip /Users/ from our path
path = [[[[theFolder path] pathComponents] subarrayWithRange: NSMakeRange(2,3)] componentsJoinedByString: @"/"];
[[SOGoCache sharedCache] setACLs: nil
forPath: path];
}
- (BOOL) proceed
{
NSAutoreleasePool *pool;
GCSFolderManager *fm;
GCSFolder *f;
BOOL rc;
rc = YES;
pool = [NSAutoreleasePool new];
fm = [GCSFolderManager defaultFolderManager];
f = [fm folderAtPath: [NSString stringWithFormat: @"/Users/%@/%@", owner, folder]];
if (!f)
{
NSLog(@"No folder %@ found for user %@", folder, owner);
rc = NO;
}
else
{
if (command == ManageACLGet)
[self getACLForUser: user folder: f];
else if (command == ManageACLRemove)
[self removeACLForUser: user folder: f];
else if (command == ManageACLAdd)
[self addACLForUser: user folder: f];
else
[self usage];
}
[pool release];
return rc;
}
- (BOOL) run
{
return ([self parseArguments] && [self proceed]);
}
@end
+1 -3
View File
@@ -1,8 +1,6 @@
/* SOGoToolRemove.m - this file is part of SOGo
*
* Copyright (C) 2010 Inverse inc.
*
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
* Copyright (C) 2010-2017 Inverse inc.
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
+1 -3
View File
@@ -1,8 +1,6 @@
/* SOGoToolRemoveDoubles.m - this file is part of SOGo
*
* Copyright (C) 2009 Inverse inc.
*
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
* Copyright (C) 2009-2017 Inverse inc.
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
+1 -3
View File
@@ -1,8 +1,6 @@
/* SOGoToolRenameUser.m - this file is part of SOGo
*
* Copyright (C) 2011 Inverse inc
*
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
* Copyright (C) 2011-2017 Inverse inc
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
+1 -3
View File
@@ -1,8 +1,6 @@
/* sogo-ealarms-notify.m - this file is part of SOGo
*
* Copyright (C) 2010 Inverse inc.
*
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
* Copyright (C) 2010-2017 Inverse inc.
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
+1 -3
View File
@@ -1,8 +1,6 @@
/* sogo-slapd-sockd.m - this file is part of SOGo
*
* Copyright (C) 2010 Inverse inc.
*
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
* Copyright (C) 2010-2017 Inverse inc.
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -0,0 +1,26 @@
/* this file is in UTF-8 format! */
"Help" = "עזרה";
"Close" = "סגור";
"Modules" = "מודולים";
/* Modules short names */
"ACLs" = "רשימות בקרת גישה";
/* Modules titles */
"ACLs_title" = "תקיות משתמשים בניהול רשימות בקרת גישה";
/* Modules descriptions */
"ACLs_description" = "<p>מודול האדמיניסטראציה ברשימת בקרת גישה מאפשרת שינוי לרשימות בקרת הגישה ללוח השנה ואנשי הקשר לכל משתמש.<p/>\n<p>לעריכת רשימת בקרת הגישה עבור תקייה של משתמש, יש להקליד את שם המשתמש בשדה החיפוש בחלקו העליון של החלון ולהקליק פעמיים על התקייה הרצויה<p/>";
"Name or Email" = "שם או כתובת אימייל";
/* Rights module: initial search message */
"Start a search to edit the rights" = "חיפוש לעריכת הרשאות";
/* Rights module: Empty search result */
"No matching user" = "לא נמצאו תוצאות";
/* Rights module: no selection */
"No resource selected" = "לא נבחר משאב";
"Add User" = "הוסף משתמש";
"Subscribe User" = "רישום משתמש";
"Rights" = "הרשאות";
"Search Users" = "חיפוש משתמשים";
"users found" = "נמצאו תוצאות";
"No resource" = "לא קיים משאב";
"Any Authenticated User" = "כל משתמש מאומת";
"Public Access" = "נקודת גישה פתוחה";
+19 -9
View File
@@ -69,14 +69,6 @@
"delegate is organizer" = "Delegovaný je organizátor. Prosím určete jiného delegovaného.";
"delegate is a participant" = "Delegovaný je již účastníkem.";
"delegate is a group" = "Určená adresa odpovídá skupině. Delegovat můžete pouze na osobu.";
"Snooze for " = "Odložit o ";
"5 minutes" = "5 minut";
"10 minutes" = "10 minut";
"15 minutes" = "15 minut";
"30 minutes" = "30 minut";
"45 minutes" = "45 minut";
"1 hour" = "1 hodinu";
"1 day" = "1 den";
/* common buttons */
"OK" = "OK";
@@ -89,6 +81,15 @@
"Start" = "Začátek";
"Due Date" = "Do dne";
"Location" = "Místo";
"Snooze" = "Odložit";
"Snooze for " = "Odložit o ";
"5 minutes" = "5 minut";
"10 minutes" = "10 minut";
"15 minutes" = "15 minut";
"30 minutes" = "30 minut";
"45 minutes" = "45 minut";
"1 hour" = "1 hodinu";
"1 day" = "1 den";
/* mail labels */
"Important" = "Důležitý";
@@ -118,18 +119,27 @@
/* Authentication failed */
"Wrong username or password." = "Špatné uživatelské jméno nebo heslo.";
/* Error message display bellow search field when the search string has less than the required number of characters */
/* Error message displayed bellow search field when the search string has less than the required number of characters */
"Enter at least %{minimumSearchLength} characters" = "Zadejte alespoň %{minimumSearchLength} znaků";
/* Error message displayed when a file upload exceeds WOMaxUploadSize */
"File size upload limit reached" = "Byl dosažen limit pro velikost nahraného souboru";
/* Toggle visibility (ex: mail account in left navigation menu) */
"Toggle visibility" = "Přepnout zobrazení";
/* Toggle multiple items at the same time (hotkeys cheatsheet) */
"Toggle range of items" = "Přepnout rozsah položek";
/* Question mark shows list of hotkeys */
"Show or hide this help" = "Zobrazit nebo skrýt tuto nápovědu";
/* Space key */
"key_space" = "space";
/* Shift and space key */
"key_shift+space" = "shift + mezerník";
/* Up arrow key */
"key_up" = "↑";
+183
View File
@@ -0,0 +1,183 @@
/* this file is in UTF-8 format! */
/* toolbars */
"Save" = "שמור";
"Close" = "סגור";
"Edit User Rights" = "ערוך הרשאות משתמש";
"Home" = "בית";
"Calendar" = "לוח שנה";
"Address Book" = "אנשי קשר";
"Mail" = "מייל";
"Preferences" = "מועדפים";
"Administration" = "אפשרויות ניהול";
"Disconnect" = "התנתקות";
"Toggle Menu" = "פתח/סגור תפריט";
"Right Administration" = "ניהול הרשאות";
"Log Console (dev.)" = "קונסולת לוגים (מפתחים)";
"User" = "משתמש";
"Vacation message is enabled" = "הודעת חופשה מאופשרת";
"Help" = "עזרה";
"noJavascriptError" = "SOGo דורש Javascript כדי לפעול. אנא וודאו כי אופציה זו מאופשרת ופעילה בהגדרות הדפדפן";
"noJavascriptRetry" = "נסו שנית";
"Owner" = "בעלים";
"Publish the Free/Busy information" = "פירסום סטטוס פנוי/לא פנוי";
"Add..." = "הוספה";
"Remove" = "הסרה";
"Subscribe User" = "רישום משתמש";
"Any Authenticated User" = "כל משתמש מאומת";
"Public Access" = "נקודת גישה פתוחה";
"Any user not listed above" = "כל משתמש לא מפורט לעיל";
"Anybody accessing this resource from the public area" = "כל הניגש למשאב זה מאזור פומבי";
"Sorry, the user rights can not be configured for that object." = "מתנצלים, לא ניתן להגדיר הרשאות משתמש עבור האובייקט.";
"Any user with an account on this system will be able to access your mailbox \"%{0}\". Are you certain you trust them all?"
= "כל משתמש בעל חשבון במערכת יקבל גישה לתיבת הדואר שלכם \"{0}%\". האם לתת אמון בכולם?";
"Any user with an account on this system will be able to access your calendar \"%{0}\". Are you certain you trust them all?"
= "כל משתמש בעל חשבון במערכת יקבל גישה ללוח השנה שלכם \"{0}%\". האם לתת אמון בכולם?";
"Potentially anyone on the Internet will be able to access your calendar \"%{0}\", even if they do not have an account on this system. Is this information suitable for the public Internet?"
= "פוטנציאלית, כל גולש באינטרנט יוכל לצפות בלוח השנה שלכם \"%{0}\", גם גושלים ללא חשבון משתמש במערכת. האם המידע מתאים לפירסום פתוח באינטנרנט?";
"Any user with an account on this system will be able to access your address book \"%{0}\". Are you certain you trust them all?"
= "כל משתמש בעל חשבון במערכת יקבל גישה לאנשי הקשר שלכם \"{0}%\". האם לתת אמון בכולם?";
"Potentially anyone on the Internet will be able to access your address book \"%{0}\", even if they do not have an account on this system. Is this information suitable for the public Internet?"
= "פוטנציאלית, כל גולש באינטרנט יוכל לצפות באנשי הקשר שלכם \"%{0}\", גם גושלים ללא חשבון משתמש במערכת. האם המידע מתאים לפירסום פתוח באינטנרנט?";
"Give Access" = "אפשר גישה";
"Keep Private" = "השאר פרטי";
/* generic.js */
"Unable to subscribe to that folder!"
= "לא ניתן להירשם לתקייה!";
"You cannot subscribe to a folder that you own!"
= "לא ניתן להירשם לתקייה בבעלותך!";
"Unable to unsubscribe from that folder!"
= "לא ניתן להסיר הרשמה מהתקייה!";
"You cannot unsubscribe from a folder that you own!"
= "לא ניתן להסיר הרשמה מתקייה בבעלותך!";
"Unable to rename that folder!" = "לא ניתן לשנות את שם התקייה!";
"You have already subscribed to that folder!"
= "הינכם רשומים כבר לתקייה זו!";
"The user rights cannot be edited for this object!"
= "לא ניתן לערוך הרשאות משתמש עבור האובייקט!";
"A folder by that name already exists." = "קיימת תקייה בשם.";
"You cannot create a list in a shared address book."
= "לא ניתן ליצור רשימה באנשי קשר משותפים.";
"Warning" = "אזהרה";
"Can't contact server" = "התקבלה שגיאה בהתחברות לשרת. נסו שנית מאוחר יותר.";
"You are not allowed to access this module or this system. Please contact your system administrator."
= "אין אפשרות לגשת למודול או למערכת. צרו קשר עם מנהל המערכת.";
"You don't have the required privileges to perform the operation."
= "אין ברשותכם הרשאות לביצוע הפעולה.";
"noEmailForDelegation" = "חובה לציין כתובת אליה ברצונכם להאציל את ההזמנה.";
"delegate is organizer" = "הנציג הינו המארגן. אנא בחרו נציג אחר.";
"delegate is a participant" = "הנציג כבר משתתף.";
"delegate is a group" = "הכתובת המצויינת שייכת לקבוצה. ניתן להאציל למשתמש בלבד.";
/* common buttons */
"OK" = "אוקיי";
"Cancel" = "ביטול";
"Yes" = "כן";
"No" = "לא";
/* alarms */
"Reminder" = "תזכורת";
"Start" = "התחלה";
"Due Date" = "תאריך להגשה";
"Location" = "מיקום";
"Snooze" = "השהייה";
"Snooze for " = "השהייה ל";
"5 minutes" = "5 דקות";
"10 minutes" = "10 דקות";
"15 minutes" = "15 דקות";
"30 minutes" = "30 דקות";
"45 minutes" = "45 דקות";
"1 hour" = "שעה 1";
"1 day" = "יום 1";
/* mail labels */
"Important" = "חשוב";
"Work" = "עבודה";
"Personal" = "פרטי";
"To Do" = "ממתין לביצוע";
"Later" = "מאוחר יותר";
"a2_Sunday" = "א'";
"a2_Monday" = "ב'";
"a2_Tuesday" = "ג'";
"a2_Wednesday" = "ד'";
"a2_Thursday" = "ה'";
"a2_Friday" = "ו'";
"a2_Saturday" = "ש'";
"Access Rights" = "הרשאות גישה";
"Add User" = "הוסף משתמש";
"Loading" = "טוען";
"No such user." = "לא נמצא משתמש.";
"You cannot (un)subscribe to a folder that you own!" = "לא ניתן להירשם/להסיר הרשמה עבור תקייה בבעלותך!";
/* Authentication username */
"Username" = "שם משתמש";
/* Authentication password */
"Password" = "סיסמה";
/* Authentication failed */
"Wrong username or password." = "שם משתמש או סיסמה שגויים.";
/* Error message displayed bellow search field when the search string has less than the required number of characters */
"Enter at least %{minimumSearchLength} characters" = "לפחות {minimumSearchLength}% תוים";
/* Error message displayed when a file upload exceeds WOMaxUploadSize */
"File size upload limit reached" = "מגבלת גודל העלאת קובץ נחצתה";
/* Toggle visibility (ex: mail account in left navigation menu) */
"Toggle visibility" = "אפשר/בטל נראות";
/* Toggle multiple items at the same time (hotkeys cheatsheet) */
"Toggle range of items" = "אפשר/בטל תווך פריטים";
/* Question mark shows list of hotkeys */
"Show or hide this help" = "הראה או הסתר עזרה";
/* Space key */
"key_space" = "רווח";
/* Shift and space key */
"key_shift+space" = "Shift + רווח";
/* Up arrow key */
"key_up" = "↑";
/* Down arrow key */
"key_down" = "↓";
/* Left arrow key */
"key_left" = "←";
/* Right arrow key */
"key_right" = "→";
/* Shift and up arrow combo keys */
"key_shift+up" = "shift + ↑";
/* Shift and down arrow combo keys */
"key_shift+down" = "shift + ↓";
/* Backspace key */
"key_backspace" = "backspace";
/* Hotkey to start a search */
"hotkey_search" = "s";
/* Hotkey description to select next list item */
"View next item" = "פריט הבא";
/* Hotkey description to select previous list item */
"View previous item" = "פריט קודם";
/* Hotkey description to add next list item to selection */
"Add next item to selection" = "הוסף פריט הבא לבחירה";
/* Hotkey description to add previous list item to selection */
"Add previous item to selection" = "הוסף פריט קודם לבחירה";
/* Hotkey description to move backward in current view */
"Move backward" = "אחורה";
/* Hotkey description to move forward in current view */
"Move forward" = "קדימה";
+19 -9
View File
@@ -69,14 +69,6 @@
"delegate is organizer" = "Это организатор. Выберите другого приглашаемого.";
"delegate is a participant" = "Приглашаемый уже участник.";
"delegate is a group" = "Указанный адрес - адрес группы. Вы можете делегировать приглашение лишь отдельным людям.";
"Snooze for " = "Отложить на";
"5 minutes" = "5 минут";
"10 minutes" = "10 минут";
"15 minutes" = "15 минут";
"30 minutes" = "30 минут";
"45 minutes" = "45 минут";
"1 hour" = "1 час";
"1 day" = "1 день";
/* common buttons */
"OK" = "OK";
@@ -89,6 +81,15 @@
"Start" = "Начало";
"Due Date" = "Дата начала";
"Location" = "Место";
"Snooze" = "Отложить";
"Snooze for " = "Отложить на";
"5 minutes" = "5 минут";
"10 minutes" = "10 минут";
"15 minutes" = "15 минут";
"30 minutes" = "30 минут";
"45 minutes" = "45 минут";
"1 hour" = "1 час";
"1 day" = "1 день";
/* mail labels */
"Important" = "Важно";
@@ -118,18 +119,27 @@
/* Authentication failed */
"Wrong username or password." = "Неправильный логин или пароль.";
/* Error message display bellow search field when the search string has less than the required number of characters */
/* Error message displayed bellow search field when the search string has less than the required number of characters */
"Enter at least %{minimumSearchLength} characters" = "Введите не менее %{minimumSearchLength} символов";
/* Error message displayed when a file upload exceeds WOMaxUploadSize */
"File size upload limit reached" = "Достигнуто ограничение на размер загружаемого файла";
/* Toggle visibility (ex: mail account in left navigation menu) */
"Toggle visibility" = "Переключить видимость";
/* Toggle multiple items at the same time (hotkeys cheatsheet) */
"Toggle range of items" = "Сменить состояние нескольких элементов";
/* Question mark shows list of hotkeys */
"Show or hide this help" = "Показать или скрыть подсказку";
/* Space key */
"key_space" = "space";
/* Shift and space key */
"key_shift+space" = "Shift + Пробел";
/* Up arrow key */
"key_up" = "↑";
+19 -9
View File
@@ -69,14 +69,6 @@
"delegate is organizer" = "Delegát je organizátorom. Zadajte prosím iného delegáta.";
"delegate is a participant" = "Delegát je už účastníkom.";
"delegate is a group" = "Zadaná adresa zodpovedá skupine. Môžete ju delegovať len na jedinečnú osobu.";
"Snooze for " = "Odložiť";
"5 minutes" = "5 minút";
"10 minutes" = "10 minút";
"15 minutes" = "15 minút";
"30 minutes" = "30 minút";
"45 minutes" = "45 minút";
"1 hour" = "1 hodinu";
"1 day" = "1 deň";
/* common buttons */
"OK" = "OK";
@@ -89,6 +81,15 @@
"Start" = "Štart";
"Due Date" = "Splatnosť";
"Location" = "Umiestnenie";
"Snooze" = "Odložit";
"Snooze for " = "Odložiť do";
"5 minutes" = "5 minút";
"10 minutes" = "10 minút";
"15 minutes" = "15 minút";
"30 minutes" = "30 minút";
"45 minutes" = "45 minút";
"1 hour" = "1 hodinu";
"1 day" = "1 deň";
/* mail labels */
"Important" = "Dôležité";
@@ -118,18 +119,27 @@
/* Authentication failed */
"Wrong username or password." = "Nesprávne uživateľské meno alebo heslo.";
/* Error message display bellow search field when the search string has less than the required number of characters */
/* Error message displayed bellow search field when the search string has less than the required number of characters */
"Enter at least %{minimumSearchLength} characters" = "Vložte minimálne %{minimumSearchLength} znakov";
/* Error message displayed when a file upload exceeds WOMaxUploadSize */
"File size upload limit reached" = "Bol dosiahnutý limit pre veľkosť nahraného súboru";
/* Toggle visibility (ex: mail account in left navigation menu) */
"Toggle visibility" = "Prepnúť zobrazenie";
/* Toggle multiple items at the same time (hotkeys cheatsheet) */
"Toggle range of items" = "Prepnúť rozsah položiek";
/* Question mark shows list of hotkeys */
"Show or hide this help" = "Zobraziť alebo skryť túto nápovedu";
/* Space key */
"key_space" = "space";
/* Shift and space key */
"key_shift+space" = "shift + medzerník";
/* Up arrow key */
"key_up" = "↑";
@@ -69,14 +69,6 @@
"delegate is organizer" = "Vekil edilen kişi etkinliği düzenleyen kişidir. Lütfen başka bir vekil belirleyin edin. ";
"delegate is a participant" = "Vekil edilen kişi zaten bu etkinliğe katılıyor.";
"delegate is a group" = "Belirtilen adres bir gruba denk geliyor. Sadece bir kişiyi vekil tayin edebilirsiniz.";
"Snooze for " = "Beklenecek süre";
"5 minutes" = "5 dakika";
"10 minutes" = "10 dakika";
"15 minutes" = "15 dakika";
"30 minutes" = "30 dakika";
"45 minutes" = "45 dakika";
"1 hour" = "1 saat";
"1 day" = "1 gün";
/* common buttons */
"OK" = "Tamam";
@@ -87,8 +79,17 @@
/* alarms */
"Reminder" = "Hatırlatıcı";
"Start" = "Başlangıç";
"Due Date" = "Son Tarih";
"Due Date" = "Kapanış Tarihi";
"Location" = "Konum";
"Snooze" = "Ertele";
"Snooze for " = "Beklenecek süre";
"5 minutes" = "5 dakika";
"10 minutes" = "10 dakika";
"15 minutes" = "15 dakika";
"30 minutes" = "30 dakika";
"45 minutes" = "45 dakika";
"1 hour" = "1 saat";
"1 day" = "1 gün";
/* mail labels */
"Important" = "Önemli";
@@ -118,18 +119,27 @@
/* Authentication failed */
"Wrong username or password." = "Kullanıcı adı veya şifre yanlış.";
/* Error message display bellow search field when the search string has less than the required number of characters */
/* Error message displayed bellow search field when the search string has less than the required number of characters */
"Enter at least %{minimumSearchLength} characters" = "En az %{minimumSearchLength} harf girin";
/* Error message displayed when a file upload exceeds WOMaxUploadSize */
"File size upload limit reached" = "Yükleme üst sınırı aşıldı";
/* Toggle visibility (ex: mail account in left navigation menu) */
"Toggle visibility" = "Görünürlük geçişi";
/* Toggle multiple items at the same time (hotkeys cheatsheet) */
"Toggle range of items" = "Ögeler arasında geçiş yap";
/* Question mark shows list of hotkeys */
"Show or hide this help" = "Bu yardımı gizle veya göster";
/* Space key */
"key_space" = "space";
/* Shift and space key */
"key_shift+space" = "üst karakter + boşluk";
/* Up arrow key */
"key_up" = "↑";
@@ -41,6 +41,9 @@
"Move To" = "Move To";
"Copy To" = "Copy To";
"Add to" = "Add to";
"To" = "To";
"Carbon Copy (Cc)" = "Carbon Copy (Cc)";
"Blind Carbon Copy (Bcc)" = "Blind Carbon Copy (Bcc)";
/* Subheader of empty addressbook */
"No contact" = "No contact";
@@ -175,7 +178,7 @@
"%{0} card(s) copied" = "%{0} card(s) copied";
"%{0} card(s) moved" = "%{0} card(s) moved";
"SoAccessDeniedException" = "You cannot write to this address book.";
"Forbidden" = "You cannot write to this address book.";
"Forbidden" = "Forbidden";
"Invalid Contact" = "The selected contact no longer exists.";
"Unknown Destination Folder" = "The chosen destination address book no longer exists.";
@@ -258,4 +261,4 @@
"key_create_card" = "c";
/* Hotkey to create a new list */
"key_create_list" = "l";
"key_create_list" = "l";
+1 -1
View File
@@ -175,7 +175,7 @@
"%{0} card(s) copied" = "%{0} fiche(s) copiée(s)";
"%{0} card(s) moved" = "%{0} fiche(s) déplacée(s)";
"SoAccessDeniedException" = "Vous ne pouvez pas ajouter de fiches à ce carnet.";
"Forbidden" = "Vous ne pouvez pas ajouter de fiches à ce carnet.";
"Forbidden" = "Opération interdite";
"Invalid Contact" = "La fiche sélectionnée n'existe plus.";
"Unknown Destination Folder" = "Le carnet d'adresses choisi n'existe plus.";
+1 -1
View File
@@ -175,7 +175,7 @@
"%{0} card(s) copied" = "%{0} Karte(n) kopiert";
"%{0} card(s) moved" = "%{0} Karte(n) verschoben";
"SoAccessDeniedException" = "Sie können nicht in dieses Adressbuch schreiben.";
"Forbidden" = "Sie können nicht in dieses Adressbuch schreiben.";
"Forbidden" = "Verboten";
"Invalid Contact" = "Der gewählte Kontakt existiert nicht mehr.";
"Unknown Destination Folder" = "Das gewählte Ziel-Adressbuch existiert nicht mehr.";
@@ -0,0 +1,261 @@
/* this file is in UTF-8 format! */
"Contact" = "איש קשר";
"Address" = "כתובת";
"Photos" = "תמונות";
"Other" = "אחר";
"Address Books" = "אנשי קשר";
"Addressbook" = "אנשי קשר";
"Addresses" = "כתובות";
"Update" = "עדכון";
"Cancel" = "ביטול";
"Common" = "משותף";
"Contact editor" = "עריכת איש קשר";
"Contact viewer" = "צפייה באיש קשר";
"Email" = "אימייל";
"Screen Name" = "שם מוצג";
"Extended" = "מורחב";
"Fax" = "פקס";
"Firstname" = "שם פרטי";
"Home" = "בית";
"HomePhone" = "טלפון בבית";
"Lastname" = "שם משפחה";
"Location" = "מיקום";
"Add a category" = "הוספץ קטגוריה";
"MobilePhone" = "מספר טלפון נייד";
"Name" = "שם";
"OfficePhone" = "טלפון במשרד";
"Organization" = "אירגון";
"Work Phone" = "מספר טלפון בעבודה";
"Phone" = "מספר טלפון";
"Phones" = "מספרי טלפון";
"Postal" = "מיקוד";
"Save" = "שמירה";
"Internet" = "אינטרנט";
"Unit" = "יחידה";
"delete" = "מחיקה";
"edit" = "עריכה";
"invalidemailwarn" = "כתובת אימייל שגויה";
"new" = "חדש";
"Preferred Phone" = "מספר טלפון מועדף";
"Move To" = "העבר ל";
"Copy To" = "העתק ל";
"Add to" = "הוסף ל";
/* Subheader of empty addressbook */
"No contact" = "אין איש קשר";
/* Subheader of system addressbook */
"Start a search to browse this address book" = "החל חיפוש באנשי קשר";
/* Number of contacts in addressbook; string is prefixed by number */
"contacts" = "אשני קשר";
/* No contact matching search criteria */
"No matching contact" = "לא נמצאו אנשי קשר";
/* Number of contacts matching search criteria; string is prefixed by number */
"matching contacts" = "נמצאו אנשי קשר";
/* Number of selected contacts in list */
"selected" = "נבחר";
/* Empty right pane */
"No contact selected" = "לא נבחר איש קשר";
/* Tooltips */
"Create a new address book card" = "יצירת כרטיסיית איש קשר";
"Create a new list" = "יצירת רשימה חדשה";
"Edit the selected card" = "עריכת כרטיסייה נבחרת";
"Send a mail message" = "שליחת אימייל";
"Delete selected card or address book" = "מחיקה של כרטיסייה נבחרת או אנשי קשר";
"Reload all contacts" = "טען מחדש את אנשי הקשר";
"htmlMailFormat_UNKNOWN" = "לא ידוע";
"htmlMailFormat_FALSE" = "טקסט רגיל";
"htmlMailFormat_TRUE" = "HTML";
"Name or Email" = "שם או כתובת אימייל";
"Category" = "קטגוריה";
"Personal Addressbook" = "אנשי קשר אישיים";
"Search in Addressbook" = "חיפוש באנשי קשר";
"New Card" = "כרטיסייה חדשה";
"New List" = "רשימה חדשה";
"Edit" = "עריכה";
"Properties" = "ערכים";
"Sharing..." = "שיתוף";
"Write" = "כתיבה";
"Delete" = "מחיקה";
"Instant Message" = "הודעה מיידית";
"Add..." = "הוספה";
"Remove" = "הסרה";
"Please wait..." = "נא להמתין";
"No possible subscription" = "אין מנוי אפשרי";
"Preferred" = "מועדף";
"Display" = "הצגה";
"Display Name" = "שם תצוגה";
"Additional Email" = "כתובת אימייל נוספת";
"Phone Number" = "מספר טלפון";
"Prefers to receive messages formatted as" = "מעדיף לקבל הודעות בפורמט הבא";
"Categories" = "קטגוריות";
"First" = "ראשון";
"Last" = "אחרון";
"Nickname" = "כינוי";
"Telephone" = "טלפון";
"Work" = "עבודה";
"Mobile" = "נייד";
"Pager" = "ביפר";
/* categories */
"contacts_category_labels" = "עמית, מתחרה, לקוח, חבר, משפחה, שותף עסקי, ספק, עיתונות, VIP";
"New category" = "קטגוריה חדשה";
/* adresses */
"Title" = "כותרת";
"Service" = "שרות";
"Company" = "חברה";
"Department" = "מחלקה";
"City" = "עיר";
"State_Province" = "מדינה/מחוז";
"ZIP_Postal Code" = "מיקוד";
"Country" = "מדינה";
"Web Page" = "אתר אינטרנט";
"Other Infos" = "מידע נוסף";
"Note" = "הערה";
"Timezone" = "אזור זמן";
"Birthday" = "יום הולדת";
"Birthday (yyyy-mm-dd)" = "יום הולדת (dd-mm-yyyy)";
"Freebusy URL" = "פנוי/עסוק URL";
"Add as..." = "הוסף כ";
"Recipient" = "מקבל";
"Carbon Copy" = "העתק";
"Blind Carbon Copy" = "עותק מוסתר";
"New Addressbook..." = "רשימת אנשי קשר חדשה";
"Subscribe to an Addressbook..." = "הירשם לרשימת אנשי קשר";
"Remove the selected Addressbook" = "הסר את רישמת אנשי קשר הנבחרת";
"Subscribe to a shared folder" = "הירשם לתיקייה משותפת";
"Search User" = "חפש משתמש";
"Name of the Address Book" = "שם הרשימת אנשי קשר";
"Are you sure you want to delete the selected address book?"
= "האם ברצונך למחוק את את רשימת אנשי הקשר הנבחרת?";
"Are you sure you want to delete the addressbook \"%{0}\"?"
= "האם ברצונך למחוק את רישמת אנשי הקשר \"{0}%\"?";
"You cannot remove nor unsubscribe from a public addressbook."
= "לא ניתן להסיר או לבטל הרשמה לרישמת אנשי קשר פומבית.";
"You cannot remove nor unsubscribe from your personal addressbook."
= "לא ניתן להסיר או לבטל הרשמה מרישמת אנשי קשר האישית.";
"Are you sure you want to delete the selected contacts?"
= "האם ברצונך למחוק את אנשי הקשר הנבחרים?";
"Are you sure you want to delete the card of %{0}?" = "האם ברצונך למחור את הכרטיסייה {0}%?";
"You cannot delete the card of \"%{0}\"."
= "לא ניתן למחוק את הכרטיסייה \"{0}%\".";
"You cannot subscribe to a folder that you own!"
= "לא ניתן להירשם לתיקייה בבעלותך.";
"Unable to subscribe to that folder!"
= "לא ניתן להירשם לתקייה הזו.";
/* acls */
"Access rights to" = "הרשאות גישה ל";
"For user" = "עבור משתמש";
"Any Authenticated User" = "כל משתמש מאומת";
"Public Access" = "גישה פומבית";
"This person can add cards to this addressbook."
= "המשתמש הנ\"ל יכול להוסיף כרטיסיות ברשימת אנשי קשר הזו.";
"This person can edit the cards of this addressbook."
= "המשתמש הנ\"ל יכול לערוך כרטיסיות ברשימת אנשי קשר הזו.";
"This person can list the content of this addressbook."
= "המשתמש הנ\"ל יכול ליצור רשימות ברשימת אנשי קשר הזו.";
"This person can read the cards of this addressbook."
= "המשתמש הנ\"ל יכול לקרוא כרטיסיות ברשימת אנשי קשר הזו.";
"This person can erase cards from this addressbook."
= "המשתמש הנ\"ל יכול למחוק כרטיסיות ברשימת אנשי קשר הזו.";
"The selected contact has no email address."
= "אין כתובת אימייל באיש קשר הנבחר.";
"Please select a contact." = "נא לבחור איש קשר.";
/* Messages for move and copy */
"%{0} card(s) copied" = "{0}% כרטיסיות הועתקו";
"%{0} card(s) moved" = "{0}% כרטיסיות הועברו";
"SoAccessDeniedException" = "אין אפשרות לכתוב ברשימת אנשי קשר זו.";
"Forbidden" = "אין אפשרות לכתוב ברשימת אנשי קשר זו.";
"Invalid Contact" = "איש הקשר הנבחר אינו קיים עוד.";
"Unknown Destination Folder" = "רשימת אנשי קשר נבחרת אינה קיימת עוד.";
/* Lists */
"List details" = "הצג פרטים";
"List name" = "הצג שם";
"List nickname" = "הצג כינוי";
"List description" = "הצג תאור";
"Members" = "חברים";
"Contacts" = "אנשי קשר";
"Add" = "הוספה";
"Lists can't be moved or copied." = "לא ניתן להעתיק או להעביר רשימות.";
"Export" = "יצוא";
"Export Address Book..." = "יצוא אנשי קשר";
"View Raw Source" = "צפייה בקוד מקור";
/* Import */
"Import Cards" = "יבוא כרטיסיות";
"Select a vCard or LDIF file." = "בחר vCard או קובץ LDIF.";
"Upload" = "להעלות";
"Uploading" = "העלאה";
"Done" = "הסתיים בהצלחה";
"An error occured while importing contacts." = "אירעה שגיאה במהלך יבוא אנשי קשר.";
"No card was imported." = "לא הובאה כרטיסייה";
"A total of %{0} cards were imported in the addressbook." = "סה\"כ {0}% כרטיסיות הובאו לרשימת אנשי קשר.";
"Reload" = "טען מחדש";
/* Properties window */
"Address Book Name" = "שם רשימת אנשי קשר";
"Links to this Address Book" = "קישורים לרישמת אנשי קשר";
"Authenticated User Access" = "גישת משתמשים מאומתים";
"CardDAV URL" = "CardDAV URL";
"Options" = "אפשרויות";
"Rename" = "שינוי שם";
"Subscriptions" = "מנויים";
"Global Addressbooks" = "רישמות אנשי קשר גלובליים";
"Search" = "חיפוש";
"Sort" = "מיון";
"Descending Order" = "סדר יורד";
"Back" = "חזרה";
"Select All" = "בחר הכל";
"Copy contacts" = "העתקת אנשי קשר";
"More messages options" = "אפשרויות הודעה נוספות";
"New Contact" = "איש קשר חדש";
"Close" = "סגירה";
"More contact options" = "אפשרויות איש קשר נוספות";
"Organization Unit" = "יחידה אירגונית";
"Add Organizational Unit" = "הוספת יחידות אירגוניות";
"Type" = "סוג";
"Email Address" = "כתובת אימייל";
"New Email Address" = "כתובת אימייל חדשה";
"New Phone Number" = "מספר טלפון חדש";
"URL" = "כתובת URL";
"New URL" = "כתובת URL חדשה";
"street" = "רחוב";
"Postoffice" = "דואר";
"Region" = "אזור";
"Postal Code" = "מיקוד";
"New Address" = "כתובת חדשה";
"Reset" = "איפוס";
"Description" = "תאור";
"Add Member" = "הוספת חבר";
"Subscribe" = "הרשמה";
"Add Birthday" = "הוספת יום הולדת";
"Import" = "יבוא";
"More options" = "אפשרויות נוספות";
"Role" = "תפקיד";
"Add Screen Name" = "הוספת שם תצוגה";
"Synchronization" = "סינכרון";
"Synchronize" = "סינכרון";
"Sucessfully subscribed to address book" = "מנוי לרשימת אנשי קשר נרשם בהצלחה";
/* Aria label for scope of search on contacts */
"Search scope" = "תווך חיפוש";
/* Aria label for avatar button to select and unselect a card */
"Toggle item" = "הצג/הסתר פריט";
/* Hotkey to create a new card */
"key_create_card" = "c";
/* Hotkey to create a new list */
"key_create_list" = "l";
+1 -1
View File
@@ -175,7 +175,7 @@
"%{0} card(s) copied" = "Skopiowano %{0} kart";
"%{0} card(s) moved" = "Przeniesiono %{0} kart";
"SoAccessDeniedException" = "Nie masz prawa zapisu do tej książki adresowej.";
"Forbidden" = "Nie masz prawa zapisu do tej książki adresowej.";
"Forbidden" = "Zabronione";
"Invalid Contact" = "Wskazany kontakt już nie istnieje.";
"Unknown Destination Folder" = "Wybrana docelowa książka adresowa już nie istnieje.";
@@ -52,16 +52,16 @@
"contacts" = "kişi";
/* No contact matching search criteria */
"No matching contact" = "Eşleşen bir kişi yok";
"No matching contact" = "Eşleşen kişi yok";
/* Number of contacts matching search criteria; string is prefixed by number */
"matching contacts" = "eşleşen kişiler";
/* Number of selected contacts in list */
"selected" = "seçili";
"selected" = "kişi seçildi";
/* Empty right pane */
"No contact selected" = "Seçili bir kişi yok";
"No contact selected" = "Seçili kişi yok";
/* Tooltips */
"Create a new address book card" = "Yeni adres kartı oluştur";
@@ -153,8 +153,8 @@
= "Bu klasöre üye olunamıyor.";
/* acls */
"Access rights to" = "Adres defterinin erişim yetkileri";
"For user" = "Aşağıdaki kullanıcı için";
"Access rights to" = "Adres defteri";
"For user" = "Erişen";
"Any Authenticated User" = "Kimliği doğrulanmış her kullanıcı";
"Public Access" = "Herkese Açık Erişim";
"This person can add cards to this addressbook."
@@ -175,7 +175,7 @@
"%{0} card(s) copied" = "%{0} kart kopyalandı";
"%{0} card(s) moved" = "%{0} kart taşındı";
"SoAccessDeniedException" = "Bu adres defterine yazamazsınız.";
"Forbidden" = "Bu adres defterine yazamazsınız.";
"Forbidden" = "Yetki aşımı";
"Invalid Contact" = "Seçili kişi artık mevcut değil.";
"Unknown Destination Folder" = "Seçilen hedef adres defteri artık mevcut değil.";
@@ -199,7 +199,7 @@
"Uploading" = "Yükleniyor";
"Done" = "Tamam";
"An error occured while importing contacts." = "Adresleri içeri aktarırken bir hata oluştu.";
"No card was imported." = "Hiç bir kart içeri aktarılmadı.";
"No card was imported." = "İçeri kart aktarılmadı.";
"A total of %{0} cards were imported in the addressbook." = "Toplam %{0} kart adres defterinine aktarıldı.";
"Reload" = "Tazele";
@@ -0,0 +1,50 @@
ACCEPTED = "מאושר";
COMPLETED = "הושלם";
DECLINED = "נדחה";
DELEGATED = "הואצל";
"IN-PROCESS" = "בתהליך";
"NEEDS-ACTION" = "דרושה פעולה";
TENTATIVE = "זמני";
organized_by_you = "מאורגן על ידך";
you_are_an_attendee = "הינך משתתף";
add_info_text = "פעולת \"הופסה\" ב-iMIP טרם נתמכת על ידי SOGo.";
publish_info_text = "השולח מודיע לך לגבי אירוע מצורף.";
cancel_info_text = "הזמנתכם או האירוע בוטלו.";
request_info_no_attendee = "מציע פגישה עבור המוזמנים. הינך מקבל הודעה זו כהתראה, אינך רשום כמשתתף.";
Appointment = "פגישה";
"Status Update" = "עדכון סטטוס";
was = "היה";
Organizer = "מארגן";
Time = "זמן";
Attendees = "משתתפים";
request_info = "מזמין אתכם להשתתף בפגישה.";
"Add to calendar" = "הוספה ללוח שנה";
"Delete from calendar" = "מחיקה מלוח שנה";
"Update status" = "עדכון סטטוס";
Accept = "אישור";
Decline = "דחיה";
Tentative = "זמני";
"Delegate ..." = "האצל...";
"Delegated to" = "הואצל ל";
"Update status in calendar" = "עדכון סטטוס בלוח השנה";
"delegated from" = "הואצל מ";
reply_info_no_attendee = "התקבלה תגובה על קביעת אירוע אך שולח התגובה אינו משתתף.";
reply_info = "זו תגובה להזמנה לאירוע שנוצרה על ידכם.";
"to" = "עבור";
"Untitled" = "ללא כותרת";
"Size" = "נפח";
"Digital signature is not valid" = "חתימה דיגיטלית לא תקינה";
"Message is signed" = "ההודעה חתומה";
"Subject" = "נושא";
"From" = "מאת";
"Date" = "תאריך";
"To" = "עבור";
"Issuer" = "מנפיק";
/* Tooltips */
"View Attachment" = "צפה בקובץ מצורף";
"Save Attachment" = "שמור קובץ מצורף";
"CC" = "עותק";
"Cancel" = "ביטול";
"OK" = "אוקיי";
"Comment" = "תגובה";
@@ -53,7 +53,13 @@
/* Mail account main windows */
"Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Vítejte v SOGo Mailer. Využijte stromu složek nalevo pro procházení Vašimi mailovými účty!";
"Read messages" = "Číst zprávy";
/* Tooltip for fab button */
"Write a new message" = "Napsat zprávu";
/* Tooltip for fab button */
"Write a message in new window" = "Napsat zprávu v novém okně";
"Share" = "Sdílet";
"Account" = "Účet";
"Shared Account" = "Sdílený účet";
@@ -217,6 +223,12 @@
/* Message view "more" menu: create a task from message */
"Convert To Task" = "Převést na úkol";
/* Message view "more" menu: download all attachments as a zip archive */
"Download all attachments" = "Stáhnout všechny přílohy";
/* Filename prefix when downloading all attachments as a zip archive */
"attachments" = "přílohy";
"Print..." = "Tisk...";
"Delete Message" = "Smazat zprávu";
"Delete Selected Messages" = "Smazat označené zprávy";
@@ -315,6 +327,7 @@
/* Error when uploading a file attachment */
"Error while uploading the file \"%{0}\":" = "Při přenosu souboru \"%{0}\" došlo k chybě:";
"There is an active file upload. Closing the window will interrupt it." = "Přenáší se soubor. Zavření okna způsobí přerušení přenosu.";
"Message is too big" = "Zpráva je příliš velká";
/* Appears while sending the message */
"Sending" = "Odesílání zprávy";
@@ -53,7 +53,13 @@
/* Mail account main windows */
"Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!";
"Read messages" = "Read messages";
/* Tooltip for fab button */
"Write a new message" = "Write a new message";
/* Tooltip for fab button */
"Write a message in new window" = "Write a message in new window";
"Share" = "Share";
"Account" = "Account";
"Shared Account" = "Shared Account";
+8 -2
View File
@@ -53,7 +53,13 @@
/* Mail account main windows */
"Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Bienvenue dans votre webmail. Utilisez l'arborescence sur votre gauche pour parcourir vos boites mails.";
"Read messages" = "Lire les messages";
/* Tooltip for fab button */
"Write a new message" = "Écrire un nouveau message";
/* Tooltip for fab button */
"Write a message in new window" = "Écrire un message dans une nouvelle fenêtre";
"Share" = "Partage";
"Account" = "Compte";
"Shared Account" = "Compte partagé";
@@ -218,7 +224,7 @@
"Convert To Task" = "Convertir en tâche";
/* Message view "more" menu: download all attachments as a zip archive */
"Download all attachments" = "Télécharger toutes les pièces jointes";
"Download all attachments" = "Télécharger les pièces jointes";
/* Filename prefix when downloading all attachments as a zip archive */
"attachments" = "pièces-jointes";
@@ -383,7 +389,7 @@
"Filter" = "Filtrer";
/* Hotkey to write a new message */
"hotkey_compose" = "w";
"hotkey_compose" = "n";
/* Hotkey to mark selected message(s) as junk */
"hotkey_junk" = "i";
+7 -1
View File
@@ -53,7 +53,13 @@
/* Mail account main windows */
"Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Willkommen zum SOGo Mailer. Verwenden Sie den Ordnerbaum auf der linken Seite, um in Ihrem E-Mail-Konto zu stöbern!";
"Read messages" = "Nachrichten lesen";
/* Tooltip for fab button */
"Write a new message" = "Eine neue Nachricht schreiben";
/* Tooltip for fab button */
"Write a message in new window" = "Nachricht in einem neuen Fenster schreiben";
"Share" = "Benutzerrechte";
"Account" = "Konto";
"Shared Account" = "Gemeinsames Konto";
@@ -286,7 +292,7 @@
"%{0} message(s) copied" = "%{0} Nachrichten kopiert";
/* Notification on the number of messages successfuly movied */
"%{0} message(s) moved" = "%{0} Nachrichten verschoben";
"%{0} message(s) moved" = "%{0} Nachricht(en) verschoben";
"Please select a message." = "Sie müssen eine Nachricht auswählen.";
"Please select a message to print." = "Sie müssen eine Nachricht zum Drucken auswählen.";
@@ -0,0 +1,407 @@
/* this file is in UTF-8 format! */
/* Icon's label */
"Create" = "צור";
"Empty Trash" = "רוקן פח אשפה";
"Delete" = "מחק";
"Expunge" = "טהר";
"Forward" = "העבר";
"Get Mail" = "קבל מייל";
"Junk" = "זבל";
"Not junk" = "לא זבל";
"Reply" = "השב";
"Reply All" = "השב לכולם";
"Print" = "הדפס";
"Stop" = "עצור";
"Write" = "כתוב";
"Search" = "חפש";
"Send" = "שלח";
"Contacts" = "אנשי קשר";
"Attach" = "צרף קובץ";
"Save" = "שמור";
"Options" = "אפשרויות";
"Close" = "סגור";
"Size" = "גודל";
/* Tooltips */
"Send this message now" = "שלח הודעה זו עכשיו";
"Select a recipient from an Address Book" = "בחר כתובת מאנשי הקשר";
"Include an attachment" = "כלול קובץ מצורף";
"Save this message" = "שמור הודעה זו";
"Get new messages" = "קבל הודעות חדשות";
"Create a new message" = "כתוב הודעה חדשה";
"Go to address book" = "עבור לאנשי הקשר";
"Reply to the message" = "השב להודעה זו";
"Reply to sender and all recipients" = "השב לשולח ולכל המקבלים";
"Forward selected message" = "העבר הודעה";
"Delete selected message or folder" = "מחק הודעה או תיקייה נבחרת";
"Print this message" = "הדפס הודעה";
"Stop the current transfer" = "עצור העברה";
"Attachment" = "קובץ מצורף";
"Unread" = "לא נקרא";
"Flagged" = "מסומן";
"Search multiple mailboxes" = "חפש במספר תיבות דואר";
/* Main Frame */
"Home" = "בית";
"Calendar" = "לוח שנה";
"Addressbook" = "אנשי קשר";
"Mail" = "מייל";
"Right Administration" = "אפשרויות ניהול";
"Help" = "עזרה";
/* Mail account main windows */
"Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "ברוך הבא לדואר סוגו. השתמש בעץ התיקיות משמאל לצפייה בתיבות הדואר שלך";
"Read messages" = "קרא הודעות";
/* Tooltip for fab button */
"Write a new message" = "כתוב הודעה חדשה";
/* Tooltip for fab button */
"Write a message in new window" = "כתוב הודעה בחלון";
"Share" = "שתף";
"Account" = "חשבון";
"Shared Account" = "חשבון משותף";
/* A mailbox is selected, but no message (only shown on large screens) */
"No message selected" = "לא נבחרה הודעה";
/* No mailbox is selected (usually resulting from an IMAP connection problem) */
"No mailbox selected" = "לא נבחר תא דואר";
/* Mailbox actions */
/* Compact Folder success message */
"Folder compacted" = "התיקייה נדחסה";
/* Empty Trash success message */
"Trash emptied" = "האשפה נמחקה";
/* acls */
"Access rights to" = "מתן גישה ל";
"For user" = "למשתמש";
"Any Authenticated User" = "כל משתמש מאומת";
"List and see this folder" = "פרוס וצפה בתיקייה";
"Read mails from this folder" = "קרא מיילים מתיקייה";
"Mark mails read and unread" = "סמן מיילים כנקראו ולא נקראו";
"Modify the flags of the mails in this folder" = "שנה את דגלי המיילים בתיקייה";
"Insert, copy and move mails into this folder" = "צור, העבר והעתק מיילים לתיקייה";
"Post mails" = "פרסם מיילים";
"Add subfolders to this folder" = "הוסף תת תיקייה לתיקייה";
"Remove this folder" = "מחק תיקייה";
"Erase mails from this folder" = "מחק מיילים מתיקייה";
"Expunge this folder" = "טהר תיקייה";
"Export This Folder" = "ייצא תיקייה";
"Modify the acl of this folder" = "שנה את רשימת הגישה לתיקייה";
"Saved Messages.zip" = "שמור הודעות בפורמט zip";
"Update" = "עדכן";
"Cancel" = "בטל";
/* Mail edition */
"From" = "מאת";
"Subject" = "נושא";
"To" = "אל";
"Cc" = "העתק למכותב";
"Bcc" = "העתק חסוי";
"Reply-To" = "השב ל";
"Add address" = "הוסף כתובת";
"Body" = "גוף ההודעה";
"Open" = "פתח";
"Select All" = "בחר הכל";
"Select Message" = "בחר הודעה";
"Attach Web Page..." = "צרף עמוד אינטרנט";
"file" = "קובץ";
"files" = "קבצים";
"Save all" = "שמור הכל";
"to" = "אל";
"cc" = "העתק למכותב";
"bcc" = "העתק חסוי";
"Add a recipient" = "הוסף מכותב";
"Edit Draft..." = "ערוך טיוטה";
"Load Images" = "טען תמונות";
"Return Receipt" = "אישור מסירה";
"The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "מחבר ההודעה ביקש אישור קריאה. האם ברצונך ליידע אותו?";
"Return Receipt (displayed) - %@"= "אישור מסירה (מוצג) - %@";
"This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "זהו דואר חוזר עבור הודעה ששלחת ל %@.\n\nהערה: הדואר החוזר לידיעה בלבד, אין שום ערבון שההודעה אכן נקרא והובנה על ידי המקבל.";
"Priority" = "דחיפות";
"highest" = "גבוהה ביותר";
"high" = "גבוהה";
"normal" = "רגילה";
"low" = "נמוכה";
"lowest" = "הכי נמוכה";
"This mail is being sent from an unsecure network!" = "מייל זה נשלח מרשת לא מאובטחת!";
"Address Book" = "אנשי קשר";
"Search For" = "חפש את";
/* Popup "show" */
"all" = "כולם";
"read" = "נקרא";
"unread" = "לא נקרא";
"deleted" = "נמחק";
"flagged" = "מסומן";
/* MailListView */
"Sender" = "שולח";
"Subject or Sender" = "כותרת או שולח";
"To or Cc" = "אל או העתק";
"Entire Message" = "כל ההודעה";
"Date" = "תאריך";
"View" = "צפה";
"All" = "כולם";
"No message" = "אין הודעות";
"messages" = "הודעות";
"Yesterday" = "אתמול";
"first" = "ראשון";
"previous" = "הקודם";
"next" = "הבא";
"last" = "אחרון";
"msgnumber_to" = "אל";
"msgnumber_of" = "מתוך";
"Mark Unread" = "סמן כלא נקרא";
"Mark Read" = "סמן כנקרא";
"Untitled" = "ללא כותרת";
/* Tree */
"SentFolderName" = "נשלח";
"TrashFolderName" = "אשפה";
"InboxFolderName" = "תא דואר נכנס";
"DraftsFolderName" = "טיוטות";
"JunkFolderName" = "זבל";
"SieveFolderName" = "מסננים";
"Folders" = "תיקיות"; /* title line */
/* MailMoveToPopUp */
"MoveTo" = "העבר &hellip;";
/* Address Popup menu */
"Add to Address Book..." = "הוסף לאנשי הקשר";
"Compose Mail To" = "כתוב הודעה ל";
"Create Filter From Message..." = "צור מסנן מהודעה...";
/* Image Popup menu */
"Save Image" = "שמור תמונה";
"Save Attachment" = "שמור קובץ מצורף";
/* Mailbox popup menus */
"Open in New Mail Window" = "פתח בחלון חדש";
"Copy Folder Location" = "העתק נתיב תיקייה";
"Subscribe..." = "הירשם...";
"Mark Folder Read" = "סמן תיקייה כנקרא";
"New Folder..." = "תיקייה חדשה...";
"Compact This Folder" = "דחוס תיקייה";
"Search Messages..." = "חפש הודעות...";
"Sharing..." = "משתף...";
"New Subfolder..." = "תת תיקייה חדשה...";
"Rename Folder..." = "שנה שם לתיקייה...";
"Delete Folder" = "מחק תיקייה";
"Use This Folder For" = "השתמש בתיקייה עבור";
"Get Messages for Account" = "קבל הודעות עבור חשבון";
"Properties..." = "מאפיינים...";
"Delegation..." = "מתן גישה...";
/* Use This Folder menu */
"Sent Messages" = "הודעות שנשלחו";
"Drafts" = "טיוטות";
"Deleted Messages" = "הודעות מחוקות";
"Junk Messages" = "הודעות זבל";
/* Message list popup menu */
"Open Message In New Window" = "פתח הודעה בחלון חדש";
"Reply to Sender Only" = "השב לשולח בלבד";
"Reply to All" = "השב לכולם";
"Edit As New..." = "ערוך כחדש...";
"Move To" = "העבר ל";
"Copy To" = "העתק ל";
"Label" = "תווית";
"Mark" = "סמן";
"Save As..." = "שמור בשם...";
"Print Preview" = "תצוגת הדפסה";
"View Message Source" = "צפה במקור הודעה";
/* Message view "more" menu: create an event from message */
"Convert To Event" = "המר לארוע";
/* Message view "more" menu: create a task from message */
"Convert To Task" = "המר למשימה";
/* Message view "more" menu: download all attachments as a zip archive */
"Download all attachments" = "הורד את כל הקבצים המצורפים";
/* Filename prefix when downloading all attachments as a zip archive */
"attachments" = "קבצים מצורפים";
"Print..." = "הדפס...";
"Delete Message" = "מחק הודעה";
"Delete Selected Messages" = "מחק הודעות מסומנות";
"Mark the selected messages as junk" = "סמן הודעות כזבל";
"Mark the selected messages as not junk" = "סמן הודעות כלא זבל";
/* Text appended to the recipients list when there are too many recipients */
"and %{0} more..." = "ו %{0} יותר...";
/* Button label to hide extended list of recipients */
"Hide" = "הסתר";
/* Number of selected messages in list */
"selected" = "מסומנים";
"This Folder" = "התיקייה הזו";
/* Label popup menu */
"None" = "ללא";
/* Mark popup menu */
"As Read" = "כנקרא";
"Thread As Read" = "אשכול כנקרא";
"As Read By Date..." = "כנקרא לפי תאריך...";
"All Read" = "הכל נקרא";
"Flag" = "סמן";
"As Junk" = "כזבל";
"As Not Junk" = "לא כזבל";
"Run Junk Mail Controls" = "הרץ שליטה בדואר זבל";
"Search messages in" = "חפש הודעות ב";
"Search" = "חפש";
"Search subfolders" = "חפש תתי תיקיות";
"Match any of the following" = "התאם מההבאים";
"Match all of the following" = "התאם את כל ההבאים";
"contains" = "מכיל";
"does not contain" = "לא כולל";
"No matches found" = "לא נמצאו תוצאות";
"results found" = "נמצאו תוצאות";
"result found" = "נמצאה תוצאה";
"Please specify at least one filter" = "בחר מסנן אחד לפחות";
/* Folder operations */
"Name" = "שם";
"Enter the new name of your folder"
="הכנס שם חדש לתיקייה";
"Do you really want to move this folder into the trash ?"
= "האם ברצונך להעביר תיקייה זו לאשפה?";
"Operation failed" = "הפעולה נכשלה";
"Quota" = "מכסה:";
"quotasFormat" = "%{0}% משתמש ב {1}% מ\"ב";
"Unable to move/delete folder." = "לא ניתן להזיז/למחוק את התיקיה";
/* Alternative operation when folder cannot be deleted */
"The mailbox could not be moved to the trash folder. Would you like to delete it immediately?"
= "לא ניתן להעביר הודעות אלו לאשפה. האם ברצונך למחוק אותן באופן מיידי?";
/* Confirmation message when deleting multiple messages */
"Are you sure you want to delete the selected messages?" = "האם ברצונך למחוק הודעות מסומנות?";
/* Notification on the number of messages successfuly copied */
"%{0} message(s) copied" = "{0}% הודעות הועתקו";
/* Notification on the number of messages successfuly movied */
"%{0} message(s) moved" = "{0}% הודעות הועברו";
"Please select a message." = "נא לבחור הודעה.";
"Please select a message to print." = "בחר הודעה להדפסה.";
"Please select only one message to print." = "בחר הודעה אחת בלבד להדפסה.";
"The message you have selected doesn't exist anymore." = "ההודעה שבחרת לא קיימת יותר.";
"The folder with name \"%{0}\" could not be created."
= "לא ניתן ליצור תיקייב בשם \"{0}%\".";
"This folder could not be renamed to \"%{0}\"."
= "לא ניתן לשנות את שם התיקייה ל \"{0}%\".";
"The folder could not be deleted."
= "לא ניתן למחוק תיקייה.";
"The trash could not be emptied."
= "לא ניתן לרוקן אשפה.";
"The folder functionality could not be changed."
= "הפונקציונאליות של תיקייה זו לא ניתנת לשינוי.";
"You need to choose a non-virtual folder!" = "עלייך לבחור תיקייה לא וירטואלית!";
"Moving a message into its own folder is impossible!"
= "לא ניתן להעביר הודעה לתיקיית המקור שלה!";
"Copying a message into its own folder is impossible!"
= "לא ניתן להעתיק הודעה לתיקיית המקור שלה!";
/* Message operations */
"The messages could not be moved to the trash folder. Would you like to delete them immediately?"
= "לא ניתן להעביר הודעות אלו לאשפה. האם ברצונך למחוק אותן באופן מיידי?";
/* Message editing */
"error_missingsubject" = "אין כותרת להודעה. האם לשלוח אותה בכל זאת?";
"error_missingrecipients" = "בחר איש קשר אחד לפחות.";
"Send Anyway" = "שלח בכל זאת";
"Error while saving the draft" = "שגיאה בעת שמירת הטיוטה";
/* Error when uploading a file attachment */
"Error while uploading the file \"%{0}\":" = "שגיאה בעת העלאת הקובץ \"%{0}\".";
"There is an active file upload. Closing the window will interrupt it." = "ישנו תהליך פעיל של העלאת קובץ. סגירת החלון תפסיק את התהליך.";
"Message is too big" = "ההודעה גדולה מידי";
/* Appears while sending the message */
"Sending" = "שולח";
/* Appears when the message is successfuly sent */
"Sent" = "נשלח";
"cannot send message: (smtp) all recipients discarded" = "לא ניתן לשלוח הודעה, הנמענים לא תקינים.";
"cannot send message (smtp) - recipients discarded" = "לא ניתן לשלוח הודעה. הכתובות הבאות לא תקינות";
"cannot send message: (smtp) error when connecting" = "לא ניתן לשלוח הודעה: שגיאה בהתחברות לשרת SMTP.";
/* Contacts list in mail editor */
"Email" = "אימייל";
"More mail options" = "אפשרויות מייל נוספות";
"Delegation" = "מתן גישה";
"Add User" = "הוסף משתמש";
"Add a tag" = "הוסף תווית";
"reply" = "השב";
"Edit" = "ערוך";
"Yes" = "כן";
"No" = "לא";
"Location" = "מיקום";
"Rename" = "שנה שם";
"Compact" = "דחוס";
"Export" = "יצוא";
"Set as Drafts" = "סמן כטיוטה";
"Set as Sent" = "סמן כנשלח";
"Set as Trash" = "סמן כאשפה";
/* Set the folder as the one holding Junk mails */
"Set as Junk" = "סמן כזבל";
"Sort" = "סדר";
"Order Received" = "סדר הודעות שהתקבלו";
"Descending Order" = "סדר יורד";
"Back" = "חזרה";
"Copy messages" = "העתק הודעות";
"More messages options" = "אפשרויות מייל נוספות";
"Mark as Unread" = "סמן כלא נקרא";
"Mark as Read" = "סמן כנקרא";
"Closing Window ..." = "סוגר חלון...";
"Tried to send too many mails. Please wait." = "יותר מדיי מיילים בשליחה. אנא המתן.";
"View Mail" = "צפה במייל";
"This message contains external images." = "הודעה זו כוללת תמונות חיצוניות.";
"Expanded" = "מורחב";
"Add a Criteria" = "הוסף קריטריונים";
"More search options" = "אפשרויות חיפוש נוספות";
"Your email has been saved" = "המייל שלך נשמר";
"Your email has been sent" = "המייל שלך נשלח";
"Folder compacted" = "התיקייה נדחסה";
/* Aria label for scope of search on messages */
"Search scope" = "היקף חיפוש";
/* Subscriptions Dialog */
"Manage Subscriptions" = "ניהול מנויים";
/* Label of filter input field in subscriptions dialog */
"Filter" = "סינון";
/* Hotkey to write a new message */
"hotkey_compose" = "w";
/* Hotkey to mark selected message(s) as junk */
"hotkey_junk" = "j";
/* Hotkey to flag a message */
"hotkey_flag" = "*";
/* Hotkey to reply to a message */
"hotkey_reply" = "r";
/* Hotkey to reply to all recipients of a message */
"hotkey_replyall" = "a";
/* Hotkey to forward to a message */
"hotkey_forward" = "f";
@@ -53,7 +53,13 @@
/* 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";
/* Tooltip for fab button */
"Write a new message" = "Napisz nową wiadomość";
/* Tooltip for fab button */
"Write a message in new window" = "Utwórz wiadomość w nowym oknie";
"Share" = "Udostępnianie";
"Account" = "Konto";
"Shared Account" = "Udostępnione konto";
@@ -53,7 +53,13 @@
/* Mail account main windows */
"Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Добро пожаловать в почту SOGo! Для просмотра сообщений воспользуйтесь деревом папок слева.";
"Read messages" = "Читать сообщения";
/* Tooltip for fab button */
"Write a new message" = "Составить новое сообщение";
/* Tooltip for fab button */
"Write a message in new window" = "Составить сообщение в новом окне";
"Share" = "Совместное использование";
"Account" = "Пользователь";
"Shared Account" = "Общая учетная запись";
@@ -217,6 +223,12 @@
/* Message view "more" menu: create a task from message */
"Convert To Task" = "Преобразовать в задание";
/* Message view "more" menu: download all attachments as a zip archive */
"Download all attachments" = "Загрузить все вложения";
/* Filename prefix when downloading all attachments as a zip archive */
"attachments" = "вложения";
"Print..." = "Печать...";
"Delete Message" = "Удалить сообщение";
"Delete Selected Messages" = "Удалить выделенные сообщения";
@@ -315,6 +327,7 @@
/* Error when uploading a file attachment */
"Error while uploading the file \"%{0}\":" = "Ошибка при загрузке файла \"%{0}\":";
"There is an active file upload. Closing the window will interrupt it." = "Сейчас выполняется загрузка файла. Закрытие окна прервет её.";
"Message is too big" = "Слишком большое сообщение";
/* Appears while sending the message */
"Sending" = "Отправляется";
@@ -53,7 +53,13 @@
/* Mail account main windows */
"Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Vitajte v SOGo Mailer. Použite zoznam zložiek vľavo na prehliadanie Vášho emailového účtu!";
"Read messages" = "Čítať správu";
/* Tooltip for fab button */
"Write a new message" = "Nápísať správu";
/* Tooltip for fab button */
"Write a message in new window" = "Napísať správu v novom okne";
"Share" = "Zdielať";
"Account" = "Účet";
"Shared Account" = "Zdielaný účet";
@@ -217,6 +223,12 @@
/* Message view "more" menu: create a task from message */
"Convert To Task" = "Zmeniť na úlohu";
/* Message view "more" menu: download all attachments as a zip archive */
"Download all attachments" = "Stiahnuť všetky prílohy";
/* Filename prefix when downloading all attachments as a zip archive */
"attachments" = "prílohy";
"Print..." = "Tlačiť";
"Delete Message" = "Zmazať správu";
"Delete Selected Messages" = "Zmazať vybrané správy";
@@ -315,6 +327,7 @@
/* Error when uploading a file attachment */
"Error while uploading the file \"%{0}\":" = "Nastala chyba počas nahrávania súboru \"%{0}\":";
"There is an active file upload. Closing the window will interrupt it." = "Práve prebieha nahrávanie súboru. Zatvorením okna nahrávanie prerušíte.";
"Message is too big" = "Správa je príliš veľká";
/* Appears while sending the message */
"Sending" = "Odosielam správu";
@@ -2,7 +2,7 @@
/* Icon's label */
"Create" = "Oluştur";
"Empty Trash" = "Çöp Klasörünü Boşalt";
"Empty Trash" = "Çöpü Boşalt";
"Delete" = "Sil";
"Expunge" = "Silip At";
"Forward" = "İlet";
@@ -53,16 +53,22 @@
/* Mail account main windows */
"Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "SOGo Postalayıcısına hoş geldiniz. E-posta hesaplarınızı görmek için soldaki klasör ağacını kullanın!";
"Read messages" = "İletileri oku";
/* Tooltip for fab button */
"Write a new message" = "Yeni ileti yaz";
/* Tooltip for fab button */
"Write a message in new window" = "Yeni pencerede bir ileti yaz";
"Share" = "Paylaşım";
"Account" = "Hesap";
"Shared Account" = "Paylaşılan Hesap";
/* A mailbox is selected, but no message (only shown on large screens) */
"No message selected" = "Seçili bir ileti yok";
"No message selected" = "Seçili ileti yok";
/* No mailbox is selected (usually resulting from an IMAP connection problem) */
"No mailbox selected" = "Seçili bir e-posta klasörü yok";
"No mailbox selected" = "Seçili e-posta klasörü yok";
/* Mailbox actions */
/* Compact Folder success message */
@@ -96,7 +102,7 @@
"To" = "Alıcı";
"Cc" = "Karbon Kopya";
"Bcc" = "Gizli Karbon Kopya";
"Reply-To" = "Yanıtlama adresi";
"Reply-To" = "Yanıt adresi";
"Add address" = "Adresleri ekle";
"Body" = "Gövde";
"Open" = "Aç";
@@ -111,7 +117,7 @@
"bcc" = "Gizli Karbon Kopya";
"Add a recipient" = "Bir alıcı ekleyin";
"Edit Draft..." = "Taslağı Düzenle...";
"Load Images" = "Resimleri yükle";
"Load Images" = "Resimleri göster";
"Return Receipt" = "Alındı Raporu";
"The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "Bu iletiyi gönderen kişi, iletiyi okuduğunuzdan haberdar olmak istedi. Gönderene alındı raporu yollamak ister misiniz?";
"Return Receipt (displayed) - %@"= "Alındı Raporu (görüntülendi) - %@";
@@ -155,10 +161,10 @@
"Untitled" = "Başlıksız";
/* Tree */
"SentFolderName" = "Gönderilmiş";
"SentFolderName" = "Giden";
"TrashFolderName" = "Çöp";
"InboxFolderName" = "Gelen";
"DraftsFolderName" = "Taslaklar";
"DraftsFolderName" = "Taslak";
"JunkFolderName" = "İstenmeyen";
"SieveFolderName" = "Süzgeçler";
"Folders" = "Klasörler"; /* title line */
@@ -193,8 +199,8 @@
"Delegation..." = "Yetkili Tayini...";
/* Use This Folder menu */
"Sent Messages" = "Gönderilmiş İletiler";
"Drafts" = "Taslaklar";
"Sent Messages" = "Giden İletiler";
"Drafts" = "Taslak";
"Deleted Messages" = "Silinmiş İletiler";
"Junk Messages" = "İstenmeyen İletiler";
@@ -217,6 +223,12 @@
/* Message view "more" menu: create a task from message */
"Convert To Task" = "Göreve Dönüştür";
/* Message view "more" menu: download all attachments as a zip archive */
"Download all attachments" = "Tüm eklentileri indir";
/* Filename prefix when downloading all attachments as a zip archive */
"attachments" = "eklentiler";
"Print..." = "Yazdır...";
"Delete Message" = "İletiyi Sil";
"Delete Selected Messages" = "Seçili İletileri Sil";
@@ -248,9 +260,9 @@
"Run Junk Mail Controls" = "İstenmeyen İleti Denetimi Yap";
"Search messages in" = "Aranacak klasör";
"Search" = "Ara";
"Search subfolders" = "Alt klasörlerde ara";
"Match any of the following" = "ifadelerden herhangi birini ara";
"Match all of the following" = "ifadelerin bütününü ara";
"Search subfolders" = "Alt klasörleri ara";
"Match any of the following" = "kelimelerden herhangi birini ara";
"Match all of the following" = "ifadenin bütününü ara";
"contains" = "içeren";
"does not contain" = "içermeyen";
"No matches found" = "Eşleşme bulunamadı";
@@ -284,7 +296,7 @@
"Please select a message." = "Lütfen bir ileti seçin.";
"Please select a message to print." = "Lütfen yazdırılacak iletiyi seçin.";
"Please select only one message to print." = "Lütfen yazdırmak için sadece bir ileti seçin.";
"Please select only one message to print." = "Yazdırmak için lütfen sadece bir ileti seçin.";
"The message you have selected doesn't exist anymore." = "Seçtiğiniz ileti artık mevcut değil.";
"The folder with name \"%{0}\" could not be created."
= "\"%{0}\" adındaki klasör oluşturulamıyor.";
@@ -307,7 +319,7 @@
= "İletiler çöpe taşınamıyor. Bu iletileri hemen silmek ister misiniz?";
/* Message editing */
"error_missingsubject" = "İletiye bir konu başlığı yazılmadı. İletiyi konusuz olarak göndermek istediğinizden emin misiniz?";
"error_missingsubject" = "İletiye konu başlığı yazılmadı. İletiyi konusuz olarak göndermek istediğinizden emin misiniz?";
"error_missingrecipients" = "Lütfen en az bir alıcı belirtin.";
"Send Anyway" = "Yinede Gönder";
"Error while saving the draft" = "Taslağı kaydederken hata oluştu";
@@ -315,6 +327,7 @@
/* Error when uploading a file attachment */
"Error while uploading the file \"%{0}\":" = " \"%{0}\" dosyasını yüklerken hata oluştu:";
"There is an active file upload. Closing the window will interrupt it." = "Devam eden bir dosya yükleme işlemi var. Pencereyi kapanırsa yükleme işlemi duracak.";
"Message is too big" = "İleti çok büyük";
/* Appears while sending the message */
"Sending" = "Gönderiliyor";
@@ -340,15 +353,15 @@
"Rename" = "Yeniden Adlandır";
"Compact" = "Sıkıştır";
"Export" = "Dışarı Aktar";
"Set as Drafts" = "Taslaklar klasörü olarak tanımla";
"Set as Sent" = "Gönderilmiş klasörü olarak tanımla";
"Set as Drafts" = "Taslak klasörü olarak tanımla";
"Set as Sent" = "Giden klasörü olarak tanımla";
"Set as Trash" = "Çöp klasörü olarak tanımla";
/* Set the folder as the one holding Junk mails */
"Set as Junk" = "İstenmeyen klasörü olarak tanımla";
"Sort" = "Sıralandır";
"Order Received" = "Alınan Tarih";
"Order Received" = "Alındığı Tarih";
"Descending Order" = "Azalan Sıralama";
"Back" = "Geri";
"Copy messages" = "İletileri kopyala";
@@ -27,6 +27,7 @@
"Finnish" = "Suomi";
"French" = "Français";
"German" = "Deutsch";
"Hebrew" = "עברית";
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
@@ -27,6 +27,7 @@
"Finnish" = "Suomi";
"French" = "Français";
"German" = "Deutsch";
"Hebrew" = "עברית";
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
@@ -27,6 +27,7 @@
"Finnish" = "Suomi";
"French" = "Français";
"German" = "Deutsch";
"Hebrew" = "עברית";
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
@@ -26,6 +26,7 @@
"Finnish" = "Suomi";
"French" = "Français";
"German" = "Deutsch";
"Hebrew" = "עברית";
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
+1 -1
View File
@@ -1,7 +1,7 @@
/* ChineseTaiwan */
{
NSLanguageName = "ChineseTaiwan";
NSFormalName = "ChineseTaiwan";
NSFormalName = "正體中文";
NSLocaleCode = "zh"; /* ISO 639-1 */
NSLanguageCode = "zho"; /* ISO 639-2 */
NSParentContext = "";
@@ -27,6 +27,7 @@
"Finnish" = "Suomi";
"French" = "Français";
"German" = "Deutsch";
"Hebrew" = "עברית";
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
@@ -27,6 +27,7 @@
"Finnish" = "Suomi";
"French" = "Français";
"German" = "Deutsch";
"Hebrew" = "עברית";
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
@@ -35,6 +35,7 @@
"Finnish" = "Suomi";
"French" = "Français";
"German" = "Deutsch";
"Hebrew" = "עברית";
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
@@ -27,6 +27,7 @@
"Finnish" = "Suomi";
"French" = "Français";
"German" = "Deutsch";
"Hebrew" = "עברית";
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
@@ -35,6 +35,7 @@
"Finnish" = "Suomi";
"French" = "Français";
"German" = "Deutsch";
"Hebrew" = "עברית";
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
@@ -35,6 +35,7 @@
"Finnish" = "Suomi";
"French" = "Français";
"German" = "Deutsch";
"Hebrew" = "עברית";
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
@@ -35,6 +35,7 @@
"Finnish" = "Suomi";
"French" = "Français";
"German" = "Deutsch";
"Hebrew" = "עברית";
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
@@ -35,6 +35,7 @@
"Finnish" = "Suomi";
"French" = "Français";
"German" = "Deutsch";
"Hebrew" = "עברית";
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
@@ -35,6 +35,7 @@
"Finnish" = "Suomi";
"French" = "Français";
"German" = "Deutsch";
"Hebrew" = "עברית";
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
+35
View File
@@ -0,0 +1,35 @@
/* Hebrew */
{
NSLanguageName = "Hebrew";
NSFormalName = "עברית";
NSLocaleCode = "he"; /* ISO 639-1 */
NSLanguageCode = "heb"; /* ISO 639-2 */
NSParentContext = "";
NSAMPMDesignation = (AM, PM);
NSCurrencySymbol = "$";
NSDateFormatString = "%A, %B %e, %Y";
NSDateTimeOrdering = MDYH;
NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9");
NSDecimalSeparator = ".";
NSEarlierTimeDesignations = ( "קודם", "אחרון", "שעבר", "לפני");
NSHourNameDesignations = ((0, "חצות"), (10, "בוקר"), (12,"צהריים", "א.צהריים"), (14, "אחר הצהריים"), (19, "א.ערב"));
NSInternationalCurrencyString = NIS; /* ISO 4217 */
NSLaterTimeDesignations = ("הבא");
NSMonthNameArray = ("ינואר", "פברואר", "מרץ", "אפריל", "מאי", "יוני", "יולי", "אוגוסט", "ספטמבר", "אוקטובר", "נובמבר", "דצמבר");
NSNextDayDesignations = ("מחר");
NSNextNextDayDesignations = ("מחרתיים");
NSPriorDayDesignations = ("אתמול");
NSShortDateFormatString = "%m/%e/%y";
NSShortMonthNameArray = ("ינו", "פב", "מרץ", "אפר", "מאי", "יונ", "יול", "אוג", "ספט", "אוק", "נוב", "דצמ");
NSShortTimeDateFormatString = "%m/%e/%y %I:%M %p";
NSShortWeekDayNameArray = ("ראש", "שני", "שלי", "רבי", "חמי", "שיש", "שבת");
NSThisDayDesignations = ("היום", "עכשיו");
NSThousandsSeparator = ",";
NSTimeDateFormatString = "%A, %B %e, %Y %I:%M:%S %p %Z";
NSTimeFormatString = "%I:%M:%S %p";
NSWeekDayNameArray = ("ראשון", "שני", "שלישי", "רביעי", "חמישי", "שישי", "שבת");
NSYearMonthWeekDesignations = ("שנה", "חודש", "שבוע");
NSPositiveCurrencyFormatString = "$9,999.00";
NSNegativeCurrencyFormatString = "-$9,999.00";
}
@@ -0,0 +1,94 @@
/* this file is in UTF-8 format! */
"title" = "SOGo";
"Username" = "שם משתמש";
"Password" = "סיסמא";
"Domain" = "דומיין";
"Remember username" = "זכור שם משתמש";
"Connect" = "התחברות";
/* Appears while authentication is in progress */
"Authenticating" = "מאמת נתונים";
/* Appears when authentication succeeds */
"Welcome" = "ברוך הבא";
"Authentication Failed" = "אימות נכשל";
"Wrong username or password." = "שם משתמש או סיסמה שגויים.";
"Retry" = "נסה שנית";
"cookiesNotEnabled" = "אין אפשרות להתחבר למערכת מכיוון שעוגיות (Cookies) אינם מאופשרים בדפדפן. אנא אפשרו שימוש בעוגיות בהגדרות הדפדפן ונסו שנית.";
"browserNotCompatible" = "מערכתינו זיהתה כי גרסת הדפדפן שלכם אינה נתמכת כעת. אנו ממליצים להשתמש בדפדפן Firefox. לחץ על הקישור מטה על מנת להוריד גרסה עדכנית של דפדפן זה.";
"alternativeBrowsers" = "כמו כן, ניתן להשתמש בכל אחד מהדפדפנים הנתמכים הבאים";
"alternativeBrowserSafari" = "בנוסף, ניתן להשתמש בדפדפן Safari.";
"Download" = "הורדה";
"Language" = "שפה";
"choose" = "בחר ...";
"Arabic" = "العربية";
"Basque" = "Euskara";
"Catalan" = "Català";
"ChineseTaiwan" = "Chinese (Taiwan)";
"Croatian" = "Hrvatski";
"Czech" = "Česky";
"Danish" = "Dansk (Danmark)";
"Dutch" = "Nederlands";
"English" = "English";
"Finnish" = "Suomi";
"French" = "Français";
"German" = "Deutsch";
"Hebrew" = "עברית";
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
"Lithuanian" = "Lietuvių";
"Macedonian" = "Македонски";
"NorwegianBokmal" = "Norsk bokmål";
"NorwegianNynorsk" = "Norsk nynorsk";
"Polish" = "Polski";
"Portuguese" = "Português";
"BrazilianPortuguese" = "Português brasileiro";
"Russian" = "Русский";
"Serbian" = "Српски";
"Slovak" = "Slovensky";
"Slovenian" = "Slovenščina";
"SpanishSpain" = "Español (España)";
"SpanishArgentina" = "Español (Argentina)";
"Swedish" = "Svenska";
"TurkishTurkey" = "Türkçe (Türkiye)";
"Ukrainian" = "Українська";
"Welsh" = "Cymraeg";
"About" = "אודות";
"AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.<br/><br/>\nSOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.<br/><br/>\nSOGo is distributed under the <a href=\"http://gnu.org/licenses/gpl.html\">GNU GPL</a> version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.<br/><br/>\nSee <a href=\"http://www.sogo.nu/en/support/community.html\">this page</a> for various support options.";
"Your account was locked due to too many failed attempts." = "חשבונכם נחסם עקב ניסיונות התחברות שגויים מרובים.";
"Your account was locked due to an expired password." = "חשבונכם נחסם עקב סיסמה אשר תוקפה פג.";
"Login failed due to unhandled error case" = "התחברות נכשלה בעקבות שגיאה לא מטופלת";
"Change your Password" = "שנו את סיסמתכם";
"The password was changed successfully." = "הסיסמה שונתה בהצלחה.";
"Your password has expired, please enter a new one below" = "סיסמתכם פגה תוקף. אנא הזינו סיסמה חדשה מטה";
"Password must not be empty." = "סיסמה לא יכולה להיות ריקה.";
"The passwords do not match. Please try again." = "הסיסמאות אינן תואמות. נסו שנית.";
"Password Grace Period" = "תקופת חסד לסיסמה";
"You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "ברשותך {0}% נסיונות התחברות עד לנעילת חשבונכם. אנא שנו את הסיסמה בדו-שיח ההגדרות.";
"Password about to expire" = "הסיסמה תפוג תוקף בקרוב";
"Your password is going to expire in %{0} %{1}." = "סיסמתכם תפוג תוקף ב {0}% {1}%.";
"days" = "ימים";
"hours" = "שעות";
"minutes" = "דקות";
"seconds" = "שניות";
"Password change failed" = "שינוי סיסמה נכשל";
"Password change failed - Permission denied" = "שינוי סיסמה נכשל - ההראשה נדחתה";
"Password change failed - Insufficient password quality" = "שינוי סיסמה נכשל - הסיסמה אינה איכותית מספיק";
"Password change failed - Password is too short" = "שינוי סיסמה נכשל - הסיסמה קצרה מדי";
"Password change failed - Password is too young" = "שינוי סיסמה נכשל - הסיסמה צעירה מדי";
"Password change failed - Password is in history" = "שינוי סיסמה נכשל - הסיסמה הייתה בשימוש בעבר";
"Unhandled policy error: %{0}" = "שגיאת מדיניות לא מטופלת: {0}%";
"Unhandled error response" = "תגובת שגיאה לא מטופלת";
"Password change is not supported." = "שינוי סיסמה אינו נתמך.";
"Unhandled HTTP error code: %{0}" = "שגיאת HTTP לא מטופלת מספר: {0}%";
"New password" = "סיסמה חדשה";
"Confirmation" = "אישור";
"Cancel" = "ביטול";
"Please wait..." = "אנא המתן...";
"Close" = "סגירה";
"Missing search parameter" = "פרמטר חיפוש חסר";
"Missing type parameter" = "סוג פרמטר חסר";
@@ -35,6 +35,7 @@
"Finnish" = "Suomi";
"French" = "Français";
"German" = "Deutsch";
"Hebrew" = "עברית";
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
@@ -26,6 +26,7 @@
"Finnish" = "Suomi";
"French" = "Français";
"German" = "Deutsch";
"Hebrew" = "עברית";
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
@@ -27,6 +27,7 @@
"Finnish" = "Suomi";
"French" = "Français";
"German" = "Deutsch";
"Hebrew" = "עברית";
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
@@ -26,6 +26,7 @@
"Finnish" = "Suomi";
"French" = "Français";
"German" = "Deutsch";
"Hebrew" = "עברית";
"Hungarian" = "Magyar";
"Icelandic" = "\nÍslenska";
"Italian" = "Italiano";
@@ -35,6 +35,7 @@
"Finnish" = "Suomi";
"French" = "Français";
"German" = "Deutsch";
"Hebrew" = "עברית";
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
@@ -27,6 +27,7 @@
"Finnish" = "Suomi";
"French" = "Français";
"German" = "Deutsch";
"Hebrew" = "עברית";
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
@@ -27,6 +27,7 @@
"Finnish" = "Suomi";
"French" = "Français";
"German" = "Deutsch";
"Hebrew" = "עברית";
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
@@ -35,6 +35,7 @@
"Finnish" = "Suomi";
"French" = "Français";
"German" = "Deutsch";
"Hebrew" = "עברית";
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";

Some files were not shown because too many files have changed in this diff Show More