使用 PHP 进行语言翻译

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/13172660/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 04:53:54  来源:igfitidea点击:

Language translation using PHP

phplanguage-translation

提问by Natasha

Hi i am devloping sample site in php i need to translate whole website in to persian. how can it possible in php?? I have tried using the following code.. This code will working fine for deutsch conversion.

嗨,我正在用 php 开发示例网站,我需要将整个网站翻译成波斯语。在php中怎么可能??我曾尝试使用以下代码。此代码适用于德语转换。

1. class.translation.php

<?php
class Translator {

    private $language   = 'en';
    private $lang       = array();

    public function __construct($language){
        $this->language = $language;
    }

    private function findString($str) {
        if (array_key_exists($str, $this->lang[$this->language])) {
            echo $this->lang[$this->language][$str];
            return;
        }
        echo $str;
    }

    private function splitStrings($str) {
        return explode('=',trim($str));
    }

    public function __($str) {  
        if (!array_key_exists($this->language, $this->lang)) {
            if (file_exists($this->language.'.txt')) {
                $strings = array_map(array($this,'splitStrings'),file($this->language.'.txt'));
                foreach ($strings as $k => $v) {
                    $this->lang[$this->language][$v[0]] = $v[1];
                }
                return $this->findString($str);
            }
            else {
                echo $str;
            }
        }
        else {
            return $this->findString($str);
        }
    }
}
?>

2.Register.php

2.注册.php

<?php
require_once('class.translation.php');

if(isset($_GET['lang']))
    $translate = new Translator($_GET['lang']);
else
    $translate = new Translator('en');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
        <title><?php $translate->__('CSS Registration Form'); ?></title>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15"/>
        <link rel="stylesheet" type="text/css" href="css/default.css"/>
    </head>
    <body>    
        <form action="" class="register">
            <h1><?php $translate->__('Registration'); ?><a class="flag_deutsch" title="deutsch" href="register1.php?lang=de"></a><a class="flag_english" title="english" href="register1.php"></a></h1>
            <fieldset class="row1">
                <legend><?php $translate->__('Account Details'); ?></legend>
                <p>
                    <label><?php $translate->__('Email'); ?> *</label>
                    <input type="text"/>
                    <label><?php $translate->__('Repeat email'); ?> *</label>
                    <input type="text"/>
                </p>
            </fieldset>

            <div><button class="button"><?php $translate->__('Register'); ?> &raquo;</button></div>
        </form>
    </body>
</html>

Is it possible to transilate to other laguages using this code?? I changed register1.php?lang=de to register1.php?lang=fa(persian).. But nothing hapens..anybody plese help

是否可以使用此代码翻译成其他语言?我将 register1.php?lang=de 更改为 register1.php?lang=fa(persian .. 但没有任何事情发生..任何人都请帮忙

回答by Hkachhia

AS per me you can try this method.This method is already implemented in our system and it is working properly.

按照我的说法你可以试试这个方法。这个方法已经在我们的系统中实现了,并且运行正常。

Make php file of each language and define all the variables and use those variables in pages.

制作每种语言的php文件并定义所有变量并在页面中使用这些变量。

for e.g For english

例如对于英语

english.php

英文.php

$hello="Hello";

persian.php

波斯语.php

$hello=html_entity_decode(htmlentities("????"));

Now use this variable to page like this.

现在使用这个变量来像这样分页。

your_page.php

your_page.php

<label><?php echo $hello; ?></label>

You have load specific language file as per get language variable from URL.

您已根据从 URL 获取语言变量加载特定语言文件。

It is better that you have define this language variable into config file.

最好将此语言变量定义到配置文件中。

config.php

配置文件

if(isset($_GET['lang']) && $_GET['lang']=='persian')
{
   require_once('persian.php');
}
else
{
   require_once('english.php');
}

回答by Mahdi

If I were you, I'd do it like this:

如果我是你,我会这样做:

/inc/lang/en.lang.php

/inc/lang/en.lang.php

define('_HELLO', 'Hello');

/inc/lang/fa.lang.php

/inc/lang/fa.lang.php

define('_HELLO', '????');

index.php

索引.php

// $_SESSION['lang'] could be 'en', 'fa', etc.
require_once '/inc/lang/' . $_SESSION['lang'] . 'lang.php';

echo _HELLO;

Benchmark: Constants vs. Variables

基准:常量与变量

Here you see why I offered using Constantsnot Variables:

在这里你明白为什么我提供使用Constantsnot Variables

const.php

常量.php

echo memory_get_usage() . '<br>';   // output: 674,576

for ($i = 0; $i <= 10000; $i++) {
    define($i, 'abc');
}

echo memory_get_usage() . '<br>';   // output: 994,784

var.php

变量.php

echo memory_get_usage() . '<br>';   // output: 674,184

for ($i = 0; $i <= 10000; $i++) {
   $$i = 'abc';
}

echo memory_get_usage() . '<br>';   // output: 2,485,176

回答by rbenmass

From an Perl trans script I extracted the following for 100% free php google translation this function:

从 Perl trans 脚本中,我为 100% 免费的 php google 翻译这个函数提取了以下内容:

See working demo on http://ogena.net

请参阅http://ogena.net 上的工作演示

function translate($q, $sl, $tl){

if($s==$e || $s=='' || $e==''){
    return $q;

}
else{
    $res="";

    $qqq=explode(".", $q);

    if(count($qqq)<2){

        @unlink($_SERVER['DOCUMENT_ROOT']."/transes.html");
        copy("http://translate.googleapis.com/translate_a/single?client=gtx&ie=UTF-8&oe=UTF-8&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&dt=at&sl=".$sl."&tl=".$tl."&hl=hl&q=".urlencode($q), $_SERVER['DOCUMENT_ROOT']."/transes.html");
        if(file_exists($_SERVER['DOCUMENT_ROOT']."/transes.html")){
            $dara=file_get_contents($_SERVER['DOCUMENT_ROOT']."/transes.html");
            $f=explode("\"", $dara);

            $res.= $f[1];
        }
    }
    else{


    for($i=0;$i<(count($qqq)-1);$i++){

        if($qqq[$i]==' ' || $qqq[$i]==''){
        }
        else{
            copy("http://translate.googleapis.com/translate_a/single?client=gtx&ie=UTF-8&oe=UTF-8&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&dt=at&sl=".$s."&tl=".$e."&hl=hl&q=".urlencode($qqq[$i]), $_SERVER['DOCUMENT_ROOT']."/transes.html");

            $dara=file_get_contents($_SERVER['DOCUMENT_ROOT']."/transes.html");
            @unlink($_SERVER['DOCUMENT_ROOT']."/transes.html");
            $f=explode("\"", $dara);

            $res.= $f[1].". ";
            }
        }
    }
    return $res;
}

}




//sample usage
echo translate("Goede dag dames en heren", "nl", "en");

回答by Ladislav Zigo

As i can read from the code, the translator class loads the translation data from en.txt file, if you want have 'fa' translation, just create fa.txt as copy of en.txt with all translations and edit and translate fa.txt to persian...

正如我从代码中读取的那样,翻译器类从 en.txt 文件加载翻译数据,如果你想要“fa”翻译,只需创建 fa.txt 作为 en.txt 的副本,并编辑和翻译 fa。 txt 到波斯语...

Hope it helps

希望能帮助到你

回答by user1023540

@rbenmass Thank You :-)

@rbenmass 谢谢:-)

I think it have to be , because it runs good for me :

我认为必须如此,因为它对我来说很好:

    /* 
    original from @rbenmass :

    function translate($q, $sl, $tl){

    if($s==$e || $s=='' || $e==''){
        return $q;

    }
     **/

function translate($q, $sl, $tl){

if($sl==$tl || $sl=='' || $tl==''){
    return $q;

}
//  ...  //

回答by Montaser El-sawy

original from @rbenmass :

try this:

尝试这个:

function translate($q, $sl, $tl){
    $res= file_get_contents("https://translate.googleapis.com/translate_a/single?client=gtx&ie=UTF-8&oe=UTF-8&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&dt=at&sl=".$sl."&tl=".$tl."&hl=hl&q=".urlencode($q), $_SERVER['DOCUMENT_ROOT']."/transes.html");
    $res=json_decode($res);
    return $res[0][0][0];
}

//example-- 
echo translate("???? ????? ??????", "ar", "en");