我们如何将现有的Web应用程序转换为多语言的应用程序?

时间:2020-03-06 14:58:09  来源:igfitidea点击:

我将在一个项目中工作,该项目需要调整一个相当大的Web应用程序以处理几种语言。这东西是用手工制作的PHP代码运行的,但是很干净。

我想知道这样做的最佳方法是什么?

  • 自己制作东西,尝试适合实际的体系结构。
  • 使用将为我管理i18n的框架(例如Symfony)重写其中的很大一部分吗?

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

我想到了一个替代方案:仅将Symfony用于翻译,但是将控制器设置为按原样加载网站。很快,但是很脏。另一方面,它使我们可以进行下一个修改,然后慢慢过渡到完整的Symfony:此网站确实是一个不错的选择。

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

解决方案

使用语言文件。

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

那是针对小型网站的。

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

我们可以看一下Zend_Translate,它非常全面,文档齐全,整体代码质量也很好。它还允许我们将统一的API用于gettext,csv,db,ini文件,数组或者最终将转换后的字符串保存到其中的任何内容。

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

如果支持多字节字符,那么值得检查一下PHP中的多字节字符串函数:

http://uk.php.net/manual/zh/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 %}

因此,避免重复,并充分利用已有的翻译,这里遗漏了例如阿拉伯月的名称,这些名称会在引擎团队添加或者应用时直接显示

有许多解决方法。它们都不是"最佳方法",并且它们都短期或者长期都存在问题。
首先要说的是,多语言站点并不容易,翻译人员和可爱的人却很难与他们合作,并且大多数程序员都认为该问题只是技术上的问题。关于我们正在翻译还是本地化,还有另一个维度,超出了此答案的范围。这包括查看目标受众的文化习俗,然后针对该文化定制语言,样式,布局,颜色,字体等。最后,不要将MT(机器翻译)用于任何严重的问题或者需要准确的事情,并且在获取翻译人员时,请确保他们将外语翻译成母语,这意味着他们了解目标语言的所有细微差别。

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

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

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

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

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

  • 国际化:也就是说,使网站能够处理多种语言
  • 本地化:这包括将文本(在步骤1中获得)翻译成我们计划支持的每种语言

有关更多信息,请参见Wikipedia。

步骤1要求我们考虑以下事实:某些语言是从右到左(RTL)书写的,并且是非欧洲字符,例如日语或者中文。如果我们不打算使用这些语言和字符,则可能会更简单。

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

  • 扫描网站以查找应本地化的每个文本
  • 对于每个页面/部分,我将创建一个$ lang ['sectionname'] []`数组
  • 对于每个文本,我都会创建一个$ lang ['sectionname'] ['textname']`条目
  • 我将创建一个Lang.php类,该类将在实例化时接收一个lang参数,但是如果没有收到lang则将具有默认值(此方法根据参数或者默认值加载langcode.php)使用我们喜欢的语言)
  • 该类将具有一个setPage()方法,该方法将接收要显示的页面/部分
  • 该类将具有一个show()方法,该方法将接收要显示的文本(与给定页面中显示的文本一样,将调用show()的次数很多。show()是一种echo $ lang ['mypage'] ['mytext']`的包装图)

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

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

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