1

我正在使用 Symfony2 将旧应用程序转换为新应用程序。

一小部分文本是在旧应用程序中翻译的,我使用个人图书馆进行翻译。

目标是:当在 Twig 中调用trans过滤器或{% trans %}块时,我希望 Symfony2 检查是否存在翻译。如果是这样,那么它将使用用户的语言环境返回正确的翻译。这里没有什么陌生的,这就是 Symfony2 的工作方式。

但我面临的是,我的旧图书馆工作得更好一点:如果翻译不存在,那么它将其写入文件以供翻译以供翻译人员注意。我正在使用一个小后台,我们可以看到所有缺失的翻译,因此翻译人员可以自由地工作,作为开发人员,我还可以开发和显示要翻译的文本,因为我知道我不会不必自己将文本添加到翻译文件中。使用后台和在数据库中添加文本的人也可以自由地工作,因为他们知道他们的文本将自动写入文件,翻译人员可以在他们的界面中看到它。

我知道 Symfony2 控制台可以转储所有这些翻译,以便将其写入某些文件中,但是这个系统对我来说有两个问题:

  1. 首先,缺失的翻译与原始文本的书写方式相同,带有我们可以使用或不使用的前缀。这很重,因为它迫使我检查前缀是否在翻译中以检查它是否丢失。而且,网站上显示的文本将带有这个前缀,我不想使用它。
    其实我是想在没有翻译的情况下返回原文,所以xml或者xliff标签里面应该有一个空字符串。更好地检查字符串何时为空。
  2. 其次,大部分文本都在数据库中,由我的控制器动态恢复,我不想提取整个数据库来检查翻译。我需要的是在要翻译数据时写入我的文件。我将自己在网站上导航以“生成”所有翻译文件,这很容易,因为任何机器人都可以在网站内导航(例如,站点地图生成器可以帮助我获取所有网站的 url 以加载它们,然后强制 Symfony2使用trans过滤器或块,然后将丢失的数据写入翻译文件)。然后,当所有页面都加载完毕后,我可以期待所有文本都被发送并写入文件中。
  3. 然后,当然,我需要一个小后台来检查所有翻译。但我猜 Symfony 的朋友们已经为此做了一个捆绑包(事实上,对于 Symfony2,几乎所有东西都有一个捆绑包)。这不是什么大问题,因为我可以自己制作(旧应用程序有它的系统,我可以将它转移到新应用程序中)。

我真的很想为此找到解决方案。

当然,我可以在 Symfony2 中实现我的旧库,并创建我自己的 twig 翻译过滤器(已经这样做了),但是使用原生 Symfony2 系统对我来说会稍微好一些,或者甚至在 vendor 目录中安装另一个包,因为我不想根据捆绑包等来处理开发(因为每个捆绑包都保存了翻译)。

您对此有本机解决方案吗?(如果没有,我会放弃使用自己的库,但它不会像 Symfony2 翻译系统那样漂亮)

编辑(2014 年 2 月 8 日):

我用一个非常简单的系统创建了自己的库,该系统可以在我的 Github 页面上找到。当翻译不可用时,它只是将翻译添加到文件中。

但是,我决定制作另一个库,受此启发,但依赖于数据库。该模块目前正在开发中,但它的系统很简单:

它使用本地翻译加载翻译,如果翻译不可用(即本地翻译返回一个空字符串),它将加载数据库中的所有翻译,具体取决于 translation_domain 值。然后,服务(在控制器和命令行工具中启动)会将所有数据库翻译写入文件中,以便本地翻译器更快地加载它们,并将它们存储在 SF2 缓存中。

4

2 回答 2

2

⚠️ 编辑:我创建的库是Orbitale/TranslationBundle,它有严重的缺陷,所以我停止维护它,不推荐使用它。相反,必须覆盖 Symfony 翻译器,您必须自己处理翻译格式等。

为了一致性和可维护性,我改变了我的期望并接受了原生的 Symfony 行为(即使用后备语言环境,如果没有翻译,则显示初始文本)。

如果您想获得有关如何实现此覆盖的建议,请与我联系。


原答案:

最后,感谢您的帮助。

我尝试了 JMSTranslationBundle,它破坏了 Symfony2 的所有缓存。

最后,我决定创建自己的库,并将它放在 Github 和 Packagist 上,你可以在 packagist.org 上找到它,它的名称为 orbitale/translation-bundle。

它是全新的,所以如果它不完整,请不要怪我!:)

于 2013-11-01T20:57:01.830 回答
1

我想你可能会喜欢https://github.com/schmittjoh/JMSTranslationBundle来实现你的目标。它甚至有你想要的小后台。

于 2013-10-24T09:38:36.863 回答