Help:Templates/zh

如果你需要在多个页面上包含同样的文本的话，MediaWiki的模板功能就起到作用了. 与插件和媒体文件不同的是，模板没有管理中心. 编辑者可以编写新的模板、从其他维基（如维基百科）的现有模板导入，或者导出到其他的维基.

创建模板
模板其实也是一种标准wiki页面，但它主要会被嵌入（transclude）到其它页面中. 模板的页面名称最前面都有“ ”——將它分配到該名字空間. 除此之外，创建一个模板时，像其他页面一样创建就可以了.

下面展示了模板的最簡單使用方法. 假设你创建了一個名叫“Template:Welcome”的模板，其内容如下：

您好！歡迎來到維基！

這樣，你就創建了你的第一個模板！如果你接下來插入：

到其他任一頁面，那么，访问这个插入了模板的页面时，将会看到“你好！欢迎来到维基！”的字样，而不是看到. 模板的內容被“嵌入（transclude）”到了其他頁面，也就是说，被整合到了这个页面.

你可以在任一頁面的任何位置添加 ，來歡迎其他人. 設想一下該模板被用在100個頁面中. 假设你後來將模板內容改成：

嗨，您好！歡迎來到這個奇妙的維基.

並且重新訪問之前用到了該模板的那100個頁面，你将會看到新的文字，而不是原先的文字. 你用這個方法改變了100個頁面的內容，而并不是手动修改这100个页面的内容，因爲这个模板是被嵌入這100个頁面中的.

这只是模板的一个最基本的应用. 除此之外，模板还具有更多灵活易用的功能.

使用
模板有以下三种使用方法：


 * —就像上面描述的那样，当带有这个模板链接的页面被加载时，这个链接将会被 的当前的内容动态地替换. 在页面源代码中，这个链接不会变化.
 * —当这个模板链接被使用时，它将被一次性替换为截至含有这个链接的页面被保存时 Template:模板名称 内容：模板链接会被“替换（substitute）”为 Template:模板名称 的内容. 这个内容成为包含的页面的一部分，可以像一般内容一样被编辑，与原来的内容分开. 注意：由于引用的模板链接直接被替代，如果此后原始模板页面被更改，包含这种模板链接的页面将不会变化.
 * —这种链接被解释为允许不打破嵌入包含的替换. 见w:en:Help:Substitution.
 * 会将模板的源代码包含在页面中，类似一样.

事實上，一個普通的維基頁面也可以被用作，只要指定它所在的名字空間，所以：


 * 会包含 的内容
 * 会包含 的内容
 * 会包含 的内容
 * 将会把它自己的內容替換为 的内容

若這个名字空間不存在，完整的標題就會被看成模板的名稱：


 * 会包含 的内容

参数
为丰富嵌入包含机制，当一个模板被嵌入时，MediaWiki允许对这个模板传递参数. 由于参数的作用，模板可以提供不同的内容，拥有不同的行为.

假设你希望在其他用户的讨论页插入一条感谢函，例如：

感谢函包括感谢的原因（示例中的“你的努力”）和署名（“张三”）. 您的目标是任何用户可以感谢其他用户，无论任何原因.

为了让任何人可以因为任意原因感谢任何一个人，你需要定义一个感谢函模板，这个模板被命名为. 使用感谢函模板会让所有感谢函看起来相似，但其中指定部分内容可以自定义（如感谢的原因和署名）. 所以你需要把这些内容设置为参数. 感谢函模板的核心内容如下所示. If we ignore the remaining elements to format the box and place the image, the core content of the template will be this:

请注意 和 ，这就是参数，它们可以随着模板引入其他页面. 注意：在模板内，每一个变量都是被三组花括号包围：. 这与模板名称的花括号不同.

在使用模板时，需要为参数赋值，不同参数间用一个管道符（ ）分隔. MediaWiki允许三种为变量赋值的方式：隐式赋值（Anonymously）、按编号赋值（Numbered）、按名称赋值（Named）.

隐式赋值
隐式赋值要求按照一定的顺序赋值：

在这个例子中， 模板接收参数 和 ，于是输出：

隐式赋值时，赋值的顺序十分重要. 假如颠倒了赋值顺序：

输出结果为：

按编号赋值
按编号赋值时，需要在传递参数时给出变量的编号：

例中，虽然没有按变量的声明顺序赋值，但模板 接收到的是 和 ，所以将会输出：

会生成
 * 範例：

按名称赋值
与按编号赋值类似，第三种赋值方法只是把编号换成了名称. 为了演示，需要将模板内容改为：

感谢你！ 感谢. 来自

例中用 和 声明参数，而不是使用数字，其赋值方法如下：

例中 模板接收 和 并输出：

已命名的参数是区分大小写的，所以：

会成为：

在你的模板中使用命名参数的优点是，除了参数顺序灵活，还可以在有许多参数时使模板代码更容易理解.

缺省值
当您嵌入了一个应该有参数的模板，但未提供它需要的参数的话，即：

以用编号声明变量的模板为例，输出结果为：

当没有包含一个参数时，它会直接输出变量本身. 此时，设置变量的缺省值会方便许多. 比如，如果更改模板内容为：

表示如果 变量的参数没有被赋值，则输出缺省值. 类似的， 中 变量缺省输出. 修改后的模板输出如下结果：

Often default values are used to specify alternate names of parameters. For example, if you have, the template will first look for a parameter named "a". If it is not set, it will use the parameter named "b". If neither "a" nor "b" is set, it will output nothing.

Evaluation
Generally speaking, template parameters are substituted into the template after tokenization, but as is. They are not evaluated until they are used.

This has a few consequences. First of all, if you have a  containing , and a   containing  , and put   on a page, mytemplate isn't transcluded, because tokens like "|" cannot be added by a template and keep their special meaning in templates. You can still use templates to control the name of a parameter or template, but you cannot split a template call amongst multiple templates.

The second consequence of this is dead-code elimination. If you make a template call like, and Template:Foo does not contain  , then the displaytitle is not used, since it is only evaluated when needed, and it there is no parameter to substitute it into, so it is never evaluated. This usually comes into play when using Extension:ParserFunctions, and can be especially noticed when used in combination with the  magic word that varies by user language.

Template calls starting with the magic word  or   are evaluated in a separate first pass that only happens at save time, along with ~ and links using the pipe trick. If they cannot be evaluated during the first pass, subst: calls are ignored, and safesubst: are treated as if a normal template.

Many but not all parser functions, parser tags and trancluded special pages are not directly included like templates but instead are replaced by a "strip marker". This means you cannot manipulate the results with parser functions like padleft: or similar functions from extensions, as they see the strip marker instead of the result of the parser function.

在模板中递归
将模板包含到它本身并不会导致MediaWiki无限递归. MediaWiki将停止递归调用，将模板名称置为加粗显示. 例如，如果Template:Aaaa的内容是 ，它将显示为a a Template loop detected: Template:Aaaa z z.

Forbidden idiom
This safeguard precludes a potentially useful template idiom where a template self-normalizes its own calling arguments. In this forbidden example template:d can either be called  or. If called in the first manner, it recurses into itself with the second argument structure (obtained using string parser functions), which then follows a unified processing path.



If template:d is modified to recurse into template:d/2 and template:d/2 is an identical manual copy of template:d this idiom works fine as the self-recursion safeguard operates dynamically and not statically.

A feasible way for the MediaWiki software to loosen the self-recursion rule would be to require that each recursive call have a distinct argument count from all previous active calls, at most once recursing with the argument count non-decreasing. That would provide a strong guarantee against infinite self-recursion while enabling useful idioms such as the one described here in a flexible manner.

If the processing path is of low complexity, a simple solution using only one template is to handle each calling convention on a separate if/else branch, duplicating the logic of the processing path within each case. If the processing path is more complex, each call-structure case can delegate to an implementation template with a unified call structure which provides the final template behaviour.

控制模板嵌入
默认状态，模板内容被显示在实例中，无论被直接查看还是包含到其他页面中. 当然，你可以用， 和 来控制模板的哪些部分会被嵌入.

任何在 和 之间的标记，都只会在直接查看模板页面的时候显示出来，而不会被包含在页面中. 当你不想让包括在模板中的文本或代码传播到任何包括它页面这各功能很有用，比如：


 * 为模板归类请使用分类链接
 * 跨语言链接 可连接到其他语言版本中的类似模板
 * 关于如何使用该模板的解释文字

与此相对的是. 在 和 之间的文字只会在嵌入页面的时候才会被处理或显示，直接查看时不会显示. 比如：


 * 很明显的一个使用方式是将所有有某个模板的页面加入某个分类，而不将模板本身加入这个分类. 当你改变模板中的分类的时候，使用这个模板的分类可能不会立即改变；这会在中处理.
 * 确认查看模板页面本身时模板代码没有执行. 典型地，这是因为它需要参数，并且没有参数时执行会产生不想要的结果.

当模板页面被直接查看和被其他页面包含时，所有和之外的代码都会被处理和显示. 关键是这两个标记之间的内容.

所有标记之外的代码在嵌入时被弃置不用. 即使段落被标记为 includeonly，在嵌入时一样会被弃用，除非它们也被标记为 onlyinclude. 关键在于标记之外的东西.

也可以嵌套这些标签.

这三部分嵌入标记实现了处理和表达所有可能的组合. 评论也能起效.

整理模板
为了使模板起作用，用户需要找到并且了解如何使用模板.

找模板的方法：
 * 1) 点击'>'；
 * 2) 在'列表中，选择Template，并点击'.

要说明用法，请包含一个示例，就像下面的例子：

用法
欢迎用户：

然后，编辑者就可以剪切粘贴来插入这个模板.

链接到模板
模板页面可以像任何其他Wiki页面一样链接. 例如，使用wikicode 生成链接.

在许多维基上，Template:Tl 可用于提供指向模板的链接，该模板的格式为显示转换模板所需的“双花括号”wikicode，而不实际进行转换. 例如，代码 可用于创建链接Navbar.

此构造通常用于模板文档，帮助页面以及引用模板时的谈话页面. 使用 可以实现相同的效果，但是 tl 方法用字更少. 在任何给定的wiki上，Tl模板（如果存在）可能会也可能不会在“code”元素中呈现文本，如此处所示. 如果没有，另一个类似命名的模板可能会这样做. 例如，请参阅英语维基百科的en:Template:Tl 文档的“See also”部分.

从一个维基向另外一个维基拷贝
模板常需要CSS 或其他模板，用户常在从一个维基到另一个维基拷贝模板时遇到问题. 下列步骤对大多数模板的拷贝有效.

MediaWiki代码
如果你在新维基上有导入权限：


 * 1) 到源维基的Special:Export，下载一个包含完整历史和需要的模板的.xml文件，如下：
 * 2) *在大文本输入框中输入模板名字，比如"Template:Welcome". 请特别关注大写字母和特殊字符. 如果模板名字不完全正确，导出时也将获得.xml文件，但是里面不是想要的数据.
 * 3) *勾选“”.
 * 4) *取消勾选“”.
 * 5) *点击“”.
 * 6) 到新维基的Special:导入，上传.xml文件.

如果没有新维基的导入权限：


 * 1) 到源维基上你想拷贝的模板页面，编辑页面，拷贝维基文本；
 * 2) 打开新维基，到源维基上的模板同名的页面，点击创建/编辑，粘贴刚才拷贝的维基文本. 在编辑摘要链接到源模板页面.
 * 3) 回到源维基刚才拷贝代码的页面，在编辑区域下方，查看“本页使用的模板”. 每个模板都按上述步骤拷贝，穷尽所有与所有上述模板有关系的模板.

这将拷贝全部需要的代码，并将满足一些模板的需要. Note that only page elements parsed in rendering the page get exported, so, for example, documentation subpages are not exported as part of this process. 如果不能工作，请检查编辑框下面“当前版本的页面引用的页面:”下方的红色链接. 如果有，到源维基重复上面的步骤并复制模块中的代码.

成功导入其他维基上的模板和它链接的模板后，可以个性化编辑以适用于新维基. 例如更改Logo、删除冗余分类和红色链接等.

扩展
模板常用的扩展是解析器函数. 访问页面，查看你拷贝的模板是否包含其中列明的函数. 如果包含，表明你需要安装 扩展. 你需要新维基所在的服务器的管理员权限才能安装.

另外，模板可依赖的东西还有Lua，比如维基百科网站就是如此. 在模板代码中使用 是一个好主意. 这时需要安装 扩展（也需要系统管理员权限）. 您可以参看其页面来了解如何安装和使用该扩展.

CSS 和 JavaScript 代码
在MediaWiki代码之外，许多模板要用到CSS，有些模板还以来JavaScript才能完全工作. 如果拷贝来的模板不能很好的工作，这也是可能的原因之一. 要拷贝需要的CSS和JavaScript到你的维基，一般来说你需要有管理员权限，因为你将需要编辑"MediaWiki:"名字空间中的系统消息.


 * 1) 查看模板用到的CSS类（与 类似的文本）. 这些类中如果出现了源维基上的"MediaWiki:Common.css" 或 "MediaWiki:Monobook.css"，请将那些类拷贝到新维基"MediaWiki:Common.css"页面，再去检查模板现在是不是工作.
 * 2) 如果拷贝来的模板仍然不能很好的工作，检查是否有代码在源维基上 "MediaWiki:Common.js" 或者 "MediaWiki:Monobook.js"中，如果有，你可以试着拷贝到"MediaWiki:Common.js". 一般情况下，拷贝信任的代码是一个好主意，首先检查代码，然后选定有关代码. 你可能会发现一些注释，可以给检查各被部分功能提供一些线索.

参见

 * w:Help:Table - the easiest instructions to use.
 * – 一个模板特殊使用的案例
 * – 可能在某些模板中找到的花哨的东西
 * – 例如#if和#switch的控制函数
 * – 在模板里使用解析器函数的指南
 * m:Help:Template — 包含更多更彻底的如何正确使用模板功能的手册
 * m:Help:Advanced templates — 描述更多高级技术，比如动态模板调用和很多参数名称
 * m:Help:Embed page — 不从 而从名字空间嵌入页面
 * – Using templates as the starting text of a page
 * – Using templates as the starting text of a page
 * – Using templates as the starting text of a page
 * – Using templates as the starting text of a page
 * – Using templates as the starting text of a page

外部链接

 * Miraheze模板库 - 旨在用于一般用途的MediaWiki模板.