How to Translate the Backend ============================ EasyAdmin leverages the Symfony Translation component to provide built-in support for translating backends into any language. The translation process is divided into two steps: * Translating the elements of the EasyAdmin interface; * Translating your own contents (such as the main menu and the property labels). The elements of the interface are translated under the ``EasyAdminBundle`` translation domain. The rest of the elements are translated by default using the ``messages`` domain, but you can use any other domain with the ``translation_domain`` option, as explained at the end of this article. Before translating your backend, make sure that the ``translator`` service is enabled in the application (projects based on the Symfony Standard Edition have it disabled by default): .. code-block:: yaml # app/config/config.yml framework: translator: { fallbacks: [ "en" ] } Translate the Backend Interface ------------------------------- The backend interface uses the same language as the underlying Symfony application. If you want to change it, update the value of the ``locale`` option in the ``app/config/parameters.yml`` file. EasyAdmin is already translated into tens of languages thanks to the generosity of its community. We're actively looking for more translations, so please consider contributing a translation for your own language. .. note:: Although it's not recommended to do it, if you want to change any of the built-in translations defined under the ``EasyAdminBundle`` domain, use the `translation override mechanism`_ provided by Symfony. Translate the Main Menu Labels ------------------------------ Menu items use the **entity name** as their label. The entity name is the YAML key used to define the configuration of each entity. For example, the following configuration would show two menu items called ``Customers`` and ``Orders``: .. code-block:: yaml # app/config/config.yml easy_admin: entities: Customers: class: AppBundle\Entity\User Orders: class: AppBundle\Entity\Purchase The ``messages.xx.yml`` (or ``messages.xx.xlf``) file for the previous example would need to use ``Customers`` and ``Orders`` as the keys of the translations. Example: .. code-block:: yaml # app/Resources/translations/messages.es.yml Customers: Clientes Orders: Ventas # ... Main menu labels can be customized thanks to the ``label`` option of each entity. You can even use structured translation keys instead of the real contents: .. code-block:: yaml # app/config/config.yml easy_admin: entities: Customers: label: menu.customers class: AppBundle\Entity\User Orders: label: menu.orders class: AppBundle\Entity\Purchase In this case, the translation file should use the value of the ``label`` option as the keys of the translations (and you should also create the file for the original language used by the translation keys): .. code-block:: yaml # app/Resources/translations/messages.en.yml menu.customers: Customers menu.orders: Orders # ... # app/Resources/translations/messages.es.yml menu.customers: Clientes menu.orders: Ventas # ... Translate Property Labels ------------------------- The behavior of the property labels is very similar to the one explained in the previous section for the main menu. By default, the label of each property is the "humanized" version of its name: ================= ====================== Property value Default property label ================= ====================== ``propertyname`` ``Propertyname`` ``propertyName`` ``Property name`` ``property_name`` ``Property name`` ================= ====================== Consider the following configuration: .. code-block:: yaml # app/config/config.yml easy_admin: entities: Customer: class: AppBundle\Entity\Customer list: fields: ['firstName', 'lastName'] # ... The backend will display ``First name`` and ``Last name`` as the labels of the properties, so those are the translation keys that must be used: .. code-block:: yaml # app/Resources/translations/messages.es.yml First name: Nombre Last name: Apellidos # ... Alternatively, you can use the ``label`` option of each property to define its label explicitly. You can even use structured translation keys instead of the real contents: .. code-block:: yaml # app/config/config.yml easy_admin: entities: Customer: class: AppBundle\Entity\Customer list: fields: - { property: 'firstName', label: 'users.firstName' } - { property: 'lastName', label: 'users.lastName' } # ... In this case, the translation file should use the value of the ``label`` option as the keys of the translations (and you should also create the file for the original language used by the translation keys): .. code-block:: yaml # app/Resources/translations/messages.en.yml users.firstName: First name users.lastName: Last name # ... # app/Resources/translations/messages.es.yml users.firstName: Nombre users.lastName: Apellidos # ... Translate Action Names ---------------------- The action labels are translated using the ``messages`` domain, even for the built-in actions provided by EasyAdmin (Save, Edit, Delete, etc.) This is done on purpose so you can override them more easily just by adding them to your main translation file: .. code-block:: yaml # app/Resources/translations/messages.en.yml action.save: Save Now action.new: Create # ... # app/Resources/translations/messages.es.yml action.save: Guardar Ahora action.new: Crear # ... Translate Custom Templates -------------------------- All the built-in templates include the following tag to set ``EasyAdminBundle`` as the default domain used to translate the contents of that template: .. code-block:: twig {% trans_default_domain "EasyAdminBundle" %} When overriding templates in any of your views or properties, make sure to add this tag at the top of each file to not break the backend internationalization. If needed, you can also define any other translation domain and skip the default one in your templates: .. code-block:: twig {{ 'content_to_translate' | trans({}, 'MyCustomTranslationDomain') }} The above template uses the translations defined in the ``app/Resources/translations/MyCustomTranslationDomain.en.xlf`` file (replace ``en`` by your locale and ``xlf`` by the desired translation format) instead of the default EasyAdmin translations. Using a custom translation domain --------------------------------- By default EasyAdmin uses the ``messages`` domain to translate the contents of your backend. Define the global ``translation_domain`` option to use your own custom domain: .. code-block:: yaml # app/config/config.yml easy_admin: translation_domain: 'admin' entities: Customers: # ... Orders: # ... This translation domain is applied to all entities, but it can be overridden locally by each entity: .. code-block:: yaml # app/config/config.yml easy_admin: translation_domain: 'admin' entities: Customers: # ... Orders: translation_domain: 'messages' # ... In the above example, the contents of the ``Customers`` entity are translated with the ``admin`` domain whereas the contents of the ``Orders`` entity are translated with the ``messages`` domain. .. tip:: Use ``false`` as the value of the ``translation_domain`` option to disable the translations of a specific entity or the entire backend. .. _`translation override mechanism`: https://symfony.com/doc/current/cookbook/bundles/override.html#translations