Модуль:TNT

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
{{i}} Документація модуля[перегляд] [редагувати] [історія] [очистити кеш]

Цей модуль дозволяє легко перекладати шаблони та модулі в рамках проєкту багатомовних шаблонів та модулів. Замість того, щоб зберігати англійський текст у модулі або шаблоні, модуль TNT дозволяє модулям бути мовно-нейтральними та зберігати багатомовний текст у сторінках табличних даних на Commons. Таким чином, ваш модуль або шаблон буде використовувати перекладені рядки (повідомлення), або якщо повідомлення ще не перекладено, повернеться до англійської мови. Коли хтось оновить таблицю перекладів, ваша сторінка автоматично оновиться (це може зайняти деякий час, або ви можете її очистити), але в жодній з вікісистем не потрібно змінювати шаблон або модуль. Цей процес дуже схожий на локалізацію MediaWiki і підтримує всі стандартні угоди локалізації, такі як {{PLURAL|...}} та інші параметри.

Цей модуль можна використовувати із шаблонів, які використовують #invoke, та інших модулів. Для простого прикладу дивіться Data:I18n/Template:Graphs.tab - таблиця із двома повідомленнями, кожне повідомлення має один параметр. За угодою всі таблиці перекладу повинні мати префікс Data:I18n/..., щоб відокремити їх від інших типів даних.

Цей модуль можна використовувати із шаблонів, які використовують #invoke, та інших модулів. Для простого прикладу дивіться Data:I18n/Template:Graphs.tab — таблиця із двома повідомленнями, кожне повідомлення має один параметр. За угодою всі таблиці перекладу повинні мати префікс '''Data:I18n/...''', щоб відокремити їх від інших типів даних.

Використання з шаблонів[ред. код]

Опис Вікірозмітка
У шаблоні ця команда перекладає повідомлення source_table за допомогою таблиці перекладу Commons Data:I18n/Template:Graphs.tab.
{{#invoke:TNT | msg
| I18n/Template:Graphs.tab
| source_table
}}
Якщо повідомлення містить параметри, ви можете вказати їх після ID повідомлення.
{{#invoke:TNT | msg
| I18n/Template:My Template.tab
| message-with-two-params
| param1
| param2
}}

Переклад параметрів шаблону[ред. код]

Параметри шаблону зазвичай зберігаються у вигляді блоку JSON templatedata всередині підсторінки /doc шаблону. Це робить його зручним для перекладу, але коли до глобального шаблону додається новий параметр, всі сторінки /doc повинні бути оновлені кожною мовою. TNT допомагає в цьому, автоматично генеруючи блок templatedata з таблиці, що зберігається на Commons. Якщо помістити цей рядок у кожну підсторінку /doc, то таблиця Data:Templatedata/Graph:Lines.tab буде використовуватися для генерації всієї необхідної інформації templatedata кожною мовою. Навіть якщо місцева спільнота не переклала повну документацію шаблону, вона зможе побачити всі параметри шаблону, які оновлюються централізовано.
{{#invoke:TNT | doc | Graph:Lines }}

Використання з модулів[ред. код]

Як і шаблони, модулі повинні використовувати цей модуль для локалізації:

local TNT = require('Модуль:TNT')

-- форматування рядка <messageId> з двома параметрами за допомогою таблиці перекладу.
local text = TNT.format('I18n/My_module_messages', 'messageId', 'param1', 'param2', ...)

-- Те ж саме, але перекласти певною мовою.
local text = TNT.formatInLanguage('uk', 'I18n/My_module_messages', 'messageId', 'param1', 'param2', ...)

Використання TNTTools[ред. код]

Модуль:TNTTools містить:

  • Функції питання: з булевим чи числовим індексованим поверненням. Викликаються з інших модулів або шаблонів. З допомогою:
    • опції з урахуванням регістру.
    • можливості мати більше одного перекладеного значення тексту (де кожне значення розділене знаком "|").
  • Щоб не писати, додайте "I18n/" як префікс і розширення ".tab" як суфікс для імен таблиць.
  • Декілька прикладів.
--
-- ВСТУП:   (!!! НЕ ПЕРЕЙМЕНОВУЙТЕ ЦЮ СТОРІНКУ!!!)
--    Цей модуль дозволяє копіювати/вставляти будь-який шаблон чи модуль
--    між вікіпроєктами без зміни перекладу. Весь текст перекладу зберігається
--    в глобальних Data:*.tab на сторінках Commons і використовується всюди.
--
-- ДИВІТЬСЯ:   https://www.mediawiki.org/wiki/Multilingual_Templates_and_Modules
--
-- УВАГА:
--    Будь ласка, НЕ перейменовуйте цей модуль — він має бути однаковим у всіх вікіпроєктах.
--    Цей код підтримується на https://www.mediawiki.org/wiki/Module:TNT
--    Будь ласка, не змінюйте його в інших місцях, оскільки він може бути скопійований і скасувати зміни.
--    Пропозиції можна надсилати на адресу https://www.mediawiki.org/wiki/Module_talk:TNT
--
-- ОПИС:
--    Функція «msg» використовує набір даних Commons для перекладу повідомлення
--    із заданим ключем (наприклад, source-table) також необов'язкові параметри
--    у вікірозмітку поточною мовою вмісту. Використовуйте lang=xx для встановлення мови. Приклад:
--
--    {{#invoke:TNT | msg
--     | I18n/Template:Graphs.tab  <!-- https://commons.wikimedia.org/wiki/Data:I18n/Template:Graphs.tab -->
--     | source-table              <!-- використовує повідомлення перекладу з id = «source-table». -->
--     | param1 }}                 <!-- необов'язковий параметр -->
--
--
--    Функція «doc» генеруватиме документацію параметрів <templatedata> для шаблонів.
--    Таким чином, усі параметри шаблонів можуть бути збережені та локалізовані в одному наборі даних Commons.
--    ПРИМІТКА: «doc» передбачає, що вся документація знаходиться в Data:Templatedata/* на Commons.
--
--    {{#invoke:TNT | doc | Graph:Lines }}
--        використовує https://commons.wikimedia.org/wiki/Data:Templatedata/Graph:Lines.tab
--        якщо поточною сторінкою є Template:Graph:Lines/doc
--

local p = {}
local i18nDataset = 'I18n/Module:TNT.tab'

-- Форвардна декларація місцевих функцій
local sanitizeDataset, loadData, link, formatMessage

function p.msg(frame)
	local dataset, id
	local params = {}
	local lang = nil
	for k, v in pairs(frame.args) do
		if k == 1 then
			dataset = mw.text.trim(v)
		elseif k == 2 then
			id = mw.text.trim(v)
		elseif type(k) == 'number' then
			table.insert(params, mw.text.trim(v))
		elseif k == 'lang' and v ~= '_' then
			lang = mw.text.trim(v)
		end
	end
	return formatMessage(dataset, id, params, lang)
end

-- Identical to p.msg() above, but used from other lua modules
-- Parameters:  name of dataset, message key, optional arguments
-- Example with 2 params:  format('I18n/Module:TNT', 'error_bad_msgkey', 'my-key', 'my-dataset')
function p.format(dataset, key, ...)
	local checkType = require('libraryUtil').checkType
	checkType('format', 1, dataset, 'string')
	checkType('format', 2, key, 'string')
	return formatMessage(dataset, key, {...})
end


-- Identical to p.msg() above, but used from other lua modules with the language param
-- Parameters:  language code, name of dataset, message key, optional arguments
-- Example with 2 params:  formatInLanguage('es', I18n/Module:TNT', 'error_bad_msgkey', 'my-key', 'my-dataset')
function p.formatInLanguage(lang, dataset, key, ...)
	local checkType = require('libraryUtil').checkType
	checkType('formatInLanguage', 1, lang, 'string')
	checkType('formatInLanguage', 2, dataset, 'string')
	checkType('formatInLanguage', 3, key, 'string')
	return formatMessage(dataset, key, {...}, lang)
end

-- Застаріла функція, яка додає префікс 'c:' до першого параметра.
-- «Sandbox/Sample.tab» -> 'c:Data:Sandbox/Sample.tab'
function p.link(frame)
	return link(frame.args[1])
end

function p.doc(frame)
	local dataset = 'Templatedata/' .. sanitizeDataset(frame.args[1])
	return frame:extensionTag('templatedata', p.getTemplateData(dataset)) ..
		   formatMessage(i18nDataset, 'edit_doc', {link(dataset)})
end

function p.getTemplateData(dataset)
	-- ЗРОБИТИ: додати параметр '_', коли lua почне правильно переіндексувати для «всіх» мов
	local data = loadData(dataset)
	local names = {}
	for _, field in pairs(data.schema.fields) do
		table.insert(names, field.name)
	end

	local params = {}
	local paramOrder = {}
	for _, row in pairs(data.data) do
		local newVal = {}
		local name = nil
		for pos, val in pairs(row) do
			local columnName = names[pos]
			if columnName == 'name' then
				name = val
			else
				newVal[columnName] = val
			end
		end
		if name then
			params[name] = newVal
			table.insert(paramOrder, name)
		end
	end

	-- Робота навколо кодування json, що розглядає {"1":{...}} як [{...}]
	params['zzz123']=''

	local json = mw.text.jsonEncode({
		params=params,
		paramOrder=paramOrder,
		description=data.description
	})

	json = string.gsub(json,'"zzz123":"",?', "")

	return json
end

-- Локальні функції

sanitizeDataset = function(dataset)
	if not dataset then
		return nil
	end
	dataset = mw.text.trim(dataset)
	if dataset == '' then
		return nil
	elseif string.sub(dataset,-4) ~= '.tab' then
		return dataset .. '.tab'
	else
		return dataset
	end
end

loadData = function(dataset, lang)
	dataset = sanitizeDataset(dataset)
	if not dataset then
		error(formatMessage(i18nDataset, 'error_no_dataset', {}))
	end

	-- Видавати корисну помилку іншим користувачам, які намагаються скопіювати цей модуль.
	if not mw.ext or not mw.ext.data or not mw.ext.data.get then
		error('Відсутній додаток JsonConfig; Неможливо завантажити https://commons.wikimedia.org/wiki/Data:' .. dataset)
	end

	local data = mw.ext.data.get(dataset, lang)

	if data == false then
		if dataset == i18nDataset then
			-- Запобігання циклічним викликам
			error('Відсутня база даних Commons ' .. i18nDataset)
		else
			error(formatMessage(i18nDataset, 'error_bad_dataset', {link(dataset)}))
		end
	end
	return data
end

-- Враховуючи ім'я набору даних, перетворіть його на назву з префіксом 'commons:data:'
link = function(dataset)
	return 'c:Data:' .. mw.text.trim(dataset or '')
end

formatMessage = function(dataset, key, params, lang)
	for _, row in pairs(loadData(dataset, lang).data) do
		local id, msg = unpack(row)
		if id == key then
			local result = mw.message.newRawMessage(msg, unpack(params or {}))
			return result:plain()
		end
	end
	if dataset == i18nDataset then
		-- Запобігання циклічним викликам
		error('Неприпустимий ключ повідомлення "' .. key .. '"')
	else
		error(formatMessage(i18nDataset, 'error_bad_msgkey', {key, link(dataset)}))
	end
end

return p