Web con multilenguaje

kraneok

Hola que tal gente, hoy vengo con una dudilla bastante tocha quizás.

Un cliente me ha pedido una web en tres idiomas.
¿ Como se puede hacer ?

¿ Base de datos con campos por lengua ?
¿ Traducción cutre de Google ?
¿ .. ?

Espero que podáis echarme una manilla.
Gracias

1
MegalomaniaC

Hombre, las opciones son:

1) Traducir la web en los 3 idiomas, haciendo 3 webs distintas (3 carpetas, es eng y fr por ejemplo) y pones que la main sea en español, y luego las tipicas banderitas o los idiomas en el header o donde quieras, y si le clica ahi pues se carga la carpeta con el idioma y ya esta. Esto es lo que hace la gran mayoria de gente.

2) Mas sofisticado es hacer un index normal, y como dices en una BBDD meter todo el texto, en funcion del idioma seleccionado carga unos u otros (tabla ES, tabla ENG, tabla FR, etc.), es basicamente lo de la opcion 1) pero con BBDD, engorroso o no, pues es igual, es mas comodo hacer 3 carpetas con 3 webs enteras, pero claro si las webs son muy gordas puede ocupar mucho...

3) Y para mi la mas ordenada que se me ocurre:

  • Te montas un index que mediante script vea de donde es el cliente. En una BBDD metes todo el texto y carga en funcion de campos. Luego el script carga en funcion de la localizacion una tabla con el idioma u otra, por ejemplo te metes desde españa pues carga el ES, desde francia pues el FR, y luego desde cualquier otro lado o inglaterra pues el ENG.

Esto no es dificil pero es lo mas costoso, claro, eso tendras que valorarlo en funcion de lo que te van a pagar.

Yo como dev de webs tambien, normalmente te pagan poco o menos por traducir, asi que montas lo tipico de las banderitas para clicar y que cargue otra web en otro idioma y pista.

2 respuestas
kraneok

#2 Se podrían crear vistas por cada lenguaje extrayendo los campos necesarios.

1 respuesta
MegalomaniaC

#3 Claro, pero tienes que considerar todo, menuda BBDD te curras como sea una web grande xD

1 respuesta
babri

yo lo que tengo hecho es todos los textos en varios idiomas con una referencia a que idioma es. Y con una variable global cargo el idioma y con una funcion llamo a los textos segun el idioma previamente cargado. Vamos que no tengo texto literales en ningun tramo de la web.

1 2 respuestas
kraneok

#4 Es una web con tienda incorporada. La verdad que si, que la base de datos sería tocha.
Y la verdad, no sé ni que cobrarle, se me escapa ese plus.

1 respuesta
MegalomaniaC

#6 Calculalo por horas que crees que te lleve hacer la BBDD. Son muchas, claro esta.

#5 A eso me refiero con la 3ª opcion, que cargue en funcion de un script que se lo diga y que en las tablas este todo.

kraneok

#5 Pero explícate un poco mas.
¿ Donde tienes los texto guardados ?

1 respuesta
Mc_KaPPeR

Puedes hacer un fichero de php por cada idioma con los textos definidos en constantes y luego cargas el que toque

babri

#8 imaginate una sección que en plan titulo y contenido todo textos pues seria así:

titulo: prueba1
contenido: xxxxxxx
idioma: 1

titulo: prueba2
contenido: xxxxxxx
idioma: 2

Entonces en las banderitas lo unico que hago es meter en la variable global el id del idioma que es 1, 2 o el que sea, entonces con una función que llame idioma lo unico que hago es sacar los textos segun lo que haya en la variable.

1 respuesta
kraneok

#10 Con jquery por ejemplo vas ocultando o haciendo visible las cajas no?

1 respuesta
babri

#11 creo esta funcion

<?php

function idioma($codigo_texto)
{
	$id_idioma = bdd_functions_obtener_valor_condicion( "sys_idioma", "id_idioma", "codigo_idioma ='".$_SESSION["idioma"]."'" );
	$texto_idioma = bdd_functions_obtener_valor_condicion( "sys_texto_idioma", "texto_idioma", "fk_codigo_idioma ='".$id_idioma."' and titulo_texto='".$codigo_texto."'");
	return $texto_idioma;
}

function cambiar_idioma($cod_idioma)
{
	$_SESSION["idioma"] = $cod_idioma;
	header("Location:".$_SERVER['HTTP_REFERER']);
}

?>

Y en donde va el texto llamo al texto que quiero poner:

<?php echo idioma("noDatosBusqueda"); ?>

Como en la tabla ya tengo los textos con el mismo nombre pero con distitnto idioma pues el se encarga de poner el que debe.

Lo malo es que duplicas un pelin XD

1 respuesta
kraneok

#12 Vale ya entiendo. Pues voy a empezar a sopesar a ver que conviene y ya le dire al tio este a ver si quiere pagar o no xDDD

1 respuesta
babri

#13 ademas le tengo hasta imgenes en inglés separadas en dos carpetas que las selecciono así:

if($_SESSION["idioma"]=="es"){
				$carpetaBoton = "img";
			}else{
				$carpetaBoton = "imgEN";
			}
			?>
RaymaN

Te recomiendo que uses la función gettext. Más rápido, cómodo y limpio que guardar el texto en un array o BD.

2
B

Estás utilizando algun framework?

Murd0ck

te has planteado usar algún CMS tipo WordPress? plugin qTranslate y arreglado

1 1 respuesta
KoRMuZ

Otra opción es crear diversos archivos de idioma, véase XML por ejemplo, y según el idioma cargas el que tengas que cargar, como si fueran una especie de "defines".

Cuando quieras meter otro idioma, coges el archivo y lo traduces.

1 respuesta
Wasd

Como dice #18, algo así es idóneo para tratar con literales. Luego para las descripciones de los productos necesitarás algún que otro campo extra en la BD. Más allá de eso no le veo gran complicación.

Lo complicado puede venir si lo que quieres es que se traduzca solo, supongo que ahí ya tendrás que tratar con API's.

Yo metería los menos textos posibles en la BD, todo aquello que es estático en la web, en ficheros de literales.

Alguna vez me he encontrado con alguna web que estaba maquetada pero sin textos, y al medio segundo aprox aparecían de golpe, presupongo que eso es porque se estaban trayendo de la BD, horrible.

Thanat0s

Yo no tiraría de bbdd, sino de archivos de idioma como te han dicho, pero para cosas generales.

Si tienes una bbdd con productos a los que quieres traducir el nombre, lo que haría es meter campos nuevos con el nombre del producto en los nuevos idiomas.

2
B

#2 no veo factible la 3era opcion, mas que nada porque en todos los paises hay extranjeros. Aun asi es una buena idea

1 respuesta
MegalomaniaC

#21 Entonces que lo saque por navegador o idioma del sistema operativo xD

#17 Y cuando quieres meter un CMS en paginas completamente tuyas y te tienes que pegar con los modulos de WP, casi te sale mejor hacer uno tu que te cuesta menos tiempo.

kraneok

Voy a crear una base de datos orientada al multilenguaje y au.
Así ya la tengo para la próxima vez. xDD

1 respuesta
pdj

una bd para multiidioma lo veo un overkill MUY serio y ganas de perder tiempo y dinero. Te haces el fichero "base" strings_esES o lo que sea y copy & paste + traducción por idioma. Luego una funcioncita getText(string text, string locale) y a volar, easy and fast... no te compliques y menos para eso.

En que lo vas a programar? quizás tenga ya algo hecho y te pueda orientar.

1 respuesta
neil90

http://www.php.net/manual/en/book.gettext.php
http://www.php.net/manual/en/book.intl.php
http://www.yiiframework.com/doc/guide/1.1/es/topics.i18n

Te recomiendo que no lo hagas tan "a mano" cuando hay múltiples formas ya implementadas en frameworks y en el propio PHP.

kraneok

#24 El problema es que tiene artículos para vender, obviamente no vas a crear un fichero con todas las descripciones en todos los lenguajes, entonces cuando el tio inserte mas artículos le digo que tiene que escribir el fichero a mano?.
No sería mas útil y usable poner tres textareas por cada idioma y almacenarlo?

1 respuesta
T

#26 No, cuando inserta un nuevo artículo supongo que no le harás modificar la bbdd a mano sino que tendrás una parte de adsministardor en la web que te permita hacer esto y te lleve a un formulario. Allí puedes modificar los ficheros que toquen.

1 respuesta
kraneok

#27 Cierto, pero me parece peor un fichero que una base de datos. Puedo estar equivocado por supuesto.

2 respuestas
KoRMuZ

Un fichero con las traducciones es lo ideal para LA WEB. Todo el texto que sea dinámico obviamente no lo va a cargar de un fichero, para eso está la base de datos.

Pero si tienes la pagina de producto en 18 idiomas, es más facil hacer 18 txts y que con "string_product_page_description" a cada uno le meta el valor que quieras, y luego simplemente lees la linea de "string_product_page_description" del archivo es_ES.xml.

Y respecto a los productos, da igual en cuantos idiomas tengas la página, te va a costar lo mismo traer la descripción en inglés que la española que la eslovaca leyendo desde una base de datos.

En resumen, #28. Texto de maquetación, por decirlo así, de un fichero. Texto dinámico, desde la base de datos

1 2 respuestas
T

#28 Lo que ha dicho #29 parece ser los más efectivo.

También piensa que cuando consultas la tabla solo te ineteresa coger la descripción en un idioma.

Otra cosa es que si ves que la tabla de productos crece de manera desmesurada puede que te interese hacer una tabla en la bbdd por cada idioma que contenga solo la descipricón y una referencia a al id del producto. Esto te permite además añadir de manera sencilla un nuevo idioma.