<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Bitácora de Vuelo (Publicaciones sobre idiomas)</title><link>http://blog.taniquetil.com.ar/</link><description></description><atom:link href="http://blog.taniquetil.com.ar/categories/idiomas.xml" rel="self" type="application/rss+xml"></atom:link><language>es</language><copyright>Contents © 2023 &lt;a href="mailto:facundo@taniquetil.com.ar"&gt;Facundo Batista&lt;/a&gt; CC BY-NC-SA</copyright><lastBuildDate>Mon, 29 May 2023 18:51:48 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Localizate, chabón</title><link>http://blog.taniquetil.com.ar/posts/0455/</link><dc:creator>Facundo Batista</dc:creator><description>&lt;p&gt;Uno de los bugs críticos que tenía en &lt;a class="reference external" href="https://edge.launchpad.net/enjuewemela"&gt;Enjuéwemela&lt;/a&gt; era el de internacionalizarlo/localizarlo.&lt;/p&gt;
&lt;p&gt;Este proceso (que tiene en inglés nombres tan complicados que se los refiere normalmente como i18n y l10n, deduzcan ustedes por qué) básicamente permite al programa mostrar todos los textos en el lenguaje del usuario.&lt;/p&gt;
&lt;p&gt;Obviamente, para que todos los textos de un programa estén en varios idiomas, la gente tiene que traducirlos, y aparte el programa tiene que mostrar los textos correspondientes en el lugar adecuado, en función del idioma del usuario. La forma de hacer esto está establecida desde hace varios años, y está armada especialmente para facilitar que colaboradores creen nuevas traducciones y se agreguen al sistema.&lt;/p&gt;
&lt;p&gt;Esta tecnología se conoce como &lt;a class="reference external" href="http://es.wikipedia.org/wiki/Gettext"&gt;Gettext&lt;/a&gt;, y se puede utilizar desde todos (o casi todos) los lenguajes existentes. Pero una cosa es utilizarlo, y otra es armar el programa para que pueda utilizarlo, y que se puedan agregar nuevas traducciones, etc.&lt;/p&gt;
&lt;p&gt;Recuerdo que cuando lo hice para &lt;a class="reference external" href="https://launchpad.net/typuspocus"&gt;Typus Pocus&lt;/a&gt; no salió fácil, y tuve que leer bastante. Casi me pongo a pensar nuevamente como era, pero se me prendió la lamparita y me acordé que en su momento había escrito en ese proyecto un &lt;em&gt;procedimiento_locale.txt&lt;/em&gt;, así que lo tomé y usé.&lt;/p&gt;
&lt;p&gt;Para que estos pasos los puedan usar todos, los dejo acá. Pero ojo, no muestran como usar gettext desde tal o cual lenguaje (eso lo verán ustedes), sino cómo preparar los archivos y directorios para que luego puedan usar gettext desde sus programas. Por otro lado, los ejemplos son las lineas que tiré para Enjuéwemela, así que están orientados a Python, sepan adaptar.&lt;/p&gt;
&lt;p&gt;Entonces...&lt;/p&gt;
&lt;p&gt;Creamos el directorio para guardar nuestra estructura de traducciones:&lt;/p&gt;
&lt;pre class="literal-block"&gt;mkdir locale&lt;/pre&gt;
&lt;p&gt;Editamos todos nuestros archivos y metemos todos los textos que queramos internacionalizar en la llamada a función &lt;code class="docutils literal"&gt;_()&lt;/code&gt;. O sea, que si teníamos el texto &lt;code class="docutils literal"&gt;"click here"&lt;/code&gt; y queremos que ese texto se internacionalice, tenemos que dejar &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;_("click&lt;/span&gt; here")&lt;/code&gt;. Esto es vital para el próximo paso, y para el funcionamiento luego, ya que &lt;code class="docutils literal"&gt;_()&lt;/code&gt; será la función de gettext que reemplazará lo que está escrito en el código con lo que se mostrará al usuario en función de su lenguaje.&lt;/p&gt;
&lt;p&gt;Generamos el archivo &lt;code class="docutils literal"&gt;.pot&lt;/code&gt; con todos los textos que utilizamos en nuestro programa. Para ello utilizamos xgettext y le pasamos todos los &lt;code class="docutils literal"&gt;.py&lt;/code&gt; que usamos (esta utilidad revisará las fuentes y tomará los textos que tienen el &lt;code class="docutils literal"&gt;_()&lt;/code&gt; que agregamos antes):&lt;/p&gt;
&lt;pre class="literal-block"&gt;xgettext *.py --output=locale/core.pot&lt;/pre&gt;
&lt;p&gt;Este &lt;code class="docutils literal"&gt;.pot&lt;/code&gt; es el archivo &lt;em&gt;template&lt;/em&gt; que distribuiremos a todos aquellos que deseen traducir nuestro programa. Antes de distribuirlo, deberíamos abrirlo con un editor y completar ciertos campos que están listos para ser rellenados (título, autor, etc.).&lt;/p&gt;
&lt;p&gt;La preparación propiamente dicha del sistema ya está completa, los pasos a continuación muestran qué hacer con el &lt;code class="docutils literal"&gt;.pot&lt;/code&gt; si queremos generar la traducción para un nuevo lenguaje.&lt;/p&gt;
&lt;p&gt;Generamos el &lt;code class="docutils literal"&gt;.po&lt;/code&gt;, renombrando la base del archivo para incorporarle las dos letras del idioma que estamos utilizando. Si es la primera vez, sólo copiamos el &lt;code class="docutils literal"&gt;.pot&lt;/code&gt; al mismo...&lt;/p&gt;
&lt;pre class="literal-block"&gt;cd locale
cp core.pot core_es.po&lt;/pre&gt;
&lt;p&gt;..., pero si ya teníamos el &lt;code class="docutils literal"&gt;.po&lt;/code&gt; de antes y ahora tenemos un nuevo &lt;code class="docutils literal"&gt;.pot&lt;/code&gt; (porque aparecieron nuevos textos en el programa, o cambiaron los que estaban de antes), tenemos que mergear los archivos de la siguiente manera:&lt;/p&gt;
&lt;pre class="literal-block"&gt;cd locale
msgmerge core_es.po core.pot &amp;gt; /tmp/po_temporal
mv /tmp/po_temporal core_es.po&lt;/pre&gt;
&lt;p&gt;El próximo paso es abrir el &lt;code class="docutils literal"&gt;core_es.po&lt;/code&gt; con un editor de texto y traducir todas las cadenas. Luego, tenemos que compilar el &lt;code class="docutils literal"&gt;.po&lt;/code&gt; al &lt;code class="docutils literal"&gt;.mo&lt;/code&gt;, que es el archivo que levantará realmente el sistema &lt;code class="docutils literal"&gt;gettext&lt;/code&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;msgfmt core_es.po&lt;/pre&gt;
&lt;p&gt;Y finalmente, movemos el archivo compilado a un directorio que tiene que seguir la estructura preestablecida aquí mostrada (prestar atención al renombre del archivo en sí, y a que en el directorio está el idioma utilizado en la traducción):&lt;/p&gt;
&lt;pre class="literal-block"&gt;mkdir -p es/LC_MESSAGES
mv messages.mo es/LC_MESSAGES/core.mo&lt;/pre&gt;
&lt;p&gt;Como último detalle, quiero aclarar que hay muchos editores especializados que muestran los &lt;code class="docutils literal"&gt;.po&lt;/code&gt; y &lt;code class="docutils literal"&gt;.pot&lt;/code&gt; uno al lado del otro, especialmente útiles cuando los programas a traducir son muy grandes o contienen muchos textos, pero que realmente uno se puede arreglar con un editor de textos común y corriente.&lt;/p&gt;</description><category>gettext</category><category>idiomas</category><category>lenguajes</category><category>locale</category><category>Python</category><guid>http://blog.taniquetil.com.ar/posts/0455/</guid><pubDate>Sat, 27 Mar 2010 00:22:51 GMT</pubDate></item><item><title>Aprendiendo idiomas en la internete</title><link>http://blog.taniquetil.com.ar/posts/0320/</link><dc:creator>Facundo Batista</dc:creator><description>&lt;p&gt;La frase "un millón de moscas no pueden equivocarse", más allá de las reminiscencias escatológicas, tiene algo de cierto: estadísticamente se pueden sacar conclusiones interesantes.&lt;/p&gt;
&lt;p&gt;En algunos casos es más difícil que otros; por ejemplo, si medio mundo dice que 2+2=3, yo igual desconfío (más allá del &lt;a class="reference external" href="http://www.rock.com.ar/letras/2/2482.shtml"&gt;muy buen tema de La Renga&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Pero a nivel de lenguajes, donde justamente las "especificaciones formales" cambian con el tiempo en función de cómo la gente utiliza el lenguaje, las estadísticas son útiles, especialmente cuando nos referimos a expresiones usadas en uno u otro lenguaje.&lt;/p&gt;
&lt;p&gt;Y, justamente, las expresiones son lo más difícil de aprender de un idioma.&lt;/p&gt;
&lt;p&gt;Hoy estaba escribiendo un mail en inglés, y quería poner algo como "pensamos en vos para esto", y dudé como escribirlo. Mi primer intento, casi sin pensarlo, fue "thought about you for this" (falta el "we" adelante, obvio, pero es irrelevante para este ejercicio), pero no me gustó.&lt;/p&gt;
&lt;p&gt;Fui a &lt;a class="reference external" href="http://www.google.com/"&gt;Google&lt;/a&gt; y puse esta frase, con comillas. Encontró 3 coincidencias, y supe que estaba mal escrito. Probé con "thought in you for this", no encontró nada. Probé con "thought on you for this", tampoco.&lt;/p&gt;
&lt;p&gt;Ahí me frustré un poquito, y saqué las comillas. Obviamente, encontró muchísimas páginas. Leyendo por arriba las coincidencias (sin siquiera entrar a las páginas), vi que en ocasiones se usaba el "thought of". Entonces probé con "thought of you for this", encontró 280 mil hits. Muchos (aunque sospechosamente demasiados, ver abajo los resultados para Yahoo).&lt;/p&gt;
&lt;p&gt;Lo importante, obvio, es que leí cómo estaba usada la frase, y era con el significado que quería yo.&lt;/p&gt;
&lt;p&gt;Para aquellos que están  (estamos) preocupados en que Google se está convirtiendo en un "generador de Verdad", y nos asustan las perspectivas &lt;a class="reference external" href="http://es.wikipedia.org/wiki/1984_(novela)"&gt;orwellianas&lt;/a&gt; de esto, también busqué en &lt;a class="reference external" href="http://www.yahoo.com/"&gt;Yahoo&lt;/a&gt;. Las coincidencias fueron 56, 0, 0 y 443, en el orden descripto arriba.&lt;/p&gt;
&lt;p&gt;Resumiendo, con un poco de tiempo uno se puede sacar estas dudas raras, que a menos que uno tenga a mano a alguien que hable inglés nativo, o que sepa &lt;em&gt;mucho&lt;/em&gt; inglés, son muy difíciles de evacuar.&lt;/p&gt;</description><category>Google</category><category>idiomas</category><category>lenguajes</category><category>orwell</category><category>Yahoo</category><guid>http://blog.taniquetil.com.ar/posts/0320/</guid><pubDate>Fri, 18 Jan 2008 09:04:20 GMT</pubDate></item></channel></rss>