Diferencia entre revisiones de «KumbiaPHP y gettext»

De KumbiaPHP Framework Wiki
 
(No se muestran 30 ediciones intermedias de 7 usuarios)
Línea 1: Línea 1:
El objeto de este pequeño tutorial es explicar como usar gettext para internacionalizar nuestras aplicaciones en [http://www.kumbiaphp.com KumbiaPHP].
+
El objeto de este pequeño tutorial, es explicar como usar gettext para internacionalizar nuestras aplicaciones en [http://www.kumbiaphp.com KumbiaPHP].
  
 
===Importante===  
 
===Importante===  
[[Archivo: Warning.png‎]]Para que esta extesión funcione correctamente se debe tener instalado el servidor el programa '''locale''', para Debian y derivados, (ejecutar como root):
+
[[Archivo: Warning.png‎]]Para que esta extesión funcione correctamente, se debe tener instalado en el servidor el programa '''locale'''.
 +
 
 +
Para Debian y derivados, (ejecutar como root):
 
   aptitude install locale  
 
   aptitude install locale  
Además tambien debe estar disponible el lenguaje al cual se quiere hacer traducción.
+
Además, también debe estar disponible el lenguaje, al cual se quiere hacer la traducción.
 +
  locale -a
  
 
=== Tutorial ===  
 
=== Tutorial ===  
Lo primero que debes tener presente es que todos los textos que quieras que se muestren en diferentes idiomas los has de escribir en la vista de la siguiente forma: '''''_("Texto a traducir")''''', por ejemplo en nuestra vista tenemos el siguiente formulario:
+
Lo primero que debes tener presente, es que todos los textos que quieras mostrar en diferentes idiomas, los has de escribir en la vista de la siguiente forma: '''''_("Texto a traducir")'''''.
 +
 
 +
Por ejemplo, en nuestra vista tenemos el siguiente formulario:
  
 
<source lang="php">
 
<source lang="php">
 
<?php echo Form::open('formularios/prueba') ?>
 
<?php echo Form::open('formularios/prueba') ?>
   Nombre: <?php echo Form::text('nombre) ?>
+
   Nombre: <?php echo Form::text('nombre') ?>
 
</source>
 
</source>
  
Para que el texo '''Nombre:''' nos lo internacionalice lo habremos de escribir asi:
+
Para que el texto '''Nombre:''' nos lo internacionalice, lo habremos de escribir así:
  
 
<source lang="php">
 
<source lang="php">
 
<?php echo Form::open('formularios/prueba') ?>
 
<?php echo Form::open('formularios/prueba') ?>
   _("Nombre:") <?php echo Form::text('nombre) ?>
+
   <?php echo _("Nombre:") . Form::text('nombre') ?>
 
</source>
 
</source>
  
Con esto ya sabemos como tenemos que escribir los textos que queremos internacionalizar, otra cosa que hay que tener en cuenta es que deberemos crear (ahora explicare como) un archivo '''.po''' por cada idioma que queramos tener en nuestra aplicación, los códigos de idioma a utilizar son los que se definen en la norma ISO 639, por ejemplo, es (español), fr (francés); y que este ha de estar ubicado en la correspondiente carpeta de su idioma dentro de la aplicacion, por ejemplo si yo quiero que mi aplicacion se pueda mostrar en español y en ingles, la estructura sería esta:
+
Con esto, ya sabemos como tenemos que escribir los textos, que queremos internacionalizar. Otra cosa que hay que tener en cuenta, es que deberemos crear (ahora explicaré como) un archivo '''.po''', por cada idioma que queramos tener en nuestra aplicación.
 +
 
 +
Los '''códigos de idioma''' a utilizar para los nombres de las carpetas, son los que se definen en la norma [http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes '''ISO 639'''] seguido de un guión bajo y el código de país [http://www.iso.org/iso/english_country_names_and_code_elements '''ISO3166''']. Por ejemplo podríamos tener para tres países en los que se habla español pero tienen diferente cultura los siguientes códigos: es_ES(España), es_AR (Argentina) y es_UY(Uruguay).
 +
 
 +
Los '''códigos de idioma''' a utilizar para los nombres de los archivos, son los que se definen en la norma [http://www.iso.org/iso/english_country_names_and_code_elements '''ISO3166'''].
 +
 
 +
Has de tener ubicado, la correspondiente carpeta de su idioma, dentro de la aplicación en app/locale. Por ejemplo.
  
 
<pre>
 
<pre>
Línea 30: Línea 41:
 
             |-- LC_MESSAGES
 
             |-- LC_MESSAGES
 
                 |-- es.po
 
                 |-- es.po
         |-- en_EN
+
         |-- es_AR
 
             |-- LC_MESSAGES
 
             |-- LC_MESSAGES
                 |-- en.po
+
                 |-- ar.po
 +
        |-- es_UY
 +
            |-- LC_MESSAGES
 +
                |-- uy.po
 
|-- core
 
|-- core
 
</pre>
 
</pre>
  
= Generacion de los archivos .po =
+
= Generación de los archivos .po =
Para la generación de estos dos archivos utilizo el programa '''''poedit''''', el cual podemos descargar desde su pagina oficial: [http://www.poedit.net/download.php www.poedit.net], para que veas como funciona vamos a generar los archivos .po y el idioma ingles:
+
Para la generación de estos dos archivos, utilizo el programa '''''poedit'''''. Que podemos descargar desde su página oficial: [http://www.poedit.net/download.php www.poedit.net]. Para que veas como funciona, vamos a generar los archivos .po y el idioma inglés:
  
Abrimos el programa, en el menú superior seleccionamos '''''edicion->preferencias''''', en la ventana que se abre, nos vamos a la pestaña procesadores y seleccionamos PHP
+
Abrimos el programa, en el menú superior seleccionamos '''''edición->preferencias''''', en la ventana que se abre, nos vamos a la '''pestaña procesadores''' y seleccionamos '''PHP'''.
  
 
[[Archivo:po1.jpg]]
 
[[Archivo:po1.jpg]]
  
  
ahora pulsaremos '''''Editar''''', para indicarle las extensiones que usamos (que serán las que escanee el programa en busca de etiquetas _("xxx")), en nuestro caso le añadiremos '''''*.phtml'''''
+
Ahora pulsaremos '''''Editar''''', para indicarle las extensiones que usamos (que serán las que escanee el programa, en busca de etiquetas _("xxx")). En nuestro caso le añadiremos '''''*.phtml'''''
  
 
[[Archivo:po2.jpg]]
 
[[Archivo:po2.jpg]]
  
ahora en '''''Ejecución''''' añadiremos  '''''-L php'''''
+
Ahora en '''''Ejecución''''' añadiremos  '''''-L php'''''
  
 
[[Archivo:po3.jpg]]
 
[[Archivo:po3.jpg]]
  
con lo que la linea de comandos a a procesar nos quedaría como en el grafico de arriba, ahora pulsaremos en '''''Aceptar''''', y con esto ya le hemos dicho al poedit como ha de trabajar, el siguiente paso será la cración de catálogos (un catálogo por cada idioma de nuestra aplicación), para ello pulsaremos ''''' Archivo->Nuevo catálogo''''', en la pestaña '''''Información del proyecto''''' pondremos los datos correspondientes al idioma que estamos creando, en nuestro caso el ingles
+
Con lo que la linea de comandos a procesar, nos quedaría como en el gráfico de arriba. Ahora pulsaremos en '''''Aceptar''''', y con esto ya le hemos dicho al poedit como ha de trabajar. El siguiente paso será, la creación de catálogos (un catálogo por cada idioma de nuestra aplicación). Para ello pulsaremos ''''' Archivo->Nuevo catálogo''''', en la pestaña '''''Información del proyecto''''' pondremos los datos, correspondientes al idioma que estamos creando, en nuestro caso el inglés.
  
 
[[Archivo:Ejemplo.jpg]]
 
[[Archivo:Ejemplo.jpg]]
  
Luego vamos a la pestaña '''''Carpetas''''' y en '''''Directorio Raiz''''', pondremos la ruta completa a nuestra app, y debajo en '''''Carpetas''''', pondriamos las carpetas que queremos que nos escanee, pero mejor poner un '''''.''''' y así no se nos escapará ninguna
+
Luego vamos a la pestaña '''''Carpetas''''' y en '''''Directorio Raiz''''', pondremos la ruta completa a nuestra app, y debajo en '''''Carpetas''''', pondríamos las carpetas que queremos que nos escanee, pero mejor poner un '''''.''''' y así no se nos escapará ninguna.
  
 
[[Archivo:po5.jpg]]
 
[[Archivo:po5.jpg]]
  
Pulsamos en '''''Aceptar''''', ahora nos pedirá donde queremos guardar el archivo .po correspondiente, lo haremos dentro de locale, en la carpeta correspondiente al idioma que estemos creando, en este momento realizará el escaneo de los archivos en busca de todas las etiquetas con el formato '''''_("xxx")''''' que tengamos, y nos mostrará una pantalla como la siguiente, en la que estarán todos los textos encontrados.
+
Pulsamos en '''''Aceptar''''', ahora nos pedirá donde queremos guardar el archivo .po correspondiente. Lo haremos dentro de '''locale''', en la carpeta correspondiente al idioma que estemos creando. En este momento realizará el escaneo de los archivos, en busca de todas las etiquetas con el formato '''''_("xxx")''''' que tengamos, y nos mostrará una pantalla como la siguiente, en la que estarán todos los textos encontrados.
  
 
[[Archivo:po6.jpg]]
 
[[Archivo:po6.jpg]]
  
En el gráfico anterior nos muestra que ha encontrado las siguientes etiquetas: 'esto es la prueba numero DOS' y 'esto es la prueba numero UNO', ya que en la vista correspondiente está como:
+
En el gráfico anterior, nos muestra que ha encontrado las siguientes etiquetas: 'esto es la prueba numero DOS' y 'esto es la prueba numero UNO', ya que en la vista correspondiente está como:
  
 
<source lang="php">
 
<source lang="php">
Línea 71: Línea 85:
 
</source>
 
</source>
  
Ahora pulsaríamos '''''Aceptar''''' y ya tenemos nuestro archivo '''''.po''''' del idioma correspondiente y deberemos introducir las traducciones de las etiquetas correspondientes en é, ahora simplemente con cambiar el locale de nuestra aplicación nos la mostrara en el idioma seleccionado.
+
Ahora pulsaríamos '''''Aceptar''''' y ya tenemos nuestro archivo '''''.po''''' del idioma correspondiente. Y deberemos introducir, las traducciones de las etiquetas correspondientes en él. Ahora simplemente con cambiar el locale de nuestra aplicación, nos la mostrará en el idioma seleccionado.
  
 
= Como utilizar el archivo .po =
 
= Como utilizar el archivo .po =
  
Para que las etiquetas aparezcan traducidos habría que añadir el siguiente código en el aplication_controller, si quieres que este disponible en toda la aplicación o en el controlador que quieras usarlo
+
Para que las etiquetas aparezcan traducidas, habría que añadir el siguiente código en el aplication_controller (si quieres que este disponible en toda la aplicación) o en el controlador que quieras usarlo.
  
 
<source lang="php">
 
<source lang="php">
 
<?php
 
<?php
  $language="en_EN";
+
$language="en_EN"; // $language es el nombre de las carpetas que contienen la carpeta LC_MESSAGES. Adicionalmente $language puede tener el sufijo .utf-8 pero la carpeta llamarse en_EN
  putenv("LC_ALL=$language");
+
putenv("LC_ALL=$language");
  setlocale(LC_ALL, $language);
+
setlocale(LC_ALL, $language);
  bindtextdomain("messages", "./locale");
+
bindtextdomain("messages", APP_PATH . 'locale'); // messages es el nombre de los archivos .po y .mo
  textdomain("messages");
+
textdomain("messages"); // messages es el nombre de los archivos .po y .mo
 
?>
 
?>
 
</source>
 
</source>
  
'''''Nota:''''' El primer argumento de las funciones bindtextdomain y textdomain tiene que ser el nombre del archivo .po que se haya creado.
+
'''''Nota:''''' El primer argumento de las funciones bindtextdomain y textdomain, tiene que ser el nombre del archivo .po que se haya creado.
 +
 
 +
El ejemplo anterior nos mostrará la aplicación en ingles, y especifico que el archivo de traducciones se llama messages, con lo que tendria que tenerlo en la siguiente ruta: '''''/app/locale/en_EN/LC_MESSAGES/messages.po'''''.
 +
 
 +
Si quieres cambiar el idioma dinámicamente desde tu aplicación, tendrás que adecuar el código, para que la variable '''''$language''''', tome el idioma que te interese en cada momento.
 +
 
 +
Dependiendo del S.O. que usemos el locale nos puede venir de varias formas: en, en_EN, en_EN.utf8, en_EN@euro, etc...., com lo cual deberemos adaptar la variable '''''$language''''' del ejemplo anterior o especificarle varios locales y asi cogerá el primero que encuentre.
  
Ten en cuenta que con ese código nos lo mostraría en ingles, si quieres cambiarlo dinámicamente desde tu aplicación tendrás que adecuar el código, para que la variable '''''$language''''', tome el idioma que te interese en cada momento.
+
= Enlaces Externos=
 +
[http://cachi.temiga.org/2010/07/18/kumbiaphp-i18n-internacionalizacion/ KumbiaPHP + i18N Internacionalización]
  
 +
[http://matandotigres.org.ve/2010/07/17/internacionalizacion-i18n-basada-en-url-para-kumbiaphp/ Internacionalización (i18n) basada en URL para KumbiaPHP]
 
[[Categoría:Tutoriales KumbiaPHP]]
 
[[Categoría:Tutoriales KumbiaPHP]]

Revisión actual del 09:31 7 feb 2023

El objeto de este pequeño tutorial, es explicar como usar gettext para internacionalizar nuestras aplicaciones en KumbiaPHP.

Importante[editar]

Warning.pngPara que esta extesión funcione correctamente, se debe tener instalado en el servidor el programa locale.

Para Debian y derivados, (ejecutar como root):

 aptitude install locale 

Además, también debe estar disponible el lenguaje, al cual se quiere hacer la traducción.

 locale -a

Tutorial[editar]

Lo primero que debes tener presente, es que todos los textos que quieras mostrar en diferentes idiomas, los has de escribir en la vista de la siguiente forma: _("Texto a traducir").

Por ejemplo, en nuestra vista tenemos el siguiente formulario:

<?php echo Form::open('formularios/prueba') ?>
   Nombre: <?php echo Form::text('nombre') ?>

Para que el texto Nombre: nos lo internacionalice, lo habremos de escribir así:

<?php echo Form::open('formularios/prueba') ?>
   <?php echo _("Nombre:") . Form::text('nombre') ?>

Con esto, ya sabemos como tenemos que escribir los textos, que queremos internacionalizar. Otra cosa que hay que tener en cuenta, es que deberemos crear (ahora explicaré como) un archivo .po, por cada idioma que queramos tener en nuestra aplicación.

Los códigos de idioma a utilizar para los nombres de las carpetas, son los que se definen en la norma ISO 639 seguido de un guión bajo y el código de país ISO3166. Por ejemplo podríamos tener para tres países en los que se habla español pero tienen diferente cultura los siguientes códigos: es_ES(España), es_AR (Argentina) y es_UY(Uruguay).

Los códigos de idioma a utilizar para los nombres de los archivos, son los que se definen en la norma ISO3166.

Has de tener ubicado, la correspondiente carpeta de su idioma, dentro de la aplicación en app/locale. Por ejemplo.

kumbiaphp/
|-- app
    |-- locale
        |-- es_ES
            |-- LC_MESSAGES
                |-- es.po
        |-- es_AR
            |-- LC_MESSAGES
                |-- ar.po
        |-- es_UY
            |-- LC_MESSAGES
                |-- uy.po
|-- core

Generación de los archivos .po[editar]

Para la generación de estos dos archivos, utilizo el programa poedit. Que podemos descargar desde su página oficial: www.poedit.net. Para que veas como funciona, vamos a generar los archivos .po y el idioma inglés:

Abrimos el programa, en el menú superior seleccionamos edición->preferencias, en la ventana que se abre, nos vamos a la pestaña procesadores y seleccionamos PHP.

Po1.jpg


Ahora pulsaremos Editar, para indicarle las extensiones que usamos (que serán las que escanee el programa, en busca de etiquetas _("xxx")). En nuestro caso le añadiremos *.phtml

Po2.jpg

Ahora en Ejecución añadiremos -L php

Po3.jpg

Con lo que la linea de comandos a procesar, nos quedaría como en el gráfico de arriba. Ahora pulsaremos en Aceptar, y con esto ya le hemos dicho al poedit como ha de trabajar. El siguiente paso será, la creación de catálogos (un catálogo por cada idioma de nuestra aplicación). Para ello pulsaremos Archivo->Nuevo catálogo, en la pestaña Información del proyecto pondremos los datos, correspondientes al idioma que estamos creando, en nuestro caso el inglés.

Ejemplo.jpg

Luego vamos a la pestaña Carpetas y en Directorio Raiz, pondremos la ruta completa a nuestra app, y debajo en Carpetas, pondríamos las carpetas que queremos que nos escanee, pero mejor poner un . y así no se nos escapará ninguna.

Po5.jpg

Pulsamos en Aceptar, ahora nos pedirá donde queremos guardar el archivo .po correspondiente. Lo haremos dentro de locale, en la carpeta correspondiente al idioma que estemos creando. En este momento realizará el escaneo de los archivos, en busca de todas las etiquetas con el formato _("xxx") que tengamos, y nos mostrará una pantalla como la siguiente, en la que estarán todos los textos encontrados.

Po6.jpg

En el gráfico anterior, nos muestra que ha encontrado las siguientes etiquetas: 'esto es la prueba numero DOS' y 'esto es la prueba numero UNO', ya que en la vista correspondiente está como:

<h1> <?php echo _("esto es la prueba numero UNO") ?> </h1><br/>
<h1> <?php echo _("esto es la prueba numero DOS") ?></h1>

Ahora pulsaríamos Aceptar y ya tenemos nuestro archivo .po del idioma correspondiente. Y deberemos introducir, las traducciones de las etiquetas correspondientes en él. Ahora simplemente con cambiar el locale de nuestra aplicación, nos la mostrará en el idioma seleccionado.

Como utilizar el archivo .po[editar]

Para que las etiquetas aparezcan traducidas, habría que añadir el siguiente código en el aplication_controller (si quieres que este disponible en toda la aplicación) o en el controlador que quieras usarlo.

<?php
$language="en_EN";  // $language es el nombre de las carpetas que contienen la carpeta LC_MESSAGES. Adicionalmente $language puede tener el sufijo .utf-8 pero la carpeta llamarse en_EN
putenv("LC_ALL=$language");
setlocale(LC_ALL, $language);
bindtextdomain("messages", APP_PATH . 'locale');  // messages es el nombre de los archivos .po y .mo
textdomain("messages"); // messages es el nombre de los archivos .po y .mo
?>

Nota: El primer argumento de las funciones bindtextdomain y textdomain, tiene que ser el nombre del archivo .po que se haya creado.

El ejemplo anterior nos mostrará la aplicación en ingles, y especifico que el archivo de traducciones se llama messages, con lo que tendria que tenerlo en la siguiente ruta: /app/locale/en_EN/LC_MESSAGES/messages.po.

Si quieres cambiar el idioma dinámicamente desde tu aplicación, tendrás que adecuar el código, para que la variable $language, tome el idioma que te interese en cada momento.

Dependiendo del S.O. que usemos el locale nos puede venir de varias formas: en, en_EN, en_EN.utf8, en_EN@euro, etc...., com lo cual deberemos adaptar la variable $language del ejemplo anterior o especificarle varios locales y asi cogerá el primero que encuentre.

Enlaces Externos[editar]

KumbiaPHP + i18N Internacionalización

Internacionalización (i18n) basada en URL para KumbiaPHP