Login to bookmark this video
Buy Access to Course
09.

`translation:extract` Comando

|

Share this awesome video!

|

Keep on Learning!

With a Subscription, click any sentence in the script to jump to that part of the video!

Login Subscribe

Hasta ahora, hemos estado creando claves de traducción y añadiéndolas manualmente, junto con sus valores, a messages.en.yaml. ¿Pero sabías que existe un método alternativo que automatiza parte de este proceso?

Vamos a traducir los dos elementos de menú que nos quedan: "Tiempo" y "Diario".

Abre templates/base.html.twig y busca el texto de estos elementos de menú. Sigue nuestra rutina habitual de buscar una clave y utilizar el filtro trans. {{ 'base.weather'|trans }} y {{ 'base.journal'|trans }}:

88 lines | templates/base.html.twig
// ... line 1
<html lang="{{ app.locale }}">
// ... lines 3 - 17
<body class="bg-[url('../images/bg-planet.png')] bg-contain bg-no-repeat">
<nav class="flex items-center justify-between flex-wrap py-6 mx-auto px-4">
<div class="flex items-end flex-shrink-0 mr-6 text-white">
// ... lines 21 - 24
<a href="#" class="hidden ml-4 mt-4 lg:inline-block lg:mt-0 hover:text-[#5BA8DC] mr-4">{{ 'base.weather'|trans }}</a>
<a href="#" class="hidden ml-4 mt-4 lg:inline-block lg:mt-0 hover:text-[#5BA8DC] mr-4">{{ 'base.journal'|trans }}</a>
</div>
// ... lines 28 - 76
</nav>
// ... lines 78 - 85
</body>
</html>

Bien, en lugar de añadir manualmente estas entradas a nuestro archivo messages.en.yaml, dirígete a tu terminal y ejecuta:

symfony console translation:extract en --dump-messages

Este comando es similar a debug:translation en el sentido de que escanea tu código y encuentra claves de traducción. Estas claves en verde son las nuevas que hemos añadido y aún no tienen entradas en nuestro archivo messages.en.yaml.

Añadir nuevas claves al archivo YAML

Podemos utilizar el comando para añadir automáticamente estas nuevas claves a nuestro archivo YAML. Ejecuta de nuevo el comando, pero sustituye --dump-messages por --force. A continuación, añade --format=yaml para que escriba como YAML, y --as-tree=3 para mantener las claves sangradas a tres niveles de profundidad en el archivo YAML.

symfony console translation:extract en --force --format=yaml --as-tree=3

¡Vuelve a messages.en.yaml y compruébalo! ¡Aquí están nuestras nuevas claves!

9 lines | translations/messages.en.yaml
base:
// ... lines 2 - 3
weather: __base.weather
journal: __base.journal
// ... lines 6 - 9

Los valores son los nombres de las claves prefijados con __ (dos guiones bajos). Esto puede ayudarte a encontrarlas rápidamente si hay muchas. Este prefijo puede personalizarse si lo deseas.

Sustitúyelos por el texto adecuado: "Tiempo" y "Diario":

9 lines | translations/messages.en.yaml
base:
// ... lines 2 - 3
weather: Weather
journal: Journal
// ... lines 6 - 9

Actualiza tu aplicación y listo... no ha cambiado nada, ¡pero sabemos que funciona!

Si estás traduciendo en masa un sitio existente como nosotros, creo que este método puede ser más engorroso que nuestro proceso anterior. Lo que acaba ocurriendo es que, al añadir claves en masa en tu código, una vez que las extraes, ¡te olvidas del texto original!

Pero! este método funciona muy bien cuando desarrollas una nueva función. Puedes añadir las claves para el texto en tu código, y averiguar el texto real más tarde.

Convertir a diferentes formatos

Este comando tiene otra función genial, ¡quizás no intencionada!

Supongamos que tienes un servicio de traducción que te pide que envíes tu archivo de traducción en inglés, y ellos te lo devolverán en francés. Fácil, ¿verdad? Sólo tienes que enviarles messages.en.yaml. Pero... ¡no saben qué demonios es YAML! Quieren el archivo en un formato compatible con su software: XLIFF.

¡No te preocupes! ¡El comando translation:extract puede convertir a diferentes formatos!

Ejecuta esto:

symfony console translation:extract en --force --format=xliff

En nuestro directorio translations/, tenemos un nuevo archivo: messages.en.xliff. Ábrelo.

¡Uf! ¡Qué asco! ¡XML!

No te preocupes: ¡a los programas de traducción les encanta! Sólo tienes que enviarles este archivo y decirles que intercambien el texto de <target>, que es inglés, con las traducciones al francés.

Cuando te lo devuelvan, cámbiale el nombre a messages.fr.xliff y vuelve a colocarlo en el directorio translations/. Sólo tienes que cambiar el primer <target>para que diga "(Francés) Asteroides Locales":

31 lines | translations/messages.fr.xliff
// ... line 1
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="en" target-language="en" datatype="plaintext" original="file.ext">
// ... lines 4 - 6
<body>
<trans-unit id="SWPFW5B" resname="base.local_asteroids">
// ... line 9
<target>(French) Local Asteroids</target>
</trans-unit>
// ... lines 12 - 27
</body>
</file>
</xliff>

De vuelta en nuestra aplicación, cambia a la versión francesa de esta página y ¡bum! "(Francés) Asteroides Locales".

Vale, ya está bien de XML por hoy: borra messages.fr.xliff.

¿Y si no tienes un servicio de traducción al que puedas enviar estos archivos? No hay problema Hay soluciones basadas en la nube que pueden ayudarte, ¡y Symfony tiene integraciones para ellas! ¡Vamos a comprobarlo!