diff options
Diffstat (limited to 'apps/dav')
28 files changed, 411 insertions, 12 deletions
diff --git a/apps/dav/composer/composer/autoload_classmap.php b/apps/dav/composer/composer/autoload_classmap.php index 6f02140df40..c620de3fe4a 100644 --- a/apps/dav/composer/composer/autoload_classmap.php +++ b/apps/dav/composer/composer/autoload_classmap.php @@ -209,6 +209,7 @@ return array( 'OCA\\DAV\\Events\\CalendarMovedToTrashEvent' => $baseDir . '/../lib/Events/CalendarMovedToTrashEvent.php', 'OCA\\DAV\\Events\\CalendarObjectCreatedEvent' => $baseDir . '/../lib/Events/CalendarObjectCreatedEvent.php', 'OCA\\DAV\\Events\\CalendarObjectDeletedEvent' => $baseDir . '/../lib/Events/CalendarObjectDeletedEvent.php', + 'OCA\\DAV\\Events\\CalendarObjectMovedEvent' => $baseDir . '/../lib/Events/CalendarObjectMovedEvent.php', 'OCA\\DAV\\Events\\CalendarObjectMovedToTrashEvent' => $baseDir . '/../lib/Events/CalendarObjectMovedToTrashEvent.php', 'OCA\\DAV\\Events\\CalendarObjectRestoredEvent' => $baseDir . '/../lib/Events/CalendarObjectRestoredEvent.php', 'OCA\\DAV\\Events\\CalendarObjectUpdatedEvent' => $baseDir . '/../lib/Events/CalendarObjectUpdatedEvent.php', diff --git a/apps/dav/composer/composer/autoload_static.php b/apps/dav/composer/composer/autoload_static.php index 296b8a497c9..21f94cf71ce 100644 --- a/apps/dav/composer/composer/autoload_static.php +++ b/apps/dav/composer/composer/autoload_static.php @@ -224,6 +224,7 @@ class ComposerStaticInitDAV 'OCA\\DAV\\Events\\CalendarMovedToTrashEvent' => __DIR__ . '/..' . '/../lib/Events/CalendarMovedToTrashEvent.php', 'OCA\\DAV\\Events\\CalendarObjectCreatedEvent' => __DIR__ . '/..' . '/../lib/Events/CalendarObjectCreatedEvent.php', 'OCA\\DAV\\Events\\CalendarObjectDeletedEvent' => __DIR__ . '/..' . '/../lib/Events/CalendarObjectDeletedEvent.php', + 'OCA\\DAV\\Events\\CalendarObjectMovedEvent' => __DIR__ . '/..' . '/../lib/Events/CalendarObjectMovedEvent.php', 'OCA\\DAV\\Events\\CalendarObjectMovedToTrashEvent' => __DIR__ . '/..' . '/../lib/Events/CalendarObjectMovedToTrashEvent.php', 'OCA\\DAV\\Events\\CalendarObjectRestoredEvent' => __DIR__ . '/..' . '/../lib/Events/CalendarObjectRestoredEvent.php', 'OCA\\DAV\\Events\\CalendarObjectUpdatedEvent' => __DIR__ . '/..' . '/../lib/Events/CalendarObjectUpdatedEvent.php', diff --git a/apps/dav/l10n/cs.js b/apps/dav/l10n/cs.js index 5dfc5bcd147..82d4323b315 100644 --- a/apps/dav/l10n/cs.js +++ b/apps/dav/l10n/cs.js @@ -32,6 +32,8 @@ OC.L10N.register( "You deleted event {event} from calendar {calendar}" : "Smazali jste událost {event} z kalendáře {calendar}", "{actor} updated event {event} in calendar {calendar}" : "{actor} aktualizoval(a) událost {event} v kalendáři {calendar}", "You updated event {event} in calendar {calendar}" : "Aktualizovali jste událost {event} v kalendáři {calendar}", + "{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} přesunul(a) událost {event} z kalendáře {sourceCalendar} do kalendáře {targetCalendar}", + "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "Přesunuli jste událost {event} z kalendáře {sourceCalendar} do kalendáře {targetCalendar}", "{actor} restored event {event} of calendar {calendar}" : "{actor} obnovil(a) událost {event} kalendáře {calendar}", "You restored event {event} of calendar {calendar}" : "Obnovili jste událost {event} kalendáře {calendar}", "Busy" : "Zaneprázdněn(a)", @@ -45,6 +47,8 @@ OC.L10N.register( "You solved todo {todo} in list {calendar}" : "Vyřešili jste úkol {todo} v seznamu {calendar}", "{actor} reopened todo {todo} in list {calendar}" : "{actor} znovu otevřel(a) úkol {todo} v seznamu {calendar}", "You reopened todo {todo} in list {calendar}" : "Znovu jste otevřeli úkol {todo} v seznamu {calendar}", + "{actor} moved todo {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} přesunul(a) úkol {todo} ze seznamu {sourceCalendar} do seznamu {targetCalendar}", + "You moved todo {todo} from list {sourceCalendar} to list {targetCalendar}" : "Přesunuli jste úkol {todo} ze seznamu {sourceCalendar} do seznamu {targetCalendar}", "Calendar, contacts and tasks" : "Kalendář, kontakty a úkoly", "A <strong>calendar</strong> was modified" : "<strong>Kalendář</strong> byl změněn", "A calendar <strong>event</strong> was modified" : "<strong>Událost</strong> v kalendáři byla změněna", diff --git a/apps/dav/l10n/cs.json b/apps/dav/l10n/cs.json index 12df93f770d..03e15cd07ba 100644 --- a/apps/dav/l10n/cs.json +++ b/apps/dav/l10n/cs.json @@ -30,6 +30,8 @@ "You deleted event {event} from calendar {calendar}" : "Smazali jste událost {event} z kalendáře {calendar}", "{actor} updated event {event} in calendar {calendar}" : "{actor} aktualizoval(a) událost {event} v kalendáři {calendar}", "You updated event {event} in calendar {calendar}" : "Aktualizovali jste událost {event} v kalendáři {calendar}", + "{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} přesunul(a) událost {event} z kalendáře {sourceCalendar} do kalendáře {targetCalendar}", + "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "Přesunuli jste událost {event} z kalendáře {sourceCalendar} do kalendáře {targetCalendar}", "{actor} restored event {event} of calendar {calendar}" : "{actor} obnovil(a) událost {event} kalendáře {calendar}", "You restored event {event} of calendar {calendar}" : "Obnovili jste událost {event} kalendáře {calendar}", "Busy" : "Zaneprázdněn(a)", @@ -43,6 +45,8 @@ "You solved todo {todo} in list {calendar}" : "Vyřešili jste úkol {todo} v seznamu {calendar}", "{actor} reopened todo {todo} in list {calendar}" : "{actor} znovu otevřel(a) úkol {todo} v seznamu {calendar}", "You reopened todo {todo} in list {calendar}" : "Znovu jste otevřeli úkol {todo} v seznamu {calendar}", + "{actor} moved todo {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} přesunul(a) úkol {todo} ze seznamu {sourceCalendar} do seznamu {targetCalendar}", + "You moved todo {todo} from list {sourceCalendar} to list {targetCalendar}" : "Přesunuli jste úkol {todo} ze seznamu {sourceCalendar} do seznamu {targetCalendar}", "Calendar, contacts and tasks" : "Kalendář, kontakty a úkoly", "A <strong>calendar</strong> was modified" : "<strong>Kalendář</strong> byl změněn", "A calendar <strong>event</strong> was modified" : "<strong>Událost</strong> v kalendáři byla změněna", diff --git a/apps/dav/l10n/de_DE.js b/apps/dav/l10n/de_DE.js index 3c230ad7d00..8768921169e 100644 --- a/apps/dav/l10n/de_DE.js +++ b/apps/dav/l10n/de_DE.js @@ -32,6 +32,8 @@ OC.L10N.register( "You deleted event {event} from calendar {calendar}" : "Sie haben den Termin {event} im Kalender {calendar} gelöscht", "{actor} updated event {event} in calendar {calendar}" : "{actor} hat den Termin {event} im Kalender {calendar} aktualisiert", "You updated event {event} in calendar {calendar}" : "Sie haben den Termin {event} im Kalender {calendar} aktualisiert", + "{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} hat das Ereignis {event} vom Kalender {sourceCalendar} in den Kalender {targetCalendar} verschoben", + "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "Sie haben das Ereignis {event} vom Kalender {sourceCalendar} in den Kalender {targetCalendar} verschoben", "{actor} restored event {event} of calendar {calendar}" : "{actor} hat den Termin {event} im Kalender {calendar} wiederhergestellt", "You restored event {event} of calendar {calendar}" : "Sie haben den Termin {event} im Kalender {calendar} wiederhergestellt", "Busy" : "Beschäftigt", @@ -45,6 +47,8 @@ OC.L10N.register( "You solved todo {todo} in list {calendar}" : "Sie haben die Aufgabe {todo} in der Liste {calendar} erledigt", "{actor} reopened todo {todo} in list {calendar}" : "{actor} hat die Aufgabe {todo} in der Liste {calendar} wiedereröffnet", "You reopened todo {todo} in list {calendar}" : "Sie haben die Aufgabe {todo} in der Liste {calendar} wiedereröffnet", + "{actor} moved todo {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} hat die Aufgabe {todo} von der Liste {sourceCalendar} in die Liste {targetCalendar} verschoben", + "You moved todo {todo} from list {sourceCalendar} to list {targetCalendar}" : "Sie haben die Aufgabe {todo} von der Liste {sourceCalendar} in die Liste {targetCalendar} verschoben", "Calendar, contacts and tasks" : "Kalender, Kontakte und Aufgaben", "A <strong>calendar</strong> was modified" : "Ein <strong>Kalender</strong> wurde bearbeitet", "A calendar <strong>event</strong> was modified" : "Ein Kalender-<strong>Termin</strong> wurde bearbeitet", diff --git a/apps/dav/l10n/de_DE.json b/apps/dav/l10n/de_DE.json index 9921f64e22b..e8273acefbc 100644 --- a/apps/dav/l10n/de_DE.json +++ b/apps/dav/l10n/de_DE.json @@ -30,6 +30,8 @@ "You deleted event {event} from calendar {calendar}" : "Sie haben den Termin {event} im Kalender {calendar} gelöscht", "{actor} updated event {event} in calendar {calendar}" : "{actor} hat den Termin {event} im Kalender {calendar} aktualisiert", "You updated event {event} in calendar {calendar}" : "Sie haben den Termin {event} im Kalender {calendar} aktualisiert", + "{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} hat das Ereignis {event} vom Kalender {sourceCalendar} in den Kalender {targetCalendar} verschoben", + "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "Sie haben das Ereignis {event} vom Kalender {sourceCalendar} in den Kalender {targetCalendar} verschoben", "{actor} restored event {event} of calendar {calendar}" : "{actor} hat den Termin {event} im Kalender {calendar} wiederhergestellt", "You restored event {event} of calendar {calendar}" : "Sie haben den Termin {event} im Kalender {calendar} wiederhergestellt", "Busy" : "Beschäftigt", @@ -43,6 +45,8 @@ "You solved todo {todo} in list {calendar}" : "Sie haben die Aufgabe {todo} in der Liste {calendar} erledigt", "{actor} reopened todo {todo} in list {calendar}" : "{actor} hat die Aufgabe {todo} in der Liste {calendar} wiedereröffnet", "You reopened todo {todo} in list {calendar}" : "Sie haben die Aufgabe {todo} in der Liste {calendar} wiedereröffnet", + "{actor} moved todo {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} hat die Aufgabe {todo} von der Liste {sourceCalendar} in die Liste {targetCalendar} verschoben", + "You moved todo {todo} from list {sourceCalendar} to list {targetCalendar}" : "Sie haben die Aufgabe {todo} von der Liste {sourceCalendar} in die Liste {targetCalendar} verschoben", "Calendar, contacts and tasks" : "Kalender, Kontakte und Aufgaben", "A <strong>calendar</strong> was modified" : "Ein <strong>Kalender</strong> wurde bearbeitet", "A calendar <strong>event</strong> was modified" : "Ein Kalender-<strong>Termin</strong> wurde bearbeitet", diff --git a/apps/dav/l10n/eu.js b/apps/dav/l10n/eu.js index d9e0da425a1..ef2288a3862 100644 --- a/apps/dav/l10n/eu.js +++ b/apps/dav/l10n/eu.js @@ -32,6 +32,8 @@ OC.L10N.register( "You deleted event {event} from calendar {calendar}" : "{event} gertaera ezabatu duzu {calendar} egutegitik ", "{actor} updated event {event} in calendar {calendar}" : "{actor}-(r)ek {event} gertaera eguneratu du {calendar} egutegian", "You updated event {event} in calendar {calendar}" : "{event} gertaera eguneratu duzu {calendar} egutegian ", + "{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor}-(e)k {event} gertaera {sourceCalendar} egutegitik {targetCalendar} egutegira mugitu duzu", + "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{event} gertaera {sourceCalendar} egutegitik {targetCalendar} egutegira mugitu duzu", "{actor} restored event {event} of calendar {calendar}" : "{actor}-(e)k berrezarri du {calendar} egutegiko {event} gertaera ", "You restored event {event} of calendar {calendar}" : "Berrezarri duzu {calendar} egutegiko {event} gertaera ", "Busy" : "Lanpetua", @@ -45,6 +47,8 @@ OC.L10N.register( "You solved todo {todo} in list {calendar}" : " {calendar} zerrendan {todo} zeregina bukatu duzu.", "{actor} reopened todo {todo} in list {calendar}" : "{actor} erabiltzaileak {calendar} zerrendan {todo} zeregina berrireki du.", "You reopened todo {todo} in list {calendar}" : "{calendar} egutegian {todo} zeregina berrireki duzu. ", + "{actor} moved todo {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor}-(e)k {todo} egitekoa {sourceCalendar} zerrendatik {targetCalendar} zerrendara mugitu du", + "You moved todo {todo} from list {sourceCalendar} to list {targetCalendar}" : "{todo} egitekoa {sourceCalendar} zerrendatik {targetCalendar} zerrendara mugitu duzu", "Calendar, contacts and tasks" : "Egutegia, kontaktuak eta atazak", "A <strong>calendar</strong> was modified" : "Egutegia aldatu da", "A calendar <strong>event</strong> was modified" : "Egutegiaren <strong>gertaera</strong> bat aldatu da", diff --git a/apps/dav/l10n/eu.json b/apps/dav/l10n/eu.json index bda903e0899..9aa5fe2a1b1 100644 --- a/apps/dav/l10n/eu.json +++ b/apps/dav/l10n/eu.json @@ -30,6 +30,8 @@ "You deleted event {event} from calendar {calendar}" : "{event} gertaera ezabatu duzu {calendar} egutegitik ", "{actor} updated event {event} in calendar {calendar}" : "{actor}-(r)ek {event} gertaera eguneratu du {calendar} egutegian", "You updated event {event} in calendar {calendar}" : "{event} gertaera eguneratu duzu {calendar} egutegian ", + "{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor}-(e)k {event} gertaera {sourceCalendar} egutegitik {targetCalendar} egutegira mugitu duzu", + "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{event} gertaera {sourceCalendar} egutegitik {targetCalendar} egutegira mugitu duzu", "{actor} restored event {event} of calendar {calendar}" : "{actor}-(e)k berrezarri du {calendar} egutegiko {event} gertaera ", "You restored event {event} of calendar {calendar}" : "Berrezarri duzu {calendar} egutegiko {event} gertaera ", "Busy" : "Lanpetua", @@ -43,6 +45,8 @@ "You solved todo {todo} in list {calendar}" : " {calendar} zerrendan {todo} zeregina bukatu duzu.", "{actor} reopened todo {todo} in list {calendar}" : "{actor} erabiltzaileak {calendar} zerrendan {todo} zeregina berrireki du.", "You reopened todo {todo} in list {calendar}" : "{calendar} egutegian {todo} zeregina berrireki duzu. ", + "{actor} moved todo {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor}-(e)k {todo} egitekoa {sourceCalendar} zerrendatik {targetCalendar} zerrendara mugitu du", + "You moved todo {todo} from list {sourceCalendar} to list {targetCalendar}" : "{todo} egitekoa {sourceCalendar} zerrendatik {targetCalendar} zerrendara mugitu duzu", "Calendar, contacts and tasks" : "Egutegia, kontaktuak eta atazak", "A <strong>calendar</strong> was modified" : "Egutegia aldatu da", "A calendar <strong>event</strong> was modified" : "Egutegiaren <strong>gertaera</strong> bat aldatu da", diff --git a/apps/dav/l10n/ja.js b/apps/dav/l10n/ja.js index 07c1086f404..c9dc9b8fbd3 100644 --- a/apps/dav/l10n/ja.js +++ b/apps/dav/l10n/ja.js @@ -112,7 +112,19 @@ OC.L10N.register( "Could not write to final file, canceled by hook" : "最終ファイルへの書き込みができなかったため、フックによりキャンセルされた", "Could not write file contents" : "ファイルの内容を書き込むことができませんでした", "_%n byte_::_%n bytes_" : ["%n bytes"], + "Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "ファイルをコピー先へコピー中にエラーが発生しました (コピー済: %1$s, 想定ファイルサイズ: %2$s)", + "Expected filesize of %1$s but read (from Nextcloud client) and wrote (to Nextcloud storage) %2$s. Could either be a network problem on the sending side or a problem writing to the storage on the server side." : "Nextcloudクライアントからの想定ファイルサイズは、%1$s ですが、Nextcloudストレージへの書き込みファイルサイズは %2$s でした。送信側のネットワークの問題またはサーバー側のストレージへの書き込みに問題がある可能性があります。", + "Could not rename part file to final file, canceled by hook" : "最終ファイルの名前の変更が出来なかったため、フックによりキャンセルされました", + "Could not rename part file to final file" : "最終ファイルの名前の変更が出来ませんでした", + "Failed to check file size: %1$s" : "ファイルサイズの確認に失敗: %1$s", "Could not open file" : "ファイルを開くことができませんでした", + "Encryption not ready: %1$s" : "暗号化の準備が出来ていません: %1$s", + "Failed to open file: %1$s" : "ファイルを開くのに失敗: %1$s", + "Failed to unlink: %1$s" : "リンクの解除に失敗: %1$s", + "Invalid chunk name" : "無効なチャンク名", + "Could not rename part file assembled from chunks" : "チャンクから構成されている部分ファイルの名前の変更ができませんでした", + "Failed to write file contents: %1$s" : "ファイルの内容の書き込みに失敗: %1$s", + "File not found: %1$s" : "ファイルが見つかりません: %1$s", "System is in maintenance mode." : "システムはメンテナンスモードです。", "Upgrade needed" : "アップグレードが必要です", "Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "iOS / macOSでCalDAVおよびCardDAVを使用するには、%sにHTTPSを設定する必要があります。", @@ -124,6 +136,8 @@ OC.L10N.register( "Completed on %s" : "%sに完了", "Due on %s by %s" : "期限日%s が%sにより設定", "Due on %s" : "期限日:%s", + "Migrated calendar (%1$s)" : "カレンダーを移行しました (%1$s)", + "Calendars including events, details and attendees" : "カレンダーには、イベント、イベントの詳細及び出席者が含まれます", "Contacts and groups" : "連絡先とグループ", "WebDAV" : "WebDAV", "WebDAV endpoint" : "WebDAVエンドポイント", @@ -133,6 +147,7 @@ OC.L10N.register( "to" : "宛先", "Delete slot" : "スロットを削除", "No working hours set" : "勤務時間未設定", + "Add slot" : "スロットを追加", "Monday" : "月曜日", "Tuesday" : "火曜日", "Wednesday" : "水曜日", @@ -141,6 +156,9 @@ OC.L10N.register( "Saturday" : "土曜日", "Sunday" : "日曜日", "Save" : "保存", + "Failed to load availability" : "可用性の読み込みに失敗", + "Saved availability" : "可用性を保存しました", + "Failed to save availability" : "可用性を保存しました", "Calendar server" : "カレンダーサーバー", "Send invitations to attendees" : "参加者に招待状を送信する", "Automatically generate a birthday calendar" : "自動的に誕生日カレンダーを生成する", @@ -148,6 +166,8 @@ OC.L10N.register( "Hence they will not be available immediately after enabling but will show up after some time." : "したがって、有効にした直後は利用できませんが、しばらくしてから表示されます。", "Send notifications for events" : "イベントの通知を送信", "Notifications are sent via background jobs, so these must occur often enough." : "通知はバックグラウンドジョブを介して送信されるため、十分な頻度で発生します。", + "Send reminder notifications to calendar sharees as well" : "カレンダー共有にもリマインダー通知を送信する", + "Reminders are always sent to organizers and attendees." : "リマインダーを常に作成者と出席者に送信します。", "Enable notifications for events via push" : "イベントのプッシュ通知を有効にする", "Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}." : "{calendarappstoreopen}カレンダーアプリ{linkclose}、または{calendardocopen}を同期させるためにデスクトップとモバイルを接続する ↗{linkclose}もインストールしてください。", "Please make sure to properly set up {emailopen}the email server{linkclose}." : "{emailopen}メールサーバー{linkclose}を正しく設定してください。", @@ -155,6 +175,7 @@ OC.L10N.register( "Please contact the organizer directly." : "主催者に直接お問い合わせください。", "Are you accepting the invitation?" : "招待を受け入れていますか?", "Tentative" : "暫定的", + "Number of guests" : "ゲスト数", "Comment" : "コメント", "Your attendance was updated successfully." : "出席は正常に更新されました。" }, diff --git a/apps/dav/l10n/ja.json b/apps/dav/l10n/ja.json index 46748402cd9..010eff1a1cc 100644 --- a/apps/dav/l10n/ja.json +++ b/apps/dav/l10n/ja.json @@ -110,7 +110,19 @@ "Could not write to final file, canceled by hook" : "最終ファイルへの書き込みができなかったため、フックによりキャンセルされた", "Could not write file contents" : "ファイルの内容を書き込むことができませんでした", "_%n byte_::_%n bytes_" : ["%n bytes"], + "Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "ファイルをコピー先へコピー中にエラーが発生しました (コピー済: %1$s, 想定ファイルサイズ: %2$s)", + "Expected filesize of %1$s but read (from Nextcloud client) and wrote (to Nextcloud storage) %2$s. Could either be a network problem on the sending side or a problem writing to the storage on the server side." : "Nextcloudクライアントからの想定ファイルサイズは、%1$s ですが、Nextcloudストレージへの書き込みファイルサイズは %2$s でした。送信側のネットワークの問題またはサーバー側のストレージへの書き込みに問題がある可能性があります。", + "Could not rename part file to final file, canceled by hook" : "最終ファイルの名前の変更が出来なかったため、フックによりキャンセルされました", + "Could not rename part file to final file" : "最終ファイルの名前の変更が出来ませんでした", + "Failed to check file size: %1$s" : "ファイルサイズの確認に失敗: %1$s", "Could not open file" : "ファイルを開くことができませんでした", + "Encryption not ready: %1$s" : "暗号化の準備が出来ていません: %1$s", + "Failed to open file: %1$s" : "ファイルを開くのに失敗: %1$s", + "Failed to unlink: %1$s" : "リンクの解除に失敗: %1$s", + "Invalid chunk name" : "無効なチャンク名", + "Could not rename part file assembled from chunks" : "チャンクから構成されている部分ファイルの名前の変更ができませんでした", + "Failed to write file contents: %1$s" : "ファイルの内容の書き込みに失敗: %1$s", + "File not found: %1$s" : "ファイルが見つかりません: %1$s", "System is in maintenance mode." : "システムはメンテナンスモードです。", "Upgrade needed" : "アップグレードが必要です", "Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "iOS / macOSでCalDAVおよびCardDAVを使用するには、%sにHTTPSを設定する必要があります。", @@ -122,6 +134,8 @@ "Completed on %s" : "%sに完了", "Due on %s by %s" : "期限日%s が%sにより設定", "Due on %s" : "期限日:%s", + "Migrated calendar (%1$s)" : "カレンダーを移行しました (%1$s)", + "Calendars including events, details and attendees" : "カレンダーには、イベント、イベントの詳細及び出席者が含まれます", "Contacts and groups" : "連絡先とグループ", "WebDAV" : "WebDAV", "WebDAV endpoint" : "WebDAVエンドポイント", @@ -131,6 +145,7 @@ "to" : "宛先", "Delete slot" : "スロットを削除", "No working hours set" : "勤務時間未設定", + "Add slot" : "スロットを追加", "Monday" : "月曜日", "Tuesday" : "火曜日", "Wednesday" : "水曜日", @@ -139,6 +154,9 @@ "Saturday" : "土曜日", "Sunday" : "日曜日", "Save" : "保存", + "Failed to load availability" : "可用性の読み込みに失敗", + "Saved availability" : "可用性を保存しました", + "Failed to save availability" : "可用性を保存しました", "Calendar server" : "カレンダーサーバー", "Send invitations to attendees" : "参加者に招待状を送信する", "Automatically generate a birthday calendar" : "自動的に誕生日カレンダーを生成する", @@ -146,6 +164,8 @@ "Hence they will not be available immediately after enabling but will show up after some time." : "したがって、有効にした直後は利用できませんが、しばらくしてから表示されます。", "Send notifications for events" : "イベントの通知を送信", "Notifications are sent via background jobs, so these must occur often enough." : "通知はバックグラウンドジョブを介して送信されるため、十分な頻度で発生します。", + "Send reminder notifications to calendar sharees as well" : "カレンダー共有にもリマインダー通知を送信する", + "Reminders are always sent to organizers and attendees." : "リマインダーを常に作成者と出席者に送信します。", "Enable notifications for events via push" : "イベントのプッシュ通知を有効にする", "Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}." : "{calendarappstoreopen}カレンダーアプリ{linkclose}、または{calendardocopen}を同期させるためにデスクトップとモバイルを接続する ↗{linkclose}もインストールしてください。", "Please make sure to properly set up {emailopen}the email server{linkclose}." : "{emailopen}メールサーバー{linkclose}を正しく設定してください。", @@ -153,6 +173,7 @@ "Please contact the organizer directly." : "主催者に直接お問い合わせください。", "Are you accepting the invitation?" : "招待を受け入れていますか?", "Tentative" : "暫定的", + "Number of guests" : "ゲスト数", "Comment" : "コメント", "Your attendance was updated successfully." : "出席は正常に更新されました。" },"pluralForm" :"nplurals=1; plural=0;" diff --git a/apps/dav/l10n/pl.js b/apps/dav/l10n/pl.js index a66f5a394da..25088b26f37 100644 --- a/apps/dav/l10n/pl.js +++ b/apps/dav/l10n/pl.js @@ -32,6 +32,8 @@ OC.L10N.register( "You deleted event {event} from calendar {calendar}" : "Usunąłeś wydarzenie {event} z kalendarza {calendar}", "{actor} updated event {event} in calendar {calendar}" : "{actor} zaktualizował wydarzenie {event} z kalendarza {calendar}", "You updated event {event} in calendar {calendar}" : "Zaktualizowałeś wydarzenie {event} w kalendarzu {calendar}", + "{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} przeniósł wydarzenie {event} z kalendarza {sourceCalendar} do kalendarza {targetCalendar}", + "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "Przeniosłeś wydarzenie {event} z kalendarza {sourceCalendar} do kalendarza {targetCalendar}", "{actor} restored event {event} of calendar {calendar}" : "{actor} przywrócił wydarzenie {event} z kalendarza {calendar}", "You restored event {event} of calendar {calendar}" : "Przywróciłeś wydarzenie {event} z kalendarza {calendar}", "Busy" : "Czekaj", @@ -45,6 +47,8 @@ OC.L10N.register( "You solved todo {todo} in list {calendar}" : "Zakończyłeś zadanie {todo} na liście {calendar}", "{actor} reopened todo {todo} in list {calendar}" : "{actor} otworzył ponownie zadanie {todo} na liście {calendar}", "You reopened todo {todo} in list {calendar}" : "Otworzyłeś ponownie zadanie {todo} na liście {calendar}", + "{actor} moved todo {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} przeniósł zadanie {todo} z listy {sourceCalendar} na listę {targetCalendar}", + "You moved todo {todo} from list {sourceCalendar} to list {targetCalendar}" : "Przeniosłeś zadanie {todo} z listy {sourceCalendar} na listę {targetCalendar}", "Calendar, contacts and tasks" : "Kalendarz, kontakty i zadania", "A <strong>calendar</strong> was modified" : "<strong>Kalendarz</strong> został zmodyfikowany", "A calendar <strong>event</strong> was modified" : "<strong>Zdarzenie</strong> kalendarza zostało zmodyfikowane", diff --git a/apps/dav/l10n/pl.json b/apps/dav/l10n/pl.json index c6096000fad..474f29b596a 100644 --- a/apps/dav/l10n/pl.json +++ b/apps/dav/l10n/pl.json @@ -30,6 +30,8 @@ "You deleted event {event} from calendar {calendar}" : "Usunąłeś wydarzenie {event} z kalendarza {calendar}", "{actor} updated event {event} in calendar {calendar}" : "{actor} zaktualizował wydarzenie {event} z kalendarza {calendar}", "You updated event {event} in calendar {calendar}" : "Zaktualizowałeś wydarzenie {event} w kalendarzu {calendar}", + "{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} przeniósł wydarzenie {event} z kalendarza {sourceCalendar} do kalendarza {targetCalendar}", + "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "Przeniosłeś wydarzenie {event} z kalendarza {sourceCalendar} do kalendarza {targetCalendar}", "{actor} restored event {event} of calendar {calendar}" : "{actor} przywrócił wydarzenie {event} z kalendarza {calendar}", "You restored event {event} of calendar {calendar}" : "Przywróciłeś wydarzenie {event} z kalendarza {calendar}", "Busy" : "Czekaj", @@ -43,6 +45,8 @@ "You solved todo {todo} in list {calendar}" : "Zakończyłeś zadanie {todo} na liście {calendar}", "{actor} reopened todo {todo} in list {calendar}" : "{actor} otworzył ponownie zadanie {todo} na liście {calendar}", "You reopened todo {todo} in list {calendar}" : "Otworzyłeś ponownie zadanie {todo} na liście {calendar}", + "{actor} moved todo {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} przeniósł zadanie {todo} z listy {sourceCalendar} na listę {targetCalendar}", + "You moved todo {todo} from list {sourceCalendar} to list {targetCalendar}" : "Przeniosłeś zadanie {todo} z listy {sourceCalendar} na listę {targetCalendar}", "Calendar, contacts and tasks" : "Kalendarz, kontakty i zadania", "A <strong>calendar</strong> was modified" : "<strong>Kalendarz</strong> został zmodyfikowany", "A calendar <strong>event</strong> was modified" : "<strong>Zdarzenie</strong> kalendarza zostało zmodyfikowane", diff --git a/apps/dav/l10n/tr.js b/apps/dav/l10n/tr.js index bd11fb3dada..3d6f2891505 100644 --- a/apps/dav/l10n/tr.js +++ b/apps/dav/l10n/tr.js @@ -32,6 +32,8 @@ OC.L10N.register( "You deleted event {event} from calendar {calendar}" : "{calendar} takviminden {event} etkinliğini sildiniz", "{actor} updated event {event} in calendar {calendar}" : "{actor}, {calendar} takvimindeki {event} etkinliğini güncelledi", "You updated event {event} in calendar {calendar}" : "{calendar} takvimindeki {event} etkinliğini güncellediniz", + "{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor}, {event} etkinliğini {sourceCalendar} takviminden {targetCalendar} takvimine taşıdı", + "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{event} etkinliğini {sourceCalendar} takviminden {targetCalendar} takvimine taşıdınız", "{actor} restored event {event} of calendar {calendar}" : "{actor}, {calendar} takvimindeki {event} etkinliğini geri yükledi", "You restored event {event} of calendar {calendar}" : "{calendar} takvimindeki {event} etkinliğini geri yüklediniz", "Busy" : "Meşgul", @@ -45,6 +47,8 @@ OC.L10N.register( "You solved todo {todo} in list {calendar}" : "{calendar} takvimi listesindeki {todo} yapılacak işini tamamladınız", "{actor} reopened todo {todo} in list {calendar}" : "{actor}, {calendar} takvimi listesindeki {todo} yapılacak işini yeniden başlattı", "You reopened todo {todo} in list {calendar}" : "{calendar} takvimi listesindeki {todo} yapılacak işini yeniden başlattınız", + "{actor} moved todo {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor}, {todo} görevini {sourceCalendar} listesinden {targetCalendar} listesine taşıdı", + "You moved todo {todo} from list {sourceCalendar} to list {targetCalendar}" : "{todo} görevini {sourceCalendar} listesinden {targetCalendar} listesine taşıdınız", "Calendar, contacts and tasks" : "Takvim, kişiler ve görevler", "A <strong>calendar</strong> was modified" : "Bir <strong>takvim</strong> düzenlendi", "A calendar <strong>event</strong> was modified" : "Bir takvim <strong>etkinliği</strong> düzenlendi", diff --git a/apps/dav/l10n/tr.json b/apps/dav/l10n/tr.json index 5767d918f7a..7da1f637fc2 100644 --- a/apps/dav/l10n/tr.json +++ b/apps/dav/l10n/tr.json @@ -30,6 +30,8 @@ "You deleted event {event} from calendar {calendar}" : "{calendar} takviminden {event} etkinliğini sildiniz", "{actor} updated event {event} in calendar {calendar}" : "{actor}, {calendar} takvimindeki {event} etkinliğini güncelledi", "You updated event {event} in calendar {calendar}" : "{calendar} takvimindeki {event} etkinliğini güncellediniz", + "{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor}, {event} etkinliğini {sourceCalendar} takviminden {targetCalendar} takvimine taşıdı", + "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{event} etkinliğini {sourceCalendar} takviminden {targetCalendar} takvimine taşıdınız", "{actor} restored event {event} of calendar {calendar}" : "{actor}, {calendar} takvimindeki {event} etkinliğini geri yükledi", "You restored event {event} of calendar {calendar}" : "{calendar} takvimindeki {event} etkinliğini geri yüklediniz", "Busy" : "Meşgul", @@ -43,6 +45,8 @@ "You solved todo {todo} in list {calendar}" : "{calendar} takvimi listesindeki {todo} yapılacak işini tamamladınız", "{actor} reopened todo {todo} in list {calendar}" : "{actor}, {calendar} takvimi listesindeki {todo} yapılacak işini yeniden başlattı", "You reopened todo {todo} in list {calendar}" : "{calendar} takvimi listesindeki {todo} yapılacak işini yeniden başlattınız", + "{actor} moved todo {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor}, {todo} görevini {sourceCalendar} listesinden {targetCalendar} listesine taşıdı", + "You moved todo {todo} from list {sourceCalendar} to list {targetCalendar}" : "{todo} görevini {sourceCalendar} listesinden {targetCalendar} listesine taşıdınız", "Calendar, contacts and tasks" : "Takvim, kişiler ve görevler", "A <strong>calendar</strong> was modified" : "Bir <strong>takvim</strong> düzenlendi", "A calendar <strong>event</strong> was modified" : "Bir takvim <strong>etkinliği</strong> düzenlendi", diff --git a/apps/dav/l10n/zh_HK.js b/apps/dav/l10n/zh_HK.js index abc214c3cdf..e2b9e1e3aab 100644 --- a/apps/dav/l10n/zh_HK.js +++ b/apps/dav/l10n/zh_HK.js @@ -32,6 +32,8 @@ OC.L10N.register( "You deleted event {event} from calendar {calendar}" : "您從日曆 {calendar} 中刪除了活動 {event}", "{actor} updated event {event} in calendar {calendar}" : "{actor} 更新了日曆 {calendar} 中的活動 {event}", "You updated event {event} in calendar {calendar}" : "您更新了日曆 {calendar} 中的活動 {event}", + "{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} 將活動 {event} 從日曆 {sourceCalendar} 移到日曆 {targetCalendar}", + "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "您將活動 {event} 從日曆 {sourceCalendar} 移到日曆 {targetCalendar}", "{actor} restored event {event} of calendar {calendar}" : "{actor} 復原了日曆 {calendar} 的活動 {event}", "You restored event {event} of calendar {calendar}" : "您復原了日曆 {calendar} 的活動 {event}", "Busy" : "忙碌中", @@ -45,6 +47,8 @@ OC.L10N.register( "You solved todo {todo} in list {calendar}" : "您解决了任務列表 {calendar} 中的代辦事項 {todo}", "{actor} reopened todo {todo} in list {calendar}" : "{actor} 重新開啟了任務列表 {calendar} 中的代辦事項 {todo}", "You reopened todo {todo} in list {calendar}" : "你重新開啟了 {calendar} 清單中的代辦事項 {todo}", + "{actor} moved todo {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} 將待辦事項 {todo} 從清單 {sourceCalendar} 移到清單 {targetCalendar}", + "You moved todo {todo} from list {sourceCalendar} to list {targetCalendar}" : "您將待辦事項 {todo} 從清單 {sourceCalendar} 移到清單 {targetCalendar}", "Calendar, contacts and tasks" : "日曆、聯絡人和任務", "A <strong>calendar</strong> was modified" : "<strong>日曆</strong>被修改", "A calendar <strong>event</strong> was modified" : "日曆<strong>活動</strong>被修改", diff --git a/apps/dav/l10n/zh_HK.json b/apps/dav/l10n/zh_HK.json index 8ca935a748a..2ba437a798e 100644 --- a/apps/dav/l10n/zh_HK.json +++ b/apps/dav/l10n/zh_HK.json @@ -30,6 +30,8 @@ "You deleted event {event} from calendar {calendar}" : "您從日曆 {calendar} 中刪除了活動 {event}", "{actor} updated event {event} in calendar {calendar}" : "{actor} 更新了日曆 {calendar} 中的活動 {event}", "You updated event {event} in calendar {calendar}" : "您更新了日曆 {calendar} 中的活動 {event}", + "{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} 將活動 {event} 從日曆 {sourceCalendar} 移到日曆 {targetCalendar}", + "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "您將活動 {event} 從日曆 {sourceCalendar} 移到日曆 {targetCalendar}", "{actor} restored event {event} of calendar {calendar}" : "{actor} 復原了日曆 {calendar} 的活動 {event}", "You restored event {event} of calendar {calendar}" : "您復原了日曆 {calendar} 的活動 {event}", "Busy" : "忙碌中", @@ -43,6 +45,8 @@ "You solved todo {todo} in list {calendar}" : "您解决了任務列表 {calendar} 中的代辦事項 {todo}", "{actor} reopened todo {todo} in list {calendar}" : "{actor} 重新開啟了任務列表 {calendar} 中的代辦事項 {todo}", "You reopened todo {todo} in list {calendar}" : "你重新開啟了 {calendar} 清單中的代辦事項 {todo}", + "{actor} moved todo {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} 將待辦事項 {todo} 從清單 {sourceCalendar} 移到清單 {targetCalendar}", + "You moved todo {todo} from list {sourceCalendar} to list {targetCalendar}" : "您將待辦事項 {todo} 從清單 {sourceCalendar} 移到清單 {targetCalendar}", "Calendar, contacts and tasks" : "日曆、聯絡人和任務", "A <strong>calendar</strong> was modified" : "<strong>日曆</strong>被修改", "A calendar <strong>event</strong> was modified" : "日曆<strong>活動</strong>被修改", diff --git a/apps/dav/l10n/zh_TW.js b/apps/dav/l10n/zh_TW.js index d822b523b26..2b09f9342a4 100644 --- a/apps/dav/l10n/zh_TW.js +++ b/apps/dav/l10n/zh_TW.js @@ -32,6 +32,8 @@ OC.L10N.register( "You deleted event {event} from calendar {calendar}" : "您在日曆 {calendar} 中刪除了 {event} 活動", "{actor} updated event {event} in calendar {calendar}" : "{actor} 在日曆 {calendar} 中更新了 {event} 活動", "You updated event {event} in calendar {calendar}" : "您在日曆 {calendar} 中刪除了 {event} 活動", + "{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} 將事件 {event} 從行事曆 {sourceCalendar} 移動至行事曆 {targetCalendar}", + "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "您將事件 {event} 從行事曆 {sourceCalendar} 移動至行事曆 {targetCalendar}", "{actor} restored event {event} of calendar {calendar}" : "{actor} 復原了日曆 {calendar} 中的活動 {event}", "You restored event {event} of calendar {calendar}" : "您復原了日曆 {calendar} 中的活動 {event}", "Busy" : "忙碌", @@ -45,6 +47,8 @@ OC.L10N.register( "You solved todo {todo} in list {calendar}" : "您在列表 {calendar} 中解決了待辦事項 {todo}", "{actor} reopened todo {todo} in list {calendar}" : "{actor} 在列表 {calendar} 中重新開啟了待辦事項 {todo}", "You reopened todo {todo} in list {calendar}" : "您在列表 {calendar} 中重新開啟了待辦事項 {todo}", + "{actor} moved todo {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} 將待辦事項 {todo} 從清單 {sourceCalendar} 移動至清單 {targetCalendar}", + "You moved todo {todo} from list {sourceCalendar} to list {targetCalendar}" : "您將待辦事項 {todo} 從清單 {sourceCalendar} 移動至清單 {targetCalendar}", "Calendar, contacts and tasks" : "日曆、通訊錄與工作項目", "A <strong>calendar</strong> was modified" : "一個<strong>日曆</strong>被更動", "A calendar <strong>event</strong> was modified" : "一個日曆<strong>活動</strong>被更動", diff --git a/apps/dav/l10n/zh_TW.json b/apps/dav/l10n/zh_TW.json index a0786132472..2aeab43559d 100644 --- a/apps/dav/l10n/zh_TW.json +++ b/apps/dav/l10n/zh_TW.json @@ -30,6 +30,8 @@ "You deleted event {event} from calendar {calendar}" : "您在日曆 {calendar} 中刪除了 {event} 活動", "{actor} updated event {event} in calendar {calendar}" : "{actor} 在日曆 {calendar} 中更新了 {event} 活動", "You updated event {event} in calendar {calendar}" : "您在日曆 {calendar} 中刪除了 {event} 活動", + "{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} 將事件 {event} 從行事曆 {sourceCalendar} 移動至行事曆 {targetCalendar}", + "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "您將事件 {event} 從行事曆 {sourceCalendar} 移動至行事曆 {targetCalendar}", "{actor} restored event {event} of calendar {calendar}" : "{actor} 復原了日曆 {calendar} 中的活動 {event}", "You restored event {event} of calendar {calendar}" : "您復原了日曆 {calendar} 中的活動 {event}", "Busy" : "忙碌", @@ -43,6 +45,8 @@ "You solved todo {todo} in list {calendar}" : "您在列表 {calendar} 中解決了待辦事項 {todo}", "{actor} reopened todo {todo} in list {calendar}" : "{actor} 在列表 {calendar} 中重新開啟了待辦事項 {todo}", "You reopened todo {todo} in list {calendar}" : "您在列表 {calendar} 中重新開啟了待辦事項 {todo}", + "{actor} moved todo {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} 將待辦事項 {todo} 從清單 {sourceCalendar} 移動至清單 {targetCalendar}", + "You moved todo {todo} from list {sourceCalendar} to list {targetCalendar}" : "您將待辦事項 {todo} 從清單 {sourceCalendar} 移動至清單 {targetCalendar}", "Calendar, contacts and tasks" : "日曆、通訊錄與工作項目", "A <strong>calendar</strong> was modified" : "一個<strong>日曆</strong>被更動", "A calendar <strong>event</strong> was modified" : "一個日曆<strong>活動</strong>被更動", diff --git a/apps/dav/lib/AppInfo/Application.php b/apps/dav/lib/AppInfo/Application.php index e4eeed61dbe..10f0c52c79c 100644 --- a/apps/dav/lib/AppInfo/Application.php +++ b/apps/dav/lib/AppInfo/Application.php @@ -57,6 +57,7 @@ use OCA\DAV\Events\CalendarDeletedEvent; use OCA\DAV\Events\CalendarMovedToTrashEvent; use OCA\DAV\Events\CalendarObjectCreatedEvent; use OCA\DAV\Events\CalendarObjectDeletedEvent; +use OCA\DAV\Events\CalendarObjectMovedEvent; use OCA\DAV\Events\CalendarObjectMovedToTrashEvent; use OCA\DAV\Events\CalendarObjectRestoredEvent; use OCA\DAV\Events\CalendarObjectUpdatedEvent; @@ -154,6 +155,8 @@ class Application extends App implements IBootstrap { $context->registerEventListener(CalendarObjectUpdatedEvent::class, CalendarObjectReminderUpdaterListener::class); $context->registerEventListener(CalendarObjectDeletedEvent::class, ActivityUpdaterListener::class); $context->registerEventListener(CalendarObjectDeletedEvent::class, CalendarObjectReminderUpdaterListener::class); + $context->registerEventListener(CalendarObjectMovedEvent::class, ActivityUpdaterListener::class); + $context->registerEventListener(CalendarObjectMovedEvent::class, CalendarObjectReminderUpdaterListener::class); $context->registerEventListener(CalendarObjectMovedToTrashEvent::class, ActivityUpdaterListener::class); $context->registerEventListener(CalendarObjectMovedToTrashEvent::class, CalendarObjectReminderUpdaterListener::class); $context->registerEventListener(CalendarObjectRestoredEvent::class, ActivityUpdaterListener::class); diff --git a/apps/dav/lib/CalDAV/Activity/Backend.php b/apps/dav/lib/CalDAV/Activity/Backend.php index af2d790e10d..23256054b26 100644 --- a/apps/dav/lib/CalDAV/Activity/Backend.php +++ b/apps/dav/lib/CalDAV/Activity/Backend.php @@ -438,6 +438,11 @@ class Backend { $classification = $objectData['classification'] ?? CalDavBackend::CLASSIFICATION_PUBLIC; $object = $this->getObjectNameAndType($objectData); + + if (!$object) { + return; + } + $action = $action . '_' . $object['type']; if ($object['type'] === 'todo' && strpos($action, Event::SUBJECT_OBJECT_UPDATE) === 0 && $object['status'] === 'COMPLETED') { @@ -494,8 +499,103 @@ class Backend { } /** + * Creates activities when a calendar object was moved + */ + public function onMovedCalendarObject(array $sourceCalendarData, array $targetCalendarData, array $sourceShares, array $targetShares, array $objectData): void { + if (!isset($targetCalendarData['principaluri'])) { + return; + } + + $sourcePrincipal = explode('/', $sourceCalendarData['principaluri']); + $sourceOwner = array_pop($sourcePrincipal); + + $targetPrincipal = explode('/', $targetCalendarData['principaluri']); + $targetOwner = array_pop($targetPrincipal); + + if ($sourceOwner !== $targetOwner) { + $this->onTouchCalendarObject( + Event::SUBJECT_OBJECT_DELETE, + $sourceCalendarData, + $sourceShares, + $objectData + ); + $this->onTouchCalendarObject( + Event::SUBJECT_OBJECT_ADD, + $targetCalendarData, + $targetShares, + $objectData + ); + return; + } + + $currentUser = $this->userSession->getUser(); + if ($currentUser instanceof IUser) { + $currentUser = $currentUser->getUID(); + } else { + $currentUser = $targetOwner; + } + + $classification = $objectData['classification'] ?? CalDavBackend::CLASSIFICATION_PUBLIC; + $object = $this->getObjectNameAndType($objectData); + + if (!$object) { + return; + } + + $event = $this->activityManager->generateEvent(); + $event->setApp('dav') + ->setObject('calendar', (int) $targetCalendarData['id']) + ->setType($object['type'] === 'event' ? 'calendar_event' : 'calendar_todo') + ->setAuthor($currentUser); + + $users = $this->getUsersForShares(array_intersect($sourceShares, $targetShares)); + $users[] = $targetOwner; + + // Users for share can return the owner itself if the calendar is published + foreach (array_unique($users) as $user) { + if ($classification === CalDavBackend::CLASSIFICATION_PRIVATE && $user !== $targetOwner) { + // Private events are only shown to the owner + continue; + } + + $params = [ + 'actor' => $event->getAuthor(), + 'sourceCalendar' => [ + 'id' => (int) $sourceCalendarData['id'], + 'uri' => $sourceCalendarData['uri'], + 'name' => $sourceCalendarData['{DAV:}displayname'], + ], + 'targetCalendar' => [ + 'id' => (int) $targetCalendarData['id'], + 'uri' => $targetCalendarData['uri'], + 'name' => $targetCalendarData['{DAV:}displayname'], + ], + 'object' => [ + 'id' => $object['id'], + 'name' => $classification === CalDavBackend::CLASSIFICATION_CONFIDENTIAL && $user !== $targetOwner ? 'Busy' : $object['name'], + 'classified' => $classification === CalDavBackend::CLASSIFICATION_CONFIDENTIAL && $user !== $targetOwner, + ], + ]; + + if ($object['type'] === 'event' && $this->appManager->isEnabledForUser('calendar')) { + $params['object']['link']['object_uri'] = $objectData['uri']; + $params['object']['link']['calendar_uri'] = $targetCalendarData['uri']; + $params['object']['link']['owner'] = $targetOwner; + } + + $event->setAffectedUser($user) + ->setSubject( + $user === $currentUser ? Event::SUBJECT_OBJECT_MOVE . '_' . $object['type'] . '_self' : Event::SUBJECT_OBJECT_MOVE . '_' . $object['type'], + $params + ); + + $this->activityManager->publish($event); + } + } + + /** * @param array $objectData - * @return string[]|bool + * @return string[]|false */ protected function getObjectNameAndType(array $objectData) { $vObject = Reader::read($objectData['calendardata']); diff --git a/apps/dav/lib/CalDAV/Activity/Provider/Event.php b/apps/dav/lib/CalDAV/Activity/Provider/Event.php index 3ed591219af..9ae04aadbba 100644 --- a/apps/dav/lib/CalDAV/Activity/Provider/Event.php +++ b/apps/dav/lib/CalDAV/Activity/Provider/Event.php @@ -40,6 +40,7 @@ use OCP\L10N\IFactory; class Event extends Base { public const SUBJECT_OBJECT_ADD = 'object_add'; public const SUBJECT_OBJECT_UPDATE = 'object_update'; + public const SUBJECT_OBJECT_MOVE = 'object_move'; public const SUBJECT_OBJECT_MOVE_TO_TRASH = 'object_move_to_trash'; public const SUBJECT_OBJECT_RESTORE = 'object_restore'; public const SUBJECT_OBJECT_DELETE = 'object_delete'; @@ -145,6 +146,10 @@ class Event extends Base { $subject = $this->l->t('{actor} updated event {event} in calendar {calendar}'); } elseif ($event->getSubject() === self::SUBJECT_OBJECT_UPDATE . '_event_self') { $subject = $this->l->t('You updated event {event} in calendar {calendar}'); + } elseif ($event->getSubject() === self::SUBJECT_OBJECT_MOVE . '_event') { + $subject = $this->l->t('{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}'); + } elseif ($event->getSubject() === self::SUBJECT_OBJECT_MOVE . '_event_self') { + $subject = $this->l->t('You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}'); } elseif ($event->getSubject() === self::SUBJECT_OBJECT_MOVE_TO_TRASH . '_event') { $subject = $this->l->t('{actor} deleted event {event} from calendar {calendar}'); } elseif ($event->getSubject() === self::SUBJECT_OBJECT_MOVE_TO_TRASH . '_event_self') { @@ -198,6 +203,24 @@ class Event extends Base { } } + if (isset($parameters['sourceCalendar']) && isset($parameters['targetCalendar'])) { + switch ($subject) { + case self::SUBJECT_OBJECT_MOVE . '_event': + return [ + 'actor' => $this->generateUserParameter($parameters['actor']), + 'sourceCalendar' => $this->generateCalendarParameter($parameters['sourceCalendar'], $this->l), + 'targetCalendar' => $this->generateCalendarParameter($parameters['targetCalendar'], $this->l), + 'event' => $this->generateClassifiedObjectParameter($parameters['object']), + ]; + case self::SUBJECT_OBJECT_MOVE . '_event_self': + return [ + 'sourceCalendar' => $this->generateCalendarParameter($parameters['sourceCalendar'], $this->l), + 'targetCalendar' => $this->generateCalendarParameter($parameters['targetCalendar'], $this->l), + 'event' => $this->generateClassifiedObjectParameter($parameters['object']), + ]; + } + } + // Legacy - Do NOT Remove unless necessary // Removing this will break parsing of activities that were created on // Nextcloud 12, so we should keep this as long as it's acceptable. diff --git a/apps/dav/lib/CalDAV/Activity/Provider/Todo.php b/apps/dav/lib/CalDAV/Activity/Provider/Todo.php index a3ab81e38ae..4b2796aca53 100644 --- a/apps/dav/lib/CalDAV/Activity/Provider/Todo.php +++ b/apps/dav/lib/CalDAV/Activity/Provider/Todo.php @@ -69,6 +69,10 @@ class Todo extends Event { $subject = $this->l->t('{actor} reopened todo {todo} in list {calendar}'); } elseif ($event->getSubject() === self::SUBJECT_OBJECT_UPDATE . '_todo_needs_action_self') { $subject = $this->l->t('You reopened todo {todo} in list {calendar}'); + } elseif ($event->getSubject() === self::SUBJECT_OBJECT_MOVE . '_todo') { + $subject = $this->l->t('{actor} moved todo {todo} from list {sourceCalendar} to list {targetCalendar}'); + } elseif ($event->getSubject() === self::SUBJECT_OBJECT_MOVE . '_todo_self') { + $subject = $this->l->t('You moved todo {todo} from list {sourceCalendar} to list {targetCalendar}'); } else { throw new \InvalidArgumentException(); } @@ -114,6 +118,24 @@ class Todo extends Event { } } + if (isset($parameters['sourceCalendar']) && isset($parameters['targetCalendar'])) { + switch ($subject) { + case self::SUBJECT_OBJECT_MOVE . '_todo': + return [ + 'actor' => $this->generateUserParameter($parameters['actor']), + 'sourceCalendar' => $this->generateCalendarParameter($parameters['sourceCalendar'], $this->l), + 'targetCalendar' => $this->generateCalendarParameter($parameters['targetCalendar'], $this->l), + 'todo' => $this->generateObjectParameter($parameters['object']), + ]; + case self::SUBJECT_OBJECT_MOVE . '_todo_self': + return [ + 'sourceCalendar' => $this->generateCalendarParameter($parameters['sourceCalendar'], $this->l), + 'targetCalendar' => $this->generateCalendarParameter($parameters['targetCalendar'], $this->l), + 'todo' => $this->generateObjectParameter($parameters['object']), + ]; + } + } + // Legacy - Do NOT Remove unless necessary // Removing this will break parsing of activities that were created on // Nextcloud 12, so we should keep this as long as it's acceptable. diff --git a/apps/dav/lib/CalDAV/CalDavBackend.php b/apps/dav/lib/CalDAV/CalDavBackend.php index f445382ce8c..3ab047d5183 100644 --- a/apps/dav/lib/CalDAV/CalDavBackend.php +++ b/apps/dav/lib/CalDAV/CalDavBackend.php @@ -52,6 +52,7 @@ use OCA\DAV\Events\CalendarDeletedEvent; use OCA\DAV\Events\CalendarMovedToTrashEvent; use OCA\DAV\Events\CalendarObjectCreatedEvent; use OCA\DAV\Events\CalendarObjectDeletedEvent; +use OCA\DAV\Events\CalendarObjectMovedEvent; use OCA\DAV\Events\CalendarObjectMovedToTrashEvent; use OCA\DAV\Events\CalendarObjectRestoredEvent; use OCA\DAV\Events\CalendarObjectUpdatedEvent; @@ -1341,13 +1342,14 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription * @param int $sourceCalendarId * @param int $targetCalendarId * @param int $objectId - * @param string $principalUri + * @param string $oldPrincipalUri + * @param string $newPrincipalUri * @param int $calendarType * @return bool * @throws Exception */ - public function moveCalendarObject(int $sourceCalendarId, int $targetCalendarId, int $objectId, string $principalUri, int $calendarType = self::CALENDAR_TYPE_CALENDAR): bool { - $object = $this->getCalendarObjectById($principalUri, $objectId); + public function moveCalendarObject(int $sourceCalendarId, int $targetCalendarId, int $objectId, string $oldPrincipalUri, string $newPrincipalUri, int $calendarType = self::CALENDAR_TYPE_CALENDAR): bool { + $object = $this->getCalendarObjectById($oldPrincipalUri, $objectId); if (empty($object)) { return false; } @@ -1365,21 +1367,23 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription $this->addChange($sourceCalendarId, $object['uri'], 1, $calendarType); $this->addChange($targetCalendarId, $object['uri'], 3, $calendarType); - $object = $this->getCalendarObjectById($principalUri, $objectId); + $object = $this->getCalendarObjectById($newPrincipalUri, $objectId); // Calendar Object wasn't found - possibly because it was deleted in the meantime by a different client if (empty($object)) { return false; } - $calendarRow = $this->getCalendarById($targetCalendarId); + $targetCalendarRow = $this->getCalendarById($targetCalendarId); // the calendar this event is being moved to does not exist any longer - if (empty($calendarRow)) { + if (empty($targetCalendarRow)) { return false; } if ($calendarType === self::CALENDAR_TYPE_CALENDAR) { - $shares = $this->getShares($targetCalendarId); - $this->dispatcher->dispatchTyped(new CalendarObjectUpdatedEvent($targetCalendarId, $calendarRow, $shares, $object)); + $sourceShares = $this->getShares($sourceCalendarId); + $targetShares = $this->getShares($targetCalendarId); + $sourceCalendarRow = $this->getCalendarById($sourceCalendarId); + $this->dispatcher->dispatchTyped(new CalendarObjectMovedEvent($sourceCalendarId, $sourceCalendarRow, $targetCalendarId, $targetCalendarRow, $sourceShares, $targetShares, $object)); } return true; } diff --git a/apps/dav/lib/CalDAV/Calendar.php b/apps/dav/lib/CalDAV/Calendar.php index 79d2244b42c..806e99d8a05 100644 --- a/apps/dav/lib/CalDAV/Calendar.php +++ b/apps/dav/lib/CalDAV/Calendar.php @@ -450,7 +450,7 @@ class Calendar extends \Sabre\CalDAV\Calendar implements IRestorable, IShareable } try { - return $this->caldavBackend->moveCalendarObject($sourceNode->getCalendarId(), (int)$this->calendarInfo['id'], $sourceNode->getId(), $sourceNode->getPrincipalUri()); + return $this->caldavBackend->moveCalendarObject($sourceNode->getCalendarId(), (int)$this->calendarInfo['id'], $sourceNode->getId(), $sourceNode->getOwner(), $this->getOwner()); } catch (Exception $e) { $this->logger->error('Could not move calendar object: ' . $e->getMessage(), ['exception' => $e]); return false; diff --git a/apps/dav/lib/CalDAV/CalendarObject.php b/apps/dav/lib/CalDAV/CalendarObject.php index c927254fba3..32bcff900c2 100644 --- a/apps/dav/lib/CalDAV/CalendarObject.php +++ b/apps/dav/lib/CalDAV/CalendarObject.php @@ -162,4 +162,11 @@ class CalendarObject extends \Sabre\CalDAV\CalendarObject { public function getPrincipalUri(): string { return $this->calendarInfo['principaluri']; } + + public function getOwner(): ?string { + if (isset($this->calendarInfo['{http://owncloud.org/ns}owner-principal'])) { + return $this->calendarInfo['{http://owncloud.org/ns}owner-principal']; + } + return parent::getOwner(); + } } diff --git a/apps/dav/lib/DAV/Sharing/Backend.php b/apps/dav/lib/DAV/Sharing/Backend.php index 0f675ea4c15..544a38cfbe6 100644 --- a/apps/dav/lib/DAV/Sharing/Backend.php +++ b/apps/dav/lib/DAV/Sharing/Backend.php @@ -201,7 +201,7 @@ class Backend { while ($row = $result->fetch()) { $p = $this->principalBackend->getPrincipalByPath($row['principaluri']); $shares[] = [ - 'href' => "principal:${row['principaluri']}", + 'href' => "principal:{$row['principaluri']}", 'commonName' => isset($p['{DAV:}displayname']) ? $p['{DAV:}displayname'] : '', 'status' => 1, 'readOnly' => (int) $row['access'] === self::ACCESS_READ, diff --git a/apps/dav/lib/Events/CalendarObjectMovedEvent.php b/apps/dav/lib/Events/CalendarObjectMovedEvent.php new file mode 100644 index 00000000000..0143dad9a96 --- /dev/null +++ b/apps/dav/lib/Events/CalendarObjectMovedEvent.php @@ -0,0 +1,120 @@ +<?php + +declare(strict_types=1); + +/** + * @copyright Copyright (c) 2020, Georg Ehrke + * + * @author Georg Ehrke <oc.list@georgehrke.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ +namespace OCA\DAV\Events; + +use OCP\EventDispatcher\Event; + +/** + * Class CalendarObjectMovedEvent + * + * @package OCA\DAV\Events + * @since 25.0.0 + */ +class CalendarObjectMovedEvent extends Event { + private int $sourceCalendarId; + private array $sourceCalendarData; + private int $targetCalendarId; + private array $targetCalendarData; + private array $sourceShares; + private array $targetShares; + private array $objectData; + + /** + * @since 25.0.0 + */ + public function __construct(int $sourceCalendarId, + array $sourceCalendarData, + int $targetCalendarId, + array $targetCalendarData, + array $sourceShares, + array $targetShares, + array $objectData) { + parent::__construct(); + $this->sourceCalendarId = $sourceCalendarId; + $this->sourceCalendarData = $sourceCalendarData; + $this->targetCalendarId = $targetCalendarId; + $this->targetCalendarData = $targetCalendarData; + $this->sourceShares = $sourceShares; + $this->targetShares = $targetShares; + $this->objectData = $objectData; + } + + /** + * @return int + * @since 25.0.0 + */ + public function getSourceCalendarId(): int { + return $this->sourceCalendarId; + } + + /** + * @return array + * @since 25.0.0 + */ + public function getSourceCalendarData(): array { + return $this->sourceCalendarData; + } + + /** + * @return int + * @since 25.0.0 + */ + public function getTargetCalendarId(): int { + return $this->targetCalendarId; + } + + /** + * @return array + * @since 25.0.0 + */ + public function getTargetCalendarData(): array { + return $this->targetCalendarData; + } + + /** + * @return array + * @since 25.0.0 + */ + public function getSourceShares(): array { + return $this->sourceShares; + } + + /** + * @return array + * @since 25.0.0 + */ + public function getTargetShares(): array { + return $this->targetShares; + } + + /** + * @return array + * @since 25.0.0 + */ + public function getObjectData(): array { + return $this->objectData; + } +} diff --git a/apps/dav/lib/Listener/ActivityUpdaterListener.php b/apps/dav/lib/Listener/ActivityUpdaterListener.php index 371912ff035..ea3ec49c14d 100644 --- a/apps/dav/lib/Listener/ActivityUpdaterListener.php +++ b/apps/dav/lib/Listener/ActivityUpdaterListener.php @@ -32,6 +32,7 @@ use OCA\DAV\Events\CalendarDeletedEvent; use OCA\DAV\Events\CalendarMovedToTrashEvent; use OCA\DAV\Events\CalendarObjectCreatedEvent; use OCA\DAV\Events\CalendarObjectDeletedEvent; +use OCA\DAV\Events\CalendarObjectMovedEvent; use OCA\DAV\Events\CalendarObjectMovedToTrashEvent; use OCA\DAV\Events\CalendarObjectRestoredEvent; use OCA\DAV\Events\CalendarObjectUpdatedEvent; @@ -173,7 +174,26 @@ class ActivityUpdaterListener implements IEventListener { ); $this->logger->debug( - sprintf('Activity generated for deleted calendar object %d', $event->getCalendarId()) + sprintf('Activity generated for updated calendar object in calendar %d', $event->getCalendarId()) + ); + } catch (Throwable $e) { + // Any error with activities shouldn't abort the calendar deletion, so we just log it + $this->logger->error('Error generating activity for a deleted calendar object: ' . $e->getMessage(), [ + 'exception' => $e, + ]); + } + } elseif ($event instanceof CalendarObjectMovedEvent) { + try { + $this->activityBackend->onMovedCalendarObject( + $event->getSourceCalendarData(), + $event->getTargetCalendarData(), + $event->getSourceShares(), + $event->getTargetShares(), + $event->getObjectData() + ); + + $this->logger->debug( + sprintf('Activity generated for moved calendar object from calendar %d to calendar %d', $event->getSourceCalendarId(), $event->getTargetCalendarId()) ); } catch (Throwable $e) { // Any error with activities shouldn't abort the calendar deletion, so we just log it |