Vikivojaĝo
eowikivoyage
https://eo.wikivoyage.org/wiki/Vikivoja%C4%9Do:%C4%88efpa%C4%9Do
MediaWiki 1.46.0-wmf.22
first-letter
Aŭdvidaĵo
Specialaĵo
Diskuto
Uzanto
Uzanto-Diskuto
Vikivojaĝo
Vikivojaĝo-Diskuto
Dosiero
Dosiero-Diskuto
MediaWiki
MediaWiki-Diskuto
Ŝablono
Ŝablono-Diskuto
Helpo
Helpo-Diskuto
Kategorio
Kategorio-Diskuto
TimedText
TimedText talk
Modulo
Modulo-Diskuto
Event
Event talk
Modulo:VCard
828
4800
72072
71482
2026-04-07T11:17:21Z
RolandUnger
168
Update
72072
Scribunto
text/plain
-- module variable and administration
local vc = {
moduleInterface = {
suite = 'vCard',
serial = '2026-04-06',
item = 58187507
},
-- table containing parameters fetched from Wikidata
fromWD = {},
-- Wikidata to subtype table
subtypeIds = nil,
-- complete subtype table including Wikidata subtypes
subtypes = {}
}
-- module import
-- require( 'strict' )
local mi = require( 'Module:Marker utilities/i18n' )
local mu = require( 'Module:Marker utilities' )
local vp = require( 'Module:VCard/Params' ) -- parameter lists
local vi = require( 'Module:VCard/i18n' ) -- parameter translations
local vq = mw.loadData( 'Module:VCard/Qualifiers' ) -- comment tables
local cm = require( 'Module:CountryData' )
local er -- modules will be loaded later if needed
local hi
local hr
local lg
local lp = require( 'Module:LinkPhone' )
local vs
local wu = require( 'Module:Wikidata utilities' )
local function addWdClass( key )
return mu.addWdClass( vc.fromWD[ key ] )
end
local function forceFetchFromWikidata( tab )
for key, value in pairs( tab ) do
vp.ParMap[ key ] = true
end
end
-- copying frameArgs parameters to args = vp.ParMap parameters
local function copyParameters( args, show )
local t, value
local exclude = { auto = 1, show = 1, subtype = 1, wikidata = 1 }
local copy = { subtype = 1 }
vp.ParMap.wikidata = args.wikidata
-- force getting data from Wikidata for missing parameters
show.inlineDescription = true -- description with div or span tag
if vp.ParMap.auto == true then
forceFetchFromWikidata( vp.ParWD )
forceFetchFromWikidata( vp.ParWDAdd )
end
-- copying args parameters to vp.ParMap parameters
for key, v in pairs( vi.p ) do
value = args[ key ]
if value then
value, t =
mu.removeCtrls( value, show.inline or key ~= 'description' )
if t then
show.inlineDescription = false
end
if not exclude[ key ] then
if value == '' and key ~= 'type' then
value = 'y'
end
t = mu.yesno( value )
if t then
if vp.ParMap.wikidata ~= '' then
vp.ParMap[ key ] = t == 'y'
else
vp.ParMap[ key ] = ''
end
else
vp.ParMap[ key ] = value
end
end
if copy[ key ] then
vp.ParMap[ key ] = value
end
end
end
return vp.ParMap
end
-- checking subtypes
local function checkSubtypes( args, subtypesTable )
if not mu.isSet( args.subtype ) then
return {}
end
local function aliasToSubtype( alias )
if not vc.subtypeAliases then -- alias to subtype table
vc.subtypeAliases = mu.getAliases( subtypesTable, 'alias' )
end
return vc.subtypeAliases[ alias ]
end
local function subtypeExists( subtype )
return subtypesTable[ subtype ] and subtype or aliasToSubtype( subtype )
end
local subtypes = {}
local invalidSubtypes = {}
local at, count, invalidCount, item
for subtype, v in pairs( mu.split( args.subtype ) ) do
invalidCount = false
count = ''
item = subtype
-- split item from count
at = item:find( ':', 1, true )
if at then
count = tonumber( item:sub( at + 1, #item ) ) or ''
item = mw.text.trim( item:sub( 1, at - 1 ) )
if count == '' then
invalidCount = true -- ':' without count or not a number
else
count = math.floor( count )
if count < 2 then
count = ''
end
end
end
item = subtypeExists( item ) or mu.typeExists( item )
if item then
subtypes[ item ] = count
end
if invalidCount or not item then
table.insert( invalidSubtypes, subtype )
end
end
if #invalidSubtypes > 0 then
mu.addMaintenance( 'unknownSubtype', table.concat( invalidSubtypes, mu.commaSeparator ) )
end
return subtypes
end
local function initialParametersCheck( frame, page )
local country, email, entity, param, show, t, v, web, wrongQualifier
local frameArgs = mu.checkArguments( frame:getParent().args, vi.p )
-- Using wu.getEntity instead of wu.getEntityId brings a better overall performance
frameArgs.wikidata, entity, wrongQualifier = wu.getEntity( frameArgs.wikidata or '' )
if wrongQualifier then
mu.addMaintenance( 'wrongQualifier' )
end
if mu.isSet( frameArgs.wikidata ) then
mu.addMaintenance( 'wikidata' )
v = mu.yesno( frameArgs.auto or '' )
if v then
vp.ParMap.auto = v == 'y'
else
vp.ParMap.auto = vi.options.defaultAuto
end
else
vp.ParMap.auto = false
end
-- making phone number table
t = {}
for i, key in ipairs( vp.phones ) do
mu.tableInsert( t, frameArgs[ key ] )
end
-- making web addresses table
web = {}
mu.tableInsert( web, frameArgs.url )
email = frameArgs.email or ''
email = email:gsub( ',.*$', '' ) -- first email
mu.tableInsert( web, email )
-- getting country-specific technical parameters
country = cm.getCountryData( entity, t, frameArgs.country, frameArgs.wikidata, web )
if country.fromWD then
mu.addMaintenance( 'countryFromWD' )
end
if country.unknownCountry then
mu.addMaintenance( 'unknownCountry' )
end
if country.cc ~= '' then
country.trunkPrefix = lp.getTrunkPrefix( country.cc )
end
-- for map support
country.extra = mi.map.defaultSiteType
if mu.isSet( country.iso_3166 ) then
country.extra = country.extra .. '_region:' .. country.iso_3166
-- country-specific default show
end
if mu.isSet( country.show ) then
vp.ParMap.show = vp.ParMap.show .. ',' .. country.show
end
-- handling args table
show = mu.getShow( vp.ParMap.show, frameArgs, vp.show )
-- copying frameArgs parameters to args = vp.ParMap parameters
local args = copyParameters( frameArgs, show )
-- alternate local language
if mu.isSet( args.localLang ) then
lg = lg or require( 'Module:Languages' )
args.localLang = args.localLang:lower()
if lg.lngProps[ args.localLang ] then
cm.setLanguageParams( args.localLang, page.lang, country )
else
args.localLang = ''
mu.addMaintenance( 'unknownLanguage' )
end
end
mu.checkStatus( args )
mu.checkStyles( args )
-- checking coordinates and converting DMS to decimal coordinates if necessary
mu.checkCoordinates( args )
mu.checkZoom( args )
-- remove namespace from category
mu.checkCommonsCategory( args )
mu.checkId( args )
for i, param in ipairs( mi.options.parameters ) do
if mu.isSet( args[ param ] ) then
mu.addMaintenance( 'parameterUsed', param )
end
end
args.subtypeAdd = mu.isSet( args.wikidata ) and vp.ParMap.auto
-- getting features manually entered
if mu.isSet( args.subtype ) then
vs = require( 'Module:VCard/Subtypes' )
vc.subtypes = checkSubtypes( args, vs.f )
if mu.isSet( args.wikidata ) then
-- y = fetch additional features from Wikidata
if vc.subtypes.y then
args.subtypeAdd = true
-- n = do not show subtypes fetched from Wikidata
elseif vc.subtypes.n then
args.subtypeAdd = false
end
end
end
if type( args.lastedit ) == 'string' and args.lastedit ~= ''
and not args.lastedit:match( mi.dates.yyyymmdd.p ) then
mu.addMaintenance( 'wrongDate' )
args.lastedit = ''
end
-- check Google Maps customer id
if type( args.googlemaps ) == 'string' and mu.isSet( args.googlemaps ) and
not ( mu.checkLength( args.googlemaps, 14, 20 ) and args.googlemaps:match( '^[1-9]%d+$' ) ) then
mu.addMaintenance( 'wrongGoogleCid' )
args.googlemaps = ''
end
if type( args.googlemaps ) == 'string' and mu.isSet( args.googlemaps ) then
mu.addMaintenance( 'parameterUsed', 'google-maps' )
if mu.isSet( args.wikidata ) then
mu.addMaintenance( 'wdWithGoogleCid' )
end
end
return args, entity, show, country
end
local function getQuantity( value, formatter, page )
local a, f, u, unit, unitId
if type( value ) == 'number' then
return tostring( value )
elseif value.amount == '0' then
return '0'
else
a = mu.formatNumber( value.amount )
u = ''
unitId = value.unit
unit = cm.getCurrency( unitId )
if mu.isSet( unit ) then
if unit.mul then
a = mu.formatNumber( string.format( '%.2f', -- 2 decimal places
tonumber( value.amount ) * unit.mul ) )
end
if mi.noCurrencyConversion.all or mi.noCurrencyConversion[ unit.iso ] then
unit = mu.makeSpan( cm.getCurrencyFormatter( unitId ),
'voy-currency voy-currency-' .. unit.iso:lower() )
else
er = er or require( 'Module:Exchange rate' )
unit = er.getWrapper( a, unit.iso, '', 2, cm.getCurrencyFormatter )
mu.addMaintenance( 'currencyTooltip' )
end
else
unit = vq.labels[ unitId ]
end
if unit and unit:find( '%s', 1, true ) then
a = mw.ustring.format( unit, a )
elseif unit then
u = unit
elseif mw.wikibase.isValidEntityId( unitId ) then
-- currency code
u = wu.getValue( unitId, mi.properties.iso4217 )
if u == '' then
-- unit symbol
u = wu.getValuesByLang( unitId, mi.properties.unitSymbol, 1,
page.lang )
u = u[ 1 ] or ''
end
if u ~= '' then
mu.addMaintenance( 'unitFromWD' )
else
u = unitId
mu.addMaintenance( 'unknownUnit' )
end
end
if a ~= '' and u ~= '' and formatter ~= '' and
formatter:find( '$1', 1, true ) and formatter:find( '$2', 1, true ) then
a = mw.ustring.gsub( f, '($1)', a )
a = mw.ustring.gsub( a, '($2)', u )
else
a = ( u ~= '' ) and a .. ' ' .. u or a
end
end
return a
end
local function getHourModules()
if not hr then
hi = require( 'Module:Hours/i18n' )
hr = require( 'Module:Hours' )
end
end
local function getLabel( id )
local label = id
local tables = { vq.labels }
if hi then
table.insert( tables, hi.dateIds )
end
if type( id ) == 'string' and id:match( '^Q%d+$' ) then
for i, tab in ipairs( tables ) do
if type( tab[ id ] ) == 'string' then
label = tab[ id ]
break
end
end
if label == '' then
return label
elseif label == id then
label = mu.getTypeLabel( id )
end
if label == '' or label == id then
label = wu.getLabel( id ) or ''
if label == '' then
mu.addMaintenance( 'unknownLabel' )
else
mu.addMaintenance( 'labelFromWD' )
end
end
end
return label
end
local function removeStringDuplicates( ar )
local hash = {}
local result = {}
local val
for i = 1, #ar do
val = ar[ i ]
if not hash[ val ] then
table.insert( result, val )
hash[ val ] = 1
end
end
return result
end
-- getting comments for contacts and prizes from Wikidata using tables
local function getComments( statement, properties, args, page )
local comments = {}
local isMobilephone = false
local minAge, maxAge
for i, property in ipairs( properties ) do
local pType = property .. '-type'
if statement[ property ] then
if property == mi.properties.minimumAge then
minAge = getQuantity( statement[ property ][ 1 ], '', page )
elseif property == mi.properties.maximumAge then
maxAge = getQuantity( statement[ property ][ 1 ], '', page )
end
for j, id in ipairs( statement[ property ] ) do
if statement[ pType ] == 'monolingualtext' then
id = id.text
elseif statement[ pType ] == 'time' then
-- getting last date in case of price/fees
id = wu.getDateFromTime( id )
if not mu.isSet( args.asOf ) or args.asOf < id then
args.asOf = id
end
id = ''
elseif type( id ) == 'table' then
id = ''
end
if id == mi.qualifiers.mobilePhone then
isMobilephone = true
else
mu.tableInsert( comments, getLabel( id ) )
end
end
end
end
comments = removeStringDuplicates( comments )
if minAge and maxAge then
mu.tableInsert( comments, mw.ustring.format( mi.texts.fromTo,
minAge:gsub( '(%d+).*', '%1' ), maxAge ) )
elseif minAge then
mu.tableInsert( comments, mw.ustring.format( mi.texts.from, minAge ) )
elseif maxAge then
mu.tableInsert( comments, mw.ustring.format( mi.texts.to, maxAge ) )
end
if #comments > 0 then
return table.concat( comments, mu.commaSeparator ), isMobilephone
else
return '', isMobilephone
end
end
local function hasValue( tab, val )
for i = 1, #tab do
if tab[ i ] == val then
return true
end
end
return false
end
local function getLngProperty( lng, p )
if not mu.isSet( lng ) then
return ''
end
lg = lg or require( 'Module:Languages' )
local item = lg.lngProps[ lng ]
if not item then
local hyphen = lng:find( '-', 1, true )
if hyphen and hyphen > 1 then
item = lg.lngProps[ lng:sub( 1, hyphen - 1 ) ]
end
end
if item then
item = item[ p ]
end
return item or ( p == 'c' and 0 or '' )
end
local function removeTableDuplicates( ar )
local hash = {}
local result = {}
local hashVal
for i, tab in ipairs( ar ) do
hashVal = tab.value .. '#' .. tab.comment
if not hash[ hashVal ] then
table.insert( result, tab )
hash[ hashVal ] = 1
end
end
return result
end
local function mergeComments( ar )
if #ar > 1 then
for i = #ar, 2, -1 do
for j = 1, i - 1, 1 do
if ar[ i ].value == ar[ j ].value and ar[ i ].comment ~= ''
and ar[ j ].comment ~= '' then
ar[ j ].comment = ar[ j ].comment .. '; ' .. ar[ i ].comment
table.remove( ar, i )
break
end
end
end
end
end
local function convertTableWithComment( ar )
for i = 1, #ar, 1 do
if ar[ i ].comment == '' then
ar[ i ] = ar[ i ].value
else
ar[ i ] = ar[ i ].value .. mu.parentheses( ar[ i ].comment )
end
end
end
--[[
properties are defined in Module:vCard/Params
p property or set of properties
f formatter string
c maximum count of results, default = 1
m concat mode (if c > 1), default concat with ', '
v value type,
empty: string value (i.e. default type),
id: string value of an id like Q1234567
idl: string value of the label of an id like Q1234567
il: language-dependent string value
iq: string value with qualifier ids
au: quantity consisting of amount and unit
pau: quantity consisting of amount (for P8733)
vq: string or table value with qualifiers ids and references
l = lang: language dependent
wiki / local: monolingual text by wiki or local language
le = true: use date for lastedit parameter
--]]
-- function returns an array in any case
local function getWikidataValues( args, propDef, entity, page, country )
local r = ''
local ar = {}
local a, i, isMobilephone, item, id, langs, q, t, u, w
-- setting defaults
propDef.v = propDef.v or ''
propDef.f = propDef.f or ''
propDef.c = propDef.c or 1
-- getting value arrays
if propDef.l == 'wiki' then
ar = wu.getValuesByLang( entity, propDef.p, propDef.c, page.lang )
elseif propDef.l == 'local' then
ar = wu.getValuesByLang( entity, propDef.p, propDef.c, country.lang )
elseif propDef.l == 'lang' and propDef.c == 1 then
id = getLngProperty( country.lang, 'q' )
if id == '' then
country.unknownLanguage = true
else
-- using language of work or name ( page.lang, mi.langs, country.lang )
a = wu.getValuesByQualifier( entity, propDef.p, mi.properties.languageOfName, id )
if next( a ) then
langs = mu.getLangTable( page.lang, country.lang )
for i, lang in ipairs( langs ) do
item = a[ getLngProperty( lang, 'q' ) ]
if item then
break
end
end
ar = { item or a[ next( a, nil ) ] } -- fallback: first item
end
end
elseif propDef.v == 'iq' or propDef.v == 'iqp' then
q = propDef.v == 'iq' and mi.propTable.quantity or
mi.propTable.policyComments
ar = wu.getValuesWithQualifiers( entity, propDef.p, propDef.q, q,
{ mi.properties.retrieved }, propDef.c )
if propDef.le then
args.lastedit = wu.getLastedit( args.lastedit, ar )
end
elseif propDef.v == 'au' or propDef.v == 'vq' then
q = propDef.v == 'au' and mi.propTable.feeComments or
mi.propTable.contactComments
ar = wu.getValuesWithQualifiers( entity, propDef.p, nil, q,
{ mi.properties.retrieved }, propDef.c )
-- maybe a change of nil to a properties table is useful
if propDef.le then
args.lastedit = wu.getLastedit( args.lastedit, ar )
end
else
ar = wu.getValues( entity, propDef.p, propDef.c )
end
if #ar == 0 and propDef.p ~= mi.properties.instanceOf then
return ar
end
for i = #ar, 1, -1 do
-- amount with unit (for fees)
if propDef.v == 'au' then
a = getQuantity( ar[ i ].value, propDef.f, page )
if a == '0' then
a = vq.labels.gratis
end
u, isMobilephone = getComments( ar[ i ], mi.propTable.feeComments, args, page )
ar[ i ] = { value = a, comment = u }
-- for number of rooms P8733
elseif propDef.v == 'pau' then
if ar[ i ].unit == '1' then
a = tonumber( ar[ i ].amount ) or 0
else
a = 0
end
ar[ i ] = {}
ar[ i ][ mi.properties.quantity ] = { a }
ar[ i ][ mi.properties.quantity .. '-type' ] = 'quantity'
ar[ i ].value = mi.qualifiers.roomNumber
ar[ i ]['value-type'] = 'wikibase-entityid'
-- qualifier ids (for subtypes)
elseif propDef.v == 'iq' or propDef.v == 'iqp' then
if ar[ i ][ 'value-type' ] ~= 'wikibase-entityid' then
table.remove( ar, i )
end
if propDef.v == 'iqp' then
ar[ i ].policyComment, isMobilephone =
getComments( ar[ i ], mi.propTable.policyComments, args, page )
end
-- strings with qualifiers (for contacts)
elseif propDef.v == 'vq' then
if ar[ i ][ 'value-type' ] ~= 'string' then
table.remove( ar, i )
else
u, isMobilephone =
getComments( ar[ i ], mi.propTable.contactComments, args, page )
if vi.options.useMobile and propDef.t then
if ( isMobilephone and propDef.t == 'mobile' ) or
( not isMobilephone and propDef.t == 'landline' ) then
ar[ i ] = { value = ar[ i ].value, comment = u }
else
table.remove( ar, i )
end
else
ar[ i ] = { value = ar[ i ].value, comment = u }
end
end
-- value, monolingual text, identifier
else
if propDef.v == 'id' then
ar[ i ] = ar[ i ].id
elseif propDef.v == 'idl' then
getHourModules()
ar[ i ] = hr.formatTime( getLabel( ar[ i ].id ) )
end
if ar[ i ] ~= '' and propDef.f ~= '' then
ar[ i ] = mw.ustring.format( propDef.f, ar[ i ] )
end
end
if propDef.v == 'au' or propDef.v == 'vq' then
if ar[ i ] and ar[ i ].value == '' then
table.remove( ar, i )
end
else
if ar[ i ] == '' then
table.remove( ar, i )
end
end
end
-- cleanup
if propDef.v == 'au' or propDef.v == 'vq' then
ar = removeTableDuplicates( ar )
mergeComments( ar )
convertTableWithComment( ar )
else
ar = removeStringDuplicates( ar )
end
return ar
end
local function getWikidataItem( args, parWDitem, entity, page, country )
local arr = {}
local function singleProperty( propDef )
if #arr == 0 then
arr = getWikidataValues( args, propDef, entity, page, country )
else
for i, value in ipairs( getWikidataValues( args, propDef, entity, page, country ) ) do
table.insert( arr, value ) -- copy to arr
end
end
end
local p = parWDitem
if not p then
return ''
end
p.c = p.c or 1 -- count
local tp = type( p.p )
if tp == 'string' then
singleProperty( p )
elseif tp == 'table' then
for i, sngl in ipairs( p.p ) do
if type( sngl ) == 'table' then
singleProperty( sngl )
if p.c == 1 and #arr > 0 then
break
end
end
end
end
if #arr > p.c then
for i = #arr, p.c + 1, -1 do -- delete supernumerary values
table.remove( arr, i )
end
end
if p.m == 'no' then
return arr
else
return table.concat( arr, p.m or mu.commaSeparator )
end
end
local function getAddressesFromWikidata( args, page, country, entity )
local addresses = {}
local t, u, w, weight
-- getting addresses from Wikidata but only if necessary
if args.address == true or type( args.addressLocal ) == 'boolean' then
-- P6375: address
addresses = wu.getMonolingualValues( entity, mi.properties.streetAddress )
if next( addresses ) then -- sometimes addresses contain <br> tag(s)
for key, value in pairs( addresses ) do
addresses[ key ] = value:gsub( '</*br%s*/*>', mi.texts.space )
end
else
return
end
else
return
end
if args.address == true then
args.address = addresses[ page.lang ]
-- select address if the same writing system is used
if not args.address then
weight = -1
u = getLngProperty( page.lang, 'w' ) -- writing entity id
for key, value in pairs( addresses ) do
-- same writing entity id as page.lang
w = getLngProperty( key, 'w' )
if w == '' then
country.unknownPropertyLanguage = true
else
if key and w == u then -- same writing entity id
w = getLngProperty( key, 'c' ) -- getting language weight
if w > weight then -- compare language weight
args.address = value
args.addressLang = key
weight = w
end
end
end
end
end
if not args.address then
for i, lng in ipairs( mi.langs ) do
if addresses[ lng ] then
args.address = addresses[ lng ]
args.addressLang = lng
break
end
end
end
if not args.address then
args.address = ''
args.addressLang = ''
end
vc.fromWD.address = args.address ~= ''
end
-- removing county name from the end of address
-- same with county name in county language and English
if type( args.address ) == 'string' then
args.address = mw.ustring.gsub( args.address,
'[.,;]*%s*' .. country.country .. '$', '' )
end
t = true
for i, lng in ipairs( mi.langs ) do
if country.lang == lng then
t = false
end
end
-- keeping local address in any case for html data
args.addAddressLocal = addresses[ country.lang ] or ''
if t and args.addressLocal == true
and country.lang ~= page.lang then
if country.lang ~= '' then
args.addressLocal = addresses[ country.lang ] or ''
else
-- unknown language, maybe missing in Module:Languages
args.addressLocal = addresses.unknown or ''
end
vc.fromWD.addressLocal = args.addressLocal ~= ''
end
end
local function getDataFromWikidata( args, page, country, entity )
if args.wikidata == '' then
return
end
mu.getTypeFromWikidata( args, entity )
-- prevent local data if wiki language == country language
if page.lang == country.lang then
for i, value in ipairs( vp.localData ) do
if type( args[ value ] ) == 'boolean' then
args[ value ] = ''
end
end
end
mu.getNamesFromWikidata( args, vc.fromWD, page, country, entity )
getAddressesFromWikidata( args, page, country, entity )
if args.hours == true then
local lastEdit
getHourModules()
if not mu.typeIds then
local dummy = mu.idToType( 'Q1' ) -- dummy call to create mu.typeIds
end
args.hours, lastEdit = hr.getHoursFromWikidata( entity, page.lang,
mi.langs[ 1 ] or '', mi.maintenance.properties, nil, args.lastedit,
vq.labels, { typeTable = mu.types, idTable = mu.typeIds } )
vc.fromWD.hours = args.hours ~= ''
if vi.options.lasteditHours then
args.lastedit = lastEdit
end
end
for key, value in pairs( vp.ParWD ) do
if args[ key ] == true then
args[ key ] =
getWikidataItem( args, vp.ParWD[ key ], entity, page, country )
vc.fromWD[ key ] = args[ key ] ~= ''
end
end
mu.getArticleLink( args, entity, page )
mu.getCommonsCategory( args, entity )
mu.getCoordinatesFromWikidata( args, vc.fromWD, entity )
end
local function finalParametersCheck( args, show, page, country, defaultType, entity )
-- remove boolean values from parameters to have only strings
for key, value in pairs( args ) do
if type( args[ key ] ) == 'boolean' then
args[ key ] = ''
end
end
-- create givenName, displayName tables
mu.prepareNames( args )
-- analysing addressLocal vs address
if args.addressLang and args.addressLang == country.lang then
args.addressLocal = ''
args.addAddressLocal = ''
end
if args.addressLocal ~= '' and args.address == '' then
args.address =
mu.languageSpan( args.addressLocal, mi.texts.hintAddress, page, country )
args.addressLocal = ''
args.addAddressLocal = ''
vc.fromWD.address = vc.fromWD.addressLocal
end
show.noCoord = args.lat == '' or args.long == ''
if show.noCoord then
show.coord = nil
show.poi = nil
mu.addMaintenance( 'missingCoordVc' )
else
mu.prepareCoordinates( args )
end
-- getting Marker type, group, and color
if not mu.isSet( args.type ) and mu.isSet( defaultType ) then
args.type = defaultType
end
mu.checkTypeAndGroup( args )
-- image check
if not vc.fromWD.image or mi.options.WDmediaCheck then
mu.checkImage( args, entity )
end
mu.checkUrl( args )
args.commonscat = args.commonscat:gsub( ' ', '_' )
-- add final period if not yet exists
if mu.isSet( args.description ) then
if mw.ustring.match( args.description, '[%w_€$]$' ) then
args.description = args.description .. mi.texts.period
end
if mw.ustring.len( args.description ) > mi.options.contentLimit and
mi.options.groupsWithLimit[ args.group ] then
args.description = mw.ustring.sub( args.description, 1, mi.options.contentLimit ) .. '…'
mu.addMaintenance( 'contentTooLong' )
end
end
end
local function formatText( args, results, key, class )
if not mu.isSet( args[ key ] ) then
return
end
local r
local textKey = key
local period = mi.texts.period
if key == 'hours' then
args[ key ], r = mw.ustring.gsub( args[ key ],
mi.texts.closedPattern, '' )
textKey = ( r > 0 ) and 'closed' or key
end
r = mw.ustring.format( mi.texts[ textKey ], args[ key ] )
r = mw.ustring.gsub( r, '^%a', mw.ustring.upper )
-- add period if not yet exists
r = r .. ( mw.ustring.sub( r, -1 ) == period and '' or period )
table.insert( results, mu.makeSpan( r, class .. addWdClass( key ) ) )
end
local function formatPhone( args, key, country )
if not mu.isSet( args[ key ] ) then
return ''
end
local class
local pArgs = {
phone = args[ key ],
cc = country.cc,
isFax = false,
isTollfree = false,
format = false
}
if vc.fromWD[ key ] then
pArgs.format = true
pArgs.size = country.phoneDigits or 2
end
if key == 'fax' then
class = 'voy-listing-fax p-tel-fax fax' .. addWdClass( key )
pArgs.isFax = true
else
class = 'p-tel tel' .. addWdClass( key )
if key == 'tollfree' then
class = 'voy-listing-tollfree ' .. class
pArgs.isTollfree = true
elseif key == 'mobile' then
class = 'voy-listing-mobile ' .. class
else
class = 'voy-listing-phone ' .. class
end
end
return mw.ustring.format( mi.texts[ key ],
mu.makeSpan( lp.linkPhoneNumbers( pArgs ), class ) )
end
local function formatDate( aDate, aFormat )
return mw.getContentLanguage():formatDate( aFormat, aDate, true )
end
local function removePeriods( s )
local period = mi.texts.period
local _period = '%' .. period
-- closing (span) tags between full stops
return s:gsub( _period .. '+(</[%l<>/]+>)' .. _period .. '+', '%1' .. period )
:gsub( _period .. _period .. '+', period )
end
local function makeMarkerAndName( args, show, page, country, frame )
local result = {}
-- adding status icons
mu.tableInsert( result, mu.makeStatusIcons( args ) )
-- adding POI marker
if show.poi or mu.isSet( args.copyMarker ) then
table.insert( result, mu.makeMarkerSymbol( args, show, frame ) )
end
mu.makeName( result, args, show, page, country, addWdClass( 'name' ),
addWdClass( 'nameLocal' ) )
if #result > 0 then
result = { table.concat( result, mi.texts.space ) }
end
if args.before ~= '' then
table.insert( result, 1, mu.makeSpan( args.before, 'voy-listing-before' ) )
end
return table.concat( result, mi.texts.space )
end
local function makeEvent( args, page )
local isEvent = false
local s = {}
local count = 0 -- counts from-to statements
local startMonth -- month of start date
local today = page.langObj:formatDate( 'Y-m-d', 'now', true )
local todayYear = today:sub( 1, 4 ) -- yyyy
local todayMonth = today:sub( 6, 7 ) -- mm
local lastDate = ''
local lastYear = ''
local useYMD -- both dates are yyyy-mm-dd
local function makePeriod( beginP, endP )
if beginP == endP then
endP = ''
end
if mu.isSet( beginP ) and mu.isSet( endP ) then
count = count + 1
return mw.ustring.format( mi.texts.fromTo2, beginP, endP )
elseif mu.isSet( beginP ) then
return beginP
else
return endP
end
end
local function analyseDate( d, m, y )
local success, c, t
if useYMD then
success, t = pcall( formatDate, d, mi.dates.yyyymmdd.f )
success, c = pcall( formatDate, d, 'Y-m-d' )
if success then
lastDate = c > lastDate and c or lastDate
d = t
end
return d, nil
end
if d:match( mi.dates.yyyymmdd.p ) then
y = d:sub( 1, 4 )
d = d:sub( 6 )
end
if mu.isSet( y ) then
if y:match( mi.dates.yy.p ) then
y = ( '2000' ):sub( -#y ) .. y
elseif not y:match( mi.dates.yyyy.p ) then
y = nil
end
lastYear = y > lastYear and y or lastYear
end
if mu.isSet( d ) and mu.isSet( m ) and d:match( mi.dates.dd.p ) and
not m:match( mi.dates.mm.p ) then
-- try to convert month to number string
success, t = pcall( formatDate, m, 'm' )
if success then
m = t
else
for i = 1, 12, 1 do
if m == mi.months[ i ] or mw.ustring.match( m, mi.monthAbbr[ i ] ) then
m = '' .. i
break
end
end
end
end
if mu.isSet( d ) and mu.isSet( m ) and d:match( mi.dates.dd.p ) and
m:match( mi.dates.mm.p ) then
d = m:gsub( '%.+$', '' ) .. '-' .. d:gsub( '%.+$', '' )
m = nil
elseif mu.isSet( d ) and not mu.isSet( m ) and d:match( mi.dates.dd.p ) then
d = ( startMonth or todayMonth ) .. '-' .. d:gsub( '%.+$', '' )
end
if mu.isSet( d ) then
if d:match( mi.dates.mmdd.p ) then
startMonth = d:gsub( '%-%d+', '' )
m = nil
c = ( y or todayYear ) .. '-' .. d
success, t = pcall( formatDate, c, mi.dates.mmdd.f )
if success then
d = t
end
elseif d:match( mi.dates.dd.p ) and not mu.isSet( m ) and startMonth then
c = ( y or todayYear ) .. '-' .. startMonth .. '-' .. d
success, t = pcall( formatDate, c, mi.dates.mmdd.f )
if success then
d = t
end
end
end
if mu.isSet( m ) then
d = ( mu.isSet( d ) and ( d .. mi.texts.space ) or '' ) .. m
end
return d, y
end
if not mu.groupWithEvents( args.group ) then
return ''
end
-- check if vCard is an event
for i, param in ipairs( vp.checkEvent ) do
if mu.isSet( args[ param ] ) then
isEvent = true
break
end
end
if not isEvent then
return ''
end
if mu.isSet( args.frequency ) then
table.insert( s, mu.makeSpan( args.frequency, 'voy-listing-frequency' ) )
else
if args.date:match( mi.dates.yyyymmdd.p ) and
args.endDate:match( mi.dates.yyyymmdd.p ) then
useYMD = true
if args.date > args.endDate then
args.date, args.endDate = args.endDate, args.date
end
end
args.date, args.year
= analyseDate( args.date, args.month, args.year )
args.endDate, args.endYear
= analyseDate( args.endDate, args.endMonth, args.endYear )
local d = {}
mu.tableInsert( d, makePeriod( args.date, args.endDate ) )
mu.tableInsert( d, makePeriod( args.year, args.endYear ) )
mu.tableInsert( s, mu.makeSpan( table.concat( d, count > 1 and
mu.commaSeparator or mi.texts.space ), 'voy-listing-date' ) )
if ( lastYear ~= '' and lastYear < todayYear ) or
( lastDate ~= '' and lastDate < today ) then
mu.addMaintenance( 'outdated' )
end
end
if mu.isSet( args.location ) then
local locations = mu.textSplit( args.location, ',' )
for i, location in ipairs( locations ) do
if location ~= page.subpageText and location ~= page.text
and mw.title.new( location, '' ).exists then
location = mu.makeSpan( '[[' .. location .. ']]', 'voy-listing-location' )
end
table.insert( s, location )
end
end
s = table.concat( s, mu.commaSeparator )
return ( s ~= '' and ': ' or '' ) .. s
end
local function makeAddressAndDirections( args, page, country )
local r = ''
local p, t
if mu.isSet( args.address ) then
p = {}
if mu.isSet( args.addressLang ) then
p.lang = args.addressLang
t = mw.language.fetchLanguageName( args.addressLang, page.lang )
if mu.isSet( t ) then
p.title = mw.ustring.format( mi.texts.hintAddress2, t )
else
country.unknownPropertyLanguage = true
end
end
r = mu.commaSeparator .. mu.makeSpan( args.address,
'voy-listing-address p-adr adr' .. addWdClass( 'address' ), true, p )
end
if mi.options.showLocalData and mu.isSet( args.addressLocal ) then
r = r .. mu.comma .. mu.languageSpan( args.addressLocal, mi.texts.hintAddress,
page, country, 'voy-listing-address-local' .. addWdClass( 'addressLocal' ) )
end
t = {}
if mu.isSet( args.directions ) then
table.insert( t, mu.makeSpan( args.directions,
'voy-listing-directions' .. addWdClass( 'directions' ) ) )
end
if mi.options.showLocalData and mu.isSet( args.directionsLocal ) then
table.insert( t, mu.languageSpan( args.directionsLocal,
mi.texts.hintDirections, page, country,
'voy-listing-directions-local' .. addWdClass( 'directionsLocal' ) ) )
end
if #t == 0 then
return r
end
return r .. mi.texts.space .. mu.makeSpan( mu.parentheses( table.concat( t, mu.comma ), true ),
'voy-listing-add-address' )
end
local function makeContacts( args, country )
local t = {}
local s = ''
mu.tableInsert( t, formatPhone( args, 'phone', country ) )
mu.tableInsert( t, formatPhone( args, 'tollfree', country ) )
mu.tableInsert( t, formatPhone( args, 'mobile', country ) )
mu.tableInsert( t, formatPhone( args, 'fax', country ) )
if args.email ~= '' then
local lm = require( 'Module:LinkMail' )
s = mu.makeSpan( lm.linkMailSet( { email = args.email, ignoreUnicode = 1 } ),
'voy-listing-email u-email email' .. addWdClass( 'email' ) )
mu.tableInsert( t, mw.ustring.format( mi.texts.email, s ) )
end
s = table.concat( t, mu.commaSeparator )
if s ~= '' then
-- mi.texts.periodSeparator = '. '
s = mi.texts.periodSeparator .. mw.ustring.gsub( s, '^%a', mw.ustring.upper )
end
return s
end
-- making subtypes string
local function makeFeatures( args, tab, show )
vs = vs or require( 'Module:VCard/Subtypes' )
local function getSubtypeParams( subtype )
local r = vs.f[ subtype ] or mu.getTypeParams( subtype )
if not r.n then
r.n = r.label or subtype
end
r.g = r.g or vs.fromTypesGroupNumber
return r
end
vc.fromWD.subtypeAdd = type( args.subtypeAdd ) == 'table' and #args.subtypeAdd > 0
-- merging subtypeAdd (from Wikidata) to manually entered subtypes
local unknowWDfeatures = false
local count, label, p, t
if vc.fromWD.subtypeAdd then
-- making translation table from Wikidata ids to feature types
if not vc.subtypeIds then
vc.subtypeIds = mu.getAliases( vs.f, 'wd' )
end
-- adding type if Wikidata id (wd.value) is known
-- indexed array prevents multiple identical types
for i, wd in ipairs( args.subtypeAdd ) do
t = vc.subtypeIds[ wd.value ] or mu.idToType( wd.value )
if not t then
-- maybe instance or subclass of wd.value are known
local p31ids = wu.getIds( wd.value, mi.properties.instanceOf )
local p279ids = wu.getIds( wd.value, mi.properties.subclassOf )
-- merging both arrays
for i = 1, #p279ids, 1 do
table.insert( p31ids, p279ids[ i ] )
end
for i = 1, #p31ids, 1 do
t = vc.subtypeIds[ p31ids[ i ] ] or mu.idToType( p31ids[ i ] )
if t then
break
end
end
end
-- subtype from WD is not known
if not t and not vs.exclude[ wd.value ] then
unknowWDfeatures = true
-- try to add a new subtype Q... to vs.f subtypes table
label = wu.getLabel( wd.value )
if label then
vs.f[ wd.value ] = {
n = label,
wd = wd.value,
g = vs.fromWDGroupNumber
}
t = wd.value
end
end
-- add known subtype
if t then
vc.subtypes[ t ] = {
c = ( wd[ mi.properties.quantity ]
and wd[ mi.properties.quantity ][ 1 ] )
or ( wd[ mi.properties.capacity ] and
wd[ mi.properties.capacity ][ 1 ] ) or '',
p = wd.policyComment
}
end
end
end
if unknowWDfeatures then
mu.addMaintenance( 'unknowWDfeatures' )
end
if next( vc.subtypes ) == nil and #args.subtypeTable == 0 then
return
end
-- replace selected subtypes
for subtype, count in pairs( vc.subtypes ) do
if vs.convert[ subtype ] then
if type( count ) == 'table' then
p = count.p
count = count.c
end
t = vs.convert[ subtype ][ count ] or vs.convert[ subtype ][ 1 ]
vc.subtypes[ t ] = { p = p }
vc.subtypes[ subtype ] = nil
end
end
-- make subtypes table sortable
local s = {};
for subtype, count in pairs( vc.subtypes ) do
if type( count ) == 'table' then
table.insert( s, { t = subtype, c = count.c, p = count.p } )
else
table.insert( s, { t = subtype, c = count } )
end
end
-- add subtypes from types table
if args.subtypeTable then
for i, subtype in ipairs( args.subtypeTable ) do
table.insert( s, { t = subtype, c = 1 } )
end
end
-- sorting subtypes
-- by subtype group and then alphabetically by name
table.sort( s,
function( a, b )
local at = getSubtypeParams( a.t )
local bt = getSubtypeParams( b.t )
local na = mu.convertForSort( at.n )
local nb = mu.convertForSort( bt.n )
return ( at.g < bt.g ) or ( at.g == bt.g and na < nb )
end
)
-- make text and data output
local data = {} -- for data-subtype attribute in wrapper tag
if #s > 0 then
local r = {};
local subtype, f, u, u_n, v
for i = 1, #s do
subtype = s[ i ]
-- for data-subtype="..." in wrapper tag
u = subtype.t .. ',' .. tostring( i )
if type( subtype.c ) == 'number' and subtype.c > 1 then
u = u .. ',' .. subtype.c
end
table.insert( data, u )
u = getSubtypeParams( subtype.t )
if u.g >= vs.firstGroup then
u_n = u.n
if not mu.isSet( u_n ) then
u_n = subtype.t
end
u_n = u_n:gsub( '[,;/].*$', '' )
count = ( type( subtype.c ) == 'number' ) and subtype.c or 1
if count > 1 and u_n:find( '%[[^%[%]]*%]' ) then
v = mw.ustring.format( mi.texts.subtypeWithCount, subtype.c,
u_n:gsub( '%[([^%[%]]*)|([^%[%]]*)%]', '%1' )
:gsub( '%[([^%[%]]*)%]', '%1' ) )
else
v = u_n:gsub( '%[([^%[%]]*)|([^%[%]]*)%]', '%2' )
:gsub( '%[([^%[%]]*)%]', '' )
end
if mu.isSet( u.t ) then -- string tooltip
v = mw.ustring.format( mi.texts.subtypeSpan, u.t, v )
elseif mu.isSet( u.f ) then -- icons
f = mw.ustring.format( mi.texts.subtypeFile, u.f, v )
if u.c then
f = mw.ustring.rep( f, u.c )
end
v = mw.ustring.format( mi.texts.subtypeAbbr, v, f )
end
-- adding policy comment
if subtype.p and subtype.p ~= '' then
v = v .. mu.parentheses( subtype.p )
end
end
table.insert( r, v )
end
if #r > 0 then
r = #r == 1 and mw.ustring.format( mi.texts.subtype, r[ 1 ] )
or mw.ustring.format( mi.texts.subtypes, table.concat( r, mu.commaSeparator ) )
if r ~= '' then
table.insert( tab, mu.makeSpan( r,
'voy-listing-subtype' .. addWdClass( 'subtypeAdd' ) ) )
end
end
end
-- subtype contains now the value for wrapper tag
args.subtype = table.concat( data, ';' )
end
local function makePayment( args, results )
if not mu.isSet( args.payment ) then
return
end
local t
local class = 'voy-listing-payment p-note note'
if type( args.payment ) == 'table' then
local vr = mw.loadData( 'Module:VCard/Cards')
for i = #args.payment, 1, -1 do -- remove unknown items
t = args.payment[ i ]
if vr.cards[ t ] then
args.payment[ i ] = vr.cards[ t ]
else
table.remove( args.payment, i )
end
end
class = class .. mu.addWdClass( #args.payment > 0 )
args.payment = table.concat( args.payment, mu.commaSeparator )
else
mu.addMaintenance( 'paymentUsed' )
end
formatText( args, results, 'payment', class )
end
local function wrapDescription( args, tab, isInline, addText )
if args.description ~= '' then
table.insert( tab, tostring( mw.html.create( isInline and 'span' or 'div' )
:addClass( 'voy-listing-content p-note note' )
:wikitext( args.description .. ( addText or '' ) ) )
)
end
end
local function makeMetadata( args, page )
local outdated = false
local s, success, u
local t = args.lastedit
if t ~='' then
success, t = pcall( formatDate, t, mi.dates.lastedit.f )
if not success then
mu.addMaintenance( 'wrongDate' )
t = ''
else
success, s = pcall( formatDate, args.lastedit, 'U' ) -- UNIX seconds
success, u = pcall( formatDate, mi.texts.expirationPeriod, 'U' )
if s < u then
t = t .. mi.texts.space .. mi.texts.maybeOutdated
outdated = true
end
end
end
local tag = mw.html.create( 'span' )
:attr( 'class', 'voy-listing-metadata' )
-- add node to save the parent tag
:node( mw.html.create( 'span' )
:addClass( 'voy-listing-metadata-item voy-listing-lastedit' )
:addClass( outdated and 'voy-listing-outdated' or nil )
:addClass( t == '' and 'voy-listing-item-dummy' or nil )
:wikitext( mw.ustring.format( mi.texts.lastedit,
t == '' and mi.texts.lasteditNone or t ) )
)
if mu.isSet( args.sectionFrom ) then
local from = args.sectionFrom:gsub( '_', ' ' )
if from ~= page.subpageText and from ~= page.text then
if mu.isSet( args.wikidata ) then
from = mw.ustring.format( '%s#' .. mi.texts.anchor, from, args.wikidata )
end
tag:node( mw.html.create( 'span' )
:addClass( 'voy-listing-metadata-item voy-listing-toSourcePage' )
:wikitext( mw.ustring.format( '[[%s|%s]]', from, mi.texts.editInSource ) )
)
end
end
return tostring( tag )
end
-- making description, coordinates, and meta data
local function makeDescription( args, show, page, country, entity )
local results = {}
-- inline description
if show.inlineDescription then
wrapDescription( args, results, true )
end
-- adding features
makeFeatures( args, results, show )
-- practicalities
formatText( args, results, 'hours', 'voy-listing-hours p-note note' )
formatText( args, results, 'checkin', 'voy-listing-checkin' )
formatText( args, results, 'checkout', 'voy-listing-checkout' )
if mu.isSet( args.asOf ) and mu.isSet( args.price ) then
local success
success, args.asOf = pcall( formatDate, args.asOf, mi.dates.asOf.f )
args.price = args.price .. mw.ustring.format( mi.texts.asOf, args.asOf )
end
formatText( args, results, 'price', 'voy-listing-price p-note note' )
makePayment( args, results )
-- adding Unesco symbol
if args.unesco ~= '' and vi.options.showUnesco then
local uLink, uTitle = require( 'Module:VCard/Unesco' ).getUnescoInfo( country )
table.insert( results, mu.addLinkIcon( 'voy-listing-unesco', uLink,
uTitle, 'unesco' ) )
end
local noContent = #results == 0
-- adding DMS coordinates
if show.coord then
table.insert( results, mu.dmsCoordinates( args, page, country, vc.fromWD.lat ) )
end
if mi.options.showSisters == 'atEnd' then
table.insert( results, mu.makeIcons( args, page, country, entity, show, vc.fromWD ) )
end
local description
local space = mi.texts.space
-- adding description in block mode
if args.description ~= '' and not show.inlineDescription then
-- last edit will be inserted at the end of the div tag
wrapDescription( args, results, false, makeMetadata( args, page ) )
noContent = false
description = table.concat( results, space )
if description ~= '' then
description = space .. description
end
-- adding description in inline mode
else
description = table.concat( results, space )
if description ~= '' then
description = space .. description
end
end
return removePeriods( description ), noContent
end
-- vCard main function
function vc.vCard( frame )
mu.initMaintenance()
local page = mu.getPageData()
-- getting location (vCard/listing) entity, show options and country data
local args, vcEntity, show, country = initialParametersCheck( frame, page )
-- associated Wikivoyage page of the location in current Wikivoyage branch
-- possibly modified by mu.getArticleLink()
args.wikiPage = ''
-- getting data from Wikidata
getDataFromWikidata( args, page, country, vcEntity )
-- final check
local defaultType = frame.args.type
finalParametersCheck( args, show, page, country, defaultType, vcEntity )
-- making output
-- leading part for marker mode: only location names and comment
-- saving address
args.addressOrig = args.address
-- creating text parts
-- leading part (marker and names)
local leading = makeMarkerAndName( args, show, page, country, frame )
.. makeEvent( args, page )
-- additional parts for vCard mode
local contacts = '' -- all contacts
-- get address and directions
local address = makeAddressAndDirections( args, page, country )
-- get all contact information
local contacts = makeContacts( args, country )
contacts = removePeriods( address .. contacts )
-- making description, coordinates, and meta data
local description, noContent =
makeDescription( args, show, page, country, vcEntity )
local r = leading
local icons = ''
if contacts == '' and noContent then
show.inline = true
r = r .. mu.makeIcons( args, page, country, vcEntity, show, vc.fromWD ) .. description
else
if type( mi.options.showSisters ) == 'boolean' then
-- could also be 'atEnd', then part of body
icons = mu.makeIcons( args, page, country, vcEntity, show, vc.fromWD )
end
-- mi.texts.periodSeparator = '. '
r = removePeriods( r .. contacts .. icons ..
( show.noperiod and '' or mi.texts.periodSeparator ) .. description )
:gsub( '%)(</span>)%s*(<span [^>]*>)%s*%(', '%1; %2' )
end
-- prevents line break before punctuation mark
r = r:gsub( '</span>([,;.:!?])', '%1</span>' )
-- remove space(s) before punctuation marks
:gsub( '%s+(<span [^>]*>[,;.:!?])', '%1' )
if show.inlineDescription then
r = r:gsub( '%s+$', '' ) .. makeMetadata( args, page )
end
-- error handling and maintenance, not in template and module namespaces
if country.unknownLanguage then
mu.addMaintenance( 'unknownLanguage' )
end
if country.unknownPropertyLanguage then
mu.addMaintenance( 'unknownPropertyLanguage' )
end
r = r .. mu.makeMaintenance( page, { wu, mu, cm, hr } )
-- wrapping tag
args.address = args.addressOrig
args.template = 'vCard'
return mu.makeWrapper( r, args, page, country, show, vp.vcardData, frame )
end
return vc
b2q0zyt9xhpx37wkprupfikb8yoh3qm
Modulo:VCard/Params
828
4802
72068
71598
2026-04-07T11:09:32Z
RolandUnger
168
Update
72068
Scribunto
text/plain
--[[
This module contains the parameter tables and definitions. Do not modify this
module. The translated values are stored in Module:vCard/i18n.
Not all parameters given in the ParMap table can be used by authors. They are
only for internal usage and will not be shown in the output (for instance
booking). Parameters for internal usage will be generated by the program or
fetched from Wikidata.
--]]
-- module import
local vi = require( 'Module:VCard/i18n' ) -- additional vCard options
return {
-- administration
moduleInterface = {
suite = 'vCard',
sub = 'Params',
serial = '2026-03-08',
item = 65455743
},
-- complete table of parameters
-- true: get it from Wikidata in any case
-- for parameter translations see Module:VCard/i18n
ParMap = {
address = '',
addressLang = '',
addressLocal = '',
agoda = true, -- Agoda.com
alt = '',
applemaps = true, -- Maps.Apple.com
auto = '',
before = '',
booking = true, -- Booking.com
checkin = '',
checkout = '',
color = '', -- internal use
comment = '',
commonscat = '',
content = '',
copyMarker = '',
country = '',
dav = true, -- Alpenverein.de
description = '',
directions = '',
directionsLocal = '',
email = '',
expedia = true, -- Expedia.com
facebook = '',
fax = '',
flickr = '',
foursquare = true, -- Foursquare.com
geonames = true, -- Geonames.org
googlemaps = '', -- Maps.Google.com
group = '',
histhotelsAm = true, -- HistoricHotels.org
histhotelsEu = true, -- HistoricHotelsOfEurope.com
histhotelsWw = true, -- HistoricHotelsWorldwide.com
hostelworld = true, -- Hostelworld.com
hotels = true, -- Hotels.com
hours = '',
iata = vi.options.showIata,
icao = vi.options.showIcao,
id = '', -- used if wikidata is missing
image = true,
instagram = '',
kayak = true, -- Kayak.com
lastedit = '',
lat = '',
leadingHotels = true, -- LHW.com
localLang = '',
long = '',
mapGroup = '',
mobile = '',
name = true,
nameExtra = '',
nameLatin = '',
nameLocal = '',
nameMap = '',
oeav = true, -- Alpenverein.at
osmNodeId = true,
osmRelationId = true,
osmWayId = true,
payment = '',
phone = '',
preferredHotels = true, -- PreferredHotels.com
price = '',
pzs = true, -- PZS.si (Slovenia)
recreation = true, -- Recreation.gov
relaisChateaux = true, -- RelaisChateaux.com
rss = true, -- web feed
sac = true, -- SAC-CAS.ch
sectionFrom = '',
show = vi.options.defaultShow,
skyscanner = true, -- Skyscanner.com
stationNumber = true, -- Intl. station number
status = '',
styles = '',
subtype = '',
subtypeAdd = true, -- internal use
symbol = '', -- internal use
text = '', -- internal use
tiktok = '',
tollfree = '',
trip = true, -- Trip.com
tripadvisor = true, -- Tripadvisor.com
type = '',
unesco = vi.options.showUnesco,
url = '',
urlMap = true, -- official map URL
urlTimetable = true, -- timetable/schedule URL
useIcon = '', -- internal use
wikidata = '',
wikipedia = '', -- deprecated
x = '',
youtube = '',
zoom = '',
date = '', -- for events
month = '',
year = '',
endDate = '',
endMonth = '',
endYear = '',
frequency = '',
location = ''
},
--[[
Wikidata properties and definitions for vCard parameters
p property or set of properties
f formatter string
c maximum count of results, default = 1
m concat mode (if c > 1), default concat with ', '
v value type,
empty: string value (i.e. default type),
id: string value of an id like Q1234567
idl: string value of the label of an id like Q1234567
il: language-dependent string value
iq: string value with qualifier ids
iqp: string value with qualifier ids, for comments in policies
au: quantity consisting of amount and unit
pau: quantity consisting of amount (for P8733)
vq: string or table value with qualifiers ids and references
q table of qualifiers allowed, for value type id
l = lang: language dependent
wiki / local: monolingual text by wiki or local language
le = true: use date for lastedit parameter
t = phone type (landline, mobile)
--]]
ParWD = {
agoda = { p = 'P6008' },
applemaps = { p = 'P10046' },
booking = { p = 'P3607' },
checkin = { p = 'P8745', v = 'idl' },
checkout = { p = 'P8746', v = 'idl' },
dav = { p = 'P5757' },
directions = { p = 'P2795', v = 'il', l = 'wiki' },
directionsLocal = { p = 'P2795', v = 'il', l = 'local' },
email = { p = 'P968', v = 'vq', c = 5 },
expedia = { p = 'P5651' },
facebook = { p = { { p = 'P2013', f = 'https://www.facebook.com/%s' }, -- Facebook username
{ p = 'P1997', f = 'https://www.facebook.com/%s' }, -- Facebook places ID
{ p = 'P4003', f = 'https://www.facebook.com/pages/%s' }, -- Facebook page ID
{ p = 'P11705', f = 'https://www.facebook.com/pages/%s' } } }, -- Facebook numeric ID
fax = { p = 'P2900', v = 'vq', c = 3 },
flickr = { p = 'P3267', f = 'https://www.flickr.com/photos/%s' },
foursquare = { p = 'P1968' },
geonames = { p = 'P1566' },
googlemaps = { p = 'P3749' },
histhotelsAm = { p = 'P5734' },
histhotelsEu = { p = 'P5774' },
histhotelsWw = { p = 'P5735' },
hostelworld = { p = 'P10442' },
hotels = { p = 'P3898' },
iata = { p = 'P238', c = 3 },
icao = { p = 'P239' },
image = { p = { { p = 'P18' },
{ p = 'P3451' }, -- nighttime view
{ p = 'P8592' }, -- aerial view
{ p = 'P5775' } } }, -- interior image
instagram = { p = { { p = 'P2003', f = 'https://www.instagram.com/%s/' },
{ p = 'P4173', f = 'https://www.instagram.com/explore/locations/%s/' } } },
kayak = { p = 'P10547' },
leadingHotels = { p = 'P5834' },
mobile = { p = 'P1329', v = 'vq', c = 5, t = 'mobile' },
oeav = { p = 'P5759' },
osmNodeId = { p = 'P11693' },
osmRelationId = { p = 'P402' },
osmWayId = { p = 'P10689' },
payment = { p = 'P2851', v = 'id', c = 50, m = 'no' },
phone = { p = 'P1329', v = 'vq', c = 5, t = 'landline' },
preferredHotels = { p = 'P5890' },
price = { p = 'P2555', v = 'au', c = 10, le = true }, -- fee
pzs = { p = 'P5758' },
recreation = { p = 'P3714' },
relaisChateaux = { p = 'P5836' },
rss = { p = 'P1019' },
sac = { p = 'P5761' },
skyscanner = { p = 'P10487' },
stationNumber = { p = 'P954' }, -- intl station number
subtypeAdd = { p = { { p = 'P912', v = 'iq', c = 50 }, -- has facility
{ p = 'P166', v = 'iq', c = 5, q = { 'Q2976556', 'Q20824563', 'Q104135230' } },
-- awards received (hotel rating, Michelin etc.)
{ p = 'P10290', v = 'iq', c = 3 }, -- hotel rating
{ p = 'P8733', v = 'pau' }, -- number of rooms
{ p = 'P2012', v = 'iq', c = 50 }, -- cuisine
{ p = 'P2846', v = 'iq' }, -- wheelchair
{ p = 'P2848', v = 'iq' }, -- WLAN
{ p = 'P5023', v = 'iqp', c = 10 } }, c = 100, m = 'no' }, -- activity policies
tiktok = { p = { { p = 'P7085', f = 'https://www.tiktok.com/@%s' }, -- TikTok username
{ p = 'P11559', f = 'https://www.tiktok.com/place/_-%s' } } }, -- TikTok place ID
trip = { p = 'P10425' },
tripadvisor = { p = 'P3134' },
x = { p = 'P2002', f = 'https://x.com/%s' },
unesco = { p = { { 'P757' }, -- World Heritage Site ID
{ p = 'P2614', v = 'id' } } }, -- World Heritage criteria
url = { p = { { p = 'P856', l = 'lang' }, -- URL
{ p = 'P973', l = 'lang' } } }, -- described at URL
urlMap = { p = 'P9601' },
urlTimetable = { p = 'P12677' },
youtube = { p = { { p = 'P11245', f = 'https://www.youtube.com/@%s' }, -- Youtube channel @ alias
{ p = 'P2397', f = 'https://www.youtube.com/channel/%s' } } } -- Youtube channel
},
-- additional parameters for auto = y
ParWDAdd = {
address = 1,
addressLocal = 1,
directions = 1,
directionsLocal = 1,
hours = 1,
nameLocal = 1
},
-- parameters to save in vCard wrapper tag
vcardData = {
addressLang = 'data-address-lang', -- language of address
addressLocal = 'data-address-local',
color = 'data-color',
commonscat = 'data-commonscat',
directionsLocal = 'data-directions-local',
group = 'data-group',
image = 'data-image',
mapGroup = 'data-map-group',
nameLocal = 'data-name-local',
rss = 'data-rss',
subtype = 'data-subtype',
symbol = 'data-symbol',
type = 'data-type',
url = 'data-url',
wikidata = 'data-wikidata',
agoda = 'data-agoda-com',
applemaps = 'data-apple-maps-id',
booking = 'data-booking-com',
dav = 'data-alpenverein-de',
expedia = 'data-expedia-com',
foursquare = 'data-foursquare-id',
geonames = 'data-geonames-id',
googlemaps = 'data-google-maps-cid',
histhotelsAm = 'data-historic-hotels-america',
histhotelsEu = 'data-historic-hotels-europe',
histhotelsWw = 'data-historic-hotels-worldwide',
hostelworld = 'data-hostelworld-com',
hotels = 'data-hotels-com',
kayak = 'data-kayak-com',
leadingHotels = 'data-leading-hotels',
oeav = 'data-alpenverein-at',
osmNodeId = 'data-osm-node-id',
osmRelationId = 'data-osm-relation-id',
osmWayId = 'data-osm-way-id',
preferredHotels = 'data-preferred-hotels',
pzs = 'data-pzs-si',
recreation = 'data-recreation-gov',
relaisChateaux = 'data-relais-chateaux',
sac = 'data-sac-cas-ch',
sectionFrom = 'data-section-from',
skyscanner = 'data-skyscanner-com',
stationNumber = 'data-station-number',
trip = 'data-trip-com',
tripadvisor = 'data-tripadvisor-com',
urlMap = 'data-map-url',
urlTimetable = 'data-timetable-url'
},
-- check if event
checkEvent = { 'date', 'month', 'year', 'endDate', 'endMonth', 'endYear',
'frequency', 'location' },
-- prevent local data if wiki language == country language
localData = { 'nameLocal', 'addressLocal', 'directionsLocal' },
-- phone numbers for fetching country data
phones = { 'phone', 'fax', 'mobile', 'tollfree' },
-- possible values for show parameter
show = {
all = 1,
coord = 1,
copy = 1,
inline = 1,
noairport = 1,
none = 1,
noperiod = 1,
nositelinks = 1,
nosocialmedia = 1,
outdent = 1,
poi = 1,
symbol = 1,
wikilink = 1
}
}
7z37jtt4wft124acta6rrf8blvgj3cn
Modulo:VCard/Qualifiers
828
4803
72069
71595
2026-04-07T11:11:46Z
RolandUnger
168
update
72069
Scribunto
text/plain
-- Qualifier to label table
-- please use only quotation marks instead of apostrophs for JSON export
return {
-- documentation
moduleInterface = {
suite = "VCard",
sub = "VCard/Qualifiers",
serial = "2026-01-31",
item = 99929816
},
labels = {
-- unuoj / units
gratis = "senkosta",
Q1543615 = "senkosta",
Q1092296 = "Aĝojaro",
Q24564698 = "Aĝojaro",
-- uzado / use (P366)
-- parto rilatanta / applies to part (P518) etc.
Q5070802 = "Krizostato",
Q11028 = "Informo",
Q58897583 = "Informo",
Q1482145 = "Telefonhelpo",
Q256132 = "Telefoncentralo",
Q1261521 = "Telefoncentralo",
Q589666 = "Telefoncentralo",
Q2794937 = "Akceptejo",
Q31948 = "Vestiblo",
Q862212 = "Fojero",
Q4096995 = "Rezervo",
Q1029698 = "Gvidata rondiro",
Q7673285 = "Seĝa rezervo",
Q1162163 = "Direktisto",
Q267936 = "Direktisto",
Q25713832 = "Estro",
Q11964531 = "Manaĝero",
Q22132694 = "Muzedirektoro",
Q80687 = "Sekretariato",
Q859482 = "Sekretariato",
Q182060 = "Oficejo",
Q5283295 = "Administracio",
Q50412353 = "Administracio",
Q39809 = "Merkatiko",
Q133080 = "Publikrilatoj",
Q111148864 = "Kultura oficejo",
Q674426 = "Kuratoro",
Q2108946 = "Gazetara oficejo",
Q1193236 = "Novaĵa amaskomunikilo",
Q5196479 = "Klienta subteno",
Q1060653 = "Klienta servo",
Q955464 = "Pastro",
Q7406919 = "Servo",
Q51073356 = "Havenestro",
Q11735065 = "Havenestro",
Q12407563 = "Devigo de parkumejoj",
Q1049511 = "WhatsApp",
Q15616276 = "Telegram",
Q17517 = "Poŝtelefono",
Q738621 = "Fiksa telefono",
Q2664461 = "Pordisto",
Q1735282 = "Kassisto",
Q1463565 = "Kassisto",
Q551800 = "Biletoj",
Q187456 = "Trinkejo",
Q777754 = "Manĝlivera servo",
Q41958 = "Manĝlivera servo",
Q171141 = "Gastronomio",
Q43164 = "Kuirejo",
Q213441 = "Vendejo",
Q11707 = "Restoracio",
Q547762 = "Amuzumado",
Q133215 = "Kazino",
Q1065656 = "Gimnastikejo",
Q55187 = "Tondisto",
Q31374404 = "Butikcentro",
Q179415 = "Masaĝo",
Q33506 = "Muzeo",
Q2772772 = "Milita muzeo",
Q1824143 = "Liverado",
Q2048970 = "Ĉambra servo",
Q15983979 = "Oficejo pri perditaj posedaĵoj",
Q60616546 = "Urba turismo",
Q112726458 = "Vizoficejo",
Q862761 = "Interne",
Q1322786 = "Eksteraĵo",
Q121298623 = "Subĉiela areo",
Q115156410 = "Montra kolekto",
Q464980 = "Ekspozicio",
Q5402268 = "Daŭra ekspozicio",
Q10426913 = "Daŭra ekspozicio",
Q29023906 = "Portempa ekspozicio",
-- por homoj / applies to people (P6001)
Q5 = "Persono",
Q1340307 = "Malgranda infano",
Q11370581 = "Beboj kaj infanetoj",
Q7569 = "Infano",
Q29514218 = "Filo",
Q1076052 = "Infanĝardenano",
Q11519472 = "Infanĝardenano",
Q1902344 = "Infanĝardenano",
Q190007 = "Junaĝulo",
Q131774 = "Junaĝulo",
Q170079 = "Neplenaĝulo",
Q1492760 = "Dekkelkjarulo",
Q17156455 = "Juna plenkreskulo",
Q80994 = "Plenkreskulo",
Q18000 = "Plenkreskulo",
Q16003605 = "Bazlernejaj studentoj",
Q98021727 = "Bazlernejaj studentoj",
Q16003532 = "Gimnaziano",
Q15360275 = "Mezlernejaj studentoj",
Q48942 = "Lernanto",
Q68131879 = "Lernanto",
Q73229462 = "Lernanto",
Q98033936 = "Mezlernejaj studentoj",
Q37226 = "Instruisto",
Q48282 = "Studento",
Q315247 = "Universitata studento",
Q110207241 = "Eksterlanda studento",
Q253567 = "Metilernanto",
Q59263364 = "Metilernanto",
Q28790169 = "Senlaborulo",
Q59308743 = "Ricevulo de registara asistado",
Q109710549 = "Volontulo",
Q136806547 = "Volontulo",
Q136806565 = "Volontulo",
Q24716636 = "Volontulo",
Q1454927 = "Soldatservanto",
Q47228496 = "Soldatservanto",
Q1930187 = "Ĵurnalisto",
Q1749879 = "Emerito",
Q1358789 = "Maljunuloj",
Q191089 = "Maljunuloj",
Q2191986 = "Maljunuloj",
Q111524907 = "Maljunuloj ekde 60",
Q117131136 = "Maljunuloj ekde 65",
Q108427775 = "Maljunuloj super 65",
Q12131 = "Malkapablo",
Q10857933 = "Malkapablo",
Q1250414 = "Grave handikapita",
Q136806121 = "Grave handikapita (50% aŭ pli)",
Q8436 = "Familio",
Q1422286 = "Kompaniulo",
Q874405 = "Grupo",
Q16334295 = "Grupo",
Q1605672 = "Junulara gvidanto",
Q113191894 = "Egipta studento",
Q113191817 = "Araba studento",
Q221488 = "Piediranto",
Q11442 = "Biciklo",
Q42889 = "Rimedo de transporto",
Q1420 = "Aŭtomobilo",
Q1144312 = "Persona aŭto",
Q190578 = "Persona aŭto",
Q43193 = "Kamiono",
Q5638 = "Buso",
Q1373492 = "Buso",
Q193234 = "Skotero",
Q34493 = "Motorciklo",
Q23901795 = "plena kotizo",
Q100157294 = "malpliigita kotizo",
Q23901802 = "malpliigita kotizo",
Q10328277 = "malpliigita enirkotizo",
Q10585806 = "Minimumo",
Q10578722 = "Maksimumo",
Q30079877 = "Monata bileto",
Q2024421 = "Enreta bileto",
Q59582212 = "Semajna bileto",
Q819073 = "Labortago",
Q211391 = "Semajnfino",
Q22947 = "Loĝanto",
Q1020994 = "Civitano",
Q70237645 = "Hejmlando",
Q473741 = "Eksterlandano",
Q1072012 = "Eksterlandano",
Q56508363 = "Civitano de Eŭropa Unio aŭ Eŭropa Ekonomia Areo",
Q56508358 = "Ne-EU-civitanoj",
Q1061510 = "Egipta",
Q35323 = "Araba",
Q31 = "Belgio",
Q4200853 = "Indonezianoj",
Q15731961 = "Indonezianoj",
Q19840821 = "Singapuranoj",
Q126003079 = "Singapuranoj",
Q2408569 = "Tajlandanoj",
Q7901501 = "Urugvajanoj",
Q39201 = "dorlotbesto",
Q144 = "hundo",
Q62966720 = "parkumeja kotizo",
Q1039099 = "ĉiĉerono",
Q758877 = "aŭdogvidilo",
Q15328 = "kamerao",
Q313600 = "fotilo",
Q313614 = "filmilo",
Q335234 = "filmilo",
Q335095 = "filmilo",
Q683906 = "stativo"
-- es fehlen Übernachtung, ÜF, EZ, DZ u. ä. (in Wikidata anlegen)
}
}
aenor709ed3ybqvef5on5xeb8wicguk
Modulo:Marker utilities
828
4807
72071
71599
2026-04-07T11:17:18Z
RolandUnger
168
Update
72071
Scribunto
text/plain
--[[
Functions library for Marker and vCard modules
In non-Wikivoyage projects, sister-project links functions have to be adapted.
]]--
-- require( 'strict' )
local cd = require( 'Module:Coordinates' )
local mg = require( 'Module:Marker utilities/Groups' )
local mi = require( 'Module:Marker utilities/i18n' )
local mm -- MAKI icons
local mt = require( 'Module:Marker utilities/Types' ) -- types to groups like drink, eat, go, see, sleep, ...
local uc -- URL check
local wu = require( 'Module:Wikidata utilities' )
-- module variable and administration
local mu = {
moduleInterface = {
serial = '2026-04-06',
item = 58187612
},
comma = mi.texts.comma,
commaSeparator = mi.texts.commaSeparator
}
-- to keep background color in print
local colorAdjust = { ['-webkit-print-color-adjust'] = 'exact', ['color-adjust'] = 'exact',
['print-color-adjust'] = 'exact' }
-- maintenance tools
function mu.initMaintenance( name )
mu.invalidParams = {} -- table of unknown parameters
mu.duplicateAliases = {} -- table of duplicate parameter aliases
mu.maintenance = {} -- table of error strings
mu.types = mt.types
mu.groups = mg.groups
mu.typeAliases = nil -- table for type aliases. Create on demand
mu.groupAliases = nil -- table for group aliases
end
local function contains( new )
for i = 1, #mu.maintenance do
if mu.maintenance[ i ] == new then
return true
end
end
return false
end
function mu.addMaintenance( key, value )
local s = key -- fallback
local tab = mi.maintenance[ key ]
if tab then
s = mi.formats.category:format( tab.category ) ..
( tab.err and mi.formats.error:format( tab.err ) or '' ) ..
( tab.hint and mi.formats.hint:format( tab.hint ) or '' )
end
s = value and mw.ustring.format( s, value ) or s
if not contains( s ) then
table.insert( mu.maintenance, s )
end
end
function mu.getCategories( formatStr )
return wu.getCategories( formatStr )
end
local function getMaintenance()
if #mu.invalidParams == 1 then
mu.addMaintenance( 'unknownParam', mu.invalidParams[ 1 ] )
elseif #mu.invalidParams > 1 then
mu.addMaintenance( 'unknownParams',
table.concat( mu.invalidParams, mu.commaSeparator ) )
end
if #mu.duplicateAliases > 0 then
mu.addMaintenance( 'duplicateAliases',
table.concat( mu.duplicateAliases, mu.commaSeparator ) )
end
return table.concat( mu.maintenance, '' )
end
function mu.makeMaintenance( page, modules )
local r = getMaintenance()
if mi.options.usePropertyCateg then
local m = mi.maintenance.properties -- format string
for i, aModule in ipairs( modules ) do
if aModule then
r = r .. aModule.getCategories( m )
end
end
end
if page.namespace ~= 0 then
-- remove maintenance categories
r = r:gsub( '%[%[[^%]]+%]%]', '' )
end
return r
end
-- general-use functions
function mu.isSet( arg )
return arg and arg ~= ''
end
function mu.convertForSort( s )
s = s:ulower()
for i, obj in ipairs( mi.substitutes ) do
s = mw.ustring.gsub( s, obj.l, obj.as )
end
return s
end
-- replacing decimal separator and inserting group separators
function mu.formatNumber( num )
if mu.isSet( mi.texts.decimalPoint ) and mi.texts.decimalPoint ~= '.' then
num = num:gsub( '%.', mi.texts.decimalPoint )
end
if mu.isSet( mi.texts.groupSeparator ) then
local count
repeat
num, count = num:gsub( '^([-+]?%d+)(%d%d%d)',
'%1%' .. mi.texts.groupSeparator .. '%2' )
until count == 0
end
return num
end
function mu.tableInsert( tab, value )
if mu.isSet( value ) then
table.insert( tab, value )
end
end
-- splitting string s at sep, removing empty substrings
-- sep is a single character separator but no magic pattern character
function mu.textSplit( s, sep )
local result = {}
if type( s ) ~= 'string' then
return result
end
for str in s:gmatch( '([^' .. sep .. ']+)' ) do
mu.tableInsert( result, mw.text.trim( str ) )
end
return result
end
local function encodeSpaces( s )
s = s:gsub( '[_%s]+', '_' )
return s
end
local function removeChars( s, pattern )
s = s:find( pattern ) and s:gsub( pattern, '' ) or s
return s
end
local function replaceWithSpace( s, pattern )
s = s:find( pattern ) and s:gsub( pattern, ' ' ) or s
return s
end
-- Splitting comma separated lists to a table and converting items
function mu.split( s )
local arr = {}
if not mu.isSet( s ) then
return arr
end
for i, str in ipairs( mu.textSplit( s, ',' ) ) do
arr[ encodeSpaces( str ) ] = 1
end
return arr
end
function mu.makeSpan( s, class, isBdi, attr, css )
return tostring( mw.html.create( isBdi and 'bdi' or 'span' )
:addClass( class )
:attr( attr or {} )
:css( css or {} )
:wikitext( s )
)
end
-- bdi and bdo tags are not working properly on all browsers. Adding marks
-- (lrm, rlm) is maybe the only way for a correct output
function mu.languageSpan( s, titleHint, page, country, addClass )
if not mu.isSet( s ) then
return ''
end
local bdi = mw.html.create( 'bdi' )
:addClass( addClass )
:wikitext( s )
local c = country.lang
if c == '' or c == page.lang then
return tostring( bdi )
end
local dir
local fStr = '%s'
if country.isRTL and not page.isRTL then
dir = 'rtl'
fStr = '‏%s‎'
elseif not country.isRTL and page.isRTL then
dir = 'ltr'
fStr = '‎%s‏'
end
return fStr:format( tostring( bdi
:addClass( 'voy-lang voy-lang-' .. c )
:attr( { title = mw.ustring.format( titleHint , country.langName ),
lang = c, dir = dir } )
) )
end
function mu.addWdClass( isFromWikidata )
return isFromWikidata and ' voy-wikidata-content' or ''
end
function mu.getAliases( tab, key )
local result = {}
if not tab then
return result
end
local v
for k, tb in pairs( tab ) do
v = tb[ key ]
if v then
if type( v ) == 'table' then
for i = 1, #v do
result[ v[ i ] ] = k
end
else
result[ v ] = k
end
end
end
return result
end
function mu.yesno( val )
return mi.yesno[ val:ulower() ]
end
-- check functions
local function emphasize( s )
return mw.ustring.format( mi.texts.emph, s )
end
-- args: template arguments consisting of argument name as key and a value
-- validKeys: table with argument name as key used by the script and
-- a string or a table of strings for argument names used by the local wiki
function mu.checkArguments( templateArgs, validKeys )
local args = {}
if not templateArgs or not validKeys or not next( validKeys ) then
return args
end
local keys = {} -- list of wiki-dependent parameter names
for key, params in pairs( validKeys ) do
if type( params ) == 'string' then
keys[ params ] = key
else
for i = 1, #params do
keys[ params[ i ] ] = key
end
end
end
local targetKey
for key, arg in pairs( templateArgs ) do
targetKey = keys[ key ]
if targetKey then
if args[ targetKey ] then -- prevents duplicates
table.insert( mu.duplicateAliases, emphasize( key ) )
else
args[ targetKey ] = arg
end
else
table.insert( mu.invalidParams, emphasize( key ) )
end
end
-- normalize values
for i, param in ipairs( mi.options.normalizeValues ) do
if mu.isSet( args[ param ] ) then
args[ param ] = replaceWithSpace( args[ param ]:ulower(), '[_%s]+' )
end
end
return args
end
local function removeNS( s, nsTable )
if not s:find( ':', 1, true ) then
return s
end
local t = s
for i = 1, #nsTable do
t = mw.ustring.gsub( t, '^' .. nsTable[ i ] .. ':', '' )
if s ~= t then
return t
end
end
return t
end
function mu.checkCommonsCategory( args )
-- remove namespace from category
if mu.isSet( args.commonscat ) then
args.commonscat = removeNS( args.commonscat, mi.texts.CategoryNS )
end
end
-- checking coordinates
function mu.checkCoordinates( args )
local function clearCoordinates()
args.lat, args.long = '', ''
end
local t
if type( args.lat ) == 'boolean' or type( args.long ) == 'boolean' then
clearCoordinates()
end
if args.lat == '' and args.long == '' then
return
elseif args.lat ~= '' and args.long == '' then
t = args.lat:find( ',', 1, true )
if t then
args.long = mw.text.trim( args.lat:sub( t + 1, #args.lat ) )
args.lat = mw.text.trim( args.lat:sub( 1, t - 1 ) )
end
end
if args.lat == '' or args.long == '' then
clearCoordinates()
mu.addMaintenance( 'wrongCoord' )
return
end
local dms = false
t = tonumber( args.lat )
if t then
args.lat = math.abs( t ) <= 90 and t or ''
else
t = cd.toDec( args.lat, 'lat', 6 )
args.lat = t.error == 0 and t.dec or ''
dms = args.lat ~= ''
end
if args.lat ~= '' then
t = tonumber( args.long )
if t then
args.long = ( t > -180 and t <= 180 ) and t or ''
else
t = cd.toDec( args.long, 'long', 6 )
args.long = t.error == 0 and t.dec or ''
dms = dms or args.long ~= ''
end
end
if args.lat == '' or args.long == '' then
clearCoordinates()
mu.addMaintenance( 'wrongCoord' )
elseif dms then
mu.addMaintenance( 'dmsCoordinate' )
end
end
-- check zoom level
function mu.checkZoom( args )
args.zoom = math.floor( tonumber( args.zoom ) or mi.map.defaultZoomLevel )
if args.zoom < 0 or args.zoom > mi.map.maxZoomLevel then
args.zoom = mi.map.defaultZoomLevel
end
end
-- image check
function mu.checkImage( args, entity )
if type( args.image ) == 'boolean' or args.image == '' then
return
end
-- formal checks
if args.image:find( '^https?:' ) then
args.image = ''
else
-- remove namespace
args.image = removeNS( args.image, mi.texts.FileNS )
local extensionExists = false
local im = args.image:lower()
for i = 1, #mi.fileExtensions do
if im:find( '%.' .. mi.fileExtensions[ i ] .. '$' ) then
extensionExists = true
break
end
end
if not extensionExists then
args.image = ''
end
end
if args.image == '' then
mu.addMaintenance( 'wrongImgName' )
return
end
local alreadyChecked = false
if mi.options.mediaCheck and args.image ~= '' then
if not mi.options.WDmediaCheck and entity then
-- check if image is stored in Wikidata
local imgs = wu.getValues( entity, mi.properties.image, nil )
for i = 1, #imgs do
if imgs[ i ] == args.image then
alreadyChecked = true
break
end
end
end
if not alreadyChecked then
-- expensive function call
local title = mw.title.new( 'Media:' .. args.image )
if not title or not title.exists then
mu.addMaintenance( 'missingImg', args.image )
args.image = ''
end
end
end
end
function mu.checkStatus( args )
args.statusTable = {}
local hash = {}
if mu.isSet( args.status ) then
local statusAliases = mu.getAliases( mi.statuses, 'alias' )
for i, t in ipairs( mu.textSplit( args.status, ',' ) ) do
t = encodeSpaces( t )
t = statusAliases[ t ] or t
if mi.statuses[ t ] then
if not hash[ t ] then
table.insert( args.statusTable, t )
hash[ t ] = 'x'
end
else
mu.addMaintenance( 'unknownStatus' )
end
end
if #args.statusTable > 1 then
table.sort( args.statusTable,
function( a, b )
local at = mi.statuses[ a ]
local bt = mi.statuses[ b ]
return ( at.g < bt.g ) or ( at.g == bt.g and a < b )
end
)
end
end
end
function mu.checkStyles( args )
if mu.isSet( args.styles ) then
if mi.nameStyles[ args.styles:lower() ] then
args.styles = args.styles:lower()
args.styleClass = ' voy-listing-name-style-' .. args.styles
args.styles = mi.nameStyles[ args.styles ]
end
else
args.styles = nil
end
end
function mu.checkId( args )
if mu.isSet( args.id ) and mu.isSet( args.wikidata ) then
mu.addMaintenance( 'wikidataWithId' )
args.id = ''
end
if mu.isSet( args.id ) and args.id:find( '[!-,.-/:-?[-^{-\127%z\1-\31]' ) then
mu.addMaintenance( 'wrongId' )
args.id = ''
end
end
function mu.checkLength( s, min, max )
return #s >= ( min or 0 ) and #s <= ( max or 1000 )
end
-- groups translation for map legend into Wiki language
local function translateGroup( group )
if not mu.isSet( group ) then
group = mt.types.error.group
end
local t = mg.groups[ group ]
if t then
t = t.map or t.label or t.alias or group
if type( t ) == 'table' then
t = t[ 1 ]
end
return t
end
return group
end
local function getTypeFromTypeAliases( aType )
if not mu.typeAliases then
mu.typeAliases = mu.getAliases( mt.types, 'alias' )
end
return mu.typeAliases[ aType ]
end
local function getGroupFromGroupAliases( group )
if not mu.groupAliases then
mu.groupAliases = mu.getAliases( mg.groups, 'alias' )
end
return mu.groupAliases[ group ]
end
-- getting marker type and group
function mu.checkTypeAndGroup( args )
local s, t
args.typeTable = {}
args.subtypeTable = {}
-- check group
if mu.isSet( args.group ) then
mu.addMaintenance( 'parameterUsed', 'group' )
s = mg.groups[ args.group ]
if not s then
s = getGroupFromGroupAliases( args.group )
if s then
args.group = s
s = mg.groups[ args.group ]
end
end
if not s then
mu.addMaintenance( 'unknownGroup' )
args.group = ''
elseif s.is and s.is == 'color' and mi.options.useTypeCateg then
mu.addMaintenance( 'group', args.group )
end
end
-- check type
if not mu.isSet( args.type ) then
args.type = mt.types.error.group
mu.addMaintenance( 'missingType' )
elseif args.type == mt.types.error.group then
mu.addMaintenance( 'unknownType', args.type )
end
if args.type == mt.types.error.group then
args.group = mt.types.error.group
else
-- split seperate types and analyse them
for i, t in ipairs( mu.textSplit( args.type, ',' ) ) do
-- try to find the type t in types or groups
t = encodeSpaces( t )
if not mt.types[ t ] then
t = getTypeFromTypeAliases( t ) or getGroupFromGroupAliases( t ) or t
end
s = mg.groups[ t ]
if s then -- type is a group itself
if s.is and s.is == 'color' then
if mi.options.excludeColorTypes then
args.group = mt.types.error.group
mu.addMaintenance( 'unknownType', t )
else
mu.addMaintenance( 'typeIsColor' )
end
elseif not mi.options.noTypeMsgs then
mu.addMaintenance( 'typeIsGroup' )
end
if args.group == '' then
args.group = t
end
else
s = mt.types[ t ]
if s then
if args.group == '' then
args.group = s.group
end
if mu.isSet( s.subtype ) then
table.insert( args.subtypeTable, t )
end
else
args.group = mt.types.error.group
mu.addMaintenance( 'unknownType', t )
end
end
table.insert( args.typeTable, t )
if mi.options.useTypeCateg then
mu.addMaintenance( 'type', t )
end
end
args.type = table.concat( args.typeTable, ',' )
end
args.groupTranslated = translateGroup( args.group )
mu.getColor( args )
end
local function isUrl( url )
uc = uc or require( 'Module:UrlCheck' )
return uc.isUrl( url, mi.options.skipPathCheck )
end
-- url check in args
function mu.checkUrl( args )
if not mu.isSet( args.url ) then
return
end
local c = isUrl( args.url ) -- getting result code
if c > 2 then
mu.addMaintenance( 'wrongUrl' )
args.url = ''
elseif c == 2 then -- URL contains IP address
mu.addMaintenance( 'urlWithIP' )
else
if args.url:find( 'twitter.com', 1, true ) then -- old X url
mu.addMaintenance( 'urlIsSocialMedia' )
args.url = ''
else
for i = 1, #mi.services do
if args.url:find( '[./]' .. mi.services[ i ].key .. '.com' ) then
mu.addMaintenance( 'urlIsSocialMedia' )
args.url = ''
break
end
end
end
end
end
-- type and group functions
-- getting a set of parameters for a given type
function mu.getTypeParams( aType )
return mt.types[ aType ]
end
function mu.idToType( id )
if not mu.typeIds then
mu.typeIds = mu.getAliases( mt.types, 'wd' ) -- Q id to type table
end
return mu.typeIds[ id ]
end
function mu.getTypeLabel( id )
if not mu.isSet( id ) then
return ''
end
if id:match( '^Q%d+$' ) then
id = mu.idToType( id )
if not id then
return ''
end
else
id = encodeSpaces( id )
end
local at, t
t = mt.types[ id ]
if not t then
t = getTypeFromTypeAliases( id )
t = t and mt.types[ t ]
end
if t then
t = t.label or id
at = t:find( ',', 1, true )
if at then
t = t:sub( 1, at - 1 )
end
else
t = replaceWithSpace( id, '_' )
end
return t
end
function mu.typeExists( aType )
return mt.types[ aType ] and aType or getTypeFromTypeAliases( aType )
end
-- check if the specified group can have events
function mu.groupWithEvents( group )
return mg.groups[ group ] and mg.groups[ group ].withEvents
end
-- see: https://www.w3.org/TR/WCAG20/#relativeluminancedef
local function hexToLinear( hex )
hex = tonumber( hex, 16 ) / 255.0
if hex <= 0.03928 then
return hex / 12.92
else
return ( ( hex + 0.055 ) / 1.055 ) ^ 2.4
end
end
-- relative luminance of a color
-- 6 digit hex color
local function hexToLuminance( color )
local r = hexToLinear( color:sub( 1, 2 ) )
local g = hexToLinear( color:sub( 3, 4 ) )
local b = hexToLinear( color:sub( 5, 6 ) )
return 0.2126 * r + 0.7152 * g + 0.0722 * b
end
local function isInverse( backgroundColor )
-- the luminance threshold should be greater than 0.2848 (i.e. magenta,
-- error, #FF00FF) and smaller than 0.4
-- the value chosen of 0.386 corresponds to a light magenta (#FF69FF) which
-- seems to be used for Wikimedia's map server
-- see: https://github.com/wikimedia/makizushi/blob/master/lib/color.js
local luminanceThreshold = 0.386
backgroundColor = backgroundColor:sub( 2 ) -- remove #
:gsub( '^(%x)(%x)(%x)$', '%1%1%2%2%3%3' )
local luminance = hexToLuminance( backgroundColor )
return hexToLuminance( backgroundColor ) > luminanceThreshold
end
-- getting color from group in args
function mu.getColor( args )
local c = mg.groups[ args.group ] or mg.groups[ 'error' ]
args.color = c.color
args.inverse = isInverse( c.color )
end
-- Splitting comma separated lists to a table of key items
-- checking items with allowed key values of validValues table
local function splitAndCheck( s, validValues )
local values = {}
if not validValues then
return values, ''
end
local errors = {}
for item, v in pairs( mu.split( s ) ) do
-- value check
if validValues[ item ] then
values[ item ] = 1
else
table.insert( errors, item )
end
end
return values, table.concat( errors, mu.commaSeparator )
end
local function setCopyMarker( args, show )
if show.copy and ( mu.isSet( args.copyMarker ) or not mu.isSet( args.wikidata ) ) then
show.copy = nil
mu.addMaintenance( 'deleteShowCopy' )
end
if show.copy then
args.copyMarker = args.wikidata
end
if mu.isSet( args.copyMarker ) then
show.symbol = nil
end
end
-- treatment of social media services if Wikidata is available
local function setSocialMedia( args, value )
for i, service in ipairs( mi.services ) do
args[ service.key ] = value
end
end
function mu.getShow( default, args, validValues )
local show = mu.split( default )
local add, err = splitAndCheck( args.show, validValues )
if err ~= '' then
mu.addMaintenance( 'unknownShow', err )
end
-- maintenance
if add.inline then
show.inlineSelected = true
mu.addMaintenance( 'showInlineUsed' )
end
if add.poi then
mu.addMaintenance( 'showPoiUsed' ) -- is default
end
-- overwriting defaults
if add.none or add.coord or add.poi or add.all then
show.all, show.coord, show.poi = nil, nil, nil
end
-- merge show with add values
for key, value in pairs( add ) do
show[ key ] = value
end
if show.none then
show.none, show.all, show.coord, show.poi = nil, nil, nil, nil
end
if show.all then
show.all = nil
show.coord, show.poi = 1, 1
end
if show.noname then
show.noname, show.name = nil, nil
else
show.name = 1
end
setCopyMarker( args, show )
if args.wikidata ~= '' then
if show.socialmedia then
setSocialMedia( args, 'y' )
elseif show.nosocialmedia then
setSocialMedia( args, 'n' )
end
end
if not show.nosocialmedia then
show.socialmedia = 1
end
return show
end
-- removing line breaks and controls from parameter strings
function mu.removeCtrls( s, onlyInline )
local descrDiv = false -- div tag instead of span tag for description needed?
-- remove controls from tags
s = s:gsub( '(<[^>]+>)', function( t )
return replaceWithSpace( t, '[%z\1-\31]' )
end )
local t = removeChars( s, '[%z\1-\8\11\12\14-\31]' ) -- ctrl chars
t = replaceWithSpace( t, '[\9]' ) -- horizontal tab
t = replaceWithSpace( t, '</br%s*>' )
if onlyInline then
t = replaceWithSpace( t, '<br[^/>]*/*>' ) -- no line breaks
t = replaceWithSpace( t, '</*p[^/>]*/*>' ) -- no paragraphs
t = replaceWithSpace( t, '</*div[^/>]*/*>' ) -- no divs
t = mw.text.trim( replaceWithSpace( t, '[\10\13]' ) ) -- no line breaks
-- not %c because \127 is used for Mediawiki tags (strip markers `UNIQ)
else
descrDiv = t:find( '[\10\13]' ) or t:find( '<br[^/>]*/*>' ) or
t:find( '<p[^/>]*>' ) or t:find( '<div[^/>]*>' )
end
-- remove LTR and RTL marks
t = mw.ustring.gsub( t, '[]+', '' )
if descrDiv then
-- unify line breaks to Linux mode
t = t:gsub( '\13\10', '\10' ):gsub( '\13', '\10' )
-- replace line breaks by <br> in block mode
t = t:gsub( '([^>%]\10])\10+([^<%[\10])', '%1<br class="voy-listing-next-paragraph" />%2' )
end
return replaceWithSpace( t, '%s%s+' ), descrDiv
end
-- fetch data from Wikidata
function mu.getCoordinatesFromWikidata( args, fromWikidata, entity )
if not entity or ( args.lat ~= '' and args.long ~= '' ) then
return
end
-- center coordinates from Wikidata
local c = wu.getValue( entity, mi.properties.centerCoordinates )
if c == '' then
-- coordinates from Wikidata
c = wu.getValue( entity, mi.properties.coordinates )
end
-- search for headquarters location
if c == '' then
local tab = wu.getValuesWithQualifiers( entity, mi.properties.headquartersLoc,
nil, mi.properties.coordinates )
if #tab > 0 then
tab = tab[ 1 ][ mi.properties.coordinates ]
if tab and #tab > 0 then
c = tab[ 1 ]
mu.addMaintenance( 'headquarters' )
args.coordFrom = 'headquarters'
end
end
end
if c ~= '' then
args.lat, args.long = c.latitude, c.longitude
fromWikidata.lat = true
end
end
local function typeSearch( p31 )
-- p31: array of Wikidata values
if not p31 or #p31 == 0 then
return ''
end
local firstStep = true
local function compareLabels( ar )
if not ar then
return nil
elseif type( ar ) == 'string' then
ar = { ar }
end
for i, value in ipairs( ar ) do
if mu.isSet( value ) then
value = ( encodeSpaces( value ) )
if mt.types[ value ] then
return value
end
end
end
return nil
end
local function compareIds( ar )
local id, t
for i = 1, #ar do
id = ar[ i ].id
-- md: indexed array of q id - types relations
t = mu.idToType( id )
if t then
return t
end
-- checking English label and aliases
t = compareLabels( mw.wikibase.getLabelByLang( id, 'en' ) )
or compareLabels( wu.getAliases( id, 'en' ) )
if t then
if firstStep and not mi.options.noTypeMsgs then
firstStep = false
mu.addMaintenance( 'typeFromWDchain' )
end
return t
end
end
return nil
end
local aType = compareIds( p31 ) -- check p31 ids first, maybe step 2 is not nessary
if aType then
return aType
end
-- now functions becomes expensive because of multiple wu.getValues calls
local id, ids
firstStep = false
for i = 1, #p31 do -- step 2: analyse P279 chains of first ids
id = p31[ i ].id -- start id
local j = 0
repeat
ids = wu.getValues( id, mi.properties.subclassOf, nil )
if #ids > 0 then
aType = compareIds( ids )
if aType then
if not mi.options.noTypeMsgs then
mu.addMaintenance( 'typeFromWDchain' )
end
return aType
end
id = ids[ 1 ].id
end
j = j + 1
-- limit: maximum levels to analyse
until j >= mi.options.searchLimit or #ids == 0
end
return ''
end
function mu.getTypeFromWikidata( args, entity )
if mu.isSet( args.type ) then
return
end
local p31 = wu.getValues( entity, mi.properties.instanceOf )
if #p31 == 0 then
p31 = wu.getValues( entity, mi.properties.subclassOf )
end
args.type = typeSearch( p31 )
end
function mu.getCommonsCategory( args, entity )
-- getting commonscat from commonswiki sitelink before P373
-- because sitelink is checked by Wikidata
if type( args.commonscat ) == 'boolean' then
args.commonscat = ''
end
local t = wu.getSitelink( entity, 'commonswiki' ) or ''
if t:match( '^Category:.+$' ) then
t = t:gsub( '^[Cc]ategory:', '' )
else
t = wu.getValue( entity, mi.properties.commonsCategory )
if t == '' then
local id = wu.getId( entity, mi.properties.mainCategory )
if id ~= '' then
t = wu.getSitelink( id, 'commonswiki' ) or ''
t = t:gsub( '^[Cc]ategory:', '' )
end
end
end
if t ~= '' and args.commonscat ~= '' then
mu.addMaintenance( 'commonscatWD' )
end
if args.commonscat == '' then
args.commonscat = t
end
end
function mu.getLangTable( wikiLang, localLang )
local langs = { wikiLang }
for i, lang in ipairs( mi.langs ) do
table.insert( langs, lang )
end
if mu.isSet( localLang ) and localLang ~= wikiLang then
table.insert( langs, localLang )
end
return langs
end
-- getting names from Wikidata
function mu.getNamesFromWikidata( args, fromWikidata, page, country, entity )
-- getting official names
local officialNames =
wu.getMonolingualValues( entity, mi.properties.officialName )
if type( args.name ) == 'boolean' or args.name == '' then
args.name = ''
local langs = mu.getLangTable( page.lang )
for i, lang in ipairs( langs ) do
args.name = officialNames[ lang ]
if args.name then
break
end
end
-- if failed then get labels
if not mu.isSet( args.name ) then
for i, lang in ipairs( langs ) do
args.name = wu.getLabel( entity, lang, true ) -- no fallback
if args.name then
break
end
end
args.name = args.name or ''
end
if args.name ~= '' then
mu.addMaintenance( 'nameFromWD' )
fromWikidata.name = true
end
end
-- get local name if no name is available
if args.name == '' and
not ( type( args.nameLocal ) == 'string' and args.nameLocal ~= '' ) then
args.nameLocal = true
-- no local name if country and wiki language are identical
elseif args.nameLocal == true and page.lang == country.lang then
args.nameLocal = ''
end
if type( args.nameLocal ) == 'string' and args.nameLocal ~= '' then
-- keeping local name in any case for html data
args.addNameLocal = args.nameLocal
return
end
local nameLocal = officialNames[ country.lang ] or ''
if nameLocal == '' then
nameLocal = wu.getLabel( entity, country.lang, true ) or ''
end
if args.nameLocal == true then
args.nameLocal = nameLocal
if args.name == '' and args.nameLocal ~= '' then
args.name = args.nameLocal
args.nameLocal = ''
mu.addMaintenance( 'nameFromWD' )
fromWikidata.name = true
end
if args.name:ulower() == args.nameLocal:ulower() then
args.nameLocal = ''
end
fromWikidata.nameLocal = args.nameLocal ~= ''
elseif page.lang ~= country.lang and args.name ~= nameLocal then
args.addNameLocal = nameLocal
end
end
-- getting link to Wikivoyage
function mu.getArticleLink( args, entity, page )
local title, isRedirect =
wu.getCheckedSitelink( entity, page.lang .. page.globalProject )
if title and title ~= page.text then
args.wikiPage = title
if isRedirect == true then
args.linkIsRedirect = true
end
end
end
-- marker functions
-- returns a single data set from Module:Marker utilities/Maki icons
local function getMaki( key )
mm = mm or require( 'Module:Marker utilities/Maki icons' )
key = key:lower():gsub( '[_%s]+', '-' )
return mm.icons[ key ]
end
local function getMakiIconId( key )
if not mu.isSet( key ) then
return nil
end
key = key:lower():gsub( '[_%s]+', '-' )
if getMaki( key ) then
return key
end
key = mt.types[ key ] and mt.types[ key ].icon
if key and getMaki( key ) then
return key
end
return nil
end
local function addIconToMarker( args )
args.text = ( '[[File:Maki7-%s.svg|x14px|link=|class=noviewer]]' ):format( args.symbol )
args.isIcon = true
end
-- distinguishing marker symbols, default: number
local function makeMarkerProperties( args, show )
args.symbol = args.symbol or ''
local noSymbol = args.symbol == ''
if args.symbol == '' and show.poi and show.symbol then
args.symbol = getMakiIconId( args.typeTable[ 1 ] ) or ''
end
local isIcon = getMaki( args.symbol )
if args.symbol == '' or args.symbol == 'number' then
args.symbol = '-number-' .. args.group
elseif args.symbol == 'letter' then
args.symbol = '-letter-' .. args.group
elseif args.symbol:len() == 1 and args.symbol:match( '%w' ) then
args.text = args.symbol:upper()
mu.addMaintenance( 'numberUsed' )
elseif args.symbol ~= '' and args.text == '' and isIcon then
addIconToMarker( args )
elseif args.symbol ~= '' and not isIcon then
args.text = mi.texts.closeX
args.isIcon = true
args.group = 'error'
mu.getColor( args )
mu.addMaintenance( noSymbol and 'unknownMAKI' or 'unknownIcon' )
end
end
-- making marker symbol
function mu.makeMarkerSymbol( args, show, frame )
local title = args.givenName.all
local extraClasses = args.group == 'error' and ' voy-listing-map-is-error' or ''
if mu.isSet( args.copyMarker ) then
local copyClass = 'voy-listing-map voy-copy-marker plainlinks printNoLink' ..
extraClasses
return tostring( mw.html.create( 'span' )
:addClass( copyClass )
:css( colorAdjust )
-- display will be replaced by [[MediaWiki:Gadget-GeneralChanges.js]] script
:css( { display = 'none' } )
:attr( { ['data-copy-marker-attribute'] = args.copyMarker:match( 'Q%d+' )
and 'data-wikidata' or 'data-name', title = mi.texts.tooltip,
['data-copy-marker-content'] = args.copyMarker } )
)
end
makeMarkerProperties( args, show )
if args.isIcon then
extraClasses = extraClasses .. ' voy-listing-map-is-symbol' ..
-- set image color to white
( args.inverse and '' or ' voy-listing-map-inverse-img' )
end
local lon = tonumber( args.long )
local lat = tonumber( args.lat )
local tagArgs = {
zoom = tonumber( args.zoom ),
latitude = lat,
longitude = lon,
show = mg.showAll,
}
if mu.isSet( args.text ) then
tagArgs.text = args.text
tagArgs.class = 'no-icon'
end
if mu.isSet( args.mapGroup ) then
tagArgs.group, tagArgs.show = args.mapGroup, args.mapGroup
else
tagArgs.group = args.groupTranslated
end
if mu.isSet( args.image ) then
tagArgs.description = '[[File:' .. args.image .. '|100x100px|' .. title .. ']]'
end
local geoJson = {
type = 'Feature',
geometry = {
type = 'Point',
coordinates = { lon, lat }
},
properties = {
title = title,
description = tagArgs.description,
['marker-symbol'] = args.symbol,
['marker-color'] = args.color,
['marker-size'] = 'medium',
}
}
return tostring( mw.html.create( 'span' )
:addClass( 'voy-listing-map plainlinks printNoLink' .. extraClasses )
:attr( 'title', mi.texts.tooltip )
:css( colorAdjust )
:css( { ['background-color'] = args.color, color = 'inherit' } )
-- frame:extensionTag is expensive
:wikitext( frame:extensionTag( 'maplink', mw.text.jsonEncode( geoJson ), tagArgs ) )
)
end
-- icon functions
function mu.makeStatusIcons( args )
local result = ''
for i, v in ipairs( args.statusTable ) do
result = result .. mu.makeSpan( ' ', 'voy-listing-status voy-listing-status-' .. v,
false, { title = mi.statuses[ v ].label }, colorAdjust )
if mi.statuses[ v ].category then
result = result .. ( '[[Category:%s]]' ):format( mi.statuses[ v ].label )
end
end
return result
end
function mu.addLinkIcon( classes, link, title, text, mainClass )
local span = mu.makeSpan( ' ', nil, false, { title = title, ['data-icon'] = text },
colorAdjust ) -- space to keep the span tag
local lFormat = ( link:find( '^https?://' ) or link:find( '^//' ) )
and '[%s %s]' or '[[%s|%s]]'
local iconLink = mw.ustring.format( lFormat, link, span )
-- add leading space for wikidata icon which is necessary if visible
if text == 'wikidata' then
iconLink = mu.makeSpan( ' ', 'voy-listing-icon-with-space', true ) .. iconLink
end
mainClass = mainClass or 'voy-listing-icon'
return mu.makeSpan( iconLink, mainClass .. ' ' .. classes )
end
-- adding linked sister icons
local function addSisterIcons( icons, sisters, name, id )
local icon
for i, key in ipairs( { 'wikivoyage', 'wikipedia', 'commons', 'maps', 'wikidata' } ) do
if mu.isSet( sisters[ key ] ) then
icon = mu.addLinkIcon( 'voy-listing-sister-' .. key, sisters[ key ],
mw.ustring.format( mi.iconTitles[ key ], name, id ), key )
table.insert( icons, icon )
end
end
-- return true if only Wikidata icon
return mu.isSet( sisters.wikidata ) and #icons == 1
end
-- getting sister project links
local function getWikiLink( langArray, wiki, entity, wikilang )
local prefix = wiki == 'wiki' and 'w:' or 'voy:'
local link
for i, lang in ipairs( langArray ) do
if lang ~= '' then
link = wu.getFilteredSitelink( entity, lang .. wiki )
if link then
prefix = prefix .. ( lang ~= wikilang and ( lang .. ':' ) or '' )
return prefix .. link
end
end
end
return ''
end
-- adding Wikimedia sister project icons
local function makeSisterIcons( icons, args, page, country, entity )
local sisters = {
commons = '', -- link to Commons category
maps = '', -- link to Map Sources
wikidata = '', -- link to Wikidata
wikipedia = '', -- link to Wikipedia
wikivoyage = '', -- link to another branch, usually en, as a sister link
}
if mu.isSet( args.wikipedia ) then
sisters.wikipedia = 'w:' .. args.wikipedia
end
if mu.isSet( args.wikidata ) then
local langs = mu.getLangTable( page.lang, country.lang )
if sisters.wikipedia == '' then
sisters.wikipedia = getWikiLink( langs, 'wiki', entity, page.lang )
end
if args.wikiPage == '' then
table.remove( langs, 1 ) -- exclude page.lang
sisters.wikivoyage = getWikiLink( langs, page.globalProject, entity, page.lang )
if sisters.wikivoyage ~= '' then
mu.addMaintenance( 'linkToOtherWV' )
end
end
sisters.wikidata = 'd:' .. args.wikidata
end
if args.commonscat ~= '' then
sisters.commons = 'c:Category:' .. args.commonscat
end
if args.lat ~= '' and args.long ~= '' then
sisters.maps = mw.ustring.format( mi.map.coordURLformat, page.lang, args.latMs,
args.longMs, mw.uri.encode( country.extra ), mw.uri.encode( args.givenName.name ) )
end
return addSisterIcons( icons, sisters, args.givenName.name, args.wikidata )
end
-- creating social media icons including value check
local function makeSocial( icons, args, fromWikidata, name )
local domain, span, t, which
for i, service in ipairs( mi.services ) do
-- check values first
t = args[ service.key ] or ''
domain = type( service.url ) == 'string' and service.url or service.url[ 1 ]
domain = domain:gsub( 'com/.*', 'com/' )
if t ~= '' then
if t:match( '^http' ) then
if not t:find( 'https', 1, true ) then
t = t:gsub( '^http', 'https' )
mu.addMaintenance( 'wrongSocialUrl', service.key )
end
if isUrl( t ) > 1 or
not t:match( '^' .. domain .. '.+$' ) then
t = ''
mu.addMaintenance( 'wrongSocialUrl', service.key )
end
if t ~= '' and not fromWikidata[ service.key ] then
mu.addMaintenance( 'socialUrlUsed', service.key )
end
else
local match = false
local sp = service.pattern
if type( sp ) == 'string' then
sp = { sp }
end
for i = 1, #sp do
if mw.ustring.match( t, sp[ i ] ) then
match = true
which = i
break
end
end
if not match then
t = ''
mu.addMaintenance( 'wrongSocialId', service.key )
end
end
end
args[ service.key ] = t
-- create symbol link
if t ~= '' then
if not t:find( domain, 1, true ) then
-- multiple service urls
local formatStr = type( service.url ) == 'string' and service.url or
service.url[ which ]
t = mw.ustring.format( formatStr, t )
end
span = mu.addLinkIcon( 'voy-listing-social-media-' ..
service.key .. mu.addWdClass( fromWikidata[ service.key ] ), t,
mw.ustring.format( mi.iconTitles[ service.key ], name ), service.key,
'voy-listing-social-media' )
table.insert( icons, span )
end
end
end
function mu.makeIcons( args, page, country, entity, show, fromWikidata )
local icons = {}
local onlyWikidata = mi.options.showSisters and not show.nositelinks and
makeSisterIcons( icons, args, page, country, entity )
if show.socialmedia then
makeSocial( icons, args, fromWikidata, args.givenName.name )
end
if #icons > 0 then
return ( onlyWikidata and '' or mi.texts.space ) .. table.concat( icons, '' )
else
return ''
end
end
-- output functions
local function removeStars( args )
for i, param in ipairs( mi.options.noStarParams ) do
if mu.isSet( args[ param ] ) and args[ param ]:find( '*', 1, true ) then
args[ param ] = args[ param ]:gsub( '%*+', '' )
args[ param ] = mw.text.trim( args[ param ] )
mu.addMaintenance( 'nameWithStar' )
end
end
end
local function makeAnchorId( name )
if name and not name:match( '^Q%d+$' ) then
name = mw.uri.anchorEncode( name )
end
return mw.ustring.format( mi.texts.anchor, name )
end
-- getting name table with linked and unlinked names
local function getName( name, pageTitle )
local r = {
all = '', -- name or linked name
name = '', -- only name
pageTitle = '', -- if pageTitle ~= '' name is already linked
}
if type( name ) ~= 'string' or name == '' then
return r
end
local s
local t, c = mw.ustring.gsub( name, '^(.*)%[%[(.*)%]%](.*)$', '%2' )
if c > 0 then -- is / contains [[...]]
t = mw.text.trim( t )
r.all = '[[' .. t .. ']]'
s, c = mw.ustring.gsub( t, '^(.*)|(.*)$', '%2' )
if c > 0 then -- is [[...|...]]
r.name = mw.text.trim( s )
r.pageTitle = mw.ustring.gsub( t, '^(.*)|(.*)$', '%1' )
r.pageTitle = mw.text.trim( r.pageTitle )
else
r.name = t
r.pageTitle = t
end
else
r.name = name
r.all = name
if mu.isSet( pageTitle ) then
r.pageTitle = pageTitle
r.all = '[[' .. pageTitle .. '|' .. name .. ']]'
r.fromWD = true
end
end
removeStars( r, { 'name', 'all' } )
return r
end
-- create givenName, displayName tables
function mu.prepareNames( args )
local function simplifyString( s, length )
s = mw.ustring.sub( s, 1, length )
s = mw.ustring.gsub( s, "[%.'" .. '"“”„‟«»‘’‚‛‹›]', '' )
s = mw.ustring.gsub( s, '[-‐‑‒–—―]', ' ' )
return s:ulower():gsub( '%s%s+', ' ' )
end
local function removeDuplicate( value1, key2 )
if not mu.isSet( value1 ) or not mu.isSet( args[ key2 ] ) then
return
end
local minLen = math.min( mw.ustring.len( value1 ), mw.ustring.len( args[ key2 ] ) )
if simplifyString( value1, minLen ) == simplifyString( args[ key2 ], minLen ) then
args[ key2 ] = ''
end
end
-- use local name if name is not given
if args.name == '' and args.nameLocal ~= '' then
args.name = args.nameLocal
args.nameLocal = ''
end
if args.name == args.nameMap then
args.nameMap = ''
end
-- missing name
if args.name == '' then
args.name = mi.texts.missingName
mu.addMaintenance( 'missingNameMsg' )
end
-- names shall not contain tags or template calls
if args.name:find( '<', 1, true ) or args.name:find( '{{', 1, true ) or
args.nameMap:find( '<', 1, true ) or args.nameMap:find( '{{', 1, true ) or
args.nameLocal:find( '<', 1, true ) or args.nameLocal:find( '{{', 1, true ) then
mu.addMaintenance( 'malformedName' )
end
removeStars( args )
-- handling linked names like [[article|text]]
args.displayName = getName( args.name, args.wikiPage )
if mu.isSet( args.nameMap ) then
args.givenName = getName( args.nameMap, args.wikiPage )
else
-- real copy
args.givenName = {}
args.givenName.all = args.displayName.all
args.givenName.name = args.displayName.name
args.givenName.pageTitle = args.displayName.pageTitle
end
-- reset args.linkIsRedirect if Wikidata link is not used
-- args.linkIsRedirect is set by mu.getArticleLink()
if not args.displayName.fromWD then
args.linkIsRedirect = nil
end
-- remove identical names
removeDuplicate( args.givenName.name, 'nameLocal' )
removeDuplicate( args.givenName.name, 'alt' )
removeDuplicate( args.givenName.name, 'comment' )
removeDuplicate( args.nameLocal, 'alt' )
removeDuplicate( args.alt, 'comment' )
removeDuplicate( args.directions, 'directionsLocal' )
removeDuplicate( args.address, 'addressLocal' )
end
function mu.prepareCoordinates( args )
local dec
args.latDMS, dec, args.latMs = cd.getDMSString( args.lat, 4, 'lat', '', '', mi.map.defaultDmsFormat )
args.longDMS, dec, args.longMs = cd.getDMSString( args.long, 4, 'long', '', '', mi.map.defaultDmsFormat )
end
local function _makeAirport( code, args )
local span = mu.makeSpan( args[ code ],
'voy-listing-' .. code .. '-code' .. mu.addWdClass( true ) )
return mu.makeSpan( mw.ustring.format( mi.texts[ code ], span ),
'voy-listing-airport voy-listing-' .. code )
end
local function makeAirport( args, show )
if show.noairport then
return ''
else
local t = args.type:gsub( ',.*$', '' ) -- only first type
if mt.types[ t ] and not mt.types[ t ].useIATA then
return ''
end
end
if mu.isSet( args.iata ) then
return _makeAirport( 'iata', args )
elseif mu.isSet( args.icao ) then
return _makeAirport( 'icao', args )
else
return ''
end
end
-- creating a list of nick names etc.
local function makeNameAffix( args, page, country, addClass, show )
local result = {}
if mi.options.showLocalData then
if mu.isSet( args.nameLocal ) then
table.insert( result,
mu.languageSpan( args.nameLocal, mi.texts.hintName, page, country,
'voy-listing-name-local' .. addClass ) )
end
if mu.isSet( args.nameLatin ) then
table.insert( result, mu.makeSpan( args.nameLatin,
'voy-listing-name-latin', false, { title = mi.texts.hintLatin,
lang = mu.isSet( country.lang ) and ( country.lang .. '-Latn' ) or nil } ) )
end
end
for i, key in ipairs( { 'alt', 'comment' } ) do
if mu.isSet( args[ key ] ) then
table.insert( result, mu.makeSpan( args[ key ], 'voy-listing-' .. key ) )
end
end
mu.tableInsert( result, makeAirport( args, show ) )
if #result == 0 then
return ''
end
return mu.makeSpan( mu.parentheses( table.concat( result, mu.comma ) ),
'voy-listing-add-names p-nickname nickname' )
end
-- replace brackets in names
local function replaceBrackets( s )
s = s:gsub( '%[', '[' ):gsub( '%]', ']' )
return s
end
-- creating (linked) name and its affix
function mu.makeName( result, args, show, page, country, nameClass, localClass )
local s = ''
local r = {}
nameClass = nameClass ..
( args.displayName.fromWD and ' voy-listing-link-from-wd' or '' )
-- clear redirect wiki link if required
if args.linkIsRedirect and not show.wikilink then
args.displayName.pageTitle = ''
args.displayName.all = args.displayName.name
args.linkIsRedirect = nil
nameClass = nameClass .. ' voy-listing-unused-redirect'
mu.addMaintenance( 'unusedRedirect' )
end
if args.linkIsRedirect then
nameClass = nameClass .. ' mw-redirect voy-listing-link-is-redirect'
mu.addMaintenance( 'linkIsRedirect' )
end
if mu.isSet( args.url ) and args.displayName.pageTitle == '' then
s = '[' .. args.url .. ' '
.. replaceBrackets( args.displayName.name ) .. ']'
else
s = args.displayName.all
end
if mu.isSet( args.nameExtra ) then
s = s .. ' ' .. args.nameExtra
end
-- insert name
if s ~= '' then
local attr = { style = args.styles }
s = mu.makeSpan( s, 'voy-listing-name p-name fn org' .. nameClass ..
( args.styleClass and args.styleClass or '' ), true, attr )
if mu.isSet( args.metadata ) then
s = s .. args.metadata
end
table.insert( r, s )
end
-- insert separate url icon
if mu.isSet( args.url ) and args.displayName.pageTitle ~= '' then
-- both article and web links
table.insert( r, mu.addLinkIcon( 'voy-listing-url', args.url,
mi.iconTitles.internet, 'internet' ) )
end
-- insert name affix
mu.tableInsert( r, makeNameAffix( args, page, country, localClass, show ) )
if #r > 0 then
table.insert( result, table.concat( r, mi.texts.space ) )
end
end
function mu.parentheses( s, trim )
if not mu.isSet( s ) then
return ''
end
local formatter = mi.texts.parentheses
if trim then
formatter = mw.text.trim( formatter )
end
return mw.ustring.format( formatter, s )
end
-- getting DMS coordinates
function mu.dmsCoordinates( args, page, country, fromWD, noBrackets )
local function coordSpan( title, text )
return mu.makeSpan( text, 'coordStyle', false, { title = title } )
end
local r = '[' .. mw.ustring.format( mi.map.coordURLformat, page.lang, args.latMs, args.longMs,
mw.uri.encode( country.extra ), mw.uri.encode( args.givenName.name ) ) ..
' ' .. coordSpan( mi.texts.latitude, args.latDMS ) ..
' ' .. coordSpan( mi.texts.longitude, args.longDMS ) .. ']'
r = noBrackets and r or mu.parentheses( r )
return mu.makeSpan( r, 'voy-listing-dms-coordinates printNoLink plainlinks'
.. mu.addWdClass( fromWD ) )
end
-- prepare value s for data attribute and replace all entities by characters
local function data( s )
return mu.isSet( s ) and mw.text.decode( s, true ) or nil
end
-- adding wrapper and microformats
function mu.makeWrapper( result, args, page, country, show, list, frame )
if not mu.isSet( args.nameLocal ) and mu.isSet( args.addNameLocal ) then
args.nameLocal = args.addNameLocal
end
if not mu.isSet( args.addressLocal ) and mu.isSet( args.addAddressLocal ) then
args.addressLocal = args.addAddressLocal
end
local wrapper = mw.html.create( show.inline and 'span' or 'div' )
:addClass( string.format( 'voy-%s vcard h-card', args.template ) )
if args.noGpx then
wrapper:addClass( 'voy-listing-no-gpx' )
end
if show.outdent and not show.inline then
wrapper:addClass( 'voy-listing-outdent' )
end
if show.inlineSelected or args.template == 'Marker' then
wrapper:addClass( 'voy-listing-inline' )
end
if mu.isSet( args.copyMarker ) or not show.poi then
wrapper:addClass( 'voy-without-marker' )
end
if #args.statusTable > 0 then
wrapper:addClass( 'voy-listing-with-status' )
end
if args.givenName.name ~= mi.texts.missingName then
wrapper:attr( 'data-name', data( args.givenName.name ) )
end
if not ( mu.isSet( args.copyMarker ) and args.copyMarker == args.wikidata ) then
local id = mu.isSet( args.wikidata ) and args.wikidata or args.id
if mu.isSet( id ) then
wrapper:attr( 'id', makeAnchorId( id ) )
end
end
local editClass = 'voy-listing-edit'
if mu.isSet( args.sectionFrom ) then
args.sectionFrom = replaceWithSpace( args.sectionFrom, '[_]+' )
if args.sectionFrom ~= page.text then
editClass = 'voy-listing-no-edit'
end
end
wrapper:addClass( editClass )
wrapper:attr( 'data-location', data( page.subpageText ) )
:attr( 'data-location-qid', page.entityId )
:attr( 'data-country', data( country.iso_3166 ) )
:attr( 'data-lang', data( country.lang ) )
:attr( 'data-country-calling-code', data( country.cc ) )
:attr( 'data-trunk-prefix', data( country.trunkPrefix ) )
:attr( 'data-currency', data( country.addCurrency ) )
:attr( 'data-coord-from', args.coordFrom )
local arg
for key, value in pairs( list ) do
if mu.isSet( args[ key ] ) then
arg = args[ key ]:gsub( '<[^<>]*>', '' ) -- remove html tags
wrapper:attr( value, data( arg ) )
end
end
if not show.name then
wrapper:node( mw.html.create( 'span' )
:addClass( 'voy-listing-name p-name fn org' )
:css( 'display', 'none' )
:wikitext( args.givenName.name )
)
end
wrapper:wikitext( result )
if not show.noCoord then
wrapper:node( mw.html.create( 'span' )
:addClass( 'voy-listing-coordinates p-geo geo' )
:css( 'display', 'none' )
:node( mw.html.create( 'span' )
:addClass( 'p-latitude latitude' )
:wikitext( args.lat )
)
:node( mw.html.create( 'span' )
:addClass( 'p-longitude longitude' )
:wikitext( args.long )
)
)
end
wrapper = tostring( wrapper )
-- adding coordinates to Mediawiki database
-- frame:callParserFunction is expensive
if not show.noCoord and mi.options.secondaryCoords then
wrapper = wrapper .. frame:callParserFunction{ name = '#coordinates',
args = { args.lat, args.long, country.extra, name = args.givenName.name } }
end
return wrapper
end
function mu.getPageData()
local page = mw.title.getCurrentTitle()
page.langObj = mw.getContentLanguage()
page.lang = page.langObj:getCode()
page.langName = mw.language.fetchLanguageName( page.lang, page.lang )
page.isRTL = page.langObj:isRTL()
page.entityId = mw.wikibase.getEntityIdForCurrentPage() -- can be nil
page.siteName = mw.site.siteName
page.globalProject = page.siteName:lower()
if page.globalProject == 'wikipedia' then
page.globalProject = 'wiki'
end
return page
end
return mu
8norefisacvq8879ya3tooh1xw2972o
Modulo:Marker utilities/i18n
828
4808
72070
71596
2026-04-07T11:17:15Z
RolandUnger
168
Update
72070
Scribunto
text/plain
-- Separating code from internationalization
return {
-- module administration
moduleInterface = {
suite = 'Marker utilities',
sub = 'i18n',
serial = '2026-04-06',
item = 65441686
},
dates = { yyyymmdd = { p = '^20[0-5]%d%-[01]?%d%-[0-3]?%d$', f = 'j. M Y' },
yyyy = { p = '^20[0-5]%d$', f = 'Y' },
yy = { p = '^[0-5]%d$', f = 'Y' },
mmdd = { p = '^[01]?%d%-[0-3]?%d$', f = 'j. M' },
dd = { p = '^[0-3]?%d%.?$', f = 'j.' },
mm = { p = '^[01]?%d%.?$', f = 'M' },
lastedit = { f = 'M Y' },
asOf = { f = 'n/Y' }
},
fileExtensions = { 'tif', 'tiff', 'gif', 'png', 'jpg', 'jpeg', 'jpe',
'webp', 'xcf', 'ogg', 'ogv', 'svg', 'pdf', 'stl',
'djvu', 'webm', 'mpg', 'mpeg' },
months = { 'Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli',
'August', 'September', 'Oktober', 'November', 'Dezember' },
monthAbbr = { 'Jan%.?', 'Feb%.?', 'Mär%.?', 'Apr%.?', 'Mai%.?', 'Jun%.?',
'Jul%.?', 'Aug%.?', 'Sep%.?', 'Okt%.?', 'Nov%.?', 'Dez%.?' },
-- Map related constants
map = {
coordURLformat = '//%s.wikivoyage.org/w/index.php?title=Special%%3AMapsources¶ms=%s_%s_%s&locname=%s',
defaultDmsFormat = 'f1', -- see: Module:Coordinates/i18n
defaultSiteType = 'type:landmark_globe:earth',
defaultZoomLevel = 17,
maxZoomLevel = 19, -- also to set in Module:GeoData, Module:Mapshape utilities/i18n
},
-- Wikidata properties
properties = {
appliesToJurisdiction = 'P1001',
appliesToPart = 'P518',
appliesToPeople = 'P6001',
capacity = 'P1083',
centerCoordinates = 'P5140',
commonsCategory = 'P373',
coordinates = 'P625',
endTime = 'P582', -- time
headquartersLoc = 'P159',
image = 'P18',
instanceOf = 'P31',
iso4217 = 'P498',
languageOfName = 'P407',
mainCategory = 'P910',
maximumAge = 'P4135',
minimumAge = 'P2899',
nameInNativeLang = 'P1559',
occupation = 'P106',
of = 'P642',
officialName = 'P1448',
pointInTime = 'P585',
propertyScope = 'P5314', -- for fees
quantity = 'P1114',
retrieved = 'P813',
roomNumber = 'P8733',
startTime = 'P580', -- time, for fees
streetAddress = 'P6375',
subclassOf = 'P279',
unitSymbol = 'P5061',
use = 'P366',
validInPeriod = 'P1264'
},
-- Groups of Wikidata properties
propTable = {
contactComments = { 'P366', 'P518', 'P642', 'P1001', 'P1559', 'P106' },
feeComments = { 'P5314', 'P518', 'P6001', 'P1264', 'P585', 'P2899',
'P4135', 'P642', 'P580' },
policyComments = { 'P518', 'P1001', 'P6001' },
quantity = { 'P1114', 'P1083' }
},
-- Wikidata properties representing a qualifier
qualifiers = {
mobilePhone = 'Q17517',
P8733 = 'Q180516',
roomNumber = 'Q180516'
},
-- Languages for fallbacks, except wiki language
langs = { 'en', 'fr' }, -- array can be empty
-- Display and performance options for vCard / Listing and Marker modules
-- additional options in Module:VCard/i18n
options = {
excludeColorTypes = true,
normalizeValues = { 'type', 'subtype', 'show', 'status', 'symbol' },
noStarParams = { 'nameExtra', 'nameLocal', 'alt', 'comment' },
noTypeMsgs = false, -- prevents display of maintenance( typeFromWD, typeIsGroup )
parameters = { 'commonscat', 'country', 'id', 'localLang', 'nameExtra', 'wikipedia' }, -- parameter is used
showLocalData = true, -- names, addresses, directions
showSisters = true, -- possible values true, false, 'atEnd'
usePropertyCateg = true, -- create maintenance categories for Wikidata properties
useTypeCateg = true, -- create maintenance categories for marker types
markerMetadata = true, -- add metadata at marker templates
-- text limit of content/description parameter
contentLimit = 1000,
groupsWithLimit = { buy = 1, drink = 1, eat = 1, sleep = 1 },
-- Wikidata related constants
searchLimit = 4, -- count of levels for P31-P279 search
-- useful but not necessary function calls
WDmediaCheck = false, -- check file names retrieved from Wikidata
mediaCheck = false, -- for better performance, otherwise expensive
-- mw.title.new( 'Media:' .. image ) call is used
secondaryCoords = false, -- adding listing coordinates to article database
-- using #coordinates parser function
skipPathCheck = false -- for URL check, see Module:UrlCheck
},
-- strings
texts = {
asOf = '; Stand %s', -- with semicolon separator
from = 'ab %s',
fromTo = '%s–%s',
to = 'bis %s',
fromTo2 = '%s bis %s',
-- General, i18n
-- black x-like cross
closeX = '[[File:Close x - black.png|15px|link=|class=noviewer|Unbekanntes Marker-Symbol]]',
missingName = 'Name fehlt',
-- In case of CJK languages no spaces are used with punctuation
-- Enumeration commas. voy-listing-comma is used for alt names only
comma = '<span class="voy-listing-comma">, </span>', -- with zero-width space
commaSeparator = ', ',
period = '.',
periodSeparator= '. ',
-- Space following a punctuation mark
space = ' ',
nbSpace = ' ',
parentheses = ' (%s)',
emph = "''%s''",
-- Formatting numbers: replacement patterns
decimalPoint = ',',
groupSeparator = '.',
-- Anchor id
anchor = 'vCard_%s',
-- Marker
CategoryNS = { '[Cc]ategory', '[Kk]ategorie' },
FileNS = { '[Ff]ile', '[Ii]mage', '[Dd]atei', '[Bb]ild' },
latitude = 'Breitengrad',
longitude = 'Längengrad',
tooltip = 'Click auf den Marker öffnet die Karte direkt.',
-- vCard / Listing module
checkin = 'Check-in: %s',
checkout = 'Check-out: %s',
closed = 'Geschlossen: %s',
closedPattern = '^[Gg]eschlossen:?%s*',
editInSource = 'im Quellartikel bearbeiten',
email = 'E-Mail: %s',
expirationPeriod = 'now - 3 years',
fax = 'Fax: %s',
hintName = 'Name in der Landessprache %s',
hintLatin = 'Name in lateinischer Umschrift',
hintAddress = 'Anschrift in der Landessprache %s',
hintAddress2 = 'Anschrift in %s',
hintDirections = 'Wegbeschreibung in der Landessprache %s',
hours = 'Geöffnet: %s',
iata = '[[International Air Transport Association|IATA]]: %s',
icao = '[[Internationale Zivilluftfahrt-Organisation|ICAO]]: %s',
lastedit = 'letzte Änderung: %s',
lasteditNone = 'keine Angabe',
maybeOutdated = '(Angaben möglicherweise veraltet)[[Category:VCard: Angaben veraltet]]',
mobile = 'Mobil: %s',
payment = 'Akzeptierte Zahlungsarten: %s',
phone = '<abbr title="Telefon">Tel.</abbr>: %s',
price = 'Preis: %s',
subtype = 'Merkmal: %s.',
subtypes = 'Merkmale: %s.',
subtypeAbbr = '<abbr title="%s">%s</abbr>',
subtypeFile = '[[File:%s|x14px|link=|class=noviewer voy-listing-subtype-icon|%s]]',
-- for subtype icons like Michelin stars
subtypeSpan = '<span title="%s">%s</span>',
subtypeWithCount = '%d %s',
tollfree = '<abbr title="Telefon">Tel.</abbr> gebührenfrei: %s'
},
-- format strings for mu.addMaintenance
formats = {
category = '[[Category:%s]]',
error = ' <span class="error">%s</span>',
hint = ' <span class="voy-listing-check-recommended" style="display: none;">%s</span>'
},
-- maintenance
maintenance = {
-- general
properties = '[[Category:Seiten, die die Wikidata-Eigenschaft %s benutzen]]',
type = { category = 'Seiten mit dem Markertyp %s' },
group = { category = 'Seiten mit der Markergruppe %s' },
urlWithIP = { category = 'URL enthält IP-Adresse', hint = 'URL enthält IP-Adresse' },
wrongUrl = { category = 'URL ist ungültig', err = 'URL ist ungültig' },
commonscatWD = { category = 'VCard: Parameter commonscat zusammen mit wikidata benutzt' },
contentTooLong = { category = 'VCard: Beschreibung ist zu lang', err = 'Beschreibung ist zu lang' },
currencyTooltip= { category = 'VCard: Währungstooltips eingesetzt' },
dmsCoordinate = { category = 'VCard: DMS-Koordinate', hint = 'DMS-Koordinate' },
duplicateAliases = { category = 'VCard: Doppelte Aliase', err = 'Doppelte Aliase: %s' },
headquarters = { category = 'VCard: Koordinate der Hauptverwaltung' },
labelFromWD = { category = 'VCard: Label aus Wikidata', hint = 'Label aus Wikidata' },
linkIsRedirect = { category = 'VCard: Artikellink ist Weiterleitung' },
linkToOtherWV = { category = 'VCard: Anderes Wikivoyage verlinkt' },
malformedName = { category = 'VCard: Fehlerhafter Name', err = 'Fehlerhafter Name' },
missingImg = { category = 'VCard: Datei existiert nicht', err = 'Nicht vorhandenes Bild: %s' },
missingNameMsg = { category = 'VCard: Ohne Namen', err = 'Name fehlt' },
missingType = { category = 'VCard: Typ fehlt', err = 'Fehlender Typ' },
nameFromWD = { category = 'VCard: Name aus Wikidata bezogen', err = 'Name aus Wikidata bezogen' },
nameWithStar = { category = 'VCard: Name enthält Stern', err = 'Name enthält Stern' },
outdated = { category = 'VCard: Ereignis veraltet', err = 'Ereignis veraltet' },
parameterUsed = { category = 'VCard: Parameter %s benutzt' },
deleteShowCopy = { category = 'VCard: show=copy gelöscht', hint = 'show=copy gelöscht' },
showInlineUsed = { category = 'VCard: show=inline gesetzt' },
showNoneUsed = { category = 'Marker: show=none gesetzt' },
showPoiUsed = { category = 'VCard: show=poi gesetzt' },
typeFromWDchain= { category = 'VCard: Typ aus Wikidata-Kette bezogen', hint = 'Typ aus Wikidata bezogen' },
typeIsGroup = { category = 'VCard: Typ ist Gruppenbezeichnung', hint = 'Typ ist Gruppenbezeichnung' },
typeIsColor = { category = 'VCard: Typ ist Farbbezeichnung', hint = 'Typ ist Farbbezeichnung' },
-- typeIsColor is not used if excludeColorTypes = true
unknownCountry = { category = 'VCard: Unbekannter Ländercode', err = 'Unbekannter Ländercode' },
unknownGroup = { category = 'VCard: Unbekannte Gruppe', err = 'Unbekannte Gruppe' },
unknownLanguage= { category = 'VCard: Unbekannte Landessprache', hint = 'Unbekannte Landessprache' },
unknownParam = { category = 'VCard: Unbekannte Parameter', err = 'Unbekannter Parameter: %s' },
unknownParams = { category = 'VCard: Unbekannte Parameter', err = 'Unbekannte Parameter: %s' },
unknownPropertyLanguage= { category = 'VCard: Unbekannte Sprache für Eigenschaft', hint = 'Unbekannte Sprache für Eigenschaft' },
unknownStatus = { category = 'VCard: Unbekannter Status', err = 'Unbekannter Status' },
unknownType = { category = 'VCard: Unbekannter Typ', err = 'Unbekannter Typ: %s' },
unusedRedirect = { category = 'VCard: Unbenutzter Weiterleitungs-Sitelink' },
urlIsSocialMedia = { category = 'VCard: URL stammt von Social-Media-Dienst', err = 'URL stammt von Social-Media-Dienst' },
wikidata = { category = 'VCard: Einsatz von Wikidata' },
wrongCoord = { category = 'VCard: Fehlerhafte Koordinate', err = 'Fehlerhafte Koordinate' },
wrongImgName = { category = 'VCard: Fehlerhafter Mediendateiname', err = 'Fehlerhafter Mediendateiname' },
wrongQualifier = { category = 'VCard: Fehlerhafter Wikidata-Qualifikator', err = 'Fehlerhafter Wikidata-Qualifikator' },
-- Marker module
missingCoord = { category = 'Marker: Ohne Koordinaten', err = 'Länge und/oder Breite fehlt' },
numberUsed = { category = 'Marker: Nummer manuell vergeben' },
unknownIcon = { category = 'Marker: Unbekanntes Symbol' },
-- vCard / Listing module
countryFromWD = { category = 'VCard: Länderdaten aus Wikidata' },
missingCoordVc = { category = 'VCard: Ohne Koordinaten' },
paymentUsed = { category = 'VCard: Zahlungsarten spezifiziert' },
socialUrlUsed = { category = 'VCard: Social-Media-URL verwendet', hint = '%s-URL verwendet' },
unitFromWD = { category = 'VCard: Einheit aus Wikidata', hint = 'Einheit aus Wikidata' },
unknownLabel = { category = 'VCard: Unbekanntes Label oder Id' },
unknownMAKI = { category = 'VCard: Unbekanntes MAKI-Symbol', hint = 'Unbekanntes MAKI-Symbol' },
unknownShow = { category = 'VCard: Unbekannter Wert für show', err = 'Wert(e) für show unbekannt: %s' },
unknownSubtype = { category = 'VCard: Unbekannter Wert für subtype', err = 'Wert(e) für subtype unbekannt: %s' },
unknownUnit = { category = 'VCard: Unbekannte Einheit', hint = 'Unbekannte Einheit' },
unknowWDfeatures = { category = 'VCard: Unbekannte Wikidata-Merkmale', hint = 'Unbekannte Wikidata-Merkmale' },
wdWithGoogleCid = { category = 'VCard: Parameter google-maps zusammen mit wikidata benutzt', hint = 'google-maps mit wikidata benutzt' },
wikidataWithId = { category = 'VCard: Parameter id zusammen mit wikidata benutzt', hint = 'id mit wikidata benutzt' },
wrongDate = { category = 'VCard: Fehlerhaftes Datum', err = 'Fehlerhaftes Datum' },
wrongGoogleCid = { category = 'VCard: Fehlerhafte Google-Maps-Kundenkennung', err = 'Fehlerhafte Google-Maps-Kundenkennung' },
wrongId = { category = 'VCard: Fehlerhafte id', err = 'Fehlerhafte id' },
wrongSocialId = { category = 'VCard: Fehlerhafte Social-Media-Id', err = 'Fehlerhafte %s-Id' },
wrongSocialUrl = { category = 'VCard: Fehlerhafte Social-Media-URL', err = 'Fehlerhafte %s-URL' }
},
iconTitles = {
commons = '%s im Medienverzeichnis Wikimedia Commons',
facebook = '%s auf Facebook',
flickr = '%s auf Flickr',
instagram = '%s auf Instagram',
internet = 'Website dieser Einrichtung',
maps = '%s auf Karten und Routenplanern',
rss = 'RSS-Web-Feed dieser Einrichtung',
tiktok = '%s auf TikTok',
wikidata = '%s (%s) in der Datenbank Wikidata',
wikipedia = '%s in der Enzyklopädie Wikipedia',
wikivoyage = '%s im Reiseführer Wikivoyage in einer anderen Sprache',
x = '%s auf X',
youtube = '%s auf YouTube'
},
-- social media services
services = {
{ key = 'facebook', url = 'https://www.facebook.com/%s', pattern = { '^[-.%d%w][-_.%d%w]+$', '^[^%z\1-,/:-?\91-\94{-~]+/[1-9]%d+$' } },
{ key = 'flickr', url = 'https://www.flickr.com/photos/%s', pattern = '^%d%d%d%d%d+@N%d%d$' },
{ key = 'instagram', url = 'https://www.instagram.com/%s/', pattern = { '^[0-9a-z_][0-9a-z._]+[0-9a-z_]$', '^explore/locations/%d+$' } },
{ key = 'tiktok', url = 'https://www.tiktok.com/@%s', pattern = '^[0-9A-Za-z_][0-9A-Za-z_.]+$' },
{ key = 'x', url = 'https://x.com/%s', pattern = '^[0-9A-Za-z_]+$' },
{ key = 'youtube', url = { 'https://www.youtube.com/channel/%s', 'https://www.youtube.com/%s' },
pattern = { '^UC[-_0-9A-Za-z]+[AQgw]$', '^@[-0-9A-Za-z_.][-0-9A-Za-z_.][-0-9A-Za-z_.]+$' } }
},
--[[ status symbols
g: successive symbol group number
alias: status alias
label: image tag title
category = 1: add maintenance category
--]]
statuses = {
['top-hotel'] = { g = 1, label = 'Top-Hotel', category = 1 },
['top-restaurant'] = { g = 1, label = 'Top-Restaurant', category = 1 },
['top-sight'] = { g = 1, label = 'Top-Sehenswürdigkeit', category = 1 },
recommendation = { g = 1, label = 'Empfehlung' },
none = { g = 2, alias = 'class-0', label = 'Ohne Einstufung' },
stub = { g = 2, alias = 'class-1', label = 'Stub' },
outline = { g = 2, alias = 'class-2', label = 'Artikelentwurf' },
usable = { g = 2, alias = 'class-3', label = 'Brauchbarer Artikel' },
guide = { g = 2, alias = 'class-4', label = 'Vollständiger Artikel' },
star = { g = 2, alias = 'class-5', label = 'Empfehlenswerter Artikel' }
},
-- Marker name styles
-- Colors in Template:VCard/styles.css
nameStyles = {
inherit = 'font-weight: inherit; font-style: inherit;',
italic = 'font-weight: normal; font-style: italic;',
kursiv = 'font-weight: normal; font-style: italic;', -- de: kursiv = italic
normal = 'font-weight: normal; font-style: normal;',
station = 'font-weight: normal; white-space: nowrap; padding-left: 2px; padding-right: 2px;'
},
-- yes/no variants
yesno = {
y = 'y',
yes = 'y',
j = 'y',
ja = 'y',
n = 'n',
no = 'n',
nein = 'n'
},
-- List of currencies without conversion tooltips
noCurrencyConversion = {
-- all = 1, -- no rate conversion tooltips are shown
-- there is no confusion with (uppercase) ALL = "Q125999"
EUR = 1 -- local currency
},
-- Language-dependent sorting substitutes
substitutes = {
{ l = 'ä', as = 'a' },
{ l = 'ö', as = 'o' },
{ l = 'ü', as = 'u' },
{ l = 'ß', as = 'ss' }
}
}
l8iaemub0e970eeefocgasvqhpv3yj2
Modulo:Marker utilities/Types
828
4814
72064
71609
2026-04-07T11:05:29Z
RolandUnger
168
Update
72064
Scribunto
text/plain
--[[
Please use only quotation marks instead of apostrophs for JSON export.
Do not change this modul without need. A change causes the parsing of the
majority of articles. Wishes for new types should be discussed and collected
on Module talk:Marker utilities/Types.
Types should conform to tags in Openstreetmap, if possible.
New types must be entered in Template:Marker/XML and Template:vCard/XML, too.
--]]
return {
-- administration
moduleInterface = {
suite = "Marker utilities",
sub = "types",
serial = "2026-03-27",
item = 65444106
},
types = {
-- do not remove the following line
-- ##start
-- journey and mobility
aerialway = { group = "go", wd = "Q1424016", label = "Seilbahn" },
airline = { group = "go", wd = "Q46970", label = "Fluggesellschaft" },
airport = { group = "go", wd = { "Q1248784", "Q62447", "Q644371" }, useIATA = "1", label = "Flughafen" },
airport_service = { group = "go", label = "Flughafendienst" },
bicycle_parking = { group = "go", wd = "Q16243822", label = "Fahrradparkplatz" },
bicycle_rental = { alias = "bicycle_share", group = "go", wd = { "Q10611118", "Q1358919" }, label = "Fahrradverleih", icon = "bicycle-share" },
bicycle_repair = { group = "go", wd = { "Q96983545", "Q112663579" }, label = "Fahrradreparatur" },
boat_sharing = { group = "go", wd = "Q4931514", label = "Boot-Sharing, Boot-Charter" },
boat_trip = { group = "go", wd = "Q25040412", label = "Bootsfahrt, Schiffstour" },
border_control = { group = "go", wd = "Q218719", label = "Grenzkontrolle" },
bus = { alias = "bus_stop", group = "go", wd = { "Q953806", "Q494829" }, label = "Bushaltestelle" },
car_rental = { group = "go", wd = "Q291240", label = "Autoverleih, Autovermietung" },
car_repair = { group = "go", wd = "Q1310967", label = "Autowerkstatt" },
car_sharing = { group = "go", wd = "Q847201", label = "Carsharing" },
charging_station = { group = "go", wd = { "Q2140665", "Q55956304" }, label = "Ladestation, Stromtankstelle" },
cycle_track = { alias = "cycle_path", group = "go", wd = { "Q25037910", "Q221722" }, label = "Radweg" },
entrance = { group = "go", wd = "Q1137365", label = "Eingang" },
ferry = { group = "go", wd = { "Q100355757", "Q25653", "Q1478783" }, label = "Fähranleger" },
ford = { group = "go", wd = "Q12743", label = "Furt" },
fuel = { alias = "filling_station", group = "go", wd = "Q205495", label = "Tankstelle" },
funicular = { group = "go", wd = "Q142031", label = "Standseilbahnstation" },
harbor = { alias = "port", group = "go", wd = { "Q44782", "Q283202" }, label = "Hafen" },
heliport = { group = "go", wd = "Q502074", label = "Hubschrauberlandeplatz, Heliport" },
junction = { alias = { "road_junction", "intersection" }, group = "go", wd = { "Q1788454", "Q285783" }, label = "Kreuzung" },
landing_site = { group = "go", wd = "Q3631092", label = "Landeplatz" },
left_luggage = { group = "go", wd = "Q21996814", label = "Gepäckaufbewahrung" },
light_railway = { alias = "lrt", group = "go", wd = "Q32680449", label = "Light-Railway-Station" },
marina = { group = "go", wd = "Q721207", label = "Yachthafen, Marina" },
monorail = { group = "go", wd = "Q187934", label = "Monorail-Station" },
motorbike_rental = { group = "go", label = "Motorradverleih" },
motorway_junction = { group = "go", label = "Ausfahrt, Auffahrt, Anschlussstelle, Autobahnkreuz" },
parking = { group = "go", wd = "Q6501349", label = "Parkplatz" },
parking_garage = { group = "go", wd = "Q13218805", label = "Parkhaus" },
pier = { group = "go", wd = "Q863454", label = "Pier, Schiffsanleger" }, -- also jetty
public_transport = { group = "go", wd = "Q178512", label = "Öffentliche Verkehrsmittel" },
quay = { alias = "wharf", group = "go", wd = "Q828909", label = "Kai, Schiffsanleger, Kaje" },
rail = { alias = { "train", "railway", "railway_station" }, group = "go", wd = { "Q55488", "Q55678" }, label = "Bahnhof, Haltepunkt" },
scooter = { group = "go", wd = { "Q193234", "Q502057" }, label = "Scooter, Motorroller, Tretroller" },
service_area = { group = "go", wd = "Q786014", label = "Raststätte, Autohof" },
ship = { group = "go", wd = "Q11446", label = "Schiff" },
shipping_company = { group = "go", label = "Schifffahrtsgesellschaft, Reederei" },
shuttle_bus_service = { group = "go", label = "Shuttlebus-Service" },
station = { group = "go", wd = "Q12819564", label = "Station" },
suburban_rail = { alias = { "suburban_railway", "commuter_rail", "s-bahn" }, group = "go", wd = { "Q1412403", "Q95723" }, label = "S-Bahn-Station, Vorortbahnstation" },
subway = { alias = "metro", group = "go", wd = "Q928830", label = "U-Bahn-Station", icon = "rail-metro" },
taxi = { group = "go", wd = "Q1395196", label = "Taxistand" },
terminal = { group = "go", wd = "Q849706", label = "Terminal" },
toll_station = { group = "go", wd = "Q1364150", label = "Mautstation" },
tram = { group = "go", wd = "Q2175765", label = "Straßenbahnhaltestelle, Tramhaltestelle", icon = "rail-light" },
tunnel = { group = "go", wd = "Q44377", label = "Tunnel" },
waiting_room = { group = "go", wd = "Q674251", label = "Warteraum, Wartesaal" },
waypoint = { group = "go", wd = "Q138081", label = "Wegpunkt" },
-- group types
go = { group = "go", wd = { "Q334166", "Q740752" }, label = "Anreise" },
-- sights: religious sites and monuments
altar = { group = "religion", wd = "Q101687", label = "Altar" },
bahai_temple = { group = "religion", wd = "Q1568313", label = "Bahai-Tempel" },
basilica = { group = "religion", wd = { "Q163687", "Q4846867" }, label = "Basilika" },
buddharupa = { group = "religion", wd = "Q1000809", label = "Buddha-Statue", icon = "religious-buddhist" },
cathedral = { group = "religion", wd = "Q2977", label = "Kathedrale", icon = "religious-christian" },
chapel = { group = "religion", wd = "Q108325", label = "Kapelle", icon = "religious-christian" },
chapel_shrine = { group = "religion", wd = "Q14552192", label = "Heiligenhäuschen" },
church = { group = "religion", wd = { "Q16970", "Q580499" }, label = "Kirche", icon = "religious-christian" },
fire_temple = { group = "religion", wd = "Q115278", label = "Feuertempel" },
gurdwara = { group = "religion", wd = "Q337986", label = "Gurdwara" },
hindu_temple = { group = "religion", wd = "Q842402", label = "Hindutempel" },
lak_mueang = { group = "religion", wd = "Q974127", label = "Lak Müang" },
lourdes_grotto = { group = "religion", wd = "Q1433032", label = "Lourdesgrotte, Mariengrotte" },
mikveh = { group = "religion", wd = "Q211351", label = "Mikwe" },
minaret = { group = "religion", wd = "Q48356", label = "Minarett" },
monastery = { group = "religion", wd = { "Q44613", "Q160742" }, label = "Kloster, Abtei" },
mosque = { group = "religion", wd = "Q32815", label = "Moschee", icon = "religious-muslim" },
nunnery = { group = "religion", wd = "Q6021560", label = "Nonnenkloster" },
pagoda = { group = "religion", wd = "Q199451", label = "Pagode" },
pilgrimage_site = { group = "religion", wd = "Q15135589", label = "Wallfahrtsort" },
sanctuary = { group = "religion", wd = "Q29553", label = "Heiligtum" },
shinto_shrine = { group = "religion", wd = "Q845945", label = "Shintō-Schrein", icon = "religious-shinto" },
shrine = { group = "religion", wd = "Q697295", label = "Schrein" },
stupa = { group = "religion", wd = "Q180987", label = "Stupa" },
summit_cross = { group = "religion", wd = "Q361665", label = "Gipfelkreuz" },
synagogue = { group = "religion", wd = "Q34627", label = "Synagoge", icon = "religious-jewish" },
temple = { group = "religion", wd = { "Q44539", "Q927825", "Q58621988" }, label = "Tempel" },
wat = { group = "religion", wd = "Q427287", label = "Wat" },
wayside_cross = { group = "religion", wd = "Q2309609", label = "Flurkreuz, Wegkreuz" },
wayside_shrine = { group = "religion", wd = { "Q3395121", "Q12661150" }, label = "Bildstock" },
religion = { alias = "religious_site", group = "religion", wd = "Q1370598", label = "Religiöse Stätte" },
-- sights: natural
animal_shelter = { group = "nature", wd = "Q1411287", label = "Tierheim" },
animal_stable = { alias = "stable", group = "nature", wd = { "Q214252", "Q1207909" }, label = "Stall" },
aquarium = { group = "nature", wd = "Q2281788", label = "Aquarium" },
bay = { group = "nature", wd = { "Q39594", "Q17018380" }, label = "Bucht" },
botanical_garden = { group = "nature", wd = "Q167346", label = "Botanischer Garten" },
canal = { group = "nature", wd = "Q12284", label = "Kanal" },
canyon = { group = "nature", wd = "Q150784", label = "Canyon, Schlucht" },
cape = { group = "nature", wd = "Q185113", label = "Kap" },
cave = { group = "nature", wd = "Q35509", label = "Höhle" },
cliff = { group = "nature", wd = "Q107679", label = "Klippe" },
coast = { group = "nature", wd = "Q93352", label = "Küste" },
crater = { group = "nature", wd = "Q3240715", label = "Krater" },
crocodile_farm = { group = "nature", wd = "Q25691", label = "Krokodilfarm" },
depression = { group = "nature", wd = "Q190429", label = "Senke" },
desert = { group = "nature", wd = "Q8514", label = "Wüste" },
dive_site = { group = "nature", wd = "Q2141554", label = "Tauchplatz, Tauchgebiet" },
dog_park = { group = "nature", wd = "Q38516", label = "Hundezone, Hundewiese" },
dolphinarium = { group = "nature", wd = "Q491675", label = "Delfinarium" },
dune = { group = "nature", wd = "Q25391", label = "Düne" },
dyke = { group = "nature", wd = "Q105190", label = "Deich" },
farm = { group = "nature", wd = "Q131596", label = "Bauernhof, Gut" },
fish_pond = { group = "nature", wd = "Q1265665", label = "Fischteich" },
fjord = { group = "nature", wd = "Q45776", label = "Fjord" },
forest = { group = "nature", wd = "Q4421", label = "Wald" },
garden = { group = "nature", wd = "Q1107656", label = "Garten" },
geyser = { group = "nature", wd = "Q83471", label = "Geysir" },
glacier = { group = "nature", wd = "Q35666", label = "Gletscher" },
greenhouse = { group = "nature", wd = "Q165044", label = "Gewächshaus, Treibhaus" },
gulf = { group = "nature", wd = "Q1322134", label = "Golf (Bucht)" },
habitat = { group = "nature", label = "Habitat" },
heath = { group = "nature", wd = "Q27590", label = "Heide" },
hill = { group = "nature", wd = "Q54050", label = "Hügel" },
horticulture = { group = "nature", wd = "Q48803", label = "Gartenbau, Gärtnerei" },
hot_spring = { group = "nature", wd = "Q177380", label = "Thermalquelle" },
island = { group = "nature", wd = "Q23442", label = "Insel" },
lagoon = { group = "nature", wd = "Q187223", label = "Lagune" },
lake = { group = "nature", wd = "Q23397", label = "See, Teich" },
landscape = { group = "nature", wd = "Q107425", label = "Landschaft" },
mangrove = { group = "nature", wd = "Q19756", label = "Mangrove" },
meadow = { group = "nature", wd = "Q7777019", label = "Wiese" },
mountain = { group = "nature", wd = "Q8502", label = "Berg" },
mountain_chain = { group = "nature", wd = "Q2624046", label = "Gebirgszug" },
mountain_pass = { group = "nature", wd = "Q133056", label = "Gebirgspass" },
mountain_range = { group = "nature", wd = "Q46831", label = "Gebirge" },
national_park = { group = "nature", wd = "Q46169", label = "Nationalpark" },
natural_heritage = { group = "nature", wd = "Q386426", label = "Naturerbe" },
natural_monument = { group = "nature", wd = "Q23790", label = "Naturdenkmal" },
nature_reserve = { group = "nature", wd = { "Q158454", "Q179049", "Q473972", "Q759421", "Q20268756" }, label = "Naturschutzgebiet" },
oasis = { group = "nature", wd = "Q43742", label = "Oase" },
palaeontological_site = { group = "nature", wd = "Q9096832", label = "Paläontologische Stätte" },
park = { group = "nature", wd = { "Q22698", "Q728904" }, label = "Park" },
peninsula = { group = "nature", wd = "Q34763", label = "Halbinsel" },
plantation = { group = "nature", wd = "Q188913", label = "Plantage" },
plateau = { group = "nature", wd = "Q75520", label = "Hochebene, Plateau" },
protected_area = { alias = "protectorate", group = "nature", wd = "Q473972", label = "Schutzgebiet" },
reef = { group = "nature", wd = "Q184358", label = "Riff" },
reservoir = { group = "nature", wd = "Q131681", label = "Stausee" },
river = { group = "nature", wd = "Q4022", label = "Fluss" },
river_mouth = { group = "nature", wd = "Q1233637", label = "Flussmündung" },
rock = { group = "nature", wd = { "Q1404150", "Q8063" }, label = "Felsen, Gestein" },
sea = { group = "nature", wd = "Q165", label = "Meer, Ozean" },
spring = { group = "nature", wd = "Q124714", label = "Quelle" },
steppe = { group = "nature", wd = "Q123991", label = "Steppe" },
strait = { group = "nature", wd = "Q37901", label = "Meerenge" },
stream = { group = "nature", wd = "Q47521", label = "Bach" },
stud = { group = "nature", wd = "Q108696", label = "Gestüt" },
summit = { group = "nature", wd = "Q207326", label = "Gipfel" },
tree = { group = "nature", wd = "Q10884", label = "Baum" },
valley = { group = "nature", wd = "Q39816", label = "Tal" },
volcano = { group = "nature", wd = "Q8072", label = "Vulkan" },
waterfall = { group = "nature", wd = "Q34038", label = "Wasserfall, Katarakt" },
wetland = { group = "nature", wd = "Q170321", label = "Feuchtgebiet" },
zoo = { group = "nature", wd = "Q43501", label = "Zoo, Tierpark" },
nature = { group = "nature", wd = "Q7860", label = "Natur" },
-- sights: arts, historic
amphitheater = { group = "see", wd = "Q54831", label = "Amphitheater" },
aqueduct = { group = "see", wd = "Q474", label = "Aquädukt" },
archaeological_site = { group = "see", wd = "Q839954", label = "Archäologische Stätte" },
architecture = { group = "see", wd = "Q12271", label = "Architektur" },
archive = { group = "see", wd = { "Q166118", "Q635719", "Q27032363" }, label = "Archiv" },
artwork = { group = "see", wd = "Q838948", label = "Kunstwerk" },
bakehouse = { group = "see", wd = "Q798436", label = "Backhaus" },
barracks = { group = "see", wd = "Q131263", label = "Kaserne" },
boat_lift = { group = "see", wd = "Q14908", label = "Schiffshebewerk" },
bridge = { group = "see", wd = "Q12280", label = "Brücke" },
building = { group = "see", wd = { "Q41176", "Q811979" }, label = "Gebäude" },
building_complex = { group = "see", wd = { "Q1497364", "Q18247357" }, label = "Gebäudekomplex, Bauwerkgruppe" },
bunker = { group = "see", wd = "Q91122", label = "Bunker" },
cannon = { group = "see", wd = "Q81103", label = "Kanone" },
castle = { group = "see", wd = "Q23413", label = "Burg" },
cellar = { group = "see", wd = "Q234852", label = "Keller" },
cemetery = { alias = "necropolis", group = "see", wd = "Q39614", label = "Friedhof, Nekropole" },
cenotaph = { group = "see", wd = "Q321053", label = "Kenotaph, Scheingrab" },
chateau = { alias = "château", group = "see", wd = "Q751876", label = "Schloss" },
city_center = { group = "see", wd = "Q1468524", label = "Stadtzentrum, Stadtkern" },
city_wall = { group = "see", wd = "Q16748868", label = "Stadtmauer" },
collection = { group = "see", wd = { "Q2668072", "Q7328910" }, label = "Sammlung" },
column = { group = "see", wd = { "Q4817", "Q51845395", "Q1930585" }, label = "Säule, Gedenksäule" },
communication_tower = { group = "see", wd = { "Q11166728", "Q1798641" }, label = "Fernsehturm, Fernmeldeturm" },
crematorium = { group = "see", wd = "Q157570", label = "Krematorium" },
cultural_heritage = { group = "see", wd = "Q210272", label = "Kulturerbe" },
dam = { group = "see", wd = "Q12323", label = "Talsperre" },
domain = { group = "see", wd = "Q155231", label = "Landgut, Domäne, Rittergut" },
embankment_dam = { group = "see", wd = "Q1244922", label = "Staudamm" },
exhibition = { group = "see", wd = "Q464980", label = "Ausstellung" },
exhibition_hall = { group = "see", wd = { "Q57659484", "Q3364296" }, label = "Ausstellungshalle" },
factory = { group = "see", wd = "Q83405", label = "Fabrik" },
fort = { group = "see", wd = "Q57831", label = "Festung, Fort" },
fountain = { group = "see", wd = "Q483453", label = "Springbrunnen" },
gallery = { group = "see", wd = "Q1007870", label = "Galerie", icon = "art-gallery" },
gate = { group = "see", wd = "Q53060", label = "Tor" },
ghost_town = { group = "see", wd = "Q74047", label = "Geisterstadt" },
graduation_tower = { group = "see", wd = "Q1541226", label = "Gradierwerk" },
grave = { group = "see", wd = "Q173387", label = "Grab" },
hall = { group = "see", wd = "Q240854", label = "Halle" },
handicraft = { group = "see", wd = "Q52105", label = "Handwerk, Kunsthandwerk" },
high_rise = { alias = "skyscraper", group = "see", wd = { "Q18142", "Q11303" }, label = "Hochhaus, Wolkenkratzer" },
historic_district = { group = "see", wd = "Q15243209", label = "historisches Gebiet", icon = "historic" },
house = { group = "see", wd = "Q3947", label = "Haus" },
hydraulic_structure = { group = "see", wd = "Q2466889", label = "Wasserbauwerk" },
landmark = { group = "see", wd = "Q2319498", label = "Wahrzeichen" },
lighthouse = { group = "see", wd = "Q39715", label = "Leuchtturm, Bake, Seezeichen" },
lock = { group = "see", wd = "Q105731", label = "Schiffsschleuse, Schleuse" },
mausoleum = { group = "see", wd = "Q162875", label = "Mausoleum" },
megalithic_tomb = { group = "see", wd = { "Q10521078", "Q101659" }, label = "Großsteingrab, Hünengrab, Dolmen" },
memorial = { group = "see", wd = "Q5003624", label = "Gedenkstätte" },
mill = { group = "see", wd = "Q44494", label = "Mühle" },
mine = { group = "see", wd = "Q820477", label = "Bergwerk, Mine" }, -- including surface mining
mining_museum = { group = "see", wd = "Q819426", label = "Bergbaumuseum" },
monument = { group = "see", wd = "Q4989906", label = "Denkmal, Monument" },
museum = { group = "see", wd = "Q33506", label = "Museum" },
museum_ship = { group = "see", wd = "Q575727", label = "Museumsschiff" },
national_monument = { group = "see", wd = "Q893745", label = "Nationaldenkmal" },
obelisk = { group = "see", wd = "Q170980", label = "Obelisk" },
observatory = { group = "see", wd = { "Q1254933", "Q62832" }, label = "Sternwarte" },
old_town = { group = "see", wd = "Q676050", label = "Altstadt", icon = "historic" },
open_air_museum = { group = "see", wd = "Q756102", label = "Freilichtmuseum" },
palace = { group = "see", wd = "Q16560", label = "Palast" },
pavilion = { alias = "arbor", group = "see", wd = { "Q276173", "Q23457088", "Q961082" }, label = "Pavillon, Gartenlaube" },
pedestrian = { group = "see", wd = "Q369730", label = "Fußgängerzone" },
planetarium = { group = "see", wd = "Q148319", label = "Planetarium" },
power = { group = "see", wd = "Q159719", label = "Kraftwerk, Energie" }, -- power station, transformers, towers etc.
promenade = { group = "see", wd = "Q787113", label = "Promenade" },
pyramid = { group = "see", wd = "Q12516", label = "Pyramide" },
quarry = { group = "see", wd = "Q15115254", label = "Steinbruch" },
road = { group = "see", wd = { "Q34442", "Q83620" }, label = "Straße" }, -- including street and lane
rock_art = { group = "see", wd = "Q1211146", label = "Felsbild" },
ruins = { group = "see", wd = "Q109607", label = "Ruine" },
shipyard = { group = "see", wd = "Q190928", label = "Werft" },
spaceport = { group = "see", wd = "Q194188", label = "Weltraumbahnhof" },
square = { group = "see", wd = "Q174782", label = "Platz" },
statue = { group = "see", wd = "Q179700", label = "Statue, Skulptur" },
stele = { group = "see", wd = "Q178743", label = "Stele" },
stolperstein = { group = "see", wd = "Q314003", label = "Stolperstein" },
technical_monument = { group = "see", wd = "Q1516537", label = "technisches Denkmal" },
tomb = { group = "see", wd = { "Q381885", "Q6023295" }, label = "Grabkammer" },
tower = { group = "see", wd = "Q12518", label = "Turm" },
town_hall = { group = "see", wd = "Q543654", label = "Rathaus" },
tumulus = { group = "see", wd = "Q34023", label = "Tumulus, Hügelgrab" },
viaduct = { group = "see", wd = "Q181348", label = "Viadukt" },
wall = { group = "see", wd = "Q42948", label = "Mauer" },
war_grave = { group = "see", wd = "Q90717531", label = "Kriegsgrab" },
war_memorial = { group = "see", wd = "Q575759", label = "Kriegsgedenkstätte, Kriegerdenkmal" },
watermill = { group = "see", wd = "Q185187", label = "Wassermühle" },
weather_station = { group = "see", wd = "Q190107", label = "Wetterstation" },
weir = { group = "see", wd = "Q1066997", label = "Stauwehr" },
well = { group = "see", wd = "Q43483", label = "Brunnen" },
windmill = { group = "see", wd = "Q38720", label = "Windmühle" },
wreck = { group = "see", wd = "Q852190", label = "Wrack" },
-- group types
see = { group = "see", wd = "Q570116", label = "Sehenswürdigkeit" },
-- culture
arena = { group = "do", wd = "Q641226", label = "Arena" },
arts_center = { group = "do", wd = "Q2190251", label = "Kunstzentrum" },
bird_watching = { group = "do", wd = "Q685629", label = "Vogelbeobachtung" },
bullring = { group = "do", wd = "Q1193438", label = "Stierkampfarena" },
cabaret = { group = "do", wd = "Q131183", label = "Cabaret, Kabarett, Musiktheater" },
cinema = { group = "do", wd = "Q41253", label = "Kino, Filmtheater" },
circus = { group = "do", wd = "Q47928", label = "Zirkus" },
concert_hall = { group = "do", wd = "Q1060829", label = "Konzerthaus" },
conference_center = { group = "do", wd = "Q1378975", label = "Tagungs- oder Konferenzzentrum" },
cultural_center = { group = "do", wd = "Q1329623", label = "Kulturzentrum" },
edutainment = { group = "do", wd = "Q1153173", label = "Edutainment" },
event = { group = "do", wd = "Q1190554", label = "Ereignis, Veranstaltung" },
event_venue = { group = "do", wd = "Q18674739", label = "Veranstaltungszentrum" },
fair = { group = "do", wd = { "Q57305", "Q2948561" }, label = "Messe, Handelsmesse" },
festival = { group = "do", wd = "Q132241", label = "Festspiele" },
heritage_railway = { group = "do", wd = "Q420962", label = "Museumsbahn, Museumseisenbahn" },
karaoke = { group = "do", wd = "Q229345", label = "Karaoke" },
lazy_river = { group = "do", wd = "Q3220071", label = "Lazy River" },
[ "multi-purpose_hall" ] = { group = "do", wd = { "Q1763828", "Q2400020" }, label = "Mehrzweckhalle" },
music = { group = "do", wd = "Q638", label = "Musikdarbietung" }, -- different types of music theaters
opera_house = { group = "do", wd = "Q153562", label = "Opernhaus" },
puppet_theater = { group = "do", wd = "Q3982337", label = "Puppentheater" },
recording_studio = { group = "do", wd = "Q746369", label = "Tonstudio" },
sightseeing_flight = { alias = "pleasure_flight", group = "do", wd = "Q1425541", label = "Rundflug" },
theater = { group = "do", wd = { "Q11635", "Q24354" }, label = "Theater", icon = "theatre" }, -- speech theater, theater in general
themed_travel = { group = "do", label = "Themenreisen" },
wildlife_observation = { group = "do", wd = { "Q28455557", "Q241741" }, label = "Tierbeobachtung" },
-- recreation
amusement_park = { group = "do", wd = "Q194195", label = "Freizeitpark" },
attraction = { group = "do", wd = "Q2800000", label = "Attraktion" },
ballooning = { group = "do", wd = "Q805325", label = "Ballonfahren" },
brine_bath = { group = "do", wd = "Q1316853", label = "Solbad" },
casino = { group = "do", wd = "Q133215", label = "Spielbank, Casino" },
entertainment = { group = "do", wd = "Q173799", label = "Unterhaltung" },
escape_game = { group = "do", wd = "Q1201679", label = "Fluchtspiel, Escape Game" },
falconry_display = { group = "do", wd = "Q1169958", label = "Greifvogelschau, Freiflugvorführung" },
game = { group = "do", wd = "Q11410", label = "Spiel" },
massage = { group = "do", wd = "Q179415", label = "Massagesalon" },
onsen = { group = "do", wd = "Q655311", label = "Onsen" },
picnic = { group = "do", wd = "Q506294", label = "Picknick", icon = "picnic-site" },
playground = { group = "do", wd = "Q11875349", label = "Spielplatz" },
public_bath = { group = "do", wd = "Q785952", label = "Badehaus, Hammam" },
ropes_course = { group = "do", wd = "Q1939700", label = "Seilgarten, Kletterpark" },
sauna = { group = "do", wd = "Q57036", label = "Sauna, Dampfbad" },
spa = { alias = "wellness", group = "do", wd = "Q6882870", label = "Heilbad, Spa, Wellnesscenter" },
theme_park = { group = "do", wd = "Q2416723", label = "Themenpark" },
thermal_bath = { group = "do", wd = "Q1004887", label = "Thermalbad" },
water_park = { group = "do", wd = { "Q740326", "Q118559331" }, label = "Wasserpark, Aquapark, Freizeitbad, Spaßbad" },
water_playground = { group = "do", wd = "Q19984194", label = "Wasserspielplatz" },
youth_center = { group = "do", wd = "Q1302299", label = "Jugendzentrum" },
-- sports and fitness
["9pin"] = { group = "do", wd = "Q706199", label = "Kegeln" },
["10pin"] = { alias = "bowling", group = "do", wd = "Q172809", label = "Bowling", icon = "bowling-alley" },
athletics_track = { group = "do", wd = { "Q1004435", "Q37025296", "Q121072018" }, label = "Leichtathletikanlage" },
archery = { group = "do", wd = "Q108429", label = "Bogenschießen" },
badminton = { group = "do", wd = "Q7291", label = "Badminton" },
barefoot_path = { group = "do", wd = "Q2143241", label = "Barfußpfad" },
baseball = { group = "do", wd = { "Q5369", "Q701629" }, label = "Baseball" },
basketball_court = { group = "do", wd = "Q2341939", label = "Basketballfeld" },
beach = { group = "do", wd = "Q40080", label = "Strand" },
beachvolleyball = { group = "do", wd = "Q4543", label = "Beachvolleyball" },
bicycle_route = { group = "do", wd = { "Q353027", "Q102307360" }, label = "Radwanderweg" },
billiards = { group = "do", wd = "Q3341285", label = "Billard" },
bmx = { group = "do", wd = "Q215184", label = "BMX" },
boat_rental = { group = "do", wd = "Q25384001", label = "Bootsverleih" },
bobsleigh = { group = "do", wd = "Q177275", label = "Bobsport" },
bouldering = { group = "do", wd = "Q852989", label = "Bouldern, Klettern" },
boules = { group = "do", wd = "Q895060", label = "Boules" },
bungee_jumping = { group = "do", wd = "Q193847", label = "Bungeespringen" },
canoe = { group = "do", wd = "Q171529", label = "Bootssport" }, -- Kanu, Kayak
canyoning = { group = "do", wd = "Q206091", label = "Canyoning" },
city_beach = { group = "do", wd = "Q7900097", label = "Stadtstrand" }, -- incl. beach club
court = { group = "do", wd = "Q41487", label = "Gericht, Tribunal" },
cricket = { group = "do", wd = "Q5375", label = "Cricket" },
cycling = { group = "do", wd = "Q53121", label = "Radfahren" },
dive_center = { alias = { "dive_centre", "diving center" }, group = "do", wd = "Q3664857", label = "Tauchbasis" },
downhill = { group = "do", wd = { "Q319899", "Q121071424" }, label = "Ski Alpin, Abfahrt", icon = "skiing" }, -- alpine/downhill ski route
extreme_sports = { group = "do", wd = "Q309162", label = "Extremsport" },
fishing = { group = "do", wd = "Q14373", label = "Fischen, Angeln" },
fitness_center = { alias = "gym", group = "do", wd = { "Q1065656", "Q30750411" }, label = "Fitnessstudio", icon = "fitness-centre" },
football_pitch = { group = "do", wd = "Q105755419", label = "Fußballfeld" },
gliding = { group = "do", wd = "Q624161", label = "Segelflug" },
golf = { group = "do", wd = { "Q5377", "Q3177122" }, label = "Golf (Sport)" },
hiking = { alias = "trekking", group = "do", wd = "Q12014035", label = "Wandern" },
horse_racing = { group = "do", wd = "Q187916", label = "Pferderennen" },
horse_riding = { alias = "equestrian", group = "do", wd = { "Q179226", "Q902378" }, label = "Reiten" },
hunting = { group = "do", wd = "Q36963", label = "Jagd" },
ice_hockey = { group = "do", wd = "Q41466", label = "Eishockey" },
ice_rink = { group = "do", wd = "Q1282870", label = "Eisbahn" },
ice_skating = { group = "do", wd = "Q779272", label = "Eislaufen" },
ice_stadium = { group = "do", wd = "Q12019965", label = "Eissporthalle" },
indoor_pool = { group = "do", wd = "Q357380", label = "Hallenbad" },
karting = { group = "do", wd = "Q192420", label = "Kartsport" },
kitesurfing = { group = "do", wd = "Q219554", label = "Kitesurfen" },
laser_tag = { group = "do", wd = "Q998303", label = "Laser Tag" },
leisure_center = { group = "do", wd = "Q30313989", label = "Freizeitzentrum" },
minigolf = { group = "do", wd = "Q754796", label = "Minigolf" },
mountain_biking = { group = "do", wd = { "Q520611", "Q223705" }, label = "Mountainbikesport" },
mountain_hiking = { alias = "hillwalking", group = "do", wd = "Q1762646", label = "Bergwandern" },
mountaineering = { alias = "mountain_climbing", group = "do", wd = "Q22857", label = "Bergsteigen" },
motocross = { group = "do", wd = "Q215862", label = "Motocross" },
nordic = { group = "do", wd = "Q216613", label = "Ski Nordisch" }, -- nordic/cross country ski trail
orienteering = { group = "do", wd = "Q29358", label = "Orientierungslauf" },
outdoor_chess = { group = "do", wd = { "Q115997054", "Q110079" }, label = "Freiluftschach, Gartenschach" },
outdoor_pool = { group = "do", wd = "Q13586493", label = "Freibad" },
paintball = { group = "do", wd = "Q192832", label = "Paintball" },
parachuting = { alias = "skydiving", group = "do", wd = "Q193210", label = "Fallschirmspringen" },
paragliding = { group = "do", wd = "Q178380", label = "Paragliding" },
pedalo = { group = "do", wd = "Q1335189", label = "Tretboot" },
petanque = { group = "do", wd = { "Q189317", "Q114646415" }, label = "Pétanque" },
polo = { group = "do", wd = "Q134211", label = "Polo" },
quad_bike = { group = "do", wd = "Q3926537", label = "Quad-Bike" },
racetrack = { group = "do", wd = "Q1777138", label = "Rennbahn" },
rafting = { group = "do", wd = "Q207238", label = "Rafting" }, -- including whitewater rafting
roller_skating = { group = "do", wd = "Q1707432", label = "Rollsport" }, -- including inline roller skating
rowing = { group = "do", wd = "Q159354", label = "Rudern" },
running = { group = "do", wd = "Q3694569", label = "Laufsport" },
sailing = { group = "do", wd = "Q192520", label = "Segeln" },
sandboarding = { group = "do", wd = "Q570459", label = "Sandboarding" },
scuba_diving = { group = "do", wd = "Q1096878", label = "Tauchen" },
shooting_range = { group = "do", wd = "Q521839", label = "Schießstand, Schießplatz" },
skatepark = { group = "do", wd = "Q909906", label = "Skatepark" },
ski_jumping = { group = "do", wd = "Q7718", label = "Skispringen" },
ski_school = { group = "do", wd = "Q2292514", label = "Skischule" },
skitour = { group = "do", wd = "Q1075998", label = "Skitour" },
sledding = { group = "do", wd = "Q3266340", label = "Rodeln" },
snorkeling = { group = "do", wd = "Q2471422", label = "Schnorcheln" },
snow_park = { group = "do", wd = "Q3141488", label = "Snowpark" },
soccer = { group = "do", wd = "Q2736", label = "Fußball" },
summer_toboggan = { group = "do", wd = "Q3266345", label = "Sommerrodelbahn" },
sports = { group = "do", wd = "Q349", label = "Sport" },
sports_venue = { group = "do", wd = { "Q1076486", "Q121071543", "Q120169931" }, label = "Sportstätte" },
squash = { group = "do", wd = { "Q121072153", "Q121085278" }, label = "Squash" },
stadium = { group = "do", wd = { "Q483110", "Q37025296" }, label = "Stadion" },
standup_paddle_boarding = { alias = "sup", group = "do", wd = "Q2035123", label = "Stehpaddeln, Stand-up-Paddling" },
surfing = { group = "do", wd = "Q159992", label = "Surfen" },
swimming = { group = "do", wd = "Q6388", label = "Schwimmen" },
swimming_pool = { group = "do", wd = "Q200023", label = "Schwimmbad" },
table_tennis = { group = "do", wd = "Q3930", label = "Tischtennis" },
tennis = { alias = "tennis_court", group = "do", wd = { "Q847", "Q741118" }, label = "Tennisplatz" },
toboggan = { group = "do", wd = "Q56611604", label = "Rodelbahn" },
tour = { group = "do", label = "Tour, Rundfahrt" },
trail = { alias = "hiking_trail", group = "do", wd = { "Q2143825", "Q628179" }, label = "Wanderweg" },
trampoline_park = { group = "do", wd = "Q107338221", label = "Trampolinpark" },
triathlon = { group = "do", wd = "Q10980", label = "Triathlon" },
velodrome = { group = "do", wd = "Q830528", label = "Radrennbahn", icon = "racetrack-cycling" },
wakeboarding = { group = "do", wd = "Q376040", label = "Wakeboarding" },
water_skiing = { group = "do", wd = "Q472827", label = "Wasserski" },
water_sports = { group = "do", wd = "Q61065", label = "Wassersport" },
winter_sports = { group = "do", wd = "Q204686", label = "Wintersport" },
-- group types
["do"] = { group = "do", label = "Aktivität" },
-- shopping
alcohol_shop = { group = "buy", wd = "Q2632011", label = "Spirituosengeschäft" },
antiquarian = { group = "buy", wd = "Q582794", label = "Antiquariat" },
atm = { group = "buy", wd = "Q81235", label = "Geldautomat, Bankomat" },
bakery = { group = "buy", wd = "Q274393", label = "Bäckerei" },
bank = { group = "buy", wd = "Q22687", label = "Bank, Geldwesen" },
beverages = { group = "buy", wd = "Q47504516", label = "Getränkegeschäft" },
bike_shop = { group = "buy", wd = "Q26721034", label = "Fahrradladen" },
book_seller = { alias = "book_shop", group = "buy", wd = "Q200764", label = "Buchhandlung" },
boutique = { group = "buy", wd = "Q1068824", label = "Boutique" },
business_park = { group = "buy", wd = "Q338313", label = "Gewerbegebiet" },
butchery = { group = "buy", wd = "Q13164546", label = "Metzgerei, Fleischerei" },
carpet_shop = { group = "buy", wd = "Q47516346", label = "Teppichgeschäft" },
cheesery = { group = "buy", wd = "Q3088348", label = "Käserei" },
chemist = { alias = "drugstore", group = "buy", wd = "Q1260046", label = "Drogerie" },
collector_shop = { group = "buy", label = "Sammlergeschäft" },
computer_shop = { alias = "computer", wd = "Q43182520", group = "buy", label = "Computergeschäft" },
cosmetics_shop = { group = "buy", wd = "Q47508166", label = "Kosmetik" },
crafts_shop = { group = "buy", wd = "Q101061294", label = "Handwerksgeschäft" },
currency_exchange = { group = "buy", wd = "Q2002539", label = "Wechselstube" },
delicatessen = { group = "buy", wd = { "Q3231410", "Q48635101" }, label = "Feinkostladen" },
department_store = { group = "buy", wd = "Q216107", label = "Warenhaus, Kaufhaus" },
["duty-free_shop"] = { group = "buy", wd = "Q545609", label = "Duty-Free-Geschäft" },
fashion_store = { alias = "clothing_store", group = "buy", wd = "Q2090555", label = "Modeladen, Bekleidungsgeschäft", icon = "clothing-store" },
farm_shop = { group = "buy", wd = "Q1371823", label = "Hofladen" },
flea_market = { group = "buy", wd = "Q385870", label = "Flohmarkt" },
florist = { group = "buy", wd = "Q10431511", label = "Blumenladen" },
grocery = { group = "buy", wd = "Q1295201", label = "Lebensmittelladen" },
hairdresser = { group = "buy", wd = "Q95856773", label = "Friseur" },
industrial_park = { group = "buy", wd = "Q1662100", label = "Industriepark" },
jewellery = { group = "buy", wd = "Q20708021", label = "Juwelier", icon = "jewelry-store" },
kiosk = { group = "buy", wd = "Q693369", label = "Kiosk" },
livestock_market = { group = "buy", wd = "Q13592976", label = "Viehmarkt, Tiermarkt" },
mall = { group = "buy", wd = { "Q11315", "Q31374404" }, label = "Einkaufszentrum, Mall" },
market = { group = "buy", wd = "Q37654", label = "Markt" },
market_hall = { group = "buy", wd = "Q2080521", label = "Markthalle" },
music_shop = { group = "buy", wd = "Q24284215", label = "Musikgeschäft" },
optician = { group = "buy", wd = "Q80144507", label = "Optiker" },
outdoor_retailer = { group = "buy", label = "Outdoor-Händler" },
outlet = { group = "buy", wd = "Q76470", label = "Outlet, Fabrikverkauf" },
pastry_shop = { alias = "confectionery", group = "buy", wd = "Q47505416", label = "Konditorei, Feinbäckerei" },
photo_store = { group = "buy", wd = "Q57262241", label = "Fotogeschäft" },
second_hand = { group = "buy", wd = "Q2925872", label = "Gebrauchtwarenladen" },
shoe_shop = { group = "buy", wd = "Q7500021", label = "Schuhladen", icon = "shoe" },
shop = { group = "buy", wd = "Q213441", label = "Geschäft, Laden, Shop" },
shopping_arcade = { alias = "shopping_passage", group = "buy", wd = "Q97495053", label = "Ladenpassage, Einkaufspassage" },
shopping_district = { group = "buy", wd = "Q27095213", label = "Einkaufsviertel" },
shopping_street = { group = "buy", wd = "Q21000333", label = "Einkaufsstraße" },
souvenir_shop = { group = "buy", wd = "Q865693", label = "Souvenirgeschäft, Andenkenladen" },
sports_shop = { group = "buy", wd = "Q47516567", label = "Sportgeschäft" },
supermarket = { group = "buy", wd = "Q180846", label = "Supermarkt" },
ticket_shop = { alias = { "box_office", "ticket_sales", "ticket_office" }, group = "buy", wd = { "Q47519615", "Q877435", "Q100681367" }, label = "Ticketverkauf" },
vending_machine = { group = "buy", wd = "Q211584", label = "Verkaufsautomat" },
watersports_shop = { group = "buy", label = "Wassersportgeschäft" },
-- group types
buy = { group = "buy", label = "Einkaufen" },
-- cuisine, eating
agriculture = { group = "eat", wd = "Q11451", label = "Landwirtschaft" },
bistro = { group = "eat", wd = "Q866742", label = "Bistro" },
brasserie = { group = "eat", wd = "Q1581509", label = "Brasserie" },
cafe = { group = "eat", wd = "Q30022", label = "Café, Kaffeehaus" },
cafeteria = { group = "eat", wd = "Q8463304", label = "Cafeteria" },
canteen = { group = "eat", wd = "Q54957790", label = "Kantine, Mensa" },
community_kitchen = { group = "eat", wd = "Q28854744", label = "Gemeinschaftsküche, Langar" },
fast_food = { group = "eat", wd = "Q1751429", label = "Fastfood, Schnellrestaurant" },
fish_restaurant = { group = "eat", wd = "Q125216847", label = "Fischrestaurant" },
food = { group = "eat", wd = { "Q2095", "Q736427" }, label = "Lebensmittel" },
grill_site = { group = "eat", wd = "Q1546788", label = "Grillplatz" },
ice_cream = { group = "eat", wd = "Q1311064", label = "Eisdiele" },
izakaya = { group = "eat", wd = "Q1193068", label = "Izakaya-Restaurant" },
pizzeria = { group = "eat", wd = "Q1501212", label = "Pizzeria", icon = "restaurant-pizza" },
restaurant = { group = "eat", wd = "Q11707", label = "Restaurant, Gaststätte, Lokal" },
seafood_restaurant = { alias = "seafood", group = "eat", wd = "Q17102985", label = "Seefisch-Restaurant, Meeresfrüchte-Restaurant", icon = "restaurant-seafood" },
snack_bar = { group = "eat", wd = "Q1318768", label = "Imbissstand, Food-counter, Würstelstand" },
steak_house = { group = "eat", wd = "Q3109696", label = "Steakhaus" },
street_food = { group = "eat", wd = "Q1316209", label = "Street Food" },
takeaway = { group = "eat", wd = { "Q154383", "Q506946" }, label = "Take-away" },
tavern = { group = "eat", wd = { "Q154250", "Q2387565" }, label = "Taverne" },
teahouse = { group = "eat", wd = "Q1072166", label = "Teehaus" },
wine_tavern = { group = "eat", wd = { "Q2556304", "Q1922416" }, label = "Weinstube, Weinlokal, Bodega" },
-- group types
eat = { group = "eat", wd = { "Q27038993", "Q27077054" }, label = "Küche, Essen" },
-- drinking, going out
bar = { group = "drink", wd = "Q187456", label = "Bar" },
beer_garden = { group = "drink", wd = "Q857909", label = "Biergarten", icon = "beer" },
brewery = { group = "drink", wd = "Q131734", label = "Brauerei" },
club = { group = "drink", label = "Club" },
discotheque = { group = "drink", wd = "Q1228895", label = "Diskothek" },
distillery = { group = "drink", wd = "Q1251750", label = "Brennerei" },
drinking_hall = { group = "drink", wd = "Q4101440", label = "Trinkhalle" },
drinking_water = { group = "drink", wd = "Q7892", label = "Trinkwasser" },
nightclub = { group = "drink", wd = "Q622425", label = "Nachtclub" },
pub = { group = "drink", wd = { "Q19754932", "Q12341378" }, label = "Kneipe" },
vineyard = { group = "drink", wd = "Q22715", label = "Weingut, Weinberg" },
wine_cellar = { group = "drink", wd = "Q22995", label = "Weinkeller" },
winery = { group = "drink", wd = "Q20181766", label = "Kellerei" },
-- group types
drink = { group = "drink", wd = "Q5307737", label = "Trinken" },
-- accommodation
appartment = { group = "sleep", wd = "Q617839", label = "Appartement-Hotel" },
alpine_hut = { group = "sleep", wd = "Q182676", label = "Berghütte" },
bed_and_bike = { group = "sleep", label = "Bett und Bike" },
bnb = { group = "sleep", subtype = "y", wd = "Q367914", label = "Bed & Breakfast", icon = "lodging" },
boarding_house = { group = "sleep", subtype = "y", wd = { "Q1558858", "Q1065252" }, label = "Pension" },
boutique_hotel = { group = "sleep", wd = "Q259618", label = "Boutique-Hotel" },
campsite = { group = "sleep", wd = "Q832778", label = "Campingplatz, Zeltplatz" },
caravan_site = { group = "sleep", label = "Caravan-Campingplatz" },
chalet = { group = "sleep", label = "Chalet, Ferienhaus" },
ecolodge = { group = "sleep", wd = "Q3577646", label = "Ecolodge" },
group_accomodation = { group = "sleep", label = "Gruppenunterkunft" },
guest_house = { group = "sleep", wd = "Q2460422", label = "Gästehaus" },
holiday_flat = { group = "sleep", wd = "Q336532", label = "Ferienwohnung" },
hostel = { group = "sleep", wd = "Q654772", label = "Herberge, Hostel", icon = "lodging" },
hotel = { group = "sleep", wd = { "Q27686", "Q63099748" }, label = "Hotel", icon = "lodging" },
hotel_garni = { group = "sleep", subtype = "y", wd = "Q1631103", label = "Hotel garni", icon = "lodging" },
hut = { group = "sleep", wd = "Q5784097", label = "Hütte" },
lodge = { group = "sleep", wd = "Q56439882", label = "Lodge" },
motel = { group = "sleep", wd = "Q216212", label = "Motel", icon = "lodging" },
resort = { group = "sleep", wd = "Q875157", label = "Resort" },
wilderness_hut = { group = "sleep", wd = "Q17087359", label = "Wildnishütte" },
youth_hostel = { group = "sleep", wd = "Q1589077", label = "Jugendherberge" },
-- group types
sleep = { group = "sleep", wd = "Q5056668", label = "Unterkunft" },
-- people
children = { group = "other", wd = "Q7569", label = "Kinder" },
-- health
animal_hospital = { group = "health", wd = "Q1706476", label = "Tierklinikum" },
defibrillator = { group = "health", wd = "Q1450682", label = "Defibrillator" },
dental_emergency_service = { group = "health", label = "Zahnärztlicher Notdienst" },
dentist = { group = "health", wd = "Q2979300", label = "Zahnarzt" },
diving_chamber = { alias = "", group = "health", wd = "Q549046", label = "Dekompressionskammer" },
doctor = { alias ="surgery", group = "health", wd = "Q718966", label = "Arztpraxis" },
emergency = { alias = "emergency_department", group = "health", wd = "Q1295316", label = "Notaufnahme, Notfallstation" },
emergency_medical_services = { group = "health", wd = "Q860447", label = "Rettungsdienst, Notfallrettung" },
first_aid = { group = "health", wd = "Q133981", label = "Erste Hilfe" },
health = { group = "health", wd = "Q12147", label = "Gesundheit" },
health_center = { alias = "clinic", group = "health", wd = { "Q569500", "Q1774898" }, label = "Ärztehaus, Poliklinik" },
hospital = { group = "health", wd = { "Q16917", "Q180370" }, label = "Krankenhaus, Spital" },
kneipp_facility = { group = "health", wd = "Q66425029", label = "Kneipp-Anlage" },
laboratory = { group = "health", wd = { "Q483242", "Q112203425" }, label = "Labor" },
["medical_on-call_service"] = { group = "health", label = "Ärztlicher Bereitschaftsdienst" },
naturopathy = { group = "health", wd = "Q213403", label = "Naturheilkunde" },
nursing_home = { group = "health", wd = "Q837142", label = "Pflegeheim" },
pharmacy = { group = "health", wd = "Q13107184", label = "Apotheke" },
pharmacy_on_standby_duty = { group = "health", label = "Apotheken-Notdienst" },
rehabilitation = { group = "health", wd = "Q2795791", label = "Rehabilitation, Rehaklinik, Kurklinik" },
rescue_center = { group = "health", label = "Rettungsstation" },
veterinary = { group = "health", wd = "Q15850915", label = "Tierarzt" },
-- teaching & learning
academy = { group = "other", wd = "Q162633", label = "Akademie" },
boarding_school = { group = "other", wd = { "Q269770", "Q125783335" }, label = "Internatsschule" },
bookcase = { group = "other", wd = "Q215857", label = "Bücherschrank" },
college = { group = "other", wd = "Q189004", label = "Hochschule, College" },
community_center = { group = "other", wd = "Q77115", label = "Gemeindezentrum" },
cooking_class = { group = "other", label = "Kochkurs" },
education = { alias = "learn", group = "other", wd = "Q8434", label = "Ausbildung" },
folk_high_school = { group = "other", wd = "Q170087", label = "Volkshochschule" },
gymnasium = { group = "other", wd = "Q55043", label = "Gymnasium" },
institute = { group = "other", wd = "Q1664720", label = "Institut" },
kindergarten = { group = "other", wd = "Q126807", label = "Kindergarten" },
language_school = { group = "other", wd = "Q897403", label = "Sprachschule" },
library = { group = "other", wd = { "Q7075", "Q6503358", "Q2061246" }, label = "Bücherei" },
nursery = { group = "other", wd = "Q20174673", label = "Kinderkrippe" },
school = { group = "other", wd = "Q3914", label = "Schule" },
university = { group = "other", wd = "Q3918", label = "Universität" },
-- administration and uncategorized
administration = { group = "other", wd = { "Q327333", "Q5283295" }, label = "Verwaltung, Behörde, Amt" },
association = { alias = "society", group = "other", wd = { "Q48204", "Q15911314" }, label = "Verein" },
business_development_agency = { group = "other", label = "Wirtschaftsförderungsgesellschaft" },
checkpoint = { group = "other", wd = "Q88871664", label = "Kontrollpunkt" },
company = { group = "other", wd = "Q6881511", label = "Unternehmen" },
consulate = { group = "other", wd = "Q7843791", label = "Konsulat" },
coworking_space = { group = "other", wd = "Q97307779", label = "Coworking Space" },
customs = { group = "other", wd = "Q182290", label = "Zoll" },
cultural_organisation = { group = "other", wd = "Q29918292", label = "Kulturorganisation" },
embassy = { group = "other", wd = "Q3917681", label = "Botschaft" },
emergency_call = { group = "other", wd = "Q694554", label = "Notruf", icon = "emergency-phone" },
fire_brigade = { group = "other", wd = "Q6498663", label = "Feuerwehr", icon = "fire-station" },
government = { group = "other", wd = "Q16831714", label = "Regierungsgebäude" },
guide = { group = "other", wd = "Q14290559", label = "Fremdenführer" },
hotline = { group = "other", wd = "Q1482145", label = "Hotline" },
internet_cafe = { group = "other", wd = "Q272399", label = "Internetcafé" },
laundry = { group = "other", wd = "Q12893467", label = "Wäscherei" },
list = { group = "other", wd = { "Q12139612", "Q13406463" }, label = "Liste" },
lost_and_found = { group = "other", wd = "Q15983979", label = "Fundbüro" },
military = { group = "other", wd = "Q8473", label = "Militär" },
mobile_telephony = { group = "other", wd = "Q47516435", label = "Mobilfunkgeschäft" },
newspaper = { group = "other", wd = "Q11032", label = "Zeitung, Zeitungsverlag" },
office = { group = "other", wd = "Q182060", label = "Büro" },
organisation = { group = "other", wd = "Q43229", label = "Organisation" },
passport_office = { group = "other", label = "Passstelle" },
payphone = { group = "other", wd = "Q900977", label = "Münzfernsprecher", icon = "telephone" },
phone = { group = "other", wd = "Q11035", label = "Telefon", icon = "telephone" },
police = { group = "other", wd = "Q35535", label = "Polizei" },
post = { group = "other", wd = "Q35054", label = "Postamt" },
register_office = { alias = { "standesamt", "registry_office" }, group = "other", wd = { "Q745221", "Q29127138", "Q206946" }, label = "Standesamt" },
relief_organisation = { group = "other", wd = "Q708676", label = "Wohltätigkeitsorganisation" },
roadside_assistance = { group = "other", wd = "Q337810", label = "Pannenhilfe, Unfallhilfe" },
shelter = { group = "other", wd = { "Q7493941", "Q989946" }, label = "Unterstand" },
toilet = { group = "other", wd = "Q7857", label = "Toiletten" },
tour_operator = { group = "other", wd = "Q133744", label = "Reiseveranstalter" },
tourism_authority = { group = "other", label = "Tourismusbehörde" },
tourist_information = { alias = "visitor_center", group = "other", wd = { "Q1587716", "Q18411786" }, label = "Touristinformation, Besucherzentrum, Fremdenverkehrsamt", icon = "information" },
travel_agency = { group = "other", wd = "Q217107", label = "Reisebüro" },
weblink = { group = "other", wd = "Q102014", label = "Weblink" },
wlan = { group = "other", wd = "Q334765", label = "WLAN-Hotspot" },
work = { group = "other", wd = "Q6958747", label = "Arbeit" },
-- group types
other = { group = "other", label = "Anderes" },
listing = { group = "other", label = "Listung" },
-- populated areas
city = { group = "populated", wd = "Q515", label = "Stadt" },
fraction = { group = "populated", label = "Ortsteil einer Gemeinde" },
holiday_resort = { group = "populated", wd = "Q3077815", label = "Feriensiedlung" },
municipality = { group = "populated", wd = { "Q15284", "Q17376095", "Q562061" }, label = "Gemeinde" },
quarter = { alias = "neighborhood", group = "populated", wd = { "Q2983893", "Q253019" }, label = "Stadtteil" },
refugee_camp = { group = "populated", wd = "Q622499", label = "Flüchtlingscamp" },
settlement = { group = "populated", wd = "Q486972", label = "Siedlung" },
town = { group = "populated", wd = "Q3957", label = "Kleinstadt" },
village = { group = "populated", wd = "Q532", label = "Dorf" },
-- views
observation_tower = { group = "view", wd = "Q1440300", label = "Aussichtsturm" },
scenic_view = { group = "view", label = "Bildmotiv", icon = "attraction" },
viewpoint = { group = "view", wd = "Q6017969", label = "Aussichtspunkt" },
-- areas
adm1st = { group = "area", wd = "Q10864048", label = "Verwaltungseinheit 1. Ebene" },
adm2nd = { group = "area", wd = "Q13220204", label = "Verwaltungseinheit 2. Ebene" },
adm3rd = { group = "area", wd = "Q13221722", label = "Verwaltungseinheit 3. Ebene" },
country = { group = "area", wd = "Q6256", label = "Land, Staat" },
district = { group = "area", wd = "Q149621", label = "Distrikt" },
region = { group = "area", wd = "Q82794", label = "Region" },
surroundings = { group = "area", wd = "Q2920644", label = "Umgebung" },
vicinity = { group = "area", wd = "Q16968816", label = "Nähe, nahe Umgebung" },
-- error
error = { group = "error", wd = "Q29485", label = "Fehler" }
-- do not remove the following line
-- ##end
}
}
k77hz8bxixoukoiph7fehpu2jgvbf0s
Modulo:Languages
828
4823
72067
71473
2026-04-07T11:08:25Z
RolandUnger
168
Update
72067
Scribunto
text/plain
--[[
Using ISO 639-1 code of the languages
table indexes:
q: Language entity id
w: Writing entity id
c: Wikipedia edits in millions per 2018/7/1 as a measure of importance
from https://de.wikipedia.org/wiki/Wikipedia:Sprachen
]]--
return {
-- administration
moduleInterface = {
suite = 'Languages',
serial = '2026-03-25',
item = 65439949
},
id2code = {
Q27811 = 'aa',
Q5111 = 'ab',
Q14196 = 'af',
Q28026 = 'ak',
Q28244 = 'am',
Q8765 = 'an',
Q13955 = 'ar',
Q29401 = 'as',
Q29561 = 'av',
Q4627 = 'ay',
Q9292 = 'az',
Q13389 = 'ba',
Q9091 = 'be',
Q7918 = 'bg',
Q35452 = 'bi',
Q33243 = 'bm',
Q9610 = 'bn',
Q34271 = 'bo',
Q12107 = 'br',
Q9303 = 'bs',
Q7026 = 'ca',
Q33350 = 'ce',
Q33262 = 'ch',
Q33111 = 'co',
Q33390 = 'cr',
Q9056 = 'cs',
Q33348 = 'cv',
Q9309 = 'cy',
Q9035 = 'da',
Q188 = 'de',
Q13286 = 'dsb', -- Lower Sorbian
Q32656 = 'dv',
Q33081 = 'dz',
Q30005 = 'ee',
Q36510 = 'el', -- Modern Greek
Q9129 = 'el', -- Greek
Q1860 = 'en',
Q7979 = 'en-gb',
Q7976 = 'en-us',
Q143 = 'eo',
Q1321 = 'es',
Q9072 = 'et',
Q8752 = 'eu',
Q9168 = 'fa',
Q33454 = 'ff',
Q1412 = 'fi',
Q33298 = 'fil',
Q33295 = 'fj',
Q25258 = 'fo',
Q150 = 'fr',
Q1450506= 'fr-ca', -- Canadian French
Q28224 = 'frr',
Q27175 = 'fy',
Q9142 = 'ga',
Q9314 = 'gd',
Q9307 = 'gl',
Q35876 = 'gn',
Q387066 = 'gsw',
Q5137 = 'gu',
Q12175 = 'gv',
Q56475 = 'ha',
Q9288 = 'he',
Q1568 = 'hi',
Q33617 = 'ho',
Q6654 = 'hr',
Q13248 = 'hsb', -- Upper Sorbian
Q33491 = 'ht',
Q9067 = 'hu',
Q8785 = 'hy',
Q33315 = 'hz',
Q9240 = 'id',
Q33578 = 'ig',
Q34235 = 'ii',
Q27183 = 'ik',
Q294 = 'is',
Q652 = 'it',
Q29921 = 'iu',
Q5287 = 'ja',
Q33549 = 'jv',
Q8108 = 'ka',
Q33702 = 'kg',
Q33587 = 'ki',
Q1405077 = 'kj',
Q9252 = 'kk',
Q25355 = 'kl',
Q9205 = 'km',
Q33673 = 'kn',
Q9176 = 'ko',
Q36094 = 'kr',
Q33552 = 'ks',
Q36368 = 'ku',
Q36126 = 'kv',
Q25289 = 'kw',
Q9255 = 'ky',
Q9051 = 'lb',
Q33368 = 'lg',
Q102172 = 'li',
Q36217 = 'ln',
Q9211 = 'lo',
Q9083 = 'lt',
Q36157 = 'lu',
Q9078 = 'lv',
Q7930 = 'mg',
Q36280 = 'mh',
Q36451 = 'mi',
Q9296 = 'mk',
Q36236 = 'ml',
Q9246 = 'mn',
Q36392 = 'mo',
Q1571 = 'mr',
Q9237 = 'ms',
Q9166 = 'mt',
Q20923490 = 'mul',
Q9228 = 'my',
Q13307 = 'na',
Q25167 = 'nb',
Q35613 = 'nd',
Q33823 = 'ne',
Q33900 = 'ng',
Q33790 = 'niu',
Q7411 = 'nl',
Q25164 = 'nn',
Q9043 = 'no',
Q36785 = 'nr',
Q33273 = 'ny',
Q14185 = 'oc',
Q33875 = 'oj',
Q33864 = 'om',
Q33810 = 'or',
Q33968 = 'os',
Q58635 = 'pa',
Q36727 = 'pi',
Q809 = 'pl',
Q58680 = 'ps',
Q5146 = 'pt',
Q13199 = 'rm',
Q33583 = 'rn',
Q7913 = 'ro',
Q7737 = 'ru',
Q33573 = 'rw',
Q11059 = 'sa',
Q33976 = 'sc',
Q33997 = 'sd',
Q33947 = 'se',
Q33954 = 'sg',
Q13267 = 'si',
Q9058 = 'sk',
Q9063 = 'sl',
Q34011 = 'sm',
Q34004 = 'sn',
Q13275 = 'so',
Q8748 = 'sq',
Q9299 = 'sr',
Q8821 = 'sr-me', -- Montenegrin
Q34014 = 'ss',
Q34340 = 'st',
Q34002 = 'su',
Q9027 = 'sv',
Q7838 = 'sw',
Q5885 = 'ta',
Q8097 = 'te',
Q9260 = 'tg',
Q9217 = 'th',
Q34124 = 'ti',
Q9267 = 'tk',
Q34097 = 'tkl',
Q34057 = 'tl',
Q34137 = 'tn',
Q34094 = 'to',
Q256 = 'tr',
Q34327 = 'ts',
Q25285 = 'tt',
Q34055 = 'tvl',
Q36850 = 'tw',
Q34128 = 'ty',
Q13263 = 'ug',
Q8798 = 'uk',
Q1617 = 'ur',
Q9264 = 'uz',
Q32704 = 've',
Q9199 = 'vi',
Q100103 = 'vls',
Q34219 = 'wa',
Q34257 = 'wo',
Q13218 = 'xh',
Q8641 = 'yi',
Q34311 = 'yo',
Q13216 = 'za',
Q7850 = 'zh', -- Chinese
Q727694 = 'zh', -- Standard Chinese
Q1624231 = 'zh-nan', -- Hokkien
Q9186 = 'zh-yue', -- Cantonese
Q10179 = 'zu'
},
scripts = {
Q8196 = 'Arabic alphabet',
Q8201 = 'Chinese characters',
Q8209 = 'Cyrillic script',
Q8216 = 'Greek alphabet',
Q8222 = 'Hangul',
Q8229 = 'Latin script',
Q11932 = 'Armenian alphabet',
Q26803 = 'Tamil script',
Q33513 = 'Hebrew alphabet',
Q38592 = 'Devanagari',
Q46861 = 'Tibetan alphabet',
Q82772 = 'Kanji',
Q161428 = 'Georgian alphabet',
Q185083 = 'Brahmi script',
Q191272 = 'Assamese alphabet',
Q236376 = 'Thai alphabet',
Q257634 = "Ge'ez script",
Q570450 = 'Telugu script',
Q733944 = 'Gujarati alphabet',
Q756802 = 'Bengali alphabet',
Q839666 = 'Kannada alphabet',
Q854968 = 'Burmese alphabet',
Q877906 = 'Thaana',
Q1054190 = 'Khmer alphabet',
Q1164129 = 'Malayalam script',
Q1197646 = 'Yi script',
Q1574992 = 'Sinhala script',
Q1760127 = 'Odia alphabet',
Q1815229 = 'Lao alphabet',
Q2274646 = 'Inuktitut syllabics',
},
lngProps = {
aa = { q = 'Q27811', w = 'Q8229' },
ab = { q = 'Q5111', w = 'Q8209' },
af = { q = 'Q14196', w = 'Q8229' },
ak = { q = 'Q28026', w = 'Q8229' },
am = { q = 'Q28244', w = 'Q257634' },
an = { q = 'Q8765', w = 'Q8229' },
ar = { q = 'Q13955', w = 'Q8196', c = 29 },
as = { q = 'Q29401', w = 'Q191272' },
av = { q = 'Q29561', w = 'Q8209' },
ay = { q = 'Q4627', w = 'Q8229' },
az = { q = 'Q9292', w = 'Q8229' },
ba = { q = 'Q13389', w = 'Q8209' },
be = { q = 'Q9091', w = 'Q8209' },
bg = { q = 'Q7918', w = 'Q8209' },
bi = { q = 'Q35452', w = 'Q8229' },
bm = { q = 'Q33243', w = 'Q8229' },
bn = { q = 'Q9610', w = 'Q756802' },
bo = { q = 'Q34271', w = 'Q46861' },
br = { q = 'Q12107', w = 'Q8229' },
bs = { q = 'Q9303', w = 'Q8229' },
ca = { q = 'Q7026', w = 'Q8229', c = 20 },
ce = { q = 'Q33350', w = 'Q8209' },
ch = { q = 'Q33262', w = 'Q8229' },
co = { q = 'Q33111', w = 'Q8229' },
cr = { q = 'Q33390', w = 'Q8229' },
cs = { q = 'Q9056', w = 'Q8229' },
cv = { q = 'Q33348', w = 'Q8209' },
cy = { q = 'Q9309', w = 'Q8229' },
da = { q = 'Q9035', w = 'Q8229' },
de = { q = 'Q188', w = 'Q8229', c = 178 },
dsb = { q = 'Q13286', w = 'Q8229' },
dv = { q = 'Q32656', w = 'Q877906' },
dz = { q = 'Q33081', w = 'Q46861' },
ee = { q = 'Q30005', w = 'Q8229' },
el = { q = 'Q9129', w = 'Q8216' },
en = { q = 'Q1860', w = 'Q8229', c = 844 },
['en-gb'] = { q = 'Q7979', w = 'Q8229' },
['en-us'] = { q = 'Q7976', w = 'Q8229' },
eo = { q = 'Q143', w = 'Q8229', c = 1 },
es = { q = 'Q1321', w = 'Q8229', c = 109 },
et = { q = 'Q9072', w = 'Q8229' },
eu = { q = 'Q8752', w = 'Q8229' },
fa = { q = 'Q9168', w = 'Q8196', c = 24 },
ff = { q = 'Q33454', w = 'Q8229' },
fi = { q = 'Q1412', w = 'Q8229' },
fil = { q = 'Q33298', w = 'Q8229' },
fj = { q = 'Q33295', w = 'Q8229' },
fo = { q = 'Q25258', w = 'Q8229' },
fr = { q = 'Q150', w = 'Q8229', c = 150 },
['fr-ca'] = { q = 'Q1450506', w = 'Q8229' },
frr = { q = 'Q28224', w = 'Q8229' },
fy = { q = 'Q27175', w = 'Q8229' },
ga = { q = 'Q9142', w = 'Q8229' },
gd = { q = 'Q9314', w = 'Q8229' },
gl = { q = 'Q9307', w = 'Q8229' },
gn = { q = 'Q35876', w = 'Q8229' },
gsw = { q = 'Q387066', w = 'Q8229' },
gu = { q = 'Q5137', w = 'Q733944' },
gv = { q = 'Q12175', w = 'Q8229' },
ha = { q = 'Q56475', w = 'Q8229' },
he = { q = 'Q9288', w = 'Q33513' },
hi = { q = 'Q1568', w = 'Q38592' },
ho = { q = 'Q33617', w = 'Q8229' },
hr = { q = 'Q6654', w = 'Q8229' },
hsb = { q = 'Q13248', w = 'Q8229' },
ht = { q = 'Q33491', w = 'Q8229' },
hu = { q = 'Q9067', w = 'Q8229' },
hy = { q = 'Q8785', w = 'Q11932' },
hz = { q = 'Q33315', w = 'Q8229' },
id = { q = 'Q9240', w = 'Q8229' },
ig = { q = 'Q33578', w = 'Q8229' },
ii = { q = 'Q34235', w = 'Q1197646' },
ik = { q = 'Q27183', w = 'Q8229' },
is = { q = 'Q294', w = 'Q8229' },
it = { q = 'Q652', w = 'Q8229', c = 98 },
iu = { q = 'Q29921', w = 'Q2274646' },
ja = { q = 'Q5287', w = 'Q82772', c = 69 },
jv = { q = 'Q33549', w = 'Q8229' },
ka = { q = 'Q8108', w = 'Q161428' },
kg = { q = 'Q33702', w = 'Q8229' },
ki = { q = 'Q33587', w = 'Q8229' },
kj = { q = 'Q1405077', w = 'Q8229' },
kk = { q = 'Q9252', w = 'Q8209' },
kl = { q = 'Q25355', w = 'Q8229' },
km = { q = 'Q9205', w = 'Q1054190' },
kn = { q = 'Q33673', w = 'Q839666' },
ko = { q = 'Q9176', w = 'Q8222' },
kr = { q = 'Q36094', w = 'Q8229' },
ks = { q = 'Q33552', w = 'Q38592' },
ku = { q = 'Q36368', w = 'Q8229' },
kv = { q = 'Q36126', w = 'Q8209' },
kw = { q = 'Q25289', w = 'Q8229' },
ky = { q = 'Q9255', w = 'Q8209' },
lb = { q = 'Q9051', w = 'Q8229' },
lg = { q = 'Q33368', w = 'Q8229' },
li = { q = 'Q102172', w = 'Q8229' },
ln = { q = 'Q36217', w = 'Q8229' },
lo = { q = 'Q9211', w = 'Q1815229' },
lt = { q = 'Q9083', w = 'Q8229' },
lu = { q = 'Q36157', w = 'Q8229' },
lv = { q = 'Q9078', w = 'Q8229' },
mg = { q = 'Q7930', w = 'Q8229' },
mh = { q = 'Q36280', w = 'Q8229' },
mi = { q = 'Q36451', w = 'Q8229' },
mk = { q = 'Q9296', w = 'Q8209' },
ml = { q = 'Q36236', w = 'Q1164129' },
mn = { q = 'Q9246', w = 'Q8209' },
mo = { q = 'Q36392', w = 'Q8229' },
mr = { q = 'Q1571', w = 'Q38592' },
ms = { q = 'Q9237', w = 'Q8229' },
mt = { q = 'Q9166', w = 'Q8229' },
mul = { q = 'Q20923490', w = 'Q8229' },
my = { q = 'Q9228', w = 'Q854968' },
na = { q = 'Q13307', w = 'Q8229' },
nb = { q = 'Q25167', w = 'Q8229' },
nd = { q = 'Q35613', w = 'Q8229' },
ne = { q = 'Q33823', w = 'Q38592' },
ng = { q = 'Q33900', w = 'Q8229' },
niu = { q = 'Q33790', w = 'Q8229' },
nl = { q = 'Q7411', w = 'Q8229', c = 52 },
nn = { q = 'Q25164', w = 'Q8229' },
no = { q = 'Q9043', w = 'Q8229' },
nr = { q = 'Q36785', w = 'Q8229' },
ny = { q = 'Q33273', w = 'Q8229' },
oc = { q = 'Q14185', w = 'Q8229' },
oj = { q = 'Q33875', w = 'Q8229' },
om = { q = 'Q33864', w = 'Q8229' },
['or'] = { q = 'Q33810', w = 'Q1760127' },
['os'] = { q = 'Q33968', w = 'Q8209' },
pa = { q = 'Q58635', w = 'Q38592' },
pi = { q = 'Q36727', w = 'Q185083' },
pl = { q = 'Q809', w = 'Q8229', c = 54 },
ps = { q = 'Q58680', w = 'Q8196' },
pt = { q = 'Q5146', w = 'Q8229', c = 52 },
rm = { q = 'Q13199', w = 'Q8229' },
rn = { q = 'Q33583', w = 'Q8229' },
ro = { q = 'Q7913', w = 'Q8229' },
ru = { q = 'Q7737', w = 'Q8209', c = 93 },
rw = { q = 'Q33573', w = 'Q8229' },
sa = { q = 'Q11059', w = 'Q38592' },
sc = { q = 'Q33976', w = 'Q8229' },
sd = { q = 'Q33997', w = 'Q8196' },
se = { q = 'Q33947', w = 'Q8229' },
sg = { q = 'Q33954', w = 'Q8229' },
si = { q = 'Q13267', w = 'Q1574992' },
sk = { q = 'Q9058', w = 'Q8229' },
sl = { q = 'Q9063', w = 'Q8229' },
sm = { q = 'Q34011', w = 'Q8229' },
sn = { q = 'Q34004', w = 'Q8229' },
so = { q = 'Q13275', w = 'Q8229' },
sq = { q = 'Q8748', w = 'Q8229' },
sr = { q = 'Q9299', w = 'Q8209', c = 21 },
['sr-me'] = { q = 'Q8821', w = 'Q8209' },
ss = { q = 'Q34014', w = 'Q8229' },
st = { q = 'Q34340', w = 'Q8229' },
su = { q = 'Q34002', w = 'Q8229' },
sv = { q = 'Q9027', w = 'Q8229', c = 43 },
sw = { q = 'Q7838', w = 'Q8229' },
ta = { q = 'Q5885', w = 'Q26803' },
te = { q = 'Q8097', w = 'Q570450' },
tg = { q = 'Q9260', w = 'Q8209' },
th = { q = 'Q9217', w = 'Q236376' },
ti = { q = 'Q34124', w = 'Q257634' },
tk = { q = 'Q9267', w = 'Q8229' },
tkl = { q = 'Q34097', w = 'Q8229' },
tl = { q = 'Q34057', w = 'Q8229' },
tn = { q = 'Q34137', w = 'Q8229' },
to = { q = 'Q34094', w = 'Q8229' },
tr = { q = 'Q256', w = 'Q8229' },
ts = { q = 'Q34327', w = 'Q8229' },
tt = { q = 'Q25285', w = 'Q8209' },
tvl = { q = 'Q34055', w = 'Q8229' },
tw = { q = 'Q36850', w = 'Q8229' },
ty = { q = 'Q34128', w = 'Q8229' },
ug = { q = 'Q13263', w = 'Q8196' },
uk = { q = 'Q8798', w = 'Q8209', c = 23 },
ur = { q = 'Q1617', w = 'Q8196' },
uz = { q = 'Q9264', w = 'Q8229' },
ve = { q = 'Q32704', w = 'Q8229' },
vi = { q = 'Q9199', w = 'Q8229', c = 41 },
vls = { q = 'Q100103', w = 'Q8229' },
wa = { q = 'Q34219', w = 'Q8229' },
wo = { q = 'Q34257', w = 'Q8229' },
xh = { q = 'Q13218', w = 'Q33513' },
yi = { q = 'Q8641', w = 'Q8229' },
yo = { q = 'Q34311', w = 'Q8229' },
yue = { q = 'Q9186', w = 'Q8201' },
za = { q = 'Q13216', w = 'Q8229' },
zh = { q = 'Q7850', w = 'Q8201', c = 50 },
['zh-nan'] = { q = 'Q1624231', w = 'Q8201' },
['zh-yue'] = { q = 'Q9186', w = 'Q8201' },
zu = { q = 'Q10179', w = 'Q8229'}
}
}
nftnpwotov6i213vbri2euof3n9e44m
Modulo:Hours/i18n
828
4825
72062
71472
2026-04-07T11:02:39Z
RolandUnger
168
Update
72062
Scribunto
text/plain
-- This module contains wiki-language specific strings to translate.
return {
-- administration
moduleInterface = {
suite = "Hours",
sub = "Hours/i18n",
serial = "2026-04-07",
item = 99744685
},
-- invoke call parameters
params = {
fallback = "",
format = "",
id = "",
show = ""
},
-- invoke-call show options
show = {
demo = "",
msg = "",
nomsg = ""
},
-- Wikidata property identifiers
wd = {
retrieved = "P813",
validInPeriod = "P1264",
opened = "P3025",
closed = "P3026",
dayOpenFrom = "P3027",
dayOpenTo = "P3028",
natureOfStatement = "P5102",
stateOfUse = "P5817",
hourOpenFrom = "P8626",
hourOpenTo = "P8627",
appliesToJurisdiction = "P1001",
appliesToPart = "P518",
appliesToPeople = "P6001",
occupation = "P106",
of = "P642",
use = "P366",
all = { "P3026", "P3027", "P3028", "P8626", "P8627",
"P1264", "P5102", "P5817",
"P366", "P518", "P642", "P1001", "P6001", "P106" },
comments = { "P1264", "P5102", "P5817",
"P366", "P518", "P642", "P1001", "P6001", "P106" },
commentsForClosed = { "P5102", "P5817",
"P366", "P518", "P642", "P1001", "P6001", "P106" }
},
-- abbreviations for month names
months = {
Januar = "Jan.",
Februar = "Feb.",
[ "März" ] = "Mär.",
April = "Apr.",
Mai = "Mai",
Juni = "Jun.",
Juli = "Jul.",
August = "Aug.",
September = "Sep.",
Oktober = "Okt.",
November = "Nov.",
Dezember = "Dez."
},
weekdays = {
Mo = 1,
Di = 2,
Mi = 3,
Do = 4,
Fr = 5,
Sa = 6,
So = 7
},
-- several strings
texts = {
closed = "geschlossen: %s",
format = "Geöffnet: %s",
-- punctuation
parentheses = "(%s)",
space = " ", -- for instance between days and times
comma = ", ", -- several dates
semicolon = "; ", -- several statesments
from = "ab %s",
fromTo = "%s–%s",
to = "bis %s",
-- formatting of a single time
timePattern = "^(%d%d?)[.:](%d%d?)%s*Uhr$", -- for German wiki
formatTime = "%s:%s", -- or "%s:%s Uhr" etc.
formatDate = "j. M Y",
formatAM = "%s:%s AM",
formatPM = "%s:%s PM",
-- formatting of a time range
hourReplAll = true, -- (formally) replace all occurrences
hourPattern = "", -- empty if no replacement is requested
hourRepl = "",
-- hourReplAll = false, -- replace only first occurrence
-- hourPattern = "(%d)%s+[aApP][mM]", -- empty if no replacement is requested
-- hourRepl = "%1",
},
options = {
addCategories = false,
clusterClosed = true, -- cluster all closing dates at the end
hour12 = false, -- 12 or 24 hours mode
leadingZero = false, -- add or remove zero for hours
removeZeros = false -- remove zeros :00 for full hours
},
-- Category names
categories = {
fallbackLabel = "[[Category:VCard: Öffnungszeit-Label in Englisch]] <span class=\"voy-listing-check-recommended\" style=\"display:none;\">Öffnungszeit-Label in Englisch</span>",
hoursFromWikidata = "[[Category:VCard: Öffnungszeit aus Wikidata]]",
invalidId = "[[Category:Hours: Ungültige Wikidata-Id]] <span class=\"error\">Ungültige Wikidata-Id</span>",
isClosed = "[[Category:VCard: Einrichtung ist geschlossen]] <span class=\"voy-listing-check-recommended\" style=\"display:none;\">Einrichtung ist geschlossen</span>",
hoursLabelFromWikidata = "[[Category:VCard: Öffnungszeit-Label aus Wikidata]] <span class=\"voy-listing-check-recommended\" style=\"display:none;\">Öffnungszeit-Label aus Wikidata</span>",
properties = "[[Category:Seiten, die die Wikidata-Eigenschaft %s benutzen]]",
unknownError = "[[Category:VCard: Öffnungszeit mit Fehler]] <span class=\"voy-listing-check-recommended\" style=\"display:none;\">Öffnungszeit mit Fehler</span>",
unknownParams = "[[Category:Hours: Unbekannter Parameter]] <span class=\"error\">Parameter unbekannt: %s</span>",
unknownShowOptions = "[[Category:Hours: Unbekannter Wert für show]] <span class=\"error\">Wert(e) für show unbekannt: %s</span>",
withoutTime = "[[Category:VCard: Öffnungszeit ohne Uhrzeit]] <span class=\"voy-listing-check-recommended\" style=\"display:none;\">Öffnungszeit ohne Uhrzeit</span>",
},
-- time to id conversion
times = {
daily = "Q26214163",
Dec31 = "Q2912",
is24_7 = "Q1571749",
Jan1 = "Q2150"
},
-- several abbreviations
abbr = {
{ f = "[Mm]ontags?", a = "Mo" },
{ f = "[Dd]ienstags?", a = "Di" },
{ f = "[Mm]ittwochs?", a = "Mi" },
{ f = "[Dd]onnerstags?", a = "Do" },
{ f = "[Ff]reitags?", a = "Fr" },
{ f = "[Ss]amstags?", a = "Sa" },
{ f = "[Ss]onnabends?", a = "Sa" },
{ f = "[Ss]onntags?", a = "So" },
{ f = "[Ee]rste[rs]?", a = "1." },
{ f = "[Zz]weite[rs]?", a = "2." },
{ f = "[Dd]ritte[rs]?", a = "3." },
{ f = "[Vv]ierte[rs]?", a = "4." },
{ f = "[Ff]ünfte[rs]?", a = "5." }
},
-- selections of date labels to prevent fetching from Wikidata
dateIds = {
-- Table contains common values only and is used for reduction of
-- computing time. Others will be taken from Wikidata labels.
-- days
Q105 = "Mo",
Q127 = "Di",
Q128 = "Mi",
Q129 = "Do",
Q130 = "Fr",
Q131 = "Sa",
Q132 = "So",
Q211391 = "Wochenende",
-- use Q99528581 instead of Q211391 because it is culturally dependent
Q26214163 = "täglich", -- do not remove this item because it is used in Lua script
Q100274304 = "Mo–Di",
Q116445783 = "Mo–Di, Do",
Q118773943 = "Mo–Di, Do–Fr",
Q104786164 = "Mo–Mi",
Q104057082 = "Mo–Do",
Q97120402 = "Mo–Fr",
Q21282379 = "Mo–Sa",
Q101072294 = "Di–Mi",
Q100320771 = "Di–Do",
Q100157387 = "Di–Fr",
Q100148056 = "Di–Sa",
Q99731947 = "Di–So",
Q100427721 = "Mi–Do",
Q99714084 = "Mi–Fr",
Q100148065 = "Mi–Fr",
Q118773278 = "Mi, Fr",
Q31689308 = "Mi–Sa",
Q116328326 = "Mi, Sa",
Q65681627 = "Mi–So",
Q100332183 = "Mi–So",
Q99731117 = "Mi–Mo",
Q106714964 = "Do–Di",
Q106538987 = "Do–Fr",
Q106541052 = "Do–Sa",
Q100274433 = "Do–So",
Q100427930 = "Fr–Sa",
Q100451849 = "Fr–So",
Q111977440 = "Fr–Mi",
Q102268431 = "Sa–Mi",
Q101766385 = "Sa–Do",
Q99528581 = "Sa–So",
Q106538981 = "So–Mo",
Q111127796 = "So–Mi",
Q100587968 = "So–Do",
Q112703547 = "So–Fr",
Q1571749 = "24/7", -- do not remove this item because it is used in Lua script
Q819073 = "Werktag",
Q1445650 = "Feiertag",
Q1197685 = "Feiertag",
Q2174956 = "Ruhetag",
Q12779928 = "Arbeitstag",
Q116213 = "Ferien",
-- Zero-width spaces are used to keep the week-day terms and to
-- prevent abbreviation
Q14915111 = "Weiberfastnacht",
Q15834118 = "Weiberfastnacht",
Q2245828 = "Nelkensamstag",
Q1241858 = "Tulpensonntag",
Q2085192 = "Tulpensonntag",
Q153134 = "Rosenmontag",
Q4845365 = "Fastnachtsdienstag",
Q123542 = "Aschermittwoch",
Q153308 = "Laetare",
Q2033651 = "Judika",
Q42236 = "Palmsonntag",
Q106333 = "Gründonnerstag",
Q40317 = "Karfreitag",
Q186206 = "Karsamstag",
Q21196 = "Ostern",
Q1512337 = "Ostersonntag",
Q209663 = "Ostermontag",
Q14795170 = "Ostermontag",
Q14916781 = "Osterdienstag",
Q51638 = "Christi Himmelfahrt",
Q39864 = "Pfingsten",
Q2512993 = "Pfingstmontag",
Q14795386 = "Pfingstdienstag",
Q152395 = "Fronleichnam",
Q2304773 = "Erntedankfest",
Q2913791 = "Thanksgiving",
Q59833 = "Totensonntag",
Q19809 = "Weihnachten",
Q10901070 = "Tag der Arbeit",
Q10274 = "Dashahara",
Q464458 = "Fest des Fastenbrechens",
Q10259 = "Holi",
Q131772 = "Chinesisches Neujahrsfest",
Q718778 = "Qingming-Fest",
Q1145566 = "Chinesischer Nationalfeiertag",
Q1622041 = "Hochsaison",
Q99932986 = "Nebensaison",
Q1777301 = "Normalzeit",
Q36669 = "Sommerzeit",
Q107376657 = "Januar bis März",
Q107376740 = "März bis Oktober",
Q121914265 = "März bis November",
Q100157218 = "April bis Oktober",
Q107376636 = "April bis Dezember",
Q107359921 = "Mai bis Oktober",
Q107376754 = "November bis Februar",
Q100157227 = "November bis März",
Q1312 = "Frühling",
Q1313 = "Sommer",
Q1314 = "Herbst",
Q1311 = "Winter",
Q100320775 = "erstes Wochenende im Monat",
Q23034736 = "erster Montag im Monat",
Q51119351 = "zweiter Montag im Monat",
Q51119371 = "dritter Montag im Monat",
Q51119385 = "vierter Montag im Monat",
Q51119411 = "fünfter Montag im Monat",
Q51120546 = "letzter Montag im Monat",
Q51119341 = "erster Donnerstag im Monat",
Q51119361 = "zweiter Donnerstag im Monat",
Q51119378 = "dritter Donnerstag im Monat",
Q51119395 = "vierter Donnerstag im Monat",
Q51119421 = "fünfter Donnerstag im Monat",
Q51120559 = "letzter Donnerstag im Monat",
Q51119344 = "erster Freitag im Monat",
Q51119363 = "zweiter Freitag im Monat",
Q51119381 = "dritter Freitag im Monat",
Q51119398 = "vierter Freitag im Monat",
Q51119425 = "fünfter Freitag im Monat",
Q51120563 = "letzter Freitag im Monat",
Q51119345 = "erster Samstag im Monat",
Q51119367 = "zweiter Samstag im Monat",
Q51119382 = "dritter Samstag im Monat",
Q51119402 = "vierter Samstag im Monat",
Q51119427 = "fünfter Samstag im Monat",
Q51120565 = "letzter Samstag im Monat",
Q51119350 = "erster Sonntag im Monat",
Q51119369 = "zweiter Sonntag im Monat",
Q51119383 = "dritter Sonntag im Monat",
Q51119404 = "vierter Sonntag im Monat",
Q51119429 = "fünfter Sonntag im Monat",
Q51120567 = "letzter Sonntag im Monat",
Q108 = "Jan.",
Q2150 = "1. Jan.", -- do not remove this item because it is used in Lua script
Q196627 = "1. Jan.",
Q2151 = "2. Jan.",
Q2156 = "3. Jan.",
Q2221 = "6. Jan.",
Q1139536 = "26. Jan.", -- India Republic Day
Q2289 = "31. Jan.",
Q109 = "Feb.",
Q2312 = "1. Feb.",
Q2332 = "14. Feb.",
Q2334 = "15. Feb.",
Q2362 = "28. Feb.",
Q2364 = "29. Feb.",
Q110 = "Mär.",
Q2393 = "1. Mär.",
Q2404 = "14. Mär.",
Q2403 = "15. Mär.",
Q2457 = "27. Mär.",
Q2458 = "28. Mär.",
Q2461 = "31. Mär.",
Q118 = "Apr.",
Q2510 = "1. Apr.",
Q2505 = "7. Apr.",
Q2504 = "9. Apr.",
Q2500 = "14. Apr.",
Q2497 = "15. Apr.",
Q2536 = "30. Apr.",
Q119 = "Mai",
Q2544 = "1. Mai",
Q47499 = "1. Mai",
Q2574 = "16. Mai",
Q2591 = "31. Mai",
Q120 = "Jun.",
Q2625 = "1. Jun.",
Q2657 = "30. Jun.",
Q121 = "Jul.",
Q2700 = "1. Jul.",
Q2715 = "31. Jul.",
Q122 = "Aug.",
Q2788 = "1. Aug.",
Q2774 = "15. Aug.",
Q162691 = "15. Aug.", -- Assumption of Mary
Q56106 = "15. Aug.", -- Independence Day, India
Q2830 = "31. Aug.",
Q123 = "Sep.",
Q2859 = "1. Sep.",
Q2846 = "15. Sep.",
Q2881 = "30. Sep.",
Q124 = "Okt.",
Q2913 = "1. Okt.",
Q2932 = "2. Okt.",
Q2931 = "3. Okt.",
Q157582 = "3. Okt.", -- German Unity Day
Q2919 = "15. Okt.",
Q2963 = "16. Okt.",
Q2949 = "31. Okt.",
Q153093 = "31. Okt.", -- Reformation Day
Q125 = "Nov.",
Q2997 = "1. Nov.",
Q2982 = "15. Nov.",
Q3029 = "16. Nov.",
Q3015 = "30. Nov.",
Q126 = "Dez.",
Q2297 = "1. Dez.",
Q2451 = "19. Dez.",
Q2705 = "24. Dez.",
Q106010 = "24. Dez.",
Q2745 = "25. Dez.",
Q2703710 = "25. Dez.", -- Christmas Day
Q2761 = "26. Dez.",
Q15113728 = "26. Dez.",
Q2800 = "27. Dez.",
Q2832 = "28. Dez.",
Q2862 = "29. Dez.",
Q2901 = "30. Dez.",
Q2912 = "31. Dez.", -- do not remove this item because it is used in Lua script
Q11269 = "31. Dez.",
-- points of time
Q573 = "Tag",
Q575 = "Nacht",
Q7722 = "Morgen",
Q986787 = "Vormittag",
Q283102 = "Nachmittag",
Q7725 = "Abend",
Q193294 = "Sonnenaufgang",
Q166564 = "Sonnenuntergang",
Q36402 = "0:00 Uhr",
Q55812411 = "0:00 Uhr",
Q55449532 = "0:30 Uhr",
Q41618001 = "1:00 Uhr",
Q55517345 = "1:00 Uhr",
Q55518450 = "1:30 Uhr",
Q41618006 = "2:00 Uhr",
Q55521280 = "2:00 Uhr",
Q55524996 = "2:30 Uhr",
Q41618076 = "3:00 Uhr",
Q55527754 = "3:00 Uhr",
Q55560170 = "3:30 Uhr",
Q41618081 = "4:00 Uhr",
Q55810628 = "4:00 Uhr",
Q55810646 = "4:15 Uhr",
Q55811293 = "4:30 Uhr",
Q55811308 = "4:45 Uhr",
Q41618165 = "5:00 Uhr",
Q55810695 = "5:00 Uhr",
Q55810711 = "5:15 Uhr",
Q55811314 = "5:30 Uhr",
Q55811331 = "5:45 Uhr",
Q41618168 = "6:00 Uhr",
Q55810762 = "6:00 Uhr",
Q55810778 = "6:15 Uhr",
Q55810795 = "6:30 Uhr",
Q55811354 = "6:45 Uhr",
Q41618172 = "7:00 Uhr",
Q55811431 = "7:00 Uhr",
Q55810845 = "7:15 Uhr",
Q55810863 = "7:30 Uhr",
Q55811437 = "7:45 Uhr",
Q41618176 = "8:00 Uhr",
Q55811455 = "8:00 Uhr",
Q55810913 = "8:15 Uhr",
Q55810929 = "8:30 Uhr",
Q55810940 = "8:40 Uhr",
Q55812499 = "8:45 Uhr",
Q41618181 = "9:00 Uhr",
Q55811413 = "9:00 Uhr",
Q55811478 = "9:15 Uhr",
Q55810994 = "9:30 Uhr",
Q55811012 = "9:45 Uhr",
Q41618185 = "10:00 Uhr",
Q55811483 = "10:00 Uhr",
Q55811062 = "10:30 Uhr",
Q41618189 = "11:00 Uhr",
Q55811097 = "11:00 Uhr",
Q55811133 = "11:30 Uhr",
Q168182 = "12:00 Uhr",
Q55812521 = "12:00 Uhr",
Q55811197 = "12:30 Uhr",
Q47454201 = "12:30 Uhr",
Q41618345 = "13:00 Uhr",
Q55811230 = "13:00 Uhr",
Q55812556 = "13:15 Uhr",
Q55811580 = "13:30 Uhr",
Q55811277 = "13:45 Uhr",
Q41620570 = "14:00 Uhr",
Q55811610 = "14:00 Uhr",
Q55811657 = "14:15 Uhr",
Q55811674 = "14:30 Uhr",
Q55811761 = "14:45 Uhr",
Q41620574 = "15:00 Uhr",
Q55811778 = "15:00 Uhr",
Q55811726 = "15:15 Uhr",
Q55811745 = "15:30 Uhr",
Q55811798 = "15:45 Uhr",
Q41620578 = "16:00 Uhr",
Q55812393 = "16:00 Uhr",
Q55812563 = "16:15 Uhr",
Q55811847 = "16:30 Uhr",
Q55811864 = "16:45 Uhr",
Q41620582 = "17:00 Uhr",
Q55811883 = "17:00 Uhr",
Q55812585 = "17:15 Uhr",
Q55812595 = "17:25 Uhr",
Q55813015 = "17:30 Uhr",
Q55811932 = "17:45 Uhr",
Q41620584 = "18:00 Uhr",
Q55811949 = "18:00 Uhr",
Q55813021 = "18:15 Uhr",
Q55813038 = "18:30 Uhr",
Q55812002 = "18:45 Uhr",
Q41620587 = "19:00 Uhr",
Q55812019 = "19:00 Uhr",
Q55812659 = "19:30 Uhr",
Q41620591 = "20:00 Uhr",
Q55812694 = "20:00 Uhr",
Q55812122 = "20:30 Uhr",
Q41620593 = "21:00 Uhr",
Q55812716 = "21:00 Uhr",
Q55812732 = "21:15 Uhr",
Q55812192 = "21:30 Uhr",
Q55812210 = "21:45 Uhr",
Q41620595 = "22:00 Uhr",
Q55813122 = "22:00 Uhr",
Q55812769 = "22:30 Uhr",
Q44529925 = "23:00 Uhr",
Q55812301 = "23:00 Uhr",
Q55813170 = "23:30 Uhr",
Q55812370 = "24:00 Uhr",
-- for P1264
Q41662 = "Ramadan",
-- for P5102
Q29509043 = "offiziell",
Q29509080 = "inoffiziell",
Q132555 = "de jure",
Q712144 = "de facto",
Q28962310 = "kaum",
Q28962312 = "häufig",
Q18603603 = "möglich",
Q30230067 = "möglich",
Q53737447 = "ursprünglich",
Q18912752 = "umstritten",
Q28831311 = "unbestätigt",
Q24025284 = "ändert sich gelegentlich",
Q4895105 = "Interim",
Q18122778 = "vermutlich",
Q32188232 = "angeblich",
Q1520777 = "gewiss",
Q5727902 = "ungefähr",
Q56644435 = "wahrscheinlich",
-- for P5817
-- empty strings are not displayed
Q29933838 = "außer Betrieb",
Q56651571 = "außer Betrieb",
Q111802839 = "außer Betrieb",
Q104664889 = "dauerhaft geschlossen",
Q55570821 = "", -- "für die Öffentlichkeit zugänglich"
Q55570340 = "für die Öffentlichkeit geschlossen",
Q55654238 = "", -- "in Benutzung"
Q811683 = "im Bau befindlich",
Q12377751 = "im Bau befindlich",
Q109551035 = "", -- "in eingeschränkter Benutzung"
Q63065035 = "", -- "nicht erhalten"
Q11639308 = "stillgelegt",
Q55653430 = "zeitweilig geschlossen",
Q63187954 = "laufende Sanierung",
Q4989906 = "", -- "Denkmal"
Q2086116 = "", -- Nachnutzung
Q110713763 = "noch nicht in Benutzung"
}
}
gxgifuul448nvludemhmxlx6cbo2h68
Modulo:Link utilities/i18n
828
4828
72065
71070
2026-04-07T11:06:39Z
RolandUnger
168
Update
72065
Scribunto
text/plain
-- shared internationalisation for link modules
return {
-- documentation
moduleInterface = {
suite = 'Link utilities',
sub = 'i18n',
serial = '2026-03-05',
item = 104200158
},
-- maximum count of items to display in listing
addNum = 3,
addNumFax = 2,
addMail = 2,
addSkype = 2,
texts = {
comma = ', ',
space = ' ',
parentheses = '()'
},
-- patterns for delimiters except ',' (en + de)
delimiters = { ' [aA][nN][dD] ', ' [oO][rR] ', ' [uU][nN][dD] ', ' [oO][dD][eE][rR] ' },
-- patterns for phone extensions (en + de)
extensions = {
';?[Ee][Xx][Tt]%.?[ =]+%d+', -- ext. #### (en, intl)
-- including RFC 3966 syntax ";ext=####"
'x%d+', -- x#### (en, intl)
'[Aa][Pp][Pp]%.? +%d+' -- App. #### (de)
},
serviceStrings = { 'Servicenummer', 'Sondernummer', 'Ortstarif', 'Inland', 'Notruf' },
-- phone number options
options = {
withCountryCode = false, -- add country calling code in output in any case
preventLeadZero = false, -- remove lead zero from output
-- enable formatting of phone numbers retrieved from Wikidata
formattingWikidata = true, -- format phone numbers retrieved from Wikidata
addZeros = true, -- add trunc prefix (0)
},
-- Skype query parameters
params = {
add = 1,
call = 1,
chat = 1,
sendfile = 1,
userinfo = 1,
voicemail = 1
},
-- error categories. Leading [[Category: is added in modules
categories = {
noCC = 'Kontakt: Telefon ohne Ländervorwahl]] <span class="error">Telefon ohne Ländervorwahl</span>',
invalid = 'Kontakt: Ungültiges Telefonformat]] <span class="error">Ungültiges Telefonformat</span>',
withSlash = 'Kontakt: Telefon mit Schrägstrich]] <span class="error">Telefon mit Schrägstrich</span>',
onlyDomestic = 'Die Telefonnummer kann nur im Inland benutzt werden.',
invalidMail = 'Kontakt: Ungültiges Email-Format]] <span class="error">Ungültiges Email-Format</span>',
nonASCII = 'Kontakt: Email enthält Unicode-Zeichen]] <span class="voy-listing-check-recommended" style="display:none;">Email enthält Unicode-Zeichen</span>',
invalidSkype = 'Kontakt: Ungültiger Skype-Nutzername]] <span class="error">Ungültiger Skype-Nutzername</span>',
},
-- LinkISBN support
isbnTexts = {
booksourcesClass = 'voy-booksources', -- CSS classes
isbnClass = 'voy-isbn',
invalidISBN = '<span class="error"> Ungültige ISBN</span>',
invalidCat = '[[Category:Seiten mit ISBN-Fehlern]]'
}
}
oob6subtfx8kbn1ojv2pmgcw4hw42fe
Modulo:LinkMail
828
4829
72066
68733
2026-04-07T11:07:34Z
RolandUnger
168
Update
72066
Scribunto
text/plain
-- module variable and administration
local lm = {
moduleInterface = {
suite = 'LinkMail',
serial = '2026-03-05',
item = 65157414
}
}
-- module import
-- require( 'strict' )
local li = require( 'Module:Link utilities/i18n' )
local lu = require( 'Module:Link utilities' )
-- check single email address
function lm._isEmail( s )
local result = 2
if s == nil or type( s ) ~= 'string' or #s > 254 or s:find( '%s' ) or
s:find( '%.%.' ) or s:find( '%.@' ) or s:find( '@[%.%-]' ) or
s:find( '%-%.' ) or s:find( '%.%-' ) or s:match( '^%.' ) then
return 0
end
local repl, at = s:gsub( '@', '@' )
if at ~= 1 then
return 0
end
at = s:find( '@' )
local user = s:sub( 1, at - 1 )
local domain = s:sub( at + 1, #s )
if not user or not domain or #user > 64 or #domain > 253 then
return 0
end
-- handle user part
if not mw.ustring.match( user, "^[%w!#&'/=_`{|}~%^%$%%%+%-%*%.%?]+$" ) then
return 0
end
if not user:match( "^[%w!#&'/=_`{|}~%^%$%%%+%-%*%.%?]+$" ) then
result = 1
end
-- handle domain part
if not mw.ustring.match( domain, '^[%w%.%-]+%.%a%a+$' ) then
return 0
end
if not domain:match( '^[%w%.%-]+%.%a%a+$' ) then
result = 1
end
-- not yet analysed: texts in quotes in user part
-- added on demand
return result
end
function lm._linkMail( m, isDemo, ignoreUnicode )
m = mw.text.trim( m )
if m == '' then
return ''
end
local catPrefix = '[[Category:'
if isDemo then
catPrefix = ' [[:Category:'
end
local comment = ''
m, comment = lu.extractComment( m )
m = m:gsub( 'mailto:', '' )
local isEmail = lm._isEmail( m )
local t
if isEmail > 0 then
t = '<span class="plainlinks nourlexpansion">[mailto:' .. m .. ' ' .. m .. ']</span>'
if isEmail == 1 and not ignoreUnicode then
t = t .. catPrefix .. li.categories.nonASCII
end
else
t = m .. catPrefix .. li.categories.invalidMail
end
if comment ~= '' then
t = t .. ' ' .. comment
end
return t
end
function lm.linkMailSet( args )
args.email = args.email or args[ 1 ] or ''
if args.email == '' then
return ''
end
local ns = mw.title.getCurrentTitle().namespace
local isDemo = ns == 10 or ns == 828
-- split separate email
local items = lu.splitItems( args.email, li.delimiters )
-- analyse emails
local result = ''
local i = 0
local s
for j, item in ipairs( items ) do
s = lm._linkMail( item, isDemo, args.ignoreUnicode )
if s ~= '' then
if result == '' then
result = s
else
if i == li.addMail then
result = result .. '<span class="voy-listing-add-contact">'
end
result = result .. li.texts.comma .. s
end
i = i + 1
end
end
if i > li.addMail then
result = result .. '</span>'
end
return result
end
-- #invoke call
function lm.linkMails( frame )
return lm.linkMailSet( frame.args )
end
-- template call
function lm.linkMailsTemplate( frame )
return lm.linkMailSet( frame:getParent().args )
end
return lm
qkqeawkl1e9lmmsuw6hdy3pymn1fqzq
Modulo:LinkSkype
828
4830
72063
68734
2026-04-07T11:03:54Z
RolandUnger
168
update
72063
Scribunto
text/plain
-- module variable and administration
local ls = {
moduleInterface = {
suite = 'LinkSkype',
serial = '2026-03-05',
item = 65157314
}
}
-- module import
-- require( 'strict' )
local li = require( 'Module:Link utilities/i18n' )
local lu = require( 'Module:Link utilities' )
-- check single skype name
function ls.isSkypeName( s )
if not s or type( s ) ~= 'string' then
return 0
end
local user = s
local param
local q = s:find( '?', 1, true )
if q then
user = s:sub( 1, q - 1 )
param = s:sub( q + 1, #s )
if not li.params[ param ] then
return 0
end
end
if #user > 32 or #user < 6 then
return 0
end
if not user:match( "^%l[%l%d%.,_%-]+$" ) then
return 0
end
return 1
end
function ls.SkypeLink( m, isDemo )
m = mw.text.trim( m )
if m == '' then -- empty string
return ''
end
local catPrefix = '[[Category:'
if isDemo then
catPrefix = ' [[:Category:'
end
local comment = ''
local t
m, comment = lu.extractComment( m )
m = m:gsub( 'skype:', '' )
if ls.isSkypeName( m ) > 0 then
t = '<span class="voy-listing-skype-link">' .. m ..'</span>'
-- skype: link is performed by a JavaSript: MediaWiki:VCard.js
else
t = m .. catPrefix .. li.categories.invalidSkype
end
if comment ~= '' then
t = t .. ' ' .. comment
end
return t
end
function ls.linkSkypeSet( args )
args.skype = args.skype or args[ 1 ] or ''
if args.skype == '' then
return ''
end
local ns = mw.title.getCurrentTitle().namespace
local isDemo = ns == 10 or ns == 828
-- split separate Skype names
local items = lu.splitItems( args.skype, li.delimiters, ';' )
-- analyse Skype names
local i = 0
local s
local result = ''
for j = 1, #items, 1 do
s = ls.SkypeLink( items[ j ], isDemo )
if s ~= '' then
if result == '' then
result = s
else
if i == li.addSkype then
result = result .. '<span class="voy-listing-add-contact">'
end
result = result .. li.texts.comma .. s
end
i = i + 1
end
end
if i > li.addSkype then
result = result .. '</span>'
end
return result
end
-- #invoke call
function ls.linkSkype( frame )
return ls.linkSkypeSet( frame.args )
end
-- template call
function ls.linkSkypeTemplate( frame )
return ls.linkSkypeSet( frame:getParent().args )
end
return ls
87logwh7m0q09j81fqjliyx1idnkssx
Ŝablono:Listigo/styles.css
10
4840
72074
71600
2026-04-07T11:29:03Z
RolandUnger
168
Update
72074
sanitized-css
text/css
/*
vCard and Marker styles
Version: 2026-04-06
*/
/*
Styles for Marker and vCard templates
*/
div.voy-vCard {
margin-top: 0.5em;
}
li div.voy-vCard {
margin-top: 0;
}
.voy-listing-outdent {
margin-left: 22px;
text-indent: -22px;
}
li .voy-listing-outdent {
margin-left: 0;
text-indent: -22px;
}
.voy-listing-name {
font-weight: bold;
}
.voy-listing-name-style-station {
background-color: var(--voy-header-background-base,#f0f0f0);
color: var(--color-base,#202122);
border: 1px solid #ddd;
}
.voy-listing-name-latin, .voy-listing-comment, .voy-listing-directions, .voy-listing-phone-exception {
font-style: italic;
}
.voy-listing-directions .mw-selflink {
font-weight: normal;
}
.voy-listing-hours, .voy-listing-checkin, .voy-listing-checkout, .voy-listing-price,
.voy-listing-payment, .voy-listing-subtype {
color: #888;
}
.voy-listing-phone-number {
white-space: nowrap;
}
.voy-listing-add-contact {
display: none;
}
.voy-vCard .voy-flag-icon {
position: relative;
top: 2px;
}
/*
Status and listing icons
*/
.voy-listing-icon, .voy-listing-social-media {
white-space: nowrap;
}
.voy-listing-icon + .voy-listing-icon:before,
.voy-listing-icon + .voy-listing-social-media:before,
.voy-listing-social-media + .voy-listing-social-media:before {
content: ' ';
white-space: normal;
}
.voy-listing-icon + .voy-listing-sister-wikidata:before {
content: none;
}
.voy-listing-icon-with-space {
white-space: normal !important;
}
.voy-listing-status-item {
list-style-type: none;
list-style-image: none;
text-indent: -20px;
}
.voy-listing-status-item li {
list-style-type: inherit;
text-indent: 0;
}
.vcard span, .vcard div.voy-listing-content {
text-indent: 0;
}
.voy-listing-status + .voy-listing-status {
margin-left: 4px;
}
.voy-listing-status, .voy-listing-icon span, .voy-listing-social-media span {
display: inline-block;
position: relative;
top: 2px;
background-repeat: no-repeat;
background-position: left bottom;
background-size: 16px;
width: 16px;
height: 16px;
white-space: nowrap;
padding-left: 16px;
box-sizing: border-box;
overflow: hidden;
color: transparent;
}
/* status icons */
.voy-listing-status-none, .voy-listing-status-stub {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/f/f3/Symbol_plain_grey.svg/64px-Symbol_plain_grey.svg.png');
}
.voy-listing-status-outline {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Start-icon.svg/64px-Start-icon.svg.png');
}
.voy-listing-status-usable {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/d/d0/Symbol_keep_vote.svg/64px-Symbol_keep_vote.svg.png');
}
.voy-listing-status-guide {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/9/94/Symbol_support_vote.svg/64px-Symbol_support_vote.svg.png');
}
.voy-listing-status-star, .voy-listing-status-recommendation {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/b/b4/Symbol_star_gold.svg/64px-Symbol_star_gold.svg.png');
}
.voy-listing-status-top-sight, .voy-listing-status-top-hotel, .voy-listing-status-top-restaurant {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Symbol_star2.svg/64px-Symbol_star2.svg.png');
}
/* Wikimedia sister site icons */
.voy-listing-sister-commons span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Commons-logo.svg/64px-Commons-logo.svg.png');
background-size: auto 16px;
width: 12px;
padding-left: 12px;
}
.voy-listing-sister-wikidata span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/d/d2/Wikidata-logo-without-paddings.svg/64px-Wikidata-logo-without-paddings.svg.png');
background-position: 0 4px;
}
.voy-listing-sister-wikipedia span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Antu_wikipedia.svg/64px-Antu_wikipedia.svg.png');
}
.voy-listing-sister-wikivoyage span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Wikivoyage-Logo-v3-icon.svg/64px-Wikivoyage-Logo-v3-icon.svg.png');
}
.voy-listing-sister-maps span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/4/4b/Antu_marble.svg/64px-Antu_marble.svg.png');
}
/* social-media site icons */
.voy-listing-social-media-facebook span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/b/b8/2021_Facebook_icon.svg/64px-2021_Facebook_icon.svg.png');
}
.voy-listing-social-media-flickr span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/4/44/Flickr.svg/64px-Flickr.svg.png');
}
.voy-listing-social-media-instagram span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/9/95/Instagram_logo_2022.svg/64px-Instagram_logo_2022.svg.png');
}
.voy-listing-social-media-rss span, .voy-listing-rss span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/4/43/Feed-icon.svg/64px-Feed-icon.svg.png');
}
.voy-listing-social-media-tiktok span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Iconoir_tiktok.svg/64px-Iconoir_tiktok.svg.png');
}
.voy-listing-social-media-x span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/c/ce/X_logo_2023.svg/64px-X_logo_2023.svg.png');
background-position: 0 2px;
}
.voy-listing-social-media-youtube span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/f/fd/YouTube_full-color_icon_%282024%29.svg/64px-YouTube_full-color_icon_%282024%29.svg.png');
background-position: 0 3px;
}
/* additional icons */
.voy-listing-url span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/7/70/Applications-internet.svg/64px-Applications-internet.svg.png');
}
.voy-listing-unesco span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/f/fd/WV-Unesco-icon-small.svg/64px-WV-Unesco-icon-small.svg.png');
}
@media screen {
html.skin-theme-clientpref-night .voy-listing-social-media-tiktok span,
html.skin-theme-clientpref-night .voy-listing-social-media-x span {
filter: invert(100%);
}
}
@media screen and (prefers-color-scheme: dark) {
html.skin-theme-clientpref-os .voy-listing-social-media-tiktok span,
html.skin-theme-clientpref-os .voy-listing-social-media-x span {
filter: invert(100%);
}
}
/* Wikidata icon is shown only for logged-in users. The class voy-user-login in
body tag is set by [[MediaWiki:InitListingTools.js]] script. */
.voy-listing-sister-wikidata a, .voy-listing-icon-with-space {
display: none;
}
body.voy-user-login .voy-listing-sister-wikidata a, body.voy-user-login .voy-listing-icon-with-space {
display: inline;
}
.voy-listing-subtype-icon + .voy-listing-subtype-icon {
margin-left: 2px;
}
.voy-listing-icon .external, .voy-listing-social-media .external, .voy-listing-url .external,
.voy-listing-rss .external {
color: #000;
background: none; /* unterdrücke Link-Symbol bei sozialen Medien */
padding-right: 0;
}
.voy-listing-content {
margin-top: 0.5em;
}
.voy-listing-content .voy-listing-next-paragraph { /* br-tag formatting in description */
display: block;
content: "";
margin-top: 0.5em;
}
.voy-listing-next-paragraph + div, .voy-listing-next-paragraph + style + div {
margin-top: 0 !important;
}
/*
Meta data
*/
.voy-listing-metadata {
font-size: 0.8em;
color: #888;
}
.voy-Marker .voy-listing-metadata {
display: none;
}
.voy-listing-metadata-item {
display: inline-block;
white-space: nowrap;
}
.voy-listing-outdated {
display: inline;
white-space: normal;
}
.voy-listing-item-dummy {
display: none;
}
.voy-listing-metadata-item:first-child:before,
.voy-listing-item-dummy + .voy-listing-metadata-item:before {
content: " (";
}
.voy-listing-metadata-item:after {
content: " | ";
}
.voy-listing-metadata-item:last-child:after {
content: ")";
}
.voy-listing-inline .voy-listing-metadata-item:before,
.voy-listing-inline .voy-listing-metadata-item:after {
content: "";
}
.voy-listing-inline .voy-listing-metadata-item {
box-sizing: border-box;
}
/* lastedit is not shown if the listing template is used within a text block.
voy-listing-inline is set in case of vCard parameter show = inline is set. */
.voy-listing-inline .voy-listing-lastedit {
display: none;
}
@media print {
.voy-listing-lastedit:after {
content: ")";
}
.voy-listing-inline .voy-listing-lastedit:after {
content: "";
}
}
.voy-listing-metadata-item button, .voy-listing-metadata .voy-listing-toSourcePage a {
display: inline-block;
border: none;
background-color: transparent;
color: #888;
font-family: sans-serif;
font-size: 1em;
cursor: pointer;
padding: 0;
}
.voy-listing-metadata-item button:hover, .voy-listing-metadata-item button:focus,
.voy-listing-metadata-item button:active {
text-decoration: underline;
}
.voy-listing-inline .voy-listing-metadata-item button {
display: inline;
color: transparent;
}
.voy-listing-edit-button button, .voy-listing-metadata .voy-listing-toSourcePage a {
position: relative;
padding-left: 15px;
}
.voy-listing-edit-button button:before, .voy-listing-toSourcePage a:before,
.voy-listing-info-button button:before {
content: "";
display: block;
position: absolute;
left: 0;
top: 0;
height: 100%;
width: 15px;
background-repeat: no-repeat;
background-position: 0 25%;
background-size: 12px;
filter: opacity(0.45);
}
.voy-listing-edit-button button:before, .voy-listing-toSourcePage a:before {
background-image: url( "//upload.wikimedia.org/wikipedia/commons/thumb/8/8a/OOjs_UI_icon_edit-ltr.svg/48px-OOjs_UI_icon_edit-ltr.svg.png" );
}
.voy-listing-inline .voy-listing-edit-button,
.voy-listing-inline .voy-listing-info-button {
width: 1.5em;
padding-left: 2px;
clip-path: polygon(0 0, 1.5em 0, 1.5em 100%, 0% 100%);
/* Workaround for overflow: clip */
}
.voy-listing-info-button button {
position: relative;
padding-left: 12px;
}
.voy-listing-info-button button:before {
left: -2px;
top: -1px;
background-image: url( "//upload.wikimedia.org/wikipedia/commons/thumb/0/02/Maki-information-15.svg/56px-Maki-information-15.svg.png" );
background-size: 14px;
}
@media screen {
html.skin-theme-clientpref-night .voy-listing-edit-button button:before,
html.skin-theme-clientpref-night .voy-listing-info-button button:before {
filter: invert(0.5);
}
}
@media screen and (prefers-color-scheme: dark) {
html.skin-theme-clientpref-os .voy-listing-edit-button button:before,
html.skin-theme-clientpref-os .voy-listing-info-button button:before {
filter: invert(0.5);
}
}
.voy-listing-inline .voy-listing-info-button {
padding-left: 5px;
}
@media print {
.voy-listing-info-button, .voy-listing-edit-button {
display: none;
}
}
/*
CSS properties for marker-symbol wrapper
*/
.voy-listing-map {
display: inline-block;
position: relative;
border-radius: 3px;
line-height: 1.15em;
top: -1px;
}
.voy-listing-map a.external:link, .voy-listing-map a.external:visited, .voy-listing-map a.external:hover,
.voy-listing-map a.external:active {
text-decoration: none;
}
.voy-listing-map .mw-kartographer-maplink {
display: inline-block;
min-width: 1.5em;
height: 1.3em;
line-height: 1.3em;
padding: 1px;
border-radius: 3px;
/* for marker-copy */
top: 0;
position: relative;
font-size: 0.85em;
font-weight: bold;
font-style: normal;
text-align: center;
vertical-align: middle;
}
.voy-listing-map-inverse-img.voy-listing-map-is-symbol .mw-kartographer-maplink img {
filter: invert(100%);
}
/*
For media with missing or limited pointer capabilities, i.e. for mobile
devices etc. Secondary devices are considered, too.
See: https://www.w3.org/TR/mediaqueries-4/#any-input
*/
.voy-listing-tooltip-mobile .mw-kartographer-maplink {
min-width: 3em;
}
@media print {
.voy-listing-map .mw-kartographer-maplink {
min-width: 1.5em;
}
}
body.skin-minerva .voy-listing-map .mw-kartographer-maplink,
body.skin-timeless .voy-listing-map .mw-kartographer-maplink {
vertical-align: 10%;
}
.mw-kartographer-maplink img {
vertical-align: -15%;
}
gfrsobb4ygx692ex06du5ve7a9efhzj
Modulo:VCard/dokumentado
828
4842
72073
71080
2026-04-07T11:27:29Z
RolandUnger
168
72073
wikitext
text/x-wiki
== Versiokontrolo ==
{{Kontrolo de versio de modulo}}
== Ekzempleroj ==
{{Mapa framo|width=300|height=300}}
<pre><nowiki>
* {{vCard | name= Ein Hotel | type = hostel | url= http://hotel.de | lat = 52.5144 | long = 13.389722 | show = all | address = Hauptstraße 1 | directions = Abzweig von der Nebenstraße | description = Das in der Innenstadt gelegene Hotel besitzt großzügige Räume, bietet aber nur ÜF. | phone = +49 (0)30 2345 1234 | fax = +49 (0)30 2345 9876, +49 0176 345 1234 | before = [[File:Flag of Germany.svg|20px|Deutschland]] | image = Berlin Friedrichstraße Galeries Lafayette.jpg | email = info@hotel.de | comment = y | lastedit = 2023-09-18 | hours = 7/24. | checkin = ab 14 Uhr | checkout = bis 12 Uhr | payment = Visa, Master, AmEx, Maestro | subtype = wlan, bar, pool, room:89 }}
* {{vCard | wikidata = Q201219 | auto = y | name = Egipta muzeo en Kairo | comment = auch Nationalmuseum | alt = Egyptian Museum | name-latin = al-Matḥaf al-Miṣrī | address = Mīdān et-Taḥrīr | address-local = ميدان التحرير | directions = im Stadtzentrum | directions-local = بوسط البلد }}
* {{vCard | wikidata = Q201219 | name = Egipta muzeo en Kairo | facebook = y | twitter = y | description = <​!-- Marker-Modus --> }}
* {{vCard | wikidata = Q1142142 | auto = y | name = Nordiska museet }} Noch weiterer Text.
* {{vCard | wikidata = Q1142142 | name = Nordia Muzeo | auto = y | price = n }}
* {{vCard | wikidata = Q257342 | name = Carnegie Library of Reims | auto = y }}
* {{vCard | wikidata = Q28934 | name = Flughaveno Bruselo Nacia | auto = y | description = Test Durchhangeln. }}
* {{vCard | wikidata = Q4872 | name = Ŝtata Muzeo de Belartoj Puŝkin | auto = y }}
* {{vCard | wikidata = Q10697 | name = Cologne Public Library | auto = y }}
* {{vCard | wikidata = Q12508 | name = Piramidoj de Gizo | auto = y | description = Test Durchhangeln. }}
* {{vCard | wikidata = Q46033 | name = Flughaveno Frankfurta | description = Test Flughafen. }}
* {{vCard | wikidata = Q46033 | name = Flughaveno Frankfurta | show = symbol | description = Test Flughafen mit Ikone. }}
* {{vCard | wikidata = Q13218762 | name = Karnak Open Air Museum | auto = y | description = Anzeige englische Wikipedia. }}
* {{vCard | wikidata = Q56506795 | name = Nile Ritz Carlton | auto = y | description = Ausgabe Anschriften. }}
* {{vCard | wikidata = Q47429618 | name = Steigenberger Hotel El Tahrir Cairo | address = | address-local = | directions = | phone = | description = Test eingeschränkte WD-Ausgabe. }}
* {{vCard | wikidata = Q637739 | name = Berliner Straße | auto = y | description = Rollstuhl aus WD. }}
* {{vCard | name = Landesmuseum für Vorgeschichte | type = museum | wikidata = Q1332407 | auto = y | description = Uhrzeiten, Kommentare. }}
* {{vCard | name = Museo Nacional de Antropología | type = museum | wikidata = Q2917041 | auto = y | description = Zusammenfassung Kommentare. }}
</nowiki></pre>
* {{vCard | name= Ein Hotel | type = hostel | url= http://hotel.de | lat = 52.5144 | long = 13.389722 | show = all | address = Hauptstraße 1 | directions = Abzweig von der Nebenstraße | description = Das in der Innenstadt gelegene Hotel besitzt großzügige Räume, bietet aber nur ÜF. | phone = +49 (0)30 2345 1234 | fax = +49 (0)30 2345 9876, +49 0176 345 1234 | before = [[File:Flag of Germany.svg|20px|Deutschland]] | image = Berlin Friedrichstraße Galeries Lafayette.jpg | email = info@hotel.de | comment = y | lastedit = 2023-09-18 | hours = 7/24. | checkin = ab 14 Uhr | checkout = bis 12 Uhr | payment = Visa, Master, AmEx, Maestro | subtype = budget, wlan, bar, pool, room:89 }}
* {{vCard | wikidata = Q201219 | auto = y | name = Egipta muzeo en Kairo | comment = auch Nationalmuseum | alt = Egyptian Museum | name-latin = al-Matḥaf al-Miṣrī | address = Mīdān et-Taḥrīr | address-local = ميدان التحرير | directions = im Stadtzentrum | directions-local = بوسط البلد }}
* {{vCard | wikidata = Q201219 | name = Egipta muzeo en Kairo | facebook = y | twitter = y | show = copy | description = <​!-- Marker-Modus --> }}
* {{vCard | wikidata = Q1142142 | auto = y | name = Nordiska museet }} Noch weiterer Text.
* {{vCard | wikidata = Q1142142 | name = Nordia Muzeo | auto = y | price = n | show = copy }}
* {{vCard | wikidata = Q257342 | name = Carnegie Library of Reims | auto = y }}
* {{vCard | wikidata = Q28934 | name = Flughaveno Bruselo Nacia | auto = y | description = Test Durchhangeln. }}
* {{vCard | wikidata = Q4872 | name = Ŝtata Muzeo de Belartoj Puŝkin | auto = y }}
* {{vCard | wikidata = Q10697 | name = Cologne Public Library | auto = y }}
* {{vCard | wikidata = Q12508 | name = Piramidoj de Gizo | auto = y | description = Test Durchhangeln. }}
* {{vCard | wikidata = Q46033 | name = Flughaveno Frankfurta | description = Test Flughafen. }}
* {{vCard | wikidata = Q46033 | name = Flughaveno Frankfurta | show = symbol | description = Test Flughafen mit Ikone. | show = copy }}
* {{vCard | wikidata = Q13218762 | name = Karnak Open Air Museum | auto = y | description = Anzeige englische Wikipedia. }}
* {{vCard | wikidata = Q56506795 | name = Nile Ritz Carlton | auto = y | description = Ausgabe Anschriften. }}
* {{vCard | wikidata = Q47429618 | name = Steigenberger Hotel El Tahrir Cairo | address = | address-local = | directions = | phone = | description = Test eingeschränkte WD-Ausgabe. }}
* {{vCard | wikidata = Q637739 | name = Berliner Straße | auto = y | description = Rollstuhl aus WD. }}
* {{vCard | name = Landesmuseum für Vorgeschichte | type = museum | wikidata = Q1332407 | auto = y | description = Uhrzeiten, Kommentare. }}
* {{vCard | name = Museo Nacional de Antropología | type = museum | wikidata = Q2917041 | auto = y | description = Zusammenfassung Kommentare. }}
== Modulaj dependecoj ==
[[Module:VCard|VCard]]
: [[Module:Marker utilities|Marker utilities]]
:: [[Module:Coordinates|Coordinates]]
::: [[Module:Coordinates/i18n|Coordinates/i18n]]
:: [[Module:Marker utilities/Groups|Marker utilities/Groups]]
:: [[Module:Marker utilities/i18n|Marker utilities/i18n]]
:: [[Module:Marker utilities/Maki icons|Marker utilities/Maki icons]]
:: [[Module:Marker utilities/Types|Marker utilities/Types]]
:: [[Module:UrlCheck|UrlCheck]]
::: [[Module:UrlCheck/i18n|UrlCheck/i18n]]
:: [[Module:Wikidata utilities|Wikidata utilities]]
: [[Module:Marker utilities/i18n|Marker utilities/i18n]]
: [[Module:VCard/Cards|VCard/Cards]]
: [[Module:VCard/i18n|VCard/i18n]]
: [[Module:VCard/Params|VCard/Params]]
: [[Module:VCard/Qualifiers|VCard/Qualifiers]]
: [[Module:VCard/Subtypes|VCard/Subtypes]]
: [[Module:VCard/Unesco|VCard/Unesco]]
: [[Module:CountryData|CountryData]]
:: [[Module:CountryData/Currencies|CountryData/Currencies]]
:: [[Module:CountryData/Geography|CountryData/Geography]]
:: [[Module:Wikidata utilities|Wikidata utilities]]
: [[Module:Exchange rate|Exchange rate]]
: [[Module:Hours|Hours]]
:: [[Module:Hours/i18n|Hours/i18n]]
:: [[Module:Wikidata utilities|Wikidata utilities]]
: [[Module:Hours/i18n|Hours/i18n]]
: [[Module:Languages|Languages]]
: [[Module:LinkMail|LinkMail]]
:: [[Module:Link utilities|Link utilities]]
:: [[Module:Link utilities/i18n|Link utilities/i18n]]
: [[Module:LinkPhone|LinkPhone]]
:: [[Module:Link utilities|Link utilities]]
:: [[Module:Link utilities/i18n|Link utilities/i18n]]
:: [[Module:Link utilities/Phone numbers|Link utilities/Phone numbers]]
:: [[Module:Yesno|Yesno]]
: [[Module:LinkSkype|LinkSkype]]
:: [[Module:Link utilities|Link utilities]]
:: [[Module:Link utilities/i18n|Link utilities/i18n]]
: [[Module:No globals|No globals]]
: [[Module:Wikidata utilities|Wikidata utilities]]
: [[Module:Yesno|Yesno]]
0hflz0cm9alxdmkaifu6tzjjhp2nyo0
72075
72073
2026-04-07T11:31:11Z
RolandUnger
168
72075
wikitext
text/x-wiki
== Versiokontrolo ==
{{Kontrolo de versio de modulo}}
== Ekzempleroj ==
{{Mapa framo|width=300|height=300}}
<pre><nowiki>
* {{vCard | name= Ein Hotel | type = hostel | url= http://hotel.de | lat = 52.5144 | long = 13.389722 | show = all | address = Hauptstraße 1 | directions = Abzweig von der Nebenstraße | description = Das in der Innenstadt gelegene Hotel besitzt großzügige Räume, bietet aber nur ÜF. | phone = +49 (0)30 2345 1234 | fax = +49 (0)30 2345 9876, +49 0176 345 1234 | before = [[File:Flag of Germany.svg|20px|Deutschland]] | image = Berlin Friedrichstraße Galeries Lafayette.jpg | email = info@hotel.de | comment = y | lastedit = 2023-09-18 | hours = 7/24. | checkin = ab 14 Uhr | checkout = bis 12 Uhr | payment = Visa, Master, AmEx, Maestro | subtype = wlan, bar, pool, room:89 }}
* {{vCard | wikidata = Q201219 | auto = y | name = Egipta muzeo en Kairo | comment = auch Nationalmuseum | alt = Egyptian Museum | name-latin = al-Matḥaf al-Miṣrī | address = Mīdān et-Taḥrīr | address-local = ميدان التحرير | directions = im Stadtzentrum | directions-local = بوسط البلد }}
* {{vCard | wikidata = Q201219 | name = Egipta muzeo en Kairo | facebook = y | twitter = y | description = <​!-- Marker-Modus --> }}
* {{vCard | wikidata = Q1142142 | auto = y | name = Nordiska museet }} Noch weiterer Text.
* {{vCard | wikidata = Q1142142 | name = Nordia Muzeo | auto = y | price = n }}
* {{vCard | wikidata = Q257342 | name = Carnegie Library of Reims | auto = y }}
* {{vCard | wikidata = Q28934 | name = Flughaveno Bruselo Nacia | auto = y | description = Test Durchhangeln. }}
* {{vCard | wikidata = Q4872 | name = Ŝtata Muzeo de Belartoj Puŝkin | auto = y }}
* {{vCard | wikidata = Q10697 | name = Cologne Public Library | auto = y }}
* {{vCard | wikidata = Q12508 | name = Piramidoj de Gizo | auto = y | description = Test Durchhangeln. }}
* {{vCard | wikidata = Q46033 | name = Flughaveno Frankfurta | description = Test Flughafen. }}
* {{vCard | wikidata = Q46033 | name = Flughaveno Frankfurta | show = symbol | description = Test Flughafen mit Ikone. }}
* {{vCard | wikidata = Q13218762 | name = Karnak Open Air Museum | auto = y | description = Anzeige englische Wikipedia. }}
* {{vCard | wikidata = Q56506795 | name = Nile Ritz Carlton | auto = y | description = Ausgabe Anschriften. }}
* {{vCard | wikidata = Q47429618 | name = Steigenberger Hotel El Tahrir Cairo | address = | address-local = | directions = | phone = | description = Test eingeschränkte WD-Ausgabe. }}
* {{vCard | wikidata = Q637739 | name = Berliner Straße | auto = y | description = Rollstuhl aus WD. }}
* {{vCard | name = Landesmuseum für Vorgeschichte | type = museum | wikidata = Q1332407 | auto = y | description = Uhrzeiten, Kommentare. }}
* {{vCard | name = Museo Nacional de Antropología | type = museum | wikidata = Q2917041 | auto = y | description = Zusammenfassung Kommentare. }}
</nowiki></pre>
* {{vCard | name= Ein Hotel | type = hostel | url= http://hotel.de | lat = 52.5144 | long = 13.389722 | show = all | address = Hauptstraße 1 | directions = Abzweig von der Nebenstraße | description = Das in der Innenstadt gelegene Hotel besitzt großzügige Räume, bietet aber nur ÜF. | phone = +49 (0)30 2345 1234 | fax = +49 (0)30 2345 9876, +49 0176 345 1234 | before = [[File:Flag of Germany.svg|20px|Deutschland]] | image = Berlin Friedrichstraße Galeries Lafayette.jpg | email = info@hotel.de | comment = y | lastedit = 2023-09-18 | hours = 7/24. | checkin = ab 14 Uhr | checkout = bis 12 Uhr | payment = Visa, Master, AmEx, Maestro | subtype = budget, wlan, bar, pool, room:89 }}
* {{vCard | wikidata = Q201219 | auto = y | name = Egipta muzeo en Kairo | comment = auch Nationalmuseum | alt = Egyptian Museum | name-latin = al-Matḥaf al-Miṣrī | address = Mīdān et-Taḥrīr | address-local = ميدان التحرير | directions = im Stadtzentrum | directions-local = بوسط البلد }}
* {{vCard | wikidata = Q201219 | name = Egipta muzeo en Kairo | facebook = y | twitter = y | show = copy | description = <​!-- Marker-Modus --> }}
* {{vCard | wikidata = Q1142142 | auto = y | name = Nordiska museet }} Noch weiterer Text.
* {{vCard | wikidata = Q1142142 | name = Nordia Muzeo | auto = y | price = n | show = copy }}
* {{vCard | wikidata = Q257342 | name = Carnegie Library of Reims | auto = y }}
* {{vCard | wikidata = Q28934 | name = Flughaveno Bruselo Nacia | auto = y | description = Test Durchhangeln. }}
* {{vCard | wikidata = Q4872 | name = Ŝtata Muzeo de Belartoj Puŝkin | auto = y }}
* {{vCard | wikidata = Q10697 | name = Cologne Public Library | auto = y }}
* {{vCard | wikidata = Q12508 | name = Piramidoj de Gizo | auto = y | description = Test Durchhangeln. }}
* {{vCard | wikidata = Q46033 | name = Flughaveno Frankfurta | description = Test Flughafen. }}
* {{vCard | wikidata = Q46033 | name = Flughaveno Frankfurta | show = symbol, copy | description = Test Flughafen mit Ikone. }}
* {{vCard | wikidata = Q13218762 | name = Karnak Open Air Museum | auto = y | description = Anzeige englische Wikipedia. }}
* {{vCard | wikidata = Q56506795 | name = Nile Ritz Carlton | auto = y | description = Ausgabe Anschriften. }}
* {{vCard | wikidata = Q47429618 | name = Steigenberger Hotel El Tahrir Cairo | address = | address-local = | directions = | phone = | description = Test eingeschränkte WD-Ausgabe. }}
* {{vCard | wikidata = Q637739 | name = Berliner Straße | auto = y | description = Rollstuhl aus WD. }}
* {{vCard | name = Landesmuseum für Vorgeschichte | type = museum | wikidata = Q1332407 | auto = y | description = Uhrzeiten, Kommentare. }}
* {{vCard | name = Museo Nacional de Antropología | type = museum | wikidata = Q2917041 | auto = y | description = Zusammenfassung Kommentare. }}
== Modulaj dependecoj ==
[[Module:VCard|VCard]]
: [[Module:Marker utilities|Marker utilities]]
:: [[Module:Coordinates|Coordinates]]
::: [[Module:Coordinates/i18n|Coordinates/i18n]]
:: [[Module:Marker utilities/Groups|Marker utilities/Groups]]
:: [[Module:Marker utilities/i18n|Marker utilities/i18n]]
:: [[Module:Marker utilities/Maki icons|Marker utilities/Maki icons]]
:: [[Module:Marker utilities/Types|Marker utilities/Types]]
:: [[Module:UrlCheck|UrlCheck]]
::: [[Module:UrlCheck/i18n|UrlCheck/i18n]]
:: [[Module:Wikidata utilities|Wikidata utilities]]
: [[Module:Marker utilities/i18n|Marker utilities/i18n]]
: [[Module:VCard/Cards|VCard/Cards]]
: [[Module:VCard/i18n|VCard/i18n]]
: [[Module:VCard/Params|VCard/Params]]
: [[Module:VCard/Qualifiers|VCard/Qualifiers]]
: [[Module:VCard/Subtypes|VCard/Subtypes]]
: [[Module:VCard/Unesco|VCard/Unesco]]
: [[Module:CountryData|CountryData]]
:: [[Module:CountryData/Currencies|CountryData/Currencies]]
:: [[Module:CountryData/Geography|CountryData/Geography]]
:: [[Module:Wikidata utilities|Wikidata utilities]]
: [[Module:Exchange rate|Exchange rate]]
: [[Module:Hours|Hours]]
:: [[Module:Hours/i18n|Hours/i18n]]
:: [[Module:Wikidata utilities|Wikidata utilities]]
: [[Module:Hours/i18n|Hours/i18n]]
: [[Module:Languages|Languages]]
: [[Module:LinkMail|LinkMail]]
:: [[Module:Link utilities|Link utilities]]
:: [[Module:Link utilities/i18n|Link utilities/i18n]]
: [[Module:LinkPhone|LinkPhone]]
:: [[Module:Link utilities|Link utilities]]
:: [[Module:Link utilities/i18n|Link utilities/i18n]]
:: [[Module:Link utilities/Phone numbers|Link utilities/Phone numbers]]
:: [[Module:Yesno|Yesno]]
: [[Module:LinkSkype|LinkSkype]]
:: [[Module:Link utilities|Link utilities]]
:: [[Module:Link utilities/i18n|Link utilities/i18n]]
: [[Module:No globals|No globals]]
: [[Module:Wikidata utilities|Wikidata utilities]]
: [[Module:Yesno|Yesno]]
ojmzvjulqy1iyycomh1q7y1x43tt64c
Lombardio
0
5065
72058
72053
2026-04-07T05:36:55Z
Tiguliano
53
/* Esperanto */
72058
wikitext
text/x-wiki
{{Rubando|Milano Wikivoyage banner2.jpg}}
{{Informkesto regiono
| nomo = Lombardio
| flago =
| flagograndeco =
| lando = Italio
| bildo = Dosiero:Milan skyline skyscrapers of Porta Nuova business district.jpg
| bildotitolo = Milana panoramo de "Porta Nuova" komercdistrikto
| situo =
| ĉefurbo = Milano
| areo = 23.861
| loĝantaro = 9.967.231
| horzono =
}}
'''{{W|Lombardio|Lombardio}}''' ([[Itala_frazlibro|Itale]]: '''Lombardia''' - elp. ''lombar'dia''), estas regiono de norda [[Italio]]. Ĝia ĉefurbo estas [[Milano]].
== Provincoj (Subregionoj) ==
Administre la lombarda teritorio dividiĝas en dekdu partoj: La metropola urbo Milano kaj dekunu provincoj:
(Datumoj ĝisdatigitaj je la 31-a de januaro 2022).
[[Dosiero:Map_of_region_of_Lombardy,_Italy,_with_provinces-it.svg|eta|La dekdu provincoj de Lombardio]]
{|class="wikitable sortable"
!Poz.
!Provinco/Metropola urbo
!Loĝantoj
!Areo (km²)
|-
|'''1'''
|[[Metropola urbo Milano|Milano]]
|align=right| '''3.236.683'''
|align=right| 1.576
|-
|'''2'''
|[[Provinco Varezo|Varezo]]
|align=right| '''877.780'''
|align=right| 1.198
|-
|'''3'''
|[[Provinco Komo|Komo]]
|align=right| '''594.469'''
|align=right| 1.279
|-
|'''4'''
|[[Provinco Leko|Leko]]
|align=right| '''332.388'''
|align=right| 806
|-
|'''5'''
|[[Provinco Sondrio|Sondrio]] (kiu korespondas al turisma areo Valtelino)
|align=right| '''178.132'''
|align=right| 3.196
|-
|'''6'''
|[[Provinco Bergamo|Bergamo]]
|align=right| '''1.102.544'''
|align=right| 2.755
|-
|'''7'''
|[[Provinco Pavio|Pavio]]
|align=right| '''534.611'''
|align=right| 2.969
|-
|'''8'''
|[[Provinco Lodo|Lodo]]
|align=right| '''227.051'''
|align=right| 783
|-
|'''9'''
|[[Provinco Kremono|Kremono]]
|align=right| '''351.221'''
|align=right| 1.770
|-
|'''10'''
|[[Provinco Breŝo|Breŝo]]
|align=right| '''1.253.700'''
|align=right| 4.786
|-
|'''11'''
|[[Provinco Mantovo|Mantovo]]
|align=right| '''404.378'''
|align=right| 6.827
|-
|'''11'''
|[[Provinco Monzo kaj Brianco|Monzo kaj Brianco]]
|align=right| '''870.231'''
|align=right| 405
|}
{{-}}
<br style="clear:both;" />
== Urboj ==
[[File:Caterinadelsasso0001.jpg|thumb|200px|left|Majora Lago- Caterina del Sasso]]
[[File:Full Milan skyline from Duomo roof.jpg|thumb|[[Milano]]]]
[[File:Italia Bergamo 15.JPG|thumb|[[Bergamo]]]]
[[File:Cremona centro.jpg|thumb|[[Kremono]]]]
[[File:Mantova - Profilo di Mantova.jpg|thumb|[[Mantuo]]]]
[[File:Broletto&Duomo-Pavia-Italy.jpg|thumb|[[Pavio]]]]
[[File:Lago Moro - Darfo Boario Terme (Foto Luca Giarelli).jpg|thumb|[[Darfo Boario Terme|Boario Terme]]]]
{| class="wikitable"
|-
! Urbo !! en teritorio de: !! loĝantoj
|-
| [[Milano]] || <small>[[Metropola urbo Milano]] || 1.303.300
|-
| [[Breŝo]] || <small>[[Provinco Breŝo]] || 190.100
|-
| [[Monzo]] || <small>[[Provinco Monzo kaj Brianco]] || 121.500
|-
| [[Bergamo]] || <small>[[Provinco Bergamo]] || 115.700
|-
| [[Komo]] || <small>[[Provinco Komo]] || 83.300
|-
| [[Varezo]] || <small>[[Provinco Varezo]] || 82.200
|-
| [[Sesto san Giovanni]] || <small>[[Metropola urbo Milano]] || 80.700
|-
| [[Busto Arsicjo]] || <small>[[Provinco Varezo]] || 80.000
|-
| '''{{W|Cinisello Balsamo|Cinisello Balsamo}}''' || <small>[[Metropola urbo Milano]] || 74.200
|-
| [[Kremono]] || <small>[[Provinco Kremono]] || 70.900
|-
| [[Pavio]] || <small>[[Provinco Pavio]] || 70.871
|-
| [[Mantuo]] || <small>[[Provinco Mantovo]] || 49.275
|-
| [[Leko]] || <small>[[Provinco Leko]] || 46 916
|-
| [[Lodo]] || <small>[[Provinco Lodo]] || 44.934
|-
| [[Sondrio]] || <small>[[Provinco Sondrio]] || 21.079
|}
=== Esperantaj urboj ===
*[[Milano]] estas la sidejo de la [https://www.esperanto.it/ Itala Esperanta Federacio];
Ankaŭ estas la Milana Esperanto Klubo: "[https://www.esperantomilano.it Circolo Esperantista Milanese]"
Aliaj grupoj en Lombardio en la sekvaj urboj:
*[[Breŝo]] - [https://ttt.esperanto.it/brescia Gruppo Esperantista Bresciano]
*[[Bergamo]] - [https://bergamoesperanto.it/ Bergama Esperanto Grupo]
*[[Sondrio]] - Sondrio Esperanto-grupo
*[[Mantovo]] - Gruppo Esperantista Mantovano
*[[Kremo]] (itale Crema, elp.: Krema) - en Kremo aktivis la esperanta pioniro '''{{W|Daniele Marignoni}}''', kiu en en 1890 eldonis la unuan esperanto-lernolibron por italoj.
== Aliaj cellokoj ==
=== Termaj urboj ===
:* [[Angolo Terme]] - En Val di Scalve, en la teritorio de [[Valcamonica]], ties [https://www.aquathermae.net/lombardia/terme-di-angolo/ termoj] havas sulfat-bikarbonatajn-alkalajn-terajn akvojn.
:* [[Darfo Boario Terme|Boario Terme]] - Ĝiaj [https://www.termediboario.it termoj], en la teritorio ĉirkaŭanta la [[Valcamonica]] ili jam estis uzitaj en la deksesa jarcento; ili havis grandan sponsoron en Alessandro Manzoni kiu laŭdis ilin, tiel igante ilin famaj longe preter lokaj limoj.
:* [[Bormio]] - Estas multnombraj termofontoj en ĝia ĉirkaŭaĵo; la [https://www.bormioterme.it termoj] profitas de la multnombra somera kaj vintra turisma ĉeesto en la urbo. Bormio estas ankaŭ fama skiejo en Alta Valtelino, vizitebla eĉ en ununura tago. Braulio, herba amaro, estas produktita en tiu loko. Rekomendinda ekskurso estas vizito al la [[Pasejo Stelvio]], proksimume 20/22 km kaj 30/35 minutoj for, kiu estas celo por biciklantoj kaj motorciklantoj. Ĉi tiu pasejo estas la plej alta en Italio, ĉar la alteco estas 2758 m super marnivelo.
:* [[Salice Terme]] - Ĝi preskaŭ estas kunurbita kun Rivanazzano, malgraŭ esti parto de la municipa teritorio de Godiasco. La sanigaj kvalitoj de ĝiaj termikaj akvoj estis bone konataj de la romianoj, kiuj jam uzis ilin. Ĝiaj [https://www.termedisalice.it termoj] ĝuas pli grandan famon ol tiuj de la proksima Rivanazzano.
:* [[San Pellegrino Terme]] -En la Supra Bergamo-areo, la Banejoj San Pellegrino havis unuafoje sian famon inter la fino de la 19-a jarcento kaj la komenco de la 20-a jarcento, kiam ĝia evoluo kiel kuracloko kaŭzis rimarkindan urban transformon.
:* [[Sirmione]] - La [https://www.termedisirmione.com termoj] de la urbo de Catullo jam estis konataj kaj frekventitaj de la romianoj, kaj daŭre estas bazŝtono de turismo en ĉi tiu centro de altvalora beleco ĉe [[Garda Lago]].
:* [[Trescore Balneario]] - En la bergama areo, ties [https://www.aquathermae.net/lombardia/terme-di-trescore/ termoj] inter [[Bergamo]], [[Valcamonica]] kaj [[Lago Iseo]] estis jam konataj en la Mezepoko.
:* [[Vallio Terme]] - En la Breŝa teritorio direkte al Valo Trompia, ĝia [https://www.acquacastello.it terma banloko-establo] komencis funkciigi en la lastaj tempoj, en la mezo de la dudeka jarcento.
== Kompreni ==
La regiono estas la unua en Italio laŭ loĝantaro kaj la kvara laŭ areo, post Sicilio, Piemonto kaj Sardio. Ĝi havas sian ĉefurbon en la urbo Milano kaj limas norde kun Svislando (Kantono Tiĉino kaj Kantono Grizono), okcidente kun Piemonto, oriente kun Veneto kaj Trentino-Alto Adiĝo kaj sude kun Emilio-Romanjo .
Lombardio, unu el la plej riĉaj teritorioj en [[Eŭropo]], estas la "ekonomia ĉefurbo" de Italio danke ankaŭ al siaj industrioj: ŝtalfabrikoj ('''Falck'''), rafinejoj, aŭtofabrikoj ('''Autobianchi''', '''Maserati''', '''Alfa''', '''Innocenti'''), eldonejoj ('''Rizzoli''', '''Mondadori'''), fabrikoj de meblaro, ŝuoj, nutraĵoj, ktp.
=== Teritorioj kaj turismaj cellokoj ===
Kvankam turismo en Lombardio ne reprezentas, kiel en aliaj italaj regionoj, unu el la ĉefaj agadoj, tamen, danke al la ĉeesto de diversaj naturaj belaĵoj (lagoj kaj montoj) kaj art-urboj ĝi sukcesas altiri signifan nombron da homoj ĉiujare.
En Lombardio, 13.258.859 alvenoj kaj 33.123.562 ĉeestoj estis registritaj en 2011.
Ne-loĝantoj kontribuis al 49,72% de alvenoj kaj 55,8% de ĉeestoj. Inter la plej vizititaj lokoj ni devas memori la '''Pinakotekon de Brera''' (336.981 vizitantoj), la '''Lasta Vespermanĝo de Leonardo da Vinci''' (330.071), la '''Arkeologia Muzeo de Sirmione''' kun la '''[[Kavernoj de Katulo]]''' (216.612), la '''Skaliĝera Kastelo''' (202.066).
{{Listo de regionoj
| mapo= Lombardia IT-WV map1.png
| titolomapo= Areoj de Lombardio
| tekstomapo=
| grandecomapo= 400px
| nomoregiono1= [[Lombarda alpa arko]]
| kolororegiono1= #D09440
| elementojregiono1=
| priskriboregiono1= Lombardio entenas norde vastan montaran areon, parton de centraj [[Alpoj]]. La plej altaj pintoj estas en la [[Bernina Montaro]], ĉe la landlimo kun Svislando, kaj superas 4000 m (4050 en Svislando, sed proksime al la landlimo; 4020 precize en Lombardio). Pluraj montoj superas 3500 m.
| nomoregiono2= [[Antaŭalpoj kaj grandaj lagoj de lombardio]]
| kolororegiono2= #4F93C0
| elementojregiono2=
| priskriboregiono2= Pli sude, sed ankoraŭ en la norda duono de Lombardio, estas kalkoŝtonaj montoj nomataj ''Prealpi'' (= Antaŭ-Alpoj). Ili estas malpli altaj (nur ĝis ĉirkaŭ 2500 m) sed ofte pli krutaj. En la sama zono estas ankaŭ famaj lagoj, lasintaj de antikvaj glacieroj. Inter ili, la plej grandaj estas [[Majora Lago]] (''Lago Maggiore''), [[Lago de Komo]] (''Lago di Como'') kaj [[Garda-Lago]] (''Lago di Garda'').
| nomoregiono3= [[Lombarda pada alta ebenaĵo]]
| kolororegiono3= #B5D29F
| elementojregiono3=
| priskriboregiono3= Ĝi estas la areo de plata kamparo sed ĉefe de sovaĝa urbigo kun la grandaj metropolaj areoj kaj kunurboj de [[Milano]] kaj ĝia vasta kunurbaro, de [[Monza]] kaj [[Brianza]], de [[Saronno]], [[Busto Arsizio]], [[Gallarate]], kaj [[Legnano]], kiuj tamen havas turisman oferton de urboj de arto.
| nomoregiono4= [[Lombardia pada malalta ebenaĵo]]
| kolororegiono4= #B383B3
| elementojregiono4=
| priskriboregiono4= La urboj [[Vigevano]], [[Voghera]], [[Pavio]], [[Lodi]], [[Kremono]], [[Mantuo]] (Monda heredaĵo de Unesko), [[Casalmaggiore]], [[Sabbioneta]] (Monda heredaĵo de Unesko), kaj iliaj riĉaj teritorioj.
}}
=== Historio ===
La nomo de la regiono devenas de "Longobardia" kiu estis la nomo, post la falo de la romia imperio, de la teritorioj okupitaj de la popolo de la {{W|Lombardoj}} (ĝermanaj triboj) en norda Italio kaj ankaŭ en centra kaj suda Italio (duklandoj de Spoleto kaj de Benevento).
La nomo "Lombardia" komencis difini pli limigitan teritorion kiam la Aŭstria Imperio, ekposedinte ĉi tiun regionon en 1717, komencis indiki ĝin kiel "Aŭstria Lombardio": do ekde tiu tempo la nomo "Lombardio" celas teritorion kiu egalas proksimume al la moderna itala regiono.
=== Etnoj ===
=== Klimato ===
La klimato de Lombardio, kvankam difinebla kiel temperita subkontinenta tipo, estas tre varia pro la malsamaj naturaj formoj ĉeestantaj en la areo: montoj, montetoj, lagoj kaj ebenaĵoj.
Ĝenerale la somersezonoj en la ebenaĵoj estas tre humidaj kaj varmaj. Kontinenteco signifas, ke la mezaj maksimumaj temperaturoj en julio estas 29 °C. Sed en ĉi tiuj monatoj de la jaro ankaŭ oftas fortaj fulmotondroj kaj subitaj pluvegoj, akompanataj de hajlo, foje eĉ forta pluvego. Vintroj estas malvarmaj kaj longaj kun limigita pluvokvanto. Precipitaĵo estas pli intensa en la antaŭalpa areo, ĝis 1,500-2,000 mm jare, sed ankaŭ abundas en la ebenaĵoj kaj alpaj areoj, kun mezumo de 600-850 mm jare. La totala jarpluvo averaĝas 827 mm. La temperatura gamo dum la tuta jaro estas alta kaj la nebulo estas intensa. En la montoj la klimato estas tipe Alpa kun malvarmetaj someroj kaj abunda pluvokvanto kaj longaj, severaj kaj malmulte pluvaj vintroj. La [[Lombardia Pada Valo]] estas unu el la malplej ventolitaj areoj de [[Italio]]. La neĝo, abunda sur la montetoj, falas ankaŭ sur la ebenaĵoj, ĉar la averaĝa minimuma temperaturo en januaro estas -1°C. [[Garda Lago]] helpas reguligi la temperaturon de la ĉirkaŭaj regionoj, kreante "mediteranean" mikroklimaton kiu ebligas olivkultivadon. La antaŭalpa zono kaj la supra Oltrepò havas malvarmetan temperitan klimaton, la mez-alpaj montoj havas malvarman temperitan klimaton kaj la pintoj havas glacian klimaton.
== Eniri ==
Lombardio estas servita per multaj aŭtovojoj kaj ringaj vojoj:
A1: Ligas [[Milano]] kun [[Napolo]] tra [[Bologno]], [[Florenco]], [[Romo]].
A4: Ligas [[Torino]] kun [[Triesto]] tra [[Milano]], [[Bergamo]] kaj [[Breŝo]].
A7: Ligas [[Milano]] al [[Ĝenovo]] tra [[Pavio]] kaj [[Voghera]].
A8: Ĝi komenciĝas de [[Milano]] kun kvar koridoroj kaj ĉe [[Lainate]] daŭras per tri koridoroj al [[Varese]].
A9: Ĝi komenciĝas de [[Lainate]] kaj daŭras en du koridoroj al [[Ponte Chiasso]] kaj [[Svislando]], pasante tra [[Como]].
A21: Ligas [[Torino]] kun [[Brescia]] tra [[Voghera]], [[Piaĉenco]] kaj [[Kremono]].
A22: Ligas [[Modenon]] kun la [[Brennero|Brennero-pasejo]] tra [[Mantuo]].
A35: Ligas [[Milano]] kun [[Breŝo]].
A50: Ligas la A8 de la Terrazzano-bariero kaj la A1 al la Milana Suda-bariero.
A52: Ligas [[Monza]] kun la A4.
=== Eniri avie ===
[[Dosiero:Milan malpensa terminal airport.jpg|eta|Flughaveno de Milano Malpensa, finstacio 1]]
Lombardio estas servata de la granda interkontinenta flughaveno de '''[[Milano Malpensa]]''' ([[IATA flughavenkodo|IATA]]: MXP), situanta en la provinco de [[Varese]] kaj konektita al la centro de [[Milano]] per la ''[https://www.malpensaexpress.it/ Malpensa Express]'' trajnservo kaj kun diversaj buslinioj. La flughaveno estas dividita en du finstaciojn: la flugoj de la ĉefaj "naci-flagaj" aviadkompanioj foriras de la finstacio 1, la plej moderna, dum la ĉefe malmultekostaj flugoj de la kompanio [http://www.easyjet.com/it Easyjet] foriras de la finstacio 2.
La flughaveno de '''[[Milano-Linate Flughaveno|Milano Linate]]''' ([[IATA flughavenkodo|IATA]]: LIN), tamen, kiu gastigas ekskluzive nacian, eŭropan kaj malmultekostan trafikon, troviĝas (pli proksime al la urbo), tuj oriente de Milano.
En [[Bergamo]] estas la '''[[Flughaveno Bergamo-Orio al Serio]]''' ([[IATA flughavenkodo|IATA]]: BGY), kiu estas ĉefe uzata por malmultekostaj flugoj, ĉarto kaj kargo. La ĉefa kompanio funkcianta en la flughaveno [[Orio al Serio]] estas [http://www.ryanair.com Ryanair] kun flugoj al ĉiuj ĉefaj eŭropaj urboj kiel [[Parizo]] (Beauvais), [[Londono] ] ( Stansed), [[Dublino]], [[Madrido]], [[Bruselo]] (Charleroi), [[Berlino]] (Schoenefeld) kaj [[Ateno]].
Fine, en [[Breŝo]], estas la'''[[Brescia-Montichiari Flughaveno|Montichiari Flughaveno]]''' ([[IATA flughavenkodo|IATA]]: VBS), dediĉita preskaŭ ekskluzive al nur kargotrafiko kaj ĉartaj flugoj.
Entute, la kvar flughavenoj pritraktas trafikon superantan ''30 milionojn da pasaĝeroj'' ĉiujare kaj reprezentas la plej gravan flughavensistemon en Italio (la plimulto de itala aertrafiko estas koncentrita en la Lombardia areo).
=== Eniri trajne ===
[[File:IMG 3035 Binari Stazione centrale di Milano - Foto Giovanni Dall'Orto 1-1-2007.jpg|thumb|Centra stacidomo de Milano]]
La '''Servizio Ferroviario Suburbano''' ("'''S'''"), kiu konsistas el 10 antaŭurbaj linioj, ligas grandan parton de la milana metropola areo (''Granda Milano''), kaj aliaj gravaj urboj proksimaj ([[Saronno]], [[Varese]], [[Novaro]], ktp.). La servo estas administrita de Trenord kaj, por la S5 nur, de la ATI inter Trenord kaj ATM.
La 10 S-linioj garantias trajnon ĉiun duonhoron de 06:00 ĝis 00:30, ĉiun tagon de la jaro por servo simila al la metroo (korespondas al la pariza RER kaj la germana S-Bahn). La trajnoj ĉiam veturas je la sama minuto de ĉiu horo kaj faras ĉiujn haltojn laŭ la itinero.
En Milano oni vojaĝas kun urba bileto.
La '''Regiona Fervoja Servo''' ("'''R'''") tamen ligas ĉiujn ĉefajn urbojn de Lombardio kaj ligas la regionon kun la nacia fervoja reto.
La malsamaj transportretoj estas tre apartaj kaj estas rekoneblaj ekster la stacidomoj kaj diversaj haltoj danke al specifaj lumaj signoj indikante ''S'' aŭ ''R'', tiel konsiderinde faciligante la interŝanĝon inter la sistemoj.
{{-}}
=== Eniri buse ===
=== Eniri piede ===
== Moviĝi ==
[[File: Frecciarossa 1000 nuova livrea.jpg|thumb|Lokomotivo Frecciarossa 1000]]
=== Piediri ===
=== Publika transporto ===
==== Milano-areo ====
La firmao kiu administras publikan transporton en Milano kaj proksimaj municipoj estas [https://www.atm.it/it/Pagine/default.aspx ATM].
Ene de la Milana metropola areo ekzistas fervoja transportreto bazita sur du interkonektitaj sistemoj:
* la [https://www.scopriremilano.com/metro Milana Metroo] reto (5 M-linioj)
* la antaŭurba reto de la Milana antaŭurba fervoja servo (12 S-linioj: S1, S2, S3, S4, S5, S6, S7, S8, S9, S11, S12, S13).
==== Breŝa areo ====
[[Dosiero:Bs due scura 2.jpg|eta|Stacio de la Breŝa Metroo]]
La firmao kiu administras publikan transporton en la urbo kaj landinterno de Breŝo estas Brescia Trasporti; la sama firmao okupiĝas ankaŭ pri urba publika transporto en la komunumo [[Desenzano del Garda]].
La Breŝa Metroo transiras la urbon de sudoriento al nordo.
==== Bergama areo ====
[[Dosiero:842BergamoFunicolare.jpg|eta|Veturilo sur la Bergama funikularo]]
La firmao kiu administras lokan publikan vojtransporton estas la [https://www.atb.bergamo.it/it Azienda Trasporti Bergamo] (ATB), dum la tramo Bergamo-Albino, estas funkciigita de TEB [https://www.teb.bergamo.it/it Tramvie Elettriche Bergamasche].
ATB ankaŭ funkciigas la funikularoj Bergamo Alta, Bergamo-San Vigilio, kaj San Pellegrino.
==== Vareza areo ====
La firmao kiu administras lokan publikan vojtransporton estas CTPI (Consorzio Trasporti Pubblici Insubria), dum la funikularo Vellone-Sacro Monte estas administrita fare de AVT.
==== Como areo ====
La firmao kiu administras lokan publikan vojtransporton nomiĝas ASF. La funikularo Como-Brunate estas administrata de ATM.
==== Transportiĝi trajne ====
Du integraj retoj ligas la regionon.
* La nacia reto de '''[http://www.trenitalia.com Trenitalia]''', kiu ĉefe administras la orient-okcidentan itineron (Modane-Torino-Trieste-Villa Opicina) kaj la nord-sudan itinerojn (Domodossola) - Milano-Romo-Palermo kaj Chiasso-Milano-Genovo).
* La regiona reto de '''[http://www.trenord.it Trenord]''', kun la linioj [[Milano]] kaj [[Brescia]].
=== Veturi aŭte ===
La aŭtovoja reto en Lombardio estas tre ampleksa; La aŭtovojo A4 trairas la tutan regionan teritorion de oriento al okcidento, kunligante la urbojn [[Breŝo]], [[Bergamo]], [[Monza]] kaj [[Milano]], ĝi estas karakterizita de aparte intensa trafiko dum la tuta jaro, sed ĝi estas apogita fare de la "BreBeMi", aŭtovojo kiu ligas Breŝon al la Estera orienta ringvojo de Milano pasante tra [[Treviglio]], anstataŭ ol Bergamo. La ringa sistemo de [[Milano]] estas la plej granda en Italio, entute 74,4 km longa kaj konsistas el tri ringaj vojoj: Okcidenta ringa vojo (aŭtovojo A50), orienta ringa vojo (aŭtovojo A51) kaj Norda ringa vojo (Aŭtovojo A52]]; de Milano ankaŭ disbranĉiĝas la Aŭtovojo A1 (suden), la Aŭtovojo A7, la Aŭtovojo A35 kaj la Lagoj Aŭtovojo (A8) kaj la Aŭtovojo A9 kiu ligas Lombardion kun [[Svislando]] En la regiono estas ankaŭ la aŭtovojoj A21 , la aŭtovojo A22 , la aŭtovojo A36 , la ringvojoj de Pavia (A53 kaj A54), la ringvojo de suda Bergamo, la ringvojoj de suda kaj okcidenta Breŝo, la ringvojo de Varese, kaj tiu de Como.
=== Navigado ===
La regiono havas ŝipan sistemon kiu disvolviĝas ĉe la lagoj, kaj laŭ la riveroj kaj la kanaloj ("navigli"). La plej grava akvovojsistemo en Lombardio estas parto de la Pada-Veneta sistemo kiu permesas navigadon de [[Casale Monferrato]] al [[Venecio]] laŭ la rivero [[Pado]]. En ĉi tiu akvovoja sistemo la plej gravaj havenoj en Lombardio estas tiuj de Kremono kaj Mantuo.
Navigado sur la lagoj havas ĉefe turisman funkcion, kaj okazas regule sur planitaj itineroj kiuj longas 460 km kaj estas vizitataj de pli ol 10 milionoj da vojaĝantoj jare.
== Vidi ==
<gallery>
Dosiero:Bellagio and Lake Como.jpg|[[Bellagio]] kaj la [[Lago de Komo]].
Dosiero:Milano galleria piazza duomo.jpg|Piazza Duomo, en Milano.
</gallery>
Kvankam Lombardio estas ofte identigita kiel regiono kun strikte ekonomia alvokiĝo, ĝi posedas artan heredaĵon de escepta valoro. La multaj atestoj iras de la prahistorio ĝis la nuntempo, pasante tra la romia epoko sed ĉefe tra la '''Mezepoko''' kaj la '''Renesanco''', kiam Lombardio estis unu el la areoj de maksimuma florado de la mezepokaj municipoj, tiam fundamenta centro de la Renesanco. La multaj monumentoj koncentriĝas antaŭ ĉio en la multnombraj arturboj kiuj plejparte respondas al la plej gravaj mezepokaj municipoj kaj renesancaj urboj kaj fariĝis, kun kelkaj esceptoj, la nunaj provincaj ĉefurboj. En Lombardio, aliflanke, ekzistas multaj pli malgrandaj urboj kiuj prezentas signifajn signojn de la pasinteco, aparte la multaj '''kasteloj''' kaj sanktaj konstruaĵoj disigitaj ĉie en la regiono.
Kiel atesto pri la valoro de la regiona arta heredaĵo, Lombardio estas, kun naŭ ejoj, la itala regiono kiu gastigas la plej grandan nombron da [[Mondheredaĵoj]] protektitaj de '''Unesko''', kaj gastigas la unuan italan ejon inkludita en la listo, la rokaj ĉizadoj de ''[[Val Camonica]]''.
Krom la ejoj de Unesko, Lombardio estas hejmo de multaj aliaj trezoroj kiel la ''Piazza Ducale'' en [[Vigevano]], konsiderata unu el la plej belaj placoj en Italio, '''[[Bergamo|Bergamo alta]]''', kun siaj mallarĝaj stratoj kaj konstruaĵoj enfermitaj inter la muroj por gardi antikvajn belaĵojn kaj la Katedralon de [[Kremono]].
=== Unesko-ejoj ===
La ejoj agnoskitaj de Unesko kiel [[Monda Heredaĵo]] estas:
* Lago de Lugano
[[Dosiero:Lake Lugano.jpg|eta|alternative=Lago de Lugano|Lago de Lugano]]
{{-}}
* '''[[Monte San Giorgio]]''', piramidforma, arbarkovrita monto proksime de [[Lago de Lugano]], estas konsiderata kiel havi la plej bonan kolekton de marvivaj fosilioj el la Triaso (antaŭ 245-230 milionoj da jaroj). Tiuj trovaĵoj estas signoj de vivo en tropika lagunmedio, ŝirmita kaj parte apartigita de la malferma maro per enmara koralrifo. Diversaj formoj de mara vivo prosperis ene de tiu laguno, inkluzive de reptilioj, fiŝoj, bivalvoj, amonitoj, ekinodermoj kaj krustacoj. Ĉar la laguno estis proksima al la kontinento, surteraj fosilioj de reptilioj, insektoj kaj plantoj ankaŭ estas trovitaj inter la restaĵoj, rezultigante tre riĉan fonton de fosilioj.
{{-}}
* ''Cenacolo'' de Leonardo da Vinci
[[Dosiero:Leonardo da Vinci 002.jpg|eta|alternative=Leonardo da Vinci ''Cenacolo''|Leonardo da Vinci ''Cenacolo'']]
'''Cenacolo Vinciano''', en la refektorio de la Monaĥejo Santa Maria delle Grazie en [[Milano]], sur la norda muro troviĝas la '''Lasta Vespermanĝo''', la ĉefverko pentrita inter 1495 kaj 1497 de Leonardo da Vinci, kies laboro estis anonci novan epokon en la historio de la arto.
{{-}}
* Crespi d'Adda, oficeja konstruaĵo
[[Dosiero:Crespi d'Adda, palazzina uffici.jpg|eta|alternative=Crespi d'Adda, oficeja konstruaĵo|Crespi d'Adda, oficeja konstruaĵo]]
elstara ekzemplo de 19-a/20-a jarcento "kompania urbo" konstruita en Eŭropo kaj Nordameriko de kleraj industriuloj por kontentigi la bezonojn de laboristoj. La ejo daŭre estas rimarkinde sendifekta kaj parte uzita por industriaj celoj, kvankam ŝanĝiĝantaj ekonomiaj kaj sociaj kondiĉoj hodiaŭ prezentas minacon al sia supervivo.
{{-}}
* ''Rosa Camuna''
[[Dosiero:Rosa camuna R24 - Foppe - Nadro (Foto Luca Giarelli).jpg|eta|alternative=Rosa Camuna R24 - Foppe - Nadro (Foto Luca Giarelli)|Rosa Camuna R24 - Foppe - Nadro (Foto Luca Giarelli)]]
[[Rokaj ĉizadoj de Val Camonica]]'''. La [[Val Camonica]], situanta en la [[Lombardia Alpa Arko]], havas unu el la plej grandaj kolektoj de prahistoriaj petroglifoj en la mondo; pli ol 140,000 simboloj kaj figuroj ĉizitaj en la rokon dum periodo de 8,000 jaroj kaj prezentantaj temojn ligitajn al agrikulturo, navigacio, militado kaj magio. Inter la skulptitaj simboloj, menciindas la Camuna Rozo, uzata kiel simbolo de la Lombardia Regiono.
{{-}}
* Bernina Fervojo
[[Dosiero:RhB_ABe_4-4_III_Kreisviadukt_Brusio.jpg|eta|alternative=Bernina fervojo|Bernina fervojo]]
'''[[Bernina Fervojo]]''': montara fervojlinio, kiu ligas la urbon [[Tirano]], en [[Italio]], kun [[Svislando]] [[Skt. Moritz]]. Konstruita inter 1906 kaj 1910 por turismaj celoj, la linio atingas maksimuman altecon de 2,253 m kun aŭdacaj heroaĵoj de fervoja inĝenierado, igante ĝin la plej alta natura adhera fervojo en la Alpoj, same kiel unu el la plej krutaj en la mondo.
{{-}}
* Sanktaj Montoj
[[Dosiero:Verese, Sacro Monte, Chapel 2, La Visitazione 001.JPG|eta|alternative=Verese, ''Sacro Monte''|Varezo, ''Sacro Monte'']]
'''[[Sanktaj Montoj de Varese kaj Ossuccio]]''': la ''Sanktaj Montoj'' estas grupoj de kapeloj kaj aliaj arkitekturaj elementoj kreitaj fine de la 16-a kaj 17-a jarcentoj kaj dediĉitaj al malsamaj aspektoj de la kristana kredo. Krom ilia spirita kaj simbola signifo, tiuj estas de granda beleco pro la majstrado kun kiu ili estis integritaj en la ĉirkaŭan naturan pejzaĝon de montetoj, arbaroj kaj lagoj.
{{-}}
* [[Mantuo]]''' kaj '''[[Sabbioneta]]
[[Dosiero:Mantova - Profilo di Mantova.jpg|eta|alternative=Mantuo - Profilo de Mantuo|Mantuo - Profilo de Mantuo]]
'''[[Mantuo]]''' kaj '''[[Sabbioneta]]''', en la [[Malsupra Pada Valo de Lombardio]], reprezentas du aspektojn de Renesanca urboplanado: Mantuo montras la renovigon kaj vastiĝon de ekzistanta urbo, dum 30 km for, Sabbioneta reprezentas la efektivigon de la teorioj de la periodo pri ideala urboplanado. Ĝenerale, la enpaĝigo de Mantuo estas neregula kie regulaj partoj montras malsamajn stadiojn de sia kresko de la romia periodo kaj inkludas multajn mezepokajn konstruaĵojn inkluzive de 11-ajarcenta rotondo kaj baroka teatro. Sabbioneta, konstruita en la dua duono de la 16-a jarcento sub la regado de ununura persono, Vespasiano Gonzaga Colonna, povas esti priskribita kiel unuperioda grandurbo kaj havas ortangulan kradplanon. La idealoj de la Renesanco, favorataj de la familio '''Gonzaga''', ĉeestas en la morfologio kaj arkitekturo de la urboj.
{{-}}
* [[Brescia]]''' kaj '''[[Castelseprio]]
[[Dosiero:Santa maria in solario (brescia) int2.jpg|eta|alternative=Sankta Maria en sunarium (Brescia)|Sankta Maria en sunarium (Brescia)]]
'''[[Brescia]]''' kaj '''[[Castelseprio]]''' apartenas al la kategorio '''[[Lombardoj en Italio: potencolokoj|povolombardoj]]''' al kiuj apartenas aliaj italaj centroj kiel [[Benevento]] kaj [[Cividale del Friuli]]. En Breŝo, la romia Capitoline Temple kaj la monaĥejo de Santa Giulia, kiu enhavas la Krucon de Desiderius, estas rekonitaj kiel Monda heredaĵo.
{{-}}
* [[Prahistoriaj amasloĝejoj ĉirkaŭ la Alpoj]]
[[Dosiero:Lucone D. l'area di scavo..JPG|eta|alternative=Lucone D. la elfosejo|Lucone D. la elfosejo]]
| photo9description=La '''[[Prahistoriaj amasloĝejoj ĉirkaŭ la Alpoj]]''': serio de 111 arkeologiaj stalloĝejoj situantaj en la Alpoj aŭ en la tuja ĉirkaŭaĵo, de kiuj kelkaj el tiuj troviĝas en Lombardio kiel ekzemple [[Lavagnone]], Lugana Vecchia, [[Lucone di Polpenazze]] kaj San Sivino proksime de [[Garda Lago]].
{{-}}
=== Rimarkindaj Muzeoj ===
[[Dosiero:Milan - Pinacothèque de Brera - Cour intérieure.jpg|thumb|Pinakoteko de Brera - interna korto]]
Lombardio havas altan nombron da muzeoj (pli ol 330) de diversaj specoj sur sia teritorio: etnografiaj, historiaj, teknik-sciencaj, artaj kaj naturalismaj, kiuj atestas pri la historia-kultura kaj arta evoluo de la regiono.
Inter la plej famaj estas:
* la Nacia Muzeo de '''Scienco kaj Teknologio''' "Leonardo da Vinci", la '''Brera''' Artgalerio, la Dioceza Muzeo, la Ambrosiana Artgalerio, la Muzeo '''Poldi Pezzoli''', la Muzeoj de la '''Sforza Kastelo''', la '''Civita Muzeo de Natura Historio''' kaj la Muzeo pri la '''Dudeka Jarcento''' en Milano;
* la ''Accademia Carrara'' en [[Bergamo]];
*la Muzeo ''Santa Giulia'', la Nacia Muzeo de '''Fotarto'' kaj la Muzeo de la '''Risorgimento''' en [[Breŝo]];
*la Muzeo de la '''Duka Palaco''' en [[Mantuo]];
*la '''Volta Templo''' en [[Komo]];
*la '''Pinakoteko Malaspina''' en [[Pavio]];
*la '''Stradivaria''' Muzeo de [[Kremono]];
*la ''Muzeoj de Sankta Arto kaj kripoj'' de la Baziliko ''Sankta Maria Ĉielenprenita'' en [[Gandino]] (Bergamo).
Ekzistas ankaŭ multaj institucioj kiuj gastigas gravajn ekspoziciojn kaj provizorajn elmontrojn de la plej gravaj naciaj kaj internaciaj artistoj. La ĉefaj ekspoziciejoj en la regiono inkludas la ''Palazzo Reale'' kaj la ''Triennale'' en Milano, la '''Palazzo Te''' en Mantuo kaj la menciita ''Santa Giulia'' komplekso en Breŝo.
{{-}}
== Naturaj areoj ==
[[File:Scena di caccia al cervo - Seradina R 12 - Capo di Ponte (Foto Luca Giarelli).jpg|thumb|Ŝtongravuraĵoj de la Valo Kamonika, en breŝa provinco: sceno de ĉasado de cervoj]]
Lombardio estis la unua itala regiono, kiu leĝdonis pri naturprotektejoj je regiona nivelo (1983), enkondukante novigajn konceptojn en la [[protekto de la teritorio]], establante riverparkojn (la unua en Eŭropo estis la [[Lombardia natura parko de la Tiĉina Valo]] en 1974), agrikulturaj parkoj kaj lokaj parkoj;
La sistemo de protektitaj areoj en Lombardio konsistas el 24 regionaj parkoj, krom la [[Nacia Parko Stelvio]]. Entute, protektitaj areoj kovras pli ol 29% de la regiona teritorio.
La flaŭro kaj faŭno vivas ĉefe en montaraj areoj kie, male al la ebenaĵoj, la ĉeesto de homo estas malpli evidenta. Promenado laŭ la padoj de la montoj de Lombardio sufiĉas por vidi liberajn lupojn, ibeksojn, cervojn, kapreolojn, ĉamojn, leporojn, vulpojn, melojn, lagopojn, nigrajn tetraojn, ermenojn kaj marmotojn.
Krome, Lombardio kunhavas kun Svislando la ejon de [[Monto Sankta Georgo]], inkluzivita en la mondheredaĵa listo de Unesko por la escepta paleontologia valoro de la fosilioj trovitaj en la rokoj de la monto.
== Fari ==
== Komuniki ==
Preskaŭ ne ekzistas historiaj lingvaj minoritatoj.
En kelkaj izolitaj montaraj lokoj, direkte al la limo kun la [[Engadino]], la ladino estas uzata, en la romanĉa varianto. La uzado de la dialekto, en siaj diversaj formoj (de la insubra de Varezo kaj ĝia ĉirkaŭaĵo, ĝis la milana de la ĉefurbo, ĝis la mallarĝa bergama de la valoj, ĝis la kamuna aŭ mantova) estas ankoraŭ ofta ekster la urboj, paralele kun la itala.
<!--=== Kulturo kaj tradicioj ===-->
<!--=== Proponitaj legaĵoj ===-->
{{-}}
== Aĉeti ==
=== Vendejaroj ===
== Manĝi ==
[[File:Rifugio Alpino Boffalora (5).JPG|130px|right|Boffalora Alpa Rifuĝejo]]
Lombardio havas sufiĉe diferencigitajn kulinarajn tradiciojn, de simplaj kaj oftaj pladoj kiel '''panigita kotleto''' aŭ '''safrana rizoto''', el Milano, ĝis pli rafinitaj kiel '''pavo je la Mantegna maniero''', el Mantuo, de fortaj kiel '''Cassoeula''', ĝis delikataj kiel '''kukurbotorteloj'''. .
=== Tradiciaj manĝaĵoj ===
==== Unuaj aŭ unuopaj pladoj ====
[[File:Risotto alla Milanese.JPG|thumb|Risoto je la milana maniero]]
[[File:Tortelli.jpg|thumb|kukurbo-torteloj]]
* Risotto alla Milanese: rizo kuirita kuirita kun buljono kaj medolo, kun aldono de safrano
* Cassoeula: plado el porkaj ripoj, kolbasoj kaj brasiko
* Polento: en la bergama versio, krude muelita maiza faruno kuirita en akvo kaj salo, poste kondimentita
* Polenta taragna: la versio de Valtellina, miksaĵo de farunoj de fagopiro kaj maizo
* Pizzoccheri Valtellina: pasto de poligono boligita kun brasiko, terpomoj, ripoj kaj spicita kun butero, casera fromaĝo kaj bitto
* Blankaj pizzoccheri el Valchiavenna
* Mariconda: vianda buljono supo kun pano, spicita per ovo, muskato, kradrita fromaĝo
* Casoncelli: foliaj ravioloj kun kondimentita viando
* Pavia supo
* Marubini (aŭ marobini): pasto plenigita per miksaĵo de pikita viando, fromaĝo, raspita pano, ovoj, spicoj; ĝi estas plado komuna al la tuta teritorio laŭ la rivero Po, kun variaĵoj por pikita viando kiu povas esti boligita, trokuirita, aŭ kun aldono de parto de hakita kolbaso en la orienta areo, kaj la uzo aŭ ne de spicoj.
* "Bigoli al torchio"
* Kukurbotorteloj, tipa de mantua kuirarto
* [[w:Amara tortelo el Castel Goffredo|Amara tortelo el Castel Goffredo]]
=== Vegetarismo kaj veganismo ===
== Trinki ==
=== Alkoholaĵoj ===
== Loĝi ==
=== Esperanta loĝado ===
<!-- En (nomo de la lando) estas {{Pasporta Servo gastigantoj|loko= |nombro= |jaro= |monato=}}. -->
=== Kampadejoj ===
=== Hosteloj ===
=== Hoteloj ===
== Sekureco ==
== Sano ==
== Respekto ==
== Esperanto ==
En Kremo aktivis la esperanta pioniro '''{{W|Daniele Marignoni}}''', kiu en en 1890 eldonis la unuan esperanto-lernolibron por italoj.
=== Lokaj esperantistoj ===
=== Esperantaj renkontiĝoj ===
== Konsulejoj ==
== Viziti plu ==
== Rimarkoj ==
<references />
== Eksteraj ligiloj ==
{{Skizo}}
{{Parto de|Nordokcidenta Italio}}
joziunajg61mobc4vhqtbec1vc0wxqz
Lombarda pada alta ebenaĵo
0
6653
72057
72054
2026-04-07T05:34:20Z
Tiguliano
53
72057
wikitext
text/x-wiki
{{Rubando}}
{{Informkesto subregiono
| nomo = Lombarda pada alta ebenaĵo
| flago =
| flagograndeco =
| lando = Italio
| regiono = Lombardio
| bildo = Dosiero: Solferino-Colline verso il lago di Garda.JPG
| bildotitolo = Solferino kaj la montetoj en la direkto de la Garda lago
| situo =
| ĉefurbo =
| areo =
| loĝantaro =
| horzono =
}}
La '''Lombarda pada alta ebenaĵo''', (itale: Pianura padana lombarda), estas unu el la kvar turismaj areoj de la [[Italio|itala]] regiono [[Lombardio]].
== Kompreni ==
Ĝi estas areo de ebena kamparo sed ankaŭ de granda urbodisvastiĝo, kun la grandaj metropolaj areoj kaj kun-urbejoj de [[Milano]] kaj ĝiaj vastaj ĉirkaŭaĵoj, [[Monza]] kaj [[Brianza]], [[Saronno]], [[Busto Arsizio]], [[Gallarate]], kaj [[Legnano]], kiuj tamen famas ankaŭ pri turisma oferto de granda arturbo (Milano) aŭ ĉiukaze je bona nivelo (ĉiuj aliaj).
Deŝovante nian rigardon de la grandega milana kunurbejo, kiu monopoligas la tutan orientan areon, la urboj de [[Kremo|Crema]], kiu estis longe venecia enklavo en la Duklando de Milano, kaj kiu famas pri bela katedralo, same kiel pri restaĵoj de veneciaj muroj, [[Treviglio]]; [[Pandino]] kaj [[Soncino]], kun iliaj turetaj kasteloj; [[Castel Goffredo]] kaj [[Castiglione delle Stiviere]], ĉefurboj de Gonzago; [[Asola (Italio)|Asola]], Gonzaga sed kun forta venecia etoso kiu devenas de ĝia pasinteco ligita al la ''Serenissima''.
La nomo devenas de la ĉeesto de la rivero Pado, ("padus" en la latina, "Po" en la itala), la plej longa rivero en Italio.
== Vidi ==
=== Itineroj ===
[[File:Colline moreniche del Lago Garda.JPG|thumb|250px|Morenaj montetoj de Garda-Lago]]
* La Lombarda Pada Valo estas parto de la '''[https://www.mantovastrada.it/ Strato de la Mantuaj Vinoj kaj Saporoj]''', manĝaĵa kaj vinturismo-reklamvojo, proksimume 300 kilometrojn longa kaj rekonita de la Lombardia Regiono, kiu serpentumas tra la [[provinco Mantuo]] tra 41 municipoj, inkluzive de: [[Asola]], [[Curtatone]], [[Sabbioneta]], [[Viadana]], [[Mantuo]], [[Bagnolo San Vito]], [[San Benedetto Po]], [[Quistello]], [[Gonzaga (Italio)|Gonzaga]], [[San Giacomo delle Segnate]], [[Poggio Rusco]], [[Ostiglia]], [[Goito]], [[Volta Mantovana]], [[Monzambano]], [[Ponti sul Mincio]] e [[Cavriana]].
* [[En la teroj de la Gonzagoj]] — Itinero tra la urboj, grandaj kaj malgrandaj, kiuj estis la ĉefurboj de la kadetaj branĉoj de la Gonzagoj: princlandoj, markizatoj kaj duklandoj, kiuj, ene de la ŝtato Mantua, ĝuis veran sendependecon, ofte monfaris siajn proprajn monerojn kaj havis rafinitajn kortegojn, kiuj rivalis tiun de Mantuo, plibeligis siajn urbajn centrojn per eleganta arkitekturo — preĝejoj, placoj, palacoj, muroj, turoj — kaj karakterizaj urbaj vidoj kiel la tipaj "Gonzagecaj-portikoj".
* [[Morenaj montetoj de Garda-Lago]] — Sur la unuaj faldoj de la Pada Valo, kiuj fariĝas montetoj, kie komenciĝas la granda laga baseno de Garda-Lago, la itinero trapasas urbojn kaj urbetojn, kiujn iam regis la Gonzagoj, venecianoj kaj la familio Scala, kaj poste fariĝis la scenejo de la sangaj bataloj de la ''Risorgimento'', kiuj pavimis la vojon al la itala unuigo. Aldone al sia turisma, historia kaj naturalisma graveco, la regiono ankaŭ famas pri enologia intereso, produktante "montetajn vinojn" kiel Tokai, Merlot kaj Chiaretto.
{{-}}
{{Parto de|Lombardio}}
7h9sus773awnekl5o3gg6li4wp5b5ox
Kremo
0
6654
72059
72056
2026-04-07T05:38:23Z
Tiguliano
53
/* Esperanto */
72059
wikitext
text/x-wiki
{{Rubando}}
{{Informkesto urbo
| nomo = Kremo
| flago =
| flagograndeco =
| bildo = Dosiero:Comunecrema.jpg
| bildotitolo = urbodomo de Kremo
| lando = Italio
| regiono = Lombardio
| loĝantaro = 34.147 (31-12-2025)
| alto = 79
}}
'''{{W|Crema|Kremo}}''' (itale Crema, elp.: Krema), estas urbo en la [[Lombarda pada alta ebenaĵo]] en [[Italio|itala]] regiono [[Lombardio]].
== Kompreni ==
Ĉe la rivero Serio, ĝi estas urbo en la centra ebenaĵo, egaldistance de Milano, Pavio, Kremono kaj Bergamo; ĝi havas multajn ligojn kun la proksima [[Lodo|Lodi]].
=== Historio ===
Kelkaj atribuas la originon de la urbo al tempoj eĉ pli antikvaj, sed la tradicio metas ĝin je la tempo de la barbaraj invadoj, kiam ĝiaj loĝantoj rifuĝis sur la altaĵoj de la Moza Insulo por alfronti la invadantojn el pli sekura pozicio. Ĝia fondo estas datita je la 15-a de aŭgusto 570. Posedo de la Grafoj de Camisano, ĝi poste transiris al Bonifacio, Markizo de Toskanio, patro de la fama Matilda de Kanoso, kiu donacis Kremon al la Episkopo de Kremono. Multe pli bone dokumentita estas ĝia vigla historio kiel libera komunumo, periodo en kiu la forta kaj daŭra antagonismo inter la urbo kaj Kremono estis profunde enradikiĝinta. Aliancita kun Milano kontraŭ Kremono, kiu subtenis la imperion, Kremo estis sieĝita kaj detruita. Post ĝia rekonstruo kaj refortikigo, ĝi ricevis katedralon, Pretorianan Palacon kaj aŭtonomecon, kiu finiĝis en 1335 per sia kapitulaco al la Visconti. Mallonga paŭzo de loka regado fare de la familio Benzoni (1403-1423) estis sekvata de plia periodo sub la Visconti-regado kaj fine, en 1449, de la Venecia Respubliko.
Sub la Venecia Respubliko, la urbo ĝuis aparte prosperan periodon. Provinco sur la kontinento, ĝi ĝuis fortan ekonomian disvolviĝon same kiel signifan arkitekturan kaj monumentan disvolviĝon: nova urbomuro, la Urbodomo (1525-1533), la Palaco de la Notario (kiu poste fariĝis la Episkopa Palaco post la establado de la Episkopa Kurio en 1580), kaj la Sanktejo de ''Santa Maria della Croce''.
Post la falo de la Venecia Respubliko en 1797, Kremo fariĝis la provinca ĉefurbo en kondominio kun [[Lodo]]; poste, ĝi estis administre subigita al Kremono, perdante sian administran aŭtonomecon. Inter la fino de la 19-a kaj la komenco de la 20-a jarcentoj, komenciĝis signifa industria disvolviĝo, kiu kaŭzis signifan loĝantarkreskon kaj plue plifirmigis ĝian naturan rolon kiel ŝlosila centro por la areo.
=== Klimato ===
== Aliri ==
=== Aviadile ===
* Flughaveno de Bergamo-Orio al Serio
* Flughaveno de Milano-Malpensa (IATA: MXP) – La flughaveno havas du terminalojn (T1 kaj T2), la dua estas uzata por malmultekostaj flugoj. La busservo de ''Autostradale'' kunligas la flughavenon kun la centra stacidomo de [[Milano]] en proksimume 50 minutojn; anstataŭe [http://www.malpensaexpress.it Malpensa Express] kunligas en 40 minutoj Terminal 1 kun stacidomo ''Cadorna'' (ruĝaj kaj verdaj metro-linioj). La busoj de [http://www.sadem.it Sadem] kaj ''Autostradale'' atingas la urbon [[Torino]] en 2 horojn, dum la kompanio [http://www.volpibus.com Volpi] faras kelkajn vojaĝojn al [[Ĝenovo]] (3 horoj).
* Flughaveno Verona-Villafranca
* Flughaveno Brescia-Montichiari – Ligoj kun Breŝa flughaveno estas garantiitaj per publika transporto per la [http://www.cgabrescia.it/ bus-navedo]. La haltejo en [[Breŝo]] urbo situas ĉe la busstacidomo (numero 23), dum la flughaven-haltejo estas antaŭ la terminalo. Ekzistas ankaŭ ligoj al la urbo [[Verono]] per buso-naveda linio 1.
=== Trajne ===
=== Buse ===
== Moviĝi ==
=== Perpiede ===
=== Publika transporto ===
=== Aŭte ===
== Vidi ==
[[Dosiero:CremaDuomo.JPG|eta|alternative=Katedralo de Kremo|Katedralo de Kremo]]
* Katedralo
[[Dosiero:Crema (CR) - basilica di Santa Maria della Croce.jpg|eta|Sanktejo ''Santa Maria della Croce''|Sanktejo ''Santa Maria della Croce'']]
* Sanktejo ''[http://www.santamariadellacroce.it/ Santa Maria della Croce]''
* Urbodomo
* Palaco Vimercati - Sanseverino
* Urba Muzeo - strato Dante 49 - tel: +39 0373 257161
:Ĝi prezentas sin kiel rimedo por valorigi la antikvajn homojn kiuj loĝis la teritorion de la urbo kaj la ĉirkaŭaĵon, kiel ĝia plena nomo elstarigas: ''Civita Muzeo de Crema kaj la Crema areo''. Fakte, en la arkeologia sekcio ĝi kolektas trovaĵojn de la teritorio intervalantaj de la Fina Bronzepoko kaj venantaj de la prahistoriaj areoj de Vidolasco, ĝis la funebraj objektoj de [[Soncino]] (3-a jarcento a.K.) kaj tiuj de [[Spino d'Adda]] (2-a-1a jarcento a.K.), la mozaikoj de Palaco Pignano (4-a 5-a jarcento a.K.), ĝis la objektoj kaj lombardaj tomboj trovitaj en Offanengo.
[[Dosiero:Santa-maria-delle-grazie-crema.jpg|eta|alternative=Sanktejo ''Santa Maria delle Grazie''|Sanktejo ''Santa Maria delle Grazie'']]
* Sanktejo ''Santa Maria delle Grazie''
{{-}}
== Fari ==
== Lerni ==
== Labori ==
== Aĉeti ==
=== Vendejaroj ===
== Manĝi ==
[[File:Preparazione treccia d'oro fase 4.JPG|thumb|Fazo de la preparado de la ora plektaĵo]]
La '''treccia d'oro''' (''ora plektaĵo''), estas kukaĵa produkto de Crema. Ĝi estis inventita inter 1937 kaj 1938, ĉe la [[Padovo|padova]] Foiro, fare de la kukisto Zironda, kiu poste malfermis la "Pasticceria Zironda" kie Vittorio Maccalli komencis labori kiel metilernanto. Kiam la posedanto retiriĝis de la komerco, Maccalli transprenis, daŭrigante la produktadon de tiu deserto kaj nomante sian butikon en Crema "Treccia d'Oro". La [[Lombardio|lombarda]] Regiono rekonis la titolon de Krema metiista produkto al la ''ora plektado''.
La deserto venas en formo de plektaĵo; la pasto enhavas farunon, buteron, sukeron, bier-giston, kanditan oranĝon kaj citron, sultanojn, glazuran sukeron kaj salon.
== Trinki ==
== Loĝi ==
=== Esperanta loĝado ===
<!-- En (nomo de la urbo) estas {{Pasporta Servo gastigantoj|loko= |nombro= |jaro= |monato=}}. -->
=== Kampadejoj ===
=== Hosteloj ===
=== Hoteloj ===
== Sekureco ==
== Esperanto ==
en Kremo aktivis la esperanta pioniro '''{{W|Daniele Marignoni}}''', kiu en en 1890 eldonis la unuan esperanto-lernolibron por italoj.
=== Lokaj esperantistoj ===
== Konsulejoj ==
== Viziti plu ==
== Rimarkoj ==
<references/>
{{Skizo}}
{{Parto de|Lombarda pada alta ebenaĵo}}
9p1q9jbw9yapjjdeeylnajoaic2lxrp
72060
72059
2026-04-07T05:39:04Z
Tiguliano
53
/* Kompreni */
72060
wikitext
text/x-wiki
{{Rubando}}
{{Informkesto urbo
| nomo = Kremo
| flago =
| flagograndeco =
| bildo = Dosiero:Comunecrema.jpg
| bildotitolo = urbodomo de Kremo
| lando = Italio
| regiono = Lombardio
| loĝantaro = 34.147 (31-12-2025)
| alto = 79
}}
'''{{W|Crema|Kremo}}''' (itale Crema, elp.: Krema), estas urbo en la [[Lombarda pada alta ebenaĵo]] en [[Italio|itala]] regiono [[Lombardio]].
== Kompreni ==
Ĉe la rivero Serio, ĝi estas urbo en la centra ebenaĵo, egaldistance de Milano, Pavio, Kremono kaj Bergamo; ĝi havas multajn ligojn kun la proksima [[Lodo|Lodi]].
en Kremo aktivis la esperanta pioniro '''{{W|Daniele Marignoni}}''', kiu en en 1890 eldonis la unuan esperanto-lernolibron por italoj.
=== Historio ===
Kelkaj atribuas la originon de la urbo al tempoj eĉ pli antikvaj, sed la tradicio metas ĝin je la tempo de la barbaraj invadoj, kiam ĝiaj loĝantoj rifuĝis sur la altaĵoj de la Moza Insulo por alfronti la invadantojn el pli sekura pozicio. Ĝia fondo estas datita je la 15-a de aŭgusto 570. Posedo de la Grafoj de Camisano, ĝi poste transiris al Bonifacio, Markizo de Toskanio, patro de la fama Matilda de Kanoso, kiu donacis Kremon al la Episkopo de Kremono. Multe pli bone dokumentita estas ĝia vigla historio kiel libera komunumo, periodo en kiu la forta kaj daŭra antagonismo inter la urbo kaj Kremono estis profunde enradikiĝinta. Aliancita kun Milano kontraŭ Kremono, kiu subtenis la imperion, Kremo estis sieĝita kaj detruita. Post ĝia rekonstruo kaj refortikigo, ĝi ricevis katedralon, Pretorianan Palacon kaj aŭtonomecon, kiu finiĝis en 1335 per sia kapitulaco al la Visconti. Mallonga paŭzo de loka regado fare de la familio Benzoni (1403-1423) estis sekvata de plia periodo sub la Visconti-regado kaj fine, en 1449, de la Venecia Respubliko.
Sub la Venecia Respubliko, la urbo ĝuis aparte prosperan periodon. Provinco sur la kontinento, ĝi ĝuis fortan ekonomian disvolviĝon same kiel signifan arkitekturan kaj monumentan disvolviĝon: nova urbomuro, la Urbodomo (1525-1533), la Palaco de la Notario (kiu poste fariĝis la Episkopa Palaco post la establado de la Episkopa Kurio en 1580), kaj la Sanktejo de ''Santa Maria della Croce''.
Post la falo de la Venecia Respubliko en 1797, Kremo fariĝis la provinca ĉefurbo en kondominio kun [[Lodo]]; poste, ĝi estis administre subigita al Kremono, perdante sian administran aŭtonomecon. Inter la fino de la 19-a kaj la komenco de la 20-a jarcentoj, komenciĝis signifa industria disvolviĝo, kiu kaŭzis signifan loĝantarkreskon kaj plue plifirmigis ĝian naturan rolon kiel ŝlosila centro por la areo.
=== Klimato ===
== Aliri ==
=== Aviadile ===
* Flughaveno de Bergamo-Orio al Serio
* Flughaveno de Milano-Malpensa (IATA: MXP) – La flughaveno havas du terminalojn (T1 kaj T2), la dua estas uzata por malmultekostaj flugoj. La busservo de ''Autostradale'' kunligas la flughavenon kun la centra stacidomo de [[Milano]] en proksimume 50 minutojn; anstataŭe [http://www.malpensaexpress.it Malpensa Express] kunligas en 40 minutoj Terminal 1 kun stacidomo ''Cadorna'' (ruĝaj kaj verdaj metro-linioj). La busoj de [http://www.sadem.it Sadem] kaj ''Autostradale'' atingas la urbon [[Torino]] en 2 horojn, dum la kompanio [http://www.volpibus.com Volpi] faras kelkajn vojaĝojn al [[Ĝenovo]] (3 horoj).
* Flughaveno Verona-Villafranca
* Flughaveno Brescia-Montichiari – Ligoj kun Breŝa flughaveno estas garantiitaj per publika transporto per la [http://www.cgabrescia.it/ bus-navedo]. La haltejo en [[Breŝo]] urbo situas ĉe la busstacidomo (numero 23), dum la flughaven-haltejo estas antaŭ la terminalo. Ekzistas ankaŭ ligoj al la urbo [[Verono]] per buso-naveda linio 1.
=== Trajne ===
=== Buse ===
== Moviĝi ==
=== Perpiede ===
=== Publika transporto ===
=== Aŭte ===
== Vidi ==
[[Dosiero:CremaDuomo.JPG|eta|alternative=Katedralo de Kremo|Katedralo de Kremo]]
* Katedralo
[[Dosiero:Crema (CR) - basilica di Santa Maria della Croce.jpg|eta|Sanktejo ''Santa Maria della Croce''|Sanktejo ''Santa Maria della Croce'']]
* Sanktejo ''[http://www.santamariadellacroce.it/ Santa Maria della Croce]''
* Urbodomo
* Palaco Vimercati - Sanseverino
* Urba Muzeo - strato Dante 49 - tel: +39 0373 257161
:Ĝi prezentas sin kiel rimedo por valorigi la antikvajn homojn kiuj loĝis la teritorion de la urbo kaj la ĉirkaŭaĵon, kiel ĝia plena nomo elstarigas: ''Civita Muzeo de Crema kaj la Crema areo''. Fakte, en la arkeologia sekcio ĝi kolektas trovaĵojn de la teritorio intervalantaj de la Fina Bronzepoko kaj venantaj de la prahistoriaj areoj de Vidolasco, ĝis la funebraj objektoj de [[Soncino]] (3-a jarcento a.K.) kaj tiuj de [[Spino d'Adda]] (2-a-1a jarcento a.K.), la mozaikoj de Palaco Pignano (4-a 5-a jarcento a.K.), ĝis la objektoj kaj lombardaj tomboj trovitaj en Offanengo.
[[Dosiero:Santa-maria-delle-grazie-crema.jpg|eta|alternative=Sanktejo ''Santa Maria delle Grazie''|Sanktejo ''Santa Maria delle Grazie'']]
* Sanktejo ''Santa Maria delle Grazie''
{{-}}
== Fari ==
== Lerni ==
== Labori ==
== Aĉeti ==
=== Vendejaroj ===
== Manĝi ==
[[File:Preparazione treccia d'oro fase 4.JPG|thumb|Fazo de la preparado de la ora plektaĵo]]
La '''treccia d'oro''' (''ora plektaĵo''), estas kukaĵa produkto de Crema. Ĝi estis inventita inter 1937 kaj 1938, ĉe la [[Padovo|padova]] Foiro, fare de la kukisto Zironda, kiu poste malfermis la "Pasticceria Zironda" kie Vittorio Maccalli komencis labori kiel metilernanto. Kiam la posedanto retiriĝis de la komerco, Maccalli transprenis, daŭrigante la produktadon de tiu deserto kaj nomante sian butikon en Crema "Treccia d'Oro". La [[Lombardio|lombarda]] Regiono rekonis la titolon de Krema metiista produkto al la ''ora plektado''.
La deserto venas en formo de plektaĵo; la pasto enhavas farunon, buteron, sukeron, bier-giston, kanditan oranĝon kaj citron, sultanojn, glazuran sukeron kaj salon.
== Trinki ==
== Loĝi ==
=== Esperanta loĝado ===
<!-- En (nomo de la urbo) estas {{Pasporta Servo gastigantoj|loko= |nombro= |jaro= |monato=}}. -->
=== Kampadejoj ===
=== Hosteloj ===
=== Hoteloj ===
== Sekureco ==
== Esperanto ==
en Kremo aktivis la esperanta pioniro '''{{W|Daniele Marignoni}}''', kiu en en 1890 eldonis la unuan esperanto-lernolibron por italoj.
=== Lokaj esperantistoj ===
== Konsulejoj ==
== Viziti plu ==
== Rimarkoj ==
<references/>
{{Skizo}}
{{Parto de|Lombarda pada alta ebenaĵo}}
1ko47es5c2cirasi6uxj94zkep7y42z
72061
72060
2026-04-07T05:39:34Z
Tiguliano
53
72061
wikitext
text/x-wiki
{{Rubando}}
{{Informkesto urbo
| nomo = Kremo
| flago =
| flagograndeco =
| bildo = Dosiero:Comunecrema.jpg
| bildotitolo = urbodomo de Kremo
| lando = Italio
| regiono = Lombardio
| loĝantaro = 34.147 (31-12-2025)
| alto = 79
}}
'''{{W|Crema|Kremo}}''' (itale Crema, elp.: Krema), estas urbo en la [[Lombarda pada alta ebenaĵo]] en [[Italio|itala]] regiono [[Lombardio]].
== Kompreni ==
Ĉe la rivero Serio, ĝi estas urbo en la centra ebenaĵo, egaldistance de Milano, Pavio, Kremono kaj Bergamo; ĝi havas multajn ligojn kun la proksima [[Lodo|Lodi]].
En Kremo aktivis la esperanta pioniro '''{{W|Daniele Marignoni}}''', kiu en en 1890 eldonis la unuan esperanto-lernolibron por italoj.
=== Historio ===
Kelkaj atribuas la originon de la urbo al tempoj eĉ pli antikvaj, sed la tradicio metas ĝin je la tempo de la barbaraj invadoj, kiam ĝiaj loĝantoj rifuĝis sur la altaĵoj de la Moza Insulo por alfronti la invadantojn el pli sekura pozicio. Ĝia fondo estas datita je la 15-a de aŭgusto 570. Posedo de la Grafoj de Camisano, ĝi poste transiris al Bonifacio, Markizo de Toskanio, patro de la fama Matilda de Kanoso, kiu donacis Kremon al la Episkopo de Kremono. Multe pli bone dokumentita estas ĝia vigla historio kiel libera komunumo, periodo en kiu la forta kaj daŭra antagonismo inter la urbo kaj Kremono estis profunde enradikiĝinta. Aliancita kun Milano kontraŭ Kremono, kiu subtenis la imperion, Kremo estis sieĝita kaj detruita. Post ĝia rekonstruo kaj refortikigo, ĝi ricevis katedralon, Pretorianan Palacon kaj aŭtonomecon, kiu finiĝis en 1335 per sia kapitulaco al la Visconti. Mallonga paŭzo de loka regado fare de la familio Benzoni (1403-1423) estis sekvata de plia periodo sub la Visconti-regado kaj fine, en 1449, de la Venecia Respubliko.
Sub la Venecia Respubliko, la urbo ĝuis aparte prosperan periodon. Provinco sur la kontinento, ĝi ĝuis fortan ekonomian disvolviĝon same kiel signifan arkitekturan kaj monumentan disvolviĝon: nova urbomuro, la Urbodomo (1525-1533), la Palaco de la Notario (kiu poste fariĝis la Episkopa Palaco post la establado de la Episkopa Kurio en 1580), kaj la Sanktejo de ''Santa Maria della Croce''.
Post la falo de la Venecia Respubliko en 1797, Kremo fariĝis la provinca ĉefurbo en kondominio kun [[Lodo]]; poste, ĝi estis administre subigita al Kremono, perdante sian administran aŭtonomecon. Inter la fino de la 19-a kaj la komenco de la 20-a jarcentoj, komenciĝis signifa industria disvolviĝo, kiu kaŭzis signifan loĝantarkreskon kaj plue plifirmigis ĝian naturan rolon kiel ŝlosila centro por la areo.
=== Klimato ===
== Aliri ==
=== Aviadile ===
* Flughaveno de Bergamo-Orio al Serio
* Flughaveno de Milano-Malpensa (IATA: MXP) – La flughaveno havas du terminalojn (T1 kaj T2), la dua estas uzata por malmultekostaj flugoj. La busservo de ''Autostradale'' kunligas la flughavenon kun la centra stacidomo de [[Milano]] en proksimume 50 minutojn; anstataŭe [http://www.malpensaexpress.it Malpensa Express] kunligas en 40 minutoj Terminal 1 kun stacidomo ''Cadorna'' (ruĝaj kaj verdaj metro-linioj). La busoj de [http://www.sadem.it Sadem] kaj ''Autostradale'' atingas la urbon [[Torino]] en 2 horojn, dum la kompanio [http://www.volpibus.com Volpi] faras kelkajn vojaĝojn al [[Ĝenovo]] (3 horoj).
* Flughaveno Verona-Villafranca
* Flughaveno Brescia-Montichiari – Ligoj kun Breŝa flughaveno estas garantiitaj per publika transporto per la [http://www.cgabrescia.it/ bus-navedo]. La haltejo en [[Breŝo]] urbo situas ĉe la busstacidomo (numero 23), dum la flughaven-haltejo estas antaŭ la terminalo. Ekzistas ankaŭ ligoj al la urbo [[Verono]] per buso-naveda linio 1.
=== Trajne ===
=== Buse ===
== Moviĝi ==
=== Perpiede ===
=== Publika transporto ===
=== Aŭte ===
== Vidi ==
[[Dosiero:CremaDuomo.JPG|eta|alternative=Katedralo de Kremo|Katedralo de Kremo]]
* Katedralo
[[Dosiero:Crema (CR) - basilica di Santa Maria della Croce.jpg|eta|Sanktejo ''Santa Maria della Croce''|Sanktejo ''Santa Maria della Croce'']]
* Sanktejo ''[http://www.santamariadellacroce.it/ Santa Maria della Croce]''
* Urbodomo
* Palaco Vimercati - Sanseverino
* Urba Muzeo - strato Dante 49 - tel: +39 0373 257161
:Ĝi prezentas sin kiel rimedo por valorigi la antikvajn homojn kiuj loĝis la teritorion de la urbo kaj la ĉirkaŭaĵon, kiel ĝia plena nomo elstarigas: ''Civita Muzeo de Crema kaj la Crema areo''. Fakte, en la arkeologia sekcio ĝi kolektas trovaĵojn de la teritorio intervalantaj de la Fina Bronzepoko kaj venantaj de la prahistoriaj areoj de Vidolasco, ĝis la funebraj objektoj de [[Soncino]] (3-a jarcento a.K.) kaj tiuj de [[Spino d'Adda]] (2-a-1a jarcento a.K.), la mozaikoj de Palaco Pignano (4-a 5-a jarcento a.K.), ĝis la objektoj kaj lombardaj tomboj trovitaj en Offanengo.
[[Dosiero:Santa-maria-delle-grazie-crema.jpg|eta|alternative=Sanktejo ''Santa Maria delle Grazie''|Sanktejo ''Santa Maria delle Grazie'']]
* Sanktejo ''Santa Maria delle Grazie''
{{-}}
== Fari ==
== Lerni ==
== Labori ==
== Aĉeti ==
=== Vendejaroj ===
== Manĝi ==
[[File:Preparazione treccia d'oro fase 4.JPG|thumb|Fazo de la preparado de la ora plektaĵo]]
La '''treccia d'oro''' (''ora plektaĵo''), estas kukaĵa produkto de Crema. Ĝi estis inventita inter 1937 kaj 1938, ĉe la [[Padovo|padova]] Foiro, fare de la kukisto Zironda, kiu poste malfermis la "Pasticceria Zironda" kie Vittorio Maccalli komencis labori kiel metilernanto. Kiam la posedanto retiriĝis de la komerco, Maccalli transprenis, daŭrigante la produktadon de tiu deserto kaj nomante sian butikon en Crema "Treccia d'Oro". La [[Lombardio|lombarda]] Regiono rekonis la titolon de Krema metiista produkto al la ''ora plektado''.
La deserto venas en formo de plektaĵo; la pasto enhavas farunon, buteron, sukeron, bier-giston, kanditan oranĝon kaj citron, sultanojn, glazuran sukeron kaj salon.
== Trinki ==
== Loĝi ==
=== Esperanta loĝado ===
<!-- En (nomo de la urbo) estas {{Pasporta Servo gastigantoj|loko= |nombro= |jaro= |monato=}}. -->
=== Kampadejoj ===
=== Hosteloj ===
=== Hoteloj ===
== Sekureco ==
== Esperanto ==
en Kremo aktivis la esperanta pioniro '''{{W|Daniele Marignoni}}''', kiu en en 1890 eldonis la unuan esperanto-lernolibron por italoj.
=== Lokaj esperantistoj ===
== Konsulejoj ==
== Viziti plu ==
== Rimarkoj ==
<references/>
{{Skizo}}
{{Parto de|Lombarda pada alta ebenaĵo}}
bgiostn5ienrasnm6f699crlvukwocs