模块:Lang:修订间差异
来自DOL ShipMaker Wiki
更多操作
创建页面,内容为“-- Module:Lang -- 用途:给定一个页面路径(如 "交易品/葡萄酒"、"城市/塞维利亚"), -- 读取该页面的 wikitext,解析 |zh= |zh-tw= |ja= |en= 字段, -- 生成带多语言 span 的链接 HTML。 -- -- 调用方式: -- {{#invoke:Lang|link|交易品/葡萄酒}} -- {{#invoke:Lang|link|城市/塞维利亚|prefix=书库:}} -- {{#invoke:Lang|link|交易品/葡萄酒|nolink=1}} -- {{#invoke:Lang|links|技能/地…” |
无编辑摘要 |
||
| 第20行: | 第20行: | ||
['技能'] = 'skill-lang', | ['技能'] = 'skill-lang', | ||
['海域'] = 'sea-lang', | ['海域'] = 'sea-lang', | ||
['道具'] = 'item-lang', | |||
['装备'] = 'equip-lang', | |||
['船首像'] = 'item-lang', | |||
['船徽章'] = 'item-lang', | |||
} | } | ||
| 第54行: | 第58行: | ||
local prefix = frame.args['prefix'] or '' | local prefix = frame.args['prefix'] or '' | ||
local suffix = frame.args['suffix'] or '' | |||
local nolink = frame.args['nolink'] or '' | local nolink = frame.args['nolink'] or '' | ||
| 第81行: | 第86行: | ||
if nolink == '1' then | if nolink == '1' then | ||
return prefix .. spans | return prefix .. spans .. suffix | ||
else | else | ||
return prefix .. '[[' .. pagePath .. '|' .. spans .. ']]' | return prefix .. '[[' .. pagePath .. '|' .. spans .. suffix .. ']]' | ||
end | end | ||
end | end | ||
2026年4月22日 (三) 20:37的最新版本
支持多语言切换的通用模块
-- Module:Lang
-- 用途:给定一个页面路径(如 "交易品/葡萄酒"、"城市/塞维利亚"),
-- 读取该页面的 wikitext,解析 |zh= |zh-tw= |ja= |en= 字段,
-- 生成带多语言 span 的链接 HTML。
--
-- 调用方式:
-- {{#invoke:Lang|link|交易品/葡萄酒}}
-- {{#invoke:Lang|link|城市/塞维利亚|prefix=书库:}}
-- {{#invoke:Lang|link|交易品/葡萄酒|nolink=1}}
-- {{#invoke:Lang|links|技能/地理学 技能/生态调查}}
local p = {}
-- 页面路径前缀 → CSS class 前缀映射
local CLASS_MAP = {
['交易品'] = 'goods-lang',
['城市'] = 'city-lang',
['发现物'] = 'discovery-lang',
['书库地图'] = 'map-lang',
['技能'] = 'skill-lang',
['海域'] = 'sea-lang',
['道具'] = 'item-lang',
['装备'] = 'equip-lang',
['船首像'] = 'item-lang',
['船徽章'] = 'item-lang',
}
-- 从 wikitext 中解析单个参数值
local function parseParam( wikitext, key )
-- 匹配 |key=value,value 到下一个 | 或 }} 为止
local val = wikitext:match( '|' .. key .. '=([^|{}]*)' )
if val then
val = val:match( '^%s*(.-)%s*$' ) -- trim
end
return val or ''
end
-- 生成多语言 span HTML(不含链接)
local function makeSpans( cssPrefix, zh, zhtw, ja, en )
local function span( lang, text, hidden )
local style = hidden and ' style="display:none"' or ''
return string.format(
'<span class="%s %s-%s"%s>%s</span>',
cssPrefix, cssPrefix, lang, style, text
)
end
return span('zh', zh, false)
.. span('zh-tw', zhtw ~= '' and zhtw or zh, true)
.. span('ja', ja ~= '' and ja or zh, true)
.. span('en', en ~= '' and en or zh, true)
end
-- 主函数:生成带链接的多语言 span
function p.link( frame )
local pagePath = frame.args[1] or ''
pagePath = pagePath:match( '^%s*(.-)%s*$' )
if pagePath == '' then return '' end
local prefix = frame.args['prefix'] or ''
local suffix = frame.args['suffix'] or ''
local nolink = frame.args['nolink'] or ''
-- 取页面前缀(斜杠前的部分)
local ns = pagePath:match( '^([^/]+)/' ) or ''
local cssPrefix = CLASS_MAP[ ns ] or 'lang'
-- 读取目标页面 wikitext
local title = mw.title.new( pagePath )
if not title then return '[[' .. pagePath .. ']]' end
local wikitext = title:getContent() or ''
-- 解析多语言字段
local zh = parseParam( wikitext, 'zh' )
local zhtw = parseParam( wikitext, 'zh%-tw' )
local ja = parseParam( wikitext, 'ja' )
local en = parseParam( wikitext, 'en' )
-- 没有 zh 字段说明页面不存在或格式不对,回退到红链
if zh == '' then
local name = pagePath:match( '/(.+)$' ) or pagePath
zh = name
end
local spans = makeSpans( cssPrefix, zh, zhtw, ja, en )
if nolink == '1' then
return prefix .. spans .. suffix
else
return prefix .. '[[' .. pagePath .. '|' .. spans .. suffix .. ']]'
end
end
-- 批量生成:空格分隔多个页面路径,常用于技能列表
-- {{#invoke:Lang|links|技能/地理学 技能/生态调查|sep= }}
function p.links( frame )
local input = frame.args[1] or ''
local sep = frame.args['sep'] or ' '
local nolink = frame.args['nolink'] or ''
local results = {}
for path in input:gmatch( '%S+' ) do
local inner = frame:callParserFunction( '#invoke', { 'Lang', 'link', path, nolink = nolink } )
-- 直接调用 p.link
local f = { args = { path, nolink = nolink } }
table.insert( results, p.link( f ) )
end
return table.concat( results, sep )
end
return p