翻译php网站而无需外部化资源

翻译php网站而无需外部化资源,php,Php,我有一个混合了html和php的php站点。 例: 你好 我需要事实来保持文本的真实性。我不想要一个经典的解决方案,比如创建ReSurce字符串并替换它们,比如: <html> <?=echo $helloString?> <?=$username?> 实际上是一种“自动脚本”,它将在运行时替换所有文本资源。所以我保留了现有的站点,并在开始时添加了一些脚本 <? include("translation_module.php?")?> &

我有一个混合了html和php的php站点。 例:


你好
我需要事实来保持文本的真实性。我不想要一个经典的解决方案,比如创建ReSurce字符串并替换它们,比如:

<html>
<?=echo $helloString?> <?=$username?>

实际上是一种“自动脚本”,它将在运行时替换所有文本资源。所以我保留了现有的站点,并在开始时添加了一些脚本

<? include("translation_module.php?")?>
<html>
hello <?=$username?>

你好
这个翻译将“hello”替换为“bonjour”

有什么线索可以做到这一点吗

我不关心语法、货币和货币问题。

  • 我想它应该像谷歌翻译一样工作:它应该自己执行,然后翻译,然后输出文本,最后打印出结果(当然我不知道它是怎么做的,它如何处理$GET,$POST,$SESSION变量…)

感谢

从理论上讲,这可能适用于如此简单的情况,但在实践中却行不通。对于包含注入变量但仍然需要翻译的字符串呢?例如:

You have <?= $inboxCount?> messages in your inbox
您的收件箱中有邮件

如果语法要求“消息”必须出现在数字之前,则不能将其翻译为任何语言。记住,这只是一个简单的例子;任何花了大量时间使用i18n的人都会告诉你,如果你想要一个合适的解决方案,你必须将所有字符串外部化,彼此独立。

从语法角度看,这是行不通的,因为有些句子非常复杂,无法通过翻译器在主语言中正确翻译,正如@Jon所说,语法有时要求不同的值

我建议你做的是,你用多种语言编写或翻译你的主要内容,当用户指定一种语言时,你的网站只需跳过,主要内容是明智的。我怀疑你是否有一个论坛,你希望每个人都用(例如)三种语言发表他们的文章


由于语法的原因,有些事情可能还需要使用if-else语句。

您可以通过使用somes对象来实现这一点

<?
class LocalizationFR{

     public function getHelloMessage(){
          return "bonjour";
     }
}

class LocalizationEN{

     public function  getHelloMessage(){
              return "Hello";
     }
}

class Localization{

     public function setHelloMessage(){
          array_push('messages', array('locale' => 'fr', 'message' => LocalizationFR::getHelloMessage()));
          array_push('messages', array('locale' => 'en', 'message' => LocalizationEN::getHelloMessage()));
     }

     public static function getHelloMessage($locale){
          return $this->messages[$locale];
     }

    }


对吗?

您想要的是不可能的。如果不通过过滤器(如Google translate)运行所有输出,则很可能无法完成,因为您无法指明哪些文本应该翻译,哪些文本应该单独翻译,如$username。此外,你会在复数、货币等方面遇到问题。不劳无获。没有人说i18n很容易。要真正实现您的要求,您需要:使用HTML解析器浏览文件,过滤掉PHP标记,或者使用PHP解析器浏览文件并过滤掉HTML。希望你剩下的是原始文本。然后尝试将文本分解为有意义的、可翻译的部分。这一步真的很难。在单词上分开很容易,但会给你留下毫无意义的翻译。在句子上分开可能会很棘手,特别是在里面有变量的情况下。一旦你有了它,只需更换零件。总的来说:这是一种错误的方法。即使在理论上,这也几乎不可能。翻译依赖于语境。OP不想给他的文件添加任何额外的翻译上下文。@zerkms:True。。。“可能是”更合适。嗯,只有两个字符串!“你的盒子里有”->“你的”留言”->“你的留言”它可以工作perfectly@user300675当前位置它用法语工作。试试中文。正如我所说,如果你花了很多时间做i18n,你就会知道这是行不通的(在一般情况下)。你不必相信我;看看所有PHP框架是如何做到这一点的。这是有原因的。@user…即使你只关心法语和英语,我100%肯定你会发现它根本就不能像那样翻译成1:1。如果你不这么认为,你对人类语言一无所知。而且,如果你需要翻译多种语言,别忘了使用%s这样的替换模式来进行翻译,然后,你可以将你的网站翻译成所有语言。您好,这与我试图实现的正相反!
<?
class LocalizationFR{

     public function getHelloMessage(){
          return "bonjour";
     }
}

class LocalizationEN{

     public function  getHelloMessage(){
              return "Hello";
     }
}

class Localization{

     public function setHelloMessage(){
          array_push('messages', array('locale' => 'fr', 'message' => LocalizationFR::getHelloMessage()));
          array_push('messages', array('locale' => 'en', 'message' => LocalizationEN::getHelloMessage()));
     }

     public static function getHelloMessage($locale){
          return $this->messages[$locale];
     }

    }
<?php echo Localization::getHelloMessage('fr'); ?>