Module:Linguistic

--[[ __  __           _       _        _     _                   _     _   _       |  \/  | ___   __| |_   _| | ___ _| |   (_)_ __   __ _ _   _(_)___| |_(_) ___  | |\/| |/ _ \ / _` | | | | |/ _ (_) |   | | '_ \ / _` | | | | / __| __| |/ __| | |  | | (_) | (_| | |_| | |  __/_| |___| | | | | (_| | |_| | \__ \ |_| | (__  |_|  |_|\___/ \__,_|\__,_|_|\___(_)_____|_|_| |_|\__, |\__,_|_|___/\__|_|\___|                                                  |___/                        Simple internationalization functions that can be called by other modules. This Module was copied from Wikimedia Commons, so please request changes there.

Maintainers:
 * Zolo - original version
 * Jarekt

Dependencies: ]]
 * Module:I18n/or
 * Module:Delink
 * Module:Yesno

-- ================================================== -- === Internal functions =========================== -- ==================================================

local function langSwitch(list,lang) local langList = mw.language.getFallbacksFor(lang) table.insert(langList,1,lang) for i,language in ipairs(langList) do		if list[language] then return list[language] end end return nil end

-- ================================================== -- === External functions =========================== -- ================================================== local p = {}

function p.vowelfirst (str) if str then local vowels = 'aeiouyąăẵằẳặȃắâẫấầẩậãäǟāáàȁǎảẚåǻḁạǡæǣǽĕȇêễếềểệḙẽḛëēḕéḗèȅěẻẹęȩḝǝĭȋîĩḭïḯīíìȉǐỉịįıŏȏôỗốồổộõṏṍöōṑóṓòȍǒỏọǫǭơỡớờởợøǿŭȗûṷũṻṹṵüǖǘǜǚṳūúùȕǔủůụųưữứừửựŷỹÿȳýỳỷẙỵ' str = mw.ustring.lower(mw.ustring.sub(str,1,1)) return mw.ustring.find(vowels, str, 1, true ) end end

function p.inparentheses(str) if (not str) or (str == "") then return nil end return "(".. str .. ")" -- same in all languages ? end

function p.of(word, lang, raw, gender, number, determiner) -- rough translation of "of" in various languages -- note that the cases when on "of" is employed varies a lot among languages, so it is more prudent to call this from lang specific function only if not raw or mw.text.trim(raw) == "" then local args = {} local Delink = require('Module:Delink')._delink args[1] = word raw = mw.ustring.lower(Delink(args)) end

-- raw is the string without the Wikiformatting so that it correctly analyses the string that is Italie -> 'italie' -- any way to automate this ? if lang == 'fr' then local yesno = require('Module:Yesno') determiner = yesno(determiner,false)

if determiner then if string.sub(number or '',1,1)=='p' then -- number == 'plural' return 'des&#32;' .. word elseif p.vowelfirst(raw) then return 'de l’' .. word elseif string.sub(gender or '',1,1)=='f' then -- gender == 'feminine' return 'de la&#32;' .. word else return 'du&#32;' .. word end else if p.vowelfirst(raw) then return 'd’' .. word else return 'de&#32;' .. word end end elseif lang == 'ca' then -- implement Template:Of/ca or https://ca.wikipedia.org/wiki/Plantilla:Deod%27/base for case where "" is "en" (default on Commons) if ( p.vowelfirst(raw) and not mw.ustring.find( 'ia|ià|ie|io|iu|ua|ue|ui|uí|uï|uo|ya|ye|yi|yo|yu|', mw.ustring.sub(raw,1,2) .. '|')) then return 'd\'' .. word else return 'de ' .. word end end

end

function p.offromwiki(frame) args = frame.args return p.of(args.word, args.lang, args.raw, args.gender, args.number, args.determiner) end

function p.noungroup(noun, adj, lang) if not noun or noun == '' then return nil -- not '' so that it is not counted as a string by mw.listToText end if not adj or adj == '' then return noun end local wordsep = mw.message.new( "Word-separator" ):inLanguage(lang):plain local LUT = { de=1, en=1, pl=1, zh=1, fr=2, es=2, it=2} local case = langSwitch(LUT, lang) if case==1 then    -- adjective before the noun return adj .. wordsep .. noun elseif case==2 then -- adjective after the noun return noun .. wordsep .. adj else               -- order unknown return noun ' (' .. adj .. ')' end end

function p.conj(args, lang, conjtype) local comma   = mw.message.new( "comma-separator"):inLanguage(lang):plain local wordsep = mw.message.new( "Word-separator" ):inLanguage(lang):plain local andtable = { ar=' و', he=' ו', ja='および', pl=' i '} -- languages with a problem with the MediaWiki:And if conjtype == 'comma' then return mw.text.listToText(args, comma, comma) elseif conjtype == 'or' then local wordor = 	langSwitch(require('Module:I18n/or'), lang) return mw.text.listToText(args, comma, wordor .. wordsep) elseif conjtype == 'explicit or' then -- adds "or" betwen all words when the context can be confusing local wordor = 	langSwitch(require('Module:I18n/or'), lang) return mw.text.listToText(args, wordor .. wordsep, wordor .. wordsep) elseif conjtype and conjtype ~= 'and' and conjtype ~= '' then return mw.text.listToText(args, conjtype, conjtype) elseif andtable[lang] then return mw.text.listToText(args, comma, andtable[lang]) else local wordand = mw.message.new( "and" ):inLanguage(lang):plain return mw.text.listToText(args, comma, wordand .. wordsep) end end

function p.conjfromWiki(frame) args = frame.args if not args or not args[1] then args = frame:getParent.args end local lang = args.lang if not lang or mw.text.trim(lang) == '' then lang = frame:callParserFunction( "int", "lang" ) end newargs = {} -- transform args metatable into a table so it can be concetenated for i, j in pairs(args) do			if type(i) == 'number' then j = mw.text.trim(j) if j ~= '' then table.insert(newargs, j)				end else if i ~= 'type' and i ~= 'lang' then return 'error: bad parameter in template:Conj: ' .. i .. ''				end end end return p.conj(newargs, lang, args.type) end

return p