php - 多语言 PHP 网站的最有效方法

标签 php mysql performance multilingual gettext

我正在开发一个大型多语言网站,我正在考虑使用不同的方法使其多语言。我能想到的可能替代方案是:

  • Gettext生成 .po 文件的函数
  • 一个 MySQL 表,其中包含每个文本的翻译和唯一字符串 ID
  • PHP 文件的数组包含具有唯一字符串 ID 的不同翻译

  • 据我所知,Gettext 函数应该是最有效的,但我的要求是应该可以更改原始引用语言(英语)中的文本字符串,而该字符串的其他翻译不会自动恢复为英语,仅仅因为几个字变了。这可以用 Gettext 实现吗?

    资源要求最低的解决方案是什么?
    使用带有数组的 Gettext 函数或 PHP 文件或多或少对资源的要求相同吗?
    对于更有效的解决方案,还有其他建议吗?

    最佳答案

    几点考虑:

    1. 翻译
    谁来做翻译?也连接到该站点的人?翻译公司?使用 Gettext 时,您将使用“pot”(.po) 文件。这些文件包含消息 ID 和消息字符串(翻译)。例子:

    msgid "A string to be translated would go here"  
    msgstr ""

    现在,对于需要翻译它的人来说,这看起来很好并且可以理解。但是当你使用关键字而不是完整的句子时会发生什么,就像迈克建议的那样?如果有人需要翻译名为“address_home”的 msgid,他或她不知道这应该是标题“家庭地址”还是一个完整的句子。在这种情况下,请确保在调用 gettext 函数之前向文件添加注释,如下所示:
    /// This is a comment that will be included in the pot file for the translators
    gettext("ready_for_lost_episode");
    

    使用 xgettext --add-comments=///创建 .po 文件时将添加这些注释。但是,我不认为 Gettext 应该以这种方式使用。此外,如果您需要为要显示的每个文本添加注释,您将 a) 可能在某个时候出错,b) 无论如何,您的整个脚本都将填充文本,仅以注释形式,c)注释需要直接放在 Gettext 函数上方,这并不总是很方便,具体取决于函数在代码中的位置。

    2.维护
    一旦您的网站增长(甚至进一步)和您的语言文件,以这种方式维护所有不同的翻译可能会变得非常困难。每次添加文本时,您都需要创建新文件,将文件发送给翻译人员,将文件接收回来,确保结构仍然完整(热心的翻译人员也总是乐于翻译语法,从而使整个文件无法使用 :)),并完成导入新翻译。这是可行的,当然,但要注意大型站点和许多不同语言在这方面可能存在的问题。

    另一种选择:结合您的第二个和第三个选择:

    就个人而言,我发现使用(简单)CMS 管理翻译更有用,将变量和翻译保存在数据库中,然后自己将相关文本导出到语言文件:
  • 向数据库添加变量(例如:id、page、variable);
  • 为这些变量添加翻译(例如:id、varId、language、translation);
  • 选择相关变量和翻译,将它们写入文件;
  • 在您的站点中包含相关的语言文件;
  • 创建您自己的函数来显示变量文本:
  • text('var');或者像 __('faq','register','lost_password_text');
    第 3 点可以很简单,只需从数据库中选择所有相关变量和翻译,将它们放入数组并将序列化数组写入文件。

    好处:
  • 维护。对于大型项目,维护文本会容易得多。您可以按页面、部分或站点内的其他部分对变量进行分组,只需将一列添加到您的数据库中,定义此变量属于站点的哪个部分。这样你就可以快速拉出一个列表中使用的所有变量,例如常见问题页面。
  • 翻译。您可以在一个页面上显示包含所有不同语言的所有翻译的变量。这对于可以同时将文本翻译成多种语言的人来说可能很有用。查看其他翻译以了解上下文可能很有用,以便翻译尽可能好。您还可以查询数据库以找出已翻译的内容和未翻译的内容。也许添加时间戳以跟踪可能的过时翻译。
  • 使用权。这取决于谁来翻译。如果需要,您可以使用简单的登录来封装 CMS,以授予来自翻译机构的人员的访问权限,并且只允许他们更改某些语言甚至站点的某些部分。如果这不是一个选项,您仍然可以将数据输出到可以手动翻译并稍后导入的文件(尽管这可能会带来与前面提到的相同的问题。)。您可以添加一个已经存在的翻译(英语或其他主要语言)作为翻译的上下文。

  • 总而言之,我认为您会发现您可以通过这种方式对翻译进行更多控制,尤其是从长远来看。与 native gettext 函数相比,我无法告诉您有关此方法的速度或效率的任何信息。但是,根据语言文件的大小,我认为这不会有很大的不同。如果按页面或部分对变量进行分组,则始终可以只包含所需的部分。

    关于php - 多语言 PHP 网站的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2806886/

    相关文章:

    mysql - 使用全连接但不使用左连接时出现问题。为什么?

    mysql - 每次 COUNT() 函数,还是存储值并将其递增 1?

    java - if 条件的顺序会影响性能吗?

    php - XAMPP 3.2.1 虚拟主机不工作

    php - php中的位置比较

    mysql - MySQL 中的数据库注释/说明

    sql - 用于搜索 CSV(或类似数组)的 MySQL 命令

    google-chrome - 为什么我的 Google Chrome 扩展程序的弹出 UI 在外接显示器上滞后,而在笔记本电脑的 native 屏幕上却没有?

    php - WAMPserver,两个php.ini文件

    php - mySQL UPDATE 查询本地文件路径