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 .. '&nbsp;' .. 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 = '&rlm;%s&lrm;' elseif not country.isRTL and page.isRTL then dir = 'ltr' fStr = '&lrm;%s&rlm;' 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( '%[', '&#x005B;' ):gsub( '%]', '&#x005D;' ) 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&params=%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 = '&nbsp;', 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 = "Nelkensams​tag", Q1241858 = "Tulpensonn​tag", Q2085192 = "Tulpensonn​tag", Q153134 = "Rosenmon​tag", Q4845365 = "Fastnachtsdiens​tag", Q123542 = "Aschermitt​woch", Q153308 = "Laetare", Q2033651 = "Judika", Q42236 = "Palmsonn​tag", Q106333 = "Gründonners​tag", Q40317 = "Karfrei​tag", Q186206 = "Karsams​tag", Q21196 = "Ostern", Q1512337 = "Ostersonn​tag", Q209663 = "Ostermon​tag", Q14795170 = "Ostermon​tag", Q14916781 = "Osterdiens​tag", Q51638 = "Christi Himmelfahrt", Q39864 = "Pfingsten", Q2512993 = "Pfingstmon​tag", Q14795386 = "Pfingstdiens​tag", Q152395 = "Fronleichnam", Q2304773 = "Erntedankfest", Q2913791 = "Thanksgiving", Q59833 = "Totensonn​tag", 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 = &lt;&#x200B;!-- Marker-Modus --&gt; }} * {{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 = &lt;&#x200B;!-- Marker-Modus --&gt; }} * {{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 = &lt;&#x200B;!-- Marker-Modus --&gt; }} * {{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 = &lt;&#x200B;!-- Marker-Modus --&gt; }} * {{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&nbsp;m (4050 en Svislando, sed proksime al la landlimo; 4020 precize en Lombardio). Pluraj montoj superas 3500&nbsp;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&nbsp;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&nbsp;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