{"id":7928,"date":"2021-12-14T18:02:09","date_gmt":"2021-12-14T17:02:09","guid":{"rendered":"https:\/\/www.ibidemgroup.com\/edu\/?p=7928"},"modified":"2024-03-04T12:35:59","modified_gmt":"2024-03-04T11:35:59","slug":"traduccion-i18n-python","status":"publish","type":"post","link":"https:\/\/www.ibidemgroup.com\/edu\/traduccion-i18n-python\/","title":{"rendered":"Gu\u00eda completa de i18n en Python."},"content":{"rendered":"\n<p class=\"has-text-align-center has-vivid-cyan-blue-color has-text-color wp-block-paragraph\"><span style=\"color:#0693e3\" class=\"color\">Traducci\u00f3n de Ingl\u00e9s a Espa\u00f1ol realizada por Jose,\u00a0<\/span><a href=\"https:\/\/www.ibidemgroup.com\/traduccion\/ingles.php\"><span style=\"color:#0693e3\" class=\"color\">traductor profesional de Ingl\u00e9s<\/span><\/a><span style=\"color:#0693e3\" class=\"color\">\u00a0con m\u00e1s de 20 a\u00f1os de experiencia traduciendo textos de todo tipo para la\u00a0<a href=\"https:\/\/www.ibidemgroup.com\/\">agencia de traducci\u00f3n<\/a>\u00a0Ibidem Group.<\/span><br><a href=\"https:\/\/www.mattlayman.com\/\"><\/a><\/p>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\"><strong><span style=\"color:#0693e3\" class=\"color\">Texto original escrito por Matt Layman y publicado en<\/span><\/strong><span style=\"color:#0693e3\" class=\"color\"> <strong>su web mattlayman.com<\/strong><\/span><\/p>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">***<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00cdndice de\ncontenidos:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Marcar las cadenas de texto a traducir<\/li><li>Generar la lista maestra<\/li><li>Obtener traducciones<\/li><li>Empaquetarlo todo<\/li><li>Probar las traducciones<\/li><li>Dudas y preguntas<\/li><\/ul>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_89 counter-hierarchy ez-toc-counter ez-toc-light-blue ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\"><p class=\"ez-toc-title\" style=\"cursor:inherit\">INDICE<\/p>\n<\/div><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.ibidemgroup.com\/edu\/traduccion-i18n-python\/#Resumen\" >Resumen<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.ibidemgroup.com\/edu\/traduccion-i18n-python\/#Marcar_las_cadenas_de_texto_a_traducir\" >Marcar las cadenas de texto a traducir<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.ibidemgroup.com\/edu\/traduccion-i18n-python\/#%E2%80%A6_y_cadenas_de_formato\" >&#8230; y cadenas de formato<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.ibidemgroup.com\/edu\/traduccion-i18n-python\/#Generar_la_lista_maestra\" >Generar la lista maestra<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.ibidemgroup.com\/edu\/traduccion-i18n-python\/#Obtener_las_traducciones\" >Obtener las traducciones<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.ibidemgroup.com\/edu\/traduccion-i18n-python\/#Empaquetarlo_todo\" >Empaquetarlo todo<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.ibidemgroup.com\/edu\/traduccion-i18n-python\/#Probar_las_traducciones\" >Probar las traducciones<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.ibidemgroup.com\/edu\/traduccion-i18n-python\/#%C2%BFPreguntas\" >\u00bfPreguntas?<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Resumen\"><\/span><strong>Resumen<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para internacionalizar c\u00f3digo, primero hay que preparar las cadenas de texto a traducir. Todas las cadenas de texto deben ir acompa\u00f1adas de una llamada a una funci\u00f3n especial. Esta funci\u00f3n especial marca las cadenas como algo que necesita ser traducido. Una vez que todas las cadenas est\u00e1n marcadas, las herramientas de i18n pueden escanear el c\u00f3digo para hacer una lista maestra de todo lo que debe traducirse. A partir de esta lista maestra, los traductores pueden generar un listado de cadenas traducidas para cada idioma. Las cadenas traducidas se a\u00f1aden de nuevo al c\u00f3digo Python y todo queda agrupado en un bonito producto final que incluye todas las traducciones. \u00bfQuieres <a href=\"https:\/\/www.mattlayman.com\/blog\/2013\/test-your-packaging\/\">probarlo<\/a>?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Son muchas cosas, pero explicar\u00e9 cada parte del proceso en detalle y paso a paso. A efectos de esta gu\u00eda, todo mi c\u00f3digo de ejemplo se har\u00e1 referencia al paquete <span style=\"background-color:#eeeeee\" class=\"background-color\">handroll<\/span>. Si usas este c\u00f3digo Python, sustituye <span style=\"background-color:#eeeeee\" class=\"background-color\">handroll <\/span>por el nombre de tu paquete Python de nivel superior.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Marcar_las_cadenas_de_texto_a_traducir\"><\/span><strong>Marcar las cadenas de texto a traducir<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La funci\u00f3n especial que mencion\u00e9 en el resumen se parece a <span style=\"background-color:#eeeeee\" class=\"background-color\">_(&#8216;Hello World&#8217;)<\/span> . Esta funci\u00f3n proviene del m\u00f3dulo <span style=\"background-color:#eeeeee\" class=\"background-color\">gettext<\/span>. Python utiliza GNU gettext para hacer la traducci\u00f3n, as\u00ed que veamos el c\u00f3digo de handroll que crea la funci\u00f3n <span style=\"background-color:#eeeeee\" class=\"background-color\">_ <\/span>en <span style=\"background-color:#eeeeee\" class=\"background-color\">handroll\/i18n.py<\/span>.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">import gettext<br> import os<br><br> localedir = os.path.join(os.path.abspath(os.path.dirname(<strong>file<\/strong>)), 'locale')<br> translate = gettext.translation('handroll', localedir, fallback=True)<br> _ = translate.gettext<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Este peque\u00f1o trozo de c\u00f3digo crea un objeto de traducci\u00f3n utilizando un directorio de configuraci\u00f3n <span style=\"background-color:#eeeeee\" class=\"background-color\">regional <\/span>como fuente de las cadenas traducidas. Tu directorio <span style=\"background-color:#eeeeee\" class=\"background-color\">locale <\/span>no existe todav\u00eda, pero es donde tu aplicaci\u00f3n buscar\u00e1 las traducciones en tiempo de ejecuci\u00f3n. Desde el objeto de traducci\u00f3n, hice un alias <span style=\"background-color:#eeeeee\" class=\"background-color\">_ <\/span>para <span style=\"background-color:#eeeeee\" class=\"background-color\">translate.gettext<\/span>. Este gui\u00f3n bajo no es particularmente especial, sin embargo, es el nombre convencional de esta funci\u00f3n que es utilizado por la comunidad de Python.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Espero que haya suficiente aqu\u00ed para entender lo que suceder\u00e1 en tiempo de ejecuci\u00f3n. La idea importante es que <span style=\"background-color:#eeeeee\" class=\"background-color\">&#8216;Hello World&#8217;<\/span>  act\u00faa como una clave. Cuando el c\u00f3digo se ejecuta, esa \u00abclave\u00bb se utilizar\u00e1 para buscar en los datos de la configuraci\u00f3n regional una traducci\u00f3n que coincida. El valor de retorno de <span style=\"background-color:#eeeeee\" class=\"background-color\">_ <\/span>ser\u00e1 la cadena traducida o el original si falta la traducci\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E2%80%A6_y_cadenas_de_formato\"><\/span><strong>&#8230; y cadenas de formato<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Una peculiaridad que detectar\u00e1s r\u00e1pidamente si utilizas <span style=\"background-color:#eeeeee\" class=\"background-color\">formato <\/span>para tus cadenas, es d\u00f3nde cerrar los par\u00e9ntesis <span style=\"background-color:#eeeeee\" class=\"background-color\">_<\/span>. Aqu\u00ed hay un ejemplo para que quede claro.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">_('Close the underscore function first. A {number}').format(number=42)<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Generar_la_lista_maestra\"><\/span><strong>Generar la lista maestra<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Con todas las cadenas marcadas con <span style=\"background-color:#eeeeee\" class=\"background-color\">_()<\/span>, es el momento de extraerlas en una lista maestra. Gettext se refiere a esta lista maestra como el archivo <span style=\"background-color:#eeeeee\" class=\"background-color\">Portable Object Template<\/span> (<span style=\"background-color:#eeeeee\" class=\"background-color\">POT<\/span>). Para generar el archivo POT, recurr\u00ed a una herramienta llamada <a rel=\"noreferrer noopener\" href=\"http:\/\/babel.pocoo.org\/\" target=\"_blank\">Babel<\/a>. Babel est\u00e1 dise\u00f1ada para ayudar a los desarrolladores a manejar problemas de i18n. Es genial y tiene un mont\u00f3n de caracter\u00edsticas interesantes, pero para esta gu\u00eda, me centrar\u00e9 en su soporte de gettext.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Babel extiende un archivo <span style=\"background-color:#eeeeee\" class=\"background-color\">setup.py <\/span>con nuevos comandos. (El empaquetado de Python va m\u00e1s all\u00e1 del alcance de esta gu\u00eda, as\u00ed que si <span style=\"background-color:#eeeeee\" class=\"background-color\">setup.py<\/span> te es completamente ajeno, consulta <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.python.org\/2\/distutils\/introduction.html\" target=\"_blank\">Distribuir m\u00f3dulos de Python <\/a>para obtener m\u00e1s informaci\u00f3n) .<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para generar un archivo POT, ejecuta <span style=\"background-color:#eeeeee\" class=\"background-color\">python setup.py extract_messages<\/span>. Necesitar\u00e1s escribir algo as\u00ed como:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[extract_messages]<br> input_dirs = handroll<br> output_file = handroll\/locale\/handroll.pot<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Obtener_las_traducciones\"><\/span><strong>Obtener las traducciones<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ahora que has generado un archivo POT, est\u00e1s listo para obtener versiones traducidas de tus cadenas. Recuerda que la <em>T <\/em>de POT es de <em>template <\/em>(<em>plantilla)<\/em>. Los archivos traducidos se llaman archivos PO, y los traductores utilizan el archivo POT como punto de partida para generar su archivo PO. Hacer la traducci\u00f3n creando manualmente el archivo PO es posible, pero es tedioso. En este punto, recurr\u00ed a un servicio llamado <a rel=\"noreferrer noopener\" href=\"https:\/\/www.transifex.com\/\" target=\"_blank\">Transifex<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Transifex se centra en facilitar la traducci\u00f3n. Es gratuito para proyectos de c\u00f3digo abierto y realmente f\u00e1cil de usar. Configur\u00e9 un proyecto para handroll, configur\u00e9 Transifex para \u00abvigilar\u00bb el archivo POT en busca de cambios, y los traductores pueden traducir f\u00e1cilmente todas las cadenas del proyecto. Transifex tiene una API que me permiti\u00f3 recuperar los archivos POT en el repositorio cuando lo necesit\u00e9. El script es demasiado largo para ponerlo en este post, pero puedes <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/handroll\/handroll\/blob\/master\/transifex.py\" target=\"_blank\">verlo en GitHub<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una cosa importante que hace el script es almacenar los ficheros PO en una estructura espec\u00edfica en el directorio <span style=\"background-color:#eeeeee\" class=\"background-color\">locale<\/span>. Gettext espera un orden como <span style=\"background-color:#eeeeee\" class=\"background-color\">&lt;language&gt;\/LC_MESSAGES\/handroll.po<\/span>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Empaquetarlo_todo\"><\/span><strong>Empaquetarlo todo <\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Una vez que los archivos de PO traducidos est\u00e1n en su lugar, es el momento de empaquetar las traducciones. El proceso de configuraci\u00f3n incluye datos extra en <span style=\"background-color:#eeeeee\" class=\"background-color\">MANIFEST.in<\/span>. A\u00f1ade una l\u00ednea similar a la siguiente para asegurarse de que todos los datos de <span style=\"background-color:#eeeeee\" class=\"background-color\">localizaci\u00f3n <\/span>se ponen en el archivo del paquete.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"background-color:#eeeeee\" class=\"background-color\">recursive-include handroll\/locale *<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hasta ahora he mentido un poco para aclarar la explicaci\u00f3n. Gettext no utiliza archivos PO directamente para buscar traducciones. La verdad es que el fichero PO debe ser compilado en un fichero binario (MO) para mayor velocidad. De nuevo, podemos recurrir a Babel en busca de ayuda. Babel tiene un comando <span style=\"background-color:#eeeeee\" class=\"background-color\">compile_catalog<\/span> que puede compilar PO en MO. Puedes ejecutarlo con <span style=\"background-color:#eeeeee\" class=\"background-color\">python setup.py compile_catalog<\/span>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Necesitar\u00e1s escribir algo as\u00ed como:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[compile_catalog]<br> domain = handroll<br> directory = handroll\/locale<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Debido a que las traducciones no funcionar\u00e1n sin archivos MO, extend\u00ed <span style=\"background-color:#eeeeee\" class=\"background-color\">setup.py<\/span> para que el comando <span style=\"background-color:#eeeeee\" class=\"background-color\">sdist <\/span>siempre ejecute <span style=\"background-color:#eeeeee\" class=\"background-color\">compile_catalog<\/span>.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">from setuptools.command.sdist import sdist<br><br> class Sdist(sdist):<br>     \"\"\"Custom <code>sdist<\/code> command to ensure that mo files are always created.\"\"\"<br> <code>def run(self):<\/code><br><code>     self.run_command('compile_catalog')<\/code><br><code>     # sdist is an old style class so super cannot be used.     sdist.run(self)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Si lo haces, no olvides a\u00f1adir <span style=\"background-color:#eeeeee\" class=\"background-color\">cmdclass={&#8216;sdist&#8217;: Sdist}<\/span> y <span style=\"background-color:#eeeeee\" class=\"background-color\">setup_requires=[&#8216;Babel&#8217;]<\/span> en la llamada de <span style=\"background-color:#eeeeee\" class=\"background-color\">configuraci\u00f3n<\/span>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En este punto, ejecutando <span style=\"background-color:#eeeeee\" class=\"background-color\">python setup.py sdist<\/span> deber\u00edas crear un tarball con las traducciones para tu proyecto. \u00a1Ya casi has terminado!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Probar_las_traducciones\"><\/span><strong>Probar las traducciones<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Probar las traducciones no es f\u00e1cil. Si te esfuerzas al m\u00e1ximo, podr\u00e1s comprobar que personas de todas las culturas puedan disfrutar de tu software. Pero las pruebas de traducci\u00f3n no son f\u00e1ciles porque necesitas pruebas que ejecuten cada cadena de tu c\u00f3digo. En el caso de Handroll, eso significaba que ten\u00eda que llegar a una cobertura de pruebas del 100% para conseguir esos casos realmente extra\u00f1os.<\/p>\n\n\n\n<p class=\"has-text-align-left wp-block-paragraph\">La raz\u00f3n para probar es que las cadenas mal traducidas pueden destruir tu c\u00f3digo. Si tienes una cadena de formato   como<span style=\"background-color:#eeeeee\" class=\"background-color\">_(&#8216;Hello{name}!&#8217;).format(name=&#8217;Johnny&#8217;)<\/span>  y un traductor comete un error como <span style=\"background-color:#eeeeee\" class=\"background-color\">&#8216;\u00a1Hola {nombre}!&#8217;<\/span>, ese c\u00f3digo se romper\u00eda para los usuarios espa\u00f1oles.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"> <code>&gt;&gt;&gt; '\u00a1Hola {nombre}!'.format(name='Johnny')<\/code><br><code> Traceback (most recent call last):<\/code><br><code>   File \"&lt;stdin&gt;\", line 1, in &lt;module&gt;<\/code><br><code> KeyError: 'nombre'<\/code> <\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Para probar estas cadenas, necesitas dos cosas: Los archivos MO y la variable de entorno <span style=\"background-color:#eeeeee\" class=\"background-color\">LANGUAGE<\/span>. Asumamos que usas el ejecutor de pruebas <a rel=\"noreferrer noopener\" href=\"https:\/\/nose.readthedocs.org\/en\/latest\/\" target=\"_blank\">nose<\/a>. Para probar su soporte en espa\u00f1ol, puedes ejecutar<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ LANGUAGE=es nosetests<br> \u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026.<br> <br>---------------------------------------------------------------------- <br> Ran 34 tests in 1.440s<br> OK<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Cualquiera que sea el sistema de integraci\u00f3n que utilices, ejecuta tus pruebas primero sobre los idiomas que conozcas, para cerciorarte de que que las traducciones no han roto nada del software. <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/handroll\/handroll\/blob\/master\/tox.ini\" target=\"_blank\">Handrolltox.ini <\/a>proporciona un ejemplo para comparar. <a rel=\"noreferrer noopener\" href=\"https:\/\/tox.readthedocs.org\/en\/latest\/\" target=\"_blank\">Tox <\/a>es impresionante para este tipo de cosas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%C2%BFPreguntas\"><\/span><strong>\u00bfPreguntas?<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En esta gu\u00eda, hice todo lo posible para documentar paso a paso el proceso de internacionalizaci\u00f3n de un proyecto de software. Espero que todos estos detalles te ayuden a traducir tu propio proyecto. Si falta algo o est\u00e1 roto, h\u00e1zmelo saber y estar\u00e9 encantado de actualizar el post.<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-right kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;right&quot;,&quot;id&quot;:&quot;7928&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;0&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;0&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;5&quot;,&quot;greet&quot;:&quot;Rate this post&quot;,&quot;legend&quot;:&quot;0\\\/5 - (0 votos)&quot;,&quot;size&quot;:&quot;24&quot;,&quot;title&quot;:&quot;Gu\u00eda completa de i18n en Python.&quot;,&quot;width&quot;:&quot;0&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} - ({count} {votes})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 0px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 5px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 19.2px;\">\n            <span class=\"kksr-muted\">Rate this post<\/span>\n    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"Traducci\u00f3n de Ingl\u00e9s a Espa\u00f1ol de un interesant\u00edsimo art\u00edculo de Matt Layman, ingeniero de software experto en open source y Python, que nos muestra en  esta gu\u00eda c\u00f3mo hacer la internacionalizaci\u00f3n (i18n) para una aplicaci\u00f3n de Python. ","protected":false},"author":8,"featured_media":8313,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[619],"tags":[394,422,302,198],"class_list":["post-7928","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-traduccion-automatica","tag-i18","tag-internacionalizar","tag-python","tag-traduccion-software"],"acf":[],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n\t<meta name=\"author\" content=\"Mauri Fernandez\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/www.ibidemgroup.com\/edu\/traduccion-i18n-python\/\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"IBIDEM EDU |\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Gu\u00eda completa de i18n en Python.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/www.ibidemgroup.com\/edu\/traduccion-i18n-python\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2021-12-14T17:02:09+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2024-03-04T11:35:59+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Gu\u00eda completa de i18n en Python.\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/traduccion-i18n-python\\\/#article\",\"name\":\"Gu\\u00eda completa de i18n en Python.\",\"headline\":\"Gu\\u00eda completa de i18n en Python.\",\"author\":{\"@id\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/author\\\/mauri\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/wp-content\\\/uploads\\\/2021\\\/12\\\/internacionalizar_i18n_python.jpg\",\"width\":1140,\"height\":380,\"caption\":\"Internacionalizaci\\u00f3n de aplicaciones Python\"},\"datePublished\":\"2021-12-14T18:02:09+01:00\",\"dateModified\":\"2024-03-04T12:35:59+01:00\",\"inLanguage\":\"es-ES\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/traduccion-i18n-python\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/traduccion-i18n-python\\\/#webpage\"},\"articleSection\":\"Traduccion Automatica, I18, internacionalizar, Python, traduccion software\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/traduccion-i18n-python\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/#listItem\",\"position\":1,\"name\":\"Inicio\",\"item\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/traduccion-automatica\\\/#listItem\",\"name\":\"Traduccion Automatica\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/traduccion-automatica\\\/#listItem\",\"position\":2,\"name\":\"Traduccion Automatica\",\"item\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/traduccion-automatica\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/traduccion-i18n-python\\\/#listItem\",\"name\":\"Gu\\u00eda completa de i18n en Python.\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/#listItem\",\"name\":\"Inicio\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/traduccion-i18n-python\\\/#listItem\",\"position\":3,\"name\":\"Gu\\u00eda completa de i18n en Python.\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/traduccion-automatica\\\/#listItem\",\"name\":\"Traduccion Automatica\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/#organization\",\"name\":\"IBIDEM EDU\",\"url\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/author\\\/mauri\\\/#author\",\"url\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/author\\\/mauri\\\/\",\"name\":\"Mauri Fernandez\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/traduccion-i18n-python\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b7b325afa7a8af8c21ac26bbaac9118b81803ff10d6c403a1b84df7063a874dd?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"Mauri Fernandez\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/traduccion-i18n-python\\\/#webpage\",\"url\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/traduccion-i18n-python\\\/\",\"name\":\"Gu\\u00eda completa de i18n en Python.\",\"inLanguage\":\"es-ES\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/traduccion-i18n-python\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/author\\\/mauri\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/author\\\/mauri\\\/#author\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/wp-content\\\/uploads\\\/2021\\\/12\\\/internacionalizar_i18n_python.jpg\",\"@id\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/traduccion-i18n-python\\\/#mainImage\",\"width\":1140,\"height\":380,\"caption\":\"Internacionalizaci\\u00f3n de aplicaciones Python\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/traduccion-i18n-python\\\/#mainImage\"},\"datePublished\":\"2021-12-14T18:02:09+01:00\",\"dateModified\":\"2024-03-04T12:35:59+01:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/#website\",\"url\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/\",\"name\":\"IBIDEM EDU\",\"inLanguage\":\"es-ES\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.ibidemgroup.com\\\/edu\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Gu\u00eda completa de i18n en Python.","description":"","canonical_url":"https:\/\/www.ibidemgroup.com\/edu\/traduccion-i18n-python\/","robots":"max-snippet:-1, max-image-preview:large, max-video-preview:-1","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.ibidemgroup.com\/edu\/traduccion-i18n-python\/#article","name":"Gu\u00eda completa de i18n en Python.","headline":"Gu\u00eda completa de i18n en Python.","author":{"@id":"https:\/\/www.ibidemgroup.com\/edu\/author\/mauri\/#author"},"publisher":{"@id":"https:\/\/www.ibidemgroup.com\/edu\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/www.ibidemgroup.com\/edu\/wp-content\/uploads\/2021\/12\/internacionalizar_i18n_python.jpg","width":1140,"height":380,"caption":"Internacionalizaci\u00f3n de aplicaciones Python"},"datePublished":"2021-12-14T18:02:09+01:00","dateModified":"2024-03-04T12:35:59+01:00","inLanguage":"es-ES","mainEntityOfPage":{"@id":"https:\/\/www.ibidemgroup.com\/edu\/traduccion-i18n-python\/#webpage"},"isPartOf":{"@id":"https:\/\/www.ibidemgroup.com\/edu\/traduccion-i18n-python\/#webpage"},"articleSection":"Traduccion Automatica, I18, internacionalizar, Python, traduccion software"},{"@type":"BreadcrumbList","@id":"https:\/\/www.ibidemgroup.com\/edu\/traduccion-i18n-python\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/www.ibidemgroup.com\/edu\/#listItem","position":1,"name":"Inicio","item":"https:\/\/www.ibidemgroup.com\/edu\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.ibidemgroup.com\/edu\/traduccion-automatica\/#listItem","name":"Traduccion Automatica"}},{"@type":"ListItem","@id":"https:\/\/www.ibidemgroup.com\/edu\/traduccion-automatica\/#listItem","position":2,"name":"Traduccion Automatica","item":"https:\/\/www.ibidemgroup.com\/edu\/traduccion-automatica\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.ibidemgroup.com\/edu\/traduccion-i18n-python\/#listItem","name":"Gu\u00eda completa de i18n en Python."},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.ibidemgroup.com\/edu\/#listItem","name":"Inicio"}},{"@type":"ListItem","@id":"https:\/\/www.ibidemgroup.com\/edu\/traduccion-i18n-python\/#listItem","position":3,"name":"Gu\u00eda completa de i18n en Python.","previousItem":{"@type":"ListItem","@id":"https:\/\/www.ibidemgroup.com\/edu\/traduccion-automatica\/#listItem","name":"Traduccion Automatica"}}]},{"@type":"Organization","@id":"https:\/\/www.ibidemgroup.com\/edu\/#organization","name":"IBIDEM EDU","url":"https:\/\/www.ibidemgroup.com\/edu\/"},{"@type":"Person","@id":"https:\/\/www.ibidemgroup.com\/edu\/author\/mauri\/#author","url":"https:\/\/www.ibidemgroup.com\/edu\/author\/mauri\/","name":"Mauri Fernandez","image":{"@type":"ImageObject","@id":"https:\/\/www.ibidemgroup.com\/edu\/traduccion-i18n-python\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/b7b325afa7a8af8c21ac26bbaac9118b81803ff10d6c403a1b84df7063a874dd?s=96&d=mm&r=g","width":96,"height":96,"caption":"Mauri Fernandez"}},{"@type":"WebPage","@id":"https:\/\/www.ibidemgroup.com\/edu\/traduccion-i18n-python\/#webpage","url":"https:\/\/www.ibidemgroup.com\/edu\/traduccion-i18n-python\/","name":"Gu\u00eda completa de i18n en Python.","inLanguage":"es-ES","isPartOf":{"@id":"https:\/\/www.ibidemgroup.com\/edu\/#website"},"breadcrumb":{"@id":"https:\/\/www.ibidemgroup.com\/edu\/traduccion-i18n-python\/#breadcrumblist"},"author":{"@id":"https:\/\/www.ibidemgroup.com\/edu\/author\/mauri\/#author"},"creator":{"@id":"https:\/\/www.ibidemgroup.com\/edu\/author\/mauri\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/www.ibidemgroup.com\/edu\/wp-content\/uploads\/2021\/12\/internacionalizar_i18n_python.jpg","@id":"https:\/\/www.ibidemgroup.com\/edu\/traduccion-i18n-python\/#mainImage","width":1140,"height":380,"caption":"Internacionalizaci\u00f3n de aplicaciones Python"},"primaryImageOfPage":{"@id":"https:\/\/www.ibidemgroup.com\/edu\/traduccion-i18n-python\/#mainImage"},"datePublished":"2021-12-14T18:02:09+01:00","dateModified":"2024-03-04T12:35:59+01:00"},{"@type":"WebSite","@id":"https:\/\/www.ibidemgroup.com\/edu\/#website","url":"https:\/\/www.ibidemgroup.com\/edu\/","name":"IBIDEM EDU","inLanguage":"es-ES","publisher":{"@id":"https:\/\/www.ibidemgroup.com\/edu\/#organization"}}]},"og:locale":"es_ES","og:site_name":"IBIDEM EDU |","og:type":"article","og:title":"Gu\u00eda completa de i18n en Python.","og:url":"https:\/\/www.ibidemgroup.com\/edu\/traduccion-i18n-python\/","article:published_time":"2021-12-14T17:02:09+00:00","article:modified_time":"2024-03-04T11:35:59+00:00","twitter:card":"summary_large_image","twitter:title":"Gu\u00eda completa de i18n en Python."},"aioseo_meta_data":{"post_id":"7928","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"limit_modified_date":false,"created":"2023-09-12 16:26:38","updated":"2024-03-04 11:54:21","focus_keyword":null,"additional_keywords":null,"truseo_locale":null,"ai":null,"breadcrumb_settings":null,"seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.ibidemgroup.com\/edu\/\" title=\"Inicio\">Inicio<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">\u00bb<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.ibidemgroup.com\/edu\/traduccion-automatica\/\" title=\"Traduccion Automatica\">Traduccion Automatica<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">\u00bb<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tGu\u00eda completa de i18n en Python.\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Inicio","link":"https:\/\/www.ibidemgroup.com\/edu\/"},{"label":"Traduccion Automatica","link":"https:\/\/www.ibidemgroup.com\/edu\/traduccion-automatica\/"},{"label":"Gu\u00eda completa de i18n en Python.","link":"https:\/\/www.ibidemgroup.com\/edu\/traduccion-i18n-python\/"}],"_links":{"self":[{"href":"https:\/\/www.ibidemgroup.com\/edu\/wp-json\/wp\/v2\/posts\/7928","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ibidemgroup.com\/edu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ibidemgroup.com\/edu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ibidemgroup.com\/edu\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ibidemgroup.com\/edu\/wp-json\/wp\/v2\/comments?post=7928"}],"version-history":[{"count":31,"href":"https:\/\/www.ibidemgroup.com\/edu\/wp-json\/wp\/v2\/posts\/7928\/revisions"}],"predecessor-version":[{"id":10974,"href":"https:\/\/www.ibidemgroup.com\/edu\/wp-json\/wp\/v2\/posts\/7928\/revisions\/10974"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ibidemgroup.com\/edu\/wp-json\/wp\/v2\/media\/8313"}],"wp:attachment":[{"href":"https:\/\/www.ibidemgroup.com\/edu\/wp-json\/wp\/v2\/media?parent=7928"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ibidemgroup.com\/edu\/wp-json\/wp\/v2\/categories?post=7928"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ibidemgroup.com\/edu\/wp-json\/wp\/v2\/tags?post=7928"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}