Usuario:ManuelRomero/ProgramacionWeb/Docker/ejemplo

gettext
https://www.gnu.org/software/gettext/manual/gettext.html http://www.albertlanchas.com/articulos/internacionalizacion-php-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

Preparación de un docker para la práctica
docker run --name xxxx -t -i -v host_paht:continer:path ubuntu:latest
 * 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)
 * Cambiar los colores al hacer un ls de los directorios
 * A veces los colores que se ven al listar los ficheros y directorios no son los que más nos gustan, pero podemos adaptarlos modificando nuestro fichero de configuración de bash.
 * Son muchas las web donde podemos sacar esta información
 * También podemos dejar los colores como están

o
 * Cargamos el fichero de configuración


 * Actualizamos e instalamos apache2, php y el módulo de apache2 para intepretar código php:
 * Después levantamos el servicio

Instalación de la librería para gestionar idiomas
/etc/php/7.2/apache/php.ini y quitamos el comentario ; de la extensión gettext Para ver los idiomas que tengo actualmente instalados miramos con el comando Si queremos agregar nuevos idiomas ejecutamos la reconfiguración de los idiomas instalados 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
 * Para poder usar esta función debemos tener instalado el paquete de ubuntu identificado con el mismo nombre.
 * Fichero de configuración de php (En mi caso)
 * Yo me instalo previamente vim, por ser un editor que uso, se puede instalar y usaro otro editor como nano, pico
 * Reiniciamos servicio
 * Para instalar los idiomas
 * 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.

establecemos por defecto el es-ES-UTF8

Estructura de dierectorios
ii_PP
 * 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
 * Como ejemplo crearemos 3 idiomas (fr, en, es)
 * Se crean directorios con el nombre
 * 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

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
 * en lugar de ello escribiremos
 * 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

Creando los ficheros de texto
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
 * 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

Si ahora abrimos el fichero vemos su contenido
 * 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
 * Lo podemos copiar para cada uno de los idiomasel mismo fichero y escrimos su contenido

La página oficial https://poedit.net/
 * 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
 * O bien instalar el editor poedit, hay mas.

Funciones de gettext en php
(valores es_ES o fr_FR o en_US en nuestro caso) (valores es_ES o fr_FR o en_US en nuestro caso)
 * Como hemos comentado gettext permite internacionalizar una aplicación permitiendo adaptarlas a los valores establecidos para los difentes países
 * Se trata de establecer valores de entorno a variables que especifican el idioma/pais que qeremos usar
 * En función de ese valor iremos a buscar la traducción del texto al fichero establecido en el idioma seleccionado
 * Ahora debemos de usar unas funciones de php con el objetivo de establecer el valor de locale
 * Para ello vamos a usar una serie de funciones de php
 * putenv(String )
 * Establece la variable de entorno LC_ALL a la configuración regional concreta
 * En nuestro caso sería suficiente con establecer LANG.
 * setlocale(String)
 * Es parecida a puntenv, pero en este caso establecemos un valor para LC_ALL

Valores en nuestro caso messages para el nombre del fichero y locale para el nombre del directorio Establece el dominio para la librería gettext de php, similar a bindtextdomain
 * bindtextdomain
 * Establece la ruta del dominio. Es decir el nombre del fichero que contiene las traducciones de las cadenas, así como el directorio que lo contiene
 * No hay que especificar la extensión la cual ya está establecida mo (machine object)
 * textdomain


 * Otras funciones que pueden ser de interés


 * bind_textdomain_codeset
 * Especifica el juego de caracteres en que los mensajes del catálogo del dominio serán devueltos


 * 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