Как найти отсутствующие или неиспользованные сообщения перевода

При поддержке приложения или пакета, вы можете добавлять или удалять сообщения перевода и забыть обновить каталоги сообщений. Команда debug:translation помогает вам найти эти отсутствующие или неиспользованные сообщения перевода.

Благодаря экстракторам сообщений, команда определит тег перевода или отфильтрует использование в шаблонах Twig:

1
2
3
4
5
6
7
{% trans %}Symfony is great{% endtrans %}

{{ 'Symfony is great'|trans }}

{{ 'Symfony is great'|transchoice(1) }}

{% transchoice 1 %}Symfony is great{% endtranschoice %}

Она также определит следующие использования переводчика в шаблонах PHP:

1
2
3
$view['translator']->trans("Symfony is great");

$view['translator']->transChoice('Symfony is great', 1);

Caution

Экстракторы неспособны инспектировать сообщения, переведенные вне шаблонов, что означает, что использование переводчика в ярлыках форм или внутри ваших контроллеров не будет обнаружено. Динамические переводы, включающие в себя переменныили выражения, не определяются в шаблонах, что означает, что этот пример не будет проанализирован:

1
2
{% set message = 'Symfony is great' %}
{{ message|trans }}

Предположим, что ваше приложение по умолчанию имеет локаль fr и вы сконфигурировали локаль en в качестве локали отката (см. Installation и Fallback Translation Locales для того, чтобы узнать, как их конфигурировать). И представьте, что вы уже установили некоторые переводы для локали fr внутри пакета AcmeDemoBundle:

  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <!-- src/Acme/AcmeDemoBundle/Resources/translations/messages.fr.xliff -->
    <?xml version="1.0"?>
    <xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
        <file source-language="en" datatype="plaintext" original="file.ext">
            <body>
                <trans-unit id="1">
                    <source>Symfony is great</source>
                    <target>J'aime Symfony</target>
                </trans-unit>
            </body>
        </file>
    </xliff>
    
  • YAML
    1
    2
    # src/Acme/AcmeDemoBundle/Resources/translations/messages.fr.yml
    Symfony is great: J'aime Symfony
    
  • PHP
    1
    2
    3
    4
    // src/Acme/AcmeDemoBundle/Resources/translations/messages.fr.php
    return array(
        'Symfony is great' => 'J\'aime Symfony',
    );
    

и для локали en:

  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <!-- src/Acme/AcmeDemoBundle/Resources/translations/messages.en.xliff -->
    <?xml version="1.0"?>
    <xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
        <file source-language="en" datatype="plaintext" original="file.ext">
            <body>
                <trans-unit id="1">
                    <source>Symfony is great</source>
                    <target>Symfony is great</target>
                </trans-unit>
            </body>
        </file>
    </xliff>
    
  • YAML
    1
    2
    # src/Acme/AcmeDemoBundle/Resources/translations/messages.en.yml
    Symfony is great: Symfony is great
    
  • PHP
    1
    2
    3
    4
    // src/Acme/AcmeDemoBundle/Resources/translations/messages.en.php
    return array(
        'Symfony is great' => 'Symfony is great',
    );
    

Чтобы исследовать все сообщения в локали fr для пакета AcmeDemoBundle, выполните:

1
$ php bin/console debug:translation fr AcmeDemoBundle

Вы получите такой результат:

_images/translation/debug_1.png

Он покажет вам таблицу с результатом при переводе сообщени в локали fr и результат при использовании локали отката en. Он также покажет случаи, когда перевод будет таким же, как перевод отката (это может сигнализировать о том, что сообщение было переведено неправильно). Более того, это сигнализирует о том, что сообщение Symfony is great не используется, так как оно переведено, но вы его еще нигде не использовали.

Теперь, если вы переведёте сообщение в одном из ваших шаблонов, вы получите такой результат:

_images/translation/debug_2.png

Состояние пустое, что означает, что сообщение переведено в локали fr и используется в одном или нескольких шаблонах.

Если вы удалите сообщение Symfony is great из вашего файла перевода для локали fr и выполните команду, вы получите следующее:

_images/translation/debug_3.png

Состояние обозначает, что сообщение отсутствует, так как оно не переведено в локали fr, но всё ещё используется в шаблоне. Более того, сообщение в локали fr приравнивается к сообщению в локали en. Это особенный случай, так как непереведенный id сообщения приравнивается к его переводу в локали en.

Если вы скопируете содержимое файла перевода в локали en в файл перевода в локали fr и выполните команду, то вы получите следующее:

_images/translation/debug_4.png

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

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

1
$ php bin/console debug:translation en AcmeDemoBundle --domain=messages

Когда пакеты содержат много сообщений, удобно отображать только неиспользованные или только отсутствующие сообщения, используя переключатели --only-unused или --only-missing:

1
2
$ php bin/console debug:translation en AcmeDemoBundle --only-unused
$ php bin/console debug:translation en AcmeDemoBundle --only-missing

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.