在多语言网站中使用PHP Gettext扩展与PHP数组?

ale*_*nco 10 php arrays multilingual gettext

到目前为止,我见过的关于使用gettext而不是数组的唯一两件好事是我不必创建"问候""子数组"(或其所谓的).而且我不必为"默认语言"创建文件夹.

是否有其他使用gettext和php数组用于多语言网站的优点和成本?

使用GETTEXT:

西班牙/ messages.po:

#: test.php:3
msgid "Hello World!"
msgstr "Hola Mundo"
Run Code Online (Sandbox Code Playgroud)

index.php文件:

<?php echo _("Hello World!"); ?>
Run Code Online (Sandbox Code Playgroud)

?的index.php LANG =西班牙语:

<?php echo _("Hello World!"); ?> turns to Hola Mundo
Run Code Online (Sandbox Code Playgroud)

使用PHP ARRAYS:

lang.en.php

<?php
$lang = array(
    "greeting" => "Hello World",
);
?>
Run Code Online (Sandbox Code Playgroud)

lang.es.php

<?php
$lang = array(
    "greeting" => "Hola Mundo",
);
?>
Run Code Online (Sandbox Code Playgroud)

index.php文件:

<?php echo $lang['greeting']; ?> greeting turns to Hello World
Run Code Online (Sandbox Code Playgroud)

的index.php?LANG =西班牙语

<?php echo $lang['greeting']; ?> greeting turns to Hola Mundo
Run Code Online (Sandbox Code Playgroud)

(我首先使用gettext,但我的共享免费托管Zymic不支持.我不想使用Zend_translate,我发现它对我的简单任务来说太复杂了,所以我最终使用了php define,但后来又有人告诉我应该使用数组)

小智 8

我建议使用gettext,我在PHP中做了5年,效果很好.

首先,如果您使用echo _('my text to translate')并且没有翻译,您将在输出中看到原始字符串,这很好.使用类似的数组echo $translation['were is my translation'],没有,你什么也看不见.但要注意,使用poedit并做一个echo _('');不是一个好主意,poedit使用的msgid ""项目信息很可能你不想向你的观众展示,所以必须注意不要试图翻译空字符串:)

此外它还非常快,并且具有复数和东西的一些附加功能,例如poedit通过使用翻译数据库使生活更容易,因此您不能一遍又一遍地翻译相同的内容,那些已经预先填写并标记为"检查一下是否正确".非常舒服.

theby middus提到了你必须编译po文件的缺点,你可以在使用数组时轻松覆盖php文件 - 你只需要覆盖你的mo文件,如果使用poedit,它会在保存文件后进行编译.所以实际上你点击保存并复制文件,sam和编辑php文件一样.

但真正的缺点是,如果你使用mod_php.请注意mod_php,虽然我没有遇到任何难题,但它并不是线程安全的.

这主要是因为你在使用mod_php时必须重新启动你的apache,否则你的gettext调用将会失败(有时候没有返回翻译,有时你最终会得到心爱的白页而没有内容).但是通过使用类似mod_itk的东西(我相信cgi/fastcgi可以做到这一点)你甚至不会再有这个问题了.


Gor*_*kic 7

使用GNU gettext,您可以获得对printf和国际复数形式的占位符的支持.占位符订单可以在翻译中更改或跳过.

PHP文档示例:


<?php
setlocale(LC_ALL, 'cs_CZ');
printf(ngettext("%d window", "%d windows", 1), 1); // gives "1 okno"
printf(ngettext("%d window", "%d windows", 2), 2); // gives "2 okna"
printf(ngettext("%d window", "%d windows", 5), 5); // gives "5 oke"
?>
Run Code Online (Sandbox Code Playgroud)

另一个专业是,您可以使用标准工具进行术语管理,翻译记忆和机器翻译,如@middus所指出的那样.

对于共享环境,Danilo Segan提供了一个很棒的php-gettext库.


tob*_*und 5

使用gettext()最明显的原因当然是源字符串位于它所属的位置.也就是说写这个更有意义

echo _("This is a string");
Run Code Online (Sandbox Code Playgroud)

echo $lang['a_string'];
Run Code Online (Sandbox Code Playgroud)

更不用说你必须为每个可能的翻译制作一个新的变量占位符.使用gettext(),翻译字符串本身就是索引.