Простой способ перевести сайт - PullRequest
0 голосов
/ 03 февраля 2012

Вопрос

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

Мой путь

Мой способ (я немного упростил его для облегчения понимания): я генерирую массив PHP для каждого языка из базы данных и сохраняю этот массив в языковом файле, например es.php для испанского языка.

Затем я перевожу строку в HTML, используя функцию tr, например:
До: <h1>Hello World</h1>
После: <h1><?php echo tr('Hello World'); ?></h1>, что дает <h1>Hola Mundo</h1> для испанского языка.

Проблема

Это громоздко и подвержено ошибкам. Я должен пройти через каждый файл .php и заменить все жестко закодированные строки с этим тегом PHP на echo.
Есть ли способ лучше? Как другие это делают? При необходимости я могу подробно рассказать о своей реализации.

Ответы [ 6 ]

4 голосов
/ 03 февраля 2012

Вы должны заглянуть в расширение PHP GETTEXT, оно очень быстрое и отсканирует ваши PHP-файлы на наличие строк для перевода в файлы .MO и .PO

Затем вы можете просто сделать что-то вроде __('Hello World'); или, если у вас уже есть все строки с tr('Hello World');, тогда вы можете просто изменить функцию tr так, чтобы она проходила через __(string) или gettext(string) как ..

function tr($string){
    __($string)
}
2 голосов
/ 28 февраля 2012

Я полагаю, немного поздно для вас, но на тот случай, если кто-то вроде меня наткнется на эту тему ... Потому что у меня сейчас та же проблема, что и у вас. К сожалению, не существует «неуклюжего» способа сделать это с помощью PHP. Кажется, все включает в себя множество вызовов функций (если у вас много текста).

Ну ... есть ОДИН удобный способ. Не совсем безопасно, хотя. Управление выходным буфером перед его отправкой пользователю: => http://dev -tips.com / featured / output-buffering-for-web-developers-a-beginners-guide

Таким образом, вы можете в зависимости от выбранного языка просто определить массив, заполненный «from-> to» -данными, и заменить весь читаемый текст в вашем буфере, просматривая его.

Но, конечно ... если вы, например, замените «send» (английский) на «senden» (немецкий), и вы добавите ссылку на «send.html», это приведет к разрыву этой ссылки.

Так что, если нужно переводить не только длинные, однозначно уникальные строки, но и более короткие, нужно будет манипулировать только текстом, который читается пользователем. Для этого тоже есть решение - однако, оно основано на JavaScript: => http://www.isogenicengine.com/documentation/jquery-multi-language-site-plugin/

2 голосов
/ 03 февраля 2012

Вы всегда можете создать и перевести свой сайт , используя Инструменты и ресурсы Google .

Как правило, я считаю, что многоязычный сайт больше не является "статичным".Я использую Drupal для реализации сайтов.Он имеет несколько превосходных вариантов интернационализации .

1 голос
/ 28 октября 2016

Сделайте так, как я перевожу мой веб-сайт. Под doctype есть lang, затем выбранный вами lang, например, ниже,

Затем создайте функцию php, чтобы получить это $ _POST ['get'], и получите эту функциюзагрузить выбранный языковой файл / db и т. д.,

0 голосов
/ 06 апреля 2018

Я сделал класс, чтобы сделать мой

class WILang

{

    function __construct() 
{
     $this->WIdb = WIdb::getInstance();

}

public static function all($jsonEncode = true) {
    // determine lanuage
    $language = self::getLanguage();
    //echo $language;

    $WIdb = WIdb::getInstance();
        //$file = WILang::getFile($language);
        //echo $file;
        //echo $language;
    if ( ! self::isValidLanguage($language) )
    die('Language file doesn\'t exist!');
    else {

        $sql = "SELECT * FROM `wi_trans` WHERE `lang` = :file";
        $query = $WIdb->prepare($sql);
        $query->bindParam(':file', $language, PDO::PARAM_STR);
        $query->execute();
        //$result = array();
        while ($result = $query->fetchAll(PDO::FETCH_ASSOC)) {
            echo "{";
            foreach ($result as $res) {
            echo '"' .$res['keyword'] .'":"' . $res['translation'] . '",';
             //return array($res['keyword'] => $res['translation'] ,);  
        }

        echo "}";
        }

        }
}

public static function get($key ) //, $bindings = array()
{
    // determine language
    $language = self::getLanguage();

    $WIdb = WIdb::getInstance();

    $sql = "SELECT * FROM `wi_trans` WHERE `keyword`=:key AND lang=:lang";
    $query = $WIdb->prepare($sql);
    $query->bindParam(':key', $key, PDO::PARAM_STR);
    $query->bindParam(':lang', $language, PDO::PARAM_STR);
    $query->execute();

    $res = $query->fetch(PDO::FETCH_ASSOC);
    if($res > 0)
        return $res['translation'];
    else
        return '';
}

 public static function setLanguage($language) 
 {

    // check if language is valid
    if ( self::isValidLanguage($language) ) {
        //set language cookie to 1 year
        setcookie('wi_lang', $language, time() + 60 * 60 * 24 * 365, '/');

        // update session
        WISession::set('wi_lang', $language);

        //refresh the page
        header('Location: ' . $_SERVER['PHP_SELF']);
    }
}

     public static function getLanguage() 
     {
    // check if cookie exist and language value in cookie is valid
    if ( isset ( $_COOKIE['wi_lang'] ) && self::isValidLanguage ( $_COOKIE['wi_lang'] ) )
        return $_COOKIE['wi_lang']; // return lang from cookie
    else
        return WISession::get('wi_lang', DEFAULT_LANGUAGE);
}


    private static function getTrans($language) 
    {
        $WIdb = WIdb::getInstance();
        //$file = WILang::getFile($language);
        //echo $file;
        //echo $language;
    if ( ! self::isValidLanguage($language) )
    die('Language file doesn\'t exist!');
    else {
        //$language = include $file;
        //return $language;

        $sql = "SELECT * FROM `wi_trans` WHERE `lang` = :file";
        $query = $WIdb->prepare($sql);
        $query->bindParam(':file', $language, PDO::PARAM_STR);
        $query->execute();
        //$result = array();
        while ($result = $query->fetchAll(PDO::FETCH_ASSOC)) {
            echo "{";
            foreach ($result as $res) {
            echo '"' .$res['keyword'] .'":"' . $res['translation'] . '",';
             //return array($res['keyword'] => $res['translation'] ,);  
        }

        echo "}";
        }

        }

}



 private static  function getFile($language) 
 {
    $WIdb = WIdb::getInstance();
    $sql = "SELECT * FROM `wi_lang` WHERE `lang` = :file";
    $query = $WIdb->prepare($sql);
    $query->bindParam(':file', $language, PDO::PARAM_STR);
    $query->execute();

    $res = $query->fetch(PDO::FETCH_ASSOC);
    //echo $res['lang'];
    if ($res > 0)
        return $res['lang'];
    else
        return '';


}

    private static function isValidLanguage($lang) 
    {
    $file = self::getFile($lang);
    //echo $file;

    if($file == "")
    //if ( ! file_exists( $file ) )
        return false;
    else
        return true;
}

}

0 голосов
/ 07 февраля 2017

Попробуйте это решение.Меня устраивает.Он имеет французский и английский перевод.

Index.php

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>How to Translate your Site in Runtime using Jquery - demo</title>
<link rel="stylesheet" href="css/main.css" type="text/css" />
<script src="js/jquery.min.js"></script>
<script src="js/main.js"></script>
</head>
<body>
<div class="example">
<h3><a href="#">How to Translate your Site in Runtime using Jquery - demo</a></h3>
<div id="content">
<div class="lang_switcher">
<button id="en" class="lang">EN</button>
<button id="fr" class="lang">FR</button>
</div>
<div style="clear:both;"></div>
<!-- nav menu start -->
<ul id="nav">
<li><a href="#nogo" key="home" class="tr">Home</a></li>
<li><a href="#nogo" key="peoples" class="tr">Peoples >></a>
<ul>
<li><a href="#nogo" key="all_list" class="tr">All list</a></li>
<li><a href="#nogo" key="online" class="tr">Online</a></li>
</ul>
</li>
<li><a href="#nogo" key="articles" class="tr">Articles >></a>
<ul>
<li><a href="#nogo" key="js" class="tr">JavaScript</a></li>
<li><a href="#nogo" key="php" class="tr">PHP</a></li>
<li><a href="#nogo" key="html" class="tr">HTML</a></li>
<li><a href="#nogo" key="css" class="tr">CSS</a></li>
</ul>
</li>
<li><a href="#nogo" key="contact_us" class="tr">Contact us</a></li>
</ul>
<!-- nav menu end -->
<div style="clear:both;"></div>
<h2 key="welcome" class="tr">Welcome guests</h2>
<hr />
<div key="a_man" class="tr">A man bribes a rabbit with wicked dentures to run away with him in a sailboat via an ambulance. Bribing Koalas to remain illegally in one place. Trees anchor me in place. / Your mom drives the ambulance, but the city is farther than it appears.</div>
</div>
</div>
</body>
</html>

main.js

// preparing language file
var aLangKeys=new Array();
aLangKeys['en']=new Array();
aLangKeys['fr']=new Array();
aLangKeys['en']['home']='Home';
aLangKeys['en']['peoples']='Peoples >>';
aLangKeys['en']['all_list']='All list';
aLangKeys['en']['online']='Online';
aLangKeys['en']['articles']='Articles >>';
aLangKeys['en']['js']='JavaScript';
aLangKeys['en']['php']='PHP';
aLangKeys['en']['html']='HTML';
aLangKeys['en']['css']='CSS';
aLangKeys['en']['contact_us']='Contact us';
aLangKeys['en']['welcome']='Welcome guests';
aLangKeys['en']['a_man']='A man bribes a rabbit with wicked dentures to run away with him in a sailboat via an ambulance. Bribing Koalas to remain illegally in one place. Trees anchor me in place. / Your mom drives the ambulance, but the city is farther than it appears.';

aLangKeys['fr']['home']='Accueil';
aLangKeys['fr']['peoples']='Peuples >>';
aLangKeys['fr']['all_list']='Toutes les listes';
aLangKeys['fr']['online']='En ligne';
aLangKeys['fr']['articles']='Articles >>';
aLangKeys['fr']['js']='JavaScript';
aLangKeys['fr']['php']='Php';
aLangKeys['fr']['html']='Html';
aLangKeys['fr']['css']='Css';
aLangKeys['fr']['contact_us']='Contactez nous';
aLangKeys['fr']['welcome']='Bienvenue aux invites';
aLangKeys['fr']['a_man']="Un homme soudoie un lapin avec des prothèses méchantes pour s'enfuir avec lui dans un voilier via une ambulance. Corruption des Koalas pour qu'ils restent illégalement à un endroit. Les arbres m'ancrent en place. / Votre mère conduit l'ambulance, mais la ville est plus loin qu'il n'y paraît.";
$(document).ready(function() {
// onclick behavior
$('.lang').click( function() {
var lang = $(this).attr('id'); // obtain language id
// translate all translatable elements
$('.tr').each(function(i){
$(this).text(aLangKeys[lang][ $(this).attr('key') ]);
});
} );
});

И некоторые css- main.css

body{background:#eee;font-family:Verdana, Helvetica, Arial, sans-serif;margin:0;padding:0}
.example{background:#FFF;width:500px;height:500px;font-size:80%;border:1px #000 solid;margin:0.5em 10% 0.5em;padding:1em 2em 2em;-moz-border-radius:3px;-webkit-border-radius:3px}
.lang_switcher{float:right;overflow:hidden;}
/* nav menu styles */
#nav,#nav ul{list-style:none;font:10px verdana, sans-serif;border:1px solid #000;background:#fff;position:relative;z-index:200;border-color:#eca #b97 #a86 #edb;border-width:1px 2px 2px 1px;margin:0;padding:0 0 5px}
#nav{height:25px;padding:0}
#nav table{border-collapse:collapse}
#nav li{float:left;padding:0 20px 0 10px}
#nav li li{float:none}
#nav li a li{float:left}
#nav li a{display:block;float:left;color:#888;height:25px;padding-right:5px;line-height:25px;text-decoration:none;white-space:nowrap}
#nav li li a{height:20px;line-height:20px;float:none}
#nav li:hover{position:relative;z-index:300;background:#fff}
#nav a:hover{position:relative;z-index:300;text-decoration:underline;color:#b75}
#nav :hover ul{left:0;top:22px}
#nav a:hover ul{left:-10px}
#nav li:hover li:hover > ul{left:-15px;margin-left:100%;top:-1px}
#nav li:hover > ul ul{position:absolute;left:-9999px;top:-9999px;width:auto}
#nav li:hover > a{text-decoration:underline;color:#b75}
#nav a:hover a:hover ul,#nav a:hover a:hover a:hover ul,#nav a:hover a:hover a:hover a:hover ul,#nav a:hover a:hover a:hover a:hover a:hover ul{left:100%;top:-1px}
#nav ul,#nav a:hover ul ul,#nav a:hover a:hover ul ul,#nav a:hover a:hover a:hover ul ul,#nav a:hover a:hover a:hover a:hover ul ul{position:absolute;left:-9999px;top:-9999px}
...