2

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

我所做的是,我从头开始实现了所有内容:一个安全包,一些基本实体,如 Business {name, location, phone, email, information, etc.}, BusinessCategory {name, information etc.} 和一些自定义但它们之间的简单关系。用户可以成功注册一个帐户,然后注册他们的业务。我还通过使用 config.yml 中的语言环境和一些自定义的英语翻译,比如中文或西班牙语,为网站上显示的每个单词或短语实现了翻译。用户可以单击“英语”或“西班牙语”链接,所有内容都会被翻译成选定的语言,并且网站别名从 website.com/en 更改为 website.com/es。

我的下一步是:

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

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

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

我主要担心的是:

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

  • 连接的表会发生什么?用户表链接到业务表,业务表链接到组表。如果我只对 Business 表使用可翻译的扩展,它将如何影响其他的?

4

2 回答 2

4

两年前,当我检查它时,我承认并没有深入研究这个问题,所以对答案持保留态度。但:

如果我使用可翻译的捆绑包,将为每个企业创建一个额外的行。它们将如何连接?

有几种方法可以在同一数据库中保存多语言数据。

第一个,最简单,最常见的是管理子表。本质上,如果您有一个名为 的表company,您将创建和管理另一个表,例如,company_translations或按该顺序排列的东西,带有company_idlocale字段,其中包含已翻译的字段。在应用程序级别,您可以相应地传播属性调用。有时,主表会保存基本语言环境的翻译。这里的一个大问题是额外的连接来获取所有需要的细节。另一个是您失去了在 SQL 级别定义的排序规则的好处。

另一种方法是将所有内容都放在同一个表中,同时使用具有该名称的字段保留对语言环境的引用,并将基本语言环境作为某种parent_id. 这里的理由是,不管怎样tagssectors你需要的任何东西都需要翻译,所以不妨把所有东西都扔进去。但诚然,这种情况不太常见。这里最大的问题是,您也失去了在 SQL 级别定义的排序规则的好处。

另一种方法是让不同的表集以区域设置为前缀或存在于特定于区域设置的模式中。因此,前者的变体没有引入与排序相关的问题,但代价是在应用程序级别引入了对表前缀或搜索路径的担忧。

最后一个选项是完全不用担心,为每个语言环境创建完全不同的表集——本质上是一个新应用程序。无论它们是在单独的(和独立的)模式还是数据库中都无关紧要。(Fwiw,这是我的首选方法;见下文。)

如果没记错的话,Doctrine 会使用这些方法中的第一种,并在主表中使用基本语言环境——但通过测试和查看一组已翻译表的结构来仔细检查以确保。

我的意思是,ID 为 1234 的 X 业务将是西班牙语,而名称翻译为 Y 的同一个业务将具有 ID 1235。 symfony2 如何知道这两个业务在不同的语言环境中是同一个业务?

见上文,但请注意,除非您正在为居住在美国的西班牙裔人口建立一个网站,否则这可能是您最不担心的问题——即使如此,恕我直言,担心它是值得怀疑的。

这里要记住的一点是,如果您en_US向用户提供网站的逐字副本es_MX,那么您很可能在营销/传播方面做了一些非常错误的事情:您根本不会与这两个群体进行相同的沟通方法。一种论点可能迎合其中一种人群而推迟另一种论点,例如“Gringos no son bienvenidas”。此外,如果您在不存在适当的翻译时回退到为意外的语言环境提供服务,那么您可以说是在损害您的听众。

连接的表会发生什么?用户表链接到业务表,业务表链接到组表。如果我只对 Business 表使用可翻译的扩展,它将如何影响其他的?

见第一点。从好的方面来说,Doctrine 的行为会为你解决这个问题。不利的一面是,您通过使用行为引入了额外的连接。

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

于 2013-05-16T20:07:14.987 回答
3

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

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

它的实现类似于您使用的学说扩展(也使用侦听器),但方法不同。

这里所做的更接近于 OOP 和通常学说的 和 之间的 oneToMany Buisness关系BuisnessTranslation

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

第 2 点:使用_localesymfony2 的本机处理方法,在您的 url 中添加此占位符: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 表连接在一起才能获取 whoe 数据。

于 2013-05-17T14:06:05.273 回答