-- \/ | ___ __| |_ _| | ___ _|_ _/ |( _ ) _ __ / /__ ___ _ __ ___ _ __ | | _____ __ __| | __ _| |_ ___
| |\/| |/ _ \ / _` | | | | |/ _ (_)| || |/ _ \| '_ \ / / __/ _ \| '_ ` _ \| '_ \| |/ _ \ \/ / / _` |/ _` | __/ _ \
| | | | (_) | (_| | |_| | | __/_ | || | (_) | | | |/ / (_| (_) | | | | | | |_) | | __/> < | (_| | (_| | || __/
|_| |_|\___/ \__,_|\__,_|_|\___(_)___|_|\___/|_| |_/_/ \___\___/|_| |_| |_| .__/|_|\___/_/\_\ \__,_|\__,_|\__\___|
|_|
This code was copied from Commons please request changes there.  
Maintainers:
- Jarekt  
local function Ordinal(...)
return require('Module:Ordinal-cd')._Ordinal(...)
end
local function Roman(...)
return require('Module:Roman-cd')._Numeral(...)
end  
-- ==========================================================================
-- === Local Helper functions ==============================================
-- ==========================================================================
-- form of French "of" based on "precision", which is wikibase compatible date precision format:
-- 6=millennium, 7=century, 8=decade, 9=year, 10=month, 11=day
-- 1 2 3 4 5 mill cent deca year month day
local frOf = {'du','du','du','du','du', 'du', 'du', 'de', 'de', 'de', 'du'}  
local function decYear(state,lang,case)
--Declension of word "year" in several languages
if state.precision == 9 then
yearCase = {
fi={xxx='vuosien', gen='vuoden', ill='vuoteen', ptv='vuotta', ela='vuodesta', ine='vuonna'},
sl={insP='letoma', ins='letom', gen='leta', loc='letu'},
hsb={insP='lětami', ins='lětom', gen='lěta', loc='lěće'}
}
return yearCase[lang][case] .. ' '
else
return ''
end
end  
local function decCentury(lang,case)
--Declension of word "century" in several languages
centuryCase = {
pl={nom='wiek', gen='wieku', ins='wiekiem', loc='wieku', default = 'wiek'},
hsb={nom='lětstotk', gen='lětstotka', ins='lětstotkom', loc='lětstotku', default = 'lětstotk'}
}
return centuryCase[lang][case] or centuryCase[lang]['default']
end  
local function decMillennium(lang,case)
--Declension of word "century" in several languages
millenniumCase = {
pl={nom='tysiąclecie', gen='tysiąclecia', ins='tysiącleciem', loc='tysiącleciu', default = 'tysiąclecie'},
hsb={nom='lěttysac', gen='lěttysaca', ins='lěttysacom', loc='lěttysacu', default = 'lěttysac'}
}
return millenniumCase[lang][case] or millenniumCase[lang]['default']
end  
-- ==========================================================================
-- === Output data structure ===============================================
-- ==========================================================================
local p = {}  
--[[
Multiple formats are possible:
1) string with key words "$date1" and "$date2" which will be replaced later by the date strings
2) function which can be used to create output string
- Function INPUTS:
- date1 and date2 string with date strings. "$date1" and "$date2" can also be used which will be replaced latter
- state is a table with full description of the phrase we are trying to construct. It includes state.precision1 (and 2)
which is wikibase compatible date precision format: 6=millennium, 7=century, 8=decade, 9=year, 10=month, 11=day
3) table with following fields:
- table[1] is either string or a function
- table.case is a 2 element table with Grammatical cases used by given language to alter
month name or other adjective related to date # 1 and 2
p.Translations = {  
-- ==========================================
-- === Two date phrases =====================
-- ==========================================
['from-until'] = {
nDates = 2,
ar='من $date1 إلى $date2',
['be-tarask']={'з $date1 да $date2', case={'gen','gen'}},
bn='$date1 থেকে $date2 পর্যন্ত',
ca='$date1 fins $date2',
ckb='لە $date1 تاوەکوو $date2',
cs='$date1 až $date2',
da='fra $date1 til $date2',
de='$date1 bis $date2',
el='από $date1 έως $date2',
en='from $date1 until $date2',
['en-gb']='from $date1 until $date2',
['en-ca']='from $date1 until $date2',
eo='de $date1 al $date2',
es='de $date1 a $date2',
et='$date1 kuni $date2',
fa='از $date1 تا $date2',
fi='$date1–$date2', -- välisenä aikana
fr=function(date1, date2, state) -- could actually be better should be "d'octobre à mars 2013' not "de octore 2013 à mars 2013"
if state.precision > 10 then -- precision > month
return 'du $date1 au $date2'
else -- "DE septebmbre" / "D'octobre"
return require("Module:Linguistic").of(date1, 'fr') .. " à $date2"
end
end,
gl='de $date1 a $date2', --Template:From until used 'desde $date1 ata $date2'
he='מ- $date1 עד $date2',
hr='od $date1 do $date2',
hsb={'wot $date1 do $date2', case={'gen','gen'}},
hu='$date1 – $date2',
it='dal $date1 al $date2',
ja='$date1から$date2まで',
mk='од $date1 до $date2',
ml='$date1 മുതൽ $date2 വരെ',
nb='fra $date1 til $date2',
nds='$date1 bet $date2',
nn='fra $date1 til $date2',
nl='$date1 tot $date2',
no='fra $date1 til $date2',
pl={'od $date1 do $date2', case={'gen','gen'}},
ro='din $date1 până în $date2',
pt='de $date1 a $date2',
qu="$date1 p'unchawmanta $date2 p\'unchawkama",
ru={'с $date1 по $date2', case={'gen','gen'}},
sk={'od $date1 do $date2', case={'gen','gen'}},
sl={'od $date1 do $date2', case={'gen','gen'}},
sv='från $date1 till $date2',
uk={'з $date1 до $date2', case={'gen','gen'}},
ur='از $date1 تا $date2',
vi='từ $date1 đến $date2',
['zh-hans']='从$date1到$date2',
['zh-hant']='從$date1到$date2',
default='<span>$date1 - $date2</span>',
},  
['between']={
nDates = 2,
ar='بين $date1 و $date2',
['be-tarask']={'між $date1 і $date2', case={'ins','ins'}},
bn='$date1 এবং $date2-এর মাঝামাঝি',
ca='entre $date1 i $date2',
ckb='لەنێوان $date1 و $date2',
cs={'mezi $date1 a $date2', case={'ins','ins'}},
da='mellem $date1 og $date2',
de='zwischen $date1 und $date2',
el='μεταξύ $date1 και $date2',
en='between $date1 and $date2',
['en-gb']='between $date1 and $date2',
['en-ca']='between $date1 and $date2',
eo='inter $date1 kaj $date2',
es='entre $date1 y $date2',
et='$date1 ja $date2 vahel',
fa='بین $date1 و $date2',
fi={function(date1, date2, state) return decYear(state,'fi','xxx') .. '$date1 ja $date2 välisenä aikana' end, case={'gen','gen'}},
fr='entre $date1 et $date2',
gl='entre $date1 e $date2',
he='בין $date1 ו- $date2',
hr='između $date1 i $date2',
hsb={'mjez $date1 a $date2', case={'ins','ins'}},
hu='$date1 és $date2 között',
hi='$date1 और $date2 के बीच',
it='tra il $date1 e il $date2',
ja='$date1と$date2の間',
mk='помеѓу $date1 и $date2',
ml='$date1, $date2 എന്നിവയ്ക്കിടയ്ക്ക്',
nb='mellom $date1 og $date2',
nds='twischen $date1 un $date2',
nn='mellom $date1 og $date2',
nl='tussen $date1 en $date2',
no='mellom $date1 og $date2',
pl={'między $date1 a $date2', case={'ins','ins'}},
ro='între $date1 și $date2',
pt='entre $date1 e $date2',
qu="$date1 p'unchawpa $date2 p'unchawpapas chawpin",
ru={'между $date1 и $date2', case={'ins','ins'}},
sk={'medzi $date1 a $date2', case={'ins','ins'}},
sl={function(date1, date2, state) return 'med ' .. decYear(state,'sl','insP') .. '$date1 in $date2' end, case={'ins','ins'}},
sv='mellan $date1 och $date2',
uk={'між $date1 та $date2', case={'ins','ins'}},
ur='بین $date1 و $date2',
vec='tra el $date1 e el $date2',
vi='giữa $date1 và $date2',
['zh-hans']='在$date1到$date2之间',
['zh-hant']='在$date1到$date2之間',
default='<span>$date1 - $date2</span>',
},  
['or'] = {
nDates = 2,
ar='$date1 أو $date2',
['be-tarask']='$date1 ці $date2',
bn='$date1 অথবা $date2',
ca='$date1 o $date2',
ckb='$date1 یان $date2',
cs='$date1 nebo $date2',
da='$date1 eller $date2',
de='$date1 oder $date2',
el='$date1 ή $date2',
en='$date1 or $date2',
['en-gb']='$date1 or $date2',
['en-ca']='$date1 or $date2',
eo='$date1 aŭ $date2',
es='$date1 o $date2',
et='$date1 või $date2',
fa='$date1 یا $date2',
fi='$date1 tai $date2',
fr='$date1 ou $date2',
gl='$date1 ou $date2',
he='$date1 או $date2',
hr='$date1 ili $date2',
hsb='$date1 abo $date2',
hu='$date1 vagy $date2',
it='$date1 o $date2',
ja='$date1または$date2',
mk='$date1 или $date2',
ml='$date1 അഥവാ $date2',
nb='$date1 eller $date2',
nn='$date1 eller $date2',