Добавление поддержки пользовательского формата

Добавление поддержки пользовательского формата

Иногда вам нужно столкнуться с пользовательскими форматами для файлов переводов. Компонент Translation достаточно гибок для поддержки этого. Просто создайте загрузчик (для загрузки переводов) и, опционально, дампер (для сброса переводов).

Представьте, что у вас есть пользовательский формат, где сообщения переводов определяются с использованием одной строчки для каждого перевода и круглых скобок вокруг ключа и сообщения. Файл перевода будет выглядеть так:

1
2
3
(welcome)(accueil)
(goodbye)(au revoir)
(hello)(bonjour)

Создание пользовательского загрузчика

Для того, чтобы определить пользовательский загрузчик, способный читать такой тип файлов, вам нужно создать новый класс, реализующий LoaderInterface. Метод load() будет получать имя файла и анализировать его в массиве. Потом, он будет создавать каталог, который будет возвращён:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
use Symfony\Component\Translation\MessageCatalogue;
use Symfony\Component\Translation\Loader\LoaderInterface;

class MyFormatLoader implements LoaderInterface
{
    public function load($resource, $locale, $domain = 'messages')
    {
        $messages = array();
        $lines = file($resource);

        foreach ($lines as $line) {
            if (preg_match('/\(([^\)]+)\)\(([^\)]+)\)/', $line, $matches)) {
                $messages[$matches[1]] = $matches[2];
            }
        }

        $messageCatalogue = new MessageCatalogue($locale);
        $messageCatalogue->add($messages, $domain);

        return $messageCatalogue;
    }

}

После создания, он может быть использован как любой другой загрузчик:

1
2
3
4
5
6
7
8
use Symfony\Component\Translation\Translator;

$translator = new Translator('fr_FR');
$translator->addLoader('my_format', new MyFormatLoader());

$translator->addResource('my_format', __DIR__.'/translations/messages.txt', 'fr_FR');

var_dump($translator->trans('welcome'));

Будет выводиться "accueil".

Создание пользовательского дампера

Так же возможно создать пользовательский дампер для вашего формата, что полезно при использовании команд извлечения. Чтобы сделать это, необходимо создать новый класс, реализующий DumperInterface. Чтобы записать содержание сброса в файл, можно расширить класс FileDumper, что сэкономит вам несколько строчек:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
use Symfony\Component\Translation\MessageCatalogue;
use Symfony\Component\Translation\Dumper\FileDumper;

class MyFormatDumper extends FileDumper
{
    public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
    {
        $output = '';

        foreach ($messages->all($domain) as $source => $target) {
            $output .= sprintf("(%s)(%s)\n", $source, $target);
        }

        return $output;
    }

    protected function getExtension()
    {
        return 'txt';
    }
}

В некоторых случаях вам может захотеться отправить содержание сброса в качестве ответа, вместо того, чтобы записывать его в файлы. Чтобы сделать это, вы можtnt использовать метод formatCatalogue. В этом случае вам нужно передать аргумент домена, который определяет список сообщений, которые необходимо сбросить.

The formatCatalogue() method creates the output string, that will be used by the dump() method of the FileDumper class to create the file. The dumper can be used like any other built-in dumper. In the following example, the translation messages defined in the YAML file are dumped into a text file with the custom format:

1
2
3
4
5
6
7
use Symfony\Component\Translation\Loader\YamlFileLoader;

$loader = new YamlFileLoader();
$translations = $loader->load(__DIR__ . '/translations/messages.fr_FR.yaml' , 'fr_FR');

$dumper = new MyFormatDumper();
$dumper->dump($translations, array('path' => __DIR__.'/dumps'));