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

时间:2012-01-10 10:53:23

标签: php mysql localization poedit

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

2 个答案:

答案 0 :(得分:13)

首先,您需要告知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的聪明之处在于,如果没有翻译,你就不会有像#34; 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/

答案 1 :(得分:0)

参见(和探索)http://php.net/manual/en/book.gettext.php。该页面上有用户评论,可以让您了解如何处理。

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

重复