martes, 1 de diciembre de 2015

La solución multilenguaje en MyFamilyServer (Parte 1, el desarrollo)

Esta publicación es la continuación a
La solución multilenguaje en MyFamilyServer (Introducción)

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.
Paso primero: Como desarrollar.
Vamos a ir muy muy muy despacio.

Estamos de acuerdo en este ejemplo de hello world: (llámalo helloworld.html)
 
 <html>
    <head>
        <title>Hello World multi idioma</title>
    </head>
    <body>
        Ejemplo de multi idioma utilizado en MyFamilyServer
    </body>
</html>


Este ejemplo es un HTML que presenta en la pantalla la frase 'Ejemplo de multi idioma utilizado en MyFamilyServer'

Ahora vamos a construir el siguiente PHP (llamale helloworld.php)

<?php
    $html = '';
    $html = file_get_contents('helloworld.html');
    print $html;
?>


Si ejecutas el PHP tienes el mismo resultado que si ejecutas el HTML. 
El resultado es el mismo, pero ahora puedes tratar el HTML.
Vamos a modificar el helloworld.php:

<?php
    $html = '';
    $html = file_get_contents('helloworld.html');
    $html = str_replace('Ejemplo de multi idioma utilizado en MyFamilyServer',
            'MyFamilyServer multilanguage example', $html);
    print $html;
?>

 
 

En esta ocasión he remplazado un texto por otro. He mantenido el mismo HTML pero he remplazado un texto. Vamos a dar un pasito mas y reemplazar también el titulo:


<?php
    $html = '';
    $html = file_get_contents('helloworld.html');
    $html = str_replace('Hello World multi idioma',
            'Multi language Hello World', $html);
    $html = str_replace('Ejemplo de multi idioma utilizado en MyFamilyServer',
            'MyFamilyServer multilanguage example', $html);
    print $html;
?>


Esta es la idea, ahora vamos a ponerla en su sitio.

Para evitar posibles problemas, los textos en el HTML (que ahora se esta convirtiendo en una plantilla) se rodean por algún carácter para estar seguros que estamos sustituyendo realmente un texto, y no otra parte del HTML que coincide con una traducción. por ejemplo podéis utilizar ¬ (por ejemplo). En ese caso el HTML debe escribirse con un ¬ delante y detrás¬ de cada texto a ser sustituido. El HTML helloworld.html seria:

<html>
    <head>
        <title>¬Hello World multi idioma¬</title>
    </head>
    <body>
        ¬Ejemplo de multi idioma utilizado en MyFamilyServer¬
    </body>
</html>

 

y hay que tenerlo en cuenta en el PHP. El helloworld.php quedará:

<?php
    $html = '';
    $html = file_get_contents('helloworld.html');
    $html = str_replace('¬Hello World multi idioma¬',
            'Multi language Hello World', $html);
    $html = str_replace('¬Ejemplo de multi idioma utilizado en MyFamilyServer¬',
            'MyFamilyServer multilanguage example', $html);
    print $html;
?>


Hasta ahora bien, tenemos una plantilla HTML y sabemos como 'traducirla' a otro idioma, pero... el php se esta complicando, vamos a utilizar un diccionario sencillo, por ejemplo un fichero formato .ini (podría ser una base de datos, un json, un xml... pero en .ini es muy fácil de usar y va bien para el ejemplo) y vamos a mantener las traducciones en un fichero aparte.

Ejemplo de fichero de traducción, llamalo helloworld.ini

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


y he cambiado el helloworld.php para leer ficheros .ini

<?php
$fichero_traduccion = "helloworld.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);
    }
    print $html;
}
?>


El comando parse_ini_file genera una array que mantiene: primero el nombre de la plantilla que  se ha definido entre [] en el fichero ini, y para cada plantilla un identificador con el texto a traducir y un valor con la traducción.

Después de generar el array lo recorremos (con el foreach), para cada plantilla a traducir se realiza otro bucle que va reemplazando cada identificador por cada valor.

Este ejemplo esta completo, en el caso en MyFamilyServer, no se presenta en este momento (no se ejecuta un print), se almacena, (con el comando file_put_contents), de este modo las plantillas originales (master, con los simbolos ¬) generan nuevas plantillas en cada idioma antes (si antes) de la ejecución por parte del usuario.

Completo las explicaciones de grabación de plantillas en la siguiente entrada del blog.

(Usar ficheros .ini es muy sencillo, como veis, pero los ficheros .ini tienen algunas restricciones de uso de caracteres (como los paréntesis ()) y palabras que puedan tener significado (como true) en su interpretación, es bueno para el ejemplo, pero con cuidado)

No hay comentarios:

Publicar un comentario