-
-
Notifications
You must be signed in to change notification settings - Fork 5.2k
Added documentation for translation:debug #3629
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
2d9647b
864b9f2
38b2955
b6ac454
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -649,6 +649,172 @@ The translation of database content should be handled by Doctrine through | |
the `Translatable Extension`_ or the `Translatable Bahavior`_ (PHP 5.4+). | ||
For more information, see the documentation for thes libraries. | ||
|
||
Debugging Translations | ||
---------------------- | ||
|
||
.. versionadded:: 2.5 | ||
The ``translation:debug`` command was introduced in Symfony 2.5. | ||
|
||
When maintaining a bundle, you may use or remove the usage of a translation | ||
message without updating all message catalogues. The ``translation:debug`` | ||
command helps you to find these missing or unused translation messages for a | ||
given locale. It shows you a table with the result when translating the | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @florianv I really like this feature! To make it easier to understand (and use), I think we should show the first usage (so, the code-block you have below) right after "... given locale" AND I think we should include some sample output of what it might look like. Then, we can continue the descriptions you have here, but actually point out what we mean by referencing the sample output. What do you think? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks @weaverryan |
||
message in the given locale and the result when the fallback would be used. | ||
On top of that, it also shows you when the translation is the same as the | ||
fallback translation (this could indicate that the message was not correctly | ||
translated). | ||
|
||
Thanks to the messages extractors, the command will detect the translation | ||
tag or filter usages in Twig templates: | ||
|
||
.. code-block:: jinja | ||
|
||
{% trans %}Symfony2 is great{% endtrans %} | ||
|
||
{{ 'Symfony2 is great'|trans }} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would add an example using |
||
|
||
{{ 'Symfony2 is great'|transchoice(1) }} | ||
|
||
{% transchoice 1 %}Symfony2 is great{% endtranschoice %} | ||
|
||
It will also detect the following translator usages in PHP templates: | ||
|
||
.. code-block:: php | ||
|
||
$view['translator']->trans("Symfony2 is great"); | ||
|
||
$view['translator']->trans('Symfony2 is great'); | ||
|
||
.. caution:: | ||
|
||
The extractors are not able to inspect the messages translated outside templates which means | ||
that translator usages in form labels or inside your controllers won't be detected. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. the extractor is not able to extract template translations involving a variable either like this: {% set message = 'Symfony2 is great' %}
{{ message|trans }} |
||
Dynamic translations involving variables or expressions are not detected in templates, | ||
which means this example won't be analyzed: | ||
|
||
.. code-block:: jinja | ||
{% set message = 'Symfony2 is great' %} | ||
{{ message|trans }} | ||
|
||
Suppose your application's default_locale is ``fr`` and you have configured ``en`` as the fallback locale | ||
(see :ref:`book-translation-configuration` and :ref:`book-translation-fallback` for how to configure these). | ||
And suppose you've already setup some translations for the ``fr`` locale inside an AcmeDemoBundle: | ||
|
||
.. configuration-block:: | ||
|
||
.. code-block:: xml | ||
|
||
<!-- 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>Symfony2 is great</source> | ||
<target>J'aime Symfony2</target> | ||
</trans-unit> | ||
</body> | ||
</file> | ||
</xliff> | ||
|
||
.. code-block:: php | ||
|
||
// src/Acme/AcmeDemoBundle/Resources/translations/messages.fr.php | ||
return array( | ||
'Symfony2 is great' => 'J\'aime Symfony2', | ||
); | ||
|
||
.. code-block:: yaml | ||
|
||
# src/Acme/AcmeDemoBundle/Resources/translations/messages.fr.yml | ||
Symfony2 is great: J'aime Symfony2 | ||
|
||
and for the ``en`` locale: | ||
|
||
.. configuration-block:: | ||
|
||
.. code-block:: xml | ||
|
||
<!-- 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>Symfony2 is great</source> | ||
<target>Symfony2 is great</target> | ||
</trans-unit> | ||
</body> | ||
</file> | ||
</xliff> | ||
|
||
.. code-block:: php | ||
|
||
// src/Acme/AcmeDemoBundle/Resources/translations/messages.en.php | ||
return array( | ||
'Symfony2 is great' => 'Symfony2 is great', | ||
); | ||
|
||
.. code-block:: yaml | ||
|
||
# src/Acme/AcmeDemoBundle/Resources/translations/messages.en.yml | ||
Symfony2 is great: Symfony2 is great | ||
|
||
To inspect all messages in the ``fr`` locale for the AcmeDemoBundle, run: | ||
|
||
.. code-block:: bash | ||
|
||
$ php app/console translation:debug fr AcmeDemoBundle | ||
|
||
You will get this output: | ||
|
||
.. image:: /images/book/translation/debug_1.png | ||
:align: center | ||
|
||
It indicates that the message ``Symfony2 is great`` is unused because it is translated, | ||
but you haven't used it anywhere yet. | ||
|
||
Now, if you translate the message in one of your templates, you will get this output: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The extractors will detect only the usages in the templates, I think it deserves a warning as @stof mentionned. |
||
|
||
.. image:: /images/book/translation/debug_2.png | ||
:align: center | ||
|
||
The state is empty which means the message is translated in the ``fr`` locale and used in one or more templates. | ||
|
||
If you delete the message ``Symfony2 is great`` from your translation file for the ``fr`` locale | ||
and run the command, you will get: | ||
|
||
.. image:: /images/book/translation/debug_3.png | ||
:align: center | ||
|
||
The state indicates the message is missing because it is not translated in the ``fr`` locale | ||
but it is still used in the template. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. we can add a little emphasis :)
|
||
Moreover, the message in the ``fr`` locale equals to the message in the ``en`` locale. | ||
This is a special case because the untranslated message id equals its translation in the ``en`` locale. | ||
|
||
If you copy the content of the translation file in the ``en`` locale, to the translation file | ||
in the ``fr`` locale and run the command, you will get: | ||
|
||
.. image:: /images/book/translation/debug_4.png | ||
:align: center | ||
|
||
You can see that the translations of the message are identical in the ``fr`` and ``en`` locales | ||
which means this message was probably copied from French to English and maybe you forgot to translate it. | ||
|
||
By default all domains are inspected, but it is possible to specify a single domain: | ||
|
||
.. code-block:: bash | ||
|
||
$ php app/console translation:debug en AcmeDemoBundle --domain=messages | ||
|
||
When bundles have a lot of messages, it is useful to display only the unused | ||
or only the missing messages, by using the ``--only-unused`` or ``--only-missing`` switches: | ||
|
||
.. code-block:: bash | ||
|
||
$ php app/console translation:debug en AcmeDemoBundle --only-unused | ||
$ php app/console translation:debug en AcmeDemoBundle --only-missing | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would combine these 2 examples: You can also display only the unused or only the missing messages, by using
the ``--only-unused`` or ``--only-missing`` switches:
.. code-block:: bash
$ php app/console translation:debug en AcmeDemoBundle --only-unused
$ php app/consoel translation:debug en AcmeDemoBundle --only-missing |
||
|
||
Summary | ||
------- | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
add a versionadded directive: