Модуль:TNT
Цей модуль дозволяє легко перекладати шаблони та модулі в рамках проєкту багатомовних шаблонів та модулів. Замість того, щоб зберігати англійський текст у модулі або шаблоні, модуль 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 }} |
Переклад параметрів шаблону
[ред. код]{{#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" як суфікс для імен таблиць.
- Декілька прикладів.
Документація вище включена з Модуль:TNT/документація. (ред. | історія) Дописувачі можуть експериментувати на підсторінках пісочниця (створити | дзеркало) та тести (створити) цього модуля. Будь ласка, додавайте категорії до підсторінки /документація. Підсторінки цієї сторінки. |
--
-- ВСТУП: (!!! НЕ ПЕРЕЙМЕНОВУЙТЕ ЦЮ СТОРІНКУ!!!)
-- Цей модуль дозволяє копіювати/вставляти будь-який шаблон чи модуль
-- між вікіпроєктами без зміни перекладу. Весь текст перекладу зберігається
-- в глобальних 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