核心思路
DedeCMS 本身不是多语言系统,所以我们需要通过一些技巧来模拟多语言效果,最常用且最灵活的方案是:

为每种语言创建一套独立的栏目和内容,通过模板判断来调用不同语言的数据。
这种方法的好处是:
- 结构清晰:每种语言的内容完全独立,管理方便。
- SEO友好:可以为不同语言设置不同的URL路径(如
/en/,/cn/),有利于搜索引擎收录。 - 扩展性强:未来增加第三、第四种语言也非常方便。
实现步骤详解
我们将以“中英文”双语网站为例,一步步进行操作。
第一步:创建语言栏目
这是最关键的一步,我们需要为每种语言创建一个顶级栏目,然后在每个顶级栏目下创建对应的子栏目。

-
登录 DedeCMS 后台,进入【核心】 -> 【栏目管理】。
-
添加顶级栏目:
- 点击“增加顶级栏目”。
- 栏目名称:中文 (或 English)
- 栏目目录:
cn(或en),这个目录名将用于 URL 中,建议使用英文小写。 - 栏目类型:选择“频道封面”。
- 其他选项:根据需要填写,比如列表模板、文章模板等,可以先留空,后面在模板中统一指定。
- 点击“确定”。
用同样的方法,再创建一个英文的顶级栏目
en。 -
添加子栏目:
(图片来源网络,侵删)- 现在你有了两个顶级栏目:“中文”和“英文”。
- 点击“中文”栏目后面的“增加子栏目”。
- 栏目名称:公司简介 (About Us)
- 栏目目录:
about - 所属栏目:选择“中文”
- 栏目类型:选择“频道封面”或“列表”。
- 点击“确定”。
用同样的方法,在“英文”栏目下也创建一个同名的子栏目
about。重复此操作,为所有需要双语显示的栏目(如“新闻中心”、“产品展示”等)都创建对应的中文和英文栏目。
完成后的栏目结构大概是这样:
- 中文 (顶级, 目录: cn)
- 公司简介 (子栏目, 目录: about)
- 新闻中心 (子栏目, 目录: news)
- English (顶级, 目录: en)
- About Us (子栏目, 目录: about)
- News Center (子栏目, 目录: news)
第二步:添加多语言内容
你只需要在对应的栏目里添加内容即可。
- 在【中文】 -> 【公司简介】栏目里,添加中文的公司简介文章。
- 在【English】 -> 【About Us】栏目里,添加英文的 About Us 文章。
确保每种语言的内容都放在其对应的栏目下。
第三步:创建多语言模板
模板是实现多语言切换和显示的核心,我们需要修改主模板和列表、文章模板。
-
创建语言切换按钮 (模板) 在你的网站头部模板(通常是
head.htm)中,添加一个语言切换区域。<!-- 在 head.htm 中添加 --> <div class="language-switcher"> <a href="{dede:global.cfg_cmsurl/}/cn/">中文</a> | <a href="{dede:global.cfg_cmsurl/}/en/">English</a> </div> -
修改首页模板 (index.htm) 首页需要根据当前URL路径来判断显示哪种语言,我们可以通过 DedeCMS 的
{dede:php}标签来实现。<!-- 在 index.htm 中 --> <div class="main-content"> {dede:php} // 获取当前URL路径,并判断是 'cn' 还是 'en' $pathInfo = isset($_SERVER['PATH_INFO']) ? trim($_SERVER['PATH_INFO'], '/') : ''; if ($pathInfo == 'en') { $currentLang = 'en'; $topId = 2; // 假设“英文”栏目的ID是2,你需要去后台查看并填入 } else { $currentLang = 'cn'; $topId = 1; // 假设“中文”栏目的ID是1 } {/dede:php} <!-- 调用指定顶级栏目下的子栏目作为导航 --> {dede:channel type='top' currentstyle="<a href='~typelink~' class='thisclass'>~typename~</a>"} {dede:php} if ($currentLang == 'cn' && $typetype == 'top' && $id == $topId) { // 如果是中文顶级栏目,则显示其子栏目 $dsql->SetQuery("SELECT * FROM `#@__arctype` WHERE reid = $id ORDER by sortrank"); $dsql->Execute('ct'); while ($row = $dsql->GetArray('ct')) { echo "<a href='{$row['typedir']}'>{$row['typename']}</a> "; } } // 英文同理,这里省略,逻辑类似 {/dede:php} {/dede:channel} <!-- 调用指定语言栏目的内容列表 --> {dede:php} // 根据语言选择要调用的栏目ID $channelId = ($currentLang == 'cn') ? 3 : 4; // 假设中文“公司简介”ID=3,英文“About Us”ID=4 {/dede:php} <h2>{dede:field name='typename' function="GetTypeName(@me, $channelId)"/}</h2> <!-- 获取栏目名 --> {dede:arclist titlelen='50' row='10' channelid='$channelId'} <li><a href="[field:arcurl/]">[field:title/]</a></li> {/dede:arclist} </div>说明:上面的代码是核心逻辑,实际操作时你需要:
- 查看你后台栏目的真实ID,并替换代码中的
1, 2, 3, 4等数字。 - 上述
{dede:php}逻辑比较复杂,更推荐的方法是创建两个独立的首页模板,如index_cn.htm和index_en.htm,然后通过语言切换链接直接指向它们。
- 查看你后台栏目的真实ID,并替换代码中的
-
修改列表页和文章页模板 同样,为列表页和文章页也创建两套模板,如
list_cn.htm,list_en.htm,article_cn.htm,article_en.htm。在语言切换链接中,直接指向对应的模板页面。
<!-- 语言切换链接 --> <a href="/index_cn.htm">中文</a> <a href="/index_en.htm">English</a>
这样,每个页面的模板都是单一语言,逻辑变得非常简单清晰。
第四步:设置URL规则 (伪静态)
为了让URL更美观,也为了区分语言,我们需要设置伪静态规则。
-
进入 DedeCMS 后台,【系统】 -> 系统基本参数 -> 核心设置。
-
找到 “是否使用伪静态”,选择 “是”。
-
点击 “栏目目录默认规则” 和 “文章页默认规则” 旁边的 “修改” 按钮。
-
设置规则:
- 栏目目录规则:
{typedir}/ - 文章页规则:
{typedir}/{aid}.html
- 栏目目录规则:
-
服务器配置:
- Apache:确保
httpd.conf中开启了mod_rewrite模块,并在网站根目录下放置一个.htaccess文件。# .htaccess 文件内容 <IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^cn/([a-z0-9\-]+)/?$ /index.php?tid=$1 [L] RewriteRule ^cn/([a-z0-9\-]+)/([0-9]+)\.html$ /plus/view.php?tid=$1&aid=$2 [L] RewriteRule ^en/([a-z0-9\-]+)/?$ /index.php?tid=$1 [L] RewriteRule ^en/([a-z0-9\-]+)/([0-9]+)\html$ /plus/view.php?tid=$1&aid=$2 [L] </IfModule>
- Nginx:在
nginx.conf的server块中添加以下规则。# Nginx 规则 rewrite "^/cn/([a-z0-9\-]+)/?$" /index.php?tid=$1 last; rewrite "^/cn/([a-z0-9\-]+)/([0-9]+)\.html$" /plus/view.php?tid=$1&aid=$2 last; rewrite "^/en/([a-z0-9\-]+)/?$" /index.php?tid=$1 last; rewrite "^/en/([a-z0-9\-]+)/([0-9]+)\.html$" /plus/view.php?tid=$1&aid=$2 last;
- Apache:确保
你的网站结构就变成了:
- 中文首页:
http://yourdomain.com/cn/ - 英文首页:
http://yourdomain.com/en/ - 中文公司简介列表:
http://yourdomain.com/cn/about/ - 英文 About Us 文章:
http://yourdomain.com/en/about/123.html
更高级的方案:使用 {dede:field}
如果你想在同一个模板里动态切换语言,而不是维护两套模板,可以使用 {dede:field} 标签结合自定义字段。
-
为栏目添加自定义字段:
- 进入【核心】->【频道模型】->【内容模型管理】,选择你常用的模型(如“文章”),点击“管理字段”。
- 增加一个字段,字段名为
en_title,字段别名为 “英文标题”,数据类型选“单行文本”。 - 同样,可以增加
en_content(英文内容) 等字段。
-
时填写:
在发布文章时,除了填写“标题”和“内容”,还需要填写“英文标题”和“英文内容”。
-
在模板中调用:
-
在你的
article.htm模板中:<h1> {dede:field.title/} <!-- 默认显示中文标题 --> {dede:php} // 判断URL,如果包含 'en',则显示英文标题 if (strpos($_SERVER['REQUEST_URI'], '/en/') !== false) { echo ' / ' . @me; // @me 代表当前字段的值,即中文标题 @me = htmlspecialchars_decode($fields['en_title']); } {/dede:php} </h1> <div class="content"> {dede:field.body/} <!-- 默认显示中文内容 --> {dede:php} // 判断URL,如果包含 'en',则显示英文内容 if (strpos($_SERVER['REQUEST_URI'], '/en/') !== false) { echo '<div class="english-content">' . htmlspecialchars_decode($fields['en_content']) . '</div>'; } {/dede:php} </div>
-
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 独立栏目+模板 | 结构清晰,SEO极佳,易于维护,逻辑简单 | 需要维护两套或多套栏目和模板 | 强烈推荐,绝大多数双语网站 |
| 自定义字段 | 只需维护一套栏目,模板文件少 | 逻辑复杂,发布内容时繁琐,对SEO不友好(URL路径相同) | 内容量小、对SEO要求不高的内部系统或展示页 |
对于绝大多数项目,第一种“独立栏目+独立模板”的方案是最佳实践,因为它最稳定、最易于长期维护和扩展。
