您如何将预先存在的Web应用程序转换为多语言应用程序?
-
03-07-2019 - |
题
我打算开展一个项目,在这个项目中,需要调整一个相当大的Web应用来处理多种语言。事情是用手工制作的PHP代码运行的,但它很干净。
我想知道最好的方法是什么?
-
自己做点什么,试图适应实际的架构。
-
使用将为我管理i18n的框架(例如Symfony)重写其中的很大一部分?
醇>
对于选项1,我应该在哪里存储i18n数据? * .po,xliff,纯DB?
我想到了另一种选择:仅将Symfony用于翻译,而是将控制器设置为加载网站。快,但很脏。另一方面,它允许我们进行下一次修改,慢慢地移动到完整的Symfony:这个网站真的是一个很好的候选者。
但也许有一些独立的翻译引擎可以比整个Web框架更好地完成工作。这有点像用火箭筒杀死飞行......
解决方案
有很多方法可以解决这个问题。他们都不是“最好的方式”。并且所有这些都在短期或长期内存在问题。 首先要说的是,多语言网站并不容易,翻译和可爱的人,但很难合作,大多数程序员只把问题视为技术问题。除了您的翻译或本地化之外,还有另一个维度,在本答案的范围之外。这包括查看目标受众的文化习俗,然后根据该文化定制语言,风格,布局,颜色,字体等。最后不要使用MT,机器翻译,对于任何严重的事情,或者如果它需要准确,并且在获得翻译时确保他们从外语翻译成他们的母语,这意味着他们理解目标语言的所有细微差别。 / p>
右。解决方案。在您不想重写网站的基础上,只需克隆您拥有的网站并将副本翻译成目标语言即可。假设代码库是稳定的,您可以使用VCS来管理任何代码更改。您可以调整网站的各个部分以适应目标语言,例如法语文本平均比同等英语文本大30%,因此使用一个站点来传递这意味着您可能(将)有格式问题并需要交换不同的css文件输入和输出取决于语言。这可能看起来很笨重,但那么这些网站会存在多久?这样做的管理开销可能比其他选项少。
没有重建的第二种方式。用标签替换当前站点中的所有内容,然后将不同的语言放在文件或数据库表中,嗅探用户所需的语言(您是否有注册用户可以提供首选项,或者您是否想要获取浏览器语言标记,或者是它将成为URL dot-com dot-fr,dot-de做出选择)然后用目标语言替换标签。然后,您需要分别解决大小调整问题和图像问题。当Symfony和Zend等框架实现l10n时,此解决方案有效。
然后你可以用框架或gettext重建,并且可能有一个更清晰的解决方案,但是记住框架是为解决其他问题而设计的,而不是翻译,翻译组件已经作为部分解决方案进入框架而不是完整的解决方案。
所有解决方案的最大问题是持续维护。因为您不仅拥有代码库,还拥有多种语言库来维护。除非你们在一个解决方案中都非常聪明和有效,否则对于正在进行的任务来说将是困难的。
其他提示
使用语言文件。
- 用变量 替换每个文本字符串
- 为每种语言创建一个语言文件,并在其中定义每个变量及其相应的文本。 (french.inc,dutch.inc ...)
- 在每个页面中包含正确的文件。 醇>
那是针对小型网站的。
如果变大,请用DB替换文件。 :)
重要的是要注意在翻译之前涉及两个步骤:
- 国际化:即使您的网站能够处理多种语言
- 本地化:这包括将您的文本(在步骤1中获得)翻译为您计划支持的每种语言 醇>
- 针对应本地化的每个文字扫描您的网站
- 对于每个页面/部分,我会创建一个
$ lang ['sectionname'] []
数组 - 对于每个文字,我会创建一个
$ lang ['sectionname'] ['textname']
条目 - 我会创建一个
Lang.php
类,它会在实例化时收到lang
参数,但如果没有lang
,则会有一个默认值received(此方法根据参数加载langcode.php
或默认值,具体取决于您的首选语言) - 该类将有一个
setPage()
方法,它将接收您将要显示的页面/部分 - 该类将有一个
show()
方法,该方法将接收要显示的文本(show()
将被调用多次,因为文本显示在给定页面...show()
是echo $ lang ['mypage'] ['mytext']
的一种包装器。)
醇>
步骤1要求您考虑到某些语言是从右到左(RTL)和非欧洲字符(如日语或中文)编写的事实。如果您不打算处理这些语言和字符,可能会更简单。
对于这种情况,我更喜欢有一个语言文件(实际上和我计划支持的语言一样多的语言文件,将每个语言文件命名为 langcode.php
,如 en.php
或 fr.php
),其关联数组包含站点中使用的所有文本。程序如下:
通过这种方式,您可以以非常简单的方式拥有任意数量的语言。您甚至可以使用语言管理员打开基本语言页面(实际上只是递归地读取数组并在textareas中显示它们)然后可以“另存为...”。其他一些语言。
我在我的网站中使用了类似的方法。这只是一页,但我已经用这个想法制作了多页网站。
如果你有用户提交的内容或一些相当复杂的CMS,那将是一个不同的故事。你可以寻找i18n友好的框架(想到Drupal)。
您可以查看 Zend_Translate ,这是一个非常全面的,记录良好,整体代码质量很好。它还允许您为gettext,csv,db,ini文件,数组或任何最终保存已翻译字符串的内容使用统一的API。
此外,请查看/观看此主题:什么是PHP代码库i18n的好工具/框架?。这似乎与你的问题相似。
我使用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 %}
因此,保持重复并完全使用翻译已经在这里提出了缺少的例如阿拉伯月份名称,当引擎团队添加或应用