symfonystofdoctrineextensions

Doctrine Extension Translatable doesn't retrieve translation


I use personal translation of StofDoctrineExtensionsBundle. I've configured my App but i can't retrieve the translated labels, i get always the default text.

config.yml

# Doctrine Configuration
doctrine:
    orm:
        auto_generate_proxy_classes: "%kernel.debug%"
        naming_strategy: doctrine.orm.naming_strategy.underscore
        auto_mapping: true
        mappings:
            menu_tree:
                type: annotation
                prefix: Gedmo\Tree\Entity
                dir: "%kernel.root_dir%/../vendor/gedmo/doctrine-extensions/lib/Gedmo/Tree/Entity"
                alias: MenuTree
                is_bundle: false
            gedmo_translatable:
                type: annotation
                prefix: Gedmo\Translatable\Entity
                dir: "%kernel.root_dir%/../vendor/gedmo/doctrine-extensions/lib/Gedmo/Translatable/Entity"
                alias: GedmoTranslatable # (optional) it will default to the name set for the mapping
                is_bundle: false
            gedmo_translator:
                type: annotation
                prefix: Gedmo\Translator\Entity
                dir: "%kernel.root_dir%/../vendor/gedmo/doctrine-extensions/lib/Gedmo/Translator/Entity"
                alias: GedmoTranslator # (optional) it will default to the name set for the mapping
                is_bundle: false

stof_doctrine_extensions:
    default_locale: "%locale%"
    translation_fallback: true
    orm:
        default:
            tree: true
            translatable: true
            sluggable: true

Then i wrote my personal Entity, this is a MenuItem

<?php

namespace App\Entity\Menu;

use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;

/**
 *
 * @ORM\Table(name="mnu_item")
 * @ORM\Entity(repositoryClass="App\Repository\Menu\MenuItem")
 * @Gedmo\Tree(type="nested")
 * @Gedmo\TranslationEntity(class="App\Entity\Menu\MenuItemTranslation")
 */
class MenuItem{

    /**
     *
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", options={"unsigned"=true})
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     *
     * @var string
     * @Gedmo\Translatable
     * @ORM\Column(name="label", type="string", length=255, nullable=true)
     */
    private $label;

    /**
     * @Gedmo\Locale
     * Used locale to override Translation listener`s locale
     * this is not a mapped field of entity metadata, just a simple property
     * and it is not necessary because globally locale can be set in listener
     */
    private $locale;

    /**
     * @ORM\OneToMany(targetEntity="\App\Entity\Menu\MenuItemTranslation",
     *                mappedBy="object",
     *                cascade={"persist", "remove"})
     */
    private $translations;

    /**
     * @var \App\Entity\Menu\Menu
     *
     * @ORM\ManyToOne(targetEntity="App\Entity\Menu\Menu", inversedBy="menuItems")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="menu_id", referencedColumnName="id", onDelete="CASCADE")
     * })
     */
    private $menu;


    /**
     * Constructor
     */
    public function __construct() {
        $this->ruoli = new \Doctrine\Common\Collections\ArrayCollection();
        $this->children = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * Get id
     *
     * @return integer
     */
    public function getId() {
        return $this->id;
    }

    /**
     * Set label
     *
     * @param string $label
     *
     * @return MenuItem
     */
    public function setLabel($label) {
        $this->label = $label;

        return $this;
    }

    /**
     * Get label
     *
     * @return string
     */
    public function getLabel() {
        return $this->label;
    }

    /**
     * Set menu
     *
     * @param \App\Entity\Menu\Menu $menu
     *
     * @return MenuItem
     */
    public function setMenu(\App\Entity\Menu\Menu $menu = null) {
        $this->menu = $menu;

        return $this;
    }

    /**
     * Get menu
     *
     * @return \App\Entity\Menu\Menu
     */
    public function getMenu() {
        return $this->menu;
    }

    /**
     * 
     * @return type
     */
    public function getTranslations(){
        return $this->translations;
    }

    /**
     * 
     * @param \App\Entity\Menu\MenuItemTranslation $t
     */
    public function addTranslation(MenuItemTranslation $t){
        if (!$this->translations->contains($t)) {
            $this->translations[] = $t;
            $t->setObject($this);
        }
    }

    public function setTranslatableLocale($locale){
        $this->locale = $locale;
    }
}

At least i have my Translator Class

<?php
namespace App\Entity\Menu;

use Doctrine\ORM\Mapping as ORM;
use Gedmo\Translatable\Entity\MappedSuperclass\AbstractPersonalTranslation;

/**
 * Description of MenuItemTranslation
/*
 * @ORM\Entity
 * @ORM\Table(name="mnu_menu_item_translations",
 *     uniqueConstraints={@ORM\UniqueConstraint(name="lookup_unique_idx", columns={
 *         "locale", "object_id", "field"
 *     })}
 * )
 */
class MenuItemTranslation extends AbstractPersonalTranslation {

    /**
     * Convenient constructor
     *
     * @param string $locale
     * @param string $field
     * @param string $value
     */
    public function __construct($locale, $field, $value)
    {
        $this->setLocale($locale);
        $this->setField($field);
        $this->setContent($value);
    }

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Menu\MenuItem", inversedBy="translations")
     * @ORM\JoinColumn(name="object_id", referencedColumnName="id", onDelete="CASCADE")
     */
    protected $object;

}

I have translated my label and it works, but in a twig tempate, using item.label or item.getLabel() i obtain always the default MenuItem valu (E.g. Test insted of Prova, see images)

Menu Item

MenuItem

Menu Item Translation

MenuItemTranslation


Solution

  • I've messed with locale. I changed the stof config 'cos my site is all in english and i need italian translation

    stof_doctrine_extensions:
        default_locale: "%locale%" #this is my error, just remove this line 
                                   # to set it back to en_US (default value). 
                                   # This indicates the locale of original table, 
                                   # if it's set to the same
                                   # locale of the entire system it won't 
                                   # retrieve any translation
        translation_fallback: true
        orm:
            default:
                tree: true
                translatable: true
                sluggable: true
    

    So the correct one is

    Then i changed the stof config 'cos my site is all in english and i need italian translation

    stof_doctrine_extensions:
        translation_fallback: true
        orm:
            default:
                tree: true
                translatable: true
                sluggable: true