Модуль:Language
Назначение
Получение универсальной информации о языках
Описание функций и параметров
get
— основная функция получения данных, принимает два параметра:lang
— код языка (например,ru
,orv
и пр.)param
— тип получаемой информации (при этом от регистра параметра зависит регистр результата)name
,title
,им
,наз
,название
,имя
— возвращается название языкаcat
,category
,кат
,категория
— возвращается категория для языкаcat2
— возвращается вторая категория для языка (если указана)from
,от
,gen
,genitive
,род
,его
— возвращается название в родительном падежеon
,на
,pre
,пред
— возвращается название в предложном падежеpl
,мн
,plural
,они
— возвращается название во множественном числеadj
,прил
,прилагательное
— возвращается форма прилагательногоshort
,сокр
,сокращение
— возвращается сокращение
print_table
— функция для распечатки текущих данных модуля language/data в красивом и понятном виде (используется на странице документации модуля language/data)
list
— вывод списка ссылок на языки с кодами, переданными в параметрах, с использованием общепринятых сокращений. Используется шаблоном {{l6e}}:
getRefHtmlFrame
— вывод сокращённого названия языка со всплывающей подсказкой по коду на Q (что за код?):{{#invoke:Language|getRefHtmlFrame|Q7737}}
→ (рус.).
Используемые модули
Данные по языкам хранятся в модуле language/data
См. также
- {{language}}
-- Наброски модуля для универсальной работы с языками
-- загрузка модуля данных с таблицей языков
local languages = mw.loadData("Module:language/data");
local p = {};
local function get_param (param)
local param = mw.ustring.lower (param)
if param == '' or param == 'наз' or param == 'название' or param == 'имя' or param == 'title' or param == 'им' then
param = 'name'
end
if param == 'category' or param == 'кат' or param == 'категория' then
param = 'cat'
end
if param == 'gen' or param == 'genitive' or param == 'от' or param == 'род' or param == 'его' then
param = 'from'
end
if param == 'pre' or param == 'на' or param == 'пред' then
param = 'on'
end
if param == 'прил' or param == 'прилагательное' then
param = 'adj'
end
if param == 'сокр' or param == 'сокращение' then
param = 'short'
end
if param == 'мн' or param == 'plural' or param == 'они' then
param = 'pl'
end
return param
end
local function inflect (paradigm, endings)
local result = mw.ustring.gsub (paradigm, '%{(%l*)%}', endings)
return result
end -- local function inflect (paradigm, endings)
local function nom_case (value)
return inflect (value, {
[''] = ''
, ['ий'] = 'ий'
, ['ый'] = 'ый'
, ['ое'] = 'ое'
})
end -- local function nom_case (value)
local function gen_case (value)
return inflect (value, {
[''] = 'а'
, ['ий'] = 'ого'
, ['ый'] = 'ого'
, ['ое'] = 'ого'
})
end -- local function gen_case (value)
local function pre_case (value)
return inflect (value, {
[''] = 'е'
, ['ий'] = 'ом'
, ['ый'] = 'ом'
, ['ое'] = 'ом'
})
end -- local function pre_case (value)
local function plural (value)
return inflect (value, {
[''] = 'и'
, ['ий'] = 'ие'
, ['ый'] = 'ие'
, ['ое'] = 'ие'
})
end -- local function plural (value)
local gsub = mw.ustring.gsub
local function substitute_taxons (paradigm, apostrophes, with)
local result = gsub (paradigm, "'([^']+)'", apostrophes)
for _, taxon in ipairs {'язык', 'диалект', 'наречие', 'говор'} do
result = gsub (result, '%[(' .. taxon .. ')%]', with)
end
result = gsub (result, ' ', ' ')
result = gsub (result, '%(%)', '')
return result
end -- local function substitute_taxons (paradigm, apostrophes, with)
local function get_name (value)
return substitute_taxons (value, '%1', '')
end -- local function get_name (value)
local function get_category (value)
return substitute_taxons (value, '', '%1{}')
end -- local function get_category (value)
local function implement_get (code, param)
local result = param
local data = languages [code] or languages ['-']
local name_tpl = data.name
local name = get_name (name_tpl)
if param == 'name' then
result = nom_case (name)
elseif param == 'cat' then
result = nom_case (get_category (name_tpl))
elseif param == 'cat2' then
if data.cat2 then
result = nom_case (data.cat2)
else
result = ''
end
elseif param == 'adj' then
if data.adj then
adj = data.adj
if adj == '=' then
adj = name
end
result = nom_case (adj)
else
result = '(нет значения)'
end
elseif param == 'from' then
result = gen_case (name)
elseif param == 'on' then
result = pre_case (name)
elseif param == 'pl' then
result = plural (name)
elseif param == 'short' then
if data.short then
result = data.short
else
result = mw.ustring.lower (implement_get (code, 'name')) -- "(нет значения)"
end
else
result = '(ошибка параметра)'
end
return mw.text.trim (result)
end -- local function implement_get (code, param)
function p.get (frame)
local code = frame.args ['lang']
local param = frame.args ['param']
local is_lower = (param ~= '' and mw.ustring.lower (param) == param)
param = get_param (param)
local result = implement_get (code, param)
if is_lower and param ~= 'cat' then
result = mw.ustring.lower (result)
end
return result
end
function p.name (code)
return implement_get (code, 'cat')
end -- function p.name (code)
local function colorize(value)
local result = gsub (value, '(%{[^}]*%})', '<span style="color: darkblue">%1</span>')
result = gsub (result, "('[^']+')", '<span style="color: green">%1</span>')
result = gsub (result, '(%[язык%])', '<span style="color: maroon">%1</span>')
result = gsub (result, '(%[диалект%])', '<span style="color: maroon">%1</span>')
result = gsub (result, '(%[наречие%])', '<span style="color: maroon">%1</span>')
return result
end
local codeByItemId = mw.loadData "Module:Wikidata/Language-codes"
function p.print_table(frame)
local WDcodes = {}
for WD, iso in pairs (codeByItemId) do
WDcodes [iso] = WD
end
local result = ''
local codes = {}
result = result .. '{| class="sortable prettytable" style="text-align: center;" cellpadding="0" cellspacing="0"\n'
result = result .. '! Код || Код || Код WikiData || Название || Доп. категория || Прилагательное || Сокращение || Другие названия || Родительный падеж || Предложный падеж || Множественное число\n'
for code, data in pairs(languages) do
table.insert(codes, code)
end
table.sort (codes)
for i, code in ipairs (codes) do
result = result .. '|-'
if languages [code] .redirect then
result = result .. "style='background-color: #eeeeee; color: gray;'"
end
result = result .. '\n'
result = result .. '| ' .. code .. ' || '
if languages [code].code then
result = result .. languages [code].code
end
result = result .. ' || '
result = result .. (WDcodes [code] or '')
result = result .. ' || '
result = result .. colorize (languages [code].name)
result = result .. ' || '
if languages [code].cat2 then
result = result .. colorize (languages [code].cat2)
end
result = result .. ' || '
if languages [code].adj then
result = result .. colorize (languages [code].adj)
end
result = result .. ' || '
if languages [code].short then
result = result .. languages [code].short
end
result = result .. ' || style="text-align: left;" | '
if languages [code].other then
result = result .. colorize (languages [code].other)
end
result = result .. ' || style="text-align: left;" | '
local case = implement_get (code, 'from')
if case then
result = result .. colorize (case)
end
result = result .. ' || style="text-align: left;" | '
local case = implement_get (code, 'on')
if case then
result = result .. colorize (case)
end
result = result .. ' || style="text-align: left;" | '
local case = implement_get (code, 'pl')
if case then
result = result .. colorize (case)
end
result = result .. '\n'
end
result = result .. '|}'
return result
end
--[[
Moved from Module:Languages
--]]
-- получает код языка, возвращает ссылку и нормализованный код языка (или пустые строки)
local function get_lang_data (code)
local name, short = implement_get (code, 'cat'), implement_get (code, 'short')
if short ~= 'неизв.' then
return '<span class="lang-link">[[:' .. name .. '|' .. short .. ']]</span>', code
elseif code ~= '' then
return code, ''
else
return '', ''
end
end
-- принимает zh|我|tt|мин, возвращает список через запятую
function p.list (frame)
local curr_lang = nil
local result = nil
for _, v in pairs (frame.args) do
local trimmed = mw.text.trim (v)
if curr_lang == nil then
if trimmed ~= '' then
-- если язык пропущен, оставим прошлый
curr_lang = mw.text.trim (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 class="foreign-lang" 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 -- function p.list (frame)
--[[
From Module:Languages
--]]
local function getRefHtml (wikidataItemId)
local code = codeByItemId [wikidataItemId]
if code then
local name, short = implement_get (code, 'cat'), implement_get (code, 'short')
if short ~= 'неизв.' then
return '<span class="ref-info" title="' ..name .. '" style="font-size:85%; cursor:help; color:#888;">(' .. short .. ')</span>'
else
mw.log ('Language description for code ' .. code .. ' not found')
return ''
end
else
mw.log ('Language code not found for ' .. wikidataItemId)
return ''
end
end -- local function getRefHtml (wikidataItemId)
function p.getRefHtmlFrame (frame)
return getRefHtml (mw.text.trim (frame.args [1]))
end
return p