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

Rah*_*eel 1 php mysql localization poedit

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

Mar*_*sen 13

首先,您需要通知PHP您正在使用的区域设置和域.

putenv("LANG=da_DK"); 
setlocale('LC_ALL', "da_DK"); 
bindtextdomain("mycatalog", "./locale/");  
textdomain("mycatalog");
Run Code Online (Sandbox Code Playgroud)

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

为了显示您的翻译,您将执行以下操作:

echo _("Hello world");   // Which would become "Hej verden"
Run Code Online (Sandbox Code Playgroud)

_(); 是gettext()的别名; 关于gettexts的聪明之处在于,如果没有翻译,你的UI中就不会有像"MSG_HELLO_WORLD"那样丑陋的语言代码,而是一个更好的选择:简单的英文文本.

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

msgid "Hello world!"
msgstr "Hej verden!"
Run Code Online (Sandbox Code Playgroud)

将此文件添加到.po文件后,在poedit中打开此文件,点击"保存",它将生成一个.mo文件.此文件上载到.po文件所在的目录(通常类似于脚本根目录中的\ locale\da_DK\LC_MESSAGES \)

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

echo sprintf(_("My name is %s"), $name);
Run Code Online (Sandbox Code Playgroud)

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

echo sprintf(_("The color of my house is %s"), _($color));
Run Code Online (Sandbox Code Playgroud)

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

重要的是要注意,第一次在服务器上运行.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/