菜鸟科技网

dede如何做双语

核心思路

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

dede如何做双语-图1
(图片来源网络,侵删)

为每种语言创建一套独立的栏目和内容,通过模板判断来调用不同语言的数据。

这种方法的好处是:

  • 结构清晰:每种语言的内容完全独立,管理方便。
  • SEO友好:可以为不同语言设置不同的URL路径(如 /en/, /cn/),有利于搜索引擎收录。
  • 扩展性强:未来增加第三、第四种语言也非常方便。

实现步骤详解

我们将以“中英文”双语网站为例,一步步进行操作。

第一步:创建语言栏目

这是最关键的一步,我们需要为每种语言创建一个顶级栏目,然后在每个顶级栏目下创建对应的子栏目。

dede如何做双语-图2
(图片来源网络,侵删)
  1. 登录 DedeCMS 后台,进入【核心】 -> 【栏目管理】。

  2. 添加顶级栏目

    • 点击“增加顶级栏目”。
    • 栏目名称:中文 (或 English)
    • 栏目目录cn (或 en),这个目录名将用于 URL 中,建议使用英文小写。
    • 栏目类型:选择“频道封面”。
    • 其他选项:根据需要填写,比如列表模板、文章模板等,可以先留空,后面在模板中统一指定。
    • 点击“确定”。

    用同样的方法,再创建一个英文的顶级栏目 en

  3. 添加子栏目

    dede如何做双语-图3
    (图片来源网络,侵删)
    • 现在你有了两个顶级栏目:“中文”和“英文”。
    • 点击“中文”栏目后面的“增加子栏目”。
    • 栏目名称:公司简介 (About Us)
    • 栏目目录about
    • 所属栏目:选择“中文”
    • 栏目类型:选择“频道封面”或“列表”。
    • 点击“确定”。

    用同样的方法,在“英文”栏目下也创建一个同名的子栏目 about

    重复此操作,为所有需要双语显示的栏目(如“新闻中心”、“产品展示”等)都创建对应的中文和英文栏目。

完成后的栏目结构大概是这样:

- 中文 (顶级, 目录: cn)
  - 公司简介 (子栏目, 目录: about)
  - 新闻中心 (子栏目, 目录: news)
- English (顶级, 目录: en)
  - About Us (子栏目, 目录: about)
  - News Center (子栏目, 目录: news)

第二步:添加多语言内容

你只需要在对应的栏目里添加内容即可。

  • 在【中文】 -> 【公司简介】栏目里,添加中文的公司简介文章。
  • 在【English】 -> 【About Us】栏目里,添加英文的 About Us 文章。

确保每种语言的内容都放在其对应的栏目下。

第三步:创建多语言模板

模板是实现多语言切换和显示的核心,我们需要修改主模板和列表、文章模板。

  1. 创建语言切换按钮 (模板) 在你的网站头部模板(通常是 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>
  2. 修改首页模板 (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.htmindex_en.htm,然后通过语言切换链接直接指向它们。
  3. 修改列表页和文章页模板 同样,为列表页和文章页也创建两套模板,如 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更美观,也为了区分语言,我们需要设置伪静态规则。

  1. 进入 DedeCMS 后台,【系统】 -> 系统基本参数 -> 核心设置

  2. 找到 “是否使用伪静态”,选择 “是”。

  3. 点击 “栏目目录默认规则” 和 “文章页默认规则” 旁边的 “修改” 按钮。

  4. 设置规则

    • 栏目目录规则{typedir}/
    • 文章页规则{typedir}/{aid}.html
  5. 服务器配置

    • 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.confserver 块中添加以下规则。
      # 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;

你的网站结构就变成了:

  • 中文首页: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} 标签结合自定义字段。

  1. 为栏目添加自定义字段

    • 进入【核心】->【频道模型】->【内容模型管理】,选择你常用的模型(如“文章”),点击“管理字段”。
    • 增加一个字段,字段名为 en_title,字段别名为 “英文标题”,数据类型选“单行文本”。
    • 同样,可以增加 en_content (英文内容) 等字段。
  2. 时填写

    在发布文章时,除了填写“标题”和“内容”,还需要填写“英文标题”和“英文内容”。

  3. 在模板中调用

    • 在你的 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要求不高的内部系统或展示页

对于绝大多数项目,第一种“独立栏目+独立模板”的方案是最佳实践,因为它最稳定、最易于长期维护和扩展。

分享:
扫描分享到社交APP
上一篇
下一篇