> ## Documentation Index
> Fetch the complete documentation index at: https://discuz.p.cafe/llms.txt
> Use this file to discover all available pages before exploring further.

# 新增插件接口

## **新增系统函数**

### **DISCUZ\_PLUGIN()**

X5.0 中新增了 `DISCUZ_PLUGIN()` 函数，代替类似"/source/plugin/xxx"目录的写法，例如：

```
require_once DISCUZ_PLUGIN('xxx').'/index.php';
```

**提示：** 如果您的插件要同时兼容 Discuz! 您必须使用此函数，但是，涉及前端调用的路径写法是 URI 的一部分，而非后台目录文件调用，无需修改。

### **DISCUZ\_TEMPLATE()**

X5.0 中新增了 `DISCUZ_TEMPLATE()` 函数，代替类似"/template/xxx"目录的写法，例如：

```
$f = DISCUZ_TEMPLATE('xxx').'/data.htm';
```

**提示：** 如果您的插件要同时兼容 Discuz! 您必须使用此函数，但是，涉及前端调用的路径写法是 URI 的一部分，而非后台目录文件调用，无需修改。

## **新增系统常量**

### **DISCUZ\_DATA**

X5.0 中新增了 `DISCUZ_DATA` 常量，代替类似"/data"目录的写法，例如：

```
$lock = DISCUZ_DATA.'cache/data.php';
```

**提示：** 如果您的插件要同时兼容 Discuz! 您必须使用此函数。由于 Discuz! 中所有永久性文件都会存入对象存储，因此 `DISCUZ_DATA` 目录禁止写入永久文件，否则审核员有权将应用打回。

### **DISCUZ\_ROOT\_STATIC**

对于 Discuz!，由于 `/data` 目录禁止写入，您可以把永久文件写入到此目录中，它有以下特性：

* 此目录与 `DISCUZ_ROOT` 意义相同，但只有存放的静态文件（md、txt、js、css、json、xml、图片等）可对外展示。
* 如保存的文件和实际产品文件及路径相同，不会产生覆盖效果，也不会对外展示。
* 此目录占用的空间将计算到 Discuz! 用户的平台存储中。

**提示：** 此常量只针对 Discuz! 有实际作用，X5.0 开源版此常量与 `DISCUZ_ROOT` 相等。

## **多语言**

Discuz! 原生支持多语言内核，您只需自定义多语言 key 并设置此 key 对应的语言包文件路径即可。

### **设置自定义语言**

```
i18n('set', 'mylang', DISCUZ_ROOT.'./i18n/en');
```

设置多语言 `mylang` 的语言包文件路径为 `DISCUZ_ROOT.'/i18n/en'` 目录，支持插件路径。

### **读取设置的自定义语言列表**

```
i18n('get');
```

把设置的语言 key 赋值给 `$_G['cookie']['i18n']` 即可实时切换语言。

### **语言包文件**

X5.0 的插件文件中可以直接写语言包文件，而不必写在 XML 中。之前写在 XML 中的语言包在更新缓存后会自动写入到语言包文件中。

语言包文件位于 `/source/plugin/myplugin/i18n/SC_UTF8/lang_plugin.php`：

```
$scriptlang['myplugin'] = [
    'nice' => '不错！',
];
​
$templatelang['myplugin'] = [
    'nice' => '不错！',
];
​
$systemlang['myplugin'] = [
    'nice' => '不错！',
];
​
$installlang['myplugin'] = [
    'name' => '插件名称',
];
```

XML 中的 `name`、`license`、`description`、`intro`、`copyright`、`version`、`var.title`、`var.description`、`var.extra`、`modules.menu` 可以写进 `$installlang` 中。

同时，语言包也兼容 i18n，可以针对相应的 i18n 语言定制额外语种的语言包。兼容 i18n 的语言包文件位为 `/source/plugin/myplugin/i18n/en/lang_plugin.php`。我们统一约定用 2 个字母的缩写代表各个语言，例如 en、de、fr 等等。

### **JS 语言包**

JS 语言包为 X5.0 新增的语言包类型，文件名为 `lang_js.php`，默认语言包位于 `/source/plugin/myplugin/i18n/SC_UTF8/` 目录下。

语言包内容参考以下格式：

```
$lang = [
    'jslang' => 'JS 语言包',
];
```

所有调用了 `common.js` 的页面中，在您的 JS 文件中通过 `$L('jslang')` 方式调用 JS 语言包：

```
function sample_notice() {
    alert($L('jslang'))
}
```

## **自定义后台菜单**

这是 Discuz! 中的新增内容，插件无需添加 menu 扩展，即可实现菜单的添加与删除。

**您所添加的菜单请务必在卸载插件后清理完毕。**

### **准备工作**

如果在非安装、卸载脚本中使用，最好是判断下方法是否存在：

```
if(!function_exists('set_admin_menu')){
    include_once libfile('function/plugin');
}
```

### **添加菜单**

完整示例：

```
if(!function_exists('set_admin_menu')){
    include_once libfile('function/plugin');
}

$menus = array(
    array('侧边菜单1','plugins?id=1'),
    array('侧边菜单2','plugins?id=2'),
);

set_admin_menu('顶部菜单名称', $menus);
```

### **删除菜单**

完整示例：

```
if(!function_exists('remove_admin_menu')){
    include_once libfile('function/plugin');
}

remove_admin_menu('顶部菜单名称');  //单独删除
remove_admin_menu(array('顶部菜单名称1','顶部菜单名称2'));  //批量删除
```
