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

标签 php mysql localization poedit

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

最佳答案

首先,您需要告知 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 所做的任何更改都不会生效。有很多 hack 可以解决这个问题,但老实说,它们大多不是很漂亮(它们包括复制 .mo,在它后面添加 time() 然后再次导入和缓存它)。如果您不打算一次翻译整个内容,而是分块翻译,最后一段才重要。

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

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

关于php - 如何在 php 中运行或加载 .po/.mo 文件进行本地化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8802093/

相关文章:

javascript - 在 laravel 中的 razorpay 响应后缺少路由所需的参数

javascript - 在 Bootstrap 模式内的 Laravel 中表单提交

Mysql (LEFT)JOIN 如何解释这种行为?

php - 构建 PHP 代码以链接对象创建和数据库写入?

php - 提高查询速度 Ionic/Laravel 发布请求

mysql - 如何从最近的 20 行中随机选择 5 行?

import - mysql:设置插入的列默认值

Android 模拟器不显示印地语字体

java - 使用语言环境 ID 时应该使用 _(下划线)还是 -(破折号)?

ios7 - 更新 : Localization stopped working in existing iPad app