Модул:Languages
Изглед
![]() | Овај модул је предмет заштите страница. То је веома коришћен модул у употреби огромног броја страница или се супституише веома често. Због вандализма или грешака које би утицале на много страница или тривијалног уређивања које би могло да изазове проблеме на серверима, модул је заштићен од уређивања. |
Овај модул се користи у шаблону {{l6e}} при стварању одговарајућих језичких веза коришћењем {{#invoke:Languages|list|множество языков}}
. За детаљнију документацију о начину рада шаблона, погледајте документацију. За списак подржаних језичких скраћеница, погледајте Модул:Languages/data.
Также модуль используется для различных преобразований кодов языков.
Услужне категорије модула
[уреди извор]- Категорија:Википедија:Чланци са непознатим језиком — категорија за странице са непознатим језиком у везама попут {{lang}}.
- Категорија:Википедија:Чланци са непознатим језиком (ref) — атегорија за странице са непознатим језиком у везама попут {{ref-lang}}.
Тестови
[уреди извор]Сви тестови прошли.
test_getRefHtml:
Текст | Очекивано | Стварно | |
---|---|---|---|
![]() |
{{ #invoke:Languages | getRefHtmlFrame | }} | ||
![]() |
{{ #invoke:Languages | getRefHtmlFrame | QNNN }} | ||
![]() |
{{ #invoke:Languages | getRefHtmlFrame | Q1860 }} | (енг.) | (енг.) |
![]() |
{{ #invoke:Languages | getRefHtmlFrame | Q7737 }} | (рус.) | (рус.) |
-- Модул за рад са језицима ISO 639
-- учитавање модула са таблицом језичких података
local languages = mw.loadData('Module:Languages/data')
local p = {}
-- проверава да ли је задани параметар празан
local function isEmpty(s)
return s == nil or s == ''
end
-- помоћна функција која уклања размаке
local function trimstr(s)
return (s:gsub("^%s*(.-)%s*$", "%1"))
end
-- добавља језички код, враћа везу и нормализовани код језика (или празан текстуални низ)
local function get_lang_data(code)
local l = languages[code];
if l ~= nil then
return "[[" .. l[2] .. "|" .. l[1] .. "]]", code
elseif code ~= "" then
return code, ""
else
return "", ""
end
end
function p.getRefHtmlFrame( frame )
return p.getRefHtml( trimstr( frame.args[1] ) )
end
function p.getRefHtml( wikidataItemId )
local codeByItemId = mw.loadData( "Module:Wikidata/Language-codes" )
local code = codeByItemId[ wikidataItemId ];
if code == nil then
mw.log( 'Језички код није пронађен за ' .. wikidataItemId )
return ""
else
local l = languages[code];
if l == nil then
mw.log( 'Опис језика за код ' .. code .. ' није пронађен' )
return ""
else
return '<span class="ref-info" title="' .. l[ 2 ] .. '" style="font-size:85%; cursor:help; color:#888;">(' .. l[ 1 ] .. ')</span>'
end
end
end
-- прихвата zh код, враћа скраћеницу
function p.abbr(frame)
local code = trimstr( frame.args[1] )
if not isEmpty(code) then
return (languages[code] and languages[code][1] or '')
end
end
-- прихвата zh|我|tt|мин код, враћа наслов ставке из Module:Languages/data
function p.name(frame)
local code = trimstr( frame.args[1] )
if code ~= nil and code ~= '' then
return (languages[code] and languages[code][2] or '')
end
end
-- прихвата zh|我|tt|мин код, враћа списак одвојен зарезом
function p.list(frame)
local curr_lang = nil
local result = nil
for n, v in frame:argumentPairs() do
local trimmed = trimstr(v)
if curr_lang == nil then
if trimmed ~= '' then
-- ако језички код недостаје, остаје претходни
curr_lang = trimstr(v)
end
else
if trimmed ~= '' then
local link, lang_code = get_lang_data(curr_lang)
local list_item
if lang_code ~= '' then
list_item = link .. " <span dir='auto' lang='" .. lang_code .. "'>" .. trimmed .. "</span>"
else
list_item = link .. " <span class='unknown-foreign-lang'>" .. trimmed .. "</span>".."[[Категорија:Википедија:Чланци са непознатим језиком]]"
end
if result == nil then
result = list_item
else
result = result .. ", " .. list_item
end
else
-- празан текст — значи да је тренутни језик исти као следећи
local link, lang_code = get_lang_data(curr_lang)
if result == nil then
result = link
else
result = result .. ", " .. link
end
end
curr_lang = nil
end
end
-- просто #invoke:Languages|list|yue и даље треба да врати везу без текста
if curr_lang ~= nil then
local link, lang_code = get_lang_data(curr_lang)
if result ~= nil then
result = result .. ", " .. link
else
result = link
end
end
return result
end
-- прихвата zh|tt код, враћа ref-zh, ref-tt
function p.list_ref(frame)
local result = ''
local v = frame.args['в'] or nil
local ref = nil
if v then
ref = ' <span class="ref-info" style="cursor:help;" title="на %2%">[%1%]</span>'
else
ref = ' <span class="ref-info" style="cursor:help;" title="на %2%">(%1%)</span>'
end
for x, lg in pairs( frame.args ) do
local code = trimstr(lg)
if code ~= '' and code ~= 'в' then
local l = languages[code]
if l and l ~= nil then
result = result .. mw.ustring.gsub(mw.ustring.gsub(ref, '%%2%%', p._transform_lang(code)), '%%1%%', l[1])
else
result = result .. frame:expandTemplate{ title = 'ref-' .. code } .. '[[Категорија:Википедија:Чланци са непознатим језиком (ref)]]'
end
end
end
return result
end
-- Приказује име језика у предложеном падежу
function p._transform_lang(code)
if isEmpty(languages[code]) then return '<непознат код ' .. code .. '>' end
if languages[code][3] then return languages[code][3] end
local language_name = ''
if code:lower() == 'bs' then
language_name = 'бошњачки'
else
language_name = mw.language.fetchLanguageName(code,'sr')
end
local ln = mw.ustring.lower(
languages[code] and languages[code][2]
or language_name
):gsub('%s+језик%s+', ' '):gsub('%s*%(?језик%)?%s*', '')
if not ln then return 'језик с ISO-кодом '..code..' (?)' end
if ln:match('.*лингва$') then return ln:gsub('а$','е') end
if mw.ustring.match(ln,'[сц]кий$') or ln:match('ный$') or mw.ustring.match(ln,'[сц]кий%s%b()$') or ln:match('ный%s%b()$')
then
ln = mw.ustring.gsub(
mw.ustring.gsub(ln, 'н([ыи])й(%A)', function(y,s) return (y=='ы' and 'ном' or 'нем')..s end)
:gsub('ный$', 'ном'),
'([сц]к)ий(%A)', '%1ом%2'
):gsub('ский$', 'ском'):gsub('цкий$', 'цком');
if ln:match('%)$') and not (ln:match('ом%)$') or ln:match('нем%)$')) -- «језик» перед уточнением, если оно не склоняется
then
local r,s=ln:gsub('(%s)(%b())$','%1језик%1%2');
if s==1 then return r end
end
return ln..' језик'
else
return 'језик '..ln
end
end
function p.transform_lang(frame)
return p._transform_lang(trimstr(frame.args[1]))
end
-- Проверава постоји ли страница и преусмјеравање
local function getTitle(page)
local success, result = pcall(function()
local title = mw.title.new(page)
return { title.exists, title.isRedirect }
end)
return success and result or nil
end
-- Помоћна функција за {{Непреведено 5}}: видети шаблон
function p._newIW(title, text, lang, page, state, nocat)
local mwlang = mw.getContentLanguage()
local origPage = page
-- Слике за стару функцију приказа статуса
local states = {
['СЧ'] = {'Википедија:Сјајни чланци','Сјајан чланак','Small Skew Star SVG.svg'},
['ДЧ'] = {'Википедија:Добри чланци','Добар чланак','Blue star unboxed.svg'},
['ИС'] = {'Википедија:Изабрани спискови','Избрани списак','Purple star unboxed.svg'}
}
-- Категорије шаблона
local categoryErrors = '[[Категорија:Википедија:Чланци са погрешно попуњеним шаблоном Непреведено]]'
local categoryExists = '[[Категорија:Википедија:Чланци са застарелим шаблоном Непреведено]]'
local categoryRedirect = '[[Категорија:Википедија:Захтеви за замену преусмеравања преводима]]'
-- Проверава постојање параметара и замењује их алтернативним
if isEmpty(text) then
text = title
end
if isEmpty(lang) then
lang = "en"
end
if isEmpty(page) then
page = title
end
-- Ствара шаблон
if title ~= '{{{1}}}' then
local this = mw.title.getCurrentTitle()
local titleObj = getTitle(title)
local ifExists, ifRedirect
local type = ''
local s = ''
local langName = ''
if lang ~= 'd' then
if isEmpty(languages[lang]) then
if this.namespace == 0 and isEmpty(nocat) then
s = s .. categoryErrors
end
else
langName = ' data-lang-name="' .. (languages[lang][1] and languages[lang][1] or '???') .. '"'
end
end
-- Проверава ограничење позива
if titleObj ~= nil then
ifExists = titleObj[1]
ifRedirect = titleObj[2]
end
-- Приказује везу за преусмеравање или црвену везу
local class = (ifExists and (ifRedirect and ' iw--redirect' or ' iw--exists') or '')
s = s .. string.format('<span class="iw%s plainlinks" data-title="%s" data-lang="%s"' .. langName .. '>', class, mwlang:ucfirst(title), lang)
if ifRedirect then
if this.namespace == 0 and isEmpty(nocat) then
s = s .. categoryRedirect
end
s = s .. string.format('[%s %s]', tostring(mw.uri.fullUrl(title,'redirect=no')), text)
else
s = s .. string.format('[[%s|%s]]', title, text)
end
-- Приказује везу на чланак на страном језику или предлог за уклањање шаблона
if ifExists and not ifRedirect then
s = s .. '<sup class="iw__notice noprint">[[Шаблон:Непреведено 5#Ако постоји чланак|'
.. '<span style="color:red; font-style:normal; font-weight:bold;" title="Уклоните шаблон «Непреведено 5» из чланка '
.. 'и замените га једноставном вики везом">?!</span>]]</sup>'
if this.namespace == 0 and isEmpty(nocat) then
s = s .. categoryExists
end
else
-- Ствара опис
local t = ''
if lang == 'd' then
t = string.format('Ставка чланка на «%s» в Википодацима', mwlang:ucfirst(title))
page = page .. '#sitelinks-wikipedia'
else
if not isEmpty(origPage) then
t = string.format('%s — верзија чланка', page)
else
t = 'Верзија чланка'
end
t = t .. string.format(' «%s» на %s', mwlang:ucfirst(title), p._transform_lang(lang))
end
-- Ствара белешку о преусмеравању
local aster = ''
if ifRedirect then
aster = '<sup class="iw__notice noprint" style="font-style:normal; font-weight:normal; margin:0 0 0 1px;">'
.. '[[Шаблон:Непреведено 5#Ако постоји преусмеравање|'
.. '<span style="color:red; font-weight:bold;" title="Замените наслов преусмеравања са насловом чланка или уклоните шаблон «Непреведено 5»">*</span>]]'
.. '</sup>'
end
-- Приказује везу до странице на страном језику
s = s .. '<sup class="iw__note noprint" style="font-style:normal; font-weight:normal;">' ..
string.format('[[:%s:%s|<span class="iw__tooltip" title="%s">[%s]</span>]]</sup>', lang, page, t, lang) ..
aster
-- Приказује статус странице на страном језику
if not isEmpty(state) and not isEmpty(states[state]) then
s = s .. string.format('<sup class="iw__status noprint" style="margin:0 0 0 1px;">[[Файл:%s|8px|link=%s|%s]]</sup>',
states[state][3], states[state][1], states[state][2])
end
end
return s .. '</span>'
else
-- Ако нема потребног параметра, приказује се црвени текст
local htmlerror = require('Module:Error').error
return htmlerror{'Наведите наслов странице.'}
end
end
-- Помоћна функција за {{Непреведено 5}}: излази замена шаблона
function p._substIW(title, text)
local s = '[[' .. title
if not isEmpty(text) and title ~= text then
s = s .. '|' .. text
end
return s .. ']]'
end
-- Враћа {{Непреведено 5}}
function p.getIW(frame)
local mwlang = mw.getContentLanguage()
local f = frame.args
local title = f.title
local text = f.text
local lang = mwlang:lc(f.lang)
local page = f.page
local state = f.state
local nocat = f.nocat
if not mw.isSubsting() then
return p._newIW(title, text, lang, page, state, nocat)
end
return p._substIW(title, text)
end
return p