打开/关闭菜单
打开/关闭外观设置菜单
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。

模块:Lang:修订间差异

来自DOL ShipMaker Wiki
Bb1980留言 | 贡献
创建页面,内容为“-- 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|技能/地…”
 
Bb1980留言 | 贡献
无编辑摘要
 
第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