Dede中英文网站切换如何实现?

99ANYc3cd6
预计阅读时长 23 分钟
位置: 首页 DEDE建站 正文
  1. 多站点(子目录)方式:推荐方式,最符合 SEO,也最规范,将中文站作为主站,英文站作为子目录(如 www.yourdomain.com/en/)。
  2. 多语言栏目方式:简单快捷,在同一站点内,通过不同的栏目来区分中英文内容,通过切换语言变量来改变显示。

下面我将详细介绍这两种方法,强烈推荐使用第一种方法

dede中英文网站切换
(图片来源网络,侵删)

多站点(子目录)方式(强烈推荐)

这种方式的核心是:

  • 一个 DedeCMS 程序,安装在网站根目录。
  • 两套数据库,分别存储中文和英文内容。
  • 通过 .htaccess 文件,将 www.yourdomain.com/en/ 的请求重写并指向 DedeCMS 的 index.php,并传递一个语言参数。
  • 通过修改 DedeCMS 模板,根据语言参数动态加载不同的内容。

实施步骤:

第 1 步:安装 DedeCMS 和准备数据库

  1. 在网站根目录(如 public_html)安装一套 DedeCMS 程序。

  2. 创建两个新的数据库,dedecms_cndedecms_en

  3. 登录 DedeCMS 后台,系统设置 -> SQL命令行工具,分别执行 dede 目录下的 data/sql/cn_sql.sqlen_sql.sql(你需要自己准备一份英文版的初始数据表结构,或者手动导出中文表结构并修改表名前缀)。

  4. 配置数据库:你需要修改 /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 参数来显示不同的内容。

  1. 修改首页模板 index.htm: 在你需要显示内容的地方,使用 DedeCMS 的 arclistlist 标签时,通过 addfieldschannelid 等属性来精确控制。

    <!-- 在首页模板 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 来调用不同语言栏目的内容。

  2. 修改全局变量(更推荐的方法): 在模板中,我们可以使用 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>
  3. 创建语言切换按钮: 在网站的头部或底部,放置一个语言切换链接。

    <!-- 假设当前页面是 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.comwww.yourdomain.com/en/ 是两个独立的 URL,搜索引擎可以清晰地识别它们是不同语言版本。
    • 结构清晰:数据和逻辑完全分离,易于维护。
    • 符合标准:这是 Google 等搜索引擎推荐的国际化和多语言网站标准做法。
  • 缺点
    • 配置复杂:需要修改核心文件、配置伪静态、管理两套数据库,对新手有一定门槛。

多语言栏目方式(简单快捷)

这种方式的核心是:

  • 一个 DedeCMS 程序,一个数据库
  • 在后台创建两套栏目,中文新闻”和“English News”。
  • 所有文章都录入两次,分别对应到两个栏目下。
  • 通过模板判断,动态切换显示哪个栏目的内容。

实施步骤:

第 1 步:创建栏目和内容

  1. 在 DedeCMS 后台,创建“中文新闻”栏目(ID假设为1)。
  2. 再创建“English News”栏目(ID假设为2)。
  3. 录入文章时,将中文文章放到“中文新闻”下,将英文翻译文章放到“English News”下。

第 2 步:修改模板(使用全局变量)

  1. 在后台的“系统” -> “系统基本参数” -> “核心设置”中,添加一个自定义变量,cfg_language,初始值设为 cn

  2. 在模板中,使用一个切换语言的链接来改变这个变量,这个链接通常是一个简单的表单。

    <!-- 在模板的某个位置,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>
  3. 修改 /include/common.inc.php 文件,在文件开头添加代码来接收并设置语言变量。

    // 在 /include/common.inc.php 的最开始
    if(isset($_GET['l'])) {
        $cfg_language = $_GET['l'];
    }
    // 将语言变量存入全局,方便模板调用
    $GLOBALS['cfg_language'] = $cfg_language;
  4. 修改首页模板 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 的网站,请务必选择方法一,虽然前期配置复杂一些,但从长远来看,它带来的好处(搜索引擎友好、结构清晰、易于扩展)是巨大的。

对于个人博客、小型展示网站等对 SEO 要求不高的场景,可以考虑使用方法二来快速实现。

-- 展开阅读全文 --
头像
织梦删除文章id从1
« 上一篇 02-28
dede下一页调用方法是什么?
下一篇 » 02-28

相关文章

取消
微信二维码
支付宝二维码

目录[+]