diff options
115 files changed, 2146 insertions, 203 deletions
diff --git a/.gitignore b/.gitignore index 0811a12f44b..56095af8308 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,7 @@ !/apps/admin_audit !/apps/updatenotification !/apps/theming +!/apps/twofactor_backupcodes !/apps/workflowengine /apps/files_external/3rdparty/irodsphp/PHPUnitTest /apps/files_external/3rdparty/irodsphp/web diff --git a/apps/comments/l10n/el.js b/apps/comments/l10n/el.js index 297028adf74..36e1a643177 100644 --- a/apps/comments/l10n/el.js +++ b/apps/comments/l10n/el.js @@ -1,22 +1,24 @@ OC.L10N.register( "comments", { - "Type in a new comment..." : "Αυτό είναι ένα νέο σχόλιο...", "Delete comment" : "Διαγραφή σχολίου", "Post" : "Δημοσίευση", "Cancel" : "Άκυρο", "Edit comment" : "Επεξεργασία σχολίου", "[Deleted user]" : "[Διαγραφή χρήστη]", "Comments" : "Σχόλια", - "No other comments available" : "Δεν υπάρχουν άλλα διαθέσιμα σχόλια", - "More comments..." : "Περισσότερα σχόλια...", + "More comments …" : "Περισσότερα σχόλια ...", "Save" : "Αποθήκευση", "Allowed characters {count} of {max}" : "Επιτρεπόμενοι χαρακτήρες {count} από {max}", "{count} unread comments" : "{count} μη αναγνωσμένα σχόλια", "Comment" : "Σχόλιο", + "<strong>Comments</strong> for files" : "<strong>Σχόλια</strong> για αρχεία", "You commented" : "Σχολιάσατε", "%1$s commented" : "%1$s σχολίασε", "You commented on %2$s" : "Σχολιάσατε στο %2$s", - "%1$s commented on %2$s" : "%1$s σχολίασε στο %2$s" + "%1$s commented on %2$s" : "%1$s σχολίασε στο %2$s", + "Type in a new comment..." : "Αυτό είναι ένα νέο σχόλιο...", + "No other comments available" : "Δεν υπάρχουν άλλα διαθέσιμα σχόλια", + "More comments..." : "Περισσότερα σχόλια..." }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/comments/l10n/el.json b/apps/comments/l10n/el.json index df9977426aa..79af0f26238 100644 --- a/apps/comments/l10n/el.json +++ b/apps/comments/l10n/el.json @@ -1,20 +1,22 @@ { "translations": { - "Type in a new comment..." : "Αυτό είναι ένα νέο σχόλιο...", "Delete comment" : "Διαγραφή σχολίου", "Post" : "Δημοσίευση", "Cancel" : "Άκυρο", "Edit comment" : "Επεξεργασία σχολίου", "[Deleted user]" : "[Διαγραφή χρήστη]", "Comments" : "Σχόλια", - "No other comments available" : "Δεν υπάρχουν άλλα διαθέσιμα σχόλια", - "More comments..." : "Περισσότερα σχόλια...", + "More comments …" : "Περισσότερα σχόλια ...", "Save" : "Αποθήκευση", "Allowed characters {count} of {max}" : "Επιτρεπόμενοι χαρακτήρες {count} από {max}", "{count} unread comments" : "{count} μη αναγνωσμένα σχόλια", "Comment" : "Σχόλιο", + "<strong>Comments</strong> for files" : "<strong>Σχόλια</strong> για αρχεία", "You commented" : "Σχολιάσατε", "%1$s commented" : "%1$s σχολίασε", "You commented on %2$s" : "Σχολιάσατε στο %2$s", - "%1$s commented on %2$s" : "%1$s σχολίασε στο %2$s" + "%1$s commented on %2$s" : "%1$s σχολίασε στο %2$s", + "Type in a new comment..." : "Αυτό είναι ένα νέο σχόλιο...", + "No other comments available" : "Δεν υπάρχουν άλλα διαθέσιμα σχόλια", + "More comments..." : "Περισσότερα σχόλια..." },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/comments/l10n/es.js b/apps/comments/l10n/es.js index 9b37472825f..1c6ed7f06b5 100644 --- a/apps/comments/l10n/es.js +++ b/apps/comments/l10n/es.js @@ -1,12 +1,15 @@ OC.L10N.register( "comments", { + "New comment …" : "Comentario nuevo", "Delete comment" : "Borrar comentario", "Post" : "Publicar", "Cancel" : "Cancelar", "Edit comment" : "Editar comentario", "[Deleted user]" : "[Usuario eliminado]", "Comments" : "Comentarios", + "No comments yet, start the conversation!" : "¡No hay comentarios, empieza la conversación!", + "More comments …" : "Más comentarios ...", "Save" : "Guardar", "Allowed characters {count} of {max}" : "Caracteres permitidos {count} de {max}", "Error occurred while retrieving comment with id {id}" : "Se ha producido un error al recuperar el comentario con ID {id}", diff --git a/apps/comments/l10n/es.json b/apps/comments/l10n/es.json index 9d962ac361c..9a0ec8174bb 100644 --- a/apps/comments/l10n/es.json +++ b/apps/comments/l10n/es.json @@ -1,10 +1,13 @@ { "translations": { + "New comment …" : "Comentario nuevo", "Delete comment" : "Borrar comentario", "Post" : "Publicar", "Cancel" : "Cancelar", "Edit comment" : "Editar comentario", "[Deleted user]" : "[Usuario eliminado]", "Comments" : "Comentarios", + "No comments yet, start the conversation!" : "¡No hay comentarios, empieza la conversación!", + "More comments …" : "Más comentarios ...", "Save" : "Guardar", "Allowed characters {count} of {max}" : "Caracteres permitidos {count} de {max}", "Error occurred while retrieving comment with id {id}" : "Se ha producido un error al recuperar el comentario con ID {id}", diff --git a/apps/comments/l10n/it.js b/apps/comments/l10n/it.js index 25c824f901e..7316fd4d5c5 100644 --- a/apps/comments/l10n/it.js +++ b/apps/comments/l10n/it.js @@ -1,12 +1,15 @@ OC.L10N.register( "comments", { + "New comment …" : "Nuovo commento...", "Delete comment" : "Elimina commento", "Post" : "Commento", "Cancel" : "Annulla", "Edit comment" : "Modifica commento", "[Deleted user]" : "[Utente eliminato]", "Comments" : "Commenti", + "No comments yet, start the conversation!" : "Ancora nessun commento, inizia la conversazione!", + "More comments …" : "Altri commenti...", "Save" : "Salva", "Allowed characters {count} of {max}" : "Caratteri consentiti {count} di {max}", "Error occurred while retrieving comment with id {id}" : "Si è verificato un errore durante il tentativo di recupero del commento con id {id}", diff --git a/apps/comments/l10n/it.json b/apps/comments/l10n/it.json index 5234fa5616b..9f92743d865 100644 --- a/apps/comments/l10n/it.json +++ b/apps/comments/l10n/it.json @@ -1,10 +1,13 @@ { "translations": { + "New comment …" : "Nuovo commento...", "Delete comment" : "Elimina commento", "Post" : "Commento", "Cancel" : "Annulla", "Edit comment" : "Modifica commento", "[Deleted user]" : "[Utente eliminato]", "Comments" : "Commenti", + "No comments yet, start the conversation!" : "Ancora nessun commento, inizia la conversazione!", + "More comments …" : "Altri commenti...", "Save" : "Salva", "Allowed characters {count} of {max}" : "Caratteri consentiti {count} di {max}", "Error occurred while retrieving comment with id {id}" : "Si è verificato un errore durante il tentativo di recupero del commento con id {id}", diff --git a/apps/comments/l10n/nl.js b/apps/comments/l10n/nl.js index ea0b1002e29..d0ed4873a0c 100644 --- a/apps/comments/l10n/nl.js +++ b/apps/comments/l10n/nl.js @@ -1,12 +1,15 @@ OC.L10N.register( "comments", { + "New comment …" : "Nieuwe reactie ...", "Delete comment" : "Verwijder reactie", "Post" : "Reageer", "Cancel" : "Annuleren", "Edit comment" : "Bewerk reactie", "[Deleted user]" : "[Verwijderde gebruiker]", "Comments" : "Reacties", + "No comments yet, start the conversation!" : "Nog geen reacties, start de discussie!", + "More comments …" : "Meer reacties ...", "Save" : "Opslaan", "Allowed characters {count} of {max}" : "{count} van de {max} toegestane tekens", "Error occurred while retrieving comment with id {id}" : "Er trad een fout op bij het ophalen van reactie met id {id}", diff --git a/apps/comments/l10n/nl.json b/apps/comments/l10n/nl.json index 19d24c0af5f..5b2814e57ed 100644 --- a/apps/comments/l10n/nl.json +++ b/apps/comments/l10n/nl.json @@ -1,10 +1,13 @@ { "translations": { + "New comment …" : "Nieuwe reactie ...", "Delete comment" : "Verwijder reactie", "Post" : "Reageer", "Cancel" : "Annuleren", "Edit comment" : "Bewerk reactie", "[Deleted user]" : "[Verwijderde gebruiker]", "Comments" : "Reacties", + "No comments yet, start the conversation!" : "Nog geen reacties, start de discussie!", + "More comments …" : "Meer reacties ...", "Save" : "Opslaan", "Allowed characters {count} of {max}" : "{count} van de {max} toegestane tekens", "Error occurred while retrieving comment with id {id}" : "Er trad een fout op bij het ophalen van reactie met id {id}", diff --git a/apps/comments/l10n/pl.js b/apps/comments/l10n/pl.js index bf2ee9ee6c0..09cad54e57b 100644 --- a/apps/comments/l10n/pl.js +++ b/apps/comments/l10n/pl.js @@ -1,12 +1,15 @@ OC.L10N.register( "comments", { + "New comment …" : "Nowy komentarz ...", "Delete comment" : "Skasuj komentarz", "Post" : "Zapisz", "Cancel" : "Anuluj", "Edit comment" : "Edytuj komentarz", "[Deleted user]" : "[Usunięty użytkownik]", "Comments" : "Komentarze", + "No comments yet, start the conversation!" : "Brak komentarzy, zacznij konwersację!", + "More comments …" : "Więcej komentarzy ...", "Save" : "Zapisz", "Allowed characters {count} of {max}" : "Dozwolone znaki {count} z {max}", "Error occurred while retrieving comment with id {id}" : "W trakcie otrzymywania komentarza o identyfikatorze {id} wystąpił błąd.", @@ -14,6 +17,7 @@ OC.L10N.register( "Error occurred while posting comment" : "Podczas wysyłania komentarza wystąpił błąd", "{count} unread comments" : "{count} nieprzeczytanych komentarzy", "Comment" : "Komentarz", + "<strong>Comments</strong> for files" : "<strong>Komentarze</strong> dla plików", "You commented" : "Skomentowałeś/łaś", "%1$s commented" : "%1$s skomentował", "You commented on %2$s" : "Skomentowałeś/łaś %2$s", diff --git a/apps/comments/l10n/pl.json b/apps/comments/l10n/pl.json index c4ab08912d0..7a8a18fb61a 100644 --- a/apps/comments/l10n/pl.json +++ b/apps/comments/l10n/pl.json @@ -1,10 +1,13 @@ { "translations": { + "New comment …" : "Nowy komentarz ...", "Delete comment" : "Skasuj komentarz", "Post" : "Zapisz", "Cancel" : "Anuluj", "Edit comment" : "Edytuj komentarz", "[Deleted user]" : "[Usunięty użytkownik]", "Comments" : "Komentarze", + "No comments yet, start the conversation!" : "Brak komentarzy, zacznij konwersację!", + "More comments …" : "Więcej komentarzy ...", "Save" : "Zapisz", "Allowed characters {count} of {max}" : "Dozwolone znaki {count} z {max}", "Error occurred while retrieving comment with id {id}" : "W trakcie otrzymywania komentarza o identyfikatorze {id} wystąpił błąd.", @@ -12,6 +15,7 @@ "Error occurred while posting comment" : "Podczas wysyłania komentarza wystąpił błąd", "{count} unread comments" : "{count} nieprzeczytanych komentarzy", "Comment" : "Komentarz", + "<strong>Comments</strong> for files" : "<strong>Komentarze</strong> dla plików", "You commented" : "Skomentowałeś/łaś", "%1$s commented" : "%1$s skomentował", "You commented on %2$s" : "Skomentowałeś/łaś %2$s", diff --git a/apps/encryption/l10n/es.js b/apps/encryption/l10n/es.js index ec62739d193..80ea3fa4071 100644 --- a/apps/encryption/l10n/es.js +++ b/apps/encryption/l10n/es.js @@ -22,6 +22,9 @@ OC.L10N.register( "The current log-in password was not correct, please try again." : "La contraseña de inicio de sesión actual no es correcta, por favor inténtelo de nuevo.", "Private key password successfully updated." : "Contraseña de clave privada actualizada con éxito.", "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Necesita migrar sus claves de cifrado desde el antiguo modelo de cifrado (ownCloud <= 8.0) al nuevo. Por favor ejecute 'occ encryption:migrate' o contáctese con su administrador.", + "Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "La clave privada no es válida para la app de cifrado. Por favor, actualice la contraseña de su clave privada en sus ajustes personales para recuperar el acceso a sus archivos cifrados.", + "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "La app de cifrado está habilitada pero sus claves no se han inicializado, por favor, cierre la sesión y vuelva a iniciarla de nuevo.", + "Encryption app is enabled and ready" : "La app de cifrado esta habilitada y preparada", "Bad Signature" : "Firma errónea", "Missing Signature" : "No se encuentra la firma", "one-time password for server-side-encryption" : "Contraseña de un solo uso para el cifrado en el lado servidor", @@ -31,6 +34,7 @@ OC.L10N.register( "The share will expire on %s." : "El objeto dejará de ser compartido el %s.", "Cheers!" : "¡Saludos!", "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Hola,<br><br>el administrador ha activado el cifrado de datos en servidor. Tus archivos han sido cifrados usando la contraseña <strong>%s</strong>.<br><br>Por favor, inicia tu sesión desde la interfaz web, ves a la sección 'módulo de cifrado básico' de tu área de ajustes personales y actualiza la contraseña de cifrado. Para ello, deberás introducir esta contraseña en el campo 'contraseña de acceso antigua' junto con tu actual contraseña de acceso.<br><br>", + "Default encryption module" : "Módulo de cifrado por defecto", "Encrypt the home storage" : "Encriptar el almacenamiento personal", "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Al activar esta opción se encriptarán todos los archivos almacenados en la memoria principal, de lo contrario serán cifrados sólo los archivos de almacenamiento externo", "Enable recovery key" : "Activa la clave de recuperación", @@ -43,6 +47,7 @@ OC.L10N.register( "New recovery key password" : "Nueva contraseña de recuperación", "Repeat new recovery key password" : "Repita la nueva contraseña de recuperación", "Change Password" : "Cambiar contraseña", + "Basic encryption module" : "Módulo básico de cifrado", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "La app de cifrado está habilitada pero sus claves no se han inicializado, por favor, cierre la sesión y vuelva a iniciarla de nuevo.", "Your private key password no longer matches your log-in password." : "Su contraseña de clave privada ya no coincide con su contraseña de acceso.", "Set your old private key password to your current log-in password:" : "Establezca la contraseña de clave privada antigua para su contraseña de inicio de sesión actual:", @@ -53,6 +58,10 @@ OC.L10N.register( "Enable password recovery:" : "Habilitar la recuperación de contraseña:", "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Habilitar esta opción le permitirá volver a tener acceso a sus ficheros cifrados en caso de pérdida de contraseña", "Enabled" : "Habilitar", - "Disabled" : "Deshabilitado" + "Disabled" : "Deshabilitado", + "You need to migrate your encryption keys from the old encryption (Nextcloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Necesita migrar sus claves de cifrado desde el antiguo modelo de cifrado (Nextcloud <= 8.0) al nuevo. Por favor ejecute 'occ encryption:migrate' o contáctese con su administrador.", + "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "La clave privada no es válida para la app de cifrado. Por favor, actualice la contraseña de su clave privada en sus ajustes personales para recuperar el acceso a sus archivos cifrados.", + "Encryption App is enabled and ready" : "La app de cifrado esta habilitada y preparada", + "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'Nextcloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Hola,\n\nel administrador ha activado el cifrado de datos en servidor. Tus archivos han sido cifrados usando la contraseña '%s'.\n\nPor favor, inicia tu sesión desde la interfaz web, ve a la sección 'módulo de cifrado básico' de tu área de ajustes personales y actualiza la contraseña de cifrado. Para ello, deberás introducir esta contraseña en el campo 'contraseña de acceso antigua' junto con tu actual contraseña de acceso.\n\n" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/encryption/l10n/es.json b/apps/encryption/l10n/es.json index 23fd0149c37..5ddaaf806a8 100644 --- a/apps/encryption/l10n/es.json +++ b/apps/encryption/l10n/es.json @@ -20,6 +20,9 @@ "The current log-in password was not correct, please try again." : "La contraseña de inicio de sesión actual no es correcta, por favor inténtelo de nuevo.", "Private key password successfully updated." : "Contraseña de clave privada actualizada con éxito.", "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Necesita migrar sus claves de cifrado desde el antiguo modelo de cifrado (ownCloud <= 8.0) al nuevo. Por favor ejecute 'occ encryption:migrate' o contáctese con su administrador.", + "Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "La clave privada no es válida para la app de cifrado. Por favor, actualice la contraseña de su clave privada en sus ajustes personales para recuperar el acceso a sus archivos cifrados.", + "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "La app de cifrado está habilitada pero sus claves no se han inicializado, por favor, cierre la sesión y vuelva a iniciarla de nuevo.", + "Encryption app is enabled and ready" : "La app de cifrado esta habilitada y preparada", "Bad Signature" : "Firma errónea", "Missing Signature" : "No se encuentra la firma", "one-time password for server-side-encryption" : "Contraseña de un solo uso para el cifrado en el lado servidor", @@ -29,6 +32,7 @@ "The share will expire on %s." : "El objeto dejará de ser compartido el %s.", "Cheers!" : "¡Saludos!", "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Hola,<br><br>el administrador ha activado el cifrado de datos en servidor. Tus archivos han sido cifrados usando la contraseña <strong>%s</strong>.<br><br>Por favor, inicia tu sesión desde la interfaz web, ves a la sección 'módulo de cifrado básico' de tu área de ajustes personales y actualiza la contraseña de cifrado. Para ello, deberás introducir esta contraseña en el campo 'contraseña de acceso antigua' junto con tu actual contraseña de acceso.<br><br>", + "Default encryption module" : "Módulo de cifrado por defecto", "Encrypt the home storage" : "Encriptar el almacenamiento personal", "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Al activar esta opción se encriptarán todos los archivos almacenados en la memoria principal, de lo contrario serán cifrados sólo los archivos de almacenamiento externo", "Enable recovery key" : "Activa la clave de recuperación", @@ -41,6 +45,7 @@ "New recovery key password" : "Nueva contraseña de recuperación", "Repeat new recovery key password" : "Repita la nueva contraseña de recuperación", "Change Password" : "Cambiar contraseña", + "Basic encryption module" : "Módulo básico de cifrado", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "La app de cifrado está habilitada pero sus claves no se han inicializado, por favor, cierre la sesión y vuelva a iniciarla de nuevo.", "Your private key password no longer matches your log-in password." : "Su contraseña de clave privada ya no coincide con su contraseña de acceso.", "Set your old private key password to your current log-in password:" : "Establezca la contraseña de clave privada antigua para su contraseña de inicio de sesión actual:", @@ -51,6 +56,10 @@ "Enable password recovery:" : "Habilitar la recuperación de contraseña:", "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Habilitar esta opción le permitirá volver a tener acceso a sus ficheros cifrados en caso de pérdida de contraseña", "Enabled" : "Habilitar", - "Disabled" : "Deshabilitado" + "Disabled" : "Deshabilitado", + "You need to migrate your encryption keys from the old encryption (Nextcloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Necesita migrar sus claves de cifrado desde el antiguo modelo de cifrado (Nextcloud <= 8.0) al nuevo. Por favor ejecute 'occ encryption:migrate' o contáctese con su administrador.", + "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "La clave privada no es válida para la app de cifrado. Por favor, actualice la contraseña de su clave privada en sus ajustes personales para recuperar el acceso a sus archivos cifrados.", + "Encryption App is enabled and ready" : "La app de cifrado esta habilitada y preparada", + "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'Nextcloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Hola,\n\nel administrador ha activado el cifrado de datos en servidor. Tus archivos han sido cifrados usando la contraseña '%s'.\n\nPor favor, inicia tu sesión desde la interfaz web, ve a la sección 'módulo de cifrado básico' de tu área de ajustes personales y actualiza la contraseña de cifrado. Para ello, deberás introducir esta contraseña en el campo 'contraseña de acceso antigua' junto con tu actual contraseña de acceso.\n\n" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/encryption/l10n/ru.js b/apps/encryption/l10n/ru.js index ecaf3984da9..7fcda371f07 100644 --- a/apps/encryption/l10n/ru.js +++ b/apps/encryption/l10n/ru.js @@ -59,7 +59,7 @@ OC.L10N.register( "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Включение этой опции позволит вам получить доступ к своим зашифрованным файлам в случае утери пароля", "Enabled" : "Включено", "Disabled" : "Отключено", - "You need to migrate your encryption keys from the old encryption (Nextcloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Вам необходимо произвести конвертацию ключей шифрования из старого формата (NextCloud <= 8.0) в новый. Пожалуйста, запустите команду 'occ encryption:migrate' или обратитесь к администратору", + "You need to migrate your encryption keys from the old encryption (Nextcloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Вам необходимо произвести конвертацию ключей шифрования из старого формата (ownCloud <= 8.0) в новый. Пожалуйста, запустите команду 'occ encryption:migrate' или обратитесь к администратору", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Закрытый ключ приложения шифрования недействителен. Обновите закрытый ключ в личных настройках, чтобы восстановить доступ к зашифрованным файлам.", "Encryption App is enabled and ready" : "Приложение шифрования включено и готово к использованию", "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'Nextcloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Обратите внимание,\n\nадминистратор включил шифрование на стороне сервера. Ваши файлы были зашифрованы паролем '%s'.\n\nВойдите в веб-приложение, найдите в личных настройках раздел 'простой модуль шифрования Nextcloud' и обновите ваш пароль шифрования.\n\n", diff --git a/apps/encryption/l10n/ru.json b/apps/encryption/l10n/ru.json index 52ee7db423d..95f69c395a8 100644 --- a/apps/encryption/l10n/ru.json +++ b/apps/encryption/l10n/ru.json @@ -57,7 +57,7 @@ "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Включение этой опции позволит вам получить доступ к своим зашифрованным файлам в случае утери пароля", "Enabled" : "Включено", "Disabled" : "Отключено", - "You need to migrate your encryption keys from the old encryption (Nextcloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Вам необходимо произвести конвертацию ключей шифрования из старого формата (NextCloud <= 8.0) в новый. Пожалуйста, запустите команду 'occ encryption:migrate' или обратитесь к администратору", + "You need to migrate your encryption keys from the old encryption (Nextcloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Вам необходимо произвести конвертацию ключей шифрования из старого формата (ownCloud <= 8.0) в новый. Пожалуйста, запустите команду 'occ encryption:migrate' или обратитесь к администратору", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Закрытый ключ приложения шифрования недействителен. Обновите закрытый ключ в личных настройках, чтобы восстановить доступ к зашифрованным файлам.", "Encryption App is enabled and ready" : "Приложение шифрования включено и готово к использованию", "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'Nextcloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Обратите внимание,\n\nадминистратор включил шифрование на стороне сервера. Ваши файлы были зашифрованы паролем '%s'.\n\nВойдите в веб-приложение, найдите в личных настройках раздел 'простой модуль шифрования Nextcloud' и обновите ваш пароль шифрования.\n\n", diff --git a/apps/files/l10n/el.js b/apps/files/l10n/el.js index 6133adf35b7..89098182188 100644 --- a/apps/files/l10n/el.js +++ b/apps/files/l10n/el.js @@ -74,6 +74,7 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Favorited" : "Προτιμώμενα", "Favorite" : "Αγαπημένο", + "Local link" : "Τοπικός σύνδεσμος", "Folder" : "Φάκελος", "New folder" : "Νέος φάκελος", "{newname} already exists" : "το {newname} υπάρχει ήδη", diff --git a/apps/files/l10n/el.json b/apps/files/l10n/el.json index 002bf7ee9d3..8a05b0a0dfc 100644 --- a/apps/files/l10n/el.json +++ b/apps/files/l10n/el.json @@ -72,6 +72,7 @@ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Favorited" : "Προτιμώμενα", "Favorite" : "Αγαπημένο", + "Local link" : "Τοπικός σύνδεσμος", "Folder" : "Φάκελος", "New folder" : "Νέος φάκελος", "{newname} already exists" : "το {newname} υπάρχει ήδη", diff --git a/apps/files/l10n/es.js b/apps/files/l10n/es.js index d2fd386dc1c..20e98f05005 100644 --- a/apps/files/l10n/es.js +++ b/apps/files/l10n/es.js @@ -74,6 +74,7 @@ OC.L10N.register( "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"], "_%n file_::_%n files_" : ["%n archivo","%n archivos"], "{dirs} and {files}" : "{dirs} y {files}", + "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos"], "You don’t have permission to upload or create files here" : "No tiene permisos para subir o crear archivos aquí.", "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Subiendo %n archivos"], "New" : "Nuevo", @@ -132,6 +133,8 @@ OC.L10N.register( "No favorites" : "No hay favoritos", "Files and folders you mark as favorite will show up here" : "Aquí aparecerán los archivos y carpetas que usted marque como favoritos", "Text file" : "Archivo de texto", - "New text file.txt" : "Nuevo archivo de texto.txt" + "New text file.txt" : "Nuevo archivo de texto.txt", + "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Use esta direccioń para <a href=\"%s\" target=\"_blank\">acceder a sus archivos vía WebDAV<a>", + "Cancel upload" : "Cancelar la subida" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/es.json b/apps/files/l10n/es.json index fec818805a9..4071f5d6cc0 100644 --- a/apps/files/l10n/es.json +++ b/apps/files/l10n/es.json @@ -72,6 +72,7 @@ "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"], "_%n file_::_%n files_" : ["%n archivo","%n archivos"], "{dirs} and {files}" : "{dirs} y {files}", + "_including %n hidden_::_including %n hidden_" : ["incluyendo %n oculto","incluyendo %n ocultos"], "You don’t have permission to upload or create files here" : "No tiene permisos para subir o crear archivos aquí.", "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Subiendo %n archivos"], "New" : "Nuevo", @@ -130,6 +131,8 @@ "No favorites" : "No hay favoritos", "Files and folders you mark as favorite will show up here" : "Aquí aparecerán los archivos y carpetas que usted marque como favoritos", "Text file" : "Archivo de texto", - "New text file.txt" : "Nuevo archivo de texto.txt" + "New text file.txt" : "Nuevo archivo de texto.txt", + "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Use esta direccioń para <a href=\"%s\" target=\"_blank\">acceder a sus archivos vía WebDAV<a>", + "Cancel upload" : "Cancelar la subida" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/fi_FI.js b/apps/files/l10n/fi_FI.js index 8bf1c47612a..311b8bed02c 100644 --- a/apps/files/l10n/fi_FI.js +++ b/apps/files/l10n/fi_FI.js @@ -21,6 +21,7 @@ OC.L10N.register( "Invalid directory." : "Virheellinen kansio.", "Files" : "Tiedostot", "All files" : "Kaikki tiedostot", + "Recent" : "Viimeaikaiset", "File could not be found" : "TIedostoa ei löytynyt", "Home" : "Koti", "Close" : "Sulje", @@ -33,6 +34,11 @@ OC.L10N.register( "Could not get result from server." : "Tuloksien saaminen palvelimelta ei onnistunut.", "Uploading..." : "Lähetetään...", "..." : "...", + "{hours}:{minutes}:{seconds} hour{plural_s} left" : "{hours}:{minutes}:{seconds} jäljellä", + "{hours}:{minutes}h" : "{hours}h {minutes}m", + "{minutes}:{seconds} minute{plural_s} left" : "{minutes}m {seconds}s jäljellä", + "{minutes}:{seconds}m" : "{minutes}m {seconds}s", + "{seconds} second{plural_s} left" : "{seconds}s jäljellä", "{seconds}s" : "{seconds} s", "Any moment now..." : "Minä tahansa hetkenä...", "Soon..." : "Pian...", @@ -68,6 +74,7 @@ OC.L10N.register( "_%n folder_::_%n folders_" : ["%n kansio","%n kansiota"], "_%n file_::_%n files_" : ["%n tiedosto","%n tiedostoa"], "{dirs} and {files}" : "{dirs} ja {files}", + "_including %n hidden_::_including %n hidden_" : ["Sisältäen %n piilotetun","Sisältäen %n piilotettua"], "You don’t have permission to upload or create files here" : "Käyttöoikeutesi eivät riitä tiedostojen lähettämiseen tai kansioiden luomiseen tähän sijaintiin", "_Uploading %n file_::_Uploading %n files_" : ["Lähetetään %n tiedosto","Lähetetään %n tiedostoa"], "New" : "Uusi", @@ -78,6 +85,7 @@ OC.L10N.register( "Storage of {owner} is almost full ({usedSpacePercent}%)" : "Käyttäjän {owner} tallennustila on melkein täynnä ({usedSpacePercent} %)", "Your storage is almost full ({usedSpacePercent}%)" : "Tallennustila on melkein loppu ({usedSpacePercent}%)", "_matches '{filter}'_::_match '{filter}'_" : ["vastaa '{filter}'","vastaa '{filter}'"], + "View in folder" : "Näe kansiossa", "Path" : "Polku", "_%n byte_::_%n bytes_" : ["%n tavu","%n tavua"], "Favorited" : "Lisätty suosikkeihin", @@ -125,6 +133,8 @@ OC.L10N.register( "No favorites" : "Ei suosikkeja", "Files and folders you mark as favorite will show up here" : "Suosikeiksi merkitsemäsi tiedostot ja kansiot näkyvät täällä", "Text file" : "Tekstitiedosto", - "New text file.txt" : "Uusi tekstitiedosto.txt" + "New text file.txt" : "Uusi tekstitiedosto.txt", + "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Käytä tätä osoitetta <a href=\"%s\" target=\"_blank\">käyttääksesi tiedostojasi WebDAV:n yli</a>", + "Cancel upload" : "Peru lähetys" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/fi_FI.json b/apps/files/l10n/fi_FI.json index dc8d168ffb5..f0793950846 100644 --- a/apps/files/l10n/fi_FI.json +++ b/apps/files/l10n/fi_FI.json @@ -19,6 +19,7 @@ "Invalid directory." : "Virheellinen kansio.", "Files" : "Tiedostot", "All files" : "Kaikki tiedostot", + "Recent" : "Viimeaikaiset", "File could not be found" : "TIedostoa ei löytynyt", "Home" : "Koti", "Close" : "Sulje", @@ -31,6 +32,11 @@ "Could not get result from server." : "Tuloksien saaminen palvelimelta ei onnistunut.", "Uploading..." : "Lähetetään...", "..." : "...", + "{hours}:{minutes}:{seconds} hour{plural_s} left" : "{hours}:{minutes}:{seconds} jäljellä", + "{hours}:{minutes}h" : "{hours}h {minutes}m", + "{minutes}:{seconds} minute{plural_s} left" : "{minutes}m {seconds}s jäljellä", + "{minutes}:{seconds}m" : "{minutes}m {seconds}s", + "{seconds} second{plural_s} left" : "{seconds}s jäljellä", "{seconds}s" : "{seconds} s", "Any moment now..." : "Minä tahansa hetkenä...", "Soon..." : "Pian...", @@ -66,6 +72,7 @@ "_%n folder_::_%n folders_" : ["%n kansio","%n kansiota"], "_%n file_::_%n files_" : ["%n tiedosto","%n tiedostoa"], "{dirs} and {files}" : "{dirs} ja {files}", + "_including %n hidden_::_including %n hidden_" : ["Sisältäen %n piilotetun","Sisältäen %n piilotettua"], "You don’t have permission to upload or create files here" : "Käyttöoikeutesi eivät riitä tiedostojen lähettämiseen tai kansioiden luomiseen tähän sijaintiin", "_Uploading %n file_::_Uploading %n files_" : ["Lähetetään %n tiedosto","Lähetetään %n tiedostoa"], "New" : "Uusi", @@ -76,6 +83,7 @@ "Storage of {owner} is almost full ({usedSpacePercent}%)" : "Käyttäjän {owner} tallennustila on melkein täynnä ({usedSpacePercent} %)", "Your storage is almost full ({usedSpacePercent}%)" : "Tallennustila on melkein loppu ({usedSpacePercent}%)", "_matches '{filter}'_::_match '{filter}'_" : ["vastaa '{filter}'","vastaa '{filter}'"], + "View in folder" : "Näe kansiossa", "Path" : "Polku", "_%n byte_::_%n bytes_" : ["%n tavu","%n tavua"], "Favorited" : "Lisätty suosikkeihin", @@ -123,6 +131,8 @@ "No favorites" : "Ei suosikkeja", "Files and folders you mark as favorite will show up here" : "Suosikeiksi merkitsemäsi tiedostot ja kansiot näkyvät täällä", "Text file" : "Tekstitiedosto", - "New text file.txt" : "Uusi tekstitiedosto.txt" + "New text file.txt" : "Uusi tekstitiedosto.txt", + "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Käytä tätä osoitetta <a href=\"%s\" target=\"_blank\">käyttääksesi tiedostojasi WebDAV:n yli</a>", + "Cancel upload" : "Peru lähetys" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/it.js b/apps/files/l10n/it.js index 3865d5861a2..5f0fe1d98d0 100644 --- a/apps/files/l10n/it.js +++ b/apps/files/l10n/it.js @@ -74,6 +74,7 @@ OC.L10N.register( "_%n folder_::_%n folders_" : ["%n cartella","%n cartelle"], "_%n file_::_%n files_" : ["%n file","%n file"], "{dirs} and {files}" : "{dirs} e {files}", + "_including %n hidden_::_including %n hidden_" : ["incluso %n nascosto","inclusi %n nascosti"], "You don’t have permission to upload or create files here" : "Qui non hai i permessi di caricare o creare file", "_Uploading %n file_::_Uploading %n files_" : ["Caricamento di %n file in corso","Caricamento di %n file in corso"], "New" : "Nuovo", diff --git a/apps/files/l10n/it.json b/apps/files/l10n/it.json index a37bc1d5ce7..60d87046bf8 100644 --- a/apps/files/l10n/it.json +++ b/apps/files/l10n/it.json @@ -72,6 +72,7 @@ "_%n folder_::_%n folders_" : ["%n cartella","%n cartelle"], "_%n file_::_%n files_" : ["%n file","%n file"], "{dirs} and {files}" : "{dirs} e {files}", + "_including %n hidden_::_including %n hidden_" : ["incluso %n nascosto","inclusi %n nascosti"], "You don’t have permission to upload or create files here" : "Qui non hai i permessi di caricare o creare file", "_Uploading %n file_::_Uploading %n files_" : ["Caricamento di %n file in corso","Caricamento di %n file in corso"], "New" : "Nuovo", diff --git a/apps/files/l10n/lv.js b/apps/files/l10n/lv.js index 9ee86a77bae..587d2406fb3 100644 --- a/apps/files/l10n/lv.js +++ b/apps/files/l10n/lv.js @@ -27,7 +27,7 @@ OC.L10N.register( "Close" : "Aizvērt", "Favorites" : "Iecienītie", "Upload cancelled." : "Augšupielāde ir atcelta.", - "Unable to upload {filename} as it is a directory or has 0 bytes" : "Neizdodas augšupielādēt {filename}, jo tā ir vai nu mape vai 0 baitu saturošs fails.", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "Neizdodas augšupielādēt {filename}, jo tā ir vai nu mape vai 0 baitu saturoša datne.", "Total file size {size1} exceeds upload limit {size2}" : "Kopējais datnes izmērs {size1} pārsniedz augšupielādes ierobežojumu {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nav pietiekami daudz brīvas vietas. Tiek augšupielādēti {size1}, bet pieejami tikai {size2}", "Error uploading file \"{fileName}\": {message}" : "Kļūda augšupielādējot datni \"{fileName}\": {message}", @@ -72,7 +72,7 @@ OC.L10N.register( "Size" : "Izmērs", "Modified" : "Mainīts", "_%n folder_::_%n folders_" : ["%n mapes","%n mape","%n mapes"], - "_%n file_::_%n files_" : ["%n faili","%n fails","%n datnes"], + "_%n file_::_%n files_" : ["%n datnes","%n datne","%n datnes"], "{dirs} and {files}" : "{dirs} un {files}", "You don’t have permission to upload or create files here" : "Jums nav tiesību šeit augšupielādēt vai veidot datnes", "_Uploading %n file_::_Uploading %n files_" : ["%n","Augšupielāde %n failu","Augšupielādē %n datnes"], diff --git a/apps/files/l10n/lv.json b/apps/files/l10n/lv.json index 1c29a92f11f..3d6eaa8635e 100644 --- a/apps/files/l10n/lv.json +++ b/apps/files/l10n/lv.json @@ -25,7 +25,7 @@ "Close" : "Aizvērt", "Favorites" : "Iecienītie", "Upload cancelled." : "Augšupielāde ir atcelta.", - "Unable to upload {filename} as it is a directory or has 0 bytes" : "Neizdodas augšupielādēt {filename}, jo tā ir vai nu mape vai 0 baitu saturošs fails.", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "Neizdodas augšupielādēt {filename}, jo tā ir vai nu mape vai 0 baitu saturoša datne.", "Total file size {size1} exceeds upload limit {size2}" : "Kopējais datnes izmērs {size1} pārsniedz augšupielādes ierobežojumu {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nav pietiekami daudz brīvas vietas. Tiek augšupielādēti {size1}, bet pieejami tikai {size2}", "Error uploading file \"{fileName}\": {message}" : "Kļūda augšupielādējot datni \"{fileName}\": {message}", @@ -70,7 +70,7 @@ "Size" : "Izmērs", "Modified" : "Mainīts", "_%n folder_::_%n folders_" : ["%n mapes","%n mape","%n mapes"], - "_%n file_::_%n files_" : ["%n faili","%n fails","%n datnes"], + "_%n file_::_%n files_" : ["%n datnes","%n datne","%n datnes"], "{dirs} and {files}" : "{dirs} un {files}", "You don’t have permission to upload or create files here" : "Jums nav tiesību šeit augšupielādēt vai veidot datnes", "_Uploading %n file_::_Uploading %n files_" : ["%n","Augšupielāde %n failu","Augšupielādē %n datnes"], diff --git a/apps/files/l10n/nl.js b/apps/files/l10n/nl.js index 9839ff65442..04dcb4ef7e9 100644 --- a/apps/files/l10n/nl.js +++ b/apps/files/l10n/nl.js @@ -74,6 +74,7 @@ OC.L10N.register( "_%n folder_::_%n folders_" : ["%n map","%n mappen"], "_%n file_::_%n files_" : ["%n bestand","%n bestanden"], "{dirs} and {files}" : "{dirs} en {files}", + "_including %n hidden_::_including %n hidden_" : ["inclusief %n verborgen","inclusief %n verborgen"], "You don’t have permission to upload or create files here" : "Je hebt geen toestemming om hier te uploaden of bestanden te maken", "_Uploading %n file_::_Uploading %n files_" : ["%n bestand aan het uploaden","%n bestanden aan het uploaden"], "New" : "Nieuw", diff --git a/apps/files/l10n/nl.json b/apps/files/l10n/nl.json index ba7b5ac2d31..575b24a7dfc 100644 --- a/apps/files/l10n/nl.json +++ b/apps/files/l10n/nl.json @@ -72,6 +72,7 @@ "_%n folder_::_%n folders_" : ["%n map","%n mappen"], "_%n file_::_%n files_" : ["%n bestand","%n bestanden"], "{dirs} and {files}" : "{dirs} en {files}", + "_including %n hidden_::_including %n hidden_" : ["inclusief %n verborgen","inclusief %n verborgen"], "You don’t have permission to upload or create files here" : "Je hebt geen toestemming om hier te uploaden of bestanden te maken", "_Uploading %n file_::_Uploading %n files_" : ["%n bestand aan het uploaden","%n bestanden aan het uploaden"], "New" : "Nieuw", diff --git a/apps/files/l10n/pl.js b/apps/files/l10n/pl.js index c5273a36ebd..1a76a26a611 100644 --- a/apps/files/l10n/pl.js +++ b/apps/files/l10n/pl.js @@ -129,6 +129,8 @@ OC.L10N.register( "No favorites" : "Brak ulubionych", "Files and folders you mark as favorite will show up here" : "Pliki i katalogi, które oznaczysz jako ulubione wyświetlą się tutaj", "Text file" : "Plik tekstowy", - "New text file.txt" : "Nowy plik tekstowy.txt" + "New text file.txt" : "Nowy plik tekstowy.txt", + "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Użyj tego adresu aby uzyskać <a href=\"%s\" target=\"_blank\">dostęp do swoich plików poprzez WebDAV</a>", + "Cancel upload" : "Anuluj wysyłanie" }, "nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/files/l10n/pl.json b/apps/files/l10n/pl.json index c0be569faf6..c796422750d 100644 --- a/apps/files/l10n/pl.json +++ b/apps/files/l10n/pl.json @@ -127,6 +127,8 @@ "No favorites" : "Brak ulubionych", "Files and folders you mark as favorite will show up here" : "Pliki i katalogi, które oznaczysz jako ulubione wyświetlą się tutaj", "Text file" : "Plik tekstowy", - "New text file.txt" : "Nowy plik tekstowy.txt" + "New text file.txt" : "Nowy plik tekstowy.txt", + "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Użyj tego adresu aby uzyskać <a href=\"%s\" target=\"_blank\">dostęp do swoich plików poprzez WebDAV</a>", + "Cancel upload" : "Anuluj wysyłanie" },"pluralForm" :"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" }
\ No newline at end of file diff --git a/apps/files/l10n/pt_BR.js b/apps/files/l10n/pt_BR.js index ce548569f27..c5c8ca9eb38 100644 --- a/apps/files/l10n/pt_BR.js +++ b/apps/files/l10n/pt_BR.js @@ -74,6 +74,7 @@ OC.L10N.register( "_%n folder_::_%n folders_" : ["%n pasta","%n pastas"], "_%n file_::_%n files_" : ["%n arquivo","%n arquivos"], "{dirs} and {files}" : "{dirs} e {files}", + "_including %n hidden_::_including %n hidden_" : ["incluindo %n escondido","incluindo %n escondidos"], "You don’t have permission to upload or create files here" : "Você não tem permissão para enviar ou criar arquivos aqui", "_Uploading %n file_::_Uploading %n files_" : ["Enviando %n arquivo","Enviando %n arquivos"], "New" : "Novo", diff --git a/apps/files/l10n/pt_BR.json b/apps/files/l10n/pt_BR.json index 8320e0dd0f4..e31b837c110 100644 --- a/apps/files/l10n/pt_BR.json +++ b/apps/files/l10n/pt_BR.json @@ -72,6 +72,7 @@ "_%n folder_::_%n folders_" : ["%n pasta","%n pastas"], "_%n file_::_%n files_" : ["%n arquivo","%n arquivos"], "{dirs} and {files}" : "{dirs} e {files}", + "_including %n hidden_::_including %n hidden_" : ["incluindo %n escondido","incluindo %n escondidos"], "You don’t have permission to upload or create files here" : "Você não tem permissão para enviar ou criar arquivos aqui", "_Uploading %n file_::_Uploading %n files_" : ["Enviando %n arquivo","Enviando %n arquivos"], "New" : "Novo", diff --git a/apps/files/l10n/ru.js b/apps/files/l10n/ru.js index 8f04e746dab..b8bf81d6d17 100644 --- a/apps/files/l10n/ru.js +++ b/apps/files/l10n/ru.js @@ -21,7 +21,7 @@ OC.L10N.register( "Invalid directory." : "Неверный каталог.", "Files" : "Файлы", "All files" : "Все файлы", - "Recent" : "Недавний", + "Recent" : "Недавние", "File could not be found" : "Файл не может быть найден", "Home" : "Главная", "Close" : "Закрыть", diff --git a/apps/files/l10n/ru.json b/apps/files/l10n/ru.json index f2e6f653c32..0f9c9be81a7 100644 --- a/apps/files/l10n/ru.json +++ b/apps/files/l10n/ru.json @@ -19,7 +19,7 @@ "Invalid directory." : "Неверный каталог.", "Files" : "Файлы", "All files" : "Все файлы", - "Recent" : "Недавний", + "Recent" : "Недавние", "File could not be found" : "Файл не может быть найден", "Home" : "Главная", "Close" : "Закрыть", diff --git a/apps/files_external/l10n/fi_FI.js b/apps/files_external/l10n/fi_FI.js index a150e36f189..6fd0f87cf05 100644 --- a/apps/files_external/l10n/fi_FI.js +++ b/apps/files_external/l10n/fi_FI.js @@ -41,6 +41,8 @@ OC.L10N.register( "Not permitted to use backend \"%s\"" : "Ei lupaa käyttää tietovarastoa \"%s\"", "Unsatisfied backend parameters" : "Riittämättömät tietovaraston parametrit", "%s" : "%s", + "Access key" : "Pääsyavain", + "Secret key" : "Salainen avain", "Builtin" : "Sisäänrakennettu", "None" : "Ei mitään", "OAuth1" : "OAuth1", @@ -50,10 +52,12 @@ OC.L10N.register( "Client ID" : "Asiakkaan tunniste", "Client secret" : "Asiakassalaisuus", "OpenStack" : "OpenStack", + "Tenant name" : "Tenant nimi", "Rackspace" : "Rackspace", "API key" : "API-avain", "Username and password" : "Käyttäjätunnus ja salasana", "Log-in credentials, save in session" : "Kirjautumistiedot, tallenna istuntoon", + "User entered, store in database" : "Käyttäjän antama, tallennettu tietokantaan", "RSA public key" : "Julkinen RSA-avain", "Public key" : "Julkinen avain", "Amazon S3" : "Amazon S3", @@ -71,15 +75,19 @@ OC.L10N.register( "Google Drive" : "Google Drive", "Local" : "Paikallinen", "Location" : "Sijainti", + "Nextcloud" : "Nextcloud", "SFTP" : "SFTP", + "Root" : "Juurihakemisto", "SFTP with secret key login" : "SFTP salaisen avaimen kirjautumisella", "SMB / CIFS" : "SMB / CIFS", "Share" : "Jaa", + "Domain" : "Domaini", "SMB / CIFS using OC login" : "SMB / CIFS käyttäen OC-kirjautumista", "Username as share" : "Käyttäjänimi jakona", "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "Palvelun nimi", "Request timeout (seconds)" : "Pyynnön aikakatkaisu (sekunneissa)", + "External storages" : "Ulkoiset tallennustilat", "No external storage configured" : "Erillistä tallennustilaa ei ole määritetty", "You can add external storages in the personal settings" : "Voit lisätä erillisiä tallennustiloja henkilökohtaisista asetuksistasi", "Name" : "Nimi", @@ -99,6 +107,7 @@ OC.L10N.register( "Delete" : "Poista", "Allow users to mount external storage" : "Salli käyttäjien liittää erillisiä tallennustiloja", "Allow users to mount the following external storage" : "Salli käyttäjien liittää seuraavat erilliset tallennusvälineet", + "Access granted" : "Pääsy myönnetty", "ownCloud" : "ownCloud", "<b>Note:</b> " : "<b>Huomio:</b> ", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Huomio:</b> PHP:n cURL-tuki ei ole käytössä tai sitä ei ole asennettu. Kohteen %s liittäminen ei ole mahdollista. Pyydä järjestelmän ylläpitäjää ottamaan cURL-tuki käyttöön.", diff --git a/apps/files_external/l10n/fi_FI.json b/apps/files_external/l10n/fi_FI.json index ef40aff4ba2..3d2d63cff15 100644 --- a/apps/files_external/l10n/fi_FI.json +++ b/apps/files_external/l10n/fi_FI.json @@ -39,6 +39,8 @@ "Not permitted to use backend \"%s\"" : "Ei lupaa käyttää tietovarastoa \"%s\"", "Unsatisfied backend parameters" : "Riittämättömät tietovaraston parametrit", "%s" : "%s", + "Access key" : "Pääsyavain", + "Secret key" : "Salainen avain", "Builtin" : "Sisäänrakennettu", "None" : "Ei mitään", "OAuth1" : "OAuth1", @@ -48,10 +50,12 @@ "Client ID" : "Asiakkaan tunniste", "Client secret" : "Asiakassalaisuus", "OpenStack" : "OpenStack", + "Tenant name" : "Tenant nimi", "Rackspace" : "Rackspace", "API key" : "API-avain", "Username and password" : "Käyttäjätunnus ja salasana", "Log-in credentials, save in session" : "Kirjautumistiedot, tallenna istuntoon", + "User entered, store in database" : "Käyttäjän antama, tallennettu tietokantaan", "RSA public key" : "Julkinen RSA-avain", "Public key" : "Julkinen avain", "Amazon S3" : "Amazon S3", @@ -69,15 +73,19 @@ "Google Drive" : "Google Drive", "Local" : "Paikallinen", "Location" : "Sijainti", + "Nextcloud" : "Nextcloud", "SFTP" : "SFTP", + "Root" : "Juurihakemisto", "SFTP with secret key login" : "SFTP salaisen avaimen kirjautumisella", "SMB / CIFS" : "SMB / CIFS", "Share" : "Jaa", + "Domain" : "Domaini", "SMB / CIFS using OC login" : "SMB / CIFS käyttäen OC-kirjautumista", "Username as share" : "Käyttäjänimi jakona", "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "Palvelun nimi", "Request timeout (seconds)" : "Pyynnön aikakatkaisu (sekunneissa)", + "External storages" : "Ulkoiset tallennustilat", "No external storage configured" : "Erillistä tallennustilaa ei ole määritetty", "You can add external storages in the personal settings" : "Voit lisätä erillisiä tallennustiloja henkilökohtaisista asetuksistasi", "Name" : "Nimi", @@ -97,6 +105,7 @@ "Delete" : "Poista", "Allow users to mount external storage" : "Salli käyttäjien liittää erillisiä tallennustiloja", "Allow users to mount the following external storage" : "Salli käyttäjien liittää seuraavat erilliset tallennusvälineet", + "Access granted" : "Pääsy myönnetty", "ownCloud" : "ownCloud", "<b>Note:</b> " : "<b>Huomio:</b> ", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Huomio:</b> PHP:n cURL-tuki ei ole käytössä tai sitä ei ole asennettu. Kohteen %s liittäminen ei ole mahdollista. Pyydä järjestelmän ylläpitäjää ottamaan cURL-tuki käyttöön.", diff --git a/apps/files_external/l10n/it.js b/apps/files_external/l10n/it.js index 597e547fea5..f3e8043a259 100644 --- a/apps/files_external/l10n/it.js +++ b/apps/files_external/l10n/it.js @@ -90,6 +90,7 @@ OC.L10N.register( "Google Drive" : "Google Drive", "Local" : "Locale", "Location" : "Posizione", + "Nextcloud" : "Nextcloud", "SFTP" : "SFTP", "Root" : "Radice", "SFTP with secret key login" : "SFTP con accesso a chiave segreta", diff --git a/apps/files_external/l10n/it.json b/apps/files_external/l10n/it.json index 5b7bdb20d1f..5338289f6fa 100644 --- a/apps/files_external/l10n/it.json +++ b/apps/files_external/l10n/it.json @@ -88,6 +88,7 @@ "Google Drive" : "Google Drive", "Local" : "Locale", "Location" : "Posizione", + "Nextcloud" : "Nextcloud", "SFTP" : "SFTP", "Root" : "Radice", "SFTP with secret key login" : "SFTP con accesso a chiave segreta", diff --git a/apps/files_external/l10n/nl.js b/apps/files_external/l10n/nl.js index 8f3f4c4f9d7..3e30a77e1a2 100644 --- a/apps/files_external/l10n/nl.js +++ b/apps/files_external/l10n/nl.js @@ -90,6 +90,7 @@ OC.L10N.register( "Google Drive" : "Google Drive", "Local" : "Lokaal", "Location" : "Locatie", + "Nextcloud" : "Nextcloud", "SFTP" : "SFTP", "Root" : "Root", "SFTP with secret key login" : "SFTP met geheime sleutel inlog", diff --git a/apps/files_external/l10n/nl.json b/apps/files_external/l10n/nl.json index e9cff921256..4938c4ac3fe 100644 --- a/apps/files_external/l10n/nl.json +++ b/apps/files_external/l10n/nl.json @@ -88,6 +88,7 @@ "Google Drive" : "Google Drive", "Local" : "Lokaal", "Location" : "Locatie", + "Nextcloud" : "Nextcloud", "SFTP" : "SFTP", "Root" : "Root", "SFTP with secret key login" : "SFTP met geheime sleutel inlog", diff --git a/apps/files_external/l10n/pt_BR.js b/apps/files_external/l10n/pt_BR.js index 046164d9fbb..57a9442833d 100644 --- a/apps/files_external/l10n/pt_BR.js +++ b/apps/files_external/l10n/pt_BR.js @@ -65,6 +65,7 @@ OC.L10N.register( "Identity endpoint URL" : "Identidade pontofinal URL", "Rackspace" : "Espaço em rack", "API key" : "Chave API", + "Global credentials" : "Credenciais globais", "Log-in credentials, save in database" : "Credenciais de acesso, salvas no banco de dados", "Username and password" : "Nome de Usuário e senha", "Log-in credentials, save in session" : "Credenciais de login, guardados em sessão", @@ -89,6 +90,7 @@ OC.L10N.register( "Google Drive" : "Google Drive", "Local" : "Local", "Location" : "Localização", + "Nextcloud" : "Nextcloud", "SFTP" : "SFTP", "Root" : "Raiz", "SFTP with secret key login" : "SFTP com chave secreta de login", @@ -100,6 +102,10 @@ OC.L10N.register( "OpenStack Object Storage" : "Armazenamento de Objetos OpenStack", "Service name" : "Nome do serviço", "Request timeout (seconds)" : "Tempo esgotado requerido (segundos)", + "External storages" : "Armazenamentos externo", + "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "O suporte a cURL no PHP não está habilitado ou instalado. Montagem de %s não é possível. Por favor, solicite ao seu administrador do sistema instalá-lo.", + "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "O suporte a FTP no PHP não está habilitado ou instalado. Montagem de %s não é possível. Por favor, psolicite ao seu administrador do sistema instalá-lo.", + "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" não está instalado. Montagem de %s não é possível. Por favor, solicite ao seu administrador do sistema instalá-lo.", "No external storage configured" : "Nenhum armazendo externo foi configurado", "You can add external storages in the personal settings" : "Você pode adicionar armazenamentos externos nas configurações pessoais", "Name" : "Nome", diff --git a/apps/files_external/l10n/pt_BR.json b/apps/files_external/l10n/pt_BR.json index bea4c1931cd..2135ffc9a68 100644 --- a/apps/files_external/l10n/pt_BR.json +++ b/apps/files_external/l10n/pt_BR.json @@ -63,6 +63,7 @@ "Identity endpoint URL" : "Identidade pontofinal URL", "Rackspace" : "Espaço em rack", "API key" : "Chave API", + "Global credentials" : "Credenciais globais", "Log-in credentials, save in database" : "Credenciais de acesso, salvas no banco de dados", "Username and password" : "Nome de Usuário e senha", "Log-in credentials, save in session" : "Credenciais de login, guardados em sessão", @@ -87,6 +88,7 @@ "Google Drive" : "Google Drive", "Local" : "Local", "Location" : "Localização", + "Nextcloud" : "Nextcloud", "SFTP" : "SFTP", "Root" : "Raiz", "SFTP with secret key login" : "SFTP com chave secreta de login", @@ -98,6 +100,10 @@ "OpenStack Object Storage" : "Armazenamento de Objetos OpenStack", "Service name" : "Nome do serviço", "Request timeout (seconds)" : "Tempo esgotado requerido (segundos)", + "External storages" : "Armazenamentos externo", + "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "O suporte a cURL no PHP não está habilitado ou instalado. Montagem de %s não é possível. Por favor, solicite ao seu administrador do sistema instalá-lo.", + "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "O suporte a FTP no PHP não está habilitado ou instalado. Montagem de %s não é possível. Por favor, psolicite ao seu administrador do sistema instalá-lo.", + "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" não está instalado. Montagem de %s não é possível. Por favor, solicite ao seu administrador do sistema instalá-lo.", "No external storage configured" : "Nenhum armazendo externo foi configurado", "You can add external storages in the personal settings" : "Você pode adicionar armazenamentos externos nas configurações pessoais", "Name" : "Nome", diff --git a/apps/files_sharing/l10n/fi_FI.js b/apps/files_sharing/l10n/fi_FI.js index 2347eeb5c9b..7285abe441d 100644 --- a/apps/files_sharing/l10n/fi_FI.js +++ b/apps/files_sharing/l10n/fi_FI.js @@ -35,6 +35,7 @@ OC.L10N.register( "Unknown share type" : "Tuntematon jaon tyyppi", "Not a directory" : "Ei hakemisto", "Could not lock path" : "Polun lukitseminen ei onnistunut", + "Wrong or no update parameter given" : "Päivitettävä parametri puuttuu tai on väärin", "Can't change permissions for public share links" : "Julkisten jakolinkkien käyttöoikeuksia ei voi muuttaa", "Cannot increase permissions" : "Oikeuksien lisääminen ei onnistu", "A file or folder has been <strong>shared</strong>" : "Tiedosto tai kansio on <strong>jaettu</strong>", @@ -49,17 +50,29 @@ OC.L10N.register( "Public shared file %1$s was downloaded" : "Julkisesti jaettu tiedosto %1$s ladattiin", "You shared %1$s with %2$s" : "Jaoit kohteen %1$s käyttäjän %2$s kanssa", "%2$s shared %1$s with %3$s" : "%2$s jakoi kohteen %1$s käyttäjän %3$s kanssa", + "You removed the share of %2$s for %1$s" : "Poistit %1$s:n jaon käyttäjälle %2$s", + "%2$s removed the share of %3$s for %1$s" : "%2$s poisti %1$s:n jaon käyttäjälle %3$s", "You shared %1$s with group %2$s" : "Jaoit kohteen %1$s ryhmän %2$s kanssa", "%2$s shared %1$s with group %3$s" : "%2$s jakoi kohteen %1$s ryhmän %3$s kanssa", + "You removed the share of group %2$s for %1$s" : "Poistit %1$s:n jaon ryhmälle %2$s", + "%2$s removed the share of group %3$s for %1$s" : "%2$s poisti %1$s:n jaon ryhmälle %3$s", "%2$s shared %1$s via link" : "%2$s jakoi kohteen %1$s linkin kautta", "You shared %1$s via link" : "Jaoit kohteen %1$s linkin kautta", + "You removed the public link for %1$s" : "Poistit julkisen linkin kohteelle %1$s", + "%2$s removed the public link for %1$s" : "%2$s poisti julkisen linkin kohteelle %1$s", "Your public link for %1$s expired" : "Julkinen linkkisi kohteelle %1$s vanhentui", + "The public link of %2$s for %1$s expired" : "Käyttäjän %2$s julkinen linkki kohteeseen %1$s vanhentui", "%2$s shared %1$s with you" : "%2$s jakoi kohteen %1$s kanssasi", + "%2$s removed the share for %1$s" : "%2$s poisti %1$s:n jaon", "Downloaded via public link" : "Lataa julkista linkkiä käyttäen", "Shared with %2$s" : "Jaettu käyttäjän %2$s kanssa", "Shared with %3$s by %2$s" : "Jaettu käyttäjän %3$s kanssa käyttäjän %2$s toimesta", + "Removed share for %2$s" : "Poisti jaon käyttäjälle %2$s", + "%2$s removed share for %3$s" : "%2$s poisti jaon käyttäjältä %3$s", "Shared with group %2$s" : "Jaettu ryhmän %2$s kanssa", "Shared with group %3$s by %2$s" : "Jaettu ryhmän %3$s kanssa käyttäjän %2$s toimesta", + "Removed share of group %2$s" : "Poisti jaon ryhmälle %2$s", + "%2$s removed share of group %3$s" : "%2$s poisti jaon ryhmälle %3$s", "Shared via link by %2$s" : "Jaettu linkin kautta käyttäjän %2$s toimesta", "Shared via public link" : "Jaettu julkisen linkin kautta", "Removed public link" : "Julkinen linkki poistettu", @@ -95,6 +108,7 @@ OC.L10N.register( "Not allowed to create a federated share with the same user server" : "Saman käyttäjäpalvelimen kanssa ei ole sallittua luoda federoitua jakoa", "Invalid or untrusted SSL certificate" : "Virheellinen tai ei-luotettu SSL-varmenne", "Could not authenticate to remote share, password might be wrong" : "Tunnistautuminen etäjakoa kohtaan epäonnistui. Salasana saattaa olla väärä", + "Storage not valid" : "Tallennustila ei ole kelvollinen", "Couldn't add remote share" : "Etäjaon liittäminen epäonnistui", "Federated sharing" : "Federoitu jakaminen", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Haluatko lisätä etäjaon {name} kohteesta {owner}@{remote}?", diff --git a/apps/files_sharing/l10n/fi_FI.json b/apps/files_sharing/l10n/fi_FI.json index 2738c8ff84b..a3ed07dd6cd 100644 --- a/apps/files_sharing/l10n/fi_FI.json +++ b/apps/files_sharing/l10n/fi_FI.json @@ -33,6 +33,7 @@ "Unknown share type" : "Tuntematon jaon tyyppi", "Not a directory" : "Ei hakemisto", "Could not lock path" : "Polun lukitseminen ei onnistunut", + "Wrong or no update parameter given" : "Päivitettävä parametri puuttuu tai on väärin", "Can't change permissions for public share links" : "Julkisten jakolinkkien käyttöoikeuksia ei voi muuttaa", "Cannot increase permissions" : "Oikeuksien lisääminen ei onnistu", "A file or folder has been <strong>shared</strong>" : "Tiedosto tai kansio on <strong>jaettu</strong>", @@ -47,17 +48,29 @@ "Public shared file %1$s was downloaded" : "Julkisesti jaettu tiedosto %1$s ladattiin", "You shared %1$s with %2$s" : "Jaoit kohteen %1$s käyttäjän %2$s kanssa", "%2$s shared %1$s with %3$s" : "%2$s jakoi kohteen %1$s käyttäjän %3$s kanssa", + "You removed the share of %2$s for %1$s" : "Poistit %1$s:n jaon käyttäjälle %2$s", + "%2$s removed the share of %3$s for %1$s" : "%2$s poisti %1$s:n jaon käyttäjälle %3$s", "You shared %1$s with group %2$s" : "Jaoit kohteen %1$s ryhmän %2$s kanssa", "%2$s shared %1$s with group %3$s" : "%2$s jakoi kohteen %1$s ryhmän %3$s kanssa", + "You removed the share of group %2$s for %1$s" : "Poistit %1$s:n jaon ryhmälle %2$s", + "%2$s removed the share of group %3$s for %1$s" : "%2$s poisti %1$s:n jaon ryhmälle %3$s", "%2$s shared %1$s via link" : "%2$s jakoi kohteen %1$s linkin kautta", "You shared %1$s via link" : "Jaoit kohteen %1$s linkin kautta", + "You removed the public link for %1$s" : "Poistit julkisen linkin kohteelle %1$s", + "%2$s removed the public link for %1$s" : "%2$s poisti julkisen linkin kohteelle %1$s", "Your public link for %1$s expired" : "Julkinen linkkisi kohteelle %1$s vanhentui", + "The public link of %2$s for %1$s expired" : "Käyttäjän %2$s julkinen linkki kohteeseen %1$s vanhentui", "%2$s shared %1$s with you" : "%2$s jakoi kohteen %1$s kanssasi", + "%2$s removed the share for %1$s" : "%2$s poisti %1$s:n jaon", "Downloaded via public link" : "Lataa julkista linkkiä käyttäen", "Shared with %2$s" : "Jaettu käyttäjän %2$s kanssa", "Shared with %3$s by %2$s" : "Jaettu käyttäjän %3$s kanssa käyttäjän %2$s toimesta", + "Removed share for %2$s" : "Poisti jaon käyttäjälle %2$s", + "%2$s removed share for %3$s" : "%2$s poisti jaon käyttäjältä %3$s", "Shared with group %2$s" : "Jaettu ryhmän %2$s kanssa", "Shared with group %3$s by %2$s" : "Jaettu ryhmän %3$s kanssa käyttäjän %2$s toimesta", + "Removed share of group %2$s" : "Poisti jaon ryhmälle %2$s", + "%2$s removed share of group %3$s" : "%2$s poisti jaon ryhmälle %3$s", "Shared via link by %2$s" : "Jaettu linkin kautta käyttäjän %2$s toimesta", "Shared via public link" : "Jaettu julkisen linkin kautta", "Removed public link" : "Julkinen linkki poistettu", @@ -93,6 +106,7 @@ "Not allowed to create a federated share with the same user server" : "Saman käyttäjäpalvelimen kanssa ei ole sallittua luoda federoitua jakoa", "Invalid or untrusted SSL certificate" : "Virheellinen tai ei-luotettu SSL-varmenne", "Could not authenticate to remote share, password might be wrong" : "Tunnistautuminen etäjakoa kohtaan epäonnistui. Salasana saattaa olla väärä", + "Storage not valid" : "Tallennustila ei ole kelvollinen", "Couldn't add remote share" : "Etäjaon liittäminen epäonnistui", "Federated sharing" : "Federoitu jakaminen", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Haluatko lisätä etäjaon {name} kohteesta {owner}@{remote}?", diff --git a/apps/files_sharing/l10n/ru.js b/apps/files_sharing/l10n/ru.js index 789ad16e840..c8baece5993 100644 --- a/apps/files_sharing/l10n/ru.js +++ b/apps/files_sharing/l10n/ru.js @@ -99,9 +99,39 @@ OC.L10N.register( "Download" : "Скачать", "Download %s" : "Скачать %s", "Direct link" : "Прямая ссылка", - "Upload files to %s" : "Загрузка файлов в %s", + "Upload files to %s" : "Загрузка файлов пользователю %s", "Select or drop files" : "Выбрать или сбросить файлы", "Uploading files…" : "Загрузка файлов...", - "Uploaded files:" : "Загруженные файлы:" + "Uploaded files:" : "Загруженные файлы:", + "Server to server sharing is not enabled on this server" : "На данном сервере выключено межсерверное предоставление общего доступа", + "The mountpoint name contains invalid characters." : "Имя точки монтирования содержит недопустимые символы.", + "Not allowed to create a federated share with the same user server" : "Не допускается создание федеративного общего ресурса с тем-же сервером пользователя", + "Invalid or untrusted SSL certificate" : "Недействительный или недоверенный сертификат SSL", + "Could not authenticate to remote share, password might be wrong" : "Не удалось произвести аутентификацию для доступа к удалённому хранилищу, возможно неправильно указан пароль", + "Storage not valid" : "Хранилище недоступно", + "Couldn't add remote share" : "Невозможно добавить удалённый общий ресурс", + "Federated sharing" : "Общий доступ из объединенного общего хранилища", + "Do you want to add the remote share {name} from {owner}@{remote}?" : "Вы хотите добавить удалённую общую папку {name} из {owner}@{remote}?", + "Remote share" : "Удаленный общий ресурс", + "Remote share password" : "Пароль для удаленного общего ресурса", + "Cancel" : "Отмена", + "Add remote share" : "Добавить удалённый общий ресурс", + "No ownCloud installation (7 or higher) found at {remote}" : "На удаленном ресурсе {remote} не установлен ownCloud версии 7 или выше", + "Invalid ownCloud url" : "Неверный адрес ownCloud", + "You received \"/%2$s\" as a remote share from %1$s" : "Вы получили \"/%2$s\" в качестве удалённого ресурса из %1$s", + "Accept" : "Принять", + "Decline" : "Отклонить", + "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Поделитесь со мной через мой #Nextcloud ID в объединении облачных хранилищ, смотрите %s", + "Share with me through my #ownCloud Federated Cloud ID" : "Поделитесь со мной через мой #Nextcloud ID в объединении облачных хранилищ", + "Federated Cloud Sharing" : "Объединение облачных хранилищ", + "Open documentation" : "Открыть документацию", + "Allow users on this server to send shares to other servers" : "Разрешить пользователям делиться с пользователями других серверов", + "Allow users on this server to receive shares from other servers" : "Разрешить пользователям использовать общие ресурсы с других серверов", + "Federated Cloud" : "Объединение облачных хранилищ", + "Your Federated Cloud ID:" : "Ваш ID в объединении облачных хранилищ:", + "Share it:" : "Поделись этим:", + "Add to your website" : "Добавить к себе на сайт", + "Share with me via Nextcloud" : "Поделитесь со мной через Nextcloud", + "HTML Code:" : "HTML код:" }, "nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"); diff --git a/apps/files_sharing/l10n/ru.json b/apps/files_sharing/l10n/ru.json index 4ff08682484..838e3fbe6c0 100644 --- a/apps/files_sharing/l10n/ru.json +++ b/apps/files_sharing/l10n/ru.json @@ -97,9 +97,39 @@ "Download" : "Скачать", "Download %s" : "Скачать %s", "Direct link" : "Прямая ссылка", - "Upload files to %s" : "Загрузка файлов в %s", + "Upload files to %s" : "Загрузка файлов пользователю %s", "Select or drop files" : "Выбрать или сбросить файлы", "Uploading files…" : "Загрузка файлов...", - "Uploaded files:" : "Загруженные файлы:" + "Uploaded files:" : "Загруженные файлы:", + "Server to server sharing is not enabled on this server" : "На данном сервере выключено межсерверное предоставление общего доступа", + "The mountpoint name contains invalid characters." : "Имя точки монтирования содержит недопустимые символы.", + "Not allowed to create a federated share with the same user server" : "Не допускается создание федеративного общего ресурса с тем-же сервером пользователя", + "Invalid or untrusted SSL certificate" : "Недействительный или недоверенный сертификат SSL", + "Could not authenticate to remote share, password might be wrong" : "Не удалось произвести аутентификацию для доступа к удалённому хранилищу, возможно неправильно указан пароль", + "Storage not valid" : "Хранилище недоступно", + "Couldn't add remote share" : "Невозможно добавить удалённый общий ресурс", + "Federated sharing" : "Общий доступ из объединенного общего хранилища", + "Do you want to add the remote share {name} from {owner}@{remote}?" : "Вы хотите добавить удалённую общую папку {name} из {owner}@{remote}?", + "Remote share" : "Удаленный общий ресурс", + "Remote share password" : "Пароль для удаленного общего ресурса", + "Cancel" : "Отмена", + "Add remote share" : "Добавить удалённый общий ресурс", + "No ownCloud installation (7 or higher) found at {remote}" : "На удаленном ресурсе {remote} не установлен ownCloud версии 7 или выше", + "Invalid ownCloud url" : "Неверный адрес ownCloud", + "You received \"/%2$s\" as a remote share from %1$s" : "Вы получили \"/%2$s\" в качестве удалённого ресурса из %1$s", + "Accept" : "Принять", + "Decline" : "Отклонить", + "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Поделитесь со мной через мой #Nextcloud ID в объединении облачных хранилищ, смотрите %s", + "Share with me through my #ownCloud Federated Cloud ID" : "Поделитесь со мной через мой #Nextcloud ID в объединении облачных хранилищ", + "Federated Cloud Sharing" : "Объединение облачных хранилищ", + "Open documentation" : "Открыть документацию", + "Allow users on this server to send shares to other servers" : "Разрешить пользователям делиться с пользователями других серверов", + "Allow users on this server to receive shares from other servers" : "Разрешить пользователям использовать общие ресурсы с других серверов", + "Federated Cloud" : "Объединение облачных хранилищ", + "Your Federated Cloud ID:" : "Ваш ID в объединении облачных хранилищ:", + "Share it:" : "Поделись этим:", + "Add to your website" : "Добавить к себе на сайт", + "Share with me via Nextcloud" : "Поделитесь со мной через Nextcloud", + "HTML Code:" : "HTML код:" },"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);" }
\ No newline at end of file diff --git a/apps/twofactor_backupcodes/appinfo/app.php b/apps/twofactor_backupcodes/appinfo/app.php new file mode 100644 index 00000000000..31f9b6b8eae --- /dev/null +++ b/apps/twofactor_backupcodes/appinfo/app.php @@ -0,0 +1,22 @@ +<?php + +/** + * @author Christoph Wurst <christoph@winzerhof-wurst.at> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ +OC_App::registerPersonal('twofactor_backupcodes', 'settings/personal'); diff --git a/apps/twofactor_backupcodes/appinfo/database.xml b/apps/twofactor_backupcodes/appinfo/database.xml new file mode 100644 index 00000000000..02ca7c93a1e --- /dev/null +++ b/apps/twofactor_backupcodes/appinfo/database.xml @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="ISO-8859-1" ?> +<database> + <name>*dbname*</name> + <create>true</create> + <overwrite>false</overwrite> + <charset>utf8</charset> + <table> + <name>*dbprefix*twofactor_backup_codes</name> + <declaration> + <field> + <name>id</name> + <type>integer</type> + <autoincrement>1</autoincrement> + <default>0</default> + <notnull>true</notnull> + <length>4</length> + </field> + <field> + <name>user_id</name> + <type>text</type> + <default></default> + <notnull>true</notnull> + <length>64</length> + </field> + <field> + <name>code</name> + <type>text</type> + <notnull>true</notnull> + <length>64</length> + </field> + <field> + <name>used</name> + <type>integer</type> + <notnull>true</notnull> + <default>0</default> + <length>1</length> + </field> + + <index> + <name>two_factor_backupcodes_user_id</name> + <field> + <name>user_id</name> + <sorting>ascending</sorting> + </field> + </index> + </declaration> + </table> +</database> diff --git a/apps/twofactor_backupcodes/appinfo/info.xml b/apps/twofactor_backupcodes/appinfo/info.xml new file mode 100644 index 00000000000..45e9b022bbf --- /dev/null +++ b/apps/twofactor_backupcodes/appinfo/info.xml @@ -0,0 +1,19 @@ +<?xml version="1.0"?> +<info> + <id>twofactor_backupcodes</id> + <name>Two factor backup codes</name> + <description>A two-factor auth backup codes provider</description> + <licence>agpl</licence> + <author>Christoph Wurst</author> + <version>1.0.0</version> + <namespace>TwoFactor_BackupCodes</namespace> + <category>other</category> + + <two-factor-providers> + <provider>OCA\TwoFactor_BackupCodes\Provider\BackupCodesProvider</provider> + </two-factor-providers> + + <dependencies> + <owncloud min-version="9.2" max-version="9.2" /> + </dependencies> +</info> diff --git a/apps/twofactor_backupcodes/appinfo/routes.php b/apps/twofactor_backupcodes/appinfo/routes.php new file mode 100644 index 00000000000..f2af12e9b45 --- /dev/null +++ b/apps/twofactor_backupcodes/appinfo/routes.php @@ -0,0 +1,35 @@ +<?php + +/** + * @author Christoph Wurst <christoph@winzerhof-wurst.at> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ +return [ + 'routes' => [ + [ + 'name' => 'settings#state', + 'url' => '/settings/state', + 'verb' => 'GET' + ], + [ + 'name' => 'settings#createCodes', + 'url' => '/settings/create', + 'verb' => 'POST' + ], + ] +]; diff --git a/apps/twofactor_backupcodes/css/style.css b/apps/twofactor_backupcodes/css/style.css new file mode 100644 index 00000000000..0e15290b86a --- /dev/null +++ b/apps/twofactor_backupcodes/css/style.css @@ -0,0 +1,25 @@ +.challenge-form { + margin: 16px auto 1px !important; +} + +.challenge { + margin-top: 0 !important; + margin-left: 0 !important; +} + +.confirm-inline { + position: absolute; + right: 10px; + top: 0; + margin: 0 !important; + padding-right: 25px !important; + background-color: transparent !important; + border: none !important; + opacity: .5; +} + +.backup-code { + font-family: monospace; + letter-spacing: 0.02em; + font-size: 1.2em; +} diff --git a/apps/twofactor_backupcodes/js/settings.js b/apps/twofactor_backupcodes/js/settings.js new file mode 100644 index 00000000000..a4045cbc118 --- /dev/null +++ b/apps/twofactor_backupcodes/js/settings.js @@ -0,0 +1,16 @@ +/* global OC */ + +(function (OC) { + 'use strict'; + + OC.Settings = OC.Settings || {}; + OC.Settings.TwoFactorBackupCodes = OC.Settings.TwoFactorBackupCodes || {}; + + $(function () { + var view = new OC.Settings.TwoFactorBackupCodes.View({ + el: $('#twofactor-backupcodes-settings') + }); + view.render(); + }); +})(OC); + diff --git a/apps/twofactor_backupcodes/js/settingsview.js b/apps/twofactor_backupcodes/js/settingsview.js new file mode 100644 index 00000000000..3da4c141159 --- /dev/null +++ b/apps/twofactor_backupcodes/js/settingsview.js @@ -0,0 +1,120 @@ +/* global Backbone, Handlebars, OC, _ */ + +(function (OC, Handlebars, $, _) { + 'use strict'; + + OC.Settings = OC.Settings || {}; + OC.Settings.TwoFactorBackupCodes = OC.Settings.TwoFactorBackupCodes || {}; + + var TEMPLATE = '<div>' + + '{{#unless enabled}}' + + '<button id="generate-backup-codes">' + t('twofactor_backupcodes', 'Generate backup codes') + '</button>' + + '{{else}}' + + '<p>' + + '{{#unless codes}}' + + t('twofactor_backupcodes', 'Backup codes have been generated. {{used}} of {{total}} codes have been used.') + + '{{else}}' + + t('twofactor_backupcodes', 'These are your backup codes. Please save and/or print them as you will not be able to read the codes again later') + + '<ul>' + + '{{#each codes}}' + + '<li class="backup-code">{{this}}</li>' + + '{{/each}}' + + '</ul>' + + '<a href="{{download}}" class="button" download="Nextcloud-backup-codes.txt">' + t('twofactor_backupcodes', 'Save backup codes') + '</a>' + + '<button id="print-backup-codes" class="button">' + t('twofactor_backupcodes', 'Print backup codes') + '</button>' + + '{{/unless}}' + + '</p>' + + '<p>' + + '<button id="generate-backup-codes">' + t('twofactor_backupcodes', 'Regenerate backup codes') + '</button>' + + '</p>' + + '<p>' + + t('twofactor_backupcodes', 'If you regenerate backup codes, you automatically invalidate old codes.') + + '</p>' + + '{{/unless}}' + + '</div'; + + var View = OC.Backbone.View.extend({ + _template: undefined, + template: function (data) { + if (!this._template) { + this._template = Handlebars.compile(TEMPLATE); + } + return this._template(data); + }, + _loading: undefined, + _enabled: undefined, + _total: undefined, + _used: undefined, + _codes: undefined, + events: { + 'click #generate-backup-codes': '_onGenerateBackupCodes', + 'click #print-backup-codes': '_onPrintBackupCodes', + }, + initialize: function () { + this._load(); + }, + render: function () { + this.$el.html(this.template({ + enabled: this._enabled, + total: this._total, + used: this._used, + codes: this._codes, + download: this._getDownloadDataHref() + })); + }, + _getDownloadDataHref: function () { + if (!this._codes) { + return ''; + } + return 'data:text/plain,' + encodeURIComponent(_.reduce(this._codes, function (prev, code) { + return prev + code + "\r\n"; + }, '')); + }, + _load: function () { + this._loading = true; + + var url = OC.generateUrl('/apps/twofactor_backupcodes/settings/state'); + var loading = $.ajax(url, { + method: 'GET', + }); + + $.when(loading).done(function (data) { + this._enabled = data.enabled; + this._total = data.total; + this._used = data.used; + }.bind(this)); + $.when(loading).always(function () { + this._loading = false; + this.render(); + }.bind(this)); + }, + _onGenerateBackupCodes: function () { + // Hide old codes + this._enabled = false; + this.render(); + $('#generate-backup-codes').addClass('icon-loading-small'); + var url = OC.generateUrl('/apps/twofactor_backupcodes/settings/create'); + $.ajax(url, { + method: 'POST' + }).done(function (data) { + this._enabled = data.state.enabled; + this._total = data.state.total; + this._used = data.state.used; + this._codes = data.codes; + this.render(); + }.bind(this)).fail(function () { + OC.Notification.showTemporary('An error occurred while generating your backup codes'); + $('#generate-backup-codes').removeClass('icon-loading-small'); + }); + }, + _onPrintBackupCodes: function () { + var url = this._getDownloadDataHref(); + window.open(url, 'Nextcloud backpu codes'); + window.print(); + window.close(); + } + }); + + OC.Settings.TwoFactorBackupCodes.View = View; + +})(OC, Handlebars, $, _);
\ No newline at end of file diff --git a/apps/twofactor_backupcodes/lib/Controller/SettingsController.php b/apps/twofactor_backupcodes/lib/Controller/SettingsController.php new file mode 100644 index 00000000000..5130357baa5 --- /dev/null +++ b/apps/twofactor_backupcodes/lib/Controller/SettingsController.php @@ -0,0 +1,73 @@ +<?php + +/** + * @author Christoph Wurst <christoph@winzerhof-wurst.at> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\TwoFactor_BackupCodes\Controller; + +use OCA\TwoFactor_BackupCodes\Service\BackupCodeStorage; +use OCP\AppFramework\Controller; +use OCP\AppFramework\Http\JSONResponse; +use OCP\IRequest; +use OCP\IUserSession; + +class SettingsController extends Controller { + + /** @var BackupCodeStorage */ + private $storage; + + /** @var IUserSession */ + private $userSession; + + /** + * @param string $appName + * @param IRequest $request + * @param BackupCodeStorage $storage + * @param IUserSession $userSession + */ + public function __construct($appName, IRequest $request, BackupCodeStorage $storage, IUserSession $userSession) { + parent::__construct($appName, $request); + $this->userSession = $userSession; + $this->storage = $storage; + } + + /** + * @NoAdminRequired + * @return JSONResponse + */ + public function state() { + $user = $this->userSession->getUser(); + return $this->storage->getBackupCodesState($user); + } + + /** + * @NoAdminRequired + * @return JSONResponse + */ + public function createCodes() { + $user = $this->userSession->getUser(); + $codes = $this->storage->createCodes($user); + return [ + 'codes' => $codes, + 'state' => $this->storage->getBackupCodesState($user), + ]; + } + +} diff --git a/apps/twofactor_backupcodes/lib/Db/BackupCode.php b/apps/twofactor_backupcodes/lib/Db/BackupCode.php new file mode 100644 index 00000000000..5bfb681063c --- /dev/null +++ b/apps/twofactor_backupcodes/lib/Db/BackupCode.php @@ -0,0 +1,46 @@ +<?php + +/** + * @author Christoph Wurst <christoph@winzerhof-wurst.at> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\TwoFactor_BackupCodes\Db; + +use OCP\AppFramework\Db\Entity; + +/** + * @method string getUserId() + * @method void setUserId(string $userId) + * @method string getCode() + * @method void setCode(string $code) + * @method int getUsed() + * @method void setUsed(int $code) + */ +class BackupCode extends Entity { + + /** @var string */ + protected $userId; + + /** @var string */ + protected $code; + + /** @var int */ + protected $used; + +} diff --git a/apps/twofactor_backupcodes/lib/Db/BackupCodeMapper.php b/apps/twofactor_backupcodes/lib/Db/BackupCodeMapper.php new file mode 100644 index 00000000000..d6256929675 --- /dev/null +++ b/apps/twofactor_backupcodes/lib/Db/BackupCodeMapper.php @@ -0,0 +1,66 @@ +<?php + +/** + * @author Christoph Wurst <christoph@winzerhof-wurst.at> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\TwoFactor_BackupCodes\Db; + +use OCP\AppFramework\Db\Mapper; +use OCP\DB\QueryBuilder\IQueryBuilder; +use OCP\IDb; +use OCP\IUser; + +class BackupCodeMapper extends Mapper { + + public function __construct(IDb $db) { + parent::__construct($db, 'twofactor_backup_codes'); + } + + /** + * @param IUser $user + * @return BackupCode[] + */ + public function getBackupCodes(IUser $user) { + /* @var $qb IQueryBuilder */ + $qb = $this->db->getQueryBuilder(); + + $qb->select('id', 'user_id', 'code', 'used') + ->from('twofactor_backup_codes') + ->where($qb->expr()->eq('user_id', $qb->createNamedParameter($user->getUID()))); + $result = $qb->execute(); + + $rows = $result->fetchAll(); + $result->closeCursor(); + + return array_map(function ($row) { + return BackupCode::fromRow($row); + }, $rows); + } + + public function deleteCodes(IUser $user) { + /* @var $qb IQueryBuilder */ + $qb = $this->db->getQueryBuilder(); + + $qb->delete('twofactor_backup_codes') + ->where($qb->expr()->eq('user_id', $qb->createNamedParameter($user->getUID()))); + $qb->execute(); + } + +} diff --git a/apps/twofactor_backupcodes/lib/Provider/BackupCodesProvider.php b/apps/twofactor_backupcodes/lib/Provider/BackupCodesProvider.php new file mode 100644 index 00000000000..91975dfad8d --- /dev/null +++ b/apps/twofactor_backupcodes/lib/Provider/BackupCodesProvider.php @@ -0,0 +1,102 @@ +<?php + +/** + * @author Christoph Wurst <christoph@winzerhof-wurst.at> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\TwoFactor_BackupCodes\Provider; + +use OCA\TwoFactor_BackupCodes\Service\BackupCodeStorage; +use OCP\Authentication\TwoFactorAuth\IProvider; +use OCP\IL10N; +use OCP\IUser; +use OCP\Template; + +class BackupCodesProvider implements IProvider { + + /** @var BackupCodeStorage */ + private $storage; + + /** @var IL10N */ + private $l10n; + + public function __construct(BackupCodeStorage $storage, IL10N $l10n) { + $this->l10n = $l10n; + $this->storage = $storage; + } + + /** + * Get unique identifier of this 2FA provider + * + * @return string + */ + public function getId() { + return 'backup_codes'; + } + + /** + * Get the display name for selecting the 2FA provider + * + * @return string + */ + public function getDisplayName() { + return $this->l10n->t('Backup code'); + } + + /** + * Get the description for selecting the 2FA provider + * + * @return string + */ + public function getDescription() { + return $this->l10n->t('Use backup code'); + } + + /** + * Get the template for rending the 2FA provider view + * + * @param IUser $user + * @return Template + */ + public function getTemplate(IUser $user) { + $tmpl = new Template('twofactor_backupcodes', 'challenge'); + return $tmpl; + } + + /** + * Verify the given challenge + * + * @param IUser $user + * @param string $challenge + */ + public function verifyChallenge(IUser $user, $challenge) { + return $this->storage->validateCode($user, $challenge); + } + + /** + * Decides whether 2FA is enabled for the given user + * + * @param IUser $user + * @return boolean + */ + public function isTwoFactorAuthEnabledForUser(IUser $user) { + return $this->storage->hasBackupCodes($user); + } + +} diff --git a/apps/twofactor_backupcodes/lib/Service/BackupCodeStorage.php b/apps/twofactor_backupcodes/lib/Service/BackupCodeStorage.php new file mode 100644 index 00000000000..9c78581255f --- /dev/null +++ b/apps/twofactor_backupcodes/lib/Service/BackupCodeStorage.php @@ -0,0 +1,121 @@ +<?php + +/** + * @author Christoph Wurst <christoph@winzerhof-wurst.at> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\TwoFactor_BackupCodes\Service; + +use OCA\TwoFactor_BackupCodes\Db\BackupCode; +use OCA\TwoFactor_BackupCodes\Db\BackupCodeMapper; +use OCP\IUser; +use OCP\Security\IHasher; +use OCP\Security\ISecureRandom; + +class BackupCodeStorage { + + /** @var BackupCodeMapper */ + private $mapper; + + /** @var IHasher */ + private $hasher; + + /** @var ISecureRandom */ + private $random; + + public function __construct(BackupCodeMapper $mapper, ISecureRandom $random, IHasher $hasher) { + $this->mapper = $mapper; + $this->hasher = $hasher; + $this->random = $random; + } + + /** + * @param IUser $user + * @return string[] + */ + public function createCodes(IUser $user, $number = 10) { + $result = []; + + // Delete existing ones + $this->mapper->deleteCodes($user); + + $uid = $user->getUID(); + foreach (range(1, min([$number, 20])) as $i) { + $code = $this->random->generate(10, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'); + + $dbCode = new BackupCode(); + $dbCode->setUserId($uid); + $dbCode->setCode($this->hasher->hash($code)); + $dbCode->setUsed(0); + $this->mapper->insert($dbCode); + + array_push($result, $code); + } + + return $result; + } + + /** + * @param IUser $user + * @return bool + */ + public function hasBackupCodes(IUser $user) { + $codes = $this->mapper->getBackupCodes($user); + return count($codes) > 0; + } + + /** + * @param IUser $user + * @return array + */ + public function getBackupCodesState(IUser $user) { + $codes = $this->mapper->getBackupCodes($user); + $total = count($codes); + $used = 0; + array_walk($codes, function (BackupCode $code) use (&$used) { + if (1 === (int) $code->getUsed()) { + $used++; + } + }); + return [ + 'enabled' => $total > 0, + 'total' => $total, + 'used' => $used, + ]; + } + + /** + * @param IUser $user + * @param string $code + * @return bool + */ + public function validateCode(IUser $user, $code) { + $dbCodes = $this->mapper->getBackupCodes($user); + + foreach ($dbCodes as $dbCode) { + if (0 === (int) $dbCode->getUsed() && $this->hasher->verify($code, $dbCode->getCode())) { + $dbCode->setUsed(1); + $this->mapper->update($dbCode); + return true; + } + } + return false; + } + +} diff --git a/apps/twofactor_backupcodes/settings/personal.php b/apps/twofactor_backupcodes/settings/personal.php new file mode 100644 index 00000000000..037516e39a3 --- /dev/null +++ b/apps/twofactor_backupcodes/settings/personal.php @@ -0,0 +1,5 @@ +<?php + +$tmpl = new \OCP\Template('twofactor_backupcodes', 'personal'); + +return $tmpl->fetchPage(); diff --git a/apps/twofactor_backupcodes/templates/challenge.php b/apps/twofactor_backupcodes/templates/challenge.php new file mode 100644 index 00000000000..e6ec7bb52e6 --- /dev/null +++ b/apps/twofactor_backupcodes/templates/challenge.php @@ -0,0 +1,8 @@ +<?php +style('twofactor_backupcodes', 'style'); +?> + +<form method="POST" class="challenge-form"> + <input type="text" class="challenge" name="challenge" required="required" autofocus autocomplete="off" autocapitalize="off" placeholder="<?php p($l->t('Backup code')) ?>"> + <input type="submit" class="confirm-inline icon-confirm" value=""> +</form> diff --git a/apps/twofactor_backupcodes/templates/personal.php b/apps/twofactor_backupcodes/templates/personal.php new file mode 100644 index 00000000000..23b06e23058 --- /dev/null +++ b/apps/twofactor_backupcodes/templates/personal.php @@ -0,0 +1,12 @@ +<?php + +script('twofactor_backupcodes', 'settingsview'); +script('twofactor_backupcodes', 'settings'); +style('twofactor_backupcodes', 'style'); + +?> + +<div class="section"> + <h2><?php p($l->t('Second-factor backup codes')); ?></h2> + <div id="twofactor-backupcodes-settings"></div> +</div> diff --git a/apps/twofactor_backupcodes/tests/Integration/Db/BackupCodeMapperTest.php b/apps/twofactor_backupcodes/tests/Integration/Db/BackupCodeMapperTest.php new file mode 100644 index 00000000000..5d7d71dd17a --- /dev/null +++ b/apps/twofactor_backupcodes/tests/Integration/Db/BackupCodeMapperTest.php @@ -0,0 +1,113 @@ +<?php + +/** + * @author Christoph Wurst <christoph@winzerhof-wurst.at> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\TwoFactor_BackupCodes\Tests\Integration\Db; + +use OC; +use OCA\TwoFactor_BackupCodes\Db\BackupCode; +use OCA\TwoFactor_BackupCodes\Db\BackupCodeMapper; +use OCP\IDBConnection; +use OCP\IUser; +use Test\TestCase; + +/** + * @group DB + */ +class BackupCodeMapperTest extends TestCase { + + /** @var IDBConnection */ + private $db; + + /** @var BackupCodeMapper */ + private $mapper; + + /** @var string */ + private $testUID = 'test123456'; + + private function resetDB() { + $qb = $this->db->getQueryBuilder(); + $qb->delete($this->mapper->getTableName()) + ->where($qb->expr()->eq('user_id', $qb->createNamedParameter($this->testUID))); + $qb->execute(); + } + + protected function setUp() { + parent::setUp(); + + $this->db = OC::$server->getDatabaseConnection(); + $this->mapper = OC::$server->query(BackupCodeMapper::class); + + $this->resetDB(); + } + + protected function tearDown() { + parent::tearDown(); + + $this->resetDB(); + } + + public function testGetBackupCodes() { + $code1 = new BackupCode(); + $code1->setUserId($this->testUID); + $code1->setCode('1|$2y$10$Fyo.DkMtkaHapVvRVbQBeeIdi5x/6nmPnxiBzD0GDKa08NMus5xze'); + $code1->setUsed(1); + + $code2 = new BackupCode(); + $code2->setUserId($this->testUID); + $code2->setCode('1|$2y$10$nj3sZaCqGN8t6.SsnNADt.eX34UCkdX6FPx.r.rIwE6Jj3vi5wyt2'); + $code2->setUsed(0); + + $this->mapper->insert($code1); + $this->mapper->insert($code2); + + $user = $this->getMockBuilder(IUser::class)->getMock(); + $user->expects($this->once()) + ->method('getUID') + ->will($this->returnValue($this->testUID)); + + $dbCodes = $this->mapper->getBackupCodes($user); + + $this->assertCount(2, $dbCodes); + $this->assertInstanceOf(BackupCode::class, $dbCodes[0]); + $this->assertInstanceOf(BackupCode::class, $dbCodes[1]); + } + + public function testDeleteCodes() { + $code = new BackupCode(); + $code->setUserId($this->testUID); + $code->setCode('1|$2y$10$CagG8pEhZL.xDirtCCP/KuuWtnsAasgq60zY9rU46dBK4w8yW0Z/y'); + $code->setUsed(1); + $user = $this->getMockBuilder(IUser::class)->getMock(); + $user->expects($this->any()) + ->method('getUID') + ->will($this->returnValue($this->testUID)); + + $this->mapper->insert($code); + + $this->assertCount(1, $this->mapper->getBackupCodes($user)); + + $this->mapper->deleteCodes($user); + + $this->assertCount(0, $this->mapper->getBackupCodes($user)); + } + +} diff --git a/apps/twofactor_backupcodes/tests/Integration/Service/BackupCodeStorageTest.php b/apps/twofactor_backupcodes/tests/Integration/Service/BackupCodeStorageTest.php new file mode 100644 index 00000000000..5517af5ce0d --- /dev/null +++ b/apps/twofactor_backupcodes/tests/Integration/Service/BackupCodeStorageTest.php @@ -0,0 +1,90 @@ +<?php + +/** + * @author Christoph Wurst <christoph@winzerhof-wurst.at> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\TwoFactor_BackupCodes\Tests\Integration\Service; + +use OC; +use OCA\TwoFactor_BackupCodes\Service\BackupCodeStorage; +use Test\TestCase; + +/** + * @group DB + */ +class BackupCodeStorageTest extends TestCase { + + /** @var BackupCodeStorage */ + private $storage; + + /** @var string */ + private $testUID = 'test123456789'; + + protected function setUp() { + parent::setUp(); + + $this->storage = OC::$server->query(BackupCodeStorage::class); + } + + public function testSimpleWorkFlow() { + $user = $this->getMockBuilder(\OCP\IUser::class)->getMock(); + $user->expects($this->any()) + ->method('getUID') + ->will($this->returnValue($this->testUID)); + + // Create codes + $codes = $this->storage->createCodes($user, 5); + $this->assertCount(5, $codes); + $this->assertTrue($this->storage->hasBackupCodes($user)); + $initialState = [ + 'enabled' => true, + 'total' => 5, + 'used' => 0, + ]; + $this->assertEquals($initialState, $this->storage->getBackupCodesState($user)); + + // Use codes + $code = $codes[2]; + $this->assertTrue($this->storage->validateCode($user, $code)); + // Code must not be used twice + $this->assertFalse($this->storage->validateCode($user, $code)); + // Invalid codes are invalid + $this->assertFalse($this->storage->validateCode($user, 'I DO NOT EXIST')); + $stateAfter = [ + 'enabled' => true, + 'total' => 5, + 'used' => 1, + ]; + $this->assertEquals($stateAfter, $this->storage->getBackupCodesState($user)); + + // Deplete codes + $this->assertTrue($this->storage->validateCode($user, $codes[0])); + $this->assertTrue($this->storage->validateCode($user, $codes[1])); + $this->assertTrue($this->storage->validateCode($user, $codes[3])); + $this->assertTrue($this->storage->validateCode($user, $codes[4])); + $stateAllUsed = [ + 'enabled' => true, + 'total' => 5, + 'used' => 5, + ]; + $this->assertEquals($stateAllUsed, $this->storage->getBackupCodesState($user)); + } + +} diff --git a/apps/twofactor_backupcodes/tests/Unit/Controller/SettingsControllerTest.php b/apps/twofactor_backupcodes/tests/Unit/Controller/SettingsControllerTest.php new file mode 100644 index 00000000000..918d1a8c64d --- /dev/null +++ b/apps/twofactor_backupcodes/tests/Unit/Controller/SettingsControllerTest.php @@ -0,0 +1,95 @@ +<?php + +/** + * @author Christoph Wurst <christoph@winzerhof-wurst.at> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\TwoFactor_BackupCodes\Tests\Unit\Controller; + +use OCA\TwoFactor_BackupCodes\Controller\SettingsController; +use OCA\TwoFactor_BackupCodes\Service\BackupCodeStorage; +use OCP\IRequest; +use OCP\IUser; +use OCP\IUserSession; +use Test\TestCase; + +class SettingsControllerTest extends TestCase { + + /** @var IRequest|PHPUnit_Framework_MockObject_MockObject */ + private $request; + + /** @var BackupCodeStorage|PHPUnit_Framework_MockObject_MockObject */ + private $storage; + + /** @var IUserSession|PHPUnit_Framework_MockObject_MockObject */ + private $userSession; + + /** @var SettingsController */ + private $controller; + + protected function setUp() { + parent::setUp(); + + $this->request = $this->getMockBuilder(IRequest::class)->getMock(); + $this->storage = $this->getMockBuilder(BackupCodeStorage::class) + ->disableOriginalConstructor() + ->getMock(); + $this->userSession = $this->getMockBuilder(IUserSession::class)->getMock(); + + $this->controller = new SettingsController('twofactor_backupcodes', $this->request, $this->storage, $this->userSession); + } + + public function testState() { + $user = $this->getMockBuilder(IUser::class)->getMock(); + + $this->userSession->expects($this->once()) + ->method('getUser') + ->will($this->returnValue($user)); + $this->storage->expects($this->once()) + ->method('getBackupCodesState') + ->with($user) + ->will($this->returnValue('state')); + + $this->assertEquals('state', $this->controller->state()); + } + + public function testCreateCodes() { + $user = $this->getMockBuilder(IUser::class)->getMock(); + + $codes = ['a', 'b']; + $this->userSession->expects($this->once()) + ->method('getUser') + ->will($this->returnValue($user)); + $this->storage->expects($this->once()) + ->method('createCodes') + ->with($user) + ->will($this->returnValue($codes)); + $this->storage->expects($this->once()) + ->method('getBackupCodesState') + ->with($user) + ->will($this->returnValue('state')); + + $expected = [ + 'codes' => $codes, + 'state' => 'state', + ]; + $this->assertEquals($expected, $this->controller->createCodes()); + } + +} diff --git a/apps/twofactor_backupcodes/tests/Unit/Provider/BackupCodesProviderTest.php b/apps/twofactor_backupcodes/tests/Unit/Provider/BackupCodesProviderTest.php new file mode 100644 index 00000000000..a744a44e609 --- /dev/null +++ b/apps/twofactor_backupcodes/tests/Unit/Provider/BackupCodesProviderTest.php @@ -0,0 +1,103 @@ +<?php + +/** + * @author Christoph Wurst <christoph@winzerhof-wurst.at> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\TwoFactor_BackupCodes\Tests\Unit\Provider; + +use OCA\TwoFactor_BackupCodes\Provider\BackupCodesProvider; +use OCA\TwoFactor_BackupCodes\Service\BackupCodeStorage; +use OCP\IL10N; +use OCP\IUser; +use OCP\Template; +use Test\TestCase; + +class BackupCodesProviderTest extends TestCase { + + /** @var BackupCodeStorage|PHPUnit_Framework_MockObject_MockObject */ + private $storage; + + /** @var IL10N|PHPUnit_Framework_MockObject_MockObject */ + private $l10n; + + /** @var BackupCodesProvider */ + private $provider; + + protected function setUp() { + parent::setUp(); + + $this->storage = $this->getMockBuilder(BackupCodeStorage::class) + ->disableOriginalConstructor() + ->getMock(); + $this->l10n = $this->getMockBuilder(IL10N::class)->getMock(); + $this->provider = new BackupCodesProvider($this->storage, $this->l10n); + } + + public function testGetId() { + $this->assertEquals('backup_codes', $this->provider->getId()); + } + + public function testGetDisplayName() { + $this->l10n->expects($this->once()) + ->method('t') + ->with('Backup code') + ->will($this->returnValue('l10n backup code')); + $this->assertSame('l10n backup code', $this->provider->getDisplayName()); + } + + public function testGetDescription() { + $this->l10n->expects($this->once()) + ->method('t') + ->with('Use backup code') + ->will($this->returnValue('l10n use backup code')); + $this->assertSame('l10n use backup code', $this->provider->getDescription()); + } + + public function testGetTempalte() { + $user = $this->getMockBuilder(IUser::class)->getMock(); + $expected = new Template('twofactor_backupcodes', 'challenge'); + + $this->assertEquals($expected, $this->provider->getTemplate($user)); + } + + public function testVerfiyChallenge() { + $user = $this->getMockBuilder(IUser::class)->getMock(); + $challenge = 'xyz'; + + $this->storage->expects($this->once()) + ->method('validateCode') + ->with($user, $challenge) + ->will($this->returnValue(false)); + + $this->assertFalse($this->provider->verifyChallenge($user, $challenge)); + } + + public function testIsTwoFactorEnabledForUser() { + $user = $this->getMockBuilder(IUser::class)->getMock(); + + $this->storage->expects($this->once()) + ->method('hasBackupCodes') + ->with($user) + ->will($this->returnValue(true)); + + $this->assertTrue($this->provider->isTwoFactorAuthEnabledForUser($user)); + } + +} diff --git a/apps/twofactor_backupcodes/tests/Unit/Service/BackupCodeStorageTest.php b/apps/twofactor_backupcodes/tests/Unit/Service/BackupCodeStorageTest.php new file mode 100644 index 00000000000..04c51fa7e14 --- /dev/null +++ b/apps/twofactor_backupcodes/tests/Unit/Service/BackupCodeStorageTest.php @@ -0,0 +1,228 @@ +<?php + +/** + * @author Christoph Wurst <christoph@winzerhof-wurst.at> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\TwoFactor_BackupCodes\Tests\Unit\Service; + +use OCA\TwoFactor_BackupCodes\Db\BackupCode; +use OCA\TwoFactor_BackupCodes\Db\BackupCodeMapper; +use OCA\TwoFactor_BackupCodes\Service\BackupCodeStorage; +use OCP\IUser; +use OCP\Security\IHasher; +use OCP\Security\ISecureRandom; +use Test\TestCase; + +class BackupCodeStorageTest extends TestCase { + + /** @var BackupCodeMapper|PHPUnit_Framework_MockObject_MockObject */ + private $mapper; + + /** @var ISecureRandom|PHPUnit_Framework_MockObject_MockObject */ + private $random; + + /** @var IHasher|PHPUnit_Framework_MockObject_MockObject */ + private $hasher; + + /** @var BackupCodeStorage */ + private $storage; + + protected function setUp() { + parent::setUp(); + + $this->mapper = $this->getMockBuilder(BackupCodeMapper::class) + ->disableOriginalConstructor() + ->getMock(); + $this->random = $this->getMockBuilder(ISecureRandom::class)->getMock(); + $this->hasher = $this->getMockBuilder(IHasher::class)->getMock(); + $this->storage = new BackupCodeStorage($this->mapper, $this->random, $this->hasher); + } + + public function testCreateCodes() { + $user = $this->getMockBuilder(IUser::class)->getMock(); + $number = 5; + + $user->expects($this->once()) + ->method('getUID') + ->will($this->returnValue('fritz')); + $this->random->expects($this->exactly($number)) + ->method('generate') + ->with(10, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789') + ->will($this->returnValue('CODEABCDEF')); + $this->hasher->expects($this->exactly($number)) + ->method('hash') + ->with('CODEABCDEF') + ->will($this->returnValue('HASHEDCODE')); + $row = new BackupCode(); + $row->setUserId('fritz'); + $row->setCode('HASHEDCODE'); + $row->setUsed(0); + $this->mapper->expects($this->exactly($number)) + ->method('insert') + ->with($this->equalTo($row)); + + $codes = $this->storage->createCodes($user, $number); + $this->assertCount($number, $codes); + foreach ($codes as $code) { + $this->assertEquals('CODEABCDEF', $code); + } + } + + public function testHasBackupCodes() { + $user = $this->getMockBuilder(IUser::class)->getMock(); + $codes = [ + new BackupCode(), + new BackupCode(), + ]; + + $this->mapper->expects($this->once()) + ->method('getBackupCodes') + ->with($user) + ->will($this->returnValue($codes)); + + $this->assertTrue($this->storage->hasBackupCodes($user)); + } + + public function testHasBackupCodesNoCodes() { + $user = $this->getMockBuilder(IUser::class)->getMock(); + $codes = []; + + $this->mapper->expects($this->once()) + ->method('getBackupCodes') + ->with($user) + ->will($this->returnValue($codes)); + + $this->assertFalse($this->storage->hasBackupCodes($user)); + } + + public function testGetBackupCodeState() { + $user = $this->getMockBuilder(IUser::class)->getMock(); + + $code1 = new BackupCode(); + $code1->setUsed(1); + $code2 = new BackupCode(); + $code2->setUsed('0'); + $codes = [ + $code1, + $code2, + ]; + + $this->mapper->expects($this->once()) + ->method('getBackupCodes') + ->with($user) + ->will($this->returnValue($codes)); + + $expected = [ + 'enabled' => true, + 'total' => 2, + 'used' => 1, + ]; + $this->assertEquals($expected, $this->storage->getBackupCodesState($user)); + } + + public function testGetBackupCodeDisabled() { + $user = $this->getMockBuilder(IUser::class)->getMock(); + + $codes = []; + + $this->mapper->expects($this->once()) + ->method('getBackupCodes') + ->with($user) + ->will($this->returnValue($codes)); + + $expected = [ + 'enabled' => false, + 'total' => 0, + 'used' => 0, + ]; + $this->assertEquals($expected, $this->storage->getBackupCodesState($user)); + } + + public function testValidateCode() { + $user = $this->getMockBuilder(IUser::class)->getMock(); + $code = new BackupCode(); + $code->setUsed(0); + $code->setCode('HASHEDVALUE'); + $codes = [ + $code, + ]; + + $this->mapper->expects($this->once()) + ->method('getBackupCodes') + ->with($user) + ->will($this->returnValue($codes)); + $this->hasher->expects($this->once()) + ->method('verify') + ->with('CHALLENGE', 'HASHEDVALUE') + ->will($this->returnValue(true)); + $this->mapper->expects($this->once()) + ->method('update') + ->with($code); + + $this->assertTrue($this->storage->validateCode($user, 'CHALLENGE')); + + $this->assertEquals(1, $code->getUsed()); + } + + public function testValidateUsedCode() { + $user = $this->getMockBuilder(IUser::class)->getMock(); + $code = new BackupCode(); + $code->setUsed('1'); + $code->setCode('HASHEDVALUE'); + $codes = [ + $code, + ]; + + $this->mapper->expects($this->once()) + ->method('getBackupCodes') + ->with($user) + ->will($this->returnValue($codes)); + $this->hasher->expects($this->never()) + ->method('verifiy'); + $this->mapper->expects($this->never()) + ->method('update'); + + $this->assertFalse($this->storage->validateCode($user, 'CHALLENGE')); + } + + public function testValidateCodeWithWrongHash() { + $user = $this->getMockBuilder(IUser::class)->getMock(); + $code = new BackupCode(); + $code->setUsed(0); + $code->setCode('HASHEDVALUE'); + $codes = [ + $code, + ]; + + $this->mapper->expects($this->once()) + ->method('getBackupCodes') + ->with($user) + ->will($this->returnValue($codes)); + $this->hasher->expects($this->once()) + ->method('verify') + ->with('CHALLENGE', 'HASHEDVALUE') + ->will($this->returnValue(false)); + $this->mapper->expects($this->never()) + ->method('update'); + + $this->assertFalse($this->storage->validateCode($user, 'CHALLENGE')); + } + +} diff --git a/apps/user_ldap/l10n/pt_BR.js b/apps/user_ldap/l10n/pt_BR.js index 29f6f7be2c6..b527db4e39d 100644 --- a/apps/user_ldap/l10n/pt_BR.js +++ b/apps/user_ldap/l10n/pt_BR.js @@ -47,6 +47,7 @@ OC.L10N.register( "The %uid placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "O espaço reservado %uid está faltando. Ele será substituído pelo nome de login ao consultar LDAP / AD.", "Please provide a login name to test against" : "Por favor, forneça um nome de login para testar", "The group box was disabled, because the LDAP / AD server does not support memberOf." : "A caixa do grupo foi desativada, porque o servidor LDAP / AD não suporta memberOf.", + "LDAP / AD integration" : "Integração LDAP / AD", "_%s group found_::_%s groups found_" : ["grupo% s encontrado","grupos% s encontrado"], "_%s user found_::_%s users found_" : ["usuário %s encontrado","usuários %s encontrados"], "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Não foi possível detectar o nome de exibição do atributo do usuário. Por favor, indique-o você mesmo em configurações avançadas do LDAP.", @@ -159,6 +160,7 @@ OC.L10N.register( "Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Nomes de usuários são usados para armazenar e atribuir dados (meta). A fim de identificar e reconhecer precisamente usuários, cada usuário LDAP terá um nome de usuário interno. Isso requer um mapeamento de nome de usuário para usuário LDAP. O nome de usuário criado é mapeado para o UUID do usuário LDAP. Além disso, o DN é armazenado em cache, assim como para reduzir a interação LDAP, mas não é usado para identificação. Se o DN muda, as mudanças serão encontrados. O nome de usuário interno é usado por toda parte. Limpando os mapeamentos terá sobras em todos os lugares. Limpando os mapeamentos não é a configuração sensível, que afeta todas as configurações LDAP! Nunca limpar os mapeamentos em um ambiente de produção, somente em um teste ou estágio experimental.", "Clear Username-LDAP User Mapping" : "Limpar Mapeamento de Usuário Nome de Usuário-LDAP", "Clear Groupname-LDAP Group Mapping" : "Limpar NomedoGrupo-LDAP Mapeamento do Grupo", - "Limit %s access to users meeting these criteria:" : "Limita o acesso a %s para usuários que satisfaçam estes critérios:" + "Limit %s access to users meeting these criteria:" : "Limita o acesso a %s para usuários que satisfaçam estes critérios:", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por padrão, o nome de usuário interno será criado a partir do atributo UUID. Isto garante que o nome de usuário é único e caracteress não precisam ser convertidos. O nome de usuário interno tem a restrição de que apenas estes caracteres são permitidos: [a-zA-Z0-9 _ @ -.]. Outros caracteres são substituídos por sua correspondência ASCII ou simplesmente omitidos. Em colisões será adicionado um número/adicionado. O nome de utilizador interno é utilizado para identificar um utilizador internamente. É também o nome padrão para a pasta de usuário doméstico. É também uma parte de URLs remotas, por exemplo para todos os serviços *DAV. Com esta definição, o comportamento padrão pode ser substituído. Para conseguir um comportamento semelhante como antes no ownCloud 5 insira o atributo do nome de exibição do usuário no campo seguinte. Deixe em branco para o comportamento padrão. As alterações terão efeito apenas em usuários LDAP recém-mapeados (adicionados)." }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/user_ldap/l10n/pt_BR.json b/apps/user_ldap/l10n/pt_BR.json index 7286d4c4765..98642a23a00 100644 --- a/apps/user_ldap/l10n/pt_BR.json +++ b/apps/user_ldap/l10n/pt_BR.json @@ -45,6 +45,7 @@ "The %uid placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "O espaço reservado %uid está faltando. Ele será substituído pelo nome de login ao consultar LDAP / AD.", "Please provide a login name to test against" : "Por favor, forneça um nome de login para testar", "The group box was disabled, because the LDAP / AD server does not support memberOf." : "A caixa do grupo foi desativada, porque o servidor LDAP / AD não suporta memberOf.", + "LDAP / AD integration" : "Integração LDAP / AD", "_%s group found_::_%s groups found_" : ["grupo% s encontrado","grupos% s encontrado"], "_%s user found_::_%s users found_" : ["usuário %s encontrado","usuários %s encontrados"], "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Não foi possível detectar o nome de exibição do atributo do usuário. Por favor, indique-o você mesmo em configurações avançadas do LDAP.", @@ -157,6 +158,7 @@ "Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Nomes de usuários são usados para armazenar e atribuir dados (meta). A fim de identificar e reconhecer precisamente usuários, cada usuário LDAP terá um nome de usuário interno. Isso requer um mapeamento de nome de usuário para usuário LDAP. O nome de usuário criado é mapeado para o UUID do usuário LDAP. Além disso, o DN é armazenado em cache, assim como para reduzir a interação LDAP, mas não é usado para identificação. Se o DN muda, as mudanças serão encontrados. O nome de usuário interno é usado por toda parte. Limpando os mapeamentos terá sobras em todos os lugares. Limpando os mapeamentos não é a configuração sensível, que afeta todas as configurações LDAP! Nunca limpar os mapeamentos em um ambiente de produção, somente em um teste ou estágio experimental.", "Clear Username-LDAP User Mapping" : "Limpar Mapeamento de Usuário Nome de Usuário-LDAP", "Clear Groupname-LDAP Group Mapping" : "Limpar NomedoGrupo-LDAP Mapeamento do Grupo", - "Limit %s access to users meeting these criteria:" : "Limita o acesso a %s para usuários que satisfaçam estes critérios:" + "Limit %s access to users meeting these criteria:" : "Limita o acesso a %s para usuários que satisfaçam estes critérios:", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por padrão, o nome de usuário interno será criado a partir do atributo UUID. Isto garante que o nome de usuário é único e caracteress não precisam ser convertidos. O nome de usuário interno tem a restrição de que apenas estes caracteres são permitidos: [a-zA-Z0-9 _ @ -.]. Outros caracteres são substituídos por sua correspondência ASCII ou simplesmente omitidos. Em colisões será adicionado um número/adicionado. O nome de utilizador interno é utilizado para identificar um utilizador internamente. É também o nome padrão para a pasta de usuário doméstico. É também uma parte de URLs remotas, por exemplo para todos os serviços *DAV. Com esta definição, o comportamento padrão pode ser substituído. Para conseguir um comportamento semelhante como antes no ownCloud 5 insira o atributo do nome de exibição do usuário no campo seguinte. Deixe em branco para o comportamento padrão. As alterações terão efeito apenas em usuários LDAP recém-mapeados (adicionados)." },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/build/integration/features/provisioning-v1.feature b/build/integration/features/provisioning-v1.feature index 785b795bf35..180108b5ccd 100644 --- a/build/integration/features/provisioning-v1.feature +++ b/build/integration/features/provisioning-v1.feature @@ -293,6 +293,7 @@ Feature: provisioning | provisioning_api | | systemtags | | theming | + | twofactor_backupcodes | | updatenotification | | workflowengine | | files_external | diff --git a/core/Controller/TwoFactorChallengeController.php b/core/Controller/TwoFactorChallengeController.php index 48dea062812..b2614138123 100644 --- a/core/Controller/TwoFactorChallengeController.php +++ b/core/Controller/TwoFactorChallengeController.php @@ -82,9 +82,11 @@ class TwoFactorChallengeController extends Controller { public function selectChallenge($redirect_url) { $user = $this->userSession->getUser(); $providers = $this->twoFactorManager->getProviders($user); + $backupProvider = $this->twoFactorManager->getBackupProvider($user); $data = [ 'providers' => $providers, + 'backupProvider' => $backupProvider, 'redirect_url' => $redirect_url, 'logout_attribute' => $this->getLogoutAttribute(), ]; @@ -107,6 +109,12 @@ class TwoFactorChallengeController extends Controller { return new RedirectResponse($this->urlGenerator->linkToRoute('core.TwoFactorChallenge.selectChallenge')); } + $backupProvider = $this->twoFactorManager->getBackupProvider($user); + if (!is_null($backupProvider) && $backupProvider->getId() === $provider->getId()) { + // Don't show the backup provider link if we're already showing that provider's challenge + $backupProvider = null; + } + if ($this->session->exists('two_factor_auth_error')) { $this->session->remove('two_factor_auth_error'); $error = true; @@ -118,6 +126,7 @@ class TwoFactorChallengeController extends Controller { $data = [ 'error' => $error, 'provider' => $provider, + 'backupProvider' => $backupProvider, 'logout_attribute' => $this->getLogoutAttribute(), 'template' => $tmpl->fetchPage(), ]; diff --git a/core/css/styles.css b/core/css/styles.css index 25bc2d086d5..efc49e02a17 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -45,7 +45,7 @@ body { border: none !important; } -.two-factor-cancel { +.two-factor-link { display: inline-block; padding: 12px; color: rgba(255, 255, 255, .75); diff --git a/core/l10n/el.js b/core/l10n/el.js index 33e7e8b9f1e..66a40d00465 100644 --- a/core/l10n/el.js +++ b/core/l10n/el.js @@ -18,6 +18,7 @@ OC.L10N.register( "%s password reset" : "%s επαναφορά κωδικού πρόσβασης", "Couldn't send reset email. Please contact your administrator." : "Αδυναμία αποστολής ηλ. μηνύματος επαναφοράς. Παρακαλώ επικοινωνήστε με το διαχειριστή σας.", "Preparing update" : "Προετοιμασία ενημέρωσης", + "[%d / %d]: %s" : "[%d / %d]: %s", "Repair warning: " : "Προειδοποίηση διόρθωσης:", "Repair error: " : "Σφάλμα διόρθωσης:", "Turned on maintenance mode" : "Η κατάσταση συντήρησης ενεργοποιήθηκε", @@ -127,6 +128,8 @@ OC.L10N.register( "Expiration" : "Λήξη", "Expiration date" : "Ημερομηνία λήξης", "Choose a password for the public link" : "Επιλέξτε κωδικό για τον δημόσιο σύνδεσμο", + "Press ⌘-C to copy." : "Για αντιγραφή πατήστε ⌘-C.", + "Press Ctrl-C to copy." : "Για αντιγραφή πατήστε Ctrl-C.", "Resharing is not allowed" : "Ξαναμοιρασμός δεν επιτρέπεται", "Share link" : "Διαμοιρασμός συνδέσμου", "Link" : "Σύνδεσμος", @@ -150,10 +153,12 @@ OC.L10N.register( "delete" : "διαγραφή", "access control" : "έλεγχος πρόσβασης", "Share details could not be loaded for this item." : "Αδυναμία φόρτωσης λεπτομερειών διαμοιρασμού για αυτό το αντικείμενο.", + "{sharee} (group)" : "{sharee} (ομάδα)", "Share" : "Διαμοιρασμός", "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Διαμοιρασμός με άτομα σε άλλα ownClouds χρησιμοποιώντας την σύνταξη username@example.com/owncloud", "Warning" : "Προειδοποίηση", "Error while sending notification" : "Σφάλμα κατά την αποστολή ειδοποίησης", + "({scope})" : "({scope})", "Delete" : "Διαγραφή", "Rename" : "Μετονομασία", "The object type is not specified." : "Δεν καθορίστηκε ο τύπος του αντικειμένου.", diff --git a/core/l10n/el.json b/core/l10n/el.json index 9e223c8235d..ace5d9f2109 100644 --- a/core/l10n/el.json +++ b/core/l10n/el.json @@ -16,6 +16,7 @@ "%s password reset" : "%s επαναφορά κωδικού πρόσβασης", "Couldn't send reset email. Please contact your administrator." : "Αδυναμία αποστολής ηλ. μηνύματος επαναφοράς. Παρακαλώ επικοινωνήστε με το διαχειριστή σας.", "Preparing update" : "Προετοιμασία ενημέρωσης", + "[%d / %d]: %s" : "[%d / %d]: %s", "Repair warning: " : "Προειδοποίηση διόρθωσης:", "Repair error: " : "Σφάλμα διόρθωσης:", "Turned on maintenance mode" : "Η κατάσταση συντήρησης ενεργοποιήθηκε", @@ -125,6 +126,8 @@ "Expiration" : "Λήξη", "Expiration date" : "Ημερομηνία λήξης", "Choose a password for the public link" : "Επιλέξτε κωδικό για τον δημόσιο σύνδεσμο", + "Press ⌘-C to copy." : "Για αντιγραφή πατήστε ⌘-C.", + "Press Ctrl-C to copy." : "Για αντιγραφή πατήστε Ctrl-C.", "Resharing is not allowed" : "Ξαναμοιρασμός δεν επιτρέπεται", "Share link" : "Διαμοιρασμός συνδέσμου", "Link" : "Σύνδεσμος", @@ -148,10 +151,12 @@ "delete" : "διαγραφή", "access control" : "έλεγχος πρόσβασης", "Share details could not be loaded for this item." : "Αδυναμία φόρτωσης λεπτομερειών διαμοιρασμού για αυτό το αντικείμενο.", + "{sharee} (group)" : "{sharee} (ομάδα)", "Share" : "Διαμοιρασμός", "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Διαμοιρασμός με άτομα σε άλλα ownClouds χρησιμοποιώντας την σύνταξη username@example.com/owncloud", "Warning" : "Προειδοποίηση", "Error while sending notification" : "Σφάλμα κατά την αποστολή ειδοποίησης", + "({scope})" : "({scope})", "Delete" : "Διαγραφή", "Rename" : "Μετονομασία", "The object type is not specified." : "Δεν καθορίστηκε ο τύπος του αντικειμένου.", diff --git a/core/l10n/es.js b/core/l10n/es.js index e2090bcc143..51e939f9915 100644 --- a/core/l10n/es.js +++ b/core/l10n/es.js @@ -155,6 +155,7 @@ OC.L10N.register( "Link" : "Enlace", "Password protect" : "Protección con contraseña", "Password" : "Contraseña", + "Allow upload and editing" : "Permitir subito y edición", "Hide file listing" : "Ocultar la lista de archivos.", "Email link to person" : "Enviar enlace por correo electrónico a una persona", "Send" : "Enviar", @@ -292,6 +293,10 @@ OC.L10N.register( "This means only administrators can use the instance." : "Esto quiere decir que solo un administrador puede usarla.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Contacte con su administrador de sistemas si este mensaje persiste o aparece de forma inesperada.", "Thank you for your patience." : "Gracias por su paciencia.", + "Two-factor authentication" : "Autenticación de dos factores", + "Enhanced security is enabled for your account. Please authenticate using a second factor." : "La seguridad mejorada se ha habilitado para tu cuenta. Por favor, autenticar utilizando un segundo factor.", + "Cancel log in" : "Cancelar inicio de sesión", + "Error while validating your second factor" : "Error mientras validaba su factor segundo", "You are accessing the server from an untrusted domain." : "Está accediendo al servidor desde un dominio inseguro.", "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Contacte con su administrador. Si usted es el administrador, configure \"trusted_domains\" en config/config.php. En config/config.sample.php se encuentra un ejemplo para la configuración.", "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "Dependiendo de su configuración, como administrador, debería poder usar el botón de abajo para confiar en este dominio.", diff --git a/core/l10n/es.json b/core/l10n/es.json index 4cb9b4d7171..e0874557701 100644 --- a/core/l10n/es.json +++ b/core/l10n/es.json @@ -153,6 +153,7 @@ "Link" : "Enlace", "Password protect" : "Protección con contraseña", "Password" : "Contraseña", + "Allow upload and editing" : "Permitir subito y edición", "Hide file listing" : "Ocultar la lista de archivos.", "Email link to person" : "Enviar enlace por correo electrónico a una persona", "Send" : "Enviar", @@ -290,6 +291,10 @@ "This means only administrators can use the instance." : "Esto quiere decir que solo un administrador puede usarla.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Contacte con su administrador de sistemas si este mensaje persiste o aparece de forma inesperada.", "Thank you for your patience." : "Gracias por su paciencia.", + "Two-factor authentication" : "Autenticación de dos factores", + "Enhanced security is enabled for your account. Please authenticate using a second factor." : "La seguridad mejorada se ha habilitado para tu cuenta. Por favor, autenticar utilizando un segundo factor.", + "Cancel log in" : "Cancelar inicio de sesión", + "Error while validating your second factor" : "Error mientras validaba su factor segundo", "You are accessing the server from an untrusted domain." : "Está accediendo al servidor desde un dominio inseguro.", "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Contacte con su administrador. Si usted es el administrador, configure \"trusted_domains\" en config/config.php. En config/config.sample.php se encuentra un ejemplo para la configuración.", "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "Dependiendo de su configuración, como administrador, debería poder usar el botón de abajo para confiar en este dominio.", diff --git a/core/l10n/fi_FI.js b/core/l10n/fi_FI.js index 32497ea2653..26f3b290fce 100644 --- a/core/l10n/fi_FI.js +++ b/core/l10n/fi_FI.js @@ -6,10 +6,10 @@ OC.L10N.register( "Invalid file provided" : "Määritetty virheellinen tiedosto", "No image or file provided" : "Kuvaa tai tiedostoa ei määritelty", "Unknown filetype" : "Tuntematon tiedostotyyppi", - "Invalid image" : "Virhellinen kuva", + "Invalid image" : "Virheellinen kuva", "An error occurred. Please contact your admin." : "Tapahtui virhe. Ota yhteys ylläpitoon.", "No temporary profile picture available, try again" : "Väliaikaista profiilikuvaa ei ole käytettävissä, yritä uudelleen", - "No crop data provided" : "Puutteellinen tieto", + "No crop data provided" : "Leikkaustietoa ei annettu", "No valid crop data provided" : "Kelvollisia leikkaustietoja ei määritetty", "Crop is not square" : "Leikkaus ei ole neliö", "Couldn't reset password because the token is invalid" : "Salasanaa ei voitu palauttaa koska valtuutus on virheellinen", @@ -160,7 +160,7 @@ OC.L10N.register( "group" : "ryhmä", "remote" : "etä", "notify by email" : "ilmoita sähköpostitse", - "Unshare" : "Peru jakaminen", + "Unshare" : "Lopeta jakaminen", "can share" : "voi jakaa", "can edit" : "voi muokata", "create" : "luo", @@ -191,11 +191,11 @@ OC.L10N.register( "Delete" : "Poista", "Rename" : "Nimeä uudelleen", "Collaborative tags" : "Yhteistyölliset tunnisteet", - "The object type is not specified." : "The object type is not specified.", + "The object type is not specified." : "Objektin tyyppiä ei ole määritelty.", "Enter new" : "Kirjoita uusi", "Add" : "Lisää", "Edit tags" : "Muokkaa tunnisteita", - "Error loading dialog template: {error}" : "Virhe ladatessa keskustelupohja: {error}", + "Error loading dialog template: {error}" : "Virhe ladatessa lomakepohjaa: {error}", "No tags selected for deletion." : "Tunnisteita ei valittu poistettavaksi.", "unknown text" : "tuntematon teksti", "Hello world!" : "Hei maailma!", diff --git a/core/l10n/fi_FI.json b/core/l10n/fi_FI.json index 5792e6e97a0..3bbca0a4811 100644 --- a/core/l10n/fi_FI.json +++ b/core/l10n/fi_FI.json @@ -4,10 +4,10 @@ "Invalid file provided" : "Määritetty virheellinen tiedosto", "No image or file provided" : "Kuvaa tai tiedostoa ei määritelty", "Unknown filetype" : "Tuntematon tiedostotyyppi", - "Invalid image" : "Virhellinen kuva", + "Invalid image" : "Virheellinen kuva", "An error occurred. Please contact your admin." : "Tapahtui virhe. Ota yhteys ylläpitoon.", "No temporary profile picture available, try again" : "Väliaikaista profiilikuvaa ei ole käytettävissä, yritä uudelleen", - "No crop data provided" : "Puutteellinen tieto", + "No crop data provided" : "Leikkaustietoa ei annettu", "No valid crop data provided" : "Kelvollisia leikkaustietoja ei määritetty", "Crop is not square" : "Leikkaus ei ole neliö", "Couldn't reset password because the token is invalid" : "Salasanaa ei voitu palauttaa koska valtuutus on virheellinen", @@ -158,7 +158,7 @@ "group" : "ryhmä", "remote" : "etä", "notify by email" : "ilmoita sähköpostitse", - "Unshare" : "Peru jakaminen", + "Unshare" : "Lopeta jakaminen", "can share" : "voi jakaa", "can edit" : "voi muokata", "create" : "luo", @@ -189,11 +189,11 @@ "Delete" : "Poista", "Rename" : "Nimeä uudelleen", "Collaborative tags" : "Yhteistyölliset tunnisteet", - "The object type is not specified." : "The object type is not specified.", + "The object type is not specified." : "Objektin tyyppiä ei ole määritelty.", "Enter new" : "Kirjoita uusi", "Add" : "Lisää", "Edit tags" : "Muokkaa tunnisteita", - "Error loading dialog template: {error}" : "Virhe ladatessa keskustelupohja: {error}", + "Error loading dialog template: {error}" : "Virhe ladatessa lomakepohjaa: {error}", "No tags selected for deletion." : "Tunnisteita ei valittu poistettavaksi.", "unknown text" : "tuntematon teksti", "Hello world!" : "Hei maailma!", diff --git a/core/l10n/it.js b/core/l10n/it.js index 339a9c82873..92daefd04d2 100644 --- a/core/l10n/it.js +++ b/core/l10n/it.js @@ -155,6 +155,7 @@ OC.L10N.register( "Link" : "Collegamento", "Password protect" : "Proteggi con password", "Password" : "Password", + "Allow upload and editing" : "Consenti il caricamento e la modifica", "Hide file listing" : "Nascondi elenco dei file", "Email link to person" : "Invia collegamento via email", "Send" : "Invia", @@ -292,6 +293,10 @@ OC.L10N.register( "This means only administrators can use the instance." : "Ciò significa che solo gli amministratori possono utilizzare l'istanza.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Contatta il tuo amministratore di sistema se questo messaggio persiste o appare inaspettatamente.", "Thank you for your patience." : "Grazie per la pazienza.", + "Two-factor authentication" : "Autenticazione a due fattori", + "Enhanced security is enabled for your account. Please authenticate using a second factor." : "La sicurezza migliorata è stata abilitata per il tuo account. Autenticati utilizzando un secondo fattore.", + "Cancel log in" : "Annulla l'accesso", + "Error while validating your second factor" : "Errore durante la convalida del tuo secondo fattore", "You are accessing the server from an untrusted domain." : "Stai accedendo al server da un dominio non attendibile.", "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Contatta il tuo amministratore di sistema. Se sei un amministratore di questa istanza, configura l'impostazione \"trusted_domains\" in config/config.php. Una configurazione di esempio è disponibile in config/config.sample.php.", "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "In base alla tua configurazione, come amministratore potrai utilizzare anche il pulsante in basso per rendere attendibile questo dominio.", diff --git a/core/l10n/it.json b/core/l10n/it.json index 69c8c783d41..2eea698b0cc 100644 --- a/core/l10n/it.json +++ b/core/l10n/it.json @@ -153,6 +153,7 @@ "Link" : "Collegamento", "Password protect" : "Proteggi con password", "Password" : "Password", + "Allow upload and editing" : "Consenti il caricamento e la modifica", "Hide file listing" : "Nascondi elenco dei file", "Email link to person" : "Invia collegamento via email", "Send" : "Invia", @@ -290,6 +291,10 @@ "This means only administrators can use the instance." : "Ciò significa che solo gli amministratori possono utilizzare l'istanza.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Contatta il tuo amministratore di sistema se questo messaggio persiste o appare inaspettatamente.", "Thank you for your patience." : "Grazie per la pazienza.", + "Two-factor authentication" : "Autenticazione a due fattori", + "Enhanced security is enabled for your account. Please authenticate using a second factor." : "La sicurezza migliorata è stata abilitata per il tuo account. Autenticati utilizzando un secondo fattore.", + "Cancel log in" : "Annulla l'accesso", + "Error while validating your second factor" : "Errore durante la convalida del tuo secondo fattore", "You are accessing the server from an untrusted domain." : "Stai accedendo al server da un dominio non attendibile.", "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Contatta il tuo amministratore di sistema. Se sei un amministratore di questa istanza, configura l'impostazione \"trusted_domains\" in config/config.php. Una configurazione di esempio è disponibile in config/config.sample.php.", "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "In base alla tua configurazione, come amministratore potrai utilizzare anche il pulsante in basso per rendere attendibile questo dominio.", diff --git a/core/l10n/nl.js b/core/l10n/nl.js index b601b2cff2a..d00f78b9cec 100644 --- a/core/l10n/nl.js +++ b/core/l10n/nl.js @@ -155,6 +155,7 @@ OC.L10N.register( "Link" : "Link", "Password protect" : "Wachtwoord beveiligd", "Password" : "Wachtwoord", + "Allow upload and editing" : "Toestaan uploaden en bewerken", "Hide file listing" : "Verberg bestandsoverzicht", "Email link to person" : "E-mail link naar persoon", "Send" : "Versturen", @@ -292,6 +293,10 @@ OC.L10N.register( "This means only administrators can use the instance." : "Dat betekent dat alleen beheerders deze installatie kunnen gebruiken.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Neem contact op met je systeembeheerder als deze melding aanhoudt of onverwacht verscheen.", "Thank you for your patience." : "Bedankt voor je geduld.", + "Two-factor authentication" : "Tweefactor authenticatie", + "Enhanced security is enabled for your account. Please authenticate using a second factor." : "Aanvullende beveiliging is ingeschakeld voor je account. Log in met een tweede factor.", + "Cancel log in" : "Inlog annuleren", + "Error while validating your second factor" : "Fout bij het verifiëren van je tweede factor", "You are accessing the server from an untrusted domain." : "Je benadert de server vanaf een niet vertrouwd domein.", "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Neem contact op met je beheerder. Als je zelf de beheerder van deze service bent, configureer dan de \"trusted_domains\" instelling in config/config.php. Een voorbeeldconfiguratie is gegeven in config/config.sample.php.", "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "Afhankelijk van je configuratie zou je als beheerder ook de onderstaande knop kunnen gebruiken om dit domein te vertrouwen.", diff --git a/core/l10n/nl.json b/core/l10n/nl.json index 98327cc5547..51067ba5dc4 100644 --- a/core/l10n/nl.json +++ b/core/l10n/nl.json @@ -153,6 +153,7 @@ "Link" : "Link", "Password protect" : "Wachtwoord beveiligd", "Password" : "Wachtwoord", + "Allow upload and editing" : "Toestaan uploaden en bewerken", "Hide file listing" : "Verberg bestandsoverzicht", "Email link to person" : "E-mail link naar persoon", "Send" : "Versturen", @@ -290,6 +291,10 @@ "This means only administrators can use the instance." : "Dat betekent dat alleen beheerders deze installatie kunnen gebruiken.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Neem contact op met je systeembeheerder als deze melding aanhoudt of onverwacht verscheen.", "Thank you for your patience." : "Bedankt voor je geduld.", + "Two-factor authentication" : "Tweefactor authenticatie", + "Enhanced security is enabled for your account. Please authenticate using a second factor." : "Aanvullende beveiliging is ingeschakeld voor je account. Log in met een tweede factor.", + "Cancel log in" : "Inlog annuleren", + "Error while validating your second factor" : "Fout bij het verifiëren van je tweede factor", "You are accessing the server from an untrusted domain." : "Je benadert de server vanaf een niet vertrouwd domein.", "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Neem contact op met je beheerder. Als je zelf de beheerder van deze service bent, configureer dan de \"trusted_domains\" instelling in config/config.php. Een voorbeeldconfiguratie is gegeven in config/config.sample.php.", "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "Afhankelijk van je configuratie zou je als beheerder ook de onderstaande knop kunnen gebruiken om dit domein te vertrouwen.", diff --git a/core/l10n/pl.js b/core/l10n/pl.js index bdb73502b21..69c6865b607 100644 --- a/core/l10n/pl.js +++ b/core/l10n/pl.js @@ -134,6 +134,9 @@ OC.L10N.register( "Expiration" : "Wygaśnięcie", "Expiration date" : "Data wygaśnięcia", "Choose a password for the public link" : "Wybierz hasło dla linku publicznego", + "Copied!" : "Skopiowano!", + "Press ⌘-C to copy." : "Wciśnij ⌘-C by skopiować.", + "Press Ctrl-C to copy." : "Wciśnij Ctrl-C by skopiować,", "Resharing is not allowed" : "Współdzielenie nie jest możliwe", "Share link" : "Udostępnij link", "Link" : "Odnośnik", @@ -192,6 +195,7 @@ OC.L10N.register( "Hello {name}" : "Witaj {name}", "new" : "nowy", "_download %n file_::_download %n files_" : ["pobrano %n plik","pobrano %n plików","pobrano %n plików"], + "The update is in progress, leaving this page might interrupt the process in some environments." : "Trwa aktualizacja. W niektórych przypadkach, opuszczenie tej strony może przerwać ten proces.", "Update to {version}" : "Uaktualnij do {version}", "An error occurred." : "Wystąpił błąd", "Please reload the page." : "Proszę przeładować stronę", @@ -272,6 +276,8 @@ OC.L10N.register( "This means only administrators can use the instance." : "To oznacza, że tylko administratorzy mogą w tej chwili używać aplikacji.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Skontaktuj się z administratorem, jeśli ten komunikat pojawił się nieoczekiwanie lub wyświetla się ciągle.", "Thank you for your patience." : "Dziękuję za cierpliwość.", + "Two-factor authentication" : "Uwierzytelnianie dwuskładnikowe", + "Enhanced security is enabled for your account. Please authenticate using a second factor." : "Dla Twojego konta uruchomiono wzmocnioną ochronę. Uwierzytelnij przy pomocy drugiego składnika.", "You are accessing the server from an untrusted domain." : "Dostajesz się do serwera z niezaufanej domeny.", "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Proszę skontaktować się z Twoim administratorem. Jeżeli Ty jesteś administratorem tej instalacji, skonfiguruj ustawienie \"trusted_domains\" w pliku config/config.php. Przykład konfiguracji jest zawarty w pliku config/config.sample.php.", "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "W zależności od konfiguracji, jako administrator możesz także użyć poniższego przycisku aby zaufać tej domenie.", @@ -299,13 +305,18 @@ OC.L10N.register( "Error unfavoriting" : "Błąd przy usuwaniu z ulubionych", "Couldn't send mail to following users: %s " : "Nie można było wysłać wiadomości do następujących użytkowników: %s", "Allow editing" : "Pozwól na edycję", + "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "Trwa aktualizacja. W niektórych przypadkach, opuszczenie tej strony może przerwać ten proces.", "Updating to {version}" : "Uaktualnianie do {version}", + "The update was successful. There were warnings." : "Aktualizacja przebiegła pomyślnie. Pojawiły się ostrzeżenia.", "Two-step verification" : "Weryfikacja dwuskładnikowa", "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "Dla Twojego konta uruchomiono wzmocnioną ochronę. Uwierzytelnij przy pomocy drugiego składnika.", "Cancel login" : "Anuluj logowanie", "Please authenticate using the selected factor." : "Uwierzytelnij przy pomocy wybranego składnika", "An error occured while verifying the token" : "Wystąpił błąd podczas weryfikacji tokena", + "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Serwer WWW nie jest poprawnie skonfigurowany, aby wyświetlić \"{url}\". Więcej informacji można znaleźć w naszej <a target=\"_blank\" href=\"{docLink}\">dokumentacji</a>.", "An error occured. Please try again" : "Wystąpił błąd. Proszę spróbować ponownie.", + "Updating {productName} to version {version}, this may take a while." : "AKtualizowanie {productName} do wersji {version}, może to trochę potrwać.", + "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Aby uzyskać informację jak poprawnie skonfigurować Twój serwer, zajrzyj do <a href=\"%s\" target=\"_blank\">dokumentacji</a>.", "An internal error occured." : "Wystąpił wewnętrzny błąd." }, "nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/core/l10n/pl.json b/core/l10n/pl.json index e01462c23a2..b07e10ccbf3 100644 --- a/core/l10n/pl.json +++ b/core/l10n/pl.json @@ -132,6 +132,9 @@ "Expiration" : "Wygaśnięcie", "Expiration date" : "Data wygaśnięcia", "Choose a password for the public link" : "Wybierz hasło dla linku publicznego", + "Copied!" : "Skopiowano!", + "Press ⌘-C to copy." : "Wciśnij ⌘-C by skopiować.", + "Press Ctrl-C to copy." : "Wciśnij Ctrl-C by skopiować,", "Resharing is not allowed" : "Współdzielenie nie jest możliwe", "Share link" : "Udostępnij link", "Link" : "Odnośnik", @@ -190,6 +193,7 @@ "Hello {name}" : "Witaj {name}", "new" : "nowy", "_download %n file_::_download %n files_" : ["pobrano %n plik","pobrano %n plików","pobrano %n plików"], + "The update is in progress, leaving this page might interrupt the process in some environments." : "Trwa aktualizacja. W niektórych przypadkach, opuszczenie tej strony może przerwać ten proces.", "Update to {version}" : "Uaktualnij do {version}", "An error occurred." : "Wystąpił błąd", "Please reload the page." : "Proszę przeładować stronę", @@ -270,6 +274,8 @@ "This means only administrators can use the instance." : "To oznacza, że tylko administratorzy mogą w tej chwili używać aplikacji.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Skontaktuj się z administratorem, jeśli ten komunikat pojawił się nieoczekiwanie lub wyświetla się ciągle.", "Thank you for your patience." : "Dziękuję za cierpliwość.", + "Two-factor authentication" : "Uwierzytelnianie dwuskładnikowe", + "Enhanced security is enabled for your account. Please authenticate using a second factor." : "Dla Twojego konta uruchomiono wzmocnioną ochronę. Uwierzytelnij przy pomocy drugiego składnika.", "You are accessing the server from an untrusted domain." : "Dostajesz się do serwera z niezaufanej domeny.", "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Proszę skontaktować się z Twoim administratorem. Jeżeli Ty jesteś administratorem tej instalacji, skonfiguruj ustawienie \"trusted_domains\" w pliku config/config.php. Przykład konfiguracji jest zawarty w pliku config/config.sample.php.", "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "W zależności od konfiguracji, jako administrator możesz także użyć poniższego przycisku aby zaufać tej domenie.", @@ -297,13 +303,18 @@ "Error unfavoriting" : "Błąd przy usuwaniu z ulubionych", "Couldn't send mail to following users: %s " : "Nie można było wysłać wiadomości do następujących użytkowników: %s", "Allow editing" : "Pozwól na edycję", + "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "Trwa aktualizacja. W niektórych przypadkach, opuszczenie tej strony może przerwać ten proces.", "Updating to {version}" : "Uaktualnianie do {version}", + "The update was successful. There were warnings." : "Aktualizacja przebiegła pomyślnie. Pojawiły się ostrzeżenia.", "Two-step verification" : "Weryfikacja dwuskładnikowa", "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "Dla Twojego konta uruchomiono wzmocnioną ochronę. Uwierzytelnij przy pomocy drugiego składnika.", "Cancel login" : "Anuluj logowanie", "Please authenticate using the selected factor." : "Uwierzytelnij przy pomocy wybranego składnika", "An error occured while verifying the token" : "Wystąpił błąd podczas weryfikacji tokena", + "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Serwer WWW nie jest poprawnie skonfigurowany, aby wyświetlić \"{url}\". Więcej informacji można znaleźć w naszej <a target=\"_blank\" href=\"{docLink}\">dokumentacji</a>.", "An error occured. Please try again" : "Wystąpił błąd. Proszę spróbować ponownie.", + "Updating {productName} to version {version}, this may take a while." : "AKtualizowanie {productName} do wersji {version}, może to trochę potrwać.", + "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Aby uzyskać informację jak poprawnie skonfigurować Twój serwer, zajrzyj do <a href=\"%s\" target=\"_blank\">dokumentacji</a>.", "An internal error occured." : "Wystąpił wewnętrzny błąd." },"pluralForm" :"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" }
\ No newline at end of file diff --git a/core/l10n/pt_BR.js b/core/l10n/pt_BR.js index 3234d64f976..50105e63540 100644 --- a/core/l10n/pt_BR.js +++ b/core/l10n/pt_BR.js @@ -155,6 +155,7 @@ OC.L10N.register( "Link" : "Link", "Password protect" : "Proteger com senha", "Password" : "Senha", + "Allow upload and editing" : "Permitir envio e edição", "Hide file listing" : "Listar arquivo oculto", "Email link to person" : "Enviar link por e-mail", "Send" : "Enviar", @@ -292,6 +293,10 @@ OC.L10N.register( "This means only administrators can use the instance." : "Isso significa que apenas os administradores podem usar esta instância.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Contacte o seu administrador do sistema se esta mensagem persistir ou aparecer inesperadamente.", "Thank you for your patience." : "Obrigado pela sua paciência.", + "Two-factor authentication" : "Autenticação de dois fatores", + "Enhanced security is enabled for your account. Please authenticate using a second factor." : "Segurança aprimorada está habilitado para sua conta. Por favor autenticar usando um segundo fator.", + "Cancel log in" : "Cancelar login", + "Error while validating your second factor" : "Erro ao validar o seu segundo fator", "You are accessing the server from an untrusted domain." : "Você está acessando o servidor a partir de um domínio não confiável.", "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Por favor entre em contato com o administrador. Se você é um administrador deste exemplo, configure a definição \"trusted_domains\" em config/config.php. Um exemplo de configuração é fornecido em config/config.sample.php.", "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "Dependendo da configuração, como administrador, você também pode ser capaz de usar o botão abaixo para confiar neste domínio.", @@ -318,6 +323,7 @@ OC.L10N.register( "Error favoriting" : "Erro colocando nos favoritos", "Error unfavoriting" : "Erro retirando do favoritos", "Couldn't send mail to following users: %s " : "Não foi possível enviar e-mail para os seguintes usuários: %s", + "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Este servidor não tem nenhuma conexão com a Internet. Isso significa que alguns dos recursos como montar armazenamento externo, notificações sobre atualizações ou instalação de aplicativos de terceiros não vai funcionar. Acessar arquivos remotamente e envio de e-mails de notificação pode não funcionar, também. Sugerimos permitir conexão com a Internet para este servidor, se você quer ter todas as funcionalidades.", "Allow editing" : "Permitir edição", "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "A atualização está em andamento. Sair desta página poderá interromper o processo em alguns ambientes.", "Updating to {version}" : "Atualizando para {version}", @@ -328,6 +334,13 @@ OC.L10N.register( "Please authenticate using the selected factor." : "Por favor autenticar usando o fator selecionado.", "An error occured while verifying the token" : "Ocorreu um erro ao verificar o token", "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Seu servidor web não está configurado corretamente para abrir a URL \"{url}\". Mais informações podem ser encontradas em nossa <a target=\"_blank\" href=\"{docLink}\">documentação</a>.", + "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Nenhum cache de memória foi configurado. Para melhorar o seu desempenho, por favor configurar um cache de memória, se disponível. Mais informações podem ser encontradas em nossa <a target=\"_blank\" href=\"{docLink}\">documentação</a>.", + "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "/dev/urandom não é legível pelo PHP que é altamente desencorajado por razões de segurança. Mais informação pode ser encontrada na nossa <a target=\"_blank\" href=\"{docLink}\">documentação</a>.", + "You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "Você está rodando o PHP {version}. Nós o incentivamos a atualizar sua versão do PHP para aproveitar <a target=\"_blank\" href=\"{phpLink}\"> atualizações de desempenho e de segurança fornecidos pelo Grupo PHP </a>, logo que a sua distribuição for compatível.", + "The reverse proxy headers configuration is incorrect, or you are accessing Nextcloud from a trusted proxy. If you are not accessing Nextcloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to Nextcloud. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "A configuração cabeçalhos do proxy reverso está incorreta, ou você está acessando Nextcloud de um proxy confiável. Se você não estiver acessando Nextcloud de um proxy confiável, esta é uma questão de segurança e pode permitir a um invasor falsificar o endereço IP como visíveis para Nextcloud. Mais informações podem ser encontradas em nossa <a target=\"_blank\" href=\"{docLink}\">documentação</a>.", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached é configurado como cache distribuído, mas o módulo PHP errado \"memcache\" está instalado. \\OC\\Memcache\\Memcached suporta apenas \"memcached\" e não \"memcache\". Veja <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki sobre ambos os módulos</a>.", + "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Alguns arquivos não passaram na verificação de integridade. Mais informações sobre como resolver este problema pode ser encontrado em nossa <a target=\"_blank\" href=\"{docLink}\">documentação</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lista de arquivos inválidos…</a> / <a href=\"{rescanEndpoint}\">Reescanear…</a>)", + "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "O cabeçalho HTTP \"Strict-Transport-Security\" não está configurado para pelo menos \"{seconds}\" segundos. Para maior segurança recomendamos a ativação HSTS como descrito em nosso <a href=\"{docUrl}\">dicas de segurança</a>.", "An error occured. Please try again" : "Ocorreu um erro. Tente novamente", "not assignable" : "não atribuível", "Updating {productName} to version {version}, this may take a while." : "Atualizando o {productName} para a versão {version}. Isso pode levar algum tempo.", diff --git a/core/l10n/pt_BR.json b/core/l10n/pt_BR.json index ae63f883867..ebf0a6563eb 100644 --- a/core/l10n/pt_BR.json +++ b/core/l10n/pt_BR.json @@ -153,6 +153,7 @@ "Link" : "Link", "Password protect" : "Proteger com senha", "Password" : "Senha", + "Allow upload and editing" : "Permitir envio e edição", "Hide file listing" : "Listar arquivo oculto", "Email link to person" : "Enviar link por e-mail", "Send" : "Enviar", @@ -290,6 +291,10 @@ "This means only administrators can use the instance." : "Isso significa que apenas os administradores podem usar esta instância.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Contacte o seu administrador do sistema se esta mensagem persistir ou aparecer inesperadamente.", "Thank you for your patience." : "Obrigado pela sua paciência.", + "Two-factor authentication" : "Autenticação de dois fatores", + "Enhanced security is enabled for your account. Please authenticate using a second factor." : "Segurança aprimorada está habilitado para sua conta. Por favor autenticar usando um segundo fator.", + "Cancel log in" : "Cancelar login", + "Error while validating your second factor" : "Erro ao validar o seu segundo fator", "You are accessing the server from an untrusted domain." : "Você está acessando o servidor a partir de um domínio não confiável.", "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Por favor entre em contato com o administrador. Se você é um administrador deste exemplo, configure a definição \"trusted_domains\" em config/config.php. Um exemplo de configuração é fornecido em config/config.sample.php.", "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "Dependendo da configuração, como administrador, você também pode ser capaz de usar o botão abaixo para confiar neste domínio.", @@ -316,6 +321,7 @@ "Error favoriting" : "Erro colocando nos favoritos", "Error unfavoriting" : "Erro retirando do favoritos", "Couldn't send mail to following users: %s " : "Não foi possível enviar e-mail para os seguintes usuários: %s", + "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Este servidor não tem nenhuma conexão com a Internet. Isso significa que alguns dos recursos como montar armazenamento externo, notificações sobre atualizações ou instalação de aplicativos de terceiros não vai funcionar. Acessar arquivos remotamente e envio de e-mails de notificação pode não funcionar, também. Sugerimos permitir conexão com a Internet para este servidor, se você quer ter todas as funcionalidades.", "Allow editing" : "Permitir edição", "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "A atualização está em andamento. Sair desta página poderá interromper o processo em alguns ambientes.", "Updating to {version}" : "Atualizando para {version}", @@ -326,6 +332,13 @@ "Please authenticate using the selected factor." : "Por favor autenticar usando o fator selecionado.", "An error occured while verifying the token" : "Ocorreu um erro ao verificar o token", "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Seu servidor web não está configurado corretamente para abrir a URL \"{url}\". Mais informações podem ser encontradas em nossa <a target=\"_blank\" href=\"{docLink}\">documentação</a>.", + "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Nenhum cache de memória foi configurado. Para melhorar o seu desempenho, por favor configurar um cache de memória, se disponível. Mais informações podem ser encontradas em nossa <a target=\"_blank\" href=\"{docLink}\">documentação</a>.", + "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "/dev/urandom não é legível pelo PHP que é altamente desencorajado por razões de segurança. Mais informação pode ser encontrada na nossa <a target=\"_blank\" href=\"{docLink}\">documentação</a>.", + "You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "Você está rodando o PHP {version}. Nós o incentivamos a atualizar sua versão do PHP para aproveitar <a target=\"_blank\" href=\"{phpLink}\"> atualizações de desempenho e de segurança fornecidos pelo Grupo PHP </a>, logo que a sua distribuição for compatível.", + "The reverse proxy headers configuration is incorrect, or you are accessing Nextcloud from a trusted proxy. If you are not accessing Nextcloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to Nextcloud. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "A configuração cabeçalhos do proxy reverso está incorreta, ou você está acessando Nextcloud de um proxy confiável. Se você não estiver acessando Nextcloud de um proxy confiável, esta é uma questão de segurança e pode permitir a um invasor falsificar o endereço IP como visíveis para Nextcloud. Mais informações podem ser encontradas em nossa <a target=\"_blank\" href=\"{docLink}\">documentação</a>.", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached é configurado como cache distribuído, mas o módulo PHP errado \"memcache\" está instalado. \\OC\\Memcache\\Memcached suporta apenas \"memcached\" e não \"memcache\". Veja <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki sobre ambos os módulos</a>.", + "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Alguns arquivos não passaram na verificação de integridade. Mais informações sobre como resolver este problema pode ser encontrado em nossa <a target=\"_blank\" href=\"{docLink}\">documentação</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lista de arquivos inválidos…</a> / <a href=\"{rescanEndpoint}\">Reescanear…</a>)", + "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "O cabeçalho HTTP \"Strict-Transport-Security\" não está configurado para pelo menos \"{seconds}\" segundos. Para maior segurança recomendamos a ativação HSTS como descrito em nosso <a href=\"{docUrl}\">dicas de segurança</a>.", "An error occured. Please try again" : "Ocorreu um erro. Tente novamente", "not assignable" : "não atribuível", "Updating {productName} to version {version}, this may take a while." : "Atualizando o {productName} para a versão {version}. Isso pode levar algum tempo.", diff --git a/core/shipped.json b/core/shipped.json index f944d9d4c11..0ddaf68eb64 100644 --- a/core/shipped.json +++ b/core/shipped.json @@ -28,6 +28,7 @@ "survey_client", "systemtags", "templateeditor", + "twofactor_backupcodes", "theming", "updatenotification", "user_external", @@ -39,6 +40,7 @@ "files", "dav", "federatedfilesharing", + "twofactor_backupcodes", "workflowengine" ] } diff --git a/core/templates/twofactorselectchallenge.php b/core/templates/twofactorselectchallenge.php index 1948499e604..5cfba8bcb47 100644 --- a/core/templates/twofactorselectchallenge.php +++ b/core/templates/twofactorselectchallenge.php @@ -19,4 +19,12 @@ </ul> </p> </div> -<a class="two-factor-cancel" <?php print_unescaped($_['logout_attribute']); ?>><?php p($l->t('Cancel log in')) ?></a> +<a class="two-factor-link" <?php print_unescaped($_['logout_attribute']); ?>><?php p($l->t('Cancel log in')) ?></a> +<?php if (!is_null($_['backupProvider'])): ?> +<a class="two-factor-link" href="<?php p(\OC::$server->getURLGenerator()->linkToRoute('core.TwoFactorChallenge.showChallenge', + [ + 'challengeProviderId' => $_['backupProvider']->getId(), + 'redirect_url' => $_['redirect_url'], + ] + )) ?>"><?php p($l->t('Use backup code')) ?></a> +<?php endif; diff --git a/core/templates/twofactorshowchallenge.php b/core/templates/twofactorshowchallenge.php index fb161921675..197de8a288e 100644 --- a/core/templates/twofactorshowchallenge.php +++ b/core/templates/twofactorshowchallenge.php @@ -16,4 +16,12 @@ $template = $_['template']; <?php endif; ?> <?php print_unescaped($template); ?> </div> -<a class="two-factor-cancel" <?php print_unescaped($_['logout_attribute']); ?>><?php p($l->t('Cancel log in')) ?></a> +<a class="two-factor-link" <?php print_unescaped($_['logout_attribute']); ?>><?php p($l->t('Cancel log in')) ?></a> +<?php if (!is_null($_['backupProvider'])): ?> +<a class="two-factor-link" href="<?php p(\OC::$server->getURLGenerator()->linkToRoute('core.TwoFactorChallenge.showChallenge', + [ + 'challengeProviderId' => $_['backupProvider']->getId(), + 'redirect_url' => $_['redirect_url'], + ] + )) ?>"><?php p($l->t('Use backup code')) ?></a> +<?php endif; diff --git a/lib/l10n/el.js b/lib/l10n/el.js index 60112f3d8e2..b05ad5b98fe 100644 --- a/lib/l10n/el.js +++ b/lib/l10n/el.js @@ -15,6 +15,8 @@ OC.L10N.register( "Library %s with a version higher than %s is required - available version %s." : "Απαιτείται βιβλιοθήκη %s νεότερη από την έκδοση %s - διαθέσιμη έκδοση %s ", "Library %s with a version lower than %s is required - available version %s." : "Απαιτείται βιβλιοθήκη %s παλαιότερη από την έκδοση %s - διαθέσιμη έκδοση %s ", "Following platforms are supported: %s" : "Οι ακόλουθες πλατφόρμες υποστηρίζονται: %s", + "Server version %s or higher is required." : "Απαιτείται έκδοση διακομιστή %s ή νεότερη.", + "Server version %s or lower is required." : "Απαιτείται έκδοση διακομιστή %s ή παλαιότερη.", "Unknown filetype" : "Άγνωστος τύπος αρχείου", "Invalid image" : "Μη έγκυρη εικόνα", "today" : "σήμερα", @@ -42,6 +44,9 @@ OC.L10N.register( "App does not provide an info.xml file" : "Η εφαρμογή δεν παρέχει αρχείο info.xml", "App can't be installed because of not allowed code in the App" : "Η εφαρμογή δεν μπορεί να εγκατασταθεί λόγω μη-επιτρεπόμενου κώδικα μέσα στην Εφαρμογή", "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Η εφαρμογή δεν μπορεί να εγκατασταθεί επειδή περιέχει την ετικέτα <shipped>σωστή</shipped> που δεν επιτρέπεται για μη-ενσωματωμένες εφαρμογές", + "Server settings" : "Ρυθμίσεις διακομιστή", + "Sharing" : "Διαμοιρασμός", + "Encryption" : "Κρυπτογράφηση", "%s enter the database username." : "%s εισάγετε το όνομα χρήστη της βάσης δεδομένων.", "%s enter the database name." : "%s εισάγετε το όνομα της βάσης δεδομένων.", "%s you may not use dots in the database name" : "%s μάλλον δεν χρησιμοποιείτε τελείες στο όνομα της βάσης δεδομένων", diff --git a/lib/l10n/el.json b/lib/l10n/el.json index 9c856742b78..f3314f75867 100644 --- a/lib/l10n/el.json +++ b/lib/l10n/el.json @@ -13,6 +13,8 @@ "Library %s with a version higher than %s is required - available version %s." : "Απαιτείται βιβλιοθήκη %s νεότερη από την έκδοση %s - διαθέσιμη έκδοση %s ", "Library %s with a version lower than %s is required - available version %s." : "Απαιτείται βιβλιοθήκη %s παλαιότερη από την έκδοση %s - διαθέσιμη έκδοση %s ", "Following platforms are supported: %s" : "Οι ακόλουθες πλατφόρμες υποστηρίζονται: %s", + "Server version %s or higher is required." : "Απαιτείται έκδοση διακομιστή %s ή νεότερη.", + "Server version %s or lower is required." : "Απαιτείται έκδοση διακομιστή %s ή παλαιότερη.", "Unknown filetype" : "Άγνωστος τύπος αρχείου", "Invalid image" : "Μη έγκυρη εικόνα", "today" : "σήμερα", @@ -40,6 +42,9 @@ "App does not provide an info.xml file" : "Η εφαρμογή δεν παρέχει αρχείο info.xml", "App can't be installed because of not allowed code in the App" : "Η εφαρμογή δεν μπορεί να εγκατασταθεί λόγω μη-επιτρεπόμενου κώδικα μέσα στην Εφαρμογή", "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Η εφαρμογή δεν μπορεί να εγκατασταθεί επειδή περιέχει την ετικέτα <shipped>σωστή</shipped> που δεν επιτρέπεται για μη-ενσωματωμένες εφαρμογές", + "Server settings" : "Ρυθμίσεις διακομιστή", + "Sharing" : "Διαμοιρασμός", + "Encryption" : "Κρυπτογράφηση", "%s enter the database username." : "%s εισάγετε το όνομα χρήστη της βάσης δεδομένων.", "%s enter the database name." : "%s εισάγετε το όνομα της βάσης δεδομένων.", "%s you may not use dots in the database name" : "%s μάλλον δεν χρησιμοποιείτε τελείες στο όνομα της βάσης δεδομένων", diff --git a/lib/l10n/es.js b/lib/l10n/es.js index 74151649ca7..a031e5f2e94 100644 --- a/lib/l10n/es.js +++ b/lib/l10n/es.js @@ -52,7 +52,14 @@ OC.L10N.register( "App can't be installed because it is not compatible with this version of the server" : "La aplicación no se puede instalar porque no es compatible con esta versión del servidor", "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "La aplicación no se puede instalar porque contiene la etiqueta\n<shipped>\ntrue\n</shipped>\nque no está permitida para aplicaciones no distribuidas", "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "La App no se puede instalar debido a que la versión de info.xml no es la misma que la versión reportada por la App Store.", + "APCu" : "APCu", + "Redis" : "Redis", + "Server settings" : "Configuración del servidor", + "Sharing" : "Compartir", + "Encryption" : "Cifrado", + "Logging" : "Inicio de sesión", "Additional settings" : "Configuración adicional", + "Tips & tricks" : "Sugerencias y trucos", "%s enter the database username and name." : "%s introduzca el nombre de usuario y la contraseña de la BBDD.", "%s enter the database username." : "%s ingresar el usuario de la base de datos.", "%s enter the database name." : "%s ingresar el nombre de la base de datos", @@ -169,6 +176,12 @@ OC.L10N.register( "Storage incomplete configuration. %s" : "Configuración de almacenamiento incompleta. %s", "Storage connection error. %s" : "Error de conexión de almacenamiento. %s", "Storage not available" : "Almacenamiento no disponible", - "Storage connection timeout. %s" : "Tiempo de conexión de almacenamiento agotado. %s" + "Storage connection timeout. %s" : "Tiempo de conexión de almacenamiento agotado. %s", + "ownCloud %s or higher is required." : "Se necesita la versión %s o superior.", + "ownCloud %s or lower is required." : "Se necesita la versión %s o inferior.", + "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "La aplicación \"%s\" no se puede instalar porque no es compatible con esta versión de Nextcloud.", + "App can't be installed because it is not compatible with this version of Nextcloud" : "La aplicación no se puede instalar porque no es compatible con esta versión de Nextcloud", + "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "La App no se puede instalar debido a que la versión de info.xml no es la misma que la versión informada por la app store.", + "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Truco: Se puede acelerar la actualización ejecutando este comando SQL de forma manual: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" }, "nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/es.json b/lib/l10n/es.json index 5bce0a0cef6..8088ee05358 100644 --- a/lib/l10n/es.json +++ b/lib/l10n/es.json @@ -50,7 +50,14 @@ "App can't be installed because it is not compatible with this version of the server" : "La aplicación no se puede instalar porque no es compatible con esta versión del servidor", "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "La aplicación no se puede instalar porque contiene la etiqueta\n<shipped>\ntrue\n</shipped>\nque no está permitida para aplicaciones no distribuidas", "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "La App no se puede instalar debido a que la versión de info.xml no es la misma que la versión reportada por la App Store.", + "APCu" : "APCu", + "Redis" : "Redis", + "Server settings" : "Configuración del servidor", + "Sharing" : "Compartir", + "Encryption" : "Cifrado", + "Logging" : "Inicio de sesión", "Additional settings" : "Configuración adicional", + "Tips & tricks" : "Sugerencias y trucos", "%s enter the database username and name." : "%s introduzca el nombre de usuario y la contraseña de la BBDD.", "%s enter the database username." : "%s ingresar el usuario de la base de datos.", "%s enter the database name." : "%s ingresar el nombre de la base de datos", @@ -167,6 +174,12 @@ "Storage incomplete configuration. %s" : "Configuración de almacenamiento incompleta. %s", "Storage connection error. %s" : "Error de conexión de almacenamiento. %s", "Storage not available" : "Almacenamiento no disponible", - "Storage connection timeout. %s" : "Tiempo de conexión de almacenamiento agotado. %s" + "Storage connection timeout. %s" : "Tiempo de conexión de almacenamiento agotado. %s", + "ownCloud %s or higher is required." : "Se necesita la versión %s o superior.", + "ownCloud %s or lower is required." : "Se necesita la versión %s o inferior.", + "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "La aplicación \"%s\" no se puede instalar porque no es compatible con esta versión de Nextcloud.", + "App can't be installed because it is not compatible with this version of Nextcloud" : "La aplicación no se puede instalar porque no es compatible con esta versión de Nextcloud", + "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "La App no se puede instalar debido a que la versión de info.xml no es la misma que la versión informada por la app store.", + "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Truco: Se puede acelerar la actualización ejecutando este comando SQL de forma manual: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/lib/l10n/ru.js b/lib/l10n/ru.js index 0ea76e4ba6f..3d7c7e587c1 100644 --- a/lib/l10n/ru.js +++ b/lib/l10n/ru.js @@ -52,6 +52,14 @@ OC.L10N.register( "App can't be installed because it is not compatible with this version of the server" : "Приложение не может быть установлено, потому что оно несовместимо с этой версией сервера", "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Приложение невозможно установить. Оно содержит параметр <shipped>true</shipped> который не допустим для приложений, не входящих в поставку.", "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Приложение невозможно установить. Версия в файле info.xml не совпадает с версией заявленной в магазине приложений", + "APCu" : "APCu", + "Redis" : "Redis", + "Server settings" : "Настройки сервера", + "Sharing" : "Общий доступ", + "Encryption" : "Шифрование", + "Logging" : "Журнал", + "Additional settings" : "Дополнительные настройки", + "Tips & tricks" : "Советы и трюки", "%s enter the database username and name." : "%s укажите имя пользователя и название для базы данных.", "%s enter the database username." : "%s введите имя пользователя базы данных.", "%s enter the database name." : "%s введите имя базы данных.", @@ -168,6 +176,14 @@ OC.L10N.register( "Storage incomplete configuration. %s" : "Неполная конфигурация хранилища. %s", "Storage connection error. %s" : "Ошибка подключения к хранилищу. %s", "Storage not available" : "Хранилище недоступно", - "Storage connection timeout. %s" : "Истекло время ожидания подключения к хранилищу. %s" + "Storage connection timeout. %s" : "Истекло время ожидания подключения к хранилищу. %s", + "ownCloud %s or higher is required." : "Требуется NextCloud версии %s или выше.", + "ownCloud %s or lower is required." : "Требуется NextCloud версии %s или ниже.", + "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "Приложение \"%s\" не может быть установлено, так как оно несовместимо с этой версией Nextcloud.", + "App can't be installed because it is not compatible with this version of Nextcloud" : "Приложение не может быть установлено, так как оно несовместимо с этой версией Nextcloud.", + "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "Приложение не может быть установлено, поскольку версия в файле info.xml/version не совпадает с версией, заявленной в магазине приложений", + "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Совет: вы можете ускорить процесс обновления, выполнив SQL-запрос самостоятельно: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;", + "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Nextcloud Server на платформе Microsoft Windows не поддерживается. Если у вас нет возможности установить на сервер Linux, рекомендуем воспользоваться виртуальной машиной. Соответствующие пакеты можно найти на странице <a href=\"%s\">%s</a>. Для переноса на Linux уже имеющейся установки некоторые советы и рекомендации есть в <a href=\"%s\">нашей документации</a>.", + "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Как правило, это можно исправить, <a href=\"%s\" target=\"_blank\">предоставив веб-серверу права на запись в корневой каталог</a>." }, "nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"); diff --git a/lib/l10n/ru.json b/lib/l10n/ru.json index 210146675d9..1acc4c4ad57 100644 --- a/lib/l10n/ru.json +++ b/lib/l10n/ru.json @@ -50,6 +50,14 @@ "App can't be installed because it is not compatible with this version of the server" : "Приложение не может быть установлено, потому что оно несовместимо с этой версией сервера", "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Приложение невозможно установить. Оно содержит параметр <shipped>true</shipped> который не допустим для приложений, не входящих в поставку.", "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Приложение невозможно установить. Версия в файле info.xml не совпадает с версией заявленной в магазине приложений", + "APCu" : "APCu", + "Redis" : "Redis", + "Server settings" : "Настройки сервера", + "Sharing" : "Общий доступ", + "Encryption" : "Шифрование", + "Logging" : "Журнал", + "Additional settings" : "Дополнительные настройки", + "Tips & tricks" : "Советы и трюки", "%s enter the database username and name." : "%s укажите имя пользователя и название для базы данных.", "%s enter the database username." : "%s введите имя пользователя базы данных.", "%s enter the database name." : "%s введите имя базы данных.", @@ -166,6 +174,14 @@ "Storage incomplete configuration. %s" : "Неполная конфигурация хранилища. %s", "Storage connection error. %s" : "Ошибка подключения к хранилищу. %s", "Storage not available" : "Хранилище недоступно", - "Storage connection timeout. %s" : "Истекло время ожидания подключения к хранилищу. %s" + "Storage connection timeout. %s" : "Истекло время ожидания подключения к хранилищу. %s", + "ownCloud %s or higher is required." : "Требуется NextCloud версии %s или выше.", + "ownCloud %s or lower is required." : "Требуется NextCloud версии %s или ниже.", + "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "Приложение \"%s\" не может быть установлено, так как оно несовместимо с этой версией Nextcloud.", + "App can't be installed because it is not compatible with this version of Nextcloud" : "Приложение не может быть установлено, так как оно несовместимо с этой версией Nextcloud.", + "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "Приложение не может быть установлено, поскольку версия в файле info.xml/version не совпадает с версией, заявленной в магазине приложений", + "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Совет: вы можете ускорить процесс обновления, выполнив SQL-запрос самостоятельно: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;", + "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Nextcloud Server на платформе Microsoft Windows не поддерживается. Если у вас нет возможности установить на сервер Linux, рекомендуем воспользоваться виртуальной машиной. Соответствующие пакеты можно найти на странице <a href=\"%s\">%s</a>. Для переноса на Linux уже имеющейся установки некоторые советы и рекомендации есть в <a href=\"%s\">нашей документации</a>.", + "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Как правило, это можно исправить, <a href=\"%s\" target=\"_blank\">предоставив веб-серверу права на запись в корневой каталог</a>." },"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);" }
\ No newline at end of file diff --git a/lib/private/Authentication/TwoFactorAuth/Manager.php b/lib/private/Authentication/TwoFactorAuth/Manager.php index 143fe7dc927..1bea7aa3478 100644 --- a/lib/private/Authentication/TwoFactorAuth/Manager.php +++ b/lib/private/Authentication/TwoFactorAuth/Manager.php @@ -35,6 +35,8 @@ use OCP\IUser; class Manager { const SESSION_UID_KEY = 'two_factor_auth_uid'; + const BACKUP_CODES_APP_ID = 'twofactor_backupcodes'; + const BACKUP_CODES_PROVIDER_ID = 'backup_codes'; /** @var AppManager */ private $appManager; @@ -93,21 +95,35 @@ class Manager { * @return IProvider|null */ public function getProvider(IUser $user, $challengeProviderId) { - $providers = $this->getProviders($user); + $providers = $this->getProviders($user, true); return isset($providers[$challengeProviderId]) ? $providers[$challengeProviderId] : null; } /** + * @param IUser $user + * @return IProvider|null the backup provider, if enabled for the given user + */ + public function getBackupProvider(IUser $user) { + $providers = $this->getProviders($user, true); + return $providers[self::BACKUP_CODES_PROVIDER_ID]; + } + + /** * Get the list of 2FA providers for the given user * * @param IUser $user + * @param bool $includeBackupApp * @return IProvider[] */ - public function getProviders(IUser $user) { + public function getProviders(IUser $user, $includeBackupApp = false) { $allApps = $this->appManager->getEnabledAppsForUser($user); $providers = []; foreach ($allApps as $appId) { + if (!$includeBackupApp && $appId === self::BACKUP_CODES_APP_ID) { + continue; + } + $info = $this->appManager->getAppInfo($appId); if (isset($info['two-factor-providers'])) { $providerClasses = $info['two-factor-providers']; diff --git a/lib/private/Setup/PostgreSQL.php b/lib/private/Setup/PostgreSQL.php index 3647d5bdcec..85755ea4218 100644 --- a/lib/private/Setup/PostgreSQL.php +++ b/lib/private/Setup/PostgreSQL.php @@ -143,7 +143,7 @@ class PostgreSQL extends AbstractDatabase { try { if ($this->userExists($connection)) { // change the password - $query = $connection->prepare("ALTER ROLE " . addslashes($this->dbUser) . " CREATEDB WITH PASSWORD '" . addslashes($this->dbPassword) . "'"); + $query = $connection->prepare("ALTER ROLE " . addslashes($this->dbUser) . " WITH CREATEDB PASSWORD '" . addslashes($this->dbPassword) . "'"); } else { // create the user $query = $connection->prepare("CREATE USER " . addslashes($this->dbUser) . " CREATEDB PASSWORD '" . addslashes($this->dbPassword) . "'"); diff --git a/lib/public/AppFramework/Http/OCSResponse.php b/lib/public/AppFramework/Http/OCSResponse.php index 0fb0f9678d0..cfda8ea4f75 100644 --- a/lib/public/AppFramework/Http/OCSResponse.php +++ b/lib/public/AppFramework/Http/OCSResponse.php @@ -29,11 +29,10 @@ namespace OCP\AppFramework\Http; -use OCP\AppFramework\Http; - /** * A renderer for OCS responses * @since 8.1.0 + * @deprecated 9.2.0 To implement an OCS endpoint extend the OCSController */ class OCSResponse extends Response { @@ -53,6 +52,7 @@ class OCSResponse extends Response { * @param int|string $itemscount * @param int|string $itemsperpage * @since 8.1.0 + * @deprecated 9.2.0 To implement an OCS endpoint extend the OCSController */ public function __construct($format, $statuscode, $message, $data=[], $itemscount='', @@ -79,6 +79,7 @@ class OCSResponse extends Response { /** * @return string * @since 8.1.0 + * @deprecated 9.2.0 To implement an OCS endpoint extend the OCSController */ public function render() { $r = new \OC_OCS_Result($this->data, $this->statuscode, $this->message); diff --git a/settings/l10n/cs_CZ.js b/settings/l10n/cs_CZ.js index 6d49f6cea8d..5ef1751162e 100644 --- a/settings/l10n/cs_CZ.js +++ b/settings/l10n/cs_CZ.js @@ -301,6 +301,7 @@ OC.L10N.register( "Done" : "Dokončeno", "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Vyvíjeno {communityopen}Nextcloud komunitou{linkclose}, {githubopen}zdrojový kód{linkclose} je licencován pod {licenseopen}AGPL{linkclose}.", "Follow us on Google Plus!" : "Sledujte nás na Google Plus!", + "Like our facebook page!" : "Označte naši facebookovou stránku jako \"To se mi líbí\"!", "Subscribe to our twitter channel!" : "Odebírejte náš twitter kanál!", "Subscribe to our news feed!" : "Odebírejte náš kanál s novinkami!", "Subscribe to our newsletter!" : "Odebírejte náš newsletter!", diff --git a/settings/l10n/cs_CZ.json b/settings/l10n/cs_CZ.json index 9f4cedb4731..c97580dbdf4 100644 --- a/settings/l10n/cs_CZ.json +++ b/settings/l10n/cs_CZ.json @@ -299,6 +299,7 @@ "Done" : "Dokončeno", "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Vyvíjeno {communityopen}Nextcloud komunitou{linkclose}, {githubopen}zdrojový kód{linkclose} je licencován pod {licenseopen}AGPL{linkclose}.", "Follow us on Google Plus!" : "Sledujte nás na Google Plus!", + "Like our facebook page!" : "Označte naši facebookovou stránku jako \"To se mi líbí\"!", "Subscribe to our twitter channel!" : "Odebírejte náš twitter kanál!", "Subscribe to our news feed!" : "Odebírejte náš kanál s novinkami!", "Subscribe to our newsletter!" : "Odebírejte náš newsletter!", diff --git a/settings/l10n/de.js b/settings/l10n/de.js index c03862c0249..59b0bcb0a26 100644 --- a/settings/l10n/de.js +++ b/settings/l10n/de.js @@ -300,11 +300,11 @@ OC.L10N.register( "Username" : "Benutzername", "Done" : "Erledigt", "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Entwickelt von der {communityopen}Nextcloud community{linkclose}, der {githubopen}Quellcode{linkclose} ist lizensiert unter {licenseopen}AGPL{linkclose}-Lizenz.", - "Follow us on Google Plus!" : "Folgen Sie uns zu Google Plus!", + "Follow us on Google Plus!" : "Folgen Sie uns auf Google Plus!", "Like our facebook page!" : "Like uns auf unserer Facebook-Seite!", "Subscribe to our twitter channel!" : "Abonniere unseren Twitter-Kanal!", "Subscribe to our news feed!" : "Abonniere unseren RSS-Feed!", - "Subscribe to our newsletter!" : "Abonnieren Sie unseren Newsletter!", + "Subscribe to our newsletter!" : "Abonniere unseren Newsletter!", "Show storage location" : "Speicherort anzeigen", "Show last log in" : "Letzte Anmeldung anzeigen", "Show user backend" : "Benutzer-Backend anzeigen", diff --git a/settings/l10n/de.json b/settings/l10n/de.json index e2d6cf70595..155d29c1e05 100644 --- a/settings/l10n/de.json +++ b/settings/l10n/de.json @@ -298,11 +298,11 @@ "Username" : "Benutzername", "Done" : "Erledigt", "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Entwickelt von der {communityopen}Nextcloud community{linkclose}, der {githubopen}Quellcode{linkclose} ist lizensiert unter {licenseopen}AGPL{linkclose}-Lizenz.", - "Follow us on Google Plus!" : "Folgen Sie uns zu Google Plus!", + "Follow us on Google Plus!" : "Folgen Sie uns auf Google Plus!", "Like our facebook page!" : "Like uns auf unserer Facebook-Seite!", "Subscribe to our twitter channel!" : "Abonniere unseren Twitter-Kanal!", "Subscribe to our news feed!" : "Abonniere unseren RSS-Feed!", - "Subscribe to our newsletter!" : "Abonnieren Sie unseren Newsletter!", + "Subscribe to our newsletter!" : "Abonniere unseren Newsletter!", "Show storage location" : "Speicherort anzeigen", "Show last log in" : "Letzte Anmeldung anzeigen", "Show user backend" : "Benutzer-Backend anzeigen", diff --git a/settings/l10n/el.js b/settings/l10n/el.js index 7802dd2b04b..958f0035dfc 100644 --- a/settings/l10n/el.js +++ b/settings/l10n/el.js @@ -1,16 +1,16 @@ OC.L10N.register( "settings", { + "Enabled" : "Ενεργοποιημένο", + "Not enabled" : "Μη ενεργοποιημένο", "Wrong password" : "Εσφαλμένο συνθηματικό", "Saved" : "Αποθηκεύτηκαν", "No user supplied" : "Δεν εισήχθη χρήστης", + "Unable to change password" : "Αδυναμία αλλαγής συνθηματικού", "Authentication error" : "Σφάλμα πιστοποίησης", "Please provide an admin recovery password, otherwise all user data will be lost" : "Παρακαλώ παρέχετε έναν κωδικό ανάκτησης διαχειριστή, διαφορετικά όλα τα δεδομένα χρήστη θα χαθούν", "Wrong admin recovery password. Please check the password and try again." : "Λάθος κωδικός ανάκτησης διαχειριστή. Παρακαλώ ελέγξτε τον κωδικό και δοκιμάστε ξανά.", "Backend doesn't support password change, but the user's encryption key was successfully updated." : "Το σύστημα δεν υποστηρίζει αλλαγή κωδικού, αλλά το κλειδί κρυπτογράφησης του χρήστη ενημερώθηκε επιτυχώς.", - "Unable to change password" : "Αδυναμία αλλαγής συνθηματικού", - "Enabled" : "Ενεργοποιημένο", - "Not enabled" : "Μη ενεργοποιημένο", "installing and updating apps via the app store or Federated Cloud Sharing" : "εγκατάσταση και ενημέρωση εφαρμογών μέσω του καταστήματος εφαρμογών ή του ", "Federated Cloud Sharing" : "Διαμοιρασμός σε ομόσπονδα σύννεφα ", "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "Το cURL χρησιμοποιεί μια παρωχημένη %s έκδοση (%s). Παρακαλούμε αναβαθμίστε το λειτουργικό σας σύστημα αλλιώς δυνατότητες όπως %s δεν θα δουλέψουν αξιόπιστα.", @@ -35,17 +35,6 @@ OC.L10N.register( "Email saved" : "Το email αποθηκεύτηκε ", "Your full name has been changed." : "Το πλήρες όνομά σας άλλαξε.", "Unable to change full name" : "Δεν ήταν δυνατή η αλλαγή του πλήρους ονόματός σας", - "APCu" : "APCu", - "Redis" : "Redis", - "Security & setup warnings" : "Προειδοποιήσεις ασφάλειας & ρυθμίσεων", - "Sharing" : "Διαμοιρασμός", - "Server-side encryption" : "Κρυπτογράφηση από τον Διακομιστή", - "External Storage" : "Εξωτερικό Αποθηκευτικό Μέσο", - "Cron" : "Cron", - "Email server" : "Διακομιστής Email", - "Log" : "Καταγραφές", - "Tips & tricks" : "Συμβουλές & τεχνάσματα", - "Updates" : "Ενημερώσεις", "Couldn't remove app." : "Αδυναμία αφαίρεσης εφαρμογής.", "Language changed" : "Η γλώσσα άλλαξε", "Invalid request" : "Μη έγκυρο αίτημα", @@ -79,6 +68,15 @@ OC.L10N.register( "Uninstall" : "Απεγκατάσταση", "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Η εφαρμογή έχει ενεργοποιηθεί αλλά χρειάζεται ενημέρωση. Θα μεταφερθείτε στη σελίδα ενημέρωσης σε 5 δευτερόλεπτα.", "App update" : "Ενημέρωση εφαρμογής", + "Disconnect" : "Αποσύνδεση", + "Edge" : "Edge", + "Firefox" : "Firefox", + "Google Chrome" : "Google Chrome", + "Safari" : "Safari", + "Google Chrome for Android" : "Google Chrome για Android", + "iPhone" : "iPhone", + "Press ⌘-C to copy." : "Για αντιγραφή πατήστε ⌘-C.", + "Press Ctrl-C to copy." : "Για αντιγραφή πατήστε Ctrl-C.", "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Προέκυψε σφάλμα. Παρακαλούμε μεταφορτώστε ένα πιστοποιητικό PEM κωδικοποιημένο κατά ASCII.", "Valid until {date}" : "Έγκυρο έως {date}", "Delete" : "Διαγραφή", @@ -97,24 +95,62 @@ OC.L10N.register( "never" : "ποτέ", "deleted {userName}" : "διαγραφή {userName}", "Changing the password will result in data loss, because data recovery is not available for this user" : "Η αλλαγή του κωδικού πρόσβασης θα έχει ως αποτέλεσμα το χάσιμο δεδομένων, επειδή η ανάκτηση δεδομένων δεν είναι διαθέσιμη γι' αυτόν τον χρήστη", + "Password successfully changed" : "Το συνθηματικό αλλάχτηκε επιτυχώς", "A valid username must be provided" : "Πρέπει να δοθεί έγκυρο όνομα χρήστη", + "Error creating user: {message}" : "Σφάλμα δημιουργίας χρήστη: {message}", "A valid password must be provided" : "Πρέπει να δοθεί έγκυρο συνθηματικό", "A valid email must be provided" : "Πρέπει να εισαχθεί ένα έγκυρο email", "__language_name__" : "__όνομα_γλώσσας__", "Unlimited" : "Απεριόριστο", "Personal info" : "Προσωπικές Πληροφορίες", "Sync clients" : "Συγχρονισμός πελατών", - "Everything (fatal issues, errors, warnings, info, debug)" : "Όλα (καίρια ζητήματα, σφάλματα, προειδοποιήσεις, πληροφορίες, αποσφαλμάτωση)", - "Info, warnings, errors and fatal issues" : "Πληροφορίες, προειδοποιήσεις, σφάλματα και καίρια ζητήματα", - "Warnings, errors and fatal issues" : "Προειδοποιήσεις, σφάλματα και καίρια ζητήματα", - "Errors and fatal issues" : "Σφάλματα και καίρια ζητήματα", - "Fatal issues only" : "Καίρια ζητήματα μόνο", "None" : "Τίποτα", "Login" : "Σύνδεση", "Plain" : "Απλό", "NT LAN Manager" : "Διαχειριστης NT LAN", "SSL" : "SSL", "TLS" : "TLS", + "Email server" : "Διακομιστής Email", + "Open documentation" : "Ανοιχτή τεκμηρίωση.", + "This is used for sending out notifications." : "Χρησιμοποιείται για αποστολή ειδοποιήσεων.", + "Send mode" : "Κατάσταση αποστολής", + "Encryption" : "Κρυπτογράφηση", + "From address" : "Από τη διεύθυνση", + "mail" : "ταχυδρομείο", + "Authentication method" : "Μέθοδος πιστοποίησης", + "Authentication required" : "Απαιτείται πιστοποίηση", + "Server address" : "Διεύθυνση διακομιστή", + "Port" : "Θύρα", + "Credentials" : "Πιστοποιητικά", + "SMTP Username" : "Όνομα χρήστη SMTP", + "SMTP Password" : "Συνθηματικό SMTP", + "Store credentials" : "Διαπιστευτήρια αποθήκευσης", + "Test email settings" : "Δοκιμή ρυθμίσεων email", + "Send email" : "Αποστολή email", + "Server-side encryption" : "Κρυπτογράφηση από τον Διακομιστή", + "Enable server-side encryption" : "Ενεργοποίηση κρυπτογράφησης από το διακομιστή", + "Please read carefully before activating server-side encryption: " : "Παρακαλούμε διαβάστε προσεκτικά πριν ενεργοποιήσετε την κρυπτογράφηση στο διακομιστή:", + "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Μόλις ενεργοποιηθεί η κρυπτογράφηση, όλα τα αρχεία που θα μεταφορτωθούν από αυτό το σημείο και μετά θα κρυπτογραφηθούν στο διακομιστή. Η κρυπτογράφηση είναι δυνατόν να απενεργοποιηθεί αργότερα μόνο αν το ενεργό άρθρωμα κρυπτογράφησης υποστηρίζει αυτή τη λειτουργία και εκπληρούνται όλες οι προϋποθέσεις (πχ ορισμός κλειδιού ανάκτησης).", + "Be aware that encryption always increases the file size." : "Έχετε στο νου σας πως η κρυπτογράφηση πάντα αυξάνει το μέγεθος του αρχείου", + "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Είναι πάντοτε καλό να δημιουργείτε τακτικά αντίγραφα ασφαλείας των δεδομένων σας, στην περίπτωση της κρυπτογράφησης βεβαιωθείτε ότι έχετε λάβει αντίγραφο ασφαλείας των κλειδιών κρυπτογράφησης παράλληλα με τα δεδομένα σας.", + "This is the final warning: Do you really want to enable encryption?" : "Αυτή είναι η τελευταία προειδοποίηση: Θέλετε πραγματικά να ενεργοποιήσετε την κρυπτογράφηση;", + "Enable encryption" : "Ενεργοποίηση κρυπτογράφησης", + "No encryption module loaded, please enable an encryption module in the app menu." : "Δεν έχει φορτωθεί μονάδα κρυπτογράφησης, παρακαλούμε φορτώστε μια μονάδα κρυπτογράφησης από το μενού εφαρμογών.", + "Select default encryption module:" : "Επιλογή προεπιλεγμένης μονάδας κρυπτογράφησης:", + "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please enable the \"Default encryption module\" and run 'occ encryption:migrate'" : "Πρέπει να μεταφέρετε τα κλειδιά κρυπτογράφησής σας από την παλιά κρυπτογράφηση (ownCloud <= 8.0) στην καινούρια. Παρακαλούμε ενεργοποιήστε την \"Προεπιλεγμένη Μονάδα Κρυπτογράφησης\" και εκτελέστε την εντολή 'occ encryption:migrate'", + "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "Πρέπει να μεταφέρετε τα κλειδιά σας κρυπτογράφησης από την παλιά κρυπτογράφηση (ownCloud <= 8.0) στην καινούρια.", + "Start migration" : "Έναρξη μετάβασης", + "Everything (fatal issues, errors, warnings, info, debug)" : "Όλα (καίρια ζητήματα, σφάλματα, προειδοποιήσεις, πληροφορίες, αποσφαλμάτωση)", + "Info, warnings, errors and fatal issues" : "Πληροφορίες, προειδοποιήσεις, σφάλματα και καίρια ζητήματα", + "Warnings, errors and fatal issues" : "Προειδοποιήσεις, σφάλματα και καίρια ζητήματα", + "Errors and fatal issues" : "Σφάλματα και καίρια ζητήματα", + "Fatal issues only" : "Καίρια ζητήματα μόνο", + "Log" : "Καταγραφές", + "Download logfile" : "Λήψη αρχείου ιστορικού", + "More" : "Περισσότερα", + "Less" : "Λιγότερα", + "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Το αρχείο ιστορικού είναι μεγαλύτερο από 100ΜΒ. Η λήψη του ίσως πάρει λίγη ώρα!", + "Security & setup warnings" : "Προειδοποιήσεις ασφάλειας & ρυθμίσεων", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "Η php δεν φαίνεται να είναι σωστά ρυθμισμένη για ερωτήματα σε μεταβλητές περιβάλλοντος του συστήματος. Η δοκιμή με την εντολή getenv(\"PATH\") επιστρέφει κενή απάντηση.", "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Η ρύθμιση \"μόνο ανάγνωση\" έχει ενεργοποιηθεί. Αυτό εμποδίζει τον καθορισμό κάποιων ρυθμίσεων μέσω της διεπαφής web. Επιπλέον, το αρχείο πρέπει να γίνει χειροκίνητα εγγράψιμο πριν από κάθε διαδικασία ενημέρωσης.", "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "Ο PHP φαίνεται να είναι ρυθμισμένος ώστε να αφαιρεί μπλοκ εσωτερικών κειμένων (inline doc). Αυτό θα καταστήσει κύριες εφαρμογές μη-διαθέσιμες.", @@ -126,7 +162,15 @@ OC.L10N.register( "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Αν η εγκατάστασή σας δεν έχει γίνει στο root του τομέα και χρησιμοποιείται το cron του συστήματος, μπορεί να υπάρξουν ζητήματα με τη δημιουργία URL. Για να αποφύγετε αυτά τα προβλήματα, παρακαλώ ρυθμίστε την επιλογή \"overwrite.cli.url\" στο αρχείο config.php που βρίσκεται στη διαδρομή webroot της εγκατάστασής σας (Suggested: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Δεν ήταν δυνατή η εκτέλεση της cronjob μέσω τερματικού. Εμφανίστηκαν τα παρακάτω τεχνικά σφάλματα:", "All checks passed." : "Όλοι οι έλεγχοι επιτυχείς.", - "Open documentation" : "Ανοιχτή τεκμηρίωση.", + "Cron" : "Cron", + "Last cron job execution: %s." : "Τελευταία εκτέλεση cron job: %s.", + "Last cron job execution: %s. Something seems wrong." : "Τελευταία εκτέλεση cron job: %s. Κάτι πήγε στραβά.", + "Cron was not executed yet!" : "Η διεργασία cron δεν έχει εκτελεστεί ακόμα!", + "Execute one task with each page loaded" : "Εκτελεί μια διεργασία κάθε φορά που φορτώνεται μια σελίδα", + "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "Το cron.php είναι καταχωρημένο σε μια υπηρεσία webcron ώστε να καλεί το cron.php κάθε 15 λεπτά μέσω http.", + "Use system's cron service to call the cron.php file every 15 minutes." : "Χρησιμοποιήστε την cron υπηρεσία του συτήματος για να καλέσετε το cron.php αρχείο κάθε 15 λεπτά.", + "Version" : "Έκδοση", + "Sharing" : "Διαμοιρασμός", "Allow apps to use the Share API" : "Επιτρέπει την χρήση του API διαμοιρασμού σε εφαρμογές ", "Allow users to share via link" : "Να επιτρέπεται σε χρήστες ο διαμοιρασμός μέσω συνδέσμου", "Allow public uploads" : "Επιτρέπεται το κοινόχρηστο ανέβασμα", @@ -142,43 +186,7 @@ OC.L10N.register( "Exclude groups from sharing" : "Εξαίρεση ομάδων από τον διαμοιρασμό", "These groups will still be able to receive shares, but not to initiate them." : "Αυτές οι ομάδες θα συνεχίσουν να λαμβάνουν διαμοιρασμούς, αλλά δεν θα είναι δυνατό να τους δημιουργήσουν.", "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Να επιτρέπεται η χρήση αυτόματης συμπλήρωσης στο διάλογο διαμοιρασμού. Αν αυτό είναι απενεργοποιημένο θα πρέπει να εισαχθεί το πλήρες όνομα χρήστη.", - "Last cron job execution: %s." : "Τελευταία εκτέλεση cron job: %s.", - "Last cron job execution: %s. Something seems wrong." : "Τελευταία εκτέλεση cron job: %s. Κάτι πήγε στραβά.", - "Cron was not executed yet!" : "Η διεργασία cron δεν έχει εκτελεστεί ακόμα!", - "Execute one task with each page loaded" : "Εκτελεί μια διεργασία κάθε φορά που φορτώνεται μια σελίδα", - "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "Το cron.php είναι καταχωρημένο σε μια υπηρεσία webcron ώστε να καλεί το cron.php κάθε 15 λεπτά μέσω http.", - "Use system's cron service to call the cron.php file every 15 minutes." : "Χρησιμοποιήστε την cron υπηρεσία του συτήματος για να καλέσετε το cron.php αρχείο κάθε 15 λεπτά.", - "Enable server-side encryption" : "Ενεργοποίηση κρυπτογράφησης από το διακομιστή", - "Please read carefully before activating server-side encryption: " : "Παρακαλούμε διαβάστε προσεκτικά πριν ενεργοποιήσετε την κρυπτογράφηση στο διακομιστή:", - "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Μόλις ενεργοποιηθεί η κρυπτογράφηση, όλα τα αρχεία που θα μεταφορτωθούν από αυτό το σημείο και μετά θα κρυπτογραφηθούν στο διακομιστή. Η κρυπτογράφηση είναι δυνατόν να απενεργοποιηθεί αργότερα μόνο αν το ενεργό άρθρωμα κρυπτογράφησης υποστηρίζει αυτή τη λειτουργία και εκπληρούνται όλες οι προϋποθέσεις (πχ ορισμός κλειδιού ανάκτησης).", - "Be aware that encryption always increases the file size." : "Έχετε στο νου σας πως η κρυπτογράφηση πάντα αυξάνει το μέγεθος του αρχείου", - "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Είναι πάντοτε καλό να δημιουργείτε τακτικά αντίγραφα ασφαλείας των δεδομένων σας, στην περίπτωση της κρυπτογράφησης βεβαιωθείτε ότι έχετε λάβει αντίγραφο ασφαλείας των κλειδιών κρυπτογράφησης παράλληλα με τα δεδομένα σας.", - "This is the final warning: Do you really want to enable encryption?" : "Αυτή είναι η τελευταία προειδοποίηση: Θέλετε πραγματικά να ενεργοποιήσετε την κρυπτογράφηση;", - "Enable encryption" : "Ενεργοποίηση κρυπτογράφησης", - "No encryption module loaded, please enable an encryption module in the app menu." : "Δεν έχει φορτωθεί μονάδα κρυπτογράφησης, παρακαλούμε φορτώστε μια μονάδα κρυπτογράφησης από το μενού εφαρμογών.", - "Select default encryption module:" : "Επιλογή προεπιλεγμένης μονάδας κρυπτογράφησης:", - "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please enable the \"Default encryption module\" and run 'occ encryption:migrate'" : "Πρέπει να μεταφέρετε τα κλειδιά κρυπτογράφησής σας από την παλιά κρυπτογράφηση (ownCloud <= 8.0) στην καινούρια. Παρακαλούμε ενεργοποιήστε την \"Προεπιλεγμένη Μονάδα Κρυπτογράφησης\" και εκτελέστε την εντολή 'occ encryption:migrate'", - "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "Πρέπει να μεταφέρετε τα κλειδιά σας κρυπτογράφησης από την παλιά κρυπτογράφηση (ownCloud <= 8.0) στην καινούρια.", - "Start migration" : "Έναρξη μετάβασης", - "This is used for sending out notifications." : "Χρησιμοποιείται για αποστολή ειδοποιήσεων.", - "Send mode" : "Κατάσταση αποστολής", - "Encryption" : "Κρυπτογράφηση", - "From address" : "Από τη διεύθυνση", - "mail" : "ταχυδρομείο", - "Authentication method" : "Μέθοδος πιστοποίησης", - "Authentication required" : "Απαιτείται πιστοποίηση", - "Server address" : "Διεύθυνση διακομιστή", - "Port" : "Θύρα", - "Credentials" : "Πιστοποιητικά", - "SMTP Username" : "Όνομα χρήστη SMTP", - "SMTP Password" : "Συνθηματικό SMTP", - "Store credentials" : "Διαπιστευτήρια αποθήκευσης", - "Test email settings" : "Δοκιμή ρυθμίσεων email", - "Send email" : "Αποστολή email", - "Download logfile" : "Λήψη αρχείου ιστορικού", - "More" : "Περισσότερα", - "Less" : "Λιγότερα", - "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Το αρχείο ιστορικού είναι μεγαλύτερο από 100ΜΒ. Η λήψη του ίσως πάρει λίγη ώρα!", + "Tips & tricks" : "Συμβουλές & τεχνάσματα", "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "Ως βάση δεδομένων χρησιμοποιείται η SQLite. Για μεγαλύτερες εγκαταστάσεις συνιστούμε να επιλέξετε ένα διαφορετικό σύστημα υποστήριξης βάσης δεδομένων.", "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Ειδικά όταν χρησιμοποιείτε τον πελάτη για συγχρονισμό στον υπολογιστή σας, δεν συνίσταται η χρήση της SQLite.", "How to do backups" : "Πώς να κάνετε αντίγραφα ασφαλείας", @@ -187,7 +195,6 @@ OC.L10N.register( "Improving the config.php" : "Βελτίωση του config.php", "Theming" : "Θέματα", "Hardening and security guidance" : "Οδηγίες ασφάλειας και θωράκισης", - "Version" : "Έκδοση", "Developer documentation" : "Τεκμηρίωση προγραμματιστή", "Experimental applications ahead" : "Πειραματικές εφαρμογές", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Οι πειραματικές εφαρμογές δεν ελέγχονται για θέματα ασφάλειας, είναι ασταθείς και υπό συνεχή εξέλιξη. Η εγκατάσταση τους μπορεί να προκαλέσει απώλεια δεδομένων ή παραβιάσεις της ασφάλειας.", @@ -233,17 +240,17 @@ OC.L10N.register( "Change password" : "Αλλαγή συνθηματικού", "Language" : "Γλώσσα", "Help translate" : "Βοηθήστε στη μετάφραση", + "Get the apps to sync your files" : "Λήψη της εφαρμογής για συγχρονισμό των αρχείων σας", + "Desktop client" : "Πελάτης σταθερού υπολογιστή", + "Android app" : "Εφαρμογή Android", + "iOS app" : "Εφαρμογή iOS", + "Show First Run Wizard again" : "Προβολή Οδηγού Πρώτης Εκτέλεσης ξανά", "Device" : "Συσκευή", "Name" : "Όνομα", "App name" : "Όνομα εφαρμογής", "Create new app password" : "Δημιουργία νέου συνθηματικού εφαρμογής", "Username" : "Όνομα χρήστη", "Done" : "Ολοκληρώθηκε", - "Get the apps to sync your files" : "Λήψη της εφαρμογής για συγχρονισμό των αρχείων σας", - "Desktop client" : "Πελάτης σταθερού υπολογιστή", - "Android app" : "Εφαρμογή Android", - "iOS app" : "Εφαρμογή iOS", - "Show First Run Wizard again" : "Προβολή Οδηγού Πρώτης Εκτέλεσης ξανά", "Show storage location" : "Εμφάνιση τοποθεσίας αποθήκευσης", "Show last log in" : "Εμφάνιση τελευταίας εισόδου", "Show user backend" : "Εμφάνιση χρήστη συστήματος υποστήριξης", @@ -263,6 +270,10 @@ OC.L10N.register( "change full name" : "αλλαγή πλήρους ονόματος", "set new password" : "επιλογή νέου κωδικού", "change email address" : "αλλαγή διεύθυνσης ηλ. αλληλογραφίας", - "Default" : "Προκαθορισμένο" + "Default" : "Προκαθορισμένο", + "APCu" : "APCu", + "Redis" : "Redis", + "External Storage" : "Εξωτερικό Αποθηκευτικό Μέσο", + "Updates" : "Ενημερώσεις" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/el.json b/settings/l10n/el.json index a2885a79aba..7301782cdb9 100644 --- a/settings/l10n/el.json +++ b/settings/l10n/el.json @@ -1,14 +1,14 @@ { "translations": { + "Enabled" : "Ενεργοποιημένο", + "Not enabled" : "Μη ενεργοποιημένο", "Wrong password" : "Εσφαλμένο συνθηματικό", "Saved" : "Αποθηκεύτηκαν", "No user supplied" : "Δεν εισήχθη χρήστης", + "Unable to change password" : "Αδυναμία αλλαγής συνθηματικού", "Authentication error" : "Σφάλμα πιστοποίησης", "Please provide an admin recovery password, otherwise all user data will be lost" : "Παρακαλώ παρέχετε έναν κωδικό ανάκτησης διαχειριστή, διαφορετικά όλα τα δεδομένα χρήστη θα χαθούν", "Wrong admin recovery password. Please check the password and try again." : "Λάθος κωδικός ανάκτησης διαχειριστή. Παρακαλώ ελέγξτε τον κωδικό και δοκιμάστε ξανά.", "Backend doesn't support password change, but the user's encryption key was successfully updated." : "Το σύστημα δεν υποστηρίζει αλλαγή κωδικού, αλλά το κλειδί κρυπτογράφησης του χρήστη ενημερώθηκε επιτυχώς.", - "Unable to change password" : "Αδυναμία αλλαγής συνθηματικού", - "Enabled" : "Ενεργοποιημένο", - "Not enabled" : "Μη ενεργοποιημένο", "installing and updating apps via the app store or Federated Cloud Sharing" : "εγκατάσταση και ενημέρωση εφαρμογών μέσω του καταστήματος εφαρμογών ή του ", "Federated Cloud Sharing" : "Διαμοιρασμός σε ομόσπονδα σύννεφα ", "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "Το cURL χρησιμοποιεί μια παρωχημένη %s έκδοση (%s). Παρακαλούμε αναβαθμίστε το λειτουργικό σας σύστημα αλλιώς δυνατότητες όπως %s δεν θα δουλέψουν αξιόπιστα.", @@ -33,17 +33,6 @@ "Email saved" : "Το email αποθηκεύτηκε ", "Your full name has been changed." : "Το πλήρες όνομά σας άλλαξε.", "Unable to change full name" : "Δεν ήταν δυνατή η αλλαγή του πλήρους ονόματός σας", - "APCu" : "APCu", - "Redis" : "Redis", - "Security & setup warnings" : "Προειδοποιήσεις ασφάλειας & ρυθμίσεων", - "Sharing" : "Διαμοιρασμός", - "Server-side encryption" : "Κρυπτογράφηση από τον Διακομιστή", - "External Storage" : "Εξωτερικό Αποθηκευτικό Μέσο", - "Cron" : "Cron", - "Email server" : "Διακομιστής Email", - "Log" : "Καταγραφές", - "Tips & tricks" : "Συμβουλές & τεχνάσματα", - "Updates" : "Ενημερώσεις", "Couldn't remove app." : "Αδυναμία αφαίρεσης εφαρμογής.", "Language changed" : "Η γλώσσα άλλαξε", "Invalid request" : "Μη έγκυρο αίτημα", @@ -77,6 +66,15 @@ "Uninstall" : "Απεγκατάσταση", "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Η εφαρμογή έχει ενεργοποιηθεί αλλά χρειάζεται ενημέρωση. Θα μεταφερθείτε στη σελίδα ενημέρωσης σε 5 δευτερόλεπτα.", "App update" : "Ενημέρωση εφαρμογής", + "Disconnect" : "Αποσύνδεση", + "Edge" : "Edge", + "Firefox" : "Firefox", + "Google Chrome" : "Google Chrome", + "Safari" : "Safari", + "Google Chrome for Android" : "Google Chrome για Android", + "iPhone" : "iPhone", + "Press ⌘-C to copy." : "Για αντιγραφή πατήστε ⌘-C.", + "Press Ctrl-C to copy." : "Για αντιγραφή πατήστε Ctrl-C.", "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Προέκυψε σφάλμα. Παρακαλούμε μεταφορτώστε ένα πιστοποιητικό PEM κωδικοποιημένο κατά ASCII.", "Valid until {date}" : "Έγκυρο έως {date}", "Delete" : "Διαγραφή", @@ -95,24 +93,62 @@ "never" : "ποτέ", "deleted {userName}" : "διαγραφή {userName}", "Changing the password will result in data loss, because data recovery is not available for this user" : "Η αλλαγή του κωδικού πρόσβασης θα έχει ως αποτέλεσμα το χάσιμο δεδομένων, επειδή η ανάκτηση δεδομένων δεν είναι διαθέσιμη γι' αυτόν τον χρήστη", + "Password successfully changed" : "Το συνθηματικό αλλάχτηκε επιτυχώς", "A valid username must be provided" : "Πρέπει να δοθεί έγκυρο όνομα χρήστη", + "Error creating user: {message}" : "Σφάλμα δημιουργίας χρήστη: {message}", "A valid password must be provided" : "Πρέπει να δοθεί έγκυρο συνθηματικό", "A valid email must be provided" : "Πρέπει να εισαχθεί ένα έγκυρο email", "__language_name__" : "__όνομα_γλώσσας__", "Unlimited" : "Απεριόριστο", "Personal info" : "Προσωπικές Πληροφορίες", "Sync clients" : "Συγχρονισμός πελατών", - "Everything (fatal issues, errors, warnings, info, debug)" : "Όλα (καίρια ζητήματα, σφάλματα, προειδοποιήσεις, πληροφορίες, αποσφαλμάτωση)", - "Info, warnings, errors and fatal issues" : "Πληροφορίες, προειδοποιήσεις, σφάλματα και καίρια ζητήματα", - "Warnings, errors and fatal issues" : "Προειδοποιήσεις, σφάλματα και καίρια ζητήματα", - "Errors and fatal issues" : "Σφάλματα και καίρια ζητήματα", - "Fatal issues only" : "Καίρια ζητήματα μόνο", "None" : "Τίποτα", "Login" : "Σύνδεση", "Plain" : "Απλό", "NT LAN Manager" : "Διαχειριστης NT LAN", "SSL" : "SSL", "TLS" : "TLS", + "Email server" : "Διακομιστής Email", + "Open documentation" : "Ανοιχτή τεκμηρίωση.", + "This is used for sending out notifications." : "Χρησιμοποιείται για αποστολή ειδοποιήσεων.", + "Send mode" : "Κατάσταση αποστολής", + "Encryption" : "Κρυπτογράφηση", + "From address" : "Από τη διεύθυνση", + "mail" : "ταχυδρομείο", + "Authentication method" : "Μέθοδος πιστοποίησης", + "Authentication required" : "Απαιτείται πιστοποίηση", + "Server address" : "Διεύθυνση διακομιστή", + "Port" : "Θύρα", + "Credentials" : "Πιστοποιητικά", + "SMTP Username" : "Όνομα χρήστη SMTP", + "SMTP Password" : "Συνθηματικό SMTP", + "Store credentials" : "Διαπιστευτήρια αποθήκευσης", + "Test email settings" : "Δοκιμή ρυθμίσεων email", + "Send email" : "Αποστολή email", + "Server-side encryption" : "Κρυπτογράφηση από τον Διακομιστή", + "Enable server-side encryption" : "Ενεργοποίηση κρυπτογράφησης από το διακομιστή", + "Please read carefully before activating server-side encryption: " : "Παρακαλούμε διαβάστε προσεκτικά πριν ενεργοποιήσετε την κρυπτογράφηση στο διακομιστή:", + "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Μόλις ενεργοποιηθεί η κρυπτογράφηση, όλα τα αρχεία που θα μεταφορτωθούν από αυτό το σημείο και μετά θα κρυπτογραφηθούν στο διακομιστή. Η κρυπτογράφηση είναι δυνατόν να απενεργοποιηθεί αργότερα μόνο αν το ενεργό άρθρωμα κρυπτογράφησης υποστηρίζει αυτή τη λειτουργία και εκπληρούνται όλες οι προϋποθέσεις (πχ ορισμός κλειδιού ανάκτησης).", + "Be aware that encryption always increases the file size." : "Έχετε στο νου σας πως η κρυπτογράφηση πάντα αυξάνει το μέγεθος του αρχείου", + "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Είναι πάντοτε καλό να δημιουργείτε τακτικά αντίγραφα ασφαλείας των δεδομένων σας, στην περίπτωση της κρυπτογράφησης βεβαιωθείτε ότι έχετε λάβει αντίγραφο ασφαλείας των κλειδιών κρυπτογράφησης παράλληλα με τα δεδομένα σας.", + "This is the final warning: Do you really want to enable encryption?" : "Αυτή είναι η τελευταία προειδοποίηση: Θέλετε πραγματικά να ενεργοποιήσετε την κρυπτογράφηση;", + "Enable encryption" : "Ενεργοποίηση κρυπτογράφησης", + "No encryption module loaded, please enable an encryption module in the app menu." : "Δεν έχει φορτωθεί μονάδα κρυπτογράφησης, παρακαλούμε φορτώστε μια μονάδα κρυπτογράφησης από το μενού εφαρμογών.", + "Select default encryption module:" : "Επιλογή προεπιλεγμένης μονάδας κρυπτογράφησης:", + "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please enable the \"Default encryption module\" and run 'occ encryption:migrate'" : "Πρέπει να μεταφέρετε τα κλειδιά κρυπτογράφησής σας από την παλιά κρυπτογράφηση (ownCloud <= 8.0) στην καινούρια. Παρακαλούμε ενεργοποιήστε την \"Προεπιλεγμένη Μονάδα Κρυπτογράφησης\" και εκτελέστε την εντολή 'occ encryption:migrate'", + "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "Πρέπει να μεταφέρετε τα κλειδιά σας κρυπτογράφησης από την παλιά κρυπτογράφηση (ownCloud <= 8.0) στην καινούρια.", + "Start migration" : "Έναρξη μετάβασης", + "Everything (fatal issues, errors, warnings, info, debug)" : "Όλα (καίρια ζητήματα, σφάλματα, προειδοποιήσεις, πληροφορίες, αποσφαλμάτωση)", + "Info, warnings, errors and fatal issues" : "Πληροφορίες, προειδοποιήσεις, σφάλματα και καίρια ζητήματα", + "Warnings, errors and fatal issues" : "Προειδοποιήσεις, σφάλματα και καίρια ζητήματα", + "Errors and fatal issues" : "Σφάλματα και καίρια ζητήματα", + "Fatal issues only" : "Καίρια ζητήματα μόνο", + "Log" : "Καταγραφές", + "Download logfile" : "Λήψη αρχείου ιστορικού", + "More" : "Περισσότερα", + "Less" : "Λιγότερα", + "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Το αρχείο ιστορικού είναι μεγαλύτερο από 100ΜΒ. Η λήψη του ίσως πάρει λίγη ώρα!", + "Security & setup warnings" : "Προειδοποιήσεις ασφάλειας & ρυθμίσεων", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "Η php δεν φαίνεται να είναι σωστά ρυθμισμένη για ερωτήματα σε μεταβλητές περιβάλλοντος του συστήματος. Η δοκιμή με την εντολή getenv(\"PATH\") επιστρέφει κενή απάντηση.", "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Η ρύθμιση \"μόνο ανάγνωση\" έχει ενεργοποιηθεί. Αυτό εμποδίζει τον καθορισμό κάποιων ρυθμίσεων μέσω της διεπαφής web. Επιπλέον, το αρχείο πρέπει να γίνει χειροκίνητα εγγράψιμο πριν από κάθε διαδικασία ενημέρωσης.", "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "Ο PHP φαίνεται να είναι ρυθμισμένος ώστε να αφαιρεί μπλοκ εσωτερικών κειμένων (inline doc). Αυτό θα καταστήσει κύριες εφαρμογές μη-διαθέσιμες.", @@ -124,7 +160,15 @@ "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Αν η εγκατάστασή σας δεν έχει γίνει στο root του τομέα και χρησιμοποιείται το cron του συστήματος, μπορεί να υπάρξουν ζητήματα με τη δημιουργία URL. Για να αποφύγετε αυτά τα προβλήματα, παρακαλώ ρυθμίστε την επιλογή \"overwrite.cli.url\" στο αρχείο config.php που βρίσκεται στη διαδρομή webroot της εγκατάστασής σας (Suggested: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Δεν ήταν δυνατή η εκτέλεση της cronjob μέσω τερματικού. Εμφανίστηκαν τα παρακάτω τεχνικά σφάλματα:", "All checks passed." : "Όλοι οι έλεγχοι επιτυχείς.", - "Open documentation" : "Ανοιχτή τεκμηρίωση.", + "Cron" : "Cron", + "Last cron job execution: %s." : "Τελευταία εκτέλεση cron job: %s.", + "Last cron job execution: %s. Something seems wrong." : "Τελευταία εκτέλεση cron job: %s. Κάτι πήγε στραβά.", + "Cron was not executed yet!" : "Η διεργασία cron δεν έχει εκτελεστεί ακόμα!", + "Execute one task with each page loaded" : "Εκτελεί μια διεργασία κάθε φορά που φορτώνεται μια σελίδα", + "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "Το cron.php είναι καταχωρημένο σε μια υπηρεσία webcron ώστε να καλεί το cron.php κάθε 15 λεπτά μέσω http.", + "Use system's cron service to call the cron.php file every 15 minutes." : "Χρησιμοποιήστε την cron υπηρεσία του συτήματος για να καλέσετε το cron.php αρχείο κάθε 15 λεπτά.", + "Version" : "Έκδοση", + "Sharing" : "Διαμοιρασμός", "Allow apps to use the Share API" : "Επιτρέπει την χρήση του API διαμοιρασμού σε εφαρμογές ", "Allow users to share via link" : "Να επιτρέπεται σε χρήστες ο διαμοιρασμός μέσω συνδέσμου", "Allow public uploads" : "Επιτρέπεται το κοινόχρηστο ανέβασμα", @@ -140,43 +184,7 @@ "Exclude groups from sharing" : "Εξαίρεση ομάδων από τον διαμοιρασμό", "These groups will still be able to receive shares, but not to initiate them." : "Αυτές οι ομάδες θα συνεχίσουν να λαμβάνουν διαμοιρασμούς, αλλά δεν θα είναι δυνατό να τους δημιουργήσουν.", "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Να επιτρέπεται η χρήση αυτόματης συμπλήρωσης στο διάλογο διαμοιρασμού. Αν αυτό είναι απενεργοποιημένο θα πρέπει να εισαχθεί το πλήρες όνομα χρήστη.", - "Last cron job execution: %s." : "Τελευταία εκτέλεση cron job: %s.", - "Last cron job execution: %s. Something seems wrong." : "Τελευταία εκτέλεση cron job: %s. Κάτι πήγε στραβά.", - "Cron was not executed yet!" : "Η διεργασία cron δεν έχει εκτελεστεί ακόμα!", - "Execute one task with each page loaded" : "Εκτελεί μια διεργασία κάθε φορά που φορτώνεται μια σελίδα", - "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "Το cron.php είναι καταχωρημένο σε μια υπηρεσία webcron ώστε να καλεί το cron.php κάθε 15 λεπτά μέσω http.", - "Use system's cron service to call the cron.php file every 15 minutes." : "Χρησιμοποιήστε την cron υπηρεσία του συτήματος για να καλέσετε το cron.php αρχείο κάθε 15 λεπτά.", - "Enable server-side encryption" : "Ενεργοποίηση κρυπτογράφησης από το διακομιστή", - "Please read carefully before activating server-side encryption: " : "Παρακαλούμε διαβάστε προσεκτικά πριν ενεργοποιήσετε την κρυπτογράφηση στο διακομιστή:", - "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Μόλις ενεργοποιηθεί η κρυπτογράφηση, όλα τα αρχεία που θα μεταφορτωθούν από αυτό το σημείο και μετά θα κρυπτογραφηθούν στο διακομιστή. Η κρυπτογράφηση είναι δυνατόν να απενεργοποιηθεί αργότερα μόνο αν το ενεργό άρθρωμα κρυπτογράφησης υποστηρίζει αυτή τη λειτουργία και εκπληρούνται όλες οι προϋποθέσεις (πχ ορισμός κλειδιού ανάκτησης).", - "Be aware that encryption always increases the file size." : "Έχετε στο νου σας πως η κρυπτογράφηση πάντα αυξάνει το μέγεθος του αρχείου", - "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Είναι πάντοτε καλό να δημιουργείτε τακτικά αντίγραφα ασφαλείας των δεδομένων σας, στην περίπτωση της κρυπτογράφησης βεβαιωθείτε ότι έχετε λάβει αντίγραφο ασφαλείας των κλειδιών κρυπτογράφησης παράλληλα με τα δεδομένα σας.", - "This is the final warning: Do you really want to enable encryption?" : "Αυτή είναι η τελευταία προειδοποίηση: Θέλετε πραγματικά να ενεργοποιήσετε την κρυπτογράφηση;", - "Enable encryption" : "Ενεργοποίηση κρυπτογράφησης", - "No encryption module loaded, please enable an encryption module in the app menu." : "Δεν έχει φορτωθεί μονάδα κρυπτογράφησης, παρακαλούμε φορτώστε μια μονάδα κρυπτογράφησης από το μενού εφαρμογών.", - "Select default encryption module:" : "Επιλογή προεπιλεγμένης μονάδας κρυπτογράφησης:", - "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please enable the \"Default encryption module\" and run 'occ encryption:migrate'" : "Πρέπει να μεταφέρετε τα κλειδιά κρυπτογράφησής σας από την παλιά κρυπτογράφηση (ownCloud <= 8.0) στην καινούρια. Παρακαλούμε ενεργοποιήστε την \"Προεπιλεγμένη Μονάδα Κρυπτογράφησης\" και εκτελέστε την εντολή 'occ encryption:migrate'", - "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "Πρέπει να μεταφέρετε τα κλειδιά σας κρυπτογράφησης από την παλιά κρυπτογράφηση (ownCloud <= 8.0) στην καινούρια.", - "Start migration" : "Έναρξη μετάβασης", - "This is used for sending out notifications." : "Χρησιμοποιείται για αποστολή ειδοποιήσεων.", - "Send mode" : "Κατάσταση αποστολής", - "Encryption" : "Κρυπτογράφηση", - "From address" : "Από τη διεύθυνση", - "mail" : "ταχυδρομείο", - "Authentication method" : "Μέθοδος πιστοποίησης", - "Authentication required" : "Απαιτείται πιστοποίηση", - "Server address" : "Διεύθυνση διακομιστή", - "Port" : "Θύρα", - "Credentials" : "Πιστοποιητικά", - "SMTP Username" : "Όνομα χρήστη SMTP", - "SMTP Password" : "Συνθηματικό SMTP", - "Store credentials" : "Διαπιστευτήρια αποθήκευσης", - "Test email settings" : "Δοκιμή ρυθμίσεων email", - "Send email" : "Αποστολή email", - "Download logfile" : "Λήψη αρχείου ιστορικού", - "More" : "Περισσότερα", - "Less" : "Λιγότερα", - "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Το αρχείο ιστορικού είναι μεγαλύτερο από 100ΜΒ. Η λήψη του ίσως πάρει λίγη ώρα!", + "Tips & tricks" : "Συμβουλές & τεχνάσματα", "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "Ως βάση δεδομένων χρησιμοποιείται η SQLite. Για μεγαλύτερες εγκαταστάσεις συνιστούμε να επιλέξετε ένα διαφορετικό σύστημα υποστήριξης βάσης δεδομένων.", "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Ειδικά όταν χρησιμοποιείτε τον πελάτη για συγχρονισμό στον υπολογιστή σας, δεν συνίσταται η χρήση της SQLite.", "How to do backups" : "Πώς να κάνετε αντίγραφα ασφαλείας", @@ -185,7 +193,6 @@ "Improving the config.php" : "Βελτίωση του config.php", "Theming" : "Θέματα", "Hardening and security guidance" : "Οδηγίες ασφάλειας και θωράκισης", - "Version" : "Έκδοση", "Developer documentation" : "Τεκμηρίωση προγραμματιστή", "Experimental applications ahead" : "Πειραματικές εφαρμογές", "Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "Οι πειραματικές εφαρμογές δεν ελέγχονται για θέματα ασφάλειας, είναι ασταθείς και υπό συνεχή εξέλιξη. Η εγκατάσταση τους μπορεί να προκαλέσει απώλεια δεδομένων ή παραβιάσεις της ασφάλειας.", @@ -231,17 +238,17 @@ "Change password" : "Αλλαγή συνθηματικού", "Language" : "Γλώσσα", "Help translate" : "Βοηθήστε στη μετάφραση", + "Get the apps to sync your files" : "Λήψη της εφαρμογής για συγχρονισμό των αρχείων σας", + "Desktop client" : "Πελάτης σταθερού υπολογιστή", + "Android app" : "Εφαρμογή Android", + "iOS app" : "Εφαρμογή iOS", + "Show First Run Wizard again" : "Προβολή Οδηγού Πρώτης Εκτέλεσης ξανά", "Device" : "Συσκευή", "Name" : "Όνομα", "App name" : "Όνομα εφαρμογής", "Create new app password" : "Δημιουργία νέου συνθηματικού εφαρμογής", "Username" : "Όνομα χρήστη", "Done" : "Ολοκληρώθηκε", - "Get the apps to sync your files" : "Λήψη της εφαρμογής για συγχρονισμό των αρχείων σας", - "Desktop client" : "Πελάτης σταθερού υπολογιστή", - "Android app" : "Εφαρμογή Android", - "iOS app" : "Εφαρμογή iOS", - "Show First Run Wizard again" : "Προβολή Οδηγού Πρώτης Εκτέλεσης ξανά", "Show storage location" : "Εμφάνιση τοποθεσίας αποθήκευσης", "Show last log in" : "Εμφάνιση τελευταίας εισόδου", "Show user backend" : "Εμφάνιση χρήστη συστήματος υποστήριξης", @@ -261,6 +268,10 @@ "change full name" : "αλλαγή πλήρους ονόματος", "set new password" : "επιλογή νέου κωδικού", "change email address" : "αλλαγή διεύθυνσης ηλ. αλληλογραφίας", - "Default" : "Προκαθορισμένο" + "Default" : "Προκαθορισμένο", + "APCu" : "APCu", + "Redis" : "Redis", + "External Storage" : "Εξωτερικό Αποθηκευτικό Μέσο", + "Updates" : "Ενημερώσεις" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/settings/l10n/it.js b/settings/l10n/it.js index 3add9931f87..f116a8dc113 100644 --- a/settings/l10n/it.js +++ b/settings/l10n/it.js @@ -116,6 +116,7 @@ OC.L10N.register( "Invalid quota value \"{val}\"" : "Valore di quota \"{val}\" non valido", "no group" : "nessun gruppo", "Changing the password will result in data loss, because data recovery is not available for this user" : "Il cambiamento della password causerà una perdita di dati, poiché il ripristino dei dati non è disponibile per questo utente", + "Password successfully changed" : "Password modificata correttamente", "A valid username must be provided" : "Deve essere fornito un nome utente valido", "Error creating user: {message}" : "Errore durante la creazione dell'utente: {message}", "A valid password must be provided" : "Deve essere fornita una password valida", @@ -189,6 +190,7 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Consigliamo vivamente di installare i pacchetti richiesti sul tuo sistema per supportare una delle localizzazioni seguenti: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Se la tua installazione non si trova nella radice del dominio e utilizza il cron di sistema, potrebbero esserci problemi con la generazione degli URL. Per evitare questi problemi, imposta l'opzione \"overwrite.cli.url\" nel file config.php al percorso della radice del sito della tua installazione (Consigliato: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Non è stato possibile eseguire il job di cron tramite CLI. Sono apparsi i seguenti errori tecnici:", + "Please double check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"%s\">log</a>." : "Leggi attentamente le <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">guide d'installazione ↗</a>, e controlla gli errori o gli avvisi nel <a href=\"%s\">log</a>.", "All checks passed." : "Tutti i controlli passati.", "Cron" : "Cron", "Last cron job execution: %s." : "Ultima esecuzione di cron: %s.", @@ -284,6 +286,7 @@ OC.L10N.register( "Desktop client" : "Client desktop", "Android app" : "Applicazione Android", "iOS app" : "Applicazione iOS", + "If you want to support the project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Se desideri supportare il progetto\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">contribuisci allo sviluppo</a>\n\t\to\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">diffondi il verbo</a>!", "Show First Run Wizard again" : "Mostra nuovamente la procedura di primo avvio", "Web, desktop and mobile clients currently logged in to your account." : "Client web, desktop e mobile attualmente connessi al tuo account.", "Device" : "Dispositivo", diff --git a/settings/l10n/it.json b/settings/l10n/it.json index d8c9a28388b..63b22ae3fdd 100644 --- a/settings/l10n/it.json +++ b/settings/l10n/it.json @@ -114,6 +114,7 @@ "Invalid quota value \"{val}\"" : "Valore di quota \"{val}\" non valido", "no group" : "nessun gruppo", "Changing the password will result in data loss, because data recovery is not available for this user" : "Il cambiamento della password causerà una perdita di dati, poiché il ripristino dei dati non è disponibile per questo utente", + "Password successfully changed" : "Password modificata correttamente", "A valid username must be provided" : "Deve essere fornito un nome utente valido", "Error creating user: {message}" : "Errore durante la creazione dell'utente: {message}", "A valid password must be provided" : "Deve essere fornita una password valida", @@ -187,6 +188,7 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Consigliamo vivamente di installare i pacchetti richiesti sul tuo sistema per supportare una delle localizzazioni seguenti: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Se la tua installazione non si trova nella radice del dominio e utilizza il cron di sistema, potrebbero esserci problemi con la generazione degli URL. Per evitare questi problemi, imposta l'opzione \"overwrite.cli.url\" nel file config.php al percorso della radice del sito della tua installazione (Consigliato: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Non è stato possibile eseguire il job di cron tramite CLI. Sono apparsi i seguenti errori tecnici:", + "Please double check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"%s\">log</a>." : "Leggi attentamente le <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">guide d'installazione ↗</a>, e controlla gli errori o gli avvisi nel <a href=\"%s\">log</a>.", "All checks passed." : "Tutti i controlli passati.", "Cron" : "Cron", "Last cron job execution: %s." : "Ultima esecuzione di cron: %s.", @@ -282,6 +284,7 @@ "Desktop client" : "Client desktop", "Android app" : "Applicazione Android", "iOS app" : "Applicazione iOS", + "If you want to support the project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Se desideri supportare il progetto\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">contribuisci allo sviluppo</a>\n\t\to\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">diffondi il verbo</a>!", "Show First Run Wizard again" : "Mostra nuovamente la procedura di primo avvio", "Web, desktop and mobile clients currently logged in to your account." : "Client web, desktop e mobile attualmente connessi al tuo account.", "Device" : "Dispositivo", diff --git a/settings/l10n/nl.js b/settings/l10n/nl.js index 4c28deb525c..dca660a9cca 100644 --- a/settings/l10n/nl.js +++ b/settings/l10n/nl.js @@ -116,6 +116,7 @@ OC.L10N.register( "Invalid quota value \"{val}\"" : "Ongeldige quota waarde \"{val}\"", "no group" : "geen groep", "Changing the password will result in data loss, because data recovery is not available for this user" : "Wijzigen van het wachtwoord leidt tot gegevensverlies, omdat gegevensherstel voor deze gebruiker niet beschikbaar is", + "Password successfully changed" : "Wachtwoord succesvol gewijzigd.", "A valid username must be provided" : "Er moet een geldige gebruikersnaam worden opgegeven", "Error creating user: {message}" : "Fout bij aanmaken gebruiker: {message}", "A valid password must be provided" : "Er moet een geldig wachtwoord worden opgegeven", @@ -189,6 +190,7 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "We adviseren met klem om de noodzakelijke pakketten je uw systeem te installeren om een van de volgende talen te ondersteunen: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Als je installatie niet in de hoofddirectory van het domein staat, maar wel cron gebruikt, dan kunnen er problemen ontstaan bij het genereren van URL's. Om deze problemen te voorkomen zou je de \"overwrite.cli.url\" optie in config.php moeten instellen op het webroot pad van je ownCloud (aanbevolen: \"%s\") ", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "het was niet mogelijk om de cronjob via CLI uit te voeren. De volgende technische problemen traden op:", + "Please double check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"%s\">log</a>." : "Lees de <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installatie handleiding</a> goed door en controleer op fouten en waarschuwingen in de <a href=\"%s\">logging</a>.", "All checks passed." : "Alle checks geslaagd", "Cron" : "Cron", "Last cron job execution: %s." : "Laatst uitgevoerde cronjob: %s.", @@ -284,6 +286,7 @@ OC.L10N.register( "Desktop client" : "Desktop client", "Android app" : "Android app", "iOS app" : "iOS app", + "If you want to support the project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Ondersteun het project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">ontwikkel het mee</a>\n\t\tof\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">verkondig het woord</a>!", "Show First Run Wizard again" : "Toon de Eerste start Wizard opnieuw", "Web, desktop and mobile clients currently logged in to your account." : "Web, desktop en mobiele clients zijn nu ingelogd op je account.", "Device" : "Apparaat", diff --git a/settings/l10n/nl.json b/settings/l10n/nl.json index 3d46d8a74e6..8a26862260f 100644 --- a/settings/l10n/nl.json +++ b/settings/l10n/nl.json @@ -114,6 +114,7 @@ "Invalid quota value \"{val}\"" : "Ongeldige quota waarde \"{val}\"", "no group" : "geen groep", "Changing the password will result in data loss, because data recovery is not available for this user" : "Wijzigen van het wachtwoord leidt tot gegevensverlies, omdat gegevensherstel voor deze gebruiker niet beschikbaar is", + "Password successfully changed" : "Wachtwoord succesvol gewijzigd.", "A valid username must be provided" : "Er moet een geldige gebruikersnaam worden opgegeven", "Error creating user: {message}" : "Fout bij aanmaken gebruiker: {message}", "A valid password must be provided" : "Er moet een geldig wachtwoord worden opgegeven", @@ -187,6 +188,7 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "We adviseren met klem om de noodzakelijke pakketten je uw systeem te installeren om een van de volgende talen te ondersteunen: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Als je installatie niet in de hoofddirectory van het domein staat, maar wel cron gebruikt, dan kunnen er problemen ontstaan bij het genereren van URL's. Om deze problemen te voorkomen zou je de \"overwrite.cli.url\" optie in config.php moeten instellen op het webroot pad van je ownCloud (aanbevolen: \"%s\") ", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "het was niet mogelijk om de cronjob via CLI uit te voeren. De volgende technische problemen traden op:", + "Please double check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"%s\">log</a>." : "Lees de <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installatie handleiding</a> goed door en controleer op fouten en waarschuwingen in de <a href=\"%s\">logging</a>.", "All checks passed." : "Alle checks geslaagd", "Cron" : "Cron", "Last cron job execution: %s." : "Laatst uitgevoerde cronjob: %s.", @@ -282,6 +284,7 @@ "Desktop client" : "Desktop client", "Android app" : "Android app", "iOS app" : "iOS app", + "If you want to support the project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Ondersteun het project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">ontwikkel het mee</a>\n\t\tof\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">verkondig het woord</a>!", "Show First Run Wizard again" : "Toon de Eerste start Wizard opnieuw", "Web, desktop and mobile clients currently logged in to your account." : "Web, desktop en mobiele clients zijn nu ingelogd op je account.", "Device" : "Apparaat", diff --git a/settings/l10n/pt_BR.js b/settings/l10n/pt_BR.js index 20b24703e87..1d976c0b826 100644 --- a/settings/l10n/pt_BR.js +++ b/settings/l10n/pt_BR.js @@ -116,6 +116,7 @@ OC.L10N.register( "Invalid quota value \"{val}\"" : "Valor da quota inválido \"{val}\"", "no group" : "nenhum grupo", "Changing the password will result in data loss, because data recovery is not available for this user" : "Trocar a senha irá resultar em perda de dados, porque recuperação de dados não está disponível para este usuário", + "Password successfully changed" : "Senha alterada com sucesso", "A valid username must be provided" : "Forneça um nome de usuário válido", "Error creating user: {message}" : "Erro criando o usuário: {message}", "A valid password must be provided" : "Forneça uma senha válida", @@ -299,6 +300,7 @@ OC.L10N.register( "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Desenvolvido pela {communityopen}comunidade Nextcloud{linkclose}, o {githubopen}código-fonte{linkclose} é licenciado sob a {licenseopen}AGPL{linkclose}.", "Follow us on Google Plus!" : "Siga-nos no Google Plus!", "Like our facebook page!" : "Curta nossa página no Facebook!", + "Subscribe to our twitter channel!" : "Assine o nosso canal no Twitter!", "Subscribe to our news feed!" : "Assine nosso feed de notícias!", "Subscribe to our newsletter!" : "Inscreva-se para receber nosso boletim informativo!", "Show storage location" : "Mostrar localização de armazenamento", diff --git a/settings/l10n/pt_BR.json b/settings/l10n/pt_BR.json index db1ec548c49..de4bb6a931a 100644 --- a/settings/l10n/pt_BR.json +++ b/settings/l10n/pt_BR.json @@ -114,6 +114,7 @@ "Invalid quota value \"{val}\"" : "Valor da quota inválido \"{val}\"", "no group" : "nenhum grupo", "Changing the password will result in data loss, because data recovery is not available for this user" : "Trocar a senha irá resultar em perda de dados, porque recuperação de dados não está disponível para este usuário", + "Password successfully changed" : "Senha alterada com sucesso", "A valid username must be provided" : "Forneça um nome de usuário válido", "Error creating user: {message}" : "Erro criando o usuário: {message}", "A valid password must be provided" : "Forneça uma senha válida", @@ -297,6 +298,7 @@ "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Desenvolvido pela {communityopen}comunidade Nextcloud{linkclose}, o {githubopen}código-fonte{linkclose} é licenciado sob a {licenseopen}AGPL{linkclose}.", "Follow us on Google Plus!" : "Siga-nos no Google Plus!", "Like our facebook page!" : "Curta nossa página no Facebook!", + "Subscribe to our twitter channel!" : "Assine o nosso canal no Twitter!", "Subscribe to our news feed!" : "Assine nosso feed de notícias!", "Subscribe to our newsletter!" : "Inscreva-se para receber nosso boletim informativo!", "Show storage location" : "Mostrar localização de armazenamento", diff --git a/settings/l10n/ru.js b/settings/l10n/ru.js index feec854f729..b8aa17e2e34 100644 --- a/settings/l10n/ru.js +++ b/settings/l10n/ru.js @@ -87,6 +87,10 @@ OC.L10N.register( "Android Client" : "Клиент Android", "Sync client - {os}" : "Синхронизировать клиента - {os}", "This session" : "Эта сессия", + "Copied!" : "Скопировано!", + "Not supported!" : "Не поддерживается!", + "Press ⌘-C to copy." : "Нажмите ⌘-C для копирования.", + "Press Ctrl-C to copy." : "Нажмите Ctrl-C для копирования.", "Error while loading browser sessions and device tokens" : "Ошибка при загрузке браузерных сессий и токенов устройств", "Error while creating device token" : "Ошибка при создании токена для устройства", "Error while deleting the token" : "Ошибка при удалении токена устройства", @@ -110,7 +114,9 @@ OC.L10N.register( "deleted {userName}" : "удалён {userName}", "Add group" : "Добавить группу", "Invalid quota value \"{val}\"" : "Недопустимая величина квоты \"{val}\"", + "no group" : "Без группы", "Changing the password will result in data loss, because data recovery is not available for this user" : "Изменение пароля приведёт к потере данных, так как восстановление данных не доступно для этого пользователя", + "Password successfully changed" : "Пароль успешно изменен.", "A valid username must be provided" : "Укажите правильное имя пользователя", "Error creating user: {message}" : "Ошибка создания пользователя: {message}", "A valid password must be provided" : "Должен быть указан правильный пароль", @@ -291,6 +297,9 @@ OC.L10N.register( "Username" : "Имя пользователя", "Done" : "Выполнено", "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Разработано {communityopen}сообществом Nextcloud{linkclose}, {githubopen}исходный код{linkclose} лицензируется в соответствии с {licenseopen}AGPL{linkclose}.", + "Subscribe to our twitter channel!" : "Подпишитесь на наш twitter-канал!", + "Subscribe to our news feed!" : "Подпишитесь на нашу ленту новостей!", + "Subscribe to our newsletter!" : "Подписывайтесь на нашу новостную рассылку!", "Show storage location" : "Показать местонахождение хранилища", "Show last log in" : "Показать последний вход в систему", "Show user backend" : "Показать механизм учёта пользователей", @@ -315,9 +324,23 @@ OC.L10N.register( "set new password" : "установить новый пароль", "change email address" : "изменить адрес почты", "Default" : "По умолчанию", + "add group" : "Добавить группу", + "If you want to support the project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\t<or></or>\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Если вы хотите поддержать проект\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">присоединитесь к разработке</a>\n\t\t<or></or>\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">расскажите о нас</a>!", + "Add Group" : "Добавить группу", + "Default Quota" : "Квота по умолчанию", + "Full Name" : "Полное имя", + "Storage Location" : "Место хранилища", + "Last Login" : "Последний вход", "APCu" : "APCu", "Redis" : "Redis", "External Storage" : "Внешнее хранилище", - "Updates" : "Обновления" + "Updates" : "Обновления", + "Official apps are developed by and within the Nextcloud community. They offer functionality central to Nextcloud and are ready for production use." : "Официальные приложения разрабатываются в рамках сообщества Nextcloud. Они предлагают базовую функциональность Nextcloud и готовы для использования.", + "No apps found for \"{query}\"" : "Приложения не найдены по \"{query}\"", + "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Ваша база данных не работает в режиме изоляции транзакций \"READ COMMITED\". Это может вызвать проблемы, если несколько действий выполняется одновременно.", + "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Ваш сервер работает на ОС Microsoft Windows. Мы настоятельно рекомендуем использовать ОС семейства Linux для достижения наилучших условий использования.", + "Encryption alone does not guarantee security of the system. Please see Nextcloud documentation for more information about how the encryption app works, and the supported use cases." : "Шифрование не гарантирует безопасность системы . Пожалуйста, смотрите документацию по Nextcloud для получения дополнительной информации о том, как работает приложение шифрования и поддерживаемых вариантов использования.", + "This app has no minimum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "У этого приложения не указанна минимальная версия Nextcloud. Это приведет к ошибке в Nextcloud 11 и позже.", + "This app has no maximum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "У этого приложения не указанна минимальная версия Nextcloud. Это приведет к ошибке в Nextcloud 11 и позже." }, "nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"); diff --git a/settings/l10n/ru.json b/settings/l10n/ru.json index 285acc1b00c..ecb8976aba5 100644 --- a/settings/l10n/ru.json +++ b/settings/l10n/ru.json @@ -85,6 +85,10 @@ "Android Client" : "Клиент Android", "Sync client - {os}" : "Синхронизировать клиента - {os}", "This session" : "Эта сессия", + "Copied!" : "Скопировано!", + "Not supported!" : "Не поддерживается!", + "Press ⌘-C to copy." : "Нажмите ⌘-C для копирования.", + "Press Ctrl-C to copy." : "Нажмите Ctrl-C для копирования.", "Error while loading browser sessions and device tokens" : "Ошибка при загрузке браузерных сессий и токенов устройств", "Error while creating device token" : "Ошибка при создании токена для устройства", "Error while deleting the token" : "Ошибка при удалении токена устройства", @@ -108,7 +112,9 @@ "deleted {userName}" : "удалён {userName}", "Add group" : "Добавить группу", "Invalid quota value \"{val}\"" : "Недопустимая величина квоты \"{val}\"", + "no group" : "Без группы", "Changing the password will result in data loss, because data recovery is not available for this user" : "Изменение пароля приведёт к потере данных, так как восстановление данных не доступно для этого пользователя", + "Password successfully changed" : "Пароль успешно изменен.", "A valid username must be provided" : "Укажите правильное имя пользователя", "Error creating user: {message}" : "Ошибка создания пользователя: {message}", "A valid password must be provided" : "Должен быть указан правильный пароль", @@ -289,6 +295,9 @@ "Username" : "Имя пользователя", "Done" : "Выполнено", "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Разработано {communityopen}сообществом Nextcloud{linkclose}, {githubopen}исходный код{linkclose} лицензируется в соответствии с {licenseopen}AGPL{linkclose}.", + "Subscribe to our twitter channel!" : "Подпишитесь на наш twitter-канал!", + "Subscribe to our news feed!" : "Подпишитесь на нашу ленту новостей!", + "Subscribe to our newsletter!" : "Подписывайтесь на нашу новостную рассылку!", "Show storage location" : "Показать местонахождение хранилища", "Show last log in" : "Показать последний вход в систему", "Show user backend" : "Показать механизм учёта пользователей", @@ -313,9 +322,23 @@ "set new password" : "установить новый пароль", "change email address" : "изменить адрес почты", "Default" : "По умолчанию", + "add group" : "Добавить группу", + "If you want to support the project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\t<or></or>\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Если вы хотите поддержать проект\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">присоединитесь к разработке</a>\n\t\t<or></or>\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">расскажите о нас</a>!", + "Add Group" : "Добавить группу", + "Default Quota" : "Квота по умолчанию", + "Full Name" : "Полное имя", + "Storage Location" : "Место хранилища", + "Last Login" : "Последний вход", "APCu" : "APCu", "Redis" : "Redis", "External Storage" : "Внешнее хранилище", - "Updates" : "Обновления" + "Updates" : "Обновления", + "Official apps are developed by and within the Nextcloud community. They offer functionality central to Nextcloud and are ready for production use." : "Официальные приложения разрабатываются в рамках сообщества Nextcloud. Они предлагают базовую функциональность Nextcloud и готовы для использования.", + "No apps found for \"{query}\"" : "Приложения не найдены по \"{query}\"", + "Your database does not run with \"READ COMMITED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Ваша база данных не работает в режиме изоляции транзакций \"READ COMMITED\". Это может вызвать проблемы, если несколько действий выполняется одновременно.", + "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Ваш сервер работает на ОС Microsoft Windows. Мы настоятельно рекомендуем использовать ОС семейства Linux для достижения наилучших условий использования.", + "Encryption alone does not guarantee security of the system. Please see Nextcloud documentation for more information about how the encryption app works, and the supported use cases." : "Шифрование не гарантирует безопасность системы . Пожалуйста, смотрите документацию по Nextcloud для получения дополнительной информации о том, как работает приложение шифрования и поддерживаемых вариантов использования.", + "This app has no minimum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "У этого приложения не указанна минимальная версия Nextcloud. Это приведет к ошибке в Nextcloud 11 и позже.", + "This app has no maximum Nextcloud version assigned. This will be an error in Nextcloud 11 and later." : "У этого приложения не указанна минимальная версия Nextcloud. Это приведет к ошибке в Nextcloud 11 и позже." },"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);" }
\ No newline at end of file diff --git a/tests/Core/Controller/TwoFactorChallengeControllerTest.php b/tests/Core/Controller/TwoFactorChallengeControllerTest.php index 28f16241e2f..8a1cfb9edf1 100644 --- a/tests/Core/Controller/TwoFactorChallengeControllerTest.php +++ b/tests/Core/Controller/TwoFactorChallengeControllerTest.php @@ -77,9 +77,14 @@ class TwoFactorChallengeControllerTest extends TestCase { ->method('getProviders') ->with($user) ->will($this->returnValue($providers)); + $this->twoFactorManager->expects($this->once()) + ->method('getBackupProvider') + ->with($user) + ->will($this->returnValue('backup')); $expected = new \OCP\AppFramework\Http\TemplateResponse('core', 'twofactorselectchallenge', [ 'providers' => $providers, + 'backupProvider' => 'backup', 'redirect_url' => '/some/url', 'logout_attribute' => 'logoutAttribute', ], 'guest'); @@ -92,6 +97,9 @@ class TwoFactorChallengeControllerTest extends TestCase { $provider = $this->getMockBuilder('\OCP\Authentication\TwoFactorAuth\IProvider') ->disableOriginalConstructor() ->getMock(); + $backupProvider = $this->getMockBuilder('\OCP\Authentication\TwoFactorAuth\IProvider') + ->disableOriginalConstructor() + ->getMock(); $tmpl = $this->getMockBuilder('\OCP\Template') ->disableOriginalConstructor() ->getMock(); @@ -103,6 +111,16 @@ class TwoFactorChallengeControllerTest extends TestCase { ->method('getProvider') ->with($user, 'myprovider') ->will($this->returnValue($provider)); + $this->twoFactorManager->expects($this->once()) + ->method('getBackupProvider') + ->with($user) + ->will($this->returnValue($backupProvider)); + $provider->expects($this->once()) + ->method('getId') + ->will($this->returnValue('u2f')); + $backupProvider->expects($this->once()) + ->method('getId') + ->will($this->returnValue('backup_codes')); $this->session->expects($this->once()) ->method('exists') @@ -122,6 +140,7 @@ class TwoFactorChallengeControllerTest extends TestCase { $expected = new \OCP\AppFramework\Http\TemplateResponse('core', 'twofactorshowchallenge', [ 'error' => true, 'provider' => $provider, + 'backupProvider' => $backupProvider, 'logout_attribute' => 'logoutAttribute', 'template' => '<html/>', ], 'guest'); diff --git a/tests/lib/App/ManagerTest.php b/tests/lib/App/ManagerTest.php index 80754413fc8..f3a91d4f5f4 100644 --- a/tests/lib/App/ManagerTest.php +++ b/tests/lib/App/ManagerTest.php @@ -306,7 +306,8 @@ class ManagerTest extends TestCase { $this->appConfig->setValue('test1', 'enabled', 'yes'); $this->appConfig->setValue('test2', 'enabled', 'no'); $this->appConfig->setValue('test3', 'enabled', '["foo"]'); - $this->assertEquals(['dav', 'federatedfilesharing', 'files', 'test1', 'test3', 'workflowengine'], $this->manager->getInstalledApps()); + $apps = ['dav', 'federatedfilesharing', 'files', 'test1', 'test3', 'twofactor_backupcodes', 'workflowengine']; + $this->assertEquals($apps, $this->manager->getInstalledApps()); } public function testGetAppsForUser() { @@ -320,7 +321,16 @@ class ManagerTest extends TestCase { $this->appConfig->setValue('test2', 'enabled', 'no'); $this->appConfig->setValue('test3', 'enabled', '["foo"]'); $this->appConfig->setValue('test4', 'enabled', '["asd"]'); - $this->assertEquals(['dav', 'federatedfilesharing', 'files', 'test1', 'test3', 'workflowengine'], $this->manager->getEnabledAppsForUser($user)); + $enabled = [ + 'dav', + 'federatedfilesharing', + 'files', + 'test1', + 'test3', + 'twofactor_backupcodes', + 'workflowengine' + ]; + $this->assertEquals($enabled, $this->manager->getEnabledAppsForUser($user)); } public function testGetAppsNeedingUpgrade() { @@ -338,6 +348,7 @@ class ManagerTest extends TestCase { 'test3' => ['id' => 'test3', 'version' => '1.2.4', 'requiremin' => '9.0.0'], 'test4' => ['id' => 'test4', 'version' => '3.0.0', 'requiremin' => '8.1.0'], 'testnoversion' => ['id' => 'testnoversion', 'requiremin' => '8.2.0'], + 'twofactor_backupcodes' => ['id' => 'twofactor_backupcodes'], 'workflowengine' => ['id' => 'workflowengine'], ]; @@ -379,6 +390,7 @@ class ManagerTest extends TestCase { 'test2' => ['id' => 'test2', 'version' => '1.0.0', 'requiremin' => '8.2.0'], 'test3' => ['id' => 'test3', 'version' => '1.2.4', 'requiremin' => '9.0.0'], 'testnoversion' => ['id' => 'testnoversion', 'requiremin' => '8.2.0'], + 'twofactor_backupcodes' => ['id' => 'twofactor_backupcodes'], 'workflowengine' => ['id' => 'workflowengine'], ]; diff --git a/tests/lib/AppTest.php b/tests/lib/AppTest.php index d37b4a0f56a..64311f6e4ae 100644 --- a/tests/lib/AppTest.php +++ b/tests/lib/AppTest.php @@ -316,6 +316,7 @@ class AppTest extends \Test\TestCase { 'appforgroup12', 'dav', 'federatedfilesharing', + 'twofactor_backupcodes', 'workflowengine', ), false @@ -331,6 +332,7 @@ class AppTest extends \Test\TestCase { 'appforgroup2', 'dav', 'federatedfilesharing', + 'twofactor_backupcodes', 'workflowengine', ), false @@ -347,6 +349,7 @@ class AppTest extends \Test\TestCase { 'appforgroup2', 'dav', 'federatedfilesharing', + 'twofactor_backupcodes', 'workflowengine', ), false @@ -363,6 +366,7 @@ class AppTest extends \Test\TestCase { 'appforgroup2', 'dav', 'federatedfilesharing', + 'twofactor_backupcodes', 'workflowengine', ), false, @@ -379,6 +383,7 @@ class AppTest extends \Test\TestCase { 'appforgroup2', 'dav', 'federatedfilesharing', + 'twofactor_backupcodes', 'workflowengine', ), true, @@ -457,11 +462,11 @@ class AppTest extends \Test\TestCase { ); $apps = \OC_App::getEnabledApps(); - $this->assertEquals(array('files', 'app3', 'dav', 'federatedfilesharing', 'workflowengine'), $apps); + $this->assertEquals(array('files', 'app3', 'dav', 'federatedfilesharing', 'twofactor_backupcodes', 'workflowengine'), $apps); // mock should not be called again here $apps = \OC_App::getEnabledApps(); - $this->assertEquals(array('files', 'app3', 'dav', 'federatedfilesharing', 'workflowengine'), $apps); + $this->assertEquals(array('files', 'app3', 'dav', 'federatedfilesharing', 'twofactor_backupcodes', 'workflowengine'), $apps); $this->restoreAppConfig(); \OC_User::setUserId(null); diff --git a/tests/lib/Authentication/TwoFactorAuth/ManagerTest.php b/tests/lib/Authentication/TwoFactorAuth/ManagerTest.php index f9489150e21..83a74f2f253 100644 --- a/tests/lib/Authentication/TwoFactorAuth/ManagerTest.php +++ b/tests/lib/Authentication/TwoFactorAuth/ManagerTest.php @@ -22,54 +22,76 @@ namespace Test\Authentication\TwoFactorAuth; -use Test\TestCase; +use Exception; +use OC; +use OC\App\AppManager; use OC\Authentication\TwoFactorAuth\Manager; +use OCA\TwoFactor_BackupCodes\Provider\BackupCodesProvider; +use OCP\Authentication\TwoFactorAuth\IProvider; +use OCP\IConfig; +use OCP\ISession; +use OCP\IUser; +use Test\TestCase; class ManagerTest extends TestCase { - /** @var \OCP\IUser|\PHPUnit_Framework_MockObject_MockObject */ + /** @var IUser|PHPUnit_Framework_MockObject_MockObject */ private $user; - /** @var \OC\App\AppManager|\PHPUnit_Framework_MockObject_MockObject */ + /** @var AppManager|PHPUnit_Framework_MockObject_MockObject */ private $appManager; - /** @var \OCP\ISession|\PHPUnit_Framework_MockObject_MockObject */ + /** @var ISession|PHPUnit_Framework_MockObject_MockObject */ private $session; /** @var Manager */ private $manager; - /** @var \OCP\IConfig|\PHPUnit_Framework_MockObject_MockObject */ + /** @var IConfig|PHPUnit_Framework_MockObject_MockObject */ private $config; - /** @var \OCP\Authentication\TwoFactorAuth\IProvider|\PHPUnit_Framework_MockObject_MockObject */ + /** @var IProvider|PHPUnit_Framework_MockObject_MockObject */ private $fakeProvider; + /** @var IProvider|PHPUnit_Framework_MockObject_MockObject */ + private $backupProvider; + protected function setUp() { parent::setUp(); - $this->user = $this->getMock('\OCP\IUser'); + $this->user = $this->getMockBuilder('\OCP\IUser')->getMock(); $this->appManager = $this->getMockBuilder('\OC\App\AppManager') ->disableOriginalConstructor() ->getMock(); - $this->session = $this->getMock('\OCP\ISession'); - $this->config = $this->getMock('\OCP\IConfig'); + $this->session = $this->getMockBuilder('\OCP\ISession')->getMock(); + $this->config = $this->getMockBuilder('\OCP\IConfig')->getMock(); $this->manager = $this->getMockBuilder('\OC\Authentication\TwoFactorAuth\Manager') ->setConstructorArgs([$this->appManager, $this->session, $this->config]) ->setMethods(['loadTwoFactorApp']) // Do not actually load the apps ->getMock(); - $this->fakeProvider = $this->getMock('\OCP\Authentication\TwoFactorAuth\IProvider'); + $this->fakeProvider = $this->getMockBuilder('\OCP\Authentication\TwoFactorAuth\IProvider')->getMock(); $this->fakeProvider->expects($this->any()) ->method('getId') ->will($this->returnValue('email')); $this->fakeProvider->expects($this->any()) ->method('isTwoFactorAuthEnabledForUser') ->will($this->returnValue(true)); - \OC::$server->registerService('\OCA\MyCustom2faApp\FakeProvider', function() { + OC::$server->registerService('\OCA\MyCustom2faApp\FakeProvider', function() { return $this->fakeProvider; }); + + $this->backupProvider = $this->getMockBuilder('\OCP\Authentication\TwoFactorAuth\IProvider')->getMock(); + $this->backupProvider->expects($this->any()) + ->method('getId') + ->will($this->returnValue('backup_codes')); + $this->backupProvider->expects($this->any()) + ->method('isTwoFactorAuthEnabledForUser') + ->will($this->returnValue(true)); + OC::$server->registerService('\OCA\TwoFactor_BackupCodes\Provider\FakeBackupCodesProvider', function () { + return $this->backupProvider; + }); } private function prepareNoProviders() { @@ -105,8 +127,40 @@ class ManagerTest extends TestCase { ->with('mycustom2faapp'); } + private function prepareProvidersWitBackupProvider() { + $this->appManager->expects($this->any()) + ->method('getEnabledAppsForUser') + ->with($this->user) + ->will($this->returnValue([ + 'mycustom2faapp', + 'twofactor_backupcodes', + ])); + + $this->appManager->expects($this->exactly(2)) + ->method('getAppInfo') + ->will($this->returnValueMap([ + [ + 'mycustom2faapp', + ['two-factor-providers' => [ + '\OCA\MyCustom2faApp\FakeProvider', + ] + ] + ], + [ + 'twofactor_backupcodes', + ['two-factor-providers' => [ + '\OCA\TwoFactor_BackupCodes\Provider\FakeBackupCodesProvider', + ] + ] + ], + ])); + + $this->manager->expects($this->exactly(2)) + ->method('loadTwoFactorApp'); + } + /** - * @expectedException \Exception + * @expectedException Exception * @expectedExceptionMessage Could not load two-factor auth provider \OCA\MyFaulty2faApp\DoesNotExist */ public function testFailHardIfProviderCanNotBeLoaded() { @@ -150,6 +204,12 @@ class ManagerTest extends TestCase { $this->assertSame($this->fakeProvider, $this->manager->getProvider($this->user, 'email')); } + public function testGetBackupProvider() { + $this->prepareProvidersWitBackupProvider(); + + $this->assertSame($this->backupProvider, $this->manager->getBackupProvider($this->user)); + } + public function testGetInvalidProvider() { $this->prepareProviders(); diff --git a/version.php b/version.php index 8cf0822bc7e..01a822708e3 100644 --- a/version.php +++ b/version.php @@ -25,7 +25,7 @@ // We only can count up. The 4. digit is only for the internal patchlevel to trigger DB upgrades // between betas, final and RCs. This is _not_ the public version number. Reset minor/patchlevel // when updating major/minor version number. -$OC_Version = array(9, 2, 0, 2); +$OC_Version = array(9, 2, 0, 3); // The human readable string $OC_VersionString = '11.0 alpha'; |