Propuestas de mejora a librería de traduccion web

Iniciado por Skeletron, 28 Junio 2013, 14:46 PM

0 Miembros y 1 Visitante están viendo este tema.

Skeletron

Hola gente!
Desde hace un tiempo que estoy pensando en hacer un framework para PHP para traducir sitios webs.
La idea es que, cada vez que el desarrollador quiere mostrar un texto que se tiene que traducir, llame una funcion, la cual buscará la traduccion de texto al idioma del usuario, e imprime ese texto.

Ejemplo:
Código (php) [Seleccionar]

<?php
echo traducir('Hola Mundo!');


Y que el resultado de eso dependa del usuario logueado.

No es dificil ver el idioma predeterminado del usuario, y todo eso... Lo complicado es DONDE GUARDAR los textos traducidos para que la funcion "traducir" los busque.

Lo que veo por todos lados, es algo de este estilo:
Código (php) [Seleccionar]

<?php

$traducciones 
= array(
       
'Hola Mundo!' => array('ingles' => 'Hello World!''frances'=>'No tengo ni idea!''portugues' => 'Tampo se!');
);

function 
traducir($texto){
       
$global $traduccinesIDIOMA_LOCAL;
       return 
$traducciones[IDIOMA_LOCAL]; //supongamos que IDIOMA_LOCAL es una variable/constante que tiene el idioma del usuario.
}


Ahora, los beneficios y las desventajas:
La forma planteada ahí arriba, es muy rapida ya que es acceso directo a un array que estará en memoria, pero el problema está en que cuando en el sitio comienza a haber muchos mas textos, y muy largos, (supongamos mas de 1.000.000 de caracteres), ese array comienza a ser TAN GRANDE que definirlo CADA VEZ que llega un request al servidor, me parece que se va a hacer muy muy poco optimo. Y tampoco puedo definir como CONSTANTE un array, ya que solo acepta valores enteros y strings... Igualmente, si se pudiese definir un array constante, el problema sigue estando.

Que alterntivas hay?
Veo 2 nomas:

* Combinar lo anterior para textos pequeños, fijos, que están en el sitio web, como es el ejemplo de los botones, menúes y demas. Y los textos grandisimos que crecen dinamicamente (supongamos, todos los post de este foro), guardarlos en la base de datos y buscarlos cada vez que hay que mostrarlos.
Esta idea tiene cosas buenas y cosas malas:
Lo bueno, es que se pueden añadir textos grandes de manera "infinita" (o hasta que te reviente el disco duro), y lo MALO es que la velocidad de acceso será LENTA (por tener que acceder a la base de datos), PERO (algo BUENO) siempre será la misma velocidad, estable. Lenta, pero estable.

* Por otro lado está la alternativa de usar MEMCACHE, con ésto se termina el problema de tener que re-definir el array cada vez que llega un request, pero tenemos el problema de que el tamaño limite maximo de texto es CORTO, ya que MEMCACHE utiliza la memoria RAM, y al llenarse la RAM, comienzan los problemas. No conozco mucho MEMCACHE, no se si se puede forzar a que haya variables que jamas se borren, y que al reiniciarse el servidor se auto-carguen nuevamente, y demas. Tampoco conozco mucho el rendimiento cuando se llena la ram. así que esta alternativa queda sin mucha información a causa de la falta de conocimiento de MEMCACHE.

Alguien quiere realizar algun aporte a esta idea?

Saludos!

AÑADO:
Recordar que la idea de realizar traduccinoes con Google Traduct mediante AJAX, no es buena idea, ya que afecta al SEO del sitio web.
Necesitamos que el texto ya llegue traducido al usuario, desde el servidor.

AÑADO:
Otro problema del tema de usar la base de datos, es que tenes que acceder MUCHISIMAS VECES a la base de datos para traer los textos, así que habría que hacer alguna alternativa para traer todos los textos de la DB al inicio y luego acceder a ellos ya en memoria.
Porque? Miren este ejemplo:

Código (php) [Seleccionar]

<?php
echo 'Un texto de prueba'.$valor_numerico.'Aca otro texto'.$otro_valor.'otra cosita mas';


Para algo como eso tendrías que hacer 3 accesos a la DB. Una locura.

[Case]

La traducción de texto es un problema muy dificil de resolver, no existe uno lo suficientemente bueno.

Ninguna de tus opciones es buena, por las siguientes razones:

- Tener un arreglo para guardar muchas variables no es para nada practico.
- Las bases de datos existen para resolver los problemas de tener una gran cantidad de información y acceder a ella lo mas rapido posible, por lo tanto su acceso no es muy lento.
Pero para poder "traducir" necesitas una muy buena base de datos, lo cual dudo que tengas.

PD 1: Tal vez Google en su api tiene funciones para hacer eso.
PD 2: En dado caso de que no, AJAX es tu mejor opcion.

Skeletron

Gracias por tu respuesta.
Algun otro aporte por ahí?

En cuanto al acceso a la DB, prueba tomar el tiempo que tarda en hacerse esto:

<?php
$foo = 2;
$bar = $foo;
?>
Y luego intenta ver cuanto tarda un acceso a datos con una base de datos cualquiera.

Hacer $foo = 2; puede tardar 0.000001 segundo, y un acceso a base de datos puede tardar 0.001, o sea, como 100 veces mas lento.

[Case]

#3
Eso es una simple asignacion de variables, no veo la comparacion bien.

No se bien como este implementada la funcion array de php, pero un arreglo teorico es un conjunto de memoria "continua" para poder tener un acceso rapido al valor deseado simplemente haciendo una operacion (una multiplicacion).

Obviamente el programa no funcionara cuando intentes hacer arrays inmensos, por que no encontraras memoria continua tan grande.

1mpuls0

En realidad no es tan sencillo como lo planteas.
Tendrías que tener una base de datos donde tengas las tablas de idiomas y palabras relacionadas entre si.

El problema aquí no es le tamaño, sino la traducción correcta del texto.

Tienes que realizar un analizador sintáctico, semántico y morfológico.

Saludos.
abc

Skeletron

Cita de: Darhius en  1 Julio 2013, 19:48 PM
En realidad no es tan sencillo como lo planteas.
Tendrías que tener una base de datos donde tengas las tablas de idiomas y palabras relacionadas entre si.

El problema aquí no es le tamaño, sino la traducción correcta del texto.

Tienes que realizar un analizador sintáctico, semántico y morfológico.

Saludos.

Darhius,
La traduccion no es problema. Hay herramientas que lo realizan solas.

Y no, no es tan dificil, ya lo he solucionado, y hasta he terminado el framework.

La solución fue:
Guardar todas las palabras traducidas en un tabla MyISAM, con los atributos: "id_frase", "frase", "idioma", y guardar en una tabla MEMMORY de MySQL a las frases mas consultadas.

Los ejemplos serían:

1.Hola.es
1.Hello.en
1.Ciao.it
2.Chau.es
2.Bye.en
2.blabla.it

Ya lo tengo listo. En menos de 1 semana lo publico en GitHUB

[Case]

En cuanto lo publiques nos avisas, yo quiero ver como lo solucionaste.

1mpuls0

#7
Eso no es una frase xD son palabras, eso si es fácil, por ejemplo como traduce esto tu fw?:
Hola, mi nombre es Juan Perez y me gusta programar!

Segun G va así: Hello, my name is Juan Perez and I like programming!

No entendí, en tu framework vas a utilizar herramientas para hacer la traducción?.

O será que tal vez no he comprendido.
Esperamos la publicación  ;)

Saludos.
abc

Skeletron

Exacto. Tengo acceso a la API de pago de Google Transtate, y a otras gratuitas.
Le envío la frase y me responde con la traduccion, segun el idioma que yo quiera.

Tengo mas de 50 idiomas disponibles.