我现在一直在努力解决这个问题。我的CMS'已准备好与翻译模块扩展。我一直在想不同的方法,但还没有想到到目前为止最好的方法。

基本上我有一个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具有所有这些..因此创建此解决方案的步骤是:

  1. 为每个项目创建一个_translation表(或者也许是在 原始通过添加2个新字段'translation_to'(包含 primaryKey)和“翻译_IS”(包含ISO代码) - 但是.. 在这种情况下,所有字段都需要被编辑(这并不总是 必要的。加上创建第二张表我保留原件 划分他们的翻译,右?)

  2. 如果未选择默认语言首先查询翻译表以查找翻译,如果找到一个显示 翻译。否则地通知/或显示用户和/或显示 原文(基于SEF URL ...如果找不到SEF 在翻译或原始表中,那么显然显示一个 仅限错误)。

  3. 任何建议? : - )

    感谢沿着思考!

有帮助吗?

解决方案

我想看看你的表结构看起来像什么。可能是您可以做的最好的事情是生成两个单独的新表,命名为“ 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看到的,选项三是他们如何处理它,几个调整。它们将其全部保留在一个桌子和一个名为语言的领域。然后有一个单独的表,即地图连接哪些项目。

这种方式是主要语言不可知论,这意味着内容可以以任何语言创建,而无需在任何其他语言中进行翻译。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top