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


How would you transform a pre-existing web app into a multilingual one?

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

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

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

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

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

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

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

使用语言文件。

  1. 将每个文本字符串替换为变量
  2. 为每种语言创建一个语言文件,并在其中定义每个变量及其相应的文本。(法国公司,荷兰公司
  3. ...
  4. 在每个页面中包含正确的文件。

这适用于小型网站。

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

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

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

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

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

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

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

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

在维基百科中查看更多相关信息。

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

对于这种情况,我更愿意拥有一个语言文件(实际上与我计划支持的语言一样多的语言文件,将每个文件命名为langcode.phpen.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']

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

我在我的网站中使用了类似的方法。虽然它只有一页,但我用这个想法制作了多页网站。

如果您有用户提交的内容或一些相当复杂的CMS,那将是另一回事。你可以寻找对i18n友好的框架(Drupal浮现在脑海中)。

你可以

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

另外,查看/观看此线程:什么是 php 代码库的 i18n 的好工具/框架?这似乎与您的问题相似。

如果是多字节字符支持,那么可能值得查看 PHP 中的多字节字符串函数:

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

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

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

{% 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 %}

因此,避免重复并完全使用已经存在的翻译,可以在这里显示缺少的例如阿拉伯月份名称,以便在引擎团队添加或应用程序时直接出现