From a70aa1d761185b986e1927dd02cdaceda2ad256b Mon Sep 17 00:00:00 2001
From: Bubka <858858+Bubka@users.noreply.github.com>
Date: Fri, 25 Oct 2024 10:31:09 +0200
Subject: [PATCH] Add Danish translations
---
resources/lang/da/admin.php | 140 +++++++++++++++++++
resources/lang/da/auth.php | 142 +++++++++++++++++++
resources/lang/da/commons.php | 94 +++++++++++++
resources/lang/da/errors.php | 76 ++++++++++
resources/lang/da/groups.php | 41 ++++++
resources/lang/da/languages.php | 24 ++++
resources/lang/da/notifications.php | 36 +++++
resources/lang/da/pagination.php | 19 +++
resources/lang/da/passwords.php | 26 ++++
resources/lang/da/settings.php | 184 +++++++++++++++++++++++++
resources/lang/da/titles.php | 58 ++++++++
resources/lang/da/twofaccounts.php | 174 +++++++++++++++++++++++
resources/lang/da/validation.php | 207 ++++++++++++++++++++++++++++
13 files changed, 1221 insertions(+)
create mode 100644 resources/lang/da/admin.php
create mode 100644 resources/lang/da/auth.php
create mode 100644 resources/lang/da/commons.php
create mode 100644 resources/lang/da/errors.php
create mode 100644 resources/lang/da/groups.php
create mode 100644 resources/lang/da/languages.php
create mode 100644 resources/lang/da/notifications.php
create mode 100644 resources/lang/da/pagination.php
create mode 100644 resources/lang/da/passwords.php
create mode 100644 resources/lang/da/settings.php
create mode 100644 resources/lang/da/titles.php
create mode 100644 resources/lang/da/twofaccounts.php
create mode 100644 resources/lang/da/validation.php
diff --git a/resources/lang/da/admin.php b/resources/lang/da/admin.php
new file mode 100644
index 00000000..8c382ede
--- /dev/null
+++ b/resources/lang/da/admin.php
@@ -0,0 +1,140 @@
+ 'Admin',
+ 'app_setup' => 'App setup',
+ 'auth' => 'Auth',
+ 'registrations' => 'Registrations',
+ 'users' => 'Users',
+ 'users_legend' => 'Manage users registered on your instance or create new ones.',
+ 'admin_settings' => 'Admin settings',
+ 'create_new_user' => 'Create a user',
+ 'new_user' => 'New user',
+ 'search_user_placeholder' => 'User name, email...',
+ 'quick_filters_colons' => 'Quick filters:',
+ 'user_created' => 'user successfully created',
+ 'confirm' => [
+ 'delete_user' => 'Are you sure you want to delete this user? There is no going back.',
+ 'request_password_reset' => 'Are you sure you want to reset this user\'s password?',
+ 'purge_password_reset_request' => 'Are you sure you want to revoke the previous request?',
+ 'delete_account' => 'Are you sure you want to delete this user?',
+ 'edit_own_account' => 'This is your own account. Are you sure?',
+ 'change_admin_role' => 'This will have serious impacts on this user\'s permissions. Are you sure?',
+ 'demote_own_account' => 'You will no longer be an administrator. Really sure?'
+ ],
+ 'logs' => 'Logs',
+ 'administration_legend' => 'Following settings are global and apply to all users.',
+ 'user_management' => 'User management',
+ 'oauth_provider' => 'OAuth provider',
+ 'account_bound_to_x_via_oauth' => 'This account is bound to a :provider account via OAuth',
+ 'last_seen_on_date' => 'Last seen :date',
+ 'registered_on_date' => 'Registered :date',
+ 'updated_on_date' => 'Updated :date',
+ 'access' => 'Access',
+ 'password_requested_on_t' => 'A password reset request exists for this user (request sent at :datetime), which means that the user has not yet changed their password but the link they received is still valid. This may be a request from the user themselves or from an administrator.',
+ 'password_request_expired' => 'A password reset request exists for this user but has expired, meaning that the user has not changed their password in time. This may be a request from the user themselves or from an administrator.',
+ 'resend_email' => 'Resend email',
+ 'resend_email_title' => 'Resend a password reset email to the user',
+ 'resend_email_help' => 'Use Resend email to send a new password reset email to the user so he can set a new password. This will leave its current password as is and any previous request will be revoked.',
+ 'reset_password' => 'Reset password',
+ 'reset_password_help' => 'Use Reset password to force a password reset (this will set a temporary password) before sending a password reset email to the user so they can set a new password. Any previous request will be revoked.',
+ 'reset_password_title' => 'Reset the user\'s password',
+ 'password_successfully_reset' => 'Password successfully reset',
+ 'user_has_x_active_pat' => ':count active token(s)',
+ 'user_has_x_security_devices' => ':count security device(s) (passkeys)',
+ 'revoke_all_pat_for_user' => 'Revoke all user\'s tokens',
+ 'revoke_all_devices_for_user' => 'Revoke all user\'s security devices',
+ 'danger_zone' => 'Danger Zone',
+ 'delete_this_user_legend' => 'The user account will be deleted as well as all its 2FA data.',
+ 'this_is_not_soft_delete' => 'This is not a soft delete, there is no going back.',
+ 'delete_this_user' => 'Delete this user',
+ 'user_role_updated' => 'User role updated',
+ 'pats_succesfully_revoked' => 'User\'s PATs successfully revoked',
+ 'security_devices_succesfully_revoked' => 'User\'s security devices successfully revoked',
+ 'variables' => 'Variables',
+ 'cache_cleared' => 'Cache cleared',
+ 'cache_optimized' => 'Cache optimized',
+ 'check_now' => 'Check now',
+ 'view_on_github' => 'View on Github',
+ 'x_is_available' => ':version is available',
+ 'successful_login_on' => 'Successful login on :login_at',
+ 'successful_logout_on' => 'Successful logout on :login_at',
+ 'failed_login_on' => 'Failed login on :login_at',
+ 'viewed_on' => 'Viewed on :login_at',
+ 'last_accesses' => 'Last accesses',
+ 'see_full_log' => 'See full log',
+ 'browser_on_platform' => ':browser on :platform',
+ 'access_log_has_more_entries' => 'The access log contains more entries.',
+ 'access_log_legend_for_user' => 'Full access log for user :username',
+ 'show_last_month_log' => 'Show entries from the last month',
+ 'show_three_months_log' => 'Show entries from the last 3 months',
+ 'show_six_months_log' => 'Show entries from the last 6 months',
+ 'show_one_year_log' => 'Show entries from the last year',
+ 'sort_by_date_asc' => 'Show least recent first',
+ 'sort_by_date_desc' => 'Show most recent first',
+ 'single_sign_on' => 'Single Sign-On (SSO)',
+ 'forms' => [
+ 'use_encryption' => [
+ 'label' => 'Protect sensitive data',
+ 'help' => 'Sensitive data, the 2FA secrets and emails, are stored encrypted in database. Be sure to backup the APP_KEY value of your .env file (or the whole file) as it serves as key encryption. There is no way to decypher encrypted data without this key.',
+ ],
+ 'restrict_registration' => [
+ 'label' => 'Restrict registration',
+ 'help' => 'Make registration only available to a limited range of email addresses. Both rules can be used simultaneously. This has no effect on registration via SSO.',
+ ],
+ 'restrict_list' => [
+ 'label' => 'Filtering list',
+ 'help' => 'Emails in this list will be allowed to register. Separate addresses with a pipe ("|")',
+ ],
+ 'restrict_rule' => [
+ 'label' => 'Filtering rule',
+ 'help' => 'Emails matching this regular expression will be allowed to register',
+ ],
+ 'disable_registration' => [
+ 'label' => 'Disable registration',
+ 'help' => 'Prevent new user registration. Unless overridden (see below), this affects SSO as well, so new users won\'t be able to sign in via SSO',
+ ],
+ 'enable_sso' => [
+ 'label' => 'Enable SSO',
+ 'help' => 'Allow visitors to authenticate using an external ID via the Single Sign-On scheme',
+ ],
+ 'use_sso_only' => [
+ 'label' => 'Use SSO only',
+ 'help' => 'Make SSO the only available method to log in to 2FAuth. Password login and Webauthn are then disabled for regular users. Administrators are not affected by this restriction.',
+ ],
+ 'keep_sso_registration_enabled' => [
+ 'label' => 'Keep SSO registration enabled',
+ 'help' => 'Allow new users to sign in for the first time via SSO whereas registration is disabled',
+ ],
+ 'is_admin' => [
+ 'label' => 'Is administrator',
+ 'help' => 'Give administrator rights to the user. Administrators have permissions to manage the whole app, i.e. settings and other users, but cannot generate password for a 2FA they don\'t own.'
+ ],
+ 'test_email' => [
+ 'label' => 'Email configuration test',
+ 'help' => 'Send a test email to control your instance\'s email configuration. It is important to have a working configuration, otherwise users will not be able to request a reset password.',
+ 'email_will_be_send_to_x' => 'The email will be send to :email',
+ ],
+ 'health_endpoint' => [
+ 'label' => 'Health endpoint',
+ 'help' => 'URL you can visit to check the health of this 2FAuth instance. This URL can be used to set up a Docker HEALTHCHECK or a Kubernetes HTTPS Liveness probe.',
+ ],
+ 'cache_management' => [
+ 'label' => 'Cache management',
+ 'help' => 'Sometimes cache needs to be cleared, for instance after a change to environment variables or an update. You can do it from here.',
+ ]
+ ],
+
+];
\ No newline at end of file
diff --git a/resources/lang/da/auth.php b/resources/lang/da/auth.php
new file mode 100644
index 00000000..1abaf873
--- /dev/null
+++ b/resources/lang/da/auth.php
@@ -0,0 +1,142 @@
+ 'Brugernavn eller password findes ikke.',
+ 'password' => 'Forkert password.',
+ 'throttle' => 'For mange forkerte indtastninger. Prøv igen om :seconds sekunder.',
+
+ // 2FAuth
+ 'sign_out' => 'Log af',
+ 'sign_in' => 'Log på',
+ 'sign_in_using' => 'Log ind med',
+ 'if_administrator' => 'Administrator?',
+ 'sign_in_here' => 'Du kan looge ind uden SSO',
+ 'or_continue_with' => 'Du kan fortsætte med:',
+ 'password_login_and_webauthn_are_disabled' => 'Password og WebAuthN er deaktiveret.',
+ 'sign_in_using_sso' => 'Vælg din SSO udbyder for at logge ind:',
+ 'no_provider' => 'Ingen udbyder',
+ 'no_sso_provider_or_provider_is_missing' => 'Mangler udbyderen?',
+ 'see_how_to_enable_sso' => 'Se hvordan man aktiverer en udbyder',
+ 'sign_in_using_security_device' => 'Log på med en sikker enhed',
+ 'login_and_password' => 'Login og password',
+ 'register' => 'Opret',
+ 'welcome_to_2fauth' => 'Velkommen til 2FAuth',
+ 'autolock_triggered' => 'Auto-lås udført',
+ 'autolock_triggered_punchline' => 'Auto-lås udført, du er blevet logget ud',
+ 'already_authenticated' => 'Allerede autoriseret, log venligst ud først',
+ 'authentication' => 'Autorisation',
+ 'maybe_later' => 'Måske senere',
+ 'user_account_controlled_by_proxy' => 'User account made available by an authentication proxy.
Manage the account at proxy level.',
+ 'auth_handled_by_proxy' => 'Authentication handled by a reverse proxy, below settings are disabled.
Manage authentication at proxy level.',
+ 'sso_only_x_settings_are_disabled' => 'Authentication is restricted to SSO only, :auth_method is disabled',
+ 'confirm' => [
+ 'logout' => 'Er du sikker på at du vil logge af?',
+ 'revoke_device' => 'Are you sure you want to revoke this device?',
+ 'delete_account' => 'Are you sure you want to delete your account?',
+ ],
+ 'webauthn' => [
+ 'security_device' => 'a security device',
+ 'security_devices' => 'Security devices',
+ 'security_devices_legend' => 'Authentication devices you can use to sign in 2FAuth, like security keys (i.e Yubikey) or smartphones with biometric capabilities (i.e. Apple FaceId/TouchId)',
+ 'enhance_security_using_webauthn' => 'You can enhance the security of your 2FAuth account by enabling WebAuthn authentication.
+ WebAuthn allows you to use trusted devices (like Yubikeys or smartphones with biometric capabilities) to sign in quickly and more securely.',
+ 'use_security_device_to_sign_in' => 'Get ready to authenticate using (one of) your security devices. Plug your key in, remove face mask or gloves, etc.',
+ 'lost_your_device' => 'Lost your device?',
+ 'recover_your_account' => 'Gendan din konto',
+ 'account_recovery' => 'Kontogendannelse',
+ 'recovery_punchline' => '2FAuth vil sende et link til genoprettelse af adgang via denne e-mail adresse. Tryk på linket i mailen og følg instruktionerne.
Åben kun linket på din egen enhed.',
+ 'send_recovery_link' => 'Send gendannelseslink',
+ 'account_recovery_email_sent' => 'Mail til kontogendannelse afsendt!',
+ 'disable_all_security_devices' => 'Disable all security devices',
+ 'disable_all_security_devices_help' => 'All your security devices will be revoked. Use this option if you have lost one or its security has been compromised.',
+ 'register_a_new_device' => 'Registrer en ny enhed',
+ 'register_a_device' => 'Registrer en enhed',
+ 'device_successfully_registered' => 'Device successfully registered',
+ 'device_revoked' => 'Device successfully revoked',
+ 'revoking_a_device_is_permanent' => 'Revoking a device is permanent',
+ 'recover_account_instructions' => 'To recover your account, 2FAuth resets some Webauthn settings so you will be able to sign in using your email and password.',
+ 'invalid_recovery_token' => 'Ugyldig recovery token',
+ 'webauthn_login_disabled' => 'Webauthn er deaktiveret',
+ 'invalid_reset_token' => 'This reset token is invalid.',
+ 'rename_device' => 'Rename device',
+ 'my_device' => 'My device',
+ 'unknown_device' => 'Unknown device',
+ 'use_webauthn_only' => [
+ 'label' => 'Use WebAuthn only',
+ 'help' => 'Make WebAuthn the only authorized method to log into your 2FAuth account. This is the recommended setup to take advantage of the WebAuthn enhanced security.
+ In case of device lost, you will be able to recover your account by resetting this option and signing in using your email and password.
+ Attention! The Email & Password form remains available despite this option being enabled, but it will always return an \'Authentication failed\' response.'
+ ],
+ 'need_a_security_device_to_enable_options' => 'Set at least one device to enable the following options',
+ 'options' => 'Indstillinger',
+ ],
+ 'forms' => [
+ 'name' => 'Navn',
+ 'login' => 'Login',
+ 'webauthn_login' => 'WebAuthn login',
+ 'sso_login' => 'SSO-login',
+ 'email' => 'E-mail',
+ 'password' => 'Adgangskode',
+ 'reveal_password' => 'Vis adgangskode',
+ 'hide_password' => 'Skjul adgangskode',
+ 'confirm_password' => 'Bekræft adgangskode',
+ 'new_password' => 'Ny adgangskode',
+ 'confirm_new_password' => 'Bekræft ny adgangskode',
+ 'dont_have_account_yet' => 'Har du ikke din konto endnu?',
+ 'already_register' => 'Allerede registreret?',
+ 'authentication_failed' => 'Godkendelse mislykkedes',
+ 'forgot_your_password' => 'Glemt din adgangskode?',
+ 'request_password_reset' => 'Nulstil det',
+ 'reset_your_password' => 'Nulstil din adgangskode',
+ 'reset_password' => 'Nulstil adgangskode',
+ 'disabled_in_demo' => 'Feature disabled in Demo mode',
+ 'sso_only_form_restricted_to_admin' => 'Regular users must sign in with SSO. Other methods are for administrators only.',
+ 'new_password' => 'Ny adgangskode',
+ 'current_password' => [
+ 'label' => 'Nuværende adgangskode',
+ 'help' => 'Udfyld din nuværende adgangskode for at bekræfte, at det er dig'
+ ],
+ 'change_password' => 'Skift adgangskode',
+ 'send_password_reset_link' => 'Send link til nulstilling af adgangskode',
+ 'password_successfully_reset' => 'Adgangskoden blev ændret',
+ 'edit_account' => 'Rediger konto',
+ 'profile_saved' => 'Profile successfully updated!',
+ 'welcome_to_demo_app_use_those_credentials' => 'Welcome to the 2FAuth demo.
You can connect using the email address demo@2fauth.app and the password demo',
+ 'welcome_to_testing_app_use_those_credentials' => 'Welcome to the 2FAuth testing instance.
Use email address testing@2fauth.app and password password',
+ 'register_punchline' => 'Welcome to 2FAuth.
You need an account to go further, please register yourself.',
+ 'reset_punchline' => '2FAuth vil sende dig et link til nulstilling af adgangskode til denne adresse. Klik på linket i den modtagne e-mail for at angive en ny adgangskode.',
+ 'name_this_device' => 'Name this device',
+ 'delete_account' => 'Slet konto',
+ 'delete_your_account' => 'Slet din konto',
+ 'delete_your_account_and_reset_all_data' => 'Din brugerkonto vil blive slettet såvel som alle dine 2FA-data. Der er ingen vej tilbage.',
+ 'reset_your_password_to_delete_your_account' => 'If you always used SSO to sign in, sign out then use the reset password feature to get a password so you can fill this form.',
+ 'deleting_2fauth_account_does_not_impact_provider' => 'Deleting your 2FAuth account has no impact on your external SSO account.',
+ 'user_account_successfully_deleted' => 'Brugerkonto blev slettet',
+ 'has_lower_case' => 'Har små bogstaver',
+ 'has_upper_case' => 'Har store bogstaver',
+ 'has_special_char' => 'Har specialtegn',
+ 'has_number' => 'Har tal',
+ 'is_long_enough' => 'min. 8 karakterer',
+ 'mandatory_rules' => 'Obligatorisk',
+ 'optional_rules_you_should_follow' => 'Anbefalet (højt)',
+ 'caps_lock_is_on' => 'Caps lock er tændt',
+ ],
+ 'sso_providers' => [
+ 'unknown' => 'ukendt',
+ 'github' => 'Github',
+ 'openid' => 'OpenID'
+ ]
+];
diff --git a/resources/lang/da/commons.php b/resources/lang/da/commons.php
new file mode 100644
index 00000000..9c1c19dd
--- /dev/null
+++ b/resources/lang/da/commons.php
@@ -0,0 +1,94 @@
+ 'Cancel',
+ 'update' => 'Update',
+ 'copy' => 'Copy',
+ 'copy_to_clipboard' => 'Copy to clipboard',
+ 'copied_to_clipboard' => 'Copied to clipboard',
+ 'profile' => 'Profile',
+ 'edit' => 'Edit',
+ 'delete' => 'Delete',
+ 'disable' => 'Disable',
+ 'enable' => 'Enable',
+ 'create' => 'Create',
+ 'save' => 'Save',
+ 'close' => 'Close',
+ 'clear' => 'Clear',
+ 'clear_search' => 'Clear search',
+ 'demo_do_not_post_sensitive_data' => 'This is a demo app, do not post any sensitive data',
+ 'testing_do_not_post_sensitive_data' => 'This is a testing app, do not post any sensitive data',
+ 'x_selected' => ':count selected',
+ 'name' => 'Name',
+ 'manage' => 'Manage',
+ 'done' => 'Done',
+ 'new' => 'New',
+ 'back' => 'Back',
+ 'move' => 'Move',
+ 'export' => 'Export',
+ 'all' => 'All',
+ 'check_all' => 'All',
+ 'select_all' => 'Select all',
+ 'clear_selection' => 'Clear selection',
+ 'sort_descending' => 'Sort descending',
+ 'sort_ascending' => 'Sort ascending',
+ 'rename' => 'Rename',
+ 'new_name' => 'New name',
+ 'options' => 'Options',
+ 'reload' => 'Reload',
+ 'refresh' => 'Refresh',
+ 'data_refreshed_to_reflect_server_changes' => 'Data has been refresh to reflect server-side changes',
+ 'generate' => 'Generate',
+ 'generating_otp' => 'Generating OTP',
+ 'open_in_browser' => 'Open in browser',
+ 'continue' => 'Continue',
+ 'discard' => 'Discard',
+ 'about' => 'Om',
+ 'usefull_links' => 'Usefull links',
+ 'environment' => 'Environment',
+ 'credits' => 'Credits',
+ '2fauth_teaser' => 'A web app to manage your Two-Factor Authentication (2FA) accounts and generate their security codes',
+ 'made_with' => 'Made with',
+ 'ui_icons_by' => 'UI Icons by',
+ 'logos_by' => 'Logos by',
+ 'search' => 'Search',
+ 'resources' => 'Resources',
+ 'check_for_update' => 'Check for new version',
+ 'check_for_update_help' => 'Automatically check (once a week) and warn when a new release of 2FAuth is published on Github',
+ 'you_are_up_to_date' => 'This instance is up-to-date',
+ '2fauth_description' => 'A web app to manage your Two-Factor Authentication (2FA) accounts and generate their security codes',
+ 'image_of_qrcode_to_scan' => 'Image of a QR code to scan',
+ 'file' => 'File',
+ 'or' => 'OR',
+ 'close_the_x_page' => 'Close the :pagetitle page',
+ 'submit' => 'Submit',
+ 'default' => 'Default',
+ 'back_to_home' => 'Back to home',
+ 'nothing' => 'nothing',
+ 'no_result' => 'No result',
+ 'information' => 'Information',
+ 'send' => 'Send',
+ 'optimize' => 'Optimize',
+ 'IP' => 'IP',
+ 'browser' => 'Browser',
+ 'operating_system_short' => 'OS',
+ 'no_entry_yet' => 'No entry yet',
+ 'time' => 'Time',
+ 'ip_address' => 'IP Address',
+ 'device' => 'Device',
+ 'one_month' => '1 mo.',
+ 'x_month' => ':x mos.',
+ 'one_year' => '1 yr.',
+];
diff --git a/resources/lang/da/errors.php b/resources/lang/da/errors.php
new file mode 100644
index 00000000..5e067027
--- /dev/null
+++ b/resources/lang/da/errors.php
@@ -0,0 +1,76 @@
+ 'Resource not found',
+ 'error_occured' => 'An error occured:',
+ 'refresh' => 'Refresh',
+ 'no_valid_otp' => 'No valid OTP resource in this QR code',
+ 'something_wrong_with_server' => 'Something is wrong with your server',
+ 'Unable_to_decrypt_uri' => 'Unable to decrypt uri',
+ 'not_a_supported_otp_type' => 'This OTP format is not currently supported',
+ 'cannot_create_otp_without_secret' => 'Cannot create an OTP without a secret',
+ 'data_of_qrcode_is_not_valid_URI' => 'The data of this QR code is not a valid OTP Auth URI. The QR code contains:',
+ 'wrong_current_password' => 'Wrong current password, nothing has changed',
+ 'error_during_encryption' => 'Encryption failed, your database remains unprotected.',
+ 'error_during_decryption' => 'Decryption failed, your database is still protected. This is mainly caused by an integrity issue of encrypted data for one or more accounts.',
+ 'qrcode_cannot_be_read' => 'This QR code is unreadable',
+ 'too_many_ids' => 'too many ids were included in the query parameter, max 100 allowed',
+ 'delete_user_setting_only' => 'Only user-created setting can be deleted',
+ 'indecipherable' => '*indecipherable*',
+ 'cannot_decipher_secret' => 'The secret cannot be deciphered. This is mainly caused by a wrong APP_KEY set in the .env configuration file of 2Fauth or a corrupted data stored in database.',
+ 'https_required' => 'HTTPS context required',
+ 'browser_does_not_support_webauthn' => 'Your device does not support webauthn. Try again later using a more modern browser',
+ 'aborted_by_user' => 'Aborted by user',
+ 'security_device_already_registered' => 'Device already registered',
+ 'not_allowed_operation' => 'Operation not allowed',
+ 'no_authenticator_support_specified_algorithms' => 'No authenticators support specified algorithms',
+ 'authenticator_missing_discoverable_credential_support' => 'Authenticator missing discoverable credential support',
+ 'authenticator_missing_user_verification_support' => 'Authenticator missing user verification support',
+ 'unknown_error' => 'Unknown error',
+ 'security_error_check_rpid' => 'Security error
Check your WEBAUTHN_ID env var',
+ '2fauth_has_not_a_valid_domain' => '2FAuth\'s domain is not a valid domain',
+ 'user_id_not_between_1_64' => 'User ID was not between 1 and 64 chars',
+ 'no_entry_was_of_type_public_key' => 'No entry was of type "public-key"',
+ 'unsupported_with_reverseproxy' => 'Not applicable when using an auth proxy or SSO',
+ 'unsupported_with_sso_only' => 'This authentication method is for administrators only. Users must log in with SSO.',
+ 'user_deletion_failed' => 'User account deletion failed, no data have been deleted',
+ 'auth_proxy_failed' => 'Proxy authentication failed',
+ 'auth_proxy_failed_legend' => '2Fauth is configured to run behind an authentication proxy but your proxy does not return the expected header. Check your configuration and try again.',
+ 'invalid_x_migration' => 'Invalid or unreadable :appname data',
+ 'invalid_2fa_data' => 'Invalid 2FA data',
+ 'unsupported_migration' => 'Data do not match any supported format',
+ 'unsupported_otp_type' => 'Unsupported OTP type',
+ 'encrypted_migration' => 'Unreadable, the data seem encrypted',
+ 'no_logo_found_for_x' => 'No logo available for :service',
+ 'file_upload_failed' => 'File upload failed',
+ 'unauthorized' => 'Unauthorized',
+ 'unauthorized_legend' => 'You do not have permissions to view this resource or to perform this action',
+ 'cannot_delete_the_only_admin' => 'Cannot delete the only admin account',
+ 'cannot_demote_the_only_admin' => 'Cannot demote the only admin account',
+ 'error_during_data_fetching' => '💀 Something went wrong during data fetching',
+ 'check_failed_try_later' => 'Check failed, please retry later',
+ 'sso_disabled' => 'SSO is disabled',
+ 'sso_bad_provider_setup' => 'This SSO provider is not fully setup in your .env file',
+ 'sso_failed' => 'Authentication via SSO rejected',
+ 'sso_no_register' => 'Registrations are disabled',
+ 'sso_email_already_used' => 'A user account with the same email address already exists but it does not match your external account ID. Do not use SSO if you are already registered on 2FAuth with this email.',
+ 'account_managed_by_external_provider' => 'Account managed by an external provider',
+ 'data_cannot_be_refreshed_from_server' => 'Data cannot be refreshed from server',
+ 'no_pwd_reset_for_this_user_type' => 'Password reset unavailable for this user',
+ 'cannot_detect_qrcode_in_image' => 'Cannot detect a QR code in the image, try to crop the image',
+ 'cannot_decode_detected_qrcode' => 'Cannot decode detected QR code, try to crop or sharpen the image',
+ 'qrcode_has_invalid_checksum' => 'QR code has invalid checksum',
+ 'no_readable_qrcode' => 'No readable QR code',
+];
\ No newline at end of file
diff --git a/resources/lang/da/groups.php b/resources/lang/da/groups.php
new file mode 100644
index 00000000..0a1124be
--- /dev/null
+++ b/resources/lang/da/groups.php
@@ -0,0 +1,41 @@
+ 'Groups',
+ 'create_group' => 'Create new group',
+ 'show_group_selector' => 'Show group selector',
+ 'hide_group_selector' => 'Hide group selector',
+ 'select_accounts_to_show' => 'Select accounts group to show',
+ 'x_accounts' => ':count accounts',
+ 'manage_groups' => 'Manage groups',
+ 'active_group' => 'Active group',
+ 'manage_groups_legend' => 'You can create groups to organize your accounts the way you want. All accounts remain visible in the pseudo group named \'All\', regardless of the group they belong to.',
+ 'deleting_group_does_not_delete_accounts' => 'Deleting a group does not delete accounts',
+ 'move_selected_to' => 'Move selected to',
+ 'move_selected_to_group' => 'Move selected into a group',
+ 'no_group' => 'No group',
+ 'change_group' => 'Change group',
+ 'group_successfully_created' => 'Group successfully created',
+ 'group_name_saved' => 'Group name saved',
+ 'group_successfully_deleted' => 'Group successfully deleted',
+ 'forms' => [
+ 'new_group' => 'New group',
+ 'new_name' => 'New name',
+ 'rename_group' => 'Rename group',
+ ],
+ 'confirm' => [
+ 'delete' => 'Are you sure you want to delete this group?',
+ ],
+];
\ No newline at end of file
diff --git a/resources/lang/da/languages.php b/resources/lang/da/languages.php
new file mode 100644
index 00000000..cbaf7ea7
--- /dev/null
+++ b/resources/lang/da/languages.php
@@ -0,0 +1,24 @@
+ 'Browser præference',
+ 'en' => 'Engelsk (Engelsk)',
+ 'fr' => 'Fransk (Fransk)',
+ 'de' => 'Deutsch (tysk)',
+ 'es' => 'Spansk ol (spansk)',
+ 'zh' => 'Kinesisk (Forenklet)',
+ 'ru' => 'Русский (Russisk)',
+ 'bg' => 'Български (Bulgarian)',
+ 'ja' => '日本語 (japansk)',
+ 'hi' => '(Hindi)',
+ 'tr' => 'Tujórkcře (tyrkisk)',
+];
\ No newline at end of file
diff --git a/resources/lang/da/notifications.php b/resources/lang/da/notifications.php
new file mode 100644
index 00000000..cdeab118
--- /dev/null
+++ b/resources/lang/da/notifications.php
@@ -0,0 +1,36 @@
+ 'Hello',
+ 'hello_user' => 'Hello :username,',
+ 'regards' => 'Regards',
+ 'test_email_settings' => [
+ 'subject' => '2FAuth test email',
+ 'reason' => 'You are receiving this email because you requested a test email to validate the email settings of your 2FAuth instance.',
+ 'success' => 'Good news, it works :)'
+ ],
+ 'new_device' => [
+ 'subject' => 'Connection to 2FAuth from a new device',
+ 'resume' => 'A new device has just connected to your 2FAuth account.',
+ 'connection_details' => 'Here are the details of this connection',
+ 'recommandations' => 'If this was you, you can ignore this alert. If you suspect any suspicious activity on your account, please change your password.'
+ ],
+ 'failed_login' => [
+ 'subject' => 'Failed login to 2FAuth',
+ 'resume' => 'There has been a failed login attempt to your 2FAuth account.',
+ 'connection_details' => 'Here are the details of this connection attempt',
+ 'recommandations' => 'If this was you, you can ignore this alert. If further attempts fail, you should contact the 2FAuth administrator to review security settings and take action against this attacker.'
+ ],
+];
\ No newline at end of file
diff --git a/resources/lang/da/pagination.php b/resources/lang/da/pagination.php
new file mode 100644
index 00000000..e05e094a
--- /dev/null
+++ b/resources/lang/da/pagination.php
@@ -0,0 +1,19 @@
+ '« Forrige',
+ 'next' => 'Næste »',
+
+];
diff --git a/resources/lang/da/passwords.php b/resources/lang/da/passwords.php
new file mode 100644
index 00000000..a25271a3
--- /dev/null
+++ b/resources/lang/da/passwords.php
@@ -0,0 +1,26 @@
+ 'Your password has been reset!',
+ 'sent' => 'We have emailed your password reset link!',
+ 'throttled' => 'Please wait before retrying.',
+ 'token' => 'This password reset token is invalid.',
+ 'user' => "We can't find a user with that email address.",
+
+ // 2FAuth
+ 'password' => 'Passwords must be at least eight characters and match the confirmation.',
+
+];
diff --git a/resources/lang/da/settings.php b/resources/lang/da/settings.php
new file mode 100644
index 00000000..a3489935
--- /dev/null
+++ b/resources/lang/da/settings.php
@@ -0,0 +1,184 @@
+ 'Settings',
+ 'preferences' => 'Preferences',
+ 'account' => 'Account',
+ 'oauth' => 'OAuth',
+ 'webauthn' => 'WebAuthn',
+ 'tokens' => 'Tokens',
+ 'options' => 'Options',
+ 'user_preferences' => 'User preferences',
+ 'admin_settings' => 'Admin settings',
+ 'confirm' => [
+
+ ],
+ 'you_are_administrator' => 'You are an administrator',
+ 'account_linked_to_sso_x_provider' => 'You signed-in via SSO using your :provider account. Your information cannot be changed here but on :provider.',
+ 'general' => 'General',
+ 'security' => 'Security',
+ 'notifications' => 'Notifications',
+ 'profile' => 'Profile',
+ 'change_password' => 'Change password',
+ 'personal_access_tokens' => 'Personal access tokens',
+ 'token_legend' => 'Personal Access Tokens allow any app to authenticate to the 2Fauth API. You should specify the access token as a Bearer token in the authorization header of consumer apps requests.',
+ 'generate_new_token' => 'Generate a new token',
+ 'revoke' => 'Revoke',
+ 'token_revoked' => 'Token successfully revoked',
+ 'revoking_a_token_is_permanent' => 'Revoking a token is permanent',
+ 'confirm' => [
+ 'revoke' => 'Are you sure you want to revoke this token?',
+ ],
+ 'make_sure_copy_token' => 'Make sure to copy your personal access token now. You won’t be able to see it again!',
+ 'data_input' => 'Data input',
+ 'forms' => [
+ 'edit_settings' => 'Edit settings',
+ 'setting_saved' => 'Settings saved',
+ 'new_token' => 'New token',
+ 'some_translation_are_missing' => 'Some translations are missing using the browser preferred language?',
+ 'help_translate_2fauth' => 'Help translate 2FAuth',
+ 'language' => [
+ 'label' => 'Language',
+ 'help' => 'Language used to translate the 2FAuth user interface. Named languages are complete, set the one of your choice to override your browser preference.'
+ ],
+ 'timezone' => [
+ 'label' => 'Time zone',
+ 'help' => 'The time zone applied to all dates and times displayed in the application'
+ ],
+ 'show_otp_as_dot' => [
+ 'label' => 'Show generated OTP as dot',
+ 'help' => 'Replace generated password caracters with *** to ensure confidentiality. Do not affect the copy/paste feature'
+ ],
+ 'reveal_dotted_otp' => [
+ 'label' => 'Reveal obscured OTP',
+ 'help' => 'Let the ability to temporarily reveal Dot-Obscured passwords'
+ ],
+ 'close_otp_on_copy' => [
+ 'label' => 'Close OTP after copy',
+ 'help' => 'Click on a generated password to copy it automatically hides it from the screen'
+ ],
+ 'auto_close_timeout' => [
+ 'label' => 'Auto close OTP',
+ 'help' => 'Automatically hide on-screen password after a timeout. This avoids unnecessary requests for fresh passwords if you forget to close the password view.'
+ ],
+ 'clear_search_on_copy' => [
+ 'label' => 'Clear Search on copy',
+ 'help' => 'Empty the Search box right after a code has been copied to the clipboard'
+ ],
+ 'sort_case_sensitive' => [
+ 'label' => 'Sort case sensitive',
+ 'help' => 'When invoked, force the Sort function to sort accounts on a case-sensitive basis'
+ ],
+ 'copy_otp_on_display' => [
+ 'label' => 'Copy OTP on display',
+ 'help' => 'Automatically copy a generated password right after it appears on screen. Due to browsers limitations, only the first TOTP password will be copied, not the rotating ones'
+ ],
+ 'use_basic_qrcode_reader' => [
+ 'label' => 'Use basic QR code reader',
+ 'help' => 'If you experiences issues when capturing QR codes enables this option to switch to a more basic but more reliable QR code reader'
+ ],
+ 'display_mode' => [
+ 'label' => 'Display mode',
+ 'help' => 'Choose whether you want accounts to be displayed as a list or as a grid'
+ ],
+ 'password_format' => [
+ 'label' => 'Password formatting',
+ 'help' => 'Change how the passwords are displayed by grouping digits to ease readability and memorization'
+ ],
+ 'pair' => 'by Pair',
+ 'pair_legend' => 'Group digits two by two',
+ 'trio_legend' => 'Group digits three by three',
+ 'half_legend' => 'Split digits into two equals groups',
+ 'trio' => 'by Trio',
+ 'half' => 'by Half',
+ 'grid' => 'Grid',
+ 'list' => 'List',
+ 'theme' => [
+ 'label' => 'Theme',
+ 'help' => 'Force a specific theme or apply the theme defined in your system/browser preferences'
+ ],
+ 'light' => 'Light',
+ 'dark' => 'Dark',
+ 'automatic' => 'Auto',
+ 'show_accounts_icons' => [
+ 'label' => 'Show icons',
+ 'help' => 'Show icons accounts in the main view'
+ ],
+ 'get_official_icons' => [
+ 'label' => 'Get official icons',
+ 'help' => '(Try to) Get the official icon of the 2FA issuer when adding an account'
+ ],
+ 'auto_lock' => [
+ 'label' => 'Auto lock',
+ 'help' => 'Log out the user automatically in case of inactivity. Has no effect when authentication is handled by a proxy and no custom logout url is specified.'
+ ],
+ 'default_group' => [
+ 'label' => 'Default group',
+ 'help' => 'The group to which the newly created accounts are associated',
+ ],
+ 'view_default_group_on_copy' => [
+ 'label' => 'View default group on copy',
+ 'help' => 'Always return to the default group when an OTP is copied',
+ ],
+ 'auto_save_qrcoded_account' => [
+ 'label' => 'Auto-save accounts',
+ 'help' => 'New accounts are automatically registered after scanning or uploading a QR code, no need to click a Save button',
+ ],
+ 'useDirectCapture' => [
+ 'label' => 'Direct input',
+ 'help' => 'Choose whether you want to be prompted to choose an input mode among those available or if you want to directly use the default input mode',
+ ],
+ 'defaultCaptureMode' => [
+ 'label' => 'Default input mode',
+ 'help' => 'Default input mode used when the Direct input option is On',
+ ],
+ 'remember_active_group' => [
+ 'label' => 'Remember group filter',
+ 'help' => 'Save the last group filter applied and restore it on your next visit',
+ ],
+ 'otp_generation' => [
+ 'label' => 'Show Password',
+ 'help' => 'Set how and when OTPs are displayed.
',
+ ],
+ 'notify_on_new_auth_device' => [
+ 'label' => 'On new device',
+ 'help' => 'Get an email when a new device connects to your 2FAuth account for the first time'
+ ],
+ 'notify_on_failed_login' => [
+ 'label' => 'On failed login',
+ 'help' => 'Get an email each time an attempt to connect to your 2FAuth account fails'
+ ],
+ 'otp_generation_on_request' => 'After a click/tap',
+ 'otp_generation_on_request_legend' => 'Alone, in its own view',
+ 'otp_generation_on_request_title' => 'Click an account to get a password in a dedicated view',
+ 'otp_generation_on_home' => 'Constantly',
+ 'otp_generation_on_home_legend' => 'All of them, on home',
+ 'otp_generation_on_home_title' => 'Show all passwords in the main view, without doing anything',
+ 'never' => 'Never',
+ 'on_otp_copy' => 'On security code copy',
+ '1_minutes' => 'After 1 minute',
+ '2_minutes' => 'After 2 minutes',
+ '5_minutes' => 'After 5 minutes',
+ '10_minutes' => 'After 10 minutes',
+ '15_minutes' => 'After 15 minutes',
+ '30_minutes' => 'After 30 minutes',
+ '1_hour' => 'After 1 hour',
+ '1_day' => 'After 1 day',
+ 'livescan' => 'QR code livescan',
+ 'upload' => 'QR code upload',
+ 'advanced_form' => 'Advanced form',
+ ],
+
+];
\ No newline at end of file
diff --git a/resources/lang/da/titles.php b/resources/lang/da/titles.php
new file mode 100644
index 00000000..12f56d7e
--- /dev/null
+++ b/resources/lang/da/titles.php
@@ -0,0 +1,58 @@
+ 'Ny konto',
+ 'capture' => 'Flash QR',
+ 'accounts' => 'Konti',
+ 'createAccount' => 'Opret konto',
+ 'importAccounts' => 'Importer konti',
+ 'editAccount' => 'Rediger konto',
+ 'showQRcode' => 'Konto som QR kode',
+ 'groups' => 'Grupper',
+ 'createGroup' => 'Opret gruppe',
+ 'editGroup' => 'Rediger gruppe',
+ 'settings' => [
+ 'options' => 'Indstillinger',
+ 'account' => 'Brugerkonto',
+ 'oauth' => [
+ 'tokens' => 'OAuth tokens',
+ 'generatePAT' => 'Nyt personligt token',
+ ],
+ 'webauthn' => [
+ 'editCredential' => 'Rediger enhed',
+ 'devices' => 'WebAuthn enheder',
+ ],
+ ],
+ 'login' => 'Login',
+ 'register' => 'Registrer',
+ 'autolock' => 'Autolås',
+ 'password' => [
+ 'request' => 'Nulstil password',
+ 'reset' => 'Nyt password',
+ ],
+ 'webauthn' => [
+ 'lost' => 'Kontogendannelse',
+ 'recover' => 'Registrer en ny enhed',
+ ],
+ 'flooded' => 'Flood',
+ 'genericError' => 'Fejl',
+ '404' => 'Element ikke fundet',
+ 'about' => 'Om',
+ 'admin' => [
+ 'appSetup' => 'App setup',
+ 'users' => 'Users management',
+ 'createUser' => 'Opret bruger',
+ 'manageUser' => 'Administrer bruger',
+ 'logs' => [
+ 'access' => 'Access log'
+ ]
+ ]
+];
\ No newline at end of file
diff --git a/resources/lang/da/twofaccounts.php b/resources/lang/da/twofaccounts.php
new file mode 100644
index 00000000..ae89d77f
--- /dev/null
+++ b/resources/lang/da/twofaccounts.php
@@ -0,0 +1,174 @@
+ 'Tjeneste',
+ 'account' => 'Konto',
+ 'icon' => 'Ikon',
+ 'icon_to_illustrate_the_account' => 'Ikon som illustrerer kontoen',
+ 'remove_icon' => 'Fjern ikon',
+ 'no_account_here' => 'Ingen 2FA her!',
+ 'add_first_account' => 'Vælg en metode og tilføj din første konto',
+ 'use_full_form' => 'Eller brug manuel indtastning',
+ 'add_one' => 'Tilføj én',
+ 'show_qrcode' => 'Vis QR kode',
+ 'no_service' => '- ingen tjeneste -',
+ 'account_created' => 'Konto oprettet',
+ 'account_updated' => 'Kontor opdateret',
+ 'accounts_deleted' => 'Konto(i) slettet',
+ 'accounts_moved' => 'Konto(i) flyttet',
+ 'export_selected_to_json' => 'Download a json export of selected accounts',
+ 'reveal' => 'afslør',
+ 'forms' => [
+ 'service' => [
+ 'placeholder' => 'Google, Twitter, Apple',
+ ],
+ 'account' => [
+ 'placeholder' => 'John DOE',
+ ],
+ 'new_account' => 'Ny konto',
+ 'edit_account' => 'Rediger konto',
+ 'otp_uri' => 'OTP Uri',
+ 'scan_qrcode' => 'Scan QR kode',
+ 'upload_qrcode' => 'Upload QR kode',
+ 'use_advanced_form' => 'Brug avanceret form',
+ 'prefill_using_qrcode' => 'Udfyld via en QR kode',
+ 'use_qrcode' => [
+ 'val' => 'Brug en qrkode',
+ 'title' => 'Brug en QR-kode til at udfylde formularen automagisk',
+ ],
+ 'unlock' => [
+ 'val' => 'Lås op',
+ 'title' => 'Unlock it (at your own risk)',
+ ],
+ 'lock' => [
+ 'val' => 'Lås',
+ 'title' => 'Lock it',
+ ],
+ 'choose_image' => 'Upload',
+ 'i_m_lucky' => 'Try my luck',
+ 'i_m_lucky_legend' => 'The "Try my luck" button try to get the official icon of the given service. Enter actual service name without ".xyz" extension and try to avoid typo. (beta feature)',
+ 'test' => 'Test',
+ 'group' => [
+ 'label' => 'Gruppe',
+ 'help' => 'The group to which the account is to be assigned'
+ ],
+ 'secret' => [
+ 'label' => 'Secret',
+ 'help' => 'Nøgle til generering af koder'
+ ],
+ 'plain_text' => 'Plain text',
+ 'otp_type' => [
+ 'label' => 'Choose the type of OTP to create',
+ 'help' => 'Time-based OTP or HMAC-based OTP or Steam OTP'
+ ],
+ 'digits' => [
+ 'label' => 'Cifre',
+ 'help' => 'Antal cifre i de genererede sikkerhedskoder'
+ ],
+ 'algorithm' => [
+ 'label' => 'Algoritme',
+ 'help' => 'Den algoritme, der bruges til at sikre dine sikkerhedskoder'
+ ],
+ 'period' => [
+ 'label' => 'Periode',
+ 'placeholder' => 'Standard er 30',
+ 'help' => 'Gyldighedsperioden for de genererede sikkerhedskoder i sekunder'
+ ],
+ 'counter' => [
+ 'label' => 'Tæller',
+ 'placeholder' => 'Standard er 0',
+ 'help' => 'The initial counter value',
+ 'help_lock' => 'It is risky to edit the counter as you can desynchronize the account with the verification server of the service. Use the lock icon to enable modification, but only if you know for you are doing'
+ ],
+ 'image' => [
+ 'label' => 'Image',
+ 'placeholder' => 'http://...',
+ 'help' => 'The url of an external image to use as the account icon'
+ ],
+ 'options_help' => 'You can leave the following options blank if you don\'t know how to set them. The most commonly used values will be applied.',
+ 'alternative_methods' => 'Alternative metoder',
+ 'spaces_are_ignored' => 'Uønskede mellemrum vil automatisk blive fjernet'
+ ],
+ 'stream' => [
+ 'live_scan_cant_start' => 'Live scan can\'t start :(',
+ 'need_grant_permission' => [
+ 'reason' => '2FAuth does not have permission to access your camera',
+ 'solution' => 'You need to grant permission to use your device camera. If you already denied and your browser do not prompt you again, please refers to the browser documentation to find out how to grant permission.',
+ 'click_camera_icon' => 'It is usually done by clicking on a slashed camera icon in or next to the browser\'s address bar',
+ ],
+ 'not_readable' => [
+ 'reason' => 'Kunne ikke indlæse scanner',
+ 'solution' => 'Er kameraet allerede i brug? Sørg for, at ingen anden app bruger dit kamera og prøv igen'
+ ],
+ 'no_cam_on_device' => [
+ 'reason' => 'Intet kamera på denne enhed',
+ 'solution' => 'Maybe you forgot to plug in your webcam'
+ ],
+ 'secured_context_required' => [
+ 'reason' => 'Secure context required',
+ 'solution' => 'HTTPS is required for live scan. If you run 2FAuth from your computer, do not use virtual host other than localhost'
+ ],
+ 'https_required' => 'HTTPS required for camera streaming',
+ 'camera_not_suitable' => [
+ 'reason' => 'Installed cameras are not suitable',
+ 'solution' => 'Brug venligst en anden enhed/kamera'
+ ],
+ 'stream_api_not_supported' => [
+ 'reason' => 'Stream API is not supported in this browser',
+ 'solution' => 'Du skal bruge en moderne browser'
+ ],
+ ],
+ 'confirm' => [
+ 'delete' => 'Er du sikker på, at du vil slette denne konto?',
+ 'cancel' => 'Ændringer vil gå tabt. Er du sikker?',
+ 'discard' => 'Er du sikker på, at du vil kassere denne konto?',
+ 'discard_all' => 'Er du sikker på du vil kassere alle konti?',
+ 'discard_duplicates' => 'Er du sikker på, at du vil kassere alle dubletter?',
+ ],
+ 'import' => [
+ 'import' => 'Import',
+ 'to_import' => 'Importer',
+ 'import_legend' => '2FAuth kan importere data fra forskellige 2FA apps.',
+ 'import_legend_afterpart' => 'Brug eksportfunktionen for disse apps til at få en migrationsressource som en QR-kode eller en JSON-fil og derefter indlæse den her.',
+ 'upload' => 'Upload',
+ 'scan' => 'Scan',
+ 'supported_formats_for_qrcode_upload' => 'Accepteret: jpg, jpeg, png, bmp, gif, svg eller webp',
+ 'supported_formats_for_file_upload' => 'Accepted: Plain text, json, 2fas',
+ 'expected_format_for_direct_input' => 'Expected: A list of otpauth URI, one by line',
+ 'supported_migration_formats' => 'Supported migration formats',
+ 'qr_code' => 'QR Kode',
+ 'text_file' => 'Tekst fil',
+ 'direct_input' => 'Direkte indtastning',
+ 'plain_text' => 'Simpel tekst',
+ 'parsing_data' => 'Fortolker data...',
+ 'issuer' => 'Udsteder',
+ 'imported' => 'Importeret',
+ 'failure' => 'Fejl',
+ 'x_valid_accounts_found' => ':count gyldige konti fundet',
+ 'submitted_data_parsed_now_accounts_are_awaiting_import' => 'Følgende 2FA-konti blev fundet i migrationsressourcen. Indtil videre er ingen af dem blevet tilføjet til 2FAuth.',
+ 'use_buttons_to_save_or_discard' => 'Brug de tilgængelige knapper til permanent at gemme dem til din 2FA-samling eller kassere dem.',
+ 'import_all' => 'Importer alle',
+ 'import_this_account' => 'Importer denne konto',
+ 'discard_all' => 'Kassér alle',
+ 'discard_duplicates' => 'Kassér dubletter',
+ 'discard_this_account' => 'Kasser denne konto',
+ 'generate_a_test_password' => 'Generer et testkodeord',
+ 'possible_duplicate' => 'En konto med nøjagtig samme data findes allerede',
+ 'invalid_account' => '- invalid account -',
+ 'invalid_service' => '- invalid service -',
+ 'do_not_set_password_or_encryption' => 'Do NOT enable Password protection or Encryption when you export data from a 2FA app otherwise 2FAuth will not be able to decipher them.',
+ ],
+
+];
\ No newline at end of file
diff --git a/resources/lang/da/validation.php b/resources/lang/da/validation.php
new file mode 100644
index 00000000..c86ec16f
--- /dev/null
+++ b/resources/lang/da/validation.php
@@ -0,0 +1,207 @@
+ 'The :attribute must be accepted.',
+ 'accepted_if' => 'The :attribute must be accepted when :other is :value.',
+ 'active_url' => 'The :attribute is not a valid URL.',
+ 'after' => 'The :attribute must be a date after :date.',
+ 'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
+ 'alpha' => 'The :attribute must only contain letters.',
+ 'alpha_dash' => 'The :attribute must only contain letters, numbers, dashes and underscores.',
+ 'alpha_num' => 'The :attribute must only contain letters and numbers.',
+ 'array' => 'The :attribute must be an array.',
+ 'before' => 'The :attribute must be a date before :date.',
+ 'before_or_equal' => 'The :attribute must be a date before or equal to :date.',
+ 'between' => [
+ 'array' => 'The :attribute must have between :min and :max items.',
+ 'file' => 'The :attribute must be between :min and :max kilobytes.',
+ 'numeric' => 'The :attribute must be between :min and :max.',
+ 'string' => 'The :attribute must be between :min and :max characters.',
+ ],
+ 'boolean' => 'The :attribute field must be true or false.',
+ 'confirmed' => 'The :attribute confirmation does not match.',
+ 'current_password' => 'The password is incorrect.',
+ 'date' => 'The :attribute is not a valid date.',
+ 'date_equals' => 'The :attribute must be a date equal to :date.',
+ 'date_format' => 'The :attribute does not match the format :format.',
+ 'declined' => 'The :attribute must be declined.',
+ 'declined_if' => 'The :attribute must be declined when :other is :value.',
+ 'different' => 'The :attribute and :other must be different.',
+ 'digits' => 'The :attribute must be :digits digits.',
+ 'digits_between' => 'The :attribute must be between :min and :max digits.',
+ 'dimensions' => 'The :attribute has invalid image dimensions.',
+ 'distinct' => 'The :attribute field has a duplicate value.',
+ 'doesnt_end_with' => 'The :attribute may not end with one of the following: :values.',
+ 'doesnt_start_with' => 'The :attribute may not start with one of the following: :values.',
+ 'email' => 'The :attribute must be a valid email address.',
+ 'ends_with' => 'The :attribute must end with one of the following: :values.',
+ 'enum' => 'The selected :attribute is invalid.',
+ 'exists' => 'The selected :attribute is invalid.',
+ 'file' => 'The :attribute must be a file.',
+ 'filled' => 'The :attribute field must have a value.',
+ 'gt' => [
+ 'array' => 'The :attribute must have more than :value items.',
+ 'file' => 'The :attribute must be greater than :value kilobytes.',
+ 'numeric' => 'The :attribute must be greater than :value.',
+ 'string' => 'The :attribute must be greater than :value characters.',
+ ],
+ 'gte' => [
+ 'array' => 'The :attribute must have :value items or more.',
+ 'file' => 'The :attribute must be greater than or equal to :value kilobytes.',
+ 'numeric' => 'The :attribute must be greater than or equal to :value.',
+ 'string' => 'The :attribute must be greater than or equal to :value characters.',
+ ],
+ 'image' => 'The :attribute must be an image.',
+ 'in' => 'The selected :attribute is invalid.',
+ 'in_array' => 'The :attribute field does not exist in :other.',
+ 'integer' => 'The :attribute must be an integer.',
+ 'ip' => 'The :attribute must be a valid IP address.',
+ 'ipv4' => 'The :attribute must be a valid IPv4 address.',
+ 'ipv6' => 'The :attribute must be a valid IPv6 address.',
+ 'json' => 'The :attribute must be a valid JSON string.',
+ 'lt' => [
+ 'array' => 'The :attribute must have less than :value items.',
+ 'file' => 'The :attribute must be less than :value kilobytes.',
+ 'numeric' => 'The :attribute must be less than :value.',
+ 'string' => 'The :attribute must be less than :value characters.',
+ ],
+ 'lte' => [
+ 'array' => 'The :attribute must not have more than :value items.',
+ 'file' => 'The :attribute must be less than or equal to :value kilobytes.',
+ 'numeric' => 'The :attribute must be less than or equal to :value.',
+ 'string' => 'The :attribute must be less than or equal to :value characters.',
+ ],
+ 'mac_address' => 'The :attribute must be a valid MAC address.',
+ 'max' => [
+ 'array' => 'The :attribute must not have more than :max items.',
+ 'file' => 'The :attribute must not be greater than :max kilobytes.',
+ 'numeric' => 'The :attribute must not be greater than :max.',
+ 'string' => 'The :attribute must not be greater than :max characters.',
+ ],
+ 'max_digits' => 'The :attribute must not have more than :max digits.',
+ 'mimes' => 'The :attribute must be a file of type: :values.',
+ 'mimetypes' => 'The :attribute must be a file of type: :values.',
+ 'min' => [
+ 'array' => 'The :attribute must have at least :min items.',
+ 'file' => 'The :attribute must be at least :min kilobytes.',
+ 'numeric' => 'The :attribute must be at least :min.',
+ 'string' => 'The :attribute must be at least :min characters.',
+ ],
+ 'min_digits' => 'The :attribute must have at least :min digits.',
+ 'multiple_of' => 'The :attribute must be a multiple of :value.',
+ 'not_in' => 'The selected :attribute is invalid.',
+ 'not_regex' => 'The :attribute format is invalid.',
+ 'numeric' => 'The :attribute must be a number.',
+ 'password' => [
+ 'letters' => 'The :attribute must contain at least one letter.',
+ 'mixed' => 'The :attribute must contain at least one uppercase and one lowercase letter.',
+ 'numbers' => 'The :attribute must contain at least one number.',
+ 'symbols' => 'The :attribute must contain at least one symbol.',
+ 'uncompromised' => 'The given :attribute has appeared in a data leak. Please choose a different :attribute.',
+ ],
+ 'present' => 'The :attribute field must be present.',
+ 'prohibited' => 'The :attribute field is prohibited.',
+ 'prohibited_if' => 'The :attribute field is prohibited when :other is :value.',
+ 'prohibited_unless' => 'The :attribute field is prohibited unless :other is in :values.',
+ 'prohibits' => 'The :attribute field prohibits :other from being present.',
+ 'regex' => 'The :attribute format is invalid.',
+ 'required' => 'The :attribute field is required.',
+ 'required_array_keys' => 'The :attribute field must contain entries for: :values.',
+ 'required_if' => 'The :attribute field is required when :other is :value.',
+ 'required_if_accepted' => 'The :attribute field is required when :other is accepted.',
+ 'required_unless' => 'The :attribute field is required unless :other is in :values.',
+ 'required_with' => 'The :attribute field is required when :values is present.',
+ 'required_with_all' => 'The :attribute field is required when :values are present.',
+ 'required_without' => 'The :attribute field is required when :values is not present.',
+ 'required_without_all' => 'The :attribute field is required when none of :values are present.',
+ 'same' => 'The :attribute and :other must match.',
+ 'size' => [
+ 'array' => 'The :attribute must contain :size items.',
+ 'file' => 'The :attribute must be :size kilobytes.',
+ 'numeric' => 'The :attribute must be :size.',
+ 'string' => 'The :attribute must be :size characters.',
+ ],
+ 'starts_with' => 'The :attribute must start with one of the following: :values.',
+ 'string' => 'The :attribute must be a string.',
+ 'timezone' => 'The :attribute must be a valid timezone.',
+ 'unique' => 'The :attribute has already been taken.',
+ 'uploaded' => 'The :attribute failed to upload.',
+ 'url' => 'The :attribute must be a valid URL.',
+ 'uuid' => 'The :attribute must be a valid UUID.',
+
+ 'single' => 'When using :attribute it must be the only parameter in this request body',
+ 'onlyCustomOtpWithUri' => 'The uri parameter must be provided alone or only in combination with the \'custom_otp\' parameter',
+ 'IsValidRegex' => 'The :attribute must be a valid regex pattern.',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Custom Validation Language Lines
+ |--------------------------------------------------------------------------
+ |
+ | Here you may specify custom validation messages for attributes using the
+ | convention "attribute.rule" to name the lines. This makes it quick to
+ | specify a specific custom language line for a given attribute rule.
+ |
+ */
+
+ 'custom' => [
+ 'icon' => [
+ 'image' => 'Supported format are jpeg, png, bmp, gif, svg, or webp.',
+ ],
+ 'qrcode' => [
+ 'image' => 'Supported format are jpeg, png, bmp, gif, svg, or webp.',
+ ],
+ 'uri' => [
+ 'regex' => 'The :attribute is not a valid otpauth uri.',
+ ],
+ 'otp_type' => [
+ 'in' => 'The :attribute is not supported.',
+ ],
+ 'email' => [
+ 'exists' => 'No account found using this email.',
+ 'ComplyWithEmailRestrictionPolicy' => 'This email address does not comply with the registration policy',
+ 'IsValidEmailList' => 'All emails must be valid and separated with a pipe'
+ ],
+ 'secret' => [
+ 'isBase32Encoded' => 'The :attribute must be a base32 encoded string.',
+ ],
+ 'account' => [
+ 'regex' => 'The :attribute must not contain colon.',
+ ],
+ 'service' => [
+ 'regex' => 'The :attribute must not contain colon.',
+ ],
+ 'label' => [
+ 'required' => 'The uri must have a label.',
+ ],
+ 'ids' => [
+ 'regex' => 'IDs must be comma separated, without trailing comma.',
+ ],
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Custom Validation Attributes
+ |--------------------------------------------------------------------------
+ |
+ | The following language lines are used to swap our attribute placeholder
+ | with something more reader friendly such as "E-Mail Address" instead
+ | of "email". This simply helps us make our message more expressive.
+ |
+ */
+
+ 'attributes' => [],
+
+];