# Create custom Symfony translation extractor


Licensed under Creative Commons.

## Overview

The Symfony [translation component](https://github.com/symfony/translation) allows you to extract translations from your PHP codebase & Twig templates into the translation file format of your liking, for example .po files.

The [documentation](https://symfony.com/doc/current/translation.html#extracting-translation-contents-and-updating-catalogs-automatically) describes it like this:
> The most time-consuming tasks when translating an application is to extract all the template contents to be translated and to keep all the translation files in sync. Symfony includes a command called `translation:update` that helps you with these tasks.

But what if not all my translations are hardcoded in code or templates, and some - or all - are dynamic? For example loaded from an external data source, like a REST API.

## Create translation extractor

You can add your own translation extractor. Which will be run when executing the Symfony consoles’ `translation:update` command. In addition to the extractors that are already included.

Create a class that implements the [ExtractorInterface](https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Translation/Extractor/ExtractorInterface.php):

```
<?php

declare(strict_types=1);

namespace App\Translation;

use Symfony\Component\Translation\Extractor\ExtractorInterface;
use Symfony\Component\Translation\MessageCatalogue;

*/**
 * Extracts custom translation strings.
 *
 * **@package ***App*\Translation
 */
*class TranslationsExtractor implements ExtractorInterface {

  */**
   * Prefix for new found message.
   *
   * **@var **string
   */
  *private $prefix = '';

  */**
   * Returns the translation messages.
   *
   * **@return **string[]
   *   All messages.
   */
  *protected function getMessages(): array {
    $messages = [];

    // *TODO: Get all your translation strings here.
    *return $messages;
  }

  */**
   * Extracts translation messages to the catalogue.
   *
   * **@param **string|array $resource
   *   Files, a file or a directory.
   * **@param **\Symfony\Component\Translation\MessageCatalogue $catalogue
   *   The message catalogue.
   */
  *public function extract($resource, MessageCatalogue $catalogue) {
    foreach ($this->getMessages() as $message) {
      $catalogue->set($message, $this->prefix . $message);
    }
  }

  */**
   * {**@inheritdoc**}
   */
  *public function setPrefix(string $prefix) {
    $this->prefix = $prefix;
  }

}
```


Tag it with **name**=**translation.extractor** & an **alias**.

```
# config/services.yml
services:
  translation.translations_extractor:
    class: App\Translation\TranslationsExtractor
    tags:
      - { name: translation.extractor, alias: custom }
```


*This was written using Symfony version 5.1.6.*
