Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.PO到.MO-编程转换(PHP)_Php_Windows_Linux_Translation_Gettext - Fatal编程技术网

.PO到.MO-编程转换(PHP)

.PO到.MO-编程转换(PHP),php,windows,linux,translation,gettext,Php,Windows,Linux,Translation,Gettext,我计划允许用户通过PHP用户界面生成.POT文件/.PO文件,作为CMS解决方案的一部分。一旦生成这些文件(简单一点),我希望允许我的系统自动将这些文件转换为.MO文件,以响应用户(POST)请求 因此,我看到以下问题: 我知道我可以通过使用PHP的exec()函数运行msgfmt,但如果我没记错的话,这似乎是Linux唯一的解决方案?我如何在其他操作系统上做到这一点?如果有人愿意演示的话,一些关于如何在实践中做到这一点的示例代码也会非常有用。这与我通常做的工作大不相同 目前这只是一个概念,但

我计划允许用户通过PHP用户界面生成.POT文件/.PO文件,作为CMS解决方案的一部分。一旦生成这些文件(简单一点),我希望允许我的系统自动将这些文件转换为.MO文件,以响应用户(POST)请求

因此,我看到以下问题:

我知道我可以通过使用PHP的
exec()
函数运行
msgfmt
,但如果我没记错的话,这似乎是Linux唯一的解决方案?我如何在其他操作系统上做到这一点?
如果有人愿意演示的话,一些关于如何在实践中做到这一点的示例代码也会非常有用。这与我通常做的工作大不相同

目前这只是一个概念,但我希望我的思路是正确的。如果您对这种方法有任何其他想法/建议,我很乐意听取。背景资料如下

其他背景信息-不需要:


我通过解析只包含基本HTML的简单模板文件和调用
来检索原始英文文本。这些模板在编辑/保存时进行分析,并检索语言条目。然后将生成.POT文件。用户现在必须手动编辑翻译(通过简单的界面,而不是直接编辑),以更新/准备所有.PO文件。完成后,我需要能够将它们转换为.MO文件,这是我问题的标题。

PHP的
exec
msgfmt
GNU gettext实用程序都不是linux唯一的解决方案。他们在多个计算机系统上工作。与PHP一样,您可以为多个平台编译(这是很自然的),因此
exec
命令可以在多个系统上使用,这同样适用于
msgfmt
。从开始为您的系统获取一个版本。

如果您正在寻找的是
msgfmt
,也有仅PHP的重新实现:

  • /
作为替代方案,还有webapp及其脚本,但其中必须包含一些.mo转换函数。。。(哦,不,它是用Python编写的。)

试试看


@marioThat php.mo类看起来很棒。谢谢你让我注意到这一点——我很快就会给出答案!您是否知道是否有任何PHP实现也可以扫描给定的目录来创建POT文件?我已经在谷歌上搜索过了,但到目前为止还没有找到任何东西。这只需要一个简单的正则表达式并读取文件。我确实见过这样的事情。大多数使用双下划线
的PHP应用程序都有一个gettext包装函数。IIRC你可能会在例如PhpWiki中找到一个。(用谷歌搜索另一个……出人意料的困难)回想起来,我也看到Magento使用了双下划线。我可能会看看他们做了什么。我所能想到的只是一个
glob()
preg\u match\u All()
(正如您所建议的),尽管我可以想象如果应用程序足够大,执行时间会非常糟糕。。。无论如何,再次感谢。php.mo的链接已失效,您能修复它吗?尝试了这两种方法,都无法创建有效的.mo,只有最后一个.po密钥从.mo导入
use Gettext\Translations;
chdir('....');
        $translations = Translations::fromPoFile('messages.po');
        $translations->toMoFile('messages.mo');