问题陈述
维基百科中有一个前缀为“Portal:”的页面,专门用来将相关的内容组合成一个主题。
虽然我们可以通过加前缀的方式来模仿它的内容,但是将代码完全复制之后,你会发现一些奇怪的问题。
红颜色提示的是缺少模板,而事实上如果你仔细观察维基百科上的模板会惊奇地发现,两者的前缀是不一样的。
看到没有,它们全都是以“Portal:”为前缀的,而不是通常所见的以“模板:”开头的。
那么问题到底出在哪里呢?
从维基百科的帮助文件中,我们能够找到一些相关资料,其中一项位于它的命名空间说明中。
注意主题命名空间与模块命名空间的编号很特殊,因为它并不是标准的MediaWiki命名空间。为了避免与标准命名空间冲突,使用了一个较大的编号数字。
从这段话中我们就能明白,所谓主题其实就是一个自定义的命名空间。
那什么是MediaWiki的命名空间呢?
维基百科,确切地说是MediaWiki软件中的命名空间的概念,类似于C++和Java中的“命名空间”(英语:Namespace,又称“名字空间”)。简单地说,维基百科的命名空间就是页面的种类名称,不同种类的页面便有不同的种类名称。使用时,通常在条目的名称前加上一个英文前缀和一个英文冒号,用以为MediaWiki软件所识别。所有带着这个前缀的页面的总和就是这个命名空间。唯一的特例是,“主命名空间”(Main Namespace)没有任何前缀。
具体的内容可以参考维基百科:命名空间,如果被墙也可以直接浏览英文版说明。
自定义命名空间
OK,既然我们已经清楚知道它不属于MediaWiki的标准命名空间,那维基百科是如何生成的呢?
从MediaWiki的手册:使用自定义命名空间中我们发现了几条关键性的代码,模仿着在LocalSettings.php
文件中添加入如下代码:
# 为额外的命名空间定义内容
define("NS_PORTAL", 100);
define("NS_PORTAL_TALK", 101);
# 增加命名空间
$wgExtraNamespaces[NS_PORTAL] = "Portal";//双引号内可以替换成中文“主题”
$wgExtraNamespaces[NS_PORTAL_TALK] = "Portal_talk"; //如果采用英文双引号内的下划线是必须的,且可以替换成中文“主题讨论”
注意:对于命名空间的编号应尽量避免与原有的冲突(以上的编号其实已被Semantic MediaWiki插件占用了),常用的编号参见Extension default namespaces。
重新搜索刚刚我们建立的“Portal:心理学”,竟然提示要重新创建,而我之前明明已经保存了的,从高级搜索的显示来看也能查看到代码,为什么会这样?
重新注销刚才的代码,页面又回来了。其实官方说明中有提到,如果没有自定义命名空间,强制加入“Portal:”前缀,系统仍然会作为条目页面处理。而一旦自定义之后,系统为防止与之前的页面有所冲突,而不再显示。
删除自定义前的页面,恢复代码后重新再建立一遍,预览一下,跟没自定义之前还是一样的。
接着看手册,其中又有一行代码引起了我的兴趣,凭直觉应该就是它了,继续添加如下:
# 允许命名空间有子页面
$wgNamespacesWithSubpages[NS_PORTAL] = true;
刷新页面,终于没有了“模板:”前缀,变得跟维基百科一样了。
“Portal:”现在是有了,英文终归是使用起来不太方便的,如果直接用“主题:”多好啊!
有没有办法呢?
第一种,我在之前的代码中已经备注过了,直接将引号中的名字用中文表示。
第二种就是增加如下的代码,采用别名方式:
# 命名空间别名
$wgNamespaceAliases['主题'] = NS_PORTAL;
$wgNamespaceAliases['主题讨论'] = NS_PORTAL_TALK;
默认虽然还是显示“Portal:”,但是你在创建的时候无论用中文英文,系统都认识。
或许可以考虑换个个儿,这样就能直接显示中文,又能识别英文。