細
apply changes to noungroup function requested at the talk page
細 (1版) |
bsd>Jarekt 細 (apply changes to noungroup function requested at the talk page) |
||
1行目: | 1行目: | ||
-- | --[[ | ||
__ __ _ _ _ _ _ _ _ | |||
| \/ | ___ __| |_ _| | ___ _| | (_)_ __ __ _ _ _(_)___| |_(_) ___ | |||
| |\/| |/ _ \ / _` | | | | |/ _ (_) | | | '_ \ / _` | | | | / __| __| |/ __| | |||
| | | | (_) | (_| | |_| | | __/_| |___| | | | | (_| | |_| | \__ \ |_| | (__ | |||
|_| |_|\___/ \__,_|\__,_|_|\___(_)_____|_|_| |_|\__, |\__,_|_|___/\__|_|\___| | |||
|___/ | |||
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 =========================== | |||
-- ================================================== | |||
function | local function langSwitch(list,lang) | ||
local | 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 | end | ||
return nil | |||
return | |||
end | end | ||
-- ================================================== | |||
-- === External functions =========================== | |||
-- ================================================== | |||
local p = {} | |||
function | function p.vowelfirst (str) | ||
if str | if str then | ||
return | local vowels = 'aeiouyąăẵằẳặȃắâẫấầẩậãäǟāáàȁǎảẚåǻḁạǡæǣǽĕȇêễếềểệḙẽḛëēḕéḗèȅěẻẹęȩḝǝĭȋîĩḭïḯīíìȉǐỉịįıŏȏôỗốồổộõṏṍöōṑóṓòȍǒỏọǫǭơỡớờởợøǿŭȗûṷũṻṹṵüǖǘǜǚṳūúùȕǔủůụųưữứừửựŷỹÿȳýỳỷẙỵ' | ||
str = mw.ustring.lower(mw.ustring.sub(str,1,1)) | |||
return mw.ustring.find(vowels, str, 1, true ) | |||
end | end | ||
end | end | ||
function | function p.inparentheses(str) | ||
if (str | if (not str) or (str == "") then | ||
return | return nil | ||
end | end | ||
return "(".. str .. ")" -- same in all languages ? | |||
end | end | ||
function p.of(word, lang, raw, gender, number, determiner) -- rough translation of "of" in various languages | 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 | -- 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 | if not raw or mw.text.trim(raw) == "" then | ||
raw = | local args = {} | ||
local Delink = require('Module:Delink')._delink | |||
args[1] = word | |||
raw = mw.ustring.lower(Delink(args)) | |||
end | end | ||
-- raw is the string without the Wikiformatting so that it correctly analyses the string that is [[:fr:Italie|Italie]] -> 'italie' | -- 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 ? | -- any way to automate this ? | ||
if lang == 'fr' then | if lang == 'fr' then | ||
if number == 'plural' | local yesno = require('Module:Yesno') | ||
determiner = yesno(determiner,false) | |||
if determiner then | |||
if string.sub(number or '',1,1)=='p' then -- number == 'plural' | |||
return 'de | return 'des ' .. word | ||
elseif | elseif p.vowelfirst(raw) then | ||
return ' | return 'de l’' .. word | ||
elseif string.sub(gender or '',1,1)=='f' then -- gender == 'feminine' | |||
return 'de la ' .. word | |||
else | |||
return 'du ' .. word | |||
end | |||
else | |||
if p.vowelfirst(raw) then | |||
return 'd’' .. word | |||
else | |||
return 'de ' .. word | |||
end | |||
end | |||
elseif lang == 'ca' then | |||
-- implement [[Template:Of/ca]] or https://ca.wikipedia.org/wiki/Plantilla:Deod%27/base for case where "{{{context}}}" 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 | else | ||
return 'de ' .. word | return 'de ' .. word | ||
102行目: | 102行目: | ||
return p.of(args.word, args.lang, args.raw, args.gender, args.number, args.determiner) | return p.of(args.word, args.lang, args.raw, args.gender, args.number, args.determiner) | ||
end | end | ||
function p.noungroup(noun, adj, lang) | function p.noungroup(noun, adj, lang) | ||
if not noun or noun == '' then | if not noun or noun == '' then | ||
109行目: | 110行目: | ||
then return noun | then return noun | ||
end | end | ||
-- adjective before the noun | |||
local wordsep = mw.message.new( "Word-separator" ):inLanguage(lang):plain() | |||
return adj .. wordsep | -- Assign order of words per language: 1- means adjective before the noun and 2 means adjective after the noun | ||
-- adjective after the noun | -- original source for many: language subpages of [[Template:Technique]] | ||
-- corrections to that using https://wals.info/feature/87A, still different: | |||
return noun .. wordsep | -- * vi: WALS says 2 | ||
else | -- gl isn't consistent in [[Template:Technique/gl]], but seems to be 2 | ||
return noun ' (' .. adj .. ')' | local LUT = {ar=2, ca=2, cs=1, da=1, de=1, el=1, en=1, es=2, et=1, fi=1, fr=2, | ||
gl=2, he=2, hu=1, it=2, ja=1, la=2, mk=1, nds=1, nb=1, nl=1, no=1, pl=1, pt=2, | |||
ro=2, ru=1, scn=2, sk=1, sl=1, sr=1, sv=1, sw=1, tr=1, vec=1, vi=1, zh=1} | |||
local case = 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 | ||
end | end | ||
function p.conj(args, lang, conjtype) | 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 | if conjtype == 'comma' then | ||
return mw.text.listToText(args, comma | return mw.text.listToText(args, comma, comma) | ||
elseif conjtype == 'or' then | elseif conjtype == 'or' then | ||
return mw.text.listToText(args, comma | 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 | elseif conjtype == 'explicit or' then -- adds "or" betwen all words when the context can be confusing | ||
return mw.text.listToText(args, wordor | 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 | elseif conjtype and conjtype ~= 'and' and conjtype ~= '' then | ||
return | return mw.text.listToText(args, conjtype, conjtype) | ||
else | elseif andtable[lang] then | ||
return mw.text.listToText(args, comma | 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 | ||
end | end | ||
137行目: | 155行目: | ||
args = frame.args | args = frame.args | ||
if not args or not args[1] then | if not args or not args[1] then | ||
args = | args = frame:getParent().args | ||
end | end | ||
local lang = args.lang | local lang = args.lang | ||
if not lang or mw.text.trim(lang) == '' then | if not lang or mw.text.trim(lang) == '' then | ||
lang = frame: | lang = frame:callParserFunction( "int", "lang" ) | ||
end | end | ||
newargs = {} -- transform args metatable into a table so it can be concetenated | newargs = {} -- transform args metatable into a table so it can be concetenated | ||
157行目: | 174行目: | ||
end | end | ||
end | end | ||
return p.conj(newargs, lang, | return p.conj(newargs, lang, args.type) | ||
end | end | ||
return p | return p |