Module:User Wikimedia project translatable

Module documentation
-- This is an experimental fork of Module:User Wikimedia project
-- to test the Translatable modules feature.
-- Please don't use unless you are very very sure that you know
-- what you are doing.

local p = {} --p stands for package

local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')
local langSwitch = require('Module:Fallback')._langSwitch
local userbox = require('Module:Userbox').userbox

function is_wikimania_number_prefix(prefix)
	local function is_prefix(wm)
		return mw.ustring.sub(prefix, 1, mw.ustring.len(wm)) and mw.ustring.len(prefix) > mw.ustring.len(wm) and tonumber(mw.ustring.sub(prefix, mw.ustring.len(wm) + 1, -1))
	end
	return is_prefix('wm') or is_prefix('wikimania')
end

function project_name(prefix)
	if is_wikimania_number_prefix(prefix) then
		return 'Wikimania ' .. mw.ustring.sub(prefix, -4, -1)
	end
	local names = {
		['b'] = 'Wikibooks',
		['wikibooks'] = 'Wikibooks',
		['c'] = 'Wikimedia Commons',
		['commons'] = 'Wikimedia Commons',
		['d'] = 'Wikidata',
		['wikidata'] = 'Wikidata',
		['f'] = 'Wikifunctions',
		['wikifunctions'] = 'Wikifunctions',
		['incubator'] = 'Incubator',
		['m'] = 'Wikimedia MetaWiki',
		['metawiki'] = 'Wikimedia MetaWiki',
		['metawikimedia'] = 'Wikimedia MetaWiki',
		['metawikipedia'] = 'Wikimedia MetaWiki',
		['mw'] = 'MediaWiki',
		['n'] = 'Wikinews',
		['wikinews'] = 'Wikinews',
		['q'] = 'Wikiquote',
		['wikiquote'] = 'Wikiquote',
		['s'] = 'Wikisource',
		['wikisource'] = 'Wikisource',
		['species'] = 'Wikispecies',
		['wikispecies'] = 'Wikispecies',
		['v'] = 'Wikiversity',
		['wikiversity'] = 'Wikiversity',
		['voy'] = 'Wikivoyage',
		['wikivoyage'] = 'Wikivoyage',
		['w'] = 'Wikipedia',
		['wikipedia'] = 'Wikipedia',
		['wikt'] = 'Wiktionary',
		['wiktionary'] = 'Wiktionary',
		['outreach'] = 'Wikimedia Outreach',
		['wikitech'] = 'Wikitech',
		['wm'] = 'Wikimania',
		['wikimania'] = 'Wikimania'
	}
	return names[prefix] or prefix
end

function project_has_lang(prefix)
	local no_lang_projects = {
		['Wikimedia Commons'] = true,
		['Incubator'] = true,
		['Wikimedia MetaWiki'] = true,
		['MediaWiki'] = true,
		['Wikispecies'] = true,
		['Wikimedia Outreach'] = true,
		['Wikitech'] = true,
		['Wikimania'] = true,
		['Wikidata'] = true,
		['Wikifunctions'] = true
	}
	return no_lang_projects[project_name(prefix)] ~= true and not is_wikimania_number_prefix(prefix)
end

function localized_project_name(prefix, lang_code, display_lang)
	local name = project_name(prefix)
	local project_names = {
		['ang'] = {
			['Wikipedia'] = 'Wicipædie'
		},
		['eo'] = {
			['Wikipedia'] = 'Vikipedio'
		},
		['es'] = {
			['Wikibooks'] = 'Wikilibros',
			['Incubator'] = 'la Incubadora de Wikimedia',
			['Wikinews'] = 'Wikinoticias',
			['Wikispecies'] = 'Wikiespecies',
			['Wikiversity'] = 'la Wikiversidad',
			['Wikivoyage'] = 'Wikiviajes',
			['Wiktionary'] = 'Wikcionario',
			['Wikimania'] = 'Wikimanía'
		},
		['fa'] = {
			['Wikisource'] = 'ویکینبشته '
		},
		['fi'] = {
			['Wikidata'] = 'Wikidatassa',
			['Wikiquote'] = 'Wikisitaateissa',
			['Wikipedia'] = 'Wikipediassa'
		},
		['fr'] = {
			['Wiktionary'] = 'Wiktionnaire',
			['Wikipedia'] = 'Wikipédia'
		},
		['he'] = {
			['Wikidata'] = 'ראשי',
			['Wikimedia Commons'] = 'עמוד ראשי',
			['Wikimedia MetaWiki'] = 'במטא-ויקי',
			['Wiktionary'] = 'וויקימילון',
			['Wikisource'] = 'וויקיטקסט'
		},
		['hr'] = {
			['Wikipedia'] = 'Wikipediji'
		},
		['hu'] = {
			['Wikipedia'] = 'Wikipédián'
		},
		['ja'] = {
			['Wikidata'] = 'ウィキデータ',
			['Wikimedia Commons'] = 'ウィキメディア・コモンズ',
			['Wikimedia MetaWiki'] = 'メタウィキ',
			['Wikivoyage'] = 'ウィキボヤージュ',
			['Wikiversity'] = 'ウィキバーシティ',
			['Wikispecies'] =  'ウィキスピーシーズ',
			['Wikiquote'] = 'ウィキクオート',
			['Wiktionary'] = 'ウィクショナリー',
			['Wikisource'] = 'ウィキソース',
			['Wikipedia'] = 'ウィキペディア'
		},
		['ko'] = {
			['Wikimedia Commons'] = '위키미디어 공용',
			['Wikimedia MetaWiki'] = '위키미디어 메타',
			['Wikiversity'] = '위키배움터'
		},
		['pa'] = {
			['Wikimedia Commons'] = 'ਵਿਕੀਮੀਡੀਆ ਕਾਮਨਜ਼',
			['Wikimedia MetaWiki'] = 'ਵਿਕੀਮੀਡੀਆ ਮੈਟਾ-ਵਿਕੀ',
			['Wikidata'] = 'ਵਿਕੀਡਾਟਾ',
			['Wikisource'] = 'ਵਿਕੀਸਰੋਤ',
			['Wikipedia'] = 'ਵਿਕੀਪੀਡੀਆ'
		},
		['ta'] = {
			['Wikipedia'] = 'விக்கிப்பீடியாது',
		},
		['tr'] = {
			['Wikidata'] = 'Vikiveri',
			['Wikimedia MetaWiki'] = 'Wikimedia Meta Viki',
			['Wikispecies'] = 'Vikitür',
			['Wiktionary'] = 'Vikisözlük'
		},
		['uk'] = {
			['Wikipedia'] = 'Вікіпедії'
		},
		['vec'] = {
			['Wikipedia'] = 'Wikipèdia'
		}
	}
	local localized_name = name
	if project_names[display_lang] then
		if project_names[display_lang][name] then
			localized_name = project_names[display_lang][name]
		elseif mw.ustring.sub(name, 1, 9) == 'Wikimania' and project_names[display_lang]['Wikimania'] then
			localized_name = string.gsub(name, 'Wikimania', project_names[display_lang]['Wikimania'])
		end
	end
	
	if project_has_lang(prefix) and lang_code then
		local language_adjectives = {
			['ang'] = {
				['ang'] = 'Engliscan'
			},
			['en'] = {
				['ang'] = 'Old English',
				['ar'] = 'Arabic',
				['az'] = 'Azerbaijani',
				['bn'] = 'Bengali',
				['br'] = 'Breton',
				['cs'] = 'Czech',
				['da'] = 'Danish',
				['de'] = 'German',
				['en'] = 'English',
				['eo'] = 'Esperanto',
				['es'] = 'Spanish',
				['fa'] = 'Persian',
				['fi'] = 'Finnish',
				['fr'] = 'French',
				['gl'] = 'Galician',
				['he'] = 'Hebrew',
				['hi'] = 'Hindi',
				['hr'] = 'Croatian',
				['hu'] = 'Hungarian',
				['hy'] = 'Armenian',
				['id'] = 'Indonesian',
				['it'] = 'Italian',
				['ja'] = 'Japanese',
				['ko'] = 'Korean',
				['ml'] = 'Malayalam',
				['nl'] = 'Dutch',
				['no'] = 'Norwegian (Bokmål)',
				['pa'] = 'Punjabi',
				['pl'] = 'Polish',
				['ro'] = 'Romanian',
				['ru'] = 'Russian',
				['simple'] = 'Simple English',
				['sk'] = 'Slovak',
				['sq'] = 'Albanian',
				['sv'] = 'Swedish',
				['ta'] = 'Tamil',
				['tr'] = 'Turkish',
				['uk'] = 'Ukrainian',
				['vec'] = 'Venetian',
				['vi'] = 'Vietnamese',
				['zh'] = 'Chinese'
			},
			['eo'] = {
				['fr'] = 'Franca'
			},
			['es'] = {
				['ang'] = {['m'] = 'anglosajón', ['f'] = 'anglosajona'},
				['ar'] = {['m'] = 'árabe', ['f'] = 'árabe'},
				['az'] = {['m'] = 'azerí', ['f'] = 'azerí'},
				['bn'] = {['m'] = 'bengalí', ['f'] = 'bengalí'},
				['br'] = {['m'] = 'bretón', ['f'] = 'bretona'},
				['cs'] = {['m'] = 'checo', ['f'] = 'checa'},
				['da'] = {['m'] = 'danés', ['f'] = 'danesa'},
				['de'] = {['m'] = 'alemán', ['f'] = 'alemana'},
				['en'] = {['m'] = 'inglés', ['f'] = 'inglesa'},
				['eo'] = {['m'] = 'en esperanto', ['f'] = 'en esperanto'},
				['es'] = {['m'] = 'español', ['f'] = 'española'},
				['fa'] = {['m'] = 'persa', ['f'] = 'persa'},
				['fi'] = {['m'] = 'finés', ['f'] = 'finesa'},
				['fr'] = {['m'] = 'francés', ['f'] = 'francesa'},
				['gl'] = {['m'] = 'gallego', ['f'] = 'gallega'},
				['he'] = {['m'] = 'hebreo', ['f'] = 'hebrea'},
				['hi'] = {['m'] = 'hindi', ['f'] = 'hindi'},
				['hr'] = {['m'] = 'croata', ['f'] = 'croata'},
				['hu'] = {['m'] = 'húngaro', ['f'] = 'húngara'},
				['hy'] = {['m'] = 'armenio', ['f'] = 'armenia'},
				['id'] = {['m'] = 'indonesio', ['f'] = 'indonesia'},
				['it'] = {['m'] = 'italiano', ['f'] = 'italiana'},
				['ja'] = {['m'] = 'japonés', ['f'] = 'japonesa'},
				['ko'] = {['m'] = 'coreano', ['f'] = 'coreana'},
				['ml'] = {['m'] = 'malayalam', ['f'] = 'malayalam'},
				['nl'] = {['m'] = 'holandés', ['f'] = 'holandesa'},
				['no'] = {['m'] = 'en noruego (bokmål)', ['f'] = 'en noruego (bokmål)'},
				['pa'] = {['m'] = 'punjabi', ['f'] = 'punjabi'},
				['pl'] = {['m'] = 'polaco', ['f'] = 'polaca'},
				['ro'] = {['m'] = 'rumano', ['f'] = 'rumana'},
				['ru'] = {['m'] = 'ruso', ['f'] = 'rusa'},
				['simple'] = {['m'] = 'en inglés simple', ['f'] = 'en inglés simple'},
				['sk'] = {['m'] = 'eslovaco', ['f'] = 'eslovaca'},
				['sq'] = {['m'] = 'albanés', ['f'] = 'albanesa'},
				['sv'] = {['m'] = 'sueco', ['f'] = 'sueca'},
				['ta'] = {['m'] = 'támil', ['f'] = 'támil'},
				['tr'] = {['m'] = 'turco', ['f'] = 'turca'},
				['uk'] = {['m'] = 'ucraniano', ['f'] = 'ucraniana'},
				['vec'] = {['m'] = 'véneto', ['f'] = 'véneta'},
				['vi'] = {['m'] = 'vietnamita', ['f'] = 'vietnamita'},
				['zh'] = {['m'] = 'chino', ['f'] = 'china'}
			},
			['fi'] = {
				['fi'] = 'suomenkielisessä',
				['fr'] = 'ranskankielisessä'
			},
			['fr'] = {
				['fr'] = 'Français'
			},
			['ja'] = {
				['ang'] = '古英語版',
				['ar'] = 'アラビア語版',
				['az'] = 'アゼルバイジャン語版',
				['bn'] = 'ベンガル語版',
				['br'] = 'ブルトン語版',
				['cs'] = 'チェコ語版',
				['da'] = 'デンマーク語版',
				['de'] = 'ドイツ語版',
				['en'] = '英語版',
				['eo'] = 'エスペラント語版',
				['es'] = 'スペイン語版',
				['fa'] = 'ペルシア語版',
				['fi'] = 'フィンランド語版',
				['fr'] = 'フランス語版',
				['gl'] = 'ガリシア語版',
				['he'] = 'ヘブライ語版',
				['hi'] = 'ヒンディー語版',
				['hr'] = 'クロアチア語版',
				['hu'] = 'ハンガリー語版',
				['hy'] = 'アルメニア語版',
				['id'] = 'インドネシア語版',
				['it'] = 'イタリア語版',
				['ja'] = '日本語版',
				['ko'] = '韓国語版',
				['ml'] = 'マラヤーラム語版',
				['nl'] = 'オランダ語版',
				['no'] = 'ノルウェー語版 (Bokmål)',
				['pa'] = 'パンジャブ語版',
				['pl'] = 'ポーランド語版',
				['ro'] = 'ルーマニア語版',
				['ru'] = 'ロシア語版',
				['simple'] = 'シンプル英語版',
				['sk'] = 'スロバキア語版',
				['sq'] = 'アルバニア語版',
				['sv'] = 'スウェーデン語版',
				['ta'] = 'タミル語版',
				['tr'] = 'トルコ語版',
				['uk'] = 'ウクライナ語版',
				['vec'] = 'ヴェネト語版',
				['vi'] = 'ベトナム語版',
				['zh'] = '中国語版'
			},
			['pa'] = {
				['pa'] = 'ਪੰਜਾਬੀ'
			},
			['ta'] = {
				['ta'] = 'தமிழ்'
			}
		}
		if language_adjectives[display_lang] and language_adjectives[display_lang][lang_code] then
			if display_lang == 'en' then
				localized_name = 'the ' .. language_adjectives[display_lang][lang_code] .. " " .. localized_name
			elseif display_lang == 'ang' then
				localized_name = 'þæm ' .. language_adjectives[display_lang][lang_code] .. " " .. localized_name
			elseif display_lang == 'eo' then
				localized_name = 'la ' .. language_adjectives[display_lang][lang_code] .. " " .. localized_name
			elseif display_lang == 'es' then
				if localized_name == 'la Incubadora de Wikimedia' or localized_name == 'la Wikiversidad' then
					localized_name = localized_name .. ' ' .. language_adjectives[display_lang][lang_code]['f']
				elseif localized_name == 'Wikinoticias' or localized_name == 'Wikiespecies' or localized_name == 'Wikimanía' then
					localized_name = 'la ' .. localized_name .. ' ' .. language_adjectives[display_lang][lang_code]['f']
				else
					localized_name = 'el ' .. localized_name .. ' ' .. language_adjectives[display_lang][lang_code]['m']
				end
			elseif display_lang == 'fi' or display_lang == 'ta' then
				localized_name = language_adjectives[display_lang][lang_code] .. " " .. localized_name
			elseif display_lang == 'fr' then
				localized_name = 'le ' .. localized_name .. ' ' .. language_adjectives[display_lang][lang_code]
			end
		else
			localized_name = lang_code .. '-' .. localized_name
		end
	end
	
	return localized_name
end

function project_link_prefix(prefix, lang_code)
	if project_name(prefix) == 'Wikimedia MetaWiki' then
		return 'm:'
	else
		local link_prefix = prefix
		if project_has_lang(prefix) and lang_code then
			link_prefix = link_prefix .. ':' .. lang_code
		end
		link_prefix = link_prefix .. ':'
		return link_prefix
	end
end

function project_userpage_link(prefix, lang_code, username)
	return project_link_prefix(prefix, lang_code) .. 'User:' .. username
end

function project_project_link(prefix, lang_code)
	local link_target = project_link_prefix(prefix, lang_code) .. 'Special:MyLanguage/'

    if prefix == 'wikidata' then
        return link_target .. 'Wikidata:Main_Page'
    else
        return link_target .. 'Main_Page'
    end
end

function project_text(prefix, lang_code, username, gender, display_lang, frame)
	local tmb = require 'mw.ext.translate.messageBundle'
	local this_user_key = 'this-user-has'
	local mb_page_title = 'User:Amire80/User Wikimedia project mb'

	local lang1 = lang_code
	local mb_lang1 = tmb.new( mb_page_title, lang1 )
	local this_user_translation_lang1 = frame:preprocess(mb_lang1:t( this_user_key ):params(
		username,
		project_userpage_link(prefix, lang_code, username),
		project_project_link(prefix, lang_code),
		localized_project_name(prefix, lang_code, display_lang)
	):plain())
	if lang1 == 'simple' or not lang_code then
		lang1 = 'en'
	end
	
	local lang2 = display_lang or mw.getCurrentFrame():preprocess("{{Int:Lang}}")
	if lang2 == 'simple' then
		lang2 = 'en'
	end
	local mb_lang2 = tmb.new( mb_page_title, lang2 )
	local this_user_translation_lang2 = frame:preprocess(mb_lang2:t( this_user_key ):params(
		username,
		project_userpage_link(prefix, lang_code, username),
		project_project_link(prefix, lang_code),
		localized_project_name(prefix, lang_code, display_lang)
	):plain())

	local lang2_object = mw.language.new( lang2 )
	local lang2_dir = lang2_object:getDir()
	
	if lang1 == lang2 or not project_has_lang(prefix) then
		return '<p lang="' .. lang2 .. '" dir="' .. lang2_dir .. '">' .. this_user_translation_lang2 .. '</p>'
	else
		local lang1_object = mw.language.new( lang1 )
		local lang1_dir = lang1_object:getDir()
	
		return '<p lang="' .. lang1 .. '" dir="' .. lang1_dir .. '">' .. this_user_translation_lang1 .. '</p>\n----\n<p lang="' .. lang2 .. '" dir="' .. lang2_dir .. '">' .. this_user_translation_lang2 .. '</p>'
	end
end

function project_image(prefix)
	local filename
	local name = project_name(prefix)
	if name == 'Wikimedia MetaWiki' then
		filename = 'Wikimedia Community Logo.svg'
	elseif name == 'Wikimedia Commons' then
		filename = 'Commons-logo.svg'
	elseif name == 'Wikimedia Outreach' then
		filename = 'Wikimedia-logo.svg'
	elseif name == 'Wikitech' then
		filename = 'Wikitech-2021-blue-icon.svg'
	elseif name == 'MediaWiki' then
		filename = 'MediaWiki-2020-icon.svg'
	elseif name == 'Wikiversity' then
		filename = 'Wikiversity logo 2017.svg'
	elseif name == 'Wikimania' or is_wikimania_number_prefix(prefix) then
		filename = 'Wikimania.svg'
	else
		filename = mw.title.makeTitle('File', name .. '-logo.svg').text
	end
	return '[[File:' .. filename .. '|40px]]'
end

function p._user_wikimedia_project(args, frame)
	local prefix = string.lower(args[1] or args.prefix or "metawiki")
	local lang_code = args[2] or args.lang_code or args['lang code'] or 'en'
	local username = args[3] or args.username or mw.title.getCurrentTitle().rootText
	local gender = args.gender or username
	local display_lang = args.display_lang or args['display lang']
	
	local userbox_args = {
		['border-c'] = '#bbbbbb',
		['id'] = args.image or project_image(prefix),
		['id-c'] = '#ffffff',
		['info'] = project_text(prefix, lang_code, username, gender, display_lang, frame),
		['info-c'] = '#f6f6f6',
		['usercategory'] = args.usercategory,
		['usercategory2'] = args.usercategory2,
		['usercategory3'] = args.usercategory3,
		['nocat'] = args.nocat
	}
	return mw.getCurrentFrame():expandTemplate {
		['title'] = 'Userbox sister project',
		['args'] = userbox_args
	}
	--return userbox(userbox_args)
end

function p.user_wikimedia_project(frame)
	return p._user_wikimedia_project(getArgs(frame), frame)
end

return p