您如何将预先存在的Web应用程序转换为多语言应用程序?

时间:2008-10-01 09:54:16

标签: php symfony internationalization

我打算开展一个项目,在这个项目中需要调整一个相当大的Web应用来处理多种语言。事情是用手工制作的PHP代码运行的,但它很干净。

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

  1. 自己做点什么,试图适应实际的架构。

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

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

    我想到了另一种选择:仅将Symfony用于翻译,而是将控制器设置为加载网站。快,但很脏。另一方面,它允许我们进行下一次修改,慢慢地移动到完整的Symfony:这个网站真的是一个很好的候选者。

    但也许有一些独立的翻译引擎可以比整个Web框架更好地完成工作。这有点像用火箭筒杀死飞行......

6 个答案:

答案 0 :(得分:14)

使用语言文件。

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

    如果变大,请用DB替换文件。 :)

答案 1 :(得分:11)

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

右。解决方案。在您不想重写网站的基础上,只需克隆您拥有的网站并将副本翻译成目标语言即可。假设代码库是稳定的,您可以使用VCS来管理任何代码更改。您可以调整网站的各个部分以适应目标语言,例如法语文本平均比同等英语文本大30%,因此使用一个站点来传递这意味着您可能(将)有格式问题并需要交换不同的css文件输入和输出取决于语言。这可能看起来很笨重,但那么这些网站会存在多久?这样做的管理开销可能比其他选项少。

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

然后你可以用框架或gettext重建,并且可能有一个更清晰的解决方案,但是记住框架是为解决其他问题而设计的,而不是翻译,而翻译组件已经作为部分解决方案进入框架而不是完整的解决方案。

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

答案 2 :(得分:3)

重要的是要注意在翻译之前涉及两个步骤:

  1. 国际化:即使您的网站能够处理多种语言
  2. 本地化:这包括将您的文本(在步骤1中获得)翻译为您计划支持的每种语言
  3. 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加载setPage()关于参数或默认值,取决于您的首选语言)
    5. 该类将有一个show()方法,可以接收您将要显示的页面/部分
    6. 该类将有一个show()方法,可以接收要显示的文本(show()将在给定页面中显示文本的次数被调用多次... echo $lang['mypage']['mytext']是{{1}})
    7. 的一种包装

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

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

      如果你有用户提交的内容或一些相当复杂的CMS,那将是一个不同的故事。你可以寻找i18n友好的框架(想到Drupal)。

答案 3 :(得分:2)

您可以查看Zend_Translate,这是一个非常全面,记录完备的整体代码质量非常好。它还允许您为gettext,csv,db,ini文件,数组或任何最终保存已翻译字符串的内容使用统一的API。

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

答案 4 :(得分:1)

如果它是多字节字符支持,则可能值得在PHP中检查多字节字符串函数:

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

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

答案 5 :(得分:-2)

我使用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

时直接显示