Guide d’Internationalisation (i18n)
Ce guide explique comment l’internationalisation est implémentée dans l’application ExAI et comment ajouter de nouvelles traductions.
Vue d’ensemble
L’application utilise @ngx-translate/core
pour fournir un support multilingue complet. Les langues actuellement supportées sont :
-
Français (fr) - Langue par défaut
-
Anglais (en) - Langue secondaire
-
Espagnol (es) - Placeholders en attente de traduction native
-
Allemand (de) - Placeholders en attente de traduction native
Architecture i18n
Structure des fichiers
frontend/src/assets/i18n/
├── en.json # Traductions anglaises
├── fr.json # Traductions françaises
├── es.json # Traductions espagnoles (placeholders)
└── de.json # Traductions allemandes (placeholders)
Structure des clés de traduction
Organisation hiérarchique
Les clés sont organisées par section fonctionnelle :
{
"AUTH": {
"LOGIN": { ... },
"REGISTER": { ... }
},
"DASHBOARD": {
"TITLE": "...",
"METRICS": { ... },
"ACTIVITY": { ... }
},
"PROJECTS": {
"FORM": { ... },
"LIST": { ... },
"DETAIL": { ... }
},
"FORMS": {
"VALIDATION": { ... }
}
}
Implémentation dans les composants
Composants standard
1. Imports requis
import { TranslateModule, TranslateService } from '@ngx-translate/core';
@Component({
// ...
imports: [/* autres modules */, TranslateModule],
})
3. Utilisation dans le template
<!-- Traduction simple -->
<h1>{{ 'DASHBOARD.TITLE' | translate }}</h1>
<!-- Traduction avec paramètres -->
<p>{{ 'DASHBOARD.WELCOME' | translate: {name: userName} }}</p>
<!-- Traduction d'attributs -->
<input [placeholder]="'FORMS.EMAIL_PLACEHOLDER' | translate">
4. Traductions programmatiques
// Traduction immédiate
const message = this.translate.instant('SUCCESS_MESSAGE');
// Traduction avec paramètres
const welcomeMsg = this.translate.instant('WELCOME', { name: 'John' });
// Traduction asynchrone (Observable)
this.translate.get('ASYNC_MESSAGE').subscribe(translation => {
console.log(translation);
});
Données dynamiques
Pour les données qui changent avec la langue, utilisez des getters :
export class DashboardComponent {
private baseMetrics = [
{ titleKey: 'DASHBOARD.METRICS.DATASETS', value: 5 },
{ titleKey: 'DASHBOARD.METRICS.PIPELINES', value: 3 }
];
get dashboardMetrics() {
return this.baseMetrics.map(metric => ({
title: this.translate.instant(metric.titleKey),
value: metric.value
}));
}
}
Gestion des formulaires
Validation avec traductions
// Dans le composant
constructor() {
this.formErrorService = inject(FormErrorService);
}
// Obtenir le message d'erreur
getFieldError(fieldName: string): string | null {
const control = this.form.get(fieldName);
return this.formErrorService.getErrorMessage(control, fieldName);
}
<!-- Dans le template -->
<mat-form-field>
<mat-label>{{ 'FORMS.EMAIL' | translate }}</mat-label>
<input matInput formControlName="email">
<mat-error *ngIf="formErrorService.shouldShowError(form.get('email'))">
{{ getFieldError('email') }}
</mat-error>
</mat-form-field>
Ajouter une nouvelle langue
1. Créer le fichier de traduction
Créez frontend/src/assets/i18n/[code].json
avec la structure complète :
{
"AUTH": {
"LOGIN": {
"TITLE": "Connexion",
"EMAIL": "Email",
// ... toutes les clés
}
// ... toutes les sections
}
}
2. Mettre à jour LanguageService
// Dans language.service.ts
languages = [
{ code: 'fr', name: 'Français', flag: '🇫🇷' },
{ code: 'en', name: 'English', flag: '🇺🇸' },
{ code: 'es', name: 'Español', flag: '🇪🇸' },
{ code: 'de', name: 'Deutsch', flag: '🇩🇪' },
{ code: 'it', name: 'Italiano', flag: '🇮🇹' } // Nouvelle langue
];
Bonnes pratiques
1. Cohérence des clés
-
Utilisez des clés descriptives et hiérarchiques
-
Évitez les clés trop longues ou trop courtes
-
Groupez par fonctionnalité logique
2. Gestion des paramètres
{
"WELCOME_MESSAGE": "Bienvenue {{name}} !",
"ITEMS_COUNT": "{{count}} élément{{count > 1 ? 's' : ''}}"
}
Tests
Test des traductions
describe('Component i18n', () => {
beforeEach(() => {
TestBed.configureTestingModule({
imports: [TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useClass: TranslateFakeLoader
}
})]
});
});
it('should translate text correctly', () => {
const translateService = TestBed.inject(TranslateService);
translateService.setTranslation('en', { 'HELLO': 'Hello' });
translateService.use('en');
expect(translateService.instant('HELLO')).toBe('Hello');
});
});
Performance
Dépannage
Migration d’un texte existant
Étapes pour traduire un composant
-
Identifier les textes à traduire
-
Créer les clés dans les fichiers JSON
-
Ajouter TranslateModule aux imports du composant
-
Injecter TranslateService
-
Remplacer les textes par les pipes de traduction
-
Tester le changement de langue
Exemple de migration
Avant :
<h1>Tableau de bord</h1>
<p>Bienvenue sur votre dashboard</p>
Après :
<h1>{{ 'DASHBOARD.TITLE' | translate }}</h1>
<p>{{ 'DASHBOARD.WELCOME' | translate }}</p>
Fichier de traduction :
{
"DASHBOARD": {
"TITLE": "Tableau de bord",
"WELCOME": "Bienvenue sur votre dashboard"
}
}
Ressources
-
Documentation ngx-translate : https://github.com/ngx-translate/core
-
Guide Angular i18n : https://angular.io/guide/i18n
-
FormErrorService :
frontend/src/app/services/form-error.service.ts
-
LanguageService :
frontend/src/app/services/language.service.ts