Monotone-Parent: f4861ebaae0a55ed464809d54f5ecd4f0bef9913

Monotone-Revision: d23a6bb43fc70fa7f45420eb293780b9dcfbd02c

Monotone-Author: wsourdeau@inverse.ca
Monotone-Date: 2010-04-09T18:45:14
Monotone-Branch: ca.inverse.sogo
maint-2.0.2
Wolfgang Sourdeau 2010-04-09 18:45:14 +00:00
parent 7a072049ab
commit 0fc3588ff3
121 changed files with 912 additions and 2557 deletions

View File

@ -1,5 +1,20 @@
2010-04-09 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* SoObjects/Appointments/SOGoAptMailUpdate.m,
SoObjects/Appointments/SOGoAptMailInvitation.m,
SoObjects/Appointments/SOGoAptMailICalReply.m,
SoObjects/Appointments/SOGoAptMailDeletion.m: revamped to make use
of language dictionaries rather than language-specific classes.
This hugely simplifies the code and ease the job of implementing
languages for SOGo.
* SoObjects/SOGo/SOGoObject.m (-labelForKey:) removed method,
obsoleted by the new one below.
* SoObjects/SOGo/NSObject+Utilities.m (-labelForKey:inContext:):
new method that enables the querying of module based language
dictionaries from non SoComponent instances.
* Tests/Integration/utilities.py (TestUtility.fetchUserInfo): same
as below.

View File

@ -23,3 +23,40 @@ vtodo_class2 = "(Tarefa Confidencial)";
"Receipt: attendees removed from an event" = "Receipt: attendees removed from an event";
"You have removed the following attendees(s):" = "You have removed the following attendees(s):";
"... from the following event:" = "... from the following event:";
/* IMIP messages */
"startDate_label" = "Start:";
"endDate_label" = "End:";
"due_label" = "Due Date:";
"location_label" = "Location:";
"summary_label" = "Summary:";
"comment_label" = "Comment:";
/* Invitation */
"Event Invitation: \"%{Summary}\"" = "Event Invitation: \"%{Summary}\"";
"(sent by %{SentBy}) " = "(enviado por %{SentBy}) ";
"%{Organizer} %{SentByText}has invited you to %{Summary}." = "%{Organizer} %{SentByText}has invited you to %{Summary}.";
/* Deletion */
"Event Cancelled: \"%{Summary}\"" = "Event Cancelled: \"%{Summary}\"";
"%{Organizer} %{SentByText}has cancelled this event: %{Summary}."
= "%{Organizer} %{SentByText}has cancelled this event: %{Summary}.";
/* Update */
"The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed"
= "The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed";
"The following parameters have changed in the \"%{Summary}\" meeting:"
= "The following parameters have changed in the \"%{Summary}\" meeting:";
"Please accept or decline those changes."
= "Please accept or decline those changes.";
/* Reply */
"Reply to invitation: \"%{Summary}\"" = "Resposta a Evento de Convite: \"%{Summary}\"";
"%{Attendee} %{SentByText}has accepted your event invitation."
= "%{Attendee} %{SentByText}foi aceitado seu convite ao evento.";
"%{Attendee} %{SentByText}has declined your event invitation."
= "%{Attendee} %{SentByText}foi declinado seu convite ao evento.";
"%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}."
= "%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}.";
"%{Attendee} %{SentByText}has not yet decided upon your event invitation."
= "%{Attendee} %{SentByText}foi ainda não decidiu seu convite ao evento.";

View File

@ -23,3 +23,40 @@ vtodo_class2 = "(Skrytý úkol)";
"Receipt: attendees removed from an event" = "Receipt: attendees removed from an event";
"You have removed the following attendees(s):" = "You have removed the following attendees(s):";
"... from the following event:" = "... from the following event:";
/* IMIP messages */
"startDate_label" = "Start:";
"endDate_label" = "End:";
"due_label" = "Due Date:";
"location_label" = "Location:";
"summary_label" = "Summary:";
"comment_label" = "Comment:";
/* Invitation */
"Event Invitation: \"%{Summary}\"" = "Event Invitation: \"%{Summary}\"";
"(sent by %{SentBy}) " = "(sent by %{SentBy}) ";
"%{Organizer} %{SentByText}has invited you to %{Summary}." = "%{Organizer} %{SentByText}has invited you to %{Summary}.";
/* Deletion */
"Event Cancelled: \"%{Summary}\"" = "Event Cancelled: \"%{Summary}\"";
"%{Organizer} %{SentByText}has cancelled this event: %{Summary}."
= "%{Organizer} %{SentByText}has cancelled this event: %{Summary}.";
/* Update */
"The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed"
= "The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed";
"The following parameters have changed in the \"%{Summary}\" meeting:"
= "The following parameters have changed in the \"%{Summary}\" meeting:";
"Please accept or decline those changes."
= "Please accept or decline those changes.";
/* Reply */
"Reply to invitation: \"%{Summary}\"" = "Reply to invitation: \"%{Summary}\"";
"%{Attendee} %{SentByText}has accepted your event invitation."
= "%{Attendee} %{SentByText}has accepted your event invitation.";
"%{Attendee} %{SentByText}has declined your event invitation."
= "%{Attendee} %{SentByText}has declined your event invitation.";
"%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}."
= "%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}.";
"%{Attendee} %{SentByText}has not yet decided upon your event invitation."
= "%{Attendee} %{SentByText}has not yet decided upon your event invitation.";

View File

@ -23,3 +23,40 @@ vtodo_class2 = "(Vertrouwelijke taak)";
"Receipt: attendees removed from an event" = "Receipt: attendees removed from an event";
"You have removed the following attendees(s):" = "You have removed the following attendees(s):";
"... from the following event:" = "... from the following event:";
/* IMIP messages */
"startDate_label" = "Start:";
"endDate_label" = "End:";
"due_label" = "Due Date:";
"location_label" = "Location:";
"summary_label" = "Summary:";
"comment_label" = "Comment:";
/* Invitation */
"Event Invitation: \"%{Summary}\"" = "Event Invitation: \"%{Summary}\"";
"(sent by %{SentBy}) " = "(sent by %{SentBy}) ";
"%{Organizer} %{SentByText}has invited you to %{Summary}." = "%{Organizer} %{SentByText}has invited you to %{Summary}.";
/* Deletion */
"Event Cancelled: \"%{Summary}\"" = "Event Cancelled: \"%{Summary}\"";
"%{Organizer} %{SentByText}has cancelled this event: %{Summary}."
= "%{Organizer} %{SentByText}has cancelled this event: %{Summary}.";
/* Update */
"The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed"
= "The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed";
"The following parameters have changed in the \"%{Summary}\" meeting:"
= "The following parameters have changed in the \"%{Summary}\" meeting:";
"Please accept or decline those changes."
= "Please accept or decline those changes.";
/* Reply */
"Reply to invitation: \"%{Summary}\"" = "Antwoord voor de gebeurtenisuitnodiging: \"%{Summary}\"";
"%{Attendee} %{SentByText}has accepted your event invitation."
= "%{Attendee} %{SentByText}heeft uw uitnodiging voor de gebeurtenis geaccepteerd.";
"%{Attendee} %{SentByText}has declined your event invitation."
= "%{Attendee} %{SentByText}heeft uw uitnodiging voor de gebeurtenis geweigerd.";
"%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}."
= "%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}.";
"%{Attendee} %{SentByText}has not yet decided upon your event invitation."
= "%{Attendee} %{SentByText}has not yet decided upon your event invitation.";

View File

@ -23,3 +23,40 @@ vtodo_class2 = "(Confidential task)";
"Receipt: attendees removed from an event" = "Receipt: attendees removed from an event";
"You have removed the following attendees(s):" = "You have removed the following attendees(s):";
"... from the following event:" = "... from the following event:";
/* IMIP messages */
"startDate_label" = "Start:";
"endDate_label" = "End:";
"due_label" = "Due Date:";
"location_label" = "Location:";
"summary_label" = "Summary:";
"comment_label" = "Comment:";
/* Invitation */
"Event Invitation: \"%{Summary}\"" = "Event Invitation: \"%{Summary}\"";
"(sent by %{SentBy}) " = "(sent by %{SentBy}) ";
"%{Organizer} %{SentByText}has invited you to %{Summary}." = "%{Organizer} %{SentByText}has invited you to %{Summary}.";
/* Deletion */
"Event Cancelled: \"%{Summary}\"" = "Event Cancelled: \"%{Summary}\"";
"%{Organizer} %{SentByText}has cancelled this event: %{Summary}."
= "%{Organizer} %{SentByText}has cancelled this event: %{Summary}.";
/* Update */
"The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed"
= "The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed";
"The following parameters have changed in the \"%{Summary}\" meeting:"
= "The following parameters have changed in the \"%{Summary}\" meeting:";
"Please accept or decline those changes."
= "Please accept or decline those changes.";
/* Reply */
"Reply to invitation: \"%{Summary}\"" = "Reply to invitation: \"%{Summary}\"";
"%{Attendee} %{SentByText}has accepted your event invitation."
= "%{Attendee} %{SentByText}has accepted your event invitation.";
"%{Attendee} %{SentByText}has declined your event invitation."
= "%{Attendee} %{SentByText}has declined your event invitation.";
"%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}."
= "%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}.";
"%{Attendee} %{SentByText}has not yet decided upon your event invitation."
= "%{Attendee} %{SentByText}has not yet decided upon your event invitation.";

View File

@ -23,3 +23,41 @@ vtodo_class2 = "(Tâche confidentielle)";
"Receipt: attendees removed from an event" = "Acc. de réception: invitations annulées";
"You have removed the following attendees(s):" = "Les utilisateurs suivants :";
"... from the following event:" = "... ne sont plus invités à cette réunion :";
/* IMIP messages */
"startDate_label" = "Du :";
"endDate_label" = "au :";
"due_label" = "Fin prévue :";
"location_label" = "Lieu :";
"summary_label" = "Titre :";
"comment_label" = "Description :";
/* Invitation */
"Event Invitation: \"%{Summary}\"" = "Invitation à la réunion : \"%{Summary}\"";
"(sent by %{SentBy}) " = "(envoyé par %{SentBy}) ";
"%{Organizer} %{SentByText}has invited you to %{Summary}."
= "%{Organizer} %{SentByText}vous a invité à la réunion « %{Summary} ».";
/* Deletion */
"Event Cancelled: \"%{Summary}\"" = "Réunion annulée : « %{Summary} »";
"%{Organizer} %{SentByText}has cancelled this event: %{Summary}."
= "%{Organizer} %{SentByText}a annulé cette réunion : « %{Summary} »";
/* Update */
"The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed"
= "La réunion « %{Summary} » de %{OldStartDate} à %{OldStartTime} a été modifiée";
"The following parameters have changed in the \"%{Summary}\" meeting:"
= "Les paramètres suivants ont été modifiés pour la réunion « %{Summary} » :";
"Please accept or decline those changes."
= "Veuillez reconfirmer ou annuler votre présence.";
/* Reply */
"Reply to invitation: \"%{Summary}\"" = "Réponse à l'invitation : « %{Summary} »";
"%{Attendee} %{SentByText}has accepted your event invitation."
= "%{Attendee} %{SentByText}a accepté votre invitation.";
"%{Attendee} %{SentByText}has declined your event invitation."
= "%{Attendee} %{SentByText}a décliné votre invitation.";
"%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}."
= "%{Attendee} %{SentByText}a délégué votre invitation à %{Delegate}.";
"%{Attendee} %{SentByText}has not yet decided upon your event invitation."
= "%{Attendee} %{SentByText}choisir de reporter sa décision par rapport à votre invitation.";

View File

@ -48,54 +48,6 @@ Appointments_LANGUAGES = BrazilianPortuguese Czech Dutch English French German H
Appointments_LOCALIZED_RESOURCE_FILES = Localizable.strings
Appointments_COMPONENTS += \
SOGoAptMailBrazilianPortugueseInvitation.wo \
SOGoAptMailBrazilianPortugueseICalReply.wo \
SOGoAptMailBrazilianPortugueseDeletion.wo \
SOGoAptMailBrazilianPortugueseUpdate.wo \
SOGoAptMailCzechInvitation.wo \
SOGoAptMailCzechICalReply.wo \
SOGoAptMailCzechDeletion.wo \
SOGoAptMailCzechUpdate.wo \
SOGoAptMailDutchInvitation.wo \
SOGoAptMailDutchICalReply.wo \
SOGoAptMailDutchDeletion.wo \
SOGoAptMailDutchUpdate.wo \
SOGoAptMailEnglishInvitation.wo \
SOGoAptMailEnglishDeletion.wo \
SOGoAptMailEnglishUpdate.wo \
SOGoAptMailFrenchInvitation.wo \
SOGoAptMailFrenchICalReply.wo \
SOGoAptMailFrenchDeletion.wo \
SOGoAptMailFrenchUpdate.wo \
SOGoAptMailGermanInvitation.wo \
SOGoAptMailGermanICalReply.wo \
SOGoAptMailGermanDeletion.wo \
SOGoAptMailGermanUpdate.wo \
SOGoAptMailHungarianInvitation.wo \
SOGoAptMailHungarianICalReply.wo \
SOGoAptMailHungarianDeletion.wo \
SOGoAptMailHungarianUpdate.wo \
SOGoAptMailItalianInvitation.wo \
SOGoAptMailItalianICalReply.wo \
SOGoAptMailItalianDeletion.wo \
SOGoAptMailItalianUpdate.wo \
SOGoAptMailRussianInvitation.wo \
SOGoAptMailRussianICalReply.wo \
SOGoAptMailRussianDeletion.wo \
SOGoAptMailRussianUpdate.wo \
SOGoAptMailSpanishInvitation.wo \
SOGoAptMailSpanishICalReply.wo \
SOGoAptMailSpanishDeletion.wo \
SOGoAptMailSpanishUpdate.wo \
SOGoAptMailSwedishInvitation.wo \
SOGoAptMailSwedishDeletion.wo \
SOGoAptMailSwedishUpdate.wo \
SOGoAptMailWelshInvitation.wo \
SOGoAptMailWelshICalReply.wo \
SOGoAptMailWelshDeletion.wo \
SOGoAptMailWelshUpdate.wo
ADDITIONAL_INCLUDE_DIRS += -I../../SOPE/
ADDITIONAL_LIB_DIRS += -L../../SOPE/GDLContentStore/obj/

View File

@ -23,3 +23,40 @@ vtodo_class2 = "(Vertrauliche Aufgabe)";
"Receipt: attendees removed from an event" = "Receipt: attendees removed from an event";
"You have removed the following attendees(s):" = "You have removed the following attendees(s):";
"... from the following event:" = "... from the following event:";
/* IMIP messages */
"startDate_label" = "Start:";
"endDate_label" = "End:";
"due_label" = "Due Date:";
"location_label" = "Location:";
"summary_label" = "Summary:";
"comment_label" = "Comment:";
/* Invitation */
"Event Invitation: \"%{Summary}\"" = "Event Invitation: \"%{Summary}\"";
"(sent by %{SentBy}) " = "(sent by %{SentBy}) ";
"%{Organizer} %{SentByText}has invited you to %{Summary}." = "%{Organizer} %{SentByText}has invited you to %{Summary}.";
/* Deletion */
"Event Cancelled: \"%{Summary}\"" = "Event Cancelled: \"%{Summary}\"";
"%{Organizer} %{SentByText}has cancelled this event: %{Summary}."
= "%{Organizer} %{SentByText}has cancelled this event: %{Summary}.";
/* Update */
"The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed"
= "The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed";
"The following parameters have changed in the \"%{Summary}\" meeting:"
= "The following parameters have changed in the \"%{Summary}\" meeting:";
"Please accept or decline those changes."
= "Please accept or decline those changes.";
/* Reply */
"Reply to invitation: \"%{Summary}\"" = "Antwort Termineinladung: %{Summary}";
"%{Attendee} %{SentByText}has accepted your event invitation."
= "%{Attendee} %{SentByText}hat Ihre Termineinladung akzeptiert.";
"%{Attendee} %{SentByText}has declined your event invitation."
= "%{Attendee} %{SentByText}hat Ihre Termineinladung abgelehnt.";
"%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}."
= "%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}.";
"%{Attendee} %{SentByText}has not yet decided upon your event invitation."
= "%{Attendee} %{SentByText}hat noch nicht über Ihre Termineinladung entschieden.";

View File

@ -23,3 +23,40 @@ vtodo_class2 = "(Bizalmas feladat)";
"Receipt: attendees removed from an event" = "Receipt: attendees removed from an event";
"You have removed the following attendees(s):" = "You have removed the following attendees(s):";
"... from the following event:" = "... from the following event:";
/* IMIP messages */
"startDate_label" = "Start:";
"endDate_label" = "End:";
"due_label" = "Due Date:";
"location_label" = "Location:";
"summary_label" = "Summary:";
"comment_label" = "Comment:";
/* Invitation */
"Event Invitation: \"%{Summary}\"" = "Event Invitation: \"%{Summary}\"";
"(sent by %{SentBy}) " = "(%{SentBy} által elküldve) ";
"%{Organizer} %{SentByText}has invited you to %{Summary}." = "%{Organizer} %{SentByText}has invited you to %{Summary}.";
/* Deletion */
"Event Cancelled: \"%{Summary}\"" = "Event Cancelled: \"%{Summary}\"";
"%{Organizer} %{SentByText}has cancelled this event: %{Summary}."
= "%{Organizer} %{SentByText}has cancelled this event: %{Summary}.";
/* Update */
"The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed"
= "The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed";
"The following parameters have changed in the \"%{Summary}\" meeting:"
= "The following parameters have changed in the \"%{Summary}\" meeting:";
"Please accept or decline those changes."
= "Please accept or decline those changes.";
/* Reply */
"Reply to invitation: \"%{Summary}\"" = "Válasz a meghívásra: %{Summary}";
"%{Attendee} %{SentByText}has accepted your event invitation."
= "%{Attendee} %{SentByText}elfogadta a meghívását.";
"%{Attendee} %{SentByText}has declined your event invitation."
= "%{Attendee} %{SentByText}visszautasította a meghívását.";
"%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}."
= "%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}.";
"%{Attendee} %{SentByText}has not yet decided upon your event invitation."
= "%{Attendee} %{SentByText}még meggondolja a meghívását.";

View File

@ -23,3 +23,40 @@ vtodo_class2 = "(Attività confidenziale)";
"Receipt: attendees removed from an event" = "Receipt: attendees removed from an event";
"You have removed the following attendees(s):" = "You have removed the following attendees(s):";
"... from the following event:" = "... from the following event:";
/* IMIP messages */
"startDate_label" = "Start:";
"endDate_label" = "End:";
"due_label" = "Due Date:";
"location_label" = "Location:";
"summary_label" = "Summary:";
"comment_label" = "Comment:";
/* Invitation */
"Event Invitation: \"%{Summary}\"" = "Event Invitation: \"%{Summary}\"";
"(sent by %{SentBy}) " = "(sent by %{SentBy}) ";
"%{Organizer} %{SentByText}has invited you to %{Summary}." = "%{Organizer} %{SentByText}has invited you to %{Summary}.";
/* Deletion */
"Event Cancelled: \"%{Summary}\"" = "Event Cancelled: \"%{Summary}\"";
"%{Organizer} %{SentByText}has cancelled this event: %{Summary}."
= "%{Organizer} %{SentByText}has cancelled this event: %{Summary}.";
/* Update */
"The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed"
= "The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed";
"The following parameters have changed in the \"%{Summary}\" meeting:"
= "The following parameters have changed in the \"%{Summary}\" meeting:";
"Please accept or decline those changes."
= "Please accept or decline those changes.";
/* Reply */
"Reply to invitation: \"%{Summary}\"" = "Re: Appuntemento : \"%{Summary}\"";
"%{Attendee} %{SentByText}has accepted your event invitation."
= "%{Attendee} %{SentByText}ha accepttato l'invito al proprio evento.";
"%{Attendee} %{SentByText}has declined your event invitation."
= "%{Attendee} %{SentByText}ha declinato l'invito al proprio evento.";
"%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}."
= "%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}.";
"%{Attendee} %{SentByText}has not yet decided upon your event invitation."
= "%{Attendee} %{SentByText}has not yet decided upon your event invitation.";

View File

@ -23,3 +23,40 @@ vtodo_class2 = "(Confidential task)";
"Receipt: attendees removed from an event" = "Receipt: attendees removed from an event";
"You have removed the following attendees(s):" = "You have removed the following attendees(s):";
"... from the following event:" = "... from the following event:";
/* IMIP messages */
"startDate_label" = "Start:";
"endDate_label" = "End:";
"due_label" = "Due Date:";
"location_label" = "Location:";
"summary_label" = "Summary:";
"comment_label" = "Comment:";
/* Invitation */
"Event Invitation: \"%{Summary}\"" = "Event Invitation: \"%{Summary}\"";
"(sent by %{SentBy}) " = "(послал %{SentBy}) ";
"%{Organizer} %{SentByText}has invited you to %{Summary}." = "%{Organizer} %{SentByText}has invited you to %{Summary}.";
/* Deletion */
"Event Cancelled: \"%{Summary}\"" = "Event Cancelled: \"%{Summary}\"";
"%{Organizer} %{SentByText}has cancelled this event: %{Summary}."
= "%{Organizer} %{SentByText}has cancelled this event: %{Summary}.";
/* Update */
"The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed"
= "The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed";
"The following parameters have changed in the \"%{Summary}\" meeting:"
= "The following parameters have changed in the \"%{Summary}\" meeting:";
"Please accept or decline those changes."
= "Please accept or decline those changes.";
/* Reply */
"Reply to 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}has delegated the invitation to %{Delegate}.";
"%{Attendee} %{SentByText}has not yet decided upon your event invitation."
= "%{Attendee} %{SentByText}не определился с желанием участвовать в запланированном мероприятии.";

View File

@ -38,6 +38,7 @@
#import <SOGo/WORequest+SOGo.h>
#import <SOGo/NSObject+DAV.h>
#import <SOGo/NSObject+Utilities.h>
#import <SOGo/SOGoParentFolder.h>
#import <SOGo/SOGoPermissions.h>
#import <SOGo/SOGoUser.h>
@ -74,7 +75,7 @@
- (NSString *) defaultFolderName
{
return [self labelForKey: @"Personal Calendar"];
return [self labelForKey: @"Personal Calendar" inContext: context];
}
- (NSArray *) toManyRelationshipKeys

View File

@ -1,2 +0,0 @@
<#IsSubject>Evento Cancelado: <#summary/></#IsSubject>
<#IsBody><#organizer/> <#HasSentBy>(enviado por <#sentBy/>) </#HasSentBy>cancelou este evento: <#summary/>.</#IsBody>

View File

@ -1,27 +0,0 @@
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
organizer: WOString {
value = organizerName;
escapeHTML = NO;
}
summary: WOString {
value = summary;
escapeHTML = NO;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,2 +0,0 @@
<#IsSubject>Resposta a Evento de Convite: <#summary/></#IsSubject>
<#IsBody><#attendee/><#HasSentBy> (enviado por <#sentBy/>)</#HasSentBy> foi <#HasAccepted>aceitado</#HasAccepted><#HasDeclined>declinado</#HasDeclined><#HasNotAcceptedNotDeclined>ainda não decidiu</#HasNotAcceptedNotDeclined> seu convite ao evento.</#IsBody>

View File

@ -1,39 +0,0 @@
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
summary: WOString {
value = summary;
escapeHTML = NO;
}
attendee: WOString {
value = attendeeName;
escapeHTML = NO;
}
HasAccepted: WOConditional {
condition = hasAccepted;
}
HasDeclined: WOConditional {
condition = hasDeclined;
}
HasNotAcceptedNotDeclined: WOConditional {
condition = hasNotAcceptedNotDeclined;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,2 +0,0 @@
<#IsSubject>Convite a Evento: <#summary/></#IsSubject>
<#IsBody><#organizer/> <#HasSentBy>(enviado por <#sentBy/>) </#HasSentBy>convidou você para <#summary/>.</#IsBody>

View File

@ -1,27 +0,0 @@
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
organizer: WOString {
value = organizerName;
escapeHTML = NO;
}
summary: WOString {
value = summary;
escapeHTML = NO;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,5 +0,0 @@
<#IsSubject>O apontamento "<#Summary />" para <#OldAptStartDate /> as <#OldAptStartTime /> foi modificado</#IsSubject>
<#IsBody>
O apontamento<#HasSentBy> (enviado por <#sentBy/>)</#HasSentBy>, previamente confirmado para <#OldAptStartDate /><#IsNotOldAllDay> as <#OldAptStartTime /></#IsNotOldAllDay><#HasOldLocation> (<#OldAptLocation />)</#HasOldLocation> está agendado agora para <#NewAptStartDate /><#IsNotNewAllDay> as <#NewAptStartTime /></#IsNotNewAllDay><#HasNewLocation> (<#NewAptLocation />)</#HasNewLocation>.
Por favor, decida sobre esta nova modificação.
</#IsBody>

View File

@ -1,79 +0,0 @@
OldAptStartDate: WOString {
value = oldStartDate;
dateformat = "%d/%m/%y";
escapeHTML = NO;
}
OldAptStartTime: WOString {
value = oldStartDate;
dateformat = "%H:%M";
escapeHTML = NO;
}
IsNotOldAllDay: WOConditional {
condition = previousApt.isAllDay;
negate = YES;
}
NewAptStartDate: WOString {
value = newStartDate;
dateformat = "%d/%m/%y";
escapeHTML = NO;
}
NewAptStartTime: WOString {
value = newStartDate;
dateformat = "%H:%M";
escapeHTML = NO;
}
IsNotNewAllDay: WOConditional {
condition = apt.isAllDay;
negate = YES;
}
Organizer: WOString {
value = organizerName;
escapeHTML = NO;
}
OldAptLocation: WOString {
value = previousApt.location;
escapeHTML = NO;
}
NewAptLocation: WOString {
value = apt.location;
escapeHTML = NO;
}
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
Summary: WOString {
value = summary;
escapeHTML = NO;
}
HasNewLocation: WOConditional {
condition = hasNewLocation;
}
HasOldLocation: WOConditional {
condition = hasOldLocation;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,2 +0,0 @@
<#IsSubject>Událost zrušena: <#summary/></#IsSubject>
<#IsBody><#organizer/><#HasSentBy> (zaslal/a <#sentBy/>) </#HasSentBy>zrušil/a tuto událost: <#summary/>.</#IsBody>

View File

@ -1,27 +0,0 @@
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
organizer: WOString {
value = organizerName;
escapeHTML = NO;
}
summary: WOString {
value = summary;
escapeHTML = NO;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,2 +0,0 @@
<#IsSubject>Odpověď na pozvánku k události: <#summary/></#IsSubject>
<#IsBody><#attendee/><#HasSentBy> (zaslal/a <#sentBy/>) </#HasSentBy><#HasAccepted> přijal/a</#HasAccepted><#HasDeclined> odmítl/a</#HasDeclined><#HasNotAcceptedNotDeclined> zatím nerozhodl/a o</#HasNotAcceptedNotDeclined> Vaši pozvánku/ce.</#IsBody>

View File

@ -1,39 +0,0 @@
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
summary: WOString {
value = summary;
escapeHTML = NO;
}
attendee: WOString {
value = attendeeName;
escapeHTML = NO;
}
HasAccepted: WOConditional {
condition = hasAccepted;
}
HasDeclined: WOConditional {
condition = hasDeclined;
}
HasNotAcceptedNotDeclined: WOConditional {
condition = hasNotAcceptedNotDeclined;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,2 +0,0 @@
<#IsSubject>Pozvánka na událost: <#summary/></#IsSubject>
<#IsBody><#organizer/><#HasSentBy> (zaslal/a <#sentBy/>)</#HasSentBy> Vás pozval na <#summary/>.</#IsBody>

View File

@ -1,27 +0,0 @@
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
organizer: WOString {
value = organizerName;
escapeHTML = NO;
}
summary: WOString {
value = summary;
escapeHTML = NO;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,4 +0,0 @@
<#IsSubject>Schůzka "<#Summary />" na <#OldAptStartDate /> v <#OldAptStartTime /> byla změněna</#IsSubject>
<#IsBody>Tato schůzka<#HasSentBy> (zaslal/a <#sentBy/>)</#HasSentBy>, předtím ujednána na <#OldAptStartDate /><#IsNotOldAllDay> v <#OldAptStartTime /></#IsNotOldAllDay><#HasOldLocation> (<#OldAptLocation />)</#HasOldLocation> je nyní přesunuta na <#NewAptStartDate /><#IsNotNewAllDay> v <#NewAptStartTime /></#IsNotNewAllDay><#HasNewLocation> (<#NewAptLocation />)</#HasNewLocation>.
Rozhodněte prosím o tomto novém nastavení.
</#IsBody>

View File

@ -1,79 +0,0 @@
OldAptStartDate: WOString {
value = oldStartDate;
dateformat = "%d/%m/%y";
escapeHTML = NO;
}
OldAptStartTime: WOString {
value = oldStartDate;
dateformat = "%H:%M";
escapeHTML = NO;
}
IsNotOldAllDay: WOConditional {
condition = previousApt.isAllDay;
negate = YES;
}
NewAptStartDate: WOString {
value = newStartDate;
dateformat = "%d/%m/%y";
escapeHTML = NO;
}
NewAptStartTime: WOString {
value = newStartDate;
dateformat = "%H:%M";
escapeHTML = NO;
}
IsNotNewAllDay: WOConditional {
condition = apt.isAllDay;
negate = YES;
}
Organizer: WOString {
value = organizerName;
escapeHTML = NO;
}
OldAptLocation: WOString {
value = previousApt.location;
escapeHTML = NO;
}
NewAptLocation: WOString {
value = apt.location;
escapeHTML = NO;
}
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
Summary: WOString {
value = summary;
escapeHTML = NO;
}
HasNewLocation: WOConditional {
condition = hasNewLocation;
}
HasOldLocation: WOConditional {
condition = hasOldLocation;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,94 +1,59 @@
/*
Copyright (C) 2000-2005 SKYRIX Software AG
Copyright (C) 2010 Inverse
This file is part of OpenGroupware.org.
This file is part of SOGo
OGo is free software; you can redistribute it and/or modify it under
SOGo is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
OGo is distributed in the hope that it will be useful, but WITHOUT ANY
SOGo is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with OGo; see the file COPYING. If not, write to the
License along with SOGo; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#include "SOGoAptMailNotification.h"
#import <SOGo/NSDictionary+Utilities.h>
#import <SOGo/NSObject+Utilities.h>
@interface SOGoAptMailEnglishDeletion : SOGoAptMailNotification
#import "SOGoAptMailNotification.h"
@interface SOGoAptMailDeletion : SOGoAptMailNotification
@end
@implementation SOGoAptMailEnglishDeletion
@end
@implementation SOGoAptMailDeletion
@interface SOGoAptMailBrazilianPortugueseDeletion : SOGoAptMailNotification
@end
- (NSString *) getSubject
{
NSString *subjectFormat;
@implementation SOGoAptMailBrazilianPortugueseDeletion
@end
if (!values)
[self setupValues];
@interface SOGoAptMailCzechDeletion : SOGoAptMailNotification
@end
subjectFormat = [self labelForKey: @"Event Cancelled: \"%{Summary}\""
inContext: context];
@implementation SOGoAptMailCzechDeletion
@end
return [values keysWithFormat: subjectFormat];
}
@interface SOGoAptMailDutchDeletion : SOGoAptMailNotification
@end
- (NSString *) getBody
{
NSString *bodyFormat;
@implementation SOGoAptMailDutchDeletion
@end
if (!values)
[self setupValues];
@interface SOGoAptMailFrenchDeletion : SOGoAptMailNotification
@end
bodyFormat = [self labelForKey: @"%{Organizer} %{SentByText}has"
@" cancelled this event: %{Summary}."
inContext: context];
@implementation SOGoAptMailFrenchDeletion
@end
return [values keysWithFormat: bodyFormat];
}
@interface SOGoAptMailGermanDeletion : SOGoAptMailNotification
@end
@implementation SOGoAptMailGermanDeletion
@end
@interface SOGoAptMailHungarianDeletion : SOGoAptMailNotification
@end
@implementation SOGoAptMailHungarianDeletion
@end
@interface SOGoAptMailItalianDeletion : SOGoAptMailNotification
@end
@implementation SOGoAptMailItalianDeletion
@end
@interface SOGoAptMailRussianDeletion : SOGoAptMailNotification
@end
@implementation SOGoAptMailRussianDeletion
@end
@interface SOGoAptMailSpanishDeletion : SOGoAptMailNotification
@end
@implementation SOGoAptMailSpanishDeletion
@end
@interface SOGoAptMailSwedishDeletion : SOGoAptMailNotification
@end
@implementation SOGoAptMailSwedishDeletion
@end
@interface SOGoAptMailWelshDeletion : SOGoAptMailNotification
@end
@implementation SOGoAptMailWelshDeletion
@end

View File

@ -1,2 +0,0 @@
<#IsSubject>Gebeurtenis geannuleerd: <#summary/></#IsSubject>
<#IsBody><#organizer/> <#HasSentBy>(sent by <#sentBy/>) </#HasSentBy>heeft deze gebeurtenis geannuleerd: « <#summary/> ».</#IsBody>

View File

@ -1,27 +0,0 @@
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
organizer: WOString {
value = organizerName;
escapeHTML = NO;
}
summary: WOString {
value = summary;
escapeHTML = NO;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,2 +0,0 @@
<#IsSubject>Antwoord voor de gebeurtenisuitnodiging: <#summary/></#IsSubject>
<#IsBody><#organizer/><#HasSentBy> (sent by <#sentBy/>)</#HasSentBy> heeft uw uitnodiging voor de gebeurtenis <#HasAccepted>geaccepteerd</#HasAccepted><#HasDeclined>geweigerd</#HasDeclined><#HasNotAcceptedNotDeclined>not yet decided upon</#HasNotAcceptedNotDeclined>.</#IsBody>

View File

@ -1,39 +0,0 @@
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
summary: WOString {
value = summary;
escapeHTML = NO;
}
attendee: WOString {
value = attendeeName;
escapeHTML = NO;
}
HasAccepted: WOConditional {
condition = hasAccepted;
}
HasDeclined: WOConditional {
condition = hasDeclined;
}
HasNotAcceptedNotDeclined: WOConditional {
condition = hasNotAcceptedNotDeclined;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,2 +0,0 @@
<#IsSubject>Uitnodiging voor gebeurtenis: <#summary/></#IsSubject>
<#IsBody><#organizer/> <#HasSentBy>(sent by <#sentBy/>) </#HasSentBy>heeft u uitgenodigd voor <#summary/>.</#IsBody>

View File

@ -1,27 +0,0 @@
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
organizer: WOString {
value = organizerName;
escapeHTML = NO;
}
summary: WOString {
value = summary;
escapeHTML = NO;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,5 +0,0 @@
<#IsSubject>The appointment "<#Summary />" for the <#OldAptStartDate /> at <#OldAptStartTime /> has changed</#IsSubject>
<#IsBody>
This appointment<#HasSentBy> (sent by <#sentBy/>)</#HasSentBy>, previously set for <#OldAptStartDate /><#IsNotOldAllDay> at <#OldAptStartTime /></#IsNotOldAllDay><#HasOldLocation> (<#OldAptLocation />)</#HasOldLocation> is now scheduled for <#NewAptStartDate /><#IsNotNewAllDay> at <#NewAptStartTime /></#IsNotNewAllDay><#HasNewLocation> (<#NewAptLocation />)</#HasNewLocation>.
Please make a decision for these new settings.
</#IsBody>

View File

@ -1,79 +0,0 @@
OldAptStartDate: WOString {
value = oldStartDate;
dateformat = "%d/%m/%y";
escapeHTML = NO;
}
OldAptStartTime: WOString {
value = oldStartDate;
dateformat = "%H:%M";
escapeHTML = NO;
}
IsNotOldAllDay: WOConditional {
condition = previousApt.isAllDay;
negate = YES;
}
NewAptStartDate: WOString {
value = newStartDate;
dateformat = "%d/%m/%y";
escapeHTML = NO;
}
NewAptStartTime: WOString {
value = newStartDate;
dateformat = "%H:%M";
escapeHTML = NO;
}
IsNotNewAllDay: WOConditional {
condition = apt.isAllDay;
negate = YES;
}
Organizer: WOString {
value = organizerName;
escapeHTML = NO;
}
OldAptLocation: WOString {
value = previousApt.location;
escapeHTML = NO;
}
NewAptLocation: WOString {
value = apt.location;
escapeHTML = NO;
}
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
Summary: WOString {
value = summary;
escapeHTML = NO;
}
HasNewLocation: WOConditional {
condition = hasNewLocation;
}
HasOldLocation: WOConditional {
condition = hasOldLocation;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,2 +0,0 @@
<#IsSubject>Event Cancelled: <#summary/></#IsSubject>
<#IsBody><#organizer/> <#HasSentBy>(sent by <#sentBy/>) </#HasSentBy>has cancelled this event: <#summary/>.</#IsBody>

View File

@ -1,27 +0,0 @@
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
organizer: WOString {
value = organizerName;
escapeHTML = NO;
}
summary: WOString {
value = summary;
escapeHTML = NO;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,2 +0,0 @@
<#IsSubject>Event Invitation: <#summary/></#IsSubject>
<#IsBody><#organizer/> <#HasSentBy>(sent by <#sentBy/>) </#HasSentBy>has invited you to <#summary/>.</#IsBody>

View File

@ -1,27 +0,0 @@
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
organizer: WOString {
value = organizerName;
escapeHTML = NO;
}
summary: WOString {
value = summary;
escapeHTML = NO;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,5 +0,0 @@
<#IsSubject>The appointment "<#Summary />" for the <#OldAptStartDate /> at <#OldAptStartTime /> has changed</#IsSubject>
<#IsBody>
This appointment<#HasSentBy> (sent by <#sentBy/>)</#HasSentBy>, previously set for <#OldAptStartDate /><#IsNotOldAllDay> at <#OldAptStartTime /></#IsNotOldAllDay><#HasOldLocation> (<#OldAptLocation />)</#HasOldLocation> is now scheduled for <#NewAptStartDate /><#IsNotNewAllDay> at <#NewAptStartTime /></#IsNotNewAllDay><#HasNewLocation> (<#NewAptLocation />)</#HasNewLocation>.
Please make a decision for these new settings.
</#IsBody>

View File

@ -1,79 +0,0 @@
OldAptStartDate: WOString {
value = oldStartDate;
dateformat = "%d/%m/%y";
escapeHTML = NO;
}
OldAptStartTime: WOString {
value = oldStartDate;
dateformat = "%H:%M";
escapeHTML = NO;
}
IsNotOldAllDay: WOConditional {
condition = previousApt.isAllDay;
negate = YES;
}
NewAptStartDate: WOString {
value = newStartDate;
dateformat = "%d/%m/%y";
escapeHTML = NO;
}
NewAptStartTime: WOString {
value = newStartDate;
dateformat = "%H:%M";
escapeHTML = NO;
}
IsNotNewAllDay: WOConditional {
condition = apt.isAllDay;
negate = YES;
}
Organizer: WOString {
value = organizerName;
escapeHTML = NO;
}
OldAptLocation: WOString {
value = previousApt.location;
escapeHTML = NO;
}
NewAptLocation: WOString {
value = apt.location;
escapeHTML = NO;
}
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
Summary: WOString {
value = summary;
escapeHTML = NO;
}
HasNewLocation: WOConditional {
condition = hasNewLocation;
}
HasOldLocation: WOConditional {
condition = hasOldLocation;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,2 +0,0 @@
<#IsSubject>Événement annulé : « <#summary/> »</#IsSubject>
<#IsBody><#organizer/> <#HasSentBy>(envoyé par <#sentBy/>) </#HasSentBy>a annulé cet événement : « <#summary/> ».</#IsBody>

View File

@ -1,27 +0,0 @@
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
organizer: WOString {
value = organizerName;
escapeHTML = NO;
}
summary: WOString {
value = summary;
escapeHTML = NO;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,2 +0,0 @@
<#IsSubject>Réponse à l'invitation : «<#summary/>»</#IsSubject>
<#IsBody><#attendee/><#HasSentBy> (envoyé par <#sentBy/>)</#HasSentBy> a <#HasAccepted>accepté</#HasAccepted><#HasDeclined>refusé</#HasDeclined><#HasNotAcceptedNotDeclined>choisi de reporter sa décision par rapport à</#HasNotAcceptedNotDeclined> votre invitation.</#IsBody>

View File

@ -1,39 +0,0 @@
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
summary: WOString {
value = summary;
escapeHTML = NO;
}
attendee: WOString {
value = attendeeName;
escapeHTML = NO;
}
HasAccepted: WOConditional {
condition = hasAccepted;
}
HasDeclined: WOConditional {
condition = hasDeclined;
}
HasNotAcceptedNotDeclined: WOConditional {
condition = hasNotAcceptedNotDeclined;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,2 +0,0 @@
<#IsSubject>Invitation : <#summary/></#IsSubject>
<#IsBody><#organizer/> <#HasSentBy>(envoyé par <#sentBy/>) </#HasSentBy>vous a invité à « <#summary/> ».</#IsBody>

View File

@ -1,27 +0,0 @@
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
organizer: WOString {
value = organizerName;
escapeHTML = NO;
}
summary: WOString {
value = summary;
escapeHTML = NO;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,5 +0,0 @@
<#IsSubject>Le rendez-vous "<#Summary />" du <#OldAptStartDate /> à <#OldAptStartTime /> est modifié</#IsSubject>
<#IsBody>
La réunion<#HasSentBy> (envoyé par <#sentBy/>)</#HasSentBy> qui devait se dérouler le <#OldAptStartDate /><#IsNotOldAllDay> à <#OldAptStartTime /></#IsNotOldAllDay><#HasOldLocation> (<#OldAptLocation />)</#HasOldLocation> est maintenant prévue le <#NewAptStartDate /><#IsNotNewAllDay> à <#NewAptStartTime /></#IsNotNewAllDay><#HasNewLocation> (<#NewAptLocation />)</#HasNewLocation>.
Vous êtes invité à accepter ou refuser de participer à la réunion pour cette nouvelle date.
</#IsBody>

View File

@ -1,79 +0,0 @@
OldAptStartDate: WOString {
value = oldStartDate;
dateformat = "%d/%m/%y";
escapeHTML = NO;
}
OldAptStartTime: WOString {
value = oldStartDate;
dateformat = "%H:%M";
escapeHTML = NO;
}
IsNotOldAllDay: WOConditional {
condition = previousApt.isAllDay;
negate = YES;
}
NewAptStartDate: WOString {
value = newStartDate;
dateformat = "%d/%m/%y";
escapeHTML = NO;
}
NewAptStartTime: WOString {
value = newStartDate;
dateformat = "%H:%M";
escapeHTML = NO;
}
IsNotNewAllDay: WOConditional {
condition = apt.isAllDay;
negate = YES;
}
Organizer: WOString {
value = organizerName;
escapeHTML = NO;
}
OldAptLocation: WOString {
value = previousApt.location;
escapeHTML = NO;
}
NewAptLocation: WOString {
value = apt.location;
escapeHTML = NO;
}
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
Summary: WOString {
value = summary;
escapeHTML = NO;
}
HasNewLocation: WOConditional {
condition = hasNewLocation;
}
HasOldLocation: WOConditional {
condition = hasOldLocation;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,2 +0,0 @@
<#IsSubject>Termin abgesagt: <#summary/></#IsSubject>
<#IsBody><#organizer/> <#HasSentBy>(sent by <#sentBy/>) </#HasSentBy>hat diesen Termin abgesagt: <#summary/></#IsBody>

View File

@ -1,27 +0,0 @@
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
organizer: WOString {
value = organizerName;
escapeHTML = NO;
}
summary: WOString {
value = summary;
escapeHTML = NO;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,2 +0,0 @@
<#IsSubject>Antwort Termineinladung: <#summary/></#IsSubject>
<#IsBody><#attendee/><#HasSentBy> (sent by <#sentBy/>)</#HasSentBy> hat <#HasAccepted>Ihre Termineinladung akzeptiert</#HasAccepted><#HasDeclined>Ihre Termineinladung abgelehnt</#HasDeclined><#HasNotAcceptedNotDeclined>noch nicht über Ihre Termineinladung entschieden</#HasNotAcceptedNotDeclined></#IsBody>.

View File

@ -1,39 +0,0 @@
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
summary: WOString {
value = summary;
escapeHTML = NO;
}
attendee: WOString {
value = attendeeName;
escapeHTML = NO;
}
HasAccepted: WOConditional {
condition = hasAccepted;
}
HasDeclined: WOConditional {
condition = hasDeclined;
}
HasNotAcceptedNotDeclined: WOConditional {
condition = hasNotAcceptedNotDeclined;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,2 +0,0 @@
<#IsSubject>Termineinladung: <#summary/></#IsSubject>
<#IsBody><#organizer/> <#HasSentBy>(sent by <#sentBy/>) </#HasSentBy>hat Sie zu <#summary/> eingeladen.</#IsBody>

View File

@ -1,27 +0,0 @@
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
organizer: WOString {
value = organizerName;
escapeHTML = NO;
}
summary: WOString {
value = summary;
escapeHTML = NO;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,5 +0,0 @@
<#IsSubject>Der Termin "<#Summary />" am <#OldAptStartDate /> um <#OldAptStartTime /> hat sich geändert</#IsSubject>
<#IsBody>
Dieser Termin <#HasSentBy>(sent by <#sentBy/>)</#HasSentBy>, ursprünglich geplant am <#OldAptStartDate /><#IsNotOldAllDay> um <#OldAptStartTime /></#IsNotOldAllDay><#HasOldLocation> (<#OldAptLocation />)</#HasOldLocation>, ist nun verschoben auf den <#NewAptStartDate /><#IsNotNewAllDay> um <#NewAptStartTime /></#IsNotNewAllDay><#HasNewLocation> (<#NewAptLocation />)</#HasNewLocation>.
Bitte treffen Sie eine Entscheidung über diese Änderung.
</#IsBody>

View File

@ -1,79 +0,0 @@
OldAptStartDate: WOString {
value = oldStartDate;
dateformat = "%d/%m/%y";
escapeHTML = NO;
}
OldAptStartTime: WOString {
value = oldStartDate;
dateformat = "%H:%M";
escapeHTML = NO;
}
IsNotOldAllDay: WOConditional {
condition = previousApt.isAllDay;
negate = YES;
}
NewAptStartDate: WOString {
value = newStartDate;
dateformat = "%d/%m/%y";
escapeHTML = NO;
}
NewAptStartTime: WOString {
value = newStartDate;
dateformat = "%H:%M";
escapeHTML = NO;
}
IsNotNewAllDay: WOConditional {
condition = apt.isAllDay;
negate = YES;
}
Organizer: WOString {
value = organizerName;
escapeHTML = NO;
}
OldAptLocation: WOString {
value = previousApt.location;
escapeHTML = NO;
}
NewAptLocation: WOString {
value = apt.location;
escapeHTML = NO;
}
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
Summary: WOString {
value = summary;
escapeHTML = NO;
}
HasNewLocation: WOConditional {
condition = hasNewLocation;
}
HasOldLocation: WOConditional {
condition = hasOldLocation;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,2 +0,0 @@
<#IsSubject>Találkozó törölve: <#summary/></#IsSubject>
<#IsBody><#organizer/> <#HasSentBy>(<#sentBy/> által elküldve) </#HasSentBy>törölte ezt a találkozót: <#summary/>.</#IsBody>

View File

@ -1,2 +0,0 @@
<#IsSubject>Válasz a meghívásra: <#summary/></#IsSubject>
<#IsBody><#attendee/><#HasSentBy> (<#sentBy/> által elküldve)</#HasSentBy> <#HasAccepted>elfogadta</#HasAccepted><#HasDeclined>visszautasította</#HasDeclined><#HasNotAcceptedNotDeclined>még meggondolja</#HasNotAcceptedNotDeclined> a meghívását.</#IsBody>

View File

@ -1,2 +0,0 @@
<#IsSubject>Meghívás találkozóra: <#summary/></#IsSubject>
<#IsBody><#organizer/> <#HasSentBy>(<#sentBy/> által elküldve) </#HasSentBy>meghívta önt erre a találkozóra: <#summary/>.</#IsBody>

View File

@ -1,5 +0,0 @@
<#IsSubject>A "<#Summary />" találkozó a(z) <#OldAptStartDate /> időpontban <#OldAptStartTime /> megváltozott</#IsSubject>
<#IsBody>
A találkozó<#HasSentBy> (<#sentBy/> által elküldve)</#HasSentBy>, amelyet korábban a(z) <#OldAptStartDate /> időpontra tervezetek<#IsNotOldAllDay> <#OldAptStartTime /></#IsNotOldAllDay><#HasOldLocation> (<#OldAptLocation />)</#HasOldLocation> most a <#NewAptStartDate /><#IsNotNewAllDay> <#NewAptStartTime /> időpontra lett ütemezve.</#IsNotNewAllDay><#HasNewLocation> (<#NewAptLocation />)</#HasNewLocation>.
Kérem döntsön az új időpontról.
</#IsBody>

View File

@ -23,29 +23,21 @@
#ifndef SOGOAPTMAILICALREPLY_H
#define SOGOAPTMAILICALREPLY_H
#import <NGObjWeb/SoComponent.h>
#import "SOGoAptMailNotification.h"
@class NSString;
@class NSCalendarDate;
@class iCalPerson;
@class iCalEntityObject;
/*
* NOTE: We inherit from SoComponent in order to get the correct
* resourceManager required for this product
*/
@interface SOGoAptMailICalReply : SoComponent
@interface SOGoAptMailICalReply : SOGoAptMailNotification
{
iCalEntityObject *apt;
iCalPerson *attendee;
NSString *homePageURL;
BOOL isSubject;
}
- (void) setApt: (iCalEntityObject *) newApt;
- (iCalEntityObject *) apt;
- (void) setAttendee: (iCalPerson *) newAttendee;
- (iCalPerson *) attendee;

View File

@ -1,6 +1,6 @@
/* SOGoAptMailICalReply - this file is part of SOGo
*
* Copyright (C) 2007-2009 Inverse inc.
* Copyright (C) 2010 Inverse inc.
*
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
*
@ -20,51 +20,18 @@
* Boston, MA 02111-1307, USA.
*/
#import <Foundation/NSCharacterSet.h>
#import <Foundation/NSCalendarDate.h>
#import <Foundation/NSTimeZone.h>
#import <NGObjWeb/WOActionResults.h>
#import <NGObjWeb/WOResponse.h>
#import <NGObjWeb/WOContext+SoObjects.h>
#import <NGExtensions/NSObject+Logs.h>
#import <NGCards/iCalEntityObject.h>
#import <NGCards/iCalPerson.h>
#import <SOGo/NSString+Utilities.h>
#import <SOGo/SOGoUser.h>
#import <SOGo/SOGoUserDefaults.h>
#import <SOGo/NSDictionary+Utilities.h>
#import <SOGo/NSObject+Utilities.h>
#import "iCalPerson+SOGo.h"
#import "SOGoAptMailICalReply.h"
@interface SOGoAptMailICalReply (PrivateAPI)
- (BOOL) isSubject;
@end
@implementation SOGoAptMailICalReply
static NSCharacterSet *wsSet = nil;
+ (void) initialize
{
static BOOL didInit = NO;
if (!didInit)
{
didInit = YES;
wsSet = [[NSCharacterSet whitespaceAndNewlineCharacterSet] retain];
}
}
- (id) init
{
if ((self = [super init]))
{
apt = nil;
attendee = nil;
}
@ -73,21 +40,10 @@ static NSCharacterSet *wsSet = nil;
- (void) dealloc
{
[apt release];
[attendee release];
[super dealloc];
}
- (void) setApt: (iCalEntityObject *) newApt
{
ASSIGN (apt, newApt);
}
- (iCalEntityObject *) apt
{
return apt;
}
- (void) setAttendee: (iCalPerson *) newAttendee
{
ASSIGN (attendee, newAttendee);
@ -110,158 +66,76 @@ static NSCharacterSet *wsSet = nil;
return [attendee rfc822Email];
}
- (BOOL) hasSentBy
- (void) setupValues
{
return [attendee hasSentBy];
}
NSDictionary *sentByValues;
NSString *sentBy, *sentByText;
- (NSString *) sentBy
{
return [attendee sentBy];
}
[super setupValues];
- (BOOL) hasAccepted
{
NSString *partStat;
[values setObject: [self attendeeName] forKey: @"Attendee"];
partStat = [[attendee partStat] lowercaseString];
return [partStat isEqualToString: @"accepted"];
}
- (BOOL) hasDeclined
{
NSString *partStat;
partStat = [[attendee partStat] lowercaseString];
return [partStat isEqualToString: @"declined"];
}
- (BOOL) hasNotAcceptedNotDeclined
{
return !([self hasAccepted] || [self hasDeclined]);
}
- (NSCalendarDate *) startDate
{
NSCalendarDate *date;
SOGoUser *user;
NSTimeZone *tz;
date = [apt startDate];
user = [[self context] activeUser];
tz = [[user userDefaults] timeZone];
[date setTimeZone: tz];
return date;
}
- (NSString *) summary
{
return [apt summary];
}
- (BOOL) isSubject
{
return isSubject;
sentBy = [attendee sentBy];
if ([sentBy length])
{
sentByValues = [NSDictionary dictionaryWithObject: sentBy
forKey: @"SentBy"];
sentByText
= [sentByValues keysWithFormat: [self
labelForKey: @"(sent by %{SentBy})"
inContext: context]];
}
else
sentByText = @"";
[values setObject: sentByText forKey: @"SentByText"];
}
/* Generate Response */
- (NSString *) getSubject
{
NSString *subject;
NSString *subjectFormat;
isSubject = YES;
subject = [[[self generateResponse] contentAsString]
stringByTrimmingCharactersInSet: wsSet];
if (!subject)
{
[self errorWithFormat:@"Failed to properly generate subject! Please check "
@"template for component '%@'!",
[self name]];
subject = @"ERROR: missing subject!";
}
if (!values)
[self setupValues];
return [subject asQPSubjectString: @"utf-8"];
subjectFormat = [self labelForKey: @"Reply to invitation: \"%{Summary}\""
inContext: context];
return [values keysWithFormat: subjectFormat];
}
- (NSString *) getBody
{
NSString *body;
NSString *bodyFormat;
NSString *partStat, *delegate;
isSubject = NO;
if (!values)
[self setupValues];
body = [[self generateResponse] contentAsString];
partStat = [[attendee partStat] lowercaseString];
if ([partStat isEqualToString: @"accepted"])
bodyFormat = @"%{Attendee} %{SentByText}has accepted your event invitation.";
else if ([partStat isEqualToString: @"declined"])
bodyFormat = @"%{Attendee} %{SentByText}has declined your event invitation.";
else if ([partStat isEqualToString: @"delegated"])
{
bodyFormat = @"%{Attendee} %{SentByText}has delegated the invitation"
@" to %{Delegate}.";
delegate = [attendee delegatedTo];
if ([delegate length] > 7)
{
delegate = [delegate substringFromIndex: 7];
if ([delegate characterAtIndex: 0] == '"' && [delegate hasSuffix: @"\""])
delegate = [delegate substringWithRange: NSMakeRange(1, [delegate length]-2)];
[values setObject: delegate forKey: @"Delegate"];
}
}
else
bodyFormat = @"%{Attendee} %{SentByText}has not yet decided upon your event invitation.";
return [body stringByTrimmingCharactersInSet: wsSet];
return [values keysWithFormat: [self labelForKey: bodyFormat inContext: context]];
}
@end
@interface SOGoAptMailEnglishICalReply : SOGoAptMailICalReply
@end
@implementation SOGoAptMailEnglishICalReply
@end
@interface SOGoAptMailBrazilianPortugueseICalReply : SOGoAptMailICalReply
@end
@implementation SOGoAptMailBrazilianPortugueseICalReply
@end
@interface SOGoAptMailCzechICalReply : SOGoAptMailICalReply
@end
@implementation SOGoAptMailCzechICalReply
@end
@interface SOGoAptMailFrenchICalReply : SOGoAptMailICalReply
@end
@implementation SOGoAptMailFrenchICalReply
@end
@interface SOGoAptMailGermanICalReply : SOGoAptMailICalReply
@end
@implementation SOGoAptMailGermanICalReply
@end
@interface SOGoAptMailHungarianICalReply : SOGoAptMailICalReply
@end
@implementation SOGoAptMailHungarianICalReply
@end
@interface SOGoAptMailItalianICalReply : SOGoAptMailICalReply
@end
@implementation SOGoAptMailItalianICalReply
@end
@interface SOGoAptMailRussianICalReply : SOGoAptMailICalReply
@end
@implementation SOGoAptMailRussianICalReply
@end
@interface SOGoAptMailSpanishICalReply : SOGoAptMailICalReply
@end
@implementation SOGoAptMailSpanishICalReply
@end
@interface SOGoAptMailSwedishICalReply : SOGoAptMailICalReply
@end
@implementation SOGoAptMailSwedishICalReply
@end
@interface SOGoAptMailWelshICalReply : SOGoAptMailICalReply
@end
@implementation SOGoAptMailWelshICalReply
@end

View File

@ -1,94 +1,62 @@
/*
Copyright (C) 2000-2005 SKYRIX Software AG
This file is part of OpenGroupware.org.
OGo is free software; you can redistribute it and/or modify it under
Copyright (C) 2010 Inverse
This file is part of SOGo
SOGo is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
OGo is distributed in the hope that it will be useful, but WITHOUT ANY
SOGo is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with OGo; see the file COPYING. If not, write to the
License along with SOGo; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#import <NGCards/iCalEvent.h>
#import <SOGo/NSDictionary+Utilities.h>
#import <SOGo/NSObject+Utilities.h>
#import "iCalPerson+SOGo.h"
#import "SOGoAptMailNotification.h"
@interface SOGoAptMailEnglishInvitation : SOGoAptMailNotification
@interface SOGoAptMailInvitation : SOGoAptMailNotification
@end
@implementation SOGoAptMailEnglishInvitation
@end
@implementation SOGoAptMailInvitation
@interface SOGoAptMailBrazilianPortugueseInvitation : SOGoAptMailNotification
@end
- (NSString *) getSubject
{
NSString *subjectFormat;
@implementation SOGoAptMailBrazilianPortugueseInvitation
@end
if (!values)
[self setupValues];
@interface SOGoAptMailCzechInvitation : SOGoAptMailNotification
@end
subjectFormat = [self labelForKey: @"Event Invitation: \"%{Summary}\""
inContext: context];
@implementation SOGoAptMailCzechInvitation
@end
return [values keysWithFormat: subjectFormat];
}
@interface SOGoAptMailDutchInvitation : SOGoAptMailNotification
@end
- (NSString *) getBody
{
NSString *bodyFormat;
@implementation SOGoAptMailDutchInvitation
@end
if (!values)
[self setupValues];
@interface SOGoAptMailFrenchInvitation : SOGoAptMailNotification
@end
bodyFormat = [self labelForKey: @"%{Organizer} %{SentByText}has invited you to %{Summary}."
inContext: context];
@implementation SOGoAptMailFrenchInvitation
@end
return [values keysWithFormat: bodyFormat];
}
@interface SOGoAptMailGermanInvitation : SOGoAptMailNotification
@end
@implementation SOGoAptMailGermanInvitation
@end
@interface SOGoAptMailHungarianInvitation : SOGoAptMailNotification
@end
@implementation SOGoAptMailHungarianInvitation
@end
@interface SOGoAptMailItalianInvitation : SOGoAptMailNotification
@end
@implementation SOGoAptMailItalianInvitation
@end
@interface SOGoAptMailRussianInvitation : SOGoAptMailNotification
@end
@implementation SOGoAptMailRussianInvitation
@end
@interface SOGoAptMailSpanishInvitation : SOGoAptMailNotification
@end
@implementation SOGoAptMailSpanishInvitation
@end
@interface SOGoAptMailSwedishInvitation : SOGoAptMailNotification
@end
@implementation SOGoAptMailSwedishInvitation
@end
@interface SOGoAptMailWelshInvitation : SOGoAptMailNotification
@end
@implementation SOGoAptMailWelshInvitation
@end

View File

@ -1,2 +0,0 @@
<#IsSubject>Evento cancellato : " <#summary/> "</#IsSubject>
<#IsBody><#organizer/> <#HasSentBy>(sent by <#sentBy/>) </#HasSentBy>ha cancellato questo elemento: " <#summary/> ".</#IsBody>

View File

@ -1,27 +0,0 @@
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
organizer: WOString {
value = organizerName;
escapeHTML = NO;
}
summary: WOString {
value = summary;
escapeHTML = NO;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,2 +0,0 @@
<#IsSubject>Re: Appuntemento : "<#summary/>"</#IsSubject>
<#IsBody><#attendee/><#HasSentBy> (sent by <#sentBy/>)</#HasSentBy> ha <#HasAccepted>accettato</#HasAccepted><#HasDeclined>declinato</#HasDeclined><#HasNotAcceptedNotDeclined>not yet decided upon</#HasNotAcceptedNotDeclined> l'invito al proprio evento.</#IsBody>

View File

@ -1,39 +0,0 @@
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
summary: WOString {
value = summary;
escapeHTML = NO;
}
attendee: WOString {
value = attendeeName;
escapeHTML = NO;
}
HasAccepted: WOConditional {
condition = hasAccepted;
}
HasDeclined: WOConditional {
condition = hasDeclined;
}
HasNotAcceptedNotDeclined: WOConditional {
condition = hasNotAcceptedNotDeclined;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,2 +0,0 @@
<#IsSubject>Invito evento: <#summary/></#IsSubject>
<#IsBody>Si è stati invitati da <#organizer/> <#HasSentBy>(sent by <#sentBy/>) </#HasSentBy>a <#summary/>.</#IsBody>

View File

@ -1,27 +0,0 @@
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
organizer: WOString {
value = organizerName;
escapeHTML = NO;
}
summary: WOString {
value = summary;
escapeHTML = NO;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,5 +0,0 @@
<#IsSubject>L'appuntamento "<#Summary />" fissato in data <#OldAptStartDate /> alle ore <#OldAptStartTime /> &egrave; stato modificato </#IsSubject>
<#IsBody>
Questo appuntamento<#HasSentBy> (sent by <#sentBy/>)</#HasSentBy>, fissato precedentemete in data <#OldAptStartDate /><#HasOldLocation> (<#OldAptLocation />)</#HasOldLocation><#IsNotOldAllDay> alle ore <#OldAptStartTime /></#IsNotOldAllDay> &egrave; ora programmato il <#NewAptStartDate /><#IsNotNewAllDay> alle ore <#NewAptStartTime/></#IsNotNewAllDay><#HasNewLocation> (<#NewAptLocation />)</#HasNewLocation>.
Per confermare o disdire.
</#IsBody>

View File

@ -1,79 +0,0 @@
OldAptStartDate: WOString {
value = oldStartDate;
dateformat = "%d/%m/%y";
escapeHTML = NO;
}
OldAptStartTime: WOString {
value = oldStartDate;
dateformat = "%H:%M";
escapeHTML = NO;
}
IsNotOldAllDay: WOConditional {
condition = previousApt.isAllDay;
negate = YES;
}
NewAptStartDate: WOString {
value = newStartDate;
dateformat = "%d/%m/%y";
escapeHTML = NO;
}
NewAptStartTime: WOString {
value = newStartDate;
dateformat = "%H:%M";
escapeHTML = NO;
}
IsNotNewAllDay: WOConditional {
condition = apt.isAllDay;
negate = YES;
}
Organizer: WOString {
value = organizerName;
escapeHTML = NO;
}
OldAptLocation: WOString {
value = previousApt.location;
escapeHTML = NO;
}
NewAptLocation: WOString {
value = apt.location;
escapeHTML = NO;
}
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
Summary: WOString {
value = summary;
escapeHTML = NO;
}
HasNewLocation: WOConditional {
condition = hasNewLocation;
}
HasOldLocation: WOConditional {
condition = hasOldLocation;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -25,8 +25,11 @@
#include <NGObjWeb/SoComponent.h>
@class NSString, NSTimeZone, NSCalendarDate;
@class iCalEntityObject;
@class NSCalendarDate;
@class NSMutableDictionary;
@class NSString;
@class NSTimeZone;
@class iCalEvent;
/*
* NOTE: We inherit from SoComponent in order to get the correct
@ -34,27 +37,30 @@
*/
@interface SOGoAptMailNotification : SoComponent
{
iCalEntityObject *apt;
iCalEntityObject *previousApt;
iCalEvent *apt;
iCalEvent *previousApt;
NSString *homePageURL;
NSTimeZone *viewTZ;
NSCalendarDate *oldStartDate;
NSCalendarDate *newStartDate;
BOOL isSubject;
NSString *organizerName;
NSMutableDictionary *values;
}
- (iCalEntityObject *) apt;
- (void) setApt: (iCalEntityObject *) theApt;
- (void) setupValues;
- (iCalEntityObject *) previousApt;
- (void) setPreviousApt: (iCalEntityObject *) theApt;
- (iCalEvent *) apt;
- (void) setApt: (iCalEvent *) theApt;
- (iCalEvent *) previousApt;
- (void) setPreviousApt: (iCalEvent *) theApt;
- (void) setOrganizerName: (NSString *) theString;
- (NSString *) organizerName;
- (BOOL) hasSentBy;
- (NSString *) sentBy;
- (NSCalendarDate *) oldStartDate;
- (NSCalendarDate *) newStartDate;
- (NSString *) getSubject;
- (NSString *) getBody;

View File

@ -27,33 +27,24 @@
#import <NGObjWeb/WOActionResults.h>
#import <NGObjWeb/WOResponse.h>
#import <NGExtensions/NSObject+Logs.h>
#import <NGCards/iCalEntityObject.h>
#import <NGCards/iCalEvent.h>
#import <NGCards/iCalPerson.h>
#import <SoObjects/SOGo/NSString+Utilities.h>
#import <SOGo/NSDictionary+Utilities.h>
#import <SOGo/NSObject+Utilities.h>
#import <SOGo/NSString+Utilities.h>
#import "iCalPerson+SOGo.h"
#import "SOGoAptMailNotification.h"
@interface SOGoAptMailNotification (PrivateAPI)
- (BOOL) isSubject;
- (void) setIsSubject: (BOOL) newIsSubject;
@end
@implementation SOGoAptMailNotification
static NSCharacterSet *wsSet = nil;
static NSTimeZone *UTC = nil;
+ (void) initialize
{
if (!wsSet)
{
wsSet = [[NSCharacterSet whitespaceAndNewlineCharacterSet] retain];
UTC = [[NSTimeZone timeZoneWithAbbreviation: @"UTC"] retain];
}
if (!UTC)
UTC = [[NSTimeZone timeZoneWithAbbreviation: @"UTC"] retain];
}
- (id) init
@ -61,6 +52,7 @@ static NSTimeZone *UTC = nil;
if ((self = [super init]))
{
apt = nil;
values = nil;
}
return self;
@ -68,6 +60,7 @@ static NSTimeZone *UTC = nil;
- (void) dealloc
{
[values release];
[apt release];
[previousApt release];
[organizerName release];
@ -77,24 +70,24 @@ static NSTimeZone *UTC = nil;
[super dealloc];
}
- (iCalEntityObject *) apt
- (iCalEvent *) apt
{
return apt;
}
- (void) setApt: (iCalEntityObject *) theApt
- (void) setApt: (iCalEvent *) theApt
{
ASSIGN(apt, theApt);
ASSIGN (apt, theApt);
}
- (iCalEntityObject *) previousApt
- (iCalEvent *) previousApt
{
return previousApt;
}
- (void) setPreviousApt: (iCalEntityObject *) theApt
- (void) setPreviousApt: (iCalEvent *) theApt
{
ASSIGN(previousApt, theApt);
ASSIGN (previousApt, theApt);
}
- (BOOL) hasNewLocation
@ -109,42 +102,32 @@ static NSTimeZone *UTC = nil;
- (NSTimeZone *) viewTZ
{
if (self->viewTZ) return self->viewTZ;
if (viewTZ) return viewTZ;
return UTC;
}
- (void) setViewTZ: (NSTimeZone *) _viewTZ
{
ASSIGN(self->viewTZ, _viewTZ);
ASSIGN (viewTZ, _viewTZ);
}
- (NSCalendarDate *) oldStartDate
{
if (!self->oldStartDate)
if (!oldStartDate)
{
ASSIGN(self->oldStartDate, [[self previousApt] startDate]);
[self->oldStartDate setTimeZone: [self viewTZ]];
ASSIGN (oldStartDate, [[self previousApt] startDate]);
[oldStartDate setTimeZone: [self viewTZ]];
}
return self->oldStartDate;
return oldStartDate;
}
- (NSCalendarDate *) newStartDate
{
if (!self->newStartDate)
if (!newStartDate)
{
ASSIGN(self->newStartDate, [[self apt] startDate]);
[self->newStartDate setTimeZone:[self viewTZ]];
ASSIGN (newStartDate, [[self apt] startDate]);
[newStartDate setTimeZone:[self viewTZ]];
}
return self->newStartDate;
}
- (BOOL) isSubject
{
return isSubject;
}
- (void) setIsSubject: (BOOL) newIsSubject
{
isSubject = newIsSubject;
return newStartDate;
}
- (NSString *) summary
@ -154,7 +137,7 @@ static NSTimeZone *UTC = nil;
- (void) setOrganizerName: (NSString *) theString
{
ASSIGN(organizerName, theString);
ASSIGN (organizerName, theString);
}
- (NSString *) organizerName
@ -162,47 +145,49 @@ static NSTimeZone *UTC = nil;
return organizerName;
}
- (BOOL) hasSentBy
{
return [[apt organizer] hasSentBy];
}
- (NSString *) sentBy
{
return [[apt organizer] sentBy];
}
/* Helpers */
/* Generate Response */
- (NSString *) getSubject
{
NSString *subject;
[self subclassResponsibility: _cmd];
[self setIsSubject: YES];
subject = [[[self generateResponse] contentAsString]
stringByTrimmingCharactersInSet: wsSet];
if (!subject)
{
[self errorWithFormat:@"Failed to properly generate subject! Please check "
@"template for component '%@'!",
[self name]];
subject = @"ERROR: missing subject!";
}
return [subject asQPSubjectString: @"utf-8"];
return nil;
}
- (NSString *) getBody
{
NSString *body;
[self subclassResponsibility: _cmd];
[self setIsSubject:NO];
return nil;
}
body = [[self generateResponse] contentAsString];
- (void) setupValues
{
NSDictionary *sentByValues;
NSString *sentBy, *sentByText;
return [body stringByTrimmingCharactersInSet: wsSet];
values = [NSMutableDictionary new];
[values setObject: [self summary] forKey: @"Summary"];
if (organizerName)
{
[values setObject: organizerName forKey: @"Organizer"];
sentBy = [[apt organizer] sentBy];
if ([sentBy length])
{
sentByValues = [NSDictionary dictionaryWithObject: sentBy
forKey: @"SentBy"];
sentByText
= [sentByValues keysWithFormat: [self
labelForKey: @"(sent by %{SentBy})"
inContext: context]];
}
else
sentByText = @"";
[values setObject: sentByText forKey: @"SentByText"];
}
}
@end

View File

@ -1,2 +0,0 @@
<#IsSubject>Событие отменено: <#summary/></#IsSubject>
<#IsBody><#organizer/> <#HasSentBy>(отправил <#sentBy/>) </#HasSentBy>отменил это событие: <#summary/>.</#IsBody>

View File

@ -1,27 +0,0 @@
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
organizer: WOString {
value = organizerName;
escapeHTML = NO;
}
summary: WOString {
value = summary;
escapeHTML = NO;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,2 +0,0 @@
<#IsSubject>Ответ на приглашение: <#summary/></#IsSubject>
<#IsBody><#attendee/><#HasSentBy> (послал <#sentBy/>)</#HasSentBy> <#HasAccepted>согласился</#HasAccepted><#HasDeclined>отказался</#HasDeclined><#HasNotAcceptedNotDeclined>не определился с желанием</#HasNotAcceptedNotDeclined> участвовать в запланированном мероприятии.</#IsBody>

View File

@ -1,39 +0,0 @@
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
summary: WOString {
value = summary;
escapeHTML = NO;
}
attendee: WOString {
value = attendeeName;
escapeHTML = NO;
}
HasAccepted: WOConditional {
condition = hasAccepted;
}
HasDeclined: WOConditional {
condition = hasDeclined;
}
HasNotAcceptedNotDeclined: WOConditional {
condition = hasNotAcceptedNotDeclined;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,2 +0,0 @@
<#IsSubject>Приглашение на мероприятие: <#summary/></#IsSubject>
<#IsBody><#organizer/> <#HasSentBy>(послал <#sentBy/>) </#HasSentBy>приглашает Вас на мероприятие <#summary/>.</#IsBody>

View File

@ -1,27 +0,0 @@
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
organizer: WOString {
value = organizerName;
escapeHTML = NO;
}
summary: WOString {
value = summary;
escapeHTML = NO;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,5 +0,0 @@
<#IsSubject>Изменено мероприятие "<#Summary />", запланированное на <#OldAptStartDate /> <#OldAptStartTime />.</#IsSubject>
<#IsBody>
Это мероприятие<#HasSentBy> (пригласил <#sentBy/>)</#HasSentBy>, ранее было запланировано на <#OldAptStartDate /><#IsNotOldAllDay> в <#OldAptStartTime /></#IsNotOldAllDay><#HasOldLocation> (<#OldAptLocation />)</#HasOldLocation> теперь запланировано на <#NewAptStartDate /><#IsNotNewAllDay> в <#NewAptStartTime /></#IsNotNewAllDay><#HasNewLocation> (<#NewAptLocation />)</#HasNewLocation>.
Пожалуйста примите решение об участии в мероприятии в новое время и/или в новом месте.
</#IsBody>

View File

@ -1,79 +0,0 @@
OldAptStartDate: WOString {
value = oldStartDate;
dateformat = "%d/%m/%y";
escapeHTML = NO;
}
OldAptStartTime: WOString {
value = oldStartDate;
dateformat = "%H:%M";
escapeHTML = NO;
}
IsNotOldAllDay: WOConditional {
condition = previousApt.isAllDay;
negate = YES;
}
NewAptStartDate: WOString {
value = newStartDate;
dateformat = "%d/%m/%y";
escapeHTML = NO;
}
NewAptStartTime: WOString {
value = newStartDate;
dateformat = "%H:%M";
escapeHTML = NO;
}
IsNotNewAllDay: WOConditional {
condition = apt.isAllDay;
negate = YES;
}
Organizer: WOString {
value = organizerName;
escapeHTML = NO;
}
OldAptLocation: WOString {
value = previousApt.location;
escapeHTML = NO;
}
NewAptLocation: WOString {
value = apt.location;
escapeHTML = NO;
}
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
Summary: WOString {
value = summary;
escapeHTML = NO;
}
HasNewLocation: WOConditional {
condition = hasNewLocation;
}
HasOldLocation: WOConditional {
condition = hasOldLocation;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,2 +0,0 @@
<#IsSubject>Evento cancelado: <#summary/></#IsSubject>
<#IsBody><#organizer/> <#HasSentBy>(sent by <#sentBy/>) </#HasSentBy>ha cancelado este evento: « <#summary/> ».</#IsBody>

View File

@ -1,27 +0,0 @@
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
organizer: WOString {
value = organizerName;
escapeHTML = NO;
}
summary: WOString {
value = summary;
escapeHTML = NO;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,2 +0,0 @@
<#IsSubject>Respuesta a la invitación al evento: <#summary/></#IsSubject>
<#IsBody><#attendee/><#HasSentBy> (sent by <#sentBy/>)</#HasSentBy> ha <#HasAccepted>aceptado</#HasAccepted><#HasDelined>rechazado</#HasDeclined><#HasNotAcceptedNotDeclined>not yet decided upon</#HasNotAcceptedNotDeclined> su invitación al evento.</#IsBody>

View File

@ -1,39 +0,0 @@
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
summary: WOString {
value = summary;
escapeHTML = NO;
}
attendee: WOString {
value = attendeeName;
escapeHTML = NO;
}
HasAccepted: WOConditional {
condition = hasAccepted;
}
HasDeclined: WOConditional {
condition = hasDeclined;
}
HasNotAcceptedNotDeclined: WOConditional {
condition = hasNotAcceptedNotDeclined;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,2 +0,0 @@
<#IsSubject>Invitación a evento: <#summary/></#IsSubject>
<#IsBody><#organizer/> <#HasSentBy>(sent by <#sentBy/>) </#HasSentBy>le ha invitado a <#summary/>.</#IsBody>

View File

@ -1,27 +0,0 @@
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
organizer: WOString {
value = organizerName;
escapeHTML = NO;
}
summary: WOString {
value = summary;
escapeHTML = NO;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,5 +0,0 @@
<#IsSubject>The appointment "<#Summary />" for the <#OldAptStartDate /> at <#OldAptStartTime /> has changed</#IsSubject>
<#IsBody>
This appointment<#HasSentBy> (sent by <#sentBy/>)</#HasSentBy>, previously set for <#OldAptStartDate /><#IsNotOldAllDay> at <#OldAptStartTime /></#IsNotOldAllDay><#HasOldLocation> (<#OldAptLocation />)</#HasOldLocation> is now scheduled for <#NewAptStartDate /><#IsNotNewAllDay> at <#NewAptStartTime /></#IsNotNewAllDay><#HasNewLocation> (<#NewAptLocation />)</#HasNewLocation>.
Please make a decision for these new settings.
</#IsBody>

View File

@ -1,79 +0,0 @@
OldAptStartDate: WOString {
value = oldStartDate;
dateformat = "%d/%m/%y";
escapeHTML = NO;
}
OldAptStartTime: WOString {
value = oldStartDate;
dateformat = "%H:%M";
escapeHTML = NO;
}
IsNotOldAllDay: WOConditional {
condition = previousApt.isAllDay;
negate = YES;
}
NewAptStartDate: WOString {
value = newStartDate;
dateformat = "%d/%m/%y";
escapeHTML = NO;
}
NewAptStartTime: WOString {
value = newStartDate;
dateformat = "%H:%M";
escapeHTML = NO;
}
IsNotNewAllDay: WOConditional {
condition = apt.isAllDay;
negate = YES;
}
Organizer: WOString {
value = organizerName;
escapeHTML = NO;
}
OldAptLocation: WOString {
value = previousApt.location;
escapeHTML = NO;
}
NewAptLocation: WOString {
value = apt.location;
escapeHTML = NO;
}
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
Summary: WOString {
value = summary;
escapeHTML = NO;
}
HasNewLocation: WOConditional {
condition = hasNewLocation;
}
HasOldLocation: WOConditional {
condition = hasOldLocation;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,2 +0,0 @@
<#IsSubject>Händelse inställd: <#summary/></#IsSubject>
<#IsBody><#organizer/> <#HasSentBy>(sent by <#sentBy/>) </#HasSentBy>har ställt in denna händelse: <#summary/>.</#IsBody>

View File

@ -1,27 +0,0 @@
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
organizer: WOString {
value = organizerName;
escapeHTML = NO;
}
summary: WOString {
value = summary;
escapeHTML = NO;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,2 +0,0 @@
<#IsSubject>Händelseinbjudan: <#summary/></#IsSubject>
<#IsBody><#organizer/> <#HasSentBy>(sänt genom <#sentBy/>) </#HasSentBy>har bjudit in dig till <#summary/>.</#IsBody>

View File

@ -1,27 +0,0 @@
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
organizer: WOString {
value = organizerName;
escapeHTML = NO;
}
summary: WOString {
value = summary;
escapeHTML = NO;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,5 +0,0 @@
<#IsSubject>Mötet "<#Summary />" den <#OldAptStartDate /> kl <#OldAptStartTime /> har ändrats</#IsSubject>
<#IsBody>
Mötet<#HasSentBy> (sänt genom <#sentBy/>)</#HasSentBy>, tidigare bokat den <#OldAptStartDate /><#IsNotOldAllDay> kl <#OldAptStartTime /></#IsNotOldAllDay><#HasOldLocation> (<#OldAptLocation />)</#HasOldLocation> är nu ändrat att hållas <#NewAptStartDate /><#IsNotNewAllDay> kl <#NewAptStartTime /></#IsNotNewAllDay><#HasNewLocation> (<#NewAptLocation />)</#HasNewLocation>.
Var vänlig och svara på denna ändring.
</#IsBody>

View File

@ -1,79 +0,0 @@
OldAptStartDate: WOString {
value = oldStartDate;
dateformat = "%d/%m/%y";
escapeHTML = NO;
}
OldAptStartTime: WOString {
value = oldStartDate;
dateformat = "%H:%M";
escapeHTML = NO;
}
IsNotOldAllDay: WOConditional {
condition = previousApt.isAllDay;
negate = YES;
}
NewAptStartDate: WOString {
value = newStartDate;
dateformat = "%d/%m/%y";
escapeHTML = NO;
}
NewAptStartTime: WOString {
value = newStartDate;
dateformat = "%H:%M";
escapeHTML = NO;
}
IsNotNewAllDay: WOConditional {
condition = apt.isAllDay;
negate = YES;
}
Organizer: WOString {
value = organizerName;
escapeHTML = NO;
}
OldAptLocation: WOString {
value = previousApt.location;
escapeHTML = NO;
}
NewAptLocation: WOString {
value = apt.location;
escapeHTML = NO;
}
IsSubject: WOConditional {
condition = isSubject;
}
IsBody: WOConditional {
condition = isSubject;
negate = YES;
}
Summary: WOString {
value = summary;
escapeHTML = NO;
}
HasNewLocation: WOConditional {
condition = hasNewLocation;
}
HasOldLocation: WOConditional {
condition = hasOldLocation;
}
HasSentBy: WOConditional {
condition = hasSentBy;
}
sentBy: WOString {
value = sentBy;
escapeHTML = NO;
}

View File

@ -1,97 +1,172 @@
/*
Copyright (C) 2000-2005 SKYRIX Software AG
Copyright (C) 2010 Inverse
This file is part of OpenGroupware.org.
This file is part of SOGo
OGo is free software; you can redistribute it and/or modify it under
SOGo is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
OGo is distributed in the hope that it will be useful, but WITHOUT ANY
SOGo is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with OGo; see the file COPYING. If not, write to the
License along with SOGo; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#include "SOGoAptMailNotification.h"
#import <NGObjWeb/WOContext+SoObjects.h>
#import <NGCards/iCalEvent.h>
#import <NGCards/iCalEventChanges.h>
#import <SOGo/NSDictionary+Utilities.h>
#import <SOGo/NSObject+Utilities.h>
#import <SOGo/SOGoDateFormatter.h>
#import <SOGo/SOGoUser.h>
#import "SOGoAptMailNotification.h"
@interface SOGoAptMailUpdate : SOGoAptMailNotification
{
NSMutableDictionary *values;
}
@interface SOGoAptMailEnglishUpdate : SOGoAptMailNotification
@end
@implementation SOGoAptMailEnglishUpdate
@end
@interface SOGoAptMailRussianUpdate : SOGoAptMailNotification
@end
@implementation SOGoAptMailRussianUpdate
@end
@interface SOGoAptMailBrazilianPortugueseUpdate : SOGoAptMailNotification
@end
@implementation SOGoAptMailBrazilianPortugueseUpdate
@end
@interface SOGoAptMailCzechUpdate : SOGoAptMailNotification
@end
@implementation SOGoAptMailCzechUpdate
@end
@interface SOGoAptMailDutchUpdate : SOGoAptMailNotification
@end
@implementation SOGoAptMailDutchUpdate
@end
@interface SOGoAptMailFrenchUpdate : SOGoAptMailNotification
@end
@implementation SOGoAptMailFrenchUpdate
@end
@interface SOGoAptMailGermanUpdate : SOGoAptMailNotification
@end
@implementation SOGoAptMailGermanUpdate
@end
@interface SOGoAptMailHungarianUpdate : SOGoAptMailNotification
@end
@implementation SOGoAptMailHungarianUpdate
@end
@interface SOGoAptMailItalianUpdate : SOGoAptMailNotification
@end
@implementation SOGoAptMailItalianUpdate
@end
@interface SOGoAptMailSpanishUpdate : SOGoAptMailNotification
@end
@implementation SOGoAptMailSpanishUpdate
@end
@interface SOGoAptMailSwedishUpdate : SOGoAptMailNotification
@end
@implementation SOGoAptMailSwedishUpdate
@end
@interface SOGoAptMailWelshUpdate : SOGoAptMailNotification
@end
@implementation SOGoAptMailWelshUpdate
@implementation SOGoAptMailUpdate
- (NSString *) valueForProperty: (NSString *) property
{
static NSDictionary *valueTypes = nil;
SOGoDateFormatter *dateFormatter;
NSString *valueType;
id value;
if (!valueTypes)
{
valueTypes = [NSDictionary dictionaryWithObjectsAndKeys:
@"date", @"startDate",
@"date", @"endDate",
@"date", @"due",
@"text", @"location",
@"text", @"summary",
@"text", @"comment",
nil];
[valueTypes retain];
}
valueType = [valueTypes objectForKey: property];
if (valueType)
{
value = [(iCalEvent *) apt propertyValue: property];
if ([valueType isEqualToString: @"date"])
{
dateFormatter = [[context activeUser]
dateFormatterInContext: context];
value = [dateFormatter formattedDateAndTime: value];
}
}
else
value = nil;
return value;
}
- (void) _setupBodyContent
{
NSArray *updatedProperties;
NSMutableString *bodyContent;
NSString *property, *label, *value;
int count, max;
updatedProperties = [[iCalEventChanges changesFromEvent: previousApt
toEvent: apt]
updatedProperties];
bodyContent = [NSMutableString new];
max = [updatedProperties count];
for (count = 0; count < max; count++)
{
property = [updatedProperties objectAtIndex: count];
value = [self valueForProperty: property];
/* Unhandled properties will return nil */
if (value)
{
label = [self labelForKey: [NSString stringWithFormat: @"%@_label",
property]
inContext: context];
[bodyContent appendFormat: @" %@ %@\n", label, value];
}
}
[values setObject: bodyContent forKey: @"_bodyContent"];
[bodyContent release];
}
- (void) _setupBodyValues
{
NSString *bodyText;
bodyText = [self labelForKey: @"The following parameters have changed"
@" in the \"%{Summary}\" meeting:"
inContext: context];
[values setObject: [values keysWithFormat: bodyText]
forKey: @"_bodyStart"];
[self _setupBodyContent];
[values setObject: [self labelForKey: @"Please accept"
@" or decline those changes."
inContext: context]
forKey: @"_bodyEnd"];
}
- (void) setupValues
{
NSCalendarDate *date;
SOGoDateFormatter *dateFormatter;
[super setupValues];
dateFormatter = [[context activeUser] dateFormatterInContext: context];
date = [self oldStartDate];
[values setObject: [dateFormatter shortFormattedDate: date]
forKey: @"OldStartDate"];
[values setObject: [dateFormatter formattedTime: date]
forKey: @"OldStartTime"];
date = [self newStartDate];
[values setObject: [dateFormatter shortFormattedDate: date]
forKey: @"StartDate"];
[values setObject: [dateFormatter formattedTime: date]
forKey: @"StartTime"];
[self _setupBodyValues];
}
- (NSString *) getSubject
{
NSString *subjectFormat;
if (!values)
[self setupValues];
subjectFormat = [self labelForKey: @"The appointment \"%{Summary}\" for the"
@" %{OldStartDate} at"
@" %{OldStartTime} has changed"
inContext: context];
return [values keysWithFormat: subjectFormat];
}
- (NSString *) getBody
{
if (!values)
[self setupValues];
return [values keysWithFormat:
@"%{_bodyStart}\n%{_bodyContent}\n%{_bodyEnd}\n"];
}
@end

View File

@ -1 +0,0 @@
<#IsSubject>Digwyddiad wedi'i ganslo: <#summary/></#IsSubject> <#IsBody><#organizer/> <#HasSentBy>(anfonwyd gan <#sentBy/>)</#HasSentBy> wedi canslo'r digwyddiad hwn: <#summary/>.</#IsBody>

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