dkartasis8bitgroup/sonata-translation-bundle
Installation Run:
composer require ibrows/sonata-translation-bundle:dev-master
Update AppKernel.php to include:
new Lexik\Bundle\TranslationBundle\LexikTranslationBundle(),
new Ibrows\SonataTranslationBundle\IbrowsSonataTranslationBundle(),
Basic Configuration
Add minimal lexik_translation config in config.yml:
lexik_translation:
fallback_locale: en
Enable Translation in Sonata Admin Extend your admin class to support translations:
use Ibrows\SonataTranslationBundle\Admin\TranslationAdminTrait;
class YourAdmin extends AbstractAdmin
{
use TranslationAdminTrait;
protected $translationDomain = 'messages'; // Optional: Override default domain
}
First Use Case
$admin->addField('translations', 'sonata_type_translation', [
'sourceField' => 'name', // Field to translate
'editable' => true,
]);
Inline vs. Popup Mode
editable.mode: popup).ibrows_sonata_translation:
editable:
mode: popup
Field-Specific Translation Types
Customize input types per field (e.g., select for dropdowns, date for dates):
$admin->addField('translations', 'sonata_type_translation', [
'type' => 'select', // Override default 'textarea'
'options' => [
'choices' => ['en' => 'English', 'fr' => 'French'],
],
]);
Bulk Translation Updates
Use the TranslationAdminTrait to batch-edit translations via the Sonata Admin UI.
Integration with Custom Fields
Extend sonata_type_translation for custom logic:
$admin->addField('custom_translations', null, [
'type' => 'ibrows_sonata_translation_custom',
'options' => [
'class' => 'AppBundle\Entity\CustomTranslation',
],
]);
defaultDomain in config to avoid repeating translationDomain in every admin.lexik_translation.fallback_locale matches your app’s default locale.messages, validation) for better organization.Missing LexikBundle
Class 'Lexik\Bundle\TranslationBundle\LexikTranslationBundle' not found.lexik/translation-bundle is installed (composer will auto-install it as a dependency).Configuration Overrides
editable settings not applying.ibrows_sonata_translation config is loaded after SonataAdminBundle.imports in config.yml to enforce order:
imports:
- { resource: sonata_admin.yml }
- { resource: ibrows_sonata_translation.yml }
Translation Field Not Rendering
TranslationAdminTrait or incorrect field type.sonata_type_translation:
$admin->addField('translations', 'sonata_type_translation', [...]);
Locale-Specific Validation
emptytext config:
ibrows_sonata_translation:
editable:
emptytext: "Translation required"
APP_DEBUG=true) to see if the bundle loads:
php bin/console debug:config ibrows_sonata_translation
php bin/console cache:clear
Custom Translation Types
Create a new form type extending Ibrows\SonataTranslationBundle\Form\Type\TranslationType:
namespace AppBundle\Form\Type;
use Ibrows\SonataTranslationBundle\Form\Type\TranslationType as BaseType;
class CustomTranslationType extends BaseType {
public function configureOptions(OptionsResolver $resolver) {
$resolver->setDefaults([
'custom_option' => true,
]);
}
}
Register it as a service and reference it in your admin:
'type' => 'app_custom_translation',
Override Templates
Extend Sonata’s translation templates (e.g., block_translation_edit.html.twig) in templates/IbrowsSonataTranslationBundle/.
Dynamic Domains Use a callback to set the translation domain dynamically:
use Ibrows\SonataTranslationBundle\Admin\TranslationAdminTrait;
class DynamicAdmin extends AbstractAdmin {
use TranslationAdminTrait;
public function getTranslationDomain() {
return $this->getSubject()->getDomain(); // Assume entity has getDomain()
}
}
DISTINCT:
$query->distinct();
symfony/translation for runtime translations:
$this->get('translator')->trans($translation->getKey(), [], null, $locale);
$this->get('lexik_translation.manager')->setFallbackLocale('test');
How can I help you explore Laravel packages today?