Проекты с открытым исходным кодом для i18n а-ля Facebook - PullRequest
6 голосов
/ 26 сентября 2010

Facebook использует этот уникальный и умный подход к локализации своего сайта: переводчики (в их случае пользователи, которые помогают переводить сайт добровольно) могут просто нажимать на еще не переведенные строки - которые отмечены зеленой нижней границей- в их естественном контексте на сайте.См. http://www.facebook.com/translations/.

Теперь, если вам когда-либо приходилось иметь дело с переводом веб-сайта, вы будете хорошо знать, насколько странными и забавными могут быть некоторые из этих переводов, когда используете такие инструменты, как poedit, где переводчикне полностью осведомлен о месте, на котором будет отображаться переведенная строка.

Пример: Пожалуйста, переведите «Home».Например, в немецком языке стартовой страницей сайта будет «Дом», а домом, в котором вы живете, будет «Хейм».Теперь вы, как переводчик, в основном должны угадать, в каком контексте этот термин может появиться на веб-сайте, и соответственно перевести.Скорее всего, ваш новый сайт по домашней мебели теперь переводится как «Home-Einrichtung», что звучит смешно для любого немца.

Итак, мой вопрос сводится к:

DoВы знаете какие-либо проекты с открытым исходным кодом PHP, которые работают над чем-то вроде этого?Я в основном ищу фреймворк, который позволит вам переводить ваш интернационализированный веб-сайт в «режим перевода» и делать строки кликабельными и переводимыми, например, через модальный Javascript.

Я не очень ищуПолноценное и готовое решение, но хотелось бы узнать о подобных проектах, в которые я могу добавить код.

Заранее спасибо!

1 Ответ

1 голос
/ 04 мая 2011

Если вы хотите свернуть свои собственные с помощью 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 Это займет некоторую отладку, но леса должны быть правильными.

...