entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Traducir una pagina web PHP

Hola muy buenos días a todos!

Tengo una duda a la hora de realizar una traducción de una pagina web a dos idiomas diferentes(Español y Catalán)

Lo que no pretendo es crear dos paginas para cada archivo de la web con sus respectivos textos traducidos, si no crear dos archivos los cuales tendrán la correspondiente traducción. Lo que he realizado hasta ahora ha sido crearme dos archivos PHP con los textos que contendrá la pagina web ya traducidos estos textos se llaman es.php y ca.php.

Cada uno de los archivos esta compuesto con una lista de:

define("T01","Marketing Directo");

Y en el lugar donde se quiera codificar según el idioma que sea pondrá:

<?php utf8_decode(T01)?>

Esto es lo que entiendo por lo que he leído por Internet, pero no consigo hacerlo funcionar.

pd: En todas las paginas de la web tendrán dos enlaces que según cual se seleccione traducirá la web al idioma seleccionado.

0voto

carlossevi comentado

Enlazo una buena respuesta en una pregunta muy relacionada:
http://entredesarrolladores.com/6218/pagina-multilenguaje-con-php?show=6222#a6222

0voto

pabeni comentado

Hola carlossevi, gracias por contestar.

Resulta que lo que necesito es hacerlo de la manera que pongo arriba, sin la necesidad de crear los archivos .mo y sin necesitar el poedit etc...

Espero su respuesta.

0voto

Gust4v0x comentado

¿Porqué necesitas hacerlo de esa manera? La manera más común y "estándar" de internacionalizar un sitio web (i18n) en PHP es hacerlo como indica el enlace.

0voto

pabeni comentado

Vale que sea la manera mas común etc....

Pero el motivo por el que necesito realizarlo de esa manera es por que estoy aprovechando dos archivos PHP(es.php y ca.php) que contienen ya el texto traducido y su contenido es de grandes dimensiones y supongo que de alguna manera desde la pagina principal me pueda cambiar la traducción de ese texto.

Gracias por contestar!

0voto

Gust4v0x comentado

Movido como respuesta

0voto

Leonardo-Tadei comentado

Hola @Gust4v0x,

si tenés 3 minutos, por favor poné este comentario como respuesta a la pregunta, así aparece como tal, y no como un comentario (así puee ser votada, seleccionada, etc). Si además podés editar el comentario de arriba para borrar el texto quedaría todo mucho más prolijo.
Saludos y gracias!

0voto

Gust4v0x comentado

Sí Leo, pero no me aparece la opción de marcar éste comentario como respuesta.

0voto

Leonardo-Tadei comentado

@Gust4v0x, la opción no aparece porque no existe. Lo que te decía es que copies este comentario y creés una respuesta nueva... hacerlo a mano, vamos. Luego, trates de editar el comentario para borrar el contenido y poner como texto "movido a respuesta" ;-)

2 Respuestas

3votos

Leonardo-Tadei Puntos227320

Hola @pabeni,

para resolver el tema de la internacionalización de esta manera, podés hacer lo siguiente:

1) creás los archivos con las cosntantes de cada lenguaje es.php y ca.php, Ambos archivos debe tener definidas exactamente las mismas constantes: lo que varriará será solo sus valores.

2) en los archivos de las páginas, en vez de escribir el texto, mostrás el valor de las constantes <?=T01?> o <?php print(T01); ?>. El primero usa un print inplícito, el segundo lo escribe. No tiene que hacer falta llamar a utf8_decode() si los archivos PHP están guardados en UTF-8 (hacerlo includo podría romper las cadenas por doble decodificación). De paso, y este es el error de tu código, la función utf8_decode() dcodifica pero no hace un print, y por eso no se ve la cadena en el navegador.

3) con una variable de sesión, mantenés el idioma actual, y usás este valor para saber que archivo de idiomas cargar:

session_start();
if( ! isset($_SESSION["lang"])) {
    $_SESSION["lang"] = 1; // si no hay valor de la sesión, pone un default
        include('es.php');
}
// lee el parámetro GET para ver si cambia de idioma
if( isset($_GET["ln"])) {
    switch($_GET["ln"]) {
        case 'Es':
            $_SESSION["lang"] = 1;
                        include('es.php');
            break;
        case 'Ca':
            $_SESSION["lang"] = 2;
                        include('ca.php');
            break;
    }
}
// según el valor de la sesion, carga el archivo correspondiente
switch($_SESSION["lang"]) {
    case 1:
        // está como default al principio
        break;
    case 2:
        $noticias='News';
        $att_nom="getNom_EN";
        $att_des="getDes_EN";
        $att_txt="getTxt_EN";
        $ultimas='Last news';
        break;
}

Si ponés este código al principio de cada página (con un include() para no repetirlo), tendrás cargado el archivo de idiomas correspondiente listo para ser usado como te indico en 2)

Saludos cordiales!

1voto

Gust4v0x Puntos910

index.php

<!doctype html>
<html>
    <head>
        <title></title>
    </head>
    <body>
        <div id="div-lang">

        </div>
        <main>
            <!-- Contenido de la web -->
        </main>
    </body>
</html>

lang.js

$(document).on("ready", function() {
    $("#lang-select").on("change", function() {

        ajaxProcess($(this).val());

        function ajaxProcess(lang) {

            $.ajax(
            {
                url: "translate.php",
                dataType: "json",
                data: JSON.parse( '{"lang": "'+lang+'"}' );
                type: "get"
            }
            )
            /* retorna algo como:
            Object {lang: "path/to/es.php"}
            #div-lang sería algo como
            <div id="div-lang">
            <?php require_once("path/to/es/ca.php"); ?>
            </div>
            */
            .done(function(data) {
                $("#div-lang").html('<?php require(data["lang"]); ?>');
                // refrescar solo el main y no toda la web si no se elimina el 'require...'
            })
            .fail( function() {
                alert("No se puede traducir la web");
            });
        }
    });
});

Aunque me inclino por la manera de @Leonardo-Tadei. Mucho más limpia.

0voto

pabeni comentado

Muchísimas gracias por contestar de verdad, esta noche probare las dos opciones que me habéis propuesto y en el momento que obtenga resultados os diré algo.

Un saludo!

0voto

pabeni comentado

Muchísimas gracias me ha funcionado a la perfección, estoy enormemente agradecido.

Un enorme saludo!

0voto

Gust4v0x comentado

Me alegro que hayas solucionado tu problema. Para mantener el orden, por favor marca tu respuesta correcta para que aparezca como solucionada en el foro. Un saludo.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta