Diferencia entre revisiones de «Usuario:ManuelRomero/ProgramacionWeb/php/multilenguaje»

De WikiEducator
Saltar a: navegación, buscar
(Creando los ficheros de texto)
(Instalación de la librería para gestionar idiomas)
 
(7 revisiones intermedias por el mismo usuario no mostrado)
Línea 2: Línea 2:
 
*Función en php que nos va a permitir tener nuestra página en varios lenguajes, lo que se llama internacionalizar nuestra aplicación de una forma profesional
 
*Función en php que nos va a permitir tener nuestra página en varios lenguajes, lo que se llama internacionalizar nuestra aplicación de una forma profesional
 
  https://www.gnu.org/software/gettext/manual/gettext.html
 
  https://www.gnu.org/software/gettext/manual/gettext.html
 +
http://www.albertlanchas.com/articulos/internacionalizacion-php-gettext
  
===Instalación ===
+
===Preparación de un docker para la práctica===
 +
*Vamos a usar un docker límpio con volumen para realizar esta práctica
 +
*De este modo repasaremos todos las herramientas que usamos habitualmente
 +
;Instalamos docker con un directorio común entre contenedor y anfitrión (previamente lo creamos en local)
 +
docker run --name xxxx -t -i -v host_paht:continer:path ubuntu:latest
 +
<source lang=bash>
 +
mkdir /var/www/idiomas1
 +
docker run --name idiomas1 -t -i -v /var/www/html/idiomas1:/var/www/idiomas1 ubuntu:latest
 +
</source>
 +
;Cambiar los colores al hacer un ls de los directorios
 +
*Editamos el ficheor .bashrc y agregamos la línea síguiente
 +
<source lang=bash>
 +
export PS1="\[$(tput setaf 1)\]\u@\h:\w $ \[$(tput sgr0)\]"
 +
</source>
 +
*Cargamos el fichero de configuración
 +
<source lang=bash>
 +
source .bashrc
 +
</source>
 +
o
 +
<source lang=bash>
 +
. .bashrc
 +
</source>
 +
 
 +
;Actualizamos e instalamos apache2, php y el módulo de apache2 para intepretar código php:
 +
*Después levantamos el servicio
 +
<source lang=bash>
 +
sudo apt-get update
 +
apt-get install apache2 php libapache2-mod-php
 +
service apache2 start
 +
</source>
 +
 
 +
===Instalación de la librería para gestionar idiomas ===
 
*Para poder usar esta función debemos tener instalado el  paquete de ubuntu identificado con el mismo nombre.
 
*Para poder usar esta función debemos tener instalado el  paquete de ubuntu identificado con el mismo nombre.
 
<source lang=bash>
 
<source lang=bash>
Línea 9: Línea 41:
 
</source>
 
</source>
 
*Fichero de  configuración de php (En mi caso)
 
*Fichero de  configuración de php (En mi caso)
  /etct/php/7.2/apache/php.ini
+
  /etc/php/7.2/apache/php.ini
y quitamos el comentario ''''';'''''  de la extensión ''''gettext'''''
+
y quitamos el comentario ''''';'''''  de la extensión '''''gettext'''''
 +
*Yo me instalo previamente '''''vim''''', por ser un editor que uso, se puede instalar y usaro otro editor como '''''nano''''', '''''pico'''''
 
<source lang=bash>
 
<source lang=bash>
 
....
 
....
Línea 26: Línea 59:
 
sudo apt-get install locales
 
sudo apt-get install locales
 
</source>
 
</source>
Para ver los idiomas que tengo actualemnte instalados miramos con el comando
+
Para ver los idiomas que tengo actualmente instalados miramos con el comando
 
<source lang=bash>
 
<source lang=bash>
 
locale -a
 
locale -a
Línea 36: Línea 69:
 
*Nos aparece una lista de los locales disponibles y seleccionamos los que nos interesen.
 
*Nos aparece una lista de los locales disponibles y seleccionamos los que nos interesen.
 
*Vamos a agregar el español utf-8, el francés y el inglés para nuestra práctica.
 
*Vamos a agregar el español utf-8, el francés y el inglés para nuestra práctica.
  son los códigos (los podemos ver en la lista) 158 182 233 respectivamente
+
  son los códigos (los podemos ver en la lista) 158 182 233 respectivamente o 149 174 y 225, depende de versiones instaladas, en cualquiercaso mirar la lista
 +
 
 
  establecemos por defecto el es-ES-UTF8
 
  establecemos por defecto el es-ES-UTF8
  
Línea 61: Línea 95:
 
*Para ello vamos lo que vamos a hacer, es en lugar de escribir la cadena de texto, para cada una de ellas vamos a usar un código de identificación que vamos a pasar a la función '''''gettext'''''.
 
*Para ello vamos lo que vamos a hacer, es en lugar de escribir la cadena de texto, para cada una de ellas vamos a usar un código de identificación que vamos a pasar a la función '''''gettext'''''.
 
*Por ejemplo si queremos poner un mensaje de bienvenida, querríamos escribir
 
*Por ejemplo si queremos poner un mensaje de bienvenida, querríamos escribir
<source lang=html>
+
<source lang=html5>
 
<h1>Bienvenido a este sitio web</h1>
 
<h1>Bienvenido a este sitio web</h1>
 
</source>
 
</source>
Línea 71: Línea 105:
 
*Alternativamente podemos usar el alias guión bajo '''''_''''' en lugar del nombre de la función '''''gettext''''', por comodidad
 
*Alternativamente podemos usar el alias guión bajo '''''_''''' en lugar del nombre de la función '''''gettext''''', por comodidad
 
*Escribamos una web con diferentes textos que posteriormente traduciremos
 
*Escribamos una web con diferentes textos que posteriormente traduciremos
<source lang=html>
+
<source lang=html5>
  
</source>
+
<!doctype html>
 +
<html lang="en">
 +
<head>
 +
    <meta charset="UTF-8">
 +
    <meta name="viewport"
 +
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
 +
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
 +
    <title><?php    echo _("WELLCOME") ?></title>
  
 +
</head>
 +
<body>
 +
<h1><title><?php    echo _("WELLCOME") ?></title></h1>
 +
<h2><title><?php    echo _("CHOOSE_LANGUAGE") ?></title></h2>
 +
<form action="index.php">
 +
 +
    <?php    echo _("NAME") ?><input type="text" name="nombre"><br />
 +
    <?php    echo _("PASS") ?><input type="text" name="pass"><br />
 +
    <input type="submit" value="<?php    echo _("LOGIN") ?>" >
 +
</form>
 +
</body>
 +
</html>
 +
</source>
  
 
===Creando los ficheros de texto===
 
===Creando los ficheros de texto===
 
*Creamos los ficheros con el texto en el idioma específico. Son ficheros de texto con extensión '''''po'''''
 
*Creamos los ficheros con el texto en el idioma específico. Son ficheros de texto con extensión '''''po'''''
*Ponemos el ejemplo de inglés
+
*En este fichero lo que vamos a tener es el código del mensaje y su texto.
 +
*Tendremos un fichero para cada idioma, de forma que según la configuración del idioma cojamos de un fichero u otro el texto que queremos que aparezca
 +
*Las claves de este fichero son
 +
'''''msgid'''''  para establecer el código que hayamos puesto
 +
'''''msgstr''''' para establecer el texto correspondiente a ese código en el idioma concreto que estemos estableciendo
 +
 
 +
*Para crearlo lo podemos hacer a mano, pero mejor es usar la herramienta '''''xgettext''''', con la que le decimos que extraiga
 +
*Para ello nos ubicamos en el directorio del idioma. El fichero ha de existir, por lo que previamente lo creamos, lo podemos hacer con una sola instrucción
 
<source lang=bash>
 
<source lang=bash>
#incluimos estas etiquetas vacías
+
touch messages.po | xgettext --language=PHP -j messages.po /var/www/idiomas/index.php
 +
</source>
 +
Si ahora abrimos el fichero vemos su contenido
 +
<source lang=php>
 +
# SOME DESCRIPTIVE TITLE.
 +
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 +
# This file is distributed under the same license as the PACKAGE package.
 +
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 +
#
 +
#, fuzzy
 
msgid ""
 
msgid ""
 
msgstr ""
 
msgstr ""
 
+
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2018-10-18 11:48+0100\n"
+
"Report-Msgid-Bugs-To: \n"
 +
"POT-Creation-Date: 2018-12-03 10:12+0100\n"
 +
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 +
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 +
"Language-Team: LANGUAGE <LL@li.org>\n"
 +
"Language: \n"
 
"MIME-Version: 1.0\n"
 
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
+
"Content-Type: text/plain; charset=CHARSET\n"
 
"Content-Transfer-Encoding: 8bit\n"
 
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
 
"Project-Id-Version: 0.1 \n"
 
"POT-Creation-Date:2018-10-18 11:48+0100\n"
 
"Last-Translator: \n"
 
"Language-Team: \n"
 
#mensaje de usuario
 
msgid "usuario"
 
msgstr "user"
 
  
#mensaje de pass
+
#: /var/www/idiomas/index.php:20 /var/www/idiomas/index.php:24
msgid "pass"
+
msgid "WELLCOME"
msgstr "password"
+
msgstr ""
  
#mensaje de saludo
+
#: /var/www/idiomas/index.php:25
msgid "saludo"
+
msgid "CHOOSE_LANGUAGE"
msgstr "welcome to this website"
+
msgstr ""
  
#mensaje de despedida
+
#: /var/www/idiomas/index.php:28
msgid "despedida"
+
msgid "NAME"
msgstr "We hope to see you soon on this page"
+
msgstr ""
 +
 
 +
#: /var/www/idiomas/index.php:29
 +
msgid "PASS"
 +
msgstr ""
 +
 
 +
#: /var/www/idiomas/index.php:30
 +
msgid "LOGIN"
 +
msgstr ""
 
</source>
 
</source>
 +
*Lo podemos copiar para cada uno de los idiomasel mismo fichero y escrimos su contenido
 +
</source>
 +
 
*El resto de ficheros cambiaría el '''''msgstr''''' correspondiente.
 
*El resto de ficheros cambiaría el '''''msgstr''''' correspondiente.
 
*Una herramienta a usar puede ser poedit (Hay varias, esta parece que tiene mucha aceptación)
 
*Una herramienta a usar puede ser poedit (Hay varias, esta parece que tiene mucha aceptación)

Última revisión de 07:21 5 mar 2019

gettext()

  • Función en php que nos va a permitir tener nuestra página en varios lenguajes, lo que se llama internacionalizar nuestra aplicación de una forma profesional
https://www.gnu.org/software/gettext/manual/gettext.html
http://www.albertlanchas.com/articulos/internacionalizacion-php-gettext

Preparación de un docker para la práctica

  • Vamos a usar un docker límpio con volumen para realizar esta práctica
  • De este modo repasaremos todos las herramientas que usamos habitualmente
Instalamos docker con un directorio común entre contenedor y anfitrión (previamente lo creamos en local)
docker run --name xxxx -t -i -v host_paht:continer:path ubuntu:latest
mkdir /var/www/idiomas1
docker run --name idiomas1 -t -i -v /var/www/html/idiomas1:/var/www/idiomas1 ubuntu:latest
Cambiar los colores al hacer un ls de los directorios
  • Editamos el ficheor .bashrc y agregamos la línea síguiente
 export PS1="\[$(tput setaf 1)\]\u@\h:\w $ \[$(tput sgr0)\]"
  • Cargamos el fichero de configuración
 source .bashrc

o

 . .bashrc
Actualizamos e instalamos apache2, php y el módulo de apache2 para intepretar código php
  • Después levantamos el servicio
 sudo apt-get update
 apt-get install apache2 php libapache2-mod-php
 service apache2 start

Instalación de la librería para gestionar idiomas

  • Para poder usar esta función debemos tener instalado el paquete de ubuntu identificado con el mismo nombre.
 apt-get install gettext
  • Fichero de configuración de php (En mi caso)
/etc/php/7.2/apache/php.ini

y quitamos el comentario ; de la extensión gettext

  • Yo me instalo previamente vim, por ser un editor que uso, se puede instalar y usaro otro editor como nano, pico
....
;extension=gd2
extension=gettext
;extension=gmp
....
  • Reiniciamos servicio
sudo service apache2 restart
Para instalar los idiomas
sudo apt-get install locales

Para ver los idiomas que tengo actualmente instalados miramos con el comando

locale -a

Si queremos agregar nuevos idiomas ejecutamos la reconfiguración de los idiomas instalados

# dpkg-reconfigure locales
  • Nos aparece una lista de los locales disponibles y seleccionamos los que nos interesen.
  • Vamos a agregar el español utf-8, el francés y el inglés para nuestra práctica.
son los códigos (los podemos ver en la lista) 158 182 233 respectivamente o 149 174 y 225, depende de versiones instaladas, en cualquiercaso mirar la lista
establecemos por defecto el es-ES-UTF8

Estructura de dierectorios

  • Se trata de tener un directorio por cada idioma que queramos hacer traducir
  • En concreto estableceremos los directorios de configuraciones regionales.
  • Estos directorios se espera bajo locale
  • Los nombres de cada directorio de cada idioma a de ser un nombre estandarizado
  • Debemos usar las abreviaturas de las dos letras minúsculas del idioma según la especificación ISO-639-1, seguido de un guión bajo, seguido de las dos letras en mayúscula que corresponderán al código del país según la especificación ISO-3166-1.
  • Podemos obtener una lista de las localizaciones instaladas en nuestro sistema
 locale -a
  • Como ejemplo crearemos 3 idiomas (fr, en, es)
  • Se crean directorios con el nombre
ii_PP
  • ii son dos letras para especificar el idioma de acuerdo a la especificación ISO-639-1
  • PP son dos letras en mayúsculas correspondinetes al país según la especificación ISO-3166-1
  • Dentro de cada directorio crearemos el directorio LC_MESSAGES

Dir idiomas.png

Escribiendo el fichero del proyecto

  • Ahora vamos a ver cómo establecemos en el proyecto las cadenas que queremos traducir
  • Para ello vamos lo que vamos a hacer, es en lugar de escribir la cadena de texto, para cada una de ellas vamos a usar un código de identificación que vamos a pasar a la función gettext.
  • Por ejemplo si queremos poner un mensaje de bienvenida, querríamos escribir
<h1>Bienvenido a este sitio web</h1>
  • en lugar de ello escribiremos
<h1><?php echo gettext("WELLCOME"") ?></h1>
  • El código del mensaje es WELLCOME, por supuesto es un código elegido por nosotros, podemos poner lo que queramos, de lo que se trata, es que ya no escribiremos texto, si no códigos
  • Alternativamente podemos usar el alias guión bajo _ en lugar del nombre de la función gettext, por comodidad
  • Escribamos una web con diferentes textos que posteriormente traduciremos
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title><?php    echo _("WELLCOME") ?></title>
 
</head>
<body>
<h1><title><?php    echo _("WELLCOME") ?></title></h1>
<h2><title><?php    echo _("CHOOSE_LANGUAGE") ?></title></h2>
<form action="index.php">
 
    <?php    echo _("NAME") ?><input type="text" name="nombre"><br />
    <?php    echo _("PASS") ?><input type="text" name="pass"><br />
    <input type="submit" value="<?php    echo _("LOGIN") ?>" >
</form>
</body>
</html>

Creando los ficheros de texto

  • Creamos los ficheros con el texto en el idioma específico. Son ficheros de texto con extensión po
  • En este fichero lo que vamos a tener es el código del mensaje y su texto.
  • Tendremos un fichero para cada idioma, de forma que según la configuración del idioma cojamos de un fichero u otro el texto que queremos que aparezca
  • Las claves de este fichero son
msgid  para establecer el código que hayamos puesto
msgstr para establecer el texto correspondiente a ese código en el idioma concreto que estemos estableciendo
  • Para crearlo lo podemos hacer a mano, pero mejor es usar la herramienta xgettext, con la que le decimos que extraiga
  • Para ello nos ubicamos en el directorio del idioma. El fichero ha de existir, por lo que previamente lo creamos, lo podemos hacer con una sola instrucción
touch messages.po | xgettext --language=PHP -j messages.po /var/www/idiomas/index.php

Si ahora abrimos el fichero vemos su contenido

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-12-03 10:12+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
 
#: /var/www/idiomas/index.php:20 /var/www/idiomas/index.php:24
msgid "WELLCOME"
msgstr ""
 
#: /var/www/idiomas/index.php:25
msgid "CHOOSE_LANGUAGE"
msgstr ""
 
#: /var/www/idiomas/index.php:28
msgid "NAME"
msgstr ""
 
#: /var/www/idiomas/index.php:29
msgid "PASS"
msgstr ""
 
#: /var/www/idiomas/index.php:30
msgid "LOGIN"
msgstr ""
  • Lo podemos copiar para cada uno de los idiomasel mismo fichero y escrimos su contenido

</source>

  • El resto de ficheros cambiaría el msgstr correspondiente.
  • Una herramienta a usar puede ser poedit (Hay varias, esta parece que tiene mucha aceptación)
  • Ahora debemos generar el fichero mo (Machine Object) a partir del po (Portable Object)
  • Para ello podemos ejecutar
 msgfmt -o fichero.mo fichero.po
  • O bien instalar el editor poedit, hay mas.
 apt-get install poedit

La página oficial

https://poedit.net/

Funciones a usar para traducir

bind_textdomain_codeset
Especifica el juego de caracteres en que los mensajes del catálogo del dominio serán devueltos
bindtextdomain
Establece la ruta del dominio
dcgettext
Sobrescribe el dominio de la búsqueda única del mensaje
dcngettext
Versión plural de dcgettext
dgettext
Sobrescribe el dominio actual
dngettext
Versión plural de dgettext
gettext
Consultar un mensaje en el dominio actual
ngettext
Versión plural de gettext
textdomain
Establece el dominio actual

Instalar el idioma

https://es.stackoverflow.com/questions/98786/gettext-no-realiza-las-traducciones-en-web-php