参阅官方<怎么添加多个语言版本?>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.结束.