Как найти отсутствующие или неиспользованные сообщения перевода¶
При поддержке приложения или пакета, вы можете добавлять или удалять сообщения
перевода и забыть обновить каталоги сообщений. Команда 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
в качестве локали отката (см. Configuration и
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
|
Вы получите такой результат:

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

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

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

Вы можете увидеть, что переводы сообщения идентичны в локалях 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.