「モジュール:LangSwitch」の版間の差分
ナビゲーションに移動
検索に移動
(bit performance improvement, load fallback only if needed (so in the vast majority of cases fast switch is sufficient)) |
細 (1版 をインポートしました) |
||
(3人の利用者による、間の6版が非表示) | |||
10行目: | 10行目: | ||
* User:Jarekt | * User:Jarekt | ||
]] | ]] | ||
-- add optional module | |||
-- used for debugging purposes as it detects cases of unintended global variables | |||
require('strict') | |||
local p = {} | local p = {} | ||
local function add_labels(args) | |||
-- add invisible but machine readable labels to the files, which can be used to add titles to wikidata items | |||
local createTag = require('Module:TagQS').createTag -- lazy loading of the module: only for the files that need it | |||
local qsTable = {''} | |||
-- add text of invisible tag brodcasted by the template which allows creation of QuickStatements command used to add this info to Wikidata | |||
for lang, text in pairs( args ) do | |||
if type(lang)=='string' and mw.language.isSupportedLanguage(lang) then -- lang has to be a valid language | |||
table.insert( qsTable, createTag('label', 'L'..lang, '"' .. text .. '"') ) | |||
end | |||
end | |||
return table.concat( qsTable, '\n') | |||
end | |||
--[[ | --[[ | ||
24行目: | 42行目: | ||
args - table with translations by language | args - table with translations by language | ||
lang - desired language (often user's native language) | lang - desired language (often user's native language) | ||
Error Handling: | Error Handling: | ||
]] | ]] | ||
function p._langSwitch(args, lang) -- args: table of translations | |||
-- Return error if there is not default and no english version | |||
if not args.en and not args.default then | if not args.en and not args.default then | ||
local err = '<b class="error">LangSwitch Error: no default</b>' | local err = '<b class="error">LangSwitch Error: no default</b>' | ||
37行目: | 57行目: | ||
end | end | ||
end | end | ||
-- To improve performance try quick switch, and load fallback chain only if needed. | |||
-- In the vast majority of cases fast switch is sufficient | |||
local val = args[lang] | |||
if val == '~' then | |||
local | return '' | ||
elseif val and val ~= '' then | |||
return val | |||
elseif args.quick then | |||
if | return nil | ||
return | |||
end | end | ||
-- get the list of accepetable language (lang + those in lang's fallback chain) and check their content | -- get the list of accepetable language (lang + those in lang's fallback chain) and check their content | ||
assert(lang, 'LangSwitch Error: no lang') | assert(lang, 'LangSwitch Error: no lang') | ||
local langList = mw.language.getFallbacksFor(lang) | local langList = mw.language.getFallbacksFor(lang) | ||
table.insert(langList, 1, lang) | table.insert(langList,1,lang) | ||
table.insert(langList, math.max(#langList, 2), 'default') | table.insert(langList,math.max(#langList,2),'default') | ||
for _, language in ipairs(langList) do | |||
val = args[language] | |||
for _, language in ipairs(langList) do | if val == '~' then | ||
if | |||
return '' | return '' | ||
elseif | elseif val and val ~= '' then | ||
return | return val | ||
end | end | ||
end | end | ||
90行目: | 95行目: | ||
frame.args - table with translations by language | frame.args - table with translations by language | ||
frame.args.lang - desired language (often user's native language) | frame.args.lang - desired language (often user's native language) | ||
Error Handling: | Error Handling: | ||
]] | ]] | ||
function p.langSwitch(frame) -- version to be used from wikitext | function p.langSwitch(frame) -- version to be used from wikitext | ||
local args = frame.args | local args = frame.args | ||
-- if no expected args provided than check parent template/module args | -- if no expected args provided than check parent template/module args | ||
if args.en == nil and args.default == nil and args.nocat == nil then | if args.en==nil and args.default==nil and args.nocat==nil then | ||
args = mw.getCurrentFrame():getParent().args | args = mw.getCurrentFrame():getParent().args | ||
end | end | ||
local lang = args.lang | local lang = args.lang | ||
if not lang or not mw.language. | if not lang or not mw.language.isKnownLanguageTag(lang) then | ||
lang = frame:callParserFunction("int", "lang") -- get user's chosen language | lang = frame:callParserFunction( "int", "lang" ) -- get user's chosen language | ||
end | |||
-- add text of invisible tag brodcasted by the template which allows creation of QuickStatements command used to add this info to Wikidata | |||
local labels = '' | |||
if args.add_labels then | |||
labels = add_labels(args) | |||
end | end | ||
-- Try quick switch | -- Try quick switch which checks the most likely option when fallback is not needed | ||
local | args.quick = true; | ||
if | local val = p._langSwitch(args, lang) | ||
return | if val then | ||
return val .. labels | |||
end | end | ||
-- Allow input in format: {{LangSwitch|de=Grün|es/it/pt=Verde|fr=Vert|en=Green |lang=en}} | -- Allow input in format: {{LangSwitch|de=Grün|es/it/pt=Verde|fr=Vert|en=Green |lang=en}} | ||
-- with multiple languages mapping to a single value | -- with multiple languages mapping to a single value | ||
args1 = {} | local args1 = {} | ||
for name, value in pairs(args) do | for name, value in pairs( args ) do | ||
if value ~= '' and type(name) == 'string' then | if value ~= '' and type(name)=='string' then | ||
for str in string.gmatch( name, "([^/]+)" ) do | |||
args1[str] = value | args1[str] = value | ||
end | end | ||
end | end | ||
end | end | ||
return p._langSwitch(args1, lang) | return p._langSwitch(args1, lang) .. labels | ||
end | end | ||
return p | return p |
2023年5月8日 (月) 09:09時点における最新版
このモジュールについての説明文ページを モジュール:LangSwitch/doc に作成できます
--[[
__ __ _ _ _ ____ _ _ _
| \/ | ___ __| |_ _| | ___ _| | __ _ _ __ __ _/ ___|_ _(_) |_ ___| |__
| |\/| |/ _ \ / _` | | | | |/ _ (_) | / _` | '_ \ / _` \___ \ \ /\ / / | __/ __| '_ \
| | | | (_) | (_| | |_| | | __/_| |__| (_| | | | | (_| |___) \ V V /| | || (__| | | |
|_| |_|\___/ \__,_|\__,_|_|\___(_)_____\__,_|_| |_|\__, |____/ \_/\_/ |_|\__\___|_| |_|
|___/
Authors and maintainers:
* User:Zolo - original version in Module:Fallback
* User:Jarekt
]]
-- add optional module
-- used for debugging purposes as it detects cases of unintended global variables
require('strict')
local p = {}
local function add_labels(args)
-- add invisible but machine readable labels to the files, which can be used to add titles to wikidata items
local createTag = require('Module:TagQS').createTag -- lazy loading of the module: only for the files that need it
local qsTable = {''}
-- add text of invisible tag brodcasted by the template which allows creation of QuickStatements command used to add this info to Wikidata
for lang, text in pairs( args ) do
if type(lang)=='string' and mw.language.isSupportedLanguage(lang) then -- lang has to be a valid language
table.insert( qsTable, createTag('label', 'L'..lang, '"' .. text .. '"') )
end
end
return table.concat( qsTable, '\n')
end
--[[
_langSwitch
This function is the core part of the LangSwitch template.
Example usage from Lua:
text = _langSwitch({en='text in english', pl='tekst po polsku'}, lang)
Parameters:
args - table with translations by language
lang - desired language (often user's native language)
Error Handling:
]]
function p._langSwitch(args, lang) -- args: table of translations
-- Return error if there is not default and no english version
if not args.en and not args.default then
local err = '<b class="error">LangSwitch Error: no default</b>'
if args.nocat == '1' then
return err
else
return err .. '[[Category:LangSwitch template without default version]]'
end
end
-- To improve performance try quick switch, and load fallback chain only if needed.
-- In the vast majority of cases fast switch is sufficient
local val = args[lang]
if val == '~' then
return ''
elseif val and val ~= '' then
return val
elseif args.quick then
return nil
end
-- get the list of accepetable language (lang + those in lang's fallback chain) and check their content
assert(lang, 'LangSwitch Error: no lang')
local langList = mw.language.getFallbacksFor(lang)
table.insert(langList,1,lang)
table.insert(langList,math.max(#langList,2),'default')
for _, language in ipairs(langList) do
val = args[language]
if val == '~' then
return ''
elseif val and val ~= '' then
return val
end
end
end
--[[
langSwitch
This function is the core part of the LangSwitch template.
Example Usage from a template:
{{#invoke:fallback|langSwitch|en=text in english|pl=tekst po polsku|lang={{int:lang}} }}
Parameters:
frame.args - table with translations by language
frame.args.lang - desired language (often user's native language)
Error Handling:
]]
function p.langSwitch(frame) -- version to be used from wikitext
local args = frame.args
-- if no expected args provided than check parent template/module args
if args.en==nil and args.default==nil and args.nocat==nil then
args = mw.getCurrentFrame():getParent().args
end
local lang = args.lang
if not lang or not mw.language.isKnownLanguageTag(lang) then
lang = frame:callParserFunction( "int", "lang" ) -- get user's chosen language
end
-- add text of invisible tag brodcasted by the template which allows creation of QuickStatements command used to add this info to Wikidata
local labels = ''
if args.add_labels then
labels = add_labels(args)
end
-- Try quick switch which checks the most likely option when fallback is not needed
args.quick = true;
local val = p._langSwitch(args, lang)
if val then
return val .. labels
end
-- Allow input in format: {{LangSwitch|de=Grün|es/it/pt=Verde|fr=Vert|en=Green |lang=en}}
-- with multiple languages mapping to a single value
local args1 = {}
for name, value in pairs( args ) do
if value ~= '' and type(name)=='string' then
for str in string.gmatch( name, "([^/]+)" ) do
args1[str] = value
end
end
end
return p._langSwitch(args1, lang) .. labels
end
return p