{"id":116,"date":"2017-05-02T20:07:44","date_gmt":"2017-05-02T20:07:44","guid":{"rendered":"https:\/\/blog.jkanework.com\/post.php?idpost=116"},"modified":"2017-05-02T20:07:44","modified_gmt":"2017-05-02T20:07:44","slug":"traducir-programas-en-c-con-gettext","status":"publish","type":"post","link":"https:\/\/blog.jkanetwork.com\/?p=116","title":{"rendered":"Traducir programas en C con gettext"},"content":{"rendered":"<p>Hace tiempo Kevin explicaba en uno de sus art&iacute;culos como traducir script en BASH si usar gettext, gracias a que bash es un sistema interpretado la soluci&oacute;n planteada es muy buena pero en lenguajes como C no podemos usar esto ya que al necesitar una compilaci&oacute;n es mucho m&aacute;s complicado, no tanto en su programaci&oacute;n como la posterior compilaci&oacute;n.&nbsp;Por tanto en este art&iacute;culo voy a explicar como se puede traducir un programa en C usando gettext.<\/p>\n<p>&nbsp;<\/p>\n<p>Para empezar necesitamos una librer&iacute;a estandar llamada locale.h y la no est&aacute;ndar libint1.h, como sab&eacute;is basta con dos #include para colocarlas. Quedar&iacute;a as&iacute;:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i.imgur.com\/6Zxm3VI.png\" width=\"234\" height=\"48\" border=\"0\" \/><\/p>\n<p>Lo siguiente es inicializar los locales y para ello usaremos las siguientes cuatro lineas que estar&aacute;n en el main de nuestro programa:<\/p>\n<blockquote>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i.imgur.com\/RQ2HfR2.png\" alt=\"\" width=\"441\" height=\"65\" border=\"0\" \/><\/p>\n<\/blockquote>\n<p>Habr&iacute;a que cambiar el nombre por el nombre del archivo binario con el que se conocer&aacute; el programa. Luego, la ruta puede ser tanto absoluta como relativa aunque recomendamos que sea absoluta. Es importante recalcar que el funcionamiento de gettext en cuanto a carpetas es este: \u00ab\/&#8230;\/idioma\/LC_MESSAGES\/nombre.mo\u00bb siendo \u00ab\/&#8230;\/\u00bb lo que hay que sustituir por la ruta de la carpeta. Por ejemplo, en cryptojka el fichero se guarda en \u00ab<em>\/usr\/share\/cryptojka\/i18n\u00bb<\/em> y dentro de esa carpeta tenemos \u00ab<em>es\/LC_MESSAGES\/cryptojka.mo\u00bb <\/em>es por eso que es importante recordarlo cuando pongamos los archivos .mo.<\/p>\n<p>Pero &iquest;qu&eacute; son los archivos .mo? son los archivos derivados de los archivos .po que vienen siendo una relaci&oacute;n entre el texto original y el texto traducido, pero no nos adelantemos.<\/p>\n<p>Lo siguiente que tenemos que hacer es capturar los textos, para ello usaremos la funci&oacute;n&nbsp;gettext. Tambi&eacute;n podemos simplificarlo haciendo un <em>#define _ gettext<\/em> o cualquier otra cosa en la que ahora _ ser&aacute; el nuevo gettext. Para capturar el texto la sintaxis es la siguiente<\/p>\n<blockquote>\n<p><em><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i.imgur.com\/L9234X1.png\" alt=\"\" width=\"359\" height=\"31\" border=\"0\" \/><\/em><\/p>\n<\/blockquote>\n<p>Como se puede ver si queremos pasar un par&aacute;metro lo ponemos fuera del gettext y funciona de la misma manera. Una vez que tenemos todos nuestros textos con la funci&oacute;n gettext vamos a generar el fichero .pot (plantilla) con el que generaremos las traducciones, entramos en la terminal y ejecutamos el siguiente comando:<\/p>\n<pre class=\"language-bash\"><code>xgettext *.c --output=cryptojka.pot --keyword=gettext --from-code=UTF-8<\/code><\/pre>\n<p>Ahora que tenemos la plantilla hay que generar un fichero destinado al lenguaje en concreto. Para eso utilizamos el siguiente comando:<\/p>\n<pre class=\"language-bash\"><code>msginit --input=cryptojka.pot --output=es.po --locale=es<\/code><\/pre>\n<p>&nbsp;De esta manera generamos el fichero .po que traduciremos. Esto podemos hacerlo con un editor cualquiera.<\/p>\n<p>Una vez hecha la traducci&oacute;n tenemos que generar el fichero mo que estar&aacute; compilado. Para hacer eso ejecutamos un comando muy parecido al enterior.<\/p>\n<pre class=\"language-bash\"><code>msgfmt es.po --output-file=es.mo<\/code><\/pre>\n<p>As&iacute; ya tenemos el fichero compilado. Ahora para poder utilizarlo solo hay que ponerlo en la carpeta especificada con anterioridad. Cambiarle el nombre anterior (se hace de esta manera en la compilaci&oacute;n para no solaparse) por el nombre de la aplicaci&oacute;n, en este caso <em>cryptojka<\/em> y guardarlo en la ruta correcta. Y as&iacute; ya tendr&aacute;s tu programa escrito en C con internacionalizaci&oacute;n de textos.<\/p>\n<p>Si quieres a&ntilde;adir algo no te olvides de dejar tus comentarios.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hace tiempo Kevin explicaba en uno de sus art&iacute;culos como traducir script en BASH si usar gettext, gracias a que bash es un sistema interpretado la soluci&oacute;n planteada es muy buena pero en lenguajes como C no podemos usar esto ya que al necesitar una compilaci&oacute;n es mucho m&aacute;s complicado, no tanto en su programaci&oacute;n [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-116","post","type-post","status-publish","format-standard","hentry","category-tutoriales"],"_links":{"self":[{"href":"https:\/\/blog.jkanetwork.com\/index.php?rest_route=\/wp\/v2\/posts\/116","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.jkanetwork.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.jkanetwork.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jkanetwork.com\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jkanetwork.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=116"}],"version-history":[{"count":0,"href":"https:\/\/blog.jkanetwork.com\/index.php?rest_route=\/wp\/v2\/posts\/116\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.jkanetwork.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=116"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jkanetwork.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=116"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jkanetwork.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=116"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}