3

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

4

2 回答 2

14

首先,您需要告知 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/

于 2012-01-10T20:02:28.317 回答
0

请参阅(并探索)http://php.net/manual/en/book.gettext.php。该页面上有用户评论,可以让您了解如何进行。

此外,您的问题是从 .po 或 .mo 文件获取翻译的副本

于 2012-01-10T19:32:16.853 回答