User:Peaceray/Converting Havard citations to shortened footnotes (sfn)/Module/Linguistic

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

local p = {} local f = require('Module:Fallback') local i18n = mw.loadData('Module:I18n/linguistic')

local function getText(msg, lang) return f._langSwitch(i18n[msg], lang) end

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

local function wordor(lang) return getText('or_conj', lang) end

local function comma(lang) return getText("comma", lang) end

local function citation_comma(lang) return getText("citation_comma", lang) end

function p.fullstop(lang) return getText("full_stop", lang) end

function p.colon(lang) return getText("colon", lang) end

local function wordand(lang) return getText("and_conj", lang) end

local function wordsep(lang) -- default separator between words return getText("word_separator", lang) end

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

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

local function processgender(str) local t = { f = 'feminine', fem = 'feminine', feminine = 'feminine', m = 'masculine', masc = 'masculine', masculine = 'masculine', n = 'neutral', neutral = 'neutral', }   return t[str] or 'masculine' end

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

function p.vowelfirst(str) return str and isin(vowels, str[1]) end

function p.inparentheses(str, lang) --todo: define language with exotic parentheses if str == '' then return str else return ' (' .. str .. ')' -- needs internationalization. -- Needs leading space in English because as some languages do not use it, it is part of the formatting 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 return raw 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('cs de de-at de-ch en en-ca en-gb pl sk zh zh-cn zh-hans zh-hant zh-my 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 .. p.inparentheses(adj, lang) end end

function p.conj(args, lang, conjtype) if not args then return nil end local newargs = {} for i, j in pairs(args) do       if type(j) ~= 'nil' then table.insert(newargs, j)       end end args = newargs if #args == 0 then return nil end if conjtype == 'comma' then return mw.text.listToText(args, comma(lang), comma(lang)) elseif conjtype == 'citation_comma' then return mw.text.listToText(args, citation_comma(lang), citation_comma(lang)) elseif conjtype == 'or' then return mw.text.listToText(args, comma(lang), wordor(lang) .. wordsep(lang)) elseif conjtype == 'explicit or' then -- adds "or" between all words when the context can be confusing return mw.text.listToText(args, wordor(lang) .. wordsep(lang), wordor(lang) .. wordsep(lang)) elseif conjtype then return mw.text.listToText(args, conjtype, conjtype) else return mw.text.listToText(args, comma(lang), wordand(lang) .. wordsep(lang)) end end

return p