- 多站点(子目录)方式:推荐方式,最符合 SEO,也最规范,将中文站作为主站,英文站作为子目录(如
www.yourdomain.com/en/)。 - 多语言栏目方式:简单快捷,在同一站点内,通过不同的栏目来区分中英文内容,通过切换语言变量来改变显示。
下面我将详细介绍这两种方法,强烈推荐使用第一种方法。

多站点(子目录)方式(强烈推荐)
这种方式的核心是:
- 一个 DedeCMS 程序,安装在网站根目录。
- 两套数据库,分别存储中文和英文内容。
- 通过
.htaccess文件,将www.yourdomain.com/en/的请求重写并指向 DedeCMS 的index.php,并传递一个语言参数。 - 通过修改 DedeCMS 模板,根据语言参数动态加载不同的内容。
实施步骤:
第 1 步:安装 DedeCMS 和准备数据库
-
在网站根目录(如
public_html)安装一套 DedeCMS 程序。 -
创建两个新的数据库,
dedecms_cn和dedecms_en。 -
登录 DedeCMS 后台,系统设置 -> SQL命令行工具,分别执行
dede目录下的data/sql/cn_sql.sql和en_sql.sql(你需要自己准备一份英文版的初始数据表结构,或者手动导出中文表结构并修改表名前缀)。 -
配置数据库:你需要修改
/data/common.inc.php文件,让它能根据请求动态连接不同的数据库,这需要一些 PHP 知识。// 在 /data/common.inc.php 中添加以下逻辑 $curl = $_SERVER['REQUEST_URI']; if (strpos($curl, '/en/') !== false) { // 英文站数据库配置 $cfg_dbhost = 'localhost'; $cfg_dbname = 'dedecms_en'; $cfg_dbuser = 'your_db_user'; $cfg_dbpwd = 'your_db_password'; $cfg_dbprefix = 'dede_'; $cfg_language = 'en'; // 可以定义一个语言变量 } else { // 中文站数据库配置 $cfg_dbhost = 'localhost'; $cfg_dbname = 'dedecms_cn'; $cfg_dbuser = 'your_db_user'; $cfg_dbpwd = 'your_db_password'; $cfg_dbprefix = 'dede_'; $cfg_language = 'cn'; }注意:这种动态切换数据库的方法比较复杂,更稳健的做法是使用
$_SESSION或$_COOKIE来记录用户选择的语言,然后在每次数据库查询前根据这个值来选择正确的数据库连接,但为了简化,我们先使用上述方法。
第 2 步:配置服务器伪静态(.htaccess)
在网站根目录创建或修改 .htaccess 文件,添加以下规则:
# 如果网站开启了Rewrite,请保留原有的Rewrite规则 # RewriteEngine On # RewriteRule ^(.*)-c-([0-9]+).html /plus/list.php?tid=$2 [Q,L] # RewriteRule ^(.*)-([0-9]+).html /plus/view.php?aid=$2 [Q,L] # --- 新增的英文站伪静态规则 --- # 将 /en/ 开头的请求重写到 index.php,并附加一个 query string RewriteRule ^en/(.*)$ /index.php?language=en&/$1 [Q,L] # 可选:将 /en/ 直接重定向到首页 # RewriteRule ^en/$ /index.php?language=en [L]
这个规则的意思是:所有以 /en/ 开头的请求,都会被传递给 index.php,并且我们设置一个 language=en 的参数。
第 3 步:修改 DedeCMS 模板
这是最关键的一步,我们需要修改模板文件,让它能根据 language 参数来显示不同的内容。
-
修改首页模板
index.htm: 在你需要显示内容的地方,使用 DedeCMS 的arclist或list标签时,通过addfields和channelid等属性来精确控制。<!-- 在首页模板 index.htm 中 --> <div class="news-list"> {dede:arclist row='8' titlelen='30' typeid='1' channelid='1' addfields='en_title'} <li> <a href="[field:arcurl/]">[field:title/]</a> </li> {/dede:arclist} </div>注意:这里需要你在后台为英文内容建立对应的栏目,并且确保文章模型中包含了英文标题字段(如
en_title),你需要修改arclist标签的typeid来调用不同语言栏目的内容。 -
修改全局变量(更推荐的方法): 在模板中,我们可以使用 PHP 代码来判断语言变量,然后动态加载不同的栏目ID或内容。
<!-- 在首页模板 index.htm 中 --> {dede:php} // 获取语言参数 $language = isset($_GET['language']) ? $_GET['language'] : 'cn'; // 根据语言设置不同的栏目ID $news_channel_id = ($language == 'en') ? '10' : '1'; // 假设英文新闻栏目ID是10 {/dede:php} <div class="news-list"> {dede:arclist row='8' titlelen='30' typeid='[field:php]$news_channel_id[/php]'} <li> <a href="[field:arcurl/]">[field:title/]</a> </li> {/dede:arclist} </div> -
创建语言切换按钮: 在网站的头部或底部,放置一个语言切换链接。
<!-- 假设当前页面是 www.yourdomain.com/news/1.html --> <!-- 中文链接 --> <a href="/news/1.html">中文</a> <!-- 英文链接,它会加上 /en/ 前缀,并保留原始路径 --> <a href="/en/news/1.html">English</a>
这个链接可以这样动态生成,避免手动维护:
<a href="{dede:php}echo '/en' . $_SERVER['REQUEST_URI'];{/dede:php}">English</a> <a href="{dede:php}echo str_replace('/en', '', $_SERVER['REQUEST_URI']);{/dede:php}">中文</a>
方法一的优点与缺点
- 优点:
- SEO 友好:
www.yourdomain.com和www.yourdomain.com/en/是两个独立的 URL,搜索引擎可以清晰地识别它们是不同语言版本。 - 结构清晰:数据和逻辑完全分离,易于维护。
- 符合标准:这是 Google 等搜索引擎推荐的国际化和多语言网站标准做法。
- SEO 友好:
- 缺点:
- 配置复杂:需要修改核心文件、配置伪静态、管理两套数据库,对新手有一定门槛。
多语言栏目方式(简单快捷)
这种方式的核心是:
- 一个 DedeCMS 程序,一个数据库。
- 在后台创建两套栏目,中文新闻”和“English News”。
- 所有文章都录入两次,分别对应到两个栏目下。
- 通过模板判断,动态切换显示哪个栏目的内容。
实施步骤:
第 1 步:创建栏目和内容
- 在 DedeCMS 后台,创建“中文新闻”栏目(ID假设为1)。
- 再创建“English News”栏目(ID假设为2)。
- 录入文章时,将中文文章放到“中文新闻”下,将英文翻译文章放到“English News”下。
第 2 步:修改模板(使用全局变量)
-
在后台的“系统” -> “系统基本参数” -> “核心设置”中,添加一个自定义变量,
cfg_language,初始值设为cn。 -
在模板中,使用一个切换语言的链接来改变这个变量,这个链接通常是一个简单的表单。
<!-- 在模板的某个位置,header.htm --> <form name="langform" action="/" method="get"> <input type="hidden" name="l" value="en"> <button type="submit">English</button> </form> <form name="langform" action="/" method="get"> <input type="hidden" name="l" value="cn"> <button type="submit">中文</button> </form>
-
修改
/include/common.inc.php文件,在文件开头添加代码来接收并设置语言变量。// 在 /include/common.inc.php 的最开始 if(isset($_GET['l'])) { $cfg_language = $_GET['l']; } // 将语言变量存入全局,方便模板调用 $GLOBALS['cfg_language'] = $cfg_language; -
修改首页模板
index.htm,使用global标签获取语言变量,并调用对应栏目。{dede:global name='cfg_language'/} <!-- 可以先输出看看变量是否正确 --> <div class="news-list"> {dede:php} $language = $GLOBALS['cfg_language']; $news_channel_id = ($language == 'en') ? '2' : '1'; // 2是英文新闻栏目ID {/dede:php} {dede:arclist row='8' titlelen='30' typeid='[field:php]$news_channel_id[/php]'} <li> <a href="[field:arcurl/]">[field:title/]</a> </li> {/dede:arclist} </div>
方法的优点与缺点
- 优点:
- 简单易行:不需要修改核心文件,不涉及数据库分离,对新手友好。
- 快速部署:可以很快实现一个可用的多语言版本。
- 缺点:
- SEO 不友好:URL 是一样的(如
www.yourdomain.com/news/1.html),搜索引擎无法区分语言版本,可能导致内容重复。 - 维护麻烦都需要手动录入两遍,容易出错和遗漏。
- URL 不规范:不符合国际化的 URL 标准。
- SEO 不友好:URL 是一样的(如
总结与建议
| 特性 | 多站点(子目录) | 多语言栏目 |
|---|---|---|
| SEO | 优秀 | 较差 |
| URL 规范 | 优秀 | 不规范 |
| 维护性 | 数据分离,清晰 | 内容重复,易错 |
| 技术难度 | 较高 | 较低 |
| 推荐度 | ★★★★★ (强烈推荐) | ★★☆☆☆ (仅用于简单测试或小型静态站) |
对于任何有长远发展、重视 SEO 的网站,请务必选择方法一,虽然前期配置复杂一些,但从长远来看,它带来的好处(搜索引擎友好、结构清晰、易于扩展)是巨大的。
对于个人博客、小型展示网站等对 SEO 要求不高的场景,可以考虑使用方法二来快速实现。
