适用于i18nàlaFacebook的开源项目

sem*_*alo 6 translation localization internationalization

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

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

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

所以,我的问题归结为:

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

我不是在寻找一个成熟的现成解决方案,但是我很想知道我可以为代码贡献的类似项目.

提前致谢!

rob*_*más 1

如果您想使用 jquery 和 jquery browserLanguage 来推出自己的语言,这可能会帮助您。

\n\n

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

\n\n

1 . 国际化 JavaScript

\n\n

\xe2\x80\x94 这需要通过 ajax 从你的服务器接受翻译,例如:

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

2 . php i18n 翻译服务

\n\n

\xe2\x80\x94 现在我们需要提供翻译并接受它们

\n\n

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

\n\n
// SCHEMA for each language:\nCREATE TABLE `en`\n(\n`id` INT PRIMARY KEY AUTO INCREMENT NOT NULL,\n`from` VARCHAR(500) NOT NULL,\n`to` VARCHAR(500) NOT NULL\n)\n
Run Code Online (Sandbox Code Playgroud)\n\n

php 将需要一些连接和数据库操作..现在可能这样做:

\n\n
//Connect to the database\n$connection = mysql_connect(\'host (usually localhost)\', \'mysql_username\' , \'mysql_password\');\n$selection = mysql_select_db(\'mysql_database\', $connection);\n\nfunction table_exists($tablename, $database = false) {\n    if(!$database) {\n        $res = mysql_query("SELECT DATABASE()");\n        $database = mysql_result($res, 0);\n    }\n\n    $res = mysql_query("SELECT COUNT(*) AS count FROM information_schema.tables WHERE table_schema = \'$database\' AND table_name = \'$tablename\'\n    ");\n\n    return mysql_result($res, 0) == 1;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

代码很简单:

\n\n
<?php     \n// .. database stuff from above goes here ..\n$type=$_GET["type"];\n$from=$_GET["from"];\n$to=$_GET["to"];\n$tl=$_GET["tl"];\n\nif (! table_exists($tl)) {\n...\n}\n\nif ($type == "request") { // might want to set $tl="en" when ! table_exists($tl)\n    $find = mysql_query("SELECT to FROM `\'$tl\'` WHERE from=\'$from\'");\n    $row = mysql_fetch_array($find);\n    echo $row[\'to\'];\n} elsif ($type == "suggest") {\n    $find = mysql_query("SELECT COUNT(*) AS count FROM `\'$tl\'` WHERE from=\'$from\'");\n    if ( !(mysql_result($res, 0)) == 0 ) { \n        $ins = mysql_query("INSERT INTO `\'$tl\'` (from, to) VALUES (\'$from\',\'$to\')");\n    }\n}\n?>\n
Run Code Online (Sandbox Code Playgroud)\n\n

3 . 页面翻译机制

\n\n

\xe2\x80\x94 最后,我们可以使用一些进一步的 jquery 将它们在您的网页中绑定在一起:

\n\n
i18n.suggest = function (from) { // post user translation to our php\n    $.ajax({ \n        url: "/i18n_t.php?type=suggest&from=\'+from+\'&to="+ escape( $(\'#i18n_s\').contents() ) +"&tl="+ $.browserLanguage, \n        success: function(){ $(\'#i18n_t_div\').html(\'<em>Thanks!</em>\').delay(334).fadeOut().remove(); }\n    });\n};\n\n$(document).ready(function() {\n    i18n.t("submit");\n    i18n.t("Thanks!");\n    $(\'.i18n\').click( function(event) { //add an onClick event for all i18n spans\n        $(\'#i18n_t_div\').remove;\n        $(this).parent().append(\n\'<div id="i18n_t_div"><form class="i18n_t_form">\n    <input type="text" id="i18n_s" name="suggestion" value="+$(this).contents()+" />\n    <input type="button" value="\'+ i18n.bank[ "submit" ] +\'" onclick="i18n.suggest( \'+$(this).contents()+\' )" />\n</form></div>\'\n        );\n    }).each(function(){ \n        var c = $(this).contents(); //now load initial translations for browser language for all the internationalized content on the page\n        if ( i18n.t(c) ){\n            $(this).html(i18n.bank[c]);\n        }\n    });\n}); \n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,我没有服务器来测试这个......而且我实际上没有编写 php 代码。:D 这需要一些调试,但脚手架应该是正确的。

\n