mirror of
https://github.com/inverse-inc/sogo.git
synced 2026-05-08 21:15:27 +00:00
Merge to 2.3.20
This commit is contained in:
+11
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"];
|
||||
|
||||
@@ -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";
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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 */
|
||||
|
||||
@@ -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)
|
||||
-------------------
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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++)
|
||||
{
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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" = "אנשי קשר אשר נוצרו משליחת הודעה";
|
||||
@@ -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" = "תיקיות משותפות";
|
||||
@@ -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]
|
||||
|
||||
@@ -76,6 +76,9 @@
|
||||
@interface SOGoMailGermanForward : SOGoMailForward
|
||||
@end
|
||||
|
||||
@interface SOGoMailHebrewForward : SOGoMailForward
|
||||
@end
|
||||
|
||||
@interface SOGoMailHungarianForward : SOGoMailForward
|
||||
@end
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -75,6 +75,9 @@
|
||||
@interface SOGoMailGermanReply : SOGoMailReply
|
||||
@end
|
||||
|
||||
@interface SOGoMailHebrewReply : SOGoMailReply
|
||||
@end
|
||||
|
||||
@interface SOGoMailHungarianReply : SOGoMailReply
|
||||
@end
|
||||
|
||||
|
||||
@@ -123,6 +123,9 @@
|
||||
@implementation SOGoMailGermanReply
|
||||
@end
|
||||
|
||||
@implementation SOGoMailHebrewReply
|
||||
@end
|
||||
|
||||
@implementation SOGoMailHungarianReply
|
||||
@end
|
||||
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -53,6 +53,7 @@
|
||||
"Finnish",
|
||||
"French",
|
||||
"German",
|
||||
"Hebrew",
|
||||
"Hungarian",
|
||||
"Icelandic",
|
||||
"Italian",
|
||||
|
||||
@@ -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"];
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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" ];
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
@@ -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
@@ -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,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,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,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,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
|
||||
|
||||
@@ -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
|
||||
@@ -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,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,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,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,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,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" = "נקודת גישה פתוחה";
|
||||
@@ -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" = "↑";
|
||||
|
||||
|
||||
@@ -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" = "קדימה";
|
||||
@@ -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" = "↑";
|
||||
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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.";
|
||||
|
||||
|
||||
@@ -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";
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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" = "העבר …";
|
||||
|
||||
/* 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,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";
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user