2010-09-26 19 views
6

Facebook tiene este enfoque único e inteligente para la localización de su sitio: los traductores (en su caso los usuarios que ayudan a traducir el sitio voluntariamente) pueden simplemente hacer clic en las cadenas aún no traducidas - que están marcados con un borde inferior verde, en su contexto natural en el sitio. Ver http://www.facebook.com/translations/.Open Source Projects para i18n a la Facebook

Ahora, si alguna vez tuvo que lidiar con la traducción de un sitio web, sabrá cuán extrañas y divertidas son algunas de estas traducciones cuando se utilizan herramientas como poedit, donde el traductor no está completamente al tanto el lugar donde aparece la cadena traducida aparecerá en el sitio web.

Ejemplo: Traducir "Inicio". En alemán, por ejemplo, la página de inicio de un sitio web sería "Casa", mientras que la casa donde vive es "Heim". Ahora, usted como traductor básicamente tiene que adivinar en qué contexto es probable que aparezca este término en el sitio web y traducir en consecuencia. Lo más probable es que su nuevo sitio web sobre muebles para el hogar ahora se traduce como "Home-Einrichtung", que suena ridículo para cualquier alemán.

Por lo tanto, mi pregunta se reduce a:

¿Conoce a algún proyecto de código abierto PHP que trabajan en algo como esto? Básicamente, estoy buscando un marco que te permita poner tu sitio web internacionalizado en "modo de traducción" y hacer que las cadenas puedan clicarse y traducirse, p. a través de un modal de Javascript.

No estoy buscando tanto una solución hecha y derecha, pero me encantaría saber acerca de proyectos similares a los que puedo contribuir con el código.

¡Gracias de antemano!

+0

¡Esta es una gran pregunta y probablemente será cada vez más relevante a medida que los sitios web se vuelvan cada vez más globales! – Ryan

Respuesta

1

Si desea hacer su propia versión con jquery & jquery browserLanguage, esto podría ayudarle.

Etiquetar todos los textos traducibles que contengan elementos con class="i18n", e incluir jquery, jquery browserLanguage y su secuencia de comandos i18n.

. la internacionalización Javascript

- esto tiene que aceptar traducciones a través de Ajax desde su servidor, como:

var i18n = {}; 
i18n.bank = new Array(); 
i18n.t = function (text, tl=$.browserLanguage) { 
    var r = false; 
    $.ajax({ 
     url: "/i18n_t.php?type=request&from="+ escape(text) +"&tl="+ tl, 
     success: function(){ i18n.bank[text] = this; r = true; } 
    }); 
    return r; 
}; 

. php servicio de traducción i18n

- ahora tenemos que servir hasta traducciones, y aceptarlos

la base de datos se verá como un montón de mesas, una para cada idioma.

// SCHEMA for each language: 
CREATE TABLE `en` 
(
`id` INT PRIMARY KEY AUTO INCREMENT NOT NULL, 
`from` VARCHAR(500) NOT NULL, 
`to` VARCHAR(500) NOT NULL 
) 

php necesitarán alguna conexión y manipulación de db ..por ahora esto puede hacer:

//Connect to the database 
$connection = mysql_connect('host (usually localhost)', 'mysql_username' , 'mysql_password'); 
$selection = mysql_select_db('mysql_database', $connection); 

function table_exists($tablename, $database = false) { 
    if(!$database) { 
     $res = mysql_query("SELECT DATABASE()"); 
     $database = mysql_result($res, 0); 
    } 

    $res = mysql_query("SELECT COUNT(*) AS count FROM information_schema.tables WHERE table_schema = '$database' AND table_name = '$tablename' 
    "); 

    return mysql_result($res, 0) == 1; 
} 

el código es simplemente:

<?php  
// .. database stuff from above goes here .. 
$type=$_GET["type"]; 
$from=$_GET["from"]; 
$to=$_GET["to"]; 
$tl=$_GET["tl"]; 

if (! table_exists($tl)) { 
... 
} 

if ($type == "request") { // might want to set $tl="en" when ! table_exists($tl) 
    $find = mysql_query("SELECT to FROM `'$tl'` WHERE from='$from'"); 
    $row = mysql_fetch_array($find); 
    echo $row['to']; 
} elsif ($type == "suggest") { 
    $find = mysql_query("SELECT COUNT(*) AS count FROM `'$tl'` WHERE from='$from'"); 
    if (!(mysql_result($res, 0)) == 0) { 
     $ins = mysql_query("INSERT INTO `'$tl'` (from, to) VALUES ('$from','$to')"); 
    } 
} 
?> 

. página mecánica de traducción

- Finalmente podemos atarlos juntos en sus páginas web con un poco más de jQuery:

i18n.suggest = function (from) { // post user translation to our php 
    $.ajax({ 
     url: "/i18n_t.php?type=suggest&from='+from+'&to="+ escape($('#i18n_s').contents()) +"&tl="+ $.browserLanguage, 
     success: function(){ $('#i18n_t_div').html('<em>Thanks!</em>').delay(334).fadeOut().remove(); } 
    }); 
}; 

$(document).ready(function() { 
    i18n.t("submit"); 
    i18n.t("Thanks!"); 
    $('.i18n').click(function(event) { //add an onClick event for all i18n spans 
     $('#i18n_t_div').remove; 
     $(this).parent().append(
'<div id="i18n_t_div"><form class="i18n_t_form"> 
    <input type="text" id="i18n_s" name="suggestion" value="+$(this).contents()+" /> 
    <input type="button" value="'+ i18n.bank[ "submit" ] +'" onclick="i18n.suggest('+$(this).contents()+')" /> 
</form></div>' 
     ); 
    }).each(function(){ 
     var c = $(this).contents(); //now load initial translations for browser language for all the internationalized content on the page 
     if (i18n.t(c)){ 
      $(this).html(i18n.bank[c]); 
     } 
    }); 
}); 

mente que no tengo un servidor para probar esto en ... y En realidad, no codifico php. : D Tomará algo de depuración pero el andamio debería ser correcto.