miércoles, 2 de diciembre de 2015

La solución multilenguaje en MyFamilyServer (Parte 2, generación de plantillas)

Esta publicación es la continuación a
La solución multi lenguaje en MyFamilyServer (Parte 1, el desarrollo)

Decíamos :
El proceso consta de tres pasos:
  • Como proceder en el momento del desarrollo.
  • Que ocurre en el momento de generar la traducción.
  • Que ocurre en ejecución.
En el paso anterior (mo desarrollar) hemos ido muy despacio hasta tener un  fichero .ini para la traducción, una (o mas plantillas .html) y un proceso .php que es capaz de leer el fichero de traducción y traducir las plantillas.
Ahora vamos a pensar como hacer esto antes de la ejecución, en un proceso previo de traducción.

La idea general en un desarrollo MVC, es tener bien estructurados (y separados) los componentes, en el caso de la Vista, esta dividida en varias partes, una la lógica de la vista, otra los diccionarios, otra las plantillas...  De hecho, lo normal es que todas las plantillas para generar las futuras pantallas este en una carpeta 'html'. 
En el caso de MyFamilyServerV2, efectivamente todas las plantillas están en su carpeta html (y dentro en otras carpetas por funcionalidad). 
El primer nivel en la carpeta html es el idioma. 
Para el ejemplo que queremos realizar ahora, debes crear una carpeta (llamada Master por ejemplo) donde creas las plantillas. En esa carpeta, a partir de ahora, siempre creas y modificas las plantillas .El proceso de traducción realizará una copia entera de la carpeta Master en el idioma a traducir y realizará la traducción.

En la carpeta Master (html/Master/) dejas el .html del ejemplo anterior y uno nuevo. (por ejemplo este: y le pones de nombre bye.html)

<html>
    <head>
        <title>¬Bye multi idioma¬</title>
    </head>
    <body>
        ¬Otro ejemplo multi idioma utilizado de MyFamilyServer¬
    </body>
</html> 


(Ahora en la carpeta html/Master/ tienes dos plantillas .html -helloworld.html y bye.html)

En el diccionario (fichero .ini) incorporas las traducciones para esta otra plantilla:

[html/Master/helloworld.html]
Hello World multi idioma = Multi language Hello World
Ejemplo de multi idioma utilizado en MyFamilyServer = MyFamilyServer multilanguage example


[html/Master/bye.html]
Bye multi idioma = Bye Multi language
Otro ejemplo multi idioma utilizado de MyFamilyServer = Another example of Multi language in MyFamilyServer

 

Y le cambias el nombre al fichero. Llamale 'hellowold_En.ini' ya que este va ser el fichero para traducir a Ingles.
Fijate que, en el fichero de traducción, he cambiado la ruta de los archivos .html , ahora el nombre de cada plantilla incorpora su ruta.

El proceso a realizar consiste en copiar toda la carpeta Master a una nueva de cada uno de los idiomas que quieres realizar y a continuación la traducción.
Para copiar el árbol he utilizado esta función: (que debes incorporar a tu fichero helloworld.php)

 function copiarArbol($origen, $destino) {
    # creo el destino
    mkdir($destino, 0777);
    chmod($destino, 0777);

    $directorio = opendir($origen);
    while ($fichero = readdir($directorio)) {
        if ($fichero == '.' || $fichero == '..')
            continue;
        if (is_dir($origen . '/' . $fichero)) {
            if (!is_dir($destino . '/' . $fichero)) {
                mkdir($destino . '/' . $fichero, 0777);
                chmod($destino . '/' . $fichero, 0777);
            }
            copiarArbol($origen . '/' . $fichero, $destino . '/' . $fichero);
        } else {
            if (strrchr($fichero, '.') != '.db') {
                copy($origen . '/' . $fichero, $destino . '/' . $fichero);
                chmod($destino . '/' . $fichero, 0777);
            }
        }
    }
    closedir($directorio);
    return 1;
}


En el hellowold.php se incorpora la llamada a copiarArbol y las variables necesarias para poder hacer multiples idiomas:
Así queda ahora helloworld.php:

<?php

function copiarArbol($origen, $destino) {
    # creo el destino
    mkdir($destino, 0777);
    chmod($destino, 0777);

    $directorio = opendir($origen);
    while ($fichero = readdir($directorio)) {
        if ($fichero == '.' || $fichero == '..')
            continue;
        if (is_dir($origen . '/' . $fichero)) {
            if (!is_dir($destino . '/' . $fichero)) {
                mkdir($destino . '/' . $fichero, 0777);
                chmod($destino . '/' . $fichero, 0777);
            }
            copiarArbol($origen . '/' . $fichero, $destino . '/' . $fichero);
        } else {
            if (strrchr($fichero, '.') != '.db') {
                copy($origen . '/' . $fichero, $destino . '/' . $fichero);
                chmod($destino . '/' . $fichero, 0777);
            }
        }
    }
    closedir($directorio);
    return 1;
}

# inicio del programa
$idioma = 'En';
$origen = 'html/Master/';
$destino = 'html/' . $idioma . '/';

if (copiarArbol($origen, $destino)) {
    # la copia de arbol ha ido bien
    $fichero_traduccion = "helloworld_" . $idioma . ".ini";

    $traductor = parse_ini_file($fichero_traduccion, true);
    foreach ($traductor as $fichero => $campos) {
        # recuperamos la plantilla a traducir
        $html = file_get_contents($fichero);
        # El diccionario es la relacion identificador -> dato
        foreach ($campos as $campo => $valor) {
            # sustituimos los textos entre ¬ ¬ por los textos traducidos
            $html = str_replace('¬' . $campo . '¬', $valor, $html);
        }
        $ficheroSalida = str_replace('Master', $idioma, $fichero);
        file_put_contents($ficheroSalida, $html);
    }
    Print "Se han generado las plantillas en idioma -".$idioma."- correctamente";
} else {
    # Ha fallado la copia de arbol (revisa permisos o como has definido las rutas)
    Print " Ha fallado la copia de arbol (revisa permisos o como has definido las rutas)";
}
?>

 

Genial!! ya tienes tu traductor y tus plantillas preparadas. Vamos a preparar otro idioma veras que fácil es:

Vamos a traducir a Español.

Primero: Generar el diccionario para Español.  Copia helloworld_En.ini a hellowold_Es.ini.
A continuación: Traduce los textos al español: (en hellowold_Es.ini).

[html/Master/helloworld.html]
Hello World multi idioma = Hola Mundo Multi Idioma
Ejemplo de multi idioma utilizado en MyFamilyServer = Ejemplo de Multi Idioma de MyFamilyServer

[html/Master/bye.html]
Bye multi idioma = Adios Multi Idioma
Otro ejemplo multi idioma utilizado de MyFamilyServer = Otro ejemplo Multi Idioma de MyFamilyServer


Y finalmente ejecuta tu programa de traducción (helloworld.php) con la variable $idioma="Es"
Veras que por cada idioma se ha generado una nueva carpeta dentro de la carpeta html/, con el código del idioma y las plantillas traducidas dentro.

¡¡¡ Fantastico !!!

Resumiendo.
El programa esta compuesto de un fichero.php para la ejecución del proceso y tantos ficheros .ini como necesites para traducción.

En la raíz de tu proyecto dejas el helloworld.php y los ficheros helloworld_Es.ini, helloworld_En.ini y tantos otros como idiomas necesites.
En el directorio html/Master generas las plantillas .html que necesites para la traducción. En estas plantillas los textos deben estar rodeados por el símbolo ¬ .
Al ejecutarse el programa se creara un directorio en html/ con el valor de la variable $idioma y se copiarán y traducirán las plantillas según los textos preparados en el fichero .ini con ese código de idioma en el nombre.

Todos los cambios que quieras hacer los realizaras solo en los ficheros .html 'master' y estos se propagaran a todos los idiomas con la ejecución del proceso de traducción.

Muy bien, en el siguiente post te explico como se selecciona el idioma en MyFamilyServer y como se selecciona el conjunto de plantillas de cada idioma.

No hay comentarios:

Publicar un comentario