翻译数据库驱动内容的最佳方法
-
14-12-2019 - |
题
基本上我有一个cms,它使用模板系统来将所有数据从数据库解析到屏幕。到目前为止,我将在不同文件夹中“分开”我的模板,以便能够翻译与文本,页脚链路等类似图像的“静态”。
但是,有许多模块(页面,新闻,产品),具有需要翻译数据库驱动方法的多个字段。我开始用一个描述语言(id,iso_code,name)的“语言”表。就像我来的那样..因为有几个必须完成的项目,我迄今为止没有更多的时间去这个主题。我的第一个想法(“快速修复”)是在表中添加多个字段(如“title_nl”,“title_n”),但这实际上使得数据库比我认为所需的数据库更拥挤。
我的第二个想法是创建一个表,例如“news_translations”。其中包含语言ISO代码,news_id,需要翻译的字段。显然,news_id将转换连接到它的原始,语言ISO代码用于从数据库中获取合适的语言。然后在我的前端代码中我将首先检查选择默认语言(=>从“新闻”表)或翻译(=>检查在翻译表中)。如果第二个案例不返回任何结果,则显示消息“抱歉,不可用翻译”并且显示默认值(或错误消息,适合客户最佳。
但是,那么有一个第3个选项..我的网站都使用搜索引擎友好的链接(www.domain.com/pagename/或www.domain.com/news/1-news-itemoy.html)。如果我在翻译表中的SEF URL“覆盖”SEF URL的能力,那就更好了。但我想在这种情况下,我始终需要1个额外查询到翻译表(因为我们首先想要检查翻译页面)......猜猜这不是那么大的交易,但它值得考虑我猜。
最后我猜通过描述我的选择第3号是我需要的。但我也想对这个主题有一些其他意见!这就是我想要实现的:
- 创建具有多语言支持的CMS系统
- 无语言文件(显然这就是为什么我使用模板)
- 能够翻译原始页面/ newsitem / product
- 可选择:根据语言更改SEF URL
我认为选项3具有所有这些..因此创建此解决方案的步骤是:
-
为每个项目创建一个_translation表(或者也许是在 原始通过添加2个新字段'translation_to'(包含 primaryKey)和“翻译_IS”(包含ISO代码) - 但是.. 在这种情况下,所有字段都需要被编辑(这并不总是 必要的。加上创建第二张表我保留原件 划分他们的翻译,右?)
-
如果未选择默认语言首先查询翻译表以查找翻译,如果找到一个显示 翻译。否则地通知/或显示用户和/或显示 原文(基于SEF URL ...如果找不到SEF 在翻译或原始表中,那么显然显示一个 仅限错误)。
任何建议? : - )
感谢沿着思考!
解决方案
我想看看你的表结构看起来像什么。可能是您可以做的最好的事情是生成两个单独的新表,命名为“ content_multi_lang ”&“ site_locales ”。
然后在打印出内容的代码中,对语言标志进行初始检查。我会为加载静态内容创建两个单独的类,类似于“ content_load标准的”和“ content_loadmultilang ”。所以那么你的条件看起来像这样。if ($this->site_locale == 'standard'){
$contentLoader = new Content_LoadStandard();
} else {
$contentLoader = new Content_LoadMultiLang($this->site_locale);
}
$content->blah($cheese);
.
你的“ content_multi_lang ”表应该是标准CMS对象表的缩小版本,仅包含需要以替代语言的相关内容字段。
// PSEUDO SQL
CREATE TABLE `LOCALE` (
`id` int(11),
`locale` varchar(16), // name of locale (language)
... // any other fields
)
CREATE TABLE `CONTENT_MULTI_LANG` (
`id` int(11),
`pcid` int(11), // parent content id
`lid` medint(), // locale id
`content` {$type}, // whatever type you use (varchar, text, bin, etc)
... // any other fields
)
.
在 content_loadullang 类中,使用连接创建查询备用内容的方法。
提示:可能是在表中建立关系的好主意,以便在内容行上进行级联删除,如果您在标准中删除内容,则也将删除多语言版本。
其他提示
从Drupal看到的,选项三是他们如何处理它,几个调整。它们将其全部保留在一个桌子和一个名为语言的领域。然后有一个单独的表,即地图连接哪些项目。
这种方式是主要语言不可知论,这意味着内容可以以任何语言创建,而无需在任何其他语言中进行翻译。