@@ -48,24 +48,36 @@ to learn even more. Overall, the process has several steps:
4848
4949.. _translation-configuration :
5050
51+ Installation
52+ ------------
53+
54+ First, run this command to install the translator before using it:
55+
56+ ..code-block ::terminal
57+
58+ $ composer require translator
59+
5160 Configuration
5261-------------
5362
54- Translations are handled by a `` translator `` service that uses the user's
55- localeto lookup andreturn translated messages. Before using it, enable the
56- `` translator `` in your configuration :
63+ The previous command creates an initial config file where you can define the
64+ default localeof the app andthe :ref: ` fallback locales < translation-fallback >`
65+ that will be used if Symfony can't find some translation :
5766
5867..configuration-block ::
5968
6069 ..code-block ::yaml
6170
62- # app/ config/config.yml
71+ # config/packages/translation.yaml
6372framework :
64- translator :{ fallbacks: [en] }
73+ default_locale :' en'
74+ translator :
75+ fallbacks :['en']
76+ # ...
6577
6678 ..code-block ::xml
6779
68- <!-- app/ config/config .xml-->
80+ <!-- config/packages/translation .xml-->
6981 <?xml version =" 1.0" encoding =" UTF-8" ?>
7082 <container xmlns =" http://symfony.com/schema/dic/services"
7183xmlns : xsi =" http://www.w3.org/2001/XMLSchema-instance"
@@ -75,23 +87,23 @@ locale to lookup and return translated messages. Before using it, enable the
7587 http://symfony.com/schema/dic/symfony
7688 http://symfony.com/schema/dic/symfony/symfony-1.0.xsd" >
7789
78- <framework : config >
90+ <framework : config default-locale = " en " >
7991 <framework : translator >
8092 <framework : fallback >en</framework : fallback >
93+ <!-- ...-->
8194 </framework : translator >
8295 </framework : config >
8396 </container >
8497
8598 ..code-block ::php
8699
87- //app/ config/config .php
100+ // config/packages/translation .php
88101 $container->loadFromExtension('framework', array(
102+ 'default_locale' => 'en',
89103 'translator' => array('fallbacks' => array('en')),
104+ // ...
90105 ));
91106
92- See:ref: `translation-fallback ` for details on the ``fallbacks `` key
93- and what Symfony does when it doesn't find a translation.
94-
95107 The locale used in translations is the one stored on the request. This is
96108typically set via a ``_locale `` attribute on your routes (see:ref: `translation-locale-url `).
97109
@@ -108,10 +120,11 @@ for example, that you're translating a simple message from inside a controller::
108120
109121 // ...
110122 use Symfony\Component\HttpFoundation\Response;
123+ use Symfony\Component\Translation\Translator;
111124
112- public functionindexAction( )
125+ public functionindex(Translator $translator )
113126 {
114- $translated = $this->get(' translator') ->trans('Symfony is great');
127+ $translated = $translator->trans('Symfony is great');
115128
116129 return new Response($translated);
117130 }
@@ -129,7 +142,7 @@ different formats, XLIFF being the recommended format:
129142
130143 ..code-block ::xml
131144
132- <!-- messages.fr.xlf-->
145+ <!-- translations/ messages.fr.xlf-->
133146 <?xml version =" 1.0" ?>
134147 <xliff version =" 1.2" xmlns =" urn:oasis:names:tc:xliff:document:1.2" >
135148 <file source-language =" en" datatype =" plaintext" original =" file.ext" >
@@ -144,12 +157,12 @@ different formats, XLIFF being the recommended format:
144157
145158 ..code-block ::yaml
146159
147- # messages.fr.yml
160+ # translations/ messages.fr.yml
148161Symfony is great :J'aime Symfony
149162
150163 ..code-block ::php
151164
152- // messages.fr.php
165+ //translations/ messages.fr.php
153166 return array(
154167 'Symfony is great' => 'J\'aime Symfony',
155168 );
@@ -186,10 +199,11 @@ Message Placeholders
186199Sometimes, a message containing a variable needs to be translated::
187200
188201 use Symfony\Component\HttpFoundation\Response;
202+ use Symfony\Component\Translation\Translator;
189203
190- public functionindexAction( $name)
204+ public functionindex(Translator $translator, $name)
191205 {
192- $translated = $this->get(' translator') ->trans('Hello '.$name);
206+ $translated = $translator->trans('Hello '.$name);
193207
194208 return new Response($translated);
195209 }
@@ -336,14 +350,14 @@ Translation Resource/File Names and Locations
336350
337351Symfony looks for message files (i.e. translations) in the following default locations:
338352
339- * the ``app/Resources/ translations `` directory;
353+ * the ``translations/ `` directory;
340354
341- * the ``app /Resources/<bundle name>/translations `` directory;
355+ * the ``src /Resources/<bundle name>/translations/ `` directory;
342356
343357* the ``Resources/translations/ `` directory inside of any bundle.
344358
345359The locations are listed here with the highest priority first. That is, you can
346- override the translation messages of a bundle in any of the top2 directories.
360+ override the translation messages of a bundle in any of the toptwo directories.
347361
348362The override mechanism works at a key level: only the overridden keys need
349363to be listed in a higher priority message file. When a key is not found
@@ -359,14 +373,14 @@ must be named according to the following path: ``domain.locale.loader``:
359373* **locale **: The locale that the translations are for (e.g. ``en_GB ``, ``en ``, etc);
360374
361375* **loader **: How Symfony should load and parse the file (e.g. ``xlf ``,
362- ``php ``, ``yml ``, etc).
376+ ``php ``, ``yaml ``, etc).
363377
364378The loader can be the name of any registered loader. By default, Symfony
365379provides many loaders, including:
366380
367381* ``xlf ``: XLIFF file;
368382* ``php ``: PHP file;
369- * ``yml ``: YAML file.
383+ * ``yaml ``: YAML file.
370384
371385The choice of which loader to use is entirely up to you and is a matter of
372386taste. The recommended option is to use ``xlf `` for translations.
@@ -381,15 +395,15 @@ For more options, see :ref:`component-translator-message-catalogs`.
381395
382396 ..code-block ::yaml
383397
384- # app/ config/config.yml
398+ # config/packages/translation.yaml
385399framework :
386400translator :
387401paths :
388- -' %kernel.project_dir%/translations'
402+ -' %kernel.project_dir%/custom/path/to/ translations'
389403
390404 ..code-block ::xml
391405
392- <!-- app/ config/config .xml-->
406+ <!-- config/packages/translation .xml-->
393407 <?xml version =" 1.0" encoding =" UTF-8" ?>
394408 <container xmlns =" http://symfony.com/schema/dic/services"
395409xmlns : framework =" http://symfony.com/schema/dic/symfony"
@@ -402,18 +416,18 @@ For more options, see :ref:`component-translator-message-catalogs`.
402416
403417 <framework : config >
404418 <framework : translator >
405- <framework : path >%kernel.project_dir%/translations</framework : path >
419+ <framework : path >%kernel.project_dir%/custom/path/to/ translations</framework : path >
406420 </framework : translator >
407421 </framework : config >
408422 </container >
409423
410424 ..code-block ::php
411425
412- //app/ config/config .php
426+ // config/packages/translation .php
413427 $container->loadFromExtension('framework', array(
414428 'translator' => array(
415429 'paths' => array(
416- '%kernel.project_dir%/translations',
430+ '%kernel.project_dir%/custom/path/to/ translations',
417431 ),
418432 ),
419433 ));
@@ -455,7 +469,7 @@ checks translation resources for several locales:
455469
456470..note ::
457471
458- When Symfonydoesn 't find a translation in the given locale, it will
472+ When Symfonycan 't find a translation in the given locale, it will
459473 add the missing translation to the log file. For details,
460474 see:ref: `reference-framework-translator-logging `.
461475
@@ -504,9 +518,10 @@ Learn more
504518
505519..toctree ::
506520:maxdepth: 1
507- :glob:
508521
509- /translation/*
522+ translation/locale
523+ translation/debug
524+ translation/lint
510525
511526.. _`i18n` :https://en.wikipedia.org/wiki/Internationalization_and_localization
512527.. _`ISO 3166-1 alpha-2` :https://en.wikipedia.org/wiki/ISO_3166-1#Current_codes