Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Sonata Translation Bundle Laravel Package

computerrock/sonata-translation-bundle

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation Add the bundle via Composer:

    composer require computerrock/sonata-translation-bundle:dev-master
    

    Register bundles in AppKernel.php:

    new Lexik\Bundle\TranslationBundle\LexikTranslationBundle(),
    new Computerrock\SonataTranslationBundle\IbrowsSonataTranslationBundle(),
    
  2. Enable Translations in Sonata Admin Extend your Sonata admin class to support translations:

    use Computerrock\SonataTranslationBundle\Admin\TranslationAdminInterface;
    
    class YourAdmin extends AbstractAdmin implements TranslationAdminInterface
    {
        public function getTranslationFields()
        {
            return ['field_name']; // Fields to translate
        }
    }
    
  3. First Use Case Access the translation tab in Sonata Admin for any model supporting translations. Edit translations inline or via popup based on config.


Implementation Patterns

Workflows

  1. Field Translation

    • Define translatable fields in getTranslationFields().
    • Use getTranslationDomain() to specify translation domain (defaults to messages).
  2. Translation Input Types Configure input types per field in Sonata Admin:

    public function getTranslationInputType($field, $object)
    {
        return 'textarea'; // Override default (text|textarea|select|date|checklist)
    }
    
  3. Locale Management

    • Use lexik_translation config to set fallback_locale (e.g., en).
    • Add locales dynamically via lexik_translation.locales config.
  4. Integration with Lexik

    • Leverage lexik_translation services (e.g., translator, translation_manager) in controllers/services.
    • Example:
      $translator = $this->get('translator');
      $translator->trans('key', [], 'domain');
      

Best Practices

  • Group Translations: Use domains (e.g., validation, admin) to organize translations.
  • Override Templates: Customize Sonata Admin templates for translations in: Resources/views/Translation/.
  • Batch Updates: Use TranslationManager for bulk translation operations:
    $manager = $this->get('lexik_translation.manager');
    $manager->updateTranslation('domain', 'key', 'en', 'New value');
    

Gotchas and Tips

Pitfalls

  1. Configuration Conflicts

    • Ensure lexik_translation.fallback_locale is set; otherwise, translations may fail silently.
    • Override ibrows_sonata_translation.editable.mode carefully—popup mode requires JS/CSS setup.
  2. Field-Specific Issues

    • Select Inputs: Require options config for select type:
      ibrows_sonata_translation:
          editable:
              type: select
              options:
                  choices:
                      en: English
                      fr: Français
      
    • Date Fields: Use date type with format config:
      ibrows_sonata_translation:
          editable:
              type: date
              format: Y-m-d
      
  3. Caching

    • Clear cache after adding new locales or domains:
      php bin/console cache:clear
      
  4. Translation Keys

    • Avoid dynamic keys (e.g., $user->id). Use static keys with placeholders:
      # config/translations/messages.en.yml
      user.greeting: "Hello, {name}!"
      

Debugging Tips

  • Check Logs: Enable debug mode (APP_DEBUG=true) to log translation errors.
  • Validate Config: Use php bin/console debug:config ibrows_sonata_translation to verify settings.
  • Override Templates: Debug UI issues by extending Sonata templates (e.g., Translation/inline_edit.html.twig).

Extension Points

  1. Custom Input Types Extend Computerrock\SonataTranslationBundle\Form\Type\TranslationType to add new input types.

  2. Translation Events Listen to lexik_translation.pre_translate or lexik_translation.post_translate events for custom logic:

    services:
        app.translation_listener:
            class: AppBundle\EventListener\TranslationListener
            tags:
                - { name: kernel.event_listener, event: lexik_translation.pre_translate, method: onPreTranslate }
    
  3. Dynamic Domains Use TranslationManager to fetch domains dynamically:

    $domains = $manager->getDomains();
    
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
emuniq/filament-browser-notifications
syriable/filament-translator
hungnm28/livewire-form
wenprise/eloquent
crudly/encrypted
fadion/bouncy
cuci/prototurk-sdk
gos/pubsub-router-bundle
cuci/prototurk-sdk-symfony
clementtalleu/easyadmin-markdown-bundle
codeflextech/permission-manager
karnoweb/livewire-datepicker
sayedenam/sayed-dashboard
milito/query-filter
apiboxsym/user-bundle
apiboxsym/health-check-bundle
jayeshmepani/jpl-moshier-ephemeris-php
elnasnato/laraliveui
labrodev/rest-sdk
sampaui/sampaui