Merge pull request #178 from inverse-inc/v2

Merge from upstream 2.3.2
This commit is contained in:
Enrique J. Hernández
2015-09-30 14:26:38 +02:00
336 changed files with 10907 additions and 3498 deletions
+22
View File
@@ -25,8 +25,10 @@ trans.pl = UI/MailerUI/Polish.lproj/Localizable.strings
trans.pt_BR = UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings
trans.ru = UI/MailerUI/Russian.lproj/Localizable.strings
trans.sk = UI/MailerUI/Slovak.lproj/Localizable.strings
trans.sl_SI = UI/MailerUI/Slovenian.lproj/Localizable.strings
trans.sv = UI/MailerUI/Swedish.lproj/Localizable.strings
trans.uk = UI/MailerUI/Ukrainian.lproj/Localizable.strings
trans.zh_TW = UI/MailerUI/ChineseTaiwan.lproj/Localizable.strings
[sogo.ui-preferencesui]
source_file = UI/PreferencesUI/English.lproj/Localizable.strings
@@ -52,8 +54,10 @@ trans.pl = UI/PreferencesUI/Polish.lproj/Localizable.strings
trans.pt_BR = UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings
trans.ru = UI/PreferencesUI/Russian.lproj/Localizable.strings
trans.sk = UI/PreferencesUI/Slovak.lproj/Localizable.strings
trans.sl_SI = UI/PreferencesUI/Slovenian.lproj/Localizable.strings
trans.sv = UI/PreferencesUI/Swedish.lproj/Localizable.strings
trans.uk = UI/PreferencesUI/Ukrainian.lproj/Localizable.strings
trans.zh_TW = UI/PreferencesUI/ChineseTaiwan.lproj/Localizable.strings
[sogo.ui-scheduler]
source_file = UI/Scheduler/English.lproj/Localizable.strings
@@ -79,8 +83,10 @@ trans.pl = UI/Scheduler/Polish.lproj/Localizable.strings
trans.pt_BR = UI/Scheduler/BrazilianPortuguese.lproj/Localizable.strings
trans.ru = UI/Scheduler/Russian.lproj/Localizable.strings
trans.sk = UI/Scheduler/Slovak.lproj/Localizable.strings
trans.sl_SI = UI/Scheduler/Slovenian.lproj/Localizable.strings
trans.sv = UI/Scheduler/Swedish.lproj/Localizable.strings
trans.uk = UI/Scheduler/Ukrainian.lproj/Localizable.strings
trans.zh_TW = UI/Scheduler/ChineseTaiwan.lproj/Localizable.strings
[sogo.ui-contacts]
source_file = UI/Contacts/English.lproj/Localizable.strings
@@ -106,8 +112,10 @@ trans.pl = UI/Contacts/Polish.lproj/Localizable.strings
trans.pt_BR = UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings
trans.ru = UI/Contacts/Russian.lproj/Localizable.strings
trans.sk = UI/Contacts/Slovak.lproj/Localizable.strings
trans.sl_SI = UI/Contacts/Slovenian.lproj/Localizable.strings
trans.sv = UI/Contacts/Swedish.lproj/Localizable.strings
trans.uk = UI/Contacts/Ukrainian.lproj/Localizable.strings
trans.zh_TW = UI/Contacts/ChineseTaiwan.lproj/Localizable.strings
[sogo.ui-mainui]
source_file = UI/MainUI/English.lproj/Localizable.strings
@@ -133,8 +141,10 @@ trans.pl = UI/MainUI/Polish.lproj/Localizable.strings
trans.pt_BR = UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings
trans.ru = UI/MainUI/Russian.lproj/Localizable.strings
trans.sk = UI/MainUI/Slovak.lproj/Localizable.strings
trans.sl_SI = UI/MainUI/Slovenian.lproj/Localizable.strings
trans.sv = UI/MainUI/Swedish.lproj/Localizable.strings
trans.uk = UI/MainUI/Ukrainian.lproj/Localizable.strings
trans.zh_TW = UI/MainUI/ChineseTaiwan.lproj/Localizable.strings
[sogo.ui-common]
source_file = UI/Common/English.lproj/Localizable.strings
@@ -160,8 +170,10 @@ trans.pl = UI/Common/Polish.lproj/Localizable.strings
trans.pt_BR = UI/Common/BrazilianPortuguese.lproj/Localizable.strings
trans.ru = UI/Common/Russian.lproj/Localizable.strings
trans.sk = UI/Common/Slovak.lproj/Localizable.strings
trans.sl_SI = UI/Common/Slovenian.lproj/Localizable.strings
trans.sv = UI/Common/Swedish.lproj/Localizable.strings
trans.uk = UI/Common/Ukrainian.lproj/Localizable.strings
trans.zh_TW = UI/Common/ChineseTaiwan.lproj/Localizable.strings
[sogo.ui-administrationui]
source_file = UI/AdministrationUI/English.lproj/Localizable.strings
@@ -187,8 +199,10 @@ trans.pl = UI/AdministrationUI/Polish.lproj/Localizable.strings
trans.pt_BR = UI/AdministrationUI/BrazilianPortuguese.lproj/Localizable.strings
trans.ru = UI/AdministrationUI/Russian.lproj/Localizable.strings
trans.sk = UI/AdministrationUI/Slovak.lproj/Localizable.strings
trans.sl_SI = UI/AdministrationUI/Slovenian.lproj/Localizable.strings
trans.sv = UI/AdministrationUI/Swedish.lproj/Localizable.strings
trans.uk = UI/AdministrationUI/Ukrainian.lproj/Localizable.strings
trans.zh_TW = UI/AdministrationUI/ChineseTaiwan.lproj/Localizable.strings
[sogo.soobjects-appointments]
source_file = SoObjects/Appointments/English.lproj/Localizable.strings
@@ -214,8 +228,10 @@ trans.pl = SoObjects/Appointments/Polish.lproj/Localizable.strings
trans.pt_BR = SoObjects/Appointments/BrazilianPortuguese.lproj/Localizable.strings
trans.ru = SoObjects/Appointments/Russian.lproj/Localizable.strings
trans.sk = SoObjects/Appointments/Slovak.lproj/Localizable.strings
trans.sl_SI = SoObjects/Appointments/Slovenian.lproj/Localizable.strings
trans.sv = SoObjects/Appointments/Swedish.lproj/Localizable.strings
trans.uk = SoObjects/Appointments/Ukrainian.lproj/Localizable.strings
trans.zh_TW = SoObjects/Appointments/ChineseTaiwan.lproj/Localizable.strings
[sogo.soobjects-contacts]
source_file = SoObjects/Contacts/English.lproj/Localizable.strings
@@ -241,8 +257,10 @@ trans.pl = SoObjects/Contacts/Polish.lproj/Localizable.strings
trans.pt_BR = SoObjects/Contacts/BrazilianPortuguese.lproj/Localizable.strings
trans.ru = SoObjects/Contacts/Russian.lproj/Localizable.strings
trans.sk = SoObjects/Contacts/Slovak.lproj/Localizable.strings
trans.sl_SI = SoObjects/Contacts/Slovenian.lproj/Localizable.strings
trans.sv = SoObjects/Contacts/Swedish.lproj/Localizable.strings
trans.uk = SoObjects/Contacts/Ukrainian.lproj/Localizable.strings
trans.zh_TW = SoObjects/Contacts/ChineseTaiwan.lproj/Localizable.strings
[sogo.soobjects-mailer]
source_file = SoObjects/Mailer/English.lproj/Localizable.strings
@@ -268,8 +286,10 @@ trans.pl = SoObjects/Mailer/Polish.lproj/Localizable.strings
trans.pt_BR = SoObjects/Mailer/BrazilianPortuguese.lproj/Localizable.strings
trans.ru = SoObjects/Mailer/Russian.lproj/Localizable.strings
trans.sk = SoObjects/Mailer/Slovak.lproj/Localizable.strings
trans.sl_SI = SoObjects/Mailer/Slovenian.lproj/Localizable.strings
trans.sv = SoObjects/Mailer/Swedish.lproj/Localizable.strings
trans.uk = SoObjects/Mailer/Ukrainian.lproj/Localizable.strings
trans.zh_TW = SoObjects/Mailer/ChineseTaiwan.lproj/Localizable.strings
[sogo.ui-mailpartviewers]
source_file = UI/MailPartViewers/English.lproj/Localizable.strings
@@ -295,5 +315,7 @@ trans.pl = UI/MailPartViewers/Polish.lproj/Localizable.strings
trans.pt_BR = UI/MailPartViewers/BrazilianPortuguese.lproj/Localizable.strings
trans.ru = UI/MailPartViewers/Russian.lproj/Localizable.strings
trans.sk = UI/MailPartViewers/Slovak.lproj/Localizable.strings
trans.sl_SI = UI/MailPartViewers/Slovenian.lproj/Localizable.strings
trans.sv = UI/MailPartViewers/Swedish.lproj/Localizable.strings
trans.uk = UI/MailPartViewers/Ukrainian.lproj/Localizable.strings
trans.zh_TW = UI/MailPartViewers/ChineseTaiwan.lproj/Localizable.strings
+112 -44
View File
@@ -133,6 +133,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[[o properties] removeObjectForKey: @"MoreAvailable"];
[[o properties] removeObjectForKey: @"BodyPreferenceType"];
[[o properties] removeObjectForKey: @"SuccessfulMoveItemsOps"];
[[o properties] removeObjectForKey: @"InitialLoadSequence"];
[[o properties] addEntriesFromDictionary: values];
[o save];
@@ -159,7 +160,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
NSString *nameInCache;
if (theFolderType == ActiveSyncMailFolder)
nameInCache= [[[theCollection mailAccountFolder] imapFolderGUIDs] objectForKey: [theCollection nameInContainer]];
nameInCache = [imapFolderGUIDS objectForKey: [theCollection nameInContainer]];
else
{
NSString *component_name;
@@ -170,7 +171,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
else
component_name = @"vtodo";
nameInCache= [NSString stringWithFormat: @"%@/%@", component_name, [theCollection nameInContainer]];
nameInCache = [NSString stringWithFormat: @"%@/%@", component_name, [theCollection nameInContainer]];
}
return nameInCache;
@@ -283,7 +284,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
serverId = [NSString stringWithFormat: @"%@.ics", [theCollection globallyUniqueObjectId]];
sogoObject = [[SOGoTaskObject alloc] initWithName: serverId
inContainer: theCollection];
o = [sogoObject component: YES secure: NO];
o = [sogoObject component: YES secure: NO];
}
break;
case ActiveSyncMailFolder:
@@ -311,10 +312,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
syncCache = [folderMetadata objectForKey: @"SyncCache"];
dateCache = [folderMetadata objectForKey: @"DateCache"];
[syncCache setObject: [folderMetadata objectForKey: @"SyncKey"] forKey: serverId];
[syncCache setObject: [NSString stringWithFormat:@"%f", [[sogoObject lastModified] timeIntervalSince1970]] forKey: serverId];
[dateCache setObject: [NSCalendarDate date] forKey: serverId];
[self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]];
}
}
@@ -365,6 +366,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
NSString *serverId;
NSArray *changes;
id aChange, o, sogoObject;
NSMutableDictionary *folderMetadata, *syncCache;
int i;
@@ -372,6 +374,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
if ([changes count])
{
folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: theCollection withType: theFolderType]];
syncCache = [folderMetadata objectForKey: @"SyncCache"];
for (i = 0; i < [changes count]; i++)
{
aChange = [changes objectAtIndex: i];
@@ -398,6 +403,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
o = [sogoObject vCard];
[o takeActiveSyncValues: allChanges inContext: context];
[sogoObject saveComponent: o];
[syncCache setObject: [NSString stringWithFormat:@"%f", [[sogoObject lastModified] timeIntervalSince1970]] forKey: serverId];
}
break;
case ActiveSyncEventFolder:
@@ -406,15 +414,30 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
o = [sogoObject component: NO secure: NO];
[o takeActiveSyncValues: allChanges inContext: context];
[sogoObject saveComponent: o];
[syncCache setObject: [NSString stringWithFormat:@"%f", [[sogoObject lastModified] timeIntervalSince1970]] forKey: serverId];
}
break;
case ActiveSyncMailFolder:
default:
{
NSDictionary *result;
NSString *modseq;
[sogoObject takeActiveSyncValues: allChanges inContext: context];
result = [sogoObject fetchParts: [NSArray arrayWithObject: @"MODSEQ"]];
modseq = [[[result objectForKey: @"RawResponse"] objectForKey: @"fetch"] objectForKey: @"modseq"];
if (modseq)
[syncCache setObject: modseq forKey: serverId];
}
}
[self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]];
[theBuffer appendString: @"<Change>"];
[theBuffer appendFormat: @"<ServerId>%@</ServerId>", serverId];
[theBuffer appendFormat: @"<Status>%d</Status>", 1];
@@ -487,7 +510,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
if (![sogoObject isKindOfClass: [NSException class]])
{
// FIXME: handle errors here
if (deletesAsMoves)
if (deletesAsMoves && theFolderType == ActiveSyncMailFolder)
[(SOGoMailFolder *)[sogoObject container] deleteUIDs: [NSArray arrayWithObjects: serverId, nil] useTrashFolder: &useTrash inContext: context];
else
[sogoObject delete];
@@ -651,7 +674,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
NSDictionary *component;
NSArray *allComponents;
BOOL updated;
BOOL updated, initialLoadInProgress;
int deleted, return_count;
if (theFolderType == ActiveSyncContactFolder)
@@ -661,8 +684,24 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
else
component_name = @"vtodo";
allComponents = [theCollection syncTokenFieldsWithProperties: nil matchingSyncToken: theSyncKey fromDate: theFilterType];
allComponents = [allComponents sortedArrayUsingDescriptors: [NSArray arrayWithObjects: [[NSSortDescriptor alloc] initWithKey: @"c_lastmodified" ascending:YES], nil]];
initialLoadInProgress = NO;
if ([theSyncKey isEqualToString: @"-1"])
[folderMetadata setObject: davCollectionTagToStore forKey: @"InitialLoadSequence"];
if ([folderMetadata objectForKey: @"InitialLoadSequence"])
{
if ([theSyncKey intValue] < [[folderMetadata objectForKey: @"InitialLoadSequence"] intValue])
initialLoadInProgress = YES;
else
[folderMetadata removeObjectForKey: @"InitialLoadSequence"];
}
allComponents = [theCollection syncTokenFieldsWithProperties: nil
matchingSyncToken: theSyncKey
fromDate: theFilterType
initialLoad: initialLoadInProgress];
allComponents = [allComponents sortedArrayUsingDescriptors: [NSArray arrayWithObject: [[[NSSortDescriptor alloc] initWithKey: @"c_lastmodified" ascending: YES] autorelease]]];
// Check for the WindowSize
@@ -825,12 +864,35 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
NSMutableArray *allCacheObjects, *sortedBySequence;
SOGoMailObject *mailObject;
NSArray *allMessages;
NSArray *allMessages, *a;
int j, k, return_count;
BOOL found_in_cache;
int j, k, return_count, highestmodseq;
BOOL found_in_cache, initialLoadInProgress;
allMessages = [theCollection syncTokenFieldsWithProperties: nil matchingSyncToken: theSyncKey fromDate: theFilterType];
initialLoadInProgress = NO;
if ([theSyncKey isEqualToString: @"-1"])
{
highestmodseq = 0;
a = [[theCollection davCollectionTag] componentsSeparatedByString: @"-"];
[folderMetadata setObject: [a objectAtIndex: 1] forKey: @"InitialLoadSequence"];
}
else
{
a = [theSyncKey componentsSeparatedByString: @"-"];
highestmodseq = [[a objectAtIndex: 1] intValue];
}
if ([folderMetadata objectForKey: @"InitialLoadSequence"])
{
if (highestmodseq < [[folderMetadata objectForKey: @"InitialLoadSequence"] intValue])
initialLoadInProgress = YES;
else
[folderMetadata removeObjectForKey: @"InitialLoadSequence"];
}
allMessages = [theCollection syncTokenFieldsWithProperties: nil matchingSyncToken: theSyncKey fromDate: theFilterType initialLoad: initialLoadInProgress];
max = [allMessages count];
allCacheObjects = [NSMutableArray array];
@@ -889,7 +951,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
NSString *lastSequence;
more_available = YES;
lastSequence = ([[aCacheObject sequence] isEqual: [NSNull null]] ? @"1" : [aCacheObject sequence]);
lastSequence = ([[aCacheObject sequence] isEqual: [NSNull null]] ? [NSString stringWithFormat:@"%d", highestmodseq] : [aCacheObject sequence]);
*theLastServerKey = [[NSString alloc] initWithFormat: @"%@-%@", [aCacheObject uid], lastSequence];
//NSLog(@"Reached windowSize - lastUID will be: %@", *theLastServerKey);
DESTROY(pool);
@@ -910,6 +972,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[syncCache removeObjectForKey: [aCacheObject uid]];
[dateCache removeObjectForKey: [aCacheObject uid]];
return_count++;
}
else
{
@@ -919,17 +983,20 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
inContext: context
acquire: 0];
[s appendString: @"<Change xmlns=\"AirSync:\">"];
[s appendFormat: @"<ServerId xmlns=\"AirSync:\">%@</ServerId>", [aCacheObject uid]];
[s appendString: @"<ApplicationData xmlns=\"AirSync:\">"];
[s appendString: [mailObject activeSyncRepresentationInContext: context]];
[s appendString: @"</ApplicationData>"];
[s appendString: @"</Change>"];
if (![[aCacheObject sequence] isEqual: [syncCache objectForKey: [aCacheObject uid]]])
{
[s appendString: @"<Change xmlns=\"AirSync:\">"];
[s appendFormat: @"<ServerId xmlns=\"AirSync:\">%@</ServerId>", [aCacheObject uid]];
[s appendString: @"<ApplicationData xmlns=\"AirSync:\">"];
[s appendString: [mailObject activeSyncRepresentationInContext: context]];
[s appendString: @"</ApplicationData>"];
[s appendString: @"</Change>"];
return_count++;
}
[syncCache setObject: [aCacheObject sequence] forKey: [aCacheObject uid]];
}
return_count++;
}
else
{
@@ -1204,22 +1271,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[context setObject: bodyPreferenceType forKey: @"BodyPreferenceType"];
// We generate the commands, if any, for the response. We might also have
// generated some in processSyncCommand:inResponse: as we could have
// received a Fetch command
if (getChanges && !first_sync)
{
[self processSyncGetChanges: theDocumentElement
inCollection: collection
withWindowSize: windowSize
withMaxSyncResponseSize: theMaxSyncResponseSize
withSyncKey: syncKey
withFolderType: folderType
withFilterType: [NSCalendarDate dateFromFilterType: [[(id)[theDocumentElement getElementsByTagName: @"FilterType"] lastObject] textValue]]
inBuffer: changeBuffer
lastServerKey: &lastServerKey];
}
//
// We process the commands from the request
//
@@ -1237,12 +1288,29 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
inBuffer: s
processed: &processed];
// Windows phons don't empty Responses tags - such as: <Responses></Responses>.
// We onnly generate this tag when the command has generated a response.
// Windows phones don't like empty Responses tags - such as: <Responses></Responses>.
// We only generate this tag when there is a response
if (processed && [s length])
[commandsBuffer appendFormat: @"<Responses>%@</Responses>", s];
}
// We generate the commands, if any, for the response. We might also have
// generated some in processSyncCommand:inResponse: as we could have
// received a Fetch command
if (getChanges && !first_sync)
{
[self processSyncGetChanges: theDocumentElement
inCollection: collection
withWindowSize: windowSize
withMaxSyncResponseSize: theMaxSyncResponseSize
withSyncKey: syncKey
withFolderType: folderType
withFilterType: [NSCalendarDate dateFromFilterType: [[(id)[theDocumentElement getElementsByTagName: @"FilterType"] lastObject] textValue]]
inBuffer: changeBuffer
lastServerKey: &lastServerKey];
}
folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: collection withType: folderType]];
// If we got any changes or if we have applied any commands
@@ -1267,7 +1335,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{
// Make sure that client is updated with the right syncKey. - This keeps vtodo's and vevent's syncKey in sync.
syncKeyInCache = [folderMetadata objectForKey: @"SyncKey"];
if (syncKeyInCache && !([davCollectionTag isEqualToString:syncKeyInCache]) && ![davCollectionTag isEqualToString: @"-1"])
if (syncKeyInCache && !([davCollectionTag isEqualToString:syncKeyInCache]) && !first_sync)
{
davCollectionTag = syncKeyInCache;
*changeDetected = YES;
+1
View File
@@ -37,6 +37,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@interface SOGoActiveSyncDispatcher : NSObject
{
NSURL *folderTableURL;
NSDictionary *imapFolderGUIDS;
id context;
}
+61 -18
View File
@@ -151,12 +151,14 @@ static BOOL debugOn = NO;
debugOn = [[SOGoSystemDefaults sharedSystemDefaults] easDebugEnabled];
folderTableURL = nil;
imapFolderGUIDS = nil;
return self;
}
- (void) dealloc
{
RELEASE(folderTableURL);
RELEASE(imapFolderGUIDS);
[super dealloc];
}
@@ -229,23 +231,27 @@ static BOOL debugOn = NO;
SOGoMailAccounts *accountsFolder;
SOGoMailAccount *accountFolder;
SOGoUserFolder *userFolder;
NSDictionary *imapGUIDs;
userFolder = [[context activeUser] homeFolderInContext: context];
accountsFolder = [userFolder lookupName: @"Mail" inContext: context acquire: NO];
accountFolder = [accountsFolder lookupName: @"0" inContext: context acquire: NO];
// Get the GUID of the IMAP folder
imapGUIDs = [accountFolder imapFolderGUIDs];
//return [[imapGUIDs allKeysForObject: theIdToTranslate] objectAtIndex: 0];
return [[[imapGUIDs allKeysForObject: [NSString stringWithFormat: @"folder%@", theIdToTranslate]] objectAtIndex: 0] substringFromIndex: 6] ;
if (!imapFolderGUIDS)
{
userFolder = [[context activeUser] homeFolderInContext: context];
accountsFolder = [userFolder lookupName: @"Mail" inContext: context acquire: NO];
accountFolder = [accountsFolder lookupName: @"0" inContext: context acquire: NO];
// Get the GUID of the IMAP folder
imapFolderGUIDS = [accountFolder imapFolderGUIDs];
[imapFolderGUIDS retain];
}
return [[[imapFolderGUIDS allKeysForObject: [NSString stringWithFormat: @"folder%@", theIdToTranslate]] objectAtIndex: 0] substringFromIndex: 6] ;
}
return theIdToTranslate;
}
//
//
//
@@ -699,7 +705,7 @@ static BOOL debugOn = NO;
SOGoMailAccount *accountFolder;
NSMutableString *s, *commands;
SOGoUserFolder *userFolder;
NSMutableArray *folders;
NSMutableArray *folders, *processedFolders;
SoSecurityManager *sm;
SOGoCacheGCSObject *o;
id currentFolder;
@@ -719,6 +725,8 @@ static BOOL debugOn = NO;
command_count = 0;
commands = [NSMutableString string];
processedFolders = [NSMutableArray array];
[s appendString: @"<?xml version=\"1.0\" encoding=\"utf-8\"?>"];
[s appendString: @"<!DOCTYPE ActiveSync PUBLIC \"-//MICROSOFT//DTD ActiveSync//EN\" \"http://www.microsoft.com/\">"];
@@ -727,7 +735,7 @@ static BOOL debugOn = NO;
first_sync = YES;
syncKey = @"1";
}
else if (![syncKey isEqualToString: [metadata objectForKey: @"FolderSyncKey"]])
else if (![metadata objectForKey: @"FolderSyncKey"])
{
// Synchronization key mismatch or invalid synchronization key
//NSLog(@"FolderSync syncKey mismatch %@ <> %@", syncKey, metadata);
@@ -862,7 +870,13 @@ static BOOL debugOn = NO;
serverId = [NSString stringWithFormat: @"mail/%@", [[imapGUIDs objectForKey: nameInCache] substringFromIndex: 6]];
name = [folderMetadata objectForKey: @"displayName"];
// avoid duplicate folders if folder is returned by different imap namespaces
if ([processedFolders indexOfObject: serverId] == NSNotFound)
[processedFolders addObject: serverId];
else
continue;
if ([name hasPrefix: @"/"])
name = [name substringFromIndex: 1];
@@ -874,7 +888,10 @@ static BOOL debugOn = NO;
if ([folderMetadata objectForKey: @"parent"])
{
parentId = [NSString stringWithFormat: @"mail/%@", [[imapGUIDs objectForKey: [NSString stringWithFormat: @"folder%@", [[folderMetadata objectForKey: @"parent"] substringFromIndex: 1]]] substringFromIndex: 6]];
// make sure that parent of main-folders is always 0
if (type == 12)
parentId = [NSString stringWithFormat: @"mail/%@", [[imapGUIDs objectForKey: [NSString stringWithFormat: @"folder%@", [[folderMetadata objectForKey: @"parent"] substringFromIndex: 1]]] substringFromIndex: 6]];
name = [[name pathComponents] lastObject];
}
@@ -927,6 +944,7 @@ static BOOL debugOn = NO;
[[o properties] removeObjectForKey: @"MoreAvailable"];
[[o properties] removeObjectForKey: @"BodyPreferenceType"];
[[o properties] removeObjectForKey: @"SuccessfulMoveItemsOps"];
[[o properties] removeObjectForKey: @"InitialLoadSequence"];
[o save];
command_count++;
@@ -1012,6 +1030,7 @@ static BOOL debugOn = NO;
[[o properties] removeObjectForKey: @"MoreAvailable"];
[[o properties] removeObjectForKey: @"BodyPreferenceType"];
[[o properties] removeObjectForKey: @"SuccessfulMoveItemsOps"];
[[o properties] removeObjectForKey: @"InitialLoadSequence"];
}
[o save];
@@ -1035,6 +1054,7 @@ static BOOL debugOn = NO;
[[o properties] removeObjectForKey: @"MoreAvailable"];
[[o properties] removeObjectForKey: @"BodyPreferenceType"];
[[o properties] removeObjectForKey: @"SuccessfulMoveItemsOps"];
[[o properties] removeObjectForKey: @"InitialLoadSequence"];
}
[o save];
@@ -1193,7 +1213,7 @@ static BOOL debugOn = NO;
filter = [NSCalendarDate dateFromFilterType: [[(id)[[allCollections objectAtIndex: j] getElementsByTagName: @"FilterType"] lastObject] textValue]];
syncKey = [[(id)[[allCollections objectAtIndex: j] getElementsByTagName: @"SyncKey"] lastObject] textValue];
allMessages = [currentCollection syncTokenFieldsWithProperties: nil matchingSyncToken: syncKey fromDate: filter];
allMessages = [currentCollection syncTokenFieldsWithProperties: nil matchingSyncToken: syncKey fromDate: filter initialLoad: NO];
count = [allMessages count];
@@ -2565,7 +2585,7 @@ static BOOL debugOn = NO;
NGMimeFileData *fdata;
NSException *error;
NSArray *attachmentKeys;
NSMutableArray *attachments;
NSMutableArray *attachments, *references;
id body, bodyFromSmartForward, htmlPart, textPart;
NSString *fullName, *email, *charset, *s;
@@ -2604,7 +2624,30 @@ static BOOL debugOn = NO;
[map setObject: email forKey: @"from"];
if ([mailObject messageId])
[map setObject: [mailObject messageId] forKey: @"in-reply-to"];
{
[map setObject: [mailObject messageId] forKey: @"in-reply-to"];
references = [[[[[mailObject mailHeaders] objectForKey: @"references"] componentsSeparatedByString: @" "] mutableCopy] autorelease];
// If there is no References: header, initialize it with In-Reply-To.
if ([mailObject inReplyTo] && ![references count])
references = [NSMutableArray arrayWithObject: [mailObject inReplyTo]];
if ([references count] > 0)
{
// If there are more than ten identifiers listed, we eliminate the second one.
if ([references count] >= 10)
[references removeObjectAtIndex: 1];
[references addObject: [mailObject messageId]];
[map setObject: [references componentsJoinedByString:@" "] forKey: @"references"];
}
else
{
[map setObject: [mailObject messageId] forKey: @"references"];
}
}
messageToSend = [[[NGMimeMessage alloc] initWithHeader: map] autorelease];
body = [[[NGMimeMultipartBody alloc] initWithPart: messageToSend] autorelease];
@@ -2874,7 +2917,7 @@ static BOOL debugOn = NO;
activeUser = [context activeUser];
if (![activeUser canAccessModule: @"ActiveSync"])
{
[theResponse setStatus: 403];
[(WOResponse *)theResponse setStatus: 403];
[self logWithFormat: @"EAS - Forbidden access for user %@", [activeUser loginInDomain]];
return nil;
}
+81 -17
View File
@@ -77,6 +77,41 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#import <Appointments/SOGoAptMailNotification.h>
unsigned char strToChar(char a, char b) {
char encoder[3] = {'\0','\0','\0'};
encoder[0] = a;
encoder[1] = b;
return (char) strtol(encoder,NULL,16);
}
@interface NSString (NSStringExtensions)
- (NSData *) decodeFromHexidecimal;
@end
@implementation NSString (NSStringExtensions)
- (NSData *) decodeFromHexidecimal;
{
const char * bytes = [self cStringUsingEncoding: NSUTF8StringEncoding];
NSUInteger length = strlen(bytes);
unsigned char * r = (unsigned char *) malloc(length / 2 + 1);
unsigned char * index = r;
while ((*bytes) && (*(bytes +1))) {
*index = strToChar(*bytes, *(bytes +1));
index++;
bytes+=2;
}
*index = '\0';
NSData * result = [NSData dataWithBytes: r length: length / 2];
free(r);
return result;
}
@end
typedef struct {
uint32_t dwLowDateTime;
uint32_t dwHighDateTime;
@@ -91,7 +126,7 @@ struct GlobalObjectId {
FILETIME CreationTime;
uint8_t X[8];
uint32_t Size;
uint8_t* Data;
uint8_t Data[0];
};
@implementation SOGoMailObject (ActiveSync)
@@ -118,39 +153,40 @@ struct GlobalObjectId {
//
// The GlobalObjId is documented here: http://msdn.microsoft.com/en-us/library/ee160198(v=EXCHG.80).aspx
//
- (NSData *) _computeGlobalObjectIdFromEvent: (iCalEvent *) event
{
NSData *binPrefix, *globalObjectId, *uidAsASCII;
NSString *prefix, *uid;
struct GlobalObjectId newGlobalId;
struct GlobalObjectId *newGlobalId;
const char *bytes;
uid = [event uid];
uidAsASCII = [uid decodeFromHexidecimal];
newGlobalId = (struct GlobalObjectId*)calloc(sizeof(uint8_t), sizeof(struct GlobalObjectId) + 0x0c + [uidAsASCII length]);
prefix = @"040000008200e00074c5b7101a82e008";
// dataPrefix is "vCal-Uid %x01 %x00 %x00 %x00"
uint8_t dataPrefix[] = { 0x76, 0x43, 0x61, 0x6c, 0x2d, 0x55, 0x69, 0x64, 0x01, 0x00, 0x00, 0x00 };
uid = [event uid];
binPrefix = [prefix convertHexStringToBytes];
[binPrefix getBytes: &newGlobalId.ByteArrayID];
[self _setInstanceDate: &newGlobalId
[binPrefix getBytes: &newGlobalId->ByteArrayID];
[self _setInstanceDate: newGlobalId
fromDate: [event recurrenceId]];
uidAsASCII = [uid dataUsingEncoding: NSASCIIStringEncoding];
bytes = [uidAsASCII bytes];
// 0x0c is the size of our dataPrefix
newGlobalId.Size = 0x0c + [uidAsASCII length];
newGlobalId.Data = malloc(newGlobalId.Size * sizeof(uint8_t));
memcpy(newGlobalId.Data, dataPrefix, 0x0c);
memcpy(newGlobalId.Data + 0x0c, bytes, newGlobalId.Size - 0x0c);
newGlobalId->Size = 0x0c + [uidAsASCII length];
memcpy(newGlobalId->Data, dataPrefix, 0x0c);
memcpy(newGlobalId->Data + 0x0c, bytes, newGlobalId->Size - 0x0c);
globalObjectId = [[NSData alloc] initWithBytes: &newGlobalId length: 40 + newGlobalId.Size*sizeof(uint8_t)];
free(newGlobalId.Data);
globalObjectId = [[NSData alloc] initWithBytes: newGlobalId length: 40 + newGlobalId->Size*sizeof(uint8_t)];
free(newGlobalId);
return [globalObjectId autorelease];
}
//
// For debugging purposes...
//
@@ -514,6 +550,28 @@ struct GlobalObjectId {
return d;
}
- (NSString *) _getNormalizedSubject
{
NSString *subject;
NSUInteger colIdx;
NSString *stringValue;
subject = [[self subject] decodedHeader];
colIdx = [subject rangeOfString: @":" options:NSBackwardsSearch].location;
if (colIdx != NSNotFound && colIdx + 1 < [subject length])
stringValue = [[subject substringFromIndex: colIdx + 1] stringByTrimmingLeadSpaces];
else
stringValue = subject;
if (!stringValue)
stringValue = @"";
return stringValue;
}
//
//
//
@@ -627,7 +685,7 @@ struct GlobalObjectId {
if (value)
{
[s appendFormat: @"<Subject xmlns=\"Email:\">%@</Subject>", [value activeSyncRepresentationInContext: context]];
[s appendFormat: @"<ThreadTopic xmlns=\"Email:\">%@</ThreadTopic>", [value activeSyncRepresentationInContext: context]];
[s appendFormat: @"<ThreadTopic xmlns=\"Email:\">%@</ThreadTopic>", [[self _getNormalizedSubject] activeSyncRepresentationInContext: context]];
}
// DateReceived
@@ -1013,7 +1071,13 @@ struct GlobalObjectId {
if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"14.0"] ||
[[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"14.1"])
{
if ([self inReplyTo])
NSString *reference;
reference = [[[[self mailHeaders] objectForKey: @"references"] componentsSeparatedByString: @" "] objectAtIndex: 0];
if ([reference length] > 0)
[s appendFormat: @"<ConversationId xmlns=\"Email2:\">%@</ConversationId>", [[reference dataUsingEncoding: NSUTF8StringEncoding] activeSyncRepresentationInContext: context]];
else if ([self inReplyTo])
[s appendFormat: @"<ConversationId xmlns=\"Email2:\">%@</ConversationId>", [[[self inReplyTo] dataUsingEncoding: NSUTF8StringEncoding] activeSyncRepresentationInContext: context]];
else if ([self messageId])
[s appendFormat: @"<ConversationId xmlns=\"Email2:\">%@</ConversationId>", [[[self messageId] dataUsingEncoding: NSUTF8StringEncoding] activeSyncRepresentationInContext: context]];
+2235
View File
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -1035,8 +1035,8 @@ repository
|ModulesConstraints (optional)
|Limits the access of any module through a constraint based on an LDAP
attribute; must be a dictionary with keys `Mail`, and/or `Calendar`, for
example:
attribute; must be a dictionary with keys `Mail`, and/or `Calendar`,
and/or `ActiveSync` for example:
----
ModulesConstraints = {
@@ -233,6 +233,7 @@ Installation
This section will guide you through the installation of the native
Microsoft Outlook compatibility layer SOGo offers.
////
Red Hat Enterprise Linux v6 x86_64
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -316,7 +317,7 @@ from this guide.
On Ubuntu 12.04, the Samba init scripts need to be modified to
disable the upstart check. For more details, refer to:
https://wiki.samba.org/index.php/Samba4/InitScript
////
Debian 8 (Jessie) and Ubuntu 14.04 (Trusty Tahr)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -395,7 +396,7 @@ samba-tool user setexpiry administrator --noexpiry
----
You might consider changing the realm and domain used, to suit your
enviroment.
environment.
You might also have to
remove `/etc/samba/smb.conf` prior running this command.
@@ -441,7 +442,7 @@ Your Samba 4 configuration file should look like this:
OpenChange Configuration
~~~~~~~~~~~~~~~~~~~~~~~~
OpenChange 2.2 stores its metadata in MySQL so you need to have it installed.
Since v2.2, OpenChange stores its metadata in MySQL so you need to have it installed.
First, create the OpenChange MySQL user:
@@ -512,9 +513,11 @@ mapistore:indexing_backend = mysql://openchange-user:openchange$123@localhost/op
mapiproxy:openchangedb = mysql://openchange-user:openchange$123@localhost/openchange
----
////
On RHEL, make sure SELinux is disabled:
setenforce 0
////
Next, you can start Samba using the usual command:
@@ -545,9 +548,11 @@ This service runs as a WSGI application under apache (mod_wsgi).
While HTTPS is not required to access this service, it is strongly
recommended.
////
On RHEL-based distributions, the apache configuration required by these
services can be found in `/etc/httpd/conf.d/ocsmanager.conf` and
`/etc/httpd/conf.d/rpcproxy.conf`.
////
For Debian-based distributions, these files can be found
in `/etc/apache2/conf.d/` or `/etc/apache2/conf-available`.
@@ -563,8 +568,10 @@ The OCS Manager and RPC Proxy configuration module can be enabled using:
a2enconf ocsmanager
a2enconf rpcproxy
////
On RHEL-based distributions, make sure the `LoadModule` directive is
uncommented in `/etc/httpd/conf.d/wsgi.conf`.
////
The _reqtimeout_ apache module is known to cause problems when using the
default configuration shipped with Debian-based systems. On such
@@ -580,10 +587,12 @@ To avoid this problem, use a much higher timeout or disable the module:
a2dismod reqtimeout
You should now restart the Apache service and make sure it will start on
boot. On RHEL-based distributions, do:
boot.
////
On RHEL-based distributions, do:
chkconfig httpd on && /etc/init.d/httpd restart
////
On Debian-based distributions, do:
update-rc.d apache2 defaults && /etc/init.d/apache2 restart
@@ -813,7 +822,7 @@ the `openchange_user_cleanup` script distributed with SOGo. The script
can be found in `/usr/share/doc/sogo/` (`/usr/share/sogo-VERSION/` on
RHEL).
To reset a user, run the script as root:
`python openchange_user_cleanup username`. See the usage output for additional options.
`openchange_user_cleanup username`. See the usage output for additional options.
* The "Out of Office Assistant" will not currently work. This feature
has not been implemented.
* Creating folders below INBOX (when not normally permitted by the IMAP
+3 -3
View File
@@ -1,7 +1,7 @@
<!-- TODO have the build system take care of this -->
<releaseinfo>Version 2.3.0 - June 2015</releaseinfo>
<subtitle>for version 2.3.0</subtitle>
<date>2015-06-01</date>
<releaseinfo>Version 2.3.2 - September 2015</releaseinfo>
<subtitle>for version 2.3.2</subtitle>
<date>2015-09-16</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.0
:release_version: 2.3.2
// vim: set syntax=asciidoc tabstop=2 shiftwidth=2 expandtab:
+46 -1
View File
@@ -1,4 +1,37 @@
2.3.1 (2015-06-XX)
2.3.3 (2015-mm-dd)
------------------
New features
Enhancements
Bug fixes
2.3.2 (2015-09-16)
------------------
Enhancements
- improved EAS speed and memory usage, avoiding many IMAP LIST commands (#3294)
- improved EAS speed during initial syncing of large mailboxes (#3293)
- updated CKEditor to version 4.5.3
Bug fixes
- fixed display of whitelisted attendees in Preferences window on Firefox (#3285)
- non-latin subfolder names are displayed correctly on Outlook (Zentyal)
- fixed several sync issues on environments with multiple users (Zentyal)
- folders from other users will no longer appear on your Outlook (Zentyal)
- use right auth in multidomain environments in contacts and calendar from Outlook (Zentyal)
- session fix when SOGoEnableDomainBasedUID is enabled but logins are domain-less
- less sync issues when setting read flag (Zentyal)
- attachments with non-latin filenames sent by Outlook are now received (Zentyal)
- support attachments from more mail clients (Zentyal)
- avoid conflicting message on saving a draft mail (Zentyal)
- less conflicting messages in Outlook while moving messages between folders (Zentyal)
- start/end shifting by 1 hour due to timezone change on last Sunday of October 2015 (#3344)
- fixed localization of calendar categories with empty profile (#3295)
- fixed options availability in contextual menu of Contacts module (#3342)
2.3.1 (2015-07-23)
------------------
Enhancements
@@ -6,6 +39,12 @@ Enhancements
- now always enforce the organizer's default identity in appointments
- improved the handling of default calendar categories/colors (#3200)
- added support for DeletesAsMoves over EAS
- added create-folder subcommand to sogo-tool to create contact and calendar folders
- group mail addresses can be used as recipient in Outlook
- added 'ActiveSync' module constraints
- updated CKEditor to version 4.5.1
- added Slovenian translation - thanks to Jens Riecken
- added Chinese (Taiwan) translation
Bug fixes
- EAS's GetItemEstimate/ItemOperations now support fetching mails and empty folders
@@ -17,6 +56,12 @@ Bug fixes
- fixed multi-domain support for sogo-tool backup/restore (#2600)
- fixed data ordering in events list of Calendar module (#3261)
- fixed data ordering in tasks list of Calendar module (#3267)
- Android EAS Lollipop fixes (#3268 and #3269)
- improved EAS email flagging handling (#3140)
- fixed computation of GlobalObjectId (#3235)
- fixed EAS conversation ID issues on BB10 (#3152)
- fixed CR/LF printing in event's description (#3228)
- optimized Calendar module in multidomain configurations
2.3.0 (2015-06-01)
-------------------
+36 -4
View File
@@ -161,8 +161,11 @@
minute: [tzStart minuteOfHour] second: 0
timeZone: [NSTimeZone timeZoneWithName: @"GMT"]];
tmpDate = [tmpDate addYear: 0 month: ((pos > 0) ? 0 : 1)
day: 0 hour: 0 minute: 0
tmpDate = [tmpDate addYear: 0
month: ((pos > 0) ? 0 : 1)
day: 0
hour: 0
minute: 0
second: 0];
/* If the day of the time change is "-XSU", we need to determine whether the
@@ -197,12 +200,41 @@
END:STANDARD
END:VTIMEZONE
The time changes occure on a Sunday, but in March, the 1st is a Sunday itself and in November
The time changes occur on a Sunday, but in March, the 1st is a Sunday itself and in November
the 1st is also a Sunday. If we don't decrement "pos" by one, tmpDate (which is set to March or November 1st
because of "day: 1" will have 14 more days added for March and 7 more days added for November - which will
effectively shift the time change by a whole week.
In Europe/Berlin, we have a different use-case for November. In 2015, November 1st is a Sunday.
The time change in November must occur on October 25th but since tmpDate will be November 1st,
so a Sunday, dateDayOfWeek will be 0 and dayOfWeek will also be 0 we would decrement tmpDate by 14 days,
which is incorrect because it would shift the timezone change one week earlier. We take care about this
one with check if pos is greater or equal than 0 and if so, we don't decrement it.
BEGIN:VCALENDAR
PRODID:-//Inverse inc.//NONSGML Olson 2014g//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:Europe/Berlin
X-LIC-LOCATION:Europe/Berlin
BEGIN:DAYLIGHT
TZOFFSETFROM:+0100
TZOFFSETTO:+0200
TZNAME:CEST
DTSTART:19700329T020000
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETFROM:+0200
TZOFFSETTO:+0100
TZNAME:CET
DTSTART:19701025T030000
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
END:STANDARD
END:VTIMEZONE
END:VCALENDAR
*/
if (dayOfWeek == dateDayOfWeek)
if (dayOfWeek == dateDayOfWeek && pos >= 0)
pos--;
offset = (dayOfWeek - dateDayOfWeek) + (pos * 7);
+82
View File
@@ -0,0 +1,82 @@
#!/usr/bin/env python
import sys
import os
import re
DEBUG=False
dir_mappings = {"../UI/Templates":"../UI/Common",
"../UI/Templates/AdministrationUI":"../UI/AdministrationUI",
"../UI/Templates/Appointments":"../SoObjects/Appointments",
"../UI/Templates/ContactsUI":"../UI/Contacts",
"../UI/Templates/MailerUI":"../UI/MailerUI",
"../UI/Templates/MailPartViewers":"../UI/MailPartViewers",
"../UI/Templates/MainUI":"../UI/MainUI",
"../UI/Templates/PreferencesUI":"../UI/PreferencesUI",
"../UI/Templates/SchedulerUI":"../UI/Scheduler"
}
def get_translations(path):
try:
transpath = dir_mappings.get(path, path)
transname = transpath + '/English.lproj/Localizable.strings'
transall = open(transname).read()
except:
transall = ""
return transall
def find_missing_translations(rootdir='.', extention='', recomp=None, greylist=()):
for path, dirs, files in os.walk(rootdir):
filelist = [f for f in files if f[(-1 * len(extention)):] == extention]
if filelist:
for filename in filelist:
if filename in greylist:
print "%s is greylisted -- SKIPPING" % filename
continue
pathname = path + '/' + filename
lines = open(pathname).read().split("\n")
values = [r.groups()[0] for r in [recomp.search(l) for l in lines] if r]
if values:
#- Get the current english translations for the path
transgood = get_translations(path)
if not transgood:
print "No translation file found for %s, skipping %s" % (path, pathname)
continue
notfound = list()
if DEBUG:print pathname
for value in values:
#- Try to find the value from the source file in the translation file
escaped_value = re.escape(value)
found = re.search('(%s|"%s")\s*=\s*"(.*?)";' % (escaped_value, escaped_value), transgood)
if found:
if DEBUG: print "\t", '[%s] FOUND -- "%s"' % found.groups()
else:
notfound.append("-->\t[%s] ==== Not Found ====" % value)
if notfound:
if not DEBUG:print pathname
print "\n".join(notfound)
def main():
#- Only one option...
if len(sys.argv) > 1:
if sys.argv[1] == '-g':
global DEBUG
DEBUG = True
else:
print 'Usage:', sys.argv[0], '[-g]\n\t\t-g: debug will show matching also'
sys.exit(1)
greylist = ('UIxFilterEditor.wox')
#- Get only the label:value from all lines
recomp = re.compile(' label:[^=]*="(.*?)"')
find_missing_translations('../UI', 'wox', recomp, greylist)
#- [self labelForKey: @"Issuer"]
recomp = re.compile('\[self labelForKey: @"(.*?)"\]')
find_missing_translations('../UI', 'm', recomp, ())
main()
@@ -11,16 +11,16 @@ vtodo_class2 = "(مهمة سرية)";
"The event \"%{Summary}\" was created" = "أُنشِئ الحدث \"%{Summary}\"";
"The event \"%{Summary}\" was deleted" = "حُذِفَ الحدث \"%{Summary}\"";
"The event \"%{Summary}\" was updated" = "حُدِّث الحدث \"%{Summary}\"";
"The following attendees(s) were notified:" = "تم ابلاغ المدعو (المدعويين) الأتي أسماءهم:";
"The following attendees(s) were added:" = "تم أضافة المدعو (المدعويين) الأتي أسماءهم:";
"The following attendees(s) were removed:" = "تم مسح المدعو (المدعويين) الأتي أسماءهم:";
"The following attendees(s) were notified" = "تم ابلاغ المدعو (المدعويين) الأتي أسماءهم";
"The following attendees(s) were added" = "تم أضافة المدعو (المدعويين) الأتي أسماءهم";
"The following attendees(s) were removed" = "تم مسح المدعو (المدعويين) الأتي أسماءهم";
/* IMIP messages */
"calendar_label" = "التقويم:";
"startDate_label" = "البداية:";
"endDate_label" = "النهاية:";
"calendar_label" = "التقويم";
"startDate_label" = "البداية";
"endDate_label" = "النهاية";
"due_label" = "تاريخ الاستحقاق:";
"location_label" = "المكان:";
"location_label" = "المكان";
"summary_label" = "الملخص:";
"comment_label" = "التعليق:";
@@ -12,16 +12,16 @@ vtodo_class2 = "(Isilpeko egitekoa)";
"The event \"%{Summary}\" was created" = "\"%{Summary}\" ekitaldia sortu da";
"The event \"%{Summary}\" was deleted" = "\"%{Summary}\" ekitaldia ezabatu da";
"The event \"%{Summary}\" was updated" = "\"%{Summary}\" ekitaldia eguneratu da";
"The following attendees(s) were notified:" = "Ondorengo partaidea(k) jakinarazi d(ir)a:";
"The following attendees(s) were added:" = "Ondorengo partaidea(k) gehitu d(ir)a:";
"The following attendees(s) were removed:" = "Ondorengo partaidea(k) ezabatu d(ir)a:";
"The following attendees(s) were notified" = "Ondorengo partaidea(k) jakinarazi d(ir)a";
"The following attendees(s) were added" = "Ondorengo partaidea(k) gehitu d(ir)a";
"The following attendees(s) were removed" = "Ondorengo partaidea(k) ezabatu d(ir)a";
/* IMIP messages */
"calendar_label" = "Egutegia";
"startDate_label" = "Hasi:";
"endDate_label" = "Amaitu:";
"startDate_label" = "Hasi";
"endDate_label" = "Amaitu";
"due_label" = "Epemuga:";
"location_label" = "Kokapena:";
"location_label" = "Kokapena";
"summary_label" = "Laburpena:";
"comment_label" = "Iruzkina:";
@@ -12,16 +12,16 @@ vtodo_class2 = "(Tarefa Confidencial)";
"The event \"%{Summary}\" was created" = "O evento \"%{Summary}\" foi criado";
"The event \"%{Summary}\" was deleted" = "O evento \"%{Summary}\" foi removido";
"The event \"%{Summary}\" was updated" = "O evento \"%{Summary}\" foi atualizado";
"The following attendees(s) were notified:" = "Estes participantes foram notificados:";
"The following attendees(s) were added:" = "Estes participantes foram adicionados:";
"The following attendees(s) were removed:" = "Estes participantes foram removidos:";
"The following attendees(s) were notified" = "Estes participantes foram notificados";
"The following attendees(s) were added" = "Estes participantes foram adicionados";
"The following attendees(s) were removed" = "Estes participantes foram removidos";
/* IMIP messages */
"calendar_label" = "Calendário:";
"startDate_label" = "Início:";
"endDate_label" = "Fim:";
"calendar_label" = "Calendário";
"startDate_label" = "Início";
"endDate_label" = "Fim";
"due_label" = "Data de Vencimento:";
"location_label" = "Local:";
"location_label" = "Local";
"summary_label" = "Resumo:";
"comment_label" = "Comentário:";
@@ -12,16 +12,16 @@ vtodo_class2 = "(Tasca confidencial)";
"The event \"%{Summary}\" was created" = "Es va crear l'esdeveniment \"%{Summary}\" ";
"The event \"%{Summary}\" was deleted" = "Es va esborrar l'esdeveniment \"%{Summary}\" ";
"The event \"%{Summary}\" was updated" = "Es va modificar l'esdeveniment \"%{Summary}\" ";
"The following attendees(s) were notified:" = "I va notificar als següents participants: ";
"The following attendees(s) were added:" = "Es van agregar els següents participants: ";
"The following attendees(s) were removed:" = "Heu suprimit els assistents següents:";
"The following attendees(s) were notified" = "I va notificar als següents participants ";
"The following attendees(s) were added" = "Es van agregar els següents participants ";
"The following attendees(s) were removed" = "Heu suprimit els assistents següents";
/* IMIP messages */
"calendar_label" = "Calendari:";
"startDate_label" = "Inici:";
"endDate_label" = "Final:";
"calendar_label" = "Calendari";
"startDate_label" = "Inici";
"endDate_label" = "Final";
"due_label" = "Data límit:";
"location_label" = "Lloc:";
"location_label" = "Lloc";
"summary_label" = "Resum:";
"comment_label" = "Comentari:";
@@ -0,0 +1,67 @@
"Inviting the following persons is prohibited:" = "禁止邀請以下人士:";
"Personal Calendar" = "個人行事曆";
vevent_class0 = "(公開事件)";
vevent_class1 = "(私人事件)";
vevent_class2 = "(機密事件)";
vtodo_class0 = "(公開任務)";
vtodo_class1 = "(私人任務)";
vtodo_class2 = "(機密任務)";
/* Receipts */
"The event \"%{Summary}\" was created" = "事件 \"%{Summary}\" 已建立";
"The event \"%{Summary}\" was deleted" = "事件\"%{Summary}\" 已刪除";
"The event \"%{Summary}\" was updated" = "事件\"%{Summary}\" 已異動";
"The following attendees(s) were notified" = "已通知下列出席者";
"The following attendees(s) were added" = "已增加下列出席者";
"The following attendees(s) were removed" = "已移除下列出席者";
/* IMIP messages */
"calendar_label" = "行事曆";
"startDate_label" = "開始";
"endDate_label" = "結束";
"due_label" = "截止日期:";
"location_label" = "地點";
"summary_label" = "事件主題:";
"comment_label" = "備註:";
/* Invitation */
"Event Invitation: \"%{Summary}\"" = "邀請事件: \"%{Summary}\"";
"(sent by %{SentBy}) " = "(來自 %{SentBy})";
"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}" = "%{Organizer} %{SentByText} 邀請您參加 %{Summary}。\n\n起始日期: %{StartDate}\n結束日期: %{EndDate}\n備註說明: %{Description}";
"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" = "%{Organizer} %{SentByText} 邀請您參加 %{Summary}。\n\n起始時間: %{StartDate} %{StartTime}\n結束時間: %{EndDate} %{EndTime}\n備註說明: %{Description}";
/* Deletion */
"Event Cancelled: \"%{Summary}\"" = "取消事件 : \"%{Summary}\"";
"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}"
= "%{Organizer} %{SentByText} 己取消事件: %{Summary}。\n\n起始日期: %{StartDate}\n結束日期: %{EndDate}\n備註說明: %{Description}";
"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"
= "%{Organizer} %{SentByText} 己取消了事件: %{Summary}。\n\n起始時間: %{StartDate} %{StartTime}\n結束時間: %{EndDate} %{EndTime}\n備註說明: %{Description}";
/* Update */
"The appointment \"%{Summary}\" for the %{OldStartDate} has changed"
= " 安排於%{OldStartDate} 的事件 \"%{Summary}\" 已變更";
"The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed"
= "安排於 %{OldStartDate} %{OldStartTime} 的事件 \"%{Summary}\" 已變更";
"The following parameters have changed in the \"%{Summary}\" meeting:"
= "已變更會議 \"%{Summary}\" 下列參數:";
"Please accept or decline those changes."
= "請接受或拒絶這些變更。";
/* Reply */
"Accepted invitation: \"%{Summary}\"" = "接受邀請: \"%{Summary}\"";
"Declined invitation: \"%{Summary}\"" = "拒絶邀請: \"%{Summary}\"";
"Delegated invitation: \"%{Summary}\"" = "\"委派出席: \"%{Summary}\"";
"Not yet decided on invitation: \"%{Summary}\"" = "未處理的邀請: \"%{Summary}\"";
"%{Attendee} %{SentByText}has accepted your event invitation."
= "\"%{Attendee} %{SentByText}已接受了您的邀請。";
"%{Attendee} %{SentByText}has declined your event invitation."
= "\"%{Attendee} %{SentByText}已拒絶了您的邀請。";
"%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}."
= "\"%{Attendee} %{SentByText}已將您的邀請委任給%{Delegate}。";
"%{Attendee} %{SentByText}has not yet decided upon your event invitation."
= "%{Attendee} %{SentByText}還沒有決定是否接受您的邀請。";
/* Resources */
"Cannot access resource: \"%{Cn} %{SystemEmail}\"" = "無法讀取資源: \"%{Cn} %{SystemEmail}\"";
"Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\". The conflicting event is \"%{EventTitle}\", and starts on %{StartDate}." = "\"%{Cn} %{SystemEmail}\" 的衝突事件己達上限 ( %{NumberOfSimultaneousBookings} )。衝突事件 \"%{EventTitle}\" 的起始日期為 %{StartDate}。";
@@ -12,16 +12,16 @@ vtodo_class2 = "(Skrytý úkol)";
"The event \"%{Summary}\" was created" = "Událost \"%{Summary}\" byla vytvořena";
"The event \"%{Summary}\" was deleted" = "Událost \"%{Summary}\" byla smazána";
"The event \"%{Summary}\" was updated" = "Událost \"%{Summary}\" byla upravena";
"The following attendees(s) were notified:" = "Následující účastníci byli upozorněni:";
"The following attendees(s) were added:" = "Následující účastníci byli přidáni:";
"The following attendees(s) were removed:" = "Následující účastníci byli odebráni:";
"The following attendees(s) were notified" = "Následující účastníci byli upozorněni";
"The following attendees(s) were added" = "Následující účastníci byli přidáni";
"The following attendees(s) were removed" = "Následující účastníci byli odebráni";
/* IMIP messages */
"calendar_label" = "Kalendář:";
"startDate_label" = "Začátek:";
"endDate_label" = "Konec:";
"calendar_label" = "Kalendář";
"startDate_label" = "Začátek";
"endDate_label" = "Konec";
"due_label" = "Termín:";
"location_label" = "Místo:";
"location_label" = "Místo";
"summary_label" = "Název:";
"comment_label" = "Komentář:";
@@ -11,16 +11,16 @@ vtodo_class2 = "(Hemmelig opgave)";
"The event \"%{Summary}\" was created" = "Begivenheden \"%{Summary}\" blev oprettet";
"The event \"%{Summary}\" was deleted" = "Begivenheden \"%{Summary}\" blev slettet";
"The event \"%{Summary}\" was updated" = "Begivenheden \"%{Summary}\" blev opdateret";
"The following attendees(s) were notified:" = "Følgende deltager(e) blev underrettet:";
"The following attendees(s) were added:" = "Følgende deltager(e) blev tilføjet:";
"The following attendees(s) were removed:" = "Følgende deltager(e) blev fjernet:";
"The following attendees(s) were notified" = "Følgende deltager(e) blev underrettet";
"The following attendees(s) were added" = "Følgende deltager(e) blev tilføjet";
"The following attendees(s) were removed" = "Følgende deltager(e) blev fjernet";
/* IMIP messages */
"calendar_label" = "Kalender:";
"startDate_label" = "Start:";
"endDate_label" = "Slut:";
"calendar_label" = "Kalender";
"startDate_label" = "Start";
"endDate_label" = "Slut";
"due_label" = "Forfaldsdato:";
"location_label" = "Sted:";
"location_label" = "Sted";
"summary_label" = "Resumé:";
"comment_label" = "Kommentér:";
@@ -12,16 +12,16 @@ vtodo_class2 = "(Vertrouwelijke taak)";
"The event \"%{Summary}\" was created" = "De gebeurtenis \"%{Summary}\" is aangemaakt";
"The event \"%{Summary}\" was deleted" = "De gebeurtenis \"%{Summary}\" is verwijderd";
"The event \"%{Summary}\" was updated" = "De gebeurtenis \"%{Summary}\" is gewijzigd";
"The following attendees(s) were notified:" = "De volgende deelnemers zijn in kennis gesteld:";
"The following attendees(s) were added:" = "De volgende deelnemers zijn toegevoegd:";
"The following attendees(s) were removed:" = "De volgende deelnemers zijn verwijderd:";
"The following attendees(s) were notified" = "De volgende deelnemers zijn in kennis gesteld";
"The following attendees(s) were added" = "De volgende deelnemers zijn toegevoegd";
"The following attendees(s) were removed" = "De volgende deelnemers zijn verwijderd";
/* IMIP messages */
"calendar_label" = "Agenda:";
"startDate_label" = "Start:";
"endDate_label" = "Einde:";
"calendar_label" = "Agenda";
"startDate_label" = "Start";
"endDate_label" = "Einde";
"due_label" = "Vervaldag:";
"location_label" = "Locatie:";
"location_label" = "Locatie";
"summary_label" = "Samenvatting:";
"comment_label" = "Commentaar:";
@@ -12,16 +12,16 @@ vtodo_class2 = "(Confidential task)";
"The event \"%{Summary}\" was created" = "The event \"%{Summary}\" was created";
"The event \"%{Summary}\" was deleted" = "The event \"%{Summary}\" was deleted";
"The event \"%{Summary}\" was updated" = "The event \"%{Summary}\" was updated";
"The following attendees(s) were notified:" = "The following attendee(s) were notified:";
"The following attendees(s) were added:" = "The following attendee(s) were added:";
"The following attendees(s) were removed:" = "The following attendee(s) were removed:";
"The following attendees(s) were notified" = "The following attendee(s) were notified";
"The following attendees(s) were added" = "The following attendee(s) were added";
"The following attendees(s) were removed" = "The following attendee(s) were removed";
/* IMIP messages */
"calendar_label" = "Calendar:";
"startDate_label" = "Start:";
"endDate_label" = "End:";
"calendar_label" = "Calendar";
"startDate_label" = "Start";
"endDate_label" = "End";
"due_label" = "Due Date:";
"location_label" = "Location:";
"location_label" = "Location";
"summary_label" = "Summary:";
"comment_label" = "Comment:";
@@ -12,16 +12,16 @@ vtodo_class2 = "(Luottamuksellinen tehtävä)";
"The event \"%{Summary}\" was created" = "Tapahtuma \"%{Summary}\" luotiin";
"The event \"%{Summary}\" was deleted" = "Tapahtuma \"%{Summary}\" poistettiin";
"The event \"%{Summary}\" was updated" = "Tapahtuma \"%{Summary}\" päivitettiin";
"The following attendees(s) were notified:" = "Seuraava(t) osallistuja(t) on informoitu:";
"The following attendees(s) were added:" = "Seuraava(t) osalllistuja(t) on lisätty:";
"The following attendees(s) were removed:" = "Seuraava(t) osalllistuja(t) poistettiin:";
"The following attendees(s) were notified" = "Seuraava(t) osallistuja(t) on informoitu";
"The following attendees(s) were added" = "Seuraava(t) osalllistuja(t) on lisätty";
"The following attendees(s) were removed" = "Seuraava(t) osalllistuja(t) poistettiin";
/* IMIP messages */
"calendar_label" = "Kalenteri:";
"startDate_label" = "Alkaa:";
"endDate_label" = "Päättyy:";
"calendar_label" = "Kalenteri";
"startDate_label" = "Alkaa";
"endDate_label" = "Päättyy";
"due_label" = "Määräpäivä:";
"location_label" = "Sijainti:";
"location_label" = "Sijainti";
"summary_label" = "Yhteenveto:";
"comment_label" = "Kommentti:";
@@ -12,16 +12,16 @@ vtodo_class2 = "(Tâche confidentielle)";
"The event \"%{Summary}\" was created" = "L'événement «%{Summary}» a été créé";
"The event \"%{Summary}\" was deleted" = "L'événement «%{Summary}» a été effacé";
"The event \"%{Summary}\" was updated" = "L'événement «%{Summary}» a été modifié";
"The following attendees(s) were notified:" = "Les invités suivants ont été avisés :";
"The following attendees(s) were added:" = "Les invités suivants ont été ajoutés :";
"The following attendees(s) were removed:" = "Les invités suivants ont été supprimés :";
"The following attendees(s) were notified" = "Les invités suivants ont été avisés ";
"The following attendees(s) were added" = "Les invités suivants ont été ajoutés ";
"The following attendees(s) were removed" = "Les invités suivants ont été supprimés ";
/* IMIP messages */
"calendar_label" = "Agenda :";
"startDate_label" = "Début :";
"endDate_label" = "Fin :";
"calendar_label" = "Agenda ";
"startDate_label" = "Début ";
"endDate_label" = "Fin ";
"due_label" = "Fin prévue :";
"location_label" = "Lieu :";
"location_label" = "Lieu ";
"summary_label" = "Titre :";
"comment_label" = "Description :";
+1 -1
View File
@@ -54,7 +54,7 @@ Appointments_RESOURCE_FILES += \
MSExchangeFreeBusySOAPResponseMap.plist \
MSExchangeFreeBusySOAPRequest.wo
Appointments_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak SpanishSpain SpanishArgentina Swedish Ukrainian Welsh
Appointments_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan ChineseTaiwan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak Slovenian SpanishSpain SpanishArgentina Swedish Ukrainian Welsh
Appointments_LOCALIZED_RESOURCE_FILES = Localizable.strings
@@ -12,16 +12,16 @@ vtodo_class2 = "(Vertrauliche Aufgabe)";
"The event \"%{Summary}\" was created" = "Der Termin \"%{Summary}\" wurde angelegt";
"The event \"%{Summary}\" was deleted" = "Der Termin \"%{Summary}\" wurde gelöscht";
"The event \"%{Summary}\" was updated" = "Der Termin \"%{Summary}\" wurde geändert";
"The following attendees(s) were notified:" = "Die folgenden Teilnehmer wurden benachrichtigt:";
"The following attendees(s) were added:" = "Die folgenden Teilnehmer wurden hinzugefügt:";
"The following attendees(s) were removed:" = "Die folgenden Teilnehmer wurden entfernt:";
"The following attendees(s) were notified" = "Die folgenden Teilnehmer wurden benachrichtigt";
"The following attendees(s) were added" = "Die folgenden Teilnehmer wurden hinzugefügt";
"The following attendees(s) were removed" = "Die folgenden Teilnehmer wurden entfernt";
/* IMIP messages */
"calendar_label" = "Kalender:";
"startDate_label" = "Beginn:";
"endDate_label" = "Ende:";
"calendar_label" = "Kalender";
"startDate_label" = "Beginn";
"endDate_label" = "Ende";
"due_label" = "Fälligkeit:";
"location_label" = "Ort:";
"location_label" = "Ort";
"summary_label" = "Zusammenfassung:";
"comment_label" = "Kommentar:";
@@ -12,16 +12,16 @@ vtodo_class2 = "(Bizalmas feladat)";
"The event \"%{Summary}\" was created" = "A \"%{Summary}\" esemény létre lett hozva";
"The event \"%{Summary}\" was deleted" = "A \"%{Summary}\" esemény törölve lett";
"The event \"%{Summary}\" was updated" = "A \"%{Summary}\" esemény módosítva lett";
"The following attendees(s) were notified:" = "Az alábbi résztvevők lettek értesítve:";
"The following attendees(s) were added:" = "Az alábbi résztvevők lettek hozzáadva:";
"The following attendees(s) were removed:" = "Az alábbi résztvevők lettek eltávolítva:";
"The following attendees(s) were notified" = "Az alábbi résztvevők lettek értesítve";
"The following attendees(s) were added" = "Az alábbi résztvevők lettek hozzáadva";
"The following attendees(s) were removed" = "Az alábbi résztvevők lettek eltávolítva";
/* IMIP messages */
"calendar_label" = "Naptár:";
"startDate_label" = "Kezdete:";
"endDate_label" = "Vége:";
"calendar_label" = "Naptár";
"startDate_label" = "Kezdete";
"endDate_label" = "Vége";
"due_label" = "Lejárat napja:";
"location_label" = "Hely:";
"location_label" = "Hely";
"summary_label" = "Összegzés:";
"comment_label" = "Megjegyzés:";
@@ -25,10 +25,10 @@ vtodo_class2 = "(Verkefni er trúnaðarmál)";
"... from the following event:" = "... af eftirfarandi viðburði:";
/* IMIP messages */
"startDate_label" = "Byrjun:";
"endDate_label" = "Endir:";
"startDate_label" = "Byrjun";
"endDate_label" = "Endir";
"due_label" = "Lokadagur:";
"location_label" = "Staðsetning:";
"location_label" = "Staðsetning";
"summary_label" = "Samantekt:";
"comment_label" = "Athugasemd:";
@@ -25,10 +25,10 @@ vtodo_class2 = "(Attività confidenziale)";
"... from the following event:" = "... dal seguente evento:";
/* IMIP messages */
"startDate_label" = "Inizio:";
"endDate_label" = "Fine:";
"startDate_label" = "Inizio";
"endDate_label" = "Fine";
"due_label" = "Scadenza:";
"location_label" = "Luogo:";
"location_label" = "Luogo";
"summary_label" = "Summario:";
"comment_label" = "Commento:";
@@ -12,16 +12,16 @@ vtodo_class2 = "(Konfidensiell oppgave)";
"The event \"%{Summary}\" was created" = "Hendelsen \"%{Summary}\" ble opprettet";
"The event \"%{Summary}\" was deleted" = "Hendelsen \"%{Summary}\" ble slettet";
"The event \"%{Summary}\" was updated" = "Hendelsen \"%{Summary}\" ble oppdatert";
"The following attendees(s) were notified:" = "Følgende deltaker(e) ble varslet:";
"The following attendees(s) were added:" = "Følgende deltaker(e) ble lagt til:";
"The following attendees(s) were removed:" = "Følgende deltaker(e) ble fjernet:";
"The following attendees(s) were notified" = "Følgende deltaker(e) ble varslet";
"The following attendees(s) were added" = "Følgende deltaker(e) ble lagt til";
"The following attendees(s) were removed" = "Følgende deltaker(e) ble fjernet";
/* IMIP messages */
"calendar_label" = "Kalender:";
"startDate_label" = "Start:";
"endDate_label" = "Slutt:";
"calendar_label" = "Kalender";
"startDate_label" = "Start";
"endDate_label" = "Slutt";
"due_label" = "Forfallsdato:";
"location_label" = "Sted:";
"location_label" = "Sted";
"summary_label" = "Sammendrag:";
"comment_label" = "Kommentar:";
@@ -25,10 +25,10 @@ vtodo_class2 = "(Konfidensiell oppgave)";
"... from the following event:" = "... fra følgende hendelse:";
/* IMIP messages */
"startDate_label" = "Start:";
"endDate_label" = "End:";
"startDate_label" = "Start";
"endDate_label" = "End";
"due_label" = "Due Date:";
"location_label" = "Location:";
"location_label" = "Location";
"summary_label" = "Summary:";
"comment_label" = "Comment:";
@@ -12,16 +12,16 @@ vtodo_class2 = "(Zadanie poufne)";
"The event \"%{Summary}\" was created" = "Utworzono wydarzenie \"%{Summary}\"";
"The event \"%{Summary}\" was deleted" = "Skasowano wydarzenie \"%{Summary}\"";
"The event \"%{Summary}\" was updated" = "Zaktualizowano wydarzenie \"%{Summary}\"";
"The following attendees(s) were notified:" = "Następujący uczestnicy zostali powiadomieni:";
"The following attendees(s) were added:" = "Następujący uczestnicy zostali dodani:";
"The following attendees(s) were removed:" = "Następujący uczestnicy zostali usunięci:";
"The following attendees(s) were notified" = "Następujący uczestnicy zostali powiadomieni";
"The following attendees(s) were added" = "Następujący uczestnicy zostali dodani";
"The following attendees(s) were removed" = "Następujący uczestnicy zostali usunięci";
/* IMIP messages */
"calendar_label" = "Kalendarz:";
"startDate_label" = "Początek:";
"endDate_label" = "Koniec:";
"calendar_label" = "Kalendarz";
"startDate_label" = "Początek";
"endDate_label" = "Koniec";
"due_label" = "Termin:";
"location_label" = "Miejsce:";
"location_label" = "Miejsce";
"summary_label" = "Podsumowanie:";
"comment_label" = "Komentarz:";
@@ -12,16 +12,16 @@ vtodo_class2 = "(Конфиденциальная задача)";
"The event \"%{Summary}\" was created" = "Было создано мероприятие \"%{Summary}\"";
"The event \"%{Summary}\" was deleted" = "Мероприятие \"%{Summary}\" было удалено";
"The event \"%{Summary}\" was updated" = "Мероприятие \"%{Summary}\" было обновлено";
"The following attendees(s) were notified:" = "Следующие приглашенные были оповещены:";
"The following attendees(s) were added:" = "Следующие люди были добавлены в список приглашенных:";
"The following attendees(s) were removed:" = "Следующие люди были исключены из списка приглашенных:";
"The following attendees(s) were notified" = "Следующие приглашенные были оповещены";
"The following attendees(s) were added" = "Следующие люди были добавлены в список приглашенных";
"The following attendees(s) were removed" = "Следующие люди были исключены из списка приглашенных";
/* IMIP messages */
"calendar_label" = "Календарь:";
"startDate_label" = "Начало:";
"endDate_label" = "Конец:";
"calendar_label" = "Календарь";
"startDate_label" = "Начало";
"endDate_label" = "Конец";
"due_label" = "Должно быть готово к:";
"location_label" = "Местонахождение:";
"location_label" = "Местонахождение";
"summary_label" = "Краткое содержание:";
"comment_label" = "Комментарий:";
@@ -160,9 +160,6 @@ typedef enum {
- (NSString *) syncTag;
- (void) setSyncTag: (NSString *) newSyncTag;
- (BOOL) synchronizeCalendar;
- (void) setSynchronizeCalendar: (BOOL) new;
- (BOOL) includeInFreeBusy;
- (void) setIncludeInFreeBusy: (BOOL) newInclude;
@@ -432,61 +432,6 @@ static Class iCalEventK = nil;
inCategory: @"FolderShowTasks"];
}
- (NSString *) syncTag
{
NSString *syncTag;
syncTag = [self folderPropertyValueInCategory: @"FolderSyncTags"];
if (!syncTag)
syncTag = @"";
return syncTag;
}
- (void) setSyncTag: (NSString *) newSyncTag
{
// Check for duplicated tags
SOGoUserSettings *settings;
NSDictionary *syncTags;
NSArray *values;
if ([newSyncTag length])
{
settings = [[context activeUser] userSettings];
syncTags = [[settings objectForKey: @"Calendar"]
objectForKey: @"FolderSyncTags"];
values = [syncTags allValues];
if (![values containsObject: newSyncTag])
[self setFolderPropertyValue: newSyncTag
inCategory: @"FolderSyncTags"];
}
else
[self setFolderPropertyValue: nil
inCategory: @"FolderSyncTags"];
}
- (BOOL) synchronizeCalendar
{
NSNumber *synchronize;
synchronize = [self folderPropertyValueInCategory: @"FolderSynchronize"];
return [synchronize boolValue];
}
- (void) setSynchronizeCalendar: (BOOL) new
{
NSNumber *synchronize;
if (new)
synchronize = [NSNumber numberWithBool: YES];
else
synchronize = nil;
[self setFolderPropertyValue: synchronize
inCategory: @"FolderSynchronize"];
}
//
// If the user is the owner of the calendar, by default we include the freebusy information.
//
+16 -16
View File
@@ -1,5 +1,5 @@
/*
Copyright (C) 2007-2014 Inverse inc.
Copyright (C) 2007-2015 Inverse inc.
Copyright (C) 2004-2005 SKYRIX Software AG
This file is part of SOGo
@@ -317,7 +317,7 @@
enumerator = [attendees objectEnumerator];
while ((currentAttendee = [enumerator nextObject]))
{
currentUID = [currentAttendee uid];
currentUID = [currentAttendee uidInContext: context];
if (currentUID)
[self _removeEventFromUID: currentUID
owner: owner
@@ -398,7 +398,7 @@
enumerator = [updateAttendees objectEnumerator];
while ((currentAttendee = [enumerator nextObject]))
{
currentUID = [currentAttendee uid];
currentUID = [currentAttendee uidInContext: context];
if (currentUID)
[self _addOrUpdateEvent: newEvent
forUID: currentUID
@@ -438,7 +438,7 @@
while ((currentAttendee = [enumerator nextObject]))
{
currentUID = [currentAttendee uid];
currentUID = [currentAttendee uidInContext: context];
if (currentUID)
{
@@ -520,7 +520,7 @@
enumerator = [theAttendees objectEnumerator];
while ((currentAttendee = [enumerator nextObject]))
{
currentUID = [currentAttendee uid];
currentUID = [currentAttendee uidInContext: context];
if (currentUID)
{
[attendees addObject: currentUID];
@@ -635,7 +635,7 @@
for (i = 0; i < [theAttendees count]; i++)
{
currentAttendee = [theAttendees objectAtIndex: i];
if ([[currentAttendee uid] isEqualToString: currentUID])
if ([[currentAttendee uidInContext: context] isEqualToString: currentUID])
break;
else
currentAttendee = nil;
@@ -713,7 +713,7 @@
enumerator = [attendees objectEnumerator];
while ((currentAttendee = [enumerator nextObject]))
{
currentUID = [currentAttendee uid];
currentUID = [currentAttendee uidInContext: context];
if (currentUID)
[self _addOrUpdateEvent: newEvent
forUID: currentUID
@@ -838,7 +838,7 @@ inRecurrenceExceptionsForEvent: (iCalEvent *) theEvent
enumerator = [updatedAttendees objectEnumerator];
while ((currentAttendee = [enumerator nextObject]))
{
currentUID = [currentAttendee uid];
currentUID = [currentAttendee uidInContext: context];
if (currentUID)
[self _addOrUpdateEvent: newEvent
forUID: currentUID
@@ -1215,7 +1215,7 @@ inRecurrenceExceptionsForEvent: (iCalEvent *) theEvent
{
[delegates addObject: otherDelegate];
delegatedUID = [otherDelegate uid];
delegatedUID = [otherDelegate uidInContext: context];
if (delegatedUID)
// Delegate attendee is a local user; remove event from their calendar
[self _removeEventFromUID: delegatedUID
@@ -1244,7 +1244,7 @@ inRecurrenceExceptionsForEvent: (iCalEvent *) theEvent
if (addDelegate)
{
delegatedUID = [delegate uid];
delegatedUID = [delegate uidInContext: context];
delegates = [NSArray arrayWithObject: delegate];
[event addToAttendees: delegate];
@@ -1271,11 +1271,11 @@ inRecurrenceExceptionsForEvent: (iCalEvent *) theEvent
[self sendResponseToOrganizer: event
from: ownerUser];
organizerUID = [[event organizer] uid];
organizerUID = [[event organizer] uidInContext: context];
// Event is an exception to a recurring event; retrieve organizer from master event
if (!organizerUID)
organizerUID = [[(iCalEntityObject*)[[event parent] firstChildWithTag: [self componentTag]] organizer] uid];
organizerUID = [[(iCalEntityObject*)[[event parent] firstChildWithTag: [self componentTag]] organizer] uidInContext: context];
if (organizerUID)
// Update the attendee in organizer's calendar.
@@ -1302,7 +1302,7 @@ inRecurrenceExceptionsForEvent: (iCalEvent *) theEvent
for (i = 0; i < [attendees count]; i++)
{
att = [attendees objectAtIndex: i];
uid = [att uid];
uid = [att uidInContext: context];
if (uid && att != attendee && ![uid isEqualToString: delegatedUID])
[self _updateAttendee: attendee
withDelegate: delegate
@@ -1461,7 +1461,7 @@ inRecurrenceExceptionsForEvent: (iCalEvent *) theEvent
{
if (delegate && ![[delegate email] isEqualToString: [attendee delegatedTo]])
{
delegatedUid = [delegate uid];
delegatedUid = [delegate uidInContext: context];
if (delegatedUid)
delegatedUser = [SOGoUser userWithLogin: delegatedUid];
if (delegatedUser != nil && [event userIsOrganizer: delegatedUser])
@@ -1831,7 +1831,7 @@ inRecurrenceExceptionsForEvent: (iCalEvent *) theEvent
// We now make sure that the organizer, if managed by SOGo, is using
// its default email when creating events and inviting attendees.
uid = [[SOGoUserManager sharedUserManager] getUIDForEmail: [[event organizer] rfc822Email]];
uid = [[event organizer] uidInContext: context];
if (uid)
{
NSDictionary *defaultIdentity;
@@ -2144,7 +2144,7 @@ inRecurrenceExceptionsForEvent: (iCalEvent *) theEvent
// occurence, and invite someone, the PUT will have the organizer in the
// recurrence-id and not in the master event. We must fix this, otherwise
// SOGo will break.
if (!recurrenceId && ![[[[[newEvent parent] events] objectAtIndex: 0] organizer] uid])
if (!recurrenceId && ![[[[[newEvent parent] events] objectAtIndex: 0] organizer] uidInContext: context])
[[[[newEvent parent] events] objectAtIndex: 0] setOrganizer: [newEvent organizer]];
if (userIsOrganizer)
@@ -11,16 +11,16 @@ vtodo_class2 = "(Dôverná úloha)";
"The event \"%{Summary}\" was created" = "Udalosť \"%{Summary}\" bola vytvorená";
"The event \"%{Summary}\" was deleted" = "Udalosť \"%{Summary}\" bola vymazaná";
"The event \"%{Summary}\" was updated" = "Udalosť \"%{Summary}\" bola aktualizovaná";
"The following attendees(s) were notified:" = "Nasledujúci účastník(ci) bol upozornený:";
"The following attendees(s) were added:" = "Nasledujúci účastník(ci) bol pridaný:";
"The following attendees(s) were removed:" = "Nasledujúci účastník(ci) bol odstránený:";
"The following attendees(s) were notified" = "Nasledujúci účastník(ci) bol upozornený";
"The following attendees(s) were added" = "Nasledujúci účastník(ci) bol pridaný";
"The following attendees(s) were removed" = "Nasledujúci účastník(ci) bol odstránený";
/* IMIP messages */
"calendar_label" = "Kalendár:";
"startDate_label" = "Začiatok:";
"endDate_label" = "Koniec:";
"calendar_label" = "Kalendár";
"startDate_label" = "Začiatok";
"endDate_label" = "Koniec";
"due_label" = "Platnosť:";
"location_label" = "Miesto:";
"location_label" = "Miesto";
"summary_label" = "Zhrnutie:";
"comment_label" = "Komentár:";
@@ -0,0 +1,67 @@
"Inviting the following persons is prohibited:" = "Povabilo za naslednje osebe je prepovedano:";
"Personal Calendar" = "Osebni koledar";
vevent_class0 = "(Javni dogodek)";
vevent_class1 = "(Osebni dogodek)";
vevent_class2 = "(Zaupni dogodek)";
vtodo_class0 = "(Javno opravilo)";
vtodo_class1 = "(Osebno opravilo)";
vtodo_class2 = "(Zaupno opravilo)";
/* Receipts */
"The event \"%{Summary}\" was created" = "Dogodek \"%{Summary}\" je bil ustvarjen";
"The event \"%{Summary}\" was deleted" = "Dogodek \"%{Summary}\" je bil izbrisan";
"The event \"%{Summary}\" was updated" = "Dogodek \"%{Summary}\" je bil posodobljen";
"The following attendees(s) were notified" = "Naslednji udeleženci so bili obveščeni";
"The following attendees(s) were added" = "Naslednji udeleženci so bili dodani";
"The following attendees(s) were removed" = "Naslednji udeleženci so bili odstranjeni";
/* IMIP messages */
"calendar_label" = "Koledar";
"startDate_label" = "Začetek";
"endDate_label" = "Konec";
"due_label" = "Datum zapadlosti:";
"location_label" = "Mesto";
"summary_label" = "Povzetek:";
"comment_label" = "Komentar:";
/* Invitation */
"Event Invitation: \"%{Summary}\"" = "Povabila na dogodek: \"%{Summary}\"";
"(sent by %{SentBy}) " = "(posladno od %{SentBy})";
"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}" = "%{Organizer} %{SentByText} te je povabil na %{Summary}.\n\n\nZačetek: %{StartDate}\nKonec: %{EndDate}\nOpis: %{Description}";
"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" = "%{Organizer} %{SentByText} te je povabil na %{Summary}.\n\n\nZačetek: %{StartDate} at %{StartTime}\nKonec: %{EndDate} at %{EndTime}\nOpis: %{Description}";
/* Deletion */
"Event Cancelled: \"%{Summary}\"" = "Dogodek odpovedan: \"%{Summary}\"";
"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}"
= "%{Organizer} %{SentByText} je odpovedal ta dogodek: %{Summary}.\n\n\nZačetek: %{StartDate}\nKonec: %{EndDate}\nOpis: %{Description}";
"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"
= "%{Organizer} %{SentByText} je odpovedal ta dogodek: %{Summary}.\n\n\nZačetek: %{StartDate} at %{StartTime}\nKonec: %{EndDate} at %{EndTime}\nOpis: %{Description}";
/* Update */
"The appointment \"%{Summary}\" for the %{OldStartDate} has changed"
= "Sestanek \"%{Summary}\" za %{OldStartDate} se je spremenil";
"The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed"
= "Sestanek \"%{Summary}\" za %{OldStartDate} at %{OldStartTime} se je spremenil";
"The following parameters have changed in the \"%{Summary}\" meeting:"
= "Naslednji parametri so se spremenil v \"%{Summary}\" srečanju:";
"Please accept or decline those changes."
= "Prosim sprejmi ali zavrni te spremembe.";
/* Reply */
"Accepted invitation: \"%{Summary}\"" = "Sprejeto povabilo: \"%{Summary}\"";
"Declined invitation: \"%{Summary}\"" = "Zavrnjeno povabilo: \"%{Summary}\"";
"Delegated invitation: \"%{Summary}\"" = "Dodeljeno povabilo: \"%{Summary}\"";
"Not yet decided on invitation: \"%{Summary}\"" = "Še neodločeno glede povabila: \"%{Summary}\"";
"%{Attendee} %{SentByText}has accepted your event invitation."
= "%{Attendee} %{SentByText} je sprejel tvoje povabilo.";
"%{Attendee} %{SentByText}has declined your event invitation."
= "%{Attendee} %{SentByText} je zavrnil tvoje povabilo.";
"%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}."
= "%{Attendee} %{SentByText} je posredoval povabilo k %{Delegate}.";
"%{Attendee} %{SentByText}has not yet decided upon your event invitation."
= "%{Attendee} %{SentByText} se še ni odločil glede tvojega povabila.";
/* Resources */
"Cannot access resource: \"%{Cn} %{SystemEmail}\"" = "Ne morem dostopati do vira: \"%{Cn} %{SystemEmail}\"";
"Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\". The conflicting event is \"%{EventTitle}\", and starts on %{StartDate}." = "Doseženo je največje število sočasnih rezervacij (%{NumberOfSimultaneousBookings}) za vir \"%{Cn} %{SystemEmail}\". Konfliktni dogodek je \"%{EventTitle}\", začel se je %{StartDate}.";
@@ -12,16 +12,16 @@ vtodo_class2 = "(Tarea confidencial)";
"The event \"%{Summary}\" was created" = "Se creó el evento \"%{Summary}\"";
"The event \"%{Summary}\" was deleted" = "Se borró el evento \"%{Summary}\"";
"The event \"%{Summary}\" was updated" = "Se actualizó la información del evento \"%{Summary}\"";
"The following attendees(s) were notified:" = "Se notificó a los siguientes participantes:";
"The following attendees(s) were added:" = "Se agregaron los siguientes participantes:";
"The following attendees(s) were removed:" = "Se removieron los siguientes participantes:";
"The following attendees(s) were notified" = "Se notificó a los siguientes participantes";
"The following attendees(s) were added" = "Se agregaron los siguientes participantes";
"The following attendees(s) were removed" = "Se removieron los siguientes participantes";
/* IMIP messages */
"calendar_label" = "Calendario:";
"startDate_label" = "Inicio:";
"endDate_label" = "Fin:";
"calendar_label" = "Calendario";
"startDate_label" = "Inicio";
"endDate_label" = "Fin";
"due_label" = "Fecha de finalización:";
"location_label" = "Lugar:";
"location_label" = "Lugar";
"summary_label" = "Resumen:";
"comment_label" = "Comentario:";
@@ -12,16 +12,16 @@ vtodo_class2 = "(Tarea confidencial)";
"The event \"%{Summary}\" was created" = "El evento \"%{Summary}\" ha sido creado";
"The event \"%{Summary}\" was deleted" = "El evento \"%{Summary}\" ha sido borrado";
"The event \"%{Summary}\" was updated" = "El evento \"%{Summary}\" ha sido actualizado";
"The following attendees(s) were notified:" = "Los invitados siguientes han sido notificado:";
"The following attendees(s) were added:" = "Los invitados siguientes han sido añadido:";
"The following attendees(s) were removed:" = "Los invitados siguientes han sido quitado:";
"The following attendees(s) were notified" = "Los invitados siguientes han sido notificado";
"The following attendees(s) were added" = "Los invitados siguientes han sido añadido";
"The following attendees(s) were removed" = "Los invitados siguientes han sido quitado";
/* IMIP messages */
"calendar_label" = "Calendario:";
"startDate_label" = "Inicio:";
"endDate_label" = "Fin:";
"calendar_label" = "Calendario";
"startDate_label" = "Inicio";
"endDate_label" = "Fin";
"due_label" = "Fecha Fin:";
"location_label" = "Localización:";
"location_label" = "Localización";
"summary_label" = "Resumen:";
"comment_label" = "Comentario:";
@@ -25,10 +25,10 @@ vtodo_class2 = "(Konfidentiell uppgift)";
"... from the following event:" = "... från följande händelse:";
/* IMIP messages */
"startDate_label" = "Startdatum:";
"endDate_label" = "Slutdatum:";
"startDate_label" = "Startdatum";
"endDate_label" = "Slutdatum";
"due_label" = "Datum:";
"location_label" = "Plats:";
"location_label" = "Plats";
"summary_label" = "Sammanfattning:";
"comment_label" = "Kommentar:";
@@ -25,10 +25,10 @@ vtodo_class2 = "(Конфіденційне завдання)";
"... from the following event:" = "... з участі в події:";
/* IMIP messages */
"startDate_label" = "Початок:";
"endDate_label" = "Кінець:";
"startDate_label" = "Початок";
"endDate_label" = "Кінець";
"due_label" = "Триватиме до:";
"location_label" = "Місце:";
"location_label" = "Місце";
"summary_label" = "Резюме:";
"comment_label" = "Коментар:";
@@ -25,10 +25,10 @@ vtodo_class2 = "(Tasg gyfrinachol)";
"... from the following event:" = "... from the following event:";
/* IMIP messages */
"startDate_label" = "Start:";
"endDate_label" = "End:";
"startDate_label" = "Start";
"endDate_label" = "End";
"due_label" = "Due Date:";
"location_label" = "Location:";
"location_label" = "Location";
"summary_label" = "Summary:";
"comment_label" = "Comment:";
@@ -184,16 +184,17 @@ NSNumber *iCalDistantFutureNumber = nil;
NSArray *oldAttendees;
unsigned int count, max;
iCalPerson *currentAttendee;
NSString *userID;
NSString *userID, *domain;
userID = [user login];
domain = [user domain];
oldAttendees = [self attendees];
max = [oldAttendees count];
newAttendees = [NSMutableArray arrayWithCapacity: max];
for (count = 0; count < max; count++)
{
currentAttendee = [oldAttendees objectAtIndex: count];
if (![[currentAttendee uid] isEqualToString: userID])
if (![[currentAttendee uidInDomain: domain] isEqualToString: userID])
[newAttendees addObject: currentAttendee];
}
+3 -4
View File
@@ -1,9 +1,6 @@
/* iCalPerson+SOGo.h - this file is part of SOGo
*
* Copyright (C) 2007-2012 Inverse inc.
*
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
* Ludovic Marcotte <lmarcotte@inverse.ca>
* Copyright (C) 2007-2015 Inverse inc.
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -32,6 +29,8 @@
- (NSString *) mailAddress;
- (NSString *) uid;
- (NSString *) uidInDomain: (NSString *) domain;
- (NSString *) uidInContext: (WOContext *) context;
- (NSString *) contactIDInContext: (WOContext *) context;
- (BOOL) hasSentBy;
- (NSString *) sentBy;
+26 -4
View File
@@ -1,9 +1,6 @@
/* iCalPerson+SOGo.m - this file is part of SOGo
*
* Copyright (C) 2007-2012 Inverse inc.
*
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
* Ludovic Marcotte <lmarcotte@inverse.ca>
* Copyright (C) 2007-2015 Inverse inc.
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -67,6 +64,31 @@ static SOGoUserManager *um = nil;
return [um getUIDForEmail: [self rfc822Email]];
}
- (NSString *) uidInContext: (WOContext *) context
{
NSString *domain;
domain = [[context activeUser] domain];
return [self uidInDomain: domain];
}
- (NSString *) uidInDomain: (NSString *) domain
{
NSDictionary *contact;
NSString *uid;
if (!um)
um = [SOGoUserManager sharedUserManager];
uid = nil;
contact = [um contactInfosForUserWithUIDorEmail: [self rfc822Email] inDomain: domain];
if (contact)
uid = [contact valueForKey: @"c_uid"];
return uid;
}
- (NSString *) contactIDInContext: (WOContext *) context
{
NSString *domain, *uid;
@@ -0,0 +1,2 @@
"Personal Address Book" = "個人通訊錄";
"Collected Address Book" = "公用通訊錄";
+1 -1
View File
@@ -27,7 +27,7 @@ Contacts_OBJC_FILES = \
Contacts_RESOURCE_FILES += \
product.plist \
Contacts_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak SpanishSpain SpanishArgentina Swedish Ukrainian Welsh
Contacts_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan ChineseTaiwan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak Slovenian SpanishSpain SpanishArgentina Swedish Ukrainian Welsh
Contacts_LOCALIZED_RESOURCE_FILES = Localizable.strings
@@ -0,0 +1,2 @@
"Personal Address Book" = "Osebni adresar";
"Collected Address Book" = "Zbrani adresar";
@@ -0,0 +1,2 @@
"OtherUsersFolderName" = "其他使用者";
"SharedFoldersName" = "共用資料匣";
+5 -2
View File
@@ -50,6 +50,8 @@ Mailer_RESOURCE_FILES += \
SOGoMailBrazilianPortugueseReply.wo \
SOGoMailCatalanForward.wo \
SOGoMailCatalanReply.wo \
SOGoMailChineseTaiwanForward.wo \
SOGoMailChineseTaiwanReply.wo \
SOGoMailCzechForward.wo \
SOGoMailCzechReply.wo \
SOGoMailDanishForward.wo \
@@ -80,6 +82,8 @@ Mailer_RESOURCE_FILES += \
SOGoMailRussianReply.wo \
SOGoMailSlovakForward.wo \
SOGoMailSlovakReply.wo \
SOGoMailSlovenianForward.wo \
SOGoMailSlovenianReply.wo \
SOGoMailSpanishSpainForward.wo \
SOGoMailSpanishSpainReply.wo \
SOGoMailSpanishArgentinaForward.wo \
@@ -91,8 +95,7 @@ Mailer_RESOURCE_FILES += \
SOGoMailWelshForward.wo \
SOGoMailWelshReply.wo
Mailer_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak SpanishSpain SpanishArgentina Swedish Ukrainian Welsh
Mailer_LANGUAGES = Arabic Basque BrazilianPortuguese ChineseTaiwan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovenian Slovenian SpanishSpain SpanishArgentina Swedish Ukrainian Welsh
Mailer_LOCALIZED_RESOURCE_FILES = Localizable.strings
@@ -86,12 +86,3 @@ signaturePlacementOnBottom: WOConditional {
condition = signaturePlacementOnTop;
negate = YES;
}
signaturePlacementOnTop: WOConditional {
condition = signaturePlacementOnTop;
}
signaturePlacementOnBottom: WOConditional {
condition = signaturePlacementOnTop;
negate = YES;
}
@@ -0,0 +1,16 @@
<#newLine/>
<#newLine/>
<#signaturePlacementOnTop><#newLine/>
<#signature/><#newLine/></#signaturePlacementOnTop>
-------- 原始信件 --------<#newLine/>
主旨: <#subject/><#newLine/>
日期: <#date/><#newLine/>
寄件者: <#from/><#newLine/>
<#hasReplyTo>回覆帳號: <#replyTo/></#hasReplyTo><#hasOrganization>公司: <#organization/></#hasOrganization>收件者: <#to/><#newLine/>
<#hasCc>副本: <#cc/></#hasCc><#hasNewsGroups>新聞群組: <#newsgroups/></#hasNewsGroups><#hasReferences>參考: <#references/></#hasReferences><#newLine/>
<#newLine/>
<#messageBody/><#newLine/>
<#signaturePlacementOnBottom><#newLine/>
<#newLine/>
<#signature/></#signaturePlacementOnBottom>
<#newLine/>
@@ -0,0 +1,88 @@
subject: WOString {
value = subject;
escapeHTML = NO;
}
date: WOString {
value = date;
escapeHTML = NO;
}
from: WOString {
value = from;
escapeHTML = NO;
}
newLine: WOString {
value = newLine;
escapeHTML = NO;
}
hasReplyTo: WOConditional {
condition = hasReplyTo;
}
replyTo: WOString {
value = replyTo;
escapeHTML = NO;
}
hasOrganization: WOConditional {
condition = hasOrganization;
}
organization: WOString {
value = organization;
escapeHTML = NO;
}
to: WOString {
value = to;
escapeHTML = NO;
}
hasCc: WOConditional {
condition = hasCc;
}
cc: WOString {
value = cc;
escapeHTML = NO;
}
hasNewsGroups: WOConditional {
condition = hasNewsGroups;
}
newsgroups: WOString {
value = newsgroups;
escapeHTML = NO;
}
hasReferences: WOConditional {
condition = hasReferences;
}
references: WOString {
value = references;
escapeHTML = NO;
}
messageBody: WOString {
value = messageBody;
escapeHTML = NO;
}
signature: WOString {
value = signature;
escapeHTML = NO;
}
signaturePlacementOnTop: WOConditional {
condition = signaturePlacementOnTop;
}
signaturePlacementOnBottom: WOConditional {
condition = signaturePlacementOnTop;
negate = YES;
}
@@ -0,0 +1,16 @@
<#replyPlacementOnTop><#newLine/>
<#newLine/>
</#replyPlacementOnTop><#signaturePlacementOnTop><#newLine/>
<#signature/><#newLine/>
</#signaturePlacementOnTop><#outlookMode>-------- 原始信件 --------<#newLine/>
主旨: <#subject/><#newLine/>
日期: <#date/><#newLine/>
寄件者: <#from/><#newLine/>
<#hasReplyTo>回覆帳號: <#replyTo/></#hasReplyTo><#hasOrganization>公司: <#organization/></#hasOrganization>收件者: <#to/><#newLine/>
<#hasCc>副本: <#cc/></#hasCc><#hasNewsGroups>新聞群組: <#newsgroups/></#hasNewsGroups><#hasReferences>參考: <#references/></#hasReferences></#outlookMode><#newLine/>
<#standardMode>日期 <#date/>, <#from/> 編輯:</#standardMode><#newLine/>
<#newLine/>
<#messageBody/><#newLine/>
<#replyPlacementOnBottom><#newLine/>
<#newLine/>
</#replyPlacementOnBottom><#signaturePlacementOnBottom><#signature/></#signaturePlacementOnBottom><#newLine/>
@@ -0,0 +1,106 @@
outlookMode: WOConditional {
condition = outlookMode;
}
standardMode: WOConditional {
condition = outlookMode;
negate = YES;
}
subject: WOString {
value = subject;
escapeHTML = NO;
}
date: WOString {
value = date;
escapeHTML = NO;
}
from: WOString {
value = from;
escapeHTML = NO;
}
newLine: WOString {
value = newLine;
escapeHTML = NO;
}
hasReplyTo: WOConditional {
condition = hasReplyTo;
}
replyTo: WOString {
value = replyTo;
escapeHTML = NO;
}
hasOrganization: WOConditional {
condition = hasOrganization;
}
organization: WOString {
value = organization;
escapeHTML = NO;
}
to: WOString {
value = to;
escapeHTML = NO;
}
hasCc: WOConditional {
condition = hasCc;
}
cc: WOString {
value = cc;
escapeHTML = NO;
}
hasNewsGroups: WOConditional {
condition = hasNewsGroups;
}
newsgroups: WOString {
value = newsgroups;
escapeHTML = NO;
}
hasReferences: WOConditional {
condition = hasReferences;
}
references: WOString {
value = references;
escapeHTML = NO;
}
messageBody: WOString {
value = messageBody;
escapeHTML = NO;
}
signature: WOString {
value = signature;
escapeHTML = NO;
}
replyPlacementOnTop: WOConditional {
condition = replyPlacementOnTop;
}
replyPlacementOnBottom: WOConditional {
condition = replyPlacementOnTop;
negate = YES;
}
signaturePlacementOnTop: WOConditional {
condition = signaturePlacementOnTop;
}
signaturePlacementOnBottom: WOConditional {
condition = signaturePlacementOnTop;
negate = YES;
}
@@ -86,12 +86,3 @@ signaturePlacementOnBottom: WOConditional {
condition = signaturePlacementOnTop;
negate = YES;
}
signaturePlacementOnTop: WOConditional {
condition = signaturePlacementOnTop;
}
signaturePlacementOnBottom: WOConditional {
condition = signaturePlacementOnTop;
negate = YES;
}
+2 -1
View File
@@ -98,7 +98,8 @@
- (NSArray *) syncTokenFieldsWithProperties: (NSDictionary *) properties
matchingSyncToken: (NSString *) syncToken
fromDate: (NSCalendarDate *) theStartDate;
fromDate: (NSCalendarDate *) theStartDate
initialLoad: (BOOL) initialLoadInProgress;
/* flags */
+5 -1
View File
@@ -2090,6 +2090,7 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data)
- (NSArray *) syncTokenFieldsWithProperties: (NSArray *) theProperties
matchingSyncToken: (NSString *) theSyncToken
fromDate: (NSCalendarDate *) theStartDate
initialLoad: (BOOL) initialLoadInProgress
{
EOQualifier *searchQualifier;
NSMutableArray *allTokens;
@@ -2166,6 +2167,9 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data)
for (i = 0; i < [fetchResults count]; i++)
{
if ([[[fetchResults objectAtIndex: i] objectForKey: @"flags"] containsObject: @"deleted"] && initialLoadInProgress)
continue;
d = [NSDictionary dictionaryWithObject: ([[[fetchResults objectAtIndex: i] objectForKey: @"flags"] containsObject: @"deleted"]) ? [NSNull null] : [[fetchResults objectAtIndex: i] objectForKey: @"modseq"]
forKey: [[[fetchResults objectAtIndex: i] objectForKey: @"uid"] stringValue]];
[allTokens addObject: d];
@@ -2176,7 +2180,7 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data)
if (highestmodseq == 0)
highestmodseq = 1;
if (highestmodseq > 0)
if (highestmodseq > 0 && !initialLoadInProgress)
{
id uid;
+6
View File
@@ -49,6 +49,9 @@
@interface SOGoMailCatalanForward : SOGoMailForward
@end
@interface SOGoMailChineseTaiwanForward : SOGoMailForward
@end
@interface SOGoMailCzechForward : SOGoMailForward
@end
@@ -103,6 +106,9 @@
@interface SOGoMailSlovakForward : SOGoMailForward
@end
@interface SOGoMailSlovenianForward : SOGoMailForward
@end
@interface SOGoMailUkrainianForward : SOGoMailForward
@end
+6
View File
@@ -260,6 +260,9 @@
@implementation SOGoMailCatalanForward
@end
@implementation SOGoMailChineseTaiwanForward
@end
@implementation SOGoMailCzechForward
@end
@@ -314,6 +317,9 @@
@implementation SOGoMailSlovakForward
@end
@implementation SOGoMailSlovenianForward
@end
@implementation SOGoMailUkrainianForward
@end
+6
View File
@@ -48,6 +48,9 @@
@interface SOGoMailCatalanReply : SOGoMailReply
@end
@interface SOGoMailChineseTaiwanReply : SOGoMailReply
@end
@interface SOGoMailCzechReply : SOGoMailReply
@end
@@ -102,6 +105,9 @@
@interface SOGoMailSlovakReply : SOGoMailReply
@end
@interface SOGoMailSlovenianReply : SOGoMailReply
@end
@interface SOGoMailUkrainianReply : SOGoMailReply
@end
+6
View File
@@ -98,6 +98,9 @@
@implementation SOGoMailCatalanReply
@end
@implementation SOGoMailChineseTaiwanReply
@end
@implementation SOGoMailCzechReply
@end
@@ -152,6 +155,9 @@
@implementation SOGoMailSlovakReply
@end
@implementation SOGoMailSlovenianReply
@end
@implementation SOGoMailUkrainianReply
@end
@@ -0,0 +1,16 @@
<#newLine/>
<#newLine/>
<#signaturePlacementOnTop><#newLine/>
<#signature/><#newLine/></#signaturePlacementOnTop>
-------- Original Message --------<#newLine/>
Zadeva: <#subject/><#newLine/>
Datum: <#date/><#newLine/>
Od: <#from/><#newLine/>
<#hasReplyTo>Odgovori: <#replyTo/></#hasReplyTo><#hasOrganization>Organizacija: <#organization/></#hasOrganization>Za: <#to/><#newLine/>
<#hasCc>KP: <#cc/></#hasCc><#hasNewsGroups>Novicarske skupine: <#newsgroups/></#hasNewsGroups><#hasReferences>Reference: <#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>-------- Izvorno sporocilo --------<#newLine/>
Zadeva: <#subject/><#newLine/>
Datum: <#date/><#newLine/>
Od: <#from/><#newLine/>
<#hasReplyTo>Odgovori: <#replyTo/></#hasReplyTo><#hasOrganization>Organizacija: <#organization/></#hasOrganization>Za: <#to/><#newLine/>
<#hasCc>KP: <#cc/></#hasCc><#hasNewsGroups>Novicarske skupine: <#newsgroups/></#hasNewsGroups><#hasReferences>Reference: <#references/></#hasReferences></#outlookMode><#newLine/>
<#standardMode>Dne <#date/>, je <#from/> napisal-a:</#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;
}
@@ -0,0 +1,2 @@
"OtherUsersFolderName" = "Ostali uporabniki";
"SharedFoldersName" = "Mape v skupni rabi";
+2 -4
View File
@@ -39,11 +39,11 @@
SOGoLoginModule = "Mail";
SOGoLanguage = "English";
SOGoSupportedLanguages = ( "Arabic", "Basque", "Catalan", "Czech", "Dutch", "Danish", "Welsh", "English",
SOGoSupportedLanguages = ( "Arabic", "Basque", "Catalan", "ChineseTaiwan", "Czech", "Dutch", "Danish", "Welsh", "English",
"SpanishSpain", "SpanishArgentina", "Finnish", "French", "German",
"Icelandic", "Italian", "Hungarian", "BrazilianPortuguese",
"NorwegianBokmal", "NorwegianNynorsk", "Polish", "Russian", "Slovak",
"Ukrainian", "Swedish" );
"Slovenian", "Ukrainian", "Swedish" );
SOGoTimeZone = "UTC";
SOGoDayStartTime = "8";
@@ -87,8 +87,6 @@
$label5 = ("Later", "#993399");
};
SOGoCalendarCategories = ("Customer", "Calls", "Favorites", "Meeting", "Ideas", "Miscellaneous", "Birthday", "Anniversary", "Vacation", "Travel", "Projects", "Suppliers", "Gifts", "Clients", "Issues", "Business", "Holidays", "Personal", "Status", "Competition", "Follow up", "Public Holiday");
SOGoCalendarCategoriesColors = { "Customer" = "#F0F0F0"; "Calls" = "#F0F0F0"; "Favorites" = "#F0F0F0"; "Meeting" = "#F0F0F0"; "Ideas" = "#F0F0F0"; "Miscellaneous" = "#F0F0F0"; "Birthday" = "#F0F0F0"; "Anniversary" = "#F0F0F0"; "Vacation" = "#F0F0F0"; "Travel" = "#F0F0F0"; "Projects" = "#F0F0F0"; "Suppliers" = "#F0F0F0"; "Gifts" = "#F0F0F0"; "Clients" = "#F0F0F0"; "Issues" = "#F0F0F0"; "Business" = "#F0F0F0"; "Holidays" = "#F0F0F0"; "Personal" = "#F0F0F0"; "Status" = "#F0F0F0"; "Competition" = "#F0F0F0"; "Follow up" = "#F0F0F0"; "Public Holiday" = "#F0F0F0"; };
SOGoSubscriptionFolderFormat = "%{FolderName} (%{UserName} <%{Email}>)";
+5 -2
View File
@@ -77,6 +77,9 @@
- (id) folderPropertyValueInCategory: (NSString *) theKey
forUser: (SOGoUser *) theUser;
- (BOOL) synchronize;
- (void) setSynchronize: (BOOL) new;
/* lower level fetches */
- (void) deleteEntriesWithIds: (NSArray *) ids;
@@ -128,8 +131,8 @@
- (NSArray *) syncTokenFieldsWithProperties: (NSDictionary *) properties
matchingSyncToken: (NSString *) syncToken
fromDate: (NSCalendarDate *) theStartDate;
fromDate: (NSCalendarDate *) theStartDate
initialLoad: (BOOL) initialLoadInProgress;
/* multiget helper */
- (WOResponse *) performMultigetInContext: (WOContext *) queryContext
+38 -8
View File
@@ -301,6 +301,29 @@ static NSArray *childRecordFields = nil;
return name;
}
- (BOOL) synchronize
{
NSNumber *synchronize;
synchronize = [self folderPropertyValueInCategory: @"FolderSynchronize"];
return [synchronize boolValue];
}
- (void) setSynchronize: (BOOL) new
{
NSNumber *synchronize;
if (new)
synchronize = [NSNumber numberWithBool: YES];
else
synchronize = nil;
[self setFolderPropertyValue: synchronize
inCategory: @"FolderSynchronize"];
}
/* This method fetches the display name defined by the owner, but is also the
fallback when a subscriber has not redefined the display name yet in their
environment. */
@@ -1151,6 +1174,7 @@ static NSArray *childRecordFields = nil;
- (NSArray *) syncTokenFieldsWithProperties: (NSDictionary *) properties
matchingSyncToken: (NSString *) syncToken
fromDate: (NSCalendarDate *) theStartDate
initialLoad: (BOOL) initialLoadInProgress
{
/* TODO:
- validation:
@@ -1200,13 +1224,17 @@ static NSArray *childRecordFields = nil;
mRecords = [NSMutableArray arrayWithArray: [self _fetchFields: fields
withQualifier: qualifier
ignoreDeleted: YES]];
qualifier = [EOQualifier qualifierWithQualifierFormat:
@"c_lastmodified > %d and c_deleted == 1",
syncTokenInt];
fields = [NSMutableArray arrayWithObjects: @"c_name", @"c_lastmodified", @"c_deleted", nil];
[mRecords addObjectsFromArray: [self _fetchFields: fields
withQualifier: qualifier
ignoreDeleted: NO]];
if (!initialLoadInProgress)
{
qualifier = [EOQualifier qualifierWithQualifierFormat:
@"c_lastmodified > %d and c_deleted == 1",
syncTokenInt];
fields = [NSMutableArray arrayWithObjects: @"c_name", @"c_lastmodified", @"c_deleted", nil];
[mRecords addObjectsFromArray: [self _fetchFields: fields
withQualifier: qualifier
ignoreDeleted: NO]];
}
records = mRecords;
}
else
@@ -1499,7 +1527,9 @@ static NSArray *childRecordFields = nil;
properties = [self parseDAVRequestedProperties: propElement];
records = [self syncTokenFieldsWithProperties: properties
matchingSyncToken: syncToken
fromDate: nil];
fromDate: nil
initialLoad: NO];
[self _appendComponentProperties: [properties allKeys]
fromRecords: records
matchingSyncToken: [syncToken intValue]
+4 -1
View File
@@ -780,7 +780,10 @@ static Class NSNullK;
NSRange r;
r = [theUID rangeOfString: [NSString stringWithFormat: @"@%@", theDomain]];
theUID = [theUID substringToIndex: r.location];
// We check if the range is ok here since we could be using DomainLessLogin
if (r.location != NSNotFound)
theUID = [theUID substringToIndex: r.location];
}
sogoSources = [[self authenticationSourceIDsInDomain: theDomain] objectEnumerator];
+2
View File
@@ -489,10 +489,12 @@
forKey: [field substringFromIndex: 2]];
}
// FIXME
// We have to do this here since we do not manage modules
// constraints right now over a SQL backend.
[response setObject: [NSNumber numberWithBool: YES] forKey: @"CalendarAccess"];
[response setObject: [NSNumber numberWithBool: YES] forKey: @"MailAccess"];
[response setObject: [NSNumber numberWithBool: YES] forKey: @"ActiveSyncAccess"];
// We set the domain, if any
value = nil;
+2 -2
View File
@@ -10,11 +10,11 @@ import sogoLogin
# must be kept in sync with SoObjects/SOGo/SOGoDefaults.plist
# this should probably be fetched magically...
SOGoSupportedLanguages = [ "Arabic", "Basque", "Catalan", "Czech", "Dutch", "Danish", "Welsh", "English", "Finnish",
SOGoSupportedLanguages = [ "Arabic", "Basque", "Catalan", "ChineseTaiwan", "Czech", "Dutch", "Danish", "Welsh", "English", "Finnish",
"SpanishSpain", "SpanishArgentina", "French", "German",
"Icelandic", "Italian", "Hungarian", "BrazilianPortuguese",
"NorwegianBokmal", "NorwegianNynorsk", "Polish", "Russian", "Slovak",
"Ukrainian", "Swedish" ];
"Slovenian", "Ukrainian", "Swedish" ];
daysBetweenResponseList=[1,2,3,5,7,14,21,30]
class HTTPPreferencesPOST (webdavlib.HTTPPOST):
+1 -1
View File
@@ -35,7 +35,7 @@
{
const char *inStrings[] = { "éléphant", "", "sogo+test", NULL };
const char **inString;
NSString *outStrings[] = { @"%C3%A9l%C3%A9phant", @"2%C5%A1", @"sogo+test" };
NSString *outStrings[] = { @"%C3%A9l%C3%A9phant", @"2%C5%A1", @"sogo%2Btest" };
NSString **outString;
NSString *result, *error;
+9 -1
View File
@@ -116,13 +116,19 @@ static NSURL *tableURL = nil;
- (void) _removeUserFolders: (NSString *) userId
{
NSArray *folderPaths;
NSString *path;
int count, max;
folderPaths = [self _userFolderPaths: userId];
max = [folderPaths count];
if (max > 0)
for (count = 0; count < max; count++)
[fm deleteFolderAtPath: [folderPaths objectAtIndex: count]];
{
path = [folderPaths objectAtIndex: count];
[fm deleteFolderAtPath: path];
if (verbose)
NSLog (@"Deleting %@", path);
}
else
NSLog (@"No folder returned for user '%@'", userId);
}
@@ -144,6 +150,8 @@ static NSURL *tableURL = nil;
userId];
if ([fc evaluateExpressionX: sql])
NSLog (@"Unable to delete the preference record for '%@'", userId);
else if (verbose)
NSLog (@"Removed preference record for '%@'", userId);
[cm releaseChannel: fc];
}
}
@@ -0,0 +1,15 @@
/* this file is in UTF-8 format! */
"Help" = "幫助";
"Close" = "關閉";
"Modules" = "模組";
/* Modules short names */
"ACLs" = "存取控制清單";
/* Modules titles */
"ACLs_title" = "使用者資料匣存取控制清單";
/* Modules descriptions */
"ACLs_description" = "\"<p>存取控制清單管理模組允許異動每個使用者行事曆及通訊錄的使用權限。</p><p>如要修改使用者資料匣的使用權限,請在視窗上方的搜尋欄位輸入使用者名稱後,將遊標移到要修改的資料匣上連續按兩下滑鼠。</p>";
+1 -1
View File
@@ -6,7 +6,7 @@ BUNDLE_NAME = AdministrationUI
AdministrationUI_PRINCIPAL_CLASS = AdministrationUIProduct
AdministrationUI_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan Czech Danish Dutch English Finnish French German Hungarian Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak SpanishSpain SpanishArgentina Swedish Ukrainian Welsh
AdministrationUI_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan ChineseTaiwan Czech Danish Dutch English Finnish French German Hungarian Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak Slovenian SpanishSpain SpanishArgentina Swedish Ukrainian Welsh
AdministrationUI_OBJC_FILES = \
AdministrationUIProduct.m \
@@ -0,0 +1,15 @@
/* this file is in UTF-8 format! */
"Help" = "Pomoč";
"Close" = "Zapri";
"Modules" = "Moduli";
/* Modules short names */
"ACLs" = "ACLi";
/* Modules titles */
"ACLs_title" = "Urejanje uporabniških map ACL";
/* Modules descriptions */
"ACLs_description" = "<p>The Access Control Lists administration module allows to change the ACLs of each user's Calendars and Address books.</p><p>To modify the ACLs of a user's folder, type the name of the user in the search field at the top of the window and double-click on the desired folder.</p>";
@@ -0,0 +1,118 @@
/* this file is in UTF-8 format! */
/* toolbars */
"Save" = "儲存";
"Close" = "關閉";
"Edit User Rights" = "編輯使用者權限";
"Home" = "首頁";
"Calendar" = "行事曆";
"Address Book" = "通訊錄";
"Mail" = "郵件";
"Preferences" = "個人設定";
"Administration" = "管理";
"Disconnect" = "離線";
"Right Administration" = "管理權限";
"Log Console (dev.)" = "登錄控制台(dev.)";
"User" = "使用者";
"Vacation message is enabled" = "啟用休假自動回覆訊息功能";
"Help" = "幫助";
"noJavascriptError" = "SOGo 需要執行Javascript指令。請確定您的瀏覽器偏好設定該選項是開啟的。";
"noJavascriptRetry" = "重試";
"Owner:" = "擁有者";
"Publish the Free/Busy information" = "公開空閒/忙錄的訊息";
"Add..." = "增加...";
"Remove" = "移除";
"Subscribe User" = "訂閱者";
"Any Authenticated User" = "任何授權使用者";
"Public Access" = "公開存取";
"Any user not listed above" = "列表以外的使用者";
"Anybody accessing this resource from the public area" = "由公開區域存取資源的任何人";
"Sorry, the user rights can not be configured for that object." = "對不起, 使用者的權限無法操作這個項目。";
"Any user with an account on this system will be able to access your mailbox \"%{0}\". Are you certain you trust them all?"
= "這個系統的所有帳號都能存取您的郵件信箱\"%{0}\"。您確定所有帳號都可以信任嗎?";
"Any user with an account on this system will be able to access your calendar \"%{0}\". Are you certain you trust them all?"
= "這個系統的所有帳號都能存取您的行事曆 \"%{0}\"。您確定所有帳號都可以信任嗎?";
"Potentially anyone on the Internet will be able to access your calendar \"%{0}\", even if they do not have an account on this system. Is this information suitable for the public Internet?"
= "任何人都可以存取您的行事曆 \"%{0}\", 且不限定只有同系統的帳號。確定要在網路上公開行事曆嗎?";
"Any user with an account on this system will be able to access your address book \"%{0}\". Are you certain you trust them all?"
= "這個系統的所有帳號都能存取您的通訊錄 \"%{0}\"。您確定所有帳號都可以信任嗎?";
"Potentially anyone on the Internet will be able to access your address book \"%{0}\", even if they do not have an account on this system. Is this information suitable for the public Internet?"
= "任何人都可以存取您的通訊錄 \"%{0}\", 且不限定只有同系統的帳號。確定要在網路上公開通訊錄嗎?";
"Give Access" = "允許存取";
"Keep Private" = "保持隱私";
/* generic.js */
"Unable to subscribe to that folder!"
= "無法訂閱這個資料匣!";
"You cannot subscribe to a folder that you own!"
= "您不能訂閱自己的資料匣!";
"Unable to unsubscribe from that folder!"
= "無法在資料匣取消訂閱!";
"You cannot unsubscribe from a folder that you own!"
= "您不能取消訂閱自己的資料匣!";
"Unable to rename that folder!" = "不能更改資料匣的名稱!";
"You have already subscribed to that folder!"
= "您己經訂閱了這個資料匣!";
"The user rights cannot be edited for this object!"
= "使用者的權限無法編輯這個項目!";
"A folder by that name already exists." = "己有相同名稱的資料匣。";
"You cannot create a list in a shared address book."
= "您無法在共用的通訊錄新增列表。";
"Warning" = "警告";
"Can't contact server" = "連接伺服器失敗。請稍後再試。";
"You are not allowed to access this module or this system. Please contact your system administrator."
= "您沒有權限存取這個模組或系統。請聯絡您的系統管理者。";
"You don't have the required privileges to perform the operation."
= "您沒有權限執行這項操作。";
"noEmailForDelegation" = "您必須指定代理人的電子郵件地址。";
"delegate is organizer" = "您指定的代理人是組織;請另外指定。";
"delegate is a participant" = "您指定的代理人己經是受邀者。";
"delegate is a group" = "您指定的電子郵件帳號為群組。您必須指定代理人的電子郵件帳號。";
"Snooze for " = "提醒";
"5 minutes" = "5分鐘";
"10 minutes" = "10分鐘";
"15 minutes" = "15分鐘";
"30 minutes" = "30分鐘";
"45 minutes" = "45分鐘";
"1 hour" = " 1小時";
"1 day" = "1天";
/* common buttons */
"OK" = "確定";
"Cancel" = "取消";
"Yes" = "是";
"No" = "不是";
/* alarms */
"Reminder:" = "提醒";
"Start:" = "開始:";
"Due Date:" = "到期日:";
"Location:" = "地點:";
/* mail labels */
"Important" = "重要等級";
"Work" = "工作";
"Personal" = "私人";
"To Do" = "待辦";
"Later" = "稍後";
"a2_Sunday" = "星期日";
"a2_Monday" = "星期一";
"a2_Tuesday" = "星期二";
"a2_Wednesday" = "星期三";
"a2_Thursday" = "星期四";
"a2_Friday" = "星期五";
"a2_Saturday" = "星期六";
+1 -1
View File
@@ -6,7 +6,7 @@ BUNDLE_NAME = CommonUI
CommonUI_PRINCIPAL_CLASS = CommonUIProduct
CommonUI_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak SpanishSpain SpanishArgentina Swedish Ukrainian Welsh
CommonUI_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan ChineseTaiwan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak Slovenian SpanishSpain SpanishArgentina Swedish Ukrainian Welsh
CommonUI_OBJC_FILES += \
CommonUIProduct.m \
@@ -0,0 +1,118 @@
/* this file is in UTF-8 format! */
/* toolbars */
"Save" = "Shrani";
"Close" = "Zapri";
"Edit User Rights" = "Uredi pravice uporabnika";
"Home" = "Domov";
"Calendar" = "Koledar";
"Address Book" = "Adresar";
"Mail" = "Pošta";
"Preferences" = "Nastavitve";
"Administration" = "Administracija";
"Disconnect" = "Prekini povezavo";
"Right Administration" = "Pravica administriranja";
"Log Console (dev.)" = "Log konzole (dev.)";
"User" = "Uporabnik";
"Vacation message is enabled" = "Obvestilo o odsotnosti je omogočeno";
"Help" = "Pomoč";
"noJavascriptError" = "SOGo zahteva zagnan Javascript. Prosim zagotovi, da je ta možnost omogočena in aktivirana v tvojih nastavitvah brskalnika.";
"noJavascriptRetry" = "Ponovi";
"Owner:" = "Lastnik:";
"Publish the Free/Busy information" = "Objavi informacijo Prosto/Zasedeno ";
"Add..." = "Dodaj...";
"Remove" = "Odstrani";
"Subscribe User" = "Naroči uporabnika";
"Any Authenticated User" = "Katerikoli preverjeni uporabnik";
"Public Access" = "Javni dostop";
"Any user not listed above" = "Katerikoli navedeni uporabnik zgoraj";
"Anybody accessing this resource from the public area" = "Katerikoli, ki dostopa ta vir iz javnega območja";
"Sorry, the user rights can not be configured for that object." = "Oprosti, pravice za uporabnika ni mogoče konfigurirati za ta objekt.";
"Any user with an account on this system will be able to access your mailbox \"%{0}\". Are you certain you trust them all?"
= "Katerikoli uporabnik z računom na tem sistemu bo lahko dostopal do tvojega poštnega predala \"%{0}\". Si prepričan, da zaupaš vsem?";
"Any user with an account on this system will be able to access your calendar \"%{0}\". Are you certain you trust them all?"
= "Katerikoli uporabnik z računom na tem sistemu bo lahko dostopal do tvojega koledarja \"%{0}\". Si prepričan, da zaupaš vsem?";
"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?"
= "Kdorkoli na internetu bo imel možnost dostopa do tvojega koledarja \"%{0}\" tudi, če nima računa na tem sistemu. Je ta informacija primerna za javni internet?";
"Any user with an account on this system will be able to access your address book \"%{0}\". Are you certain you trust them all?"
= "Katerikoli uporabnik z računom na tem sistemu bo lahko dostopal do tvojega adresarja \"%{0}\". Si preričan, da zaupaš vsem?";
"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?"
= "Kdorkoli na internetu bo imel možnost dostopa do tvojega adresarja \"%{0}\" tudi, če nima računa na tem sistemu. Je ta informacija primerna za javni internet?";
"Give Access" = "Daj dostop";
"Keep Private" = "Obdrži osebno";
/* generic.js */
"Unable to subscribe to that folder!"
= "Nemogoče se je naročiti na to mapo!";
"You cannot subscribe to a folder that you own!"
= "Ne moreš se naročiti na lastno mapo!";
"Unable to unsubscribe from that folder!"
= "Nemogoče se odjaviti s te mape!";
"You cannot unsubscribe from a folder that you own!"
= "Ne moreš se odjaviti z lastne mape!";
"Unable to rename that folder!" = "Nemogoče je preimenovati to mapo!";
"You have already subscribed to that folder!"
= "Na to mapo si že naročen!";
"The user rights cannot be edited for this object!"
= "Uporabniške pravice je nemogoče urediti za ta objekt!";
"A folder by that name already exists." = "Mapa s tem imenom že obstaja.";
"You cannot create a list in a shared address book."
= "Ne moreš ustvariti seznama v skupnem adresarju.";
"Warning" = "Opozorilo";
"Can't contact server" = "Prišlo je do napake pri povezovanju s strežniku. Prosim poskusi ponovno pozneje.";
"You are not allowed to access this module or this system. Please contact your system administrator."
= "Nimaš pravice dostopa do tega modula ali tega sistema. Prosim kontaktiraj tvojega sistemskega administratorja.";
"You don't have the required privileges to perform the operation."
= "Nimaš zahtevanih pravic za izvedbo te operacije.";
"noEmailForDelegation" = "Moraš določiti naslov, kateremu želiš dodeliti tvoje povabilo.";
"delegate is organizer" = "Dodeljevalec je organizator. Prosim določi drugega dodeljevalca.";
"delegate is a participant" = "Dodeljevalec je že udeleženec.";
"delegate is a group" = "Določen naslov ustreza skupini. Dodeliš lahko le edinstveni osebi.";
"Snooze for " = "Opomni za";
"5 minutes" = "5 minut";
"10 minutes" = "10 minut";
"15 minutes" = "15 minut";
"30 minutes" = "30 minut";
"45 minutes" = "45 minut";
"1 hour" = "1 ura";
"1 day" = "1 dan";
/* common buttons */
"OK" = "V redu";
"Cancel" = "Prekliči";
"Yes" = "Da";
"No" = "Ne";
/* alarms */
"Reminder:" = "Opomnik:";
"Start:" = "Začetek:";
"Due Date:" = "Datum zapadlosti:";
"Location:" = "Mesto:";
/* mail labels */
"Important" = "Pomembno";
"Work" = "Delo";
"Personal" = "Osebno";
"To Do" = "Opravilo";
"Later" = "Pozneje";
"a2_Sunday" = "Ne";
"a2_Monday" = "Po";
"a2_Tuesday" = "To";
"a2_Wednesday" = "Sr";
"a2_Thursday" = "Če";
"a2_Friday" = "Pe";
"a2_Saturday" = "So";
+12 -2
View File
@@ -126,11 +126,21 @@
- (NSString *) currentUserDisplayName
{
NSDictionary *infos;
NSString *uid;
SOGoUserManager *um;
um = [SOGoUserManager sharedUserManager];
return [um getFullEmailForUID: [self currentUser]];
uid = [self currentUser];
infos = [um contactInfosForUserWithUIDorEmail: uid inDomain: [[context activeUser] domain]];
if (infos)
{
return [NSString stringWithFormat: @"%@ <%@>",
[infos objectForKey: @"cn"],
[infos objectForKey: @"c_email"]];
}
else
return uid;
}
- (BOOL) canSubscribeUsers
+13 -6
View File
@@ -1,8 +1,6 @@
/* UIxUserRightsEditor.m - this file is part of SOGo
*
* Copyright (C) 2007-2010 Inverse inc.
*
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
* Copyright (C) 2007-2015 Inverse inc.
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -20,6 +18,8 @@
* Boston, MA 02111-1307, USA.
*/
#import <Foundation/NSDictionary.h>
#import <NGObjWeb/NSException+HTTP.h>
#import <NGObjWeb/WOApplication.h>
#import <NGObjWeb/WOResponse.h>
@@ -86,6 +86,7 @@
- (NSString *) userDisplayName
{
NSDictionary *infos;
SOGoUserManager *um;
if ([self userIsAnonymousUser])
@@ -99,9 +100,15 @@
else
{
um = [SOGoUserManager sharedUserManager];
return [NSString stringWithFormat: @"%@ <%@>",
[um getCNForUID: uid],
[um getEmailForUID: uid]];
infos = [um contactInfosForUserWithUIDorEmail: uid inDomain: [[context activeUser] domain]];
if (infos)
{
return [NSString stringWithFormat: @"%@ <%@>",
[infos objectForKey: @"cn"],
[infos objectForKey: @"c_email"]];
}
else
return uid;
}
}
+13 -13
View File
@@ -76,19 +76,19 @@
"No possible subscription" = "لا يوجد إشتراك";
"Preferred" = "المفضل";
"Display:" = "عرض:";
"Display Name:" = "الاسم المعروض:";
"Display" = "عرض";
"Display Name" = "الاسم المعروض";
"Email:" = "البريد الالكتروني:";
"Additional Email:" = "بريد إلكتروني إضافي";
"Phone Number:" = "رقم الهاتف:";
"Phone Number" = "رقم الهاتف";
"Prefers to receive messages formatted as:" = "يفضل تلقي رسائل منسقة على النحو التالي:";
"Screen Name:" = "أسم التعريف:";
"Categories:" = "الفئات:";
"First:" = "الاول:";
"Last:" = "الاخير:";
"Nickname:" = "الاسم الرمزي:";
"Nickname" = "الاسم الرمزي";
"Telephone" = "رقم الهاتف:";
"Work:" = "العمل:";
@@ -103,25 +103,25 @@
"New category" = "فئة جديدة";
/* adresses */
"Title:" = "اللقب:";
"Title" = "اللقب";
"Service:" = "الخدمة:";
"Company:" = "الشركة:";
"Department:" = "الادارة:";
"Organization:" = "الجهة";
"Address:" = "العنوان:";
"City:" = "المدينة:";
"City" = "المدينة";
"State_Province:" = "الولاية / الاقليم / المحافظة:";
"ZIP_Postal Code:" = "الرمز البريدي:";
"Country:" = "الدولة:";
"Country" = "الدولة";
"Web Page:" = "صفحة الانترنت:";
"Work" = "العمل";
"Other Infos" = "معلومات أخرى";
"Note:" = "ملاحظة:";
"Note" = "ملاحظة";
"Timezone:" = "المنطقة الزمنية:";
"Birthday:" = "تاريخ الميلاد:";
"Birthday (yyyy-mm-dd):" = "تاريخ الميلاد (يوم-شهر-سنة):";
"Birthday" = "تاريخ الميلاد";
"Birthday (yyyy-mm-dd)" = "تاريخ الميلاد (يوم-شهر-سنة)";
"Freebusy URL:" = "موقع مشغول /حر:";
"Add as..." = "إضافة إلى ...";
@@ -186,9 +186,9 @@
/* Lists */
"List details" = "تفاصيل القائمة";
"List name:" = "اسم القائمة/";
"List nickname:" = "اسم القائمة الرمزي:";
"List description:" = "وصف القائمة:";
"List name" = "اسم القائمة/";
"List nickname" = "اسم القائمة الرمزي";
"List description" = "وصف القائمة";
"Members" = "أعضاء";
"Contacts" = "جهات إتصال";
"Add" = "إضافة";
+13 -13
View File
@@ -76,19 +76,19 @@
"No possible subscription" = "Ez dago harpidetzarako aukerarik";
"Preferred" = "Hobetsitakoa";
"Display:" = "Bistaratzea:";
"Display Name:" = "Erakusteko izena:";
"Display" = "Bistaratzea";
"Display Name" = "Erakusteko izena";
"Email:" = "Emaila:";
"Additional Email:" = "Beste emaila:";
"Phone Number:" = "Telefono zenbakia";
"Phone Number" = "Telefono zenbakia";
"Prefers to receive messages formatted as:" = "Nahiago du mezuak honako formatuan jasotzea:";
"Screen Name:" = "Pantailaren izena";
"Categories:" = "Kategoriak:";
"First:" = "Lehenengoa:";
"Last:" = "Azkena:";
"Nickname:" = "Goitizena:";
"Nickname" = "Goitizena";
"Telephone" = "Telefonoa:";
"Work:" = "Lana:";
@@ -103,25 +103,25 @@
"New category" = "Kategoria berria";
/* adresses */
"Title:" = "Izenburua";
"Title" = "Izenburua";
"Service:" = "Zerbitzua:";
"Company:" = "Enpresa";
"Department:" = "Saila";
"Organization:" = "Saila:";
"Address:" = "Helbidea";
"City:" = "Herria";
"City" = "Herria";
"State_Province:" = "Estatua / Probintzia";
"ZIP_Postal Code:" = "Posta kodea";
"Country:" = "Herrialdea";
"Country" = "Herrialdea";
"Web Page:" = "Web orria";
"Work" = "Lana";
"Other Infos" = "Bestelako informazioak";
"Note:" = "Ohar:";
"Note" = "Ohar";
"Timezone:" = "Ordu-zona:";
"Birthday:" = "Jaiotze data:";
"Birthday (yyyy-mm-dd):" = "Jaiotze data (uuuu-hh-ee):";
"Birthday" = "Jaiotze data";
"Birthday (yyyy-mm-dd)" = "Jaiotze data (uuuu-hh-ee)";
"Freebusy URL:" = "LibreLanpetu URL-a:";
"Add as..." = "Gehitu honela...";
@@ -186,9 +186,9 @@
/* Lists */
"List details" = "Zerrendaren xehetasunak";
"List name:" = "Zerrendaren izena:";
"List nickname:" = "Zerrendaren goitizena:";
"List description:" = "Zerrendaren deskribapena:";
"List name" = "Zerrendaren izena";
"List nickname" = "Zerrendaren goitizena";
"List description" = "Zerrendaren deskribapena";
"Members" = "Kideak";
"Contacts" = "Kontaktuak";
"Add" = "Gehitu";
@@ -76,19 +76,19 @@
"No possible subscription" = "Sem possibilidades de inscrição";
"Preferred" = "Preferido";
"Display:" = "Exibição:";
"Display Name:" = "Exibir Nome:";
"Display" = "Exibição";
"Display Name" = "Exibir Nome";
"Email:" = "Endereço de Email:";
"Additional Email:" = "Email Adicional:";
"Phone Number:" = "Telefone:";
"Phone Number" = "Telefone";
"Prefers to receive messages formatted as:" = "Prefere receber mensagens formatadas como:";
"Screen Name:" = "Nome de Exibição:";
"Categories:" = "Categorias:";
"First:" = "Primeiro Nome:";
"Last:" = "Último Nome:";
"Nickname:" = "Apelido:";
"Nickname" = "Apelido";
"Telephone" = "Telefone";
"Work:" = "Comercial:";
@@ -103,25 +103,25 @@
"New category" = "Nova categoria";
/* adresses */
"Title:" = "Título:";
"Title" = "Título";
"Service:" = "Serviço:";
"Company:" = "Empresa:";
"Department:" = "Departamento";
"Organization:" = "Organização";
"Address:" = "Endereço:";
"City:" = "Cidade:";
"City" = "Cidade";
"State_Province:" = "Estado:";
"ZIP_Postal Code:" = "CEP:";
"Country:" = "País:";
"Country" = "País";
"Web Page:" = "Página Web:";
"Work" = "Comercial";
"Other Infos" = "Outras Informações";
"Note:" = "Notas:";
"Note" = "Notas";
"Timezone:" = "Fuso Horário:";
"Birthday:" = "Aniversário:";
"Birthday (yyyy-mm-dd):" = "Aniversário (yyyy-mm-dd):";
"Birthday" = "Aniversário";
"Birthday (yyyy-mm-dd)" = "Aniversário (yyyy-mm-dd)";
"Freebusy URL:" = "URL Livre/Ocupado:";
"Add as..." = "Adicionar como...";
@@ -186,9 +186,9 @@
/* Lists */
"List details" = "Detalhes da lista";
"List name:" = "Lista nome:";
"List nickname:" = "Lista Apelido:";
"List description:" = "Lista descrição:";
"List name" = "Lista nome";
"List nickname" = "Lista Apelido";
"List description" = "Lista descrição";
"Members" = "Membros";
"Contacts" = "Contatos";
"Add" = "Adicionar";
+13 -13
View File
@@ -76,19 +76,19 @@
"No possible subscription" = "La subscripció no és possible";
"Preferred" = "Preferit";
"Display:" = "Nom mostrat:";
"Display Name:" = "Nom:";
"Display" = "Nom mostrat";
"Display Name" = "Nom";
"Email:" = "Correu electrònic:";
"Additional Email:" = "Un altre correu electrònic:";
"Phone Number:" = "Número de telèfon:";
"Phone Number" = "Número de telèfon";
"Prefers to receive messages formatted as:" = "Prefereix rebre missatges amb format:";
"Screen Name:" = "Nom d'usuari:";
"Categories:" = "Categories:";
"First:" = "Nom:";
"Last:" = "Cognoms:";
"Nickname:" = "Àlies:";
"Nickname" = "Àlies";
"Telephone" = "Telèfon";
"Work:" = "Feina:";
@@ -103,25 +103,25 @@
"New category" = "New category";
/* adresses */
"Title:" = "Títol:";
"Title" = "Títol";
"Service:" = "Servei:";
"Company:" = "Companyia:";
"Department:" = "Departament:";
"Organization:" = "Organització:";
"Address:" = "Domicili:";
"City:" = "Ciutat:";
"City" = "Ciutat";
"State_Province:" = "Estat/província/comarca:";
"ZIP_Postal Code:" = "Codi postal:";
"Country:" = "País:";
"Country" = "País";
"Web Page:" = "Web:";
"Work" = "Treball";
"Other Infos" = "Altres dades";
"Note:" = "Nota:";
"Note" = "Nota";
"Timezone:" = "Zona hor.:";
"Birthday:" = "Data de naixement:";
"Birthday (yyyy-mm-dd):" = "Data naixement (yyyy-mm-dd):";
"Birthday" = "Data de naixement";
"Birthday (yyyy-mm-dd)" = "Data naixement (yyyy-mm-dd)";
"Freebusy URL:" = "URL disponibilitat:";
"Add as..." = "Afegir com a...";
@@ -186,9 +186,9 @@
/* Lists */
"List details" = "Detalls de la llista";
"List name:" = "Nom de la llista:";
"List nickname:" = "Àlies de la llista:";
"List description:" = "Descripcció de la llista:";
"List name" = "Nom de la llista";
"List nickname" = "Àlies de la llista";
"List description" = "Descripcció de la llista";
"Members" = "Membres";
"Contacts" = "Contactes";
"Add" = "Afegir";
@@ -0,0 +1,215 @@
/* this file is in UTF-8 format! */
"Contact" = "連絡人";
"Address" = "地址";
"Photos" = "照片";
"Other" = "其它";
"Address Books" = "通訊錄";
"Addressbook" = "通訊錄";
"Addresses" = "地址";
"Update" = "更新";
"Cancel" = "取消";
"Common" = "一般";
"Contact editor" = "連絡人編輯器";
"Contact viewer" = "連絡人瀏覽器";
"Email" = "郵件";
"Screen Name" = "顯示名稱";
"Extended" = "延伸";
"Fax" = "傳真";
"Firstname" = "名";
"Home" = "家";
"HomePhone" = "住家電話";
"Lastname" = "姓氏";
"Location" = "地點";
"MobilePhone" = "手機";
"Name" = "名字";
"OfficePhone" = "辦公室電話";
"Organization" = "公司名稱";
"Work Phone" = "公務電話";
"Phone" = "電話";
"Phones" = "電話";
"Postal" = "郵遞區號";
"Save" = "儲存";
"Internet" = "網際網路";
"Unit" = "部門";
"delete" = "刪除";
"edit" = "編輯";
"invalidemailwarn" = "無效的郵件地址";
"new" = "新增";
"Preferred Phone" = "首選電話";
"Move To" = "移至";
"Copy To" = "拷貝到";
"Add to:" = "增加到";
/* Tooltips */
"Create a new address book card" = "新增一筆通訊錄卡片";
"Create a new list" = "新增一份清單";
"Edit the selected card" = "編輯選擇的卡片";
"Send a mail message" = "發送一份郵件訊息";
"Delete selected card or address book" = "刪除選擇的卡片或通訊錄";
"Reload all contacts" = "重載所有的連絡人";
"htmlMailFormat_UNKNOWN" = "未知";
"htmlMailFormat_FALSE" = "純文字";
"htmlMailFormat_TRUE" = "HTML";
"Name or Email" = "名字或郵件地址";
"Category" = "類別";
"Personal Addressbook" = "個人通訊錄";
"Search in Addressbook" = "搜索通訊錄";
"New Card" = "新增卡片";
"New List" = "新增清單";
"Edit" = "編輯";
"Properties" = "屬性";
"Sharing..." = "共享...";
"Write" = "寫入";
"Delete" = "删除";
"Instant Message" = "即時訊息";
"Add..." = "新增...";
"Remove" = "移除";
"Please wait..." = "請稍後...";
"No possible subscription" = "不可訂閱";
"Preferred" = "首選";
"Display" = "顯示";
"Display Name" = "顯示名稱";
"Email:" = "郵件:";
"Additional Email:" = "添加的郵件:";
"Phone Number" = "電話號碼";
"Prefers to receive messages formatted as:" = "喜愛的接收訊息格式為:";
"Screen Name:" = "顯示名稱:";
"Categories:" = "類别:";
"First:" = "名:";
"Last:" = "姓:";
"Nickname" = "暱稱";
"Telephone" = "電話";
"Work:" = "辦公:";
"Home:" = "家:";
"Fax:" = "傳真:";
"Mobile:" = "手機:";
"Pager:" = "呼叫器:";
/* categories */
"contacts_category_labels" = "同事,競争对手,客户,朋友,家人,事業伙伴,供應商,出版社,VIP";
"Categories" = "分類";
"New category" = "新類別";
/* adresses */
"Title" = "頭銜";
"Service:" = "服務:";
"Company:" = "公司:";
"Department:" = "部門:";
"Organization:" = "组織:";
"Address:" = "地址:";
"City" = "城市";
"State_Province:" = "州/省:";
"ZIP_Postal Code:" = "ZIP/郵遞區號:";
"Country" = "國家";
"Web Page:" = "網页:";
"Work" = "辦公";
"Other Infos" = "其他資訊";
"Note" = "備註";
"Timezone:" = "時區:";
"Birthday" = "生日";
"Birthday (yyyy-mm-dd)" = "生日 (yyyy-mm-dd)";
"Freebusy URL:" = "Freebusy URL:";
"Add as..." = "新增為...";
"Recipient" = "收件人";
"Carbon Copy" = "副本";
"Blind Carbon Copy" = "密件副本";
"New Addressbook..." = "新增通訊錄...";
"Subscribe to an Addressbook..." = "訂閱通訊錄...";
"Remove the selected Addressbook" = "移除選擇的通訊錄";
"Name of the Address Book" = " 通訊錄名稱";
"Are you sure you want to delete the selected address book?"
= "您確定要刪除選擇的通訊錄嗎?";
"You cannot remove nor unsubscribe from a public addressbook."
= "您不能從共有通訊錄中移除或取消訂閱。";
"You cannot remove nor unsubscribe from your personal addressbook."
= "您不能從您的個人通訊錄中移除或取消訂閱。";
"Are you sure you want to delete the selected contacts?"
= "您確定要刪除選擇的連絡人嗎?";
"You cannot delete the card of \"%{0}\"."
= "您不能删除第\"%{0}\"筆卡片。";
"You cannot subscribe to a folder that you own!"
= "您不能訂閱自己的資料夾。";
"Unable to subscribe to that folder!"
= "不能訂閱到該資料夾。";
/* acls */
"Access rights to" = "給予存取權限至";
"For user" = "给使用者";
"Any Authenticated User" = "任一授權的使用者";
"Public Access" = "公開存取";
"This person can add cards to this addressbook."
= "這個人可以新增卡片到這個通訊錄。";
"This person can edit the cards of this addressbook."
= "這個人可以編輯這個通訊錄的卡片。";
"This person can list the content of this addressbook."
= "這個人可以列出這個通訊錄的内容。";
"This person can read the cards of this addressbook."
= "這個人可以讀取這個通訊錄的卡片。";
"This person can erase cards from this addressbook."
= "這個人可以刪除這個通訊錄的卡片。";
"The selected contact has no email address."
= "被選擇的連絡人沒有郵件地址。";
"Please select a contact." = "請選擇連絡人。";
/* Error messages for move and copy */
"SoAccessDeniedException" = "您不能寫入資料到這個通訊錄。";
"Forbidden" = "您不能寫入資料到這個通訊錄。";
"Invalid Contact" = "所選擇的連絡人已經不存在了。";
"Unknown Destination Folder" = "所選擇的目標地址簿已經不存在了。";
/* Lists */
"List details" = "列出明细";
"List name" = "列出名字";
"List nickname" = "列出暱稱";
"List description" = "列出說明";
"Members" = "成員";
"Contacts" = "連絡人";
"Add" = "新增";
"Lists can't be moved or copied." = "列表不能被移除或拷貝。";
"Export" = "匯出";
"Export Address Book..." = "匯出通訊錄...";
"View Raw Source" = "查看源文件";
"Import Cards" = "匯入卡片";
"Select a vCard or LDIF file." = "選擇一張 vCard 或者 LDIF 檔案。";
"Upload" = "上傳";
"Uploading" = "上傳中";
"Done" = "完成";
"An error occured while importing contacts." = "導入連絡人時發生錯誤。";
"No card was imported." = "没有卡片可以被導入。";
"A total of %{0} cards were imported in the addressbook." = "共有%{0}張卡片被導入到通訊錄中。";
"Reload" = "重新載入";
/* Properties window */
"Address Book Name:" = "通訊錄名稱:";
"Links to this Address Book" = "連結到這本通訊錄";
"Authenticated User Access" = "授權的使用者存取";
"CardDAV URL: " = "CardDAV URL:";
+13 -13
View File
@@ -76,19 +76,19 @@
"No possible subscription" = "Žádné možné odebírání";
"Preferred" = "Upřednostňovaný";
"Display:" = "Zobrazované jméno:";
"Display Name:" = "Zobrazované jméno:";
"Display" = "Zobrazované jméno";
"Display Name" = "Zobrazované jméno";
"Email:" = "E-mail:";
"Additional Email:" = "Další e-mail:";
"Phone Number:" = "Telefonní číslo:";
"Phone Number" = "Telefonní číslo";
"Prefers to receive messages formatted as:" = "Upřednostňovaný formát zpráv:";
"Screen Name:" = "Zobrazované jméno:";
"Categories:" = "Kategorie:";
"First:" = "Křestní jméno:";
"Last:" = "Příjmení:";
"Nickname:" = "Přezdívka:";
"Nickname" = "Přezdívka";
"Telephone" = "Telefon";
"Work:" = "Zaměstnání:";
@@ -103,25 +103,25 @@
"New category" = "Nová kategorie";
/* adresses */
"Title:" = "Pozice:";
"Title" = "Pozice";
"Service:" = "Služba:";
"Company:" = "Společnost:";
"Department:" = "Oddělení:";
"Organization:" = "Organizace:";
"Address:" = "Adresa:";
"City:" = "Město:";
"City" = "Město";
"State_Province:" = "Stát/Provincie:";
"ZIP_Postal Code:" = "PSČ:";
"Country:" = "Země:";
"Country" = "Země";
"Web Page:" = "Web:";
"Work" = "Zaměstnání";
"Other Infos" = "Ostatní informace";
"Note:" = "Poznámka:";
"Note" = "Poznámka";
"Timezone:" = "Časové pásmo:";
"Birthday:" = "Datum narození";
"Birthday (yyyy-mm-dd):" = "Datum narození (yyyy-mm-dd):";
"Birthday" = "Datum narození";
"Birthday (yyyy-mm-dd)" = "Datum narození (yyyy-mm-dd)";
"Freebusy URL:" = "Freebusy URL:";
"Add as..." = "Přidat jako...";
@@ -186,9 +186,9 @@
/* Lists */
"List details" = "Skupina";
"List name:" = "Název:";
"List nickname:" = "Zkratka:";
"List description:" = "Popis:";
"List name" = "Název";
"List nickname" = "Zkratka";
"List description" = "Popis";
"Members" = "Členové skupiny";
"Contacts" = "Kontakty";
"Add" = "Přidat";
+13 -13
View File
@@ -76,19 +76,19 @@
"No possible subscription" = "Intet muligt abonnement";
"Preferred" = "Foretrukket";
"Display:" = "Vis:";
"Display Name:" = "Vist navn:";
"Display" = "Vis";
"Display Name" = "Vist navn";
"Email:" = "E-mail:";
"Additional Email:" = "ekstra e-mails:";
"Phone Number:" = "Telefonnummer:";
"Phone Number" = "Telefonnummer";
"Prefers to receive messages formatted as:" = "Foretrækker at modtage beskeder formateret som:";
"Screen Name:" = "Skærmnavn:";
"Categories:" = "Kategorier:";
"First:" = "Først:";
"Last:" = "Sidst:";
"Nickname:" = "Kaldenavn:";
"Nickname" = "Kaldenavn";
"Telephone" = "Telefon";
"Work:" = "Arbejde:";
@@ -103,25 +103,25 @@
"New category" = "Ny kategori";
/* adresses */
"Title:" = "Titel:";
"Title" = "Titel";
"Service:" = "Service:";
"Company:" = "Firma:";
"Department:" = "Afdeling:";
"Organization:" = "Organisation:";
"Address:" = "Adresse:";
"City:" = "By:";
"City" = "By";
"State_Province:" = "Stat / provins:";
"ZIP_Postal Code:" = "ZIP/Postnr.:";
"Country:" = "Land:";
"Country" = "Land";
"Web Page:" = "Hjemmeside:";
"Work" = "Arbejde";
"Other Infos" = "Andet info";
"Note:" = "Bemærk:";
"Note" = "Bemærk";
"Timezone:" = "Tidszone:";
"Birthday:" = "Fødselsdag:";
"Birthday (yyyy-mm-dd):" = "Fødselsdag (dd-mm-åååå):";
"Birthday" = "Fødselsdag";
"Birthday (yyyy-mm-dd)" = "Fødselsdag (dd-mm-åååå)";
"Freebusy URL:" = "Ledig/optaget URL:";
"Add as..." = "Tilføj som ...";
@@ -186,9 +186,9 @@
/* Lists */
"List details" = "Liste detaljer";
"List name:" = "Liste navn:";
"List nickname:" = "Liste kaldenavn:";
"List description:" = "Liste beskrivelse:";
"List name" = "Liste navn";
"List nickname" = "Liste kaldenavn";
"List description" = "Liste beskrivelse";
"Members" = "Medlemmer";
"Contacts" = "Kontaktpersoner";
"Add" = "Tilføj";
+13 -13
View File
@@ -76,19 +76,19 @@
"No possible subscription" = "Abonnement niet mogelijk";
"Preferred" = "Voorkeurs-";
"Display:" = "Weergave:";
"Display Name:" = "Weergavenaam:";
"Display" = "Weergave";
"Display Name" = "Weergavenaam";
"Email:" = "E-mail:";
"Additional Email:" = "Alternatieve e-mail:";
"Phone Number:" = "Telefoon:";
"Phone Number" = "Telefoon";
"Prefers to receive messages formatted as:" = "Geeft voorkeur aan berichten geformatteerd als:";
"Screen Name:" = "Weergavenaam:";
"Categories:" = "Categorieën:";
"First:" = "Voornaam:";
"Last:" = "Achternaam:";
"Nickname:" = "Nickname:";
"Nickname" = "Nickname";
"Telephone" = "Telefoon:";
"Work:" = "Werk:";
@@ -103,25 +103,25 @@
"New category" = "Niewe categorie";
/* adresses */
"Title:" = "Titel:";
"Title" = "Titel";
"Service:" = "Service:";
"Company:" = "Bedrijf:";
"Department:" = "Afdeling:";
"Organization:" = "Organisatie:";
"Address:" = "Adres:";
"City:" = "Plaats:";
"City" = "Plaats";
"State_Province:" = "Provincie:";
"ZIP_Postal Code:" = "Postcode:";
"Country:" = "Land:";
"Country" = "Land";
"Web Page:" = "Website:";
"Work" = "Werk";
"Other Infos" = "Overige";
"Note:" = "Notitie:";
"Note" = "Notitie";
"Timezone:" = "Tijdzone:";
"Birthday:" = "Geboortedatum:";
"Birthday (yyyy-mm-dd):" = "Geboortedatum (yyyy-mm-dd):";
"Birthday" = "Geboortedatum";
"Birthday (yyyy-mm-dd)" = "Geboortedatum (yyyy-mm-dd)";
"Freebusy URL:" = "Beschikbaarheids-URL (Free/Busy):";
"Add as..." = "Toevoegen als ...";
@@ -186,9 +186,9 @@
/* Lists */
"List details" = "Toon details";
"List name:" = "Lijst-naam:";
"List nickname:" = "Lijst-bijnaam:";
"List description:" = "Beschrijving:";
"List name" = "Lijst-naam";
"List nickname" = "Lijst-bijnaam";
"List description" = "Beschrijving";
"Members" = "Leden";
"Contacts" = "Contactpersonen";
"Add" = "Toevoegen";
+13 -13
View File
@@ -76,19 +76,19 @@
"No possible subscription" = "No possible subscription";
"Preferred" = "Preferred";
"Display:" = "Display:";
"Display Name:" = "Display Name:";
"Display" = "Display";
"Display Name" = "Display Name";
"Email:" = "Email:";
"Additional Email:" = "Additional Email:";
"Phone Number:" = "Phone Number:";
"Phone Number" = "Phone Number";
"Prefers to receive messages formatted as:" = "Prefers to receive messages formatted as:";
"Screen Name:" = "Screen Name:";
"Categories:" = "Categories:";
"First:" = "First:";
"Last:" = "Last:";
"Nickname:" = "Nickname:";
"Nickname" = "Nickname";
"Telephone" = "Telephone";
"Work:" = "Work:";
@@ -103,25 +103,25 @@
"New category" = "New category";
/* adresses */
"Title:" = "Title:";
"Title" = "Title";
"Service:" = "Service:";
"Company:" = "Company:";
"Department:" = "Department:";
"Organization:" = "Organization:";
"Address:" = "Address:";
"City:" = "City: ";
"City" = "City ";
"State_Province:" = "State/Province:";
"ZIP_Postal Code:" = "ZIP/Postal Code:";
"Country:" = "Country:";
"Country" = "Country";
"Web Page:" = "Web Page:";
"Work" = "Work";
"Other Infos" = "Other Infos";
"Note:" = "Note:";
"Note" = "Note";
"Timezone:" = "Timezone:";
"Birthday:" = "Birthday:";
"Birthday (yyyy-mm-dd):" = "Birthday (yyyy-mm-dd):";
"Birthday" = "Birthday";
"Birthday (yyyy-mm-dd)" = "Birthday (yyyy-mm-dd)";
"Freebusy URL:" = "Freebusy URL:";
"Add as..." = "Add as...";
@@ -186,9 +186,9 @@
/* Lists */
"List details" = "List details";
"List name:" = "List name:";
"List nickname:" = "List nickname:";
"List description:" = "List description:";
"List name" = "List name";
"List nickname" = "List nickname";
"List description" = "List description";
"Members" = "Members";
"Contacts" = "Contacts";
"Add" = "Add";
+13 -13
View File
@@ -76,19 +76,19 @@
"No possible subscription" = "Tilaus ei mahdollinen";
"Preferred" = "Ensisijainen";
"Display:" = "Näyttö:";
"Display Name:" = "Näyttönimi:";
"Display" = "Näyttö";
"Display Name" = "Näyttönimi";
"Email:" = "Email:";
"Additional Email:" = "Lisäsähköpostiosoite:";
"Phone Number:" = "Puhelinnumero:";
"Phone Number" = "Puhelinnumero";
"Prefers to receive messages formatted as:" = "Vastaanottaa viestejä muotoiltuna ensisijaisesti:";
"Screen Name:" = "Näytettävä nimi:";
"Categories:" = "Kategoriat:";
"First:" = "Etunimi:";
"Last:" = "Sukunimi:";
"Nickname:" = "Lempinimi:";
"Nickname" = "Lempinimi";
"Telephone" = "Puhelin";
"Work:" = "Työ:";
@@ -103,25 +103,25 @@
"New category" = "Uusi kategoria";
/* adresses */
"Title:" = "Titteli:";
"Title" = "Titteli";
"Service:" = "Palvelu:";
"Company:" = "Yritys:";
"Department:" = "Osasto:";
"Organization:" = "Organisaatio:";
"Address:" = "Osoite:";
"City:" = "Kaupunki: ";
"City" = "Kaupunki ";
"State_Province:" = "Maakunta:";
"ZIP_Postal Code:" = "Postinumero:";
"Country:" = "Maa:";
"Country" = "Maa";
"Web Page:" = "Web sivu:";
"Work" = "Työ";
"Other Infos" = "Muuta tietoa";
"Note:" = "Huomautus:";
"Note" = "Huomautus";
"Timezone:" = "Aikavyöhyke:";
"Birthday:" = "Syntymäpäivä:";
"Birthday (yyyy-mm-dd):" = "Syntymäpäivä (vvvv-kk-pp):";
"Birthday" = "Syntymäpäivä";
"Birthday (yyyy-mm-dd)" = "Syntymäpäivä (vvvv-kk-pp)";
"Freebusy URL:" = "Freebusy URL:";
"Add as..." = "Lisää nimellä...";
@@ -186,9 +186,9 @@
/* Lists */
"List details" = "Luettelon tiedot";
"List name:" = "Luettelon nimi:";
"List nickname:" = "Luettelon lempinimi:";
"List description:" = "Luettelon kuvaus:";
"List name" = "Luettelon nimi";
"List nickname" = "Luettelon lempinimi";
"List description" = "Luettelon kuvaus";
"Members" = "Jäsenet";
"Contacts" = "Yhteystiedot";
"Add" = "Lisää";
+13 -13
View File
@@ -76,19 +76,19 @@
"No possible subscription" = "Aucune inscription possible";
"Preferred" = "Préféré";
"Display:" = "Nom à afficher :";
"Display Name:" = "Nom à afficher :";
"Display" = "Nom à afficher ";
"Display Name" = "Nom à afficher ";
"Email:" = "Adresse électronique :";
"Additional Email:" = "Adresse alternative :";
"Phone Number:" = "Numéro de téléphone :";
"Phone Number" = "Numéro de téléphone ";
"Prefers to receive messages formatted as:" = "Préfère recevoir les messages au format :";
"Screen Name:" = "Pseudo :";
"Categories:" = "Catégories :";
"First:" = "Prénom :";
"Last:" = "Nom :";
"Nickname:" = "Surnom :";
"Nickname" = "Surnom ";
"Telephone" = "Téléphone";
"Work:" = "Travail :";
@@ -103,25 +103,25 @@
"New category" = "Nouvelle catégorie";
/* adresses */
"Title:" = "Fonction :";
"Title" = "Fonction ";
"Service:" = "Service:";
"Company:" = "Company:";
"Department:" = "Service :";
"Organization:" = "Société :";
"Address:" = "Adresse :";
"City:" = "Ville/Localité :";
"City" = "Ville/Localité ";
"State_Province:" = "État/Prov. :";
"ZIP_Postal Code:" = "Code postal :";
"Country:" = "Pays :";
"Country" = "Pays ";
"Web Page:" = "Page Web:";
"Work" = "Professionnelle";
"Other Infos" = "Informations complémentaires";
"Note:" = "Remarques :";
"Note" = "Remarques ";
"Timezone:" = "Fuseau horaire :";
"Birthday:" = "D. naissance:";
"Birthday (yyyy-mm-dd):" = "D. naissance (aaaa-mm-jj):";
"Birthday" = "D. naissance";
"Birthday (yyyy-mm-dd)" = "D. naissance (aaaa-mm-jj)";
"Freebusy URL:" = "Adresse du FreeBusy :";
"Add as..." = "Ajouter...";
@@ -186,9 +186,9 @@
/* Lists */
"List details" = "Détails";
"List name:" = "Liste:";
"List nickname:" = "Surnom:";
"List description:" = "Description:";
"List name" = "Liste";
"List nickname" = "Surnom";
"List description" = "Description";
"Members" = "Membres";
"Contacts" = "Contacts";
"Add" = "Ajouter";
+1 -1
View File
@@ -6,7 +6,7 @@ BUNDLE_NAME = ContactsUI
ContactsUI_PRINCIPAL_CLASS = ContactsUIProduct
ContactsUI_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak SpanishSpain SpanishArgentina Swedish Ukrainian Welsh
ContactsUI_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan ChineseTaiwan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak Slovenian SpanishSpain SpanishArgentina Swedish Ukrainian Welsh
ContactsUI_OBJC_FILES = \
UIxContactsUserFolders.m \
+13 -13
View File
@@ -76,19 +76,19 @@
"No possible subscription" = "Kein Abonnieren möglich";
"Preferred" = "Bevorzugt";
"Display:" = "Anzeige:";
"Display Name:" = "Anzeigename:";
"Display" = "Anzeige";
"Display Name" = "Anzeigename";
"Email:" = "E-Mail:";
"Additional Email:" = "Zusätzliche E-Mail:";
"Phone Number:" = "Telefon:";
"Phone Number" = "Telefon";
"Prefers to receive messages formatted as:" = "Bevorzugt folgendes Nachrichten-Format:";
"Screen Name:" = "Messenger-Name:";
"Categories:" = "Kategorien:";
"First:" = "Vorname:";
"Last:" = "Nachname:";
"Nickname:" = "Spitzname:";
"Nickname" = "Spitzname";
"Telephone" = "Telefon";
"Work:" = "Dienstlich:";
@@ -103,25 +103,25 @@
"New category" = "Neue Kategorie";
/* adresses */
"Title:" = "Titel:";
"Title" = "Titel";
"Service:" = "Dienst:";
"Company:" = "Firma:";
"Department:" = "Abteilung:";
"Organization:" = "Organisation:";
"Address:" = "Adresse:";
"City:" = "Stadt:";
"City" = "Stadt";
"State_Province:" = "Bundesland:";
"ZIP_Postal Code:" = "PLZ:";
"Country:" = "Land:";
"Country" = "Land";
"Web Page:" = "Webseite:";
"Work" = "Dienstlich";
"Other Infos" = "Andere Informationen";
"Note:" = "Notizen:";
"Note" = "Notizen";
"Timezone:" = "Zeitzone:";
"Birthday:" = "Geburtsdatum:";
"Birthday (yyyy-mm-dd):" = "Geburtsdatum (JJJJ-MM-TT):";
"Birthday" = "Geburtsdatum";
"Birthday (yyyy-mm-dd)" = "Geburtsdatum (JJJJ-MM-TT)";
"Freebusy URL:" = "Frei/Gebucht URL:";
"Add as..." = "Hinzufügen als ...";
@@ -186,9 +186,9 @@
/* Lists */
"List details" = "Details";
"List name:" = "Listenname:";
"List nickname:" = "Listen-Spitzname:";
"List description:" = "Beschreibung:";
"List name" = "Listenname";
"List nickname" = "Listen-Spitzname";
"List description" = "Beschreibung";
"Members" = "Mitglieder";
"Contacts" = "Kontakte";
"Add" = "Hinzufügen";
+13 -13
View File
@@ -76,19 +76,19 @@
"No possible subscription" = "Nincs mappa, melyre feliratkozhat";
"Preferred" = "Preferált";
"Display:" = "Megjelenítendő név:";
"Display Name:" = "Megjelenítendő név:";
"Display" = "Megjelenítendő név";
"Display Name" = "Megjelenítendő név";
"Email:" = "Email cím:";
"Additional Email:" = "További email:";
"Phone Number:" = "Telefon:";
"Phone Number" = "Telefon";
"Prefers to receive messages formatted as:" = "Előnyben részesített üzenet formátum:";
"Screen Name:" = "Fedőnév:";
"Categories:" = "Kategóriák:";
"First:" = "Keresztnév:";
"Last:" = "Vezetéknév:";
"Nickname:" = "Becenév:";
"Nickname" = "Becenév";
"Telephone" = "Telefon";
"Work:" = "Munkahely:";
@@ -103,25 +103,25 @@
"New category" = "Új kategória";
/* adresses */
"Title:" = "Cím:";
"Title" = "Cím";
"Service:" = "Szolgáltatás:";
"Company:" = "Vállalat:";
"Department:" = "Részleg:";
"Organization:" = "Szervezet:";
"Address:" = "Cím:";
"City:" = "Város:";
"City" = "Város";
"State_Province:" = "Állam/tartomány:";
"ZIP_Postal Code:" = "Irányítószám:";
"Country:" = "Ország:";
"Country" = "Ország";
"Web Page:" = "Web:";
"Work" = "Munkahely";
"Other Infos" = "Egyéb";
"Note:" = "Megjegyzés:";
"Note" = "Megjegyzés";
"Timezone:" = "Időzóna:";
"Birthday:" = "Születésnap:";
"Birthday (yyyy-mm-dd):" = "Születésnap (éééé-hh-nn):";
"Birthday" = "Születésnap";
"Birthday (yyyy-mm-dd)" = "Születésnap (éééé-hh-nn)";
"Freebusy URL:" = "Foglaltság URL:";
"Add as..." = "Hozzáadás mint...";
@@ -186,9 +186,9 @@
/* Lists */
"List details" = "Lista részletek";
"List name:" = "Lista név:";
"List nickname:" = "Lista becenév:";
"List description:" = "Lista leírás:";
"List name" = "Lista név";
"List nickname" = "Lista becenév";
"List description" = "Lista leírás";
"Members" = "Tagok";
"Contacts" = "Kapcsolatok";
"Add" = "Hozzáad";
+13 -13
View File
@@ -77,19 +77,19 @@
"Preferred" = "Sjálfgefið";
"Card for %@" = "Nafnspjald fyrir %@";
"Display:" = "Birtingarnafn:";
"Display Name:" = "Birt nafn:";
"Display" = "Birtingarnafn";
"Display Name" = "Birt nafn";
"Email:" = "Tölvupóstfang:";
"Additional Email:" = "Auka tölvupóstfang:";
"Phone Number:" = "Símanúmer:";
"Phone Number" = "Símanúmer";
"Prefers to receive messages formatted as:" = "Kýs að taka á móti pósti með sniði:";
"Screen Name:" = "Skjánafn:";
"Categories:" = "Flokkar:";
"First:" = "Fornafn:";
"Last:" = "Eftirnafn:";
"Nickname:" = "Gælunafn:";
"Nickname" = "Gælunafn";
"Telephone" = "Sími";
"Work:" = "Vinnusími:";
@@ -104,25 +104,25 @@
"New category" = "Nýr flokkur";
/* adresses */
"Title:" = "Titill:";
"Title" = "Titill";
"Service:" = "Þjónusta:";
"Company:" = "Fyrirtæki:";
"Department:" = "Deild:";
"Organization:" = "Fyrirtæki/Stofnun:";
"Address:" = "Heimilisfang:";
"City:" = "Borg: ";
"City" = "Borg ";
"State_Province:" = "Hérað/Fylki:";
"ZIP_Postal Code:" = "Póstnúmer:";
"Country:" = "Land:";
"Country" = "Land";
"Web Page:" = "Vefsíða:";
"Work" = "Vinna";
"Other Infos" = "Aðrar upplýsingar";
"Note:" = "Athugasemd:";
"Note" = "Athugasemd";
"Timezone:" = "Tímabelti:";
"Birthday:" = "Afmælisdagur:";
"Birthday (yyyy-mm-dd):" = "Afmælisdagur (yyyy-mm-dd):";
"Birthday" = "Afmælisdagur";
"Birthday (yyyy-mm-dd)" = "Afmælisdagur (yyyy-mm-dd)";
"Freebusy URL:" = "LaustUpptekið URL";
"Add as..." = "Bæta við sem...";
@@ -185,9 +185,9 @@
/* Lists */
"List details" = "Ítarleg lýsing á lista:";
"List name:" = "Nafn lista:";
"List nickname:" = "Gælunafn lista:";
"List description:" = "Lýsing lista:";
"List name" = "Nafn lista";
"List nickname" = "Gælunafn lista";
"List description" = "Lýsing lista";
"Members" = "Meðlimir";
"Contacts" = "Tengiliðir";
"Add" = "Bæta við";
+13 -13
View File
@@ -76,19 +76,19 @@
"No possible subscription" = "Nessuna sottoscrizione possibile";
"Preferred" = "Predefinito";
"Display:" = "Nome visualizzato:";
"Display Name:" = "Nome visualizzato:";
"Display" = "Nome visualizzato";
"Display Name" = "Nome visualizzato";
"Email:" = "Email:";
"Additional Email:" = "Email aggiuntiva:";
"Phone Number:" = "Numero di telefono:";
"Phone Number" = "Numero di telefono";
"Prefers to receive messages formatted as:" = "Formato preferito per i messaggi di posta:";
"Screen Name:" = "Nome Instant Messenger:";
"Categories:" = "Categorie:";
"First:" = "Nome:";
"Last:" = "Cognome";
"Nickname:" = "Soprannome:";
"Nickname" = "Soprannome";
"Telephone" = "Telefono";
"Work:" = "Lavoro:";
@@ -103,25 +103,25 @@
"New category" = "Nuova categoria";
/* adresses */
"Title:" = "Titolo:";
"Title" = "Titolo";
"Service:" = "Service:";
"Company:" = "Società:";
"Department:" = "Reparto:";
"Organization:" = "Società:";
"Address:" = "Indirizzo:";
"City:" = "Città:";
"City" = "Città";
"State_Province:" = "Provincia:";
"ZIP_Postal Code:" = "CAP:";
"Country:" = "Nazione:";
"Country" = "Nazione";
"Web Page:" = "Pagina Web:";
"Work" = "Lavoro";
"Other Infos" = "Altre informazioni";
"Note:" = "Note:";
"Note" = "Note";
"Timezone:" = "Fuso orario:";
"Birthday:" = "Data di Nascita:";
"Birthday (yyyy-mm-dd):" = "Data di Nascita (yyyy-mm-dd):";
"Birthday" = "Data di Nascita";
"Birthday (yyyy-mm-dd)" = "Data di Nascita (yyyy-mm-dd)";
"Freebusy URL:" = "Libero-occupato URL:";
"Add as..." = "Aggiungi come...";
@@ -186,9 +186,9 @@
/* Lists */
"List details" = "Dettagli lista";
"List name:" = "Nome lista:";
"List nickname:" = "Soprannome lista:";
"List description:" = "Descrizione lista:";
"List name" = "Nome lista";
"List nickname" = "Soprannome lista";
"List description" = "Descrizione lista";
"Members" = "Membri";
"Contacts" = "Contatti";
"Add" = "Aggiungi";

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