dexodus/api-platform-translation-bundle

Translation bundle for Api platform based on Sylius translation

v1.4.1 2023-01-28 14:49 UTC

This package is not auto-updated.

Last update: 2024-11-04 14:12:44 UTC


README

This is the fork: Locastic Api Translation Bundle

Translation bundle for ApiPlatform based on Sylius translation

Installation:

$ composer require tunet/api-platform-translation-bundle

Implementation:

Translatable entity:

  • Extend your model/resource with Tunet\ApiTranslationBundle\Model\AbstractTranslatable
  • Add createTranslation() method which returns new object of translation Entity. Example:
    use Tunet\ApiPlatformTranslationBundle\Model\AbstractTranslatable;
    use Tunet\ApiPlatformTranslationBundle\Model\TranslationInterface;
    

class Post extends AbstractTranslatable {

// ...

protected function createTranslation(): TranslationInterface
{
    return new PostTranslation();
}

}


- Add a `translations`-property. Add the `translations` serializations group and make a connection to the translation entity:

use Tunet\ApiPlatformTranslationBundle\Model\AbstractTranslatable;

class Post extends AbstractTranslatable {

// ...

/**
 * @ORM\OneToMany(targetEntity="PostTranslation", mappedBy="translatable", fetch="EXTRA_LAZY", indexBy="locale", cascade={"PERSIST"}, orphanRemoval=true)
 *
 * @Groups({"post_write", "translations"})
 */
protected $translations;

}


- Add virtual fields for all translatable fields, and add read serialization group. 
Getters and setters must call getters and setters from translation class. Example:

use Tunet\ApiPlatformTranslationBundle\Model\AbstractTranslatable; use Symfony\Component\Serializer\Annotation\Groups;

class Post extends AbstractTranslatable {

// ...

/**
* @Groups({"post_read"})
*/
private $title;

public function setTitle(string $title)
{
    $this->getTranslation()->setTitle($title);
}

public function getTitle(): ?string
{
    return $this->getTranslation()->getTitle();
}

}



**Translation entity:**
- Add entity with all translatable fields. Name needs to be name of translatable entity + Translation
- Extend `Tunet\ApiPlatformTranslationBundle\Model\AbstractTranslation`
- Add serialization group `translations` to all fields and other read/write groups.
Example Translation entity:

use Symfony\Component\Serializer\Annotation\Groups; use Tunet\ApiPlatformTranslationBundle\Model\AbstractTranslation;

class PostTranslation extends AbstractTranslation {

// ...

/**
 * @ORM\ManyToOne(targetEntity="Post", inversedBy="translations")
 */
protected $translatable;

/**
 * @ORM\Column(type="string")
 * 
 * @Groups({"post_read", "post_write", "translations"})
 */
private $title;

/**
 * @ORM\Column(type="string")
 *
 * @Groups({"post_write", "translations"})
 */
protected $locale;

public function setTitle(string $title): void
{
    $this->title = $title;
}

public function getTitle(): ?string
{
    return $this->title;
}

}



**Api resource**
- Add `translation.groups` filter if you would like to have option to return all translation objects in response.
If you don't use `translations` group, response will return only requested locale translation or fallback locale translation.
- Add translations to normalization_context for PUT and POST methods to make sure 
they return all translation objects.
- Example:

AppBundle\Entity\Post:

itemOperations:
    get:
        method: GET
    put:
        method: PUT
        normalization_context:
            groups: ['translations']
collectionOperations:
    get:
        method: GET
    post:
        method: POST
        normalization_context:
            groups: ['translations']
attributes:
    filters: ['translation.groups']
    normalization_context:
        groups: ['post_read']
    denormalization_context:
        groups: ['post_write']

Usage:
------

**Language param for displaying single translation:** 

`?locale=de`

**Or use Accept-Language http header**

`Accept-Language: de`

**Serialization group for displaying all translations:** 

`?groups[]=translations`

**POST translations example**

{

"datetime":"2017-10-10",
"translations": { 
    "en":{
        "title":"test",
        "content":"test",
        "locale":"en"
    },
    "de":{
        "title":"test de",
        "content":"test de",
        "locale":"de"
    }
}

}


**EDIT translations example**

{

"datetime": "2017-10-10T00:00:00+02:00",
"translations": {
    "de": {
      "id": 3,
      "title": "test edit de",
      "content": "test edit de",
      "locale": "de"
    },
    "en": {
      "id": 2,
      "title": "test edit",
      "content": "test edit",
      "locale": "en"
    }
}

}