Installation:
composer require domis86/translator-bundle
Add to config/bundles.php:
Domis86\TranslatorBundle\Domis86TranslatorBundle::class => ['all' => true],
Database Configuration:
Run migrations to create the translations table:
php bin/console doctrine:migrations:diff
php bin/console doctrine:migrations:migrate
Enable WebDebugToolbar Integration:
Ensure WebProfilerBundle is enabled (default in Symfony Flex). The toolbar will now show translation counts and missing translations.
First Use Case:
{{ 'homepage.title'|trans }}).Debugging Translations:
Admin Interface Integration:
Domis86\TranslatorBundle\Controller\TranslationController) to add a dedicated admin panel:
<!-- templates/translator/admin.html.twig -->
{% extends 'translator:admin:index.html.twig' %}
{% block body %}
{{ parent() }}
<!-- Custom filters or bulk actions -->
{% endblock %}
config/routes.yaml:
translator_admin:
resource: "@Domis86TranslatorBundle/Resources/config/routing/admin.yaml"
prefix: /admin/translations
Fallback Logic:
config/packages/translator.yaml:
framework:
translator:
fallbacks:
- "%locale%"
- en
translator.use_db to toggle:
domis86_translator:
use_db: true # Default: true
Caching:
domis86_translator:
cache:
enabled: true
pool: cache.app
Database Locking:
$entityManager->beginTransaction();
try {
$translation = $entityManager->getRepository(Translation::class)->findOneBy(['id' => $id]);
$translation->setContent($newContent);
$entityManager->flush();
$entityManager->commit();
} catch (\Exception $e) {
$entityManager->rollback();
throw $e;
}
Missing Translations:
Translation entity has allowMissing: true in the repository:
// src/Repository/TranslationRepository.php
public function findMissing($domain, $id, $locale)
{
return null; // Forces creation of new entry
}
Locale-Specific Quirks:
{% extends 'translator:edit_dialog.html.twig' %}
{% block styles %}
{{ parent() }}
<style>
.translator-editor { direction: rtl; }
</style>
{% endblock %}
config/packages/monolog.yaml:
monolog:
handlers:
translator:
type: stream
path: "%kernel.logs_dir%/translator.log"
level: debug
channels: ["translator"]
Then, in your TranslationListener, log missing keys:
public function onKernelRequest(GetResponseEvent $event)
{
$translator = $this->container->get('translator');
$translator->addMissingTranslationListener(function ($missing) {
$this->logger->debug('Missing translation', ['missing' => $missing]);
});
}
Custom Validation:
Extend the Translation entity to add validation rules:
// src/Entity/Translation.php
use Symfony\Component\Validator\Constraints as Assert;
/**
* @Assert\Length(max=255)
* @Assert\NotBlank
*/
private $content;
Event Listeners:
Subscribe to translation events (e.g., translator.pre_save):
// src/EventListener/TranslationListener.php
use Domis86\TranslatorBundle\Event\TranslationEvents;
public function onPreSave(TranslationEvent $event)
{
$translation = $event->getTranslation();
$translation->setCreatedAt(new \DateTime());
}
Register in services.yaml:
services:
App\EventListener\TranslationListener:
tags:
- { name: kernel.event_listener, event: translator.pre_save, method: onPreSave }
Override Templates:
Copy templates from vendor/domis86/translator-bundle/Resources/views/ to templates/translator/ to customize:
edit_dialog.html.twig (inline editor UI).admin/index.html.twig (admin panel layout).How can I help you explore Laravel packages today?