From f566bc0c7c0640b1dd3e2f59e4710a6d986b5a53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Jaussoin?= Date: Wed, 19 Feb 2025 16:30:16 +0100 Subject: [PATCH] Fix FLEXIAPI-237 Add internationalisation support in the app --- CHANGELOG.md | 1 + flexiapi/app/Http/Kernel.php | 1 + flexiapi/app/Http/Middleware/Localization.php | 7 +- flexiapi/app/Rules/IsNotPhoneNumber.php | 2 +- flexiapi/app/Services/AccountService.php | 2 +- flexiapi/config/app.php | 2 +- flexiapi/{resources => }/lang/en/auth.php | 0 .../{resources => }/lang/en/pagination.php | 0 .../{resources => }/lang/en/passwords.php | 0 .../{resources => }/lang/en/validation.php | 0 flexiapi/lang/fr.json | 147 ++++++++++++++++++ flexiapi/{resources => }/lang/fr/auth.php | 0 .../{resources => }/lang/fr/pagination.php | 0 .../{resources => }/lang/fr/passwords.php | 0 .../{resources => }/lang/fr/validation.php | 0 flexiapi/public/css/form.css | 5 + flexiapi/public/css/style.css | 5 +- flexiapi/resources/views/about.blade.php | 2 +- .../creation_request_token/check.blade.php | 2 +- .../views/account/dashboard.blade.php | 38 +++-- .../resources/views/account/delete.blade.php | 6 +- .../views/account/device/delete.blade.php | 8 +- .../views/account/device/index.blade.php | 8 +- .../resources/views/account/email.blade.php | 4 +- .../views/account/email/change.blade.php | 5 +- .../views/account/email/validate.blade.php | 3 - .../resources/views/account/login.blade.php | 16 +- .../views/account/password.blade.php | 14 +- .../views/account/password_changed.blade.php | 6 +- .../views/account/password_reset.blade.php | 8 +- .../views/account/phone/change.blade.php | 8 +- .../views/account/phone/validate.blade.php | 3 - .../views/account/recovery/confirm.blade.php | 4 +- .../views/account/recovery/show.blade.php | 32 ++-- .../views/account/register/email.blade.php | 33 ++-- .../views/account/register/phone.blade.php | 18 +-- .../account/account_type/create.blade.php | 10 +- .../account/action/create_edit.blade.php | 12 +- .../admin/account/action/delete.blade.php | 10 +- .../admin/account/activity/index.blade.php | 48 +++--- .../admin/account/contact/create.blade.php | 6 +- .../admin/account/contact/delete.blade.php | 8 +- .../views/admin/account/create_edit.blade.php | 83 +++++----- .../views/admin/account/delete.blade.php | 10 +- .../admin/account/device/delete.blade.php | 6 +- .../admin/account/device/index.blade.php | 8 +- .../account/dictionary/create_edit.blade.php | 12 +- .../admin/account/dictionary/delete.blade.php | 8 +- .../admin/account/dictionary/index.blade.php | 16 +- .../admin/account/import/check.blade.php | 14 +- .../admin/account/import/create.blade.php | 35 ++--- .../views/admin/account/index.blade.php | 34 ++-- .../parts/breadcrumb_accounts_index.blade.php | 2 +- .../parts/forms/select_domain.blade.php | 4 +- .../views/admin/account/parts/tabs.blade.php | 12 +- .../reset_password_email/create.blade.php | 6 +- .../admin/account/statistics/show.blade.php | 14 +- .../statistics/show_call_logs.blade.php | 8 +- .../admin/account/type/create_edit.blade.php | 12 +- .../views/admin/account/type/delete.blade.php | 10 +- .../views/admin/account/type/index.blade.php | 16 +- .../contacts_list/contacts/add.blade.php | 16 +- .../admin/contacts_list/create_edit.blade.php | 40 ++--- .../admin/contacts_list/delete.blade.php | 12 +- .../views/admin/contacts_list/index.blade.php | 16 +- .../views/admin/phone_country/index.blade.php | 24 +-- .../admin/space/administration.blade.php | 20 +-- .../views/admin/space/configuration.blade.php | 32 ++-- .../views/admin/space/create.blade.php | 20 +-- .../views/admin/space/delete.blade.php | 12 +- .../views/admin/space/edit.blade.php | 36 ++--- .../views/admin/space/index.blade.php | 16 +- .../views/admin/space/show.blade.php | 16 +- .../views/admin/space/tabs.blade.php | 10 +- .../admin/statistics/parts/filters.blade.php | 20 +-- .../admin/statistics/parts/tabs.blade.php | 8 +- .../views/admin/statistics/show.blade.php | 4 +- .../admin/statistics/show_call_logs.blade.php | 14 +- .../resources/views/layouts/main.blade.php | 12 +- .../views/parts/call_logs/table.blade.php | 8 +- .../resources/views/parts/recovery.blade.php | 4 +- .../resources/views/parts/sidebar.blade.php | 12 +- .../views/parts/tabs/register.blade.php | 4 +- 83 files changed, 643 insertions(+), 507 deletions(-) rename flexiapi/{resources => }/lang/en/auth.php (100%) rename flexiapi/{resources => }/lang/en/pagination.php (100%) rename flexiapi/{resources => }/lang/en/passwords.php (100%) rename flexiapi/{resources => }/lang/en/validation.php (100%) create mode 100644 flexiapi/lang/fr.json rename flexiapi/{resources => }/lang/fr/auth.php (100%) rename flexiapi/{resources => }/lang/fr/pagination.php (100%) rename flexiapi/{resources => }/lang/fr/passwords.php (100%) rename flexiapi/{resources => }/lang/fr/validation.php (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index d1283da..6b4be3d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ v1.7 - Fix FLEXIAPI-258 Move DotEnv instance configurations in the Spaces table - Fix FLEXIAPI-270 Call the static $apnsTypes attribute in FlexisipPusherConnector - Fix FLEXIAPI-271 Handle properly reversed attributes in objects +- Fix FLEXIAPI-237 Add internationalisation support in the app v1.6 ---- diff --git a/flexiapi/app/Http/Kernel.php b/flexiapi/app/Http/Kernel.php index 422871c..67d41cf 100644 --- a/flexiapi/app/Http/Kernel.php +++ b/flexiapi/app/Http/Kernel.php @@ -51,6 +51,7 @@ class Kernel extends HttpKernel \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, + \App\Http\Middleware\Localization::class, ], 'api' => [ diff --git a/flexiapi/app/Http/Middleware/Localization.php b/flexiapi/app/Http/Middleware/Localization.php index 2b63eb3..4c30b85 100644 --- a/flexiapi/app/Http/Middleware/Localization.php +++ b/flexiapi/app/Http/Middleware/Localization.php @@ -10,12 +10,7 @@ class Localization { public function handle(Request $request, Closure $next) { - $localization = $request->header('Accept-Language'); - $localization = in_array($localization, config('app.authorized_locales'), true) - ? $localization - : config('app.locale'); - - App::setLocale($localization); + App::setLocale($request->getPreferredLanguage(config('app.authorized_locales'))); return $next($request); } diff --git a/flexiapi/app/Rules/IsNotPhoneNumber.php b/flexiapi/app/Rules/IsNotPhoneNumber.php index 569b20b..cd27155 100644 --- a/flexiapi/app/Rules/IsNotPhoneNumber.php +++ b/flexiapi/app/Rules/IsNotPhoneNumber.php @@ -15,6 +15,6 @@ class IsNotPhoneNumber implements Rule public function message() { - return 'The :attribute should not be a phone number'; + return __('The :attribute should not be a phone number'); } } diff --git a/flexiapi/app/Services/AccountService.php b/flexiapi/app/Services/AccountService.php index 37fa6d0..b6870d4 100644 --- a/flexiapi/app/Services/AccountService.php +++ b/flexiapi/app/Services/AccountService.php @@ -165,7 +165,7 @@ class AccountService } if (!$request->api && $request->has('blocked')) { - $account->blocked = $request->get('blocked') == 'true'; + $account->blocked = in_array($request->get('blocked'), ['true', 'on']); } if ($request->get('password')) { diff --git a/flexiapi/config/app.php b/flexiapi/config/app.php index 157af35..ec548b7 100644 --- a/flexiapi/config/app.php +++ b/flexiapi/config/app.php @@ -133,7 +133,7 @@ return [ */ 'locale' => 'en', - 'authorized_locales' => ['fr', 'en'], + 'authorized_locales' => ['en', 'fr'], /* |-------------------------------------------------------------------------- diff --git a/flexiapi/resources/lang/en/auth.php b/flexiapi/lang/en/auth.php similarity index 100% rename from flexiapi/resources/lang/en/auth.php rename to flexiapi/lang/en/auth.php diff --git a/flexiapi/resources/lang/en/pagination.php b/flexiapi/lang/en/pagination.php similarity index 100% rename from flexiapi/resources/lang/en/pagination.php rename to flexiapi/lang/en/pagination.php diff --git a/flexiapi/resources/lang/en/passwords.php b/flexiapi/lang/en/passwords.php similarity index 100% rename from flexiapi/resources/lang/en/passwords.php rename to flexiapi/lang/en/passwords.php diff --git a/flexiapi/resources/lang/en/validation.php b/flexiapi/lang/en/validation.php similarity index 100% rename from flexiapi/resources/lang/en/validation.php rename to flexiapi/lang/en/validation.php diff --git a/flexiapi/lang/fr.json b/flexiapi/lang/fr.json new file mode 100644 index 0000000..eda981b --- /dev/null +++ b/flexiapi/lang/fr.json @@ -0,0 +1,147 @@ +{ + "About": "À Propos", + "Account creation": "Création de compte", + "Account recovery": "Récupération de compte", + "Account settings": "Paramètres de compte", + "Accounts": "Comptes", + "Actions": "Actions", + "Activate All": "Tout activer", + "Activate": "Activer", + "Activated": "Activé", + "Activity": "Activité", + "Add contact": "Ajout d'un contact", + "Add contacts": "Ajouter des contacts", + "Add": "Ajouter", + "Admin": "Administrateur", + "Administration": "Administration", + "All the admins in will be super admins": "Tous les administrateurs seront super-administrateurs", + "Allow a custom CSS theme": "Autoriser un thème CSS personnalisé", + "Allow client settings to be overwritten by the provisioning ones": "Écraser la configuration client avec celle du provisionnement", + "App Configuration": "Configuration de l'App", + "Assistant": "Assistant", + "Blocked": "Bloqué", + "Calls logs": "Journaux d'appel", + "Cancel": "Annuler", + "Cannot be changed once created.": "Ne peut être changé par la suite.", + "Chat": "Chat", + "Check the README.md documentation": "Voir la documentation dans README.md", + "Clear to never expire": "Laisser vide pour ne jamais expirer", + "Code": "Code", + "Conference": "Conférence", + "Configuration": "Configuration", + "Confirm email": "Confirmation de l'email", + "Confirm password": "Confirmer le mot de passe", + "Confirmed registration text": "Texte de confirmation d'inscription", + "Contacts List": "Liste de Contacts", + "Contacts Lists": "Listes de Contacts", + "Contacts": "Contacts", + "Copyright text": "Texte droits d'auteurs", + "Country code": "Code du pays", + "Create": "Créer", + "Created on": "Créé le", + "Custom entries": "Entrées personnalisées", + "Dactivate": "Désactiver", + "Day": "Jour", + "Deactivate All": "Tout désactiver", + "Deactivated": "Désactivé", + "Delete": "Supprimer", + "Description": "Description", + "Devices": "Appareils", + "Dictionary": "Dictionnaire", + "Display name": "Nom d'affichage", + "Domain": "Domaine", + "Edit": "Éditer", + "Email registration": "Inscription par email", + "Email": "Email", + "Empty": "Vide", + "Enable the web interface": "Activer l'interface web", + "Enabled": "Activé", + "Errors": "Erreurs", + "Expiration": "Expiration", + "Export": "Exporter", + "Features": "Fonctionnalités", + "From": "Depuis", + "General settings": "Paramètres généraux", + "I would like to subscribe to the newsletter": "Je voudrais m'inscrire à la newsletter", + "I'm not a robot": "Je ne suis pas un robot", + "Identifier": "Identifiant", + "Import": "Importer", + "In ini format, will complete the other settings": "Au format ini, complètera les autres paramètres", + "Information": "Informations", + "Intercom features": "Fonctionnalités d'interphonie", + "It might actually disable this page, be careful": "Cette page pourrait être désactivée, faites attention", + "Key": "Clef", + "Leave empty to create a root Space.": "Laisser vide si vous souhaitez créer un Espace à la racine", + "Login": "Authentification", + "Manage": "Gérer", + "Markdown text": "Texte Markdown", + "Max accounts": "Maximum de comptes", + "Meeting": "Réunions", + "Month": "Mois", + "My Account": "Mon Compte", + "My Space": "Mon Espace", + "Name": "Nom", + "Never expire": "N'expire jamais", + "New Admin": "Nouvel Admin", + "Next": "Suivant", + "No account yet?": "Pas encore de compte ?", + "No email yet": "Pas d'email pour le moment", + "No limit": "Sans limite", + "No phone yet": "Pas de téléphone pour le moment", + "Only display usernames (hide SIP addresses)": "N'afficher que les num d'utilisateur (cacher les addresses SIP)", + "Password": "Mot de passe", + "Phone Countries": "Numéros Internationaux", + "Phone number": "Numéro de téléphone", + "Phone registration": "Inscription via mobile", + "Provisioning tokens": "Jetons de provisionnement", + "Provisioning": "Provisionnement", + "Public registration": "Inscription publiques", + "QR Code scanning": "Scan de QR Code", + "Record calls": "Enregistrements des appels", + "Register": "Inscription", + "Registration introduction": "Présentation lors de l'inscription", + "Remove": "Remove", + "Renew": "Renouveller", + "Requests": "Requêtes", + "Reset password": "Réinitialiser le mot de passe", + "Reset": "Réinitialiser", + "Role": "Rôle", + "Search": "Rechercher", + "Select a contacts list": "Sélectionner une liste de contact", + "Select a domain": "Sélectionner un domaine", + "Select a file": "Choisir un fichier", + "Send": "Envoyer", + "Sip Adress": "Adresse SIP", + "SIP Domain": "Domaine SIP", + "Space": "Espace", + "Spaces": "Espaces", + "Statistics": "Statistiques", + "Subdomain": "Sous-domaine", + "Super Admin": "Super Admin", + "Super Space": "Super Espace", + "The :attribute should not be a phone number": "Le champ :attribute ne peut pas être un numéro de téléphone", + "The code will be available :minutes minutes.": "Le code sera disponible pendant :minutes minutes.", + "The file must be in CSV following this template": "Le fichier doit être au format CSV et respecter le modèle suivant", + "The first line contains the labels": "La premières ligne contient les étiquettes", + "The link can only be visited once": "Le lien ne peut être utilisé qu'une fois", + "Third party SIP": "Adresse SIP tierce", + "To": "À", + "Transport": "Transport", + "Types": "Types", + "Unlimited if set to 0": "Illimité si à 0", + "Update": "Mettre à jour", + "Updated on": "Mis à jour le", + "Updated": "Mise à jour", + "Used on": "Utilisé le", + "User": "Utilisateur", + "Username or phone number": "Identifiant ou numéro de téléphone", + "Username": "Identifiant", + "Value": "Valeur", + "Verify": "Vérifier", + "Week": "Semaine", + "Welcome on :app_name": "Bienvenu sur :app_name", + "Year": "Année", + "You already have an account?": "Vous avez déjà un compte ?", + "You are going to permanently delete the following element. Please confirm your action.": "Vous allez supprimer l'élément suivant. Veuillez confirmer votre action.", + "Your password was updated properly.": "Votre mot de passe a été mis à jour." +} \ No newline at end of file diff --git a/flexiapi/resources/lang/fr/auth.php b/flexiapi/lang/fr/auth.php similarity index 100% rename from flexiapi/resources/lang/fr/auth.php rename to flexiapi/lang/fr/auth.php diff --git a/flexiapi/resources/lang/fr/pagination.php b/flexiapi/lang/fr/pagination.php similarity index 100% rename from flexiapi/resources/lang/fr/pagination.php rename to flexiapi/lang/fr/pagination.php diff --git a/flexiapi/resources/lang/fr/passwords.php b/flexiapi/lang/fr/passwords.php similarity index 100% rename from flexiapi/resources/lang/fr/passwords.php rename to flexiapi/lang/fr/passwords.php diff --git a/flexiapi/resources/lang/fr/validation.php b/flexiapi/lang/fr/validation.php similarity index 100% rename from flexiapi/resources/lang/fr/validation.php rename to flexiapi/lang/fr/validation.php diff --git a/flexiapi/public/css/form.css b/flexiapi/public/css/form.css index 324900e..5f8bf6b 100644 --- a/flexiapi/public/css/form.css +++ b/flexiapi/public/css/form.css @@ -207,6 +207,11 @@ form div select { -webkit-appearance: none; } +form div select:has(option:only-child) { + opacity: 0.5; + pointer-events: none; +} + form div.search:after, form div.select:after { font-family: 'Phosphor'; diff --git a/flexiapi/public/css/style.css b/flexiapi/public/css/style.css index b270d54..408cc87 100644 --- a/flexiapi/public/css/style.css +++ b/flexiapi/public/css/style.css @@ -198,6 +198,7 @@ a.permalink { ul.tabs { display: flex; flex-direction: row; + flex-wrap: wrap; border-bottom: 2px solid var(--grey-2); margin-bottom: 2rem; width: 100%; @@ -217,6 +218,7 @@ ul.tabs li { ul.tabs li a { display: block; + white-space: nowrap; } ul.tabs li.current, @@ -247,7 +249,7 @@ header nav { header nav a { display: flex; align-items: center; - padding: 0 4rem; + padding: 0 2rem; line-height: 4rem; color: var(--second-5); } @@ -431,6 +433,7 @@ content>nav a { position: relative; white-space: nowrap; padding: 0 1rem; + overflow: hidden; } content>nav a.current { diff --git a/flexiapi/resources/views/about.blade.php b/flexiapi/resources/views/about.blade.php index e8fca16..b2b85ca 100644 --- a/flexiapi/resources/views/about.blade.php +++ b/flexiapi/resources/views/about.blade.php @@ -3,7 +3,7 @@ @section('content')
-

About

+

{{ __('About') }}


@if (!empty(config('app.project_url'))) diff --git a/flexiapi/resources/views/account/creation_request_token/check.blade.php b/flexiapi/resources/views/account/creation_request_token/check.blade.php index d465a92..3ae43ac 100644 --- a/flexiapi/resources/views/account/creation_request_token/check.blade.php +++ b/flexiapi/resources/views/account/creation_request_token/check.blade.php @@ -8,7 +8,7 @@ @include('parts.captcha') - +
diff --git a/flexiapi/resources/views/account/dashboard.blade.php b/flexiapi/resources/views/account/dashboard.blade.php index 09a67d8..93c755b 100644 --- a/flexiapi/resources/views/account/dashboard.blade.php +++ b/flexiapi/resources/views/account/dashboard.blade.php @@ -2,19 +2,19 @@ @section('content')
-

gauge My Account

+

gauge {{ __('My Account') }}

-

hand-waving Welcome back

+

hand-waving {{ __('Welcome on :app_name' , ['app_name' => config('app.name')]) }}

envelope @if (!empty($account->email)) {{ $account->email }} @else - No email yet + {{ __('No email yet') }} @endif - Change my current account email + {{ __('Edit') }}

@if (space()->phone_registration) @@ -23,55 +23,61 @@ @if (!empty($account->phone)) {{ $account->phone }} @else - No phone yet + {{ __('No phone yet') }} @endif - Change my current account phone + {{ __('Edit') }}

@endif

devices + {{ __('Devices') }} - Edit my devices + {{ __('Manage') }}

lock + {{ __('Password') }} @if ($account->passwords()->count() > 0) - Change my password + {{ __('Edit') }} @else - Set my password + {{ __('Create') }} @endif

key + {{ __('API Key') }} - API Key Management + {{ __('Manage') }}

trash - Delete my account + {{ __('My Account') }} + + {{ __('Delete') }} +

-

person Account information

+

person {{ __('Information') }}

-

envelope SIP address: sip:{{ $account->identifier }}

-

user Username: {{ $account->username }}

-

globe-hemisphere-west Domain: {{ $account->domain }}

+

envelope {{ __('SIP Adress') }}: sip:{{ $account->identifier }}

+

user {{ __('Username') }}: {{ $account->username }}

+

globe-hemisphere-west {{ __('Domain') }}: {{ $account->domain }}

@if (!empty(space()?->account_proxy_registrar_address))

lan Proxy/registrar address: sip:{{ space()?->account_proxy_registrar_address }}

@endif @if (!empty(config('app.transport_protocol_text'))) -

sliders Transport: {{ config('app.transport_protocol_text') }}

+

sliders {{ __('Transport') }}: {{ config('app.transport_protocol_text') }}

@endif