【问题标题】:Language translation using PHP使用 PHP 进行语言翻译
【发布时间】:2012-10-21 18:42:54
【问题描述】:

嗨,我正在用 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

<?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>

是否可以使用此代码翻译到其他语言?我将 register1.php?lang=de 更改为 register1.php?lang=fa(persian).. 但没有任何结果..请大家帮忙

【问题讨论】:

  • 请注意您用于翻译的类。
  • 您需要一个名为 fa.txt 的文件,其中包含翻译字符串。
  • 我觉得Harry给出的想法对你有好处。
  • 我做了这个小翻译库,可能你或其他人都可以使用它。 github.com/amitkhare/easy-translator

标签: php language-translation


【解决方案1】:
original from @rbenmass :

试试这个:

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");

【讨论】:

    【解决方案2】:

    @rbenmass 谢谢你:-)

    我认为它必须是,因为它对我有好处:

        /* 
        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;
    
    }
    //  ...  //
    

    【讨论】:

      【解决方案3】:

      我从 Perl trans 脚本中提取了以下内容,用于 100% 免费的 php google 翻译此功能:

      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");
      

      【讨论】:

        【解决方案4】:

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

        /inc/lang/en.lang.php

        define('_HELLO', 'Hello');
        

        /inc/lang/fa.lang.php

        define('_HELLO', 'سلام');
        

        index.php

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

        基准测试:常量与变量

        你知道为什么我提供使用Constants而不是Variables

        const.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

        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
        

        【讨论】:

        • 如果你使用define那么它不使用服务器资源?
        • @Harry 请再次阅读我对您的回答的评论。我说I guess you're wasting the server resources by defining variables. ...查看我的答案更新...希望对您有所帮助。
        【解决方案5】:

        按照我的说法,您可以尝试此方法。此方法已在我们的系统中实现,并且可以正常工作。

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

        例如 英文版

        english.php

        $hello="Hello";
        

        persian.php

        $hello=html_entity_decode(htmlentities("سلام"));
        

        现在使用这个变量来进行这样的页面。

        your_page.php

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

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

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

        config.php

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

        【讨论】:

        • 我猜你定义变量是在浪费服务器资源。事实上,它们根本不是变量……
        • @Harry 你什么意思?你的意思是我不应该提出我的想法,因为它是我的,我应该寻找任何其他与我的想法不同的替代方案?! ...查看我对我的回答的更新,了解为什么定义 Constants 而不是 Variables 更好。
        • @Mahdi 在看到你的答案之前我已经评论了
        【解决方案6】:

        正如我可以从代码中读取的那样,翻译器类从 en.txt 文件加载翻译数据,如果您想要“fa”翻译,只需创建 fa.txt 作为 en.txt 的副本,其中包含所有翻译并编辑和将 fa.txt 翻译成波斯语...

        希望对你有帮助

        【讨论】:

          猜你喜欢
          • 2020-04-20
          • 1970-01-01
          • 2022-12-13
          • 1970-01-01
          • 2011-12-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-03
          相关资源
          最近更新 更多