2010-09-26 3 views
6

Facebook ha questo approccio unico e intelligente alla localizzazione del proprio sito: i traduttori (nel loro caso gli utenti che aiutano a tradurre il sito volontariamente) possono semplicemente fare clic sulle stringhe non ancora tradotte - che sono contrassegnati da un bordo inferiore verde - nel loro contesto naturale sul sito. Vedi http://www.facebook.com/translations/.Progetti open source per i18n à la Facebook

Ora, se hai mai avuto a che fare con la traduzione di un sito web, sarai ben consapevole di quanto strane e divertenti alcune di queste traduzioni possano essere quando usi strumenti come Poedit dove il traduttore non è pienamente a conoscenza lo spot la stringa tradotta verrà visualizzata sul sito Web.

Esempio: Si prega di tradurre "Casa". In tedesco, ad esempio, la pagina iniziale di un sito web sarebbe "Casa", mentre la casa in cui vivi è "Heim". Ora, come traduttore, in pratica devi indovinare quale contesto è probabile che questo termine appaia sul sito web e tradurlo di conseguenza. È probabile che tu sia il nuovo sito web sui mobili per la casa che ora si traduce come "Home-Einrichtung" che suona ridicolo a qualsiasi tedesco.

Quindi, la mia domanda si riduce a:

Sai progetti PHP open source che funzionano su una cosa del genere? Fondamentalmente sto cercando un framework che ti permetta di mettere il tuo sito web internazionalizzato in "translation mode" e rendere le stringhe cliccabili e traducibili per es. attraverso un modal Javascript.

Non sono tanto alla ricerca di una soluzione completa e pronta, ma mi piacerebbe conoscere progetti simili a cui posso contribuire con il codice.

Grazie in anticipo!

+0

Questa è una grande domanda e probabilmente diventerà sempre più rilevante man mano che i siti web diventano sempre più globali! – Ryan

risposta

1

Se si desidera eseguire il rollover con jquery & jquery browserLanguage, questo potrebbe farti andare.

Contrassegna tutti gli elementi di contenuto del testo traducibile con class="i18n" e include jquery, jquery browserLanguage e lo script i18n.

. l'internazionalizzazione javascript

- questo deve accettare traduzioni tramite la tecnologia AJAX dal server, come:

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 servizio di traduzione i18n

- ora abbiamo bisogno di servire fino traduzioni, e accettarle

il database sarà simile a un mucchio di tabelle, una per ogni lingua.

// 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 
) 

il php avrà bisogno di qualche connessione e manipolazione db ..per ora questo può fare:

//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; 
} 

il codice è semplice:

<?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')"); 
    } 
} 
?> 

. pagina meccanica traduzione

- finalmente siamo in grado di legare insieme a pagine web con qualche ulteriore 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]); 
     } 
    }); 
}); 

Intendiamoci non ho un server per testare questo su ... e In realtà non codice PHP. : D Ci vorrà un po 'di debug ma l'impalcatura dovrebbe essere corretta.