Модуль: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