Merge to 2.3.21

Conflicts:
	SoObjects/Appointments/SOGoAppointmentFolder.m
This commit is contained in:
Francis Lachapelle
2017-06-01 09:54:00 -04:00
215 changed files with 4872 additions and 1097 deletions
+11
View File
@@ -21,6 +21,7 @@ trans.hu = UI/MailerUI/Hungarian.lproj/Localizable.strings
trans.is = UI/MailerUI/Icelandic.lproj/Localizable.strings
trans.it = UI/MailerUI/Italian.lproj/Localizable.strings
trans.lt = UI/MailerUI/Lithuanian.lproj/Localizable.strings
trans.lv = UI/MailerUI/Latvian.lproj/Localizable.strings
trans.mk_MK = UI/MailerUI/Macedonian.lproj/Localizable.strings
trans.nb_NO = UI/MailerUI/NorwegianBokmal.lproj/Localizable.strings
trans.nl = UI/MailerUI/Dutch.lproj/Localizable.strings
@@ -57,6 +58,7 @@ trans.hu = UI/PreferencesUI/Hungarian.lproj/Localizable.strings
trans.is = UI/PreferencesUI/Icelandic.lproj/Localizable.strings
trans.it = UI/PreferencesUI/Italian.lproj/Localizable.strings
trans.lt = UI/PreferencesUI/Lithuanian.lproj/Localizable.strings
trans.lv = UI/PreferencesUI/Latvian.lproj/Localizable.strings
trans.mk_MK = UI/PreferencesUI/Macedonian.lproj/Localizable.strings
trans.nb_NO = UI/PreferencesUI/NorwegianBokmal.lproj/Localizable.strings
trans.nl = UI/PreferencesUI/Dutch.lproj/Localizable.strings
@@ -93,6 +95,7 @@ trans.hu = UI/Scheduler/Hungarian.lproj/Localizable.strings
trans.is = UI/Scheduler/Icelandic.lproj/Localizable.strings
trans.it = UI/Scheduler/Italian.lproj/Localizable.strings
trans.lt = UI/Scheduler/Lithuanian.lproj/Localizable.strings
trans.lv = UI/Scheduler/Latvian.lproj/Localizable.strings
trans.mk_MK = UI/Scheduler/Macedonian.lproj/Localizable.strings
trans.nb_NO = UI/Scheduler/NorwegianBokmal.lproj/Localizable.strings
trans.nl = UI/Scheduler/Dutch.lproj/Localizable.strings
@@ -129,6 +132,7 @@ trans.hu = UI/Contacts/Hungarian.lproj/Localizable.strings
trans.is = UI/Contacts/Icelandic.lproj/Localizable.strings
trans.it = UI/Contacts/Italian.lproj/Localizable.strings
trans.lt = UI/Contacts/Lithuanian.lproj/Localizable.strings
trans.lv = UI/Contacts/Latvian.lproj/Localizable.strings
trans.mk_MK = UI/Contacts/Macedonian.lproj/Localizable.strings
trans.nb_NO = UI/Contacts/NorwegianBokmal.lproj/Localizable.strings
trans.nl = UI/Contacts/Dutch.lproj/Localizable.strings
@@ -165,6 +169,7 @@ trans.hu = UI/MainUI/Hungarian.lproj/Localizable.strings
trans.is = UI/MainUI/Icelandic.lproj/Localizable.strings
trans.it = UI/MainUI/Italian.lproj/Localizable.strings
trans.lt = UI/MainUI/Lithuanian.lproj/Localizable.strings
trans.lv = UI/MainUI/Latvian.lproj/Localizable.strings
trans.mk_MK = UI/MainUI/Macedonian.lproj/Localizable.strings
trans.nb_NO = UI/MainUI/NorwegianBokmal.lproj/Localizable.strings
trans.nl = UI/MainUI/Dutch.lproj/Localizable.strings
@@ -201,6 +206,7 @@ trans.hu = UI/Common/Hungarian.lproj/Localizable.strings
trans.is = UI/Common/Icelandic.lproj/Localizable.strings
trans.it = UI/Common/Italian.lproj/Localizable.strings
trans.lt = UI/Common/Lithuanian.lproj/Localizable.strings
trans.lv = UI/Common/Latvian.lproj/Localizable.strings
trans.mk_MK = UI/Common/Macedonian.lproj/Localizable.strings
trans.nb_NO = UI/Common/NorwegianBokmal.lproj/Localizable.strings
trans.nl = UI/Common/Dutch.lproj/Localizable.strings
@@ -237,6 +243,7 @@ trans.hu = UI/AdministrationUI/Hungarian.lproj/Localizable.strings
trans.is = UI/AdministrationUI/Icelandic.lproj/Localizable.strings
trans.it = UI/AdministrationUI/Italian.lproj/Localizable.strings
trans.lt = UI/AdministrationUI/Lithuanian.lproj/Localizable.strings
trans.lv = UI/AdministrationUI/Latvian.lproj/Localizable.strings
trans.mk_MK = UI/AdministrationUI/Macedonian.lproj/Localizable.strings
trans.nb_NO = UI/AdministrationUI/NorwegianBokmal.lproj/Localizable.strings
trans.nl = UI/AdministrationUI/Dutch.lproj/Localizable.strings
@@ -273,6 +280,7 @@ trans.hu = SoObjects/Appointments/Hungarian.lproj/Localizable.strings
trans.is = SoObjects/Appointments/Icelandic.lproj/Localizable.strings
trans.it = SoObjects/Appointments/Italian.lproj/Localizable.strings
trans.lt = SoObjects/Appointments/Lithuanian.lproj/Localizable.strings
trans.lv = SoObjects/Appointments/Latvian.lproj/Localizable.strings
trans.mk_MK = SoObjects/Appointments/Macedonian.lproj/Localizable.strings
trans.nb_NO = SoObjects/Appointments/NorwegianBokmal.lproj/Localizable.strings
trans.nl = SoObjects/Appointments/Dutch.lproj/Localizable.strings
@@ -309,6 +317,7 @@ trans.hu = SoObjects/Contacts/Hungarian.lproj/Localizable.strings
trans.is = SoObjects/Contacts/Icelandic.lproj/Localizable.strings
trans.it = SoObjects/Contacts/Italian.lproj/Localizable.strings
trans.lt = SoObjects/Contacts/Lithuanian.lproj/Localizable.strings
trans.lv = SoObjects/Contacts/Latvian.lproj/Localizable.strings
trans.mk_MK = SoObjects/Contacts/Macedonian.lproj/Localizable.strings
trans.nb_NO = SoObjects/Contacts/NorwegianBokmal.lproj/Localizable.strings
trans.nl = SoObjects/Contacts/Dutch.lproj/Localizable.strings
@@ -345,6 +354,7 @@ trans.hu = SoObjects/Mailer/Hungarian.lproj/Localizable.strings
trans.is = SoObjects/Mailer/Icelandic.lproj/Localizable.strings
trans.it = SoObjects/Mailer/Italian.lproj/Localizable.strings
trans.lt = SoObjects/Mailer/Lithuanian.lproj/Localizable.strings
trans.lv = SoObjects/Mailer/Latvian.lproj/Localizable.strings
trans.mk_MK = SoObjects/Mailer/Macedonian.lproj/Localizable.strings
trans.nb_NO = SoObjects/Mailer/NorwegianBokmal.lproj/Localizable.strings
trans.nl = SoObjects/Mailer/Dutch.lproj/Localizable.strings
@@ -381,6 +391,7 @@ trans.hu = UI/MailPartViewers/Hungarian.lproj/Localizable.strings
trans.is = UI/MailPartViewers/Icelandic.lproj/Localizable.strings
trans.it = UI/MailPartViewers/Italian.lproj/Localizable.strings
trans.lt = UI/MailPartViewers/Lithuanian.lproj/Localizable.strings
trans.lv = UI/MailPartViewers/Latvian.lproj/Localizable.strings
trans.mk_MK = UI/MailPartViewers/Macedonian.lproj/Localizable.strings
trans.nb_NO = UI/MailPartViewers/NorwegianBokmal.lproj/Localizable.strings
trans.nl = UI/MailPartViewers/Dutch.lproj/Localizable.strings
+26 -1
View File
@@ -78,11 +78,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#import <SOGo/SOGoCacheGCSObject.h>
#import <SOGo/SOGoPermissions.h>
#import <NGCards/iCalCalendar.h>
#import <Appointments/iCalEntityObject+SOGo.h>
#import <Appointments/SOGoAppointmentObject.h>
#import <Appointments/SOGoAppointmentFolder.h>
#import <Appointments/SOGoAppointmentFolders.h>
#import <Appointments/SOGoTaskObject.h>
#import <Appointments/SOGoAppointmentFolder.h>
#import <Contacts/SOGoContactGCSEntry.h>
#import <Contacts/SOGoContactGCSFolder.h>
@@ -264,7 +267,26 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
return nameInCache;
}
- (void) _removeAllAlarmsFromCalendar: (iCalCalendar *) theCalendar
{
NSArray *allComponents;
iCalEntityObject *currentComponent;
NSUInteger count, max;
if (debugOn)
[self logWithFormat: @"EAS - Remove all alarms"];
allComponents = [theCalendar allObjects];
max = [allComponents count];
for (count = 0; count < max; count++)
{
currentComponent = [allComponents objectAtIndex: count];
if ([currentComponent isKindOfClass: [iCalEvent class]] ||
[currentComponent isKindOfClass: [iCalToDo class]])
[currentComponent removeAllAlarms];
}
}
//
// <?xml version="1.0"?>
@@ -1239,6 +1261,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
d = [NSCalendarDate distantFuture];
[dateCache setObject: d forKey: uid];
if (!([theCollection showCalendarAlarms]))
[self _removeAllAlarmsFromCalendar: [componentObject parent]];
}
if (updated)
@@ -1599,7 +1624,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[s appendString: [mailObject activeSyncRepresentationInContext: context]];
[s appendString: @"</ApplicationData>"];
[s appendString: @"</Add>"];
[syncCache setObject: [aCacheObject sequence] forKey: [aCacheObject uid]];
[dateCache setObject: [NSCalendarDate date] forKey: [aCacheObject uid]];
+76 -26
View File
@@ -2785,7 +2785,7 @@ void handle_eas_terminate(int signum)
inResponse: (WOResponse *) theResponse
{
SOGoContactSourceFolder *currentFolder;
NSArray *allKeys, *allContacts, *mails;
NSArray *allKeys, *allContacts, *mails, *a;
NSDictionary *systemSources, *contact;
SOGoContactFolders *contactFolders;
NSString *current_mail, *query;
@@ -2795,7 +2795,10 @@ void handle_eas_terminate(int signum)
NSData *d;
id o;
int i, j, total;
int i, j, t, v, total, minResult, maxResult, maxSize, maxPictures;
BOOL withPhoto;
withPhoto = NO;
query = [[(id)[theDocumentElement getElementsByTagName: @"Query"] lastObject] textValue];
@@ -2804,6 +2807,33 @@ void handle_eas_terminate(int signum)
systemSources = [contactFolders systemSources];
allKeys = [systemSources allKeys];
// We check for the maximum number of results to return.
a = [[[(id)[theDocumentElement getElementsByTagName: @"Range"] lastObject] textValue] componentsSeparatedByString: @"-"];
minResult = [[a objectAtIndex: 0] intValue];
maxResult = [[a objectAtIndex: 1] intValue];
if (maxResult == 0)
maxResult = 99;
if ((o = [(id)[[(id)[theDocumentElement getElementsByTagName: @"Options"] lastObject] getElementsByTagName: @"Picture"] lastObject]))
{
withPhoto = YES;
// We check for a MaxSize, default to 102400.
maxSize = [[[(id)[o getElementsByTagName: @"MaxSize"] lastObject] textValue] intValue];
// We check if we must overwrite the maxSize with a system preference. This can be useful
// if we don't want to have pictures in the response.
if ((v = [[SOGoSystemDefaults sharedSystemDefaults] maximumPictureSize]))
maxSize = v;
// We check for a MaxPictures, default to 99.
maxPictures = [[[(id)[o getElementsByTagName: @"MaxPictures"] lastObject] textValue] intValue];
if (maxPictures == 0)
maxPictures = 99;
}
s = [NSMutableString string];
[s appendString: @"<?xml version=\"1.0\" encoding=\"utf-8\"?>"];
@@ -2825,7 +2855,7 @@ void handle_eas_terminate(int signum)
ordering: NSOrderedAscending
inDomain: [[context activeUser] domain]];
for (j = 0; j < [allContacts count]; j++)
for (j = minResult; (j < [allContacts count] && j < maxResult) ; j++)
{
contact = [allContacts objectAtIndex: j];
@@ -2843,9 +2873,9 @@ void handle_eas_terminate(int signum)
else
mails = [NSArray arrayWithObjects: o ? o : @"", nil];
for (total = 0; total < [mails count]; total++)
for (t = 0; t < [mails count]; t++)
{
current_mail = [mails objectAtIndex: total];
current_mail = [mails objectAtIndex: t];
[s appendString: @"<Result xmlns=\"Search:\">"];
[s appendString: @"<Properties>"];
@@ -2863,7 +2893,7 @@ void handle_eas_terminate(int signum)
[s appendFormat: @"<LastName xmlns=\"Gal:\">%@</LastName>", [o activeSyncRepresentationInContext: context]];
if ([current_mail length] > 0)
[s appendFormat: @"<EmailAddress xmlns=\"Gal:\">%@</EmailAddress>", current_mail];
[s appendFormat: @"<EmailAddress xmlns=\"Gal:\">%@</EmailAddress>", [current_mail activeSyncRepresentationInContext: context]];
if ((o = [contact objectForKey: @"telephonenumber"]))
[s appendFormat: @"<Phone xmlns=\"Gal:\">%@</Phone>", [o activeSyncRepresentationInContext: context]];
@@ -2876,9 +2906,27 @@ void handle_eas_terminate(int signum)
if ((o = [contact objectForKey: @"o"]))
[s appendFormat: @"<Company xmlns=\"Gal:\">%@</Company>", [o activeSyncRepresentationInContext: context]];
if ([[context objectForKey: @"ASProtocolVersion"] floatValue] >= 14.1 && withPhoto)
{
o = [contact objectForKey: @"photo"];
if (o && [o length] <= maxSize && total < maxPictures)
{
[s appendString: @"<Picture xmlns=\"Gal:\"><Status>1</Status><Data>"];
[s appendString: [o activeSyncRepresentationInContext: context]];
[s appendString: @"</Data></Picture>"];
}
else if (!o)
[s appendString: @"<Picture xmlns=\"Gal:\"><Status>173</Status></Picture>"];
else if ([o length] > maxSize)
[s appendString: @"<Picture xmlns=\"Gal:\"><Status>174</Status></Picture>"];
else if (total >= maxPictures)
[s appendString: @"<Picture xmlns=\"Gal:\"><Status>175</Status></Picture>"];
}
[s appendString: @"</Properties>"];
[s appendString: @"</Result>"];
total++;
}
}
}
@@ -3532,10 +3580,14 @@ void handle_eas_terminate(int signum)
{
NSString *folderId, *itemId, *realCollectionId;
SOGoMicrosoftActiveSyncFolderType folderType;
SOGoMailAccounts *accountsFolder;
SOGoMailFolder *currentFolder;
SOGoUserFolder *userFolder;
SOGoMailObject *mailObject;
SOGoUserDefaults *ud;
BOOL htmlComposition, isHTML;
id value;
id value, currentCollection;
isHTML = NO;
ud = [[context activeUser] userDefaults];
@@ -3561,23 +3613,31 @@ void handle_eas_terminate(int signum)
value = [theDocumentElement getElementsByTagName: @"ReplaceMime"];
// We fetch the mail object from the server
userFolder = [[context activeUser] homeFolderInContext: context];
accountsFolder = [userFolder lookupName: @"Mail" inContext: context acquire: NO];
currentFolder = [accountsFolder lookupName: @"0" inContext: context acquire: NO];
currentCollection = [currentFolder lookupName: [NSString stringWithFormat: @"folder%@", realCollectionId]
inContext: context
acquire: NO];
mailObject = [currentCollection lookupName: itemId inContext: context acquire: NO];
// ReplaceMime IS specified so we must NOT use the server copy
// but rather take the data as-is from the client.
if ([value count])
{
[self processSendMail: theDocumentElement
inResponse: theResponse];
[self processSendMail: theDocumentElement inResponse: theResponse];
if (!isSmartForward)
[mailObject addFlags: @"Answered"];
else
[mailObject addFlags: @"$Forwarded"];
return;
}
if (folderType == ActiveSyncMailFolder)
{
SOGoMailAccounts *accountsFolder;
SOGoMailFolder *currentFolder;
SOGoUserFolder *userFolder;
SOGoMailObject *mailObject;
id currentCollection;
NGMimeMessage *messageFromSmartForward, *messageToSend;
NGMimeMessageParser *parser;
NSData *data;
@@ -3596,16 +3656,6 @@ void handle_eas_terminate(int signum)
int a;
userFolder = [[context activeUser] homeFolderInContext: context];
accountsFolder = [userFolder lookupName: @"Mail" inContext: context acquire: NO];
currentFolder = [accountsFolder lookupName: @"0" inContext: context acquire: NO];
currentCollection = [currentFolder lookupName: [NSString stringWithFormat: @"folder%@", realCollectionId]
inContext: context
acquire: NO];
mailObject = [currentCollection lookupName: itemId inContext: context acquire: NO];
parser = [[NGMimeMessageParser alloc] init];
data = [[[[(id)[theDocumentElement getElementsByTagName: @"MIME"] lastObject] textValue] stringByDecodingBase64] dataUsingEncoding: NSUTF8StringEncoding];
messageFromSmartForward = [parser parsePartFromData: data];
+12 -6
View File
@@ -238,9 +238,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
}
else
{
// If it's a normal event (ie, with no organizer/attendee) or we are the organizer to an event
// invitation, we set the busy status to 2 (Busy)
[s appendFormat: @"<BusyStatus xmlns=\"Calendar:\">%d</BusyStatus>", 2];
// If it's a normal event (i.e. with no organizer/attendee) or we are the organizer of an event
// invitation, we set the busy status depending on TRANSP.
[s appendFormat: @"<BusyStatus xmlns=\"Calendar:\">%d</BusyStatus>", (([self isOpaque]) ? 2 : 0)];
}
[s appendFormat: @"<MeetingStatus xmlns=\"Calendar:\">%d</MeetingStatus>", meetingStatus];
@@ -481,7 +481,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
if ((o = [theValues objectForKey: @"BusyStatus"]))
{
[o intValue];
if ([o boolValue])
[self setTransparency: @"OPAQUE"];
else
[self setTransparency: @"TRANSPARENT"];
}
//
@@ -862,7 +865,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
person = [iCalPerson elementWithTag: @"attendee"];
[person setCn: [attendee objectForKey: @"Attendee_Name"]];
[person setEmail: [attendee objectForKey: @"Attendee_Email"]];
status = [[attendee objectForKey: @"Attendee_Status"] intValue];
switch (status)
@@ -879,7 +882,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
case 0:
case 5:
default:
[person setPartStat: @"NEEDS-ACTION"];
{
[person setPartStat: @"NEEDS-ACTION"];
[person setRsvp: @"TRUE"];
}
break;
}
+573
View File
@@ -1,3 +1,576 @@
commit 875b1c9836c0dd4ef3a009038529ffa753f22177
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Thu Jun 1 09:47:58 2017 -0400
Preparation for release 2.3.21
M Documentation/docinfo.xml
M Documentation/includes/global-attributes.asciidoc
M Version
commit 428d179b9fd12a2a89747c1fb370350069434b1c
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Thu Jun 1 09:44:32 2017 -0400
(js) Update CKEditor to version 4.7.0
M NEWS
M UI/WebServerResources/ckeditor/build-config.js
M UI/WebServerResources/ckeditor/ckeditor.js
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
A UI/WebServerResources/ckeditor/lang/he.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
A UI/WebServerResources/ckeditor/lang/lv.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
D UI/WebServerResources/ckeditor/plugins/clipboard/dialogs/paste.js
M UI/WebServerResources/ckeditor/plugins/div/dialogs/div.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
A UI/WebServerResources/ckeditor/plugins/scayt/dialogs/dialog.css
M UI/WebServerResources/ckeditor/plugins/scayt/dialogs/options.js
A UI/WebServerResources/ckeditor/plugins/widget/images/handle.png
M UI/WebServerResources/ckeditor/plugins/wsc/dialogs/wsc.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
commit e73a3495bb9e3caa8f8a9e142d5d942a93a14071
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Wed May 31 10:48:35 2017 -0400
Respect languages preferences on login page
Fixes #4169
M NEWS
M SoObjects/SOGo/SOGoDefaults.plist
M SoObjects/SOGo/WOContext+SOGo.m
M UI/MainUI/SOGoRootPage.h
M UI/MainUI/SOGoRootPage.m
M UI/Templates/MainUI/SOGoRootPage.wox
M UI/WebServerResources/SOGoRootPage.js
commit 678cf66a574b7eeda936c3df3fbc9ac0367edd71
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Wed May 31 06:32:40 2017 -0400
Add Latvian (lv) translation (cont'd)
A SoObjects/Mailer/SOGoMailLatvianForward.wo/SOGoMailLatvianForward.html
A SoObjects/Mailer/SOGoMailLatvianForward.wo/SOGoMailLatvianForward.wod
A SoObjects/Mailer/SOGoMailLatvianReply.wo/SOGoMailLatvianReply.html
A SoObjects/Mailer/SOGoMailLatvianReply.wo/SOGoMailLatvianReply.wod
commit 0cca551c223d8406a55dee75940fd70e50e66aa9
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Tue May 30 17:27:49 2017 -0400
Add Latvian (lv) translation
M .tx/config
M NEWS
M SoObjects/Appointments/English.lproj/Localizable.strings
M SoObjects/Appointments/French.lproj/Localizable.strings
M SoObjects/Appointments/German.lproj/Localizable.strings
A SoObjects/Appointments/Latvian.lproj/Localizable.strings
M SoObjects/Appointments/Polish.lproj/Localizable.strings
M SoObjects/Appointments/TurkishTurkey.lproj/Localizable.strings
A SoObjects/Contacts/Latvian.lproj/Localizable.strings
M SoObjects/Mailer/GNUmakefile
A SoObjects/Mailer/Latvian.lproj/Localizable.strings
M SoObjects/Mailer/SOGoMailForward.h
M SoObjects/Mailer/SOGoMailForward.m
M SoObjects/Mailer/SOGoMailReply.h
M SoObjects/Mailer/SOGoMailReply.m
M SoObjects/SOGo/SOGoDefaults.plist
M Tests/Integration/preferences.py
A UI/AdministrationUI/Latvian.lproj/Localizable.strings
M UI/Common/Dutch.lproj/Localizable.strings
M UI/Common/Finnish.lproj/Localizable.strings
A UI/Common/Latvian.lproj/Localizable.strings
M UI/Contacts/Czech.lproj/Localizable.strings
M UI/Contacts/Dutch.lproj/Localizable.strings
M UI/Contacts/Finnish.lproj/Localizable.strings
M UI/Contacts/French.lproj/Localizable.strings
A UI/Contacts/Latvian.lproj/Localizable.strings
M UI/Contacts/Polish.lproj/Localizable.strings
M UI/Contacts/Slovak.lproj/Localizable.strings
M UI/Contacts/TurkishTurkey.lproj/Localizable.strings
A UI/MailPartViewers/Latvian.lproj/Localizable.strings
M UI/MailPartViewers/TurkishTurkey.lproj/Localizable.strings
M UI/MailerUI/Dutch.lproj/Localizable.strings
M UI/MailerUI/English.lproj/Localizable.strings
M UI/MailerUI/Finnish.lproj/Localizable.strings
M UI/MailerUI/French.lproj/Localizable.strings
M UI/MailerUI/German.lproj/Localizable.strings
A UI/MailerUI/Latvian.lproj/Localizable.strings
M UI/MailerUI/Polish.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/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
M 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
A UI/MainUI/Latvian.lproj/Locale
A UI/MainUI/Latvian.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/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
M 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
A UI/PreferencesUI/Latvian.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/Czech.lproj/Localizable.strings
M UI/Scheduler/Dutch.lproj/Localizable.strings
M UI/Scheduler/Finnish.lproj/Localizable.strings
A UI/Scheduler/Latvian.lproj/Localizable.strings
M UI/Scheduler/Slovak.lproj/Localizable.strings
M UI/Scheduler/TurkishTurkey.lproj/Localizable.strings
M configure
commit 98f042b390eb3047f4294b037b6ced4a8b9c4928
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Tue May 30 14:47:23 2017 -0400
(fix) fixed typos in tools' help (fixes #4175)
M Tools/SOGoToolManageEAS.m
M Tools/SOGoToolTruncateCalendar.m
commit bbac4662768444a1821f72351a2c12da2878f783
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Tue May 30 14:44:43 2017 -0400
(fix) sanity check when no defaults are found (fixes #4179)
M Tools/SOGoToolDumpDefaults.m
commit d7eb75195147160957a2c865f95728cdfe430cf6
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Tue May 30 13:16:35 2017 -0400
Updated NEWS
M NEWS
commit 7cc3ff2fccb7905300456b01091286581e4b3842
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Tue May 30 13:15:04 2017 -0400
(fix) remove any trailing cr (fixes #4172)
M UI/Contacts/UIxContactFolderActions.m
commit ec397b39b04e232fbb02039f0a4f9e835fd76e60
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Tue May 30 10:38:31 2017 -0400
(feat) added custom fields support from Thunderbird's address book
M NEWS
M SoObjects/Contacts/NGVCard+SOGo.h
M SoObjects/Contacts/NGVCard+SOGo.m
M UI/Contacts/UIxContactEditor.m
M UI/Contacts/UIxContactView.m
M UI/Templates/ContactsUI/UIxContactEditor.wox
M UI/Templates/ContactsUI/UIxContactView.wox
commit 95d08c015057a3760adbef5f8c21cb9d22bb3c2b
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Tue May 30 09:26:30 2017 -0400
Newly subscribed calendars are excluded from FB
Fixes #3354
M NEWS
M SoObjects/Appointments/SOGoAppointmentFolder.m
M SoObjects/SOGo/SOGoGCSFolder.m
commit b3149ee7c23320f2e22dccf689850d0e317a751f
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Wed May 17 09:56:16 2017 -0400
Fixed typo
M Tools/SOGoToolManageACL.m
commit 20cbe3cf77b4be5641a2f423c78ed89c6e68bb1e
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Wed May 17 09:46:27 2017 -0400
Updated NEWS
M NEWS
commit a57cad33f669f1dc03fec7f3c6463953796ad9a0
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Wed May 17 09:44:34 2017 -0400
(feat) now able to subscribe/unsubscribe folders using sogo-tool
M SoObjects/SOGo/SOGoGCSFolder.m
M Tools/SOGoToolManageACL.m
commit 5027aabc1b0adbba6ed3177a7bc833dc7d5da352
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Wed Oct 26 15:42:50 2016 -0400
Improve validation of mail account delegators
M SoObjects/Mailer/SOGoMailAccount.m
commit 149997b4cd60f97c023007cd6ddb316c1b9d0580
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Mon May 8 11:23:32 2017 -0400
Fix mail delegation of pristine user accounts
Fixes #4160
M NEWS
M SoObjects/Mailer/SOGoMailAccount.m
M SoObjects/Mailer/SOGoUser+Mailer.m
commit 9b4dd624c6fd87295c18ffd42e958cf6f52fc7f8
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Mon May 8 10:46:12 2017 -0400
Updated NEWS
M NEWS
commit c3121c50d5b99996029a4e06e63df7802b262fad
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Mon May 8 10:44:12 2017 -0400
(fix) make sure to use crypt as the scheme for md5/sha256/sha512 (fixes #4137)
M SoObjects/SOGo/LDAPSource.m
M SoObjects/SOGo/SQLSource.m
commit 3f698447b912b1e4752baeb752b1df4635c2bfc8
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Thu Apr 27 09:02:46 2017 -0400
Properly honor "include in freebusy"
Fixes #3354
M NEWS
M SoObjects/Appointments/SOGoAppointmentFolder.m
M SoObjects/Appointments/SOGoFreeBusyObject.m
M SoObjects/SOGo/SOGoParentFolder.m
commit 2705b5956a06585076c9029de31edb643c50a457
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Wed Apr 26 09:42:25 2017 -0400
(doc) Update installation guide
M Documentation/SOGoInstallationGuide.asciidoc
commit e0cb700f54906220b6406a81e22372a4bafd6f76
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Fri Apr 21 16:42:08 2017 -0400
(js) Prevent 304 HTTP status code in IE11
M UI/WebServerResources/generic.js
commit 65e735a31422eaa70ec77fb8494b36012f6e2904
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Fri Apr 21 15:31:54 2017 -0400
Updated NEWS
M NEWS
commit 89400fe980515687a658e4f0a88885d9ba323df8
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Fri Apr 21 15:29:34 2017 -0400
(feat) added photo support in GAL search ops
M ActiveSync/SOGoActiveSyncDispatcher.m
M Documentation/SOGoInstallationGuide.asciidoc
M SoObjects/SOGo/SOGoSystemDefaults.h
M SoObjects/SOGo/SOGoSystemDefaults.m
commit e6baba445f2035ae17ec2918b289fbd6ad751dd9
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Thu Apr 20 14:35:44 2017 -0400
Updated comment
M UI/MailPartViewers/UIxMailPartHTMLViewer.m
commit 341885542bf2743be39a5edc3f27a3402644703a
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Thu Apr 20 14:30:54 2017 -0400
Updated NEWS
M NEWS
commit 9c1e481d54d1911d0ff393e0340671ce9d069159
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Thu Apr 20 14:29:15 2017 -0400
(fix) handle properly windows-1255 charset (fixes #4124)
M UI/MailPartViewers/UIxMailPartHTMLViewer.m
commit 8fc55833d299b8d8194cc75319f1548a814894b2
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Wed Apr 12 16:37:39 2017 -0400
Updated NEWS
M NEWS
commit 43385ce5bf8a3dc8371289c6acd600c57fa1fa06
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Wed Apr 12 16:13:40 2017 -0400
(fix) enhance display of all-day invitations (fixes #4145)
M SoObjects/Appointments/English.lproj/Localizable.strings
M SoObjects/Appointments/SOGoAptMailNotification.m
M UI/MailPartViewers/UIxMailPartICalViewer.m
M UI/Templates/Appointments/SOGoAptMailInvitation.wox
commit f28b7f2f8cc91dc69b3976f5311b18bd9e51bbd5
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Wed Apr 12 13:05:06 2017 -0400
Updated NEWS
M NEWS
commit 7a418582c4f2ac4dc094724662c43c201c83a469
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Wed Apr 12 13:04:29 2017 -0400
(fix) avoid sending IMIP messages for all EAS clients (fixes #4022)
M SoObjects/Appointments/SOGoCalendarComponent.m
commit 34e22dad42587a5397d5f4c9b9e46d7359211985
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Wed Apr 12 12:59:53 2017 -0400
(fix) set RSVP when sending events invite
M ActiveSync/iCalEvent+ActiveSync.m
commit b8ae9afbd220c9dad6803e89b0fd0da22b446d8d
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Tue Apr 11 10:15:32 2017 -0400
Updated NEWS
M NEWS
commit be527031bc4724e1718981de69f63c400b28ea08
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Tue Apr 11 10:13:56 2017 -0400
(fix) remove over EAS alarms if we don't want them (fixes #4059)
M ActiveSync/SOGoActiveSyncDispatcher+Sync.m
commit b4f5430ac57a61bad03bb98f264e6e48590b4b2c
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Fri Apr 7 13:45:32 2017 -0400
Updated NEWS
M NEWS
commit 8b307d8ac6f4647e9734057174e5c71f9ea5d437
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Fri Apr 7 13:43:18 2017 -0400
(fix) correctly set flags when ReplaceMime is set (fixes #4133)
M ActiveSync/SOGoActiveSyncDispatcher.m
commit 2e8c6680fe8e80bb58eb3111e74125507c4b647e
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Thu Apr 6 14:24:25 2017 -0400
(fix) check if found before changing location
M SoObjects/SOGo/SOGoMailer.m
commit d9d4808d297138dc59cb5d8821819186027d0e65
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Thu Apr 6 11:02:59 2017 -0400
(fix) protect ourself from broken SOPE/SOGo installs (fixes #4117)
M SoObjects/SOGo/SOGoMailer.m
commit 43dc7dee8748e97819c950e54d61932eb4f43b39
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Fri Mar 31 15:33:19 2017 -0400
(fix) calendar component move across collections (fixes #4116)
M NEWS
M SoObjects/Appointments/SOGoCalendarComponent.m
commit 9995ccc29fb4488492b784106eb83a59fca10686
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Fri Mar 24 11:37:54 2017 -0400
(fix) more fixes for #3905
M SoObjects/Appointments/SOGoAppointmentObject.m
commit 28ab0015a98dc7e22b1b19c35b884b1c8d05cd1a
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Fri Mar 24 11:11:10 2017 -0400
(fix) more fixes for #3905
M SoObjects/Appointments/SOGoAppointmentObject.m
commit 4a3f17506cdb3958f4e0f688be7f911688bfdc62
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Sun Jan 29 18:07:59 2017 -0500
Remove debugging output
M SOPE/NGCards/iCalWeeklyRecurrenceCalculator.m
commit a7740dc5eddc065ba1d5904469a218431d36ee58
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Sat Mar 18 15:37:15 2017 -0400
Updated NEWS
M NEWS
commit 3155ecf3251e5662f1dd87f2f885be1c08521431
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Sat Mar 18 15:34:56 2017 -0400
(fix) fix opacity in freebusy over EAS
M ActiveSync/iCalEvent+ActiveSync.m
commit fb8ba8f3b9ee1f669aae56f03549a9fb8f4c3aff
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Wed Mar 15 10:38:20 2017 -0400
(fix) remove old code conflicting with #3905
M SoObjects/Appointments/SOGoCalendarComponent.m
commit 4cd8a32081b8aa347327b7e5dbcdd4f435261adb
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Fri Mar 10 08:58:46 2017 -0500
Release preparation
M ChangeLog
M Documentation/docinfo.xml
M Documentation/includes/global-attributes.asciidoc
M NEWS
M Version
commit fbc6bb71a89cbfabed4b1dea1a129dc722bbbfd1
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Thu Mar 9 13:57:27 2017 -0500
+61 -39
View File
@@ -18,13 +18,13 @@ About this Guide
This guide will walk you through the installation and configuration of
the SOGo solution. It also covers the installation and configuration of
SOGo ActiveSync support the solution used to synchronize mobile
SOGo ActiveSync support - the solution used to synchronize mobile
devices with SOGo.
The instructions are based on version {release_version} of SOGo.
The latest version of this guide is available
at http://www.sogo.nu/downloads/documentation.html.
at http://sogo.nu/downloads/documentation.html.
Introduction
------------
@@ -50,8 +50,7 @@ the SOGo Connector and the SOGo Integrator
device, or Outlook 2013
SOGo is developed by a community of developers located mainly in North
America and Europe. More information can be found
at http://www.sogo.nu/
America and Europe. More information can be found at http://sogo.nu/
Architecture and Compatibility
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -202,6 +201,11 @@ should apply to all supported operating systems.
Software Downloads
~~~~~~~~~~~~~~~~~~
[NOTE]
In order to access the production builds, you need a proper support contract
from https://sogo.nu/support/index_new.html#support-plans[Inverse]. Continue
with the configuration once you received your username and password.
SOGo can be installed using the `yum` utility. To do so, first create
the `/etc/yum.repos.d/inverse.repo` configuration file with the following
content:
@@ -209,17 +213,22 @@ content:
----
[SOGo]
name=Inverse SOGo Repository
baseurl=http://inverse.ca/downloads/SOGo/RHEL6/$basearch
baseurl=https://<username>:<password>@packages.inverse.ca/SOGo/release/2/rhel/6/$basearch
gpgcheck=0
----
Some of the softwares on which SOGo depends are available from the
repository of RepoForge (previously known as RPMforge). To add RepoForge
to your packages sources, download and install the appropriate RPM
package from http://packages.sw.be/rpmforge-release/.
Also make sure you enabled the "rpmforge-extras" repository.
[NOTE]
Any non-URL safe characters in username/password must be URL-encoded. For
example, if your password is `so%go`, you must set the value in your
configuration file to `so%25go` - where `%` is encoded to `%25`.
For more information on using RepoForge, visit http://repoforge.org/use/.
Inverse signs its RPM packages with its GPG key. Integrity verification happens
all by itself on package installation, all you need to do is first import the
key into your rpm keychain:
----
rpm --import "https://pgp.mit.edu/pks/lookup?op=get&search=0xCB2D3A2AA0030E2C"
----
Software Installation
~~~~~~~~~~~~~~~~~~~~~
@@ -504,8 +513,8 @@ In our example, we set the default domain to `acme.com`.
meeting participants. Possible values are:
[options="compact"]
* `YES` to send notifications
* `NO` to not send notifications
* `YES` - to send notifications
* `NO` - to not send notifications
Defaults to `NO` when unset.
@@ -578,6 +587,8 @@ for SOGo. Possible values are:
* `Basque`
* `BrazilianPortuguese`
* `Catalan`
* `ChineseTaiwan`
* `Croatian`
* `Czech`
* `Danish`
* `Dutch`
@@ -588,14 +599,19 @@ for SOGo. Possible values are:
* `Hungarian`
* `Icelandic`
* `Italian`
* `Lithuanian`
* `Macedonian`
* `NorwegianBokmal`
* `NorwegianNynorsk`
* `Polish`
* `Portuguese`
* `Russian`
* `Slovak`
* `SpanishSpain`
* `Slovenian`
* `SpanishArgentina`
* `SpanishSpain`
* `Swedish`
* `TurkishTurkey`
* `Ukrainian`
* `Welsh`
@@ -604,8 +620,8 @@ for SOGo. Possible values are:
someone changes his/her own calendar. Possible values are:
[options="compact"]
- `YES` to send notifications
- `NO` to not send notifications
- `YES` - to send notifications
- `NO` - to not send notifications
Defaults to `NO` when unset. User can overwrite this from the calendar
properties window.
@@ -616,8 +632,8 @@ modification is being done to his/her own calendar by someone else.
Possible values are:
[options="compact"]
* `YES` to send notifications
* `NO` to not send notifications
* `YES` - to send notifications
* `NO` - to not send notifications
Defaults to `NO` when unset. User can overwrite this from the calendar
properties window.
@@ -640,8 +656,8 @@ requiring not authentication) their calendars and address books.
Possible values are:
[options="compact"]
* `YES` to allow them
* `NO` to prevent them from doing so
* `YES` - to allow them
* `NO` - to prevent them from doing so
Defaults to `NO` when unset.
@@ -652,8 +668,8 @@ SOGo.
Possible values are:
[options="compact"]
* `YES` to allow them
* `NO` to prevent them from doing so
* `YES` - to allow them
* `NO` - to prevent them from doing so
Defaults to `NO` when unset.
@@ -683,7 +699,7 @@ Defaults to `NO` when unset.
string (attendee completion, address book search, etc.) prior triggering
the server-side search operation.
Defaults to `2` when unset which means a search operation will be
Defaults to `2` when unset - which means a search operation will be
triggered on the 3rd typed character.
|S |SOGoMaximumFailedLoginCount
@@ -888,7 +904,7 @@ source can contain the following values:
|The type of this user source, set to ldap` for an LDAP source.
|id
|The identification name of the LDAP repository. This must be unique
|The identification name of the LDAP repository. This must be unique -
even when using multiple domains.
|CNFieldName
@@ -955,8 +971,8 @@ be marked as busy the first time it is booked.
EOQualifier. The following operators are supported:
[options="compact"]
* `<>` inequality operator
* `=` equality operator
* `<>` - inequality operator
* `=` - equality operator
Multiple qualifiers can be joined by using `OR` and `AND`, they can also
be grouped together by using parenthesis. Attribute values should be
@@ -1374,9 +1390,9 @@ SOGoProfileURL =
Create the database user and schema using the following commands:
----
su postgres
createuser --no-superuser --no-createdb -no-createrole \
-encrypted --pwprompt sogo
su - postgres
createuser --no-superuser --no-createdb --no-createrole \
--encrypted --pwprompt sogo
(specify “sogo” as password)
createdb -O sogo sogo
----
@@ -1477,7 +1493,7 @@ source can contain the following values:
|The type of this user source, set to `sql` for a SQL source.
|id
|The identification name of the SQL repository. This must be unique
|The identification name of the SQL repository. This must be unique -
even when using multiple domains.
|viewURL
@@ -1485,9 +1501,9 @@ even when using multiple domains.
present. Required columns are:
[options="compact"]
* `c_uid`: will be used for authentication it's a username or
* `c_uid`: will be used for authentication - it's a username or
username@domain.tld
* `c_name`: will be used to uniquely identify entries which can be
* `c_name`: will be used to uniquely identify entries - which can be
identical to `c_uid`
* `c_password`: password of the user, plain text, crypt, md5 or sha
encoded
@@ -1593,14 +1609,14 @@ SOGoUserSources =
Certain database columns must be present in the view/table, such as:
* `c_uid` will be used for authentication  it's the username
* `c_uid` - will be used for authentication - it's the username
or username@domain.tld
* `c_name` which can be identical to `c_uid`  will be used to
* `c_name` - which can be identical to `c_uid` - will be used to
uniquely identify entries
* `c_password` password of the user, plain-text, md5 or sha encoded
* `c_password` - password of the user, plain-text, md5 or sha encoded
for now
* `c_cn` the user's common name such as "John Doe"
* `mail`  the user's mail address
* `c_cn` - the user's common name - such as "John Doe"
* `mail` - the user's mail address
Note that groups are currently not supported for SQL-based
authentication sources.
@@ -1620,8 +1636,8 @@ The following table describes the related parameters.
are:
[options="compact"]
* `sendmail` to use the sendmail binary
* `smtp` to use the SMTP protocol
* `sendmail` - to use the sendmail binary
* `smtp` - to use the SMTP protocol
|D |SOGoSMTPServer
|The DNS name or IP address of the SMTP server used when
@@ -2545,6 +2561,12 @@ have unexpected behaviour with various ActiveSync clients.
EAS command.
Defaults to `NO`, which means no logging is performed.
|S |SOGoMaximumPictureSize
|Parameter used to overwrite the maximum number of bytes returned in the picture
for EAS Search operations in the GAL.
If not set, it defaults to `102400` bytes, or 100 KB.
|=======================================================================
Please be aware of the following limitations:
+3 -3
View File
@@ -1,7 +1,7 @@
<!-- TODO have the build system take care of this -->
<releaseinfo>Version 2.3.20 - March 2017</releaseinfo>
<subtitle>for version 2.3.20</subtitle>
<date>2017-03-10</date>
<releaseinfo>Version 2.3.21 - June 2017</releaseinfo>
<subtitle>for version 2.3.21</subtitle>
<date>2017-06-01</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.20
:release_version: 2.3.21
// vim: set syntax=asciidoc tabstop=2 shiftwidth=2 expandtab:
+26
View File
@@ -1,3 +1,29 @@
2.3.21 (2017-06-01)
-------------------
Enhancements
- [core] improved event invitation for all day events (#4145)
- [core] now possible to {un}subscribe to folders using sogo-tool
- [eas] added photo support for GAL search operations
- [web] added custom fields support from Thunderbird's address book
- [web] updated CKEditor to version 4.7.0
- [web] added Latvian (lv) translation - thanks to Juris Balandis
Bug fixes
- [core] fixed calendar component move across collections (#4116)
- [core] handle properly mails using windows-1255 charset (#4124)
- [core] properly honor the "include in freebusy" setting (#3354)
- [core] make sure to use crypt scheme when encoding md5/sha256/sha512 (#4137)
- [core] newly subscribed calendars are excluded from freebusy (#3354)
- [core] strip cr during LDIF import process (#4172)
- [web] fixed mail delegation of pristine user accounts (#4160)
- [web] respect SOGoLanguage and SOGoSupportedLanguages (#4169)
- [eas] fixed opacity in EAS freebusy (#4033)
- [eas] set reply/forwarded flags when ReplaceMime is set (#4133)
- [eas] remove alarms over EAS if we don't want them (#4059)
- [eas] correctly set RSVP on event invitations
- [eas] avoid sending IMIP request/update messages for all EAS clients (#4022)
2.3.20 (2017-03-10)
-------------------
@@ -71,7 +71,7 @@
iCalByDayMask *dayMask;
BOOL hasRepeatCount;
[self logWithFormat: @"Weekly %@", rrule];
// [self logWithFormat: @"Weekly %@", rrule];
firStart = [firstRange startDate];
startDate = [_r startDate];
@@ -187,7 +187,7 @@
if ([_r doesIntersectWithDateRange: r])
{
[ranges addObject: r];
[self logWithFormat: @"Add range %@ - %@", [r startDate], [r endDate]];
// [self logWithFormat: @"Add range %@ - %@", [r startDate], [r endDate]];
}
}
}
@@ -18,10 +18,14 @@ vtodo_class2 = "(Confidential task)";
"calendar_label" = "Calendar";
"startDate_label" = "Start";
"endDate_label" = "End";
"time_label" = "Time";
"to_label" = "to";
"due_label" = "Due Date";
"location_label" = "Location";
"summary_label" = "Summary";
"comment_label" = "Comment";
"organizer_label" = "Organizer";
"attendee_label" = "Attendee";
/* Invitation */
"Event Invitation: \"%{Summary}\"" = "Event Invitation: \"%{Summary}\"";
"(sent by %{SentBy}) " = "(sent by %{SentBy}) ";
@@ -18,10 +18,14 @@ vtodo_class2 = "(Tâche confidentielle)";
"calendar_label" = "Agenda ";
"startDate_label" = "Début ";
"endDate_label" = "Fin ";
"time_label" = "Date";
"to_label" = "au";
"due_label" = "Fin prévue :";
"location_label" = "Lieu ";
"summary_label" = "Titre :";
"comment_label" = "Description :";
"organizer_label" = "Organisateur";
"attendee_label" = "Participants ";
/* Invitation */
"Event Invitation: \"%{Summary}\"" = "Invitation à la réunion : «%{Summary}»";
"(sent by %{SentBy}) " = "(envoyé par %{SentBy}) ";
@@ -22,6 +22,8 @@ vtodo_class2 = "(Vertrauliche Aufgabe)";
"location_label" = "Ort";
"summary_label" = "Zusammenfassung:";
"comment_label" = "Kommentar:";
"organizer_label" = "Organisator";
"attendee_label" = "Teilnehmer";
/* Invitation */
"Event Invitation: \"%{Summary}\"" = "Termineinladung: \"%{Summary}\"";
"(sent by %{SentBy}) " = "(gesendet von %{SentBy}) ";
@@ -0,0 +1,64 @@
"Inviting the following persons is prohibited:" = "Šo personu uzaicināšana ir aizliegta:";
"Personal Calendar" = "Personiskais kalendārs";
vevent_class0 = "(Publisks notikums)";
vevent_class1 = "(Privāts notikums)";
vevent_class2 = "(Konfidenciāls notikums)";
vtodo_class0 = "(Publisks uzdevums)";
vtodo_class1 = "(Privāts uzdevums)";
vtodo_class2 = "(Konfidenciāls uzdevums)";
/* Receipts */
"The event \"%{Summary}\" was created" = "Notikums \"%{Summary}\" ir izveidots";
"The event \"%{Summary}\" was deleted" = "Notikums \"%{Summary}\" ir dzēsts";
"The event \"%{Summary}\" was updated" = "Notikums \"%{Summary}\" ir atjaunināts";
"The following attendees(s) were notified" = "Paziņojums nosūtīts šiem dalībniekiem";
"The following attendees(s) were added" = "Pievienoti šādi dalībnieki";
"The following attendees(s) were removed" = "Dzēsti šādi dalībnieki";
/* IMIP messages */
"calendar_label" = "Kalendārs";
"startDate_label" = "Sākums";
"endDate_label" = "Beigas";
"time_label" = "Laiks";
"to_label" = "kam";
"due_label" = "Gala termiņš";
"location_label" = "Vieta";
"summary_label" = "Kopsavilkums";
"comment_label" = "Komentārs";
"organizer_label" = "Organizētājs";
"attendee_label" = "Dalībnieks";
/* Invitation */
"Event Invitation: \"%{Summary}\"" = "Pasākuma ielūgums: \"%{Summary}\"";
"(sent by %{SentBy}) " = "(sūtīja %{SentBy}) ";
"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}" = "%{Organizer} %{SentByText} ielūdza Jūs uz %{Summary}.\n\nSākums: %{StartDate}\nBeigas: %{EndDate}\nApraksts: %{Description}";
"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" = "%{Organizer} %{SentByText} ielūdza Jūs uz %{Summary}.\n\nSākums: %{StartDate} %{StartTime}\nBeigas: %{EndDate} %{EndTime}\nApraksts: %{Description}";
/* Deletion */
"Event Cancelled: \"%{Summary}\"" = "Atcelts pasākums: \"%{Summary}\"";
"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}"
= "%{Organizer} %{SentByText} atcēla notikumu: %{Summary}.\n\nSākums: %{StartDate}\nBeigas: %{EndDate}\nApraksts: %{Description}";
"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"
= "%{Organizer} %{SentByText} atcēla notikumu: %{Summary}.\n\nSākums: %{StartDate} %{StartTime}\nBeigas: %{EndDate} %{EndTime}\nApraksts: %{Description}";
/* Update */
"The appointment \"%{Summary}\" for the %{OldStartDate} has changed"
= "Tikšanās \"%{Summary}\" %{OldStartDate} ir mainīta";
"The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed"
= "Tikšanās \"%{Summary}\" %{OldStartDate} %{OldStartTime} ir mainīta";
"The following parameters have changed in the \"%{Summary}\" meeting:"
= "Plānotā tikšanās \"%{Summary}\" ir mainīta, ir veiktas šādas izmaiņas:";
"Please accept or decline those changes."
= "Lūdzu pieņemt vai noraidīt šīs izmaiņas.";
/* Reply */
"Accepted invitation: \"%{Summary}\"" = "Akceptēt uzaicinājumu: \"%{Summary}\"";
"Declined invitation: \"%{Summary}\"" = "Noraidīt uzaicinājumu: \"%{Summary}\"";
"Delegated invitation: \"%{Summary}\"" = "Deleģēt uzaicinājumu: \"%{Summary}\"";
"Not yet decided on invitation: \"%{Summary}\"" = "Vēl nav izlemts par uzaicinājumu: \"%{Summary}\"";
"%{Attendee} %{SentByText}has accepted your event invitation."
= "%{Attendee} %{SentByText}ir akceptējis uzaicinājumu piedalīties pasākumā.";
"%{Attendee} %{SentByText}has declined your event invitation."
= "%{Attendee} %{SentByText} ir noraidījis jūsu uzaicinājumu piedalīties pasākumā.";
"%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}."
= "%{Attendee} %{SentByText} deleģējusi uzaicinājumu %{Delegate}.";
"%{Attendee} %{SentByText}has not yet decided upon your event invitation."
= "%{Attendee} %{SentByText} vēl nav izlemts par jūsu uzaicinājumu piedalīties pasākumā.";
/* Resources */
"Cannot access resource: \"%{Cn} %{SystemEmail}\"" = "Nevar piekļūt resursiem: \"%{Cn} %{SystemEmail}\"";
"Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\". The conflicting event is \"%{EventTitle}\", and starts on %{StartDate}." = "Maksimālais skaits vienlaicīgām rezervācijām (%{NumberOfSimultaneousBookings}) sasniedza resursu \"%{Cn} %{SystemEmail}\". Strīdu notikums ir \"%{EventTitle}\", un sākas %{StartDate}.";
@@ -18,10 +18,14 @@ vtodo_class2 = "(Zadanie poufne)";
"calendar_label" = "Kalendarz";
"startDate_label" = "Początek";
"endDate_label" = "Koniec";
"time_label" = "Data";
"to_label" = "do";
"due_label" = "Termin";
"location_label" = "Miejsce";
"summary_label" = "Podsumowanie";
"comment_label" = "Komentarz";
"organizer_label" = "Organizator";
"attendee_label" = "Uczestnik";
/* Invitation */
"Event Invitation: \"%{Summary}\"" = "Zaproszenie na wydarzenie: \"%{Summary}\"";
"(sent by %{SentBy}) " = "(wysłane przez %{SentBy}) ";
+105 -26
View File
@@ -434,6 +434,93 @@ static Class iCalEventK = nil;
inCategory: @"FolderShowTasks"];
}
- (BOOL) subscribeUserOrGroup: (NSString *) theIdentifier
reallyDo: (BOOL) reallyDo
response: (WOResponse *) theResponse
{
NSMutableDictionary *moduleSettings, *folderShowAlarms, *freeBusyExclusions;
NSString *subscriptionPointer;
NSMutableArray *allUsers;
SOGoUserSettings *us;
NSDictionary *dict;
SOGoUser *sogoUser;
BOOL rc;
int i;
rc = [super subscribeUserOrGroup: theIdentifier reallyDo: reallyDo response: theResponse];
if (rc)
{
dict = [[SOGoUserManager sharedUserManager] contactInfosForUserWithUIDorEmail: theIdentifier];
if ([[dict objectForKey: @"isGroup"] boolValue])
{
SOGoGroup *aGroup;
aGroup = [SOGoGroup groupWithIdentifier: theIdentifier
inDomain: [[context activeUser] domain]];
allUsers = [NSMutableArray arrayWithArray: [aGroup members]];
// We remove the active user from the group (if present) in order to
// not subscribe him to their own resource!
[allUsers removeObject: [context activeUser]];
}
else
{
sogoUser = [SOGoUser userWithLogin: theIdentifier roles: nil];
if (sogoUser)
allUsers = [NSArray arrayWithObject: sogoUser];
else
allUsers = [NSArray array];
}
for (i = 0; i < [allUsers count]; i++)
{
sogoUser = [allUsers objectAtIndex: i];
us = [sogoUser userSettings];
moduleSettings = [us objectForKey: [container nameInContainer]];
if (!(moduleSettings
&& [moduleSettings isKindOfClass: [NSMutableDictionary class]]))
{
moduleSettings = [NSMutableDictionary dictionary];
[us setObject: moduleSettings forKey: [container nameInContainer]];
}
subscriptionPointer = [self folderReference];
folderShowAlarms = [moduleSettings objectForKey: @"FolderShowAlarms"];
freeBusyExclusions = [moduleSettings objectForKey: @"FreeBusyExclusions"];
if (reallyDo)
{
if (!(folderShowAlarms
&& [folderShowAlarms isKindOfClass: [NSMutableDictionary class]]))
{
folderShowAlarms = [NSMutableDictionary dictionary];
[moduleSettings setObject: folderShowAlarms
forKey: @"FolderShowAlarms"];
}
// By default, we disable alarms on subscribed calendars
[folderShowAlarms setObject: [NSNumber numberWithBool: NO]
forKey: subscriptionPointer];
}
else
{
[folderShowAlarms removeObjectForKey: subscriptionPointer];
[freeBusyExclusions removeObjectForKey: subscriptionPointer];
}
[us synchronize];
rc = YES;
}
}
return rc;
}
//
// If the user is the owner of the calendar, by default we include the freebusy information.
//
@@ -444,43 +531,35 @@ static Class iCalEventK = nil;
//
- (BOOL) includeInFreeBusy
{
NSString *userLogin, *subscriptionReference;
NSNumber *excludeFromFreeBusy;
BOOL is_owner, is_subscription;
NSString *userLogin, *ownerInContext;
BOOL is_owner;
userLogin = [[context activeUser] login];
is_owner = [userLogin isEqualToString: self->owner];
ownerInContext = [[self container] ownerInContext: context];
is_owner = [userLogin isEqualToString: ownerInContext];
// We check if we're subscribed. We must NOT use here [self isSubscribed] as it'll look
// at the owner's settings, and not the activeUser's settings.
subscriptionReference = [NSString stringWithFormat: @"%@:Calendar/%@", self->owner, [self nameInContainer]];
is_subscription = [[[[[self->context activeUser] userSettings] objectForKey: @"Calendar"] objectForKey: @"SubscribedFolders"] containsObject: subscriptionReference];
// Check if the owner (not the active user) has excluded the calendar from her/his free busy data.
excludeFromFreeBusy
= [self folderPropertyValueInCategory: @"FreeBusyExclusions"
forUser: [context activeUser]];
if (is_owner)
excludeFromFreeBusy
= [self folderPropertyValueInCategory: @"FreeBusyExclusions"
forUser: [context activeUser]];
else
excludeFromFreeBusy
= [self folderPropertyValueInCategory: @"FreeBusyExclusions"
forUser: [SOGoUser userWithLogin: ownerInContext]];
if (is_subscription)
// User has not setting for freebusy inclusion/exclusion,
// * include it if it's a personal folder;
// * exclude it if it's a subscription.
if (!excludeFromFreeBusy)
{
// If the user has not yet set an include/not include fb information let's EXCLUDE it.
if (!excludeFromFreeBusy)
if ([self isSubscription])
return NO;
else
return ![excludeFromFreeBusy boolValue];
}
else if (is_owner)
{
// We are the owner but we haven't included/excluded freebusy info, let's INCLUDE it.
if (!excludeFromFreeBusy)
return YES;
else
return ![excludeFromFreeBusy boolValue];
}
// It's not a subscribtion and we aren't the owner. Let's INCLUDE the freebusy info.
return YES;
return ![excludeFromFreeBusy boolValue];
}
- (void) setIncludeInFreeBusy: (BOOL) newInclude
+12 -8
View File
@@ -1808,16 +1808,16 @@ inRecurrenceExceptionsForEvent: (iCalEvent *) theEvent
uid = [[event organizer] uidInContext: context];
if (uid)
{
iCalPerson *attendee, *organizer;
NSDictionary *defaultIdentity;
SOGoUser *organizerUser;
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"]];
organizerUser = [SOGoUser userWithLogin: uid];
defaultIdentity = [organizerUser defaultIdentity];
organizer = [[event organizer] copy];
[organizer setCn: [defaultIdentity objectForKey: @"fullName"]];
[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)
@@ -1827,9 +1827,13 @@ inRecurrenceExceptionsForEvent: (iCalEvent *) theEvent
for (j = [allAttendees count]-1; j >= 0; j--)
{
attendee = [allAttendees objectAtIndex: j];
if ([organizer hasEmail: [attendee rfc822Email]])
if ([organizerUser hasEmail: [attendee rfc822Email]])
[event removeFromAttendees: attendee];
}
// We reset the organizer
[event setOrganizer: organizer];
RELEASE(organizer);
}
}
}
@@ -27,6 +27,7 @@
#import <NGObjWeb/WOActionResults.h>
#import <NGObjWeb/WOContext+SoObjects.h>
#import <NGObjWeb/WOResponse.h>
#import <NGExtensions/NSCalendarDate+misc.h>
#import <NGExtensions/NSObject+Logs.h>
#import <NGCards/iCalEvent.h>
#import <NGCards/iCalPerson.h>
@@ -186,6 +187,19 @@
return sentByText;
}
- (NSTimeInterval) duration
{
return [[self newEndDate] timeIntervalSinceDate:[self newStartDate]];
}
- (BOOL) isEndDateOnSameDay
{
if ([[self apt] isAllDay])
return ([self duration] <= 86400);
return [[self newStartDate] isDateOnSameDay: [self newEndDate]];
}
- (NSString *) formattedAptStartDate
{
NSString *s;
+47 -49
View File
@@ -579,17 +579,6 @@
[allAttendees addObject: person];
}
}
else
{
// We remove any attendees matching the organizer. Apple iCal will do that when
// you invite someone. It'll add the organizer in the attendee list, which will
// confuse itself!
if ([[currentAttendee rfc822Email] caseInsensitiveCompare: organizerEmail] == NSOrderedSame)
{
[allAttendees removeObject: currentAttendee];
eventWasModified = YES;
}
}
j++;
} // while (currentAttendee ...
@@ -799,6 +788,15 @@
if ([object firstChildWithTag: @"X-SOGo-Send-Appointment-Notifications"])
return;
// We never send IMIP inivitaton/deletion/update when the "initiator" is an EAS client.
// That is because Outlook, iOS and Android will always issue a SendMail command
// with the meeting details (ie., IMIP message with METHOD:REQUEST) so there's
// no need to send it twice. Moreover, Outlook users can also choose to NOT send
// the IMIP messsage at all, so SOGo won't send one without user's consent
if ([[[context request] requestHandlerKey] isEqualToString: @"Microsoft-Server-ActiveSync"])
return;
ownerUser = [SOGoUser userWithLogin: owner];
dd = [ownerUser domainDefaults];
if ([dd appointmentSendEMailNotifications] && [object isStillRelevant])
@@ -1208,6 +1206,36 @@
return uids;
}
- (NSException *) _copyComponent: (iCalCalendar *) calendar
toFolder: (SOGoGCSFolder *) newFolder
updateUID: (BOOL) updateUID
{
NSString *newUID;
SOGoCalendarComponent *newComponent;
if (updateUID)
{
NSArray *elements;
unsigned int count, max;
newUID = [self globallyUniqueObjectId];
elements = [calendar allObjects];
max = [elements count];
for (count = 0; count < max; count++)
[[elements objectAtIndex: count] setUid: newUID];
}
else
{
newUID = [[[calendar allObjects] objectAtIndex: 0] uid];
}
newComponent = [[self class] objectWithName:
[NSString stringWithFormat: @"%@.ics", newUID]
inContainer: newFolder];
return [newComponent saveCalendar: calendar];
}
- (NSException *) copyToFolder: (SOGoGCSFolder *) newFolder
{
return [self copyComponent: [self calendar: NO secure: NO]
@@ -1217,51 +1245,21 @@
- (NSException *) copyComponent: (iCalCalendar *) calendar
toFolder: (SOGoGCSFolder *) newFolder
{
NSArray *elements;
NSString *newUID;
unsigned int count, max;
SOGoCalendarComponent *newComponent;
newUID = [self globallyUniqueObjectId];
elements = [calendar allObjects];
max = [elements count];
for (count = 0; count < max; count++)
[[elements objectAtIndex: count] setUid: newUID];
newComponent = [[self class] objectWithName:
[NSString stringWithFormat: @"%@.ics", newUID]
inContainer: newFolder];
return [newComponent saveCalendar: calendar];
return [self _copyComponent: calendar
toFolder: newFolder
updateUID: YES];
}
- (NSException *) moveToFolder: (SOGoGCSFolder *) newFolder
{
SOGoCalendarComponent *newComponent;
NSException *ex;
id o;
// 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];
ex = [self _copyComponent: [self calendar: NO secure: NO]
toFolder: newFolder
updateUID: NO];
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."];
}
if (!ex)
ex = [self delete];
return ex;
}
+7 -3
View File
@@ -317,6 +317,7 @@
to: (NSCalendarDate *) endDate
{
SOGoAppointmentFolder *calFolder;
SOGoAppointmentFolders *calFolders;
SOGoUser *user;
SOGoUserDefaults *ud;
NSArray *folders;
@@ -326,9 +327,12 @@
infos = [NSMutableArray array];
folders = [[container lookupName: @"Calendar"
inContext: context
acquire: NO] subFolders];
calFolders = [container lookupName: @"Calendar"
inContext: context
acquire: NO];
[calFolders appendSubscribedSources];
folders = [calFolders subFolders];
max = [folders count];
for (count = 0; count < max; count++)
{
@@ -11,33 +11,37 @@ vtodo_class2 = "(Gizli görev)";
"The event \"%{Summary}\" was created" = "\"%{Summary}\" etkinliği oluşturuldu";
"The event \"%{Summary}\" was deleted" = "\"%{Summary}\" etkinliği silindi";
"The event \"%{Summary}\" was updated" = "\"%{Summary}\" etkinliği güncellendi";
"The following attendees(s) were notified" = "Şu katılımcı(lar) haberdar edilidi";
"The following attendees(s) were notified" = "Şu katılımcı(lar) bilgilendirildi";
"The following attendees(s) were added" = "Şu katılımcılar eklendi";
"The following attendees(s) were removed" = "Şu katılımcılar çıkarıldı";
/* IMIP messages */
"calendar_label" = "Takvim";
"startDate_label" = "Başlangıç";
"endDate_label" = "Bitiş";
"time_label" = "Saat";
"to_label" = "alıcı";
"due_label" = "Kapanış Tarihi";
"location_label" = "Konum";
"summary_label" = "Özet";
"comment_label" = "Açıklama";
"organizer_label" = "Düzenleyen";
"attendee_label" = "Katılımcı";
/* Invitation */
"Event Invitation: \"%{Summary}\"" = "Etkinlik Daveti: \"%{Summary}\"";
"(sent by %{SentBy}) " = "(%{SentBy} tarafından gönderilidi) ";
"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}" = "%{Organizer} %{SentByText}sizi %{Summary} etkinliğine davet etti.\n\nBaşlangıç: %{StartDate}\nBitiş: %{EndDate}\nTanım: %{Description}";
"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" = "%{Organizer} %{SentByText}sizi %{Summary} etkinliğine davet etti.\n\nBaşlangıç: %{StartDate} saat %{StartTime}\nBitiş: %{EndDate} saat %{EndTime}\nTanım: %{Description}";
"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" = "%{Organizer} %{SentByText} sizi %{Summary} etkinliğine davet etti.\n\nBaşlangıç Tarihi: %{StartDate} saat %{StartTime}\nBitiş Tarihi: %{EndDate} saat %{EndTime}\nAçıklama: %{Description}";
/* Deletion */
"Event Cancelled: \"%{Summary}\"" = "Etkinlik İptal Edildi: \"%{Summary}\"";
"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}"
= "%{Organizer} %{SentByText}şu etkiliği iptal etti: %{Summary}.\n\nBaşlangıç: %{StartDate}\nBitiş: %{EndDate}\nTanım: %{Description}";
"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"
= "%{Organizer} %{SentByText}şu etkinliği iptal etti: %{Summary}.\n\nBaşlangıç: %{StartDate} saat %{StartTime}\nBitiş: %{EndDate} saat %{EndTime}\nTanım: %{Description}";
= "%{Organizer} %{SentByText} %{Summary} etkinliğini iptal etti.\n\nBaşlangıç Tarihi: %{StartDate} saat %{StartTime}\nBitiş Tarihi: %{EndDate} saat %{EndTime}\nAçıklama: %{Description}";
/* Update */
"The appointment \"%{Summary}\" for the %{OldStartDate} has changed"
= "%{OldStartDate} tarihindeki \"%{Summary}\" çalışması değişti";
"The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed"
= " %{OldStartDate} tarihli ve %{OldStartTime} başlangıç saatli \"%{Summary}\" çalışması değişti";
= " %{OldStartDate} tarihli ve %{OldStartTime} başlangıç saatli \"%{Summary}\" çalışması değiştirildi";
"The following parameters have changed in the \"%{Summary}\" meeting:"
= "\"%{Summary}\" buluşmasının şu özellikleri değişti:";
"Please accept or decline those changes."
@@ -0,0 +1,2 @@
"Personal Address Book" = "Personiskā adrešu grāmata";
"Collected Address Book" = "Savāktā adrešu grāmata";
+5 -1
View File
@@ -1,6 +1,6 @@
/* NGVCard+SOGo.h - this file is part of SOGo
*
* Copyright (C) 2009-2014 Inverse inc.
* 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
@@ -45,6 +45,10 @@
- (NSString *) pager;
- (NSCalendarDate *) birthday;
- (void) addElementWithTag: (NSString *) elementTag
ofType: (NSString *) type
withValue: (id) value;
@end
#endif /* NGVCARD_SOGO_H */
+80 -1
View File
@@ -217,9 +217,9 @@ convention:
- (void) updateFromLDIFRecord: (NSDictionary *) ldifRecord
{
NSInteger year, yearOfToday, month, day;
NSArray *units, *elements;
CardElement *element;
NSCalendarDate *now;
NSArray *units;
NSString *fn, *ou;
id o;
@@ -320,6 +320,43 @@ convention:
else
[self setCategories: [o componentsSeparatedByString: @","]];
// Custom fields from Thunderbird
if ((o = [ldifRecord objectForKey: @"custom1"]))
{
elements = [self childrenWithTag: @"custom1"];
[self removeChildren: elements];
if ([o length])
[self addElementWithTag: @"custom1" ofType: nil withValue: o];
}
if ((o = [ldifRecord objectForKey: @"custom2"]))
{
elements = [self childrenWithTag: @"custom2"];
[self removeChildren: elements];
if ([o length])
[self addElementWithTag: @"custom2" ofType: nil withValue: o];
}
if ((o = [ldifRecord objectForKey: @"custom3"]))
{
elements = [self childrenWithTag: @"custom3"];
[self removeChildren: elements];
if ([o length])
[self addElementWithTag: @"custom3" ofType: nil withValue: o];
}
if ((o = [ldifRecord objectForKey: @"custom4"]))
{
elements = [self childrenWithTag: @"custom4"];
[self removeChildren: elements];
if ([o length])
[self addElementWithTag: @"custom4" ofType: nil withValue: o];
}
[self cleanupEmptyChildren];
}
@@ -646,6 +683,19 @@ convention:
dn = @"";
[ldifRecord setObject: dn forKey: @"dn"];
// Custom fields from Thunderbird
if ((stringValue = [[self uniqueChildWithTag: @"custom1"] flattenedValuesForKey: @""]) && [stringValue length])
[ldifRecord setObject: stringValue forKey: @"custom1"];
if ((stringValue = [[self uniqueChildWithTag: @"custom2"] flattenedValuesForKey: @""]) && [stringValue length])
[ldifRecord setObject: stringValue forKey: @"custom2"];
if ((stringValue = [[self uniqueChildWithTag: @"custom3"] flattenedValuesForKey: @""]) && [stringValue length])
[ldifRecord setObject: stringValue forKey: @"custom3"];
if ((stringValue = [[self uniqueChildWithTag: @"custom4"] flattenedValuesForKey: @""]) && [stringValue length])
[ldifRecord setObject: stringValue forKey: @"custom4"];
return ldifRecord;
}
@@ -871,4 +921,33 @@ convention:
return fields;
}
- (void) addElementWithTag: (NSString *) elementTag
ofType: (NSString *) type
withValue: (id) value
{
NSArray *allValues;
NSEnumerator *list;
CardElement *element;
// value is either an array or a string
if ([value isKindOfClass: [NSString class]])
allValues = [NSArray arrayWithObject: value];
else
allValues = value;
// Add all values as separate elements
list = [allValues objectEnumerator];
while ((value = [list nextObject]))
{
if ([type length])
element = [CardElement simpleElementWithTag: elementTag
singleType: type
value: value];
else
element = [CardElement simpleElementWithTag: elementTag
value: value];
[self addChild: element];
}
}
@end /* NGVCard */
+2
View File
@@ -77,6 +77,8 @@ Mailer_RESOURCE_FILES += \
SOGoMailIcelandicReply.wo \
SOGoMailItalianForward.wo \
SOGoMailItalianReply.wo \
SOGoMailLatvianForward.wo \
SOGoMailLatvianReply.wo \
SOGoMailLithuanianForward.wo \
SOGoMailLithuanianReply.wo \
SOGoMailMacedonianForward.wo \
@@ -0,0 +1,2 @@
"OtherUsersFolderName" = "Citi lietotāji";
"SharedFoldersName" = "Koplietotās mapes";
+11 -6
View File
@@ -999,13 +999,20 @@ static NSString *inboxFolderName = @"INBOX";
- (void) _setDelegates: (NSArray *) newDelegates
{
NSMutableDictionary *mailSettings;
SOGoUser *ownerUser;
SOGoUserSettings *settings;
ownerUser = [SOGoUser userWithLogin: [self ownerInContext: context]];
settings = [ownerUser userSettings];
[[settings objectForKey: @"Mail"] setObject: newDelegates
forKey: @"DelegateTo"];
mailSettings = [settings objectForKey: @"Mail"];
if (!mailSettings)
{
mailSettings = [NSMutableDictionary dictionaryWithCapacity: 1];
[settings setObject: mailSettings forKey: @"Mail"];
}
[mailSettings setObject: newDelegates
forKey: @"DelegateTo"];
[settings synchronize];
}
@@ -1052,11 +1059,9 @@ static NSString *inboxFolderName = @"INBOX";
{
currentDelegate = [oldDelegates objectAtIndex: count];
delegateUser = [SOGoUser userWithLogin: currentDelegate];
[delegates removeObject: currentDelegate];
if (delegateUser)
{
[delegates removeObject: currentDelegate];
[delegateUser removeMailDelegator: owner];
}
[delegateUser removeMailDelegator: owner];
}
[self _setDelegates: delegates];
+3
View File
@@ -88,6 +88,9 @@
@interface SOGoMailItalianForward : SOGoMailForward
@end
@interface SOGoMailLatvianForward : SOGoMailForward
@end
@interface SOGoMailLithuanianForward : SOGoMailForward
@end
+3
View File
@@ -299,6 +299,9 @@
@implementation SOGoMailItalianForward
@end
@implementation SOGoMailLatvianForward
@end
@implementation SOGoMailLithuanianForward
@end
@@ -0,0 +1,16 @@
<#newLine/>
<#newLine/>
<#signaturePlacementOnTop><#newLine/>
<#signature/><#newLine/></#signaturePlacementOnTop>
-------- Sākotnējais ziņojums --------<#newLine/>
Temats: <#subject/><#newLine/>
Datums: <#date/><#newLine/>
No: <#from/><#newLine/>
<#hasReplyTo>Atbildēt uz: <#replyTo/></#hasReplyTo><#hasOrganization>Organizācija: <#organization/></#hasOrganization>Kam: <#to/><#newLine/>
<#hasCc>Kopija: <#cc/></#hasCc><#hasNewsGroups>Intereškopas: <#newsgroups/></#hasNewsGroups><#hasReferences>Atsauces: <#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>-------- Sākotnējais ziņojums --------<#newLine/>
Temats: <#subject/><#newLine/>
Datums: <#date/><#newLine/>
No: <#from/><#newLine/>
<#hasReplyTo>Atbildēt uz: <#replyTo/></#hasReplyTo><#hasOrganization>Organizācija: <#organization/></#hasOrganization>Kam: <#to/><#newLine/>
<#hasCc>Kopija: <#cc/></#hasCc><#hasNewsGroups>Intereškopas: <#newsgroups/></#hasNewsGroups><#hasReferences>Atsauces: <#references/></#hasReferences></#outlookMode><#newLine/>
<#standardMode><#date/>, <#from/> rakstīja:</#standardMode><#newLine/>
<#newLine/>
<#messageBody/><#newLine/>
<#replyPlacementOnBottom><#newLine/>
<#newLine/>
</#replyPlacementOnBottom><#signaturePlacementOnBottom><#signature/></#signaturePlacementOnBottom><#newLine/>
@@ -0,0 +1,106 @@
outlookMode: WOConditional {
condition = outlookMode;
}
standardMode: WOConditional {
condition = outlookMode;
negate = YES;
}
subject: WOString {
value = subject;
escapeHTML = NO;
}
date: WOString {
value = date;
escapeHTML = NO;
}
from: WOString {
value = from;
escapeHTML = NO;
}
newLine: WOString {
value = newLine;
escapeHTML = NO;
}
hasReplyTo: WOConditional {
condition = hasReplyTo;
}
replyTo: WOString {
value = replyTo;
escapeHTML = NO;
}
hasOrganization: WOConditional {
condition = hasOrganization;
}
organization: WOString {
value = organization;
escapeHTML = NO;
}
to: WOString {
value = to;
escapeHTML = NO;
}
hasCc: WOConditional {
condition = hasCc;
}
cc: WOString {
value = cc;
escapeHTML = NO;
}
hasNewsGroups: WOConditional {
condition = hasNewsGroups;
}
newsgroups: WOString {
value = newsgroups;
escapeHTML = NO;
}
hasReferences: WOConditional {
condition = hasReferences;
}
references: WOString {
value = references;
escapeHTML = NO;
}
messageBody: WOString {
value = messageBody;
escapeHTML = NO;
}
signature: WOString {
value = signature;
escapeHTML = NO;
}
replyPlacementOnTop: WOConditional {
condition = replyPlacementOnTop;
}
replyPlacementOnBottom: WOConditional {
condition = replyPlacementOnTop;
negate = YES;
}
signaturePlacementOnTop: WOConditional {
condition = signaturePlacementOnTop;
}
signaturePlacementOnBottom: WOConditional {
condition = signaturePlacementOnTop;
negate = YES;
}
+3
View File
@@ -87,6 +87,9 @@
@interface SOGoMailItalianReply : SOGoMailReply
@end
@interface SOGoMailLatvianReply : SOGoMailReply
@end
@interface SOGoMailLithuanianReply : SOGoMailReply
@end
+3
View File
@@ -135,6 +135,9 @@
@implementation SOGoMailItalianReply
@end
@implementation SOGoMailLatvianReply
@end
@implementation SOGoMailLithuanianReply
@end
+9 -2
View File
@@ -75,11 +75,18 @@
- (void) _setMailDelegators: (NSArray *) newDelegators
{
NSMutableDictionary *mailSettings;
SOGoUserSettings *settings;
settings = [self userSettings];
[[settings objectForKey: @"Mail"] setObject: newDelegators
forKey: @"DelegateFrom"];
mailSettings = [settings objectForKey: @"Mail"];
if (!mailSettings)
{
mailSettings = [NSMutableDictionary dictionaryWithCapacity: 1];
[settings setObject: mailSettings forKey: @"Mail"];
}
[mailSettings setObject: newDelegators
forKey: @"DelegateFrom"];
[settings synchronize];
}
+7
View File
@@ -606,6 +606,13 @@ groupObjectClasses: (NSArray *) newGroupObjectClasses
return nil;
}
if ([_userPasswordAlgorithm caseInsensitiveCompare: @"md5-crypt"] == NSOrderedSame ||
[_userPasswordAlgorithm caseInsensitiveCompare: @"sha256-crypt"] == NSOrderedSame ||
[_userPasswordAlgorithm caseInsensitiveCompare: @"sha512-crypt"] == NSOrderedSame)
{
_userPasswordAlgorithm = @"crypt";
}
return [NSString stringWithFormat: @"{%@}%@", _userPasswordAlgorithm, pass];
}
+2
View File
@@ -38,6 +38,7 @@
SOGoEnableDomainBasedUID = NO;
SOGoLoginModule = "Mail";
WODefaultLanguages = ();
SOGoLanguage = "English";
SOGoSupportedLanguages = (
"Arabic",
@@ -57,6 +58,7 @@
"Hungarian",
"Icelandic",
"Italian",
"Latvian",
"Lithuanian",
"Macedonian",
"NorwegianBokmal",
+8 -15
View File
@@ -388,7 +388,9 @@ static NSArray *childRecordFields = nil;
dd = [[context activeUser] domainDefaults];
displayNameFormat = [dd subscriptionFolderFormat];
name = [folderSubscriptionValues keysWithFormat: displayNameFormat];
// Use a format only if it was defined by the user
if (displayNameFormat)
name = [folderSubscriptionValues keysWithFormat: displayNameFormat];
}
return name;
@@ -968,8 +970,12 @@ static NSArray *childRecordFields = nil;
folderSubscription = [moduleSettings objectForKey: @"SubscribedFolders"];
subscriptionPointer = [self folderReference];
// We used to set "show alarms" for any type of folder, so we remove it
// here and let the subclass handle it (SOGoAppointmentFolder).
folderShowAlarms = [moduleSettings objectForKey: @"FolderShowAlarms"];
if (folderShowAlarms)
[folderShowAlarms removeObjectForKey: subscriptionPointer];
if (reallyDo)
{
@@ -981,30 +987,17 @@ static NSArray *childRecordFields = nil;
forKey: @"SubscribedFolders"];
}
if (!(folderShowAlarms
&& [folderShowAlarms isKindOfClass: [NSMutableDictionary class]]))
{
folderShowAlarms = [NSMutableDictionary dictionary];
[moduleSettings setObject: folderShowAlarms
forKey: @"FolderShowAlarms"];
}
[self setFolderPropertyValue: [self _displayNameFromSubscriber]
inCategory: @"FolderDisplayNames"
settings: us];
[folderSubscription addObjectUniquely: subscriptionPointer];
// By default, we disable alarms on subscribed calendars
[folderShowAlarms setObject: [NSNumber numberWithBool: NO]
forKey: subscriptionPointer];
}
else
{
[self removeFolderSettings: moduleSettings
withReference: subscriptionPointer];
[folderSubscription removeObject: subscriptionPointer];
[folderShowAlarms removeObjectForKey: subscriptionPointer];
}
[us synchronize];
+7 -3
View File
@@ -369,9 +369,13 @@
// 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)];
{
r1 = [cleaned_message rangeOfCString: "\r\nBcc: "
options: 0
range: NSMakeRange(0,limit)];
if (r1.location != NSNotFound)
r1.location += 2;
}
if (r1.location != NSNotFound)
{
+7 -1
View File
@@ -1,6 +1,6 @@
/* SOGoParentFolder.m - this file is part of SOGo
*
* Copyright (C) 2006-2015 Inverse inc.
* Copyright (C) 2006-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
@@ -323,6 +323,12 @@ static SoSecurityManager *sm = nil;
int i;
BOOL dirty;
if (!subscribedSubFolders)
subscribedSubFolders = [NSMutableDictionary new];
if (!subFolderClass)
subFolderClass = [[self class] subFolderClass];
error = nil; /* we ignore non-DB errors at this time... */
dirty = NO;
+1
View File
@@ -109,6 +109,7 @@
- (int) internalSyncInterval;
- (int) maximumSyncWindowSize;
- (int) maximumSyncResponseSize;
- (int) maximumPictureSize;
@end
+15
View File
@@ -699,4 +699,19 @@ _injectConfigurationFromFile (NSMutableDictionary *defaultsDict,
return v;
}
//
// See https://msdn.microsoft.com/en-us/library/gg672032(v=exchg.80).aspx
//
- (int) maximumPictureSize
{
int v;
v = [self integerForKey: @"SOGoMaximumPictureSize"];
if (!v)
v = 102400;
return v;
}
@end
+7
View File
@@ -197,6 +197,13 @@
return nil;
}
if ([_userPasswordAlgorithm caseInsensitiveCompare: @"md5-crypt"] == NSOrderedSame ||
[_userPasswordAlgorithm caseInsensitiveCompare: @"sha256-crypt"] == NSOrderedSame ||
[_userPasswordAlgorithm caseInsensitiveCompare: @"sha512-crypt"] == NSOrderedSame)
{
_userPasswordAlgorithm = @"crypt";
}
if (_prependPasswordScheme)
result = [NSString stringWithFormat: @"{%@}%@", _userPasswordAlgorithm, pass];
else
+19 -9
View File
@@ -26,6 +26,7 @@
#import <NGObjWeb/WOSession.h>
#import "SOGoDomainDefaults.h"
#import "SOGoSystemDefaults.h"
#import "SOGoUser.h"
#import "SOGoUserDefaults.h"
@@ -36,34 +37,43 @@
- (NSArray *) resourceLookupLanguages
{
NSMutableArray *languages;
NSArray *browserLanguages;
NSArray *browserLanguages, *supportedLanguages;
SOGoSystemDefaults *sd;
SOGoUser *user;
NSString *language;
languages = [NSMutableArray array];
user = [self activeUser];
// Retrieve language parameter
language = [[self request] formValueForKey: @"language"];
if ([language length] > 0)
[languages addObject: language];
if (!user || [[user login] isEqualToString: @"anonymous"])
{
// Use browser's languages
browserLanguages = [[self request] browserLanguages];
[languages addObjectsFromArray: browserLanguages];
}
else
{
// Use user's language or domain's language
language = [[user userDefaults] language];
[languages addObject: language];
language = [[user domainDefaults] language];
[languages addObject: language];
}
// if (activeUser && [activeUser language])
// [languages addObject: [activeUser language]];
// if ([self hasSession])
// [languages addObjectsFromArray: [[self session] languages]];
// else
// [languages addObjectsFromArray: [[self request] browserLanguages]];
// Return the first language matching a supported language or the SOGoLanguage
// default if none is matching.
sd = [SOGoSystemDefaults sharedSystemDefaults];
supportedLanguages = [sd supportedLanguages];
language = [languages firstObjectCommonWithArray: supportedLanguages];
if (!(language && [language isKindOfClass: [NSString class]]))
language = [sd stringForKey: @"SOGoLanguage"];
return languages;
return [NSArray arrayWithObject: language];
}
@end
+1 -1
View File
@@ -12,7 +12,7 @@ import sogoLogin
# this should probably be fetched magically...
SOGoSupportedLanguages = [ "Arabic", "Basque", "Catalan", "ChineseTaiwan", "Croatian", "Czech", "Dutch", "Danish", "Welsh", "English", "Finnish",
"SpanishSpain", "SpanishArgentina", "French", "German", "Hebrew",
"Icelandic", "Italian", "Lithuanian", "Macedonian", "Hungarian", "Portuguese", "BrazilianPortuguese",
"Icelandic", "Italian", "Latvian", "Lithuanian", "Macedonian", "Hungarian", "Portuguese", "BrazilianPortuguese",
"NorwegianBokmal", "NorwegianNynorsk", "Polish", "Russian", "Serbian", "Slovak",
"Slovenian", "Swedish", "TurkishTurkey", "Ukrainian" ];
daysBetweenResponseList=[1,2,3,5,7,14,21,30]
+4 -1
View File
@@ -67,8 +67,8 @@
- (NSString *) processDefaults: (BOOL)allDefaults
{
NSUserDefaults *ud;
NSDictionary *defaultsDict;
NSUserDefaults *ud;
NSData *plistData;
ud = [NSUserDefaults standardUserDefaults];
@@ -83,6 +83,9 @@
defaultsDict = [ud persistentDomainForName: @"sogod"];
}
if (!defaultsDict)
return @"No defaults found. Try to use -f.";
plistData = [NSPropertyListSerialization dataFromPropertyList: (id) defaultsDict
format: NSPropertyListOpenStepFormat
errorDescription: 0 ];
+50 -11
View File
@@ -35,12 +35,17 @@
#import <SOGo/SOGoUserManager.h>
#import <SOGo/NSArray+Utilities.h>
#import <SOGo/NSString+Utilities.h>
#import <SOGo/SOGoGCSFolder.h>
#import <SOGo/SOGoParentFolder.h>
#import <SOGo/SOGoUser.h>
#import <SOGo/SOGoUserFolder.h>
#import <SOGo/SOGoSystemDefaults.h>
#import <NGCards/iCalCalendar.h>
#import <NGCards/NGVCard.h>
#import <NGObjWeb/WOContext+SoObjects.h>
#import "SOGoTool.h"
typedef enum
@@ -49,6 +54,8 @@ typedef enum
ManageACLGet = 0,
ManageACLAdd = 1,
ManageACLRemove = 2,
ManageACLSubscribe = 3,
ManageACLUnsubscribe = 3,
} SOGoManageACLCommand;
@interface SOGoToolManageACL : SOGoTool
@@ -99,14 +106,16 @@ typedef enum
- (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"
fprintf (stderr, "manage-acl get|add|remove|subscribe|unsubscribe 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"
" subscribe subscribe user to owner's folder\n"
" unsubscribe unsubscribe user to owner's folder\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");
@@ -131,6 +140,10 @@ typedef enum
}
else if ([s isEqualToString: @"remove"])
command = ManageACLRemove;
else if ([s isEqualToString: @"subscribe"])
command = ManageACLSubscribe;
else if ([s isEqualToString: @"unsubscribe"])
command = ManageACLUnsubscribe;
else
{
[self usage];
@@ -349,9 +362,7 @@ typedef enum
if ([theUser isEqualToString: @"ALL"])
qs = [NSString stringWithFormat: @"c_uid LIKE '\%'", theUser];
else
{
qs = [NSString stringWithFormat: @"c_uid = '%@'", theUser];
}
qs = [NSString stringWithFormat: @"c_uid = '%@'", theUser];
qualifier = [EOQualifier qualifierWithQualifierFormat: qs];
@@ -363,6 +374,30 @@ typedef enum
forPath: path];
}
- (void) subscribeOrUnsubscribeUser: (NSString *) theUser
toFolder: (GCSFolder *) theFolder
reallyDo: (BOOL) reallyDo
{
SOGoParentFolder *parentFolder;
SOGoUserFolder *userFolder;
SOGoGCSFolder *gcsFolder;
WOContext *localContext;
NSArray *components;
localContext = [WOContext context];
[localContext setActiveUser: [SOGoUser userWithLogin: owner]];
userFolder = [SOGoUserFolder objectWithName: owner inContainer: nil];
components = [folder componentsSeparatedByString: @"/"];
parentFolder = [userFolder lookupName: [components objectAtIndex: 0]
inContext: localContext
acquire: NO];
gcsFolder = [parentFolder lookupPersonalFolder: [components objectAtIndex: 1]
ignoringRights: YES];
[gcsFolder subscribeUserOrGroup: user reallyDo: reallyDo response: nil];
}
- (BOOL) proceed
{
NSAutoreleasePool *pool;
@@ -391,6 +426,10 @@ typedef enum
[self removeACLForUser: user folder: f];
else if (command == ManageACLAdd)
[self addACLForUser: user folder: f];
else if (command == ManageACLSubscribe)
[self subscribeOrUnsubscribeUser: user toFolder: f reallyDo: YES];
else if (command == ManageACLUnsubscribe)
[self subscribeOrUnsubscribeUser: user toFolder: f reallyDo: NO];
else
[self usage];
}
+1 -1
View File
@@ -122,7 +122,7 @@ NSURL *folderTableURL;
- (void) usage
{
fprintf (stderr, "manage-eas listdevices|resetdevice|resetfolder|mergevcard|mergevevent user <devinceId | folderId> <YES | NO>\n\n"
fprintf (stderr, "manage-eas listdevices|resetdevice|resetfolder|mergevcard|mergevevent user <deviceId | folderId> <YES | NO>\n\n"
" user the user of whom to reset the whole device or a single folder\n"
" Examples:\n"
" sogo-tool manage-eas listdevices janedoe\n"
+1 -1
View File
@@ -214,7 +214,7 @@
- (void) usage
{
fprintf (stderr, "Usage: truncate-calendar USER FOLDER DATE\n\n"
" USER the owner of the contact folder\n"
" USER the owner of the calendar folder\n"
" FOLDER the id of the folder to clean up\n"
" DATE UTC datetime - non-recurring events older than this date will be removed (ex: \"2016-06-27T17:38:56\")\n\n");
}
@@ -0,0 +1,26 @@
/* this file is in UTF-8 format! */
"Help" = "Palīdzība";
"Close" = "Aizvērt";
"Modules" = "Moduļi";
/* Modules short names */
"ACLs" = "ACLs";
/* Modules titles */
"ACLs_title" = "Lietotāju mapes ACLs pārvaldība";
/* Modules descriptions */
"ACLs_description" = "<p>Access Control Lists administrēšanas modulis ļauj mainīt ACL lietotāja kalendāru un adrešu grāmatu.</p> <p>Lai modificētu ACL lietotāja mapi ierakstiet lietotāja vārdu meklēšanas laukā loga augšdaļā un veiciet dubultklikšķi uz vajadzīgās mapes.</p>";
"Name or Email" = "Vārds vai e-pasts";
/* Rights module: initial search message */
"Start a search to edit the rights" = "Sākt meklēšanu, lai rediģētu tiesības";
/* Rights module: Empty search result */
"No matching user" = "Neviens atbilstošs lietotājs";
/* Rights module: no selection */
"No resource selected" = "Nav atlasīts resurss";
"Add User" = "Pievienot lietotāju";
"Subscribe User" = "Abonēt lietotāju";
"Rights" = "Tiesības";
"Search Users" = "Meklēt lietotājus";
"users found" = "atrasti lietotāji";
"No resource" = "Nav resursu";
"Any Authenticated User" = "Visi autentificētie lietotāji";
"Public Access" = "Publiska piekļuve";
+19 -9
View File
@@ -69,14 +69,6 @@
"delegate is organizer" = "De gedelegeerde is de organisator. Geef een andere gedelegeerde op.";
"delegate is a participant" = "De gedelegeerde is al een deelnemer.";
"delegate is a group" = "U heeft een groepsadres opgegeven. U kunt alleen delegeren aan een uniek persoon.";
"Snooze for " = "Sluimer nog ";
"5 minutes" = "5 minuten";
"10 minutes" = "10 minuten";
"15 minutes" = "15 minuten";
"30 minutes" = "30 minuten";
"45 minutes" = "45 minuten";
"1 hour" = "1 uur";
"1 day" = "1 dag";
/* common buttons */
"OK" = "OK";
@@ -89,6 +81,15 @@
"Start" = "Begin";
"Due Date" = "Verloopdatum";
"Location" = "Plaats";
"Snooze" = "Sluimeren";
"Snooze for " = "Sluimer nog ";
"5 minutes" = "5 minuten";
"10 minutes" = "10 minuten";
"15 minutes" = "15 minuten";
"30 minutes" = "30 minuten";
"45 minutes" = "45 minuten";
"1 hour" = "1 uur";
"1 day" = "1 dag";
/* mail labels */
"Important" = "Belangrijk";
@@ -118,18 +119,27 @@
/* Authentication failed */
"Wrong username or password." = "Onjuiste gebruikersnaam of wachtwoord.";
/* 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" = "Voer minstens %{minimumSearchLength} tekens in";
/* Error message displayed when a file upload exceeds WOMaxUploadSize */
"File size upload limit reached" = "Bestand grote limiet is bereikt";
/* Toggle visibility (ex: mail account in left navigation menu) */
"Toggle visibility" = "Tonen/verbergen";
/* Toggle multiple items at the same time (hotkeys cheatsheet) */
"Toggle range of items" = "Reeks items schakelen";
/* Question mark shows list of hotkeys */
"Show or hide this help" = "Toon of verberg deze hulp";
/* Space key */
"key_space" = "space";
/* Shift and space key */
"key_shift+space" = "shift + spatie";
/* Up arrow key */
"key_up" = "↑";
+19 -9
View File
@@ -69,14 +69,6 @@
"delegate is organizer" = "Valtuutettu on järjestäjä. Ole hyvä ja valitse toinen valtuutettu.";
"delegate is a participant" = "Valtuutettu on jo osallistuja.";
"delegate is a group" = "Annettu osoite on ryhmäosoite. Voit valtuuttaa vain yksittäisiä henkilöitä.";
"Snooze for " = "Torku";
"5 minutes" = "5 minuuttia";
"10 minutes" = "10 minuuttia";
"15 minutes" = "15 minuuttia";
"30 minutes" = "30 minuuttia";
"45 minutes" = "45 minuuttia";
"1 hour" = "1 tunti";
"1 day" = "1 päivä";
/* common buttons */
"OK" = "OK";
@@ -89,6 +81,15 @@
"Start" = "Alkaa";
"Due Date" = "Päättyy";
"Location" = "Sijainti";
"Snooze" = "Torkku";
"Snooze for " = "Torku";
"5 minutes" = "5 minuuttia";
"10 minutes" = "10 minuuttia";
"15 minutes" = "15 minuuttia";
"30 minutes" = "30 minuuttia";
"45 minutes" = "45 minuuttia";
"1 hour" = "1 tunti";
"1 day" = "1 päivä";
/* mail labels */
"Important" = "Tärkeä";
@@ -118,18 +119,27 @@
/* Authentication failed */
"Wrong username or password." = "Väärä käyttäjätunnus tai salasana.";
/* 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" = "Syötä vähintään %{minimumSearchLength} merkkiä";
/* Error message displayed when a file upload exceeds WOMaxUploadSize */
"File size upload limit reached" = "Tiedostolatauksen kokorajoitus saavutettu";
/* Toggle visibility (ex: mail account in left navigation menu) */
"Toggle visibility" = "Vaihda näkyvyyttä";
/* Toggle multiple items at the same time (hotkeys cheatsheet) */
"Toggle range of items" = "Valitse kohteet";
/* Question mark shows list of hotkeys */
"Show or hide this help" = "Näytä tai piilota tämä apu";
/* Space key */
"key_space" = "space";
/* Shift and space key */
"key_shift+space" = "vaihto + välilyönti";
/* Up arrow key */
"key_up" = "↑";
+183
View File
@@ -0,0 +1,183 @@
/* this file is in UTF-8 format! */
/* toolbars */
"Save" = "Saglabāt";
"Close" = "Aizvērt";
"Edit User Rights" = "Rediģēt lietotāja tiesības";
"Home" = "Sākums";
"Calendar" = "Kalendārs";
"Address Book" = "Adrešu grāmata";
"Mail" = "E-pasts";
"Preferences" = "Preferences";
"Administration" = "Administrēšana";
"Disconnect" = "Atvienot";
"Toggle Menu" = "Pārslēgt izvēlni";
"Right Administration" = "Tiesību administrēšana";
"Log Console (dev.)" = "Log konsole (dev.)";
"User" = "Lietotājs";
"Vacation message is enabled" = "Atvaļinājuma ziņa ir iespējota";
"Help" = "Palīdzība";
"noJavascriptError" = "SOGo prasa Javascript, lai palaistu. Lūdzu, pārliecinieties, vai šī opcija ir aktivizēta un pieejama, pārlūkprogrammas iestatījumos.";
"noJavascriptRetry" = "Mēģināt vēlreiz";
"Owner" = "Īpašnieks";
"Publish the Free/Busy information" = "Publicēt informāciju Brīvs / Aizņemts ";
"Add..." = "Pievienot...";
"Remove" = "Noņemt";
"Subscribe User" = "Abonēt lietotāju";
"Any Authenticated User" = "Visi autentificētie lietotāji";
"Public Access" = "Publiska piekļuve";
"Any user not listed above" = "Jebkurš lietotājs, kas nav iepriekš minētas";
"Anybody accessing this resource from the public area" = "Ikviena piekļuvei šim resursam publiskajā zonā";
"Sorry, the user rights can not be configured for that object." = "Atvainojiet, lietotāja tiesības nevar konfigurēt šo objektu.";
"Any user with an account on this system will be able to access your mailbox \"%{0}\". Are you certain you trust them all?"
= "Jebkurš lietotājs, kuram ir konts šajā sistēmā varēs piekļūt jūsu pastkastei \"%{0}\". Vai esat pārliecināts, ka uzticaties viņiem visiem?";
"Any user with an account on this system will be able to access your calendar \"%{0}\". Are you certain you trust them all?"
= "Jebkurš lietotājs, kuram ir konts šajā sistēmā varēs piekļūt jūsu kalendāram \"%{0}\". Vai esat pārliecināts, ka uzticaties viņiem visiem?";
"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?"
= "Potenciāli ikviens interneta lietotājs varēs piekļūt jūsu kalendāram \"%{0}\", pat ja tiem nav konta šajā sistēmā. Vai šī informācija ir piemērota publiskajam internetam?";
"Any user with an account on this system will be able to access your address book \"%{0}\". Are you certain you trust them all?"
= "Jebkurš lietotājs, kuram ir konts šajā sistēmā varēs piekļūt jūsu adrešu grāmatai \"%{0}\". Vai esat pārliecināts, ka uzticaties viņiem visiem?";
"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?"
= "Potenciāli ikviens interneta lietotājs varēs piekļūt jūsu adrešu grāmatai \"%{0}\", pat ja tiem nav konta šajā sistēmā. Vai šī informācija ir piemērota publiskajam internetam?";
"Give Access" = "Dot piekļuvi";
"Keep Private" = "Turēt privātu";
/* generic.js */
"Unable to subscribe to that folder!"
= "Nevar pierakstīties uz šo mapi!";
"You cannot subscribe to a folder that you own!"
= "Jūs nevarat abonēt mapi, kas tev pieder!";
"Unable to unsubscribe from that folder!"
= "Nevar atcelt šīs mapes abonēšanu !";
"You cannot unsubscribe from a folder that you own!"
= "Nevar atcelt abonēšanu mapei, kas tev pieder!";
"Unable to rename that folder!" = "Nevar pārdēvēt šo mapi!";
"You have already subscribed to that folder!"
= "Jūs jau esat abonējis šo mapi!";
"The user rights cannot be edited for this object!"
= "Lietotāja tiesības, nevar rediģēt, šo objektu!";
"A folder by that name already exists." = "Mape ar šādu nosaukumu jau pastāv.";
"You cannot create a list in a shared address book."
= "Nevar izveidot sarakstu koplietojamā adrešu grāmatā.";
"Warning" = "Brīdinājums";
"Can't contact server" = "Radās kļūda, sazinoties ar serveri. Lūdzu, vēlāk mēģiniet vēlreiz.";
"You are not allowed to access this module or this system. Please contact your system administrator."
= "Jums nav atļaujas piekļūt šim modulim vai sistēmai. Lūdzu, sazinieties ar sistēmas administratoru.";
"You don't have the required privileges to perform the operation."
= "Jums nav nepieciešamo tiesību, lai veiktu šo darbību.";
"noEmailForDelegation" = "Norādiet adresi, uz kuru vēlaties deleģēt jūsu uzaicinājumu.";
"delegate is organizer" = "Delegāts ir organizators. Lūdzu, norādiet citu pārstāvi.";
"delegate is a participant" = "Delegāts ir jau dalībnieks.";
"delegate is a group" = "Norādītā adrese sakrīt ar grupu. Var tikai deleģēt unikāla persona.";
/* common buttons */
"OK" = "OK";
"Cancel" = "Atcelt";
"Yes" = "Jā";
"No" = "Nē";
/* alarms */
"Reminder" = "Atgādinājums";
"Start" = "Sākums";
"Due Date" = "Izpildes datums";
"Location" = "Vieta";
"Snooze" = "Atlikt";
"Snooze for " = "Atlikt uz";
"5 minutes" = "5 minūtes";
"10 minutes" = "10 minūtes";
"15 minutes" = "15 minūtes";
"30 minutes" = "30 minūtes";
"45 minutes" = "45 minūtes";
"1 hour" = "1 stunda";
"1 day" = "1 diena";
/* mail labels */
"Important" = "Svarīgs";
"Work" = "Darbs";
"Personal" = "Personisks";
"To Do" = "Uzdevums";
"Later" = "Vēlāk";
"a2_Sunday" = "Sv";
"a2_Monday" = "Pr";
"a2_Tuesday" = "Ot";
"a2_Wednesday" = "Tr";
"a2_Thursday" = "Ce";
"a2_Friday" = "Pi";
"a2_Saturday" = "Se";
"Access Rights" = "Piekļuves tiesības";
"Add User" = "Pievienot lietotāju";
"Loading" = "Ielādēšana";
"No such user." = "Nav šādu lietotāju.";
"You cannot (un)subscribe to a folder that you own!" = "Nevar (ne) abonēt mapi, kas tev pieder!";
/* Authentication username */
"Username" = "Lietotājvārds";
/* Authentication password */
"Password" = "Parole";
/* Authentication failed */
"Wrong username or password." = "Nepareizs lietotājvārds vai parole.";
/* Error message displayed bellow search field when the search string has less than the required number of characters */
"Enter at least %{minimumSearchLength} characters" = "Jāievada vismaz %{minimumSearchLength} rakstzīmes";
/* Error message displayed when a file upload exceeds WOMaxUploadSize */
"File size upload limit reached" = "Sasniegts augšupielādes faila lielums";
/* Toggle visibility (ex: mail account in left navigation menu) */
"Toggle visibility" = "Pārslēgt redzamību";
/* Toggle multiple items at the same time (hotkeys cheatsheet) */
"Toggle range of items" = "Pārslēgt vienību diapazonu";
/* Question mark shows list of hotkeys */
"Show or hide this help" = "Parādīt vai paslēpt šo palīdzība";
/* Space key */
"key_space" = "space";
/* Shift and space key */
"key_shift+space" = "shift + space";
/* 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" = "Apskatīt nākamo punktu";
/* Hotkey description to select previous list item */
"View previous item" = "Skatīt iepriekšējo punktu";
/* Hotkey description to add next list item to selection */
"Add next item to selection" = "Pievienot nākamo vienību atlasei";
/* Hotkey description to add previous list item to selection */
"Add previous item to selection" = "Pievienot iepriekšējo vienību atlasei";
/* Hotkey description to move backward in current view */
"Move backward" = "Atpakaļ";
/* Hotkey description to move forward in current view */
"Move forward" = "Uz priekšu";
+1 -1
View File
@@ -175,7 +175,7 @@
"%{0} card(s) copied" = "%{0} kontakt(ů) zkopírováno";
"%{0} card(s) moved" = "%{0} kontakt(ů) přesunuto";
"SoAccessDeniedException" = "Nemůžete zapisovat do tohoto adresáře.";
"Forbidden" = "Nemůžete zapisovat do tohoto adresáře.";
"Forbidden" = "Zakázané";
"Invalid Contact" = "Označený kontakt již neexistuje.";
"Unknown Destination Folder" = "Zvolený cílový adresář již neexistuje.";
+1 -1
View File
@@ -175,7 +175,7 @@
"%{0} card(s) copied" = "%{0} kaart(en) gekopieerd";
"%{0} card(s) moved" = "%{0} kaart(en) verplaatst";
"SoAccessDeniedException" = "U kunt niet naar dit adresboek schrijven.";
"Forbidden" = "U kunt niet naar dit adresboek schrijven.";
"Forbidden" = "Toegang geweigerd";
"Invalid Contact" = "De geselecteerde contactpersoon bestaat niet meer.";
"Unknown Destination Folder" = "Het geselecteerde doeladresboek bestaat niet meer.";
@@ -175,7 +175,7 @@
"%{0} card(s) copied" = "%{0} osoitekortti(a) kopioitu";
"%{0} card(s) moved" = "%{0} osoitekortti(a) siirretty";
"SoAccessDeniedException" = "Et voi kirjoittaa tähän osoitekirjaan.";
"Forbidden" = "Et voi kirjoittaa tähän osoitekirjaan.";
"Forbidden" = "Kielletty";
"Invalid Contact" = "Valittua yhteystietoa ei enää ole. ";
"Unknown Destination Folder" = "Valittua kohdeosoitekirjaa ei enää ole.";
+4 -1
View File
@@ -41,6 +41,9 @@
"Move To" = "Déplacer vers";
"Copy To" = "Copier vers";
"Add to" = "Ajouter à";
"To" = "Destinataire";
"Carbon Copy (Cc)" = "Copie carbone";
"Blind Carbon Copy (Bcc)" = "C. carbone cachée";
/* Subheader of empty addressbook */
"No contact" = "Aucun contact";
@@ -258,4 +261,4 @@
"key_create_card" = "c";
/* Hotkey to create a new list */
"key_create_list" = "l";
"key_create_list" = "l";
@@ -0,0 +1,264 @@
/* this file is in UTF-8 format! */
"Contact" = "Kontakts";
"Address" = "Adrese";
"Photos" = "Fotoattēli";
"Other" = "Cits";
"Address Books" = "Adrešu grāmatas";
"Addressbook" = "Adrešu grāmata";
"Addresses" = "Adreses";
"Update" = "Atjaunināt";
"Cancel" = "Atcelt";
"Common" = "Kopīgs";
"Contact editor" = "Kontaktpersonu redaktors";
"Contact viewer" = "Kontaktpersona skatītājs";
"Email" = "E-pasts";
"Screen Name" = "Ekrāna vārds";
"Extended" = "Paplašināts";
"Fax" = "Fax";
"Firstname" = "Vārds";
"Home" = "Mājas";
"HomePhone" = "Mājas tālrunis";
"Lastname" = "Uzvārds";
"Location" = "Vieta";
"Add a category" = "Pievienot kategorijai";
"MobilePhone" = "Mobilais tālrunis";
"Name" = "Nosaukums";
"OfficePhone" = "Darba tālrunis";
"Organization" = "Organizācija";
"Work Phone" = "Tālrunis darbā";
"Phone" = "Tālrunis";
"Phones" = "Tālruņi";
"Postal" = "Pasts";
"Save" = "Saglabāt";
"Internet" = "Internets";
"Unit" = "Vienība";
"delete" = "dzēst";
"edit" = "labot";
"invalidemailwarn" = "Norādītā e-pasta adrese ir nederīga";
"new" = "jauns";
"Preferred Phone" = "Vēlamais tālrunis";
"Move To" = "Pārvietot uz";
"Copy To" = "Kopēt uz";
"Add to" = "Pievienot";
"To" = "Kam";
"Carbon Copy (Cc)" = "Kopija (Cc)";
"Blind Carbon Copy (Bcc)" = "Diskrētā kopija (Bcc)";
/* Subheader of empty addressbook */
"No contact" = "Nav kontaktpersonas";
/* Subheader of system addressbook */
"Start a search to browse this address book" = "Sākt meklēt, lai pārlūkotu šo adrešu grāmatu";
/* Number of contacts in addressbook; string is prefixed by number */
"contacts" = "kontakti";
/* No contact matching search criteria */
"No matching contact" = "Neviens atbilstošs kontakts";
/* Number of contacts matching search criteria; string is prefixed by number */
"matching contacts" = "atbilstoši kontakti";
/* Number of selected contacts in list */
"selected" = "atlasīts";
/* Empty right pane */
"No contact selected" = "Nav atlasīta neviena kontaktpersona";
/* Tooltips */
"Create a new address book card" = "Izveidot jaunu adrešu grāmatas kartiņu";
"Create a new list" = "Izveidot jaunu sarakstu";
"Edit the selected card" = "Rediģēt atlasīto kartiņu";
"Send a mail message" = "Nosūtīt e-pasta ziņojumu";
"Delete selected card or address book" = "Dzēst izvēlēto kartiņu vai adrešu grāmatu";
"Reload all contacts" = "Pārlādēt visus kontaktus";
"htmlMailFormat_UNKNOWN" = "Nezināms";
"htmlMailFormat_FALSE" = "Plain Text";
"htmlMailFormat_TRUE" = "HTML";
"Name or Email" = "Vārds vai e-pasts";
"Category" = "Kategorija";
"Personal Addressbook" = "Personiskā adrešu grāmata";
"Search in Addressbook" = "Meklēt adrešu grāmatā";
"New Card" = "Jauna kartiņa";
"New List" = "Jauns saraksts";
"Edit" = "Labot";
"Properties" = "Rekvizīti";
"Sharing..." = "Koplieto...";
"Write" = "Rakstīt";
"Delete" = "Dzēst";
"Instant Message" = "Tūlītējais ziņojums";
"Add..." = "Pievienot...";
"Remove" = "Noņemt";
"Please wait..." = "Lūdzu, uzgaidiet...";
"No possible subscription" = "Nav iespējams abonēt";
"Preferred" = "Vēlamais";
"Display" = "Rādīt";
"Display Name" = "Parādāmais nosaukums";
"Additional Email" = "Papildu e-pasts";
"Phone Number" = "Tālruņa numurs";
"Prefers to receive messages formatted as" = "Vēlas saņemt ziņojumus formātā";
"Categories" = "Kategorijas";
"First" = "Vārds";
"Last" = "Uzvārds";
"Nickname" = "Iesauka";
"Telephone" = "Tālrunis";
"Work" = "Darbs";
"Mobile" = "Mobilais";
"Pager" = "Peidžeris";
/* categories */
"contacts_category_labels" = "Kolēģi, konkurenti, klienti, draugi, ģimene, biznesa partneri, piegādātāji, Prese, VIP";
"New category" = "Jauna kategorija";
/* adresses */
"Title" = "Nosaukums";
"Service" = "Pakalpojums";
"Company" = "Uzņēmums";
"Department" = "Departaments";
"City" = "Pilsēta";
"State_Province" = "Štats / province";
"ZIP_Postal Code" = "ZIP/Pasta indekss";
"Country" = "Valsts";
"Web Page" = "Interneta lappuse";
"Other Infos" = "Cita informācija";
"Note" = "Piezīme";
"Timezone" = "Laika josla";
"Birthday" = "Dzimšanas diena";
"Birthday (yyyy-mm-dd)" = "Dzimšanas diena (yyyy-mm-dd)";
"Freebusy URL" = "Aizņemtības URL";
"Add as..." = "Pievienot kā...";
"Recipient" = "Adresāts";
"Carbon Copy" = "Kopija";
"Blind Carbon Copy" = "Diskrētā kopija";
"New Addressbook..." = "Jauna adrešu grāmata...";
"Subscribe to an Addressbook..." = "Parakstīties uz adrešu grāmatu...";
"Remove the selected Addressbook" = "Noņemt atlasīto adrešu katalogu";
"Subscribe to a shared folder" = "Parakstīties uz koplietojamu mapi";
"Search User" = "Meklēt lietotāju";
"Name of the Address Book" = "Adrešu grāmatas nosaukums";
"Are you sure you want to delete the selected address book?"
= "Vai tiešām vēlaties izdzēst atlasīto adrešu grāmatu?";
"Are you sure you want to delete the addressbook \"%{0}\"?"
= "Vai tiešām vēlaties dzēst adrešu grāmatu \"%{0}\"?";
"You cannot remove nor unsubscribe from a public addressbook."
= "Nevar noņemt nedz atteikties no publiskā adrešu kataloga.";
"You cannot remove nor unsubscribe from your personal addressbook."
= "Jūs nevarat noņemt abonementu, no jūsu personiskās adrešu grāmatas.";
"Are you sure you want to delete the selected contacts?"
= "Vai tiešām vēlaties izdzēst atlasītās kontaktpersonas?";
"Are you sure you want to delete the card of %{0}?" = "Vai tiešām vēlaties izdzēst šo kartiņu %{0}?";
"You cannot delete the card of \"%{0}\"."
= "Nevar dzēst kartiņu \"%{0}\".";
"You cannot subscribe to a folder that you own!"
= "Jūs nevarat abonēt mapi, kas jums pieder.";
"Unable to subscribe to that folder!"
= "Nevar parakstīties uz šo mapi.";
/* acls */
"Access rights to" = "Piekļuves tiesības";
"For user" = "Lietotājam";
"Any Authenticated User" = "Visi autentificētie lietotāji";
"Public Access" = "Publiska piekļuve";
"This person can add cards to this addressbook."
= "Šī persona var pievienot ierakstus adrešu katalogā.";
"This person can edit the cards of this addressbook."
= "Šī persona var rediģēt ierakstus adrešu katalogā.";
"This person can list the content of this addressbook."
= "Šī persona var skatīt adrešu grāmatas saturu.";
"This person can read the cards of this addressbook."
= "Šīs personas var lasīt ierakstus no adrešu kataloga.";
"This person can erase cards from this addressbook."
= "Šī persona var dzēst ierakstus no adrešu kataloga.";
"The selected contact has no email address."
= "Izvēlētajam kontaktam nav e-pasta adreses.";
"Please select a contact." = "Lūdzu, atlasiet kontaktpersonu.";
/* Messages for move and copy */
"%{0} card(s) copied" = "%{0} kartiņa(s) ir nokopēta/s";
"%{0} card(s) moved" = "%{0} kartiņa(s) ir pārvietota/s";
"SoAccessDeniedException" = "Jūs nevarat rakstīt adrešu grāmatā.";
"Forbidden" = "Aizliegts";
"Invalid Contact" = "Atlasītā kontaktpersona vairs nepastāv.";
"Unknown Destination Folder" = "Izvēlētais adresāts adrešu grāmatā vairs nepastāv.";
/* Lists */
"List details" = "Saraksta detaļas";
"List name" = "Saraksta nosaukums";
"List nickname" = "Saraksta segvārds";
"List description" = "Saraksta apraksts";
"Members" = "Locekļi";
"Contacts" = "Kontakti";
"Add" = "Pievienot";
"Lists can't be moved or copied." = "Sarakstus nevar pārvietot vai kopēt.";
"Export" = "Eksportēt";
"Export Address Book..." = "Eksportēt adrešu grāmatu...";
"View Raw Source" = "Apskatīt RAW avotu";
/* Import */
"Import Cards" = "Importēt kartiņas";
"Select a vCard or LDIF file." = "Izvēlieties vCard vai LDIF failu";
"Upload" = "Augšupielādēt";
"Uploading" = "Augšupielāde";
"Done" = "Darīts";
"An error occured while importing contacts." = "Importējot kontaktpersonas radās kļūda.";
"No card was imported." = "Nav kartiņa importēta.";
"A total of %{0} cards were imported in the addressbook." = "Kopumā no % {0} kartiņas tika importētas adrešu grāmatā.";
"Reload" = "Pārlādēt";
/* Properties window */
"Address Book Name" = "Adrešu grāmatas nosaukums";
"Links to this Address Book" = "Saites uz šo adrešu grāmatu";
"Authenticated User Access" = "Autentificēto lietotāju piekļuve";
"CardDAV URL" = "CardDAV URL";
"Options" = "Opcijas";
"Rename" = "Pārdēvēt";
"Subscriptions" = "Abonementi";
"Global Addressbooks" = "Globāla adrešu grāmata";
"Search" = "Meklēšana";
"Sort" = "Kārtot";
"Descending Order" = "Dilstoša secība";
"Back" = "Atpakaļ";
"Select All" = "Atlasīt visu";
"Copy contacts" = "Kopēt kontaktus";
"More messages options" = "Vairāk ziņojumu opciju";
"New Contact" = "Jauns kontakts";
"Close" = "Aizvērt";
"More contact options" = "Vairāk kontaktu iespējas";
"Organization Unit" = "Organizācijas vienība";
"Add Organizational Unit" = "Pievienot organizācijas vienību";
"Type" = "Tips";
"Email Address" = "E-pasta adrese";
"New Email Address" = "Jauna e-pasta adrese";
"New Phone Number" = "Jauns tālruņa numurs";
"URL" = "URL";
"New URL" = "Jauns URL";
"street" = "iela";
"Postoffice" = "Pasts";
"Region" = "Reģions";
"Postal Code" = "Pasta indekss";
"New Address" = "Jauna adrese";
"Reset" = "Atiestatīt";
"Description" = "Apraksts";
"Add Member" = "Pievienot dalībnieku";
"Subscribe" = "Abonēt";
"Add Birthday" = "Pievienot dzimšanas dienu";
"Import" = "Importēt";
"More options" = "Papildu opcijas";
"Role" = "Loma";
"Add Screen Name" = "Pievienot ekrāna vārdu";
"Synchronization" = "Sinhronizācija";
"Synchronize" = "Sinhronizēt";
"Sucessfully subscribed to address book" = "Sekmīgi abonējis adrešu grāmatu";
/* Aria label for scope of search on contacts */
"Search scope" = "Meklēšanas tvērums";
/* Aria label for avatar button to select and unselect a card */
"Toggle item" = "Pārslēgt vienumu";
/* Hotkey to create a new card */
"key_create_card" = "c";
/* Hotkey to create a new list */
"key_create_list" = "l";
+4 -1
View File
@@ -41,6 +41,9 @@
"Move To" = "Przenieś do";
"Copy To" = "Kopiuj do";
"Add to" = "Dodaj do";
"To" = "Do";
"Carbon Copy (Cc)" = "Do wiadomości (Cc)";
"Blind Carbon Copy (Bcc)" = "Ukryte DW (Bcc)";
/* Subheader of empty addressbook */
"No contact" = "Brak kontaktów";
@@ -258,4 +261,4 @@
"key_create_card" = "c";
/* Hotkey to create a new list */
"key_create_list" = "l";
"key_create_list" = "l";
+1 -1
View File
@@ -175,7 +175,7 @@
"%{0} card(s) copied" = "%{0} kontakt(ov) skopírovaných";
"%{0} card(s) moved" = "%{0} kontakt(ov) presunutých";
"SoAccessDeniedException" = "Nemôžete písať do tohoto adresára.";
"Forbidden" = "Nemôžete písať do tohoto adresára.";
"Forbidden" = "Zakázané";
"Invalid Contact" = "Zvolený kontakt už neexistuje.";
"Unknown Destination Folder" = "Vybraný adresár už neexistuje.";
@@ -41,6 +41,9 @@
"Move To" = "Taşı";
"Copy To" = "Kopyala";
"Add to" = "Ekle";
"To" = "Alıcı";
"Carbon Copy (Cc)" = "Karbon Kopya (Cc)";
"Blind Carbon Copy (Bcc)" = "Gizli Karbon Kopya (Bcc)";
/* Subheader of empty addressbook */
"No contact" = "Adres defteri boş";
@@ -258,4 +261,4 @@
"key_create_card" = "c";
/* Hotkey to create a new list */
"key_create_list" = "l";
"key_create_list" = "l";
+1 -1
View File
@@ -1,6 +1,6 @@
/*
Copyright (C) 2004-2005 SKYRIX Software AG
Copyright (C) 2005-2015 Inverse inc.
Copyright (C) 2005-2017 Inverse inc.
This file is part of SOGo
+6 -1
View File
@@ -165,7 +165,7 @@ static NSArray *photoTags = nil;
id value;
NSRange r;
int i, j, count, linesCount;
int i, j, count, linesCount, len;
int rc;
folder = [self clientObject];
@@ -184,6 +184,11 @@ static NSArray *photoTags = nil;
for (j = 0; j < linesCount; j++)
{
line = [lines objectAtIndex: j];
len = [line length];
/* we check for trailing \r and we strip them */
if (len && [line characterAtIndex: len-1] == '\r')
line = [line substringToIndex: len-1];
/* skip embedded comment lines */
if ([line hasPrefix: @"#"])
+46 -2
View File
@@ -1,6 +1,6 @@
/*
Copyright (C) 2004 SKYRIX Software AG
Copyright (C) 2005-2015 Inverse inc.
Copyright (C) 2005-2017 Inverse inc.
This file is part of SOGo.
@@ -573,11 +573,55 @@
return [self _urlOfType: @"work"];
}
- (NSString *) custom1
{
NSString *value;
value = [[card uniqueChildWithTag: @"custom1"] flattenedValuesForKey: @""];
value = [value stringByEscapingHTMLString];
return [self _cardStringWithLabel: @"Custom 1" value: value];
}
- (NSString *) custom2
{
NSString *value;
value = [[card uniqueChildWithTag: @"custom2"] flattenedValuesForKey: @""];
value = [value stringByEscapingHTMLString];
return [self _cardStringWithLabel: @"Custom 2" value: value];
}
- (NSString *) custom3
{
NSString *value;
value = [[card uniqueChildWithTag: @"custom3"] flattenedValuesForKey: @""];
value = [value stringByEscapingHTMLString];
return [self _cardStringWithLabel: @"Custom 3" value: value];
}
- (NSString *) custom4
{
NSString *value;
value = [[card uniqueChildWithTag: @"custom4"] flattenedValuesForKey: @""];
value = [value stringByEscapingHTMLString];
return [self _cardStringWithLabel: @"Custom 4" value: value];
}
- (BOOL) hasOtherInfos
{
return ([[card note] length] > 0
|| [[card bday] length] > 0
|| [[card tz] length] > 0);
|| [[card tz] length] > 0
|| [[[card uniqueChildWithTag: @"custom1"] flattenedValuesForKey: @""] length] > 0
|| [[[card uniqueChildWithTag: @"custom1"] flattenedValuesForKey: @""] length] > 0
|| [[[card uniqueChildWithTag: @"custom1"] flattenedValuesForKey: @""] length] > 0
|| [[[card uniqueChildWithTag: @"custom1"] flattenedValuesForKey: @""] length] > 0);
}
- (NSString *) bday
@@ -0,0 +1,50 @@
ACCEPTED = "akceptēts";
COMPLETED = "pabeigts";
DECLINED = "noraidīts";
DELEGATED = "deleģēts";
"IN-PROCESS" = "procesā";
"NEEDS-ACTION" = "nepieciešama darbība";
TENTATIVE = "varbūtējs";
organized_by_you = "ko jūs organizējat";
you_are_an_attendee = "jūs esat dalībnieks";
add_info_text = "iMIP 'ADD' pieprasījumi nav pagaidām SOGo atbalstīti.";
publish_info_text = "Sūtītājs jūs informē par pievienoto notikumu.";
cancel_info_text = "Jūsu uzaicinājums vai viss pasākums tika atcelts.";
request_info_no_attendee = "ierosina tikšanos ar apmeklētājiem. Jūs saņemat šo e-pasta ziņojumu kā paziņojumu, tu neesi ieplānots kā dalībnieks.";
Appointment = "Tikšanās";
"Status Update" = "Atjaunināt statusu";
was = "bija";
Organizer = "Organizētājs";
Time = "Laiks";
Attendees = "Dalībnieki";
request_info = "aicina Jūs piedalīties sanāksmē.";
"Add to calendar" = "Pievienot kalendāram";
"Delete from calendar" = "Dzēst no kalendāra";
"Update status" = "Atjaunināt statusu";
Accept = "Akceptēt";
Decline = "Noraidīt";
Tentative = "Varbūtējs";
"Delegate ..." = "Deleģēt ...";
"Delegated to" = "Deleģēt";
"Update status in calendar" = "Atjaunināt kalendāra statusu";
"delegated from" = "deleģēts no";
reply_info_no_attendee = "Jūs saņēmāt atbildi uz plānoto notikumu, bet atbildes sūtītājs nav dalībnieks.";
reply_info = "Šī ir atbilde uz uzaicinājumu piedalīties pasākumā.";
"to" = "kam";
"Untitled" = "Nenosaukts";
"Size" = "Izmērs";
"Digital signature is not valid" = "Ciparparaksts nav derīgs";
"Message is signed" = "Ziņojums ir parakstīts";
"Subject" = "Temats";
"From" = "No";
"Date" = "Datums";
"To" = "Kam";
"Issuer" = "Izdevējs";
/* Tooltips */
"View Attachment" = "Skatīt pielikumu";
"Save Attachment" = "Saglabāt pielikumu";
"CC" = "Kopija";
"Cancel" = "Atcelt";
"OK" = "OK";
"Comment" = "Komentārs";
@@ -16,7 +16,7 @@ Appointment = "Çalışma";
was = "önceden";
Organizer = "Düzenleyen";
Time = "Zaman";
Time = "Saat";
Attendees = "Katılımcılar";
request_info = "sizi toplantıya katılmaya davet ediyor. ";
"Add to calendar" = "Takvime ekle";
@@ -84,6 +84,7 @@ _xmlCharsetForCharset (NSString *charset)
{ @"koi8-r", XML_CHAR_ENCODING_ERROR}, // unsupported, will trigger koi8-r -> utf8 conversion
{ @"windows-1250", XML_CHAR_ENCODING_ERROR}, // unsupported, will trigger windows-1250 -> utf8 conversion
{ @"windows-1251", XML_CHAR_ENCODING_ERROR}, // unsupported, will trigger windows-1251 -> utf8 conversion
{ @"windows-1255", XML_CHAR_ENCODING_ERROR}, // unsupported, will trigger windows-1255 -> utf8 conversion
{ @"windows-1257", XML_CHAR_ENCODING_ERROR}, // unsupported, will trigger windows-1257 -> utf8 conversion
{ @"gb2312", XML_CHAR_ENCODING_ERROR}, // unsupported, will trigger gb2312 -> utf8 conversion
{ @"gbk", XML_CHAR_ENCODING_ERROR}, // unsupported, will trigger gb2312 -> utf8 conversion
+8 -10
View File
@@ -221,21 +221,19 @@
return [[self dateFormatter] formattedTime: [self endCalendarDate]];
}
- (BOOL) isEndDateOnSameDay
{
NSCalendarDate *aDate;
if ([[self inEvent] isAllDay])
aDate = [[self endCalendarDate] dateByAddingYears:0 months:0 days:0 hours:0 minutes:0 seconds:-1];
else
aDate = [self endCalendarDate];
return [[self startCalendarDate] isDateOnSameDay: aDate];
}
- (NSTimeInterval) duration
{
return [[self endCalendarDate] timeIntervalSinceDate:[self startCalendarDate]];
}
- (BOOL) isEndDateOnSameDay
{
if ([[self inEvent] isAllDay])
return [self duration] <= 86400;
return [[self startCalendarDate] isDateOnSameDay: [self endCalendarDate]];
}
/* calendar folder support */
- (SOGoAppointmentFolder *) calendarFolder
@@ -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!" = "Welkom bij de SOGo Mailer. Gebruik de mappenlijst aan de linkerkant om door uw e-mailaccounts te bladeren.";
"Read messages" = "Gelezen berichten";
/* Tooltip for fab button */
"Write a new message" = "Een nieuw bericht opstellen";
/* Tooltip for fab button */
"Write a message in new window" = "Bericht maken in een nieuw scherm";
"Share" = "Delen";
"Account" = "Account";
"Shared Account" = "Gedeeld account";
@@ -217,6 +223,12 @@
/* Message view "more" menu: create a task from message */
"Convert To Task" = "Omzetten naar taak";
/* Message view "more" menu: download all attachments as a zip archive */
"Download all attachments" = "Download alle bijlagen";
/* Filename prefix when downloading all attachments as a zip archive */
"attachments" = "bijlagen";
"Print..." = "Afdrukken...";
"Delete Message" = "Bericht verwijderen";
"Delete Selected Messages" = "Geselecteerde berichten verwijderen";
@@ -315,6 +327,7 @@
/* Error when uploading a file attachment */
"Error while uploading the file \"%{0}\":" = "Fout bij uploaden van bestand \"%{0}\":";
"There is an active file upload. Closing the window will interrupt it." = "Een bestandsupload is actief. Sluiten van het venster zal hem onderbreken.";
"Message is too big" = "Bericht is te groot";
/* Appears while sending the message */
"Sending" = "Verzenden";
@@ -70,6 +70,8 @@
/* No mailbox is selected (usually resulting from an IMAP connection problem) */
"No mailbox selected" = "No mailbox selected";
"An error occured while communicating with the mail server" = "An error occured while communicating with the mail server";
/* Mailbox actions */
/* Compact Folder success message */
"Folder compacted" = "Folder compacted";
@@ -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!" = "Tervetuloa SOGo Sähköpostiin. Käytä vasemmanpuoleista hakupuuta sähköpostitiliesi selaamiseen.";
"Read messages" = "Luetut viestit";
/* Tooltip for fab button */
"Write a new message" = "Kirjoita uusi viesti";
/* Tooltip for fab button */
"Write a message in new window" = "Kirjoita viesti uudessa ikkunassa";
"Share" = "Jaa";
"Account" = "Tili";
"Shared Account" = "Jaettu tili";
@@ -217,6 +223,12 @@
/* Message view "more" menu: create a task from message */
"Convert To Task" = "Muunna tehtäväksi";
/* Message view "more" menu: download all attachments as a zip archive */
"Download all attachments" = "Lataa kaikki liitteet";
/* Filename prefix when downloading all attachments as a zip archive */
"attachments" = "liitteet";
"Print..." = "Tulosta...";
"Delete Message" = "Poista viesti";
"Delete Selected Messages" = "Poista valitut viestit";
@@ -315,6 +327,7 @@
/* Error when uploading a file attachment */
"Error while uploading the file \"%{0}\":" = "Virhe tiedoston \"%{0}\" latauksessa: ";
"There is an active file upload. Closing the window will interrupt it." = "Tiedoston lataus on käynnissä. Ikkunan sulkeminen pysäyttää latauksen.";
"Message is too big" = "Viesti on liian iso";
/* Appears while sending the message */
"Sending" = "Lähettää";
@@ -70,6 +70,8 @@
/* No mailbox is selected (usually resulting from an IMAP connection problem) */
"No mailbox selected" = "Aucune boîte sélectionnée";
"An error occured while communicating with the mail server" = "Une erreur est survenue lors de la connexion au serveur de courrier.";
/* Mailbox actions */
/* Compact Folder success message */
"Folder compacted" = "Dossier compressé";
+1 -1
View File
@@ -361,7 +361,7 @@
"Set as Junk" = "Als Spam markieren";
"Sort" = "Sortieren";
"Order Received" = "Anweisung erhalten";
"Order Received" = "Nach Empfang sortieren";
"Descending Order" = "Absteigende Sortierung";
"Back" = "Zurück";
"Copy messages" = "Nachrichten kopieren";
@@ -0,0 +1,409 @@
/* this file is in UTF-8 format! */
/* Icon's label */
"Create" = "Izveidot";
"Empty Trash" = "Tukša atkritne";
"Delete" = "Dzēst";
"Expunge" = "Izdzēst";
"Forward" = "Pārsūtīt";
"Get Mail" = "Saņemt e-pastu";
"Junk" = "Nevēlams";
"Not junk" = "Nav nevēlams";
"Reply" = "Atbildēt";
"Reply All" = "Atbildēt visiem";
"Print" = "Drukāt";
"Stop" = "Stop";
"Write" = "Rakstīt";
"Search" = "Meklēt";
"Send" = "Sūtīt";
"Contacts" = "Kontakti";
"Attach" = "Pievienot";
"Save" = "Saglabāt";
"Options" = "Opcijas";
"Close" = "Aizvērt";
"Size" = "Izmērs";
/* Tooltips */
"Send this message now" = "Sūtīt šo ziņojumu tūlīt";
"Select a recipient from an Address Book" = "Izvēlieties adresātu no adrešu grāmatas";
"Include an attachment" = "Pielikuma iekļaušana";
"Save this message" = "Saglabāt šo ziņojumu";
"Get new messages" = "Jaunu ziņojumu saņemšana";
"Create a new message" = "Izveidot jaunu ziņu";
"Go to address book" = "Atveriet adrešu grāmatu";
"Reply to the message" = "Atbildēt uz ziņu";
"Reply to sender and all recipients" = "Atbildēt sūtītājam un visiem adresātiem";
"Forward selected message" = "Pārsūtīt izvēlēto ziņu";
"Delete selected message or folder" = "Izdzēsiet izvēlēto ziņu vai mapi";
"Print this message" = "Drukāt šo ziņojumu";
"Stop the current transfer" = "Apturēt pašreizējo pārraidi";
"Attachment" = "Pielikums";
"Unread" = "Nelasīts";
"Flagged" = "Ar karodziņu";
"Search multiple mailboxes" = "Vairāku pastkastu meklēšana";
/* Main Frame */
"Home" = "Sākums";
"Calendar" = "Kalendārs";
"Addressbook" = "Adrešu grāmata";
"Mail" = "E-pasts";
"Right Administration" = "Tiesību administrēšana";
"Help" = "Palīdzība";
/* Mail account main windows */
"Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Esiet sveicināts SOGo Mailer. Izmantojiet mapes koku par kreisi, lai pārlūkotu jūsu pasta kontus!";
"Read messages" = "Lasīt ziņas";
/* Tooltip for fab button */
"Write a new message" = "Rakstīt jaunu ziņu";
/* Tooltip for fab button */
"Write a message in new window" = "Rakstīt ziņojumu jaunā logā";
"Share" = "Koplietot";
"Account" = "Konts";
"Shared Account" = "Kopējs konts";
/* A mailbox is selected, but no message (only shown on large screens) */
"No message selected" = "Nav izvēlēta ziņa";
/* No mailbox is selected (usually resulting from an IMAP connection problem) */
"No mailbox selected" = "Neviena pastkaste nav atlasīta";
"An error occured while communicating with the mail server" = "Radās kļūda, sazinoties ar serveri";
/* Mailbox actions */
/* Compact Folder success message */
"Folder compacted" = "Mape saspiesta";
/* Empty Trash success message */
"Trash emptied" = "Atkritne iztukšota";
/* acls */
"Access rights to" = "Piekļuves tiesības";
"For user" = "Lietotājam";
"Any Authenticated User" = "Visi autentificētie lietotāji";
"List and see this folder" = "Attēlot un skatīt šo mapi";
"Read mails from this folder" = "Lasīt pastu no šīs mapes";
"Mark mails read and unread" = "Atzīmēt lasītās un nelasītās ziņas";
"Modify the flags of the mails in this folder" = "Modificēt e-pasta karogus šajā mapē";
"Insert, copy and move mails into this folder" = "Ievietot, kopēt un pārvietot pasta ziņas šajā mapē";
"Post mails" = "Pasta ziņas";
"Add subfolders to this folder" = "Pievienot mapei apakšmapes";
"Remove this folder" = "Noņemt šo mapi";
"Erase mails from this folder" = "Dzēst pastu no šīs mapes";
"Expunge this folder" = "Izdzēst šo mapi";
"Export This Folder" = "Eksportēt šo mapi";
"Modify the acl of this folder" = "Mainīt šīs mapes ACL";
"Saved Messages.zip" = "Saglabāts Ziņas*.zip";
"Update" = "Atjaunināt";
"Cancel" = "Atcelt";
/* Mail edition */
"From" = "No";
"Subject" = "Temats";
"To" = "Kam";
"Cc" = "Kopija";
"Bcc" = "Diskrētā kopija";
"Reply-To" = "Atbildēt uz";
"Add address" = "Pievienot adresi";
"Body" = "Korpuss";
"Open" = "Atvērt";
"Select All" = "Atlasīt visu";
"Select Message" = "Izvēlieties ziņojumu";
"Attach Web Page..." = "Pievienot tīmekļa lapu...";
"file" = "fails";
"files" = "faili";
"Save all" = "Saglabāt visu";
"to" = "Kam";
"cc" = "Cc";
"bcc" = "Bcc";
"Add a recipient" = "Pievienot adresātu";
"Edit Draft..." = "Melnraksta rediģēšana...";
"Load Images" = "Ielādēt attēlus";
"Return Receipt" = "Saņemšanas paziņojums";
"The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "Šī ziņojuma nosūtītājs ir pieprasījis, lai tiktu paziņots, kad izlasīsiet šo ziņojumu. Vai vēlaties apstiprināt ?";
"Return Receipt (displayed) - %@"= "Saņemšanas paziņojums (parādīts) - %@";
"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." = "Šis ir saņemšanas paziņojums e-pastam ko jūs nosūtījāt %@.\n\nPiezīme: šī ziņojuma saņemšanas paziņojums tikai apstiprināts, ka ziņojums tika parādīts adresāta datorā. Bet nav garantijas, ka adresāts ir izlasījis un sapratis šo ziņojumu saturu.";
"Priority" = "Prioritāte";
"highest" = "Augstākā";
"high" = "Augsts";
"normal" = "Normāls";
"low" = "Zems";
"lowest" = "Zemākā";
"This mail is being sent from an unsecure network!" = "Šis e-pasta ziņojums tiek sūtīts no nedroša tīkla!";
"Address Book" = "Adrešu grāmata";
"Search For" = "Meklēt";
/* Popup "show" */
"all" = "visi";
"read" = "lasīts";
"unread" = "nelasīts";
"deleted" = "dzēsts";
"flagged" = "ar karodziņu";
/* MailListView */
"Sender" = "Sūtītājs";
"Subject or Sender" = "Tēma vai sūtītājs";
"To or Cc" = "Kam vai Kopija";
"Entire Message" = "Visu ziņojumu";
"Date" = "Datums";
"View" = "Skatīt";
"All" = "Viss";
"No message" = "Ziņu nav";
"messages" = "ziņojumi";
"Yesterday" = "Vakar";
"first" = "Pirmais";
"previous" = "Iepriekšējais";
"next" = "Nākamais";
"last" = "Pēdējais";
"msgnumber_to" = "kam";
"msgnumber_of" = "no";
"Mark Unread" = "Atzīmēt kā nelasītu";
"Mark Read" = "Atzīmēt kā lasītu";
"Untitled" = "Nenosaukts";
/* Tree */
"SentFolderName" = "Sūtīt";
"TrashFolderName" = "Atkritne";
"InboxFolderName" = "Iesūtne";
"DraftsFolderName" = "Melnraksti";
"JunkFolderName" = "Nevēlams";
"SieveFolderName" = "Filtri";
"Folders" = "Mapes"; /* title line */
/* MailMoveToPopUp */
"MoveTo" = "Pārvietot &hellip;";
/* Address Popup menu */
"Add to Address Book..." = "... pievienot adrešu grāmatai";
"Compose Mail To" = "Rakstīt pastu";
"Create Filter From Message..." = "Izveidot filtru no ziņojuma...";
/* Image Popup menu */
"Save Image" = "Saglabāt attēlu";
"Save Attachment" = "Saglabāt pielikumu";
/* Mailbox popup menus */
"Open in New Mail Window" = "Atvērt jaunā epasta logā";
"Copy Folder Location" = "Kopēt mapes atrašanās vietu";
"Subscribe..." = "Abonēt...";
"Mark Folder Read" = "Atzīmēt mapi kā lasītu";
"New Folder..." = "Jauna mape...";
"Compact This Folder" = "Saspiest šo mapi";
"Search Messages..." = "Ziņu meklēšana...";
"Sharing..." = "Koplieto...";
"New Subfolder..." = "Jauna apakšmape...";
"Rename Folder..." = "Pārdēvēt mapi...";
"Delete Folder" = "Dzēst mapi";
"Use This Folder For" = "Lietojiet šo mapi";
"Get Messages for Account" = "Saņemt ziņojumus kontam";
"Properties..." = "Rekvizīti...";
"Delegation..." = "Deleģēšana...";
/* Use This Folder menu */
"Sent Messages" = "Nosūtīt ziņojumus";
"Drafts" = "Melnraksti";
"Deleted Messages" = "Dzēst ziņojumus";
"Junk Messages" = "Nevēlamā e-pasta ziņojumi";
/* Message list popup menu */
"Open Message In New Window" = "Atvērt ziņu jaunā logā";
"Reply to Sender Only" = "Atbildēt tikai sūtītājam";
"Reply to All" = "Atbildēt visiem";
"Edit As New..." = "Labot kā jaunu...";
"Move To" = "Pārvietot uz";
"Copy To" = "Kopēt uz";
"Label" = "Etiķete";
"Mark" = "Atzīmēt";
"Save As..." = "Saglabāt kā...";
"Print Preview" = "Drukas priekšskatījums";
"View Message Source" = "Skatīt ziņojuma avotu";
/* Message view "more" menu: create an event from message */
"Convert To Event" = "Pārvērst par notikumu";
/* Message view "more" menu: create a task from message */
"Convert To Task" = "Pārvērst par uzdevumu";
/* Message view "more" menu: download all attachments as a zip archive */
"Download all attachments" = "Lejupielādēt visus pielikumus";
/* Filename prefix when downloading all attachments as a zip archive */
"attachments" = "pielikumi";
"Print..." = "Drukāt...";
"Delete Message" = "Dzēst ziņojumu";
"Delete Selected Messages" = "Izdzēst atlasītos ziņojumus";
"Mark the selected messages as junk" = "Atzīmēt atlasīto ziņojumu kā nevēlamu";
"Mark the selected messages as not junk" = "Atzīmēt atlasīto ziņojumu kā vēlamu";
/* Text appended to the recipients list when there are too many recipients */
"and %{0} more..." = "un %{0} vairāk...";
/* Button label to hide extended list of recipients */
"Hide" = "Paslēpt";
/* Number of selected messages in list */
"selected" = "atlasīts";
"This Folder" = "Šī mape";
/* Label popup menu */
"None" = "Neviens";
/* Mark popup menu */
"As Read" = "Kā lasītu";
"Thread As Read" = "Pavedienu kā lasītu";
"As Read By Date..." = "Kā lasīts pēc datuma...";
"All Read" = "Visi izlasītie";
"Flag" = "Karogs";
"As Junk" = "Kā nevēlamu";
"As Not Junk" = "Kā vēlamu";
"Run Junk Mail Controls" = "Palaist Mēstuļu kontroli";
"Search messages in" = "Meklēt ziņu";
"Search" = "Meklēt";
"Search subfolders" = "Meklēt apakšmapēs";
"Match any of the following" = "Atbilst jebkuram no ";
"Match all of the following" = "Atbilst viss no";
"contains" = "satur";
"does not contain" = "nesatur";
"No matches found" = "Nav atrasta neviena atbilstība";
"results found" = "atrastie rezultāti";
"result found" = "atrastie rezultāti";
"Please specify at least one filter" = "Lūdzu, norādiet vismaz vienu filtru";
/* Folder operations */
"Name" = "Vārds";
"Enter the new name of your folder"
="Ievadiet jaunu mapes nosaukumu";
"Do you really want to move this folder into the trash ?"
= "Vai tiešām vēlaties šo mapi pārvietot uz atkritni?";
"Operation failed" = "Darbība neizdevās";
"Quota" = "Kvota:";
"quotasFormat" = "%{0}% izmantoti no %{1} MB";
"Unable to move/delete folder." = "Nevar pārvietot vai dzēst mapi.";
/* Alternative operation when folder cannot be deleted */
"The mailbox could not be moved to the trash folder. Would you like to delete it immediately?"
= "Pastkasti nevarēja pārvietot uz atkritni. Vai vēlaties dzēst to tūlīt?";
/* Confirmation message when deleting multiple messages */
"Are you sure you want to delete the selected messages?" = "Vai tiešām vēlaties izdzēst atlasītos ziņojumus?";
/* Notification on the number of messages successfuly copied */
"%{0} message(s) copied" = "%{0} ziņojums(i) nokopēts";
/* Notification on the number of messages successfuly movied */
"%{0} message(s) moved" = "%{0} ziņojumus(i) pārvietots";
"Please select a message." = "Izvēlieties ziņu.";
"Please select a message to print." = "Izvēlieties ziņu, lai to varētu izdrukāt.";
"Please select only one message to print." = "Lūdzu, izvēlieties tikai vienu ziņu, lai drukātu.";
"The message you have selected doesn't exist anymore." = "Atlasītais ziņojums vairs neeksistē.";
"The folder with name \"%{0}\" could not be created."
= "Mapi ar nosaukumu \"%{0}\" nevar izveidot.";
"This folder could not be renamed to \"%{0}\"."
= "Šo mapi nevar pārdēvēt par \"%{0}\".";
"The folder could not be deleted."
= "Mapi nevarēja dzēst.";
"The trash could not be emptied."
= "Atkritni nevar iztukšot.";
"The folder functionality could not be changed."
= "Mapes funkciju nevar mainīt.";
"You need to choose a non-virtual folder!" = "Ir jāizvēlas non-virtual mape!";
"Moving a message into its own folder is impossible!"
= "Ziņas pārvietošana uz savu mapi nav iespējama!";
"Copying a message into its own folder is impossible!"
= "Kopēt ziņu uz savu mapi nav iespējams!";
/* Message operations */
"The messages could not be moved to the trash folder. Would you like to delete them immediately?"
= "Ziņas nevarēja pārvietot uz atkritni. Vai vēlaties dzēst tās tūlīt?";
/* Message editing */
"error_missingsubject" = "Šim ziņojumam nav tēmas. Vai tiešām vēlaties to nosūtīt?";
"error_missingrecipients" = "Lūdzu, norādiet vismaz vienu adresātu.";
"Send Anyway" = "Tomēr nosūtīt";
"Error while saving the draft" = "Melnraksta saglabāšanas kļūda";
/* Error when uploading a file attachment */
"Error while uploading the file \"%{0}\":" = "Kļūda, augšupielādējot failu \"%{0}\":";
"There is an active file upload. Closing the window will interrupt it." = "Ir aktīva failu augšupielāde. Loga aizvēršana pārtrauc to.";
"Message is too big" = "Ziņojums ir pārāk liels.";
/* Appears while sending the message */
"Sending" = "Sūtīšana";
/* Appears when the message is successfuly sent */
"Sent" = "Sūtīt";
"cannot send message: (smtp) all recipients discarded" = "Nevar nosūtīt ziņu: visi adresāti ir nederīgi.";
"cannot send message (smtp) - recipients discarded" = "Nevar nosūtīt ziņu. Šī adrese ir nederīga";
"cannot send message: (smtp) error when connecting" = "Nevar nosūtīt ziņu: kļūda, veidojot savienojumu ar SMTP serveri.";
/* Contacts list in mail editor */
"Email" = "E-pasts";
"More mail options" = "Papildus e-pasta opcijas";
"Delegation" = "Deleģēšana";
"Add User" = "Pievienot lietotāju";
"Add a tag" = "Pievienot birku";
"reply" = "atbildēt";
"Edit" = "Labot";
"Yes" = "Jā";
"No" = "Nē";
"Location" = "Vieta";
"Rename" = "Pārdēvēt";
"Compact" = "Kompakts";
"Export" = "Eksportēt";
"Set as Drafts" = "Iestatīt kā projektu";
"Set as Sent" = "Iestatīt kā nosūtīts";
"Set as Trash" = "Iestatīt kā drazu";
/* Set the folder as the one holding Junk mails */
"Set as Junk" = "Iestatīt kā nevēlamu";
"Sort" = "Kārtot";
"Order Received" = "Saņemšanas apstiprinājums";
"Descending Order" = "Dilstoša secība";
"Back" = "Atpakaļ";
"Copy messages" = "Kopēt ziņojumus";
"More messages options" = "Vairāk ziņojumu opcijas";
"Mark as Unread" = "Atzīmēt kā nelasītu";
"Mark as Read" = "Atzīmēt kā lasītu";
"Closing Window ..." = "... loga aizvēršana";
"Tried to send too many mails. Please wait." = "Mēģinājāt nosūtīt pārāk daudz e-pastu. Lūdzu, uzgaidiet.";
"View Mail" = "Skatīt pastu";
"This message contains external images." = "Šis ziņojums satur ārējos attēlus.";
"Expanded" = "Izvērsts";
"Add a Criteria" = "Pievienot kritēriju";
"More search options" = "Papildu meklēšanas opcijas";
"Your email has been saved" = "Jūsu e-pasts ir saglabāts";
"Your email has been sent" = "Jūsu e-pasts ir nosūtīts";
"Folder compacted" = "Mape saspiesta";
/* Aria label for scope of search on messages */
"Search scope" = "Meklēšanas joma";
/* Subscriptions Dialog */
"Manage Subscriptions" = "Pārvaldīt abonementus";
/* Label of filter input field in subscriptions dialog */
"Filter" = "Filtrs";
/* 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";
@@ -70,6 +70,8 @@
/* No mailbox is selected (usually resulting from an IMAP connection problem) */
"No mailbox selected" = "Nie wybrano skrzynki";
"An error occured while communicating with the mail server" = "Wystąpił błąd w trakcie komunikacji z serwerem pocztowym";
/* Mailbox actions */
/* Compact Folder success message */
"Folder compacted" = "Folder zkompaktowany";
@@ -58,7 +58,7 @@
"Write a new message" = "Yeni ileti yaz";
/* Tooltip for fab button */
"Write a message in new window" = "Yeni pencerede bir ileti yaz";
"Write a message in new window" = "Yeni pencerede ileti yaz";
"Share" = "Paylaşım";
"Account" = "Hesap";
@@ -70,6 +70,8 @@
/* No mailbox is selected (usually resulting from an IMAP connection problem) */
"No mailbox selected" = "Seçili e-posta klasörü yok";
"An error occured while communicating with the mail server" = "E-posta sunucusu ile iletişime geçerken bir hata oluştu";
/* Mailbox actions */
/* Compact Folder success message */
"Folder compacted" = "Klasör sıkıştırıldı";
@@ -31,6 +31,7 @@
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
"Latvian" = "Latvijas";
"Lithuanian" = "Lietuvių";
"Macedonian" = "Македонски";
"NorwegianBokmal" = "Norsk bokmål";
@@ -31,6 +31,7 @@
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
"Latvian" = "Latvijas";
"Lithuanian" = "Lietuvių";
"Macedonian" = "Македонски";
"NorwegianBokmal" = "Norsk bokmål";
@@ -31,6 +31,7 @@
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
"Latvian" = "Latvijas";
"Lithuanian" = "Lietuvių";
"Macedonian" = "Македонски";
"NorwegianBokmal" = "Norsk bokmål";
@@ -30,6 +30,7 @@
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
"Latvian" = "Latvijas";
"Lithuanian" = "Lietuvių";
"NorwegianBokmal" = "Norsk bokmål";
"NorwegianNynorsk" = "Norsk nynorsk";
@@ -31,6 +31,7 @@
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
"Latvian" = "Latvijas";
"Lithuanian" = "Lietuvių";
"Macedonian" = "Македонски";
"NorwegianBokmal" = "Norsk bokmål";
@@ -31,6 +31,7 @@
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
"Latvian" = "Latvijas";
"Lithuanian" = "Lietuvių";
"NorwegianBokmal" = "Norsk bokmål";
"NorwegianNynorsk" = "Norsk nynorsk";
@@ -39,6 +39,7 @@
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
"Latvian" = "Latvijas";
"Lithuanian" = "Lietuvių";
"Macedonian" = "Македонски";
"NorwegianBokmal" = "Norsk bokmål";
@@ -31,6 +31,7 @@
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
"Latvian" = "Latvijas";
"Lithuanian" = "Lietuvių";
"Macedonian" = "Македонски";
"NorwegianBokmal" = "Norsk bokmål";
@@ -39,6 +39,7 @@
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
"Latvian" = "Latvijas";
"Lithuanian" = "Lietuvių";
"Macedonian" = "Македонски";
"NorwegianBokmal" = "Norsk bokmål";
@@ -39,6 +39,7 @@
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
"Latvian" = "Latvijas";
"Lithuanian" = "Lietuvių";
"Macedonian" = "Македонски";
"NorwegianBokmal" = "Norsk bokmål";
@@ -39,6 +39,7 @@
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
"Latvian" = "Latvijas";
"Lithuanian" = "Lietuvių";
"Macedonian" = "Македонски";
"NorwegianBokmal" = "Norsk bokmål";
@@ -39,6 +39,7 @@
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
"Latvian" = "Latvijas";
"Lithuanian" = "Lietuvių";
"Macedonian" = "Македонски";
"NorwegianBokmal" = "Norsk bokmål";
@@ -39,6 +39,7 @@
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
"Latvian" = "Latvijas";
"Lithuanian" = "Lietuvių";
"Macedonian" = "Македонски";
"NorwegianBokmal" = "Norsk bokmål";
@@ -39,6 +39,7 @@
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
"Latvian" = "Latvijas";
"Lithuanian" = "Lietuvių";
"Macedonian" = "Македонски";
"NorwegianBokmal" = "Norsk bokmål";
@@ -39,6 +39,7 @@
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
"Latvian" = "Latvijas";
"Lithuanian" = "Lietuvių";
"Macedonian" = "Македонски";
"NorwegianBokmal" = "Norsk bokmål";
@@ -30,6 +30,7 @@
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
"Latvian" = "Latvijas";
"Lithuanian" = "Lietuvių";
"Macedonian" = "Македонски";
"NorwegianBokmal" = "Norsk bokmål";
@@ -31,6 +31,7 @@
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
"Latvian" = "Latvijas";
"Lithuanian" = "Lietuvių";
"Macedonian" = "Македонски";
"NorwegianBokmal" = "Norsk bokmål";
+35
View File
@@ -0,0 +1,35 @@
/* Latvian */
{
NSLanguageName = "Latvian";
NSFormalName = "Latvijas";
NSLocaleCode = "lv"; /* ISO 639-1 */
NSLanguageCode = "lav"; /* 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 = (pirms, "pēdējais", "pēc", sen);
NSHourNameDesignations = ((0, pusnakts), (10, "rīts"), (12, pusdienlaiks, pusdienas), (14, "pēcpusdienā"), (19, "vakariņas"));
NSInternationalCurrencyString = EUR; /* ISO 4217 */
NSLaterTimeDesignations = ("nākamais");
NSMonthNameArray = ("Janvāris", "Februāris", Marts, "Aprīlis", Maijs, "Jūnijs", "Jūlijs", Augusts, Septembris, Oktobris, Novembris, Decembris);
NSNextDayDesignations = ("rīt");
NSNextNextDayDesignations = ("nākamā diena");
NSPriorDayDesignations = (vakar);
NSShortDateFormatString = "%m.%e.%y";
NSShortMonthNameArray = (Jan, Feb, Mar, Apr, Mai, "Jūn", "Jūl", Aug, Sept, Okt, Nov, Dec);
NSShortTimeDateFormatString = "%m.%e.%y %I:%M %p";
NSShortWeekDayNameArray = (Sv, Pr, Ot, Tr, Ce, Pk, Se);
NSThisDayDesignations = ("šodien", tagad);
NSThousandsSeparator = ",";
NSTimeDateFormatString = "%A, %B %e, %Y %I:%M:%S %p %Z";
NSTimeFormatString = "%I:%M:%S %p";
NSWeekDayNameArray = ("Svētdiena", Pirmdiena, Otrdiena, "Trešdiena", Ceturtdiena, Piektdiena, Sestdiena);
NSYearMonthWeekDesignations = (gads, "mēnesis", "nedēļa");
NSPositiveCurrencyFormatString = "€9,999.00";
NSNegativeCurrencyFormatString = "-€9,999.00";
}
@@ -0,0 +1,95 @@
/* this file is in UTF-8 format! */
"title" = "SOGo";
"Username" = "Lietotājvārds";
"Password" = "Parole";
"Domain" = "Domēns";
"Remember username" = "Atcerēties lietotājvārdu";
"Connect" = "Savienot";
/* Appears while authentication is in progress */
"Authenticating" = "Autentificēšana";
/* Appears when authentication succeeds */
"Welcome" = "Sveicināti";
"Authentication Failed" = "Autentifikācija neizdevās";
"Wrong username or password." = "Nepareizs lietotājvārds vai parole.";
"Retry" = "Mēģināt vēlreiz";
"cookiesNotEnabled" = "Jūs nevarat pieteikties, jo jūsu pārlūkprogrammas sīkfaili ir atspējoti. Lūdzu, iespējojiet sīkfailus savā pārlūkprogrammas iestatījumos un mēģiniet vēlreiz.";
"browserNotCompatible" = "Mēs esam noteikuši, ka jūsu pārlūkprogrammas versija pašlaik netiek atbalstīta šajā vietnē. Mūsu ieteikums ir izmantot Firefox. Noklikšķiniet uz tālāk norādītās saites, lai lejupielādētu visjaunāko šīs pārlūkprogrammas versiju.";
"alternativeBrowsers" = "Alternatīvi var izmantot arī šādas saderīgas pārlūkprogrammas";
"alternativeBrowserSafari" = "Alternatīvi, jūs varat arī izmantot Safari.";
"Download" = "Lejupielādēt";
"Language" = "Valoda";
"choose" = "Izvēlieties...";
"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";
"Latvian" = "Latvijas";
"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" = "Par";
"AboutBox" = "SOGo izstrādātās inversā, bezmaksas grupprogrammatūras serveris ar uzsvaru uz mērogojamību un vienkāršību.<br/><br/>\nAJAX-based sniedz bagātu SOGo Web interfeisu un atbalsta vairāki klienti, izmantojot standarta protokolus CalDAV un CardDAV.<br/><br/>\nSOGo tiek izplatīts saskaņā ar <a href=\"http://gnu.org/licenses/gpl.html\">GNU GPL</a> versiju 2 vai jaunāku un detaļas tiek izplatītas saskaņā ar GNU LGPL versiju 2. Šī ir bezmaksas programmatūra: tu vari to mainīt un izplatīt. Nav NEKĀDAS GARANTIJAS, likums to atļauj.<br/><br/>\nSkatīt <a href=\"http://www.sogo.nu/en/support/community.html\">šo lapu</a> par dažādām atbalsta iespējām.";
"Your account was locked due to too many failed attempts." = "Jūsu konts ir bloķēts, jo tika veikti pārāk daudz nesekmīgu mēģinājumu.";
"Your account was locked due to an expired password." = "Jūsu konts ir bloķēts, jo ir beidzies paroles derīguma termiņš.";
"Login failed due to unhandled error case" = "Pieteikšanās neizdevās nezināmas kļūdas dēļ";
"Change your Password" = "Mainīt paroli";
"The password was changed successfully." = "Parole sekmīgi nomainīta.";
"Your password has expired, please enter a new one below" = "Jūsu paroles derīguma termiņš ir beidzies, lūdzu, ievadiet jaunu";
"Password must not be empty." = "Parole nedrīkst būt tukša.";
"The passwords do not match. Please try again." = "Paroles nesakrīt. Lūdzu, mēģiniet vēlreiz.";
"Password Grace Period" = "Paroles derīguma periods";
"You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "Jums ir % {0} pieteikšanās atlikušas pirms jūsu konts tiks bloķēts. Lūdzu, nomainiet savu paroli preferenču logā.";
"Password about to expire" = "Paroles derīguma termiņa beigas";
"Your password is going to expire in %{0} %{1}." = "Jūsu paroles termiņš beidzas %{0} %{1}.";
"days" = "dienas";
"hours" = "stundas";
"minutes" = "minūtes";
"seconds" = "sekundes";
"Password change failed" = "Paroles maiņa neizdevās";
"Password change failed - Permission denied" = "Paroles maiņa neizdevās - Atļauja liegta";
"Password change failed - Insufficient password quality" = "Paroles maiņa neizdevās - Nepietiekama paroles kvalitāte";
"Password change failed - Password is too short" = "Paroles maiņa neizdevās - parole ir pārāk īsa";
"Password change failed - Password is too young" = "Paroles maiņa neizdevās - parole ir pārāk maza, jauna";
"Password change failed - Password is in history" = "Paroles maiņa neizdevās - parole atrodas vēsturē";
"Unhandled policy error: %{0}" = "Neapstrādāta politikas kļūda: %{0}";
"Unhandled error response" = "Neapstrādāta kļūda";
"Password change is not supported." = "Paroles maiņa nav atbalstīta.";
"Unhandled HTTP error code: %{0}" = "Neparedzēts HTTP kļūdas kods: %{0}";
"New password" = "Jauna parole";
"Confirmation" = "Apstiprinājums";
"Cancel" = "Atcelt";
"Please wait..." = "Lūdzu, uzgaidiet...";
"Close" = "Aizvērt";
"Missing search parameter" = "Trūkst meklēšanas parametru";
"Missing type parameter" = "Trūkst tipa parametru";
@@ -28,8 +28,9 @@
"German" = "Deutsch";
"Hebrew" = "עברית";
"Hungarian" = "Magyar";
"Icelandic" = "\nÍslenska";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
"Latvian" = "Latvijas";
"NorwegianBokmal" = "Norsk bokmål";
"NorwegianNynorsk" = "Norsk nynorsk";
"Polish" = "Polski";
@@ -39,6 +39,7 @@
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
"Latvian" = "Latvijas";
"Lithuanian" = "Lietuvių";
"Macedonian" = "Македонски";
"NorwegianBokmal" = "Norsk bokmål";
@@ -31,6 +31,7 @@
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
"Latvian" = "Latvijas";
"Lithuanian" = "Lietuvių";
"Macedonian" = "Македонски";
"NorwegianBokmal" = "Norsk bokmål";
@@ -31,6 +31,7 @@
"Hungarian" = "Magyar";
"Icelandic" = "Íslenska";
"Italian" = "Italiano";
"Latvian" = "Latvijas";
"Lithuanian" = "Lietuvių";
"Macedonian" = "Македонски";
"NorwegianBokmal" = "Norsk bokmål";

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