logo

JTBC5.0多语言建站的要点

2025-02-19 点击 5

参阅官方<怎么添加多个语言版本?>httPS://help.jtbc.cn/php/5.0/#faq/15.xml

并完善相关细节

1.前台切换语言的链接

网址/universal/setting?type=language&language=en

这里是切换到语言en

2.添加后台切换语系

Public/console/common/language/sel_lang.jtbc

参考添加即可

<?xml version="1.0" encoding="utf-8"?>
<xml mode="jtbc" author="jetiben">
  <configure>
    <node>item</node>
    <field>name,zh-cn</field>
    <base>item_list</base>
  </configure>
  <item_list>
    <item>
      <name><![CDATA[0]]></name>
      <zh-cn><![CDATA[简体中文]]></zh-cn>
    </item>
    <item>
      <name><![CDATA[1]]></name>
      <zh-cn><![CDATA[English]]></zh-cn>
    </item>
  </item_list>
</xml>

3.语言文件修改成多语言

Public/news/common/language/index.jtbc

添加en,这里对应前台切换语言链接中的language=en

<?xml version="1.0" encoding="utf-8"?>
<xml mode="jtbc" author="jetiben">
  <configure>
    <node>item</node>
    <field>name,zh-cn,en</field>
    <base>item_list</base>
  </configure>
  <item_list>
    <item>
      <name><![CDATA[title]]></name>
      <zh-cn><![CDATA[新闻动态]]></zh-cn>
      <en><![CDATA[News]]></en>
    </item>
  </item_list>
</xml>


4.多语言的相关说明(以上述中代码为例子)

4.1 后台语系的简体中文和English对应数字0和1

4.2 后台添加数据时,对应lang字段会存储为0或1(对应后台语系数字).

4.3 前台语言文件中<field>name,zh-cn,en</field>说明:

  • zh-cn排序为0,en排序为1(其中name排除掉).
  • 排序必须跟4.1中的语系数字对应.

语言代码及数字对应位置:Config\Env.php

  public const LANGUAGE_MAP = [
    'zh-cn' => 0,
    'en' => 1,
    'ja' => 2,
    'ko' => 3,
  ];


4.4 当前台链接中language=en时:

  • 调用语言文件中en节点数据,
  • 对应调用数据表中lang为1的数据.

其它更多语言,可以参考本例子对应调整.

5.按语言输出模板

在代码中可以根据对应的语言输出模板

Public/common/diplomat/index.php

<?php
namespace Jtbc;
use App\Common\Ambassador;

class Diplomat extends Ambassador {
  public function __start()
  {
    $this -> addParam('meta_title', Jtbc::take('index.title', 'lng'));
    $this -> addParam('stylesheets', ['url' => $this -> getParam('root_assets_path') . '/package/css/home.css']);
  }

  public function index()
  {
    return Jtbc::take('index.index');
  }
}


这是网站首页的代码,只需要通过获取当前语言后,输出对应的模板.

修改return Jtbc::take('index.index');这一句为:

$lang = intval($this -> getParam('lang'));
if($lang != 0) return Jtbc::take('index.index_'.$lang);
else return Jtbc::take('index.index');

然后添加对应的模板节点index_0, index_1.

6.分类模块中需调整一下,默认不支持多语言

数据库中找到universal_category

修改字段lang的注释

默认:{"required":false,"format":"int"}

改成:{"mode":"manual","required":false,"format":"int"}

当值为manual时,表示为手动字段

7.内容链接多语言的处理

位置:\Public\模块\common\diplomat\index.php

页面顶部添加

namespace Jtbc;
use Jtbc\Env;


内容代码

  public function detail(Request $req, Response $res)
  {
    $result = null;
    $id = intval($req -> get('id'));
    $lang = intval($this -> getParam('lang'));
    $model = new TinyModel();
    $model -> where -> published = 1;
    //$model -> where -> lang = $lang;
    $model -> where -> id = $id;
    $rs = $model -> get();
    if (!is_null($rs))
    {
      if($lang != $rs -> lang){
        $res -> cookie -> set('language', Env::getLanguageByID($rs -> lang));
        $res -> header -> set('location', './?type=detail&id=' . $id);
      }
      $rsTitle = strval($rs -> title);
      $this -> addParam('meta_title', $rsTitle);
      $this -> setParam('breadcrumb', $this -> breadcrumbBuilder -> build());
      $renderer = new Renderer('index.detail');
      $result = $renderer -> render([$this -> getFieldText($rs -> all())]);
    }
    else
    {
      $res -> setStatusCode(404);
    }
    return $result;
  }

8.结束.



0%