diff options
author | Côme Chilliet <91878298+come-nc@users.noreply.github.com> | 2022-12-05 12:03:39 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-12-05 12:03:39 +0100 |
commit | 30560d316584276a08c909f5198a839c1c170cc9 (patch) | |
tree | 154477dee76d6b7451671010aa2318c500975521 /apps/dav | |
parent | cb0450b5c4fbe590e7b35284a40d78d96a0251f6 (diff) | |
parent | 4196bf81e653c39d33d25c76652cc78dab8c5e1c (diff) | |
download | nextcloud-server-30560d316584276a08c909f5198a839c1c170cc9.tar.gz nextcloud-server-30560d316584276a08c909f5198a839c1c170cc9.zip |
Merge branch 'master' into tests/fix-phpunit-warnings
Signed-off-by: Côme Chilliet <91878298+come-nc@users.noreply.github.com>
Diffstat (limited to 'apps/dav')
30 files changed, 585 insertions, 93 deletions
diff --git a/apps/dav/composer/autoload.php b/apps/dav/composer/autoload.php index a3040af8caa..0103857e976 100644 --- a/apps/dav/composer/autoload.php +++ b/apps/dav/composer/autoload.php @@ -3,8 +3,21 @@ // autoload.php @generated by Composer if (PHP_VERSION_ID < 50600) { - echo 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL; - exit(1); + if (!headers_sent()) { + header('HTTP/1.1 500 Internal Server Error'); + } + $err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL; + if (!ini_get('display_errors')) { + if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { + fwrite(STDERR, $err); + } elseif (!headers_sent()) { + echo $err; + } + } + trigger_error( + $err, + E_USER_ERROR + ); } require_once __DIR__ . '/composer/autoload_real.php'; diff --git a/apps/dav/composer/composer/installed.php b/apps/dav/composer/composer/installed.php index 5f83b3f2bff..ee1748532a9 100644 --- a/apps/dav/composer/composer/installed.php +++ b/apps/dav/composer/composer/installed.php @@ -3,7 +3,7 @@ 'name' => '__root__', 'pretty_version' => 'dev-master', 'version' => 'dev-master', - 'reference' => '144514e49e25b7b123fd535902fee97fa39fb446', + 'reference' => 'e35bcc9381246a8ec3da96e78e9771ef6044a6d4', 'type' => 'library', 'install_path' => __DIR__ . '/../', 'aliases' => array(), @@ -13,7 +13,7 @@ '__root__' => array( 'pretty_version' => 'dev-master', 'version' => 'dev-master', - 'reference' => '144514e49e25b7b123fd535902fee97fa39fb446', + 'reference' => 'e35bcc9381246a8ec3da96e78e9771ef6044a6d4', 'type' => 'library', 'install_path' => __DIR__ . '/../', 'aliases' => array(), diff --git a/apps/dav/l10n/ca.js b/apps/dav/l10n/ca.js index a1d37e37ba3..7842a8ea390 100644 --- a/apps/dav/l10n/ca.js +++ b/apps/dav/l10n/ca.js @@ -2,6 +2,7 @@ OC.L10N.register( "dav", { "Calendar" : "Calendari", + "To-dos" : "Tasques pendents", "Personal" : "Personal", "{actor} created calendar {calendar}" : "{actor} ha creat el calendari {calendar}", "You created calendar {calendar}" : "Heu creat el calendari {calendar}", @@ -9,6 +10,8 @@ OC.L10N.register( "You deleted calendar {calendar}" : "Heu suprimit el calendari {calendar}", "{actor} updated calendar {calendar}" : "{actor} ha actualitzat el calendari {calendar}", "You updated calendar {calendar}" : "Heu actualitzat el calendari {calendar}", + "{actor} restored calendar {calendar}" : "{actor} ha restaurat el calendari {calendar}", + "You restored calendar {calendar}" : "Heu restaurat el calendari {calendar}", "You shared calendar {calendar} as public link" : "Heu compartit el calendari {calendar} amb un enllaç públic", "You removed public link for calendar {calendar}" : "Heu eliminat l'enllaç públic del calendari {calendar}", "{actor} shared calendar {calendar} with you" : "{actor} ha compartit el calendari {calendar} amb vós", @@ -29,9 +32,27 @@ OC.L10N.register( "You deleted event {event} from calendar {calendar}" : "Heu suprimit l'esdeveniment {event} del calendari {calendar}", "{actor} updated event {event} in calendar {calendar}" : "{actor} esdeveniment actualitzat {esdeveniment} al calendari {calendar}", "You updated event {event} in calendar {calendar}" : "Heu actualitzat l'esdeveniment {event} al calendari {calendar}", + "{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} ha mogut l'esdeveniment {event} del calendari {sourceCalendar} al calendari {targetCalendar}", + "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "Heu mogut l'esdeveniment {event} del calendari {sourceCalendar} al calendari {targetCalendar}", + "{actor} restored event {event} of calendar {calendar}" : "{actor} esdeveniment restaurat {event} del calendari {calendar}", + "You restored event {event} of calendar {calendar}" : "Heu restaurat l'esdeveniment {event} del calendari {calendar}", "Busy" : "Ocupat", + "{actor} created to-do {todo} in list {calendar}" : "{actor} ha creat la tasca pendent {todo} a la llista {calendar}", + "You created to-do {todo} in list {calendar}" : "Heu creat la tasca pendent {todo} a la llista {calendar}", + "{actor} deleted to-do {todo} from list {calendar}" : "{actor} ha suprimit tasques pendents {todo} de la llista {calendar}", + "You deleted to-do {todo} from list {calendar}" : "Heu suprimit la tasca pendent {todo} de la llista {calendar}", + "{actor} updated to-do {todo} in list {calendar}" : "{actor} ha actualitzat tasques pendents {todo} a la llista {calendar}", + "You updated to-do {todo} in list {calendar}" : "Heu actualitzat la tasca pendent {todo} a la llista {calendar}", + "{actor} solved to-do {todo} in list {calendar}" : "{actor} ha resolt la tasca pendent {todo} a la llista {calendar}", + "You solved to-do {todo} in list {calendar}" : "Heu resolt la tasca pendent {todo} a la llista {calendar}", + "{actor} reopened to-do {todo} in list {calendar}" : "{actor} va reobrir tasques pendents {todo} a la llista {calendar}", + "You reopened to-do {todo} in list {calendar}" : "Heu reobert les tasques pendents {todo} a la llista {calendar}", + "{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} ha mogut la tasca pendent {todo} de la llista {sourceCalendar} a la llista {targetCalendar}", + "You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "Heu mogut la tasca pendent {todo} de la llista {sourceCalendar} a la llista {targetCalendar}", + "Calendar, contacts and tasks" : "Calendari, contactes i tasques", "A <strong>calendar</strong> was modified" : "El <strong>calendari</strong> has estat modificat", "A calendar <strong>event</strong> was modified" : "S'ha modificat un <strong> esdeveniment </strong> del calendari", + "A calendar <strong>to-do</strong> was modified" : "S'ha modificat una <strong>tasca pendent</strong> del calendari", "Contact birthdays" : "Aniversaris dels contactes", "Death of %s" : "Mort de %s", "Calendar:" : "Calendari:", @@ -50,8 +71,11 @@ OC.L10N.register( "Description: %s" : "Descripció: %s", "Where: %s" : "On: %s", "%1$s via %2$s" : "%1$s mitjançant %2$s", + "Cancelled: %1$s" : "Cancel·lat: %1$s", "Invitation canceled" : "Invitació cancel·lada", + "Re: %1$s" : "Re: %1$s", "Invitation updated" : "Invitació actualitzada", + "Invitation: %1$s" : "Invitació: %1$s", "Invitation" : "Invitació", "Title:" : "Títol:", "Time:" : "Hora:", @@ -60,10 +84,52 @@ OC.L10N.register( "Organizer:" : "Organitzador:", "Attendees:" : "Assistents:", "Accept" : "Accepta", - "Decline" : "Rebutja", + "Decline" : "Declina", "More options …" : "Més opcions …", "More options at %s" : "Més opcions a %s", "Contacts" : "Contactes", + "{actor} created address book {addressbook}" : "{actor} ha creat la llibreta d'adreces {addressbook}", + "You created address book {addressbook}" : "Heu creat la llibreta d'adreces {addressbook}", + "{actor} deleted address book {addressbook}" : "{actor} llibreta d'adreces suprimida {addressbook}", + "You deleted address book {addressbook}" : "Heu suprimit la llibreta d'adreces {addressbook}", + "{actor} updated address book {addressbook}" : "{actor} llibreta d'adreces actualitzada {addressbook}", + "You updated address book {addressbook}" : "Heu actualitzat la llibreta d'adreces {addressbook}", + "{actor} shared address book {addressbook} with you" : "{actor} ha compartit la llibreta d'adreces {addressbook} amb vostè", + "You shared address book {addressbook} with {user}" : "Heu compartit la llibreta d'adreces {addressbook} amb {user}", + "{actor} shared address book {addressbook} with {user}" : "{actor} ha compartit la llibreta d'adreces {addressbook} amb {user}", + "{actor} unshared address book {addressbook} from you" : "{actor} ha deixat de compartir la llibreta d'adreces {addressbook} amb vostè", + "You unshared address book {addressbook} from {user}" : "Heu deixat de compartir la llibreta d'adreces {addressbook} de {user}", + "{actor} unshared address book {addressbook} from {user}" : "{actor} ha deixat de compartir la llibreta d'adreces {addressbook} de {user}", + "{actor} unshared address book {addressbook} from themselves" : "{actor} ha deixat de compartir la llibreta d'adreces {addressbook} d'ells mateixos", + "You shared address book {addressbook} with group {group}" : "Heu compartit la llibreta d'adreces {addressbook} amb el grup {group}", + "{actor} shared address book {addressbook} with group {group}" : "{actor} ha compartit la llibreta d'adreces {addressbook} amb el grup {group}", + "You unshared address book {addressbook} from group {group}" : "Heu deixat de compartir la llibreta d'adreces {addressbook} del grup {group}", + "{actor} unshared address book {addressbook} from group {group}" : "{actor} ha deixat de compartir la llibreta d'adreces {addressbook} del grup {group}", + "{actor} created contact {card} in address book {addressbook}" : "{actor} ha creat el contacte {card} a la llibreta d'adreces {addressbook}", + "You created contact {card} in address book {addressbook}" : "Heu creat el contacte {card} a la llibreta d'adreces {addressbook}", + "{actor} deleted contact {card} from address book {addressbook}" : "{actor} ha suprimit el contacte {card} de la llibreta d'adreces {addressbook}", + "You deleted contact {card} from address book {addressbook}" : "Heu suprimit el contacte {card} de la llibreta d'adreces {addressbook}", + "{actor} updated contact {card} in address book {addressbook}" : "{actor} ha actualitzat el contacte {card} a la llibreta d'adreces {addressbook}", + "You updated contact {card} in address book {addressbook}" : "Heu actualitzat el contacte {card} a la llibreta d'adreces {addressbook}", + "A <strong>contact</strong> or <strong>address book</strong> was modified" : "S'ha modificat un <strong>contacte</strong> o una <strong>llibreta d'adreces</strong>", + "File is not updatable: %1$s" : "El fitxer no es pot actualitzar: %1$s", + "Could not write to final file, canceled by hook" : "No s'ha pogut escriure al fitxer final, cancel·lat per ganxo", + "Could not write file contents" : "No s'ha pogut escriure el contingut del fitxer", + "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], + "Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Error en copiar el fitxer a la ubicació de destí (copiat: %1$s, mida esperada del fitxer: %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." : "S'esperava una mida de fitxer de %1$s però llegit (des del client Nextcloud) i escrit (a l'emmagatzematge de Nextcloud) %2$s. Pot ser un problema de xarxa al costat d'enviament o un problema d'escriptura a l'emmagatzematge del costat del servidor.", + "Could not rename part file to final file, canceled by hook" : "No s'ha pogut canviar el nom del fitxer de la part al fitxer final, cancel·lat per ganxo", + "Could not rename part file to final file" : "No s'ha pogut canviar el nom del fitxer de part al fitxer final", + "Failed to check file size: %1$s" : "No s'ha pogut comprovar la mida del fitxer: %1$s", + "Could not open file" : "No s’ha pogut obrir el fitxer", + "Encryption not ready: %1$s" : "El xifratge no està preparat: %1$s", + "Failed to open file: %1$s" : "No s'ha pogut obrir el fitxer: %1$s", + "Failed to unlink: %1$s" : "No s'ha pogut desenllaçar: %1$s", + "Invalid chunk name" : "Nom del fragment no vàlid", + "Could not rename part file assembled from chunks" : "No s'ha pogut canviar el nom del fitxer de peces muntat a partir de fragments", + "Failed to write file contents: %1$s" : "No s'ha pogut escriure el contingut del fitxer: %1$s", + "File not found: %1$s" : "No s'ha trobat el fitxer: %1$s", + "System is in maintenance mode." : "Sistema en mode de manteniment.", "Upgrade needed" : "Fa falta l'actualització", "Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "El vostre %s cal configurar-se per utilitzar HTTPS per poder fer servir CalDAV i CardDAV amb iOS/macOS.", "Configures a CalDAV account" : "Configura un compte CalDAV", @@ -74,11 +140,18 @@ OC.L10N.register( "Completed on %s" : "Completat a %s", "Due on %s by %s" : "Venciment a %s per %s", "Due on %s" : "Venç en %s", + "Migrated calendar (%1$s)" : "Calendari migrat (%1$s)", + "Calendars including events, details and attendees" : "Calendaris que inclouen esdeveniments, detalls i assistents", "Contacts and groups" : "Contactes i grups", "WebDAV" : "WebDAV", "WebDAV endpoint" : "Punt final de WebDAV", + "Availability" : "Disponibilitat", + "If you configure your working hours, other users will see when you are out of office when they book a meeting." : "Si configureu el vostre horari laboral, els altres usuaris veuran quan sou fora de l'oficina quan reserven una reunió.", + "Time zone:" : "Zona horària:", "to" : "a", - "Delete slot" : "Suprimeix unitat temporal", + "Delete slot" : "Suprimeix forat", + "No working hours set" : "Sense horari de treball establert", + "Add slot" : "Afegeix una forat", "Monday" : "Dilluns", "Tuesday" : "Dimarts", "Wednesday" : "Dimecres", @@ -86,14 +159,20 @@ OC.L10N.register( "Friday" : "Divendres", "Saturday" : "Dissabte", "Sunday" : "Diumenge", + "Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "Estableix automàticament l'estat de l'usuari a \"No molestar\" fora de la disponibilitat per silenciar totes les notificacions.", "Save" : "Desa", + "Failed to load availability" : "No s'ha pogut carregar la disponibilitat", + "Saved availability" : "Disponibilitat guardada", + "Failed to save availability" : "No s'ha pogut desar la disponibilitat", "Calendar server" : "Servidor de calendari", "Send invitations to attendees" : "Envia invitacions als assistents", "Automatically generate a birthday calendar" : "Genera automàticament un calendari d’aniversari", "Birthday calendars will be generated by a background job." : "Els calendaris d'aniversari es generaran per un procés en segon pla..", "Hence they will not be available immediately after enabling but will show up after some time." : "Per tant, no estaran disponibles immediatament després d'habilitar-los, però apareixeran d'aquí una estona.", "Send notifications for events" : "Envia notificacions per als esdeveniments", - "Notifications are sent via background jobs, so these must occur often enough." : "Les notificacions s'envien per tasques funcionant en segon pla, així que això ha de succeir bastant sovint.", + "Notifications are sent via background jobs, so these must occur often enough." : "Les notificacions s'envien per feines en segon pla, així que això ha de succeir bastant sovint.", + "Send reminder notifications to calendar sharees as well" : "També envieu notificacions de recordatoris als recursos compartits del calendari", + "Reminders are always sent to organizers and attendees." : "Sempre s'envien recordatoris als organitzadors i als assistents.", "Enable notifications for events via push" : "Habiliteu les notificacions per a esdeveniments mitjançant l’empenyiment", "Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}." : "Instal·leu també {calendarappstoreopen}l’aplicació de Calendari{linkclose} o {calendardocopen}connecteu el vostre escriptori i el mòbil per sincronitzar ↗{linkclose}.", "Please make sure to properly set up {emailopen}the email server{linkclose}." : "Si us plau, assegureu-vos de configurar correctament {emailopen}el servidor de correu electrònic{linkclose}.", @@ -101,6 +180,7 @@ OC.L10N.register( "Please contact the organizer directly." : "Si us plau contacteu amb l'organitzador directament.", "Are you accepting the invitation?" : "Accepteu la invitació?", "Tentative" : "Provisional", + "Number of guests" : "Nombre d'hostes", "Comment" : "Comentari", "Your attendance was updated successfully." : "La vostra assistència ha estat actualitzada correctament.", "Todos" : "Tasques", diff --git a/apps/dav/l10n/ca.json b/apps/dav/l10n/ca.json index 5d339d4de30..34c384e1648 100644 --- a/apps/dav/l10n/ca.json +++ b/apps/dav/l10n/ca.json @@ -1,5 +1,6 @@ { "translations": { "Calendar" : "Calendari", + "To-dos" : "Tasques pendents", "Personal" : "Personal", "{actor} created calendar {calendar}" : "{actor} ha creat el calendari {calendar}", "You created calendar {calendar}" : "Heu creat el calendari {calendar}", @@ -7,6 +8,8 @@ "You deleted calendar {calendar}" : "Heu suprimit el calendari {calendar}", "{actor} updated calendar {calendar}" : "{actor} ha actualitzat el calendari {calendar}", "You updated calendar {calendar}" : "Heu actualitzat el calendari {calendar}", + "{actor} restored calendar {calendar}" : "{actor} ha restaurat el calendari {calendar}", + "You restored calendar {calendar}" : "Heu restaurat el calendari {calendar}", "You shared calendar {calendar} as public link" : "Heu compartit el calendari {calendar} amb un enllaç públic", "You removed public link for calendar {calendar}" : "Heu eliminat l'enllaç públic del calendari {calendar}", "{actor} shared calendar {calendar} with you" : "{actor} ha compartit el calendari {calendar} amb vós", @@ -27,9 +30,27 @@ "You deleted event {event} from calendar {calendar}" : "Heu suprimit l'esdeveniment {event} del calendari {calendar}", "{actor} updated event {event} in calendar {calendar}" : "{actor} esdeveniment actualitzat {esdeveniment} al calendari {calendar}", "You updated event {event} in calendar {calendar}" : "Heu actualitzat l'esdeveniment {event} al calendari {calendar}", + "{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} ha mogut l'esdeveniment {event} del calendari {sourceCalendar} al calendari {targetCalendar}", + "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "Heu mogut l'esdeveniment {event} del calendari {sourceCalendar} al calendari {targetCalendar}", + "{actor} restored event {event} of calendar {calendar}" : "{actor} esdeveniment restaurat {event} del calendari {calendar}", + "You restored event {event} of calendar {calendar}" : "Heu restaurat l'esdeveniment {event} del calendari {calendar}", "Busy" : "Ocupat", + "{actor} created to-do {todo} in list {calendar}" : "{actor} ha creat la tasca pendent {todo} a la llista {calendar}", + "You created to-do {todo} in list {calendar}" : "Heu creat la tasca pendent {todo} a la llista {calendar}", + "{actor} deleted to-do {todo} from list {calendar}" : "{actor} ha suprimit tasques pendents {todo} de la llista {calendar}", + "You deleted to-do {todo} from list {calendar}" : "Heu suprimit la tasca pendent {todo} de la llista {calendar}", + "{actor} updated to-do {todo} in list {calendar}" : "{actor} ha actualitzat tasques pendents {todo} a la llista {calendar}", + "You updated to-do {todo} in list {calendar}" : "Heu actualitzat la tasca pendent {todo} a la llista {calendar}", + "{actor} solved to-do {todo} in list {calendar}" : "{actor} ha resolt la tasca pendent {todo} a la llista {calendar}", + "You solved to-do {todo} in list {calendar}" : "Heu resolt la tasca pendent {todo} a la llista {calendar}", + "{actor} reopened to-do {todo} in list {calendar}" : "{actor} va reobrir tasques pendents {todo} a la llista {calendar}", + "You reopened to-do {todo} in list {calendar}" : "Heu reobert les tasques pendents {todo} a la llista {calendar}", + "{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} ha mogut la tasca pendent {todo} de la llista {sourceCalendar} a la llista {targetCalendar}", + "You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "Heu mogut la tasca pendent {todo} de la llista {sourceCalendar} a la llista {targetCalendar}", + "Calendar, contacts and tasks" : "Calendari, contactes i tasques", "A <strong>calendar</strong> was modified" : "El <strong>calendari</strong> has estat modificat", "A calendar <strong>event</strong> was modified" : "S'ha modificat un <strong> esdeveniment </strong> del calendari", + "A calendar <strong>to-do</strong> was modified" : "S'ha modificat una <strong>tasca pendent</strong> del calendari", "Contact birthdays" : "Aniversaris dels contactes", "Death of %s" : "Mort de %s", "Calendar:" : "Calendari:", @@ -48,8 +69,11 @@ "Description: %s" : "Descripció: %s", "Where: %s" : "On: %s", "%1$s via %2$s" : "%1$s mitjançant %2$s", + "Cancelled: %1$s" : "Cancel·lat: %1$s", "Invitation canceled" : "Invitació cancel·lada", + "Re: %1$s" : "Re: %1$s", "Invitation updated" : "Invitació actualitzada", + "Invitation: %1$s" : "Invitació: %1$s", "Invitation" : "Invitació", "Title:" : "Títol:", "Time:" : "Hora:", @@ -58,10 +82,52 @@ "Organizer:" : "Organitzador:", "Attendees:" : "Assistents:", "Accept" : "Accepta", - "Decline" : "Rebutja", + "Decline" : "Declina", "More options …" : "Més opcions …", "More options at %s" : "Més opcions a %s", "Contacts" : "Contactes", + "{actor} created address book {addressbook}" : "{actor} ha creat la llibreta d'adreces {addressbook}", + "You created address book {addressbook}" : "Heu creat la llibreta d'adreces {addressbook}", + "{actor} deleted address book {addressbook}" : "{actor} llibreta d'adreces suprimida {addressbook}", + "You deleted address book {addressbook}" : "Heu suprimit la llibreta d'adreces {addressbook}", + "{actor} updated address book {addressbook}" : "{actor} llibreta d'adreces actualitzada {addressbook}", + "You updated address book {addressbook}" : "Heu actualitzat la llibreta d'adreces {addressbook}", + "{actor} shared address book {addressbook} with you" : "{actor} ha compartit la llibreta d'adreces {addressbook} amb vostè", + "You shared address book {addressbook} with {user}" : "Heu compartit la llibreta d'adreces {addressbook} amb {user}", + "{actor} shared address book {addressbook} with {user}" : "{actor} ha compartit la llibreta d'adreces {addressbook} amb {user}", + "{actor} unshared address book {addressbook} from you" : "{actor} ha deixat de compartir la llibreta d'adreces {addressbook} amb vostè", + "You unshared address book {addressbook} from {user}" : "Heu deixat de compartir la llibreta d'adreces {addressbook} de {user}", + "{actor} unshared address book {addressbook} from {user}" : "{actor} ha deixat de compartir la llibreta d'adreces {addressbook} de {user}", + "{actor} unshared address book {addressbook} from themselves" : "{actor} ha deixat de compartir la llibreta d'adreces {addressbook} d'ells mateixos", + "You shared address book {addressbook} with group {group}" : "Heu compartit la llibreta d'adreces {addressbook} amb el grup {group}", + "{actor} shared address book {addressbook} with group {group}" : "{actor} ha compartit la llibreta d'adreces {addressbook} amb el grup {group}", + "You unshared address book {addressbook} from group {group}" : "Heu deixat de compartir la llibreta d'adreces {addressbook} del grup {group}", + "{actor} unshared address book {addressbook} from group {group}" : "{actor} ha deixat de compartir la llibreta d'adreces {addressbook} del grup {group}", + "{actor} created contact {card} in address book {addressbook}" : "{actor} ha creat el contacte {card} a la llibreta d'adreces {addressbook}", + "You created contact {card} in address book {addressbook}" : "Heu creat el contacte {card} a la llibreta d'adreces {addressbook}", + "{actor} deleted contact {card} from address book {addressbook}" : "{actor} ha suprimit el contacte {card} de la llibreta d'adreces {addressbook}", + "You deleted contact {card} from address book {addressbook}" : "Heu suprimit el contacte {card} de la llibreta d'adreces {addressbook}", + "{actor} updated contact {card} in address book {addressbook}" : "{actor} ha actualitzat el contacte {card} a la llibreta d'adreces {addressbook}", + "You updated contact {card} in address book {addressbook}" : "Heu actualitzat el contacte {card} a la llibreta d'adreces {addressbook}", + "A <strong>contact</strong> or <strong>address book</strong> was modified" : "S'ha modificat un <strong>contacte</strong> o una <strong>llibreta d'adreces</strong>", + "File is not updatable: %1$s" : "El fitxer no es pot actualitzar: %1$s", + "Could not write to final file, canceled by hook" : "No s'ha pogut escriure al fitxer final, cancel·lat per ganxo", + "Could not write file contents" : "No s'ha pogut escriure el contingut del fitxer", + "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], + "Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Error en copiar el fitxer a la ubicació de destí (copiat: %1$s, mida esperada del fitxer: %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." : "S'esperava una mida de fitxer de %1$s però llegit (des del client Nextcloud) i escrit (a l'emmagatzematge de Nextcloud) %2$s. Pot ser un problema de xarxa al costat d'enviament o un problema d'escriptura a l'emmagatzematge del costat del servidor.", + "Could not rename part file to final file, canceled by hook" : "No s'ha pogut canviar el nom del fitxer de la part al fitxer final, cancel·lat per ganxo", + "Could not rename part file to final file" : "No s'ha pogut canviar el nom del fitxer de part al fitxer final", + "Failed to check file size: %1$s" : "No s'ha pogut comprovar la mida del fitxer: %1$s", + "Could not open file" : "No s’ha pogut obrir el fitxer", + "Encryption not ready: %1$s" : "El xifratge no està preparat: %1$s", + "Failed to open file: %1$s" : "No s'ha pogut obrir el fitxer: %1$s", + "Failed to unlink: %1$s" : "No s'ha pogut desenllaçar: %1$s", + "Invalid chunk name" : "Nom del fragment no vàlid", + "Could not rename part file assembled from chunks" : "No s'ha pogut canviar el nom del fitxer de peces muntat a partir de fragments", + "Failed to write file contents: %1$s" : "No s'ha pogut escriure el contingut del fitxer: %1$s", + "File not found: %1$s" : "No s'ha trobat el fitxer: %1$s", + "System is in maintenance mode." : "Sistema en mode de manteniment.", "Upgrade needed" : "Fa falta l'actualització", "Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "El vostre %s cal configurar-se per utilitzar HTTPS per poder fer servir CalDAV i CardDAV amb iOS/macOS.", "Configures a CalDAV account" : "Configura un compte CalDAV", @@ -72,11 +138,18 @@ "Completed on %s" : "Completat a %s", "Due on %s by %s" : "Venciment a %s per %s", "Due on %s" : "Venç en %s", + "Migrated calendar (%1$s)" : "Calendari migrat (%1$s)", + "Calendars including events, details and attendees" : "Calendaris que inclouen esdeveniments, detalls i assistents", "Contacts and groups" : "Contactes i grups", "WebDAV" : "WebDAV", "WebDAV endpoint" : "Punt final de WebDAV", + "Availability" : "Disponibilitat", + "If you configure your working hours, other users will see when you are out of office when they book a meeting." : "Si configureu el vostre horari laboral, els altres usuaris veuran quan sou fora de l'oficina quan reserven una reunió.", + "Time zone:" : "Zona horària:", "to" : "a", - "Delete slot" : "Suprimeix unitat temporal", + "Delete slot" : "Suprimeix forat", + "No working hours set" : "Sense horari de treball establert", + "Add slot" : "Afegeix una forat", "Monday" : "Dilluns", "Tuesday" : "Dimarts", "Wednesday" : "Dimecres", @@ -84,14 +157,20 @@ "Friday" : "Divendres", "Saturday" : "Dissabte", "Sunday" : "Diumenge", + "Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "Estableix automàticament l'estat de l'usuari a \"No molestar\" fora de la disponibilitat per silenciar totes les notificacions.", "Save" : "Desa", + "Failed to load availability" : "No s'ha pogut carregar la disponibilitat", + "Saved availability" : "Disponibilitat guardada", + "Failed to save availability" : "No s'ha pogut desar la disponibilitat", "Calendar server" : "Servidor de calendari", "Send invitations to attendees" : "Envia invitacions als assistents", "Automatically generate a birthday calendar" : "Genera automàticament un calendari d’aniversari", "Birthday calendars will be generated by a background job." : "Els calendaris d'aniversari es generaran per un procés en segon pla..", "Hence they will not be available immediately after enabling but will show up after some time." : "Per tant, no estaran disponibles immediatament després d'habilitar-los, però apareixeran d'aquí una estona.", "Send notifications for events" : "Envia notificacions per als esdeveniments", - "Notifications are sent via background jobs, so these must occur often enough." : "Les notificacions s'envien per tasques funcionant en segon pla, així que això ha de succeir bastant sovint.", + "Notifications are sent via background jobs, so these must occur often enough." : "Les notificacions s'envien per feines en segon pla, així que això ha de succeir bastant sovint.", + "Send reminder notifications to calendar sharees as well" : "També envieu notificacions de recordatoris als recursos compartits del calendari", + "Reminders are always sent to organizers and attendees." : "Sempre s'envien recordatoris als organitzadors i als assistents.", "Enable notifications for events via push" : "Habiliteu les notificacions per a esdeveniments mitjançant l’empenyiment", "Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}." : "Instal·leu també {calendarappstoreopen}l’aplicació de Calendari{linkclose} o {calendardocopen}connecteu el vostre escriptori i el mòbil per sincronitzar ↗{linkclose}.", "Please make sure to properly set up {emailopen}the email server{linkclose}." : "Si us plau, assegureu-vos de configurar correctament {emailopen}el servidor de correu electrònic{linkclose}.", @@ -99,6 +178,7 @@ "Please contact the organizer directly." : "Si us plau contacteu amb l'organitzador directament.", "Are you accepting the invitation?" : "Accepteu la invitació?", "Tentative" : "Provisional", + "Number of guests" : "Nombre d'hostes", "Comment" : "Comentari", "Your attendance was updated successfully." : "La vostra assistència ha estat actualitzada correctament.", "Todos" : "Tasques", diff --git a/apps/dav/l10n/da.js b/apps/dav/l10n/da.js index 987589d0c29..d5dc0bab99f 100644 --- a/apps/dav/l10n/da.js +++ b/apps/dav/l10n/da.js @@ -75,6 +75,7 @@ OC.L10N.register( "Contacts and groups" : "Kontakter og grupper", "WebDAV" : "WebDAV", "WebDAV endpoint" : "WebDAV endpoint", + "Availability" : "tilgængelighed", "to" : "til", "Delete slot" : "Slet slot", "Monday" : "Mandag", diff --git a/apps/dav/l10n/da.json b/apps/dav/l10n/da.json index 2ee6c850cd4..0b2467a841e 100644 --- a/apps/dav/l10n/da.json +++ b/apps/dav/l10n/da.json @@ -73,6 +73,7 @@ "Contacts and groups" : "Kontakter og grupper", "WebDAV" : "WebDAV", "WebDAV endpoint" : "WebDAV endpoint", + "Availability" : "tilgængelighed", "to" : "til", "Delete slot" : "Slet slot", "Monday" : "Mandag", diff --git a/apps/dav/l10n/el.js b/apps/dav/l10n/el.js index 45ce51a502f..24c35f48709 100644 --- a/apps/dav/l10n/el.js +++ b/apps/dav/l10n/el.js @@ -31,6 +31,7 @@ OC.L10N.register( "{actor} updated event {event} in calendar {calendar}" : "Ο {actor} ενημέρωσε το γεγονός {event} στο ημερολόγιο {calendar}", "You updated event {event} in calendar {calendar}" : "Ενημερώσατε το συμβάν {event} στο ημερολόγιο {calendar}", "Busy" : "Απασχολημένος", + "Calendar, contacts and tasks" : "Ημερολόγιο, επαφές και εργασίες", "A <strong>calendar</strong> was modified" : "Τροποποιήθηκε ένα <strong>ημερολόγιο</strong> ", "A calendar <strong>event</strong> was modified" : "Τροποποιήθηκε ένα <strong>γεγονός</strong> του ημερολογίου", "Contact birthdays" : "Γενέθλια επαφών", diff --git a/apps/dav/l10n/el.json b/apps/dav/l10n/el.json index 019d0e757c9..cfdc151b53c 100644 --- a/apps/dav/l10n/el.json +++ b/apps/dav/l10n/el.json @@ -29,6 +29,7 @@ "{actor} updated event {event} in calendar {calendar}" : "Ο {actor} ενημέρωσε το γεγονός {event} στο ημερολόγιο {calendar}", "You updated event {event} in calendar {calendar}" : "Ενημερώσατε το συμβάν {event} στο ημερολόγιο {calendar}", "Busy" : "Απασχολημένος", + "Calendar, contacts and tasks" : "Ημερολόγιο, επαφές και εργασίες", "A <strong>calendar</strong> was modified" : "Τροποποιήθηκε ένα <strong>ημερολόγιο</strong> ", "A calendar <strong>event</strong> was modified" : "Τροποποιήθηκε ένα <strong>γεγονός</strong> του ημερολογίου", "Contact birthdays" : "Γενέθλια επαφών", diff --git a/apps/dav/l10n/en_GB.js b/apps/dav/l10n/en_GB.js index 11229abe9f4..44e424f5eb0 100644 --- a/apps/dav/l10n/en_GB.js +++ b/apps/dav/l10n/en_GB.js @@ -2,7 +2,7 @@ OC.L10N.register( "dav", { "Calendar" : "Calendar", - "Todos" : "Todos", + "To-dos" : "To-dos", "Personal" : "Personal", "{actor} created calendar {calendar}" : "{actor} created calendar {calendar}", "You created calendar {calendar}" : "You created calendar {calendar}", @@ -10,6 +10,8 @@ OC.L10N.register( "You deleted calendar {calendar}" : "You deleted calendar {calendar}", "{actor} updated calendar {calendar}" : "{actor} updated calendar {calendar}", "You updated calendar {calendar}" : "You updated calendar {calendar}", + "{actor} restored calendar {calendar}" : "{actor} restored calendar {calendar}", + "You restored calendar {calendar}" : "You restored calendar {calendar}", "You shared calendar {calendar} as public link" : "You shared calendar {calendar} as public link", "You removed public link for calendar {calendar}" : "You removed public link for calendar {calendar}", "{actor} shared calendar {calendar} with you" : "{actor} shared calendar {calendar} with you", @@ -23,47 +25,175 @@ OC.L10N.register( "{actor} shared calendar {calendar} with group {group}" : "{actor} shared calendar {calendar} with group {group}", "You unshared calendar {calendar} from group {group}" : "You unshared calendar {calendar} from group {group}", "{actor} unshared calendar {calendar} from group {group}" : "{actor} unshared calendar {calendar} from group {group}", + "Untitled event" : "Untitled event", "{actor} created event {event} in calendar {calendar}" : "{actor} created event {event} in calendar {calendar}", "You created event {event} in calendar {calendar}" : "You created event {event} in calendar {calendar}", "{actor} deleted event {event} from calendar {calendar}" : "{actor} deleted event {event} from calendar {calendar}", "You deleted event {event} from calendar {calendar}" : "You deleted event {event} from calendar {calendar}", "{actor} updated event {event} in calendar {calendar}" : "{actor} updated event {event} in calendar {calendar}", "You updated event {event} in calendar {calendar}" : "You updated event {event} in calendar {calendar}", + "{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}", + "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}", + "{actor} restored event {event} of calendar {calendar}" : "{actor} restored event {event} of calendar {calendar}", + "You restored event {event} of calendar {calendar}" : "You restored event {event} of calendar {calendar}", "Busy" : "Busy", - "{actor} created todo {todo} in list {calendar}" : "{actor} created todo {todo} in list {calendar}", - "You created todo {todo} in list {calendar}" : "You created todo {todo} in list {calendar}", - "{actor} deleted todo {todo} from list {calendar}" : "{actor} deleted todo {todo} from list {calendar}", - "You deleted todo {todo} from list {calendar}" : "You deleted todo {todo} from list {calendar}", - "{actor} updated todo {todo} in list {calendar}" : "{actor} updated todo {todo} in list {calendar}", - "You updated todo {todo} in list {calendar}" : "You updated todo {todo} in list {calendar}", - "{actor} solved todo {todo} in list {calendar}" : "{actor} solved todo {todo} in list {calendar}", - "You solved todo {todo} in list {calendar}" : "You solved todo {todo} in list {calendar}", - "{actor} reopened todo {todo} in list {calendar}" : "{actor} reopened todo {todo} in list {calendar}", - "You reopened todo {todo} in list {calendar}" : "You reopened todo {todo} in list {calendar}", + "{actor} created to-do {todo} in list {calendar}" : "{actor} created to-do {todo} in list {calendar}", + "You created to-do {todo} in list {calendar}" : "You created to-do {todo} in list {calendar}", + "{actor} deleted to-do {todo} from list {calendar}" : "{actor} deleted to-do {todo} from list {calendar}", + "You deleted to-do {todo} from list {calendar}" : "You deleted to-do {todo} from list {calendar}", + "{actor} updated to-do {todo} in list {calendar}" : "{actor} updated to-do {todo} in list {calendar}", + "You updated to-do {todo} in list {calendar}" : "You updated to-do {todo} in list {calendar}", + "{actor} solved to-do {todo} in list {calendar}" : "{actor} solved to-do {todo} in list {calendar}", + "You solved to-do {todo} in list {calendar}" : "You solved to-do {todo} in list {calendar}", + "{actor} reopened to-do {todo} in list {calendar}" : "{actor} reopened to-do {todo} in list {calendar}", + "You reopened to-do {todo} in list {calendar}" : "You reopened to-do {todo} in list {calendar}", + "{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}", + "You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}", + "Calendar, contacts and tasks" : "Calendar, contacts and tasks", "A <strong>calendar</strong> was modified" : "A <strong>calendar</strong> was modified", "A calendar <strong>event</strong> was modified" : "A calendar <strong>event</strong> was modified", - "A calendar <strong>todo</strong> was modified" : "A calendar <strong>todo</strong> was modified", + "A calendar <strong>to-do</strong> was modified" : "A calendar <strong>to-do</strong> was modified", "Contact birthdays" : "Contact birthdays", + "Death of %s" : "Death of %s", + "Calendar:" : "Calendar:", + "Date:" : "Date:", "Where:" : "Where:", "Description:" : "Description:", + "_%n year_::_%n years_" : ["%n year","%n years"], + "_%n month_::_%n months_" : ["%n month","%n months"], + "_%n day_::_%n days_" : ["%n day","%n days"], + "_%n hour_::_%n hours_" : ["%n hour","%n hours"], + "_%n minute_::_%n minutes_" : ["%n minute","%n minutes"], + "%s (in %s)" : "%s (in %s)", + "%s (%s ago)" : "%s (%s ago)", + "Calendar: %s" : "Calendar: %s", + "Date: %s" : "Date: %s", + "Description: %s" : "Description: %s", + "Where: %s" : "Where: %s", "%1$s via %2$s" : "%1$s via %2$s", + "Cancelled: %1$s" : "Cancelled: %1$s", "Invitation canceled" : "Invitation canceled", + "Re: %1$s" : "Re: %1$s", "Invitation updated" : "Invitation updated", + "Invitation: %1$s" : "Invitation: %1$s", + "Invitation" : "Invitation", + "Title:" : "Title:", + "Time:" : "Time:", "Location:" : "Location:", "Link:" : "Link:", + "Organizer:" : "Organizer:", + "Attendees:" : "Attendees:", "Accept" : "Accept", "Decline" : "Decline", + "More options …" : "More options …", + "More options at %s" : "More options at %s", "Contacts" : "Contacts", + "{actor} created address book {addressbook}" : "{actor} created address book {addressbook}", + "You created address book {addressbook}" : "You created address book {addressbook}", + "{actor} deleted address book {addressbook}" : "{actor} deleted address book {addressbook}", + "You deleted address book {addressbook}" : "You deleted address book {addressbook}", + "{actor} updated address book {addressbook}" : "{actor} updated address book {addressbook}", + "You updated address book {addressbook}" : "You updated address book {addressbook}", + "{actor} shared address book {addressbook} with you" : "{actor} shared address book {addressbook} with you", + "You shared address book {addressbook} with {user}" : "You shared address book {addressbook} with {user}", + "{actor} shared address book {addressbook} with {user}" : "{actor} shared address book {addressbook} with {user}", + "{actor} unshared address book {addressbook} from you" : "{actor} unshared address book {addressbook} from you", + "You unshared address book {addressbook} from {user}" : "You unshared address book {addressbook} from {user}", + "{actor} unshared address book {addressbook} from {user}" : "{actor} unshared address book {addressbook} from {user}", + "{actor} unshared address book {addressbook} from themselves" : "{actor} unshared address book {addressbook} from themselves", + "You shared address book {addressbook} with group {group}" : "You shared address book {addressbook} with group {group}", + "{actor} shared address book {addressbook} with group {group}" : "{actor} shared address book {addressbook} with group {group}", + "You unshared address book {addressbook} from group {group}" : "You unshared address book {addressbook} from group {group}", + "{actor} unshared address book {addressbook} from group {group}" : "{actor} unshared address book {addressbook} from group {group}", + "{actor} created contact {card} in address book {addressbook}" : "{actor} created contact {card} in address book {addressbook}", + "You created contact {card} in address book {addressbook}" : "You created contact {card} in address book {addressbook}", + "{actor} deleted contact {card} from address book {addressbook}" : "{actor} deleted contact {card} from address book {addressbook}", + "You deleted contact {card} from address book {addressbook}" : "You deleted contact {card} from address book {addressbook}", + "{actor} updated contact {card} in address book {addressbook}" : "{actor} updated contact {card} in address book {addressbook}", + "You updated contact {card} in address book {addressbook}" : "You updated contact {card} in address book {addressbook}", + "A <strong>contact</strong> or <strong>address book</strong> was modified" : "A <strong>contact</strong> or <strong>address book</strong> was modified", + "File is not updatable: %1$s" : "File is not updatable: %1$s", + "Could not write to final file, canceled by hook" : "Could not write to final file, canceled by hook", + "Could not write file contents" : "Could not write file contents", + "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], + "Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Error while copying file to target location (copied: %1$s, expected filesize: %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." : "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.", + "Could not rename part file to final file, canceled by hook" : "Could not rename part file to final file, canceled by hook", + "Could not rename part file to final file" : "Could not rename part file to final file", + "Failed to check file size: %1$s" : "Failed to check file size: %1$s", + "Could not open file" : "Could not open file", + "Encryption not ready: %1$s" : "Encryption not ready: %1$s", + "Failed to open file: %1$s" : "Failed to open file: %1$s", + "Failed to unlink: %1$s" : "Failed to unlink: %1$s", + "Invalid chunk name" : "Invalid chunk name", + "Could not rename part file assembled from chunks" : "Could not rename part file assembled from chunks", + "Failed to write file contents: %1$s" : "Failed to write file contents: %1$s", + "File not found: %1$s" : "File not found: %1$s", + "System is in maintenance mode." : "System is in maintenance mode.", + "Upgrade needed" : "Upgrade needed", + "Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS.", + "Configures a CalDAV account" : "Configures a CalDAV account", + "Configures a CardDAV account" : "Configures a CardDAV account", + "Events" : "Events", "Tasks" : "Tasks", + "Untitled task" : "Untitled task", + "Completed on %s" : "Completed on %s", + "Due on %s by %s" : "Due on %s by %s", + "Due on %s" : "Due on %s", + "Migrated calendar (%1$s)" : "Migrated calendar (%1$s)", + "Calendars including events, details and attendees" : "Calendars including events, details and attendees", + "Contacts and groups" : "Contacts and groups", "WebDAV" : "WebDAV", "WebDAV endpoint" : "WebDAV endpoint", - "Tentative" : "Tentative", + "Availability" : "Availability", + "If you configure your working hours, other users will see when you are out of office when they book a meeting." : "If you configure your working hours, other users will see when you are out of office when they book a meeting.", + "Time zone:" : "Time zone:", + "to" : "to", + "Delete slot" : "Delete slot", + "No working hours set" : "No working hours set", + "Add slot" : "Add slot", + "Monday" : "Monday", + "Tuesday" : "Tuesday", + "Wednesday" : "Wednesday", + "Thursday" : "Thursday", + "Friday" : "Friday", + "Saturday" : "Saturday", + "Sunday" : "Sunday", + "Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications.", "Save" : "Save", + "Failed to load availability" : "Failed to load availability", + "Saved availability" : "Saved availability", + "Failed to save availability" : "Failed to save availability", + "Calendar server" : "Calendar server", "Send invitations to attendees" : "Send invitations to attendees", "Automatically generate a birthday calendar" : "Automatically generate a birthday calendar", "Birthday calendars will be generated by a background job." : "Birthday calendars will be generated by a background job.", "Hence they will not be available immediately after enabling but will show up after some time." : "Hence they will not be available immediately after enabling but will show up after some time.", - "Hello %s," : "Hello %s,", - "When:" : "When:" + "Send notifications for events" : "Send notifications for events", + "Notifications are sent via background jobs, so these must occur often enough." : "Notifications are sent via background jobs, so these must occur often enough.", + "Send reminder notifications to calendar sharees as well" : "Send reminder notifications to calendar sharees as well", + "Reminders are always sent to organizers and attendees." : "Reminders are always sent to organizers and attendees.", + "Enable notifications for events via push" : "Enable notifications for events via push", + "Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}." : "Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}.", + "Please make sure to properly set up {emailopen}the email server{linkclose}." : "Please make sure to properly set up {emailopen}the email server{linkclose}.", + "There was an error updating your attendance status." : "There was an error updating your attendance status.", + "Please contact the organizer directly." : "Please contact the organizer directly.", + "Are you accepting the invitation?" : "Are you accepting the invitation?", + "Tentative" : "Tentative", + "Number of guests" : "Number of guests", + "Comment" : "Comment", + "Your attendance was updated successfully." : "Your attendance was updated successfully.", + "Todos" : "Todos", + "{actor} created todo {todo} in list {calendar}" : "{actor} created todo {todo} in list {calendar}", + "You created todo {todo} in list {calendar}" : "You created todo {todo} in list {calendar}", + "{actor} deleted todo {todo} from list {calendar}" : "{actor} deleted todo {todo} from list {calendar}", + "You deleted todo {todo} from list {calendar}" : "You deleted todo {todo} from list {calendar}", + "{actor} updated todo {todo} in list {calendar}" : "{actor} updated todo {todo} in list {calendar}", + "You updated todo {todo} in list {calendar}" : "You updated todo {todo} in list {calendar}", + "{actor} solved todo {todo} in list {calendar}" : "{actor} solved todo {todo} in list {calendar}", + "You solved todo {todo} in list {calendar}" : "You solved todo {todo} in list {calendar}", + "{actor} reopened todo {todo} in list {calendar}" : "{actor} reopened todo {todo} in list {calendar}", + "You reopened todo {todo} in list {calendar}" : "You reopened todo {todo} in list {calendar}", + "A calendar <strong>todo</strong> was modified" : "A calendar <strong>todo</strong> was modified" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/dav/l10n/en_GB.json b/apps/dav/l10n/en_GB.json index 2acf739fa33..ea3bf51acae 100644 --- a/apps/dav/l10n/en_GB.json +++ b/apps/dav/l10n/en_GB.json @@ -1,6 +1,6 @@ { "translations": { "Calendar" : "Calendar", - "Todos" : "Todos", + "To-dos" : "To-dos", "Personal" : "Personal", "{actor} created calendar {calendar}" : "{actor} created calendar {calendar}", "You created calendar {calendar}" : "You created calendar {calendar}", @@ -8,6 +8,8 @@ "You deleted calendar {calendar}" : "You deleted calendar {calendar}", "{actor} updated calendar {calendar}" : "{actor} updated calendar {calendar}", "You updated calendar {calendar}" : "You updated calendar {calendar}", + "{actor} restored calendar {calendar}" : "{actor} restored calendar {calendar}", + "You restored calendar {calendar}" : "You restored calendar {calendar}", "You shared calendar {calendar} as public link" : "You shared calendar {calendar} as public link", "You removed public link for calendar {calendar}" : "You removed public link for calendar {calendar}", "{actor} shared calendar {calendar} with you" : "{actor} shared calendar {calendar} with you", @@ -21,47 +23,175 @@ "{actor} shared calendar {calendar} with group {group}" : "{actor} shared calendar {calendar} with group {group}", "You unshared calendar {calendar} from group {group}" : "You unshared calendar {calendar} from group {group}", "{actor} unshared calendar {calendar} from group {group}" : "{actor} unshared calendar {calendar} from group {group}", + "Untitled event" : "Untitled event", "{actor} created event {event} in calendar {calendar}" : "{actor} created event {event} in calendar {calendar}", "You created event {event} in calendar {calendar}" : "You created event {event} in calendar {calendar}", "{actor} deleted event {event} from calendar {calendar}" : "{actor} deleted event {event} from calendar {calendar}", "You deleted event {event} from calendar {calendar}" : "You deleted event {event} from calendar {calendar}", "{actor} updated event {event} in calendar {calendar}" : "{actor} updated event {event} in calendar {calendar}", "You updated event {event} in calendar {calendar}" : "You updated event {event} in calendar {calendar}", + "{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}", + "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}", + "{actor} restored event {event} of calendar {calendar}" : "{actor} restored event {event} of calendar {calendar}", + "You restored event {event} of calendar {calendar}" : "You restored event {event} of calendar {calendar}", "Busy" : "Busy", - "{actor} created todo {todo} in list {calendar}" : "{actor} created todo {todo} in list {calendar}", - "You created todo {todo} in list {calendar}" : "You created todo {todo} in list {calendar}", - "{actor} deleted todo {todo} from list {calendar}" : "{actor} deleted todo {todo} from list {calendar}", - "You deleted todo {todo} from list {calendar}" : "You deleted todo {todo} from list {calendar}", - "{actor} updated todo {todo} in list {calendar}" : "{actor} updated todo {todo} in list {calendar}", - "You updated todo {todo} in list {calendar}" : "You updated todo {todo} in list {calendar}", - "{actor} solved todo {todo} in list {calendar}" : "{actor} solved todo {todo} in list {calendar}", - "You solved todo {todo} in list {calendar}" : "You solved todo {todo} in list {calendar}", - "{actor} reopened todo {todo} in list {calendar}" : "{actor} reopened todo {todo} in list {calendar}", - "You reopened todo {todo} in list {calendar}" : "You reopened todo {todo} in list {calendar}", + "{actor} created to-do {todo} in list {calendar}" : "{actor} created to-do {todo} in list {calendar}", + "You created to-do {todo} in list {calendar}" : "You created to-do {todo} in list {calendar}", + "{actor} deleted to-do {todo} from list {calendar}" : "{actor} deleted to-do {todo} from list {calendar}", + "You deleted to-do {todo} from list {calendar}" : "You deleted to-do {todo} from list {calendar}", + "{actor} updated to-do {todo} in list {calendar}" : "{actor} updated to-do {todo} in list {calendar}", + "You updated to-do {todo} in list {calendar}" : "You updated to-do {todo} in list {calendar}", + "{actor} solved to-do {todo} in list {calendar}" : "{actor} solved to-do {todo} in list {calendar}", + "You solved to-do {todo} in list {calendar}" : "You solved to-do {todo} in list {calendar}", + "{actor} reopened to-do {todo} in list {calendar}" : "{actor} reopened to-do {todo} in list {calendar}", + "You reopened to-do {todo} in list {calendar}" : "You reopened to-do {todo} in list {calendar}", + "{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}", + "You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}", + "Calendar, contacts and tasks" : "Calendar, contacts and tasks", "A <strong>calendar</strong> was modified" : "A <strong>calendar</strong> was modified", "A calendar <strong>event</strong> was modified" : "A calendar <strong>event</strong> was modified", - "A calendar <strong>todo</strong> was modified" : "A calendar <strong>todo</strong> was modified", + "A calendar <strong>to-do</strong> was modified" : "A calendar <strong>to-do</strong> was modified", "Contact birthdays" : "Contact birthdays", + "Death of %s" : "Death of %s", + "Calendar:" : "Calendar:", + "Date:" : "Date:", "Where:" : "Where:", "Description:" : "Description:", + "_%n year_::_%n years_" : ["%n year","%n years"], + "_%n month_::_%n months_" : ["%n month","%n months"], + "_%n day_::_%n days_" : ["%n day","%n days"], + "_%n hour_::_%n hours_" : ["%n hour","%n hours"], + "_%n minute_::_%n minutes_" : ["%n minute","%n minutes"], + "%s (in %s)" : "%s (in %s)", + "%s (%s ago)" : "%s (%s ago)", + "Calendar: %s" : "Calendar: %s", + "Date: %s" : "Date: %s", + "Description: %s" : "Description: %s", + "Where: %s" : "Where: %s", "%1$s via %2$s" : "%1$s via %2$s", + "Cancelled: %1$s" : "Cancelled: %1$s", "Invitation canceled" : "Invitation canceled", + "Re: %1$s" : "Re: %1$s", "Invitation updated" : "Invitation updated", + "Invitation: %1$s" : "Invitation: %1$s", + "Invitation" : "Invitation", + "Title:" : "Title:", + "Time:" : "Time:", "Location:" : "Location:", "Link:" : "Link:", + "Organizer:" : "Organizer:", + "Attendees:" : "Attendees:", "Accept" : "Accept", "Decline" : "Decline", + "More options …" : "More options …", + "More options at %s" : "More options at %s", "Contacts" : "Contacts", + "{actor} created address book {addressbook}" : "{actor} created address book {addressbook}", + "You created address book {addressbook}" : "You created address book {addressbook}", + "{actor} deleted address book {addressbook}" : "{actor} deleted address book {addressbook}", + "You deleted address book {addressbook}" : "You deleted address book {addressbook}", + "{actor} updated address book {addressbook}" : "{actor} updated address book {addressbook}", + "You updated address book {addressbook}" : "You updated address book {addressbook}", + "{actor} shared address book {addressbook} with you" : "{actor} shared address book {addressbook} with you", + "You shared address book {addressbook} with {user}" : "You shared address book {addressbook} with {user}", + "{actor} shared address book {addressbook} with {user}" : "{actor} shared address book {addressbook} with {user}", + "{actor} unshared address book {addressbook} from you" : "{actor} unshared address book {addressbook} from you", + "You unshared address book {addressbook} from {user}" : "You unshared address book {addressbook} from {user}", + "{actor} unshared address book {addressbook} from {user}" : "{actor} unshared address book {addressbook} from {user}", + "{actor} unshared address book {addressbook} from themselves" : "{actor} unshared address book {addressbook} from themselves", + "You shared address book {addressbook} with group {group}" : "You shared address book {addressbook} with group {group}", + "{actor} shared address book {addressbook} with group {group}" : "{actor} shared address book {addressbook} with group {group}", + "You unshared address book {addressbook} from group {group}" : "You unshared address book {addressbook} from group {group}", + "{actor} unshared address book {addressbook} from group {group}" : "{actor} unshared address book {addressbook} from group {group}", + "{actor} created contact {card} in address book {addressbook}" : "{actor} created contact {card} in address book {addressbook}", + "You created contact {card} in address book {addressbook}" : "You created contact {card} in address book {addressbook}", + "{actor} deleted contact {card} from address book {addressbook}" : "{actor} deleted contact {card} from address book {addressbook}", + "You deleted contact {card} from address book {addressbook}" : "You deleted contact {card} from address book {addressbook}", + "{actor} updated contact {card} in address book {addressbook}" : "{actor} updated contact {card} in address book {addressbook}", + "You updated contact {card} in address book {addressbook}" : "You updated contact {card} in address book {addressbook}", + "A <strong>contact</strong> or <strong>address book</strong> was modified" : "A <strong>contact</strong> or <strong>address book</strong> was modified", + "File is not updatable: %1$s" : "File is not updatable: %1$s", + "Could not write to final file, canceled by hook" : "Could not write to final file, canceled by hook", + "Could not write file contents" : "Could not write file contents", + "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], + "Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Error while copying file to target location (copied: %1$s, expected filesize: %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." : "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.", + "Could not rename part file to final file, canceled by hook" : "Could not rename part file to final file, canceled by hook", + "Could not rename part file to final file" : "Could not rename part file to final file", + "Failed to check file size: %1$s" : "Failed to check file size: %1$s", + "Could not open file" : "Could not open file", + "Encryption not ready: %1$s" : "Encryption not ready: %1$s", + "Failed to open file: %1$s" : "Failed to open file: %1$s", + "Failed to unlink: %1$s" : "Failed to unlink: %1$s", + "Invalid chunk name" : "Invalid chunk name", + "Could not rename part file assembled from chunks" : "Could not rename part file assembled from chunks", + "Failed to write file contents: %1$s" : "Failed to write file contents: %1$s", + "File not found: %1$s" : "File not found: %1$s", + "System is in maintenance mode." : "System is in maintenance mode.", + "Upgrade needed" : "Upgrade needed", + "Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS.", + "Configures a CalDAV account" : "Configures a CalDAV account", + "Configures a CardDAV account" : "Configures a CardDAV account", + "Events" : "Events", "Tasks" : "Tasks", + "Untitled task" : "Untitled task", + "Completed on %s" : "Completed on %s", + "Due on %s by %s" : "Due on %s by %s", + "Due on %s" : "Due on %s", + "Migrated calendar (%1$s)" : "Migrated calendar (%1$s)", + "Calendars including events, details and attendees" : "Calendars including events, details and attendees", + "Contacts and groups" : "Contacts and groups", "WebDAV" : "WebDAV", "WebDAV endpoint" : "WebDAV endpoint", - "Tentative" : "Tentative", + "Availability" : "Availability", + "If you configure your working hours, other users will see when you are out of office when they book a meeting." : "If you configure your working hours, other users will see when you are out of office when they book a meeting.", + "Time zone:" : "Time zone:", + "to" : "to", + "Delete slot" : "Delete slot", + "No working hours set" : "No working hours set", + "Add slot" : "Add slot", + "Monday" : "Monday", + "Tuesday" : "Tuesday", + "Wednesday" : "Wednesday", + "Thursday" : "Thursday", + "Friday" : "Friday", + "Saturday" : "Saturday", + "Sunday" : "Sunday", + "Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications.", "Save" : "Save", + "Failed to load availability" : "Failed to load availability", + "Saved availability" : "Saved availability", + "Failed to save availability" : "Failed to save availability", + "Calendar server" : "Calendar server", "Send invitations to attendees" : "Send invitations to attendees", "Automatically generate a birthday calendar" : "Automatically generate a birthday calendar", "Birthday calendars will be generated by a background job." : "Birthday calendars will be generated by a background job.", "Hence they will not be available immediately after enabling but will show up after some time." : "Hence they will not be available immediately after enabling but will show up after some time.", - "Hello %s," : "Hello %s,", - "When:" : "When:" + "Send notifications for events" : "Send notifications for events", + "Notifications are sent via background jobs, so these must occur often enough." : "Notifications are sent via background jobs, so these must occur often enough.", + "Send reminder notifications to calendar sharees as well" : "Send reminder notifications to calendar sharees as well", + "Reminders are always sent to organizers and attendees." : "Reminders are always sent to organizers and attendees.", + "Enable notifications for events via push" : "Enable notifications for events via push", + "Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}." : "Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}.", + "Please make sure to properly set up {emailopen}the email server{linkclose}." : "Please make sure to properly set up {emailopen}the email server{linkclose}.", + "There was an error updating your attendance status." : "There was an error updating your attendance status.", + "Please contact the organizer directly." : "Please contact the organizer directly.", + "Are you accepting the invitation?" : "Are you accepting the invitation?", + "Tentative" : "Tentative", + "Number of guests" : "Number of guests", + "Comment" : "Comment", + "Your attendance was updated successfully." : "Your attendance was updated successfully.", + "Todos" : "Todos", + "{actor} created todo {todo} in list {calendar}" : "{actor} created todo {todo} in list {calendar}", + "You created todo {todo} in list {calendar}" : "You created todo {todo} in list {calendar}", + "{actor} deleted todo {todo} from list {calendar}" : "{actor} deleted todo {todo} from list {calendar}", + "You deleted todo {todo} from list {calendar}" : "You deleted todo {todo} from list {calendar}", + "{actor} updated todo {todo} in list {calendar}" : "{actor} updated todo {todo} in list {calendar}", + "You updated todo {todo} in list {calendar}" : "You updated todo {todo} in list {calendar}", + "{actor} solved todo {todo} in list {calendar}" : "{actor} solved todo {todo} in list {calendar}", + "You solved todo {todo} in list {calendar}" : "You solved todo {todo} in list {calendar}", + "{actor} reopened todo {todo} in list {calendar}" : "{actor} reopened todo {todo} in list {calendar}", + "You reopened todo {todo} in list {calendar}" : "You reopened todo {todo} in list {calendar}", + "A calendar <strong>todo</strong> was modified" : "A calendar <strong>todo</strong> was modified" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/dav/l10n/ja.js b/apps/dav/l10n/ja.js index a9cbf7e6b94..365a97efd89 100644 --- a/apps/dav/l10n/ja.js +++ b/apps/dav/l10n/ja.js @@ -2,6 +2,7 @@ OC.L10N.register( "dav", { "Calendar" : "カレンダー", + "To-dos" : "To-dos", "Personal" : "個人", "{actor} created calendar {calendar}" : "{actor}はカレンダー {calendar} を作成しました", "You created calendar {calendar}" : "カレンダー {calendar} を作成しました", diff --git a/apps/dav/l10n/ja.json b/apps/dav/l10n/ja.json index e5ec8aeb504..41a9d4437a6 100644 --- a/apps/dav/l10n/ja.json +++ b/apps/dav/l10n/ja.json @@ -1,5 +1,6 @@ { "translations": { "Calendar" : "カレンダー", + "To-dos" : "To-dos", "Personal" : "個人", "{actor} created calendar {calendar}" : "{actor}はカレンダー {calendar} を作成しました", "You created calendar {calendar}" : "カレンダー {calendar} を作成しました", diff --git a/apps/dav/l10n/mk.js b/apps/dav/l10n/mk.js index fe16669120e..a519db32b04 100644 --- a/apps/dav/l10n/mk.js +++ b/apps/dav/l10n/mk.js @@ -100,8 +100,11 @@ OC.L10N.register( "You unshared address book {addressbook} from {user}" : "Не го споделиувате адресар {addressbook} со {user}", "{actor} unshared address book {addressbook} from {user}" : "{actor} не го споделува адресар {addressbook} со {user}", "{actor} unshared address book {addressbook} from themselves" : "{actor} не го споделува адресар {addressbook} со себе", + "You shared address book {addressbook} with group {group}" : "Споделивте адресар {addressbook} со група {group}", + "{actor} shared address book {addressbook} with group {group}" : "{actor} сподели адресар {addressbook} со група {group}", "A <strong>contact</strong> or <strong>address book</strong> was modified" : "<strong>Контракт</strong> или <strong>адресар</strong> е променет", "_%n byte_::_%n bytes_" : ["%n бајт","%n бајти"], + "Could not open file" : "Неможе да се отвори датотеката", "File not found: %1$s" : "Датотеката не е пронајдена: %1$s", "System is in maintenance mode." : "Системот е во мод за одржување.", "Upgrade needed" : "Потребна е надградба", diff --git a/apps/dav/l10n/mk.json b/apps/dav/l10n/mk.json index 7a179fab5a7..095a3b21a18 100644 --- a/apps/dav/l10n/mk.json +++ b/apps/dav/l10n/mk.json @@ -98,8 +98,11 @@ "You unshared address book {addressbook} from {user}" : "Не го споделиувате адресар {addressbook} со {user}", "{actor} unshared address book {addressbook} from {user}" : "{actor} не го споделува адресар {addressbook} со {user}", "{actor} unshared address book {addressbook} from themselves" : "{actor} не го споделува адресар {addressbook} со себе", + "You shared address book {addressbook} with group {group}" : "Споделивте адресар {addressbook} со група {group}", + "{actor} shared address book {addressbook} with group {group}" : "{actor} сподели адресар {addressbook} со група {group}", "A <strong>contact</strong> or <strong>address book</strong> was modified" : "<strong>Контракт</strong> или <strong>адресар</strong> е променет", "_%n byte_::_%n bytes_" : ["%n бајт","%n бајти"], + "Could not open file" : "Неможе да се отвори датотеката", "File not found: %1$s" : "Датотеката не е пронајдена: %1$s", "System is in maintenance mode." : "Системот е во мод за одржување.", "Upgrade needed" : "Потребна е надградба", diff --git a/apps/dav/lib/CardDAV/Integration/ExternalAddressBook.php b/apps/dav/lib/CardDAV/Integration/ExternalAddressBook.php index b1deb638f3d..bd394cb7fb6 100644 --- a/apps/dav/lib/CardDAV/Integration/ExternalAddressBook.php +++ b/apps/dav/lib/CardDAV/Integration/ExternalAddressBook.php @@ -50,16 +50,9 @@ abstract class ExternalAddressBook implements IAddressBook, DAV\IProperties { */ private const DELIMITER = '--'; - /** @var string */ - private $appId; - - /** @var string */ - private $uri; + private string $appId; + private string $uri; - /** - * @param string $appId - * @param string $uri - */ public function __construct(string $appId, string $uri) { $this->appId = $appId; $this->uri = $uri; diff --git a/apps/dav/lib/Connector/Sabre/BlockLegacyClientPlugin.php b/apps/dav/lib/Connector/Sabre/BlockLegacyClientPlugin.php index 2d2be631416..257068b9576 100644 --- a/apps/dav/lib/Connector/Sabre/BlockLegacyClientPlugin.php +++ b/apps/dav/lib/Connector/Sabre/BlockLegacyClientPlugin.php @@ -64,7 +64,7 @@ class BlockLegacyClientPlugin extends ServerPlugin { return; } - $minimumSupportedDesktopVersion = $this->config->getSystemValue('minimum.supported.desktop.version', '2.0.0'); + $minimumSupportedDesktopVersion = $this->config->getSystemValue('minimum.supported.desktop.version', '2.3.0'); // Match on the mirall version which is in scheme "Mozilla/5.0 (%1) mirall/%2" or // "mirall/%1" for older releases diff --git a/apps/dav/lib/Connector/Sabre/Directory.php b/apps/dav/lib/Connector/Sabre/Directory.php index b575a051b2a..f4b1ee62190 100644 --- a/apps/dav/lib/Connector/Sabre/Directory.php +++ b/apps/dav/lib/Connector/Sabre/Directory.php @@ -255,7 +255,11 @@ class Directory extends \OCA\DAV\Connector\Sabre\Node implements \Sabre\DAV\ICol if (!$this->info->isReadable()) { // return 403 instead of 404 because a 404 would make // the caller believe that the collection itself does not exist - throw new Forbidden('No read permissions'); + if (\OCP\Server::get(\OCP\App\IAppManager::class)->isInstalled('files_accesscontrol')) { + throw new Forbidden('No read permissions. This might be caused by files_accesscontrol, check your configured rules'); + } else { + throw new Forbidden('No read permissions'); + } } $folderContent = $this->getNode()->getDirectoryListing(); } catch (LockedException $e) { diff --git a/apps/dav/lib/Connector/Sabre/File.php b/apps/dav/lib/Connector/Sabre/File.php index 94632b265db..3a871b06259 100644 --- a/apps/dav/lib/Connector/Sabre/File.php +++ b/apps/dav/lib/Connector/Sabre/File.php @@ -45,11 +45,11 @@ use OC\Files\Stream\HashWrapper; use OC\Files\View; use OC\Metadata\FileMetadata; use OCA\DAV\AppInfo\Application; +use OCA\DAV\Connector\Sabre\Exception\BadGateway; use OCA\DAV\Connector\Sabre\Exception\EntityTooLarge; use OCA\DAV\Connector\Sabre\Exception\FileLocked; use OCA\DAV\Connector\Sabre\Exception\Forbidden as DAVForbiddenException; use OCA\DAV\Connector\Sabre\Exception\UnsupportedMediaType; -use OCA\DAV\Connector\Sabre\Exception\BadGateway; use OCP\Encryption\Exceptions\GenericEncryptionException; use OCP\Files\EntityTooLargeException; use OCP\Files\FileInfo; @@ -491,9 +491,21 @@ class File extends Node implements IFile { } catch (\Exception $e) { $this->convertToSabreException($e); } + if ($res === false) { throw new ServiceUnavailable($this->l10n->t('Could not open file')); } + + // comparing current file size with the one in DB + // if different, fix DB and refresh cache. + if ($this->getSize() !== $this->fileView->filesize($this->getPath())) { + $logger = \OC::$server->get(LoggerInterface::class); + $logger->warning('fixing cached size of file id=' . $this->getId()); + + $this->getFileInfo()->getStorage()->getUpdater()->update($this->getFileInfo()->getInternalPath()); + $this->refreshInfo(); + } + return $res; } catch (GenericEncryptionException $e) { // returning 503 will allow retry of the operation at a later point in time diff --git a/apps/dav/lib/Connector/Sabre/QuotaPlugin.php b/apps/dav/lib/Connector/Sabre/QuotaPlugin.php index f2b652e3320..ff7396a0825 100644 --- a/apps/dav/lib/Connector/Sabre/QuotaPlugin.php +++ b/apps/dav/lib/Connector/Sabre/QuotaPlugin.php @@ -44,7 +44,6 @@ use Sabre\DAV\INode; * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License */ class QuotaPlugin extends \Sabre\DAV\ServerPlugin { - /** @var \OC\Files\View */ private $view; @@ -79,6 +78,7 @@ class QuotaPlugin extends \Sabre\DAV\ServerPlugin { $server->on('beforeWriteContent', [$this, 'beforeWriteContent'], 10); $server->on('beforeCreateFile', [$this, 'beforeCreateFile'], 10); $server->on('beforeMove', [$this, 'beforeMove'], 10); + $server->on('beforeCopy', [$this, 'beforeCopy'], 10); } /** @@ -131,7 +131,42 @@ class QuotaPlugin extends \Sabre\DAV\ServerPlugin { $destinationNode = $this->server->tree->getNodeForPath($destination); $path = $destinationNode->getPath(); } else { - $parentNode = $this->server->tree->getNodeForPath(dirname($destination)); + $parent = dirname($destination); + if ($parent === '.') { + $parent = ''; + } + $parentNode = $this->server->tree->getNodeForPath($parent); + $path = $parentNode->getPath(); + } + + return $this->checkQuota($path, $sourceNode->getSize()); + } + + /** + * Check quota on the target destination before a copy. + */ + public function beforeCopy(string $sourcePath, string $destinationPath): bool { + $sourceNode = $this->server->tree->getNodeForPath($sourcePath); + if (!$sourceNode instanceof Node) { + return true; + } + + // get target node for proper path conversion + if ($this->server->tree->nodeExists($destinationPath)) { + $destinationNode = $this->server->tree->getNodeForPath($destinationPath); + if (!$destinationNode instanceof Node) { + return true; + } + $path = $destinationNode->getPath(); + } else { + $parent = dirname($destinationPath); + if ($parent === '.') { + $parent = ''; + } + $parentNode = $this->server->tree->getNodeForPath($parent); + if (!$parentNode instanceof Node) { + return true; + } $path = $parentNode->getPath(); } diff --git a/apps/dav/lib/Files/FileSearchBackend.php b/apps/dav/lib/Files/FileSearchBackend.php index c819fa6afc6..524f90e6623 100644 --- a/apps/dav/lib/Files/FileSearchBackend.php +++ b/apps/dav/lib/Files/FileSearchBackend.php @@ -55,7 +55,7 @@ use SearchDAV\Query\Order; use SearchDAV\Query\Query; class FileSearchBackend implements ISearchBackend { - const OPERATOR_LIMIT = 100; + public const OPERATOR_LIMIT = 100; /** @var CachingTree */ private $tree; @@ -432,7 +432,7 @@ class FileSearchBackend implements ISearchBackend { if (is_numeric($value)) { return max(0, 0 + $value); } - $date = \DateTime::createFromFormat(\DateTimeInterface::ATOM, $value); + $date = \DateTime::createFromFormat(\DateTimeInterface::ATOM, (string)$value); return ($date instanceof \DateTime && $date->getTimestamp() !== false) ? $date->getTimestamp() : 0; default: return $value; diff --git a/apps/dav/lib/RootCollection.php b/apps/dav/lib/RootCollection.php index 29ab65d46a9..bacb550b415 100644 --- a/apps/dav/lib/RootCollection.php +++ b/apps/dav/lib/RootCollection.php @@ -118,7 +118,6 @@ class RootCollection extends SimpleCollection { $roomCalendarRoot->disableListing = $disableListing; $publicCalendarRoot = new PublicCalendarRoot($caldavBackend, $l10n, $config, $logger); - $publicCalendarRoot->disableListing = $disableListing; $systemTagCollection = new SystemTag\SystemTagsByIdCollection( \OC::$server->getSystemTagManager(), diff --git a/apps/dav/lib/Server.php b/apps/dav/lib/Server.php index f98dba22925..437a425fcd3 100644 --- a/apps/dav/lib/Server.php +++ b/apps/dav/lib/Server.php @@ -1,6 +1,7 @@ <?php /** * @copyright Copyright (c) 2016, ownCloud, Inc. + * @copyright Copyright (c) 2022 Informatyka Boguslawski sp. z o.o. sp.k., http://www.ib.pl/ * * @author Arthur Schiwon <blizzz@arthur-schiwon.de> * @author Bjoern Schiessle <bjoern@schiessle.org> @@ -177,7 +178,9 @@ class Server { $this->server->addPlugin(\OC::$server->get(\OCA\DAV\CalDAV\Trashbin\Plugin::class)); $this->server->addPlugin(new \OCA\DAV\CalDAV\WebcalCaching\Plugin($request)); - $this->server->addPlugin(new \Sabre\CalDAV\Subscriptions\Plugin()); + if (\OC::$server->getConfig()->getAppValue('dav', 'allow_calendar_link_subscriptions', 'yes') === 'yes') { + $this->server->addPlugin(new \Sabre\CalDAV\Subscriptions\Plugin()); + } $this->server->addPlugin(new \Sabre\CalDAV\Notifications\Plugin()); $this->server->addPlugin(new DAV\Sharing\Plugin($authBackend, \OC::$server->getRequest(), \OC::$server->getConfig())); diff --git a/apps/dav/src/views/__snapshots__/CalDavSettings.spec.js.snap b/apps/dav/src/views/__snapshots__/CalDavSettings.spec.js.snap index ed024d32475..136abaffb4e 100644 --- a/apps/dav/src/views/__snapshots__/CalDavSettings.spec.js.snap +++ b/apps/dav/src/views/__snapshots__/CalDavSettings.spec.js.snap @@ -72,18 +72,18 @@ exports[`CalDavSettings interactions 1`] = ` > <span class="checkbox-radio-switch checkbox-radio-switch-switch checkbox-radio-switch--checked" - data-v-2b31639e="" data-v-751c6bad="" + data-v-d423551e="" style="--icon-size: 36px;" > <label class="checkbox-radio-switch__label" - data-v-2b31639e="" + data-v-d423551e="" for="caldavSendInvitations" > <input class="checkbox-radio-switch__input" - data-v-2b31639e="" + data-v-d423551e="" id="caldavSendInvitations" type="checkbox" value="" @@ -92,7 +92,7 @@ exports[`CalDavSettings interactions 1`] = ` <span aria-hidden="true" class="material-design-icon toggle-switch-icon checkbox-radio-switch__icon" - data-v-2b31639e="" + data-v-d423551e="" role="img" > <svg @@ -133,18 +133,18 @@ exports[`CalDavSettings interactions 1`] = ` > <span class="checkbox-radio-switch checkbox checkbox-radio-switch-switch checkbox-radio-switch--checked" - data-v-2b31639e="" data-v-751c6bad="" + data-v-d423551e="" style="--icon-size: 36px;" > <label class="checkbox-radio-switch__label" - data-v-2b31639e="" + data-v-d423551e="" for="caldavGenerateBirthdayCalendar" > <input class="checkbox-radio-switch__input" - data-v-2b31639e="" + data-v-d423551e="" id="caldavGenerateBirthdayCalendar" type="checkbox" value="" @@ -153,7 +153,7 @@ exports[`CalDavSettings interactions 1`] = ` <span aria-hidden="true" class="material-design-icon toggle-switch-icon checkbox-radio-switch__icon" - data-v-2b31639e="" + data-v-d423551e="" role="img" > <svg @@ -202,18 +202,18 @@ exports[`CalDavSettings interactions 1`] = ` > <span class="checkbox-radio-switch checkbox-radio-switch-switch checkbox-radio-switch--checked" - data-v-2b31639e="" data-v-751c6bad="" + data-v-d423551e="" style="--icon-size: 36px;" > <label class="checkbox-radio-switch__label" - data-v-2b31639e="" + data-v-d423551e="" for="caldavSendEventReminders" > <input class="checkbox-radio-switch__input" - data-v-2b31639e="" + data-v-d423551e="" id="caldavSendEventReminders" type="checkbox" value="" @@ -222,7 +222,7 @@ exports[`CalDavSettings interactions 1`] = ` <span aria-hidden="true" class="material-design-icon toggle-switch-icon checkbox-radio-switch__icon" - data-v-2b31639e="" + data-v-d423551e="" role="img" > <svg @@ -276,18 +276,18 @@ exports[`CalDavSettings interactions 1`] = ` > <span class="checkbox-radio-switch checkbox-radio-switch-switch checkbox-radio-switch--checked" - data-v-2b31639e="" data-v-751c6bad="" + data-v-d423551e="" style="--icon-size: 36px;" > <label class="checkbox-radio-switch__label" - data-v-2b31639e="" + data-v-d423551e="" for="caldavSendEventRemindersToSharedGroupMembers" > <input class="checkbox-radio-switch__input" - data-v-2b31639e="" + data-v-d423551e="" id="caldavSendEventRemindersToSharedGroupMembers" type="checkbox" value="" @@ -296,7 +296,7 @@ exports[`CalDavSettings interactions 1`] = ` <span aria-hidden="true" class="material-design-icon toggle-switch-icon checkbox-radio-switch__icon" - data-v-2b31639e="" + data-v-d423551e="" role="img" > <svg @@ -334,18 +334,18 @@ exports[`CalDavSettings interactions 1`] = ` > <span class="checkbox-radio-switch checkbox-radio-switch-switch checkbox-radio-switch--checked" - data-v-2b31639e="" data-v-751c6bad="" + data-v-d423551e="" style="--icon-size: 36px;" > <label class="checkbox-radio-switch__label" - data-v-2b31639e="" + data-v-d423551e="" for="caldavSendEventRemindersPush" > <input class="checkbox-radio-switch__input" - data-v-2b31639e="" + data-v-d423551e="" id="caldavSendEventRemindersPush" type="checkbox" value="" @@ -354,7 +354,7 @@ exports[`CalDavSettings interactions 1`] = ` <span aria-hidden="true" class="material-design-icon toggle-switch-icon checkbox-radio-switch__icon" - data-v-2b31639e="" + data-v-d423551e="" role="img" > <svg diff --git a/apps/dav/tests/unit/BackgroundJob/CleanupInvitationTokenJobTest.php b/apps/dav/tests/unit/BackgroundJob/CleanupInvitationTokenJobTest.php index ee43bae5355..d3b7ca92581 100644 --- a/apps/dav/tests/unit/BackgroundJob/CleanupInvitationTokenJobTest.php +++ b/apps/dav/tests/unit/BackgroundJob/CleanupInvitationTokenJobTest.php @@ -76,7 +76,7 @@ class CleanupInvitationTokenJobTest extends TestCase { [1337, \PDO::PARAM_STR, null, 'namedParameter1337'] ]); - $function = 'fakefunction'; + $function = 'function1337'; $expr->expects($this->once()) ->method('lt') ->with('expiration', 'namedParameter1337') diff --git a/apps/dav/tests/unit/BackgroundJob/PruneOutdatedSyncTokensJobTest.php b/apps/dav/tests/unit/BackgroundJob/PruneOutdatedSyncTokensJobTest.php index 991caafd597..1de56b37d80 100644 --- a/apps/dav/tests/unit/BackgroundJob/PruneOutdatedSyncTokensJobTest.php +++ b/apps/dav/tests/unit/BackgroundJob/PruneOutdatedSyncTokensJobTest.php @@ -34,13 +34,14 @@ use OCA\DAV\BackgroundJob\PruneOutdatedSyncTokensJob; use OCA\DAV\CalDAV\CalDavBackend; use OCA\DAV\CardDAV\CardDavBackend; use OCP\AppFramework\Utility\ITimeFactory; -use OCP\DB\Exception; use OCP\IConfig; use PHPUnit\Framework\MockObject\MockObject; use Psr\Log\LoggerInterface; use Test\TestCase; class PruneOutdatedSyncTokensJobTest extends TestCase { + /** @var ITimeFactory | MockObject */ + private $timeFactory; /** @var CalDavBackend | MockObject */ private $calDavBackend; diff --git a/apps/dav/tests/unit/CalDAV/Reminder/ReminderServiceTest.php b/apps/dav/tests/unit/CalDAV/Reminder/ReminderServiceTest.php index 79d9376650b..e2b5390f875 100644 --- a/apps/dav/tests/unit/CalDAV/Reminder/ReminderServiceTest.php +++ b/apps/dav/tests/unit/CalDAV/Reminder/ReminderServiceTest.php @@ -40,13 +40,11 @@ use OCP\IConfig; use OCP\IGroupManager; use OCP\IUser; use OCP\IUserManager; -use OCP\IUserSession; use PHPUnit\Framework\MockObject\MockObject; use Psr\Log\LoggerInterface; use Test\TestCase; class ReminderServiceTest extends TestCase { - /** @var Backend|MockObject */ private $backend; @@ -74,6 +72,9 @@ class ReminderServiceTest extends TestCase { /** @var MockObject|LoggerInterface */ private $logger; + /** @var MockObject|Principal */ + private $principalConnector; + public const CALENDAR_DATA = <<<EOD BEGIN:VCALENDAR PRODID:-//Nextcloud calendar v1.6.4 diff --git a/apps/dav/tests/unit/CardDAV/Activity/BackendTest.php b/apps/dav/tests/unit/CardDAV/Activity/BackendTest.php index 4f3459233aa..bd5660747ff 100644 --- a/apps/dav/tests/unit/CardDAV/Activity/BackendTest.php +++ b/apps/dav/tests/unit/CardDAV/Activity/BackendTest.php @@ -40,7 +40,6 @@ use PHPUnit\Framework\MockObject\MockObject; use Test\TestCase; class BackendTest extends TestCase { - /** @var IManager|MockObject */ protected $activityManager; @@ -53,6 +52,9 @@ class BackendTest extends TestCase { /** @var IAppManager|MockObject */ protected $appManager; + /** @var IUserManager|MockObject */ + protected $userManager; + protected function setUp(): void { parent::setUp(); $this->activityManager = $this->createMock(IManager::class); diff --git a/apps/dav/tests/unit/Connector/Sabre/BlockLegacyClientPluginTest.php b/apps/dav/tests/unit/Connector/Sabre/BlockLegacyClientPluginTest.php index 4d2771132cc..e9d43f77cca 100644 --- a/apps/dav/tests/unit/Connector/Sabre/BlockLegacyClientPluginTest.php +++ b/apps/dav/tests/unit/Connector/Sabre/BlockLegacyClientPluginTest.php @@ -82,7 +82,7 @@ class BlockLegacyClientPluginTest extends TestCase { $this->config ->expects($this->once()) ->method('getSystemValue') - ->with('minimum.supported.desktop.version', '2.0.0') + ->with('minimum.supported.desktop.version', '2.3.0') ->willReturn('1.7.0'); $this->blockLegacyClientVersionPlugin->beforeHandler($request); @@ -117,7 +117,7 @@ class BlockLegacyClientPluginTest extends TestCase { $this->config ->expects($this->once()) ->method('getSystemValue') - ->with('minimum.supported.desktop.version', '2.0.0') + ->with('minimum.supported.desktop.version', '2.3.0') ->willReturn('1.7.0'); $this->blockLegacyClientVersionPlugin->beforeHandler($request); diff --git a/apps/dav/tests/unit/Connector/Sabre/PrincipalTest.php b/apps/dav/tests/unit/Connector/Sabre/PrincipalTest.php index 7cd31e3b8dd..2614f541613 100644 --- a/apps/dav/tests/unit/Connector/Sabre/PrincipalTest.php +++ b/apps/dav/tests/unit/Connector/Sabre/PrincipalTest.php @@ -54,7 +54,6 @@ use Sabre\DAV\PropPatch; use Test\TestCase; class PrincipalTest extends TestCase { - /** @var IUserManager | MockObject */ private $userManager; @@ -658,12 +657,12 @@ class PrincipalTest extends TestCase { $user2->method('getSystemEMailAddress')->willReturn('user2@foo.bar'); $user3 = $this->createMock(IUser::class); $user3->method('getUID')->willReturn('user3'); - $user2->method('getDisplayName')->willReturn('User 22'); - $user2->method('getSystemEMailAddress')->willReturn('user2@foo.bar123'); + $user3->method('getDisplayName')->willReturn('User 22'); + $user3->method('getSystemEMailAddress')->willReturn('user2@foo.bar123'); $user4 = $this->createMock(IUser::class); $user4->method('getUID')->willReturn('user4'); - $user2->method('getDisplayName')->willReturn('User 222'); - $user2->method('getSystemEMailAddress')->willReturn('user2@foo.bar456'); + $user4->method('getDisplayName')->willReturn('User 222'); + $user4->method('getSystemEMailAddress')->willReturn('user2@foo.bar456'); $this->userManager->expects($this->at(0)) ->method('searchDisplayName') diff --git a/apps/dav/tests/unit/Controller/InvitationResponseControllerTest.php b/apps/dav/tests/unit/Controller/InvitationResponseControllerTest.php index 3e6886964c9..fdbb69e6c0d 100644 --- a/apps/dav/tests/unit/Controller/InvitationResponseControllerTest.php +++ b/apps/dav/tests/unit/Controller/InvitationResponseControllerTest.php @@ -37,14 +37,12 @@ use OCP\AppFramework\Utility\ITimeFactory; use OCP\DB\IResult; use OCP\DB\QueryBuilder\IExpressionBuilder; use OCP\DB\QueryBuilder\IQueryBuilder; -use OCP\DB\QueryBuilder\IQueryFunction; use OCP\IDBConnection; use OCP\IRequest; use Sabre\VObject\ITip\Message; use Test\TestCase; class InvitationResponseControllerTest extends TestCase { - /** @var InvitationResponseController */ private $controller; @@ -478,7 +476,7 @@ EOF; ->with(\PDO::FETCH_ASSOC) ->willReturn($return); - $function = $this->createMock(IQueryFunction::class); + $function = 'functionToken'; $expr->expects($this->once()) ->method('eq') ->with('token', 'namedParameterToken') |