如何在 php 中运行或加载 .po/.mo 文件以进行本地化

Posted

技术标签:

【中文标题】如何在 php 中运行或加载 .po/.mo 文件以进行本地化【英文标题】:How to run or load .po/.mo files for localization in php 【发布时间】:2012-02-06 19:04:42 【问题描述】:

我已经安装了 poedit 并通过它运行我的文件,它会为它们创建 .po 和 .mo 文件。但是我在加载和使用这些文件来翻译我的文本时遇到了问题。我不知道如何加载或打开翻译文件并显示翻译内容。 任何人都可以帮我解决这个问题。我尝试了所有可能的来源,但没有成功。

【问题讨论】:

它们是另一种更简单的 php 网站翻译解决方案。见phpcs.com/codes/…这是最好的解决方案 【参考方案1】:

首先你需要告诉 PHP 你正在使用哪个语言环境和域。

putenv("LANG=da_DK"); 
setlocale('LC_ALL', "da_DK"); 
bindtextdomain("mycatalog", "./locale/");  
textdomain("mycatalog");

在这种情况下,我有一个丹麦语翻译和一个名为 mycatalog.mo(和 .po)的文件。这些文件(从您的根目录)放置在此处:locale/da_DK/LC_MESSAGES/mycatalog.mo/po

为了显示您的翻译,您将这样做:

echo _("Hello world");   // Which would become "Hej verden"

_();是 gettext() 的别名; gettexts 的聪明之处在于,如果没有翻译,您的 UI 中就不会出现像“MSG_HELLO_WORLD”这样难看的语言代码,而是一个更好的选择:简单的纯英文文本。

在 messages.po 文件中,您必须在此表单上包含所有消息(区分大小写以及使用的逗号、点、冒号等):

msgid "Hello world!"
msgstr "Hej verden!"

当你把它添加到你的 .po 文件中后,你在 poedit 中打开这个文件,点击“保存”,它会生成一个 .mo 文件。该文件与 .po 文件上传到同一目录(通常类似于脚本根目录中的 \locale\da_DK\LC_MESSAGES\)

要翻译动态/可变内容,您可以使用 - 除其他外 - sprintf,以这种方式:

echo sprintf(_("My name is %s"), $name);

在这种情况下,%s 将出现在 .po 文件中;当您拥有翻译后的字符串(包含 %s)时,sprintf 将确保将 %s 替换为变量内容。如果变量也必须翻译,您可以这样做:

echo sprintf(_("The color of my house is %s"), _($color));

那么你不需要为每一种颜色写一个完整的句子,但你仍然可以翻译颜色。

请务必注意,第一次在服务器上运行 .mo 时,它会被缓存 - 如果不重新启动,就无法从缓存中删除此文件(Apache 或类似的东西本身就足够了)。这意味着您在第一次使用 .mo 后对其所做的任何更改都不会生效。有许多技巧可以解决这个问题,但老实说,它们大多不是很漂亮(它们包括复制 .mo,在其后面添加 time(),然后再次导入并缓存它)。仅当您不打算一次翻译整个内容而是分块翻译时,最后一段才重要。

如果您想在某个时候创建​​自己的翻译工具,此工具可帮助您使用 PHP 将 .po 转换为 .mo:

http://www.josscrowcroft.com/2011/code/php-mo-convert-gettext-po-file-to-binary-mo-file-php/

【讨论】:

很抱歉,我仍然没有解决我的问题。 :( 这是我的代码,其中 test.php
  <?php header('Content-type: text/html; Charset=utf-8'); putenv("LANG=de_DE"); setlocale(LC_ALL,'de_DE.utf8'); bindtextdomain('messages','locale/'); textdomain('messages'); echo gettext('This is my English text.'); ?> ,这是我的语言环境文件夹,它具有 de_DE/LC_MESSAGES/ 文件夹,它包含由 poedit 自动创建的 messages.po 和 messages.mo 文件。当我点击 root/test.php 时,它向我显示相同text '这是我的英文文本。'。
我正在使用 xampp 和 microsoft windows xp。 你的 .po 文件外观是什么意思??当我双击该文件时,它在 poedit 中打开并显示我的字符串,它是 gettext 函数中的回显。仅此而已... 请给出任何想法。我不明白这是怎么回事。经过大量谷歌搜索后没有找到任何解决方案。我卸载了 xampp 5.2.9 并现在安装了 5.3.8 但仍然没有解决问题。 您也可以编写 .po 文件 - 您能告诉我们您的 .po 文件的外观吗?【参考方案2】:

查看(并探索)http://php.net/manual/en/book.gettext.php。该页面上的 user-cmets 应该可以让您了解如何继续。

另外,您的问题与 Get translations from .po or .mo file

重复

【讨论】:

这个问题不是重复的,因为它还询问如何生成完整的翻译,并且您提供的链接仅说明所有翻译字符串(而不是最终文档)。

以上是关于如何在 php 中运行或加载 .po/.mo 文件以进行本地化的主要内容,如果未能解决你的问题,请参考以下文章

erp中三大订单COPOMO

PHP Gettext - 没有翻译

如何从 HTML 或 Javascript 调用 PHP 文件 [关闭]

如何在通过ajax加载的html中运行javascript

在 Elixir 或 Erlang 中,如何在运行时动态创建和加载模块?

如何在Elixir或Erlang中在运行时动态创建和加载模块?