aboutsummaryrefslogtreecommitdiffstats
path: root/apps/dav
diff options
context:
space:
mode:
authorFaraz Samapoor <f.samapoor@gmail.com>2023-06-27 19:07:09 +0330
committerGitHub <noreply@github.com>2023-06-27 19:07:09 +0330
commitbbfe2fb821f00713f46fd896a41dfc62cc02c31a (patch)
tree22923a6d3a78f7f1d780e958ff118a669c6c8c63 /apps/dav
parent8c64ccae01ef3143a47dcca0b7ddb115d601c2f1 (diff)
parent266436b76788d14e061bbe1f013bc052edc8041f (diff)
downloadnextcloud-server-bbfe2fb821f00713f46fd896a41dfc62cc02c31a.tar.gz
nextcloud-server-bbfe2fb821f00713f46fd896a41dfc62cc02c31a.zip
Merge branch 'master' into replace_strpos_calls_in_dav_app
Signed-off-by: Faraz Samapoor <f.samapoor@gmail.com>
Diffstat (limited to 'apps/dav')
-rw-r--r--apps/dav/l10n/ar.js191
-rw-r--r--apps/dav/l10n/ar.json189
-rw-r--r--apps/dav/l10n/ca.js2
-rw-r--r--apps/dav/l10n/ca.json2
-rw-r--r--apps/dav/l10n/fr.js10
-rw-r--r--apps/dav/l10n/fr.json10
-rw-r--r--apps/dav/l10n/gl.js140
-rw-r--r--apps/dav/l10n/gl.json140
-rw-r--r--apps/dav/l10n/ko.js57
-rw-r--r--apps/dav/l10n/ko.json57
-rw-r--r--apps/dav/l10n/zh_CN.js34
-rw-r--r--apps/dav/l10n/zh_CN.json34
-rw-r--r--apps/dav/lib/CalDAV/CalDavBackend.php13
-rw-r--r--apps/dav/lib/CardDAV/CardDavBackend.php13
-rw-r--r--apps/dav/lib/CardDAV/Converter.php14
-rw-r--r--apps/dav/lib/CardDAV/SystemAddressbook.php2
-rw-r--r--apps/dav/lib/Comments/CommentNode.php4
-rw-r--r--apps/dav/lib/Comments/CommentsPlugin.php4
-rw-r--r--apps/dav/lib/Comments/EntityTypeCollection.php17
-rw-r--r--apps/dav/lib/Comments/RootCollection.php28
-rw-r--r--apps/dav/lib/Connector/Sabre/DavAclPlugin.php15
-rw-r--r--apps/dav/lib/Migration/Version1027Date20230504122946.php10
-rw-r--r--apps/dav/tests/unit/CalDAV/CalDavBackendTest.php74
-rw-r--r--apps/dav/tests/unit/CardDAV/CardDavBackendTest.php41
24 files changed, 822 insertions, 279 deletions
diff --git a/apps/dav/l10n/ar.js b/apps/dav/l10n/ar.js
new file mode 100644
index 00000000000..c29b5ae0b30
--- /dev/null
+++ b/apps/dav/l10n/ar.js
@@ -0,0 +1,191 @@
+OC.L10N.register(
+ "dav",
+ {
+ "Calendar" : "التقويم",
+ "To-dos" : "قائمة المهام",
+ "Personal" : "شخصي",
+ "{actor} created calendar {calendar}" : "{actor} قام بإنشاء تقويم {calendar}",
+ "You created calendar {calendar}" : "قمت بإنشاء التقويم {calendar}",
+ "{actor} deleted calendar {calendar}" : "{actor} قام بحذف التقويم {calendar}",
+ "You deleted calendar {calendar}" : "لقد قمت بحذف التقويم {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} حدّث التقويم {calendar}",
+ "You updated calendar {calendar}" : "لقد قمت بتحديث التقويم {calendar}",
+ "{actor} restored calendar {calendar}" : "{actor} استعاد التقويم {calendar}",
+ "You restored calendar {calendar}" : "أنت استعدت التقويم {calendar}",
+ "You shared calendar {calendar} as public link" : "أنت شاركت التقويم {calendar} كرابطٍ عموميٍ public link",
+ "You removed public link for calendar {calendar}" : "أنت ألغيب الرابط العمومي للتقويم {calendar}",
+ "{actor} shared calendar {calendar} with you" : "{actor} قام بمشاركة التقويم {calendar} معك",
+ "You shared calendar {calendar} with {user}" : "لقد قمت بمشاركة التقويم {calendar} مع {user}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} قام بمشاركة التقويم {calendar} مع {user}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} أزال مشاركة التقويم {calendar} منك",
+ "You unshared calendar {calendar} from {user}" : "لقد أزلت مشاركة التقويم {calendar} من {user}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} أزال مشاركة التقويم {calendar} من {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} أزال مشاركة التقويم {calendar} من نفسه",
+ "You shared calendar {calendar} with group {group}" : "أنت شاركت التقويم {calendar} مع المجموعة {group}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} شارك التقويم {calendar} مع المجموعة {group}",
+ "You unshared calendar {calendar} from group {group}" : "أنت أزلت مشاركة التقويم {calendar} من المجموعة {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} أزال مشاركة التقويم {calendar} من المجموعة {group}",
+ "Untitled event" : "حدث بدون اسم",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} أنشأ الحدث {event} في التقويم {calendar}",
+ "You created event {event} in calendar {calendar}" : "أنت أنشأت الحدث {event} في التقويم {calendar}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} حذف الحدث {event} من التقويم {calendar}",
+ "You deleted event {event} from calendar {calendar}" : "أنت حذفت الحدث {event} من التقويم {calendar}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} عدّل الحدث {event} في التقويم {calendar}",
+ "You updated event {event} in calendar {calendar}" : "أنت عدّلت الحدث {event} في التقويم {calendar}",
+ "{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} قام باستعادة الحدث {event} للتقويم {calendar}",
+ "You restored event {event} of calendar {calendar}" : "أنت قمت باستعادة الحدث {event} للتقويم {calendar}",
+ "Busy" : "مشغول",
+ "{actor} created to-do {todo} in list {calendar}" : "{actor} قائمة بإنشاء مهمة {todo} في القائمة {calendar}",
+ "You created to-do {todo} in list {calendar}" : "أنت قمت بإنشاء مهمة {todo} في القائمة {calendar}",
+ "{actor} deleted to-do {todo} from list {calendar}" : "{actor} قام بحذف مهمة {todo} من القائمة {calendar}",
+ "You deleted to-do {todo} from list {calendar}" : "أنت قمت بحذف مهمة {todo} من القائمة {calendar}",
+ "{actor} updated to-do {todo} in list {calendar}" : "{actor} قام بتعديل مهمة {todo} في القائمة {calendar}",
+ "You updated to-do {todo} in list {calendar}" : "أنت قمت بتعديل مهمة {todo} في القائمة {calendar}",
+ "{actor} solved to-do {todo} in list {calendar}" : "{actor} أنجز المهمة {todo} في القائمة{calendar}",
+ "You solved to-do {todo} in list {calendar}" : "أنت أنجزت المهمة {todo} في القائمة {calendar}",
+ "{actor} reopened to-do {todo} in list {calendar}" : "{actor} أعاد فتح المهمة {todo} في القائمة {calendar}",
+ "You reopened to-do {todo} in list {calendar}" : "أنت أعدت فتح المهمة {todo} في القائمة {calendar}",
+ "{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} قام بنقل المهمة {todo} من القائمة {sourceCalendar} إلى القائمة {targetCalendar}",
+ "You moved to-do {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> في تقويم تمّ تعديله",
+ "A calendar <strong>to-do</strong> was modified" : " <strong>مهمة</strong> في تقويم تمّ تعديلها",
+ "Contact birthdays" : "أعياد ميلاد جهات الاتصال",
+ "Death of %s" : "وفاة %s",
+ "Untitled calendar" : "تقويم بدون اسم",
+ "Calendar:" : "التقويم:",
+ "Date:" : "التاريخ:",
+ "Where:" : "المكان:",
+ "Description:" : "الوصف:",
+ "_%n minute_::_%n minutes_" : ["%n دقيقة","%n دقيقة","%n دقيقتيْن","%n دقائق","%n دقائق","%n دقائق"],
+ "%s (in %s)" : "%s (في %s)",
+ "%s (%s ago)" : "%s (%s مضت)",
+ "Calendar: %s" : "التقويم: %s",
+ "Date: %s" : "التاريخ: %s",
+ "Description: %s" : "الوصف: %s",
+ "Where: %s" : "المكان: %s",
+ "%1$s via %2$s" : "%1$s عبر %2$s",
+ "Cancelled: %1$s" : "مُلغىً: %1$s",
+ "\"%1$s\" has been canceled" : "\"%1$s\" تمّ إلغاؤه",
+ "Re: %1$s" : "إعادة: %1$s",
+ "%1$s has accepted your invitation" : "%1$s قبل دعوتك",
+ "%1$s has tentatively accepted your invitation" : "%1$s قبل دعوتك بشكل مبدئي",
+ "%1$s has declined your invitation" : "%1$s لم يقبل دعوتك",
+ "%1$s has responded to your invitation" : "%1$s استجاب لدعوتك",
+ "Invitation updated: %1$s" : "تحديث الدعوة: %1$s",
+ "%1$s updated the event \"%2$s\"" : "%1$s تحديث الحدث \"%2$s\"",
+ "Invitation: %1$s" : "دعوة: %1$s",
+ "%1$s would like to invite you to \"%2$s\"" : "%1$s يرغب في دعوتكم إلى \"%2$s\"",
+ "Organizer:" : "تنظيم:",
+ "Attendees:" : "الحُضُور:",
+ "Title:" : "العنوان:",
+ "Time:" : "الوقت:",
+ "Location:" : "المكان :",
+ "Link:" : "الرابط:",
+ "Accept" : "قبول",
+ "Decline" : "رفض",
+ "More options …" : "مزيد مِن الخيارات…",
+ "More options at %s" : "خيارات أخرى في %s",
+ "Contacts" : "المُراسِلون",
+ "{actor} created address book {addressbook}" : "{actor} أنشأ دفتر العناوين {addressbook}",
+ "You created address book {addressbook}" : "أنت أنشأت دفتر العناوين {addressbook}",
+ "{actor} deleted address book {addressbook}" : "{actor} قام بحذف دفتر العناوين {addressbook}",
+ "You deleted address book {addressbook}" : "أنت قمت بحذف دفتر العناوين {addressbook}",
+ "{actor} updated address book {addressbook}" : "{actor} قام بتعديل دفتر العناوين {addressbook}",
+ "You updated address book {addressbook}" : "أنت قمت بتعديل دفتر العناوين {addressbook}",
+ "{actor} shared address book {addressbook} with you" : "{actor} قام بمشاركة دفتر العناوين {addressbook} معك",
+ "You shared address book {addressbook} with {user}" : "أنت قمت بمشاركة دفتر العناوين {addressbook} مع {user}",
+ "{actor} shared address book {addressbook} with {user}" : "{actor} قام بمشاركة دفتر العناوين {addressbook} مع {user}",
+ "{actor} unshared address book {addressbook} from you" : "{actor} قام بإلغاء مشاركة دفتر العناوين {addressbook} معك",
+ "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}",
+ "You unshared address book {addressbook} from group {group}" : "أنت قمت بإلغاء مشاركة دفتر العناوين {addressbook} مع المجموعة {group}",
+ "{actor} unshared address book {addressbook} from group {group}" : "{actor} قام بإلغاء مشاركة دفتر العناوين {addressbook} مع المجموعة {group}",
+ "{actor} created contact {card} in address book {addressbook}" : "{actor} قام بإنشاء جهة اتصال {card} في دفتر العناوين {addressbook}",
+ "You created contact {card} in address book {addressbook}" : "أنت قمت بإنشاء جهة اتصال {card} في دفتر العناوين {addressbook}",
+ "{actor} deleted contact {card} from address book {addressbook}" : "{actor} قام بحذف جهة الاتصال {card} من دفتر العناوين {addressbook}",
+ "You deleted contact {card} from address book {addressbook}" : "أنت قمت بحذف جهة الاتصال {card} من دفتر العناوين {addressbook}",
+ "{actor} updated contact {card} in address book {addressbook}" : "{actor} قام بتحديث جهة الاتصال {card} في دفتر العناوين {addressbook}",
+ "You updated contact {card} in address book {addressbook}" : "أنت قمت بتحديث جهة الاتصال {card} في دفتر العناوين {addressbook}",
+ "A <strong>contact</strong> or <strong>address book</strong> was modified" : "تمّ تعديل <strong>جهة الاتصال</strong> أو <strong>دفتر العناوين</strong> ",
+ "Accounts" : "حسابات",
+ "System address book which holds all accounts" : "دفتر عناوين النظام الذي يحوي كل الحسابات",
+ "File is not updatable: %1$s" : "ملف غير قابل للتعديل: %1$s",
+ "Could not write to final file, canceled by hook" : "تعذرت الكتابة إلى الملف النهائي، تم إلغاؤه بواسطة خطّاف hook",
+ "Could not write file contents" : "تعذرت كتابة محتويات الملف",
+ "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." : "الحجم المتوقع للملف هو %1$s؛ بينما المقروء من ( الجهاز العميل لنكست كلاود) و المكتوب في (تخزين نكست كلاود) هو %2$s. يمكن أن يكون السبب إمّا مشكلة اتصال في جانب الجهاز العميل أو مشكلة في الكتابة في وحدة التخزين في جانب خادوم نكست كلاود .",
+ "Could not rename part file to final file, canceled by hook" : "تعذّرت إعادة تسمية ملف جزئي إلى ملف نهائي. تمّ الإلغاء من قِبَل الخطّاف 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" : "اسم كتلة chunk غير صحيح",
+ "Could not rename part file assembled from chunks" : "تعذّرت إعادة تسمية ملف جزئي مُجمّعٍ من كُتلٍ 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." : "%s الخاص بك يجب تهيئته لاستخدام HTTPS حتى يمكن استعمال CalDAV و CardDAV في نظام التشغيل iOS/macOS. ",
+ "Configures a CalDAV account" : "تكوين حساب CalDAV",
+ "Configures a CardDAV account" : "تكوين حساب CardDAV",
+ "Events" : "أحداث",
+ "Tasks" : "المهام",
+ "Untitled task" : "مهمة بدون اسم",
+ "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" : "النقطة الحدّيّة endpoint لـ WebDAV",
+ "Availability" : "أوقات التواجد availability",
+ "If you configure your working hours, other users will see when you are out of office when they book a meeting." : "إذا قمت بتهيئة ساعات العمل الخاصة بك، فسيظهر للمستخدمين الآخرين عندما يحجزون معك موعداً إذا ما كنت في المكتب أو خارجه.",
+ "Time zone:" : "منطقة زمنية:",
+ "to" : "إلى",
+ "Delete slot" : "حذف فُرَضَةٍ slot زمنيّةٍ",
+ "No working hours set" : "لم يتم تحديد ساعات العمل",
+ "Add slot" : "أضِف فُرَضَةً slot زمنيّةً",
+ "Monday" : "الإثنين",
+ "Tuesday" : "الثلاثاء",
+ "Wednesday" : "الأربعاء",
+ "Thursday" : "الخميس",
+ "Friday" : "الجمعة",
+ "Saturday" : "السبت",
+ "Sunday" : "الأحد",
+ "Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "قم بتعيين حالة المستخدم تلقائيًا على \"عدم الإزعاج\" خارج نطاق أوقات التوافر لكتم جميع الإشعارات",
+ "Save" : "حفظ",
+ "Failed to load availability" : "إخفاق في تحميل أوقات التوافر",
+ "Saved availability" : "تمّ حفظ أوقات التوافر",
+ "Failed to save availability" : "إخفاق في حفظ أوقات التواجد",
+ "Calendar server" : "خادوم التقويم",
+ "Send invitations to attendees" : "إرسال دعوات للمُستهدفين بالحُضُُور",
+ "Automatically generate a birthday calendar" : "تجاهل تقويم أعياد الميلاد تلقائيّاً",
+ "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." : "ومن ثمّ لن تكون متاحةً فور التفعيل بل ستظهر بعد مرور بعض الوقت.",
+ "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" : "تمكين الإشعارات حول الأحداث عبر الزّجّ 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}.",
+ "There was an error updating your attendance status." : "حدث خطأ في تحديث حالة حضورك.",
+ "Please contact the organizer directly." : "رجاءً، تواصل مع المُنظّم أو المُنظّمين مُباشرةً.",
+ "Are you accepting the invitation?" : "هل تقبل الدعوة؟",
+ "Tentative" : "مبدئي",
+ "Your attendance was updated successfully." : "حضورك تم تحديثه بنجاحٍ",
+ "Invitation canceled" : "تمّ إلغاء الدعوة",
+ "Invitation updated" : "تمّ تعديل الدعوة",
+ "Invitation" : "دعوة"
+},
+"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;");
diff --git a/apps/dav/l10n/ar.json b/apps/dav/l10n/ar.json
new file mode 100644
index 00000000000..2f5dd3da247
--- /dev/null
+++ b/apps/dav/l10n/ar.json
@@ -0,0 +1,189 @@
+{ "translations": {
+ "Calendar" : "التقويم",
+ "To-dos" : "قائمة المهام",
+ "Personal" : "شخصي",
+ "{actor} created calendar {calendar}" : "{actor} قام بإنشاء تقويم {calendar}",
+ "You created calendar {calendar}" : "قمت بإنشاء التقويم {calendar}",
+ "{actor} deleted calendar {calendar}" : "{actor} قام بحذف التقويم {calendar}",
+ "You deleted calendar {calendar}" : "لقد قمت بحذف التقويم {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} حدّث التقويم {calendar}",
+ "You updated calendar {calendar}" : "لقد قمت بتحديث التقويم {calendar}",
+ "{actor} restored calendar {calendar}" : "{actor} استعاد التقويم {calendar}",
+ "You restored calendar {calendar}" : "أنت استعدت التقويم {calendar}",
+ "You shared calendar {calendar} as public link" : "أنت شاركت التقويم {calendar} كرابطٍ عموميٍ public link",
+ "You removed public link for calendar {calendar}" : "أنت ألغيب الرابط العمومي للتقويم {calendar}",
+ "{actor} shared calendar {calendar} with you" : "{actor} قام بمشاركة التقويم {calendar} معك",
+ "You shared calendar {calendar} with {user}" : "لقد قمت بمشاركة التقويم {calendar} مع {user}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} قام بمشاركة التقويم {calendar} مع {user}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} أزال مشاركة التقويم {calendar} منك",
+ "You unshared calendar {calendar} from {user}" : "لقد أزلت مشاركة التقويم {calendar} من {user}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} أزال مشاركة التقويم {calendar} من {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} أزال مشاركة التقويم {calendar} من نفسه",
+ "You shared calendar {calendar} with group {group}" : "أنت شاركت التقويم {calendar} مع المجموعة {group}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} شارك التقويم {calendar} مع المجموعة {group}",
+ "You unshared calendar {calendar} from group {group}" : "أنت أزلت مشاركة التقويم {calendar} من المجموعة {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} أزال مشاركة التقويم {calendar} من المجموعة {group}",
+ "Untitled event" : "حدث بدون اسم",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} أنشأ الحدث {event} في التقويم {calendar}",
+ "You created event {event} in calendar {calendar}" : "أنت أنشأت الحدث {event} في التقويم {calendar}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} حذف الحدث {event} من التقويم {calendar}",
+ "You deleted event {event} from calendar {calendar}" : "أنت حذفت الحدث {event} من التقويم {calendar}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} عدّل الحدث {event} في التقويم {calendar}",
+ "You updated event {event} in calendar {calendar}" : "أنت عدّلت الحدث {event} في التقويم {calendar}",
+ "{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} قام باستعادة الحدث {event} للتقويم {calendar}",
+ "You restored event {event} of calendar {calendar}" : "أنت قمت باستعادة الحدث {event} للتقويم {calendar}",
+ "Busy" : "مشغول",
+ "{actor} created to-do {todo} in list {calendar}" : "{actor} قائمة بإنشاء مهمة {todo} في القائمة {calendar}",
+ "You created to-do {todo} in list {calendar}" : "أنت قمت بإنشاء مهمة {todo} في القائمة {calendar}",
+ "{actor} deleted to-do {todo} from list {calendar}" : "{actor} قام بحذف مهمة {todo} من القائمة {calendar}",
+ "You deleted to-do {todo} from list {calendar}" : "أنت قمت بحذف مهمة {todo} من القائمة {calendar}",
+ "{actor} updated to-do {todo} in list {calendar}" : "{actor} قام بتعديل مهمة {todo} في القائمة {calendar}",
+ "You updated to-do {todo} in list {calendar}" : "أنت قمت بتعديل مهمة {todo} في القائمة {calendar}",
+ "{actor} solved to-do {todo} in list {calendar}" : "{actor} أنجز المهمة {todo} في القائمة{calendar}",
+ "You solved to-do {todo} in list {calendar}" : "أنت أنجزت المهمة {todo} في القائمة {calendar}",
+ "{actor} reopened to-do {todo} in list {calendar}" : "{actor} أعاد فتح المهمة {todo} في القائمة {calendar}",
+ "You reopened to-do {todo} in list {calendar}" : "أنت أعدت فتح المهمة {todo} في القائمة {calendar}",
+ "{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} قام بنقل المهمة {todo} من القائمة {sourceCalendar} إلى القائمة {targetCalendar}",
+ "You moved to-do {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> في تقويم تمّ تعديله",
+ "A calendar <strong>to-do</strong> was modified" : " <strong>مهمة</strong> في تقويم تمّ تعديلها",
+ "Contact birthdays" : "أعياد ميلاد جهات الاتصال",
+ "Death of %s" : "وفاة %s",
+ "Untitled calendar" : "تقويم بدون اسم",
+ "Calendar:" : "التقويم:",
+ "Date:" : "التاريخ:",
+ "Where:" : "المكان:",
+ "Description:" : "الوصف:",
+ "_%n minute_::_%n minutes_" : ["%n دقيقة","%n دقيقة","%n دقيقتيْن","%n دقائق","%n دقائق","%n دقائق"],
+ "%s (in %s)" : "%s (في %s)",
+ "%s (%s ago)" : "%s (%s مضت)",
+ "Calendar: %s" : "التقويم: %s",
+ "Date: %s" : "التاريخ: %s",
+ "Description: %s" : "الوصف: %s",
+ "Where: %s" : "المكان: %s",
+ "%1$s via %2$s" : "%1$s عبر %2$s",
+ "Cancelled: %1$s" : "مُلغىً: %1$s",
+ "\"%1$s\" has been canceled" : "\"%1$s\" تمّ إلغاؤه",
+ "Re: %1$s" : "إعادة: %1$s",
+ "%1$s has accepted your invitation" : "%1$s قبل دعوتك",
+ "%1$s has tentatively accepted your invitation" : "%1$s قبل دعوتك بشكل مبدئي",
+ "%1$s has declined your invitation" : "%1$s لم يقبل دعوتك",
+ "%1$s has responded to your invitation" : "%1$s استجاب لدعوتك",
+ "Invitation updated: %1$s" : "تحديث الدعوة: %1$s",
+ "%1$s updated the event \"%2$s\"" : "%1$s تحديث الحدث \"%2$s\"",
+ "Invitation: %1$s" : "دعوة: %1$s",
+ "%1$s would like to invite you to \"%2$s\"" : "%1$s يرغب في دعوتكم إلى \"%2$s\"",
+ "Organizer:" : "تنظيم:",
+ "Attendees:" : "الحُضُور:",
+ "Title:" : "العنوان:",
+ "Time:" : "الوقت:",
+ "Location:" : "المكان :",
+ "Link:" : "الرابط:",
+ "Accept" : "قبول",
+ "Decline" : "رفض",
+ "More options …" : "مزيد مِن الخيارات…",
+ "More options at %s" : "خيارات أخرى في %s",
+ "Contacts" : "المُراسِلون",
+ "{actor} created address book {addressbook}" : "{actor} أنشأ دفتر العناوين {addressbook}",
+ "You created address book {addressbook}" : "أنت أنشأت دفتر العناوين {addressbook}",
+ "{actor} deleted address book {addressbook}" : "{actor} قام بحذف دفتر العناوين {addressbook}",
+ "You deleted address book {addressbook}" : "أنت قمت بحذف دفتر العناوين {addressbook}",
+ "{actor} updated address book {addressbook}" : "{actor} قام بتعديل دفتر العناوين {addressbook}",
+ "You updated address book {addressbook}" : "أنت قمت بتعديل دفتر العناوين {addressbook}",
+ "{actor} shared address book {addressbook} with you" : "{actor} قام بمشاركة دفتر العناوين {addressbook} معك",
+ "You shared address book {addressbook} with {user}" : "أنت قمت بمشاركة دفتر العناوين {addressbook} مع {user}",
+ "{actor} shared address book {addressbook} with {user}" : "{actor} قام بمشاركة دفتر العناوين {addressbook} مع {user}",
+ "{actor} unshared address book {addressbook} from you" : "{actor} قام بإلغاء مشاركة دفتر العناوين {addressbook} معك",
+ "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}",
+ "You unshared address book {addressbook} from group {group}" : "أنت قمت بإلغاء مشاركة دفتر العناوين {addressbook} مع المجموعة {group}",
+ "{actor} unshared address book {addressbook} from group {group}" : "{actor} قام بإلغاء مشاركة دفتر العناوين {addressbook} مع المجموعة {group}",
+ "{actor} created contact {card} in address book {addressbook}" : "{actor} قام بإنشاء جهة اتصال {card} في دفتر العناوين {addressbook}",
+ "You created contact {card} in address book {addressbook}" : "أنت قمت بإنشاء جهة اتصال {card} في دفتر العناوين {addressbook}",
+ "{actor} deleted contact {card} from address book {addressbook}" : "{actor} قام بحذف جهة الاتصال {card} من دفتر العناوين {addressbook}",
+ "You deleted contact {card} from address book {addressbook}" : "أنت قمت بحذف جهة الاتصال {card} من دفتر العناوين {addressbook}",
+ "{actor} updated contact {card} in address book {addressbook}" : "{actor} قام بتحديث جهة الاتصال {card} في دفتر العناوين {addressbook}",
+ "You updated contact {card} in address book {addressbook}" : "أنت قمت بتحديث جهة الاتصال {card} في دفتر العناوين {addressbook}",
+ "A <strong>contact</strong> or <strong>address book</strong> was modified" : "تمّ تعديل <strong>جهة الاتصال</strong> أو <strong>دفتر العناوين</strong> ",
+ "Accounts" : "حسابات",
+ "System address book which holds all accounts" : "دفتر عناوين النظام الذي يحوي كل الحسابات",
+ "File is not updatable: %1$s" : "ملف غير قابل للتعديل: %1$s",
+ "Could not write to final file, canceled by hook" : "تعذرت الكتابة إلى الملف النهائي، تم إلغاؤه بواسطة خطّاف hook",
+ "Could not write file contents" : "تعذرت كتابة محتويات الملف",
+ "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." : "الحجم المتوقع للملف هو %1$s؛ بينما المقروء من ( الجهاز العميل لنكست كلاود) و المكتوب في (تخزين نكست كلاود) هو %2$s. يمكن أن يكون السبب إمّا مشكلة اتصال في جانب الجهاز العميل أو مشكلة في الكتابة في وحدة التخزين في جانب خادوم نكست كلاود .",
+ "Could not rename part file to final file, canceled by hook" : "تعذّرت إعادة تسمية ملف جزئي إلى ملف نهائي. تمّ الإلغاء من قِبَل الخطّاف 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" : "اسم كتلة chunk غير صحيح",
+ "Could not rename part file assembled from chunks" : "تعذّرت إعادة تسمية ملف جزئي مُجمّعٍ من كُتلٍ 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." : "%s الخاص بك يجب تهيئته لاستخدام HTTPS حتى يمكن استعمال CalDAV و CardDAV في نظام التشغيل iOS/macOS. ",
+ "Configures a CalDAV account" : "تكوين حساب CalDAV",
+ "Configures a CardDAV account" : "تكوين حساب CardDAV",
+ "Events" : "أحداث",
+ "Tasks" : "المهام",
+ "Untitled task" : "مهمة بدون اسم",
+ "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" : "النقطة الحدّيّة endpoint لـ WebDAV",
+ "Availability" : "أوقات التواجد availability",
+ "If you configure your working hours, other users will see when you are out of office when they book a meeting." : "إذا قمت بتهيئة ساعات العمل الخاصة بك، فسيظهر للمستخدمين الآخرين عندما يحجزون معك موعداً إذا ما كنت في المكتب أو خارجه.",
+ "Time zone:" : "منطقة زمنية:",
+ "to" : "إلى",
+ "Delete slot" : "حذف فُرَضَةٍ slot زمنيّةٍ",
+ "No working hours set" : "لم يتم تحديد ساعات العمل",
+ "Add slot" : "أضِف فُرَضَةً slot زمنيّةً",
+ "Monday" : "الإثنين",
+ "Tuesday" : "الثلاثاء",
+ "Wednesday" : "الأربعاء",
+ "Thursday" : "الخميس",
+ "Friday" : "الجمعة",
+ "Saturday" : "السبت",
+ "Sunday" : "الأحد",
+ "Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "قم بتعيين حالة المستخدم تلقائيًا على \"عدم الإزعاج\" خارج نطاق أوقات التوافر لكتم جميع الإشعارات",
+ "Save" : "حفظ",
+ "Failed to load availability" : "إخفاق في تحميل أوقات التوافر",
+ "Saved availability" : "تمّ حفظ أوقات التوافر",
+ "Failed to save availability" : "إخفاق في حفظ أوقات التواجد",
+ "Calendar server" : "خادوم التقويم",
+ "Send invitations to attendees" : "إرسال دعوات للمُستهدفين بالحُضُُور",
+ "Automatically generate a birthday calendar" : "تجاهل تقويم أعياد الميلاد تلقائيّاً",
+ "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." : "ومن ثمّ لن تكون متاحةً فور التفعيل بل ستظهر بعد مرور بعض الوقت.",
+ "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" : "تمكين الإشعارات حول الأحداث عبر الزّجّ 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}.",
+ "There was an error updating your attendance status." : "حدث خطأ في تحديث حالة حضورك.",
+ "Please contact the organizer directly." : "رجاءً، تواصل مع المُنظّم أو المُنظّمين مُباشرةً.",
+ "Are you accepting the invitation?" : "هل تقبل الدعوة؟",
+ "Tentative" : "مبدئي",
+ "Your attendance was updated successfully." : "حضورك تم تحديثه بنجاحٍ",
+ "Invitation canceled" : "تمّ إلغاء الدعوة",
+ "Invitation updated" : "تمّ تعديل الدعوة",
+ "Invitation" : "دعوة"
+},"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
+} \ No newline at end of file
diff --git a/apps/dav/l10n/ca.js b/apps/dav/l10n/ca.js
index 8c5a24aa162..581bb4ccc10 100644
--- a/apps/dav/l10n/ca.js
+++ b/apps/dav/l10n/ca.js
@@ -65,7 +65,7 @@ OC.L10N.register(
"_%n day_::_%n days_" : ["%n dia","%n dies"],
"_%n hour_::_%n hours_" : ["%n hora","%n hores"],
"_%n minute_::_%n minutes_" : ["%n minut","%n minuts"],
- "%s (in %s)" : "%s (d'aquí %s)",
+ "%s (in %s)" : "%s (d'aquí a %s)",
"%s (%s ago)" : "%s (fa %s)",
"Calendar: %s" : "Calendari: %s",
"Date: %s" : "Data: %s",
diff --git a/apps/dav/l10n/ca.json b/apps/dav/l10n/ca.json
index 6b92dedc53e..522bc984fba 100644
--- a/apps/dav/l10n/ca.json
+++ b/apps/dav/l10n/ca.json
@@ -63,7 +63,7 @@
"_%n day_::_%n days_" : ["%n dia","%n dies"],
"_%n hour_::_%n hours_" : ["%n hora","%n hores"],
"_%n minute_::_%n minutes_" : ["%n minut","%n minuts"],
- "%s (in %s)" : "%s (d'aquí %s)",
+ "%s (in %s)" : "%s (d'aquí a %s)",
"%s (%s ago)" : "%s (fa %s)",
"Calendar: %s" : "Calendari: %s",
"Date: %s" : "Data: %s",
diff --git a/apps/dav/l10n/fr.js b/apps/dav/l10n/fr.js
index c9cdeea5ff3..d4547b65fb1 100644
--- a/apps/dav/l10n/fr.js
+++ b/apps/dav/l10n/fr.js
@@ -153,7 +153,7 @@ OC.L10N.register(
"Contacts and groups" : "Contacts et groupes",
"WebDAV" : "WebDAV",
"WebDAV endpoint" : "Point d'accès WebDAV",
- "Availability" : "Disponibilité",
+ "Availability" : "Disponibilités",
"If you configure your working hours, other users will see when you are out of office when they book a meeting." : "Si vous configurez vos heures de travail, les autres utilisateurs verront si vous êtes disponible quand ils planifient une réunion.",
"Time zone:" : "Fuseau horaire :",
"to" : "à",
@@ -167,11 +167,11 @@ OC.L10N.register(
"Friday" : "Vendredi",
"Saturday" : "Samedi",
"Sunday" : "Dimanche",
- "Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "Définir automatiquement le statut \"Ne pas déranger\" en dehors des heures de disponibilité pour désactiver toutes les notifications.",
+ "Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "Définir automatiquement le statut \"Ne pas déranger\" en dehors des heures de disponibilités pour désactiver toutes les notifications.",
"Save" : "Enregistrer",
- "Failed to load availability" : "Impossible de charger la disponibilité",
- "Saved availability" : "Disponibilité sauvegardée",
- "Failed to save availability" : "Impossible de sauvegarder la disponibilité",
+ "Failed to load availability" : "Impossible de charger les disponibilités",
+ "Saved availability" : "Disponibilités sauvegardées",
+ "Failed to save availability" : "Impossible de sauvegarder les disponibilités",
"Calendar server" : "Serveur de calendrier",
"Send invitations to attendees" : "Envoyer des invitations aux participants",
"Automatically generate a birthday calendar" : "Générer automatiquement un agenda d'anniversaire",
diff --git a/apps/dav/l10n/fr.json b/apps/dav/l10n/fr.json
index ae4887e0ce1..672f4174af3 100644
--- a/apps/dav/l10n/fr.json
+++ b/apps/dav/l10n/fr.json
@@ -151,7 +151,7 @@
"Contacts and groups" : "Contacts et groupes",
"WebDAV" : "WebDAV",
"WebDAV endpoint" : "Point d'accès WebDAV",
- "Availability" : "Disponibilité",
+ "Availability" : "Disponibilités",
"If you configure your working hours, other users will see when you are out of office when they book a meeting." : "Si vous configurez vos heures de travail, les autres utilisateurs verront si vous êtes disponible quand ils planifient une réunion.",
"Time zone:" : "Fuseau horaire :",
"to" : "à",
@@ -165,11 +165,11 @@
"Friday" : "Vendredi",
"Saturday" : "Samedi",
"Sunday" : "Dimanche",
- "Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "Définir automatiquement le statut \"Ne pas déranger\" en dehors des heures de disponibilité pour désactiver toutes les notifications.",
+ "Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "Définir automatiquement le statut \"Ne pas déranger\" en dehors des heures de disponibilités pour désactiver toutes les notifications.",
"Save" : "Enregistrer",
- "Failed to load availability" : "Impossible de charger la disponibilité",
- "Saved availability" : "Disponibilité sauvegardée",
- "Failed to save availability" : "Impossible de sauvegarder la disponibilité",
+ "Failed to load availability" : "Impossible de charger les disponibilités",
+ "Saved availability" : "Disponibilités sauvegardées",
+ "Failed to save availability" : "Impossible de sauvegarder les disponibilités",
"Calendar server" : "Serveur de calendrier",
"Send invitations to attendees" : "Envoyer des invitations aux participants",
"Automatically generate a birthday calendar" : "Générer automatiquement un agenda d'anniversaire",
diff --git a/apps/dav/l10n/gl.js b/apps/dav/l10n/gl.js
index 1bbc6a1afb5..288ad39f189 100644
--- a/apps/dav/l10n/gl.js
+++ b/apps/dav/l10n/gl.js
@@ -5,13 +5,13 @@ OC.L10N.register(
"To-dos" : "Tarefas pendentes",
"Personal" : "Persoal",
"{actor} created calendar {calendar}" : "{actor} creou o calendario {calendar}",
- "You created calendar {calendar}" : "Vostede creou o calendario {calendar}",
+ "You created calendar {calendar}" : "Creou o calendario {calendar}",
"{actor} deleted calendar {calendar}" : "{actor} eliminou o calendario {calendar}",
- "You deleted calendar {calendar}" : "Vostede eliminou o calendario {calendar}",
+ "You deleted calendar {calendar}" : "Eliminou o calendario {calendar}",
"{actor} updated calendar {calendar}" : "{actor} actualizou o calendario {calendar}",
"You updated calendar {calendar}" : "Vostede actualizou o calendario {calendar}",
"{actor} restored calendar {calendar}" : "{actor} restaurou o calendario {calendar}",
- "You restored calendar {calendar}" : "Restauraches o calendario {calendar}",
+ "You restored calendar {calendar}" : "Vostede restaurou o calendario {calendar}",
"You shared calendar {calendar} as public link" : "Vostede compartiu o calendario {calendar} como ligazón pública",
"You removed public link for calendar {calendar}" : "Vostede retirou a ligazón pública do calendario {calendar}",
"{actor} shared calendar {calendar} with you" : "{actor} compartiu o calendario {calendar} con vostede",
@@ -33,26 +33,26 @@ OC.L10N.register(
"{actor} updated event {event} in calendar {calendar}" : "{actor} actualizou o evento {event} no calendario {calendar}",
"You updated event {event} in calendar {calendar}" : "Vostede actualizou o evento {event} no calendario {calendar}",
"{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} moveu o evento {event} do calendario {sourceCalendar} ao calendario {targetCalendar}",
- "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "Moveches o evento {evento} do calendario {sourceCalendar} ao calendario {targetCalendar}",
+ "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "Moveu o evento {evento} do calendario {sourceCalendar} ao calendario {targetCalendar}",
"{actor} restored event {event} of calendar {calendar}" : "{actor} restaurou o evento {evento} do calendario {calendar}",
- "You restored event {event} of calendar {calendar}" : "Restauraches o evento {evento} do calendario {calendar}",
+ "You restored event {event} of calendar {calendar}" : "Restaurou o evento {evento} do calendario {calendar}",
"Busy" : "Ocupado",
- "{actor} created to-do {todo} in list {calendar}" : "{actor} creou as tarefas {todo} na lista {calendar}",
- "You created to-do {todo} in list {calendar}" : "Creaches a tarefa {todo} na lista {calendar}",
- "{actor} deleted to-do {todo} from list {calendar}" : "{actor} eliminou as tarefas pendentes {todo} da lista {calendar}",
- "You deleted to-do {todo} from list {calendar}" : "Eliminaches as tarefas pendentes {todo} da lista {calendar}",
- "{actor} updated to-do {todo} in list {calendar}" : "{actor} actualizou a tarefa {todo} na lista {calendar}",
- "You updated to-do {todo} in list {calendar}" : "Actualizaches a tarefa {todo} na lista {calendar}",
- "{actor} solved to-do {todo} in list {calendar}" : "{actor} resolveu as tarefas {todo} na lista {calendar}",
- "You solved to-do {todo} in list {calendar}" : "Resolveches a tarefa {todo} na lista {calendar}",
- "{actor} reopened to-do {todo} in list {calendar}" : "{actor} reabriu as tarefas {todo} na lista {calendar}",
- "You reopened to-do {todo} in list {calendar}" : "Reabriches as tarefas {todo} na lista {calendar}",
- "{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} moveu a tarefa {todo} da lista {sourceCalendar} á lista {targetCalendar}",
- "You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "Moveches a tarefa {todo} da lista {sourceCalendar} á lista {targetCalendar}",
+ "{actor} created to-do {todo} in list {calendar}" : "{actor} creou a tarefa pendente {todo} na lista {calendar}",
+ "You created to-do {todo} in list {calendar}" : "Creou a tarefa pendente {todo} na lista {calendar}",
+ "{actor} deleted to-do {todo} from list {calendar}" : "{actor} eliminou a tarefa pendente {todo} da lista {calendar}",
+ "You deleted to-do {todo} from list {calendar}" : "Eliminou a tarefa pendente {todo} da lista {calendar}",
+ "{actor} updated to-do {todo} in list {calendar}" : "{actor} actualizou a tarefa pendente {todo} na lista {calendar}",
+ "You updated to-do {todo} in list {calendar}" : "Actualizou a tarefa pendente {todo} na lista {calendar}",
+ "{actor} solved to-do {todo} in list {calendar}" : "{actor} resolveu a tarefa pendente {todo} na lista {calendar}",
+ "You solved to-do {todo} in list {calendar}" : "Resolveu a tarefa pendente {todo} na lista {calendar}",
+ "{actor} reopened to-do {todo} in list {calendar}" : "{actor} reabriu a tarefa pendente {todo} na lista {calendar}",
+ "You reopened to-do {todo} in list {calendar}" : "Reabriu a tarefa pendente {todo} na lista {calendar}",
+ "{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} moveu a tarefa pendente {todo} da lista {sourceCalendar} á lista {targetCalendar}",
+ "You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "Moveu a tarefa pendente {todo} da lista {sourceCalendar} á lista {targetCalendar}",
"Calendar, contacts and tasks" : "Calendario, contactos e tarefas",
"A <strong>calendar</strong> was modified" : "Foi modificado un <strong>calendario</strong>",
"A calendar <strong>event</strong> was modified" : "Foi modificado un <strong>evento</strong> do calendario",
- "A calendar <strong>to-do</strong> was modified" : "Modificouse unha <strong>tarefa</strong> do calendario",
+ "A calendar <strong>to-do</strong> was modified" : "Modificouse unha <strong>tarefa pendente</strong> do calendario",
"Contact birthdays" : "Aniversario do contacto",
"Death of %s" : "Falecemento de %s",
"Untitled calendar" : "Calendario sen título",
@@ -73,16 +73,16 @@ OC.L10N.register(
"Where: %s" : "Onde: %s",
"%1$s via %2$s" : "%1$s mediante %2$s",
"Cancelled: %1$s" : "Cancelado: %1$s",
- "\"%1$s\" has been canceled" : "\"%1$s\" cancelouse",
+ "\"%1$s\" has been canceled" : "Cancelouse «%1$s»",
"Re: %1$s" : "Re: %1$s",
- "%1$s has accepted your invitation" : "%1$s aceptou a túa invitación",
- "%1$s has tentatively accepted your invitation" : "%1$s aceptou provisionalmente a túa invitación",
- "%1$s has declined your invitation" : "%1$s rexeitou a túa invitación",
- "%1$s has responded to your invitation" : "%1$s respondeu á túa invitación",
- "Invitation updated: %1$s" : "Invitación actualizada: %1$s",
- "%1$s updated the event \"%2$s\"" : "%1$s actualizou o evento \"%2$s\"",
- "Invitation: %1$s" : "Invitación: %1$s",
- "%1$s would like to invite you to \"%2$s\"" : "%1$s quere invitarte a \"%2$s\"",
+ "%1$s has accepted your invitation" : "%1$s aceptou o seu convite",
+ "%1$s has tentatively accepted your invitation" : "%1$s aceptou provisionalmente o seu convite",
+ "%1$s has declined your invitation" : "%1$s rexeitou o seu convite",
+ "%1$s has responded to your invitation" : "%1$s respondeu ao seu convite",
+ "Invitation updated: %1$s" : "Convite actualizado: %1$s",
+ "%1$s updated the event \"%2$s\"" : "%1$s actualizou o evento «%2$s»",
+ "Invitation: %1$s" : "Convite: %1$s",
+ "%1$s would like to invite you to \"%2$s\"" : "%1$s quere convidalo a «%2$s»",
"Organizer:" : "Organizador:",
"Attendees:" : "Asistentes:",
"Title:" : "Título:",
@@ -94,49 +94,51 @@ OC.L10N.register(
"More options …" : "Máis opcións…",
"More options at %s" : "Máis opcións en %s",
"Contacts" : "Contactos",
- "{actor} created address book {addressbook}" : "{actor} creou a axenda de enderezos {addressbook}",
- "You created address book {addressbook}" : "Creaches a axenda de enderezos {addressbook}",
- "{actor} deleted address book {addressbook}" : "{actor} eliminou a axenda de enderezos {addressbook}",
- "You deleted address book {addressbook}" : "Eliminaches a axenda de enderezos {addressbook}",
- "{actor} updated address book {addressbook}" : "{actor} actualizou a axenda de enderezos {addressbook}",
- "You updated address book {addressbook}" : "Actualizaches a axenda de enderezos {addressbook}",
- "{actor} shared address book {addressbook} with you" : "{actor} compartiu a axenda de enderezos {addressbook} contigo",
- "You shared address book {addressbook} with {user}" : "Compartiches a axenda de enderezos {addressbook} con {user}",
- "{actor} shared address book {addressbook} with {user}" : "{actor} compartiu a axenda de enderezos {addressbook} con {user}",
- "{actor} unshared address book {addressbook} from you" : "{actor} deixou de compartir a túa axenda de enderezos {addressbook}",
- "You unshared address book {addressbook} from {user}" : "Deixaches de compartir a axenda de enderezos {addressbook} de {user}",
- "{actor} unshared address book {addressbook} from {user}" : "{actor} deixou de compartir a axenda de enderezos {addressbook} de {user}",
- "{actor} unshared address book {addressbook} from themselves" : "{actor} deixaron de compartir a súa axenda de enderezos {addressbook}",
- "You shared address book {addressbook} with group {group}" : "Compartiches a axenda de enderezos {addressbook} co grupo {group}",
- "{actor} shared address book {addressbook} with group {group}" : "{actor} compartiu a axenda de enderezos {addressbook} co grupo {group}",
- "You unshared address book {addressbook} from group {group}" : "Deixaches de compartir a axenda de enderezos {addressbook} do grupo {group}",
- "{actor} unshared address book {addressbook} from group {group}" : "{actor} deixou de compartir axenda de enderezos {addressbook} do grupo {group}",
- "{actor} created contact {card} in address book {addressbook}" : "{actor} creou o contacto {card} na axenda de enderezos {addressbook}",
- "You created contact {card} in address book {addressbook}" : "Creaches o contacto {card} na axenda de enderezos {addressbook}",
- "{actor} deleted contact {card} from address book {addressbook}" : "{actor} eliminou o contacto {card} da axenda de enderezos {addressbook}",
- "You deleted contact {card} from address book {addressbook}" : "Eliminaches o contacto {card} da axenda de enderezos {addressbook}",
- "{actor} updated contact {card} in address book {addressbook}" : "{actor} actualizou o contacto {card} na axenda de enderezos {addressbook}",
- "You updated contact {card} in address book {addressbook}" : "Actualizaches o contacto {card} na axenda de enderezos {addressbook}",
- "A <strong>contact</strong> or <strong>address book</strong> was modified" : "Modificouse un <strong>contacto</strong> ou <strong>axenda de enderezos</strong>",
- "File is not updatable: %1$s" : "O ficheiro non se pode actualizar: %1$s",
- "Could not write to final file, canceled by hook" : "Non foi posíbel escribir no ficheiro final, cancelouse polo hook",
- "Could not write file contents" : "Non se puido escribir o contido do ficheiro",
+ "{actor} created address book {addressbook}" : "{actor} creou o caderno de enderezos {addressbook}",
+ "You created address book {addressbook}" : "Vostede creou o caderno de enderezos {addressbook}",
+ "{actor} deleted address book {addressbook}" : "{actor} eliminou o caderno de enderezos {addressbook}",
+ "You deleted address book {addressbook}" : "Vostede eliminou o caderno de enderezos {addressbook}",
+ "{actor} updated address book {addressbook}" : "{actor} actualizou o caderno de enderezos {addressbook}",
+ "You updated address book {addressbook}" : "Vostede actualizou o caderno de enderezos {addressbook}",
+ "{actor} shared address book {addressbook} with you" : "{actor} compartiu o caderno de enderezos {addressbook} con vostede",
+ "You shared address book {addressbook} with {user}" : "Vostede compartiu o caderno de enderezos {addressbook} con {user}",
+ "{actor} shared address book {addressbook} with {user}" : "{actor} compartiu o caderno de enderezos {addressbook} con {user}",
+ "{actor} unshared address book {addressbook} from you" : "{actor} deixou de compartir o seu caderno de enderezos {addressbook}",
+ "You unshared address book {addressbook} from {user}" : "Vostede deixou de compartir o caderno de enderezos {addressbook} de {user}",
+ "{actor} unshared address book {addressbook} from {user}" : "{actor} deixou de compartir o caderno de enderezos {addressbook} de {user}",
+ "{actor} unshared address book {addressbook} from themselves" : "{actor} deixaron de compartir o seu caderno de enderezos {addressbook}",
+ "You shared address book {addressbook} with group {group}" : "Vostede compartiu o caderno de enderezos {addressbook} co grupo {group}",
+ "{actor} shared address book {addressbook} with group {group}" : "{actor} compartiu o caderno de enderezos {addressbook} co grupo {group}",
+ "You unshared address book {addressbook} from group {group}" : "Vostede deixou de compartir o caderno de enderezos {addressbook} do grupo {group}",
+ "{actor} unshared address book {addressbook} from group {group}" : "{actor} deixou de compartir o caderno de enderezos {addressbook} do grupo {group}",
+ "{actor} created contact {card} in address book {addressbook}" : "{actor} creou o contacto {card} no caderno de enderezos {addressbook}",
+ "You created contact {card} in address book {addressbook}" : "Vostede creou o contacto {card} no caderno de enderezos {addressbook}",
+ "{actor} deleted contact {card} from address book {addressbook}" : "{actor} eliminou o contacto {card} do caderno de enderezos {addressbook}",
+ "You deleted contact {card} from address book {addressbook}" : "Vostede eliminou o contacto {card} do caderno de enderezos {addressbook}",
+ "{actor} updated contact {card} in address book {addressbook}" : "{actor} actualizou o contacto {card} no caderno de enderezos {addressbook}",
+ "You updated contact {card} in address book {addressbook}" : "Vostede actualizou o contacto {card} no caderno de enderezos {addressbook}",
+ "A <strong>contact</strong> or <strong>address book</strong> was modified" : "Foi modificado un <strong>contacto</strong> ou <strong>caderno de enderezos</strong>",
+ "Accounts" : "Contas",
+ "System address book which holds all accounts" : "Caderno de enderezos do sistema que contén todas as contas",
+ "File is not updatable: %1$s" : "Non é posíbel actualizar o ficheiro: %1$s",
+ "Could not write to final file, canceled by hook" : "Non foi posíbel escribir no ficheiro final, foi cancelado polo sistema",
+ "Could not write file contents" : "Non foi posíbel escribir o contido do ficheiro",
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Produciuse un erro ao copiar o ficheiro na localización de destino (copiado: %1$s, tamaño esperado do ficheiro: %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." : "Tamaño esperado do ficheiro %1$s pero lido (do cliente de Nextcloud) e escrito (no almacenamento de Nextcloud) %2$s. Pode ser un problema de rede no lado do envío ou un problema ao escribir no almacenamento no lado do servidor.",
- "Could not rename part file to final file, canceled by hook" : "Non foi posíbel cambiar o nome do ficheiro de parte ao ficheiro final, cancelado polo hook",
- "Could not rename part file to final file" : "Non se puido cambiar o nome do ficheiro de parte ao ficheiro final",
+ "Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Produciuse un erro ao copiar o ficheiro na localización de destino (copiado: %1$s, tamaño agardado do ficheiro: %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." : "Tamaño agardado do ficheiro %1$s mais lido (do cliente de Nextcloud) e escrito (no almacenamento de Nextcloud) %2$s. Pode ser un problema de rede no lado do envío ou un problema ao escribir no almacenamento no lado do servidor.",
+ "Could not rename part file to final file, canceled by hook" : "Non foi posíbel cambiar o nome do ficheiro parcial ao ficheiro final, foi cancelado polo sistema",
+ "Could not rename part file to final file" : "Non foi posíbel cambiar o nome do ficheiro parcial ao ficheiro final",
"Failed to check file size: %1$s" : "Produciuse un erro ao comprobar o tamaño do ficheiro: %1$s",
- "Could not open file" : "Non se puido abrir o ficheiro",
- "Encryption not ready: %1$s" : "O cifrado non está listo: %1$s",
+ "Could not open file" : "Non foi posíbel abrir o ficheiro",
+ "Encryption not ready: %1$s" : "O cifrado non está preparado: %1$s",
"Failed to open file: %1$s" : "Produciuse un erro ao abrir o ficheiro: %1$s",
"Failed to unlink: %1$s" : "Produciuse un erro ao desligar: %1$s",
"Invalid chunk name" : "O nome do fragmento non é válido",
- "Could not rename part file assembled from chunks" : "Non se puido cambiar o nome do ficheiro de pezas ensamblados a partir de fragmentos",
+ "Could not rename part file assembled from chunks" : "Non foi posíbel cambiar o nome do ficheiro de pezas ensamblados a partir de fragmentos",
"Failed to write file contents: %1$s" : "Produciuse un erro ao escribir o contido do ficheiro: %1$s",
- "File not found: %1$s" : "Arquivo non atopado: %1$s",
+ "File not found: %1$s" : "Non se atopou o ficheiro: %1$s",
"System is in maintenance mode." : "O sistema está en modo de mantemento.",
- "Upgrade needed" : "É necesario anovar actualizar",
+ "Upgrade needed" : "É necesario anovar",
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "É preciso configurar o seu %s para que empregue HTTPS para poder usar CalDAV e CardDAV con iOS / macOS.",
"Configures a CalDAV account" : "Configurar unha conta de CalDAV",
"Configures a CardDAV account" : "Configurar unha conta de CardDAV",
@@ -152,11 +154,11 @@ OC.L10N.register(
"WebDAV" : "WebDAV",
"WebDAV endpoint" : "Terminación WebDAV",
"Availability" : "Dispoñibilidade",
- "If you configure your working hours, other users will see when you are out of office when they book a meeting." : "Se configuras o teu horario de traballo, outros usuarios verán cando estás fóra da oficina cando reserven unha reunión.",
- "Time zone:" : "Franxa horaria:",
+ "If you configure your working hours, other users will see when you are out of office when they book a meeting." : "Se configura o seu horario de traballo, outros usuarios verán cando está fóra da oficina cando reserven unha xuntanza.",
+ "Time zone:" : "Fuso horario:",
"to" : "para",
"Delete slot" : "Eliminar franxa horaria",
- "No working hours set" : "Sen horario de traballo establecido",
+ "No working hours set" : "Sen horario de traballo estabelecido",
"Add slot" : "Engadir franxa horaria",
"Monday" : "luns",
"Tuesday" : "martes",
@@ -165,7 +167,7 @@ OC.L10N.register(
"Friday" : "venres",
"Saturday" : "sábado",
"Sunday" : "domingo",
- "Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "Establece automaticamente o estado do usuario en \"Non molestar\" fóra da dispoñibilidade para silenciar todas as notificacións.",
+ "Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "Estabelecer automaticamente o estado do usuario en «Non molestar» fóra de dispoñibilidade para silenciar todas as notificacións.",
"Save" : "Gardar",
"Failed to load availability" : "Produciuse un erro ao cargar a dispoñibilidade",
"Saved availability" : "Dispoñibilidade gardada",
@@ -177,8 +179,8 @@ OC.L10N.register(
"Hence they will not be available immediately after enabling but will show up after some time." : "Por isto, non estarán dispoñíbeis inmediatamente tras activalos, senón que aparecerán após certo tempo",
"Send notifications for events" : "Enviar notificacións para eventos",
"Notifications are sent via background jobs, so these must occur often enough." : "As notificacións enviaranse mediante procesos en segundo plano, polo que estes teñen que suceder con frecuencia.",
- "Send reminder notifications to calendar sharees as well" : "Envía notificacións de recordatorio tamén aos que comparten calendario",
- "Reminders are always sent to organizers and attendees." : "Os recordatorios sempre se envían aos organizadores e aos asistentes.",
+ "Send reminder notifications to calendar sharees as well" : "Enviar notificacións de lembrete tamén aos que comparten calendario",
+ "Reminders are always sent to organizers and attendees." : "Os lembretes envíanselle sempre aos organizadores e aos asistentes.",
"Enable notifications for events via push" : "Activar o envío de notificacións do automáticas para eventos",
"Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}." : "Instale tamén a {calendarappstoreopen}aplicación do Calendario{linkclose} ou {calendardocopen}conecte os seus escritorio e móbil para sincronizalos ↗{linkclose}.",
"Please make sure to properly set up {emailopen}the email server{linkclose}." : "Asegúrese de ter configurado correctamente {emailopen}o servidor de correo-e{linkclose}.",
diff --git a/apps/dav/l10n/gl.json b/apps/dav/l10n/gl.json
index 87296f5f364..17e88139f67 100644
--- a/apps/dav/l10n/gl.json
+++ b/apps/dav/l10n/gl.json
@@ -3,13 +3,13 @@
"To-dos" : "Tarefas pendentes",
"Personal" : "Persoal",
"{actor} created calendar {calendar}" : "{actor} creou o calendario {calendar}",
- "You created calendar {calendar}" : "Vostede creou o calendario {calendar}",
+ "You created calendar {calendar}" : "Creou o calendario {calendar}",
"{actor} deleted calendar {calendar}" : "{actor} eliminou o calendario {calendar}",
- "You deleted calendar {calendar}" : "Vostede eliminou o calendario {calendar}",
+ "You deleted calendar {calendar}" : "Eliminou o calendario {calendar}",
"{actor} updated calendar {calendar}" : "{actor} actualizou o calendario {calendar}",
"You updated calendar {calendar}" : "Vostede actualizou o calendario {calendar}",
"{actor} restored calendar {calendar}" : "{actor} restaurou o calendario {calendar}",
- "You restored calendar {calendar}" : "Restauraches o calendario {calendar}",
+ "You restored calendar {calendar}" : "Vostede restaurou o calendario {calendar}",
"You shared calendar {calendar} as public link" : "Vostede compartiu o calendario {calendar} como ligazón pública",
"You removed public link for calendar {calendar}" : "Vostede retirou a ligazón pública do calendario {calendar}",
"{actor} shared calendar {calendar} with you" : "{actor} compartiu o calendario {calendar} con vostede",
@@ -31,26 +31,26 @@
"{actor} updated event {event} in calendar {calendar}" : "{actor} actualizou o evento {event} no calendario {calendar}",
"You updated event {event} in calendar {calendar}" : "Vostede actualizou o evento {event} no calendario {calendar}",
"{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} moveu o evento {event} do calendario {sourceCalendar} ao calendario {targetCalendar}",
- "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "Moveches o evento {evento} do calendario {sourceCalendar} ao calendario {targetCalendar}",
+ "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "Moveu o evento {evento} do calendario {sourceCalendar} ao calendario {targetCalendar}",
"{actor} restored event {event} of calendar {calendar}" : "{actor} restaurou o evento {evento} do calendario {calendar}",
- "You restored event {event} of calendar {calendar}" : "Restauraches o evento {evento} do calendario {calendar}",
+ "You restored event {event} of calendar {calendar}" : "Restaurou o evento {evento} do calendario {calendar}",
"Busy" : "Ocupado",
- "{actor} created to-do {todo} in list {calendar}" : "{actor} creou as tarefas {todo} na lista {calendar}",
- "You created to-do {todo} in list {calendar}" : "Creaches a tarefa {todo} na lista {calendar}",
- "{actor} deleted to-do {todo} from list {calendar}" : "{actor} eliminou as tarefas pendentes {todo} da lista {calendar}",
- "You deleted to-do {todo} from list {calendar}" : "Eliminaches as tarefas pendentes {todo} da lista {calendar}",
- "{actor} updated to-do {todo} in list {calendar}" : "{actor} actualizou a tarefa {todo} na lista {calendar}",
- "You updated to-do {todo} in list {calendar}" : "Actualizaches a tarefa {todo} na lista {calendar}",
- "{actor} solved to-do {todo} in list {calendar}" : "{actor} resolveu as tarefas {todo} na lista {calendar}",
- "You solved to-do {todo} in list {calendar}" : "Resolveches a tarefa {todo} na lista {calendar}",
- "{actor} reopened to-do {todo} in list {calendar}" : "{actor} reabriu as tarefas {todo} na lista {calendar}",
- "You reopened to-do {todo} in list {calendar}" : "Reabriches as tarefas {todo} na lista {calendar}",
- "{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} moveu a tarefa {todo} da lista {sourceCalendar} á lista {targetCalendar}",
- "You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "Moveches a tarefa {todo} da lista {sourceCalendar} á lista {targetCalendar}",
+ "{actor} created to-do {todo} in list {calendar}" : "{actor} creou a tarefa pendente {todo} na lista {calendar}",
+ "You created to-do {todo} in list {calendar}" : "Creou a tarefa pendente {todo} na lista {calendar}",
+ "{actor} deleted to-do {todo} from list {calendar}" : "{actor} eliminou a tarefa pendente {todo} da lista {calendar}",
+ "You deleted to-do {todo} from list {calendar}" : "Eliminou a tarefa pendente {todo} da lista {calendar}",
+ "{actor} updated to-do {todo} in list {calendar}" : "{actor} actualizou a tarefa pendente {todo} na lista {calendar}",
+ "You updated to-do {todo} in list {calendar}" : "Actualizou a tarefa pendente {todo} na lista {calendar}",
+ "{actor} solved to-do {todo} in list {calendar}" : "{actor} resolveu a tarefa pendente {todo} na lista {calendar}",
+ "You solved to-do {todo} in list {calendar}" : "Resolveu a tarefa pendente {todo} na lista {calendar}",
+ "{actor} reopened to-do {todo} in list {calendar}" : "{actor} reabriu a tarefa pendente {todo} na lista {calendar}",
+ "You reopened to-do {todo} in list {calendar}" : "Reabriu a tarefa pendente {todo} na lista {calendar}",
+ "{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} moveu a tarefa pendente {todo} da lista {sourceCalendar} á lista {targetCalendar}",
+ "You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "Moveu a tarefa pendente {todo} da lista {sourceCalendar} á lista {targetCalendar}",
"Calendar, contacts and tasks" : "Calendario, contactos e tarefas",
"A <strong>calendar</strong> was modified" : "Foi modificado un <strong>calendario</strong>",
"A calendar <strong>event</strong> was modified" : "Foi modificado un <strong>evento</strong> do calendario",
- "A calendar <strong>to-do</strong> was modified" : "Modificouse unha <strong>tarefa</strong> do calendario",
+ "A calendar <strong>to-do</strong> was modified" : "Modificouse unha <strong>tarefa pendente</strong> do calendario",
"Contact birthdays" : "Aniversario do contacto",
"Death of %s" : "Falecemento de %s",
"Untitled calendar" : "Calendario sen título",
@@ -71,16 +71,16 @@
"Where: %s" : "Onde: %s",
"%1$s via %2$s" : "%1$s mediante %2$s",
"Cancelled: %1$s" : "Cancelado: %1$s",
- "\"%1$s\" has been canceled" : "\"%1$s\" cancelouse",
+ "\"%1$s\" has been canceled" : "Cancelouse «%1$s»",
"Re: %1$s" : "Re: %1$s",
- "%1$s has accepted your invitation" : "%1$s aceptou a túa invitación",
- "%1$s has tentatively accepted your invitation" : "%1$s aceptou provisionalmente a túa invitación",
- "%1$s has declined your invitation" : "%1$s rexeitou a túa invitación",
- "%1$s has responded to your invitation" : "%1$s respondeu á túa invitación",
- "Invitation updated: %1$s" : "Invitación actualizada: %1$s",
- "%1$s updated the event \"%2$s\"" : "%1$s actualizou o evento \"%2$s\"",
- "Invitation: %1$s" : "Invitación: %1$s",
- "%1$s would like to invite you to \"%2$s\"" : "%1$s quere invitarte a \"%2$s\"",
+ "%1$s has accepted your invitation" : "%1$s aceptou o seu convite",
+ "%1$s has tentatively accepted your invitation" : "%1$s aceptou provisionalmente o seu convite",
+ "%1$s has declined your invitation" : "%1$s rexeitou o seu convite",
+ "%1$s has responded to your invitation" : "%1$s respondeu ao seu convite",
+ "Invitation updated: %1$s" : "Convite actualizado: %1$s",
+ "%1$s updated the event \"%2$s\"" : "%1$s actualizou o evento «%2$s»",
+ "Invitation: %1$s" : "Convite: %1$s",
+ "%1$s would like to invite you to \"%2$s\"" : "%1$s quere convidalo a «%2$s»",
"Organizer:" : "Organizador:",
"Attendees:" : "Asistentes:",
"Title:" : "Título:",
@@ -92,49 +92,51 @@
"More options …" : "Máis opcións…",
"More options at %s" : "Máis opcións en %s",
"Contacts" : "Contactos",
- "{actor} created address book {addressbook}" : "{actor} creou a axenda de enderezos {addressbook}",
- "You created address book {addressbook}" : "Creaches a axenda de enderezos {addressbook}",
- "{actor} deleted address book {addressbook}" : "{actor} eliminou a axenda de enderezos {addressbook}",
- "You deleted address book {addressbook}" : "Eliminaches a axenda de enderezos {addressbook}",
- "{actor} updated address book {addressbook}" : "{actor} actualizou a axenda de enderezos {addressbook}",
- "You updated address book {addressbook}" : "Actualizaches a axenda de enderezos {addressbook}",
- "{actor} shared address book {addressbook} with you" : "{actor} compartiu a axenda de enderezos {addressbook} contigo",
- "You shared address book {addressbook} with {user}" : "Compartiches a axenda de enderezos {addressbook} con {user}",
- "{actor} shared address book {addressbook} with {user}" : "{actor} compartiu a axenda de enderezos {addressbook} con {user}",
- "{actor} unshared address book {addressbook} from you" : "{actor} deixou de compartir a túa axenda de enderezos {addressbook}",
- "You unshared address book {addressbook} from {user}" : "Deixaches de compartir a axenda de enderezos {addressbook} de {user}",
- "{actor} unshared address book {addressbook} from {user}" : "{actor} deixou de compartir a axenda de enderezos {addressbook} de {user}",
- "{actor} unshared address book {addressbook} from themselves" : "{actor} deixaron de compartir a súa axenda de enderezos {addressbook}",
- "You shared address book {addressbook} with group {group}" : "Compartiches a axenda de enderezos {addressbook} co grupo {group}",
- "{actor} shared address book {addressbook} with group {group}" : "{actor} compartiu a axenda de enderezos {addressbook} co grupo {group}",
- "You unshared address book {addressbook} from group {group}" : "Deixaches de compartir a axenda de enderezos {addressbook} do grupo {group}",
- "{actor} unshared address book {addressbook} from group {group}" : "{actor} deixou de compartir axenda de enderezos {addressbook} do grupo {group}",
- "{actor} created contact {card} in address book {addressbook}" : "{actor} creou o contacto {card} na axenda de enderezos {addressbook}",
- "You created contact {card} in address book {addressbook}" : "Creaches o contacto {card} na axenda de enderezos {addressbook}",
- "{actor} deleted contact {card} from address book {addressbook}" : "{actor} eliminou o contacto {card} da axenda de enderezos {addressbook}",
- "You deleted contact {card} from address book {addressbook}" : "Eliminaches o contacto {card} da axenda de enderezos {addressbook}",
- "{actor} updated contact {card} in address book {addressbook}" : "{actor} actualizou o contacto {card} na axenda de enderezos {addressbook}",
- "You updated contact {card} in address book {addressbook}" : "Actualizaches o contacto {card} na axenda de enderezos {addressbook}",
- "A <strong>contact</strong> or <strong>address book</strong> was modified" : "Modificouse un <strong>contacto</strong> ou <strong>axenda de enderezos</strong>",
- "File is not updatable: %1$s" : "O ficheiro non se pode actualizar: %1$s",
- "Could not write to final file, canceled by hook" : "Non foi posíbel escribir no ficheiro final, cancelouse polo hook",
- "Could not write file contents" : "Non se puido escribir o contido do ficheiro",
+ "{actor} created address book {addressbook}" : "{actor} creou o caderno de enderezos {addressbook}",
+ "You created address book {addressbook}" : "Vostede creou o caderno de enderezos {addressbook}",
+ "{actor} deleted address book {addressbook}" : "{actor} eliminou o caderno de enderezos {addressbook}",
+ "You deleted address book {addressbook}" : "Vostede eliminou o caderno de enderezos {addressbook}",
+ "{actor} updated address book {addressbook}" : "{actor} actualizou o caderno de enderezos {addressbook}",
+ "You updated address book {addressbook}" : "Vostede actualizou o caderno de enderezos {addressbook}",
+ "{actor} shared address book {addressbook} with you" : "{actor} compartiu o caderno de enderezos {addressbook} con vostede",
+ "You shared address book {addressbook} with {user}" : "Vostede compartiu o caderno de enderezos {addressbook} con {user}",
+ "{actor} shared address book {addressbook} with {user}" : "{actor} compartiu o caderno de enderezos {addressbook} con {user}",
+ "{actor} unshared address book {addressbook} from you" : "{actor} deixou de compartir o seu caderno de enderezos {addressbook}",
+ "You unshared address book {addressbook} from {user}" : "Vostede deixou de compartir o caderno de enderezos {addressbook} de {user}",
+ "{actor} unshared address book {addressbook} from {user}" : "{actor} deixou de compartir o caderno de enderezos {addressbook} de {user}",
+ "{actor} unshared address book {addressbook} from themselves" : "{actor} deixaron de compartir o seu caderno de enderezos {addressbook}",
+ "You shared address book {addressbook} with group {group}" : "Vostede compartiu o caderno de enderezos {addressbook} co grupo {group}",
+ "{actor} shared address book {addressbook} with group {group}" : "{actor} compartiu o caderno de enderezos {addressbook} co grupo {group}",
+ "You unshared address book {addressbook} from group {group}" : "Vostede deixou de compartir o caderno de enderezos {addressbook} do grupo {group}",
+ "{actor} unshared address book {addressbook} from group {group}" : "{actor} deixou de compartir o caderno de enderezos {addressbook} do grupo {group}",
+ "{actor} created contact {card} in address book {addressbook}" : "{actor} creou o contacto {card} no caderno de enderezos {addressbook}",
+ "You created contact {card} in address book {addressbook}" : "Vostede creou o contacto {card} no caderno de enderezos {addressbook}",
+ "{actor} deleted contact {card} from address book {addressbook}" : "{actor} eliminou o contacto {card} do caderno de enderezos {addressbook}",
+ "You deleted contact {card} from address book {addressbook}" : "Vostede eliminou o contacto {card} do caderno de enderezos {addressbook}",
+ "{actor} updated contact {card} in address book {addressbook}" : "{actor} actualizou o contacto {card} no caderno de enderezos {addressbook}",
+ "You updated contact {card} in address book {addressbook}" : "Vostede actualizou o contacto {card} no caderno de enderezos {addressbook}",
+ "A <strong>contact</strong> or <strong>address book</strong> was modified" : "Foi modificado un <strong>contacto</strong> ou <strong>caderno de enderezos</strong>",
+ "Accounts" : "Contas",
+ "System address book which holds all accounts" : "Caderno de enderezos do sistema que contén todas as contas",
+ "File is not updatable: %1$s" : "Non é posíbel actualizar o ficheiro: %1$s",
+ "Could not write to final file, canceled by hook" : "Non foi posíbel escribir no ficheiro final, foi cancelado polo sistema",
+ "Could not write file contents" : "Non foi posíbel escribir o contido do ficheiro",
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
- "Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Produciuse un erro ao copiar o ficheiro na localización de destino (copiado: %1$s, tamaño esperado do ficheiro: %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." : "Tamaño esperado do ficheiro %1$s pero lido (do cliente de Nextcloud) e escrito (no almacenamento de Nextcloud) %2$s. Pode ser un problema de rede no lado do envío ou un problema ao escribir no almacenamento no lado do servidor.",
- "Could not rename part file to final file, canceled by hook" : "Non foi posíbel cambiar o nome do ficheiro de parte ao ficheiro final, cancelado polo hook",
- "Could not rename part file to final file" : "Non se puido cambiar o nome do ficheiro de parte ao ficheiro final",
+ "Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Produciuse un erro ao copiar o ficheiro na localización de destino (copiado: %1$s, tamaño agardado do ficheiro: %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." : "Tamaño agardado do ficheiro %1$s mais lido (do cliente de Nextcloud) e escrito (no almacenamento de Nextcloud) %2$s. Pode ser un problema de rede no lado do envío ou un problema ao escribir no almacenamento no lado do servidor.",
+ "Could not rename part file to final file, canceled by hook" : "Non foi posíbel cambiar o nome do ficheiro parcial ao ficheiro final, foi cancelado polo sistema",
+ "Could not rename part file to final file" : "Non foi posíbel cambiar o nome do ficheiro parcial ao ficheiro final",
"Failed to check file size: %1$s" : "Produciuse un erro ao comprobar o tamaño do ficheiro: %1$s",
- "Could not open file" : "Non se puido abrir o ficheiro",
- "Encryption not ready: %1$s" : "O cifrado non está listo: %1$s",
+ "Could not open file" : "Non foi posíbel abrir o ficheiro",
+ "Encryption not ready: %1$s" : "O cifrado non está preparado: %1$s",
"Failed to open file: %1$s" : "Produciuse un erro ao abrir o ficheiro: %1$s",
"Failed to unlink: %1$s" : "Produciuse un erro ao desligar: %1$s",
"Invalid chunk name" : "O nome do fragmento non é válido",
- "Could not rename part file assembled from chunks" : "Non se puido cambiar o nome do ficheiro de pezas ensamblados a partir de fragmentos",
+ "Could not rename part file assembled from chunks" : "Non foi posíbel cambiar o nome do ficheiro de pezas ensamblados a partir de fragmentos",
"Failed to write file contents: %1$s" : "Produciuse un erro ao escribir o contido do ficheiro: %1$s",
- "File not found: %1$s" : "Arquivo non atopado: %1$s",
+ "File not found: %1$s" : "Non se atopou o ficheiro: %1$s",
"System is in maintenance mode." : "O sistema está en modo de mantemento.",
- "Upgrade needed" : "É necesario anovar actualizar",
+ "Upgrade needed" : "É necesario anovar",
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "É preciso configurar o seu %s para que empregue HTTPS para poder usar CalDAV e CardDAV con iOS / macOS.",
"Configures a CalDAV account" : "Configurar unha conta de CalDAV",
"Configures a CardDAV account" : "Configurar unha conta de CardDAV",
@@ -150,11 +152,11 @@
"WebDAV" : "WebDAV",
"WebDAV endpoint" : "Terminación WebDAV",
"Availability" : "Dispoñibilidade",
- "If you configure your working hours, other users will see when you are out of office when they book a meeting." : "Se configuras o teu horario de traballo, outros usuarios verán cando estás fóra da oficina cando reserven unha reunión.",
- "Time zone:" : "Franxa horaria:",
+ "If you configure your working hours, other users will see when you are out of office when they book a meeting." : "Se configura o seu horario de traballo, outros usuarios verán cando está fóra da oficina cando reserven unha xuntanza.",
+ "Time zone:" : "Fuso horario:",
"to" : "para",
"Delete slot" : "Eliminar franxa horaria",
- "No working hours set" : "Sen horario de traballo establecido",
+ "No working hours set" : "Sen horario de traballo estabelecido",
"Add slot" : "Engadir franxa horaria",
"Monday" : "luns",
"Tuesday" : "martes",
@@ -163,7 +165,7 @@
"Friday" : "venres",
"Saturday" : "sábado",
"Sunday" : "domingo",
- "Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "Establece automaticamente o estado do usuario en \"Non molestar\" fóra da dispoñibilidade para silenciar todas as notificacións.",
+ "Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "Estabelecer automaticamente o estado do usuario en «Non molestar» fóra de dispoñibilidade para silenciar todas as notificacións.",
"Save" : "Gardar",
"Failed to load availability" : "Produciuse un erro ao cargar a dispoñibilidade",
"Saved availability" : "Dispoñibilidade gardada",
@@ -175,8 +177,8 @@
"Hence they will not be available immediately after enabling but will show up after some time." : "Por isto, non estarán dispoñíbeis inmediatamente tras activalos, senón que aparecerán após certo tempo",
"Send notifications for events" : "Enviar notificacións para eventos",
"Notifications are sent via background jobs, so these must occur often enough." : "As notificacións enviaranse mediante procesos en segundo plano, polo que estes teñen que suceder con frecuencia.",
- "Send reminder notifications to calendar sharees as well" : "Envía notificacións de recordatorio tamén aos que comparten calendario",
- "Reminders are always sent to organizers and attendees." : "Os recordatorios sempre se envían aos organizadores e aos asistentes.",
+ "Send reminder notifications to calendar sharees as well" : "Enviar notificacións de lembrete tamén aos que comparten calendario",
+ "Reminders are always sent to organizers and attendees." : "Os lembretes envíanselle sempre aos organizadores e aos asistentes.",
"Enable notifications for events via push" : "Activar o envío de notificacións do automáticas para eventos",
"Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}." : "Instale tamén a {calendarappstoreopen}aplicación do Calendario{linkclose} ou {calendardocopen}conecte os seus escritorio e móbil para sincronizalos ↗{linkclose}.",
"Please make sure to properly set up {emailopen}the email server{linkclose}." : "Asegúrese de ter configurado correctamente {emailopen}o servidor de correo-e{linkclose}.",
diff --git a/apps/dav/l10n/ko.js b/apps/dav/l10n/ko.js
index 43c181bd079..5f37a04a480 100644
--- a/apps/dav/l10n/ko.js
+++ b/apps/dav/l10n/ko.js
@@ -10,7 +10,7 @@ OC.L10N.register(
"You deleted calendar {calendar}" : "달력 {calendar}을(를) 삭제함",
"{actor} updated calendar {calendar}" : "{actor} 님이 달력 {calendar}을(를) 업데이트함",
"You updated calendar {calendar}" : "달력 {calendar}을(를) 업데이트함",
- "{actor} restored calendar {calendar}" : "{actor} 님이 달력 {calendar}을(를) 복구함",
+ "{actor} restored calendar {calendar}" : "{actor}님이 달력 {calendar}을(를) 복구함",
"You restored calendar {calendar}" : "달력 {calendar}을(를) 복구함",
"You shared calendar {calendar} as public link" : "달력 {calendar}을(를) 공개 링크로 공유함",
"You removed public link for calendar {calendar}" : "달력 {calendar}의 공개 링크를 삭제함",
@@ -32,22 +32,22 @@ OC.L10N.register(
"You deleted event {event} from calendar {calendar}" : "행사 {event}을(를) 달력 {calendar}에서 삭제함",
"{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}(으)로 옮김",
+ "{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} 님이 행사 {event}을(를) 달력 {calendar}에 복구함",
+ "{actor} restored event {event} of calendar {calendar}" : "{actor}님이 행사 {event}을(를) 달력 {calendar}에 복구함",
"You restored event {event} of calendar {calendar}" : "행사 {event}을(를) 달력 {calendar}에 복구함",
"Busy" : "바쁨",
- "{actor} created to-do {todo} in list {calendar}" : "{actor} 님이 목록 {calendar}에 할 일 {todo}을(를) 생성함",
+ "{actor} created to-do {todo} in list {calendar}" : "{actor}님이 목록 {calendar}에 할 일 {todo}을(를) 생성함",
"You created to-do {todo} in list {calendar}" : "목록 {calendar}에 할 일 {todo}을(를) 생성함",
- "{actor} deleted to-do {todo} from list {calendar}" : "{actor} 님이 목록 {calendar}에서 할 일 {todo}을(를) 삭제함",
+ "{actor} deleted to-do {todo} from list {calendar}" : "{actor}님이 목록 {calendar}에서 할 일 {todo}을(를) 삭제함",
"You deleted to-do {todo} from list {calendar}" : "목록 {calendar}에서 할 일 {todo}을(를) 삭제함",
- "{actor} updated to-do {todo} in list {calendar}" : "{actor} 님이 목록 {calendar}의 할 일 {todo}을(를) 업데이트함",
+ "{actor} updated to-do {todo} in list {calendar}" : "{actor}님이 목록 {calendar}의 할 일 {todo}을(를) 업데이트함",
"You updated to-do {todo} in list {calendar}" : "목록 {calendar}의 할 일 {todo}을(를) 업데이트함",
- "{actor} solved to-do {todo} in list {calendar}" : "{actor} 님이 목록 {calendar}의 할 일 {todo}을(를) 끝냄",
+ "{actor} solved to-do {todo} in list {calendar}" : "{actor}님이 목록 {calendar}의 할 일 {todo}을(를) 끝냄",
"You solved to-do {todo} in list {calendar}" : "목록 {calendar}의 할 일 {todo}을(를) 끝냄",
- "{actor} reopened to-do {todo} in list {calendar}" : "{actor} 님이 목록 {calendar}의 할 일 {todo}을(를) 다시 엶",
+ "{actor} reopened to-do {todo} in list {calendar}" : "{actor}님이 목록 {calendar}의 할 일 {todo}을(를) 다시 엶",
"You reopened to-do {todo} in list {calendar}" : "목록 {calendar}의 할 일 {todo}을(를) 다시 엶",
- "{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} 님이 할 일 {todo}을(를) 목록 {sourceCalendar}에서 목록 {targetCalendar}(으)로 옮김",
+ "{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor}님이 할 일 {todo}을(를) 목록 {sourceCalendar}에서 목록 {targetCalendar}(으)로 옮김",
"You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "할 일 {todo}을(를) 목록 {sourceCalendar}에서 목록 {targetCalendar}(으)로 옮김",
"Calendar, contacts and tasks" : "달력, 연락처 및 작업",
"A <strong>calendar</strong> was modified" : "<strong>달력</strong>이 수정됨",
@@ -86,28 +86,28 @@ OC.L10N.register(
"More options …" : "더 많은 옵션 …",
"More options at %s" : "%s에 더 많은 옵션 있음",
"Contacts" : "연락처",
- "{actor} created address book {addressbook}" : "{actor} 님이 주소록 {addressbook}을(를) 생성함",
+ "{actor} created address book {addressbook}" : "{actor}님이 주소록 {addressbook}을(를) 생성함",
"You created address book {addressbook}" : "주소록 {addressbook}을(를) 생성함",
- "{actor} deleted address book {addressbook}" : "{actor} 님이 주소록 {addressbook}을(를) 제거함",
+ "{actor} deleted address book {addressbook}" : "{actor}님이 주소록 {addressbook}을(를) 제거함",
"You deleted address book {addressbook}" : "주소록 {addressbook}을(를) 제거함",
- "{actor} updated address book {addressbook}" : "{actor} 님이 주소록 {addressbook}을(를) 갱신함",
+ "{actor} updated address book {addressbook}" : "{actor}님이 주소록 {addressbook}을(를) 갱신함",
"You updated address book {addressbook}" : "주소록 {addressbook}을(를) 갱신함",
- "{actor} shared address book {addressbook} with you" : "{actor} 님이 나와 주소록 {addressbook}을(를) 공유함",
- "You shared address book {addressbook} with {user}" : "{user} 님과 주소록 {addressbook}을(를) 공유함",
- "{actor} shared address book {addressbook} with {user}" : "{actor} 님이 {user} 님과 주소록 {addressbook}을(를) 공유함",
- "{actor} unshared address book {addressbook} from you" : "{actor} 님이 주소록 {addressbook}의 공유를 해제함",
- "You unshared address book {addressbook} from {user}" : "{user} 님과 주소록 {addressbook}의 공유를 해제함",
- "{actor} unshared address book {addressbook} from {user}" : "{actor} 님이 {user} 님과 주소록 {addressbook}의 공유를 해제함",
- "{actor} unshared address book {addressbook} from themselves" : "{actor} 님이 자신과 주소록 {addressbook}의 공유를 해제함",
+ "{actor} shared address book {addressbook} with you" : "{actor}님이 나와 주소록 {addressbook}을(를) 공유함",
+ "You shared address book {addressbook} with {user}" : "{user}님과 주소록 {addressbook}을(를) 공유함",
+ "{actor} shared address book {addressbook} with {user}" : "{actor}님이 {user}님과 주소록 {addressbook}을(를) 공유함",
+ "{actor} unshared address book {addressbook} from you" : "{actor}님이 주소록 {addressbook}의 공유를 해제함",
+ "You unshared address book {addressbook} from {user}" : "{user}님과 주소록 {addressbook}의 공유를 해제함",
+ "{actor} unshared address book {addressbook} from {user}" : "{actor}님이 {user}님과 주소록 {addressbook}의 공유를 해제함",
+ "{actor} unshared address book {addressbook} from themselves" : "{actor}님이 자신과 주소록 {addressbook}의 공유를 해제함",
"You shared address book {addressbook} with group {group}" : "그룹 {group}과(와) 주소록 {addressbook}을(를) 공유함",
- "{actor} shared address book {addressbook} with group {group}" : "{actor} 님이 그룹 {group}과(와) 주소록 {addressbook}을(를) 공유함",
+ "{actor} shared address book {addressbook} with group {group}" : "{actor}님이 그룹 {group}과(와) 주소록 {addressbook}을(를) 공유함",
"You unshared address book {addressbook} from group {group}" : "그룹 {group}과(와) 주소록 {addressbook}의 공유를 해제함",
- "{actor} unshared address book {addressbook} from group {group}" : "{actor} 님이 그룹 {group}과(와) 주소록 {addressbook}의 공유를 해제함",
- "{actor} created contact {card} in address book {addressbook}" : "{actor} 님이 연락처 {card}을(를) 주소록 {addressbook}에 생성함",
+ "{actor} unshared address book {addressbook} from group {group}" : "{actor}님이 그룹 {group}과(와) 주소록 {addressbook}의 공유를 해제함",
+ "{actor} created contact {card} in address book {addressbook}" : "{actor}님이 연락처 {card}을(를) 주소록 {addressbook}에 생성함",
"You created contact {card} in address book {addressbook}" : "연락처 {card}을(를) 주소록 {addressbook}에 생성함",
- "{actor} deleted contact {card} from address book {addressbook}" : "{actor} 님이 연락처 {card}을(를) 주소록 {addressbook}에서 제거함",
+ "{actor} deleted contact {card} from address book {addressbook}" : "{actor}님이 연락처 {card}을(를) 주소록 {addressbook}에서 제거함",
"You deleted contact {card} from address book {addressbook}" : "연락처 {card}을(를) 주소록 {addressbook}에서 제거함",
- "{actor} updated contact {card} in address book {addressbook}" : "{actor} 님이 주소록 {addressbook}의 연락처 {card}을(를) 갱신함",
+ "{actor} updated contact {card} in address book {addressbook}" : "{actor}님이 주소록 {addressbook}의 연락처 {card}을(를) 갱신함",
"You updated contact {card} in address book {addressbook}" : "주소록 {addressbook}의 연락처 {card}을(를) 갱신함",
"A <strong>contact</strong> or <strong>address book</strong> was modified" : "<strong>연락처</strong> 또는 <strong>주소록</strong>이 변경됨",
"File is not updatable: %1$s" : "파일을 갱신할 수 없습니다: %1$s",
@@ -143,7 +143,7 @@ OC.L10N.register(
"Contacts and groups" : "연락처 및 그룹",
"WebDAV" : "WebDAV",
"WebDAV endpoint" : "WebDAV 종단점",
- "Availability" : "가능한 시간대",
+ "Availability" : "가용성",
"If you configure your working hours, other users will see when you are out of office when they book a meeting." : "업무 시간을 설정하면, 회의를 예약할 때 다른 사용자가 부재 중 시간을 볼 수 있습니다.",
"Time zone:" : "시간대:",
"to" : "에서",
@@ -157,10 +157,11 @@ OC.L10N.register(
"Friday" : "금요일",
"Saturday" : "토요일",
"Sunday" : "일요일",
+ "Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "다른 용무 중일 때 자동으로 사용자를 '방해 금지' 모드로 설정해 모든 알림을 음소거합니다.",
"Save" : "저장",
- "Failed to load availability" : "가능한 시간대 불러오기 실패",
- "Saved availability" : "가능한 시간대를 저장함",
- "Failed to save availability" : "가능한 시간대 저장 실패",
+ "Failed to load availability" : "가용성 불러오기 실패",
+ "Saved availability" : "가용성을 저장함",
+ "Failed to save availability" : "가용성 저장 실패",
"Calendar server" : "달력 서버",
"Send invitations to attendees" : "참석자에게 초대장 보내기",
"Automatically generate a birthday calendar" : "자동으로 생일 달력 생성",
diff --git a/apps/dav/l10n/ko.json b/apps/dav/l10n/ko.json
index 8ef3286bdbe..2bf4574188d 100644
--- a/apps/dav/l10n/ko.json
+++ b/apps/dav/l10n/ko.json
@@ -8,7 +8,7 @@
"You deleted calendar {calendar}" : "달력 {calendar}을(를) 삭제함",
"{actor} updated calendar {calendar}" : "{actor} 님이 달력 {calendar}을(를) 업데이트함",
"You updated calendar {calendar}" : "달력 {calendar}을(를) 업데이트함",
- "{actor} restored calendar {calendar}" : "{actor} 님이 달력 {calendar}을(를) 복구함",
+ "{actor} restored calendar {calendar}" : "{actor}님이 달력 {calendar}을(를) 복구함",
"You restored calendar {calendar}" : "달력 {calendar}을(를) 복구함",
"You shared calendar {calendar} as public link" : "달력 {calendar}을(를) 공개 링크로 공유함",
"You removed public link for calendar {calendar}" : "달력 {calendar}의 공개 링크를 삭제함",
@@ -30,22 +30,22 @@
"You deleted event {event} from calendar {calendar}" : "행사 {event}을(를) 달력 {calendar}에서 삭제함",
"{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}(으)로 옮김",
+ "{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} 님이 행사 {event}을(를) 달력 {calendar}에 복구함",
+ "{actor} restored event {event} of calendar {calendar}" : "{actor}님이 행사 {event}을(를) 달력 {calendar}에 복구함",
"You restored event {event} of calendar {calendar}" : "행사 {event}을(를) 달력 {calendar}에 복구함",
"Busy" : "바쁨",
- "{actor} created to-do {todo} in list {calendar}" : "{actor} 님이 목록 {calendar}에 할 일 {todo}을(를) 생성함",
+ "{actor} created to-do {todo} in list {calendar}" : "{actor}님이 목록 {calendar}에 할 일 {todo}을(를) 생성함",
"You created to-do {todo} in list {calendar}" : "목록 {calendar}에 할 일 {todo}을(를) 생성함",
- "{actor} deleted to-do {todo} from list {calendar}" : "{actor} 님이 목록 {calendar}에서 할 일 {todo}을(를) 삭제함",
+ "{actor} deleted to-do {todo} from list {calendar}" : "{actor}님이 목록 {calendar}에서 할 일 {todo}을(를) 삭제함",
"You deleted to-do {todo} from list {calendar}" : "목록 {calendar}에서 할 일 {todo}을(를) 삭제함",
- "{actor} updated to-do {todo} in list {calendar}" : "{actor} 님이 목록 {calendar}의 할 일 {todo}을(를) 업데이트함",
+ "{actor} updated to-do {todo} in list {calendar}" : "{actor}님이 목록 {calendar}의 할 일 {todo}을(를) 업데이트함",
"You updated to-do {todo} in list {calendar}" : "목록 {calendar}의 할 일 {todo}을(를) 업데이트함",
- "{actor} solved to-do {todo} in list {calendar}" : "{actor} 님이 목록 {calendar}의 할 일 {todo}을(를) 끝냄",
+ "{actor} solved to-do {todo} in list {calendar}" : "{actor}님이 목록 {calendar}의 할 일 {todo}을(를) 끝냄",
"You solved to-do {todo} in list {calendar}" : "목록 {calendar}의 할 일 {todo}을(를) 끝냄",
- "{actor} reopened to-do {todo} in list {calendar}" : "{actor} 님이 목록 {calendar}의 할 일 {todo}을(를) 다시 엶",
+ "{actor} reopened to-do {todo} in list {calendar}" : "{actor}님이 목록 {calendar}의 할 일 {todo}을(를) 다시 엶",
"You reopened to-do {todo} in list {calendar}" : "목록 {calendar}의 할 일 {todo}을(를) 다시 엶",
- "{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} 님이 할 일 {todo}을(를) 목록 {sourceCalendar}에서 목록 {targetCalendar}(으)로 옮김",
+ "{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor}님이 할 일 {todo}을(를) 목록 {sourceCalendar}에서 목록 {targetCalendar}(으)로 옮김",
"You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "할 일 {todo}을(를) 목록 {sourceCalendar}에서 목록 {targetCalendar}(으)로 옮김",
"Calendar, contacts and tasks" : "달력, 연락처 및 작업",
"A <strong>calendar</strong> was modified" : "<strong>달력</strong>이 수정됨",
@@ -84,28 +84,28 @@
"More options …" : "더 많은 옵션 …",
"More options at %s" : "%s에 더 많은 옵션 있음",
"Contacts" : "연락처",
- "{actor} created address book {addressbook}" : "{actor} 님이 주소록 {addressbook}을(를) 생성함",
+ "{actor} created address book {addressbook}" : "{actor}님이 주소록 {addressbook}을(를) 생성함",
"You created address book {addressbook}" : "주소록 {addressbook}을(를) 생성함",
- "{actor} deleted address book {addressbook}" : "{actor} 님이 주소록 {addressbook}을(를) 제거함",
+ "{actor} deleted address book {addressbook}" : "{actor}님이 주소록 {addressbook}을(를) 제거함",
"You deleted address book {addressbook}" : "주소록 {addressbook}을(를) 제거함",
- "{actor} updated address book {addressbook}" : "{actor} 님이 주소록 {addressbook}을(를) 갱신함",
+ "{actor} updated address book {addressbook}" : "{actor}님이 주소록 {addressbook}을(를) 갱신함",
"You updated address book {addressbook}" : "주소록 {addressbook}을(를) 갱신함",
- "{actor} shared address book {addressbook} with you" : "{actor} 님이 나와 주소록 {addressbook}을(를) 공유함",
- "You shared address book {addressbook} with {user}" : "{user} 님과 주소록 {addressbook}을(를) 공유함",
- "{actor} shared address book {addressbook} with {user}" : "{actor} 님이 {user} 님과 주소록 {addressbook}을(를) 공유함",
- "{actor} unshared address book {addressbook} from you" : "{actor} 님이 주소록 {addressbook}의 공유를 해제함",
- "You unshared address book {addressbook} from {user}" : "{user} 님과 주소록 {addressbook}의 공유를 해제함",
- "{actor} unshared address book {addressbook} from {user}" : "{actor} 님이 {user} 님과 주소록 {addressbook}의 공유를 해제함",
- "{actor} unshared address book {addressbook} from themselves" : "{actor} 님이 자신과 주소록 {addressbook}의 공유를 해제함",
+ "{actor} shared address book {addressbook} with you" : "{actor}님이 나와 주소록 {addressbook}을(를) 공유함",
+ "You shared address book {addressbook} with {user}" : "{user}님과 주소록 {addressbook}을(를) 공유함",
+ "{actor} shared address book {addressbook} with {user}" : "{actor}님이 {user}님과 주소록 {addressbook}을(를) 공유함",
+ "{actor} unshared address book {addressbook} from you" : "{actor}님이 주소록 {addressbook}의 공유를 해제함",
+ "You unshared address book {addressbook} from {user}" : "{user}님과 주소록 {addressbook}의 공유를 해제함",
+ "{actor} unshared address book {addressbook} from {user}" : "{actor}님이 {user}님과 주소록 {addressbook}의 공유를 해제함",
+ "{actor} unshared address book {addressbook} from themselves" : "{actor}님이 자신과 주소록 {addressbook}의 공유를 해제함",
"You shared address book {addressbook} with group {group}" : "그룹 {group}과(와) 주소록 {addressbook}을(를) 공유함",
- "{actor} shared address book {addressbook} with group {group}" : "{actor} 님이 그룹 {group}과(와) 주소록 {addressbook}을(를) 공유함",
+ "{actor} shared address book {addressbook} with group {group}" : "{actor}님이 그룹 {group}과(와) 주소록 {addressbook}을(를) 공유함",
"You unshared address book {addressbook} from group {group}" : "그룹 {group}과(와) 주소록 {addressbook}의 공유를 해제함",
- "{actor} unshared address book {addressbook} from group {group}" : "{actor} 님이 그룹 {group}과(와) 주소록 {addressbook}의 공유를 해제함",
- "{actor} created contact {card} in address book {addressbook}" : "{actor} 님이 연락처 {card}을(를) 주소록 {addressbook}에 생성함",
+ "{actor} unshared address book {addressbook} from group {group}" : "{actor}님이 그룹 {group}과(와) 주소록 {addressbook}의 공유를 해제함",
+ "{actor} created contact {card} in address book {addressbook}" : "{actor}님이 연락처 {card}을(를) 주소록 {addressbook}에 생성함",
"You created contact {card} in address book {addressbook}" : "연락처 {card}을(를) 주소록 {addressbook}에 생성함",
- "{actor} deleted contact {card} from address book {addressbook}" : "{actor} 님이 연락처 {card}을(를) 주소록 {addressbook}에서 제거함",
+ "{actor} deleted contact {card} from address book {addressbook}" : "{actor}님이 연락처 {card}을(를) 주소록 {addressbook}에서 제거함",
"You deleted contact {card} from address book {addressbook}" : "연락처 {card}을(를) 주소록 {addressbook}에서 제거함",
- "{actor} updated contact {card} in address book {addressbook}" : "{actor} 님이 주소록 {addressbook}의 연락처 {card}을(를) 갱신함",
+ "{actor} updated contact {card} in address book {addressbook}" : "{actor}님이 주소록 {addressbook}의 연락처 {card}을(를) 갱신함",
"You updated contact {card} in address book {addressbook}" : "주소록 {addressbook}의 연락처 {card}을(를) 갱신함",
"A <strong>contact</strong> or <strong>address book</strong> was modified" : "<strong>연락처</strong> 또는 <strong>주소록</strong>이 변경됨",
"File is not updatable: %1$s" : "파일을 갱신할 수 없습니다: %1$s",
@@ -141,7 +141,7 @@
"Contacts and groups" : "연락처 및 그룹",
"WebDAV" : "WebDAV",
"WebDAV endpoint" : "WebDAV 종단점",
- "Availability" : "가능한 시간대",
+ "Availability" : "가용성",
"If you configure your working hours, other users will see when you are out of office when they book a meeting." : "업무 시간을 설정하면, 회의를 예약할 때 다른 사용자가 부재 중 시간을 볼 수 있습니다.",
"Time zone:" : "시간대:",
"to" : "에서",
@@ -155,10 +155,11 @@
"Friday" : "금요일",
"Saturday" : "토요일",
"Sunday" : "일요일",
+ "Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "다른 용무 중일 때 자동으로 사용자를 '방해 금지' 모드로 설정해 모든 알림을 음소거합니다.",
"Save" : "저장",
- "Failed to load availability" : "가능한 시간대 불러오기 실패",
- "Saved availability" : "가능한 시간대를 저장함",
- "Failed to save availability" : "가능한 시간대 저장 실패",
+ "Failed to load availability" : "가용성 불러오기 실패",
+ "Saved availability" : "가용성을 저장함",
+ "Failed to save availability" : "가용성 저장 실패",
"Calendar server" : "달력 서버",
"Send invitations to attendees" : "참석자에게 초대장 보내기",
"Automatically generate a birthday calendar" : "자동으로 생일 달력 생성",
diff --git a/apps/dav/l10n/zh_CN.js b/apps/dav/l10n/zh_CN.js
index 505b3a734e3..f3c009b0cb0 100644
--- a/apps/dav/l10n/zh_CN.js
+++ b/apps/dav/l10n/zh_CN.js
@@ -2,7 +2,7 @@ OC.L10N.register(
"dav",
{
"Calendar" : "日历",
- "To-dos" : "代办事项",
+ "To-dos" : "待办事项",
"Personal" : "个人",
"{actor} created calendar {calendar}" : "{actor} 创建了日历 {calendar}",
"You created calendar {calendar}" : "您创建的日历 {calendar}",
@@ -37,8 +37,8 @@ OC.L10N.register(
"{actor} restored event {event} of calendar {calendar}" : "{actor} 还原了事件 {event},它位于日历 {calendar}",
"You restored event {event} of calendar {calendar}" : "你还原了事件 {event},它位于日历 {calendar}",
"Busy" : "忙碌",
- "{actor} created to-do {todo} in list {calendar}" : "{actor} 在清单 {calendar} 中创建了代办事项 {todo}",
- "You created to-do {todo} in list {calendar}" : "您已在清单 {calendar} 中创建了代办事项 {todo}",
+ "{actor} created to-do {todo} in list {calendar}" : "{actor} 在清单 {calendar} 中创建了待办事项 {todo}",
+ "You created to-do {todo} in list {calendar}" : "您已在清单 {calendar} 中创建了待办事项 {todo}",
"{actor} deleted to-do {todo} from list {calendar}" : "{actor} 从列表 {calendar} 中删除了待办事项 {todo}",
"You deleted to-do {todo} from list {calendar}" : "你从列表 {calendar} 中删除了待办事项 {todo}",
"{actor} updated to-do {todo} in list {calendar}" : "{actor} 更新了列表 {calendar} 中的待办事项 {todo}",
@@ -63,8 +63,8 @@ OC.L10N.register(
"_%n year_::_%n years_" : ["%n 年"],
"_%n month_::_%n months_" : ["%n 月"],
"_%n day_::_%n days_" : ["%n 天"],
- "_%n hour_::_%n hours_" : ["%n 小时"],
- "_%n minute_::_%n minutes_" : ["%n 分钟"],
+ "_%n hour_::_%n hours_" : ["%n小时"],
+ "_%n minute_::_%n minutes_" : ["%n分钟"],
"%s (in %s)" : "%s (在 %s)",
"%s (%s ago)" : "%s (%s 前)",
"Calendar: %s" : "日历:%s",
@@ -73,8 +73,16 @@ OC.L10N.register(
"Where: %s" : "地点:%s",
"%1$s via %2$s" : "%1$s 通过 %2$s",
"Cancelled: %1$s" : "已取消:%1$s",
+ "\"%1$s\" has been canceled" : "“%1$s”已取消",
"Re: %1$s" : "回复:%1$s",
+ "%1$s has accepted your invitation" : "%1$s 已接受您的邀请",
+ "%1$s has tentatively accepted your invitation" : "%1$s 暂时接受了您的邀请",
+ "%1$s has declined your invitation" : "%1$s 已拒绝了您的邀请",
+ "%1$s has responded to your invitation" : "%1$s 已回应了您的邀请",
+ "Invitation updated: %1$s" : "邀请已更新:%1$s",
+ "%1$s updated the event \"%2$s\"" : "%1$s 已更新事件“%2$s”",
"Invitation: %1$s" : "邀请:%1$s",
+ "%1$s would like to invite you to \"%2$s\"" : "%1$s 想邀请您加入“%2$s”",
"Organizer:" : "组织者:",
"Attendees:" : "与会者:",
"Title:" : "标题:",
@@ -110,6 +118,8 @@ OC.L10N.register(
"{actor} updated contact {card} in address book {addressbook}" : "{actor} 更新了通讯录 {addressbook} 中的联系人 {card} ",
"You updated contact {card} in address book {addressbook}" : "你更新了通讯录 {addressbook} 中的联系人 {card} ",
"A <strong>contact</strong> or <strong>address book</strong> was modified" : "一名 <strong>联系人</strong>或一个<strong>通讯录</strong>被更改了",
+ "Accounts" : "账户",
+ "System address book which holds all accounts" : "包含所有账户的系统通讯录",
"File is not updatable: %1$s" : "无法更新文件:%1$s",
"Could not write to final file, canceled by hook" : "无法写入最终文件,操作被插件取消",
"Could not write file contents" : "无法写入文件内容",
@@ -127,22 +137,22 @@ OC.L10N.register(
"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." : "系统处于维护模式 ",
+ "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." : "您的%s 需要配置使用HTTPS以在iOS/macOS中使用CalDAV和CardDAV。",
+ "Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "您的 %s 需要配置使用 HTTPS 以在 iOS/macOS 中使用 CalDAV 和 CardDAV。",
"Configures a CalDAV account" : "配置一个 CalDAV 账号",
"Configures a CardDAV account" : "配置一个 CardDAV 账号",
"Events" : "事件",
"Tasks" : "任务",
"Untitled task" : "无标题任务",
"Completed on %s" : "已完成 %s",
- "Due on %s by %s" : "到期于%s ,在%s之前",
- "Due 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端点",
+ "WebDAV endpoint" : "WebDAV 端点",
"Availability" : "可用性",
"If you configure your working hours, other users will see when you are out of office when they book a meeting." : "如果您配置了工作时间,其他用户在预订会议时就会了解您何时不在办公室。",
"Time zone:" : "时区:",
@@ -172,8 +182,8 @@ OC.L10N.register(
"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}。",
+ "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}。",
"There was an error updating your attendance status." : "更新您的出席状态时出错。",
"Please contact the organizer directly." : "请直接联系组织者。",
"Are you accepting the invitation?" : "您是否接受邀请?",
diff --git a/apps/dav/l10n/zh_CN.json b/apps/dav/l10n/zh_CN.json
index a0033eaab87..051a53ef8df 100644
--- a/apps/dav/l10n/zh_CN.json
+++ b/apps/dav/l10n/zh_CN.json
@@ -1,6 +1,6 @@
{ "translations": {
"Calendar" : "日历",
- "To-dos" : "代办事项",
+ "To-dos" : "待办事项",
"Personal" : "个人",
"{actor} created calendar {calendar}" : "{actor} 创建了日历 {calendar}",
"You created calendar {calendar}" : "您创建的日历 {calendar}",
@@ -35,8 +35,8 @@
"{actor} restored event {event} of calendar {calendar}" : "{actor} 还原了事件 {event},它位于日历 {calendar}",
"You restored event {event} of calendar {calendar}" : "你还原了事件 {event},它位于日历 {calendar}",
"Busy" : "忙碌",
- "{actor} created to-do {todo} in list {calendar}" : "{actor} 在清单 {calendar} 中创建了代办事项 {todo}",
- "You created to-do {todo} in list {calendar}" : "您已在清单 {calendar} 中创建了代办事项 {todo}",
+ "{actor} created to-do {todo} in list {calendar}" : "{actor} 在清单 {calendar} 中创建了待办事项 {todo}",
+ "You created to-do {todo} in list {calendar}" : "您已在清单 {calendar} 中创建了待办事项 {todo}",
"{actor} deleted to-do {todo} from list {calendar}" : "{actor} 从列表 {calendar} 中删除了待办事项 {todo}",
"You deleted to-do {todo} from list {calendar}" : "你从列表 {calendar} 中删除了待办事项 {todo}",
"{actor} updated to-do {todo} in list {calendar}" : "{actor} 更新了列表 {calendar} 中的待办事项 {todo}",
@@ -61,8 +61,8 @@
"_%n year_::_%n years_" : ["%n 年"],
"_%n month_::_%n months_" : ["%n 月"],
"_%n day_::_%n days_" : ["%n 天"],
- "_%n hour_::_%n hours_" : ["%n 小时"],
- "_%n minute_::_%n minutes_" : ["%n 分钟"],
+ "_%n hour_::_%n hours_" : ["%n小时"],
+ "_%n minute_::_%n minutes_" : ["%n分钟"],
"%s (in %s)" : "%s (在 %s)",
"%s (%s ago)" : "%s (%s 前)",
"Calendar: %s" : "日历:%s",
@@ -71,8 +71,16 @@
"Where: %s" : "地点:%s",
"%1$s via %2$s" : "%1$s 通过 %2$s",
"Cancelled: %1$s" : "已取消:%1$s",
+ "\"%1$s\" has been canceled" : "“%1$s”已取消",
"Re: %1$s" : "回复:%1$s",
+ "%1$s has accepted your invitation" : "%1$s 已接受您的邀请",
+ "%1$s has tentatively accepted your invitation" : "%1$s 暂时接受了您的邀请",
+ "%1$s has declined your invitation" : "%1$s 已拒绝了您的邀请",
+ "%1$s has responded to your invitation" : "%1$s 已回应了您的邀请",
+ "Invitation updated: %1$s" : "邀请已更新:%1$s",
+ "%1$s updated the event \"%2$s\"" : "%1$s 已更新事件“%2$s”",
"Invitation: %1$s" : "邀请:%1$s",
+ "%1$s would like to invite you to \"%2$s\"" : "%1$s 想邀请您加入“%2$s”",
"Organizer:" : "组织者:",
"Attendees:" : "与会者:",
"Title:" : "标题:",
@@ -108,6 +116,8 @@
"{actor} updated contact {card} in address book {addressbook}" : "{actor} 更新了通讯录 {addressbook} 中的联系人 {card} ",
"You updated contact {card} in address book {addressbook}" : "你更新了通讯录 {addressbook} 中的联系人 {card} ",
"A <strong>contact</strong> or <strong>address book</strong> was modified" : "一名 <strong>联系人</strong>或一个<strong>通讯录</strong>被更改了",
+ "Accounts" : "账户",
+ "System address book which holds all accounts" : "包含所有账户的系统通讯录",
"File is not updatable: %1$s" : "无法更新文件:%1$s",
"Could not write to final file, canceled by hook" : "无法写入最终文件,操作被插件取消",
"Could not write file contents" : "无法写入文件内容",
@@ -125,22 +135,22 @@
"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." : "系统处于维护模式 ",
+ "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." : "您的%s 需要配置使用HTTPS以在iOS/macOS中使用CalDAV和CardDAV。",
+ "Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "您的 %s 需要配置使用 HTTPS 以在 iOS/macOS 中使用 CalDAV 和 CardDAV。",
"Configures a CalDAV account" : "配置一个 CalDAV 账号",
"Configures a CardDAV account" : "配置一个 CardDAV 账号",
"Events" : "事件",
"Tasks" : "任务",
"Untitled task" : "无标题任务",
"Completed on %s" : "已完成 %s",
- "Due on %s by %s" : "到期于%s ,在%s之前",
- "Due 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端点",
+ "WebDAV endpoint" : "WebDAV 端点",
"Availability" : "可用性",
"If you configure your working hours, other users will see when you are out of office when they book a meeting." : "如果您配置了工作时间,其他用户在预订会议时就会了解您何时不在办公室。",
"Time zone:" : "时区:",
@@ -170,8 +180,8 @@
"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}。",
+ "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}。",
"There was an error updating your attendance status." : "更新您的出席状态时出错。",
"Please contact the organizer directly." : "请直接联系组织者。",
"Are you accepting the invitation?" : "您是否接受邀请?",
diff --git a/apps/dav/lib/CalDAV/CalDavBackend.php b/apps/dav/lib/CalDAV/CalDavBackend.php
index 1cdb705ac92..94fe9acf356 100644
--- a/apps/dav/lib/CalDAV/CalDavBackend.php
+++ b/apps/dav/lib/CalDAV/CalDavBackend.php
@@ -3134,10 +3134,19 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
if ($keep < 0) {
throw new \InvalidArgumentException();
}
+
+ $query = $this->db->getQueryBuilder();
+ $query->select($query->func()->max('id'))
+ ->from('calendarchanges');
+
+ $maxId = $query->executeQuery()->fetchOne();
+ if (!$maxId || $maxId < $keep) {
+ return 0;
+ }
+
$query = $this->db->getQueryBuilder();
$query->delete('calendarchanges')
- ->orderBy('id', 'DESC')
- ->setFirstResult($keep);
+ ->where($query->expr()->lte('id', $query->createNamedParameter($maxId - $keep, IQueryBuilder::PARAM_INT), IQueryBuilder::PARAM_INT));
return $query->executeStatement();
}
diff --git a/apps/dav/lib/CardDAV/CardDavBackend.php b/apps/dav/lib/CardDAV/CardDavBackend.php
index 87e9cd22dac..f6ca364f4a5 100644
--- a/apps/dav/lib/CardDAV/CardDavBackend.php
+++ b/apps/dav/lib/CardDAV/CardDavBackend.php
@@ -1399,10 +1399,19 @@ class CardDavBackend implements BackendInterface, SyncSupport {
if ($keep < 0) {
throw new \InvalidArgumentException();
}
+
+ $query = $this->db->getQueryBuilder();
+ $query->select($query->func()->max('id'))
+ ->from('addressbookchanges');
+
+ $maxId = $query->executeQuery()->fetchOne();
+ if (!$maxId || $maxId < $keep) {
+ return 0;
+ }
+
$query = $this->db->getQueryBuilder();
$query->delete('addressbookchanges')
- ->orderBy('id', 'DESC')
- ->setFirstResult($keep);
+ ->where($query->expr()->lte('id', $query->createNamedParameter($maxId - $keep, IQueryBuilder::PARAM_INT), IQueryBuilder::PARAM_INT));
return $query->executeStatement();
}
diff --git a/apps/dav/lib/CardDAV/Converter.php b/apps/dav/lib/CardDAV/Converter.php
index c8add1b96a6..b3d8b094d69 100644
--- a/apps/dav/lib/CardDAV/Converter.php
+++ b/apps/dav/lib/CardDAV/Converter.php
@@ -92,7 +92,19 @@ class Converter {
$vCard->add(new Text($vCard, 'TEL', $property->getValue(), ['TYPE' => 'VOICE', 'X-NC-SCOPE' => $scope]));
break;
case IAccountManager::PROPERTY_ADDRESS:
- $vCard->add(new Text($vCard, 'ADR', $property->getValue(), ['TYPE' => 'OTHER', 'X-NC-SCOPE' => $scope]));
+ // structured prop: https://www.rfc-editor.org/rfc/rfc6350.html#section-6.3.1
+ // post office box;extended address;street address;locality;region;postal code;country
+ $vCard->add(
+ new Text(
+ $vCard,
+ 'ADR',
+ [ '', '', '', $property->getValue(), '', '', '' ],
+ [
+ 'TYPE' => 'OTHER',
+ 'X-NC-SCOPE' => $scope,
+ ]
+ )
+ );
break;
case IAccountManager::PROPERTY_TWITTER:
$vCard->add(new Text($vCard, 'X-SOCIALPROFILE', $property->getValue(), ['TYPE' => 'TWITTER', 'X-NC-SCOPE' => $scope]));
diff --git a/apps/dav/lib/CardDAV/SystemAddressbook.php b/apps/dav/lib/CardDAV/SystemAddressbook.php
index 5587324efcd..498c4e95be7 100644
--- a/apps/dav/lib/CardDAV/SystemAddressbook.php
+++ b/apps/dav/lib/CardDAV/SystemAddressbook.php
@@ -64,7 +64,7 @@ class SystemAddressbook extends AddressBook {
IUserSession $userSession,
?IRequest $request = null,
?TrustedServers $trustedServers = null,
- ?IGroupManager $groupManager) {
+ ?IGroupManager $groupManager = null) {
parent::__construct($carddavBackend, $addressBookInfo, $l10n);
$this->config = $config;
$this->userSession = $userSession;
diff --git a/apps/dav/lib/Comments/CommentNode.php b/apps/dav/lib/Comments/CommentNode.php
index 332c0e2d4d8..1d43c9c9309 100644
--- a/apps/dav/lib/Comments/CommentNode.php
+++ b/apps/dav/lib/Comments/CommentNode.php
@@ -165,10 +165,8 @@ class CommentNode implements \Sabre\DAV\INode, \Sabre\DAV\IProperties {
/**
* Returns the last modification time, as a unix timestamp
- *
- * @return int
*/
- public function getLastModified() {
+ public function getLastModified(): ?int {
return null;
}
diff --git a/apps/dav/lib/Comments/CommentsPlugin.php b/apps/dav/lib/Comments/CommentsPlugin.php
index bb07217a0ab..58de3e36139 100644
--- a/apps/dav/lib/Comments/CommentsPlugin.php
+++ b/apps/dav/lib/Comments/CommentsPlugin.php
@@ -176,7 +176,7 @@ class CommentsPlugin extends ServerPlugin {
}
if (!is_null($args['datetime'])) {
- $args['datetime'] = new \DateTime($args['datetime']);
+ $args['datetime'] = new \DateTime((string)$args['datetime']);
}
$results = $node->findChildren($args['limit'], $args['offset'], $args['datetime']);
@@ -189,7 +189,7 @@ class CommentsPlugin extends ServerPlugin {
$responses[] = new Response(
$this->server->getBaseUri() . $nodePath,
[200 => $resultSet[0][200]],
- 200
+ '200'
);
}
}
diff --git a/apps/dav/lib/Comments/EntityTypeCollection.php b/apps/dav/lib/Comments/EntityTypeCollection.php
index d140a33ec4c..32adcee54f0 100644
--- a/apps/dav/lib/Comments/EntityTypeCollection.php
+++ b/apps/dav/lib/Comments/EntityTypeCollection.php
@@ -42,25 +42,14 @@ use Sabre\DAV\Exception\NotFound;
* @package OCA\DAV\Comments
*/
class EntityTypeCollection extends RootCollection {
-
protected LoggerInterface $logger;
-
- /** @var IUserManager */
- protected $userManager;
+ protected IUserManager $userManager;
/** @var \Closure */
protected $childExistsFunction;
- /**
- * @param string $name
- * @param ICommentsManager $commentsManager
- * @param IUserManager $userManager
- * @param IUserSession $userSession
- * @param LoggerInterface $logger
- * @param \Closure $childExistsFunction
- */
public function __construct(
- $name,
+ string $name,
ICommentsManager $commentsManager,
IUserManager $userManager,
IUserSession $userSession,
@@ -68,7 +57,7 @@ class EntityTypeCollection extends RootCollection {
\Closure $childExistsFunction
) {
$name = trim($name);
- if (empty($name) || !is_string($name)) {
+ if (empty($name)) {
throw new \InvalidArgumentException('"name" parameter must be non-empty string');
}
$this->name = $name;
diff --git a/apps/dav/lib/Comments/RootCollection.php b/apps/dav/lib/Comments/RootCollection.php
index 9832030291e..39d644b4766 100644
--- a/apps/dav/lib/Comments/RootCollection.php
+++ b/apps/dav/lib/Comments/RootCollection.php
@@ -36,26 +36,14 @@ use Sabre\DAV\ICollection;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
class RootCollection implements ICollection {
-
/** @var EntityTypeCollection[]|null */
- private $entityTypeCollections;
-
- /** @var ICommentsManager */
- protected $commentsManager;
-
- /** @var string */
- protected $name = 'comments';
-
+ private ?array $entityTypeCollections = null;
+ protected ICommentsManager $commentsManager;
+ protected string $name = 'comments';
protected LoggerInterface $logger;
-
- /** @var IUserManager */
- protected $userManager;
-
- /** @var IUserSession */
- protected $userSession;
-
- /** @var EventDispatcherInterface */
- protected $dispatcher;
+ protected IUserManager $userManager;
+ protected IUserSession $userSession;
+ protected EventDispatcherInterface $dispatcher;
public function __construct(
ICommentsManager $commentsManager,
@@ -149,6 +137,7 @@ class RootCollection implements ICollection {
*/
public function getChildren() {
$this->initCollections();
+ assert(!is_null($this->entityTypeCollections));
return $this->entityTypeCollections;
}
@@ -160,6 +149,7 @@ class RootCollection implements ICollection {
*/
public function childExists($name) {
$this->initCollections();
+ assert(!is_null($this->entityTypeCollections));
return isset($this->entityTypeCollections[$name]);
}
@@ -196,7 +186,7 @@ class RootCollection implements ICollection {
/**
* Returns the last modification time, as a unix timestamp
*
- * @return int
+ * @return ?int
*/
public function getLastModified() {
return null;
diff --git a/apps/dav/lib/Connector/Sabre/DavAclPlugin.php b/apps/dav/lib/Connector/Sabre/DavAclPlugin.php
index 6164b28b625..7fa94d7b903 100644
--- a/apps/dav/lib/Connector/Sabre/DavAclPlugin.php
+++ b/apps/dav/lib/Connector/Sabre/DavAclPlugin.php
@@ -94,8 +94,19 @@ class DavAclPlugin extends \Sabre\DAVACL\Plugin {
$path = $request->getPath();
// prevent the plugin from causing an unneeded overhead for file requests
- if (!str_starts_with($path, 'files/')) {
- parent::beforeMethod($request, $response);
+ if (str_starts_with($path, 'files/')) {
+ return;
+ }
+
+ parent::beforeMethod($request, $response);
+
+ $createAddressbookOrCalendarRequest = ($request->getMethod() === 'MKCALENDAR' || $request->getMethod() === 'MKCOL')
+ && (str_starts_with($path, 'addressbooks/') || str_starts_with($path, 'calendars/'));
+
+ if ($createAddressbookOrCalendarRequest) {
+ [$parentName] = \Sabre\Uri\split($path);
+ // is calendars/users/bob or addressbooks/users/bob writeable?
+ $this->checkPrivileges($parentName, '{DAV:}write');
}
}
}
diff --git a/apps/dav/lib/Migration/Version1027Date20230504122946.php b/apps/dav/lib/Migration/Version1027Date20230504122946.php
index e9ae174f56e..be3d19e8a80 100644
--- a/apps/dav/lib/Migration/Version1027Date20230504122946.php
+++ b/apps/dav/lib/Migration/Version1027Date20230504122946.php
@@ -34,6 +34,7 @@ use OCP\Migration\SimpleMigrationStep;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
use Psr\Log\LoggerInterface;
+use Throwable;
class Version1027Date20230504122946 extends SimpleMigrationStep {
private SyncService $syncService;
@@ -49,6 +50,13 @@ class Version1027Date20230504122946 extends SimpleMigrationStep {
* @param array $options
*/
public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options): void {
- $this->syncService->syncInstance();
+ try {
+ $this->syncService->syncInstance();
+ } catch (Throwable $e) {
+ $this->logger->error('Could not sync system address books during update', [
+ 'exception' => $e,
+ ]);
+ $output->warning('System address book sync failed. See logs for details');
+ }
}
}
diff --git a/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php b/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php
index 69096d0cfbb..0fdd617943b 100644
--- a/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php
+++ b/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php
@@ -1291,6 +1291,8 @@ EOD;
*/
public function testPruneOutdatedSyncTokens(): void {
$calendarId = $this->createTestCalendar();
+ $changes = $this->backend->getChangesForCalendar($calendarId, '', 1);
+ $syncToken = $changes['syncToken'];
$uri = static::getUniqueID('calobj');
$calData = <<<EOD
@@ -1333,9 +1335,79 @@ EOD;
$deleted = $this->backend->pruneOutdatedSyncTokens(0);
// At least one from the object creation and one from the object update
$this->assertGreaterThanOrEqual(2, $deleted);
- $changes = $this->backend->getChangesForCalendar($calendarId, '5', 1);
+ $changes = $this->backend->getChangesForCalendar($calendarId, $syncToken, 1);
$this->assertEmpty($changes['added']);
$this->assertEmpty($changes['modified']);
$this->assertEmpty($changes['deleted']);
+
+ // Test that objects remain
+
+ // Currently changes are empty
+ $changes = $this->backend->getChangesForCalendar($calendarId, $syncToken, 100);
+ $this->assertEquals(0, count($changes['added'] + $changes['modified'] + $changes['deleted']));
+
+ // Create card
+ $uri = static::getUniqueID('calobj');
+$calData = <<<EOD
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:Nextcloud Calendar
+BEGIN:VEVENT
+CREATED;VALUE=DATE-TIME:20230910T125139Z
+UID:47d15e3ec9
+LAST-MODIFIED;VALUE=DATE-TIME:20230910T125139Z
+DTSTAMP;VALUE=DATE-TIME:20230910T125139Z
+SUMMARY:Test Event
+DTSTART;VALUE=DATE-TIME:20230912T130000Z
+DTEND;VALUE=DATE-TIME:20230912T140000Z
+CLASS:PUBLIC
+END:VEVENT
+END:VCALENDAR
+EOD;
+ $this->backend->createCalendarObject($calendarId, $uri, $calData);
+
+ // We now have one add
+ $changes = $this->backend->getChangesForCalendar($calendarId, $syncToken, 100);
+ $this->assertEquals(1, count($changes['added']));
+ $this->assertEmpty($changes['modified']);
+ $this->assertEmpty($changes['deleted']);
+
+ // update the card
+ $calData = <<<'EOD'
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:Nextcloud Calendar
+BEGIN:VEVENT
+CREATED;VALUE=DATE-TIME:20230910T125139Z
+UID:47d15e3ec9
+LAST-MODIFIED;VALUE=DATE-TIME:20230910T125139Z
+DTSTAMP;VALUE=DATE-TIME:20230910T125139Z
+SUMMARY:123 Event 🙈
+DTSTART;VALUE=DATE-TIME:20230912T130000Z
+DTEND;VALUE=DATE-TIME:20230912T140000Z
+ATTENDEE;CN=test:mailto:foo@bar.com
+END:VEVENT
+END:VCALENDAR
+EOD;
+ $this->backend->updateCalendarObject($calendarId, $uri, $calData);
+
+ // One add, one modify, but shortened to modify
+ $changes = $this->backend->getChangesForCalendar($calendarId, $syncToken, 100);
+ $this->assertEmpty($changes['added']);
+ $this->assertEquals(1, count($changes['modified']));
+ $this->assertEmpty($changes['deleted']);
+
+ // Delete all but last change
+ $deleted = $this->backend->pruneOutdatedSyncTokens(1);
+ $this->assertEquals(1, $deleted); // We had two changes before, now one
+
+ // Only update should remain
+ $changes = $this->backend->getChangesForCalendar($calendarId, $syncToken, 100);
+ $this->assertEmpty($changes['added']);
+ $this->assertEquals(1, count($changes['modified']));
+ $this->assertEmpty($changes['deleted']);
+
+ // Check that no crash occurs when prune is called without current changes
+ $deleted = $this->backend->pruneOutdatedSyncTokens(1);
}
}
diff --git a/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php b/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php
index adf64ef82b0..425e7c44ba7 100644
--- a/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php
+++ b/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php
@@ -853,15 +853,54 @@ class CardDavBackendTest extends TestCase {
*/
public function testPruneOutdatedSyncTokens(): void {
$addressBookId = $this->backend->createAddressBook(self::UNIT_TEST_USER, 'Example', []);
+ $changes = $this->backend->getChangesForAddressBook($addressBookId, '', 1);
+ $syncToken = $changes['syncToken'];
+
$uri = $this->getUniqueID('card');
$this->backend->createCard($addressBookId, $uri, $this->vcardTest0);
$this->backend->updateCard($addressBookId, $uri, $this->vcardTest1);
$deleted = $this->backend->pruneOutdatedSyncTokens(0);
// At least one from the object creation and one from the object update
$this->assertGreaterThanOrEqual(2, $deleted);
- $changes = $this->backend->getChangesForAddressBook($addressBookId, '5', 1);
+ $changes = $this->backend->getChangesForAddressBook($addressBookId, $syncToken, 1);
$this->assertEmpty($changes['added']);
$this->assertEmpty($changes['modified']);
$this->assertEmpty($changes['deleted']);
+
+ // Test that objects remain
+
+ // Currently changes are empty
+ $changes = $this->backend->getChangesForAddressBook($addressBookId, $syncToken, 100);
+ $this->assertEquals(0, count($changes['added'] + $changes['modified'] + $changes['deleted']));
+
+ // Create card
+ $uri = $this->getUniqueID('card');
+ $this->backend->createCard($addressBookId, $uri, $this->vcardTest0);
+ // We now have one add
+ $changes = $this->backend->getChangesForAddressBook($addressBookId, $syncToken, 100);
+ $this->assertEquals(1, count($changes['added']));
+ $this->assertEmpty($changes['modified']);
+ $this->assertEmpty($changes['deleted']);
+
+ // Update card
+ $this->backend->updateCard($addressBookId, $uri, $this->vcardTest1);
+ // One add, one modify, but shortened to modify
+ $changes = $this->backend->getChangesForAddressBook($addressBookId, $syncToken, 100);
+ $this->assertEmpty($changes['added']);
+ $this->assertEquals(1, count($changes['modified']));
+ $this->assertEmpty($changes['deleted']);
+
+ // Delete all but last change
+ $deleted = $this->backend->pruneOutdatedSyncTokens(1);
+ $this->assertEquals(1, $deleted); // We had two changes before, now one
+
+ // Only update should remain
+ $changes = $this->backend->getChangesForAddressBook($addressBookId, $syncToken, 100);
+ $this->assertEmpty($changes['added']);
+ $this->assertEquals(1, count($changes['modified']));
+ $this->assertEmpty($changes['deleted']);
+
+ // Check that no crash occurs when prune is called without current changes
+ $deleted = $this->backend->pruneOutdatedSyncTokens(1);
}
}