2010-09-26 58 views
6

Facebook有其獨特而巧妙的方法來本地化他們的網站:翻譯(在他們的情況下,用戶可以自願翻譯網站)只需點擊尚未翻譯的字符串 - 它們在網站上的自然背景中標有綠色底部邊框。請參閱http://www.facebook.com/translations/開放源代碼項目針對國際互聯網Facebook

現在,如果您曾經需要處理網站翻譯,那麼在使用像poedit這樣的工具時,您會很清楚這些翻譯中有些翻譯可能會有多奇怪和有趣,因爲翻譯人員並未完全意識到翻譯後的字符串將出現在網站上。

例如:請翻譯「主頁」。例如,在德國,網站的起始頁面將是「家庭」,而您住的房屋是「Heim」。現在,您作爲翻譯者基本上必須猜測這個詞可能出現在網站上的哪個上下文中,並據此進行翻譯。很有可能,你是家居傢俱的新網站,現在翻譯成「Home-Einrichtung」,這聽起來對任何德語都是荒謬的。

所以,我的問題歸結爲:

你知道,在這樣的工作,任何開源的PHP項目?我基本上在尋找一個框架,允許您將國際化網站置於「翻譯模式」,並使字符串可點擊和翻譯,例如通過Javascript模式。

我並不是在尋找一個完整的現成解決方案,但很想知道我可以貢獻代碼的類似項目。

在此先感謝!

+0

這是一個很好的問題,隨着網站越來越全球化,這可能會越來越相關! – Ryan 2013-10-25 21:09:57

回答

1

如果你想用jquery滾動你自己的& jquery browserLanguage,這可能會讓你去。

class="i18n"標記所有可翻譯文本的包含元素,幷包含jquery,jquery browserLanguage和您的i18n腳本。

國際化的JavaScript

- 這需要從你的服務器接受通過AJAX轉換,如:

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的國際化翻譯服務

- 現在我們需要就可以提供翻譯,並接受他們

數據庫將看起來像一堆表,每種語言一個。

// 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將需要一些連接和數據庫操作..到目前爲止,這可能會做:

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

的代碼很簡單:

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

頁轉換機制

- 終於,我們可以一起在您的網頁上有一些進一步的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]); 
     } 
    }); 
}); 

提醒你,我沒有一個服務器來測試此行頭,我不實際編碼PHP。 :D這將需要一些調試,但腳手架應該是正確的。