Implémentation complète du multilingue FR/EN

- Installation vue-i18n v11 et création des fichiers de traduction (fr.json, en.json)
- Création store locale avec détection hiérarchique (URL > localStorage > navigator)
- Modification des routes avec préfixe /:locale? optionnel
- Toggle FR/EN dans Menu.vue avec synchronisation immédiate
- Traduction de ~200 textes dans 27 composants Vue
- Suppression des labels hardcodés en français côté backend
- Ajout route Kirby catch-all en/(:all?) pour /en/ URLs
- Helper addLocalePrefix() pour préserver locale dans liens dialogs
- Traduction pseudo-élément CSS via data attribute

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
isUnknown 2026-02-02 18:21:11 +01:00
parent 3af95b1d20
commit 82eb8d88cc
49 changed files with 1079 additions and 295 deletions

View file

@ -5,7 +5,7 @@
:draggable="false"
:dismissableMask="true"
modal
header="Ajouter des images"
:header="t('dialogs.addImages')"
class="bg-white | text-grey-800 | rounded-2xl | overflow-hidden | p-32"
>
<div class="with-sidebar | h-full">
@ -56,19 +56,18 @@
id="delete-image"
v-model:visible="deleteIsOpen"
modal
header="Êtes-vous sûr de vouloir supprimer cette image ?"
:header="t('dialogs.deleteConfirm')"
class="bg-white | text-grey-800 | rounded-2xl | overflow-hidden | text-center | w-full max-w | p-16 pt-32"
style="--row-gap: var(--space-32); --max-w: 40rem"
>
<p class="text-grey-700 | px-16">
Si vous supprimez cette image, celle-ci disparaîtra de votre brief ainsi
que toutes les informations qui lui sont attribuées.
{{ t('dialogs.deleteWarning') }}
</p>
<template #footer>
<button class="btn btn--secondary | flex-1" @click="deleteIsOpen = false">
Annuler
{{ t('buttons.cancel') }}
</button>
<button class="btn | flex-1" @click="">Supprimer</button>
<button class="btn | flex-1" @click="">{{ t('buttons.delete') }}</button>
</template>
</Dialog>
</template>
@ -79,6 +78,9 @@ import ImagesEditPanel from './ImagesEditPanel.vue';
import { ref, watch } from 'vue';
import { storeToRefs } from 'pinia';
import { useAddImagesModalStore } from '../../../../stores/addImagesModal';
import { useI18n } from 'vue-i18n';
const { t } = useI18n();
const { isAddImagesModalOpen } = defineProps({
isAddImagesModalOpen: Boolean,