Compare commits
95 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 049be105f4 | |||
| 7b85dacfd5 | |||
| 8a1471d176 | |||
| d1314bf4b4 | |||
| a464c332ac | |||
| 6dede68baa | |||
| 508da59c61 | |||
| 1ecd73c0ea | |||
| ed8dfb1e2c | |||
| c44534e4f3 | |||
| 6cdf098378 | |||
| 36f7939c0b | |||
| 2ca848f017 | |||
| 1c8be525f0 | |||
| 62cbd20298 | |||
| 5003a35a37 | |||
| 3fdc7a9470 | |||
| da73cc8950 | |||
| 5de9502b55 | |||
| 35a3e0857c | |||
| 655602c9fa | |||
| 016f2ffe6c | |||
| 49a0259cce | |||
| ac2c4ecb52 | |||
| c0dc179c8e | |||
| 6848dcc2ae | |||
| b36af651fd | |||
| 8330f149b0 | |||
| bfcb2690f4 | |||
| bc5e29f9f2 | |||
| 14d6945054 | |||
| 12532bb535 | |||
| 94254db001 | |||
| 7ac0856f9f | |||
| b74c7538ac | |||
| 55ad42ad95 | |||
| 966b880986 | |||
| 855152110f | |||
| b3200be621 | |||
| 4638b51eae | |||
| cf9386a3ce | |||
| de5acb0b99 | |||
| 42a14dac4f | |||
| d32b54dc17 | |||
| 6d9828dec0 | |||
| 266a349d0c | |||
| 3844927f8f | |||
| ef9f69f308 | |||
| 2ce11fcb7c | |||
| 51b9eaae1d | |||
| 5013efd75e | |||
| 9618b402ce | |||
| 23c2df0d50 | |||
| b613bb26bd | |||
| c8eeade151 | |||
| af172b3ec3 | |||
| 05613984bb | |||
| 9b5d11845a | |||
| 491c64de57 | |||
| e0e093fcde | |||
| 6d72ca74f7 | |||
| bfb5db8f21 | |||
| f2ee9ec294 | |||
| eda72da5ae | |||
| 3a8b2b843e | |||
| e7aec5820e | |||
| 809626ec50 | |||
| a99101f1a2 | |||
| 982c4b7aec | |||
| 2d63296046 | |||
| 0c1d5e8c54 | |||
| 29cb19da80 | |||
| 7e01665f93 | |||
| ba51caf5f4 | |||
| acb26a4507 | |||
| 1d91e40fe8 | |||
| 2908f7602a | |||
| 1775c94e4a | |||
| 8c447eaba6 | |||
| 05b4403354 | |||
| 97a0dde160 | |||
| e391e50446 | |||
| 39dc1dfd41 | |||
| 6a0d4f33a8 | |||
| 3f5c2cdd88 | |||
| 9473f47c0d | |||
| b3f29e1039 | |||
| b611fd9e35 | |||
| 89896b1d89 | |||
| 10d0d0fcbc | |||
| 6d672c4cba | |||
| 41fe5d4e29 | |||
| b303185126 | |||
| 98676f3e61 | |||
| 76fddf76f3 |
@@ -14,11 +14,14 @@ $config = new Config();
|
||||
$config
|
||||
->setParallelConfig(ParallelConfigFactory::detect())
|
||||
->getFinder()
|
||||
->exclude('config')
|
||||
->exclude('3rdparty')
|
||||
->exclude('build/stubs')
|
||||
->exclude('composer')
|
||||
->in(__DIR__);
|
||||
->in(__DIR__)
|
||||
->exclude([
|
||||
'3rdparty',
|
||||
'build/stubs',
|
||||
'composer',
|
||||
])
|
||||
;
|
||||
|
||||
|
||||
$ignoredEntries = shell_exec('git status --porcelain --ignored ' . escapeshellarg(__DIR__));
|
||||
$ignoredEntries = explode("\n", $ignoredEntries);
|
||||
|
||||
+1
-1
Submodule 3rdparty updated: 7746dcffa7...18ef872c34
+1
-1
@@ -250,7 +250,7 @@ SPDX-FileCopyrightText = "2023 Nextcloud GmbH and Nextcloud contributors"
|
||||
SPDX-License-Identifier = "AGPL-3.0-or-later"
|
||||
|
||||
[[annotations]]
|
||||
path = "apps/dav/lib/ExampleContentFiles/exampleContact.vcf"
|
||||
path = ["apps/dav/lib/ExampleContentFiles/exampleContact.vcf", "tests/data/testvideo-remote-file.mp4"]
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "2025 Nextcloud GmbH and Nextcloud contributors"
|
||||
SPDX-License-Identifier = "AGPL-3.0-or-later"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
OC.L10N.register(
|
||||
"admin_audit",
|
||||
{
|
||||
"Auditing / Logging" : "حسابرسی / ورود به سیستم",
|
||||
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "قابلیتهای ثبتنام را برای نکستکلود فراهم میکند، مانند ثبت دسترسی به فایلها یا اقدامات حساس دیگر."
|
||||
"Auditing / Logging" : "حسابرسی / گزارشگیری",
|
||||
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "قابلیتهای گزارشگیری مانند ثبت گزارش دسترسی به پروندهها یا اقدامات حساس دیگر را برای نکستکلود فراهم میکند."
|
||||
},
|
||||
"nplurals=2; plural=(n > 1);");
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{ "translations": {
|
||||
"Auditing / Logging" : "حسابرسی / ورود به سیستم",
|
||||
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "قابلیتهای ثبتنام را برای نکستکلود فراهم میکند، مانند ثبت دسترسی به فایلها یا اقدامات حساس دیگر."
|
||||
"Auditing / Logging" : "حسابرسی / گزارشگیری",
|
||||
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "قابلیتهای گزارشگیری مانند ثبت گزارش دسترسی به پروندهها یا اقدامات حساس دیگر را برای نکستکلود فراهم میکند."
|
||||
},"pluralForm" :"nplurals=2; plural=(n > 1);"
|
||||
}
|
||||
@@ -13,9 +13,9 @@ OC.L10N.register(
|
||||
"You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "Du blev nævnt på \"{file}\", i en kommentar af en konto, som siden er blevet slettet",
|
||||
"{user} mentioned you in a comment on \"{file}\"" : "{user} nævnte dig i en kommentar til \"{file}\"",
|
||||
"Files app plugin to add comments to files" : "Files app plugin til at tilføje kommentarer til filer",
|
||||
"Edit comment" : "Rediger kommentar",
|
||||
"Edit comment" : "Redigér kommentar",
|
||||
"Delete comment" : "Slet kommentar",
|
||||
"Cancel edit" : "Annuller redigering",
|
||||
"Cancel edit" : "Annullér redigering",
|
||||
"New comment" : "Ny kommentar",
|
||||
"Write a comment …" : "Skriv kommentar…",
|
||||
"Post comment" : "Skriv kommentar",
|
||||
|
||||
@@ -11,9 +11,9 @@
|
||||
"You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "Du blev nævnt på \"{file}\", i en kommentar af en konto, som siden er blevet slettet",
|
||||
"{user} mentioned you in a comment on \"{file}\"" : "{user} nævnte dig i en kommentar til \"{file}\"",
|
||||
"Files app plugin to add comments to files" : "Files app plugin til at tilføje kommentarer til filer",
|
||||
"Edit comment" : "Rediger kommentar",
|
||||
"Edit comment" : "Redigér kommentar",
|
||||
"Delete comment" : "Slet kommentar",
|
||||
"Cancel edit" : "Annuller redigering",
|
||||
"Cancel edit" : "Annullér redigering",
|
||||
"New comment" : "Ny kommentar",
|
||||
"Write a comment …" : "Skriv kommentar…",
|
||||
"Post comment" : "Skriv kommentar",
|
||||
|
||||
@@ -10,7 +10,7 @@ OC.L10N.register(
|
||||
"{author} commented on {file}" : "{author} a commenté sur {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Commentaires</strong> sur les fichiers",
|
||||
"Files" : "Fichiers",
|
||||
"You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "Vous avez été mentionné dans « {file} », dans un commentaire d'un compte qui a été supprimé depuis",
|
||||
"You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "Vous avez été mentionné·e dans « {file} », dans un commentaire d'un compte qui a été supprimé depuis",
|
||||
"{user} mentioned you in a comment on \"{file}\"" : "{user} vous a mentionné dans un commentaire sur « {file} »",
|
||||
"Files app plugin to add comments to files" : "Plugin Fichiers app pour ajouter des commentaires aux fichiers",
|
||||
"Edit comment" : "Modifier le commentaire",
|
||||
@@ -28,9 +28,9 @@ OC.L10N.register(
|
||||
"Retry" : "Réessayer",
|
||||
"_1 new comment_::_{unread} new comments_" : ["1 nouveau commentaire","{unread} nouveaux commentaires","{unread} nouveaux commentaires"],
|
||||
"Comment" : "Commenter",
|
||||
"An error occurred while trying to edit the comment" : "Une erreur s'est produite lors de la tentative de modification du commentaire",
|
||||
"An error occurred while trying to edit the comment" : "Une erreur est survenue lors de la tentative de modification du commentaire",
|
||||
"Comment deleted" : "Commentaire supprimé",
|
||||
"An error occurred while trying to delete the comment" : "Une erreur s'est produite lors de la tentative de suppression du commentaire",
|
||||
"An error occurred while trying to create the comment" : "Une erreur s'est produite lors de la tentative de création du commentaire"
|
||||
"An error occurred while trying to delete the comment" : "Une erreur est survenue lors de la tentative de suppression du commentaire",
|
||||
"An error occurred while trying to create the comment" : "Une erreur est survenue lors de la tentative de création du commentaire"
|
||||
},
|
||||
"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
"{author} commented on {file}" : "{author} a commenté sur {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Commentaires</strong> sur les fichiers",
|
||||
"Files" : "Fichiers",
|
||||
"You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "Vous avez été mentionné dans « {file} », dans un commentaire d'un compte qui a été supprimé depuis",
|
||||
"You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "Vous avez été mentionné·e dans « {file} », dans un commentaire d'un compte qui a été supprimé depuis",
|
||||
"{user} mentioned you in a comment on \"{file}\"" : "{user} vous a mentionné dans un commentaire sur « {file} »",
|
||||
"Files app plugin to add comments to files" : "Plugin Fichiers app pour ajouter des commentaires aux fichiers",
|
||||
"Edit comment" : "Modifier le commentaire",
|
||||
@@ -26,9 +26,9 @@
|
||||
"Retry" : "Réessayer",
|
||||
"_1 new comment_::_{unread} new comments_" : ["1 nouveau commentaire","{unread} nouveaux commentaires","{unread} nouveaux commentaires"],
|
||||
"Comment" : "Commenter",
|
||||
"An error occurred while trying to edit the comment" : "Une erreur s'est produite lors de la tentative de modification du commentaire",
|
||||
"An error occurred while trying to edit the comment" : "Une erreur est survenue lors de la tentative de modification du commentaire",
|
||||
"Comment deleted" : "Commentaire supprimé",
|
||||
"An error occurred while trying to delete the comment" : "Une erreur s'est produite lors de la tentative de suppression du commentaire",
|
||||
"An error occurred while trying to create the comment" : "Une erreur s'est produite lors de la tentative de création du commentaire"
|
||||
"An error occurred while trying to delete the comment" : "Une erreur est survenue lors de la tentative de suppression du commentaire",
|
||||
"An error occurred while trying to create the comment" : "Une erreur est survenue lors de la tentative de création du commentaire"
|
||||
},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||
}
|
||||
@@ -4,7 +4,7 @@ OC.L10N.register(
|
||||
"Dashboard" : "Панэль кіравання",
|
||||
"Dashboard app" : "Праграма Панэль кіравання",
|
||||
"Weather" : "Надвор'е",
|
||||
"Status" : "Стан",
|
||||
"Status" : "Статус",
|
||||
"Good morning" : "Добрай раніцы",
|
||||
"Good morning, {name}" : "Добрай раніцы, {name}",
|
||||
"Good afternoon" : "Добры дзень",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"Dashboard" : "Панэль кіравання",
|
||||
"Dashboard app" : "Праграма Панэль кіравання",
|
||||
"Weather" : "Надвор'е",
|
||||
"Status" : "Стан",
|
||||
"Status" : "Статус",
|
||||
"Good morning" : "Добрай раніцы",
|
||||
"Good morning, {name}" : "Добрай раніцы, {name}",
|
||||
"Good afternoon" : "Добры дзень",
|
||||
|
||||
@@ -20,6 +20,7 @@ OC.L10N.register(
|
||||
"Edit widgets" : "Widgets bearbeiten",
|
||||
"Get more widgets from the App Store" : "Hole dir weitere Widgets aus dem App-Store",
|
||||
"Weather service" : "Wetterdienst",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Zu deinem Datenschutz werden die Wetterdaten von deinem {productName}-Server für dich angefordert, so dass der Wetterdienst keine persönlichen Informationen erhält.",
|
||||
"Weather data from Met.no" : "Wetterdaten von Met.no",
|
||||
"geocoding with Nominatim" : "Geokodierung mit Nominatim",
|
||||
"elevation data from OpenTopoData" : "Höhendaten von OpenTopoData",
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
"Edit widgets" : "Widgets bearbeiten",
|
||||
"Get more widgets from the App Store" : "Hole dir weitere Widgets aus dem App-Store",
|
||||
"Weather service" : "Wetterdienst",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Zu deinem Datenschutz werden die Wetterdaten von deinem {productName}-Server für dich angefordert, so dass der Wetterdienst keine persönlichen Informationen erhält.",
|
||||
"Weather data from Met.no" : "Wetterdaten von Met.no",
|
||||
"geocoding with Nominatim" : "Geokodierung mit Nominatim",
|
||||
"elevation data from OpenTopoData" : "Höhendaten von OpenTopoData",
|
||||
|
||||
@@ -20,6 +20,7 @@ OC.L10N.register(
|
||||
"Edit widgets" : "Widgets bearbeiten",
|
||||
"Get more widgets from the App Store" : "Holen Sie sich weitere Widgets aus dem App-Store",
|
||||
"Weather service" : "Wetterdienst",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Zu Ihrem Datenschutz werden die Wetterdaten von Ihrem {productName}-Server für Sie angefordert, so dass der Wetterdienst keine persönlichen Informationen erhält.",
|
||||
"Weather data from Met.no" : "Wetterdaten von Met.no",
|
||||
"geocoding with Nominatim" : "Geokodierung mit Nominatim",
|
||||
"elevation data from OpenTopoData" : "Höhendaten von OpenTopoData",
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
"Edit widgets" : "Widgets bearbeiten",
|
||||
"Get more widgets from the App Store" : "Holen Sie sich weitere Widgets aus dem App-Store",
|
||||
"Weather service" : "Wetterdienst",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Zu Ihrem Datenschutz werden die Wetterdaten von Ihrem {productName}-Server für Sie angefordert, so dass der Wetterdienst keine persönlichen Informationen erhält.",
|
||||
"Weather data from Met.no" : "Wetterdaten von Met.no",
|
||||
"geocoding with Nominatim" : "Geokodierung mit Nominatim",
|
||||
"elevation data from OpenTopoData" : "Höhendaten von OpenTopoData",
|
||||
|
||||
@@ -20,6 +20,7 @@ OC.L10N.register(
|
||||
"Edit widgets" : "Edit widgets",
|
||||
"Get more widgets from the App Store" : "Get more widgets from the App Store",
|
||||
"Weather service" : "Weather service",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information.",
|
||||
"Weather data from Met.no" : "Weather data from Met.no",
|
||||
"geocoding with Nominatim" : "geocoding with Nominatim",
|
||||
"elevation data from OpenTopoData" : "elevation data from OpenTopoData",
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
"Edit widgets" : "Edit widgets",
|
||||
"Get more widgets from the App Store" : "Get more widgets from the App Store",
|
||||
"Weather service" : "Weather service",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information.",
|
||||
"Weather data from Met.no" : "Weather data from Met.no",
|
||||
"geocoding with Nominatim" : "geocoding with Nominatim",
|
||||
"elevation data from OpenTopoData" : "elevation data from OpenTopoData",
|
||||
|
||||
@@ -20,6 +20,7 @@ OC.L10N.register(
|
||||
"Edit widgets" : "Editar widgets",
|
||||
"Get more widgets from the App Store" : "Conseguir más widgets desde la tienda de Apps",
|
||||
"Weather service" : "Servicio meteorológico",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Para su privacidad, los datos meteorológicos son solicitados por su servidor {productName} en su nombre, de tal forma que el servicio no reciba información personal.",
|
||||
"Weather data from Met.no" : "Datos meteorológicos de Met.no",
|
||||
"geocoding with Nominatim" : "geocoding con Nominatim",
|
||||
"elevation data from OpenTopoData" : "datos de elevación de OpenTopoData",
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
"Edit widgets" : "Editar widgets",
|
||||
"Get more widgets from the App Store" : "Conseguir más widgets desde la tienda de Apps",
|
||||
"Weather service" : "Servicio meteorológico",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Para su privacidad, los datos meteorológicos son solicitados por su servidor {productName} en su nombre, de tal forma que el servicio no reciba información personal.",
|
||||
"Weather data from Met.no" : "Datos meteorológicos de Met.no",
|
||||
"geocoding with Nominatim" : "geocoding con Nominatim",
|
||||
"elevation data from OpenTopoData" : "datos de elevación de OpenTopoData",
|
||||
|
||||
@@ -20,6 +20,7 @@ OC.L10N.register(
|
||||
"Edit widgets" : "Muuda vidinaid",
|
||||
"Get more widgets from the App Store" : "Rakenduste Poest leiad veel vidinaid",
|
||||
"Weather service" : "Ilmateenus",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Sinu privaatsuse huvides küsib su nimel ilmaandmeid {productName}i server, nii et ilmateenistus ei saa sinu kohta isiklikku teavet.",
|
||||
"Weather data from Met.no" : "Met.no ilmaennustus",
|
||||
"geocoding with Nominatim" : "geoprogrammeerimine Nominatimiga",
|
||||
"elevation data from OpenTopoData" : "kõrgusandmed OpenTopoDatast",
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
"Edit widgets" : "Muuda vidinaid",
|
||||
"Get more widgets from the App Store" : "Rakenduste Poest leiad veel vidinaid",
|
||||
"Weather service" : "Ilmateenus",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Sinu privaatsuse huvides küsib su nimel ilmaandmeid {productName}i server, nii et ilmateenistus ei saa sinu kohta isiklikku teavet.",
|
||||
"Weather data from Met.no" : "Met.no ilmaennustus",
|
||||
"geocoding with Nominatim" : "geoprogrammeerimine Nominatimiga",
|
||||
"elevation data from OpenTopoData" : "kõrgusandmed OpenTopoDatast",
|
||||
|
||||
@@ -20,6 +20,7 @@ OC.L10N.register(
|
||||
"Edit widgets" : "Editatu trepetak",
|
||||
"Get more widgets from the App Store" : "Lortu trepeta (widget) gehiago Aplikazioen Dendatik",
|
||||
"Weather service" : "Eguraldi zerbitzua",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Zure pribatutasunerako, eguraldiaren datuak zure {productName}zerbitzariak eskatzen ditu zure izenean, beraz, meteorologia zerbitzuak ez du informazio pertsonalik jasotzen.",
|
||||
"Weather data from Met.no" : "Met.no-ko eguraldiaren datuak",
|
||||
"geocoding with Nominatim" : "geokodetzea Nominatim-ekin",
|
||||
"elevation data from OpenTopoData" : "altitude datuak OpenTopoData-tik",
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
"Edit widgets" : "Editatu trepetak",
|
||||
"Get more widgets from the App Store" : "Lortu trepeta (widget) gehiago Aplikazioen Dendatik",
|
||||
"Weather service" : "Eguraldi zerbitzua",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Zure pribatutasunerako, eguraldiaren datuak zure {productName}zerbitzariak eskatzen ditu zure izenean, beraz, meteorologia zerbitzuak ez du informazio pertsonalik jasotzen.",
|
||||
"Weather data from Met.no" : "Met.no-ko eguraldiaren datuak",
|
||||
"geocoding with Nominatim" : "geokodetzea Nominatim-ekin",
|
||||
"elevation data from OpenTopoData" : "altitude datuak OpenTopoData-tik",
|
||||
|
||||
@@ -20,6 +20,7 @@ OC.L10N.register(
|
||||
"Edit widgets" : "Modifier les widgets",
|
||||
"Get more widgets from the App Store" : "Obtenez plus de widgets depuis le magasin d’applications",
|
||||
"Weather service" : "Service météo",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Afin de protéger votre vie privée, les données météorologiques sont demandées par votre serveur {productName} à votre place afin que le service météo ne reçoive aucune information personnelle.",
|
||||
"Weather data from Met.no" : "Données météo fournies par Met.no",
|
||||
"geocoding with Nominatim" : "Géocodage avec Nominatim",
|
||||
"elevation data from OpenTopoData" : "Données d’altitude provenant d’OpenTopoData",
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
"Edit widgets" : "Modifier les widgets",
|
||||
"Get more widgets from the App Store" : "Obtenez plus de widgets depuis le magasin d’applications",
|
||||
"Weather service" : "Service météo",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Afin de protéger votre vie privée, les données météorologiques sont demandées par votre serveur {productName} à votre place afin que le service météo ne reçoive aucune information personnelle.",
|
||||
"Weather data from Met.no" : "Données météo fournies par Met.no",
|
||||
"geocoding with Nominatim" : "Géocodage avec Nominatim",
|
||||
"elevation data from OpenTopoData" : "Données d’altitude provenant d’OpenTopoData",
|
||||
|
||||
@@ -20,6 +20,7 @@ OC.L10N.register(
|
||||
"Edit widgets" : "Cuir giuirléidí in eagar",
|
||||
"Get more widgets from the App Store" : "Faigh tuilleadh giuirléidí ón Siopa Aip",
|
||||
"Weather service" : "Seirbhís aimsire",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Ar mhaithe le do phríobháideacht, iarrann do fhreastalaí {productName} na sonraí aimsire ar do shon agus mar sin ní fhaigheann an tseirbhís aimsire aon fhaisnéis phearsanta.",
|
||||
"Weather data from Met.no" : "Sonraí aimsire ó Met.no",
|
||||
"geocoding with Nominatim" : "geochódú le Nominatim",
|
||||
"elevation data from OpenTopoData" : "sonraí ardaithe ó OpenTopoData",
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
"Edit widgets" : "Cuir giuirléidí in eagar",
|
||||
"Get more widgets from the App Store" : "Faigh tuilleadh giuirléidí ón Siopa Aip",
|
||||
"Weather service" : "Seirbhís aimsire",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Ar mhaithe le do phríobháideacht, iarrann do fhreastalaí {productName} na sonraí aimsire ar do shon agus mar sin ní fhaigheann an tseirbhís aimsire aon fhaisnéis phearsanta.",
|
||||
"Weather data from Met.no" : "Sonraí aimsire ó Met.no",
|
||||
"geocoding with Nominatim" : "geochódú le Nominatim",
|
||||
"elevation data from OpenTopoData" : "sonraí ardaithe ó OpenTopoData",
|
||||
|
||||
@@ -20,6 +20,7 @@ OC.L10N.register(
|
||||
"Edit widgets" : "Editar trebellos",
|
||||
"Get more widgets from the App Store" : "Obter máis trebellos na tenda de aplicacións",
|
||||
"Weather service" : "Servizo meteorolóxico",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Para a súa privacidade, o servidor de {productName} solicita os datos meteorolóxicos no seu nome para que o servizo meteorolóxico non reciba información persoal.",
|
||||
"Weather data from Met.no" : "Datos meteorolóxicos de Met.no",
|
||||
"geocoding with Nominatim" : "xeocodificación con Nominatim",
|
||||
"elevation data from OpenTopoData" : "datos de elevación de OpenTopoData",
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
"Edit widgets" : "Editar trebellos",
|
||||
"Get more widgets from the App Store" : "Obter máis trebellos na tenda de aplicacións",
|
||||
"Weather service" : "Servizo meteorolóxico",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Para a súa privacidade, o servidor de {productName} solicita os datos meteorolóxicos no seu nome para que o servizo meteorolóxico non reciba información persoal.",
|
||||
"Weather data from Met.no" : "Datos meteorolóxicos de Met.no",
|
||||
"geocoding with Nominatim" : "xeocodificación con Nominatim",
|
||||
"elevation data from OpenTopoData" : "datos de elevación de OpenTopoData",
|
||||
|
||||
@@ -20,6 +20,7 @@ OC.L10N.register(
|
||||
"Edit widgets" : "Edytuj widżety",
|
||||
"Get more widgets from the App Store" : "Pobierz więcej widżetów z Nextcloud App Store",
|
||||
"Weather service" : "Serwis pogodowy",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Dla ochrony Twojej prywatności dane pogodowe są pobierane w Twoim imieniu przez serwer {productName}, dzięki czemu usługa pogodowa nie otrzymuje żadnych danych osobowych.",
|
||||
"Weather data from Met.no" : "Dane pogodowe z Met.no",
|
||||
"geocoding with Nominatim" : "geokodowanie z Nominatim",
|
||||
"elevation data from OpenTopoData" : "dane wysokościowe z OpenTopoData",
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
"Edit widgets" : "Edytuj widżety",
|
||||
"Get more widgets from the App Store" : "Pobierz więcej widżetów z Nextcloud App Store",
|
||||
"Weather service" : "Serwis pogodowy",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Dla ochrony Twojej prywatności dane pogodowe są pobierane w Twoim imieniu przez serwer {productName}, dzięki czemu usługa pogodowa nie otrzymuje żadnych danych osobowych.",
|
||||
"Weather data from Met.no" : "Dane pogodowe z Met.no",
|
||||
"geocoding with Nominatim" : "geokodowanie z Nominatim",
|
||||
"elevation data from OpenTopoData" : "dane wysokościowe z OpenTopoData",
|
||||
|
||||
@@ -20,6 +20,7 @@ OC.L10N.register(
|
||||
"Edit widgets" : "Editar widgets",
|
||||
"Get more widgets from the App Store" : "Obtenha mais widgets na Loja de Aplicativos",
|
||||
"Weather service" : "Serviço de Clima",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Para sua privacidade, os dados meteorológicos são solicitados pelo seu servidor {productName} em seu nome, para que o serviço meteorológico não receba nenhuma informação pessoal.",
|
||||
"Weather data from Met.no" : "Dados de Tempo do Met.no",
|
||||
"geocoding with Nominatim" : "geocodificado com Nominatim",
|
||||
"elevation data from OpenTopoData" : "dados topográficos de OpenTopoData",
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
"Edit widgets" : "Editar widgets",
|
||||
"Get more widgets from the App Store" : "Obtenha mais widgets na Loja de Aplicativos",
|
||||
"Weather service" : "Serviço de Clima",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Para sua privacidade, os dados meteorológicos são solicitados pelo seu servidor {productName} em seu nome, para que o serviço meteorológico não receba nenhuma informação pessoal.",
|
||||
"Weather data from Met.no" : "Dados de Tempo do Met.no",
|
||||
"geocoding with Nominatim" : "geocodificado com Nominatim",
|
||||
"elevation data from OpenTopoData" : "dados topográficos de OpenTopoData",
|
||||
|
||||
@@ -20,6 +20,7 @@ OC.L10N.register(
|
||||
"Edit widgets" : "Уређивање виџета",
|
||||
"Get more widgets from the App Store" : "Преузмите још виџета из Продавнице апликација",
|
||||
"Weather service" : "Метео сервис",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Ради чувања ваше приватности, временске податке са метеоролошког сервиса у ваше име захтева {productName} сервер, тако да се метеоролошком сервису не шаљу лични подаци.",
|
||||
"Weather data from Met.no" : "Метеоролошки подаци са Met.no",
|
||||
"geocoding with Nominatim" : "геокодирање са Nominatim",
|
||||
"elevation data from OpenTopoData" : "висински подаци са OpenTopoData",
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
"Edit widgets" : "Уређивање виџета",
|
||||
"Get more widgets from the App Store" : "Преузмите још виџета из Продавнице апликација",
|
||||
"Weather service" : "Метео сервис",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Ради чувања ваше приватности, временске податке са метеоролошког сервиса у ваше име захтева {productName} сервер, тако да се метеоролошком сервису не шаљу лични подаци.",
|
||||
"Weather data from Met.no" : "Метеоролошки подаци са Met.no",
|
||||
"geocoding with Nominatim" : "геокодирање са Nominatim",
|
||||
"elevation data from OpenTopoData" : "висински подаци са OpenTopoData",
|
||||
|
||||
@@ -20,6 +20,7 @@ OC.L10N.register(
|
||||
"Edit widgets" : "Ändra widgetar",
|
||||
"Get more widgets from the App Store" : "Hämta fler widgetar från Appstore",
|
||||
"Weather service" : "Vädertjänst",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "För din integritet begär din {productName}-server väderdata å dina vägnar, så vädertjänsten får ingen personlig information.",
|
||||
"Weather data from Met.no" : "Väderdata från Met.no",
|
||||
"geocoding with Nominatim" : "geokodning med Nominatim",
|
||||
"elevation data from OpenTopoData" : "höjddata från OpenTopoData",
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
"Edit widgets" : "Ändra widgetar",
|
||||
"Get more widgets from the App Store" : "Hämta fler widgetar från Appstore",
|
||||
"Weather service" : "Vädertjänst",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "För din integritet begär din {productName}-server väderdata å dina vägnar, så vädertjänsten får ingen personlig information.",
|
||||
"Weather data from Met.no" : "Väderdata från Met.no",
|
||||
"geocoding with Nominatim" : "geokodning med Nominatim",
|
||||
"elevation data from OpenTopoData" : "höjddata från OpenTopoData",
|
||||
|
||||
@@ -20,6 +20,7 @@ OC.L10N.register(
|
||||
"Edit widgets" : "Hariri wijeti",
|
||||
"Get more widgets from the App Store" : "Pata wijeti zaidi kutoka kwenye hifadhi ya Programu",
|
||||
"Weather service" : "Huduma ya hali ya hewa",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Kwa faragha yako, data ya hali ya hewa inaombwa na seva yako ya {productName} kwa niaba yako ili huduma ya hali ya hewa isipokee taarifa za kibinafsi.",
|
||||
"Weather data from Met.no" : "Data za hali ya hewa kutoka Met.no",
|
||||
"geocoding with Nominatim" : "geocoding na Nominatim",
|
||||
"elevation data from OpenTopoData" : "data ya mwinuko kutoka OpenTopoData",
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
"Edit widgets" : "Hariri wijeti",
|
||||
"Get more widgets from the App Store" : "Pata wijeti zaidi kutoka kwenye hifadhi ya Programu",
|
||||
"Weather service" : "Huduma ya hali ya hewa",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Kwa faragha yako, data ya hali ya hewa inaombwa na seva yako ya {productName} kwa niaba yako ili huduma ya hali ya hewa isipokee taarifa za kibinafsi.",
|
||||
"Weather data from Met.no" : "Data za hali ya hewa kutoka Met.no",
|
||||
"geocoding with Nominatim" : "geocoding na Nominatim",
|
||||
"elevation data from OpenTopoData" : "data ya mwinuko kutoka OpenTopoData",
|
||||
|
||||
@@ -20,6 +20,7 @@ OC.L10N.register(
|
||||
"Edit widgets" : "Pano bileşenlerini düzenle",
|
||||
"Get more widgets from the App Store" : "Uygulama mağazasından başka pano bileşenleri alın",
|
||||
"Weather service" : "Hava durumu",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Kişisel gizliliğinizi korumak için {productName} sunucunuz hava durumu verilerini sizin adınıza ister. Böylece hava durumu hizmetine hiçbir kişisel bilgi aktarılmaz.",
|
||||
"Weather data from Met.no" : "Hava durumu verileri Met.no tarafından sağlanıyor",
|
||||
"geocoding with Nominatim" : "Nominatim ile coğrafi kodlama",
|
||||
"elevation data from OpenTopoData" : "yükseklik verileri OpenTopoData tarafından sağlanıyor",
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
"Edit widgets" : "Pano bileşenlerini düzenle",
|
||||
"Get more widgets from the App Store" : "Uygulama mağazasından başka pano bileşenleri alın",
|
||||
"Weather service" : "Hava durumu",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Kişisel gizliliğinizi korumak için {productName} sunucunuz hava durumu verilerini sizin adınıza ister. Böylece hava durumu hizmetine hiçbir kişisel bilgi aktarılmaz.",
|
||||
"Weather data from Met.no" : "Hava durumu verileri Met.no tarafından sağlanıyor",
|
||||
"geocoding with Nominatim" : "Nominatim ile coğrafi kodlama",
|
||||
"elevation data from OpenTopoData" : "yükseklik verileri OpenTopoData tarafından sağlanıyor",
|
||||
|
||||
@@ -20,6 +20,7 @@ OC.L10N.register(
|
||||
"Edit widgets" : "编辑小部件",
|
||||
"Get more widgets from the App Store" : "从应用商店获取更多小部件",
|
||||
"Weather service" : "天气服务",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "为了保护您的隐私,您的 {productName} 服务器会代表您请求天气数据,因此天气服务不会收到任何个人信息。",
|
||||
"Weather data from Met.no" : "天气数据来自 Met.no",
|
||||
"geocoding with Nominatim" : "使用 Nominatim 地理编码",
|
||||
"elevation data from OpenTopoData" : "海拔数据来自 OpenTopoData",
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
"Edit widgets" : "编辑小部件",
|
||||
"Get more widgets from the App Store" : "从应用商店获取更多小部件",
|
||||
"Weather service" : "天气服务",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "为了保护您的隐私,您的 {productName} 服务器会代表您请求天气数据,因此天气服务不会收到任何个人信息。",
|
||||
"Weather data from Met.no" : "天气数据来自 Met.no",
|
||||
"geocoding with Nominatim" : "使用 Nominatim 地理编码",
|
||||
"elevation data from OpenTopoData" : "海拔数据来自 OpenTopoData",
|
||||
|
||||
@@ -20,6 +20,7 @@ OC.L10N.register(
|
||||
"Edit widgets" : "編輯小工具",
|
||||
"Get more widgets from the App Store" : "從 App Store 取得更多小工具",
|
||||
"Weather service" : "天氣服務",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "為了保護您的隱私,{productName} 會代您請求氣象資料,因此天氣服務不會收到您的個人資訊。",
|
||||
"Weather data from Met.no" : "氣象資訊來自 Met.no",
|
||||
"geocoding with Nominatim" : "使用 Nominatim 來進行地理編碼",
|
||||
"elevation data from OpenTopoData" : "來自 OpenTopoData 的海拔資料",
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
"Edit widgets" : "編輯小工具",
|
||||
"Get more widgets from the App Store" : "從 App Store 取得更多小工具",
|
||||
"Weather service" : "天氣服務",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "為了保護您的隱私,{productName} 會代您請求氣象資料,因此天氣服務不會收到您的個人資訊。",
|
||||
"Weather data from Met.no" : "氣象資訊來自 Met.no",
|
||||
"geocoding with Nominatim" : "使用 Nominatim 來進行地理編碼",
|
||||
"elevation data from OpenTopoData" : "來自 OpenTopoData 的海拔資料",
|
||||
|
||||
@@ -20,6 +20,7 @@ OC.L10N.register(
|
||||
"Edit widgets" : "編輯小工具",
|
||||
"Get more widgets from the App Store" : "從應用程式商店取得更多小工具",
|
||||
"Weather service" : "天氣服務",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "為了保護您的隱私,{productName} 伺服器會代您請求氣象資料,因此天氣服務不會收到您的個人資訊。",
|
||||
"Weather data from Met.no" : "氣象資訊來自 Met.no",
|
||||
"geocoding with Nominatim" : "地理編碼使用 Nominatim",
|
||||
"elevation data from OpenTopoData" : "海拔資料來自 OpenTopoData",
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
"Edit widgets" : "編輯小工具",
|
||||
"Get more widgets from the App Store" : "從應用程式商店取得更多小工具",
|
||||
"Weather service" : "天氣服務",
|
||||
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "為了保護您的隱私,{productName} 伺服器會代您請求氣象資料,因此天氣服務不會收到您的個人資訊。",
|
||||
"Weather data from Met.no" : "氣象資訊來自 Met.no",
|
||||
"geocoding with Nominatim" : "地理編碼使用 Nominatim",
|
||||
"elevation data from OpenTopoData" : "海拔資料來自 OpenTopoData",
|
||||
|
||||
+16
-16
@@ -75,17 +75,17 @@ OC.L10N.register(
|
||||
"In the past on %1$s for the entire day" : "Tidligere den %1$s for hele dagen",
|
||||
"_In a minute on %1$s for the entire day_::_In %n minutes on %1$s for the entire day_" : ["Om et minut på %1$s for hele dagen","Om %n minutter den %1$s for hele dagen"],
|
||||
"_In a hour on %1$s for the entire day_::_In %n hours on %1$s for the entire day_" : ["Om en time på %1$s for hele dagen","Om %n timer den %1$s for hele dagen"],
|
||||
"_In a day on %1$s for the entire day_::_In %n days on %1$s for the entire day_" : ["I en dag på %1$s for hele dagen","Om %n dage den %1$s for hele dagen"],
|
||||
"_In a week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["I en uge på %1$s for hele dagen","Om %n uger den %1$s for hele dagen"],
|
||||
"_In a month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["I en måned på %1$s for hele dagen","Om %n måneder den %1$s for hele dagen"],
|
||||
"_In a year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["I et år på %1$s for hele dagen","Om %n år den %1$s for hele dagen"],
|
||||
"_In a day on %1$s for the entire day_::_In %n days on %1$s for the entire day_" : ["Om en dag på %1$s for hele dagen","Om %n dage den %1$s for hele dagen"],
|
||||
"_In a week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["Om en uge på %1$s for hele dagen","Om %n uger den %1$s for hele dagen"],
|
||||
"_In a month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["Om en måned på %1$s for hele dagen","Om %n måneder den %1$s for hele dagen"],
|
||||
"_In a year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["Om et år på %1$s for hele dagen","Om %n år den %1$s for hele dagen"],
|
||||
"In the past on %1$s between %2$s - %3$s" : "Tidligere den %1$s mellem %2$s - %3$s",
|
||||
"_In a minute on %1$s between %2$s - %3$s_::_In %n minutes on %1$s between %2$s - %3$s_" : ["I et minut på %1$s mellem %2$s - %3$s","Om %n minutter den %1$s mellem %2$s - %3$s"],
|
||||
"_In a hour on %1$s between %2$s - %3$s_::_In %n hours on %1$s between %2$s - %3$s_" : ["I en time på %1$s mellem %2$s - %3$s","Om %n timer den %1$s mellem %2$s - %3$s"],
|
||||
"_In a day on %1$s between %2$s - %3$s_::_In %n days on %1$s between %2$s - %3$s_" : ["I en dag på %1$s mellem %2$s - %3$s","Om %n dage den %1$s mellem %2$s - %3$s"],
|
||||
"_In a week on %1$s between %2$s - %3$s_::_In %n weeks on %1$s between %2$s - %3$s_" : ["I en uge på %1$s mellem %2$s - %3$s","Om %n uger den %1$s mellem %2$s - %3$s"],
|
||||
"_In a month on %1$s between %2$s - %3$s_::_In %n months on %1$s between %2$s - %3$s_" : ["I en måned på %1$s mellem %2$s - %3$s","Om %n måneder den %1$s mellem %2$s - %3$s"],
|
||||
"_In a year on %1$s between %2$s - %3$s_::_In %n years on %1$s between %2$s - %3$s_" : ["I et år på %1$s mellem %2$s - %3$s","Om %n år den %1$s mellem %2$s - %3$s"],
|
||||
"_In a minute on %1$s between %2$s - %3$s_::_In %n minutes on %1$s between %2$s - %3$s_" : ["Om et minut på %1$s mellem %2$s - %3$s","Om %n minutter den %1$s mellem %2$s - %3$s"],
|
||||
"_In a hour on %1$s between %2$s - %3$s_::_In %n hours on %1$s between %2$s - %3$s_" : ["Om en time på %1$s mellem %2$s - %3$s","Om %n timer den %1$s mellem %2$s - %3$s"],
|
||||
"_In a day on %1$s between %2$s - %3$s_::_In %n days on %1$s between %2$s - %3$s_" : ["Om en dag på %1$s mellem %2$s - %3$s","Om %n dage den %1$s mellem %2$s - %3$s"],
|
||||
"_In a week on %1$s between %2$s - %3$s_::_In %n weeks on %1$s between %2$s - %3$s_" : ["Om en uge på %1$s mellem %2$s - %3$s","Om %n uger den %1$s mellem %2$s - %3$s"],
|
||||
"_In a month on %1$s between %2$s - %3$s_::_In %n months on %1$s between %2$s - %3$s_" : ["Om en måned på %1$s mellem %2$s - %3$s","Om %n måneder den %1$s mellem %2$s - %3$s"],
|
||||
"_In a year on %1$s between %2$s - %3$s_::_In %n years on %1$s between %2$s - %3$s_" : ["Om et år på %1$s mellem %2$s - %3$s","Om %n år den %1$s mellem %2$s - %3$s"],
|
||||
"Could not generate when statement" : "Kunne ikke generere when sætning",
|
||||
"Every Day for the entire day" : "Hver dag hele dagen",
|
||||
"Every Day for the entire day until %1$s" : "Hver dag hele dagen indtil %1$s",
|
||||
@@ -123,14 +123,14 @@ OC.L10N.register(
|
||||
"On specific dates for the entire day until %1$s" : "På specifikke datoer for hele dagen indtil %1$s",
|
||||
"On specific dates between %1$s - %2$s until %3$s" : "På specifikke datoer mellem %1$s - %2$s indtil %3$s",
|
||||
"In the past on %1$s" : "Tidligere den %1$s",
|
||||
"_In a minute on %1$s_::_In %n minutes on %1$s_" : ["I et minut på %1$s","Om %n minutter den %1$s"],
|
||||
"_In a hour on %1$s_::_In %n hours on %1$s_" : ["I en time på %1$s","Om %n timer den %1$s"],
|
||||
"_In a minute on %1$s_::_In %n minutes on %1$s_" : ["Om et minut på %1$s","Om %n minutter den %1$s"],
|
||||
"_In a hour on %1$s_::_In %n hours on %1$s_" : ["Om en time på %1$s","Om %n timer den %1$s"],
|
||||
"_In a day on %1$s_::_In %n days on %1$s_" : ["I en dag på %1$s","Om %n dage den %1$s"],
|
||||
"_In a week on %1$s_::_In %n weeks on %1$s_" : ["I en uge på %1$s","Om %n uger den %1$s"],
|
||||
"_In a month on %1$s_::_In %n months on %1$s_" : ["I en måned på %1$s","Om %n måneder den %1$s"],
|
||||
"_In a year on %1$s_::_In %n years on %1$s_" : ["I et år på %1$s","Om %n år den %1$s"],
|
||||
"In the past on %1$s then on %2$s" : "Tidligere på %1$s derefter den %2$s",
|
||||
"_In a minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["I et minut på %1$s så på %2$s","Om %n minutter den %1$s derefter den %2$s"],
|
||||
"_In a minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["Om et minut på %1$s så på %2$s","Om %n minutter den %1$s derefter den %2$s"],
|
||||
"_In a hour on %1$s then on %2$s_::_In %n hours on %1$s then on %2$s_" : ["I en time på %1$s så på %2$s","Om %n timer den %1$s derefter den %2$s"],
|
||||
"_In a day on %1$s then on %2$s_::_In %n days on %1$s then on %2$s_" : ["I en dag på %1$s så på %2$s","Om %n dage den %1$s derefter den %2$s"],
|
||||
"_In a week on %1$s then on %2$s_::_In %n weeks on %1$s then on %2$s_" : ["I en uge på %1$s så på %2$s","Om %n uger den %1$s derefter den %2$s"],
|
||||
@@ -251,7 +251,7 @@ OC.L10N.register(
|
||||
"Due on %s by %s" : "Forfalder på %s til %s",
|
||||
"Due on %s" : "Forfalder på %s",
|
||||
"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." : "Velkommen til Nextcloud kalendr!\n\nDette er en eksempelbegivenhed - undersøg fleksibiliteten i planlægningen med Nextcloud kalender ved at redigere i det du ønsker!\n\nMed Nextcloud kalender kan du:\n- Oprette, redigere, og styre begivenheder uden besvær.\n- Oprette multiple kalendere og dele dem med teammedlemmer, venner eller familie.\n- Kontrollere ledige tider og vise dine optagede tider til andre.\n- Uden besvær integrere med apps og apparater via CalDAV.\n- Brugerdefinere din oplevelse: planlægge gentagende begivenheder, justere notifikationer og andre indstillinger.",
|
||||
"Example event - open me!" : "Eksempel begivnhed - åben mig!",
|
||||
"Example event - open me!" : "Eksempel begivnhed - åbn mig!",
|
||||
"System Address Book" : "System adressebog",
|
||||
"The system address book contains contact information for all users in your instance." : "System adressebogen indeholder kontaktoplysninger for alle brugere i din instans.",
|
||||
"Enable System Address Book" : "Aktivér System adressebog",
|
||||
@@ -301,13 +301,13 @@ OC.L10N.register(
|
||||
"Import contact" : "Importér kontakt",
|
||||
"Reset to default" : "Nulstil",
|
||||
"Import contacts" : "Importér kontakter",
|
||||
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Import af en ny .vcf-fil vil slette den eksisterende standardkontakt og erstatte den med den nye. Vil du fortsætte?",
|
||||
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Import af en ny .vcf fil vil slette den eksisterende standardkontakt og erstatte den med den nye. Vil du fortsætte?",
|
||||
"Failed to save example event creation setting" : "Kunne ikke gemme eksempelbegivenhed oprettelsesindstilling",
|
||||
"Failed to upload the example event" : "Kunne ikke uploade eksempelbegivenheden",
|
||||
"Custom example event was saved successfully" : "Brugerdefineret eksempelbegivenhed blev gemt",
|
||||
"Failed to delete the custom example event" : "Kunne ikke slette den brugerdefinerede eksempelbegivenhed",
|
||||
"Custom example event was deleted successfully" : "Brugerdefineret eksempelbegivenhed blev slettet",
|
||||
"Import calendar event" : "Importer kalenderbegivenhed",
|
||||
"Import calendar event" : "Importér kalenderbegivenhed",
|
||||
"Uploading a new event will overwrite the existing one." : "Upload af en ny begivenhed vil overskrive den eksisterende.",
|
||||
"Upload event" : "Upload begivenhed",
|
||||
"Availability" : "tilgængelighed",
|
||||
|
||||
+16
-16
@@ -73,17 +73,17 @@
|
||||
"In the past on %1$s for the entire day" : "Tidligere den %1$s for hele dagen",
|
||||
"_In a minute on %1$s for the entire day_::_In %n minutes on %1$s for the entire day_" : ["Om et minut på %1$s for hele dagen","Om %n minutter den %1$s for hele dagen"],
|
||||
"_In a hour on %1$s for the entire day_::_In %n hours on %1$s for the entire day_" : ["Om en time på %1$s for hele dagen","Om %n timer den %1$s for hele dagen"],
|
||||
"_In a day on %1$s for the entire day_::_In %n days on %1$s for the entire day_" : ["I en dag på %1$s for hele dagen","Om %n dage den %1$s for hele dagen"],
|
||||
"_In a week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["I en uge på %1$s for hele dagen","Om %n uger den %1$s for hele dagen"],
|
||||
"_In a month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["I en måned på %1$s for hele dagen","Om %n måneder den %1$s for hele dagen"],
|
||||
"_In a year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["I et år på %1$s for hele dagen","Om %n år den %1$s for hele dagen"],
|
||||
"_In a day on %1$s for the entire day_::_In %n days on %1$s for the entire day_" : ["Om en dag på %1$s for hele dagen","Om %n dage den %1$s for hele dagen"],
|
||||
"_In a week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["Om en uge på %1$s for hele dagen","Om %n uger den %1$s for hele dagen"],
|
||||
"_In a month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["Om en måned på %1$s for hele dagen","Om %n måneder den %1$s for hele dagen"],
|
||||
"_In a year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["Om et år på %1$s for hele dagen","Om %n år den %1$s for hele dagen"],
|
||||
"In the past on %1$s between %2$s - %3$s" : "Tidligere den %1$s mellem %2$s - %3$s",
|
||||
"_In a minute on %1$s between %2$s - %3$s_::_In %n minutes on %1$s between %2$s - %3$s_" : ["I et minut på %1$s mellem %2$s - %3$s","Om %n minutter den %1$s mellem %2$s - %3$s"],
|
||||
"_In a hour on %1$s between %2$s - %3$s_::_In %n hours on %1$s between %2$s - %3$s_" : ["I en time på %1$s mellem %2$s - %3$s","Om %n timer den %1$s mellem %2$s - %3$s"],
|
||||
"_In a day on %1$s between %2$s - %3$s_::_In %n days on %1$s between %2$s - %3$s_" : ["I en dag på %1$s mellem %2$s - %3$s","Om %n dage den %1$s mellem %2$s - %3$s"],
|
||||
"_In a week on %1$s between %2$s - %3$s_::_In %n weeks on %1$s between %2$s - %3$s_" : ["I en uge på %1$s mellem %2$s - %3$s","Om %n uger den %1$s mellem %2$s - %3$s"],
|
||||
"_In a month on %1$s between %2$s - %3$s_::_In %n months on %1$s between %2$s - %3$s_" : ["I en måned på %1$s mellem %2$s - %3$s","Om %n måneder den %1$s mellem %2$s - %3$s"],
|
||||
"_In a year on %1$s between %2$s - %3$s_::_In %n years on %1$s between %2$s - %3$s_" : ["I et år på %1$s mellem %2$s - %3$s","Om %n år den %1$s mellem %2$s - %3$s"],
|
||||
"_In a minute on %1$s between %2$s - %3$s_::_In %n minutes on %1$s between %2$s - %3$s_" : ["Om et minut på %1$s mellem %2$s - %3$s","Om %n minutter den %1$s mellem %2$s - %3$s"],
|
||||
"_In a hour on %1$s between %2$s - %3$s_::_In %n hours on %1$s between %2$s - %3$s_" : ["Om en time på %1$s mellem %2$s - %3$s","Om %n timer den %1$s mellem %2$s - %3$s"],
|
||||
"_In a day on %1$s between %2$s - %3$s_::_In %n days on %1$s between %2$s - %3$s_" : ["Om en dag på %1$s mellem %2$s - %3$s","Om %n dage den %1$s mellem %2$s - %3$s"],
|
||||
"_In a week on %1$s between %2$s - %3$s_::_In %n weeks on %1$s between %2$s - %3$s_" : ["Om en uge på %1$s mellem %2$s - %3$s","Om %n uger den %1$s mellem %2$s - %3$s"],
|
||||
"_In a month on %1$s between %2$s - %3$s_::_In %n months on %1$s between %2$s - %3$s_" : ["Om en måned på %1$s mellem %2$s - %3$s","Om %n måneder den %1$s mellem %2$s - %3$s"],
|
||||
"_In a year on %1$s between %2$s - %3$s_::_In %n years on %1$s between %2$s - %3$s_" : ["Om et år på %1$s mellem %2$s - %3$s","Om %n år den %1$s mellem %2$s - %3$s"],
|
||||
"Could not generate when statement" : "Kunne ikke generere when sætning",
|
||||
"Every Day for the entire day" : "Hver dag hele dagen",
|
||||
"Every Day for the entire day until %1$s" : "Hver dag hele dagen indtil %1$s",
|
||||
@@ -121,14 +121,14 @@
|
||||
"On specific dates for the entire day until %1$s" : "På specifikke datoer for hele dagen indtil %1$s",
|
||||
"On specific dates between %1$s - %2$s until %3$s" : "På specifikke datoer mellem %1$s - %2$s indtil %3$s",
|
||||
"In the past on %1$s" : "Tidligere den %1$s",
|
||||
"_In a minute on %1$s_::_In %n minutes on %1$s_" : ["I et minut på %1$s","Om %n minutter den %1$s"],
|
||||
"_In a hour on %1$s_::_In %n hours on %1$s_" : ["I en time på %1$s","Om %n timer den %1$s"],
|
||||
"_In a minute on %1$s_::_In %n minutes on %1$s_" : ["Om et minut på %1$s","Om %n minutter den %1$s"],
|
||||
"_In a hour on %1$s_::_In %n hours on %1$s_" : ["Om en time på %1$s","Om %n timer den %1$s"],
|
||||
"_In a day on %1$s_::_In %n days on %1$s_" : ["I en dag på %1$s","Om %n dage den %1$s"],
|
||||
"_In a week on %1$s_::_In %n weeks on %1$s_" : ["I en uge på %1$s","Om %n uger den %1$s"],
|
||||
"_In a month on %1$s_::_In %n months on %1$s_" : ["I en måned på %1$s","Om %n måneder den %1$s"],
|
||||
"_In a year on %1$s_::_In %n years on %1$s_" : ["I et år på %1$s","Om %n år den %1$s"],
|
||||
"In the past on %1$s then on %2$s" : "Tidligere på %1$s derefter den %2$s",
|
||||
"_In a minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["I et minut på %1$s så på %2$s","Om %n minutter den %1$s derefter den %2$s"],
|
||||
"_In a minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["Om et minut på %1$s så på %2$s","Om %n minutter den %1$s derefter den %2$s"],
|
||||
"_In a hour on %1$s then on %2$s_::_In %n hours on %1$s then on %2$s_" : ["I en time på %1$s så på %2$s","Om %n timer den %1$s derefter den %2$s"],
|
||||
"_In a day on %1$s then on %2$s_::_In %n days on %1$s then on %2$s_" : ["I en dag på %1$s så på %2$s","Om %n dage den %1$s derefter den %2$s"],
|
||||
"_In a week on %1$s then on %2$s_::_In %n weeks on %1$s then on %2$s_" : ["I en uge på %1$s så på %2$s","Om %n uger den %1$s derefter den %2$s"],
|
||||
@@ -249,7 +249,7 @@
|
||||
"Due on %s by %s" : "Forfalder på %s til %s",
|
||||
"Due on %s" : "Forfalder på %s",
|
||||
"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." : "Velkommen til Nextcloud kalendr!\n\nDette er en eksempelbegivenhed - undersøg fleksibiliteten i planlægningen med Nextcloud kalender ved at redigere i det du ønsker!\n\nMed Nextcloud kalender kan du:\n- Oprette, redigere, og styre begivenheder uden besvær.\n- Oprette multiple kalendere og dele dem med teammedlemmer, venner eller familie.\n- Kontrollere ledige tider og vise dine optagede tider til andre.\n- Uden besvær integrere med apps og apparater via CalDAV.\n- Brugerdefinere din oplevelse: planlægge gentagende begivenheder, justere notifikationer og andre indstillinger.",
|
||||
"Example event - open me!" : "Eksempel begivnhed - åben mig!",
|
||||
"Example event - open me!" : "Eksempel begivnhed - åbn mig!",
|
||||
"System Address Book" : "System adressebog",
|
||||
"The system address book contains contact information for all users in your instance." : "System adressebogen indeholder kontaktoplysninger for alle brugere i din instans.",
|
||||
"Enable System Address Book" : "Aktivér System adressebog",
|
||||
@@ -299,13 +299,13 @@
|
||||
"Import contact" : "Importér kontakt",
|
||||
"Reset to default" : "Nulstil",
|
||||
"Import contacts" : "Importér kontakter",
|
||||
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Import af en ny .vcf-fil vil slette den eksisterende standardkontakt og erstatte den med den nye. Vil du fortsætte?",
|
||||
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Import af en ny .vcf fil vil slette den eksisterende standardkontakt og erstatte den med den nye. Vil du fortsætte?",
|
||||
"Failed to save example event creation setting" : "Kunne ikke gemme eksempelbegivenhed oprettelsesindstilling",
|
||||
"Failed to upload the example event" : "Kunne ikke uploade eksempelbegivenheden",
|
||||
"Custom example event was saved successfully" : "Brugerdefineret eksempelbegivenhed blev gemt",
|
||||
"Failed to delete the custom example event" : "Kunne ikke slette den brugerdefinerede eksempelbegivenhed",
|
||||
"Custom example event was deleted successfully" : "Brugerdefineret eksempelbegivenhed blev slettet",
|
||||
"Import calendar event" : "Importer kalenderbegivenhed",
|
||||
"Import calendar event" : "Importér kalenderbegivenhed",
|
||||
"Uploading a new event will overwrite the existing one." : "Upload af en ny begivenhed vil overskrive den eksisterende.",
|
||||
"Upload event" : "Upload begivenhed",
|
||||
"Availability" : "tilgængelighed",
|
||||
|
||||
+35
-35
@@ -38,17 +38,17 @@ OC.L10N.register(
|
||||
"You restored event {event} of calendar {calendar}" : "Vous avez restauré l’événement {event} dans l’agenda {calendar}",
|
||||
"Busy" : "Occupé",
|
||||
"{actor} created to-do {todo} in list {calendar}" : "{actor} a créé la tâche {todo} dans la liste {calendar}",
|
||||
"You created to-do {todo} in list {calendar}" : "Vous avez créé un pense-bête {todo} dans la liste {calendar}",
|
||||
"{actor} deleted to-do {todo} from list {calendar}" : "{actor} a supprimé un pense-bête {todo} de la liste {calendar}",
|
||||
"You deleted to-do {todo} from list {calendar}" : "Vous avez supprimé le pense-bête {todo} de la liste {calendar}",
|
||||
"{actor} updated to-do {todo} in list {calendar}" : "{actor} a mis à jour le pense-bête {todo} dans la liste {calendar}",
|
||||
"You updated to-do {todo} in list {calendar}" : "Vous avez mis à jour le pense-bête {todo} dans la liste {calendar}",
|
||||
"{actor} solved to-do {todo} in list {calendar}" : "{actor} a résolu le pense-bête {todo} dans la liste {calendar}",
|
||||
"You solved to-do {todo} in list {calendar}" : "Vous avez résolu le pense-bête {todo} dans la liste {calendar}",
|
||||
"{actor} reopened to-do {todo} in list {calendar}" : "{actor} a réouvert le pense-bête {todo} dans la liste {calendar}",
|
||||
"You reopened to-do {todo} in list {calendar}" : "Vous avez réouvert le pense-bête {todo} dans la liste {calendar}",
|
||||
"{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} a déplacé le pense-bête {todo} de la liste {sourceCalendar} à la liste {targetCalendar}",
|
||||
"You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "Vous avez déplacé le pense-bête {todo} de la liste {sourceCalendar} à la liste {targetCalendar}",
|
||||
"You created to-do {todo} in list {calendar}" : "Vous avez créé la tâche {todo} dans la liste {calendar}",
|
||||
"{actor} deleted to-do {todo} from list {calendar}" : "{actor} a supprimé la tâche {todo} de la liste {calendar}",
|
||||
"You deleted to-do {todo} from list {calendar}" : "Vous avez supprimé la tâche {todo} de la liste {calendar}",
|
||||
"{actor} updated to-do {todo} in list {calendar}" : "{actor} a mis à jour la tâche {todo} dans la liste {calendar}",
|
||||
"You updated to-do {todo} in list {calendar}" : "Vous avez mis à jour la tâche {todo} dans la liste {calendar}",
|
||||
"{actor} solved to-do {todo} in list {calendar}" : "{actor} a terminé la tâche {todo} dans la liste {calendar}",
|
||||
"You solved to-do {todo} in list {calendar}" : "Vous avez terminé la tâche {todo} dans la liste {calendar}",
|
||||
"{actor} reopened to-do {todo} in list {calendar}" : "{actor} a réouvert la tâche {todo} dans la liste {calendar}",
|
||||
"You reopened to-do {todo} in list {calendar}" : "Vous avez réouvert la tâche {todo} dans la liste {calendar}",
|
||||
"{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} a déplacé la tâche {todo} de la liste {sourceCalendar} à la liste {targetCalendar}",
|
||||
"You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "Vous avez déplacé la tâche {todo} de la liste {sourceCalendar} à la liste {targetCalendar}",
|
||||
"Calendar, contacts and tasks" : "Agenda, contacts et tâches",
|
||||
"A <strong>calendar</strong> was modified" : "Un <strong>agenda</strong> a été modifié",
|
||||
"A calendar <strong>event</strong> was modified" : "Un <strong>événement</strong> de l’agenda a été modifié",
|
||||
@@ -79,8 +79,8 @@ OC.L10N.register(
|
||||
"_In a week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["Dans une semaine le %1$s pour la journée entière","Dans %n semaines le %1$s pour la journée entière","Dans %n semaines le %1$s pour la journée entière"],
|
||||
"_In a month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["Dans un mois toute la journée du %1$s","Dans %n mois toute la journée du %1$s","Dans %n mois toute la journée du %1$s"],
|
||||
"_In a year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["Dans un an toute la journée du %1$s","Dans %n années toute la journée du %1$s","Dans %n années toute la journée du %1$s"],
|
||||
"In the past on %1$s between %2$s - %3$s" : "Dans le passé le %1$s entre %2$s - %3$s",
|
||||
"_In a minute on %1$s between %2$s - %3$s_::_In %n minutes on %1$s between %2$s - %3$s_" : ["Dans une minute le %1$s entre %2$s - %3$s","Dans %n minutes le %1$s entre %2$s - %3$s","Dans %n minutes le %1$s entre %2$s - %3$s"],
|
||||
"In the past on %1$s between %2$s - %3$s" : "Dans le passé le %1$s entre %2$s et %3$s",
|
||||
"_In a minute on %1$s between %2$s - %3$s_::_In %n minutes on %1$s between %2$s - %3$s_" : ["Dans une minute le %1$s entre %2$s - %3$s","Dans %n minutes le %1$s entre %2$s - %3$s","Dans %n minutes le %1$s entre %2$s et %3$s"],
|
||||
"_In a hour on %1$s between %2$s - %3$s_::_In %n hours on %1$s between %2$s - %3$s_" : ["Dans une heure le %1$s entre %2$s et %3$s","Dans %n heures le %1$s entre %2$s et %3$s","Dans %n heures le %1$s entre %2$s et %3$s"],
|
||||
"_In a day on %1$s between %2$s - %3$s_::_In %n days on %1$s between %2$s - %3$s_" : ["Demain le %1$s entre %2$s et %3$s","Dans %n jours le %1$s entre %2$s et %3$s","Dans %n jours le %1$s entre %2$s et %3$s"],
|
||||
"_In a week on %1$s between %2$s - %3$s_::_In %n weeks on %1$s between %2$s - %3$s_" : ["La semaine prochaine le %1$s entre %2$s et %3$s","Dans %n semaines le %1$s entre %2$s et %3$s","Dans %n semaines le %1$s entre %2$s et %3$s"],
|
||||
@@ -88,14 +88,14 @@ OC.L10N.register(
|
||||
"_In a year on %1$s between %2$s - %3$s_::_In %n years on %1$s between %2$s - %3$s_" : ["L'an prochain le %1$s entre %2$s et %3$s","Dans %n ans le %1$s entre %2$s et %3$s","Dans %n ans le %1$s entre %2$s et %3$s"],
|
||||
"Could not generate when statement" : "Impossible de déterminer quand",
|
||||
"Every Day for the entire day" : "Chaque jour pour toute la journée",
|
||||
"Every Day for the entire day until %1$s" : "Chaque jour pour toute la journée jusqu'au %1$s",
|
||||
"Every Day for the entire day until %1$s" : "Chaque jour pour la journée entière jusqu'au %1$s",
|
||||
"Every Day between %1$s - %2$s" : "Chaque jour entre %1$s et %2$s",
|
||||
"Every Day between %1$s - %2$s until %3$s" : "Chaque jour entre %1$s et %2$s jusqu'au %3$s",
|
||||
"Every %1$d Days for the entire day" : "Tous les %1$d jours pour la journée entière",
|
||||
"Every %1$d Days for the entire day until %2$s" : "Tous les %1$d jours pour la journée entière jusqu'au %2$s",
|
||||
"Every %1$d Days between %2$s - %3$s" : "Tous les %1$d jours entre %2$s et %3$s",
|
||||
"Every %1$d Days between %2$s - %3$s until %4$s" : "Tous les %1$d jours entre %2$s et %3$s jusqu'au %4$s",
|
||||
"Could not generate event recurrence statement" : "Impossible de générer la phrase de récurrence de l'événement",
|
||||
"Could not generate event recurrence statement" : "Impossible de générer la récurrence de l'événement",
|
||||
"Every Week on %1$s for the entire day" : "Chaque semaine le %1$s pour la journée entière",
|
||||
"Every Week on %1$s for the entire day until %2$s" : "Chaque semaine le %1$s pour la journée entière jusqu'au%2$s",
|
||||
"Every Week on %1$s between %2$s - %3$s" : "Chaque semaine le %1$s entre %2$s et %3$s",
|
||||
@@ -122,9 +122,9 @@ OC.L10N.register(
|
||||
"Every %1$d Years in %2$s on the %3$s between %4$s - %5$s until %6$s" : "Tous les %1$d ans en %2$s le %3$s entre %4$s - %5$s jusqu'au %6$s",
|
||||
"On specific dates for the entire day until %1$s" : "À une date spécifique pour la journée entière jusqu'au %1$s",
|
||||
"On specific dates between %1$s - %2$s until %3$s" : "À des dates spécifiques entre %1$s et %2$s jusqu'au %3$s",
|
||||
"In the past on %1$s" : "Dans le passé sur %1$s",
|
||||
"_In a minute on %1$s_::_In %n minutes on %1$s_" : ["Dans une minute sur %1$s","Dans %n minutes sur %1$s","Dans %n minutes sur %1$s"],
|
||||
"_In a hour on %1$s_::_In %n hours on %1$s_" : ["Dans une heure sur %1$s","Dans %n heures sur %1$s","Dans %n sur %1$s"],
|
||||
"In the past on %1$s" : "Dans le passé en %1$s",
|
||||
"_In a minute on %1$s_::_In %n minutes on %1$s_" : ["Dans une minute en %1$s","Dans %n minutes en %1$s","Dans %n minutes en %1$s"],
|
||||
"_In a hour on %1$s_::_In %n hours on %1$s_" : ["Dans une heure en %1$s","Dans %n heures en %1$s","Dans %n en %1$s"],
|
||||
"_In a day on %1$s_::_In %n days on %1$s_" : ["Demain le %1$s","Dans %n jours le %1$s","Dans %n jours le %1$s"],
|
||||
"_In a week on %1$s_::_In %n weeks on %1$s_" : ["La semaine prochaine le %1$s","Dans %n semaines le %1$s","Dans %n semaines le %1$s"],
|
||||
"_In a month on %1$s_::_In %n months on %1$s_" : ["Le mois prochain le %1$s","Dans %n mois le %1$s","Dans %n mois le %1$s"],
|
||||
@@ -230,16 +230,16 @@ OC.L10N.register(
|
||||
"Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Erreur en copiant le fichier à destination (copié : %1$s, taille du fichier attendue : %2$s)",
|
||||
"Expected filesize of %1$s but read (from Nextcloud client) and wrote (to Nextcloud storage) %2$s. Could either be a network problem on the sending side or a problem writing to the storage on the server side." : "Taille du fichier attendue : %1$s mais taille du fichier lue (depuis le client Nextcloud) et écrit (dans le stockage Nextcloud) : %2$s. Cela peut être un problème de réseau au niveau du client ou un problème de stockage au niveau du serveur.",
|
||||
"Could not rename part file to final file, canceled by hook" : "Impossible de renommer le fichier partiel en fichier final, annulé par le hook",
|
||||
"Could not rename part file to final file" : "Impossible de renommer le fichier partiel en fichier définitif.",
|
||||
"Failed to check file size: %1$s" : "Échec à la vérification de la taille du fichier : %1$s",
|
||||
"Could not rename part file to final file" : "Impossible de renommer le fichier partiel en fichier définitif",
|
||||
"Failed to check file size: %1$s" : "Impossible de vérifier la taille du fichier : %1$s",
|
||||
"Could not open file: %1$s, file does seem to exist" : "Impossible d'ouvrir le fichier %1$s, le fichier semble présent.",
|
||||
"Could not open file: %1$s, file doesn't seem to exist" : "Impossible d'ouvrir le fichier %1$s, le fichier ne semble pas présent.",
|
||||
"Encryption not ready: %1$s" : "Encryption pas prête : %1$s",
|
||||
"Failed to open file: %1$s" : "Échec à l'ouverture du fichier : %1$s",
|
||||
"Failed to unlink: %1$s" : "Échec à la suppression :%1$s",
|
||||
"Failed to write file contents: %1$s" : "Échec à l'écriture du contenu du fichier : %1$s",
|
||||
"Could not open file: %1$s, file doesn't seem to exist" : "Impossible d'ouvrir le fichier %1$s, le fichier ne semble pas exister.",
|
||||
"Encryption not ready: %1$s" : "Chiffrement pas prêt : %1$s",
|
||||
"Failed to open file: %1$s" : "Impossible d'ouvrir le fichier : %1$s",
|
||||
"Failed to unlink: %1$s" : "Impossible de supprimer le lien :%1$s",
|
||||
"Failed to write file contents: %1$s" : "Impossible d'écrire le contenu du fichier : %1$s",
|
||||
"File not found: %1$s" : "Fichier non trouvé : %1$s",
|
||||
"Invalid target path" : "Chemin d’accès invalide",
|
||||
"Invalid target path" : "Chemin cible non valide",
|
||||
"System is in maintenance mode." : "Le système est en mode maintenance.",
|
||||
"Upgrade needed" : "Mise à jour requise",
|
||||
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "Votre %s a besoin d'être configuré pour utiliser le HTTPS dans le but d'utiliser CalDAV et CardDAV avec iOS/macOS.",
|
||||
@@ -275,7 +275,7 @@ OC.L10N.register(
|
||||
"Out of office replacement (optional)" : "Remplaçant pendant l'absence (optionnel)",
|
||||
"Name of the replacement" : "Nom du remplaçant",
|
||||
"No results." : "Pas de résultat.",
|
||||
"Start typing." : "Commencez à taper.",
|
||||
"Start typing." : "Commencez à écrire.",
|
||||
"Short absence status" : "Résumé du message d’absence",
|
||||
"Long absence Message" : "Message d’absence complet",
|
||||
"Save" : "Enregistrer",
|
||||
@@ -292,20 +292,20 @@ OC.L10N.register(
|
||||
"Pick a end time for {dayName}" : "Choisissez une heure de fin pour {dayName}",
|
||||
"Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "Définir automatiquement le statut « Ne pas déranger » en dehors des heures de disponibilités pour désactiver toutes les notifications.",
|
||||
"Cancel" : "Annuler",
|
||||
"Import" : "Importation",
|
||||
"Import" : "Importer",
|
||||
"Error while saving settings" : "Erreur lors de l'enregistrement des paramètres",
|
||||
"Contact reset successfully" : "Contact réinitialisé avec succès",
|
||||
"Error while resetting contact" : "Erreur lors de la remise à zéro du contact",
|
||||
"Error while resetting contact" : "Erreur lors de la réinitialisation du contact",
|
||||
"Contact imported successfully" : "Contact importé avec succès",
|
||||
"Error while importing contact" : "Erreur lors de l'importation du contact",
|
||||
"Error while importing contact" : "Erreur lors de l'import du contact",
|
||||
"Import contact" : "Importer un contact",
|
||||
"Reset to default" : "Restaurer les valeurs par défaut",
|
||||
"Import contacts" : "Importer des contacts",
|
||||
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Importer un nouveau fichier .vcf supprimera le contact par défaut existant et le remplacera. Voulez-vous continuer ?",
|
||||
"Failed to save example event creation setting" : "Échec de la sauvegarde du paramètre de l'exemple de création d'événement",
|
||||
"Failed to upload the example event" : "Échec du téléversement de l'exemple d'événement",
|
||||
"Custom example event was saved successfully" : "L'exemple d'événement personnalisé a bien été enregistré",
|
||||
"Failed to delete the custom example event" : "Échec de la suppression de l'exemple d'événement personnalisé ",
|
||||
"Failed to save example event creation setting" : "Impossible de sauvegarder le paramètre d'exemple de création d'événement",
|
||||
"Failed to upload the example event" : "Impossible de téléverser l'exemple d'événement",
|
||||
"Custom example event was saved successfully" : "L'exemple d'événement personnalisé a été enregistré avec succès",
|
||||
"Failed to delete the custom example event" : "Impossible de supprimer l'exemple d'événement personnalisé ",
|
||||
"Custom example event was deleted successfully" : "L'exemple de contenu personnalisé a bien été supprimé",
|
||||
"Import calendar event" : "Importer l'événement du calendrier",
|
||||
"Uploading a new event will overwrite the existing one." : "Charger un nouvel événement qui va remplacer l'actuel.",
|
||||
@@ -328,7 +328,7 @@ OC.L10N.register(
|
||||
"Enable notifications for events via push" : "Activer les notifications push pour les évènements",
|
||||
"Example content" : "Exemple de contenu",
|
||||
"Example content serves to showcase the features of Nextcloud. Default content is shipped with Nextcloud, and can be replaced by custom content." : "Les exemples de contenu servent à présenter les fonctionnalités de Nextcloud. Le contenu par défaut est fourni avec Nextcloud et peut être remplacé par du contenu personnalisé.",
|
||||
"There was an error updating your attendance status." : "Une erreur s'est produite lors de la mise à jour de votre statut de présence.",
|
||||
"There was an error updating your attendance status." : "Une erreur est survenue lors de la mise à jour de votre statut de présence.",
|
||||
"Please contact the organizer directly." : "Merci de contacter l'organisateur directement.",
|
||||
"Are you accepting the invitation?" : "Acceptez-vous l'invitation ?",
|
||||
"Tentative" : "Provisoire",
|
||||
|
||||
+35
-35
@@ -36,17 +36,17 @@
|
||||
"You restored event {event} of calendar {calendar}" : "Vous avez restauré l’événement {event} dans l’agenda {calendar}",
|
||||
"Busy" : "Occupé",
|
||||
"{actor} created to-do {todo} in list {calendar}" : "{actor} a créé la tâche {todo} dans la liste {calendar}",
|
||||
"You created to-do {todo} in list {calendar}" : "Vous avez créé un pense-bête {todo} dans la liste {calendar}",
|
||||
"{actor} deleted to-do {todo} from list {calendar}" : "{actor} a supprimé un pense-bête {todo} de la liste {calendar}",
|
||||
"You deleted to-do {todo} from list {calendar}" : "Vous avez supprimé le pense-bête {todo} de la liste {calendar}",
|
||||
"{actor} updated to-do {todo} in list {calendar}" : "{actor} a mis à jour le pense-bête {todo} dans la liste {calendar}",
|
||||
"You updated to-do {todo} in list {calendar}" : "Vous avez mis à jour le pense-bête {todo} dans la liste {calendar}",
|
||||
"{actor} solved to-do {todo} in list {calendar}" : "{actor} a résolu le pense-bête {todo} dans la liste {calendar}",
|
||||
"You solved to-do {todo} in list {calendar}" : "Vous avez résolu le pense-bête {todo} dans la liste {calendar}",
|
||||
"{actor} reopened to-do {todo} in list {calendar}" : "{actor} a réouvert le pense-bête {todo} dans la liste {calendar}",
|
||||
"You reopened to-do {todo} in list {calendar}" : "Vous avez réouvert le pense-bête {todo} dans la liste {calendar}",
|
||||
"{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} a déplacé le pense-bête {todo} de la liste {sourceCalendar} à la liste {targetCalendar}",
|
||||
"You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "Vous avez déplacé le pense-bête {todo} de la liste {sourceCalendar} à la liste {targetCalendar}",
|
||||
"You created to-do {todo} in list {calendar}" : "Vous avez créé la tâche {todo} dans la liste {calendar}",
|
||||
"{actor} deleted to-do {todo} from list {calendar}" : "{actor} a supprimé la tâche {todo} de la liste {calendar}",
|
||||
"You deleted to-do {todo} from list {calendar}" : "Vous avez supprimé la tâche {todo} de la liste {calendar}",
|
||||
"{actor} updated to-do {todo} in list {calendar}" : "{actor} a mis à jour la tâche {todo} dans la liste {calendar}",
|
||||
"You updated to-do {todo} in list {calendar}" : "Vous avez mis à jour la tâche {todo} dans la liste {calendar}",
|
||||
"{actor} solved to-do {todo} in list {calendar}" : "{actor} a terminé la tâche {todo} dans la liste {calendar}",
|
||||
"You solved to-do {todo} in list {calendar}" : "Vous avez terminé la tâche {todo} dans la liste {calendar}",
|
||||
"{actor} reopened to-do {todo} in list {calendar}" : "{actor} a réouvert la tâche {todo} dans la liste {calendar}",
|
||||
"You reopened to-do {todo} in list {calendar}" : "Vous avez réouvert la tâche {todo} dans la liste {calendar}",
|
||||
"{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} a déplacé la tâche {todo} de la liste {sourceCalendar} à la liste {targetCalendar}",
|
||||
"You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "Vous avez déplacé la tâche {todo} de la liste {sourceCalendar} à la liste {targetCalendar}",
|
||||
"Calendar, contacts and tasks" : "Agenda, contacts et tâches",
|
||||
"A <strong>calendar</strong> was modified" : "Un <strong>agenda</strong> a été modifié",
|
||||
"A calendar <strong>event</strong> was modified" : "Un <strong>événement</strong> de l’agenda a été modifié",
|
||||
@@ -77,8 +77,8 @@
|
||||
"_In a week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["Dans une semaine le %1$s pour la journée entière","Dans %n semaines le %1$s pour la journée entière","Dans %n semaines le %1$s pour la journée entière"],
|
||||
"_In a month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["Dans un mois toute la journée du %1$s","Dans %n mois toute la journée du %1$s","Dans %n mois toute la journée du %1$s"],
|
||||
"_In a year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["Dans un an toute la journée du %1$s","Dans %n années toute la journée du %1$s","Dans %n années toute la journée du %1$s"],
|
||||
"In the past on %1$s between %2$s - %3$s" : "Dans le passé le %1$s entre %2$s - %3$s",
|
||||
"_In a minute on %1$s between %2$s - %3$s_::_In %n minutes on %1$s between %2$s - %3$s_" : ["Dans une minute le %1$s entre %2$s - %3$s","Dans %n minutes le %1$s entre %2$s - %3$s","Dans %n minutes le %1$s entre %2$s - %3$s"],
|
||||
"In the past on %1$s between %2$s - %3$s" : "Dans le passé le %1$s entre %2$s et %3$s",
|
||||
"_In a minute on %1$s between %2$s - %3$s_::_In %n minutes on %1$s between %2$s - %3$s_" : ["Dans une minute le %1$s entre %2$s - %3$s","Dans %n minutes le %1$s entre %2$s - %3$s","Dans %n minutes le %1$s entre %2$s et %3$s"],
|
||||
"_In a hour on %1$s between %2$s - %3$s_::_In %n hours on %1$s between %2$s - %3$s_" : ["Dans une heure le %1$s entre %2$s et %3$s","Dans %n heures le %1$s entre %2$s et %3$s","Dans %n heures le %1$s entre %2$s et %3$s"],
|
||||
"_In a day on %1$s between %2$s - %3$s_::_In %n days on %1$s between %2$s - %3$s_" : ["Demain le %1$s entre %2$s et %3$s","Dans %n jours le %1$s entre %2$s et %3$s","Dans %n jours le %1$s entre %2$s et %3$s"],
|
||||
"_In a week on %1$s between %2$s - %3$s_::_In %n weeks on %1$s between %2$s - %3$s_" : ["La semaine prochaine le %1$s entre %2$s et %3$s","Dans %n semaines le %1$s entre %2$s et %3$s","Dans %n semaines le %1$s entre %2$s et %3$s"],
|
||||
@@ -86,14 +86,14 @@
|
||||
"_In a year on %1$s between %2$s - %3$s_::_In %n years on %1$s between %2$s - %3$s_" : ["L'an prochain le %1$s entre %2$s et %3$s","Dans %n ans le %1$s entre %2$s et %3$s","Dans %n ans le %1$s entre %2$s et %3$s"],
|
||||
"Could not generate when statement" : "Impossible de déterminer quand",
|
||||
"Every Day for the entire day" : "Chaque jour pour toute la journée",
|
||||
"Every Day for the entire day until %1$s" : "Chaque jour pour toute la journée jusqu'au %1$s",
|
||||
"Every Day for the entire day until %1$s" : "Chaque jour pour la journée entière jusqu'au %1$s",
|
||||
"Every Day between %1$s - %2$s" : "Chaque jour entre %1$s et %2$s",
|
||||
"Every Day between %1$s - %2$s until %3$s" : "Chaque jour entre %1$s et %2$s jusqu'au %3$s",
|
||||
"Every %1$d Days for the entire day" : "Tous les %1$d jours pour la journée entière",
|
||||
"Every %1$d Days for the entire day until %2$s" : "Tous les %1$d jours pour la journée entière jusqu'au %2$s",
|
||||
"Every %1$d Days between %2$s - %3$s" : "Tous les %1$d jours entre %2$s et %3$s",
|
||||
"Every %1$d Days between %2$s - %3$s until %4$s" : "Tous les %1$d jours entre %2$s et %3$s jusqu'au %4$s",
|
||||
"Could not generate event recurrence statement" : "Impossible de générer la phrase de récurrence de l'événement",
|
||||
"Could not generate event recurrence statement" : "Impossible de générer la récurrence de l'événement",
|
||||
"Every Week on %1$s for the entire day" : "Chaque semaine le %1$s pour la journée entière",
|
||||
"Every Week on %1$s for the entire day until %2$s" : "Chaque semaine le %1$s pour la journée entière jusqu'au%2$s",
|
||||
"Every Week on %1$s between %2$s - %3$s" : "Chaque semaine le %1$s entre %2$s et %3$s",
|
||||
@@ -120,9 +120,9 @@
|
||||
"Every %1$d Years in %2$s on the %3$s between %4$s - %5$s until %6$s" : "Tous les %1$d ans en %2$s le %3$s entre %4$s - %5$s jusqu'au %6$s",
|
||||
"On specific dates for the entire day until %1$s" : "À une date spécifique pour la journée entière jusqu'au %1$s",
|
||||
"On specific dates between %1$s - %2$s until %3$s" : "À des dates spécifiques entre %1$s et %2$s jusqu'au %3$s",
|
||||
"In the past on %1$s" : "Dans le passé sur %1$s",
|
||||
"_In a minute on %1$s_::_In %n minutes on %1$s_" : ["Dans une minute sur %1$s","Dans %n minutes sur %1$s","Dans %n minutes sur %1$s"],
|
||||
"_In a hour on %1$s_::_In %n hours on %1$s_" : ["Dans une heure sur %1$s","Dans %n heures sur %1$s","Dans %n sur %1$s"],
|
||||
"In the past on %1$s" : "Dans le passé en %1$s",
|
||||
"_In a minute on %1$s_::_In %n minutes on %1$s_" : ["Dans une minute en %1$s","Dans %n minutes en %1$s","Dans %n minutes en %1$s"],
|
||||
"_In a hour on %1$s_::_In %n hours on %1$s_" : ["Dans une heure en %1$s","Dans %n heures en %1$s","Dans %n en %1$s"],
|
||||
"_In a day on %1$s_::_In %n days on %1$s_" : ["Demain le %1$s","Dans %n jours le %1$s","Dans %n jours le %1$s"],
|
||||
"_In a week on %1$s_::_In %n weeks on %1$s_" : ["La semaine prochaine le %1$s","Dans %n semaines le %1$s","Dans %n semaines le %1$s"],
|
||||
"_In a month on %1$s_::_In %n months on %1$s_" : ["Le mois prochain le %1$s","Dans %n mois le %1$s","Dans %n mois le %1$s"],
|
||||
@@ -228,16 +228,16 @@
|
||||
"Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Erreur en copiant le fichier à destination (copié : %1$s, taille du fichier attendue : %2$s)",
|
||||
"Expected filesize of %1$s but read (from Nextcloud client) and wrote (to Nextcloud storage) %2$s. Could either be a network problem on the sending side or a problem writing to the storage on the server side." : "Taille du fichier attendue : %1$s mais taille du fichier lue (depuis le client Nextcloud) et écrit (dans le stockage Nextcloud) : %2$s. Cela peut être un problème de réseau au niveau du client ou un problème de stockage au niveau du serveur.",
|
||||
"Could not rename part file to final file, canceled by hook" : "Impossible de renommer le fichier partiel en fichier final, annulé par le hook",
|
||||
"Could not rename part file to final file" : "Impossible de renommer le fichier partiel en fichier définitif.",
|
||||
"Failed to check file size: %1$s" : "Échec à la vérification de la taille du fichier : %1$s",
|
||||
"Could not rename part file to final file" : "Impossible de renommer le fichier partiel en fichier définitif",
|
||||
"Failed to check file size: %1$s" : "Impossible de vérifier la taille du fichier : %1$s",
|
||||
"Could not open file: %1$s, file does seem to exist" : "Impossible d'ouvrir le fichier %1$s, le fichier semble présent.",
|
||||
"Could not open file: %1$s, file doesn't seem to exist" : "Impossible d'ouvrir le fichier %1$s, le fichier ne semble pas présent.",
|
||||
"Encryption not ready: %1$s" : "Encryption pas prête : %1$s",
|
||||
"Failed to open file: %1$s" : "Échec à l'ouverture du fichier : %1$s",
|
||||
"Failed to unlink: %1$s" : "Échec à la suppression :%1$s",
|
||||
"Failed to write file contents: %1$s" : "Échec à l'écriture du contenu du fichier : %1$s",
|
||||
"Could not open file: %1$s, file doesn't seem to exist" : "Impossible d'ouvrir le fichier %1$s, le fichier ne semble pas exister.",
|
||||
"Encryption not ready: %1$s" : "Chiffrement pas prêt : %1$s",
|
||||
"Failed to open file: %1$s" : "Impossible d'ouvrir le fichier : %1$s",
|
||||
"Failed to unlink: %1$s" : "Impossible de supprimer le lien :%1$s",
|
||||
"Failed to write file contents: %1$s" : "Impossible d'écrire le contenu du fichier : %1$s",
|
||||
"File not found: %1$s" : "Fichier non trouvé : %1$s",
|
||||
"Invalid target path" : "Chemin d’accès invalide",
|
||||
"Invalid target path" : "Chemin cible non valide",
|
||||
"System is in maintenance mode." : "Le système est en mode maintenance.",
|
||||
"Upgrade needed" : "Mise à jour requise",
|
||||
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "Votre %s a besoin d'être configuré pour utiliser le HTTPS dans le but d'utiliser CalDAV et CardDAV avec iOS/macOS.",
|
||||
@@ -273,7 +273,7 @@
|
||||
"Out of office replacement (optional)" : "Remplaçant pendant l'absence (optionnel)",
|
||||
"Name of the replacement" : "Nom du remplaçant",
|
||||
"No results." : "Pas de résultat.",
|
||||
"Start typing." : "Commencez à taper.",
|
||||
"Start typing." : "Commencez à écrire.",
|
||||
"Short absence status" : "Résumé du message d’absence",
|
||||
"Long absence Message" : "Message d’absence complet",
|
||||
"Save" : "Enregistrer",
|
||||
@@ -290,20 +290,20 @@
|
||||
"Pick a end time for {dayName}" : "Choisissez une heure de fin pour {dayName}",
|
||||
"Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "Définir automatiquement le statut « Ne pas déranger » en dehors des heures de disponibilités pour désactiver toutes les notifications.",
|
||||
"Cancel" : "Annuler",
|
||||
"Import" : "Importation",
|
||||
"Import" : "Importer",
|
||||
"Error while saving settings" : "Erreur lors de l'enregistrement des paramètres",
|
||||
"Contact reset successfully" : "Contact réinitialisé avec succès",
|
||||
"Error while resetting contact" : "Erreur lors de la remise à zéro du contact",
|
||||
"Error while resetting contact" : "Erreur lors de la réinitialisation du contact",
|
||||
"Contact imported successfully" : "Contact importé avec succès",
|
||||
"Error while importing contact" : "Erreur lors de l'importation du contact",
|
||||
"Error while importing contact" : "Erreur lors de l'import du contact",
|
||||
"Import contact" : "Importer un contact",
|
||||
"Reset to default" : "Restaurer les valeurs par défaut",
|
||||
"Import contacts" : "Importer des contacts",
|
||||
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Importer un nouveau fichier .vcf supprimera le contact par défaut existant et le remplacera. Voulez-vous continuer ?",
|
||||
"Failed to save example event creation setting" : "Échec de la sauvegarde du paramètre de l'exemple de création d'événement",
|
||||
"Failed to upload the example event" : "Échec du téléversement de l'exemple d'événement",
|
||||
"Custom example event was saved successfully" : "L'exemple d'événement personnalisé a bien été enregistré",
|
||||
"Failed to delete the custom example event" : "Échec de la suppression de l'exemple d'événement personnalisé ",
|
||||
"Failed to save example event creation setting" : "Impossible de sauvegarder le paramètre d'exemple de création d'événement",
|
||||
"Failed to upload the example event" : "Impossible de téléverser l'exemple d'événement",
|
||||
"Custom example event was saved successfully" : "L'exemple d'événement personnalisé a été enregistré avec succès",
|
||||
"Failed to delete the custom example event" : "Impossible de supprimer l'exemple d'événement personnalisé ",
|
||||
"Custom example event was deleted successfully" : "L'exemple de contenu personnalisé a bien été supprimé",
|
||||
"Import calendar event" : "Importer l'événement du calendrier",
|
||||
"Uploading a new event will overwrite the existing one." : "Charger un nouvel événement qui va remplacer l'actuel.",
|
||||
@@ -326,7 +326,7 @@
|
||||
"Enable notifications for events via push" : "Activer les notifications push pour les évènements",
|
||||
"Example content" : "Exemple de contenu",
|
||||
"Example content serves to showcase the features of Nextcloud. Default content is shipped with Nextcloud, and can be replaced by custom content." : "Les exemples de contenu servent à présenter les fonctionnalités de Nextcloud. Le contenu par défaut est fourni avec Nextcloud et peut être remplacé par du contenu personnalisé.",
|
||||
"There was an error updating your attendance status." : "Une erreur s'est produite lors de la mise à jour de votre statut de présence.",
|
||||
"There was an error updating your attendance status." : "Une erreur est survenue lors de la mise à jour de votre statut de présence.",
|
||||
"Please contact the organizer directly." : "Merci de contacter l'organisateur directement.",
|
||||
"Are you accepting the invitation?" : "Acceptez-vous l'invitation ?",
|
||||
"Tentative" : "Provisoire",
|
||||
|
||||
@@ -250,6 +250,11 @@ OC.L10N.register(
|
||||
"Completed on %s" : "Rematado o %s",
|
||||
"Due on %s by %s" : "Caduca o %s por %s",
|
||||
"Due on %s" : "Caduca o %s",
|
||||
"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." : "Dámoslle a benvida ao Calendario de Nextcloud!\n\nEste é un evento de mostra: examina a flexibilidade da planificación co calendario de Nextcloud facendo os cambios que queiras!\n\nCo calendario de Nextcloud, podes:\n– Crear, editar e xestionar eventos sen esforzo.\n– Crear varios calendarios e compartilos con compañeiros de equipo, amigos ou familiares.\n– Comprobar a dispoñibilidade e amosar a ocupación das túas horas a outras persoas.\n– Integración perfecta con aplicacións e dispositivos a través de CalDAV.\n– Personalizar a súa experiencia: planificar eventos recorrentes, axustar as notificacións e outros axustes.",
|
||||
"Example event - open me!" : "Exemplo de evento: Ábreme!",
|
||||
"System Address Book" : "Caderno de enderezos do sistema",
|
||||
"The system address book contains contact information for all users in your instance." : "O caderno de enderezos do sistema contén a información de contacto de todos os usuarios da súa instancia.",
|
||||
"Enable System Address Book" : "Activar o caderno de enderezos do sistema",
|
||||
"DAV system address book" : "Caderno de enderezos do sistema DAV",
|
||||
"No outstanding DAV system address book sync." : "Non hai sincronización pendente do caderno de enderezos do sistema DAV.",
|
||||
"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\"." : "A sincronización do caderno de enderezos do sistema DAV aínda non foi executada aínda porque a súa instancia ten máis de 1000 usuarios ou porque se produciu un erro. Execútea manualmente con occ dav:sync-system-addressbook.",
|
||||
@@ -289,7 +294,22 @@ OC.L10N.register(
|
||||
"Cancel" : "Cancelar",
|
||||
"Import" : "Importar",
|
||||
"Error while saving settings" : "Produciuse un erro ao gardar os axustes",
|
||||
"Contact reset successfully" : "Contacto restabelecido correctamente",
|
||||
"Error while resetting contact" : "Produciuse un erro ao restabelecer o contacto",
|
||||
"Contact imported successfully" : "Contacto importado correctamente",
|
||||
"Error while importing contact" : "Produciuse un erro ao importar o contacto",
|
||||
"Import contact" : "Importar o contacto",
|
||||
"Reset to default" : "Restabelecer os valores predeterminados",
|
||||
"Import contacts" : "Importar contactos",
|
||||
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Ao importar un novo ficheiro .vcf eliminarase o contacto predeterminado existente e substituirao polo novo. Quere continuar?",
|
||||
"Failed to save example event creation setting" : "Produciuse un fallo ao gardar a configuración de creación de eventos de exemplo",
|
||||
"Failed to upload the example event" : "Produciuse un fallo ao enviar o exemplo de evento",
|
||||
"Custom example event was saved successfully" : "O evento de exemplo personalizado gardouse correctamente",
|
||||
"Failed to delete the custom example event" : "Produciuse un fallo ao eliminar o evento de exemplo personalizado",
|
||||
"Custom example event was deleted successfully" : "O evento de exemplo personalizado foi eliminado correctamente",
|
||||
"Import calendar event" : "Importar un evento do calendario",
|
||||
"Uploading a new event will overwrite the existing one." : "Ao enviar un novo evento sobrescribirá o existente.",
|
||||
"Upload event" : "Enviar o evento",
|
||||
"Availability" : "Dispoñibilidade",
|
||||
"If you configure your working hours, other people will see when you are out of office when they book a meeting." : "Se configura o seu horario de traballo, outras persoas verán cando está fóra da oficina cando reserven unha xuntanza.",
|
||||
"Absence" : "Ausencia",
|
||||
@@ -306,6 +326,8 @@ OC.L10N.register(
|
||||
"Send reminder notifications to calendar sharees as well" : "Enviar notificacións de lembrete tamén aos que comparten calendario",
|
||||
"Reminders are always sent to organizers and attendees." : "Os lembretes envíanselle sempre aos organizadores e aos asistentes.",
|
||||
"Enable notifications for events via push" : "Activar o envío de notificacións emerxentes para eventos",
|
||||
"Example content" : "Contido de exemplo",
|
||||
"Example content serves to showcase the features of Nextcloud. Default content is shipped with Nextcloud, and can be replaced by custom content." : "O contido de exemplo serve para amosar as funcionalidades de Nextcloud. O contido predeterminado envíase con Nextcloud e pode ser substituído por contido personalizado.",
|
||||
"There was an error updating your attendance status." : "Produciuse un erro ao actualizar o seu estado de asistencia.",
|
||||
"Please contact the organizer directly." : "Contacte directamente co organizador.",
|
||||
"Are you accepting the invitation?" : "Acepta Vde. o convite?",
|
||||
|
||||
@@ -248,6 +248,11 @@
|
||||
"Completed on %s" : "Rematado o %s",
|
||||
"Due on %s by %s" : "Caduca o %s por %s",
|
||||
"Due on %s" : "Caduca o %s",
|
||||
"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." : "Dámoslle a benvida ao Calendario de Nextcloud!\n\nEste é un evento de mostra: examina a flexibilidade da planificación co calendario de Nextcloud facendo os cambios que queiras!\n\nCo calendario de Nextcloud, podes:\n– Crear, editar e xestionar eventos sen esforzo.\n– Crear varios calendarios e compartilos con compañeiros de equipo, amigos ou familiares.\n– Comprobar a dispoñibilidade e amosar a ocupación das túas horas a outras persoas.\n– Integración perfecta con aplicacións e dispositivos a través de CalDAV.\n– Personalizar a súa experiencia: planificar eventos recorrentes, axustar as notificacións e outros axustes.",
|
||||
"Example event - open me!" : "Exemplo de evento: Ábreme!",
|
||||
"System Address Book" : "Caderno de enderezos do sistema",
|
||||
"The system address book contains contact information for all users in your instance." : "O caderno de enderezos do sistema contén a información de contacto de todos os usuarios da súa instancia.",
|
||||
"Enable System Address Book" : "Activar o caderno de enderezos do sistema",
|
||||
"DAV system address book" : "Caderno de enderezos do sistema DAV",
|
||||
"No outstanding DAV system address book sync." : "Non hai sincronización pendente do caderno de enderezos do sistema DAV.",
|
||||
"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\"." : "A sincronización do caderno de enderezos do sistema DAV aínda non foi executada aínda porque a súa instancia ten máis de 1000 usuarios ou porque se produciu un erro. Execútea manualmente con occ dav:sync-system-addressbook.",
|
||||
@@ -287,7 +292,22 @@
|
||||
"Cancel" : "Cancelar",
|
||||
"Import" : "Importar",
|
||||
"Error while saving settings" : "Produciuse un erro ao gardar os axustes",
|
||||
"Contact reset successfully" : "Contacto restabelecido correctamente",
|
||||
"Error while resetting contact" : "Produciuse un erro ao restabelecer o contacto",
|
||||
"Contact imported successfully" : "Contacto importado correctamente",
|
||||
"Error while importing contact" : "Produciuse un erro ao importar o contacto",
|
||||
"Import contact" : "Importar o contacto",
|
||||
"Reset to default" : "Restabelecer os valores predeterminados",
|
||||
"Import contacts" : "Importar contactos",
|
||||
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Ao importar un novo ficheiro .vcf eliminarase o contacto predeterminado existente e substituirao polo novo. Quere continuar?",
|
||||
"Failed to save example event creation setting" : "Produciuse un fallo ao gardar a configuración de creación de eventos de exemplo",
|
||||
"Failed to upload the example event" : "Produciuse un fallo ao enviar o exemplo de evento",
|
||||
"Custom example event was saved successfully" : "O evento de exemplo personalizado gardouse correctamente",
|
||||
"Failed to delete the custom example event" : "Produciuse un fallo ao eliminar o evento de exemplo personalizado",
|
||||
"Custom example event was deleted successfully" : "O evento de exemplo personalizado foi eliminado correctamente",
|
||||
"Import calendar event" : "Importar un evento do calendario",
|
||||
"Uploading a new event will overwrite the existing one." : "Ao enviar un novo evento sobrescribirá o existente.",
|
||||
"Upload event" : "Enviar o evento",
|
||||
"Availability" : "Dispoñibilidade",
|
||||
"If you configure your working hours, other people will see when you are out of office when they book a meeting." : "Se configura o seu horario de traballo, outras persoas verán cando está fóra da oficina cando reserven unha xuntanza.",
|
||||
"Absence" : "Ausencia",
|
||||
@@ -304,6 +324,8 @@
|
||||
"Send reminder notifications to calendar sharees as well" : "Enviar notificacións de lembrete tamén aos que comparten calendario",
|
||||
"Reminders are always sent to organizers and attendees." : "Os lembretes envíanselle sempre aos organizadores e aos asistentes.",
|
||||
"Enable notifications for events via push" : "Activar o envío de notificacións emerxentes para eventos",
|
||||
"Example content" : "Contido de exemplo",
|
||||
"Example content serves to showcase the features of Nextcloud. Default content is shipped with Nextcloud, and can be replaced by custom content." : "O contido de exemplo serve para amosar as funcionalidades de Nextcloud. O contido predeterminado envíase con Nextcloud e pode ser substituído por contido personalizado.",
|
||||
"There was an error updating your attendance status." : "Produciuse un erro ao actualizar o seu estado de asistencia.",
|
||||
"Please contact the organizer directly." : "Contacte directamente co organizador.",
|
||||
"Are you accepting the invitation?" : "Acepta Vde. o convite?",
|
||||
|
||||
+4
-4
@@ -60,11 +60,11 @@ OC.L10N.register(
|
||||
"Date:" : "Датум:",
|
||||
"Where:" : "Каде: ",
|
||||
"Description:" : "Опис:",
|
||||
"_%n year_::_%n years_" : ["една година","%n години"],
|
||||
"_%n year_::_%n years_" : ["%n година","%n години"],
|
||||
"_%n month_::_%n months_" : ["%n месец","%n месеци"],
|
||||
"_%n day_::_%n days_" : ["еден ден","%n дена"],
|
||||
"_%n hour_::_%n hours_" : ["еден час","%n часа"],
|
||||
"_%n minute_::_%n minutes_" : ["една минута","%n минути"],
|
||||
"_%n day_::_%n days_" : ["%n ден","%n дена"],
|
||||
"_%n hour_::_%n hours_" : ["%n час","%n часа"],
|
||||
"_%n minute_::_%n minutes_" : ["%n минута","%n минути"],
|
||||
"%s (in %s)" : "%s (во %s)",
|
||||
"%s (%s ago)" : "%s (пред %s)",
|
||||
"Calendar: %s" : "Календар: %s",
|
||||
|
||||
@@ -58,11 +58,11 @@
|
||||
"Date:" : "Датум:",
|
||||
"Where:" : "Каде: ",
|
||||
"Description:" : "Опис:",
|
||||
"_%n year_::_%n years_" : ["една година","%n години"],
|
||||
"_%n year_::_%n years_" : ["%n година","%n години"],
|
||||
"_%n month_::_%n months_" : ["%n месец","%n месеци"],
|
||||
"_%n day_::_%n days_" : ["еден ден","%n дена"],
|
||||
"_%n hour_::_%n hours_" : ["еден час","%n часа"],
|
||||
"_%n minute_::_%n minutes_" : ["една минута","%n минути"],
|
||||
"_%n day_::_%n days_" : ["%n ден","%n дена"],
|
||||
"_%n hour_::_%n hours_" : ["%n час","%n часа"],
|
||||
"_%n minute_::_%n minutes_" : ["%n минута","%n минути"],
|
||||
"%s (in %s)" : "%s (во %s)",
|
||||
"%s (%s ago)" : "%s (пред %s)",
|
||||
"Calendar: %s" : "Календар: %s",
|
||||
|
||||
@@ -157,14 +157,18 @@ class ZipFolderPlugin extends ServerPlugin {
|
||||
$content[] = $child->getNode();
|
||||
}
|
||||
|
||||
$archiveName = 'download';
|
||||
$archiveName = $folder->getName();
|
||||
if (count(explode('/', trim($folder->getPath(), '/'), 3)) === 2) {
|
||||
// this is a download of the root folder
|
||||
$archiveName = 'download';
|
||||
}
|
||||
|
||||
$rootPath = $folder->getPath();
|
||||
if (empty($files)) {
|
||||
// We download the full folder so keep it in the tree
|
||||
$rootPath = dirname($folder->getPath());
|
||||
// Full folder is loaded to rename the archive to the folder name
|
||||
$archiveName = $folder->getName();
|
||||
}
|
||||
|
||||
$streamer = new Streamer($tarRequest, -1, count($content), $this->timezoneFactory);
|
||||
$streamer->sendHeaders($archiveName);
|
||||
// For full folder downloads we also add the folder itself to the archive
|
||||
|
||||
@@ -22,6 +22,7 @@ use OCA\DAV\Db\PropertyMapper;
|
||||
use OCP\DB\QueryBuilder\IQueryBuilder;
|
||||
use OCP\IDBConnection;
|
||||
use OCP\IUser;
|
||||
use Override;
|
||||
use Sabre\CalDAV\Schedule\Inbox;
|
||||
use Sabre\DAV\Exception as DavException;
|
||||
use Sabre\DAV\PropertyStorage\Backend\BackendInterface;
|
||||
@@ -98,6 +99,7 @@ class CustomPropertiesBackend implements BackendInterface {
|
||||
/**
|
||||
* Map of custom XML elements to parse when trying to deserialize an instance of
|
||||
* \Sabre\DAV\Xml\Property\Complex to find a more specialized PROPERTY_TYPE_*
|
||||
* @var array<string, class-string>
|
||||
*/
|
||||
private const COMPLEX_XML_ELEMENT_MAP = [
|
||||
'{urn:ietf:params:xml:ns:caldav}schedule-default-calendar-URL' => Href::class,
|
||||
@@ -105,6 +107,7 @@ class CustomPropertiesBackend implements BackendInterface {
|
||||
|
||||
/**
|
||||
* Map of well-known property names to default values
|
||||
* @var array<string, string>
|
||||
*/
|
||||
private const PROPERTY_DEFAULT_VALUES = [
|
||||
'{http://owncloud.org/ns}calendar-enabled' => '1',
|
||||
@@ -118,17 +121,15 @@ class CustomPropertiesBackend implements BackendInterface {
|
||||
private XmlService $xmlService;
|
||||
|
||||
/**
|
||||
* @param Tree $tree node tree
|
||||
* @param IDBConnection $connection database connection
|
||||
* @param IUser $user owner of the tree and properties
|
||||
*/
|
||||
public function __construct(
|
||||
private Server $server,
|
||||
private Tree $tree,
|
||||
private IDBConnection $connection,
|
||||
private IUser $user,
|
||||
private PropertyMapper $propertyMapper,
|
||||
private DefaultCalendarValidator $defaultCalendarValidator,
|
||||
private readonly Server $server,
|
||||
private readonly Tree $tree,
|
||||
private readonly IDBConnection $connection,
|
||||
private readonly IUser $user,
|
||||
private readonly PropertyMapper $propertyMapper,
|
||||
private readonly DefaultCalendarValidator $defaultCalendarValidator,
|
||||
) {
|
||||
$this->xmlService = new XmlService();
|
||||
$this->xmlService->elementMap = array_merge(
|
||||
@@ -142,9 +143,9 @@ class CustomPropertiesBackend implements BackendInterface {
|
||||
*
|
||||
* @param string $path
|
||||
* @param PropFind $propFind
|
||||
* @return void
|
||||
*/
|
||||
public function propFind($path, PropFind $propFind) {
|
||||
#[Override]
|
||||
public function propFind($path, PropFind $propFind): void {
|
||||
$requestedProps = $propFind->get404Properties();
|
||||
|
||||
$requestedProps = array_filter(
|
||||
@@ -257,12 +258,10 @@ class CustomPropertiesBackend implements BackendInterface {
|
||||
* Updates properties for a path
|
||||
*
|
||||
* @param string $path
|
||||
* @param PropPatch $propPatch
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function propPatch($path, PropPatch $propPatch) {
|
||||
$propPatch->handleRemaining(function ($changedProps) use ($path) {
|
||||
#[Override]
|
||||
public function propPatch($path, PropPatch $propPatch): void {
|
||||
$propPatch->handleRemaining(function (array $changedProps) use ($path) {
|
||||
return $this->updateProperties($path, $changedProps);
|
||||
});
|
||||
}
|
||||
@@ -272,13 +271,13 @@ class CustomPropertiesBackend implements BackendInterface {
|
||||
*
|
||||
* @param string $path path of node for which to delete properties
|
||||
*/
|
||||
public function delete($path) {
|
||||
$statement = $this->connection->prepare(
|
||||
'DELETE FROM `*PREFIX*properties` WHERE `userid` = ? AND `propertypath` = ?'
|
||||
);
|
||||
$statement->execute([$this->user->getUID(), $this->formatPath($path)]);
|
||||
$statement->closeCursor();
|
||||
|
||||
#[Override]
|
||||
public function delete($path): void {
|
||||
$qb = $this->connection->getQueryBuilder();
|
||||
$qb->delete('properties')
|
||||
->where($qb->expr()->eq('userid', $qb->createNamedParameter($this->user->getUID())))
|
||||
->andWhere($qb->expr()->eq('propertypath', $qb->createNamedParameter($this->formatPath($path))));
|
||||
$qb->executeStatement();
|
||||
unset($this->userCache[$path]);
|
||||
}
|
||||
|
||||
@@ -287,16 +286,15 @@ class CustomPropertiesBackend implements BackendInterface {
|
||||
*
|
||||
* @param string $source
|
||||
* @param string $destination
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function move($source, $destination) {
|
||||
$statement = $this->connection->prepare(
|
||||
'UPDATE `*PREFIX*properties` SET `propertypath` = ?'
|
||||
. ' WHERE `userid` = ? AND `propertypath` = ?'
|
||||
);
|
||||
$statement->execute([$this->formatPath($destination), $this->user->getUID(), $this->formatPath($source)]);
|
||||
$statement->closeCursor();
|
||||
#[Override]
|
||||
public function move($source, $destination): void {
|
||||
$qb = $this->connection->getQueryBuilder();
|
||||
$qb->update('properties')
|
||||
->set('propertypath', $qb->createNamedParameter($this->formatPath($destination)))
|
||||
->where($qb->expr()->eq('userid', $qb->createNamedParameter($this->user->getUID())))
|
||||
->andWhere($qb->expr()->eq('propertypath', $qb->createNamedParameter($this->formatPath($source))));
|
||||
$qb->executeStatement();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -325,10 +323,10 @@ class CustomPropertiesBackend implements BackendInterface {
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $path
|
||||
* @param string[] $requestedProperties
|
||||
*
|
||||
* @return array
|
||||
* @return array<string, mixed|Complex|Href|string>
|
||||
* @throws \OCP\DB\Exception
|
||||
*/
|
||||
private function getPublishedProperties(string $path, array $requestedProperties): array {
|
||||
$allowedProps = array_intersect(self::PUBLISHED_READ_ONLY_PROPERTIES, $requestedProperties);
|
||||
@@ -356,7 +354,7 @@ class CustomPropertiesBackend implements BackendInterface {
|
||||
}
|
||||
|
||||
/**
|
||||
* prefetch all user properties in a directory
|
||||
* Prefetch all user properties in a directory
|
||||
*/
|
||||
private function cacheDirectory(string $path, Directory $node): void {
|
||||
$prefix = ltrim($path . '/', '/');
|
||||
@@ -449,45 +447,44 @@ class CustomPropertiesBackend implements BackendInterface {
|
||||
/**
|
||||
* Returns a list of properties for the given path and current user
|
||||
*
|
||||
* @param string $path
|
||||
* @param array $requestedProperties requested properties or empty array for "all"
|
||||
* @return array
|
||||
* @return array<string, mixed>
|
||||
* @note The properties list is a list of propertynames the client
|
||||
* requested, encoded as xmlnamespace#tagName, for example:
|
||||
* http://www.example.org/namespace#author If the array is empty, all
|
||||
* properties should be returned
|
||||
*/
|
||||
private function getUserProperties(string $path, array $requestedProperties) {
|
||||
private function getUserProperties(string $path, array $requestedProperties): array {
|
||||
if (isset($this->userCache[$path])) {
|
||||
return $this->userCache[$path];
|
||||
}
|
||||
|
||||
// TODO: chunking if more than 1000 properties
|
||||
$sql = 'SELECT * FROM `*PREFIX*properties` WHERE `userid` = ? AND `propertypath` = ?';
|
||||
$props = [];
|
||||
|
||||
$whereValues = [$this->user->getUID(), $this->formatPath($path)];
|
||||
$whereTypes = [null, null];
|
||||
$qb = $this->connection->getQueryBuilder();
|
||||
$qb->select('*')
|
||||
->from('properties')
|
||||
->where($qb->expr()->eq('userid', $qb->createNamedParameter($this->user->getUID(), IQueryBuilder::PARAM_STR)))
|
||||
->andWhere($qb->expr()->eq('propertypath', $qb->createNamedParameter($this->formatPath($path), IQueryBuilder::PARAM_STR)));
|
||||
|
||||
if (!empty($requestedProperties)) {
|
||||
// request only a subset
|
||||
$sql .= ' AND `propertyname` in (?)';
|
||||
$whereValues[] = $requestedProperties;
|
||||
$whereTypes[] = IQueryBuilder::PARAM_STR_ARRAY;
|
||||
$qb->andWhere($qb->expr()->in('propertyname', $qb->createParameter('requestedProperties')));
|
||||
$chunks = array_chunk($requestedProperties, 1000);
|
||||
foreach ($chunks as $chunk) {
|
||||
$qb->setParameter('requestedProperties', $chunk, IQueryBuilder::PARAM_STR_ARRAY);
|
||||
$result = $qb->executeQuery();
|
||||
while ($row = $result->fetch()) {
|
||||
$props[$row['propertyname']] = $this->decodeValueFromDatabase($row['propertyvalue'], $row['valuetype']);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$result = $qb->executeQuery();
|
||||
while ($row = $result->fetch()) {
|
||||
$props[$row['propertyname']] = $this->decodeValueFromDatabase($row['propertyvalue'], $row['valuetype']);
|
||||
}
|
||||
}
|
||||
|
||||
$result = $this->connection->executeQuery(
|
||||
$sql,
|
||||
$whereValues,
|
||||
$whereTypes
|
||||
);
|
||||
|
||||
$props = [];
|
||||
while ($row = $result->fetch()) {
|
||||
$props[$row['propertyname']] = $this->decodeValueFromDatabase($row['propertyvalue'], $row['valuetype']);
|
||||
}
|
||||
|
||||
$result->closeCursor();
|
||||
|
||||
$this->userCache[$path] = $props;
|
||||
return $props;
|
||||
}
|
||||
@@ -501,6 +498,7 @@ class CustomPropertiesBackend implements BackendInterface {
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array<string, string> $properties
|
||||
* @throws Exception
|
||||
*/
|
||||
private function updateProperties(string $path, array $properties): bool {
|
||||
@@ -558,10 +556,7 @@ class CustomPropertiesBackend implements BackendInterface {
|
||||
}
|
||||
|
||||
/**
|
||||
* long paths are hashed to ensure they fit in the database
|
||||
*
|
||||
* @param string $path
|
||||
* @return string
|
||||
* Long paths are hashed to ensure they fit in the database
|
||||
*/
|
||||
private function formatPath(string $path): string {
|
||||
if (strlen($path) > 250) {
|
||||
@@ -616,20 +611,15 @@ class CustomPropertiesBackend implements BackendInterface {
|
||||
/**
|
||||
* @return mixed|Complex|string
|
||||
*/
|
||||
private function decodeValueFromDatabase(string $value, int $valueType) {
|
||||
switch ($valueType) {
|
||||
case self::PROPERTY_TYPE_XML:
|
||||
return new Complex($value);
|
||||
case self::PROPERTY_TYPE_HREF:
|
||||
return new Href($value);
|
||||
case self::PROPERTY_TYPE_OBJECT:
|
||||
// some databases can not handel null characters, these are custom encoded during serialization
|
||||
// this custom encoding needs to be first reversed before unserializing
|
||||
return unserialize(str_replace('\x00', chr(0), $value));
|
||||
case self::PROPERTY_TYPE_STRING:
|
||||
default:
|
||||
return $value;
|
||||
}
|
||||
private function decodeValueFromDatabase(string $value, int $valueType): mixed {
|
||||
return match ($valueType) {
|
||||
self::PROPERTY_TYPE_XML => new Complex($value),
|
||||
self::PROPERTY_TYPE_HREF => new Href($value),
|
||||
// some databases can not handel null characters, these are custom encoded during serialization
|
||||
// this custom encoding needs to be first reversed before unserializing
|
||||
self::PROPERTY_TYPE_OBJECT => unserialize(str_replace('\x00', chr(0), $value)),
|
||||
default => $value,
|
||||
};
|
||||
}
|
||||
|
||||
private function encodeDefaultCalendarUrl(Href $value): Href {
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
namespace OCA\DAV\Tests\unit\Connector\Sabre\RequestTest;
|
||||
|
||||
use OCP\AppFramework\Http;
|
||||
|
||||
@@ -67,7 +67,7 @@ class CustomPropertiesBackendTest extends TestCase {
|
||||
protected function tearDown(): void {
|
||||
$query = $this->dbConnection->getQueryBuilder();
|
||||
$query->delete('properties');
|
||||
$query->execute();
|
||||
$query->executeStatement();
|
||||
|
||||
parent::tearDown();
|
||||
}
|
||||
@@ -102,7 +102,7 @@ class CustomPropertiesBackendTest extends TestCase {
|
||||
'propertyvalue' => $query->createNamedParameter($value),
|
||||
'valuetype' => $query->createNamedParameter($type, IQueryBuilder::PARAM_INT)
|
||||
]);
|
||||
$query->execute();
|
||||
$query->executeStatement();
|
||||
}
|
||||
|
||||
protected function getProps(string $user, string $path): array {
|
||||
@@ -112,7 +112,7 @@ class CustomPropertiesBackendTest extends TestCase {
|
||||
->where($query->expr()->eq('userid', $query->createNamedParameter($user)))
|
||||
->andWhere($query->expr()->eq('propertypath', $query->createNamedParameter($this->formatPath($path))));
|
||||
|
||||
$result = $query->execute();
|
||||
$result = $query->executeQuery();
|
||||
$data = [];
|
||||
while ($row = $result->fetch()) {
|
||||
$value = $row['propertyvalue'];
|
||||
|
||||
@@ -13,7 +13,7 @@ OC.L10N.register(
|
||||
"Please provide a new recovery password" : "Veuillez entrer un nouveau mot de passe de récupération",
|
||||
"Please repeat the new recovery password" : "Veuillez répéter le nouveau mot de passe de récupération",
|
||||
"Password successfully changed." : "Mot de passe modifié avec succès.",
|
||||
"Could not change the password. Maybe the old password was not correct." : "Erreur lors du changement de mot de passe. L'ancien mot de passe est peut-être incorrect.",
|
||||
"Could not change the password. Maybe the old password was not correct." : "Impossible de changer le mot de passe. L'ancien mot de passe est peut-être incorrect.",
|
||||
"Recovery Key disabled" : "Clé de récupération désactivée",
|
||||
"Recovery Key enabled" : "Clé de récupération activée",
|
||||
"Could not enable the recovery key, please try again or contact your administrator" : "Impossible d'activer la clé de récupération. Veuillez essayer à nouveau ou contacter votre administrateur",
|
||||
@@ -21,23 +21,23 @@ OC.L10N.register(
|
||||
"The old password was not correct, please try again." : "L'ancien mot de passe est incorrect. Veuillez réessayer.",
|
||||
"The current log-in password was not correct, please try again." : "Le mot de passe de connexion actuel n'est pas correct, veuillez réessayer.",
|
||||
"Private key password successfully updated." : "Mot de passe de la clé privée mis à jour avec succès.",
|
||||
"Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "Clé privée invalide pour l'application de chiffrement. Veuillez mettre à jour le mot de passe de la clef privée dans vos paramètres personnels pour récupérer l'accès à vos fichiers chiffrés.",
|
||||
"Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "L'application de chiffrement est activée mais vos clefs ne sont pas initialisées. Veuillez vous déconnecter et ensuite vous reconnecter.",
|
||||
"Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "Clé privée invalide pour l'application de chiffrement. Veuillez mettre à jour le mot de passe de la clé privée dans vos paramètres personnels pour récupérer l'accès à vos fichiers chiffrés.",
|
||||
"Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "L'application de chiffrement est activée mais vos clés ne sont pas initialisées. Veuillez vous déconnecter puis vous reconnecter.",
|
||||
"Please enable server side encryption in the admin settings in order to use the encryption module." : "Veuillez activer le chiffrement côté serveur dans les paramètres d'administration pour utiliser le module de chiffrement.",
|
||||
"Encryption app is enabled and ready" : "L'application de chiffrement est activée et prête",
|
||||
"Bad Signature" : "Mauvaise signature",
|
||||
"Missing Signature" : "Signature manquante",
|
||||
"one-time password for server-side-encryption" : "Mot de passe à usage unique pour le chiffrement côté serveur",
|
||||
"Encryption password" : "Mot de passe de chiffrement",
|
||||
"The administration enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>." : "L'administration a activé le chiffrement côté serveur. Vos fichiers ont été chiffrés en utilisant le mot de passe <strong>%s</strong>.",
|
||||
"The administration enabled server-side-encryption. Your files were encrypted using the password \"%s\"." : "L'administration a activé le chiffrement côté serveur. Vos fichiers ont été chiffrés en utilisant le mot de passe \"%s\".",
|
||||
"The administration enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>." : "L'administrateur a activé le chiffrement côté serveur. Vos fichiers ont été chiffrés en utilisant le mot de passe <strong>%s</strong>.",
|
||||
"The administration enabled server-side-encryption. Your files were encrypted using the password \"%s\"." : "L'administrateur a activé le chiffrement côté serveur. Vos fichiers ont été chiffrés en utilisant le mot de passe \"%s\".",
|
||||
"Please login to the web interface, go to the \"Security\" section of your personal settings and update your encryption password by entering this password into the \"Old login password\" field and your current login password." : "Connectez-vous depuis l'interface web, allez dans la section « Sécurité » de vos paramètres personnels et mettez à jour votre mot de passe de chiffrement en entrant ce mot de passe dans le champ « Ancien mot de passe de connexion » et dans votre mot de passe de connexion actuel.",
|
||||
"Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de déchiffrer ce fichier, ceci est probablement un fichier partagé. Merci de demander à son propriétaire de repartager le fichier avec vous.",
|
||||
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de lire ce fichier, ceci est probablement un fichier partagé. Merci de demander à son propriétaire de repartager le fichier avec vous.",
|
||||
"Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de déchiffrer ce fichier, il s'agit probablement d'un fichier partagé. Merci de demander à son propriétaire de repartager le fichier avec vous.",
|
||||
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de lire ce fichier, il s'agit probablement d'un fichier partagé. Merci de demander à son propriétaire de repartager le fichier avec vous.",
|
||||
"Default encryption module" : "Module de chiffrement par défaut",
|
||||
"Default encryption module for server-side encryption" : "Module de chiffrement par défaut pour le chiffrement côté serveur",
|
||||
"In order to use this encryption module you need to enable server-side encryption in the admin settings. Once enabled this module will encrypt all your files transparently. The encryption is based on AES 256 keys.\nThe module will not touch existing files, only new files will be encrypted after server-side encryption was enabled. It is also not possible to disable the encryption again and switch back to an unencrypted system.\nPlease read the documentation to know all implications before you decide to enable server-side encryption." : "Pour utiliser ce module de chiffrement, vous devez activer le chiffrement côté serveur dans les paramètres d'administration. Une fois activé, ce module chiffrera tous vos fichiers de manière transparente. Le chiffrement est basé sur des clés AES 256 bits.\nLe module ne touchera pas les fichiers existants, seuls les nouveaux fichiers seront chiffrés après activation du chiffrement côté serveur. Une fois le chiffrement côté serveur activé, il est impossible de désactiver le chiffrement et de revenir à un système non chiffré.\nVeuillez lire la documentation pour connaître toutes les implications avant de décider d'activer le chiffrement côté serveur.",
|
||||
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "L'application de chiffrement est activée mais vos clefs ne sont pas initialisées. Veuillez vous déconnecter et ensuite vous reconnecter.",
|
||||
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "L'application de chiffrement est activée mais vos clés ne sont pas initialisées. Veuillez vous déconnecter puis vous reconnecter.",
|
||||
"Encrypt the home storage" : "Chiffrer l'espace de stockage principal",
|
||||
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "L'activation de cette option chiffre tous les fichiers du stockage principal, sinon seuls les espaces de stockage externes seront chiffrés",
|
||||
"Enable recovery key" : "Activer la clé de récupération",
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
"Please provide a new recovery password" : "Veuillez entrer un nouveau mot de passe de récupération",
|
||||
"Please repeat the new recovery password" : "Veuillez répéter le nouveau mot de passe de récupération",
|
||||
"Password successfully changed." : "Mot de passe modifié avec succès.",
|
||||
"Could not change the password. Maybe the old password was not correct." : "Erreur lors du changement de mot de passe. L'ancien mot de passe est peut-être incorrect.",
|
||||
"Could not change the password. Maybe the old password was not correct." : "Impossible de changer le mot de passe. L'ancien mot de passe est peut-être incorrect.",
|
||||
"Recovery Key disabled" : "Clé de récupération désactivée",
|
||||
"Recovery Key enabled" : "Clé de récupération activée",
|
||||
"Could not enable the recovery key, please try again or contact your administrator" : "Impossible d'activer la clé de récupération. Veuillez essayer à nouveau ou contacter votre administrateur",
|
||||
@@ -19,23 +19,23 @@
|
||||
"The old password was not correct, please try again." : "L'ancien mot de passe est incorrect. Veuillez réessayer.",
|
||||
"The current log-in password was not correct, please try again." : "Le mot de passe de connexion actuel n'est pas correct, veuillez réessayer.",
|
||||
"Private key password successfully updated." : "Mot de passe de la clé privée mis à jour avec succès.",
|
||||
"Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "Clé privée invalide pour l'application de chiffrement. Veuillez mettre à jour le mot de passe de la clef privée dans vos paramètres personnels pour récupérer l'accès à vos fichiers chiffrés.",
|
||||
"Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "L'application de chiffrement est activée mais vos clefs ne sont pas initialisées. Veuillez vous déconnecter et ensuite vous reconnecter.",
|
||||
"Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "Clé privée invalide pour l'application de chiffrement. Veuillez mettre à jour le mot de passe de la clé privée dans vos paramètres personnels pour récupérer l'accès à vos fichiers chiffrés.",
|
||||
"Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "L'application de chiffrement est activée mais vos clés ne sont pas initialisées. Veuillez vous déconnecter puis vous reconnecter.",
|
||||
"Please enable server side encryption in the admin settings in order to use the encryption module." : "Veuillez activer le chiffrement côté serveur dans les paramètres d'administration pour utiliser le module de chiffrement.",
|
||||
"Encryption app is enabled and ready" : "L'application de chiffrement est activée et prête",
|
||||
"Bad Signature" : "Mauvaise signature",
|
||||
"Missing Signature" : "Signature manquante",
|
||||
"one-time password for server-side-encryption" : "Mot de passe à usage unique pour le chiffrement côté serveur",
|
||||
"Encryption password" : "Mot de passe de chiffrement",
|
||||
"The administration enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>." : "L'administration a activé le chiffrement côté serveur. Vos fichiers ont été chiffrés en utilisant le mot de passe <strong>%s</strong>.",
|
||||
"The administration enabled server-side-encryption. Your files were encrypted using the password \"%s\"." : "L'administration a activé le chiffrement côté serveur. Vos fichiers ont été chiffrés en utilisant le mot de passe \"%s\".",
|
||||
"The administration enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>." : "L'administrateur a activé le chiffrement côté serveur. Vos fichiers ont été chiffrés en utilisant le mot de passe <strong>%s</strong>.",
|
||||
"The administration enabled server-side-encryption. Your files were encrypted using the password \"%s\"." : "L'administrateur a activé le chiffrement côté serveur. Vos fichiers ont été chiffrés en utilisant le mot de passe \"%s\".",
|
||||
"Please login to the web interface, go to the \"Security\" section of your personal settings and update your encryption password by entering this password into the \"Old login password\" field and your current login password." : "Connectez-vous depuis l'interface web, allez dans la section « Sécurité » de vos paramètres personnels et mettez à jour votre mot de passe de chiffrement en entrant ce mot de passe dans le champ « Ancien mot de passe de connexion » et dans votre mot de passe de connexion actuel.",
|
||||
"Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de déchiffrer ce fichier, ceci est probablement un fichier partagé. Merci de demander à son propriétaire de repartager le fichier avec vous.",
|
||||
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de lire ce fichier, ceci est probablement un fichier partagé. Merci de demander à son propriétaire de repartager le fichier avec vous.",
|
||||
"Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de déchiffrer ce fichier, il s'agit probablement d'un fichier partagé. Merci de demander à son propriétaire de repartager le fichier avec vous.",
|
||||
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de lire ce fichier, il s'agit probablement d'un fichier partagé. Merci de demander à son propriétaire de repartager le fichier avec vous.",
|
||||
"Default encryption module" : "Module de chiffrement par défaut",
|
||||
"Default encryption module for server-side encryption" : "Module de chiffrement par défaut pour le chiffrement côté serveur",
|
||||
"In order to use this encryption module you need to enable server-side encryption in the admin settings. Once enabled this module will encrypt all your files transparently. The encryption is based on AES 256 keys.\nThe module will not touch existing files, only new files will be encrypted after server-side encryption was enabled. It is also not possible to disable the encryption again and switch back to an unencrypted system.\nPlease read the documentation to know all implications before you decide to enable server-side encryption." : "Pour utiliser ce module de chiffrement, vous devez activer le chiffrement côté serveur dans les paramètres d'administration. Une fois activé, ce module chiffrera tous vos fichiers de manière transparente. Le chiffrement est basé sur des clés AES 256 bits.\nLe module ne touchera pas les fichiers existants, seuls les nouveaux fichiers seront chiffrés après activation du chiffrement côté serveur. Une fois le chiffrement côté serveur activé, il est impossible de désactiver le chiffrement et de revenir à un système non chiffré.\nVeuillez lire la documentation pour connaître toutes les implications avant de décider d'activer le chiffrement côté serveur.",
|
||||
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "L'application de chiffrement est activée mais vos clefs ne sont pas initialisées. Veuillez vous déconnecter et ensuite vous reconnecter.",
|
||||
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "L'application de chiffrement est activée mais vos clés ne sont pas initialisées. Veuillez vous déconnecter puis vous reconnecter.",
|
||||
"Encrypt the home storage" : "Chiffrer l'espace de stockage principal",
|
||||
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "L'activation de cette option chiffre tous les fichiers du stockage principal, sinon seuls les espaces de stockage externes seront chiffrés",
|
||||
"Enable recovery key" : "Activer la clé de récupération",
|
||||
|
||||
@@ -85,7 +85,7 @@ class DropLegacyFileKey extends Command {
|
||||
$output->writeln('<error>' . $path . ' does not have a proper header</error>');
|
||||
} else {
|
||||
try {
|
||||
$legacyFileKey = $this->keyManager->getFileKey($path, null, true);
|
||||
$legacyFileKey = $this->keyManager->getFileKey($path, true);
|
||||
if ($legacyFileKey === '') {
|
||||
$output->writeln('Got an empty legacy filekey for ' . $path . ', continuing', OutputInterface::VERBOSITY_VERBOSE);
|
||||
continue;
|
||||
|
||||
@@ -342,9 +342,8 @@ class Crypt {
|
||||
* @param string $privateKey
|
||||
* @param string $password
|
||||
* @param string $uid for regular users, empty for system keys
|
||||
* @return false|string
|
||||
*/
|
||||
public function decryptPrivateKey($privateKey, $password = '', $uid = '') {
|
||||
public function decryptPrivateKey($privateKey, $password = '', $uid = '') : string|false {
|
||||
$header = $this->parseHeader($privateKey);
|
||||
|
||||
if (isset($header['cipher'])) {
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
namespace OCA\Encryption\Crypto;
|
||||
|
||||
use OCA\Encryption\Exceptions\PrivateKeyMissingException;
|
||||
@@ -18,14 +21,6 @@ use Symfony\Component\Console\Question\ConfirmationQuestion;
|
||||
use Symfony\Component\Console\Question\Question;
|
||||
|
||||
class DecryptAll {
|
||||
|
||||
/**
|
||||
* @param Util $util
|
||||
* @param KeyManager $keyManager
|
||||
* @param Crypt $crypt
|
||||
* @param Session $session
|
||||
* @param QuestionHelper $questionHelper
|
||||
*/
|
||||
public function __construct(
|
||||
protected Util $util,
|
||||
protected KeyManager $keyManager,
|
||||
@@ -37,13 +32,8 @@ class DecryptAll {
|
||||
|
||||
/**
|
||||
* prepare encryption module to decrypt all files
|
||||
*
|
||||
* @param InputInterface $input
|
||||
* @param OutputInterface $output
|
||||
* @param $user
|
||||
* @return bool
|
||||
*/
|
||||
public function prepare(InputInterface $input, OutputInterface $output, $user) {
|
||||
public function prepare(InputInterface $input, OutputInterface $output, ?string $user): bool {
|
||||
$question = new Question('Please enter the recovery key password: ');
|
||||
|
||||
if ($this->util->isMasterKeyEnabled()) {
|
||||
@@ -52,7 +42,7 @@ class DecryptAll {
|
||||
$password = $this->keyManager->getMasterKeyPassword();
|
||||
} else {
|
||||
$recoveryKeyId = $this->keyManager->getRecoveryKeyId();
|
||||
if (!empty($user)) {
|
||||
if ($user !== null && $user !== '') {
|
||||
$output->writeln('You can only decrypt the users files if you know');
|
||||
$output->writeln('the users password or if they activated the recovery key.');
|
||||
$output->writeln('');
|
||||
@@ -96,12 +86,9 @@ class DecryptAll {
|
||||
/**
|
||||
* get the private key which will be used to decrypt all files
|
||||
*
|
||||
* @param string $user
|
||||
* @param string $password
|
||||
* @return bool|string
|
||||
* @throws PrivateKeyMissingException
|
||||
*/
|
||||
protected function getPrivateKey($user, $password) {
|
||||
protected function getPrivateKey(string $user, string $password): string|false {
|
||||
$recoveryKeyId = $this->keyManager->getRecoveryKeyId();
|
||||
$masterKeyId = $this->keyManager->getMasterKeyId();
|
||||
if ($user === $recoveryKeyId) {
|
||||
@@ -118,7 +105,7 @@ class DecryptAll {
|
||||
return $privateKey;
|
||||
}
|
||||
|
||||
protected function updateSession($user, $privateKey) {
|
||||
protected function updateSession(string $user, string $privateKey): void {
|
||||
$this->session->prepareDecryptAll($user, $privateKey);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
namespace OCA\Encryption\Crypto;
|
||||
|
||||
use OC\Encryption\Exceptions\DecryptionFailedException;
|
||||
@@ -60,11 +63,8 @@ class EncryptAll {
|
||||
|
||||
/**
|
||||
* start to encrypt all files
|
||||
*
|
||||
* @param InputInterface $input
|
||||
* @param OutputInterface $output
|
||||
*/
|
||||
public function encryptAll(InputInterface $input, OutputInterface $output) {
|
||||
public function encryptAll(InputInterface $input, OutputInterface $output): void {
|
||||
$this->input = $input;
|
||||
$this->output = $output;
|
||||
|
||||
@@ -111,7 +111,7 @@ class EncryptAll {
|
||||
/**
|
||||
* create key-pair for every user
|
||||
*/
|
||||
protected function createKeyPairs() {
|
||||
protected function createKeyPairs(): void {
|
||||
$this->output->writeln("\n");
|
||||
$progress = new ProgressBar($this->output);
|
||||
$progress->setFormat(" %message% \n [%bar%]");
|
||||
@@ -146,7 +146,7 @@ class EncryptAll {
|
||||
/**
|
||||
* iterate over all user and encrypt their files
|
||||
*/
|
||||
protected function encryptAllUsersFiles() {
|
||||
protected function encryptAllUsersFiles(): void {
|
||||
$this->output->writeln("\n");
|
||||
$progress = new ProgressBar($this->output);
|
||||
$progress->setFormat(" %message% \n [%bar%]");
|
||||
@@ -168,10 +168,8 @@ class EncryptAll {
|
||||
|
||||
/**
|
||||
* encrypt all user files with the master key
|
||||
*
|
||||
* @param ProgressBar $progress
|
||||
*/
|
||||
protected function encryptAllUserFilesWithMasterKey(ProgressBar $progress) {
|
||||
protected function encryptAllUserFilesWithMasterKey(ProgressBar $progress): void {
|
||||
$userNo = 1;
|
||||
foreach ($this->userManager->getBackends() as $backend) {
|
||||
$limit = 500;
|
||||
@@ -190,12 +188,8 @@ class EncryptAll {
|
||||
|
||||
/**
|
||||
* encrypt files from the given user
|
||||
*
|
||||
* @param string $uid
|
||||
* @param ProgressBar $progress
|
||||
* @param string $userCount
|
||||
*/
|
||||
protected function encryptUsersFiles($uid, ProgressBar $progress, $userCount) {
|
||||
protected function encryptUsersFiles(string $uid, ProgressBar $progress, string $userCount): void {
|
||||
$this->setupUserFS($uid);
|
||||
$directories = [];
|
||||
$directories[] = '/' . $uid . '/files';
|
||||
@@ -268,7 +262,7 @@ class EncryptAll {
|
||||
/**
|
||||
* output one-time encryption passwords
|
||||
*/
|
||||
protected function outputPasswords() {
|
||||
protected function outputPasswords(): void {
|
||||
$table = new Table($this->output);
|
||||
$table->setHeaders(['Username', 'Private key password']);
|
||||
|
||||
@@ -309,10 +303,8 @@ class EncryptAll {
|
||||
|
||||
/**
|
||||
* write one-time encryption passwords to a csv file
|
||||
*
|
||||
* @param array $passwords
|
||||
*/
|
||||
protected function writePasswordsToFile(array $passwords) {
|
||||
protected function writePasswordsToFile(array $passwords): void {
|
||||
$fp = $this->rootView->fopen('oneTimeEncryptionPasswords.csv', 'w');
|
||||
foreach ($passwords as $pwd) {
|
||||
fputcsv($fp, $pwd);
|
||||
@@ -330,10 +322,8 @@ class EncryptAll {
|
||||
|
||||
/**
|
||||
* setup user file system
|
||||
*
|
||||
* @param string $uid
|
||||
*/
|
||||
protected function setupUserFS($uid) {
|
||||
protected function setupUserFS(string $uid): void {
|
||||
\OC_Util::tearDownFS();
|
||||
\OC_Util::setupFS($uid);
|
||||
}
|
||||
@@ -341,10 +331,9 @@ class EncryptAll {
|
||||
/**
|
||||
* generate one time password for the user and store it in a array
|
||||
*
|
||||
* @param string $uid
|
||||
* @return string password
|
||||
*/
|
||||
protected function generateOneTimePassword($uid) {
|
||||
protected function generateOneTimePassword(string $uid): string {
|
||||
$password = $this->secureRandom->generate(16, ISecureRandom::CHAR_HUMAN_READABLE);
|
||||
$this->userPasswords[$uid] = $password;
|
||||
return $password;
|
||||
@@ -353,7 +342,7 @@ class EncryptAll {
|
||||
/**
|
||||
* send encryption key passwords to the users by mail
|
||||
*/
|
||||
protected function sendPasswordsByMail() {
|
||||
protected function sendPasswordsByMail(): void {
|
||||
$noMail = [];
|
||||
|
||||
$this->output->writeln('');
|
||||
|
||||
@@ -127,7 +127,7 @@ class Encryption implements IEncryptionModule {
|
||||
/* If useLegacyFileKey is not specified in header, auto-detect, to be safe */
|
||||
$useLegacyFileKey = (($header['useLegacyFileKey'] ?? '') == 'false' ? false : null);
|
||||
|
||||
$this->fileKey = $this->keyManager->getFileKey($this->path, $this->user, $useLegacyFileKey, $this->session->decryptAllModeActivated());
|
||||
$this->fileKey = $this->keyManager->getFileKey($this->path, $useLegacyFileKey, $this->session->decryptAllModeActivated());
|
||||
|
||||
// always use the version from the original file, also part files
|
||||
// need to have a correct version number if they get moved over to the
|
||||
@@ -322,7 +322,7 @@ class Encryption implements IEncryptionModule {
|
||||
* update encrypted file, e.g. give additional users access to the file
|
||||
*
|
||||
* @param string $path path to the file which should be updated
|
||||
* @param string $uid of the user who performs the operation
|
||||
* @param string $uid ignored
|
||||
* @param array $accessList who has access to the file contains the key 'users' and 'public'
|
||||
* @return bool
|
||||
*/
|
||||
@@ -335,7 +335,7 @@ class Encryption implements IEncryptionModule {
|
||||
return false;
|
||||
}
|
||||
|
||||
$fileKey = $this->keyManager->getFileKey($path, $uid, null);
|
||||
$fileKey = $this->keyManager->getFileKey($path, null);
|
||||
|
||||
if (!empty($fileKey)) {
|
||||
$publicKeys = [];
|
||||
@@ -438,7 +438,7 @@ class Encryption implements IEncryptionModule {
|
||||
* @throws DecryptionFailedException
|
||||
*/
|
||||
public function isReadable($path, $uid) {
|
||||
$fileKey = $this->keyManager->getFileKey($path, $uid, null);
|
||||
$fileKey = $this->keyManager->getFileKey($path, null);
|
||||
if (empty($fileKey)) {
|
||||
$owner = $this->util->getOwner($path);
|
||||
if ($owner !== $uid) {
|
||||
|
||||
@@ -23,7 +23,7 @@ class KeyManager {
|
||||
private string $recoveryKeyId;
|
||||
private string $publicShareKeyId;
|
||||
private string $masterKeyId;
|
||||
private string $keyId;
|
||||
private ?string $keyUid;
|
||||
private string $publicKeyId = 'publicKey';
|
||||
private string $privateKeyId = 'privateKey';
|
||||
private string $shareKeyId = 'shareKey';
|
||||
@@ -62,7 +62,7 @@ class KeyManager {
|
||||
$this->config->setAppValue('encryption', 'masterKeyId', $this->masterKeyId);
|
||||
}
|
||||
|
||||
$this->keyId = $userSession->isLoggedIn() ? $userSession->getUser()->getUID() : false;
|
||||
$this->keyUid = $userSession->isLoggedIn() ? $userSession->getUser()?->getUID() : null;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -136,7 +136,11 @@ class KeyManager {
|
||||
if (!$this->session->isPrivateKeySet()) {
|
||||
$masterKey = $this->getSystemPrivateKey($this->masterKeyId);
|
||||
$decryptedMasterKey = $this->crypt->decryptPrivateKey($masterKey, $this->getMasterKeyPassword(), $this->masterKeyId);
|
||||
$this->session->setPrivateKey($decryptedMasterKey);
|
||||
if ($decryptedMasterKey === false) {
|
||||
$this->logger->error('A public master key is available but decrypting it failed. This should never happen.');
|
||||
} else {
|
||||
$this->session->setPrivateKey($decryptedMasterKey);
|
||||
}
|
||||
}
|
||||
|
||||
// after the encryption key is available we are ready to go
|
||||
@@ -347,11 +351,8 @@ class KeyManager {
|
||||
/**
|
||||
* @param ?bool $useLegacyFileKey null means try both
|
||||
*/
|
||||
public function getFileKey(string $path, ?string $uid, ?bool $useLegacyFileKey, bool $useDecryptAll = false): string {
|
||||
if ($uid === '') {
|
||||
$uid = null;
|
||||
}
|
||||
$publicAccess = is_null($uid);
|
||||
public function getFileKey(string $path, ?bool $useLegacyFileKey, bool $useDecryptAll = false): string {
|
||||
$publicAccess = ($this->keyUid === null);
|
||||
$encryptedFileKey = '';
|
||||
if ($useLegacyFileKey ?? true) {
|
||||
$encryptedFileKey = $this->keyStorage->getFileKey($path, $this->fileKeyId, Encryption::ID);
|
||||
@@ -380,6 +381,7 @@ class KeyManager {
|
||||
$privateKey = $this->keyStorage->getSystemUserKey($this->publicShareKeyId . '.' . $this->privateKeyId, Encryption::ID);
|
||||
$privateKey = $this->crypt->decryptPrivateKey($privateKey);
|
||||
} else {
|
||||
$uid = $this->keyUid;
|
||||
$shareKey = $this->getShareKey($path, $uid);
|
||||
$privateKey = $this->session->getPrivateKey();
|
||||
}
|
||||
|
||||
@@ -67,12 +67,8 @@ class Recovery {
|
||||
|
||||
/**
|
||||
* change recovery key id
|
||||
*
|
||||
* @param string $newPassword
|
||||
* @param string $oldPassword
|
||||
* @return bool
|
||||
*/
|
||||
public function changeRecoveryKeyPassword($newPassword, $oldPassword) {
|
||||
public function changeRecoveryKeyPassword(string $newPassword, string $oldPassword): bool {
|
||||
$recoveryKey = $this->keyManager->getSystemPrivateKey($this->keyManager->getRecoveryKeyId());
|
||||
$decryptedRecoveryKey = $this->crypt->decryptPrivateKey($recoveryKey, $oldPassword);
|
||||
if ($decryptedRecoveryKey === false) {
|
||||
@@ -80,7 +76,7 @@ class Recovery {
|
||||
}
|
||||
$encryptedRecoveryKey = $this->crypt->encryptPrivateKey($decryptedRecoveryKey, $newPassword);
|
||||
$header = $this->crypt->generateHeader();
|
||||
if ($encryptedRecoveryKey) {
|
||||
if ($encryptedRecoveryKey !== false) {
|
||||
$this->keyManager->setSystemPrivateKey($this->keyManager->getRecoveryKeyId(), $header . $encryptedRecoveryKey);
|
||||
return true;
|
||||
}
|
||||
@@ -163,7 +159,7 @@ class Recovery {
|
||||
if ($item['type'] === 'dir') {
|
||||
$this->addRecoveryKeys($filePath . '/');
|
||||
} else {
|
||||
$fileKey = $this->keyManager->getFileKey($filePath, $this->user->getUID(), null);
|
||||
$fileKey = $this->keyManager->getFileKey($filePath, null);
|
||||
if (!empty($fileKey)) {
|
||||
$accessList = $this->file->getAccessList($filePath);
|
||||
$publicKeys = [];
|
||||
|
||||
@@ -1,24 +1,23 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
namespace OCA\Encryption;
|
||||
|
||||
use OCA\Encryption\Exceptions\PrivateKeyMissingException;
|
||||
use OCP\ISession;
|
||||
|
||||
class Session {
|
||||
|
||||
public const NOT_INITIALIZED = '0';
|
||||
public const INIT_EXECUTED = '1';
|
||||
public const INIT_SUCCESSFUL = '2';
|
||||
|
||||
/**
|
||||
* @param ISession $session
|
||||
*/
|
||||
public function __construct(
|
||||
protected ISession $session,
|
||||
) {
|
||||
@@ -29,7 +28,7 @@ class Session {
|
||||
*
|
||||
* @param string $status INIT_SUCCESSFUL, INIT_EXECUTED, NOT_INITIALIZED
|
||||
*/
|
||||
public function setStatus($status) {
|
||||
public function setStatus(string $status): void {
|
||||
$this->session->set('encryptionInitialized', $status);
|
||||
}
|
||||
|
||||
@@ -38,7 +37,7 @@ class Session {
|
||||
*
|
||||
* @return string init status INIT_SUCCESSFUL, INIT_EXECUTED, NOT_INITIALIZED
|
||||
*/
|
||||
public function getStatus() {
|
||||
public function getStatus(): string {
|
||||
$status = $this->session->get('encryptionInitialized');
|
||||
if (is_null($status)) {
|
||||
$status = self::NOT_INITIALIZED;
|
||||
@@ -49,10 +48,8 @@ class Session {
|
||||
|
||||
/**
|
||||
* check if encryption was initialized successfully
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isReady() {
|
||||
public function isReady(): bool {
|
||||
$status = $this->getStatus();
|
||||
return $status === self::INIT_SUCCESSFUL;
|
||||
}
|
||||
@@ -63,7 +60,7 @@ class Session {
|
||||
* @return string $privateKey The user's plaintext private key
|
||||
* @throws Exceptions\PrivateKeyMissingException
|
||||
*/
|
||||
public function getPrivateKey() {
|
||||
public function getPrivateKey(): string {
|
||||
$key = $this->session->get('privateKey');
|
||||
if (is_null($key)) {
|
||||
throw new PrivateKeyMissingException('please try to log-out and log-in again');
|
||||
@@ -73,10 +70,8 @@ class Session {
|
||||
|
||||
/**
|
||||
* check if private key is set
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function isPrivateKeySet() {
|
||||
public function isPrivateKeySet(): bool {
|
||||
$key = $this->session->get('privateKey');
|
||||
if (is_null($key)) {
|
||||
return false;
|
||||
@@ -92,17 +87,14 @@ class Session {
|
||||
*
|
||||
* @note this should only be set on login
|
||||
*/
|
||||
public function setPrivateKey($key) {
|
||||
public function setPrivateKey(string $key): void {
|
||||
$this->session->set('privateKey', $key);
|
||||
}
|
||||
|
||||
/**
|
||||
* store data needed for the decrypt all operation in the session
|
||||
*
|
||||
* @param string $user
|
||||
* @param string $key
|
||||
*/
|
||||
public function prepareDecryptAll($user, $key) {
|
||||
public function prepareDecryptAll(string $user, string $key): void {
|
||||
$this->session->set('decryptAll', true);
|
||||
$this->session->set('decryptAllKey', $key);
|
||||
$this->session->set('decryptAllUid', $user);
|
||||
@@ -110,10 +102,8 @@ class Session {
|
||||
|
||||
/**
|
||||
* check if we are in decrypt all mode
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function decryptAllModeActivated() {
|
||||
public function decryptAllModeActivated(): bool {
|
||||
$decryptAll = $this->session->get('decryptAll');
|
||||
return ($decryptAll === true);
|
||||
}
|
||||
@@ -121,10 +111,9 @@ class Session {
|
||||
/**
|
||||
* get uid used for decrypt all operation
|
||||
*
|
||||
* @return string
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function getDecryptAllUid() {
|
||||
public function getDecryptAllUid(): string {
|
||||
$uid = $this->session->get('decryptAllUid');
|
||||
if (is_null($uid) && $this->decryptAllModeActivated()) {
|
||||
throw new \Exception('No uid found while in decrypt all mode');
|
||||
@@ -138,10 +127,9 @@ class Session {
|
||||
/**
|
||||
* get private key for decrypt all operation
|
||||
*
|
||||
* @return string
|
||||
* @throws PrivateKeyMissingException
|
||||
*/
|
||||
public function getDecryptAllKey() {
|
||||
public function getDecryptAllKey(): string {
|
||||
$privateKey = $this->session->get('decryptAllKey');
|
||||
if (is_null($privateKey) && $this->decryptAllModeActivated()) {
|
||||
throw new PrivateKeyMissingException('No private key found while in decrypt all mode');
|
||||
@@ -155,7 +143,7 @@ class Session {
|
||||
/**
|
||||
* remove keys from session
|
||||
*/
|
||||
public function clear() {
|
||||
public function clear(): void {
|
||||
$this->session->remove('publicSharePrivateKey');
|
||||
$this->session->remove('privateKey');
|
||||
$this->session->remove('encryptionInitialized');
|
||||
|
||||
@@ -85,7 +85,7 @@ class RecoveryControllerTest extends TestCase {
|
||||
->method('changeRecoveryKeyPassword')
|
||||
->with($password, $oldPassword)
|
||||
->willReturnMap([
|
||||
['test', 'oldTestFail', false],
|
||||
['test', 'oldtestFail', false],
|
||||
['test', 'oldtest', true]
|
||||
]);
|
||||
|
||||
|
||||
@@ -232,7 +232,7 @@ class EncryptionTest extends TestCase {
|
||||
->willReturn(true);
|
||||
$this->keyManagerMock->expects($this->once())
|
||||
->method('getFileKey')
|
||||
->with($path, 'user', null, true)
|
||||
->with($path, null, true)
|
||||
->willReturn($fileKey);
|
||||
|
||||
$this->instance->begin($path, 'user', 'r', [], []);
|
||||
|
||||
@@ -335,32 +335,25 @@ class KeyManagerTest extends TestCase {
|
||||
return [
|
||||
['user1', false, 'privateKey', 'legacyKey', 'multiKeyDecryptResult'],
|
||||
['user1', false, 'privateKey', '', 'multiKeyDecryptResult'],
|
||||
['user1', false, false, 'legacyKey', ''],
|
||||
['user1', false, false, '', ''],
|
||||
['user1', false, '', 'legacyKey', ''],
|
||||
['user1', false, '', '', ''],
|
||||
['user1', true, 'privateKey', 'legacyKey', 'multiKeyDecryptResult'],
|
||||
['user1', true, 'privateKey', '', 'multiKeyDecryptResult'],
|
||||
['user1', true, false, 'legacyKey', ''],
|
||||
['user1', true, false, '', ''],
|
||||
['user1', true, '', 'legacyKey', ''],
|
||||
['user1', true, '', '', ''],
|
||||
[null, false, 'privateKey', 'legacyKey', 'multiKeyDecryptResult'],
|
||||
[null, false, 'privateKey', '', 'multiKeyDecryptResult'],
|
||||
[null, false, false, 'legacyKey', ''],
|
||||
[null, false, false, '', ''],
|
||||
[null, false, '', 'legacyKey', ''],
|
||||
[null, false, '', '', ''],
|
||||
[null, true, 'privateKey', 'legacyKey', 'multiKeyDecryptResult'],
|
||||
[null, true, 'privateKey', '', 'multiKeyDecryptResult'],
|
||||
[null, true, false, 'legacyKey', ''],
|
||||
[null, true, false, '', ''],
|
||||
[null, true, '', 'legacyKey', ''],
|
||||
[null, true, '', '', ''],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param $uid
|
||||
* @param $isMasterKeyEnabled
|
||||
* @param $privateKey
|
||||
* @param $expected
|
||||
*/
|
||||
#[\PHPUnit\Framework\Attributes\DataProvider('dataTestGetFileKey')]
|
||||
public function testGetFileKey($uid, $isMasterKeyEnabled, $privateKey, $encryptedFileKey, $expected): void {
|
||||
public function testGetFileKey(?string $uid, bool $isMasterKeyEnabled, string $privateKey, string $encryptedFileKey, string $expected): void {
|
||||
$path = '/foo.txt';
|
||||
|
||||
if ($isMasterKeyEnabled) {
|
||||
@@ -374,6 +367,7 @@ class KeyManagerTest extends TestCase {
|
||||
}
|
||||
|
||||
$this->invokePrivate($this->instance, 'masterKeyId', ['masterKeyId']);
|
||||
$this->invokePrivate($this->instance, 'keyUid', [$uid]);
|
||||
|
||||
$this->keyStorageMock->expects($this->exactly(2))
|
||||
->method('getFileKey')
|
||||
@@ -423,7 +417,7 @@ class KeyManagerTest extends TestCase {
|
||||
}
|
||||
|
||||
$this->assertSame($expected,
|
||||
$this->instance->getFileKey($path, $uid, null)
|
||||
$this->instance->getFileKey($path, null)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ declare(strict_types=1);
|
||||
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
namespace OCA\Encryption\Tests;
|
||||
|
||||
use OC\Files\View;
|
||||
@@ -22,38 +23,16 @@ use Test\TestCase;
|
||||
|
||||
class RecoveryTest extends TestCase {
|
||||
private static $tempStorage = [];
|
||||
/**
|
||||
* @var IFile|\PHPUnit\Framework\MockObject\MockObject
|
||||
*/
|
||||
private $fileMock;
|
||||
/**
|
||||
* @var View|\PHPUnit\Framework\MockObject\MockObject
|
||||
*/
|
||||
private $viewMock;
|
||||
/**
|
||||
* @var IUserSession|\PHPUnit\Framework\MockObject\MockObject
|
||||
*/
|
||||
private $userSessionMock;
|
||||
/**
|
||||
* @var MockObject|IUser
|
||||
*/
|
||||
private $user;
|
||||
/**
|
||||
* @var KeyManager|\PHPUnit\Framework\MockObject\MockObject
|
||||
*/
|
||||
private $keyManagerMock;
|
||||
/**
|
||||
* @var IConfig|\PHPUnit\Framework\MockObject\MockObject
|
||||
*/
|
||||
private $configMock;
|
||||
/**
|
||||
* @var Crypt|\PHPUnit\Framework\MockObject\MockObject
|
||||
*/
|
||||
private $cryptMock;
|
||||
/**
|
||||
* @var Recovery
|
||||
*/
|
||||
private $instance;
|
||||
|
||||
private IFile&MockObject $fileMock;
|
||||
private View&MockObject $viewMock;
|
||||
private IUserSession&MockObject $userSessionMock;
|
||||
private IUser&MockObject $user;
|
||||
private KeyManager&MockObject $keyManagerMock;
|
||||
private IConfig&MockObject $configMock;
|
||||
private Crypt&MockObject $cryptMock;
|
||||
|
||||
private Recovery $instance;
|
||||
|
||||
public function testEnableAdminRecoverySuccessful(): void {
|
||||
$this->keyManagerMock->expects($this->exactly(2))
|
||||
@@ -122,21 +101,23 @@ class RecoveryTest extends TestCase {
|
||||
}
|
||||
|
||||
public function testChangeRecoveryKeyPasswordSuccessful(): void {
|
||||
$this->assertFalse($this->instance->changeRecoveryKeyPassword('password',
|
||||
'passwordOld'));
|
||||
$this->assertFalse($this->instance->changeRecoveryKeyPassword('password', 'passwordOld'));
|
||||
|
||||
$this->keyManagerMock->expects($this->once())
|
||||
->method('getSystemPrivateKey');
|
||||
->method('getSystemPrivateKey')
|
||||
->willReturn('privateKey');
|
||||
|
||||
$this->cryptMock->expects($this->once())
|
||||
->method('decryptPrivateKey');
|
||||
->method('decryptPrivateKey')
|
||||
->with('privateKey', 'passwordOld')
|
||||
->willReturn('decryptedPrivateKey');
|
||||
|
||||
$this->cryptMock->expects($this->once())
|
||||
->method('encryptPrivateKey')
|
||||
->willReturn(true);
|
||||
->with('decryptedPrivateKey', 'password')
|
||||
->willReturn('privateKey');
|
||||
|
||||
$this->assertTrue($this->instance->changeRecoveryKeyPassword('password',
|
||||
'passwordOld'));
|
||||
$this->assertTrue($this->instance->changeRecoveryKeyPassword('password', 'passwordOld'));
|
||||
}
|
||||
|
||||
public function testChangeRecoveryKeyPasswordCouldNotDecryptPrivateRecoveryKey(): void {
|
||||
|
||||
@@ -76,7 +76,7 @@ class SessionTest extends TestCase {
|
||||
public function testGetDecryptAllUidException2(): void {
|
||||
$this->expectException(\Exception::class);
|
||||
|
||||
$this->instance->prepareDecryptAll(null, 'key');
|
||||
$this->instance->prepareDecryptAll('', 'key');
|
||||
$this->instance->getDecryptAllUid();
|
||||
}
|
||||
|
||||
@@ -95,7 +95,7 @@ class SessionTest extends TestCase {
|
||||
public function testGetDecryptAllKeyException2(): void {
|
||||
$this->expectException(PrivateKeyMissingException::class);
|
||||
|
||||
$this->instance->prepareDecryptAll('user', null);
|
||||
$this->instance->prepareDecryptAll('user', '');
|
||||
$this->instance->getDecryptAllKey();
|
||||
}
|
||||
|
||||
|
||||
@@ -24,13 +24,13 @@ OC.L10N.register(
|
||||
"Federated file sharing" : "Sammenkoblet fildeling",
|
||||
"Provide federated file sharing across servers" : "Lever sammenkoblet fildeling på tværs af servere",
|
||||
"Confirm data upload to lookup server" : "Bekræft dataoverførsel til opslagsserver",
|
||||
"When enabled, all account properties (e.g. email address) with scope visibility set to \"published\", will be automatically synced and transmitted to an external system and made available in a public, global address book." : "Når det er aktiveret, vil alle kontoegenskaber (f.eks. mailadresse) med omfangssynlighed indstillet til \"publiceret\", automatisk blive synkroniseret og transmitteret til et eksternt system og gjort tilgængelige i en offentlig, global adressebog.",
|
||||
"When enabled, all account properties (e.g. email address) with scope visibility set to \"published\", will be automatically synced and transmitted to an external system and made available in a public, global address book." : "Når det er aktiveret, så vil alle kontoegenskaber (f.eks. e-mailadresse) med omfangssynlighed indstillet til \"publiceret\", automatisk blive synkroniseret og transmitteret til et eksternt system og gjort tilgængelige i en offentlig, global adressebog.",
|
||||
"Disable upload" : "Deaktivér upload",
|
||||
"Enable data upload" : "Aktivér data upload",
|
||||
"Confirm querying lookup server" : "Bekræft forespørgsel til opslagsserver",
|
||||
"When enabled, the search input when creating shares will be sent to an external system that provides a public and global address book." : "Når det er aktiveret, vil søgeinputtet, når der oprettes delinger, blive sendt til et eksternt system, der leverer en offentlig og global adressebog.",
|
||||
"This is used to retrieve the federated cloud ID to make federated sharing easier." : "Dette bruges til at hente det fødererede cloud ID for at gøre fødereret deling nemmere.",
|
||||
"Moreover, email addresses of users might be sent to that system in order to verify them." : "Desuden kan mailadresser på brugere blive sendt til dette system for at verificere dem.",
|
||||
"Moreover, email addresses of users might be sent to that system in order to verify them." : "Desuden kan e-mailadresser på brugere blive sendt til dette system for at verificere dem.",
|
||||
"Disable querying" : "Deaktivér forespørgsler",
|
||||
"Enable querying" : "Aktivér forespørgsler",
|
||||
"Unable to update federated files sharing config" : "Kan ikke opdatere sammenkoblet fildelingskonfiguration",
|
||||
@@ -39,7 +39,7 @@ OC.L10N.register(
|
||||
"Allow people on this server to receive shares from other servers" : "Tillad brugere på denne server at modtage delinger fra andre servere",
|
||||
"Allow people on this server to send shares to groups on other servers" : "Tillad brugere på denne server at sende delinger til grupper på andre servere",
|
||||
"Allow people on this server to receive group shares from other servers" : "Tillad brugere på denne server at modtage gruppedelinger fra andre servere",
|
||||
"The lookup server is only available for global scale." : "Opslagsserveren er kun tilgængelig for global skala.",
|
||||
"The lookup server is only available for global scale." : "Opslagsserveren er kun tilgængelig for globalt omfang.",
|
||||
"Search global and public address book for people" : "Søg global og offentlig adressebog efter personer",
|
||||
"Allow people to publish their data to a global and public address book" : "Tillad brugere at udgive deres data til en global og offentlig adressebog",
|
||||
"Trusted federation" : "Betroet sammenkobling",
|
||||
|
||||
@@ -22,13 +22,13 @@
|
||||
"Federated file sharing" : "Sammenkoblet fildeling",
|
||||
"Provide federated file sharing across servers" : "Lever sammenkoblet fildeling på tværs af servere",
|
||||
"Confirm data upload to lookup server" : "Bekræft dataoverførsel til opslagsserver",
|
||||
"When enabled, all account properties (e.g. email address) with scope visibility set to \"published\", will be automatically synced and transmitted to an external system and made available in a public, global address book." : "Når det er aktiveret, vil alle kontoegenskaber (f.eks. mailadresse) med omfangssynlighed indstillet til \"publiceret\", automatisk blive synkroniseret og transmitteret til et eksternt system og gjort tilgængelige i en offentlig, global adressebog.",
|
||||
"When enabled, all account properties (e.g. email address) with scope visibility set to \"published\", will be automatically synced and transmitted to an external system and made available in a public, global address book." : "Når det er aktiveret, så vil alle kontoegenskaber (f.eks. e-mailadresse) med omfangssynlighed indstillet til \"publiceret\", automatisk blive synkroniseret og transmitteret til et eksternt system og gjort tilgængelige i en offentlig, global adressebog.",
|
||||
"Disable upload" : "Deaktivér upload",
|
||||
"Enable data upload" : "Aktivér data upload",
|
||||
"Confirm querying lookup server" : "Bekræft forespørgsel til opslagsserver",
|
||||
"When enabled, the search input when creating shares will be sent to an external system that provides a public and global address book." : "Når det er aktiveret, vil søgeinputtet, når der oprettes delinger, blive sendt til et eksternt system, der leverer en offentlig og global adressebog.",
|
||||
"This is used to retrieve the federated cloud ID to make federated sharing easier." : "Dette bruges til at hente det fødererede cloud ID for at gøre fødereret deling nemmere.",
|
||||
"Moreover, email addresses of users might be sent to that system in order to verify them." : "Desuden kan mailadresser på brugere blive sendt til dette system for at verificere dem.",
|
||||
"Moreover, email addresses of users might be sent to that system in order to verify them." : "Desuden kan e-mailadresser på brugere blive sendt til dette system for at verificere dem.",
|
||||
"Disable querying" : "Deaktivér forespørgsler",
|
||||
"Enable querying" : "Aktivér forespørgsler",
|
||||
"Unable to update federated files sharing config" : "Kan ikke opdatere sammenkoblet fildelingskonfiguration",
|
||||
@@ -37,7 +37,7 @@
|
||||
"Allow people on this server to receive shares from other servers" : "Tillad brugere på denne server at modtage delinger fra andre servere",
|
||||
"Allow people on this server to send shares to groups on other servers" : "Tillad brugere på denne server at sende delinger til grupper på andre servere",
|
||||
"Allow people on this server to receive group shares from other servers" : "Tillad brugere på denne server at modtage gruppedelinger fra andre servere",
|
||||
"The lookup server is only available for global scale." : "Opslagsserveren er kun tilgængelig for global skala.",
|
||||
"The lookup server is only available for global scale." : "Opslagsserveren er kun tilgængelig for globalt omfang.",
|
||||
"Search global and public address book for people" : "Søg global og offentlig adressebog efter personer",
|
||||
"Allow people to publish their data to a global and public address book" : "Tillad brugere at udgive deres data til en global og offentlig adressebog",
|
||||
"Trusted federation" : "Betroet sammenkobling",
|
||||
|
||||
@@ -52,6 +52,7 @@ OC.L10N.register(
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Zwischenablage nicht verfügbar. Bitte die Cloud-ID manuell kopieren.",
|
||||
"Copied!" : "Kopiert!",
|
||||
"Federated Cloud" : "Federated Cloud",
|
||||
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Du kannst mit jedem teilen, der einen {productName}-Server oder andere Open Cloud Mesh (OCM) kompatible Server und Dienste verwendet! Gebe einfach deren Federated-Cloud-ID in den Teilen-Dialog ein. Diese sieht wie folgt aus: person@cloud.example.com",
|
||||
"Your Federated Cloud ID" : "Deine Federated-Cloud-ID",
|
||||
"Share it so your friends can share files with you:" : "Teile es, damit deine Freunde Dateien mit dir teilen können:",
|
||||
"Facebook" : "Facebook",
|
||||
@@ -60,6 +61,7 @@ OC.L10N.register(
|
||||
"Mastodon" : "Mastodon",
|
||||
"Bluesky" : "Bluesky",
|
||||
"Add to your website" : "Zu deiner Webseite hinzufügen",
|
||||
"Share with me via {productName}" : "Mit mir über {productName} teilen",
|
||||
"HTML Code:" : "HTML-Code:",
|
||||
"Cancel" : "Abbrechen",
|
||||
"Add remote share" : "Externe Freigabe hinzufügen",
|
||||
|
||||
@@ -50,6 +50,7 @@
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Zwischenablage nicht verfügbar. Bitte die Cloud-ID manuell kopieren.",
|
||||
"Copied!" : "Kopiert!",
|
||||
"Federated Cloud" : "Federated Cloud",
|
||||
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Du kannst mit jedem teilen, der einen {productName}-Server oder andere Open Cloud Mesh (OCM) kompatible Server und Dienste verwendet! Gebe einfach deren Federated-Cloud-ID in den Teilen-Dialog ein. Diese sieht wie folgt aus: person@cloud.example.com",
|
||||
"Your Federated Cloud ID" : "Deine Federated-Cloud-ID",
|
||||
"Share it so your friends can share files with you:" : "Teile es, damit deine Freunde Dateien mit dir teilen können:",
|
||||
"Facebook" : "Facebook",
|
||||
@@ -58,6 +59,7 @@
|
||||
"Mastodon" : "Mastodon",
|
||||
"Bluesky" : "Bluesky",
|
||||
"Add to your website" : "Zu deiner Webseite hinzufügen",
|
||||
"Share with me via {productName}" : "Mit mir über {productName} teilen",
|
||||
"HTML Code:" : "HTML-Code:",
|
||||
"Cancel" : "Abbrechen",
|
||||
"Add remote share" : "Externe Freigabe hinzufügen",
|
||||
|
||||
@@ -52,6 +52,7 @@ OC.L10N.register(
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Zwischenablage nicht verfügbar. Bitte die Cloud-ID manuell kopieren.",
|
||||
"Copied!" : "Kopiert!",
|
||||
"Federated Cloud" : "Federated Cloud",
|
||||
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Sie können mit jedem teilen, der einen {productName}-Server oder andere Open Cloud Mesh (OCM) kompatible Server und Dienste verwendet! Geben Sie einfach deren Federated-Cloud-ID in den Teilen-Dialog ein. Diese sieht wie folgt aus: person@cloud.example.com",
|
||||
"Your Federated Cloud ID" : "Ihre Federated-Cloud-ID",
|
||||
"Share it so your friends can share files with you:" : "Teilen Sie es, damit Ihre Freunde Dateien mit Ihnen teilen können:",
|
||||
"Facebook" : "Facebook",
|
||||
@@ -60,6 +61,7 @@ OC.L10N.register(
|
||||
"Mastodon" : "Mastodon",
|
||||
"Bluesky" : "Bluesky",
|
||||
"Add to your website" : "Zu Ihrer Webseite hinzufügen",
|
||||
"Share with me via {productName}" : "Mit mir über {productName} teilen",
|
||||
"HTML Code:" : "HTML-Code:",
|
||||
"Cancel" : "Abbrechen",
|
||||
"Add remote share" : "Externe Freigabe hinzufügen",
|
||||
|
||||
@@ -50,6 +50,7 @@
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Zwischenablage nicht verfügbar. Bitte die Cloud-ID manuell kopieren.",
|
||||
"Copied!" : "Kopiert!",
|
||||
"Federated Cloud" : "Federated Cloud",
|
||||
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Sie können mit jedem teilen, der einen {productName}-Server oder andere Open Cloud Mesh (OCM) kompatible Server und Dienste verwendet! Geben Sie einfach deren Federated-Cloud-ID in den Teilen-Dialog ein. Diese sieht wie folgt aus: person@cloud.example.com",
|
||||
"Your Federated Cloud ID" : "Ihre Federated-Cloud-ID",
|
||||
"Share it so your friends can share files with you:" : "Teilen Sie es, damit Ihre Freunde Dateien mit Ihnen teilen können:",
|
||||
"Facebook" : "Facebook",
|
||||
@@ -58,6 +59,7 @@
|
||||
"Mastodon" : "Mastodon",
|
||||
"Bluesky" : "Bluesky",
|
||||
"Add to your website" : "Zu Ihrer Webseite hinzufügen",
|
||||
"Share with me via {productName}" : "Mit mir über {productName} teilen",
|
||||
"HTML Code:" : "HTML-Code:",
|
||||
"Cancel" : "Abbrechen",
|
||||
"Add remote share" : "Externe Freigabe hinzufügen",
|
||||
|
||||
@@ -52,6 +52,7 @@ OC.L10N.register(
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Clipboard not available. Please copy the cloud ID manually.",
|
||||
"Copied!" : "Copied!",
|
||||
"Federated Cloud" : "Federated Cloud",
|
||||
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com",
|
||||
"Your Federated Cloud ID" : "Your Federated Cloud ID",
|
||||
"Share it so your friends can share files with you:" : "Share it so your friends can share files with you:",
|
||||
"Facebook" : "Facebook",
|
||||
@@ -60,6 +61,7 @@ OC.L10N.register(
|
||||
"Mastodon" : "Mastodon",
|
||||
"Bluesky" : "Bluesky",
|
||||
"Add to your website" : "Add to your website",
|
||||
"Share with me via {productName}" : "Share with me via {productName}",
|
||||
"HTML Code:" : "HTML Code:",
|
||||
"Cancel" : "Cancel",
|
||||
"Add remote share" : "Add remote share",
|
||||
|
||||
@@ -50,6 +50,7 @@
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Clipboard not available. Please copy the cloud ID manually.",
|
||||
"Copied!" : "Copied!",
|
||||
"Federated Cloud" : "Federated Cloud",
|
||||
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com",
|
||||
"Your Federated Cloud ID" : "Your Federated Cloud ID",
|
||||
"Share it so your friends can share files with you:" : "Share it so your friends can share files with you:",
|
||||
"Facebook" : "Facebook",
|
||||
@@ -58,6 +59,7 @@
|
||||
"Mastodon" : "Mastodon",
|
||||
"Bluesky" : "Bluesky",
|
||||
"Add to your website" : "Add to your website",
|
||||
"Share with me via {productName}" : "Share with me via {productName}",
|
||||
"HTML Code:" : "HTML Code:",
|
||||
"Cancel" : "Cancel",
|
||||
"Add remote share" : "Add remote share",
|
||||
|
||||
@@ -52,6 +52,7 @@ OC.L10N.register(
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Portapapeles no disponible. Por favor, copia el ID de nube manualmente.",
|
||||
"Copied!" : "¡Copiado!",
|
||||
"Federated Cloud" : "Nube Federada",
|
||||
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "¡Puede compartir con cualquier persona que use un servidor {productName} u otros servicios compatibles con Open Cloud Mesh (OCM)!. Solo coloque el ID de Nube Federada de esta(s) persona(s) en el diálogo de compartir. Se verán así: persona@nube.ejemplo.com",
|
||||
"Your Federated Cloud ID" : "Tu ID de Nube Federada",
|
||||
"Share it so your friends can share files with you:" : "Compártelo para que tus amigos puedan compartir archivos contigo:",
|
||||
"Facebook" : "Facebook",
|
||||
@@ -60,6 +61,7 @@ OC.L10N.register(
|
||||
"Mastodon" : "Mastodon",
|
||||
"Bluesky" : "Bluesky",
|
||||
"Add to your website" : "Añadir a su sitio web",
|
||||
"Share with me via {productName}" : "Compartir conmigo a través de {productName}",
|
||||
"HTML Code:" : "Código HTML:",
|
||||
"Cancel" : "Cancelar",
|
||||
"Add remote share" : "Añadir recurso compartido remoto",
|
||||
|
||||
@@ -50,6 +50,7 @@
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Portapapeles no disponible. Por favor, copia el ID de nube manualmente.",
|
||||
"Copied!" : "¡Copiado!",
|
||||
"Federated Cloud" : "Nube Federada",
|
||||
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "¡Puede compartir con cualquier persona que use un servidor {productName} u otros servicios compatibles con Open Cloud Mesh (OCM)!. Solo coloque el ID de Nube Federada de esta(s) persona(s) en el diálogo de compartir. Se verán así: persona@nube.ejemplo.com",
|
||||
"Your Federated Cloud ID" : "Tu ID de Nube Federada",
|
||||
"Share it so your friends can share files with you:" : "Compártelo para que tus amigos puedan compartir archivos contigo:",
|
||||
"Facebook" : "Facebook",
|
||||
@@ -58,6 +59,7 @@
|
||||
"Mastodon" : "Mastodon",
|
||||
"Bluesky" : "Bluesky",
|
||||
"Add to your website" : "Añadir a su sitio web",
|
||||
"Share with me via {productName}" : "Compartir conmigo a través de {productName}",
|
||||
"HTML Code:" : "Código HTML:",
|
||||
"Cancel" : "Cancelar",
|
||||
"Add remote share" : "Añadir recurso compartido remoto",
|
||||
|
||||
@@ -52,6 +52,7 @@ OC.L10N.register(
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Lõikelaud pole saadaval. Palun kopeeri kasutajatunnus liitpilves käsitsi.",
|
||||
"Copied!" : "Kopeeritud!",
|
||||
"Federated Cloud" : "Liitpilv",
|
||||
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Saad jagada kõigiga, kes kasutavad {productName}i serverit või muid Open Cloud Meshi (OCM) ühilduvaid servereid ja teenuseid! Lihtsalt sisesta jagamise vaates nende kasutajatunnus liitpilves. See näeb välja nagu kasutajanimi@pilv.toreserver.com",
|
||||
"Your Federated Cloud ID" : "Sinu kasutajatunnus liitpilves",
|
||||
"Share it so your friends can share files with you:" : "Jaga seda, et su sõbrad saaksid sinuga faile jagada:",
|
||||
"Facebook" : "Facebook",
|
||||
@@ -60,6 +61,7 @@ OC.L10N.register(
|
||||
"Mastodon" : "Mastodon",
|
||||
"Bluesky" : "Bluesky",
|
||||
"Add to your website" : "Lisa oma veebisaidile",
|
||||
"Share with me via {productName}" : "Jaga minuga {productName}i vahendusel",
|
||||
"HTML Code:" : "HTML kood:",
|
||||
"Cancel" : "Tühista",
|
||||
"Add remote share" : "Lisa kaugjagamine",
|
||||
|
||||
@@ -50,6 +50,7 @@
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Lõikelaud pole saadaval. Palun kopeeri kasutajatunnus liitpilves käsitsi.",
|
||||
"Copied!" : "Kopeeritud!",
|
||||
"Federated Cloud" : "Liitpilv",
|
||||
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Saad jagada kõigiga, kes kasutavad {productName}i serverit või muid Open Cloud Meshi (OCM) ühilduvaid servereid ja teenuseid! Lihtsalt sisesta jagamise vaates nende kasutajatunnus liitpilves. See näeb välja nagu kasutajanimi@pilv.toreserver.com",
|
||||
"Your Federated Cloud ID" : "Sinu kasutajatunnus liitpilves",
|
||||
"Share it so your friends can share files with you:" : "Jaga seda, et su sõbrad saaksid sinuga faile jagada:",
|
||||
"Facebook" : "Facebook",
|
||||
@@ -58,6 +59,7 @@
|
||||
"Mastodon" : "Mastodon",
|
||||
"Bluesky" : "Bluesky",
|
||||
"Add to your website" : "Lisa oma veebisaidile",
|
||||
"Share with me via {productName}" : "Jaga minuga {productName}i vahendusel",
|
||||
"HTML Code:" : "HTML kood:",
|
||||
"Cancel" : "Tühista",
|
||||
"Add remote share" : "Lisa kaugjagamine",
|
||||
|
||||
@@ -52,6 +52,7 @@ OC.L10N.register(
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Arbela ez dago eskuragarri, mesedez kopiatu hodei IDa eskuz.",
|
||||
"Copied!" : "Kopiatuta!",
|
||||
"Federated Cloud" : "Hodei Federatua",
|
||||
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "{productName} zerbitzari bat edo Open Cloud Mesh (OCM) zerbitzari eta zerbitzu bateragarriak erabiltzen dituen edonorekin parteka dezakezu! Jarri Hodei Federatuaren identifikazioa elkarrizketa partekatuan. Horrelako itxura du: pertsona@cloud.example.com",
|
||||
"Your Federated Cloud ID" : "Zure federatutako hodei IDa",
|
||||
"Share it so your friends can share files with you:" : "Bidali lagunei, zurekin fitxategiak parteka ditzaten:",
|
||||
"Facebook" : "Facebook",
|
||||
@@ -60,6 +61,7 @@ OC.L10N.register(
|
||||
"Mastodon" : "Mastodon",
|
||||
"Bluesky" : "Bluesky",
|
||||
"Add to your website" : "Gehitu zure webgunera",
|
||||
"Share with me via {productName}" : "Partekatu nirekin {productName}zerbitzariaren bidez",
|
||||
"HTML Code:" : "HTML kodea:",
|
||||
"Cancel" : "Ezeztatu",
|
||||
"Add remote share" : "Gehitu urruneko partekatzea",
|
||||
|
||||
@@ -50,6 +50,7 @@
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Arbela ez dago eskuragarri, mesedez kopiatu hodei IDa eskuz.",
|
||||
"Copied!" : "Kopiatuta!",
|
||||
"Federated Cloud" : "Hodei Federatua",
|
||||
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "{productName} zerbitzari bat edo Open Cloud Mesh (OCM) zerbitzari eta zerbitzu bateragarriak erabiltzen dituen edonorekin parteka dezakezu! Jarri Hodei Federatuaren identifikazioa elkarrizketa partekatuan. Horrelako itxura du: pertsona@cloud.example.com",
|
||||
"Your Federated Cloud ID" : "Zure federatutako hodei IDa",
|
||||
"Share it so your friends can share files with you:" : "Bidali lagunei, zurekin fitxategiak parteka ditzaten:",
|
||||
"Facebook" : "Facebook",
|
||||
@@ -58,6 +59,7 @@
|
||||
"Mastodon" : "Mastodon",
|
||||
"Bluesky" : "Bluesky",
|
||||
"Add to your website" : "Gehitu zure webgunera",
|
||||
"Share with me via {productName}" : "Partekatu nirekin {productName}zerbitzariaren bidez",
|
||||
"HTML Code:" : "HTML kodea:",
|
||||
"Cancel" : "Ezeztatu",
|
||||
"Add remote share" : "Gehitu urruneko partekatzea",
|
||||
|
||||
@@ -52,6 +52,7 @@ OC.L10N.register(
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Presse-papiers non disponible. Veuillez copier l'ID cloud manuellement.",
|
||||
"Copied!" : "Copié !",
|
||||
"Federated Cloud" : "Cloud Fédéré",
|
||||
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Vous pouvez partager avec quiconque utilise un serveur {productName} ou un serveur ou service compatible Open Cloud Mesh (OCM). Renseignez simplement son ID de Cloud Fédéré sur une instance fédérée dans la boîte de dialogue de partage. Cela ressemble à utilisateur@cloud.exemple.com.",
|
||||
"Your Federated Cloud ID" : "Votre ID de cloud fédéré",
|
||||
"Share it so your friends can share files with you:" : "Partagez-le afin que vos amis puissent partager des fichiers avec vous :",
|
||||
"Facebook" : "Facebook",
|
||||
@@ -60,6 +61,7 @@ OC.L10N.register(
|
||||
"Mastodon" : "Mastodon",
|
||||
"Bluesky" : "Bluesky",
|
||||
"Add to your website" : "Ajouter à votre site web",
|
||||
"Share with me via {productName}" : "Partager avec moi via {productName}",
|
||||
"HTML Code:" : "Code HTML :",
|
||||
"Cancel" : "Annuler",
|
||||
"Add remote share" : "Ajouter un partage distant",
|
||||
|
||||
@@ -50,6 +50,7 @@
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Presse-papiers non disponible. Veuillez copier l'ID cloud manuellement.",
|
||||
"Copied!" : "Copié !",
|
||||
"Federated Cloud" : "Cloud Fédéré",
|
||||
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Vous pouvez partager avec quiconque utilise un serveur {productName} ou un serveur ou service compatible Open Cloud Mesh (OCM). Renseignez simplement son ID de Cloud Fédéré sur une instance fédérée dans la boîte de dialogue de partage. Cela ressemble à utilisateur@cloud.exemple.com.",
|
||||
"Your Federated Cloud ID" : "Votre ID de cloud fédéré",
|
||||
"Share it so your friends can share files with you:" : "Partagez-le afin que vos amis puissent partager des fichiers avec vous :",
|
||||
"Facebook" : "Facebook",
|
||||
@@ -58,6 +59,7 @@
|
||||
"Mastodon" : "Mastodon",
|
||||
"Bluesky" : "Bluesky",
|
||||
"Add to your website" : "Ajouter à votre site web",
|
||||
"Share with me via {productName}" : "Partager avec moi via {productName}",
|
||||
"HTML Code:" : "Code HTML :",
|
||||
"Cancel" : "Annuler",
|
||||
"Add remote share" : "Ajouter un partage distant",
|
||||
|
||||
@@ -52,6 +52,7 @@ OC.L10N.register(
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Níl an gearrthaisce ar fáil. Cóipeáil an t-aitheantas néil de láimh.",
|
||||
"Copied!" : "Cóipeáladh!",
|
||||
"Federated Cloud" : "Scamall Cónaidhme",
|
||||
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Is féidir leat comhroinnt le duine ar bith a úsáideann freastalaí {productName} nó freastalaithe agus seirbhísí eile atá comhoiriúnach le Open Cloud Mesh (OCM)! Cuir a n-ID Cónaidhme Cloud sa dialóg comhroinnte. Tá cuma person@cloud.example.com air.",
|
||||
"Your Federated Cloud ID" : "D'Aitheantas Néal Cónaidhmeach",
|
||||
"Share it so your friends can share files with you:" : "Roinn é ionas gur féidir le do chairde comhaid a roinnt leat:",
|
||||
"Facebook" : "Facebook",
|
||||
@@ -60,6 +61,7 @@ OC.L10N.register(
|
||||
"Mastodon" : "Mastodon",
|
||||
"Bluesky" : "Bluesky",
|
||||
"Add to your website" : "Cuir le do láithreán gréasáin",
|
||||
"Share with me via {productName}" : "Roinn liom trí {productName}",
|
||||
"HTML Code:" : "Cód HTML:",
|
||||
"Cancel" : "Cealaigh",
|
||||
"Add remote share" : "Cuir cianroinnte leis",
|
||||
|
||||
@@ -50,6 +50,7 @@
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Níl an gearrthaisce ar fáil. Cóipeáil an t-aitheantas néil de láimh.",
|
||||
"Copied!" : "Cóipeáladh!",
|
||||
"Federated Cloud" : "Scamall Cónaidhme",
|
||||
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Is féidir leat comhroinnt le duine ar bith a úsáideann freastalaí {productName} nó freastalaithe agus seirbhísí eile atá comhoiriúnach le Open Cloud Mesh (OCM)! Cuir a n-ID Cónaidhme Cloud sa dialóg comhroinnte. Tá cuma person@cloud.example.com air.",
|
||||
"Your Federated Cloud ID" : "D'Aitheantas Néal Cónaidhmeach",
|
||||
"Share it so your friends can share files with you:" : "Roinn é ionas gur féidir le do chairde comhaid a roinnt leat:",
|
||||
"Facebook" : "Facebook",
|
||||
@@ -58,6 +59,7 @@
|
||||
"Mastodon" : "Mastodon",
|
||||
"Bluesky" : "Bluesky",
|
||||
"Add to your website" : "Cuir le do láithreán gréasáin",
|
||||
"Share with me via {productName}" : "Roinn liom trí {productName}",
|
||||
"HTML Code:" : "Cód HTML:",
|
||||
"Cancel" : "Cealaigh",
|
||||
"Add remote share" : "Cuir cianroinnte leis",
|
||||
|
||||
@@ -23,30 +23,45 @@ OC.L10N.register(
|
||||
"Sharing" : "Compartindo",
|
||||
"Federated file sharing" : "Compartición federada de ficheiros",
|
||||
"Provide federated file sharing across servers" : "Fornece a compartición federada de ficheiros entre servidores",
|
||||
"Confirm data upload to lookup server" : "Confirmar o envío de datos ao servidor de busca",
|
||||
"When enabled, all account properties (e.g. email address) with scope visibility set to \"published\", will be automatically synced and transmitted to an external system and made available in a public, global address book." : "Cando está activado, todas as propiedades da conta (p. ex., o enderezo de correo-e) co ámbito de visibilidade definido en «publicado», sincronizaranse automaticamente e transmitiranse a un sistema externo e estarán dispoñíbeis nun caderno de enderezos público e global.",
|
||||
"Disable upload" : "Desactivar o envío",
|
||||
"Enable data upload" : "Activar o envío de datos",
|
||||
"Confirm querying lookup server" : "Confirmar a consulta ao servidor de buscas",
|
||||
"When enabled, the search input when creating shares will be sent to an external system that provides a public and global address book." : "Cando está activada, a entrada de busca ao crear comparticións enviarase a un sistema externo que fornece un caderno de enderezos público e global.",
|
||||
"This is used to retrieve the federated cloud ID to make federated sharing easier." : "Isto utilízase para recuperar o ID de nube federado para facilitar a compartición federada.",
|
||||
"Moreover, email addresses of users might be sent to that system in order to verify them." : "Ademais, poderánse enviar os enderezos de correo-e dos usuarios a ese sistema para verificalos.",
|
||||
"Disable querying" : "Desactivar a consulta",
|
||||
"Enable querying" : "Activar a consulta",
|
||||
"Unable to update federated files sharing config" : "Non é posíbel actualizar a configuración de uso compartido de ficheiros federados",
|
||||
"Adjust how people can share between servers. This includes shares between people on this server as well if they are using federated sharing." : "Axuste a forma como a xente pode compartir entre servidores. Isto inclúe tamén as comparticións entre persoas deste servidor se están a usaren a compartición federada.",
|
||||
"Allow people on this server to send shares to other servers (this option also allows WebDAV access to public shares)" : "Permitirlle á xente deste servidor enviar comparticións a outros servidores (esta opción tamén permite o acceso de WebDAV a comparticións públicas)",
|
||||
"Allow people on this server to receive shares from other servers" : "Permitirlle á xente deste servidor recibir comparticións doutros servidores",
|
||||
"Allow people on this server to send shares to groups on other servers" : "Permitirlle á xente deste servidor enviar comparticións a grupos noutros servidores",
|
||||
"Allow people on this server to receive group shares from other servers" : "Permitirlle á xente deste servidor recibir comparticións de grupos desde outros servidores",
|
||||
"The lookup server is only available for global scale." : "O servidor de buscas só está dispoñíbel a escala global.",
|
||||
"Search global and public address book for people" : "Buscar persoas nos cadernos de enderezos globais e públicos",
|
||||
"Allow people to publish their data to a global and public address book" : "Permitirlle á xente publicar os seus datos nun caderno de enderezos global e público",
|
||||
"Trusted federation" : "Federación de confianza",
|
||||
"Automatically accept shares from trusted federated accounts and groups by default" : "Aceptar automaticamente os recursos compartidos de contas e grupos federados de confianza de xeito predeterminado",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Comparta comigo a través do meu ID de nube federada de #Nextcloud, vexa {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Comparta comigo a través do meu ID de nube federada de #Nextcloud",
|
||||
"Share with me via Nextcloud" : "Comparte comigo a través de Nextcloud",
|
||||
"Share with me via Nextcloud" : "Comparta comigo a través de Nextcloud",
|
||||
"Cloud ID copied" : "Copiado o ID da nube",
|
||||
"Copy" : "Copiar",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "O portapapeis non está dispoñíbel. Copie o ID da nube manualmente.",
|
||||
"Copied!" : "Copiado!",
|
||||
"Federated Cloud" : "Nube federada",
|
||||
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Pode compartir con calquera persoa que empregue servidores {productName}, ou outro servidor ou servizo compatíbel co Open Cloud Mesh (OCM)! Simplemente, introduza o seu ID de nube federada no diálogo de compartir. É algo como persona@cloud.example.com",
|
||||
"Your Federated Cloud ID" : "ID da súa nube federada",
|
||||
"Share it so your friends can share files with you:" : "Compártao para que as súas amizades poidan compartir ficheiros con Vde.:",
|
||||
"Facebook" : "Facebook",
|
||||
"X (formerly Twitter)" : "X (anteriormente Twitter).",
|
||||
"formerly Twitter" : "anteriormente Twitter",
|
||||
"Mastodon" : "Mastodon",
|
||||
"Bluesky" : "Bluesky",
|
||||
"Add to your website" : "Engadir ao seu sitio web",
|
||||
"Share with me via {productName}" : "Comparta comigo a través de {productName}",
|
||||
"HTML Code:" : "Código HTML:",
|
||||
"Cancel" : "Cancelar",
|
||||
"Add remote share" : "Engadir unha compartición remota",
|
||||
|
||||
@@ -21,30 +21,45 @@
|
||||
"Sharing" : "Compartindo",
|
||||
"Federated file sharing" : "Compartición federada de ficheiros",
|
||||
"Provide federated file sharing across servers" : "Fornece a compartición federada de ficheiros entre servidores",
|
||||
"Confirm data upload to lookup server" : "Confirmar o envío de datos ao servidor de busca",
|
||||
"When enabled, all account properties (e.g. email address) with scope visibility set to \"published\", will be automatically synced and transmitted to an external system and made available in a public, global address book." : "Cando está activado, todas as propiedades da conta (p. ex., o enderezo de correo-e) co ámbito de visibilidade definido en «publicado», sincronizaranse automaticamente e transmitiranse a un sistema externo e estarán dispoñíbeis nun caderno de enderezos público e global.",
|
||||
"Disable upload" : "Desactivar o envío",
|
||||
"Enable data upload" : "Activar o envío de datos",
|
||||
"Confirm querying lookup server" : "Confirmar a consulta ao servidor de buscas",
|
||||
"When enabled, the search input when creating shares will be sent to an external system that provides a public and global address book." : "Cando está activada, a entrada de busca ao crear comparticións enviarase a un sistema externo que fornece un caderno de enderezos público e global.",
|
||||
"This is used to retrieve the federated cloud ID to make federated sharing easier." : "Isto utilízase para recuperar o ID de nube federado para facilitar a compartición federada.",
|
||||
"Moreover, email addresses of users might be sent to that system in order to verify them." : "Ademais, poderánse enviar os enderezos de correo-e dos usuarios a ese sistema para verificalos.",
|
||||
"Disable querying" : "Desactivar a consulta",
|
||||
"Enable querying" : "Activar a consulta",
|
||||
"Unable to update federated files sharing config" : "Non é posíbel actualizar a configuración de uso compartido de ficheiros federados",
|
||||
"Adjust how people can share between servers. This includes shares between people on this server as well if they are using federated sharing." : "Axuste a forma como a xente pode compartir entre servidores. Isto inclúe tamén as comparticións entre persoas deste servidor se están a usaren a compartición federada.",
|
||||
"Allow people on this server to send shares to other servers (this option also allows WebDAV access to public shares)" : "Permitirlle á xente deste servidor enviar comparticións a outros servidores (esta opción tamén permite o acceso de WebDAV a comparticións públicas)",
|
||||
"Allow people on this server to receive shares from other servers" : "Permitirlle á xente deste servidor recibir comparticións doutros servidores",
|
||||
"Allow people on this server to send shares to groups on other servers" : "Permitirlle á xente deste servidor enviar comparticións a grupos noutros servidores",
|
||||
"Allow people on this server to receive group shares from other servers" : "Permitirlle á xente deste servidor recibir comparticións de grupos desde outros servidores",
|
||||
"The lookup server is only available for global scale." : "O servidor de buscas só está dispoñíbel a escala global.",
|
||||
"Search global and public address book for people" : "Buscar persoas nos cadernos de enderezos globais e públicos",
|
||||
"Allow people to publish their data to a global and public address book" : "Permitirlle á xente publicar os seus datos nun caderno de enderezos global e público",
|
||||
"Trusted federation" : "Federación de confianza",
|
||||
"Automatically accept shares from trusted federated accounts and groups by default" : "Aceptar automaticamente os recursos compartidos de contas e grupos federados de confianza de xeito predeterminado",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Comparta comigo a través do meu ID de nube federada de #Nextcloud, vexa {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Comparta comigo a través do meu ID de nube federada de #Nextcloud",
|
||||
"Share with me via Nextcloud" : "Comparte comigo a través de Nextcloud",
|
||||
"Share with me via Nextcloud" : "Comparta comigo a través de Nextcloud",
|
||||
"Cloud ID copied" : "Copiado o ID da nube",
|
||||
"Copy" : "Copiar",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "O portapapeis non está dispoñíbel. Copie o ID da nube manualmente.",
|
||||
"Copied!" : "Copiado!",
|
||||
"Federated Cloud" : "Nube federada",
|
||||
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Pode compartir con calquera persoa que empregue servidores {productName}, ou outro servidor ou servizo compatíbel co Open Cloud Mesh (OCM)! Simplemente, introduza o seu ID de nube federada no diálogo de compartir. É algo como persona@cloud.example.com",
|
||||
"Your Federated Cloud ID" : "ID da súa nube federada",
|
||||
"Share it so your friends can share files with you:" : "Compártao para que as súas amizades poidan compartir ficheiros con Vde.:",
|
||||
"Facebook" : "Facebook",
|
||||
"X (formerly Twitter)" : "X (anteriormente Twitter).",
|
||||
"formerly Twitter" : "anteriormente Twitter",
|
||||
"Mastodon" : "Mastodon",
|
||||
"Bluesky" : "Bluesky",
|
||||
"Add to your website" : "Engadir ao seu sitio web",
|
||||
"Share with me via {productName}" : "Comparta comigo a través de {productName}",
|
||||
"HTML Code:" : "Código HTML:",
|
||||
"Cancel" : "Cancelar",
|
||||
"Add remote share" : "Engadir unha compartición remota",
|
||||
|
||||
@@ -52,6 +52,7 @@ OC.L10N.register(
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Schowek niedostępny. Skopiuj identyfikator chmury ręcznie.",
|
||||
"Copied!" : "Skopiowano!",
|
||||
"Federated Cloud" : "Chmura Federacyjna",
|
||||
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Możesz udostępniać każdemu, kto korzysta z serwera {productName} lub innych serwerów i usług kompatybilnych z Open Cloud Mesh (OCM)! Wystarczy wpisać ich Federated Cloud ID w oknie dialogowym udostępniania. Wygląda to tak: person@cloud.example.com",
|
||||
"Your Federated Cloud ID" : "Twój Federowany identyfikator chmury",
|
||||
"Share it so your friends can share files with you:" : "Udostępnij, aby Twoi znajomi mogli udostępniać Tobie pliki:",
|
||||
"Facebook" : "Facebook",
|
||||
@@ -60,6 +61,7 @@ OC.L10N.register(
|
||||
"Mastodon" : "Mastodon",
|
||||
"Bluesky" : "Bluesky",
|
||||
"Add to your website" : "Dodaj do swojej strony",
|
||||
"Share with me via {productName}" : "Udostępnij mi przez {productName}",
|
||||
"HTML Code:" : "Kod HTML:",
|
||||
"Cancel" : "Anuluj",
|
||||
"Add remote share" : "Dodaj zdalne udostępnienie",
|
||||
|
||||
@@ -50,6 +50,7 @@
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Schowek niedostępny. Skopiuj identyfikator chmury ręcznie.",
|
||||
"Copied!" : "Skopiowano!",
|
||||
"Federated Cloud" : "Chmura Federacyjna",
|
||||
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Możesz udostępniać każdemu, kto korzysta z serwera {productName} lub innych serwerów i usług kompatybilnych z Open Cloud Mesh (OCM)! Wystarczy wpisać ich Federated Cloud ID w oknie dialogowym udostępniania. Wygląda to tak: person@cloud.example.com",
|
||||
"Your Federated Cloud ID" : "Twój Federowany identyfikator chmury",
|
||||
"Share it so your friends can share files with you:" : "Udostępnij, aby Twoi znajomi mogli udostępniać Tobie pliki:",
|
||||
"Facebook" : "Facebook",
|
||||
@@ -58,6 +59,7 @@
|
||||
"Mastodon" : "Mastodon",
|
||||
"Bluesky" : "Bluesky",
|
||||
"Add to your website" : "Dodaj do swojej strony",
|
||||
"Share with me via {productName}" : "Udostępnij mi przez {productName}",
|
||||
"HTML Code:" : "Kod HTML:",
|
||||
"Cancel" : "Anuluj",
|
||||
"Add remote share" : "Dodaj zdalne udostępnienie",
|
||||
|
||||
@@ -60,6 +60,7 @@ OC.L10N.register(
|
||||
"Mastodon" : "Mastodon",
|
||||
"Bluesky" : "Bluesky",
|
||||
"Add to your website" : "Adicione ao seu website",
|
||||
"Share with me via {productName}" : "Compartilhar comigo via {productName}",
|
||||
"HTML Code:" : "Código HTML:",
|
||||
"Cancel" : "Cancelar",
|
||||
"Add remote share" : "Adicionar compartilhamento remoto",
|
||||
|
||||
@@ -58,6 +58,7 @@
|
||||
"Mastodon" : "Mastodon",
|
||||
"Bluesky" : "Bluesky",
|
||||
"Add to your website" : "Adicione ao seu website",
|
||||
"Share with me via {productName}" : "Compartilhar comigo via {productName}",
|
||||
"HTML Code:" : "Código HTML:",
|
||||
"Cancel" : "Cancelar",
|
||||
"Add remote share" : "Adicionar compartilhamento remoto",
|
||||
|
||||
@@ -52,6 +52,7 @@ OC.L10N.register(
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Клипборд није доступан. Молимо вас да ручно копирате ID облака.",
|
||||
"Copied!" : "Копирано!",
|
||||
"Federated Cloud" : "Здружени облак",
|
||||
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Можете делите ствари са било ким ко користи {productName} сервер или неки други Open Cloud Mesh (OCM) компатибилни сервер и сервисе! Само унесите ИД из њиховог Здруженог Облака у дијалог за дељење. Тај ИД изгледа нешто попут person@cloud.example.com",
|
||||
"Your Federated Cloud ID" : "Ваш ИД Здруженог облака",
|
||||
"Share it so your friends can share files with you:" : "Поделите да би Ваши пријатељи могли да деле са Вама:",
|
||||
"Facebook" : "Фејсбук",
|
||||
@@ -60,6 +61,7 @@ OC.L10N.register(
|
||||
"Mastodon" : "Mastodon",
|
||||
"Bluesky" : "Bluesky",
|
||||
"Add to your website" : "Додај на свој веб сајт",
|
||||
"Share with me via {productName}" : "Дели са мном преко {productName}",
|
||||
"HTML Code:" : "ХТМЛ кôд:",
|
||||
"Cancel" : "Одустани",
|
||||
"Add remote share" : "Додај удаљено дељење",
|
||||
|
||||
@@ -50,6 +50,7 @@
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Клипборд није доступан. Молимо вас да ручно копирате ID облака.",
|
||||
"Copied!" : "Копирано!",
|
||||
"Federated Cloud" : "Здружени облак",
|
||||
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Можете делите ствари са било ким ко користи {productName} сервер или неки други Open Cloud Mesh (OCM) компатибилни сервер и сервисе! Само унесите ИД из њиховог Здруженог Облака у дијалог за дељење. Тај ИД изгледа нешто попут person@cloud.example.com",
|
||||
"Your Federated Cloud ID" : "Ваш ИД Здруженог облака",
|
||||
"Share it so your friends can share files with you:" : "Поделите да би Ваши пријатељи могли да деле са Вама:",
|
||||
"Facebook" : "Фејсбук",
|
||||
@@ -58,6 +59,7 @@
|
||||
"Mastodon" : "Mastodon",
|
||||
"Bluesky" : "Bluesky",
|
||||
"Add to your website" : "Додај на свој веб сајт",
|
||||
"Share with me via {productName}" : "Дели са мном преко {productName}",
|
||||
"HTML Code:" : "ХТМЛ кôд:",
|
||||
"Cancel" : "Одустани",
|
||||
"Add remote share" : "Додај удаљено дељење",
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user