Un bundle Symfony 7.3 pour la gestion avancée des traductions de contenu avec stockage en base de données et API REST.
composer require dahovitech/translator-bundle
Si vous n'utilisez pas Symfony Flex, ajoutez le bundle dans config/bundles.php :
<?php
return [
// ...
Dahovitech\TranslatorBundle\DahovitechTranslatorBundle::class => ['all' => true],
];
Créez le fichier de configuration config/packages/dahovitech_translator.yaml :
dahovitech_translator:
locales: ['en', 'fr', 'es']
default_locale: 'en'
fallback_locale: 'en'
domains: ['messages', 'validators', 'security']
enable_api: true
api_prefix: '/api/translations'
enable_cache: true
cache_ttl: 3600
auto_create_missing: false
import:
sources: []
overwrite_existing: false
export:
format: 'yaml'
output_dir: '%kernel.project_dir%/translations'
Créez et exécutez la migration pour créer la table des traductions :
php bin/console doctrine:migrations:diff
php bin/console doctrine:migrations:migrate
Si vous souhaitez personnaliser les routes de l'API, ajoutez dans config/routes.yaml :
dahovitech_translator:
resource: '@DahovitechTranslatorBundle/Resources/config/routes.yaml'
Le service principal TranslationManager fournit toutes les fonctionnalités de gestion des traductions :
<?php
use Dahovitech\TranslatorBundle\Service\TranslationManager;
class YourController
{
public function __construct(
private TranslationManager $translationManager
) {
}
public function example(): void
{
// Créer ou mettre à jour une traduction
$this->translationManager->setTranslation(
'welcome.message',
'fr',
'Bienvenue sur notre site !',
'messages'
);
// Récupérer une traduction
$translation = $this->translationManager->getTranslation(
'welcome.message',
'fr',
'messages'
);
// Vérifier si une traduction existe
$exists = $this->translationManager->hasTranslation(
'welcome.message',
'fr',
'messages'
);
// Supprimer une traduction
$deleted = $this->translationManager->removeTranslation(
'welcome.message',
'fr',
'messages'
);
// Importer des traductions en lot
$translations = [
'hello' => 'Bonjour',
'goodbye' => 'Au revoir',
'thank_you' => 'Merci'
];
$count = $this->translationManager->importTranslations($translations, 'fr', 'messages');
// Exporter toutes les traductions d'une locale
$allTranslations = $this->translationManager->exportTranslations('fr', 'messages');
// Obtenir les locales disponibles
$locales = $this->translationManager->getAvailableLocales();
// Obtenir toutes les clés de traduction
$keys = $this->translationManager->getTranslationKeys();
// Trouver les traductions manquantes
$missing = $this->translationManager->findMissingTranslations('fr', 'en');
}
}
Le bundle fournit une API REST complète pour gérer les traductions :
GET /api/translations - Liste toutes les traductions pour une localeGET /api/translations/{key} - Récupère une traduction spécifiquePOST /api/translations/{key} - Crée ou met à jour une traductionDELETE /api/translations/{key} - Supprime une traductionPOST /api/translations/import - Importe des traductions en lotGET /api/translations/export - Exporte les traductionsGET /api/translations/locales - Liste les locales disponiblesGET /api/translations/keys - Liste toutes les clés de traductionGET /api/translations/missing - Trouve les traductions manquantesRécupérer toutes les traductions pour une locale :
curl -X GET "http://your-app.com/api/translations?locale=fr&domain=messages"
Créer une nouvelle traduction :
curl -X POST "http://your-app.com/api/translations/welcome.message" \
-H "Content-Type: application/json" \
-d '{
"locale": "fr",
"content": "Bienvenue !",
"domain": "messages"
}'
Importer des traductions en lot :
curl -X POST "http://your-app.com/api/translations/import" \
-H "Content-Type: application/json" \
-d '{
"locale": "fr",
"domain": "messages",
"translations": {
"hello": "Bonjour",
"goodbye": "Au revoir"
}
}'
Le bundle s'intègre parfaitement avec le système de traduction Symfony existant. Vous pouvez utiliser les fonctions de traduction habituelles :
// Dans un contrôleur
$this->translator->trans('welcome.message', [], 'messages', 'fr');
// Dans un template Twig
{{ 'welcome.message'|trans({}, 'messages', 'fr') }}
Le bundle crée une table dahovitech_translations avec la structure suivante :
| Colonne | Type | Description |
|---|---|---|
| id | INTEGER | Clé primaire auto-incrémentée |
| translation_key | VARCHAR(255) | Clé de la traduction |
| locale | VARCHAR(10) | Code de la locale (ex: 'fr', 'en') |
| content | TEXT | Contenu de la traduction |
| domain | VARCHAR(100) | Domaine de traduction |
| created_at | DATETIME | Date de création |
| updated_at | DATETIME | Date de dernière modification |
Un index composite est créé sur (translation_key, locale) pour optimiser les performances.
| Option | Type | Défaut | Description |
|---|---|---|---|
locales |
array | ['en', 'fr'] |
Liste des locales supportées |
default_locale |
string | 'en' |
Locale par défaut |
fallback_locale |
string | 'en' |
Locale de fallback |
domains |
array | ['messages', 'validators', 'security'] |
Domaines disponibles |
enable_api |
boolean | true |
Active/désactive l'API REST |
api_prefix |
string | '/api/translations' |
Préfixe des routes API |
enable_cache |
boolean | true |
Active la mise en cache |
cache_ttl |
integer | 3600 |
Durée de vie du cache en secondes |
auto_create_missing |
boolean | false |
Crée automatiquement les traductions manquantes |
dahovitech_translator:
import:
sources:
- '%kernel.project_dir%/translations/messages.fr.yaml'
- '%kernel.project_dir%/translations/validators.fr.yaml'
overwrite_existing: true
dahovitech_translator:
export:
format: 'json' # yaml, json, php
output_dir: '%kernel.project_dir%/var/translations'
Le bundle inclut une suite de tests unitaires complète. Pour exécuter les tests :
composer install --dev
vendor/bin/phpunit
Les contributions sont les bienvenues ! Veuillez suivre ces étapes :
git checkout -b feature/amazing-feature)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)Ce projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails.
Pour toute question ou problème, veuillez ouvrir une issue sur GitHub.
How can I help you explore Laravel packages today?