【问题标题】:Using PHP Gettext Extension vs PHP Arrays in Multilingual Websites?在多语言网站中使用 PHP Gettext 扩展与 PHP 数组?
【发布时间】:2010-02-23 14:58:20
【问题描述】:

到目前为止,我看到的关于使用 gettext 而不是数组的唯一两个好处是我不必创建“问候”“子数组”(或其他任何名称)。而且我不必为“默认语言”创建文件夹。

在多语言网站上使用 gettext 和 php 数组还有其他优点和缺点吗?

使用GETTEXT:

西班牙语/messages.po:

#: test.php:3
msgid "Hello World!"
msgstr "Hola Mundo"

index.php:

<?php echo _("Hello World!"); ?>

index.php?lang=spanish:

<?php echo _("Hello World!"); ?> turns to Hola Mundo

使用 PHP 数组:

lang.en.php

<?php
$lang = array(
    "greeting" => "Hello World",
);
?>

lang.es.php

<?php
$lang = array(
    "greeting" => "Hola Mundo",
);
?>

index.php:

<?php echo $lang['greeting']; ?> greeting turns to Hello World

index.php?lang=spanish

<?php echo $lang['greeting']; ?> greeting turns to Hola Mundo

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

【问题讨论】:

    标签: php arrays multilingual gettext


    【解决方案1】:

    我推荐使用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,它会在保存文件后进行编译.所以实际上你点击保存并复制文件,就像编辑 php 文件一样。

    但真正的缺点是,如果您使用mod_php。请注意,mod_php 不是线程安全的,尽管我从来没有遇到过任何难题。

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

    【讨论】:

      【解决方案2】:

      使用 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"
      ?>
      

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

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

      【讨论】:

      • 当您使用数组时,您仍然可以使用 printf 使用 pladeholders,不是吗? (不过,你没有复数形式)
      • PHP 自己的 gettext 至少对于 mod_php 来说真的很不稳定。不仅是缓存问题,而且在某些刷新时,翻译根本不起作用。所以几乎有一个替换:php-gettext 使用起来非常简单,而不是 setlocale 你使用 _setlocale 等等......
      【解决方案3】:

      使用 gettext() 最明显的优点当然是源字符串位于它所属的位置。 IE。写这个更有意义

      echo _("This is a string");
      

      echo $lang['a_string'];
      

      更不用说您必须为每个可能的翻译制作一个新的变量占位符。使用 gettext() 翻译字符串本身充当索引。

      【讨论】:

      • @tobefound 我同意你的观点,但我发现使用 echo $lang['a_string']; 有两个优点; (实际上现在我使用了 l('string_a);): 1. 由于内容在索引页面之外,因此代码看起来更易读和更紧凑。 2. 如果我想翻译网页的全部内容,我可以将内容复制粘贴到翻译器中(因为 lang.php 只包含短语和单词。
      【解决方案4】:

      在我看来,将二进制格式(gettext 的 .mo 文件)用于 php 等动态语言并没有太大意义。

      然而,gettext 的优点在于存在一个庞大的工具生态系统,您的软件的翻译者可以使用这些工具(例如Poedit)。缺点是您必须在部署之前将 .po 编译为 .mo,而您可以动态替换包含数组的 php 文件。

      另一个缺点是,正如您已经认识到的那样,它并非在所有 php 安装中都可用。

      【讨论】:

        【解决方案5】:

        当用户从下拉列表或任何区域选择任何语言时,然后将所选语言 ID 保存在会话中,例如,

        $_SESSION['language']=1;

        现在根据会话中存储的语言 ID 从数据库表“内容”中获取数据。

        这里有更多细节

        http://skillrow.com/multilingual-website-in-php-2/

        【讨论】:

          猜你喜欢
          • 2019-12-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-23
          • 1970-01-01
          • 2018-03-14
          • 2011-04-17
          相关资源
          最近更新 更多