Difference between revisions of "Module:Linguistic"
From Peter
(make local functions local; add inparentehses function) |
m (1 revision imported) |
(No difference)
|
Latest revision as of 13:16, 19 August 2016
Documentation for this module may be created at Module:Linguistic/doc
-- some simple internationalization that can be called by other modules local p = {} local f = require('Module:Fallback') local vowels = 'aeiouyąăẵằẳặȃắâẫấầẩậãäǟāáàȁǎảẚåǻḁạǡæǣǽĕȇêễếềểệḙẽḛëēḕéḗèȅěẻẹęȩḝǝĭȋîĩḭïḯīíìȉǐỉịįıŏȏôỗốồổộõṏṍöōṑóṓòȍǒỏọǫǭơỡớờởợøǿŭȗûṷũṻṹṵüǖǘǜǚṳūúùȕǔủůụųưữứừửựŷỹÿȳýỳỷẙỵ' local function wordor(lang) return f._langSwitch(require('Module:I18n/or'), lang) end local function comma(lang) m = mw.message.newFallbackSequence( "comma-separator" ) m:inLanguage(lang) return m:plain() end local function wordand(lang) local andtable = { -- languages with a problem with the MediaWiki:And ['pl'] = ' i', ['no'] = ' og', ['zh'] = '和', ['ja'] = 'および' } if andtable[lang] then return andtable[lang] end m = mw.message.newFallbackSequence( "and" ) m:inLanguage(lang) return m:plain() end local function wordsep(lang) -- default separator between words m = mw.message.newFallbackSequence( "Word-separator" ) m:inLanguage(lang) return m:plain() end local function isin(str, pattern) if str and pattern and mw.ustring.find(str, pattern, 1, true ) then return true end 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) 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 local 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.inparentehses(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 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 [[:fr:Italie|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 mw.text.listToText(args, conjtype, 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( "{{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 .. '[[Category:Pages with incorrect template usage/Conj|A]]' end end end return p.conj(newargs, lang, conjtype) end return p