Compare commits

..

1 Commits

Author SHA1 Message Date
Git'Fellow f0d4a68aae refactor(accountManager): strict typing, and social handle fixes
Signed-off-by: Git'Fellow <12234510+solracsf@users.noreply.github.com>
2026-03-13 18:53:06 +01:00
354 changed files with 1046 additions and 1785 deletions
+1 -1
View File
@@ -228,8 +228,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "تعذر التحقُّق من إعداد خادم الويب عندك بالشكل الصحيح للسماح بمزامنة الملفات عبر WebDAV. يرجى التحقُّق يدوياً.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : " لم يتم تعيين السماح لخادمك السحابي بتزامن الملف، بسبب واجهة التأليف الموزع على الويب وتعيين الإصدار WebDAV غير متصلة.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "خادم الويب عندك مُهيّءٌ بالشكل الصحيح للسماح بمزامنة الملفات عبر WebDAV.",
"Calendars including events, details and attendees" : "تحوي التقاويم الأحداث، و تفاصيلها، و الحُضُور",
"Migrated calendar (%1$s)" : "تقويم مُرحّل (%1$s)",
"Calendars including events, details and attendees" : "تحوي التقاويم الأحداث، و تفاصيلها، و الحُضُور",
"Contacts and groups" : "جهات الاتصال والمجموعات",
"WebDAV" : "WebDAV",
"Absence saved" : "تمّ حفظ الغياب",
+1 -1
View File
@@ -226,8 +226,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "تعذر التحقُّق من إعداد خادم الويب عندك بالشكل الصحيح للسماح بمزامنة الملفات عبر WebDAV. يرجى التحقُّق يدوياً.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : " لم يتم تعيين السماح لخادمك السحابي بتزامن الملف، بسبب واجهة التأليف الموزع على الويب وتعيين الإصدار WebDAV غير متصلة.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "خادم الويب عندك مُهيّءٌ بالشكل الصحيح للسماح بمزامنة الملفات عبر WebDAV.",
"Calendars including events, details and attendees" : "تحوي التقاويم الأحداث، و تفاصيلها، و الحُضُور",
"Migrated calendar (%1$s)" : "تقويم مُرحّل (%1$s)",
"Calendars including events, details and attendees" : "تحوي التقاويم الأحداث، و تفاصيلها، و الحُضُور",
"Contacts and groups" : "جهات الاتصال والمجموعات",
"WebDAV" : "WebDAV",
"Absence saved" : "تمّ حفظ الغياب",
+1 -1
View File
@@ -169,8 +169,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Nun se pudo comprobar que'l sirvidor web se configurare afayadizamente pa permitir la configuración de ficheros per WebDAV. Compruébalo manualmente.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "El sirividor web nun ta configuráu afayadizamente pa permitir la sincronización de ficheros porque la interfaz WebDAV paez tar estropiada.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "El sirvidor web ta configuráu afayadizamente pa permitir la sincronización de ficheros per WebDAV.",
"Calendars including events, details and attendees" : "Calendarios qu'inclúin eventos, detalles y asistentes",
"Migrated calendar (%1$s)" : "Calendariu migráu (%1$s)",
"Calendars including events, details and attendees" : "Calendarios qu'inclúin eventos, detalles y asistentes",
"Contacts and groups" : "Contautos y grupos",
"WebDAV" : "WebDAV",
"Absence saved" : "Guardóse l'ausencia",
+1 -1
View File
@@ -167,8 +167,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Nun se pudo comprobar que'l sirvidor web se configurare afayadizamente pa permitir la configuración de ficheros per WebDAV. Compruébalo manualmente.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "El sirividor web nun ta configuráu afayadizamente pa permitir la sincronización de ficheros porque la interfaz WebDAV paez tar estropiada.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "El sirvidor web ta configuráu afayadizamente pa permitir la sincronización de ficheros per WebDAV.",
"Calendars including events, details and attendees" : "Calendarios qu'inclúin eventos, detalles y asistentes",
"Migrated calendar (%1$s)" : "Calendariu migráu (%1$s)",
"Calendars including events, details and attendees" : "Calendarios qu'inclúin eventos, detalles y asistentes",
"Contacts and groups" : "Contautos y grupos",
"WebDAV" : "WebDAV",
"Absence saved" : "Guardóse l'ausencia",
+1 -1
View File
@@ -165,8 +165,8 @@ OC.L10N.register(
"Due on %s" : "Краен срок на %s",
"WebDAV endpoint" : "WebDAV крайна точка",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Вашият уеб сървър все още не е удачно настроен да позволява синхронизация на файлове, защото WebDAV интерфейсът не работи.",
"Calendars including events, details and attendees" : "Календари, включително събития, подробности и участници",
"Migrated calendar (%1$s)" : "Мигриран календар (%1$s)",
"Calendars including events, details and attendees" : "Календари, включително събития, подробности и участници",
"Contacts and groups" : "Контакти и групи",
"WebDAV" : "WebDAV",
"Absence saved" : "Отсъствието е запаметено",
+1 -1
View File
@@ -163,8 +163,8 @@
"Due on %s" : "Краен срок на %s",
"WebDAV endpoint" : "WebDAV крайна точка",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Вашият уеб сървър все още не е удачно настроен да позволява синхронизация на файлове, защото WebDAV интерфейсът не работи.",
"Calendars including events, details and attendees" : "Календари, включително събития, подробности и участници",
"Migrated calendar (%1$s)" : "Мигриран календар (%1$s)",
"Calendars including events, details and attendees" : "Календари, включително събития, подробности и участници",
"Contacts and groups" : "Контакти и групи",
"WebDAV" : "WebDAV",
"Absence saved" : "Отсъствието е запаметено",
+1 -1
View File
@@ -228,8 +228,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "No s'ha pogut comprovar que el vostre servidor web estigui configurat correctament per a permetre la sincronització de fitxers mitjançant WebDAV. Comproveu-ho manualment.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "El vostre servidor web no està configurat correctament per a permetre la sincronització de fitxers perquè sembla que la interfície WebDAV no funciona correctament.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "El vostre servidor web està configurat correctament per a permetre la sincronització de fitxers mitjançant WebDAV.",
"Calendars including events, details and attendees" : "Calendaris amb esdeveniments, detalls i assistents",
"Migrated calendar (%1$s)" : "Calendari migrat (%1$s)",
"Calendars including events, details and attendees" : "Calendaris amb esdeveniments, detalls i assistents",
"Contacts and groups" : "Contactes i grups",
"WebDAV" : "WebDAV",
"Absence saved" : "S'ha desat l'absència",
+1 -1
View File
@@ -226,8 +226,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "No s'ha pogut comprovar que el vostre servidor web estigui configurat correctament per a permetre la sincronització de fitxers mitjançant WebDAV. Comproveu-ho manualment.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "El vostre servidor web no està configurat correctament per a permetre la sincronització de fitxers perquè sembla que la interfície WebDAV no funciona correctament.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "El vostre servidor web està configurat correctament per a permetre la sincronització de fitxers mitjançant WebDAV.",
"Calendars including events, details and attendees" : "Calendaris amb esdeveniments, detalls i assistents",
"Migrated calendar (%1$s)" : "Calendari migrat (%1$s)",
"Calendars including events, details and attendees" : "Calendaris amb esdeveniments, detalls i assistents",
"Contacts and groups" : "Contactes i grups",
"WebDAV" : "WebDAV",
"Absence saved" : "S'ha desat l'absència",
+1 -1
View File
@@ -268,8 +268,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Nepodařilo se zkontrolovat že vámi využívaný webový server je správně nastaven tak, aby umožňoval synchronizaci přes WebDAV. Zkontrolujte to ručně.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Váš webový server ještě není správně nastaven, pro umožnění synchronizace souborů, rozhraní WebDAV pravděpodobně není funkční.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Vámi využívaný webový server je správně nastaven pro umotnění synchronizace souborů přes WebDAV",
"Calendars including events, details and attendees" : "Kalendáře včetně událostí, podrobností a účastníků",
"Migrated calendar (%1$s)" : "Přesunut kalendář (%1$s)",
"Calendars including events, details and attendees" : "Kalendáře včetně událostí, podrobností a účastníků",
"Contacts and groups" : "Kontakty a skupiny",
"WebDAV" : "WebDAV",
"Absence saved" : "Nepřítomnost uložena",
+1 -1
View File
@@ -266,8 +266,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Nepodařilo se zkontrolovat že vámi využívaný webový server je správně nastaven tak, aby umožňoval synchronizaci přes WebDAV. Zkontrolujte to ručně.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Váš webový server ještě není správně nastaven, pro umožnění synchronizace souborů, rozhraní WebDAV pravděpodobně není funkční.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Vámi využívaný webový server je správně nastaven pro umotnění synchronizace souborů přes WebDAV",
"Calendars including events, details and attendees" : "Kalendáře včetně událostí, podrobností a účastníků",
"Migrated calendar (%1$s)" : "Přesunut kalendář (%1$s)",
"Calendars including events, details and attendees" : "Kalendáře včetně událostí, podrobností a účastníků",
"Contacts and groups" : "Kontakty a skupiny",
"WebDAV" : "WebDAV",
"Absence saved" : "Nepřítomnost uložena",
+1 -1
View File
@@ -236,8 +236,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Kunne ikke kontrollere, at din webserver er korrekt konfigureret til at tillade filsynkronisering over WebDAV. Tjek venligst manuelt.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Din webserver er endnu ikke sat korrekt op til at tillade filsynkronisering, fordi WebDAV-grænsefladen ser ud til at være i stykker.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Din webserver er korrekt konfigureret til at tillade filsynkronisering over WebDAV.",
"Calendars including events, details and attendees" : "Kalendere indeholdende begivenheder, detaljer og deltagere",
"Migrated calendar (%1$s)" : "Migreret kalender (%1$s)",
"Calendars including events, details and attendees" : "Kalendere indeholdende begivenheder, detaljer og deltagere",
"Contacts and groups" : "Kontakter og grupper",
"WebDAV" : "WebDAV",
"Absence saved" : "Fraværet er gemt",
+1 -1
View File
@@ -234,8 +234,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Kunne ikke kontrollere, at din webserver er korrekt konfigureret til at tillade filsynkronisering over WebDAV. Tjek venligst manuelt.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Din webserver er endnu ikke sat korrekt op til at tillade filsynkronisering, fordi WebDAV-grænsefladen ser ud til at være i stykker.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Din webserver er korrekt konfigureret til at tillade filsynkronisering over WebDAV.",
"Calendars including events, details and attendees" : "Kalendere indeholdende begivenheder, detaljer og deltagere",
"Migrated calendar (%1$s)" : "Migreret kalender (%1$s)",
"Calendars including events, details and attendees" : "Kalendere indeholdende begivenheder, detaljer og deltagere",
"Contacts and groups" : "Kontakter og grupper",
"WebDAV" : "WebDAV",
"Absence saved" : "Fraværet er gemt",
+1 -1
View File
@@ -270,8 +270,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Es konnte nicht überprüft werden, ob der Webserver ordnungsgemäß eingerichtet ist, um Dateisynchronisation über WebDAV zu ermöglichen. Bitte dies manuell überprüfen.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Der Webserver ist noch nicht hinreichend für Datei-Synchronisierung konfiguriert, da die WebDAV-Schnittstelle vermutlich nicht funktioniert.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Der Webserver ist ordnungsgemäß eingerichtet um Dateisynchronisation über WebDAV zu ermöglichen.",
"Calendars including events, details and attendees" : "Kalender mit Terminen, Details und Teilnehmern",
"Migrated calendar (%1$s)" : "Migrierter Kalender (%1$s)",
"Calendars including events, details and attendees" : "Kalender mit Terminen, Details und Teilnehmern",
"Contacts and groups" : "Kontakte und Gruppen",
"WebDAV" : "WebDAV",
"Absence saved" : "Abwesenheit gespeichert",
+1 -1
View File
@@ -268,8 +268,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Es konnte nicht überprüft werden, ob der Webserver ordnungsgemäß eingerichtet ist, um Dateisynchronisation über WebDAV zu ermöglichen. Bitte dies manuell überprüfen.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Der Webserver ist noch nicht hinreichend für Datei-Synchronisierung konfiguriert, da die WebDAV-Schnittstelle vermutlich nicht funktioniert.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Der Webserver ist ordnungsgemäß eingerichtet um Dateisynchronisation über WebDAV zu ermöglichen.",
"Calendars including events, details and attendees" : "Kalender mit Terminen, Details und Teilnehmern",
"Migrated calendar (%1$s)" : "Migrierter Kalender (%1$s)",
"Calendars including events, details and attendees" : "Kalender mit Terminen, Details und Teilnehmern",
"Contacts and groups" : "Kontakte und Gruppen",
"WebDAV" : "WebDAV",
"Absence saved" : "Abwesenheit gespeichert",
+1 -1
View File
@@ -270,8 +270,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Es konnte nicht überprüft werden, ob Ihr Webserver ordnungsgemäß eingerichtet ist, um Dateisynchronisation über WebDAV zu ermöglichen. Bitte überprüfen Sie dies manuell.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Ihr Webserver ist noch nicht hinreichend für Datei-Synchronisierung konfiguriert. Die WebDAV-Schnittstelle ist vermutlich defekt.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Ihr Webserver ist ordnungsgemäß eingerichtet um Dateisynchronisation über WebDAV zu ermöglichen.",
"Calendars including events, details and attendees" : "Kalender mit Terminen, Details und Teilnehmern",
"Migrated calendar (%1$s)" : "Migrierter Kalender (%1$s)",
"Calendars including events, details and attendees" : "Kalender mit Terminen, Details und Teilnehmern",
"Contacts and groups" : "Kontakte und Gruppen",
"WebDAV" : "WebDAV",
"Absence saved" : "Abwesenheit gespeichert",
+1 -1
View File
@@ -268,8 +268,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Es konnte nicht überprüft werden, ob Ihr Webserver ordnungsgemäß eingerichtet ist, um Dateisynchronisation über WebDAV zu ermöglichen. Bitte überprüfen Sie dies manuell.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Ihr Webserver ist noch nicht hinreichend für Datei-Synchronisierung konfiguriert. Die WebDAV-Schnittstelle ist vermutlich defekt.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Ihr Webserver ist ordnungsgemäß eingerichtet um Dateisynchronisation über WebDAV zu ermöglichen.",
"Calendars including events, details and attendees" : "Kalender mit Terminen, Details und Teilnehmern",
"Migrated calendar (%1$s)" : "Migrierter Kalender (%1$s)",
"Calendars including events, details and attendees" : "Kalender mit Terminen, Details und Teilnehmern",
"Contacts and groups" : "Kontakte und Gruppen",
"WebDAV" : "WebDAV",
"Absence saved" : "Abwesenheit gespeichert",
+1 -1
View File
@@ -268,8 +268,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Αδυναμία ελέγχου ότι ο διακομιστής σας είναι σωστά ρυθμισμένος για να επιτρέπει τον συγχρονισμό αρχείων μέσω WebDAV. Παρακαλώ ελέγξτε χειροκίνητα.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Ο διακομιστής σας δεν έχει ρυθμιστεί ακόμη κατάλληλα ώστε να επιτρέπει τον συγχρονισμό αρχείων, διότι η διεπαφή WebDAV φαίνεται να μη λειτουργεί.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Ο διακομιστής σας είναι σωστά ρυθμισμένος για να επιτρέπει τον συγχρονισμό αρχείων μέσω WebDAV.",
"Calendars including events, details and attendees" : "Ημερολόγια συμπεριλαμβανομένων εκδηλώσεων, λεπτομερειών και συμμετεχόντων",
"Migrated calendar (%1$s)" : "Μεταφερμένο ημερολόγιο (%1$s)",
"Calendars including events, details and attendees" : "Ημερολόγια συμπεριλαμβανομένων εκδηλώσεων, λεπτομερειών και συμμετεχόντων",
"Contacts and groups" : "Επαφές και ομάδες",
"WebDAV" : "WebDAV",
"Absence saved" : "Απουσία αποθηκεύτηκε",
+1 -1
View File
@@ -266,8 +266,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Αδυναμία ελέγχου ότι ο διακομιστής σας είναι σωστά ρυθμισμένος για να επιτρέπει τον συγχρονισμό αρχείων μέσω WebDAV. Παρακαλώ ελέγξτε χειροκίνητα.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Ο διακομιστής σας δεν έχει ρυθμιστεί ακόμη κατάλληλα ώστε να επιτρέπει τον συγχρονισμό αρχείων, διότι η διεπαφή WebDAV φαίνεται να μη λειτουργεί.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Ο διακομιστής σας είναι σωστά ρυθμισμένος για να επιτρέπει τον συγχρονισμό αρχείων μέσω WebDAV.",
"Calendars including events, details and attendees" : "Ημερολόγια συμπεριλαμβανομένων εκδηλώσεων, λεπτομερειών και συμμετεχόντων",
"Migrated calendar (%1$s)" : "Μεταφερμένο ημερολόγιο (%1$s)",
"Calendars including events, details and attendees" : "Ημερολόγια συμπεριλαμβανομένων εκδηλώσεων, λεπτομερειών και συμμετεχόντων",
"Contacts and groups" : "Επαφές και ομάδες",
"WebDAV" : "WebDAV",
"Absence saved" : "Απουσία αποθηκεύτηκε",
+1 -1
View File
@@ -269,8 +269,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Your web server is not yet properly set up to allow file synchronisation, because the WebDAV interface seems to be broken.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Your web server is properly set up to allow file synchronization over WebDAV.",
"Calendars including events, details and attendees" : "Calendars including events, details and attendees",
"Migrated calendar (%1$s)" : "Migrated calendar (%1$s)",
"Calendars including events, details and attendees" : "Calendars including events, details and attendees",
"Contacts and groups" : "Contacts and groups",
"WebDAV" : "WebDAV",
"Absence saved" : "Absence saved",
+1 -1
View File
@@ -267,8 +267,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Your web server is not yet properly set up to allow file synchronisation, because the WebDAV interface seems to be broken.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Your web server is properly set up to allow file synchronization over WebDAV.",
"Calendars including events, details and attendees" : "Calendars including events, details and attendees",
"Migrated calendar (%1$s)" : "Migrated calendar (%1$s)",
"Calendars including events, details and attendees" : "Calendars including events, details and attendees",
"Contacts and groups" : "Contacts and groups",
"WebDAV" : "WebDAV",
"Absence saved" : "Absence saved",
+1 -1
View File
@@ -236,8 +236,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "No se pudo verificar si su servidor web está adecuadamente configurado para permitir la sincronización de archivos a través de WebDAV. Por favor, verifique manualmente.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Su servidor web todavía no está configurado correctamente para permitir la sincronización de archivos, porque la interfaz WebDAV parece estar rota.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Su servidor web está adecuadamente configurado para permitir la sincronización de archivos a través de WebDAV.",
"Calendars including events, details and attendees" : "Calendarios que incluyen eventos, detalles y asistentes",
"Migrated calendar (%1$s)" : "Se migró el calendario (%1$s)",
"Calendars including events, details and attendees" : "Calendarios que incluyen eventos, detalles y asistentes",
"Contacts and groups" : "Contactos y grupos",
"WebDAV" : "WebDAV",
"Absence saved" : "Ausencia guardada",
+1 -1
View File
@@ -234,8 +234,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "No se pudo verificar si su servidor web está adecuadamente configurado para permitir la sincronización de archivos a través de WebDAV. Por favor, verifique manualmente.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Su servidor web todavía no está configurado correctamente para permitir la sincronización de archivos, porque la interfaz WebDAV parece estar rota.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Su servidor web está adecuadamente configurado para permitir la sincronización de archivos a través de WebDAV.",
"Calendars including events, details and attendees" : "Calendarios que incluyen eventos, detalles y asistentes",
"Migrated calendar (%1$s)" : "Se migró el calendario (%1$s)",
"Calendars including events, details and attendees" : "Calendarios que incluyen eventos, detalles y asistentes",
"Contacts and groups" : "Contactos y grupos",
"WebDAV" : "WebDAV",
"Absence saved" : "Ausencia guardada",
+1 -1
View File
@@ -167,8 +167,8 @@ OC.L10N.register(
"Due on %s" : "Vence el %s",
"WebDAV endpoint" : "Extremo WebDAV",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Tu servidor web aún no esta correctamente configurado para permitir la sincronización de archivos porque la interfaz WebDAV parece estar rota. ",
"Calendars including events, details and attendees" : "Calendarios que incluyen eventos, detalles y asistentes",
"Migrated calendar (%1$s)" : "Calendario migrado (%1$s)",
"Calendars including events, details and attendees" : "Calendarios que incluyen eventos, detalles y asistentes",
"Contacts and groups" : "Contactos y grupos",
"WebDAV" : "WebDAV",
"First day" : "Primer día",
+1 -1
View File
@@ -165,8 +165,8 @@
"Due on %s" : "Vence el %s",
"WebDAV endpoint" : "Extremo WebDAV",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Tu servidor web aún no esta correctamente configurado para permitir la sincronización de archivos porque la interfaz WebDAV parece estar rota. ",
"Calendars including events, details and attendees" : "Calendarios que incluyen eventos, detalles y asistentes",
"Migrated calendar (%1$s)" : "Calendario migrado (%1$s)",
"Calendars including events, details and attendees" : "Calendarios que incluyen eventos, detalles y asistentes",
"Contacts and groups" : "Contactos y grupos",
"WebDAV" : "WebDAV",
"First day" : "Primer día",
+1 -1
View File
@@ -190,8 +190,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "No se pudo verificar si su servidor web está adecuadamente configurado para permitir la sincronización mediante WebDAV. Por favor, revíselo manualmente.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Tu servidor web aún no esta correctamente configurado para permitir la sincronización de archivos porque la interfaz WebDAV parece estar rota. ",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Su servidor web está adecuadamente configurado para permitir la sincronización mediante WebDAV.",
"Calendars including events, details and attendees" : "Calendarios que incluyen eventos, detalles y asistentes",
"Migrated calendar (%1$s)" : "Calendario migrado (%1$s)",
"Calendars including events, details and attendees" : "Calendarios que incluyen eventos, detalles y asistentes",
"Contacts and groups" : "Contactos y grupos",
"WebDAV" : "WebDAV",
"Absence saved" : "Ausencia guardada",
+1 -1
View File
@@ -188,8 +188,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "No se pudo verificar si su servidor web está adecuadamente configurado para permitir la sincronización mediante WebDAV. Por favor, revíselo manualmente.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Tu servidor web aún no esta correctamente configurado para permitir la sincronización de archivos porque la interfaz WebDAV parece estar rota. ",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Su servidor web está adecuadamente configurado para permitir la sincronización mediante WebDAV.",
"Calendars including events, details and attendees" : "Calendarios que incluyen eventos, detalles y asistentes",
"Migrated calendar (%1$s)" : "Calendario migrado (%1$s)",
"Calendars including events, details and attendees" : "Calendarios que incluyen eventos, detalles y asistentes",
"Contacts and groups" : "Contactos y grupos",
"WebDAV" : "WebDAV",
"Absence saved" : "Ausencia guardada",
+1 -1
View File
@@ -270,8 +270,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Ei õnnestunud kontrollida, kas sinu veebiserver on korrektselt seadistatud ja võimaldab kasutada failide sünkroniseerimist WebDAV-i vahendusel. Palun kontrolli seda käsitsi.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Sinu veebiserver pole veel failide sünkroniseerimiseks vajalikult seadistatud, kuna WebDAV liides paistab olevat katki.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Sinu veebiserver on korrektselt seadistatud ja võimaldab kasutada failide sünkroniseerimist WebDAV-i vahendusel.",
"Calendars including events, details and attendees" : "Kalendrid, sealhulgas sündmused, üksikasjad ja osalejad",
"Migrated calendar (%1$s)" : "Ümberkolitud kalender (%1$s)",
"Calendars including events, details and attendees" : "Kalendrid, sealhulgas sündmused, üksikasjad ja osalejad",
"Contacts and groups" : "Kontaktid ja grupid",
"WebDAV" : "WebDAV",
"Absence saved" : "Äraoleku teave on salvestatud",
+1 -1
View File
@@ -268,8 +268,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Ei õnnestunud kontrollida, kas sinu veebiserver on korrektselt seadistatud ja võimaldab kasutada failide sünkroniseerimist WebDAV-i vahendusel. Palun kontrolli seda käsitsi.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Sinu veebiserver pole veel failide sünkroniseerimiseks vajalikult seadistatud, kuna WebDAV liides paistab olevat katki.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Sinu veebiserver on korrektselt seadistatud ja võimaldab kasutada failide sünkroniseerimist WebDAV-i vahendusel.",
"Calendars including events, details and attendees" : "Kalendrid, sealhulgas sündmused, üksikasjad ja osalejad",
"Migrated calendar (%1$s)" : "Ümberkolitud kalender (%1$s)",
"Calendars including events, details and attendees" : "Kalendrid, sealhulgas sündmused, üksikasjad ja osalejad",
"Contacts and groups" : "Kontaktid ja grupid",
"WebDAV" : "WebDAV",
"Absence saved" : "Äraoleku teave on salvestatud",
+1 -1
View File
@@ -236,8 +236,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Ezin izan da egiaztatu zure zerbitzaria WebDAV bidezko fitxategi-sinkronizazioa onartzeko ondo konfiguratuta badagoen. Mesedez, egiaztatu ezazu eskuz.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Zure web zerbitzaria ez dago behar bezala konfiguratuta fitxategien sinkronizazioa baimentzeko, WebDAV interfazea puskatuta dagoela dirudi.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Zure web zerbitzaria WebDAV bidezko fitxategien sinkronizazioa onartzeko ondo konfiguratuta dago.",
"Calendars including events, details and attendees" : "Egutegiak, gertaerak, xehetasunak eta parte-hartzaileak barne",
"Migrated calendar (%1$s)" : "Migratutako egutegia (%1$s)",
"Calendars including events, details and attendees" : "Egutegiak, gertaerak, xehetasunak eta parte-hartzaileak barne",
"Contacts and groups" : "Kontaktuak eta taldeak",
"WebDAV" : "WebDAV",
"Absence saved" : "Absentzia gordeta",
+1 -1
View File
@@ -234,8 +234,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Ezin izan da egiaztatu zure zerbitzaria WebDAV bidezko fitxategi-sinkronizazioa onartzeko ondo konfiguratuta badagoen. Mesedez, egiaztatu ezazu eskuz.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Zure web zerbitzaria ez dago behar bezala konfiguratuta fitxategien sinkronizazioa baimentzeko, WebDAV interfazea puskatuta dagoela dirudi.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Zure web zerbitzaria WebDAV bidezko fitxategien sinkronizazioa onartzeko ondo konfiguratuta dago.",
"Calendars including events, details and attendees" : "Egutegiak, gertaerak, xehetasunak eta parte-hartzaileak barne",
"Migrated calendar (%1$s)" : "Migratutako egutegia (%1$s)",
"Calendars including events, details and attendees" : "Egutegiak, gertaerak, xehetasunak eta parte-hartzaileak barne",
"Contacts and groups" : "Kontaktuak eta taldeak",
"WebDAV" : "WebDAV",
"Absence saved" : "Absentzia gordeta",
+1 -1
View File
@@ -266,8 +266,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "امکان بررسی اینکه سرور وب شما به درستی برای همگام‌سازی فایل از طریق WebDAV تنظیم شده است، وجود ندارد. لطفاً به صورت دستی بررسی کنید.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "سرور وب شما هنوز به درستی برای همگام‌سازی فایل تنظیم نشده است، زیرا به نظر می‌رسد رابط WebDAV خراب است.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "سرور وب شما به درستی برای همگام‌سازی فایل از طریق WebDAV تنظیم شده است.",
"Calendars including events, details and attendees" : "تقویم‌ها شامل رویدادها، جزئیات و شرکت‌کنندگان",
"Migrated calendar (%1$s)" : "تقویم منتقل شده (%1$s)",
"Calendars including events, details and attendees" : "تقویم‌ها شامل رویدادها، جزئیات و شرکت‌کنندگان",
"Contacts and groups" : "مخاطبین و گروه‌ها",
"WebDAV" : "وب‌دَو",
"Absence saved" : "غیبت ذخیره شد",
+1 -1
View File
@@ -264,8 +264,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "امکان بررسی اینکه سرور وب شما به درستی برای همگام‌سازی فایل از طریق WebDAV تنظیم شده است، وجود ندارد. لطفاً به صورت دستی بررسی کنید.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "سرور وب شما هنوز به درستی برای همگام‌سازی فایل تنظیم نشده است، زیرا به نظر می‌رسد رابط WebDAV خراب است.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "سرور وب شما به درستی برای همگام‌سازی فایل از طریق WebDAV تنظیم شده است.",
"Calendars including events, details and attendees" : "تقویم‌ها شامل رویدادها، جزئیات و شرکت‌کنندگان",
"Migrated calendar (%1$s)" : "تقویم منتقل شده (%1$s)",
"Calendars including events, details and attendees" : "تقویم‌ها شامل رویدادها، جزئیات و شرکت‌کنندگان",
"Contacts and groups" : "مخاطبین و گروه‌ها",
"WebDAV" : "وب‌دَو",
"Absence saved" : "غیبت ذخیره شد",
+1 -1
View File
@@ -268,8 +268,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Impossible de vérifier si votre serveur web est correctement configuré pour permettre la synchronisation de fichiers via WebDAV. Veuillez vérifier manuellement.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Votre serveur web nest pas encore correctement configuré pour la synchronisation de fichiers parce que linterface WebDAV semble ne pas fonctionner.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Votre serveur web est correctement configuré pour permettre la synchronisation de fichiers via WebDAV.",
"Calendars including events, details and attendees" : "Calendriers incluant des événements, détails et participants",
"Migrated calendar (%1$s)" : "Agenda migré (%1$s)",
"Calendars including events, details and attendees" : "Calendriers incluant des événements, détails et participants",
"Contacts and groups" : "Contacts et groupes",
"WebDAV" : "WebDAV",
"Absence saved" : "Message dabsence sauvegardé",
+1 -1
View File
@@ -266,8 +266,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Impossible de vérifier si votre serveur web est correctement configuré pour permettre la synchronisation de fichiers via WebDAV. Veuillez vérifier manuellement.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Votre serveur web nest pas encore correctement configuré pour la synchronisation de fichiers parce que linterface WebDAV semble ne pas fonctionner.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Votre serveur web est correctement configuré pour permettre la synchronisation de fichiers via WebDAV.",
"Calendars including events, details and attendees" : "Calendriers incluant des événements, détails et participants",
"Migrated calendar (%1$s)" : "Agenda migré (%1$s)",
"Calendars including events, details and attendees" : "Calendriers incluant des événements, détails et participants",
"Contacts and groups" : "Contacts et groupes",
"WebDAV" : "WebDAV",
"Absence saved" : "Message dabsence sauvegardé",
+1 -1
View File
@@ -269,8 +269,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Níorbh fhéidir a sheiceáil go bhfuil do fhreastalaí gréasáin socraithe i gceart chun sioncrónú comhad thar WebDAV a cheadú. Seiceáil le do thoil de láimh.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Níl do fhreastalaí gréasáin socraithe i gceart fós chun sioncrónú comhad a cheadú, mar is cosúil go bhfuil comhéadan WebDAV briste.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Tá do fhreastalaí gréasáin socraithe i gceart chun sioncrónú comhad thar WebDAV a cheadú.",
"Calendars including events, details and attendees" : "Féilirí lena n-áirítear imeachtaí, sonraí agus lucht freastail",
"Migrated calendar (%1$s)" : "Féilire aistrithe (%1$s)",
"Calendars including events, details and attendees" : "Féilirí lena n-áirítear imeachtaí, sonraí agus lucht freastail",
"Contacts and groups" : "Teagmhálaithe agus grúpaí",
"WebDAV" : "WebDAV",
"Absence saved" : "Neamhláithreacht shábháil",
+1 -1
View File
@@ -267,8 +267,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Níorbh fhéidir a sheiceáil go bhfuil do fhreastalaí gréasáin socraithe i gceart chun sioncrónú comhad thar WebDAV a cheadú. Seiceáil le do thoil de láimh.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Níl do fhreastalaí gréasáin socraithe i gceart fós chun sioncrónú comhad a cheadú, mar is cosúil go bhfuil comhéadan WebDAV briste.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Tá do fhreastalaí gréasáin socraithe i gceart chun sioncrónú comhad thar WebDAV a cheadú.",
"Calendars including events, details and attendees" : "Féilirí lena n-áirítear imeachtaí, sonraí agus lucht freastail",
"Migrated calendar (%1$s)" : "Féilire aistrithe (%1$s)",
"Calendars including events, details and attendees" : "Féilirí lena n-áirítear imeachtaí, sonraí agus lucht freastail",
"Contacts and groups" : "Teagmhálaithe agus grúpaí",
"WebDAV" : "WebDAV",
"Absence saved" : "Neamhláithreacht shábháil",
+1 -1
View File
@@ -269,8 +269,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Non foi posíbel comprobar que o seu servidor web estea configurado correctamente para permitir a sincronización de ficheiros a través de WebDAV. Compróbeo manualmente.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "O servidor non foi configurado correctamente para permitir a sincronización de ficheiros, semella que a interface WebDAV non está a funcionar.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "O seu servidor web está configurado correctamente para permitir a sincronización de ficheiros a través de WebDAV.",
"Calendars including events, details and attendees" : "Calendarios incluíndo eventos, detalles e asistentes",
"Migrated calendar (%1$s)" : "Calendario migrado (%1$s)",
"Calendars including events, details and attendees" : "Calendarios incluíndo eventos, detalles e asistentes",
"Contacts and groups" : "Contactos e grupos",
"WebDAV" : "WebDAV",
"Absence saved" : "Ausencia gardada",
+1 -1
View File
@@ -267,8 +267,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Non foi posíbel comprobar que o seu servidor web estea configurado correctamente para permitir a sincronización de ficheiros a través de WebDAV. Compróbeo manualmente.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "O servidor non foi configurado correctamente para permitir a sincronización de ficheiros, semella que a interface WebDAV non está a funcionar.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "O seu servidor web está configurado correctamente para permitir a sincronización de ficheiros a través de WebDAV.",
"Calendars including events, details and attendees" : "Calendarios incluíndo eventos, detalles e asistentes",
"Migrated calendar (%1$s)" : "Calendario migrado (%1$s)",
"Calendars including events, details and attendees" : "Calendarios incluíndo eventos, detalles e asistentes",
"Contacts and groups" : "Contactos e grupos",
"WebDAV" : "WebDAV",
"Absence saved" : "Ausencia gardada",
+1 -1
View File
@@ -268,8 +268,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Nije moguće provjeriti je li vaš mrežni poslužitelj ispravno postavljen za omogućavanje sinkronizacije datoteka putem WebDAV-a. Molimo provjerite ručno.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Vaš mrežni poslužitelj nije pravilno podešen za sinkronizaciju podataka jer je sučelje protokola WebDAV neispravno.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Vaš mrežni poslužitelj je ispravno postavljen za omogućavanje sinkronizacije datoteka putem WebDAV-a.",
"Calendars including events, details and attendees" : "Kalendari uključujući događaje, detalje i sudionike",
"Migrated calendar (%1$s)" : "Migriran kalendar (%1$s)",
"Calendars including events, details and attendees" : "Kalendari uključujući događaje, detalje i sudionike",
"Contacts and groups" : "Kontakti i grupe",
"WebDAV" : "WebDAV",
"Absence saved" : "Odsutnost je spremljena",
+1 -1
View File
@@ -266,8 +266,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Nije moguće provjeriti je li vaš mrežni poslužitelj ispravno postavljen za omogućavanje sinkronizacije datoteka putem WebDAV-a. Molimo provjerite ručno.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Vaš mrežni poslužitelj nije pravilno podešen za sinkronizaciju podataka jer je sučelje protokola WebDAV neispravno.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Vaš mrežni poslužitelj je ispravno postavljen za omogućavanje sinkronizacije datoteka putem WebDAV-a.",
"Calendars including events, details and attendees" : "Kalendari uključujući događaje, detalje i sudionike",
"Migrated calendar (%1$s)" : "Migriran kalendar (%1$s)",
"Calendars including events, details and attendees" : "Kalendari uključujući događaje, detalje i sudionike",
"Contacts and groups" : "Kontakti i grupe",
"WebDAV" : "WebDAV",
"Absence saved" : "Odsutnost je spremljena",
+1 -1
View File
@@ -214,8 +214,8 @@ OC.L10N.register(
"WebDAV endpoint" : "WebDAV végpont",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "A webkiszolgáló nincs megfelelően beállítva a fájlok szinkronizálásához, mert a WebDAV interfész hibásnak tűnik.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "A webkisolgáló megfelelően van konfigurálva a WebDAVon keresztüli fájl szinkronizáció engedélyezéséhez.",
"Calendars including events, details and attendees" : "Naptárak eseményekkel, részletekkel és résztvevőkkel",
"Migrated calendar (%1$s)" : "Átköltöztetett naptár (%1$s)",
"Calendars including events, details and attendees" : "Naptárak eseményekkel, részletekkel és résztvevőkkel",
"Contacts and groups" : "Névjegyek és csoportok",
"WebDAV" : "WebDAV",
"Absence saved" : "Távollét mentve",
+1 -1
View File
@@ -212,8 +212,8 @@
"WebDAV endpoint" : "WebDAV végpont",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "A webkiszolgáló nincs megfelelően beállítva a fájlok szinkronizálásához, mert a WebDAV interfész hibásnak tűnik.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "A webkisolgáló megfelelően van konfigurálva a WebDAVon keresztüli fájl szinkronizáció engedélyezéséhez.",
"Calendars including events, details and attendees" : "Naptárak eseményekkel, részletekkel és résztvevőkkel",
"Migrated calendar (%1$s)" : "Átköltöztetett naptár (%1$s)",
"Calendars including events, details and attendees" : "Naptárak eseményekkel, részletekkel és résztvevőkkel",
"Contacts and groups" : "Névjegyek és csoportok",
"WebDAV" : "WebDAV",
"Absence saved" : "Távollét mentve",
+1 -1
View File
@@ -268,8 +268,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Tidak dapat memeriksa apakah web server Anda telah disiapkan dengan benar untuk mengizinkan sinkronisasi file melalui WebDAV. Silakan periksa secara manual.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Peladen web Anda belum diatur sesuai untuk sinkronisasi berkas, karena antarmuka WebDAV tidak berfungsi.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Web server Anda telah disiapkan dengan benar untuk mengizinkan sinkronisasi file melalui WebDAV.",
"Calendars including events, details and attendees" : "Kalender termasuk acara, detail, dan peserta",
"Migrated calendar (%1$s)" : "Kalender termigrasi (%1$s)",
"Calendars including events, details and attendees" : "Kalender termasuk acara, detail, dan peserta",
"Contacts and groups" : "Kontak dan grup",
"WebDAV" : "WebDAV",
"Absence saved" : "Ketidakhadiran disimpan",
+1 -1
View File
@@ -266,8 +266,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Tidak dapat memeriksa apakah web server Anda telah disiapkan dengan benar untuk mengizinkan sinkronisasi file melalui WebDAV. Silakan periksa secara manual.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Peladen web Anda belum diatur sesuai untuk sinkronisasi berkas, karena antarmuka WebDAV tidak berfungsi.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Web server Anda telah disiapkan dengan benar untuk mengizinkan sinkronisasi file melalui WebDAV.",
"Calendars including events, details and attendees" : "Kalender termasuk acara, detail, dan peserta",
"Migrated calendar (%1$s)" : "Kalender termigrasi (%1$s)",
"Calendars including events, details and attendees" : "Kalender termasuk acara, detail, dan peserta",
"Contacts and groups" : "Kontak dan grup",
"WebDAV" : "WebDAV",
"Absence saved" : "Ketidakhadiran disimpan",
+1 -1
View File
@@ -236,8 +236,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Tókst ekki að athuga hvort vefþjónninn sé sett upp á réttan hátt til að leyfa samstillingu skráa í gegnum WebDAV. Athugaðu hvort svo sé.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Vefþjónninn er ekki enn sett upp á réttan hátt til að leyfa skráasamstillingu því WebDAV viðmótið virðist vera skemmt.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Vefþjónninn þinn er settur upp á réttan hátt til að leyfa samstillingu skráa í gegnum WebDAV.",
"Calendars including events, details and attendees" : "Dagatöl sem innihalda atburði, nánari upplýsingar og þátttakendur",
"Migrated calendar (%1$s)" : "Yfirfært dagatal (%1$s)",
"Calendars including events, details and attendees" : "Dagatöl sem innihalda atburði, nánari upplýsingar og þátttakendur",
"Contacts and groups" : "Tengiliðir og hópar",
"WebDAV" : "WebDAV",
"Absence saved" : "Fjarvera vistuð",
+1 -1
View File
@@ -234,8 +234,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Tókst ekki að athuga hvort vefþjónninn sé sett upp á réttan hátt til að leyfa samstillingu skráa í gegnum WebDAV. Athugaðu hvort svo sé.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Vefþjónninn er ekki enn sett upp á réttan hátt til að leyfa skráasamstillingu því WebDAV viðmótið virðist vera skemmt.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Vefþjónninn þinn er settur upp á réttan hátt til að leyfa samstillingu skráa í gegnum WebDAV.",
"Calendars including events, details and attendees" : "Dagatöl sem innihalda atburði, nánari upplýsingar og þátttakendur",
"Migrated calendar (%1$s)" : "Yfirfært dagatal (%1$s)",
"Calendars including events, details and attendees" : "Dagatöl sem innihalda atburði, nánari upplýsingar og þátttakendur",
"Contacts and groups" : "Tengiliðir og hópar",
"WebDAV" : "WebDAV",
"Absence saved" : "Fjarvera vistuð",
+1 -1
View File
@@ -266,8 +266,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Impossibile verificare se il server è configurato correttamente per consentire la sincronizzazione di file via WebDAV. Controllalo a mano.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Il tuo server web non è configurato correttamente per consentire la sincronizzazione dei file, poiché l'interfaccia WebDAV sembra essere danneggiata.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Il tuo server è configurato correttamente per consentire la sincronizzazione di file via WebDAV.",
"Calendars including events, details and attendees" : "Calendari inclusi eventi, dettagli e partecipanti",
"Migrated calendar (%1$s)" : "Calendario migrato (%1$s)",
"Calendars including events, details and attendees" : "Calendari inclusi eventi, dettagli e partecipanti",
"Contacts and groups" : "Contatti e gruppi",
"WebDAV" : "WebDAV",
"Absence saved" : "Assenza salvata",
+1 -1
View File
@@ -264,8 +264,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Impossibile verificare se il server è configurato correttamente per consentire la sincronizzazione di file via WebDAV. Controllalo a mano.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Il tuo server web non è configurato correttamente per consentire la sincronizzazione dei file, poiché l'interfaccia WebDAV sembra essere danneggiata.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Il tuo server è configurato correttamente per consentire la sincronizzazione di file via WebDAV.",
"Calendars including events, details and attendees" : "Calendari inclusi eventi, dettagli e partecipanti",
"Migrated calendar (%1$s)" : "Calendario migrato (%1$s)",
"Calendars including events, details and attendees" : "Calendari inclusi eventi, dettagli e partecipanti",
"Contacts and groups" : "Contatti e gruppi",
"WebDAV" : "WebDAV",
"Absence saved" : "Assenza salvata",
+1 -3
View File
@@ -236,7 +236,6 @@ OC.L10N.register(
"Failed to check file size: %1$s" : "ファイルサイズの確認に失敗: %1$s",
"Could not open file: %1$s (%2$d), file does seem to exist" : "ファイルを開けませんでした: %1$s (%2$d)、ファイルは存在するようです",
"Could not open file: %1$s (%2$d), file doesn't seem to exist" : "ファイルを開けませんでした: %1$s (%2$d)、ファイルが存在しないようです",
"Failed to get size for : %1$s" : "%1$s のサイズを取得できませんでした",
"Encryption not ready: %1$s" : "暗号化の準備が出来ていません: %1$s",
"Failed to open file: %1$s" : "ファイルを開くのに失敗: %1$s",
"Failed to unlink: %1$s" : "リンクの解除に失敗: %1$s",
@@ -253,7 +252,6 @@ OC.L10N.register(
"Completed on %s" : "%sに完了",
"Due on %s by %s" : "期限日%s が%sにより設定",
"Due on %s" : "期限日:%s",
"This is an example contact" : "これは連絡先の例です",
"Welcome to Nextcloud Calendar!\n\nThis is a sample event - explore the flexibility of planning with Nextcloud Calendar by making any edits you want!\n\nWith Nextcloud Calendar, you can:\n- Create, edit, and manage events effortlessly.\n- Create multiple calendars and share them with teammates, friends, or family.\n- Check availability and display your busy times to others.\n- Seamlessly integrate with apps and devices via CalDAV.\n- Customize your experience: schedule recurring events, adjust notifications and other settings." : "Nextcloudカレンダーへようこそ!\n\nNextcloudカレンダーの柔軟なプランニングをお試しください!\n\nNextcloudカレンダーなら、こんなことができます:\n- イベントを簡単に作成、編集、管理できます。\n- 複数のカレンダーを作成し、チームメイトや友人、家族と共有できます。\n- 空き時間を確認し、忙しい時間を他の人に表示する。\n- CalDAV経由でアプリやデバイスとシームレスに統合。\n- 定期的なイベントのスケジュール、通知やその他の設定など、エクスペリエンスをカスタマイズできます。",
"Example event - open me!" : "イベント例 - 開いてください!",
"System Address Book" : "システム連絡先リスト",
@@ -270,8 +268,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "WebDAVでのファイル同期を許可するようにWebサーバーが正しく設定されているか確認できませんでした。手動で確認してください。",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "WebDAVインターフェースが動作していないようです。Webサーバーは、ファイルの同期を許可するよう適切に設定されていません。",
"Your web server is properly set up to allow file synchronization over WebDAV." : "WebDAVによるファイル同期を許可するように、Webサーバーが適切に設定されています。",
"Calendars including events, details and attendees" : "カレンダーには、イベント、イベントの詳細及び出席者が含まれます",
"Migrated calendar (%1$s)" : "カレンダーを移行しました (%1$s)",
"Calendars including events, details and attendees" : "カレンダーには、イベント、イベントの詳細及び出席者が含まれます",
"Contacts and groups" : "連絡先とグループ",
"WebDAV" : "WebDAV",
"Absence saved" : "不在を保存しました",
+1 -3
View File
@@ -234,7 +234,6 @@
"Failed to check file size: %1$s" : "ファイルサイズの確認に失敗: %1$s",
"Could not open file: %1$s (%2$d), file does seem to exist" : "ファイルを開けませんでした: %1$s (%2$d)、ファイルは存在するようです",
"Could not open file: %1$s (%2$d), file doesn't seem to exist" : "ファイルを開けませんでした: %1$s (%2$d)、ファイルが存在しないようです",
"Failed to get size for : %1$s" : "%1$s のサイズを取得できませんでした",
"Encryption not ready: %1$s" : "暗号化の準備が出来ていません: %1$s",
"Failed to open file: %1$s" : "ファイルを開くのに失敗: %1$s",
"Failed to unlink: %1$s" : "リンクの解除に失敗: %1$s",
@@ -251,7 +250,6 @@
"Completed on %s" : "%sに完了",
"Due on %s by %s" : "期限日%s が%sにより設定",
"Due on %s" : "期限日:%s",
"This is an example contact" : "これは連絡先の例です",
"Welcome to Nextcloud Calendar!\n\nThis is a sample event - explore the flexibility of planning with Nextcloud Calendar by making any edits you want!\n\nWith Nextcloud Calendar, you can:\n- Create, edit, and manage events effortlessly.\n- Create multiple calendars and share them with teammates, friends, or family.\n- Check availability and display your busy times to others.\n- Seamlessly integrate with apps and devices via CalDAV.\n- Customize your experience: schedule recurring events, adjust notifications and other settings." : "Nextcloudカレンダーへようこそ!\n\nNextcloudカレンダーの柔軟なプランニングをお試しください!\n\nNextcloudカレンダーなら、こんなことができます:\n- イベントを簡単に作成、編集、管理できます。\n- 複数のカレンダーを作成し、チームメイトや友人、家族と共有できます。\n- 空き時間を確認し、忙しい時間を他の人に表示する。\n- CalDAV経由でアプリやデバイスとシームレスに統合。\n- 定期的なイベントのスケジュール、通知やその他の設定など、エクスペリエンスをカスタマイズできます。",
"Example event - open me!" : "イベント例 - 開いてください!",
"System Address Book" : "システム連絡先リスト",
@@ -268,8 +266,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "WebDAVでのファイル同期を許可するようにWebサーバーが正しく設定されているか確認できませんでした。手動で確認してください。",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "WebDAVインターフェースが動作していないようです。Webサーバーは、ファイルの同期を許可するよう適切に設定されていません。",
"Your web server is properly set up to allow file synchronization over WebDAV." : "WebDAVによるファイル同期を許可するように、Webサーバーが適切に設定されています。",
"Calendars including events, details and attendees" : "カレンダーには、イベント、イベントの詳細及び出席者が含まれます",
"Migrated calendar (%1$s)" : "カレンダーを移行しました (%1$s)",
"Calendars including events, details and attendees" : "カレンダーには、イベント、イベントの詳細及び出席者が含まれます",
"Contacts and groups" : "連絡先とグループ",
"WebDAV" : "WebDAV",
"Absence saved" : "不在を保存しました",
+1 -1
View File
@@ -167,8 +167,8 @@ OC.L10N.register(
"The DAV system address book sync has not run yet as your instance has more than 1000 users or because an error occurred. Please run it manually by calling \"occ dav:sync-system-addressbook\"." : "The DAV system address book sync has not run yet as your instance has more than 1000 users or because an error occurred. Please run it manually by calling \"occ dav:sync-system-addressbook\".",
"WebDAV endpoint" : "WebDAV endpoint",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken.",
"Calendars including events, details and attendees" : "Calendars including events, details and attendees",
"Migrated calendar (%1$s)" : "Migrated calendar (%1$s)",
"Calendars including events, details and attendees" : "Calendars including events, details and attendees",
"Contacts and groups" : "Contacts and groups",
"WebDAV" : "WebDAV",
"Absence saved" : "Absence saved",
+1 -1
View File
@@ -165,8 +165,8 @@
"The DAV system address book sync has not run yet as your instance has more than 1000 users or because an error occurred. Please run it manually by calling \"occ dav:sync-system-addressbook\"." : "The DAV system address book sync has not run yet as your instance has more than 1000 users or because an error occurred. Please run it manually by calling \"occ dav:sync-system-addressbook\".",
"WebDAV endpoint" : "WebDAV endpoint",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken.",
"Calendars including events, details and attendees" : "Calendars including events, details and attendees",
"Migrated calendar (%1$s)" : "Migrated calendar (%1$s)",
"Calendars including events, details and attendees" : "Calendars including events, details and attendees",
"Contacts and groups" : "Contacts and groups",
"WebDAV" : "WebDAV",
"Absence saved" : "Absence saved",
+1 -1
View File
@@ -167,8 +167,8 @@ OC.L10N.register(
"The DAV system address book sync has not run yet as your instance has more than 1000 users or because an error occurred. Please run it manually by calling \"occ dav:sync-system-addressbook\"." : "DAV 시스템 주소록 동기화가 아직 작동하지 않았습니다. 이는 인스턴스의 사용자가 1000명을 초과하거나 오류가 발생했기 때문입니다. occ dav:sync-system-addressbook 명령어를 통해 수동으로 이를 수행하십시오.",
"WebDAV endpoint" : "WebDAV 종단점",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "WebDAV 인터페이스를 사용할 수 없어서 웹 서버에서 파일 동기화를 사용할 수 있도록 설정할 수 없습니다.",
"Calendars including events, details and attendees" : "일정, 세부 정보 및 참석자를 포함한 캘린더",
"Migrated calendar (%1$s)" : "가져온 달력 (%1$s)",
"Calendars including events, details and attendees" : "일정, 세부 정보 및 참석자를 포함한 캘린더",
"Contacts and groups" : "연락처 및 그룹",
"WebDAV" : "WebDAV",
"Absence saved" : "부재 상태 저장됨",
+1 -1
View File
@@ -165,8 +165,8 @@
"The DAV system address book sync has not run yet as your instance has more than 1000 users or because an error occurred. Please run it manually by calling \"occ dav:sync-system-addressbook\"." : "DAV 시스템 주소록 동기화가 아직 작동하지 않았습니다. 이는 인스턴스의 사용자가 1000명을 초과하거나 오류가 발생했기 때문입니다. occ dav:sync-system-addressbook 명령어를 통해 수동으로 이를 수행하십시오.",
"WebDAV endpoint" : "WebDAV 종단점",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "WebDAV 인터페이스를 사용할 수 없어서 웹 서버에서 파일 동기화를 사용할 수 있도록 설정할 수 없습니다.",
"Calendars including events, details and attendees" : "일정, 세부 정보 및 참석자를 포함한 캘린더",
"Migrated calendar (%1$s)" : "가져온 달력 (%1$s)",
"Calendars including events, details and attendees" : "일정, 세부 정보 및 참석자를 포함한 캘린더",
"Contacts and groups" : "연락처 및 그룹",
"WebDAV" : "WebDAV",
"Absence saved" : "부재 상태 저장됨",
+1 -1
View File
@@ -236,8 +236,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "ເວັບເຊີບເວີ ຂອງທ່ານຍັງບໍ່ຖືກຕັ້ງຄ່າຢ່າງຖືກຕ້ອງເພື່ອອະນຸຍາດໃຫ້ຟາຍເອກະສານກົງກັນ, ເພາະວ່າອິນເຕີເຟດ WebDAV ອາດຖືກທໍາລາຍ ",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Your web server is properly set up to allow file synchronization over WebDAV.",
"Calendars including events, details and attendees" : "Calendars including events, details and attendees",
"Migrated calendar (%1$s)" : "Migrated calendar (%1$s)",
"Calendars including events, details and attendees" : "Calendars including events, details and attendees",
"Contacts and groups" : "Contacts and groups",
"WebDAV" : "WebDAV",
"Absence saved" : "Absence saved",
+1 -1
View File
@@ -234,8 +234,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "ເວັບເຊີບເວີ ຂອງທ່ານຍັງບໍ່ຖືກຕັ້ງຄ່າຢ່າງຖືກຕ້ອງເພື່ອອະນຸຍາດໃຫ້ຟາຍເອກະສານກົງກັນ, ເພາະວ່າອິນເຕີເຟດ WebDAV ອາດຖືກທໍາລາຍ ",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Your web server is properly set up to allow file synchronization over WebDAV.",
"Calendars including events, details and attendees" : "Calendars including events, details and attendees",
"Migrated calendar (%1$s)" : "Migrated calendar (%1$s)",
"Calendars including events, details and attendees" : "Calendars including events, details and attendees",
"Contacts and groups" : "Contacts and groups",
"WebDAV" : "WebDAV",
"Absence saved" : "Absence saved",
+1 -1
View File
@@ -266,8 +266,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Не може да се провери дали вашиот веб-сервер е правилно конфигуриран за дозвола на синхронизација на датотеки преку WebDAV. Ве молиме проверете рачно.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Вашиот веб опслужувач сеуште не е точно подесен да овозможува синхронизација на датотеки бидејќи интерфејсот за WebDAV изгледа дека е расипан. ",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Вашиот веб-сервер е правилно конфигуриран за синхронизација на датотеки преку WebDAV.",
"Calendars including events, details and attendees" : "Календари вклучувајќи настани, детали и присутни",
"Migrated calendar (%1$s)" : "мигриран календар (%1$s)",
"Calendars including events, details and attendees" : "Календари вклучувајќи настани, детали и присутни",
"Contacts and groups" : "Контакти и групи",
"WebDAV" : "WebDAV",
"Absence saved" : "Отсуството е зачувано",
+1 -1
View File
@@ -264,8 +264,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Не може да се провери дали вашиот веб-сервер е правилно конфигуриран за дозвола на синхронизација на датотеки преку WebDAV. Ве молиме проверете рачно.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Вашиот веб опслужувач сеуште не е точно подесен да овозможува синхронизација на датотеки бидејќи интерфејсот за WebDAV изгледа дека е расипан. ",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Вашиот веб-сервер е правилно конфигуриран за синхронизација на датотеки преку WebDAV.",
"Calendars including events, details and attendees" : "Календари вклучувајќи настани, детали и присутни",
"Migrated calendar (%1$s)" : "мигриран календар (%1$s)",
"Calendars including events, details and attendees" : "Календари вклучувајќи настани, детали и присутни",
"Contacts and groups" : "Контакти и групи",
"WebDAV" : "WebDAV",
"Absence saved" : "Отсуството е зачувано",
+1 -1
View File
@@ -268,8 +268,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Вэб серверийг WebDAV-аар файл синхрончлолд зохих ёсоор тохируулсан эсэхийг шалгах боломжгүй байна. Гараар шалгана уу.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "WebDAV интерфейс эвдэрсэн тул вэб сервер файл синхрончлолд зохих ёсоор тохируулагдаагүй байна.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Вэб сервер нь WebDAV-аар файл синхрончлол хийхэд зохих ёсоор тохируулагдсан байна.",
"Calendars including events, details and attendees" : "Үйл явдал, дэлгэрэнгүй болон оролцогчдыг агуулсан календарууд",
"Migrated calendar (%1$s)" : "Шилжүүлсэн календар (%1$s)",
"Calendars including events, details and attendees" : "Үйл явдал, дэлгэрэнгүй болон оролцогчдыг агуулсан календарууд",
"Contacts and groups" : "Харилцагчид болон бүлгүүд",
"WebDAV" : "WebDAV",
"Absence saved" : "Эзгүй байдал хадгалагдсан",
+1 -1
View File
@@ -266,8 +266,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Вэб серверийг WebDAV-аар файл синхрончлолд зохих ёсоор тохируулсан эсэхийг шалгах боломжгүй байна. Гараар шалгана уу.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "WebDAV интерфейс эвдэрсэн тул вэб сервер файл синхрончлолд зохих ёсоор тохируулагдаагүй байна.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Вэб сервер нь WebDAV-аар файл синхрончлол хийхэд зохих ёсоор тохируулагдсан байна.",
"Calendars including events, details and attendees" : "Үйл явдал, дэлгэрэнгүй болон оролцогчдыг агуулсан календарууд",
"Migrated calendar (%1$s)" : "Шилжүүлсэн календар (%1$s)",
"Calendars including events, details and attendees" : "Үйл явдал, дэлгэрэнгүй болон оролцогчдыг агуулсан календарууд",
"Contacts and groups" : "Харилцагчид болон бүлгүүд",
"WebDAV" : "WebDAV",
"Absence saved" : "Эзгүй байдал хадгалагдсан",
+1 -1
View File
@@ -234,8 +234,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Kunne ikke kontrollere at webserveren er riktig konfigurert for å tillate filsynkronisering over WebDAV. Vennligst sjekk manuelt.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Webserveren din er ikke satt opp til å tillate synkronisering av filer ennå, fordi WebDAV-grensesnittet ikke ser ut til å virke.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Webserveren din er riktig konfigurert for å tillate filsynkronisering over WebDAV.",
"Calendars including events, details and attendees" : "Kalendere inkludert hendelser, detaljer og deltakere",
"Migrated calendar (%1$s)" : "Migrerte kalenderen (%1$s)",
"Calendars including events, details and attendees" : "Kalendere inkludert hendelser, detaljer og deltakere",
"Contacts and groups" : "Kontakter og grupper",
"WebDAV" : "WebDAV",
"Absence saved" : "Fravær lagret",
+1 -1
View File
@@ -232,8 +232,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Kunne ikke kontrollere at webserveren er riktig konfigurert for å tillate filsynkronisering over WebDAV. Vennligst sjekk manuelt.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Webserveren din er ikke satt opp til å tillate synkronisering av filer ennå, fordi WebDAV-grensesnittet ikke ser ut til å virke.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Webserveren din er riktig konfigurert for å tillate filsynkronisering over WebDAV.",
"Calendars including events, details and attendees" : "Kalendere inkludert hendelser, detaljer og deltakere",
"Migrated calendar (%1$s)" : "Migrerte kalenderen (%1$s)",
"Calendars including events, details and attendees" : "Kalendere inkludert hendelser, detaljer og deltakere",
"Contacts and groups" : "Kontakter og grupper",
"WebDAV" : "WebDAV",
"Absence saved" : "Fravær lagret",
+1 -1
View File
@@ -269,8 +269,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Kan niet controleren of uw webserver correct is ingesteld om bestandssynchronisatie via WebDAV toe te staan. Controleer dit handmatig.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Je webserver is nog niet goed ingesteld voor bestandssynchronisatie, omdat de WebDAV interface niet goed lijkt te werken.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Jouw webserver is goed ingesteld om bestandssynchronisatie toe te staan via WebDAV.",
"Calendars including events, details and attendees" : "Agenda's met afspraken, details en deelnemers",
"Migrated calendar (%1$s)" : "Agenda gemigreerd (%1$s)",
"Calendars including events, details and attendees" : "Agenda's met afspraken, details en deelnemers",
"Contacts and groups" : "Contactpersonen en groepen",
"WebDAV" : "WebDAV",
"Absence saved" : "Afwezigheid opgeslagen",
+1 -1
View File
@@ -267,8 +267,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Kan niet controleren of uw webserver correct is ingesteld om bestandssynchronisatie via WebDAV toe te staan. Controleer dit handmatig.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Je webserver is nog niet goed ingesteld voor bestandssynchronisatie, omdat de WebDAV interface niet goed lijkt te werken.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Jouw webserver is goed ingesteld om bestandssynchronisatie toe te staan via WebDAV.",
"Calendars including events, details and attendees" : "Agenda's met afspraken, details en deelnemers",
"Migrated calendar (%1$s)" : "Agenda gemigreerd (%1$s)",
"Calendars including events, details and attendees" : "Agenda's met afspraken, details en deelnemers",
"Contacts and groups" : "Contactpersonen en groepen",
"WebDAV" : "WebDAV",
"Absence saved" : "Afwezigheid opgeslagen",
+1 -1
View File
@@ -256,8 +256,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Nie można sprawdzić, czy serwer WWW jest prawidłowo skonfigurowany, aby umożliwić synchronizację plików przez WebDAV. Sprawdź ręcznie.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Serwer WWW nie jest jeszcze na tyle poprawnie skonfigurowany, aby umożliwić synchronizację plików, ponieważ interfejs WebDAV może być uszkodzony.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Twój serwer internetowy jest prawidłowo skonfigurowany, aby umożliwić synchronizację plików przez WebDAV.",
"Calendars including events, details and attendees" : "Kalendarze zawierające wydarzenia, szczegóły i uczestników",
"Migrated calendar (%1$s)" : "Przeniesiony kalendarz (%1$s)",
"Calendars including events, details and attendees" : "Kalendarze zawierające wydarzenia, szczegóły i uczestników",
"Contacts and groups" : "Kontakty i grupy",
"WebDAV" : "WebDAV",
"Absence saved" : "Nieobecność zapisana",
+1 -1
View File
@@ -254,8 +254,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Nie można sprawdzić, czy serwer WWW jest prawidłowo skonfigurowany, aby umożliwić synchronizację plików przez WebDAV. Sprawdź ręcznie.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Serwer WWW nie jest jeszcze na tyle poprawnie skonfigurowany, aby umożliwić synchronizację plików, ponieważ interfejs WebDAV może być uszkodzony.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Twój serwer internetowy jest prawidłowo skonfigurowany, aby umożliwić synchronizację plików przez WebDAV.",
"Calendars including events, details and attendees" : "Kalendarze zawierające wydarzenia, szczegóły i uczestników",
"Migrated calendar (%1$s)" : "Przeniesiony kalendarz (%1$s)",
"Calendars including events, details and attendees" : "Kalendarze zawierające wydarzenia, szczegóły i uczestników",
"Contacts and groups" : "Kontakty i grupy",
"WebDAV" : "WebDAV",
"Absence saved" : "Nieobecność zapisana",
+1 -1
View File
@@ -270,8 +270,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Não foi possível verificar se o seu servidor web está configurado corretamente para permitir a sincronização de arquivos via WebDAV. Verifique manualmente.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Seu servidor web ainda não está configurado corretamente para permitir a sincronização de arquivos, porque a interface do WebDAV parece estar quebrada.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Seu servidor web está configurado corretamente para permitir a sincronização de arquivos via WebDAV.",
"Calendars including events, details and attendees" : "Calendários, incluindo eventos, detalhes e participantes",
"Migrated calendar (%1$s)" : "Calendário migrado (%1$s)",
"Calendars including events, details and attendees" : "Calendários, incluindo eventos, detalhes e participantes",
"Contacts and groups" : "Contatos e grupos",
"WebDAV" : "WebDAV",
"Absence saved" : "Ausência salva",
+1 -1
View File
@@ -268,8 +268,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Não foi possível verificar se o seu servidor web está configurado corretamente para permitir a sincronização de arquivos via WebDAV. Verifique manualmente.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Seu servidor web ainda não está configurado corretamente para permitir a sincronização de arquivos, porque a interface do WebDAV parece estar quebrada.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Seu servidor web está configurado corretamente para permitir a sincronização de arquivos via WebDAV.",
"Calendars including events, details and attendees" : "Calendários, incluindo eventos, detalhes e participantes",
"Migrated calendar (%1$s)" : "Calendário migrado (%1$s)",
"Calendars including events, details and attendees" : "Calendários, incluindo eventos, detalhes e participantes",
"Contacts and groups" : "Contatos e grupos",
"WebDAV" : "WebDAV",
"Absence saved" : "Ausência salva",
+1 -1
View File
@@ -228,8 +228,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Não foi possível verificar se o seu servidor web está corretamente configurado para permitir a sincronização de ficheiros via WebDAV. Verifique manualmente.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "O seu servidor da Web não está configurado corretamente para permitir a sincronização de ficheiros, porque a interface WebDAV parece estar com problemas.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "O seu servidor web está corretamente configurado para permitir a sincronização de ficheiros via WebDAV.",
"Calendars including events, details and attendees" : "Calendários incluindo eventos, detalhes e participantes",
"Migrated calendar (%1$s)" : "Calendário migrado (%1$s)",
"Calendars including events, details and attendees" : "Calendários incluindo eventos, detalhes e participantes",
"Contacts and groups" : "Contactos e grupos",
"WebDAV" : "WebDAV",
"Absence saved" : "Ausência guardada",
+1 -1
View File
@@ -226,8 +226,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Não foi possível verificar se o seu servidor web está corretamente configurado para permitir a sincronização de ficheiros via WebDAV. Verifique manualmente.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "O seu servidor da Web não está configurado corretamente para permitir a sincronização de ficheiros, porque a interface WebDAV parece estar com problemas.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "O seu servidor web está corretamente configurado para permitir a sincronização de ficheiros via WebDAV.",
"Calendars including events, details and attendees" : "Calendários incluindo eventos, detalhes e participantes",
"Migrated calendar (%1$s)" : "Calendário migrado (%1$s)",
"Calendars including events, details and attendees" : "Calendários incluindo eventos, detalhes e participantes",
"Contacts and groups" : "Contactos e grupos",
"WebDAV" : "WebDAV",
"Absence saved" : "Ausência guardada",
+1 -1
View File
@@ -256,8 +256,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Не удалось проверить, правильно ли настроен ваш веб-сервер, чтобы разрешить синхронизацию файлов через WebDAV. Пожалуйста, проверьте вручную.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Веб-сервер ещё не настроен должным образом для синхронизации файлов: похоже, что не работоспособен интерфейс WebDAV.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Ваш веб-сервер настроен должным образом, чтобы обеспечить синхронизацию файлов через WebDAV.",
"Calendars including events, details and attendees" : "Календари, в том числе события, подробные сведения и участники",
"Migrated calendar (%1$s)" : "Перенос календаря (%1$s)",
"Calendars including events, details and attendees" : "Календари, в том числе события, подробные сведения и участники",
"Contacts and groups" : "Контакты и группы",
"WebDAV" : "WebDAV",
"Absence saved" : "Состояние отсутствия сохранено",
+1 -1
View File
@@ -254,8 +254,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Не удалось проверить, правильно ли настроен ваш веб-сервер, чтобы разрешить синхронизацию файлов через WebDAV. Пожалуйста, проверьте вручную.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Веб-сервер ещё не настроен должным образом для синхронизации файлов: похоже, что не работоспособен интерфейс WebDAV.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Ваш веб-сервер настроен должным образом, чтобы обеспечить синхронизацию файлов через WebDAV.",
"Calendars including events, details and attendees" : "Календари, в том числе события, подробные сведения и участники",
"Migrated calendar (%1$s)" : "Перенос календаря (%1$s)",
"Calendars including events, details and attendees" : "Календари, в том числе события, подробные сведения и участники",
"Contacts and groups" : "Контакты и группы",
"WebDAV" : "WebDAV",
"Absence saved" : "Состояние отсутствия сохранено",
+1 -1
View File
@@ -268,8 +268,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Nepodarilo sa skontrolovať, či je váš webový server správne nastavený tak, aby umožňoval synchronizáciu súborov cez WebDAV. Skontrolujte prosím manuálne.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Váš webový server nie je zatiaľ správne nastavený, aby umožnil synchronizáciu súborov, pretože rozhranie WebDAV sa zdá byť nefunkčné.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Váš webový server je správne nastavený tak, aby umožňoval synchronizáciu súborov cez WebDAV.",
"Calendars including events, details and attendees" : "Kalendáre vrátane udalostí, podrobností a účastníkov",
"Migrated calendar (%1$s)" : "Migrovaný kalendár (%1$s)",
"Calendars including events, details and attendees" : "Kalendáre vrátane udalostí, podrobností a účastníkov",
"Contacts and groups" : "Kontakty a skupiny",
"WebDAV" : "WebDAV",
"Absence saved" : "Neprítomnosť uložená",
+1 -1
View File
@@ -266,8 +266,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Nepodarilo sa skontrolovať, či je váš webový server správne nastavený tak, aby umožňoval synchronizáciu súborov cez WebDAV. Skontrolujte prosím manuálne.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Váš webový server nie je zatiaľ správne nastavený, aby umožnil synchronizáciu súborov, pretože rozhranie WebDAV sa zdá byť nefunkčné.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Váš webový server je správne nastavený tak, aby umožňoval synchronizáciu súborov cez WebDAV.",
"Calendars including events, details and attendees" : "Kalendáre vrátane udalostí, podrobností a účastníkov",
"Migrated calendar (%1$s)" : "Migrovaný kalendár (%1$s)",
"Calendars including events, details and attendees" : "Kalendáre vrátane udalostí, podrobností a účastníkov",
"Contacts and groups" : "Kontakty a skupiny",
"WebDAV" : "WebDAV",
"Absence saved" : "Neprítomnosť uložená",
+1 -1
View File
@@ -169,8 +169,8 @@ OC.L10N.register(
"The DAV system address book sync has not run yet as your instance has more than 1000 users or because an error occurred. Please run it manually by calling \"occ dav:sync-system-addressbook\"." : "Usklajevanje imenika DAV še ni bilo izvedeno, ker je na strežniku več kot 1000 uporabnikov, ali pa je morda prišlo do napake. Možnost je treba zagnati ročnoz ukazom »occ dav:sync-system-addressbook«.",
"WebDAV endpoint" : "Končna točka WebDAV",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Spletni stražnik še ni ustrezno nastavljen in ne omogoča usklajevanja, kaže, da je vmesnik WebDAV okvarjen.",
"Calendars including events, details and attendees" : "Koledarji z dogodki, podrobnostmi in udeleženci",
"Migrated calendar (%1$s)" : "Prenesen koledar (%1$s)",
"Calendars including events, details and attendees" : "Koledarji z dogodki, podrobnostmi in udeleženci",
"Contacts and groups" : "Stiki in skupine",
"WebDAV" : "WebDAV",
"Absence saved" : "Odsotnost je shranjena",
+1 -1
View File
@@ -167,8 +167,8 @@
"The DAV system address book sync has not run yet as your instance has more than 1000 users or because an error occurred. Please run it manually by calling \"occ dav:sync-system-addressbook\"." : "Usklajevanje imenika DAV še ni bilo izvedeno, ker je na strežniku več kot 1000 uporabnikov, ali pa je morda prišlo do napake. Možnost je treba zagnati ročnoz ukazom »occ dav:sync-system-addressbook«.",
"WebDAV endpoint" : "Končna točka WebDAV",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Spletni stražnik še ni ustrezno nastavljen in ne omogoča usklajevanja, kaže, da je vmesnik WebDAV okvarjen.",
"Calendars including events, details and attendees" : "Koledarji z dogodki, podrobnostmi in udeleženci",
"Migrated calendar (%1$s)" : "Prenesen koledar (%1$s)",
"Calendars including events, details and attendees" : "Koledarji z dogodki, podrobnostmi in udeleženci",
"Contacts and groups" : "Stiki in skupine",
"WebDAV" : "WebDAV",
"Absence saved" : "Odsotnost je shranjena",
+1 -1
View File
@@ -236,8 +236,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Није могло да се провери да ли ваш веб сервер исправно подешен тако да се омогући синхронизација фајлова преко WebDAV. Молимо вас да проверите ручно.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Сервер није правилно подешен за синхронизацију фајлова. Изгледа да је ВебДАВ сучеље покварено.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Ваш веб сервер исправно подешен тако да се омогући синхронизација фајлова преко WebDAV.",
"Calendars including events, details and attendees" : "Календари који укључују догађаје, детаље и учеснике",
"Migrated calendar (%1$s)" : "Мигрирани календар (%1$s)",
"Calendars including events, details and attendees" : "Календари који укључују догађаје, детаље и учеснике",
"Contacts and groups" : "Контакти и групе",
"WebDAV" : "WebDAV",
"Absence saved" : "Одсутност је сачувана",
+1 -1
View File
@@ -234,8 +234,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Није могло да се провери да ли ваш веб сервер исправно подешен тако да се омогући синхронизација фајлова преко WebDAV. Молимо вас да проверите ручно.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Сервер није правилно подешен за синхронизацију фајлова. Изгледа да је ВебДАВ сучеље покварено.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Ваш веб сервер исправно подешен тако да се омогући синхронизација фајлова преко WebDAV.",
"Calendars including events, details and attendees" : "Календари који укључују догађаје, детаље и учеснике",
"Migrated calendar (%1$s)" : "Мигрирани календар (%1$s)",
"Calendars including events, details and attendees" : "Календари који укључују догађаје, детаље и учеснике",
"Contacts and groups" : "Контакти и групе",
"WebDAV" : "WebDAV",
"Absence saved" : "Одсутност је сачувана",
+1 -1
View File
@@ -265,8 +265,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Det gick inte att kontrollera att din webbserver är korrekt inställd för att tillåta filsynkronisering över WebDAV. Kontrollera manuellt.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Din webbserver är ännu inte korrekt inställd för att tillåta filsynkronisering, eftersom WebDAV-gränssnittet verkar vara trasigt.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Din webbserver är korrekt inställd för att tillåta filsynkronisering över WebDAV.",
"Calendars including events, details and attendees" : "Kalendrar inklusive händelser, detaljer och deltagare",
"Migrated calendar (%1$s)" : "Migrerade kalender (%1$s)",
"Calendars including events, details and attendees" : "Kalendrar inklusive händelser, detaljer och deltagare",
"Contacts and groups" : "Kontakter och grupper",
"WebDAV" : "WebDAV",
"Absence saved" : "Frånvaro sparad",
+1 -1
View File
@@ -263,8 +263,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Det gick inte att kontrollera att din webbserver är korrekt inställd för att tillåta filsynkronisering över WebDAV. Kontrollera manuellt.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Din webbserver är ännu inte korrekt inställd för att tillåta filsynkronisering, eftersom WebDAV-gränssnittet verkar vara trasigt.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Din webbserver är korrekt inställd för att tillåta filsynkronisering över WebDAV.",
"Calendars including events, details and attendees" : "Kalendrar inklusive händelser, detaljer och deltagare",
"Migrated calendar (%1$s)" : "Migrerade kalender (%1$s)",
"Calendars including events, details and attendees" : "Kalendrar inklusive händelser, detaljer och deltagare",
"Contacts and groups" : "Kontakter och grupper",
"WebDAV" : "WebDAV",
"Absence saved" : "Frånvaro sparad",
+1 -1
View File
@@ -266,8 +266,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Haikuweza kuangalia kama seva yako ya wavuti imewekwa vizuri ili kuruhusu ulandanishi wa faili kupitia WebDAV. Tafadhali angalia mwenyewe.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Seva yako ya wavuti bado haijawekwa vizuri ili kuruhusu ulandanishi wa faili, kwa sababu kiolesura cha WebDAV kinaonekana kuharibika.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Seva yako ya wavuti imesanidiwa ipasavyo ili kuruhusu ulandanishi wa faili kupitia WebDAV.",
"Calendars including events, details and attendees" : "Kalenda ikijumuisha matukio, maelezo na waliohudhuria",
"Migrated calendar (%1$s)" : "Kalenda iliyohamishwa (%1$s)",
"Calendars including events, details and attendees" : "Kalenda ikijumuisha matukio, maelezo na waliohudhuria",
"Contacts and groups" : "Anwani na vikundi",
"WebDAV" : "WavutiDAV",
"Absence saved" : "Kutokuwepo kumehifadhiwa",
+1 -1
View File
@@ -264,8 +264,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Haikuweza kuangalia kama seva yako ya wavuti imewekwa vizuri ili kuruhusu ulandanishi wa faili kupitia WebDAV. Tafadhali angalia mwenyewe.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Seva yako ya wavuti bado haijawekwa vizuri ili kuruhusu ulandanishi wa faili, kwa sababu kiolesura cha WebDAV kinaonekana kuharibika.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Seva yako ya wavuti imesanidiwa ipasavyo ili kuruhusu ulandanishi wa faili kupitia WebDAV.",
"Calendars including events, details and attendees" : "Kalenda ikijumuisha matukio, maelezo na waliohudhuria",
"Migrated calendar (%1$s)" : "Kalenda iliyohamishwa (%1$s)",
"Calendars including events, details and attendees" : "Kalenda ikijumuisha matukio, maelezo na waliohudhuria",
"Contacts and groups" : "Anwani na vikundi",
"WebDAV" : "WavutiDAV",
"Absence saved" : "Kutokuwepo kumehifadhiwa",
+1 -1
View File
@@ -269,8 +269,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Site sunucunuzun WebDAV üzerinden dosya eşitlemesi için doğru şekilde ayarlanıp ayarlanmadığı denetlenemedi. Lütfen el ile denetleyin.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Site sunucunuz dosya eşitlemesi için doğru şekilde ayarlanmamış. WebDAV arabirimi sorunlu görünüyor.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Site sunucunuz WebDAV üzerinden dosya eşitlemesi için doğru şekilde ayarlanmış.",
"Calendars including events, details and attendees" : "Etkinlikler, bilgiler ve katılımcılar ile takvimler",
"Migrated calendar (%1$s)" : "Aktarılmış takvim (%1$s)",
"Calendars including events, details and attendees" : "Etkinlikler, bilgiler ve katılımcılar ile takvimler",
"Contacts and groups" : "Kişiler ve gruplar",
"WebDAV" : "WebDAV",
"Absence saved" : "Bulunmama kaydedildi",
+1 -1
View File
@@ -267,8 +267,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Site sunucunuzun WebDAV üzerinden dosya eşitlemesi için doğru şekilde ayarlanıp ayarlanmadığı denetlenemedi. Lütfen el ile denetleyin.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Site sunucunuz dosya eşitlemesi için doğru şekilde ayarlanmamış. WebDAV arabirimi sorunlu görünüyor.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Site sunucunuz WebDAV üzerinden dosya eşitlemesi için doğru şekilde ayarlanmış.",
"Calendars including events, details and attendees" : "Etkinlikler, bilgiler ve katılımcılar ile takvimler",
"Migrated calendar (%1$s)" : "Aktarılmış takvim (%1$s)",
"Calendars including events, details and attendees" : "Etkinlikler, bilgiler ve katılımcılar ile takvimler",
"Contacts and groups" : "Kişiler ve gruplar",
"WebDAV" : "WebDAV",
"Absence saved" : "Bulunmama kaydedildi",
+1 -1
View File
@@ -266,8 +266,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "تور مۇلازىمېتىرىڭىزنىڭ WebDAV ئارقىلىق ھۆججەت ماسقەدەملىشىگە يول قويۇلغانلىقىنى تەكشۈرەلمىدىڭىز. قولدا تەكشۈرۈپ بېقىڭ.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "تور مۇلازىمېتىرىڭىز ھۆججەتنىڭ ماس قەدەمدە بولۇشىغا يول قويۇلمىدى ، چۈنكى WebDAV كۆرۈنمە يۈزى بۇزۇلغاندەك قىلىدۇ.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "تور مۇلازىمېتىرىڭىز WebDAV ئارقىلىق ھۆججەت ماسقەدەملەش ئۈچۈن مۇۋاپىق تەڭشەلدى.",
"Calendars including events, details and attendees" : "پائالىيەتلەر ، تەپسىلاتلار ۋە قاتناشقۇچىلارنى ئۆز ئىچىگە ئالغان كالېندارلار",
"Migrated calendar (%1$s)" : "كۆچۈرۈلگەن كالېندار (%1$s)",
"Calendars including events, details and attendees" : "پائالىيەتلەر ، تەپسىلاتلار ۋە قاتناشقۇچىلارنى ئۆز ئىچىگە ئالغان كالېندارلار",
"Contacts and groups" : "ئالاقىلىشىش ۋە گۇرۇپپىلار",
"WebDAV" : "WebDAV",
"Absence saved" : "يوقلۇق ساقلاندى",
+1 -1
View File
@@ -264,8 +264,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "تور مۇلازىمېتىرىڭىزنىڭ WebDAV ئارقىلىق ھۆججەت ماسقەدەملىشىگە يول قويۇلغانلىقىنى تەكشۈرەلمىدىڭىز. قولدا تەكشۈرۈپ بېقىڭ.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "تور مۇلازىمېتىرىڭىز ھۆججەتنىڭ ماس قەدەمدە بولۇشىغا يول قويۇلمىدى ، چۈنكى WebDAV كۆرۈنمە يۈزى بۇزۇلغاندەك قىلىدۇ.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "تور مۇلازىمېتىرىڭىز WebDAV ئارقىلىق ھۆججەت ماسقەدەملەش ئۈچۈن مۇۋاپىق تەڭشەلدى.",
"Calendars including events, details and attendees" : "پائالىيەتلەر ، تەپسىلاتلار ۋە قاتناشقۇچىلارنى ئۆز ئىچىگە ئالغان كالېندارلار",
"Migrated calendar (%1$s)" : "كۆچۈرۈلگەن كالېندار (%1$s)",
"Calendars including events, details and attendees" : "پائالىيەتلەر ، تەپسىلاتلار ۋە قاتناشقۇچىلارنى ئۆز ئىچىگە ئالغان كالېندارلار",
"Contacts and groups" : "ئالاقىلىشىش ۋە گۇرۇپپىلار",
"WebDAV" : "WebDAV",
"Absence saved" : "يوقلۇق ساقلاندى",
+1 -1
View File
@@ -238,8 +238,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Неможливо перевірити, чи на вашому вебсервері правильно налаштовано доступ для синхронізації файлів через протокол WebDAV. Перевірте це вручну.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Ваш вебсервер не налаштований як треба для синхронізації файлів, схоже інтерфейс WebDAV поламаний.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "На вашому вебсерверві правильно налаштовано доступ для синхронізації файлів через протокол WevDAV.",
"Calendars including events, details and attendees" : "Календарі, включно з подіями, деталями та відвідувачами",
"Migrated calendar (%1$s)" : "Перенесений календар (%1$s)",
"Calendars including events, details and attendees" : "Календарі, включно з подіями, деталями та відвідувачами",
"Contacts and groups" : "Контакти та групи",
"WebDAV" : "WebDAV",
"Absence saved" : "Відсутність збережено",
+1 -1
View File
@@ -236,8 +236,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Неможливо перевірити, чи на вашому вебсервері правильно налаштовано доступ для синхронізації файлів через протокол WebDAV. Перевірте це вручну.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Ваш вебсервер не налаштований як треба для синхронізації файлів, схоже інтерфейс WebDAV поламаний.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "На вашому вебсерверві правильно налаштовано доступ для синхронізації файлів через протокол WevDAV.",
"Calendars including events, details and attendees" : "Календарі, включно з подіями, деталями та відвідувачами",
"Migrated calendar (%1$s)" : "Перенесений календар (%1$s)",
"Calendars including events, details and attendees" : "Календарі, включно з подіями, деталями та відвідувачами",
"Contacts and groups" : "Контакти та групи",
"WebDAV" : "WebDAV",
"Absence saved" : "Відсутність збережено",
+1 -1
View File
@@ -268,8 +268,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "无法检查您的 Web 服务器是否已正确设置以允许通过 WebDAV 进行文件同步。 请手动检查。",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "您的网页服务器没有正确设置允许文件同步,因为 WebDAV 接口看起来无法正常工作。",
"Your web server is properly set up to allow file synchronization over WebDAV." : "您的 Web 服务器已正确设置为允许通过 WebDAV 进行文件同步。",
"Calendars including events, details and attendees" : "日历,包括事件、详情和参加者",
"Migrated calendar (%1$s)" : "迁移的日历(%1$s",
"Calendars including events, details and attendees" : "日历,包括事件、详情和参加者",
"Contacts and groups" : "联系人和群组",
"WebDAV" : "WebDAV",
"Absence saved" : "缺席已保存",
+1 -1
View File
@@ -266,8 +266,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "无法检查您的 Web 服务器是否已正确设置以允许通过 WebDAV 进行文件同步。 请手动检查。",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "您的网页服务器没有正确设置允许文件同步,因为 WebDAV 接口看起来无法正常工作。",
"Your web server is properly set up to allow file synchronization over WebDAV." : "您的 Web 服务器已正确设置为允许通过 WebDAV 进行文件同步。",
"Calendars including events, details and attendees" : "日历,包括事件、详情和参加者",
"Migrated calendar (%1$s)" : "迁移的日历(%1$s",
"Calendars including events, details and attendees" : "日历,包括事件、详情和参加者",
"Contacts and groups" : "联系人和群组",
"WebDAV" : "WebDAV",
"Absence saved" : "缺席已保存",
+1 -1
View File
@@ -269,8 +269,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "無法檢查您的網頁伺服器是否正確設置以允許透過 WebDAV 進行檔案同步。請手動進行檢查。",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "WebDAV 界面似乎為故障狀態,導致您的網頁伺服器無法提供檔案同步功能。",
"Your web server is properly set up to allow file synchronization over WebDAV." : "您的網頁伺服器已正確設定為允許透過 WebDAV 進行檔案同步。",
"Calendars including events, details and attendees" : "日曆,包括活動、詳細信息和與會者",
"Migrated calendar (%1$s)" : "遷移的日曆(%1$s",
"Calendars including events, details and attendees" : "日曆,包括活動、詳細信息和與會者",
"Contacts and groups" : "聯絡人和群組",
"WebDAV" : "WebDAV",
"Absence saved" : "缺席時段已儲存",
+1 -1
View File
@@ -267,8 +267,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "無法檢查您的網頁伺服器是否正確設置以允許透過 WebDAV 進行檔案同步。請手動進行檢查。",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "WebDAV 界面似乎為故障狀態,導致您的網頁伺服器無法提供檔案同步功能。",
"Your web server is properly set up to allow file synchronization over WebDAV." : "您的網頁伺服器已正確設定為允許透過 WebDAV 進行檔案同步。",
"Calendars including events, details and attendees" : "日曆,包括活動、詳細信息和與會者",
"Migrated calendar (%1$s)" : "遷移的日曆(%1$s",
"Calendars including events, details and attendees" : "日曆,包括活動、詳細信息和與會者",
"Contacts and groups" : "聯絡人和群組",
"WebDAV" : "WebDAV",
"Absence saved" : "缺席時段已儲存",
+1 -1
View File
@@ -270,8 +270,8 @@ OC.L10N.register(
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "無法檢查您的網路伺服器是否已正確設定以允許透過 WebDAV 進行檔案同步。請手動檢查。",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "WebDAV 介面似乎為故障狀態,導致您的網頁伺服器無法提供檔案同步功能。",
"Your web server is properly set up to allow file synchronization over WebDAV." : "您的網路伺服器已正確設定為允許透過 WebDAV 進行檔案同步。",
"Calendars including events, details and attendees" : "行事曆,包含行程、詳細資訊、參與者",
"Migrated calendar (%1$s)" : "已導入的行事曆 (%1$s)",
"Calendars including events, details and attendees" : "行事曆,包含行程、詳細資訊、參與者",
"Contacts and groups" : "聯絡人與群組",
"WebDAV" : "WebDAV",
"Absence saved" : "不在時段已儲存",
+1 -1
View File
@@ -268,8 +268,8 @@
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "無法檢查您的網路伺服器是否已正確設定以允許透過 WebDAV 進行檔案同步。請手動檢查。",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "WebDAV 介面似乎為故障狀態,導致您的網頁伺服器無法提供檔案同步功能。",
"Your web server is properly set up to allow file synchronization over WebDAV." : "您的網路伺服器已正確設定為允許透過 WebDAV 進行檔案同步。",
"Calendars including events, details and attendees" : "行事曆,包含行程、詳細資訊、參與者",
"Migrated calendar (%1$s)" : "已導入的行事曆 (%1$s)",
"Calendars including events, details and attendees" : "行事曆,包含行程、詳細資訊、參與者",
"Contacts and groups" : "聯絡人與群組",
"WebDAV" : "WebDAV",
"Absence saved" : "不在時段已儲存",
+1 -1
View File
@@ -325,7 +325,7 @@ class CalendarImpl implements ICreateFromString, IHandleImipMessage, ICalendarIs
public function export(?CalendarExportOptions $options = null): Generator {
foreach (
$this->backend->exportCalendar(
(int)$this->calendarInfo['id'],
$this->calendarInfo['id'],
$this->backend::CALENDAR_TYPE_CALENDAR,
$options
) as $event
@@ -9,7 +9,6 @@ declare(strict_types=1);
namespace OCA\DAV\Provisioning\Apple;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\Constants;
use Sabre\DAV\Exception\Forbidden;
use Sabre\DAV\INode;
use Sabre\DAV\IProperties;
@@ -61,7 +60,7 @@ class AppleProvisioningNode implements INode, IProperties {
return [
'{DAV:}getcontentlength' => 42,
'{DAV:}getlastmodified' => $datetime->format(Constants::DATE_RFC7231),
'{DAV:}getlastmodified' => $datetime->format(\DateTimeInterface::RFC7231),
];
}
+424 -473
View File
@@ -11,57 +11,452 @@ namespace OCA\DAV\UserMigration;
use OCA\DAV\AppInfo\Application;
use OCA\DAV\CalDAV\CalDavBackend;
use OCA\DAV\CalDAV\CalendarImpl;
use OCA\DAV\CalDAV\Export\ExportService;
use OCA\DAV\CalDAV\Import\ImportService;
use OCP\App\IAppManager;
use OCP\Calendar\CalendarExportOptions;
use OCP\Calendar\CalendarImportOptions;
use OCA\DAV\CalDAV\ICSExportPlugin\ICSExportPlugin;
use OCA\DAV\CalDAV\Plugin as CalDAVPlugin;
use OCA\DAV\Connector\Sabre\CachingTree;
use OCA\DAV\Connector\Sabre\Server as SabreDavServer;
use OCA\DAV\RootCollection;
use OCP\Calendar\ICalendar;
use OCP\Calendar\IManager as ICalendarManager;
use OCP\Defaults;
use OCP\IL10N;
use OCP\ITempManager;
use OCP\IUser;
use OCP\UserMigration\IExportDestination;
use OCP\UserMigration\IImportSource;
use OCP\UserMigration\IMigrator;
use OCP\UserMigration\ISizeEstimationMigrator;
use OCP\UserMigration\TMigratorBasicVersionHandling;
use Sabre\DAV\Xml\Property\Href;
use Sabre\VObject\Component as VObjectComponent;
use Sabre\VObject\Component\VCalendar;
use Sabre\VObject\Component\VTimeZone;
use Sabre\VObject\Property\ICalendar\DateTime;
use Sabre\VObject\Reader as VObjectReader;
use Sabre\VObject\UUIDUtil;
use Symfony\Component\Console\Output\NullOutput;
use Symfony\Component\Console\Output\OutputInterface;
use Throwable;
use function substr;
class CalendarMigrator implements IMigrator, ISizeEstimationMigrator {
use TMigratorBasicVersionHandling;
private const PATH_ROOT = Application::APP_ID . '/calendars/';
private const PATH_VERSION = self::PATH_ROOT . 'version.json';
private const PATH_CALENDARS = self::PATH_ROOT . 'calendars.json';
private const PATH_SUBSCRIPTIONS = self::PATH_ROOT . 'subscriptions.json';
private SabreDavServer $sabreDavServer;
private const USERS_URI_ROOT = 'principals/users/';
private const FILENAME_EXT = '.ics';
private const MIGRATED_URI_PREFIX = 'migrated-';
private const DAV_PROPERTY_URI = 'uri';
private const DAV_PROPERTY_DISPLAYNAME = '{DAV:}displayname';
private const DAV_PROPERTY_CALENDAR_COLOR = '{http://apple.com/ns/ical/}calendar-color';
private const DAV_PROPERTY_CALENDAR_TIMEZONE = '{urn:ietf:params:xml:ns:caldav}calendar-timezone';
private const DAV_PROPERTY_SUBSCRIBED_SOURCE = 'source';
private const DAV_PROPERTY_SUBSCRIBED_STRIP_TODOS = '{http://calendarserver.org/ns/}subscribed-strip-todos';
private const DAV_PROPERTY_SUBSCRIBED_STRIP_ALARMS = '{http://calendarserver.org/ns/}subscribed-strip-alarms';
private const DAV_PROPERTY_SUBSCRIBED_STRIP_ATTACHMENTS = '{http://calendarserver.org/ns/}subscribed-strip-attachments';
private const EXPORT_ROOT = Application::APP_ID . '/calendars/';
public function __construct(
private readonly IAppManager $appManager,
private readonly CalDavBackend $calDavBackend,
private readonly ICalendarManager $calendarManager,
private readonly Defaults $defaults,
private readonly IL10N $l10n,
private readonly ExportService $exportService,
private readonly ImportService $importService,
private readonly ITempManager $tempManager,
private CalDavBackend $calDavBackend,
private ICalendarManager $calendarManager,
private ICSExportPlugin $icsExportPlugin,
private Defaults $defaults,
private IL10N $l10n,
) {
$this->version = 2;
$root = new RootCollection();
$this->sabreDavServer = new SabreDavServer(new CachingTree($root));
$this->sabreDavServer->addPlugin(new CalDAVPlugin());
}
private function getPrincipalUri(IUser $user): string {
return CalendarMigrator::USERS_URI_ROOT . $user->getUID();
}
/**
* @return array{name: string, vCalendar: VCalendar}
*
* @throws CalendarMigratorException
* @throws InvalidCalendarException
*/
private function getCalendarExportData(IUser $user, ICalendar $calendar, OutputInterface $output): array {
$userId = $user->getUID();
$uri = $calendar->getUri();
$path = CalDAVPlugin::CALENDAR_ROOT . "/$userId/$uri";
/**
* @see \Sabre\CalDAV\ICSExportPlugin::httpGet() implementation reference
*/
$properties = $this->sabreDavServer->getProperties($path, [
'{DAV:}resourcetype',
'{DAV:}displayname',
'{http://sabredav.org/ns}sync-token',
'{DAV:}sync-token',
'{http://apple.com/ns/ical/}calendar-color',
]);
// Filter out invalid (e.g. deleted) calendars
if (!isset($properties['{DAV:}resourcetype']) || !$properties['{DAV:}resourcetype']->is('{' . CalDAVPlugin::NS_CALDAV . '}calendar')) {
throw new InvalidCalendarException();
}
/**
* @see \Sabre\CalDAV\ICSExportPlugin::generateResponse() implementation reference
*/
$calDataProp = '{' . CalDAVPlugin::NS_CALDAV . '}calendar-data';
$calendarNode = $this->sabreDavServer->tree->getNodeForPath($path);
$nodes = $this->sabreDavServer->getPropertiesIteratorForPath($path, [$calDataProp], 1);
$blobs = [];
foreach ($nodes as $node) {
if (isset($node[200][$calDataProp])) {
$blobs[$node['href']] = $node[200][$calDataProp];
}
}
$mergedCalendar = $this->icsExportPlugin->mergeObjects(
$properties,
$blobs,
);
$problems = $mergedCalendar->validate();
if (!empty($problems)) {
$output->writeln('Skipping calendar "' . $properties['{DAV:}displayname'] . '" containing invalid calendar data');
throw new InvalidCalendarException();
}
return [
'name' => $calendarNode->getName(),
'vCalendar' => $mergedCalendar,
];
}
/**
* @return array<int, array{name: string, vCalendar: VCalendar}>
*
* @throws CalendarMigratorException
*/
private function getCalendarExports(IUser $user, OutputInterface $output): array {
$principalUri = $this->getPrincipalUri($user);
return array_values(array_filter(array_map(
function (ICalendar $calendar) use ($user, $output) {
try {
return $this->getCalendarExportData($user, $calendar, $output);
} catch (InvalidCalendarException $e) {
// Allow this exception as invalid (e.g. deleted) calendars are not to be exported
return null;
}
},
$this->calendarManager->getCalendarsForPrincipal($principalUri),
)));
}
/**
* @throws InvalidCalendarException
*/
private function getUniqueCalendarUri(IUser $user, string $initialCalendarUri): string {
$principalUri = $this->getPrincipalUri($user);
$initialCalendarUri = substr($initialCalendarUri, 0, strlen(CalendarMigrator::MIGRATED_URI_PREFIX)) === CalendarMigrator::MIGRATED_URI_PREFIX
? $initialCalendarUri
: CalendarMigrator::MIGRATED_URI_PREFIX . $initialCalendarUri;
if ($initialCalendarUri === '') {
throw new InvalidCalendarException();
}
$existingCalendarUris = array_map(
fn (ICalendar $calendar) => $calendar->getUri(),
$this->calendarManager->getCalendarsForPrincipal($principalUri),
);
$calendarUri = $initialCalendarUri;
$acc = 1;
while (in_array($calendarUri, $existingCalendarUris, true)) {
$calendarUri = $initialCalendarUri . "-$acc";
++$acc;
}
return $calendarUri;
}
/**
* {@inheritDoc}
*/
public function getEstimatedExportSize(IUser $user): int|float {
$calendarExports = $this->getCalendarExports($user, new NullOutput());
$calendarCount = count($calendarExports);
// 150B for top-level properties
$size = ($calendarCount * 150) / 1024;
$componentCount = array_sum(array_map(
function (array $data): int {
/** @var VCalendar $vCalendar */
$vCalendar = $data['vCalendar'];
return count($vCalendar->getComponents());
},
$calendarExports,
));
// 450B for each component (events, todos, alarms, etc.)
$size += ($componentCount * 450) / 1024;
return ceil($size);
}
/**
* {@inheritDoc}
*/
public function export(IUser $user, IExportDestination $exportDestination, OutputInterface $output): void {
$output->writeln('Exporting calendars into ' . CalendarMigrator::EXPORT_ROOT . '…');
$calendarExports = $this->getCalendarExports($user, $output);
if (empty($calendarExports)) {
$output->writeln('No calendars to export…');
}
try {
/**
* @var string $name
* @var VCalendar $vCalendar
*/
foreach ($calendarExports as ['name' => $name, 'vCalendar' => $vCalendar]) {
// Set filename to sanitized calendar name
$filename = preg_replace('/[^a-z0-9-_]/iu', '', $name) . CalendarMigrator::FILENAME_EXT;
$exportPath = CalendarMigrator::EXPORT_ROOT . $filename;
$exportDestination->addFileContents($exportPath, $vCalendar->serialize());
}
} catch (Throwable $e) {
throw new CalendarMigratorException('Could not export calendars', 0, $e);
}
}
/**
* @return array<string, VTimeZone>
*/
private function getCalendarTimezones(VCalendar $vCalendar): array {
/** @var VTimeZone[] $calendarTimezones */
$calendarTimezones = array_filter(
$vCalendar->getComponents(),
fn ($component) => $component->name === 'VTIMEZONE',
);
/** @var array<string, VTimeZone> $calendarTimezoneMap */
$calendarTimezoneMap = [];
foreach ($calendarTimezones as $vTimeZone) {
$calendarTimezoneMap[$vTimeZone->getTimeZone()->getName()] = $vTimeZone;
}
return $calendarTimezoneMap;
}
/**
* @return VTimeZone[]
*/
private function getTimezonesForComponent(VCalendar $vCalendar, VObjectComponent $component): array {
$componentTimezoneIds = [];
foreach ($component->children() as $child) {
if ($child instanceof DateTime && isset($child->parameters['TZID'])) {
$timezoneId = $child->parameters['TZID']->getValue();
if (!in_array($timezoneId, $componentTimezoneIds, true)) {
$componentTimezoneIds[] = $timezoneId;
}
}
}
$calendarTimezoneMap = $this->getCalendarTimezones($vCalendar);
return array_values(array_filter(array_map(
fn (string $timezoneId) => $calendarTimezoneMap[$timezoneId],
$componentTimezoneIds,
)));
}
private function sanitizeComponent(VObjectComponent $component): VObjectComponent {
// Operate on the component clone to prevent mutation of the original
$component = clone $component;
// Remove RSVP parameters to prevent automatically sending invitation emails to attendees on import
foreach ($component->children() as $child) {
if (
$child->name === 'ATTENDEE'
&& isset($child->parameters['RSVP'])
) {
unset($child->parameters['RSVP']);
}
}
return $component;
}
/**
* @return VObjectComponent[]
*/
private function getRequiredImportComponents(VCalendar $vCalendar, VObjectComponent $component): array {
$component = $this->sanitizeComponent($component);
/** @var array<int, VTimeZone> $timezoneComponents */
$timezoneComponents = $this->getTimezonesForComponent($vCalendar, $component);
return [
...$timezoneComponents,
$component,
];
}
private function initCalendarObject(): VCalendar {
$vCalendarObject = new VCalendar();
$vCalendarObject->PRODID = '-//IDN nextcloud.com//Migrated calendar//EN';
return $vCalendarObject;
}
/**
* @throws InvalidCalendarException
*/
private function importCalendarObject(int $calendarId, VCalendar $vCalendarObject, string $filename, OutputInterface $output): void {
try {
$this->calDavBackend->createCalendarObject(
$calendarId,
UUIDUtil::getUUID() . CalendarMigrator::FILENAME_EXT,
$vCalendarObject->serialize(),
CalDavBackend::CALENDAR_TYPE_CALENDAR,
);
} catch (Throwable $e) {
$output->writeln("Error creating calendar object, rolling back creation of \"$filename\" calendar…");
$this->calDavBackend->deleteCalendar($calendarId, true);
throw new InvalidCalendarException();
}
}
/**
* @throws InvalidCalendarException
*/
private function importCalendar(IUser $user, string $filename, string $initialCalendarUri, VCalendar $vCalendar, OutputInterface $output): void {
$principalUri = $this->getPrincipalUri($user);
$calendarUri = $this->getUniqueCalendarUri($user, $initialCalendarUri);
$calendarId = $this->calDavBackend->createCalendar($principalUri, $calendarUri, [
'{DAV:}displayname' => isset($vCalendar->{'X-WR-CALNAME'}) ? $vCalendar->{'X-WR-CALNAME'}->getValue() : $this->l10n->t('Migrated calendar (%1$s)', [$filename]),
'{http://apple.com/ns/ical/}calendar-color' => isset($vCalendar->{'X-APPLE-CALENDAR-COLOR'}) ? $vCalendar->{'X-APPLE-CALENDAR-COLOR'}->getValue() : $this->defaults->getColorPrimary(),
'components' => implode(
',',
array_reduce(
$vCalendar->getComponents(),
function (array $componentNames, VObjectComponent $component) {
/** @var array<int, string> $componentNames */
return !in_array($component->name, $componentNames, true)
? [...$componentNames, $component->name]
: $componentNames;
},
[],
)
),
]);
/** @var VObjectComponent[] $calendarComponents */
$calendarComponents = array_values(array_filter(
$vCalendar->getComponents(),
// VTIMEZONE components are handled separately and added to the calendar object only if depended on by the component
fn (VObjectComponent $component) => $component->name !== 'VTIMEZONE',
));
/** @var array<string, VObjectComponent[]> $groupedCalendarComponents */
$groupedCalendarComponents = [];
/** @var VObjectComponent[] $ungroupedCalendarComponents */
$ungroupedCalendarComponents = [];
foreach ($calendarComponents as $component) {
if (isset($component->UID)) {
$uid = $component->UID->getValue();
// Components with the same UID (e.g. recurring events) are grouped together into a single calendar object
if (isset($groupedCalendarComponents[$uid])) {
$groupedCalendarComponents[$uid][] = $component;
} else {
$groupedCalendarComponents[$uid] = [$component];
}
} else {
$ungroupedCalendarComponents[] = $component;
}
}
foreach ($groupedCalendarComponents as $uid => $components) {
// Construct and import a calendar object containing all components of a group
$vCalendarObject = $this->initCalendarObject();
foreach ($components as $component) {
foreach ($this->getRequiredImportComponents($vCalendar, $component) as $component) {
$vCalendarObject->add($component);
}
}
$this->importCalendarObject($calendarId, $vCalendarObject, $filename, $output);
}
foreach ($ungroupedCalendarComponents as $component) {
// Construct and import a calendar object for a single component
$vCalendarObject = $this->initCalendarObject();
foreach ($this->getRequiredImportComponents($vCalendar, $component) as $component) {
$vCalendarObject->add($component);
}
$this->importCalendarObject($calendarId, $vCalendarObject, $filename, $output);
}
}
/**
* {@inheritDoc}
*
* @throws CalendarMigratorException
*/
public function import(IUser $user, IImportSource $importSource, OutputInterface $output): void {
if ($importSource->getMigratorVersion($this->getId()) === null) {
$output->writeln('No version for ' . static::class . ', skipping import…');
return;
}
$output->writeln('Importing calendars from ' . CalendarMigrator::EXPORT_ROOT . '…');
$calendarImports = $importSource->getFolderListing(CalendarMigrator::EXPORT_ROOT);
if (empty($calendarImports)) {
$output->writeln('No calendars to import…');
}
foreach ($calendarImports as $filename) {
$importPath = CalendarMigrator::EXPORT_ROOT . $filename;
try {
/** @var VCalendar $vCalendar */
$vCalendar = VObjectReader::read(
$importSource->getFileAsStream($importPath),
VObjectReader::OPTION_FORGIVING,
);
} catch (Throwable $e) {
$output->writeln("Failed to read file \"$importPath\", skipping…");
continue;
}
$problems = $vCalendar->validate();
if (!empty($problems)) {
$output->writeln("Invalid calendar data contained in \"$importPath\", skipping…");
continue;
}
$splitFilename = explode('.', $filename, 2);
if (count($splitFilename) !== 2) {
$output->writeln("Invalid filename \"$filename\", expected filename of the format \"<calendar_name>" . CalendarMigrator::FILENAME_EXT . '", skipping…');
continue;
}
[$initialCalendarUri, $ext] = $splitFilename;
try {
$this->importCalendar(
$user,
$filename,
$initialCalendarUri,
$vCalendar,
$output,
);
} catch (InvalidCalendarException $e) {
// Allow this exception to skip a failed import
} finally {
$vCalendar->destroy();
}
}
}
/**
@@ -84,448 +479,4 @@ class CalendarMigrator implements IMigrator, ISizeEstimationMigrator {
public function getDescription(): string {
return $this->l10n->t('Calendars including events, details and attendees');
}
/**
* {@inheritDoc}
*/
public function getEstimatedExportSize(IUser $user): int|float {
$principalUri = self::USERS_URI_ROOT . $user->getUID();
$calendars = $this->calendarManager->getCalendarsForPrincipal($principalUri);
$calendarCount = 0;
$totalSize = 0;
foreach ($calendars as $calendar) {
if (!$calendar instanceof CalendarImpl) {
continue;
}
if ($calendar->isShared()) {
continue;
}
$calendarCount++;
// Note: 'uid' is required because getLimitedCalendarObjects uses it as the array key
$objects = $this->calDavBackend->getLimitedCalendarObjects((int)$calendar->getKey(), CalDavBackend::CALENDAR_TYPE_CALENDAR, ['uid', 'size']);
foreach ($objects as $object) {
$totalSize += (int)($object['size'] ?? 0);
}
}
// 150B for meta file per calendar + total calendar data size
$size = ($calendarCount * 150 + $totalSize) / 1024;
return ceil($size);
}
/**
* {@inheritDoc}
*/
#[\Override]
public function export(IUser $user, IExportDestination $exportDestination, OutputInterface $output): void {
$output->writeln('Exporting calendaring data…');
$this->exportVersion($exportDestination, $output);
$this->exportCalendars($user, $exportDestination, $output);
$this->exportSubscriptions($user, $exportDestination, $output);
}
/**
* @throws CalendarMigratorException
*/
private function exportVersion(IExportDestination $exportDestination, OutputInterface $output): void {
try {
$versionData = [
'appVersion' => $this->appManager->getAppVersion(Application::APP_ID),
];
$exportDestination->addFileContents(self::PATH_VERSION, json_encode($versionData, JSON_THROW_ON_ERROR));
} catch (Throwable $e) {
throw new CalendarMigratorException('Could not export version information', 0, $e);
}
}
/**
* @throws CalendarMigratorException
*/
public function exportCalendars(IUser $user, IExportDestination $exportDestination, OutputInterface $output): void {
$output->writeln('Exporting calendars to ' . self::PATH_CALENDARS . '…');
try {
$calendarExports = $this->calendarManager->getCalendarsForPrincipal(self::USERS_URI_ROOT . $user->getUID());
$exportData = [];
/** @var CalendarImpl $calendar */
foreach ($calendarExports as $calendar) {
$output->writeln('Exporting calendar "' . $calendar->getUri() . '"');
if (!$calendar instanceof CalendarImpl) {
$output->writeln('Skipping unsupported calendar type for "' . $calendar->getUri() . '"');
continue;
}
if ($calendar->isShared()) {
$output->writeln('Skipping shared calendar "' . $calendar->getUri() . '"');
continue;
}
// construct archive path for calendar data
$filename = preg_replace('/[^a-z0-9-_]/iu', '', $calendar->getUri());
$exportDataPath = self::PATH_ROOT . $filename . '.data';
// add calendar metadata to the collection
$exportData[] = [
'format' => 'ical',
'uri' => $calendar->getUri(),
'label' => $calendar->getDisplayName(),
'color' => $calendar->getDisplayColor(),
'timezone' => $calendar->getSchedulingTimezone(),
];
// export calendar data to a temporary file
$options = new CalendarExportOptions();
$options->setFormat('ical');
$tempPath = $this->tempManager->getTemporaryFile();
$tempFile = fopen($tempPath, 'w+');
foreach ($this->exportService->export($calendar, $options) as $chunk) {
fwrite($tempFile, $chunk);
}
// add the temporary file to the export archive
rewind($tempFile);
$exportDestination->addFileAsStream($exportDataPath, $tempFile);
fclose($tempFile);
}
// write all calendar metadata
$exportDestination->addFileContents(self::PATH_CALENDARS, json_encode($exportData, JSON_THROW_ON_ERROR));
$output->writeln('Exported ' . count($exportData) . ' calendar(s)…');
} catch (Throwable $e) {
throw new CalendarMigratorException('Could not export calendars', 0, $e);
}
}
/**
* @throws CalendarMigratorException
*/
private function exportSubscriptions(IUser $user, IExportDestination $exportDestination, OutputInterface $output): void {
$output->writeln('Exporting calendar subscriptions to ' . self::PATH_SUBSCRIPTIONS . '…');
try {
$subscriptions = $this->calDavBackend->getSubscriptionsForUser(self::USERS_URI_ROOT . $user->getUID());
$exportData = [];
foreach ($subscriptions as $subscription) {
$exportData[] = [
'uri' => $subscription[self::DAV_PROPERTY_URI],
'displayname' => $subscription[self::DAV_PROPERTY_DISPLAYNAME] ?? null,
'color' => $subscription[self::DAV_PROPERTY_CALENDAR_COLOR] ?? null,
'source' => $subscription[self::DAV_PROPERTY_SUBSCRIBED_SOURCE] ?? null,
'striptodos' => $subscription[self::DAV_PROPERTY_SUBSCRIBED_STRIP_TODOS] ?? null,
'stripalarms' => $subscription[self::DAV_PROPERTY_SUBSCRIBED_STRIP_ALARMS] ?? null,
'stripattachments' => $subscription[self::DAV_PROPERTY_SUBSCRIBED_STRIP_ATTACHMENTS] ?? null,
];
}
$exportDestination->addFileContents(self::PATH_SUBSCRIPTIONS, json_encode($exportData, JSON_THROW_ON_ERROR));
$output->writeln('Exported ' . count($exportData) . ' calendar subscription(s)…');
} catch (Throwable $e) {
throw new CalendarMigratorException('Could not export calendar subscriptions', 0, $e);
}
}
/**
* {@inheritDoc}
*
* @throws CalendarMigratorException
*/
public function import(IUser $user, IImportSource $importSource, OutputInterface $output): void {
$output->writeln('Importing calendaring data…');
if ($importSource->getMigratorVersion($this->getId()) === null) {
$output->writeln('No version for ' . static::class . ', skipping import…');
return;
}
$this->importCalendars($user, $importSource, $output);
$this->importSubscriptions($user, $importSource, $output);
}
/**
* @throws CalendarMigratorException
*/
public function importCalendars(IUser $user, IImportSource $importSource, OutputInterface $output): void {
$output->writeln('Importing calendars from ' . self::PATH_ROOT . '…');
$migratorVersion = $importSource->getMigratorVersion($this->getId());
match ($migratorVersion) {
1 => $this->importCalendarsV1($user, $importSource, $output),
2 => $this->importCalendarsV2($user, $importSource, $output),
default => throw new CalendarMigratorException('Unsupported migrator version ' . $migratorVersion . ' for ' . static::class),
};
}
/**
* @throws CalendarMigratorException
*/
public function importCalendarsV2(IUser $user, IImportSource $importSource, OutputInterface $output): void {
$output->writeln('Importing calendars from ' . self::PATH_CALENDARS . '…');
if ($importSource->pathExists(self::PATH_CALENDARS) === false) {
$output->writeln('No calendars to import…');
return;
}
$importData = $importSource->getFileContents(self::PATH_CALENDARS);
if (empty($importData)) {
$output->writeln('No calendars to import…');
return;
}
try {
/** @var array<int, array<string, mixed>> $calendarsData */
$calendarsData = json_decode($importData, true, 512, JSON_THROW_ON_ERROR);
if (empty($calendarsData)) {
$output->writeln('No calendars to import…');
return;
}
$principalUri = self::USERS_URI_ROOT . $user->getUID();
$importCount = 0;
foreach ($calendarsData as $calendarMeta) {
$migratedCalendarUri = self::MIGRATED_URI_PREFIX . $calendarMeta['uri'];
$filename = preg_replace('/[^a-z0-9-_]/iu', '', $calendarMeta['uri']);
$importDataPath = self::PATH_ROOT . $filename . '.data';
try {
// check if a calendar with this URI already exists
$calendars = $this->calendarManager->getCalendarsForPrincipal($principalUri, [$migratedCalendarUri]);
if (empty($calendars)) {
$output->writeln("Creating calendar \"$migratedCalendarUri\"");
// create the calendar
$this->calDavBackend->createCalendar($principalUri, $migratedCalendarUri, [
self::DAV_PROPERTY_DISPLAYNAME => $calendarMeta['label'] ?? $this->l10n->t('Migrated calendar (%1$s)', [$calendarMeta['uri']]),
self::DAV_PROPERTY_CALENDAR_COLOR => $calendarMeta['color'] ?? $this->defaults->getColorPrimary(),
self::DAV_PROPERTY_CALENDAR_TIMEZONE => $calendarMeta['timezone'] ?? null,
]);
// retrieve the created calendar
$calendars = $this->calendarManager->getCalendarsForPrincipal($principalUri, [$migratedCalendarUri]);
if (empty($calendars) || !($calendars[0] instanceof CalendarImpl)) {
$output->writeln("Failed to retrieve created calendar \"$migratedCalendarUri\", skipping import…");
continue;
}
} else {
$output->writeln("Using existing calendar \"$migratedCalendarUri\"");
}
$calendar = $calendars[0];
// copy import stream to temporary file as the source stream is not rewindable
$importStream = $importSource->getFileAsStream($importDataPath);
$tempPath = $this->tempManager->getTemporaryFile();
$tempFile = fopen($tempPath, 'w+');
stream_copy_to_stream($importStream, $tempFile);
rewind($tempFile);
// import calendar data
try {
$options = new CalendarImportOptions();
$options->setFormat($calendarMeta['format'] ?? 'ical');
$options->setErrors(0);
$options->setValidate(1);
$options->setSupersede(true);
$outcome = $this->importService->import(
$tempFile,
$calendar,
$options
);
} finally {
fclose($tempFile);
}
$this->importSummary($calendarMeta['label'] ?? $calendarMeta['uri'], $outcome, $output);
$importCount++;
} catch (Throwable $e) {
$output->writeln('Failed to import calendar "' . ($calendarMeta['uri'] ?? 'unknown') . '", skipping…');
continue;
}
}
$output->writeln('Imported ' . $importCount . ' calendar(s)…');
} catch (Throwable $e) {
throw new CalendarMigratorException('Could not import calendars', 0, $e);
}
}
/**
* @throws CalendarMigratorException
*/
public function importCalendarsV1(IUser $user, IImportSource $importSource, OutputInterface $output): void {
$files = $importSource->getFolderListing(self::PATH_ROOT);
if (empty($files)) {
$output->writeln('No calendars to import…');
}
$principalUri = self::USERS_URI_ROOT . $user->getUID();
foreach ($files as $filename) {
// Only process .ics files
if (!str_ends_with($filename, '.ics')) {
continue;
}
// construct archive path
$importDataPath = self::PATH_ROOT . $filename;
try {
$calendarUri = substr($filename, 0, -4);
$migratedCalendarUri = self::MIGRATED_URI_PREFIX . $calendarUri;
// copy import stream to temporary file as the source stream is not rewindable
$importStream = $importSource->getFileAsStream($importDataPath);
$tempPath = $this->tempManager->getTemporaryFile();
$tempFile = fopen($tempPath, 'w+');
stream_copy_to_stream($importStream, $tempFile);
rewind($tempFile);
// check if a calendar with this URI already exists
$calendars = $this->calendarManager->getCalendarsForPrincipal($principalUri, [$migratedCalendarUri]);
if (empty($calendars)) {
$output->writeln("Creating calendar \"$migratedCalendarUri\"");
// extract calendar properties from the ICS header without full parsing
$calendarName = null;
$calendarColor = null;
$headerLines = 0;
while (($line = fgets($tempFile)) !== false && $headerLines < 50) {
$headerLines++;
$line = trim($line);
if (str_starts_with($line, 'X-WR-CALNAME:')) {
$calendarName = substr($line, 13);
} elseif (str_starts_with($line, 'X-APPLE-CALENDAR-COLOR:')) {
$calendarColor = substr($line, 23);
}
// stop parsing header once we hit the first component
if (str_starts_with($line, 'BEGIN:VEVENT')
|| str_starts_with($line, 'BEGIN:VTODO')
|| str_starts_with($line, 'BEGIN:VJOURNAL')) {
break;
}
}
rewind($tempFile);
// create the calendar
$this->calDavBackend->createCalendar($principalUri, $migratedCalendarUri, [
self::DAV_PROPERTY_DISPLAYNAME => $calendarName ?? $this->l10n->t('Migrated calendar (%1$s)', [$calendarUri]),
self::DAV_PROPERTY_CALENDAR_COLOR => $calendarColor ?? $this->defaults->getColorPrimary(),
]);
// retrieve the created calendar
$calendars = $this->calendarManager->getCalendarsForPrincipal($principalUri, [$migratedCalendarUri]);
if (empty($calendars) || !($calendars[0] instanceof CalendarImpl)) {
$output->writeln("Failed to retrieve created calendar \"$migratedCalendarUri\", skipping import…");
fclose($tempFile);
continue;
}
} else {
$output->writeln("Using existing calendar \"$migratedCalendarUri\"");
}
$calendar = $calendars[0];
// import calendar data
$options = new CalendarImportOptions();
$options->setFormat('ical');
$options->setErrors(0);
$options->setValidate(1);
$options->setSupersede(true);
try {
$outcome = $this->importService->import(
$tempFile,
$calendar,
$options
);
} finally {
fclose($tempFile);
}
$this->importSummary($calendarName ?? $calendarUri, $outcome, $output);
} catch (Throwable $e) {
$output->writeln("Failed to import calendar \"$filename\", skipping…");
continue;
}
}
}
/**
* @throws CalendarMigratorException
*/
public function importSubscriptions(IUser $user, IImportSource $importSource, OutputInterface $output): void {
$output->writeln('Importing calendar subscriptions from ' . self::PATH_SUBSCRIPTIONS . '…');
if ($importSource->pathExists(self::PATH_SUBSCRIPTIONS) === false) {
$output->writeln('No calendar subscriptions to import…');
return;
}
$importData = $importSource->getFileContents(self::PATH_SUBSCRIPTIONS);
if (empty($importData)) {
$output->writeln('No calendar subscriptions to import…');
return;
}
try {
$subscriptions = json_decode($importData, true, 512, JSON_THROW_ON_ERROR);
if (empty($subscriptions)) {
$output->writeln('No calendar subscriptions to import…');
return;
}
$principalUri = self::USERS_URI_ROOT . $user->getUID();
$importCount = 0;
foreach ($subscriptions as $subscription) {
$output->writeln('Importing calendar subscription "' . ($subscription['displayname'] ?? $subscription['source'] ?? 'unknown') . '"');
if (empty($subscription['source'])) {
$output->writeln('Skipping subscription without source URL');
continue;
}
$this->calDavBackend->createSubscription(
$principalUri,
$subscription['uri'] ? self::MIGRATED_URI_PREFIX . $subscription['uri'] : self::MIGRATED_URI_PREFIX . bin2hex(random_bytes(16)),
[
'{http://calendarserver.org/ns/}source' => new Href($subscription['source']),
self::DAV_PROPERTY_DISPLAYNAME => $subscription['displayname'] ?? null,
self::DAV_PROPERTY_CALENDAR_COLOR => $subscription['color'] ?? null,
self::DAV_PROPERTY_SUBSCRIBED_STRIP_TODOS => $subscription['striptodos'] ?? null,
self::DAV_PROPERTY_SUBSCRIBED_STRIP_ALARMS => $subscription['stripalarms'] ?? null,
self::DAV_PROPERTY_SUBSCRIBED_STRIP_ATTACHMENTS => $subscription['stripattachments'] ?? null,
]
);
$importCount++;
}
$output->writeln('Imported ' . $importCount . ' subscription(s)…');
} catch (Throwable $e) {
throw new CalendarMigratorException('Could not import calendar subscriptions', 0, $e);
}
}
private function importSummary(string $label, array $outcome, OutputInterface $output): void {
$created = 0;
$updated = 0;
$skipped = 0;
$errors = 0;
foreach ($outcome as $result) {
match ($result['outcome'] ?? null) {
'created' => $created++,
'updated' => $updated++,
'exists' => $skipped++,
'error' => $errors++,
default => null,
};
}
$output->writeln(" \"$label\": $created created, $updated updated, $skipped skipped, $errors errors");
}
}
@@ -10,629 +10,107 @@ declare(strict_types=1);
namespace OCA\DAV\Tests\integration\UserMigration;
use OCA\DAV\AppInfo\Application;
use OCA\DAV\CalDAV\CalDavBackend;
use OCA\DAV\CalDAV\CalendarImpl;
use OCA\DAV\UserMigration\CalendarMigrator;
use OCP\AppFramework\App;
use OCP\Calendar\IManager as ICalendarManager;
use OCP\IUser;
use OCP\IUserManager;
use OCP\UserMigration\IExportDestination;
use OCP\UserMigration\IImportSource;
use Sabre\VObject\Component as VObjectComponent;
use Sabre\VObject\Component\VCalendar;
use Sabre\VObject\Property as VObjectProperty;
use Sabre\VObject\Reader as VObjectReader;
use Sabre\VObject\UUIDUtil;
use Symfony\Component\Console\Output\OutputInterface;
use Test\TestCase;
use function scandir;
#[\PHPUnit\Framework\Attributes\Group(name: 'DB')]
class CalendarMigratorTest extends TestCase {
private IUserManager $userManager;
private ICalendarManager $calendarManager;
private CalDavBackend $calDavBackend;
private CalendarMigrator $migrator;
private OutputInterface $output;
private const ASSETS_DIR = __DIR__ . '/assets/calendars/';
private const USERS_URI_ROOT = 'principals/users/';
protected function setUp(): void {
parent::setUp();
$app = new App(Application::APP_ID);
$container = $app->getContainer();
$this->userManager = $container->get(IUserManager::class);
$this->calendarManager = $container->get(ICalendarManager::class);
$this->calDavBackend = $container->get(CalDavBackend::class);
$this->migrator = $container->get(CalendarMigrator::class);
$this->output = $this->createMock(OutputInterface::class);
}
private function createTestUser(): IUser {
$userId = UUIDUtil::getUUID();
return $this->userManager->createUser($userId, 'topsecretpassword');
public static function dataAssets(): array {
return array_map(
function (string $filename) {
/** @var VCalendar $vCalendar */
$vCalendar = VObjectReader::read(
fopen(self::ASSETS_DIR . $filename, 'r'),
VObjectReader::OPTION_FORGIVING,
);
[$initialCalendarUri, $ext] = explode('.', $filename, 2);
return [UUIDUtil::getUUID(), $filename, $initialCalendarUri, $vCalendar];
},
array_diff(
scandir(self::ASSETS_DIR),
// Exclude current and parent directories
['.', '..'],
),
);
}
private function deleteUser(IUser $user): void {
$user->delete();
private function getProperties(VCalendar $vCalendar): array {
return array_map(
fn (VObjectProperty $property) => $property->serialize(),
array_values(array_filter(
$vCalendar->children(),
fn ($child) => $child instanceof VObjectProperty,
)),
);
}
private function getCalendarsForUser(IUser $user): array {
$principalUri = self::USERS_URI_ROOT . $user->getUID();
$calendars = $this->calendarManager->getCalendarsForPrincipal($principalUri);
return array_filter($calendars, fn ($c) => $c instanceof CalendarImpl && !$c->isShared());
private function getComponents(VCalendar $vCalendar): array {
return array_map(
// Elements of the serialized blob are sorted
fn (VObjectComponent $component) => $component->serialize(),
$vCalendar->getComponents(),
);
}
public function testImportV1(): void {
$user = $this->createTestUser();
try {
// Get all asset files
$files = scandir(self::ASSETS_DIR);
$this->assertNotFalse($files, 'Failed to scan assets directory');
$files = array_values(array_diff($files, ['.', '..']));
$this->assertNotEmpty($files, 'No asset files found');
// Load all ICS content
$icsContents = [];
foreach ($files as $filename) {
$icsContents[$filename] = file_get_contents(self::ASSETS_DIR . $filename);
}
// Setup import source mock
$importSource = $this->createMock(IImportSource::class);
$importSource->method('getMigratorVersion')
->with('calendar')
->willReturn(1);
$importSource->method('getFolderListing')
->with('dav/calendars/')
->willReturn($files);
$importSource->method('getFileAsStream')
->willReturnCallback(function (string $path) use ($icsContents) {
foreach ($icsContents as $filename => $content) {
if ($path === 'dav/calendars/' . $filename) {
$stream = fopen('php://temp', 'r+');
fwrite($stream, $content);
rewind($stream);
return $stream;
}
}
throw new \Exception("Unexpected path: $path");
});
// Import all calendars
$this->migrator->import($user, $importSource, $this->output);
// Verify all calendars were created
$calendars = $this->getCalendarsForUser($user);
$this->assertCount(count($files), $calendars, 'Expected all calendars to be created');
// Verify each calendar has the migrated prefix and has objects
foreach ($files as $filename) {
$expectedUri = 'migrated-' . substr($filename, 0, -4);
$found = false;
foreach ($calendars as $calendar) {
if ($calendar->getUri() === $expectedUri) {
$found = true;
// Verify calendar has objects
$objects = $this->calDavBackend->getCalendarObjects((int)$calendar->getKey());
$this->assertNotEmpty($objects, "Expected calendar $expectedUri to have objects");
break;
}
}
$this->assertTrue($found, "Calendar with URI $expectedUri was not found");
}
} finally {
$this->deleteUser($user);
}
private function getSanitizedComponents(VCalendar $vCalendar): array {
return array_map(
// Elements of the serialized blob are sorted
fn (VObjectComponent $component) => $this->invokePrivate($this->migrator, 'sanitizeComponent', [$component])->serialize(),
$vCalendar->getComponents(),
);
}
public function testImportV2(): void {
$user = $this->createTestUser();
#[\PHPUnit\Framework\Attributes\DataProvider(methodName: 'dataAssets')]
public function testImportExportAsset(string $userId, string $filename, string $initialCalendarUri, VCalendar $importCalendar): void {
$user = $this->userManager->createUser($userId, 'topsecretpassword');
try {
// Get all asset files
$files = scandir(self::ASSETS_DIR);
$this->assertNotFalse($files, 'Failed to scan assets directory');
$files = array_values(array_diff($files, ['.', '..']));
$this->assertNotEmpty($files, 'No asset files found');
$problems = $importCalendar->validate();
$this->assertEmpty($problems);
// Load all ICS content and build calendars metadata
$calendarsMetadata = [];
$icsContents = [];
foreach ($files as $filename) {
$icsContent = file_get_contents(self::ASSETS_DIR . $filename);
$calendarUri = substr($filename, 0, -4);
$icsContents[$calendarUri] = $icsContent;
$this->invokePrivate($this->migrator, 'importCalendar', [$user, $filename, $initialCalendarUri, $importCalendar, $this->output]);
$calendarsMetadata[] = [
'format' => 'ical',
'uri' => $calendarUri,
'label' => $calendarUri,
'color' => '#0082c9',
'timezone' => null,
];
}
$calendarExports = $this->invokePrivate($this->migrator, 'getCalendarExports', [$user, $this->output]);
$this->assertCount(1, $calendarExports);
// Setup import source mock for V2 format (calendars.json + .data files)
$importSource = $this->createMock(IImportSource::class);
$calendarsJson = json_encode($calendarsMetadata);
/** @var VCalendar $exportCalendar */
['vCalendar' => $exportCalendar] = reset($calendarExports);
$importSource->method('getMigratorVersion')
->with('calendar')
->willReturn(2);
$this->assertEqualsCanonicalizing(
$this->getProperties($importCalendar),
$this->getProperties($exportCalendar),
);
$importSource->method('pathExists')
->willReturnCallback(fn (string $path) => $path === 'dav/calendars/calendars.json');
$importSource->method('getFileContents')
->willReturnCallback(function (string $path) use ($calendarsJson) {
if ($path === 'dav/calendars/calendars.json') {
return $calendarsJson;
}
throw new \Exception("Unexpected path: $path");
});
$importSource->method('getFileAsStream')
->willReturnCallback(function (string $path) use ($icsContents) {
foreach ($icsContents as $calendarUri => $icsContent) {
if ($path === 'dav/calendars/' . $calendarUri . '.data') {
$stream = fopen('php://temp', 'r+');
fwrite($stream, $icsContent);
rewind($stream);
return $stream;
}
}
throw new \Exception("Unexpected path: $path");
});
// Import all calendars
$this->migrator->import($user, $importSource, $this->output);
// Verify all calendars were created
$calendars = $this->getCalendarsForUser($user);
$this->assertCount(count($files), $calendars, 'Expected all calendars to be created');
// Verify each calendar has the correct properties and objects
foreach ($calendarsMetadata as $metadata) {
$expectedUri = 'migrated-' . $metadata['uri'];
$found = false;
foreach ($calendars as $calendar) {
if ($calendar->getUri() === $expectedUri) {
$found = true;
// Verify calendar display name
$this->assertEquals($metadata['label'], $calendar->getDisplayName());
// Verify calendar has objects
$objects = $this->calDavBackend->getCalendarObjects((int)$calendar->getKey());
$this->assertNotEmpty($objects, "Expected calendar $expectedUri to have objects");
break;
}
}
$this->assertTrue($found, "Calendar with URI $expectedUri was not found");
}
} finally {
$this->deleteUser($user);
}
}
public function testExport(): void {
$user = $this->createTestUser();
try {
// Create a calendar to export
$principalUri = self::USERS_URI_ROOT . $user->getUID();
$calendarUri = 'test-export-calendar';
$calendarId = $this->calDavBackend->createCalendar($principalUri, $calendarUri, [
'{DAV:}displayname' => 'Test Export Calendar',
'{http://apple.com/ns/ical/}calendar-color' => '#ff0000',
]);
// Add an event to the calendar
$icsContent = file_get_contents(self::ASSETS_DIR . 'event-timed.ics');
$this->calDavBackend->createCalendarObject($calendarId, 'test-event.ics', $icsContent);
// Setup export destination mock
$exportDestination = $this->createMock(IExportDestination::class);
$exportedCalendarsJson = null;
$exportedData = null;
$exportDestination->method('addFileContents')
->willReturnCallback(function (string $path, string $content) use (&$exportedCalendarsJson) {
if ($path === 'dav/calendars/calendars.json') {
$exportedCalendarsJson = json_decode($content, true);
}
});
$exportDestination->method('addFileAsStream')
->willReturnCallback(function (string $path, $stream) use (&$exportedData) {
if (str_ends_with($path, '.data')) {
$exportedData = stream_get_contents($stream);
}
});
// Export the calendar
$this->migrator->export($user, $exportDestination, $this->output);
// Verify calendars.json was exported
$this->assertNotNull($exportedCalendarsJson, 'Expected calendars.json to be exported');
$this->assertIsArray($exportedCalendarsJson);
$this->assertCount(1, $exportedCalendarsJson);
$exportedMeta = $exportedCalendarsJson[0];
$this->assertEquals('ical', $exportedMeta['format']);
$this->assertEquals($calendarUri, $exportedMeta['uri']);
$this->assertEquals('Test Export Calendar', $exportedMeta['label']);
$this->assertEquals('#ff0000', $exportedMeta['color']);
// Verify data was exported
$this->assertNotNull($exportedData, 'Expected data to be exported');
$this->assertIsString($exportedData);
/** @var string $exportedData */
$this->assertStringContainsString('BEGIN:VCALENDAR', $exportedData);
$this->assertStringContainsString('BEGIN:VEVENT', $exportedData);
} finally {
$this->deleteUser($user);
}
}
public function testExportImportRoundTrip(): void {
$user = $this->createTestUser();
try {
// Create a calendar with some events
$principalUri = self::USERS_URI_ROOT . $user->getUID();
$calendarUri = 'roundtrip-calendar';
$calendarId = $this->calDavBackend->createCalendar($principalUri, $calendarUri, [
'{DAV:}displayname' => 'Round Trip Calendar',
'{http://apple.com/ns/ical/}calendar-color' => '#00ff00',
]);
// Add events to the calendar
$icsContent = file_get_contents(self::ASSETS_DIR . 'event-timed.ics');
$this->calDavBackend->createCalendarObject($calendarId, 'event1.ics', $icsContent);
// Capture exported data
$exportedFiles = [];
$exportDestination = $this->createMock(IExportDestination::class);
$exportDestination->method('addFileContents')
->willReturnCallback(function (string $path, string $content) use (&$exportedFiles) {
$exportedFiles[$path] = $content;
});
$exportDestination->method('addFileAsStream')
->willReturnCallback(function (string $path, $stream) use (&$exportedFiles) {
$exportedFiles[$path] = stream_get_contents($stream);
});
// Export
$this->migrator->export($user, $exportDestination, $this->output);
// Delete the original calendar
$this->calDavBackend->deleteCalendar($calendarId, true);
// Verify calendar is gone
$calendars = $this->getCalendarsForUser($user);
$this->assertEmpty($calendars, 'Calendar should be deleted');
// Setup import source from exported data
$importSource = $this->createMock(IImportSource::class);
$importSource->method('getMigratorVersion')
->with('calendar')
->willReturn(2);
$importSource->method('pathExists')
->willReturnCallback(function (string $path) use ($exportedFiles) {
return isset($exportedFiles[$path]);
});
$importSource->method('getFolderListing')
->with('dav/calendars/')
->willReturn(array_map(fn ($p) => basename($p), array_keys($exportedFiles)));
$importSource->method('getFileContents')
->willReturnCallback(function (string $path) use ($exportedFiles) {
if (isset($exportedFiles[$path])) {
return $exportedFiles[$path];
}
throw new \Exception("File not found: $path");
});
$importSource->method('getFileAsStream')
->willReturnCallback(function (string $path) use ($exportedFiles) {
if (isset($exportedFiles[$path])) {
$stream = fopen('php://temp', 'r+');
fwrite($stream, $exportedFiles[$path]);
rewind($stream);
return $stream;
}
throw new \Exception("File not found: $path");
});
// Import
$this->migrator->import($user, $importSource, $this->output);
// Verify calendar was recreated with migrated prefix
$calendars = $this->getCalendarsForUser($user);
$this->assertCount(1, $calendars, 'Expected one calendar after import');
$calendar = reset($calendars);
$this->assertEquals('migrated-' . $calendarUri, $calendar->getUri());
$this->assertEquals('Round Trip Calendar', $calendar->getDisplayName());
// Verify events were imported
$objects = $this->calDavBackend->getCalendarObjects((int)$calendar->getKey());
$this->assertCount(1, $objects, 'Expected one event after import');
} finally {
$this->deleteUser($user);
}
}
public function testGetEstimatedExportSize(): void {
$user = $this->createTestUser();
try {
// Initially should be 0 or minimal
$initialSize = $this->migrator->getEstimatedExportSize($user);
$this->assertEquals(0, $initialSize);
// Create a calendar with events
$principalUri = self::USERS_URI_ROOT . $user->getUID();
$calendarUri = 'size-test-calendar';
$calendarId = $this->calDavBackend->createCalendar($principalUri, $calendarUri, [
'{DAV:}displayname' => 'Size Test Calendar',
]);
// Add an event
$icsContent = file_get_contents(self::ASSETS_DIR . 'event-timed.ics');
$this->calDavBackend->createCalendarObject($calendarId, 'event.ics', $icsContent);
// Size should now be > 0
$sizeWithData = $this->migrator->getEstimatedExportSize($user);
$this->assertGreaterThan(0, $sizeWithData);
} finally {
$this->deleteUser($user);
}
}
public function testImportExistingCalendarSkipped(): void {
$user = $this->createTestUser();
try {
$principalUri = self::USERS_URI_ROOT . $user->getUID();
// Pre-create a calendar with the migrated prefix
$calendarUri = 'migrated-existing-calendar';
$this->calDavBackend->createCalendar($principalUri, $calendarUri, [
'{DAV:}displayname' => 'Existing Calendar',
]);
// Setup import for V2
$importSource = $this->createMock(IImportSource::class);
$importSource->method('getMigratorVersion')
->with('calendar')
->willReturn(2);
$importSource->method('pathExists')
->willReturnCallback(function (string $path) {
if ($path === 'dav/calendars/calendars.json') {
return true;
}
if ($path === 'dav/calendars/subscriptions.json') {
return false;
}
return false;
});
$importSource->method('getFileContents')
->willReturnCallback(function (string $path) {
if ($path === 'dav/calendars/calendars.json') {
return json_encode([[
'format' => 'ical',
'uri' => 'existing-calendar',
'label' => 'Existing Calendar',
'color' => '#0082c9',
'timezone' => null,
]]);
}
throw new \Exception("Unexpected path: $path");
});
// Import should use existing calendar
$this->migrator->import($user, $importSource, $this->output);
// Should still have just one calendar
$calendars = $this->getCalendarsForUser($user);
$this->assertCount(1, $calendars);
} finally {
$this->deleteUser($user);
}
}
public function testExportSubscriptions(): void {
$user = $this->createTestUser();
try {
// Create a subscription to export
$principalUri = self::USERS_URI_ROOT . $user->getUID();
$this->calDavBackend->createSubscription(
$principalUri,
'test-subscription',
[
'{http://calendarserver.org/ns/}source' => new \Sabre\DAV\Xml\Property\Href('https://example.com/calendar.ics'),
'{DAV:}displayname' => 'Test Subscription',
'{http://apple.com/ns/ical/}calendar-color' => '#ff0000',
'{http://calendarserver.org/ns/}subscribed-strip-todos' => '1',
]
);
// Setup export destination mock
$exportDestination = $this->createMock(IExportDestination::class);
$exportedSubscriptionsJson = null;
$exportDestination->method('addFileContents')
->willReturnCallback(function (string $path, string $content) use (&$exportedSubscriptionsJson) {
if ($path === 'dav/calendars/subscriptions.json') {
$exportedSubscriptionsJson = json_decode($content, true);
}
});
$exportDestination->method('addFileAsStream');
// Export
$this->migrator->export($user, $exportDestination, $this->output);
// Verify exported subscription data
$this->assertNotNull($exportedSubscriptionsJson, 'Subscriptions JSON should be exported');
$this->assertCount(1, $exportedSubscriptionsJson, 'Expected one subscription in export');
$exportedSubscription = $exportedSubscriptionsJson[0];
$this->assertEquals('test-subscription', $exportedSubscription['uri']);
$this->assertEquals('Test Subscription', $exportedSubscription['displayname']);
$this->assertEquals('#ff0000', $exportedSubscription['color']);
$this->assertEquals('https://example.com/calendar.ics', $exportedSubscription['source']);
$this->assertEquals('1', $exportedSubscription['striptodos']);
} finally {
$this->deleteUser($user);
}
}
public function testImportSubscriptions(): void {
$user = $this->createTestUser();
try {
// Setup import source mock
$importSource = $this->createMock(IImportSource::class);
$subscriptionsJson = json_encode([[
'uri' => 'imported-subscription',
'displayname' => 'Imported Subscription',
'color' => '#00ff00',
'source' => 'https://example.com/imported.ics',
'striptodos' => null,
'stripalarms' => '1',
'stripattachments' => null,
]]);
$importSource->method('getMigratorVersion')
->with('calendar')
->willReturn(2);
$importSource->method('pathExists')
->willReturnCallback(function (string $path) {
if ($path === 'dav/calendars/subscriptions.json') {
return true;
}
if ($path === 'dav/calendars/calendars.json') {
return false;
}
return false;
});
$importSource->method('getFileContents')
->willReturnCallback(function (string $path) use ($subscriptionsJson) {
if ($path === 'dav/calendars/subscriptions.json') {
return $subscriptionsJson;
}
if ($path === 'dav/calendars/calendars.json') {
// Return empty calendars array
return json_encode([]);
}
throw new \Exception("Unexpected path: $path");
});
// Import
$this->migrator->import($user, $importSource, $this->output);
// Verify subscription was created
$principalUri = self::USERS_URI_ROOT . $user->getUID();
$subscriptions = $this->calDavBackend->getSubscriptionsForUser($principalUri);
$this->assertCount(1, $subscriptions);
$subscription = $subscriptions[0];
$this->assertEquals('migrated-imported-subscription', $subscription['uri']);
$this->assertEquals('Imported Subscription', $subscription['{DAV:}displayname']);
$this->assertEquals('#00ff00', $subscription['{http://apple.com/ns/ical/}calendar-color']);
$this->assertEquals('1', $subscription['{http://calendarserver.org/ns/}subscribed-strip-alarms']);
} finally {
$this->deleteUser($user);
}
}
public function testExportImportSubscriptionsRoundTrip(): void {
$user = $this->createTestUser();
try {
// Create subscriptions to export
$principalUri = self::USERS_URI_ROOT . $user->getUID();
$this->calDavBackend->createSubscription(
$principalUri,
'roundtrip-subscription',
[
'{http://calendarserver.org/ns/}source' => new \Sabre\DAV\Xml\Property\Href('https://example.com/roundtrip.ics'),
'{DAV:}displayname' => 'Round Trip Subscription',
'{http://apple.com/ns/ical/}calendar-color' => '#0000ff',
]
);
// Capture exported data
$exportedFiles = [];
$exportDestination = $this->createMock(IExportDestination::class);
$exportDestination->method('addFileContents')
->willReturnCallback(function (string $path, string $content) use (&$exportedFiles) {
$exportedFiles[$path] = $content;
});
$exportDestination->method('addFileAsStream');
// Export
$this->migrator->export($user, $exportDestination, $this->output);
// Delete the original subscription
$subscriptions = $this->calDavBackend->getSubscriptionsForUser($principalUri);
foreach ($subscriptions as $subscription) {
$this->calDavBackend->deleteSubscription($subscription['id']);
}
// Verify subscription is gone
$subscriptions = $this->calDavBackend->getSubscriptionsForUser($principalUri);
$this->assertEmpty($subscriptions, 'Subscription should be deleted');
// Setup import source from exported data
$importSource = $this->createMock(IImportSource::class);
$importSource->method('getMigratorVersion')
->with('calendar')
->willReturn(2);
$importSource->method('pathExists')
->willReturnCallback(function (string $path) use ($exportedFiles) {
return isset($exportedFiles[$path]);
});
$importSource->method('getFileContents')
->willReturnCallback(function (string $path) use ($exportedFiles) {
if (isset($exportedFiles[$path])) {
return $exportedFiles[$path];
}
// Return empty for missing files
if ($path === 'dav/calendars/calendars.json') {
return json_encode([]);
}
throw new \Exception("File not found: $path");
});
// Import
$this->migrator->import($user, $importSource, $this->output);
// Verify subscription was recreated with migrated prefix
$subscriptions = $this->calDavBackend->getSubscriptionsForUser($principalUri);
$this->assertCount(1, $subscriptions, 'Expected one subscription after import');
$subscription = $subscriptions[0];
$this->assertEquals('migrated-roundtrip-subscription', $subscription['uri']);
$this->assertEquals('Round Trip Subscription', $subscription['{DAV:}displayname']);
$this->assertEquals('#0000ff', $subscription['{http://apple.com/ns/ical/}calendar-color']);
} finally {
$this->deleteUser($user);
}
$this->assertEqualsCanonicalizing(
// Components are expected to be sanitized on import
$this->getSanitizedComponents($importCalendar),
$this->getComponents($exportCalendar),
);
}
}
-9
View File
@@ -35,30 +35,21 @@ OC.L10N.register(
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "このファイルを読み取ることができません、共有ファイルの可能性があります。ファイルの所有者にお願いして、ファイルを共有しなおしてもらってください。",
"Default Encryption Module" : "デフォルトの暗号化モジュール",
"Default encryption module for Nextcloud Server-side Encryption (SSE)" : "Nextcloud サーバー側暗号化 (SSE) のデフォルトの暗号化モジュール",
"This app provides the (default) cryptography implementation for Nextcloud's Server-side Encryption (SSE) feature.\n\n\t\t\t**Encryption Details**\n\t\t\t* **Cipher Mode:** AES-256-CTR (default)\n\t\t\t* **Authentication:** HMAC-SHA256\n\n\t\t\t**Important Warnings**\n\t\t\t* **DANGER:** Do not disable this application until all files have been decrypted (`occ encryption:decrypt-all`).\n\t\t\t* **WARNING**: Reverting to non-encrypted file storage after activation requires command-line access. The action is permanent via the Web UI.\"\n\n\t\t\t**Notes for Existing Files**\n\t\t\t* By default, enabling SSE does not encrypt existing files; only new files will be encrypted.\n\t\t\t* To encrypt all existing files, use the command `occ encryption:encrypt-all`.\n\n\t\t\t**Before You Begin**\n\t\t\t* **Read the Documentation:** Before you enable SSE, encrypt existing files, or disable SSE, it is critical to\n\t\t\t\tread the documentation to understand implications and the appropriate procedures to avoid data loss." : "このアプリは、Nextcloudのサーバーサイド暗号化(SSE)機能向けの(デフォルトの)暗号化実装を提供します。\t\t\t**暗号化の詳細**\t\t\t* **暗号化モード:** AES-256-CTR(デフォルト)\t\t\t* **認証:** HMAC-SHA256\t\t\t**重要な警告**\t\t\t* **危険:** 全てのファイルが復号されるまで(`occ encryption:decrypt-all`)、このアプリケーションを無効化しないでください。\t\t\t* **警告**: 有効化後に非暗号化ファイルストレージに戻すにはコマンドラインアクセスが必要です。Web UI経由での操作は永続的です。\t\t\t**既存ファイルに関する注意事項**\t\t\t* デフォルトでは、SSEを有効化しても既存ファイルは暗号化されません。新規ファイルのみが暗号化対象となります。\t\t\t* 既存ファイルをすべて暗号化するには、`occ encryption:encrypt-all` コマンドを使用してください。\t\t\t**開始前に**\t\t\t* **ドキュメントの熟読:** SSEの有効化、既存ファイルの暗号化、またはSSEの無効化を行う前に、データ損失を回避するための影響と適切な手順を理解するため、必ずドキュメントをお読みください。",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "このオプションを有効にすると、外部ストレージ接続ストレージだけが暗号化されるのではなく、メインストレージのファイルすべてが暗号化されます。",
"Encrypt the home storage" : "メインストレージ暗号化",
"Disable recovery key" : "復旧キーを無効にする",
"Enable recovery key" : "復旧キーを有効にする",
"The recovery key is an additional encryption key used to encrypt files. It is used to recover files from an account if the password is forgotten." : "復旧キーは、ファイルの暗号化に使用される追加の暗号鍵です。パスワードを忘れた場合に、アカウントからファイルを復旧するために使用されます。",
"Recovery key password" : "復旧キーのパスワード",
"Passwords fields do not match" : "パスワードフィールドが一致しません",
"Repeat recovery key password" : "復旧キーのパスワードをもう一度入力",
"An error occurred while updating the recovery key settings. Please try again." : "リカバリキーの設定を更新中にエラーが発生しました。もう一度お試しください。",
"Change recovery key password" : "回復キーのパスワードを変更する",
"Old recovery key password" : "古い復旧キーのパスワード",
"New recovery key password" : "新しい復旧キーのパスワード",
"Repeat new recovery key password" : "新しい復旧キーのパスワードをもう一度入力",
"An error occurred while changing the recovery key password. Please try again." : "回復キーのパスワード変更中にエラーが発生しました。もう一度お試しください。",
"Update private key password" : "秘密鍵のパスワードを更新する",
"Your private key password no longer matches your log-in password. Set your old private key password to your current log-in password." : "秘密鍵のパスワードがログインパスワードと一致しなくなりました。古い秘密鍵パスワードを現在のログインパスワードに設定してください。",
"If you do not remember your old password you can ask your administrator to recover your files." : "古いパスワードを覚えていない場合は、管理者にファイルの復元を依頼することができます。",
"Old log-in password" : "古いログインパスワード",
"Current log-in password" : "現在のログインパスワード",
"Update" : "更新",
"Updating recovery keys. This can take some time…" : "回復キーを更新中です。しばらく時間がかかる場合があります…",
"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "このオプションを有効にすると、パスワードを紛失した場合も、暗号化されたファイルに再度アクセスすることができるようになります。",
"Enable password recovery" : "パスワードの復元を有効にする",
"Default encryption module" : "デフォルトの暗号化モジュール",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "暗号化アプリは有効ですが、あなたの暗号化キーは初期化されていません。ログアウトした後に、再度ログインしてください",
"Basic encryption module" : "基本暗号化モジュール",
-9
View File
@@ -33,30 +33,21 @@
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "このファイルを読み取ることができません、共有ファイルの可能性があります。ファイルの所有者にお願いして、ファイルを共有しなおしてもらってください。",
"Default Encryption Module" : "デフォルトの暗号化モジュール",
"Default encryption module for Nextcloud Server-side Encryption (SSE)" : "Nextcloud サーバー側暗号化 (SSE) のデフォルトの暗号化モジュール",
"This app provides the (default) cryptography implementation for Nextcloud's Server-side Encryption (SSE) feature.\n\n\t\t\t**Encryption Details**\n\t\t\t* **Cipher Mode:** AES-256-CTR (default)\n\t\t\t* **Authentication:** HMAC-SHA256\n\n\t\t\t**Important Warnings**\n\t\t\t* **DANGER:** Do not disable this application until all files have been decrypted (`occ encryption:decrypt-all`).\n\t\t\t* **WARNING**: Reverting to non-encrypted file storage after activation requires command-line access. The action is permanent via the Web UI.\"\n\n\t\t\t**Notes for Existing Files**\n\t\t\t* By default, enabling SSE does not encrypt existing files; only new files will be encrypted.\n\t\t\t* To encrypt all existing files, use the command `occ encryption:encrypt-all`.\n\n\t\t\t**Before You Begin**\n\t\t\t* **Read the Documentation:** Before you enable SSE, encrypt existing files, or disable SSE, it is critical to\n\t\t\t\tread the documentation to understand implications and the appropriate procedures to avoid data loss." : "このアプリは、Nextcloudのサーバーサイド暗号化(SSE)機能向けの(デフォルトの)暗号化実装を提供します。\t\t\t**暗号化の詳細**\t\t\t* **暗号化モード:** AES-256-CTR(デフォルト)\t\t\t* **認証:** HMAC-SHA256\t\t\t**重要な警告**\t\t\t* **危険:** 全てのファイルが復号されるまで(`occ encryption:decrypt-all`)、このアプリケーションを無効化しないでください。\t\t\t* **警告**: 有効化後に非暗号化ファイルストレージに戻すにはコマンドラインアクセスが必要です。Web UI経由での操作は永続的です。\t\t\t**既存ファイルに関する注意事項**\t\t\t* デフォルトでは、SSEを有効化しても既存ファイルは暗号化されません。新規ファイルのみが暗号化対象となります。\t\t\t* 既存ファイルをすべて暗号化するには、`occ encryption:encrypt-all` コマンドを使用してください。\t\t\t**開始前に**\t\t\t* **ドキュメントの熟読:** SSEの有効化、既存ファイルの暗号化、またはSSEの無効化を行う前に、データ損失を回避するための影響と適切な手順を理解するため、必ずドキュメントをお読みください。",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "このオプションを有効にすると、外部ストレージ接続ストレージだけが暗号化されるのではなく、メインストレージのファイルすべてが暗号化されます。",
"Encrypt the home storage" : "メインストレージ暗号化",
"Disable recovery key" : "復旧キーを無効にする",
"Enable recovery key" : "復旧キーを有効にする",
"The recovery key is an additional encryption key used to encrypt files. It is used to recover files from an account if the password is forgotten." : "復旧キーは、ファイルの暗号化に使用される追加の暗号鍵です。パスワードを忘れた場合に、アカウントからファイルを復旧するために使用されます。",
"Recovery key password" : "復旧キーのパスワード",
"Passwords fields do not match" : "パスワードフィールドが一致しません",
"Repeat recovery key password" : "復旧キーのパスワードをもう一度入力",
"An error occurred while updating the recovery key settings. Please try again." : "リカバリキーの設定を更新中にエラーが発生しました。もう一度お試しください。",
"Change recovery key password" : "回復キーのパスワードを変更する",
"Old recovery key password" : "古い復旧キーのパスワード",
"New recovery key password" : "新しい復旧キーのパスワード",
"Repeat new recovery key password" : "新しい復旧キーのパスワードをもう一度入力",
"An error occurred while changing the recovery key password. Please try again." : "回復キーのパスワード変更中にエラーが発生しました。もう一度お試しください。",
"Update private key password" : "秘密鍵のパスワードを更新する",
"Your private key password no longer matches your log-in password. Set your old private key password to your current log-in password." : "秘密鍵のパスワードがログインパスワードと一致しなくなりました。古い秘密鍵パスワードを現在のログインパスワードに設定してください。",
"If you do not remember your old password you can ask your administrator to recover your files." : "古いパスワードを覚えていない場合は、管理者にファイルの復元を依頼することができます。",
"Old log-in password" : "古いログインパスワード",
"Current log-in password" : "現在のログインパスワード",
"Update" : "更新",
"Updating recovery keys. This can take some time…" : "回復キーを更新中です。しばらく時間がかかる場合があります…",
"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "このオプションを有効にすると、パスワードを紛失した場合も、暗号化されたファイルに再度アクセスすることができるようになります。",
"Enable password recovery" : "パスワードの復元を有効にする",
"Default encryption module" : "デフォルトの暗号化モジュール",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "暗号化アプリは有効ですが、あなたの暗号化キーは初期化されていません。ログアウトした後に、再度ログインしてください",
"Basic encryption module" : "基本暗号化モジュール",

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