【问题标题】:How would you transform a pre-existing web app into a multilingual one?您如何将现有的网络应用程序转换为多语言应用程序?
【发布时间】:2010-09-14 11:44:14
【问题描述】:

我将从事一个项目,其中需要调整一个相当大的网络应用程序以处理多种语言。这个东西使用手工制作的 PHP 代码运行,但它非常干净。

我想知道最好的方法是什么?

  1. 我自己做一些东西,试图适应实际的架构。

  2. 使用将为我管理 i18n 的框架(例如 Symfony)重写大部分内容?

对于选项 1,我应该将 i18n 数据存储在哪里? *.po、xliff、纯数据库?

我想到了一个替代方案:仅使用 Symfony 进行翻译,但将控制器设置为按原样加载网站。很快,但很脏。另一方面,它允许我们进行下一次修改,慢慢转向完整的 Symfony:这个网站确实是一个很好的候选者。

但也许有一些独立的翻译引擎会比整个网络框架做得更好。有点像用火箭筒杀死苍蝇……

【问题讨论】:

    标签: php symfony internationalization


    【解决方案1】:

    使用语言文件。

    1. 用变量替换每个文本字符串
    2. 为每种语言创建一个语言文件,并在其中定义每个变量及其对应的文本。 (french.inc, dutch.inc ...)
    3. 在每个页面中包含正确的文件。

    这适用于小型网站。

    如果变大,请用数据库替换文件。 :)

    【讨论】:

    • 我认为这是一个非常优雅的解决方案,不知道为什么它只有 3 票。
    • 这个答案应该是最重要的,因为它既简单又有效。
    • 优雅?简单的?不好了。 @Veynom 说它适用于小型网站是绝对正确的。当您打开代码并看到变量而不是英语(或您的第一语言)的文本字符串时,维护起来会变得越来越麻烦。
    【解决方案2】:

    有很多方法可以解决这个问题。它们都不是“最好的方法”,而且它们都存在短期或长期的问题。 首先要说的是,多语言网站并不容易,翻译人员和可爱的人但很难与之合作,大多数程序员仅将问题视为技术问题。在此答案的范围之外,还有另一个维度,即您是在翻译还是本地化。这涉及查看目标受众的文化习俗,然后根据该文化定制语言、风格、布局、颜色、字体等。最后,不要将机器翻译(机器翻译)用于任何严肃或需要准确的事情,并且在获得翻译人员时确保他们将外语翻译成母语,这意味着他们理解目标语言的所有细微差别。

    没错。解决方案。在您不想重写站点的基础上,只需克隆您拥有的站点并将副本翻译成目标语言。假设代码库是稳定的,您可以使用 VCS 来管理任何代码更改。您可以调整站点的各个部分以适应目标语言,例如法语文本平均比等效的英语文本大 30%,因此使用一个站点来提供这意味着您可能(将)遇到格式问题并需要交换一个根据语言输入和输出不同的 css 文件。这似乎是一种笨拙的方法,但是这些网站将存在多长时间?这样做的管理开销可能比其他选项要少。

    不重建的第二种方式。用标签替换当前站点中的所有内容,然后将不同的语言放入文件或数据库表中,嗅探用户所需的语言(您是否有注册用户可以进行偏好设置或者您是否想要获取浏览器语言标签,或者是它将是 URL dot-com dot-fr,dot-de 做出选择),然后用目标语言替换标签。然后,您需要分别解决尺寸问题和图像问题。当 Symfony 和 Zend 等框架实现 l10n 时,此解决方案有效。

    然后您可以使用框架或 gettext 进行重建,并且可能有更简洁的解决方案,但请记住框架旨在解决其他问题,而不是翻译,并且翻译组件作为部分解决方案而不是完整解决方案进入框架。

    所有解决方案的最大问题是持续维护。因为您不仅有一个代码库,还有多个语言库需要维护。除非你们都在一个解决方案中非常聪明和有效,否则持续的任务将很困难。

    【讨论】:

      【解决方案3】:

      请务必注意,在翻译之前涉及两个步骤:

      1. 国际化:即让您的网站能够处理多种语言
      2. 本地化:这包括将您的文本(在步骤 1 中获得)翻译成您计划支持的每种语言

      See more on this in Wikipedia.

      第 1 步将要求您考虑以下事实:某些语言是从右到左 (RTL) 和非欧洲字符(例如日语或中文)书写的。如果您不打算处理这些语言和字符,它可能会更简单。

      对于这种情况,我希望有一个语言文件(实际上与我计划支持的语言一样多的语言文件,将每个文件命名为langcode.php,如en.phpfr.php),其中包含一个关联数组网站中使用的所有文本。程序如下:

      1. 扫描您的网站以查找应本地化的每一个文本
      2. 对于每个页面/部分,我将创建一个 $lang['sectionname'][] 数组
      3. 我将为每个文本创建一个 $lang['sectionname']['textname'] 条目
      4. 我将创建一个Lang.php 类,该类将在实例化时接收lang 参数,但如果没有接收到lang,则会有一个默认值(此方法加载langcode.php 取决于参数或默认值取决于您的首选语言)
      5. 该类将具有一个setPage() 方法,该方法将接收您将要显示的页面/部分
      6. 该类将有一个 show() 方法,该方法将接收要显示的文本(show() 将被调用与给定页面中显示的文本一样多次...show() 是一种包装器echo $lang['mypage']['mytext'])

      通过这种方式,您可以以非常简单的方式拥有尽可能多的语言。您甚至可以有一个语言管理员,您可以在其中打开基本语言页面(实际上您只是递归地读取数组并将它们显示在 textareas 中),然后可以“另存为...”其他语言。

      我在my site 中使用了类似的方法。虽然只有一页,但我用这个想法制作了multi-page sites

      如果您有用户提交的内容或一些相当复杂的 CMS,那就另当别论了。你可以寻找对 i18n 友好的框架(想到 Drupal)。

      【讨论】:

      • 本地化没有翻译文本。本地化更适应语言环境、货币、文化、受众等。
      • 您说得对,翻译是本地化的一部分:“本地化是通过添加特定于区域设置的组件和翻译文本来使国际化软件适应特定区域或语言的过程。” (维基百科)
      【解决方案4】:

      您可以查看Zend_Translate,这是一个非常全面、有据可查的文档,并且整体代码质量非常好。它还允许您使用统一的 API 来获取 gettext、csv、db、ini 文件、数组或任何您最终保存已翻译字符串的内容。

      另外,请查看/观看此线程:What are good tools/frameworks for i18n of a php codebase?。这似乎与您的问题相似。

      【讨论】:

      • 链接失效了,很遗憾(
      【解决方案5】:

      如果它支持多字节字符,那么可能值得一试 PHP 中的多字节字符串函数:

      http://uk.php.net/manual/en/book.mbstring.php

      这些将更好地处理多字节字符。

      【讨论】:

        【解决方案6】:

        我使用 hl 参数和 gettext 将已经存在的引擎翻译与自己的 .po 结合起来,当引擎或我的 django/gae example 添加时,会出现新的翻译和语言:

        {% get_current_language as LANGUAGE_CODE %}{{ LANGUAGE_CODE }}{% get_available_languages as LANGUAGES %}{% for LANGUAGE in LANGUAGES %}{% ifnotequal LANGUAGE_CODE LANGUAGE.0 %}{{ LANGUAGE.0 }}{% endifnotequal %}{% endfor %}
        

        因此,避免重复并充分使用已经存在的翻译,在引擎团队添加或 app

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-21
          • 2013-01-21
          • 2010-09-16
          • 2016-12-28
          • 2017-09-13
          • 2011-12-07
          相关资源
          最近更新 更多