<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>PHPBSD.net &#187; gettext</title>
	<atom:link href="http://www.phpbsd.net/tag/gettext/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.phpbsd.net</link>
	<description>Blogueando sobre PHP, BSD, SEO, AJAX, Seguridad, Rendimiento... y mucho más</description>
	<lastBuildDate>Thu, 07 Oct 2010 11:57:22 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Internacionalización de temas en WordPress usando gettext</title>
		<link>http://www.phpbsd.net/2007/06/07/internacionalizacion-de-temas-en-wordpress-usando-gettext/</link>
		<comments>http://www.phpbsd.net/2007/06/07/internacionalizacion-de-temas-en-wordpress-usando-gettext/#comments</comments>
		<pubDate>Thu, 07 Jun 2007 17:24:32 +0000</pubDate>
		<dc:creator>Oriol</dc:creator>
				<category><![CDATA[Artículos]]></category>
		<category><![CDATA[blogging]]></category>
		<category><![CDATA[gettext]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[webmaster]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.phpbsd.net/2007/06/07/internacionalizacion-de-temas-en-wordpress-usando-gettext/</guid>
		<description><![CDATA[WordPress está disponible en varios idiomas gracias al sistema de localización GNU gettext. Dentro del código de WordPress nos encontramos dos funciones para hacer el trabajo con gettext mucho más sencillo y así poder programar plugins y temas multi-idioma, estas funciones son las mismas que usa internamente el propio WordPress. A pesar de disponer de [...]


Entradas relacionadas:<ul><li><a href='http://www.phpbsd.net/2007/01/28/usando-mod_rewrite-y-feedburner-para-las-feeds-de-un-blog-con-wordpress/' rel='bookmark' title='Permanent Link: Usando mod_rewrite y FeedBurner para las feeds de un blog con WordPress'>Usando mod_rewrite y FeedBurner para las feeds de un blog con WordPress</a></li><li><a href='http://www.phpbsd.net/2009/02/21/actualizar-un-wordpress-a-la-ultima-version/' rel='bookmark' title='Permanent Link: Actualizar un WordPress a la última versión'>Actualizar un WordPress a la última versión</a></li><li><a href='http://www.phpbsd.net/2007/12/04/mediawiki-con-urls-cortas-usando-mod_rewrite/' rel='bookmark' title='Permanent Link: MediaWiki con URLs cortas usando mod_rewrite'>MediaWiki con URLs cortas usando mod_rewrite</a></li></ul>]]></description>
			<content:encoded><![CDATA[<p>WordPress está disponible en varios idiomas gracias al sistema de localización <a target="_blank" href="http://www.gnu.org/software/gettext/gettext.html" title="gettext - GNU Project - Free Software Foundation (FSF)">GNU gettext</a>. Dentro del código de WordPress nos encontramos dos funciones para hacer el trabajo con gettext mucho más sencillo y así poder programar <strong>plugins y temas multi-idioma</strong>, estas funciones son las mismas que usa internamente el propio WordPress. A pesar de disponer de estas facilidades es muy frecuente encontrarse temas en un único idioma, es cierto que hacer temas multi-idioma añade un coste extra a la confección de un tema, pero en mi opinión es algo que merece la pena si queremos dar <strong>mucha más visibilidad a nuestro trabajo</strong>. A continuación describo como usar estos mecanismos que proporciona el WordPress para realizar un tema multi-idioma.</p>
<p><strong>[1] Escoger un nombre para el "dominio".</strong> Se trata de escoger un nombre para todo el conjunto de traducciones, normalmente el mismo nombre del tema nos servirá, lo único a tener en cuenta es que ha de ser un nombre único entre todos los temas y plugins instalados.</p>
<p><strong>[2] Modificar las plantillas.</strong> Se trata de usar unas determinadas funciones PHP para sacar por pantalla cualquier cadena de texto que tengamos en nuestras plantillas.</p>
<p>Las funciones son <em>_e($texto)</em> y <em>__($texto)</em>. Estas funciones buscan una traducción de <em>$texto</em> en el catálogo usando como índice el texto pasado y si no la encuentran devuelven <em>$texto</em> sin modificar, el idioma a traducir lo define la constante <em>WPLANG</em> (en wp-config.php). La única diferencia entre las dos funciones es que <em>__()</em> devuelve con un <em>return()</em> el texto traducido y <em>_e()</em> lo imprime por pantalla con un <em>echo()</em>.</p>
<p>Un ejemplo de <em>__e()</em>:</p>
<div class="syntax_hilite">
<div id="php-9">
<div class="php">&lt;h2&gt;About&lt;/h2&gt;</div>
</div>
</div>
<p></p>
<p>por:</p>
<div class="syntax_hilite">
<div id="php-10">
<div class="php">&lt;h2&gt;&lt;?php _e<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">'About'</span>,<span style="color:#FF0000;">'ejemplo_domain'</span><span style="color:#006600; font-weight:bold;">&#41;</span>; ?&gt;&lt;/h2&gt;</div>
</div>
</div>
<p></p>
<p>Un ejemplo de <em>__()</em>:</p>
<div class="syntax_hilite">
<div id="php-11">
<div class="php">the_content<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">'Read the rest of this entry'</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</div>
</div>
<p></p>
<p>por:</p>
<div class="syntax_hilite">
<div id="php-12">
<div class="php">the_content<span style="color:#006600; font-weight:bold;">&#40;</span>__<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">'Read the rest of this entry'</span>,<span style="color:#FF0000;">'ejemplo_domain'</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</div>
</div>
<p></p>
<p>Para la correcta traducción de las frases en ocasiones es necesario usar <em>printf()</em> o <em>sprinf()</em> junto con <em>__()</em>. Por ejemplo:</p>
<div class="syntax_hilite">
<div id="php-13">
<div class="php"><a href="http://www.php.net/printf"><span style="color:#000066;">printf</span></a><span style="color:#006600; font-weight:bold;">&#40;</span>__<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">'You are currently browsing the %1$s weblog archives for the %2$s category.'</span>,<span style="color:#FF0000;">'ejemplo_domain'</span><span style="color:#006600; font-weight:bold;">&#41;</span>, get_settings<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">'siteurl'</span><span style="color:#006600; font-weight:bold;">&#41;</span>, single_cat_title<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">''</span>,<span style="color:#000000; font-weight:bold;">false</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</div>
</div>
<p></p>
<p>Esto permite que el traductor entienda más el significado de la frase que si la troceamos con varios <em>_e()</em>, también permite cambiar el orden de las variables (<em>%1$s</em> y <em>%2$s</em>) si nuestro idioma lo requiere.</p>
<p>A parte de los textos que se mostrarán por pantalla tenemos otros strings importantes a internacionalizar, son los que definen el formato de las fechas. Por ejemplo:</p>
<div class="syntax_hilite">
<div id="php-14">
<div class="php">the_time<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">'l, F jS, Y'</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</div>
</div>
<p></p>
<p>por:</p>
<div class="syntax_hilite">
<div id="php-15">
<div class="php">the_time<span style="color:#006600; font-weight:bold;">&#40;</span>__<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">'l, F jS, Y'</span><span style="color:#006600; font-weight:bold;">&#41;</span>,<span style="color:#FF0000;">'ejemplo_domain'</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</div>
</div>
<p></p>
<p><strong>[3] Crear el catálogo de traducciones.</strong> Existen varios programas para trabajar con archivos POT, a continuación describo brevemente como usar <a target="_blank" href="http://www.poedit.org/" title="www.poedit.org - DefaultHomePage">poEdit</a> para generar el archivo POT y MO a partir de las plantillas anteriormente modificadas.</p>
<ul>
<li>Instalamos poEdit.</li>
<li>Configuraciones iniciales como nuestro nombre, etc. en "File -> Preferences".</li>
<li>Creamos un nuevo catálogo con "File -> New Catalog". En el cuadro de diálogo que aparece:
<ul>
<li>En "Project Info" introducimos el nombre del proyecto, idioma, etc. y la codificación utf-8 (por defecto en todo WP).</li>
<li>En "Paths" añadimos un único path, el ".".</li>
<li>En "Keywords" añadimos los nombres de las funciones usadas para trabajar con gettext, "__e" y "__" (sin las comillas).</li>
</ul>
</li>
<li>Lo siguiente es generar el catálogo. Es necesario guardarlo en el mismo directorio que los archivos del tema y ponerle el nombre del locale deseado (p.e. es_ES).</li>
</ul>
<p>Si todo ha ido bien poEdit escaneará todas nuestras plantillas y generará un archivo POT listo para empezar a traducir. Cada vez que se guarda el catálogo se generará automáticamente el MO, que es el que realmente usa el código PHP, a no ser que configuremos lo contrario en "Preferences".</p>
<p><strong>[4] Cargar las traducciones desde el tema.</strong> Ahora sólo falta que nuestro tema cargue el catálogo apropiado dependiendo del idioma definido, esto lo conseguimos añadiendo lo siguiente antes de cualquier llamada a <em>__()</em> o <em>_e()</em>, un buen lugar es al principio del index.php o del header.php:</p>
<div class="syntax_hilite">
<div id="php-16">
<div class="php">load_theme_textdomain<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">'ejemplo_domain'</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</div>
</div>
<p></p>
<p><strong>[5] Listos!</strong> En el siguiente acceso a nuestro blog veremos todas las frases traducidas.</p>
<p>Aunque el procedimiento descrito está centrado en WP y las funciones que nos brinda para la internacionalización es muy parecido al uso de otros sistemas basados en gettext, como plugins Smarty, o al uso directo de las <a target="_blank" href="http://www.php.net/manual/es/ref.gettext.php" title="PHP: Gettext - Manual">funciones gettext del PHP</a>.</p>
<p>Si quieres más información puedes consultar los capítulos <a target="_blank" href="http://codex.wordpress.org/Translating_WordPress" title="Translating WordPress &laquo; WordPress Codex">Traduciendo WordPress</a> y <a target="_blank" href="http://codex.wordpress.org/Writing_a_Plugin" title="Writing a Plugin &laquo; WordPress Codex">Escribiendo un Plugin</a> de la documentación de WordPress.</p>


<p>Entradas relacionadas:<ul><li><a href='http://www.phpbsd.net/2007/01/28/usando-mod_rewrite-y-feedburner-para-las-feeds-de-un-blog-con-wordpress/' rel='bookmark' title='Permanent Link: Usando mod_rewrite y FeedBurner para las feeds de un blog con WordPress'>Usando mod_rewrite y FeedBurner para las feeds de un blog con WordPress</a></li><li><a href='http://www.phpbsd.net/2009/02/21/actualizar-un-wordpress-a-la-ultima-version/' rel='bookmark' title='Permanent Link: Actualizar un WordPress a la última versión'>Actualizar un WordPress a la última versión</a></li><li><a href='http://www.phpbsd.net/2007/12/04/mediawiki-con-urls-cortas-usando-mod_rewrite/' rel='bookmark' title='Permanent Link: MediaWiki con URLs cortas usando mod_rewrite'>MediaWiki con URLs cortas usando mod_rewrite</a></li></ul></p>]]></content:encoded>
			<wfw:commentRss>http://www.phpbsd.net/2007/06/07/internacionalizacion-de-temas-en-wordpress-usando-gettext/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

