适用于i18nàlaFacebook的开源项目

时间:2010-09-26 17:55:18

标签: localization internationalization translation

Facebook拥有这种独特而聪明的网站本地化方法:翻译者(在他们的情况下,帮助自愿翻译网站的用户)只需点击尚未翻译的字符串 - 标有绿色底部边框 - 在网站的自然环境中。请参阅http://www.facebook.com/translations/

现在,如果您不得不处理网站的翻译,那么当您使用像poedit这样的工具时,您会很清楚这些翻译有多奇怪和有趣,翻译人员并不完全了解这些翻译。发现翻译过的字符串会出现在网站上。

示例:请翻译“Home”。例如,在德语中,网站的起始页面为“Home”,而您居住的房屋为“Heim”。现在,作为翻译者,您基本上必须猜测该术语可能出现在网站上的哪个上下文并进行相应的翻译。有可能,你是家庭家具的新网站,现在翻译为“Home-Einrichtung”,这对任何德国人来说都是荒谬的。

所以,我的问题归结为:

你知道任何开源的PHP项目可以解决这个问题吗?我基本上正在寻找一个框架,允许您将您的国际化网站置于“翻译模式”,并使字符串可点击和翻译,例如通过Javascript模式。

我不是在寻找一个成熟且现成的解决方案,但是我很想知道我可以为其提供代码的类似项目。

提前致谢!

1 个答案:

答案 0 :(得分:1)

如果你想用jquery& jquery browserLanguage,这可能会让你前进。

标记所有可翻译文本包含class="i18n"的元素,并包含jquery,jquery browserLanguage和您的i18n脚本。

1 国际化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;
};

2 php i18n翻译服务

- 现在我们需要提供翻译,并接受它们

数据库看起来像一堆表,每种语言都有一个表。

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

3 页面翻译机制

- 最后我们可以在你的网页中将它们与另外一些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这需要一些调试,但脚手架应该是正确的。