Symfony2可翻译捆绑和最安全的多语言方法

时间:2013-04-18 08:11:22

标签: symfony

我在Symfony2上开发了一个特定语言的个人项目网站。编程所有内容通常需要很长时间,因为我喜欢在开发代码时遵循安全的方法,即使它是最愚蠢的事情。我现在的计划是实现我的目录商业网站 - 比如说乐器公司 - 以便来自世界各地的每个人都可以创建一个帐户并注册他们的业务。

我所做的是,我已经从头开始实施了一切:安全套件,一些基本实体,如商业{名称,位置,电话,电子邮件,信息等},BusinessCategory {名称,信息等}}和一些自定义但简单的关系。用户可以成功注册帐户,然后注册他们的业务。我还使用config.yml中的语言环境和一些英语的自定义翻译实现了网站上显示的每个单词或短语的翻译,让我们说中文或西班牙语。用户可以点击“英语”或“西班牙语”链接,所有内容都会被翻译成所选语言,网站别名从website.com/en更改为website.com/es。

我接下来的步骤是:

  • 我希望用户能够注册英语或西班牙语。目前,mysql数据库中只有一个该商家的条目,并且仅存在网站文本的翻译。我希望用户能够输入相同字段的英语数据和西班牙语数据,例如业务的“名称”,地址等。这可能需要2个具有不同语言环境和相同业务的条目。 / p>

  • 我希望网站与目前用户翻译的标签翻译保持一致。这意味着当您选择“西班牙语”时,您将获得西班牙语翻译的所有内容以及该业务的西班牙语行。

  • 我想使用我购买的语言域名如果可能:Website.com,Website.es,Website.it等我希望有人在浏览器的地址栏中输入website.it自动获取意大利语的一切。

我主要担心的是:

  • 如果我使用可翻译捆绑包,则会为每个企业创建一个额外的行。它们将如何连接?我的意思是,ID为1234的X业务将使用西班牙语,而名称翻译为Y的X业务将使用ID为1235. symfony2将如何知道这两个业务在不同的区域设置中是相同的?

  • 联接表会发生什么? User表链接到链接到Group表的Business表。如果我仅使用Business表的可翻译扩展名,它将如何影响其他扩展名?

2 个答案:

答案 0 :(得分:4)

两年前,当我检查出来的时候,我确实没有深入研究这个问题,所以请耐心等待答案。但是:

  

如果我使用可翻译捆绑包,则会为每个企业创建一个额外的行。他们将如何联系?

有多种方法可以在同一个数据库中使用多语言数据。

第一个,最简单,最常见的是管理子表。实质上,如果您有一个名为company的表,则可以创建和管理另一个表,例如company_translations或该订单的某些内容,包含company_idlocale字段,用于保存已翻译的字段。然后,在应用程序级别,您可以相应地传播属性调用。有时,主表将保存基本语言环境的翻译。这里的一个重要因素是获取所有必需细节的额外连接。另一个原因是你失去了在SQL级别定义的collation rules的好处。

另一种方法是将所有内容放在同一个表中,同时使用具有该名称的字段保留区域设置的引用,并将基本区域设置保留为某种parent_id。这里的理性是,例如, tagssectors以及其他任何你需要的东西都需要翻译,所以不妨把所有东西都扔在那里。但它确实不太常见。这里的重点是,在这里,你也失去了在SQL级别定义的整理规则的好处。

另一种方法是使用不同的表集作为区域设置或以区域设置特定的模式生成。因此,前者的变体不会引入与排序相关的问题,代价是在应用级别引入对表格前缀或搜索路径的担忧。

最后一个选项是根本不用担心它,并为每个语言环境创建单独的表集 - 实质上是一个新的应用程序。他们是否处于独立(和独立)模式或数据库中并不重要。 (Fwiw,这是我的首选方法;见下文。)

如果内存服务,Doctrine会使用这些方法中的第一种方法和主表中的基本语言环境 - 但要仔细检查以确保通过测试并查看转换后的表集的结构。

  

我的意思是,ID为1234的X商家将使用西班牙语,而名称翻译为Y的同一商家将使用ID 1235. symfony2将如何知道这两个商家在不同的语言环境中是同一个?< / p>

见上文,但请注意,除非您为居住在美国的西班牙裔人口建立一个网站,否则这可能是您最不担心的问题 - 即便如此,仍然可以担心这个问题。

这里需要注意的是,如果您向en_US用户提供es_MX网站的逐字副本,那么您可能在营销/通讯方面做了一些非常错误的事情:你根本就不会以同样的方式与两个人群沟通。一个论点可能迎合其中一个人群,并将另一个群体关闭,例如“Gringos no son bienvenidas”。此外,如果您在没有适当的翻译时回退到服务于意外的语言环境,那么您可能会对您的受众造成伤害。

  

联接表会发生什么? User表链接到链接到Group表的Business表。如果我仅使用Business表的可翻译扩展名,它将如何影响其他扩展名?

见第一点。从好的方面来说,Doctrine的行为将为您管理。在负面,您通过使用行为引入额外的连接。

我建议的另一种方法是使用两组独立的表并配置Doctrine根据会话的语言环境获取数据的位置。但这是一个非常个人化的观点。

答案 1 :(得分:3)

我是doctrine2的另一个php 5.4+库的作者,它允许翻译实体字段。

第1点:看看https://github.com/knplabs/doctrinebehaviors#translatable

它的实现与您使用的doctrineExtensions类似(也使用监听器) 但是approch是不同的。

这里所做的更接近于OOP和通常的学说之间的一个关系  BuisnessBuisnessTranslation

然后使用存储在特征中的简单API完成正确的转移检索。

第2点:通过在网址中对此占位符进行贴图来使用symfony2的本地_locale处理:  http://symfony.com/doc/current/book/translation.html#the-locale-and-the-url

第3点:使用主机配置路由来定义您的_locale占位符

http://symfony.com/doc/2.2/components/routing/hostname_pattern.html

关注1 :如果您确实纠正了关系数据,则不应该有2个代表同一实体的单独行。 您应该拥有一个具有许多BuisnessTranslations的Buisness实体(每个区域设置一个)。

此BuisnessTranslation表将包含特定于区域设置的数据(名称,描述,...)

关注2 :你必须一起加入Buisness和BuisnessTranlsation表来获取你的数据。