2.4 语言包与 DIY 区域

把文案抽出来可翻译,把版面留给站长自己摆。

{lang key} 调用语言包

模板里不该硬写中文。Discuz! 把文案集中放进语言包文件,模板里只写 key:

{lang submit}
{lang reply}
<button>{lang post}</button>

{lang xxx} 会去 source/language/ 下找对应语言包,命中就替换成当前语言的文本。官方模板里所有面向用户的按钮、提示、标题都走这个标签,换语言时只换语言包文件,不碰模板。

自己加 key 也可以:把新 key 写进对应模块的语言包文件(source/language/ 下按模块分子目录),模板里直接 {lang 你的key} 调用。key 建议用小写英文单词或下划线组合。漏写 key 不报错,编译器找不到就原样输出 {lang xxx},页面上见到这一串就说明语言包里缺这一项。

模板自己的语言包:X5 的新写法

X5.0 给模板单独准备了语言包扩展文件 /template/i18n/SC_UTF8/lang_template.php,内容就是一个 $lang 数组:

$lang = [
    'nice' => '不错!',
    'welcome' => '欢迎回来,%s',
];

写好后模板里直接用 {lang nice}、{lang welcome}。

目录名里的 SC_UTF8 表示简体中文 UTF-8 编码。Discuz! 靠路径里的编码标记区分语言版本,同一套模板要支持多语言,就为每种编码各放一份:SC_UTF8 简体 UTF-8、SC_GBK 简体 GBK、TC_UTF8 繁体 UTF-8。

这个 lang_template.php 是 default 套系共用的位置;你自己的套系要放在自己目录下,即 /template/xxx/i18n/SC_UTF8/lang_template.php,与默认套系互不干扰。官方也支持 /template/xxx/i18n/en/lang_template.php 放英文版本。

XML 里的字段也能进语言包

X5 的模板变量机制完全复刻了插件变量机制,模板可以自带参数配置后台。这里有个便利:模板导出的 XML 里,某些字段能直接写进 $lang,不用手工再抄一遍。

XML 字段 对应文案 出现在后台哪里
name 模板名称 模板列表
tplname 模板说明 模板详情
copyright 版权信息 模板详情
version 版本标记 模板详情
var.title 变量项标题 变量配置页
var.description 变量项说明 变量配置页
var.extra 变量项额外说明 变量配置页

后三个属于分支路径,在 XML 里用点号或斜杠表示层级(以你导出的 XML 结构为准)。在这些位置直接填中文或英文,导出后后台显示的就是它,同时进了语言包,多语言时能一并替换。

开启开发者模式才看得见变量页

模板变量配置后台默认是隐藏的,在 config/config_global.php 末尾加下面这行开启开发者模式才会出现:

$_config['plugindeveloper'] = 1;

开启后后台模板列表会出现「设计」按钮,点进去就是变量配置页,变量类型与插件变量一致。X5 新增了两个布局分类:标题栏(给多个设置项加小标题,纯展示)和分组(多页切换)。用分组时有个硬性要求——顺序第一个项目必须是分组类型,否则后台排不出来。导出的 XML 里会包含这些模板变量,可以在 style 分支里写 version 标记版本变化。

DIY 区域:一行标记 + 一个容器

DIY 是 Discuz! 门户的特色功能:页面区块由站长自己在后台拖拽添加,模板负责给出「这里可被占用」的标记。一个 DIY 区域由两部分组成——一行标记和一个带 id 的空容器:

<!--[diy=diy1]--><div id="diy1" class="area"></div><!--[/diy]-->

注意这个写法在真实文件里是 HTML 注释形态(上文写成 < > 只是为了在文档里显示),两处标记都是注释,浏览器不渲染它们。真正的可见内容全在那个 div 里,编译后会被填入站长在后台配置的区块。

三处细节不能错:注释里的 diy= 值必须和 div 的 id 一致,都写 diy1,不一致后台就找不到这个区域;class="area" 要留着,后台编辑界面的定位和样式依赖它;diy 后面的编号自己定,同一页面可以有 diy1、diy2、diy3,只要不重复。

常见错误是只写了 div 没写标记,或只写了标记没写 div——两种情况页面都能打开,但后台 DIY 面板里没有对应的添加入口。

DIY 与后台的对应关系

模板里每个 DIY 标记,在后台都会变成一个可选区域。站长进后台 → 门户 → 页面 diy 管理,把模块拖到这些区域里,可以放文章、单页、公告、幻灯片、友情链接、外部页面等等。区块内容存在 pre_portal_* 系列数据表里(安装时表前缀可改,官方文档写作 cdb_),字段以官方数据字典为准。模板侧的 diyxml 放在 template/{标识}/portal/ 目录,它是门户页面的结构定义文件。

X5 支持手机版 DIY

X5.0 起手机版也支持 DIY 了,做法和普通版一样,在 touch 目录下的模板里按同样方式写:

<!--[diy=diytouch]--><div id="diytouch" class="area"></div><!--[/diy]-->

template/{标识}/touch/ 是手机版模板目录,里面的页面同样要留出 DIY 插槽,后台配置的内容才能在手机端显示。漏了 touch 下的标记,手机版就没法 DIY。

页面组件与模块组件导出

X5 还新增了组件导出功能,做模板分享时很有用:

类型 导出目录(xxx 换成你的标识) 预览图
页面组件(整页 DIY) /template/xxx/portal/diyxml/page/ 同名 .jpg,尺寸 80×60
模块组件(DIY 框架) /template/xxx/portal/diyxml/module/ 同名 .jpg,尺寸 80×60

用户安装你的模板后,在任何模板下做 DIY 都能看到这些可导入的组件;预览图按指定尺寸做好,否则列表里是空白缩略图。

{block} 与 DIY 的关系

DIY 是「给站长摆的容器」,而 {block article}、{block list} 是模板主动调用某个 DIY 数据模块的标签。前者等着被填,后者主动取数据。做门户模板时两者配合:页面骨架用 DIY 标记分块,具体区块内部再用 {block} 拉内容。

小结

{lang key} 调用 source/language/ 下的系统语言包;模板自己的文案写进 /template/{标识}/i18n/SC_UTF8/lang_template.php 的 $lang 数组,XML 的 name、tplname、copyright、version、var.title、var.description、var.extra 也能进语言包。DIY 区域是「一行 HTML 注释标记 + 一个带 id 的 .area 容器」,两者名称必须一致;后台对应门户 DIY 管理,数据落在 pre_portal_* 表。X5 起 touch 目录下同样支持 DIY,别漏了手机版。