0

我不确定我的代码结构是否错误,或者这是一个通常不会发现的问题,但我什至不知道如何开始为我的问题寻找解决方案。我有自己的简单翻译脚本,其名称如下:

<?php echo $Translate->text("Name"); ?>

它将返回(并回显)带有关键字“名称”的字符串。问题是,出于多种原因(名称:错误翻译、报告、开发、原位翻译),我可能想要检索页面上所有字符串的关键字。一个简单的页面(example.com/campus/index.php)如下所示:

<h1> <?php echo $Translate->text(Campus); ?> </h1>

<p style="text-align:justify;">
  <?php echo $Translate->text(126); ?>
</p>

<p style="text-align:justify;">
  <?php echo $Translate->text(129); ?>
</p>

<a href="<?php $Link->create("campus/about"); ?>">
  <h2 class="bodymenu"><?php echo $Translate->text(About); ?> </h2>
</a>
<p style="text-align:justify;">
  <?php echo $Translate->text(146); ?>
</p>

<a href="<?php $Link->create("campus/learning_center"); ?>">
  <h2 class="bodymenu"><?php echo $Translate->text(Learning_center); ?> </h2>
</a>
<p style="text-align:justify;">
  <?php echo $Translate->text(147); ?>
</p>

<a href="<?php $Link->create("campus/residence"); ?>">
  <h2 class="bodymenu"><?php echo $Translate->text(Residence); ?> </h2>
</a>
<p style="text-align:justify;">
  <?php echo $Translate->text(128); ?>
</p>

而且我想在某些情况下获得:从另一个页面$Translations=array("Campus","126","129","About","146","Learning_center","147","Residence","128");进行进一步处理(编辑)。

在某些情况下,页面中混合了更多的 php 逻辑,在其他一些情况下,就像这样。在每个页面之前和之后自动包含更多的逻辑代码和类。所以,基本上,我想知道(对于这个例子,但能够扩展它)我怎样才能检索所有的关键字。

我基本上在考虑两种方法,但我认为这两种方法都不是最佳的。首先是使用正则表达式解析 php 代码。因为我知道我正在寻找的位,我认为这是可能的。第二个是,根据 SESSION 变量,我渲染 html 并解析它,所以它echo $Translate->text(Campus);会返回类似的东西<span id="Translation">Campus</span>,然后只解析 html 并检索所有 id。在我开始之前,你能想出其他方法来检索 ID 吗?

PS,我不想在页面的开头或结尾对数组中的所有 id 进行硬编码。

4

4 回答 4

0

如果我理解正确,

稍微修改一下 Translate 类:添加一个变量,该变量将收集您正在使用的所有字符串,例如:

public $aStrings = array();

然后,在您的函数 text($arg) 中添加如下内容:

$this->aStrings[] = $arg;

那么您将在 Translate->aStrings 变量中拥有页面上的所有字符串,然后使用类似以下内容进行打印:

print_r($Translate->aStrings);
于 2012-09-29T11:29:14.363 回答
0

Translate使用一个在数组中收集值的类子类化该类,然后在您的页面中使用它:

class MyTranslate extends Translate {
  public $texts = array();
  public function text($which) {
    $this->texts[] = $which;
    return parent::text($which);
  }
}

$Translate=new MyTranslate($User->Language);

ob_start();
require('/path/to/other/page');
ob_end_clean();

var_dump($Translate->texts);
于 2012-09-29T11:30:40.937 回答
0

不要通过实施翻译系统来重新发明轮子。gettext 扩展用于无痛、即时的语言切换。

基本上,您使用默认语言编写您的网站:

<?php echo _("Name"); ?>

不要写<?php echo $Translate->text(147); ?>,没人知道那是什么。写:

<?php echo _("Learning Centre"); ?>

对于管理翻译,可以选择适用于 Windows、Linux 和 Mac 的编辑器,例如POEdit 。

切换到不同的语言很容易:

public function SetDomain( $path )
{
    define( 'DOMAIN', 'messages' );
    bindtextdomain( DOMAIN, $path );
    bind_textdomain_codeset( DOMAIN, "UTF-8" );
    textdomain( DOMAIN );
}

注意:如果您将 short_open_tags 设置为 on,您可以编写:

<?= _("Name"); ?>
于 2012-09-29T11:43:49.650 回答
0

在英文文件夹中创建 2 个文件。(您可以稍后指定它,但通常是语言目录中语言文件的位置)

campus.about.php

<?php
$lang["Name"]               = "Name";
$lang["Address"]            = "Address";    
?>

* Campus.learning_center.php* :

<?php
$lang["Learning"]               = "Learning";
$lang["Residence"]          = "Residence";  
?>

你的类翻译文件(根目录)


class Translate {

    public $_text= array(); // Change it into private properties coz you create 
// text method for get the value, I set it public just for easy to debug it.
    private $_language;

    function __construct($language){ // Set Language
        $this->_language= $language;
    }

    public function create($page){ // Get Language File
        // $page= campus/about change into this campus.about
        // Get language file Ex: english/campus.about.php
        require($this->_language.'/'.$page.'.php');
        $this->_text= array_merge($this->_text, $lang);
    }

    public function text($text){ // Display Keywords
        echo $this->_text[$text];
    }
}
$Translate= new Translate('english');
$Translate->create('campus.about');
print_r($Translate->_text);
$Translate->create('campus.learning_center');
print_r($Translate->_text);

于 2012-09-29T17:07:27.713 回答