Compare commits

...

4 Commits

Author SHA1 Message Date
Bubka 063fb2ef18 Add missing language string 2024-04-15 22:04:29 +02:00
Bubka 4e22fe7e2c Add a silenced email channel for the Demo mode 2024-04-15 21:42:04 +02:00
Bubka 0dee0f51f0 Update French translations 2024-04-15 21:21:15 +02:00
Bubka 086dd241d2 Add user's locale preference 2024-04-15 21:20:36 +02:00
9 changed files with 69 additions and 12 deletions

View File

@ -6,6 +6,7 @@ use App\Models\Traits\AuthenticationLoggable;
use App\Models\Traits\WebAuthnManageCredentials;
use Illuminate\Auth\Events\PasswordReset;
use Illuminate\Auth\Notifications\ResetPassword;
use Illuminate\Contracts\Translation\HasLocalePreference;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
@ -41,7 +42,7 @@ use Laravel\Passport\HasApiTokens;
* @property-read \Illuminate\Database\Eloquent\Collection|\Laragear\WebAuthn\Models\WebAuthnCredential[] $webAuthnCredentials
* @property-read int|null $web_authn_credentials_count
*/
class User extends Authenticatable implements WebAuthnAuthenticatable
class User extends Authenticatable implements HasLocalePreference, WebAuthnAuthenticatable
{
use AuthenticationLoggable;
use HasApiTokens, HasFactory, Notifiable;
@ -86,6 +87,14 @@ class User extends Authenticatable implements WebAuthnAuthenticatable
'demoting',
];
/**
* Get the user's preferred locale.
*/
public function preferredLocale() : string
{
return strval($this->preferences['lang']);
}
/**
* Scope a query to only include admin users.
*

View File

@ -126,6 +126,11 @@ return [
'emergency' => [
'path' => storage_path('logs/laravel.log'),
],
'silent' => [
'driver' => 'monolog',
'handler' => NullHandler::class,
],
],
];

View File

@ -125,13 +125,21 @@
<template>
<SearchBox v-if="props.showSearch" v-model:keyword="searched" :hasNoBackground="true" />
<nav v-if="props.showSearch" class="level is-mobile">
<nav v-if="props.showSearch" class="level is-mobile mb-2">
<div class="level-item has-text-centered">
<div class="buttons">
<button id="btnShowOneMonth" :title="$t('admin.show_last_month_log')" v-on:click="setPeriod(periods.aMonth)" :class="{ 'has-text-grey' : period !== periods.aMonth }" class="button is-ghost p-1">1m</button>
<button id="btnShowThreeMonths" :title="$t('admin.show_three_months_log')" v-on:click="setPeriod(periods.threeMonths)" :class="{ 'has-text-grey' : period !== periods.threeMonths }" class="button is-ghost p-1">3m</button>
<button id="btnShowSixMonths" :title="$t('admin.show_six_months_log')" v-on:click="setPeriod(periods.halfYear)" :class="{ 'has-text-grey' : period !== periods.halfYear }" class="button is-ghost p-1">6m</button>
<button id="btnShowOneYear" :title="$t('admin.show_one_year_log')" v-on:click="setPeriod(periods.aYear)" :class="{ 'has-text-grey' : period !== periods.aYear }" class="button is-ghost p-1 mr-5">1y</button>
<button id="btnShowOneMonth" :title="$t('admin.show_last_month_log')" v-on:click="setPeriod(periods.aMonth)" :class="{ 'has-text-grey' : period !== periods.aMonth }" class="button is-ghost p-1">
{{ $t('commons.one_month') }}
</button>
<button id="btnShowThreeMonths" :title="$t('admin.show_three_months_log')" v-on:click="setPeriod(periods.threeMonths)" :class="{ 'has-text-grey' : period !== periods.threeMonths }" class="button is-ghost p-1">
{{ $t('commons.x_month', { 'x' : '3' }) }}
</button>
<button id="btnShowSixMonths" :title="$t('admin.show_six_months_log')" v-on:click="setPeriod(periods.halfYear)" :class="{ 'has-text-grey' : period !== periods.halfYear }" class="button is-ghost p-1">
{{ $t('commons.x_month', { 'x' : '6' }) }}
</button>
<button id="btnShowOneYear" :title="$t('admin.show_one_year_log')" v-on:click="setPeriod(periods.aYear)" :class="{ 'has-text-grey' : period !== periods.aYear }" class="button is-ghost p-1 mr-5">
{{ $t('commons.one_year') }}
</button>
<button id="btnSortLogDesc" v-on:click="setDesc" :title="$t('admin.sort_by_date_desc')" :class="{ 'has-text-grey' : !orderIsDesc }" class="button p-1 is-ghost">
<FontAwesomeIcon :icon="['fas', 'arrow-up-long']" flip="vertical" />
<FontAwesomeIcon :icon="['far', 'calendar']" />

View File

@ -81,9 +81,6 @@ return [
'information' => 'Information',
'send' => 'Send',
'optimize' => 'Optimize',
'duration' => 'Duration',
'from' => 'From',
'using' => 'Using',
'IP' => 'IP',
'browser' => 'Browser',
'operating_system_short' => 'OS',
@ -91,4 +88,7 @@ return [
'time' => 'Time',
'ip_address' => 'IP Address',
'device' => 'Device',
'one_month' => '1 mo.',
'x_month' => ':x mos.',
'one_year' => '1 yr',
];

View File

@ -27,7 +27,7 @@ return [
'confirm' => [
'delete_user' => 'Êtes-vous sûr de vouloir supprimer cet utilisateur ? Il est impossible de restaurer un utilisateur supprimé.',
'request_password_reset' => 'Êtes-vous sûr de vouloir réinitialiser le mot de passe de cet utilisateur ?',
'purge_password_reset_request' => 'Êtes-vous sûr de vouloir supprimer la demande ?',
'purge_password_reset_request' => 'Êtes-vous sûr de vouloir supprimer la demande précédente ?',
'delete_account' => 'Êtes-vous sûr de vouloir supprimer cet utilisateur ?',
'edit_own_account' => 'Il s\'agit de votre propre compte. Êtes-vous sûr ?',
'change_admin_role' => 'Cela va grandement impacter les permissions de cet utilisateur. Êtes-vous sûr ?',
@ -68,6 +68,20 @@ return [
'check_now' => 'Vérifier maintenant',
'view_on_github' => 'Voir sur GitHub',
'x_is_available' => ':version est disponible',
'successful_login_on' => 'Connexion réussie le <span class="has-text-grey-light">:login_at</span>',
'successful_logout_on' => 'Déconnexion réussie le <span class="has-text-grey-light">:login_at</span>',
'failed_login_on' => 'Connexion refusée le <span class="has-text-grey-light">:login_at</span>',
'last_accesses' => 'Derniers accès',
'see_full_log' => 'Voir le log complet',
'browser_on_platform' => ':browser sur :platform',
'access_log_has_more_entries' => 'Le journal des accès contient probablement plus d\'entrées.',
'access_log_legend_for_user' => 'Journal des accès de l\'utilisateur :username',
'show_last_month_log' => 'Afficher les entrées sur un mois',
'show_three_months_log' => 'Afficher les entrées sur 3 mois',
'show_six_months_log' => 'Afficher les entrées sur 6 mois',
'show_one_year_log' => 'Afficher les entrées sur un an',
'sort_by_date_asc' => 'Afficher les plus anciens en premier',
'sort_by_date_desc' => 'Afficher les plus récents en premier',
'forms' => [
'use_encryption' => [
'label' => 'Protéger les données sensibles',

View File

@ -79,7 +79,13 @@ return [
'nothing' => 'rien',
'no_result' => 'Aucun résultat',
'information' => 'Information',
'permissions' => 'Autorisations',
'send' => 'Envoyer',
'optimize' => 'Optimiser',
'IP' => 'IP',
'browser' => 'Navigateur',
'operating_system_short' => 'OS',
'no_entry_yet' => 'Aucune entrée pour l\'instant',
'time' => 'Heure',
'ip_address' => 'Adresse IP',
'device' => 'Appareil',
];

View File

@ -57,6 +57,7 @@ return [
'unauthorized' => 'Non autorisé',
'unauthorized_legend' => 'Vous n\'avez pas la permission de voir cette ressource ou d\'effectuer cette action',
'cannot_delete_the_only_admin' => 'Impossible de supprimer le seul compte administrateur',
'cannot_demote_the_only_admin' => 'Impossible de rétrograder le seul compte administrateur',
'error_during_data_fetching' => '💀 Une erreur s\'est produite lors de la récupération des données',
'check_failed_try_later' => 'Échec de la vérification, veuillez réessayer plus tard',
'sso_disabled' => 'SSO est désactivé',
@ -67,4 +68,8 @@ return [
'account_managed_by_external_provider' => 'Compte géré par un fournisseur externe',
'data_cannot_be_refreshed_from_server' => 'Les données ne peuvent être actualisées depuis le serveur',
'no_pwd_reset_for_this_user_type' => 'Réinitialisation du mot de passe indisponible pour cet utilisateur',
'cannot_detect_qrcode_in_image' => 'Impossible de détecter un QR code dans l\'image, essayez de recadrer l\'image',
'cannot_decode_detected_qrcode' => 'Impossible de décoder le QR code détecté, essayez de rogner ou d\'améliorer l\'image',
'qrcode_has_invalid_checksum' => 'La somme de contrôle du QR code est invalide',
'no_readable_qrcode' => 'Aucun QR code lisible',
];

View File

@ -14,10 +14,17 @@ return [
*/
'hello' => 'Bonjour',
'hello_user' => 'Bonjour :username,',
'regards' => 'Cordialement',
'test_email_settings' => [
'subject' => 'Email de test 2FAuth',
'reason' => 'Vous recevez cet email car vous avez demandé à vérifier le bon fonctionnement de l\'envoi des emails sur votre instance 2FAuth.',
'success' => 'Bonne nouvelle, ça fonctionne :)'
],
'new_device' => [
'subject' => 'Nouvelle connexion à 2FAuth',
'resume' => 'Un nouvel appareil vient de se connecter à votre compte 2FAuth.',
'connection_details' => 'Voici les détails de cette connexion',
'recommandations' => 'S\'il s\'agit de vous, vous pouvez ignorer cette alerte. Dans le cas contraire, et si vous soupçonnez une activité suspecte sur votre compte, changez votre mot de passe sans attendre.'
],
];

View File

@ -51,5 +51,8 @@ return [
'users' => 'Gestion des utilisateurs',
'createUser' => 'Créer un utilisateur',
'manageUser' => 'Gestion de l\'utilisateur',
'logs' => [
'access' => 'Journal des accès'
]
]
];