23

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

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

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

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

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

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

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

4

6 回答 6

15

使用语言文件。

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

这适用于小型网站。

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

于 2008-10-01T09:57:30.767 回答
12

有很多方法可以解决这个问题。它们都不是“最好的方法”,而且它们都存在短期或长期的问题。首先要说的是,多语言网站并不容易,翻译人员和可爱的人但很难与之合作,大多数程序员仅将问题视为技术问题。在此答案的范围之外,还有另一个维度,即您是在翻译还是本地化。这涉及查看目标受众的文化习俗,然后根据该文化定制语言、风格、布局、颜色、字体等。最后不要使用 MT,机器翻译,

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

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

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

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

于 2009-10-25T07:50:34.413 回答
3

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

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

在 Wikipedia 中查看更多信息

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

对于这种情况,我希望有一个语言文件(实际上与我计划支持的语言一样多的语言文件,将每个文件命名langcode.php为 inen.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 中),然后可以“另存为...”其他语言。

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

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

于 2009-10-25T08:09:51.863 回答
2

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

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

于 2008-10-01T11:00:09.850 回答
1

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

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

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

于 2008-10-01T11:07:09.990 回答
-2

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

因此,避免重复并充分使用已经存在的翻译,在这里,当引擎团队添加或应用程序时,丢失的例如阿拉伯月份名称会直接出现

于 2009-10-25T04:31:39.887 回答