Module:Linguistic

-- some simple internationalization that can be called by other modules

local p = {} local f = require('Module:Fallback')

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

function comma(lang) m = mw.message.newFallbackSequence( "comma-separator" ) m:inLanguage(lang) return m:plain end

function wordand(lang) local andtable = { -- languages with a problem with the MediaWiki:And ['pl'] = ' i', ['no'] = ' og', ['zh'] = '和' }	if andtable[lang] then return andtable[lang] end m = mw.message.newFallbackSequence( "and" ) m:inLanguage(lang) return m:plain end

function wordsep(lang) -- default separator between words m = mw.message.newFallbackSequence( "Word-separator" ) m:inLanguage(lang) return m:plain end

function isin(str, pattern) if str and pattern and mw.ustring.find(str, pattern, 1, true ) then return true end end

function langisin(str, lang) return isin(str, lang .. ' ') -- space is necessary to avoid false positives like zh in zh-hans end

function processgender(str) if (str == 'f') or (str == 'fem') or (str == 'feminine') then return 'feminine' elseif (str == 'n') or (str == 'neutral') then return 'neutral' else return 'masculine' end end

function processnumber(str) if (str == 'p') or (str == 'plural') then return 'plural' else return 'singular' end end

function p.vowelfirst (str) if str then return isin(vowels, str[1]) end 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 then raw = word end gender = processgender(gender) number = processnumber(number) -- raw is the string without the Wikiformatting so that it correctly analyses the string that is Italie -> 'italie' -- any way to automate this ? -- todo: ca to replace Template:Of/ca if lang == 'fr' then if number == 'plural' then return 'des ' .. word elseif p.vowelfirst(raw) then return 'de l\'' .. word elseif gender == 'feminine' then return 'de la ' .. word elseif derterminer then return 'du ' .. 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 -- adjective before the noun if langisin('de de-at de-ch en en-ca en-gb pl zh zh-hans zh-hant zh-my zh-cn zh-sg zh-tw ', lang) then return adj .. wordsep(lang) .. noun -- adjective after the noun elseif langisin('fr fr-ca es it') then return noun .. wordsep(lang) .. adj else return noun ' (' .. adj .. ')' end end

function p.conj(args, lang, conjtype) if conjtype == 'comma' then return mw.text.listToText(args, comma(lang), comma(lang)) elseif conjtype == 'or' then return mw.text.listToText(args, comma(lang), wordor(lang) .. wordsep(lang)) elseif conjtype == 'explicit or' then -- adds "or" betwen all words when the context can be confusing return mw.text.listToText(args, wordor(lang) .. wordsep(lang), wordor(lang) .. wordsep(lang)) elseif conjtype and conjtype ~= 'and' and conjtype ~= '' then return 'unknown conj type : ' .. conjtype .. ''	else return mw.text.listToText(args, comma(lang), wordand(lang) .. wordsep(lang)) end end

function p.conjfromWiki(frame) args = frame.args if not args or not args[1] then args = mw.getCurrentFrame:getParent.args end local conjtype = args.type local lang = args.lang if not lang or mw.text.trim(lang) == '' then lang = frame:preprocess( "" ) 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, conjtype) end

return p