Wikicesty cswikivoyage https://cs.wikivoyage.org/wiki/Hlavn%C3%AD_strana MediaWiki 1.47.0-wmf.3 first-letter Média Speciální Diskuse Uživatel Diskuse s uživatelem Wikicesty Diskuse k Wikicestám Soubor Diskuse k souboru MediaWiki Diskuse k MediaWiki Šablona Diskuse k šabloně Nápověda Diskuse k nápovědě Kategorie Diskuse ke kategorii TimedText TimedText talk Modul Diskuse k modulu Podujatie Diskusia k podujatiu Modul:VCard 828 1326 22085 20755 2026-05-20T09:32:41Z LiMr 96 aktualizace na novější verzi 22085 Scribunto text/plain -- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Modul:VCard&oldid=1775863) -- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Modul:VCard&oldid=1775863) -- module variable and administration local vc = { moduleInterface = { suite = 'vCard', serial = '2026-05-18', item = 58187507 }, -- table containing parameters fetched from Wikidata fromWD = {}, -- Wikidata to subtype table subtypeIds = nil, -- complete subtype table including Wikidata subtypes subtypes = {}, -- Added for storing Wikivoyage link wikivoyageLink = nil } -- 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:CountryData2' ) local er -- modules will be loaded later if needed local hi local hr local lg local lp = require( 'Module:LinkPhone2' ) 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, 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, 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( formatter, '($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 return table.concat( comments, mu.commaSeparator ), isMobilephone 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 ar = {} local a, isMobilephone, item, id, langs, q, u -- 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 == 'iqa' or propDef.v == 'iqp' then q = mi.propTable.quantity if propDef.v == 'iqa' then q = mi.propTable.accessQuantity elseif propDef.v == 'iqp' then q = mi.propTable.policyComments end 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 = 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 == 'iqa' or propDef.v == 'iqp' then if ar[ i ][ 'value-type' ] ~= 'wikibase-entityid' then table.remove( ar, i ) end if propDef.v == 'iqa' then ar[ i ].policyComment = getComments( ar[ i ], mi.propTable.accessibility, args, page ) end if propDef.v == 'iqp' then ar[ i ].policyComment = 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 ) -- Uložíme odkaz na Wikicesty, pokud existuje if entity and entity.sitelinks and entity.sitelinks.cswikivoyage then vc.wikivoyageLink = entity.sitelinks.cswikivoyage.title end getAddressesFromWikidata( args, page, country, entity ) if args.hours == true then local lastEdit getHourModules() if not mu.typeIds then 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 -- Upravená část pro vytvoření odkazu u názvu if mu.isSet(vc.wikivoyageLink) then -- Vytvoříme HTML pro název s interním Wikicesty odkazem local nameHtml = mu.makeSpan( string.format('[[%s|%s]]', vc.wikivoyageLink, args.givenName.name), 'p-name fn listing-name' .. addWdClass('name') ) table.insert(result, nameHtml) -- Vložíme upravený název -- Logika pro externí URL ikonu byla přesunuta do makeIcons, takže zde nic nepřidáváme. else -- Jinak použijeme původní logiku pro generování názvu (externí URL nebo jen text) mu.makeName( result, args, show, page, country, addWdClass( 'name' ), addWdClass( 'nameLocal' ) ) end 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 ) if success then success, c = pcall( formatDate, d, 'Y-m-d' ) end 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 ) 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 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 j = 1, #p279ids, 1 do table.insert( p31ids, p279ids[ j ] ) end for j = 1, #p31ids, 1 do t = vc.subtypeIds[ p31ids[ j ] ] or mu.idToType( p31ids[ j ] ) 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( '[,;/].*$', '' ) local 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 if success then success, u = pcall( formatDate, mi.texts.expirationPeriod, 'U' ) end if success and 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 ) -- 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 ) if success then args.price = args.price .. mw.ustring.format( mi.texts.asOf, args.asOf ) end 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 -- get address and directions local address = makeAddressAndDirections( args, page, country ) -- get all contact information local contacts = makeContacts( args, country ) -- all contacts 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 kk17o49wly6equl12h95jwxi4089uxy Modul:VCard/Cards 828 1329 22091 17281 2026-05-20T10:48:38Z LiMr 96 aktualizace na novější verzi 22091 Scribunto text/plain -- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Modul:VCard/Cards&oldid=1727431) -- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Modul:VCard/Cards&oldid=1727431) --[[ In future, strings should be amended by icons please use only quotation marks instead of apostrophs for JSON export ]]-- return { -- administration moduleInterface = { suite = 'vCard', sub = 'Cards', serial = '2025-11-16', item = 65455785 }, cards = { -- general Q693464 = "hotovost", -- credit cards Q161380 = "kreditní karta", Q194360 = "American Express", Q24228273 = "American Express", Q56747433 = "BankAmericard", Q50612448 = "Diners Club", Q1374831 = "Eurocard", Q24228272 = "Mastercard", Q719625 = "UnionPay", Q2993698 = "VISA", -- debit cards Q13499 = "debitní karta", Q1093128 = "Cirrus", Q1406930 = "EC-/Girocard", Q1350133 = "Maestro", Q2507012 = "V PAY", Q6101546 = "İnterbank", -- prepaid Q2237462 = "Muzejní karta", -- electronic money Q493556 = "AliPay", Q4740864 = "Amazon Pay", Q18010990 = "Apple Pay", Q131723 = "Bitcoin", Q2966823 = "ChronoPay", Q1191337 = "elektronische Maut", Q4827020 = "Autotoll", Q290518 = "Giropay", Q19834616 = "Google Pay", Q252382 = "M-Pesa", Q21503770 = "Paydirekt", Q483959 = "PayPal", Q311277 = "Skrill", Q7624104 = "Stripe", Q59426035 = "WeChat Pay" } } jrrse43pskdhqsnakxfsri1lz96z7tz Modul:VCard/Subtypes 828 1330 22090 17763 2026-05-20T10:45:52Z LiMr 96 aktualizace na novější verzi 22090 Scribunto text/plain -- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Modul:VCard/Subtypes&oldid=1767413) -- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Modul:VCard/Subtypes&oldid=1767413) -- empty strings should be filled with icons -- please use only quotation marks instead of apostrophs for JSON export return { -- administration moduleInterface = { suite = 'vCard', sub = 'Subtypes', serial = '2026-04-09', item = 65455756 }, firstGroup = 2, -- first group to display fromWDGroupNumber = 98, -- group number for Q... types from Wikidata fromTypesGroupNumber = 99, -- group number for types from types table -- subtype conversion convert = { hotelstars = { "1", "2", "3", "4", "5" }, -- hotel stars codes michelin = { "michelin1", "michelin2", "michelin3" } }, -- type list f = { -- classification, rating, y & n. Group 1 is usually not displayed budget = { g = 1, wd = "", n = "levný" }, midrange = { g = 1, wd = "", n = "střední" }, upmarket = { g = 1, wd = "", n = "luxusní" }, -- fetching features from Wikidata n = { g = 1, wd = "", alias = { "no", "none", "ne" }, n = "bez atributů Wikidat" }, y = { g = 1, wd = "", alias = { "yes", "j", "ano" }, n = "s atributy Wikidat" }, -- hotel rating hotelstars = { g = 2, wd = "Q2976556", n = "hotelové hvězdičky" }, -- see: convert -- Upto now it seems that there is no font containing the left black half star -- (u+2BE8): ⯨. That's why now the ½ workaround. ["1"] = { g = 2, wd ="Q110772650", sortkey = "01*", n = "★", t = "1 hvězdičkové hodnocení" }, -- tourist ["1h"] = { g = 2, wd ="Q110932985", sortkey = "01*5", n = "★½", t = "1,5 hvězdičkové hodnocení" }, -- superior tourist (tourist plus) ["1s"] = { g = 2, wd ="Q109726413", sortkey = "01*S", n = "★S", t = "1 hvězdičkové Superior hodnocení" }, -- superior tourist (tourist plus) ["2"] = { g = 2, wd ="Q110772651", sortkey = "02*", n = "★★", t = "2 hvězdičkové hodnocení" }, -- standard ["2h"] = { g = 2, wd ="Q110932986", sortkey = "02*5", n = "★★½", t = "2,5 hvězdičkové hodnocení" }, -- superior standard ["2s"] = { g = 2, wd ="Q109726348", sortkey = "02*S", n = "★★S", t = "2 hvězdičkové Superior hodnocení" }, -- superior standard ["3"] = { g = 2, wd ="Q110772652", sortkey = "03*", n = "★★★", t = "3 hvězdičkové hodnocení" }, -- comfort ["3h"] = { g = 2, wd ="Q110932987", sortkey = "03*5", n = "★★★½", t = "3,5 hvězdičkové hodnocení" }, -- superior comfort ["3s"] = { g = 2, wd ="Q109726284", sortkey = "03*S", n = "★★★S", t = "3 hvězdičkové Superior hodnocení" }, -- superior comfort ["4"] = { g = 2, wd ={ "Q110772653", "Q99309708" }, sortkey = "04*", n = "★★★★", t = "4 hvězdičkové hodnocení" }, -- first class ["4h"] = { g = 2, wd ="Q110932988", sortkey = "04*5", n = "★★★★½", t = "4,5 hvězdičkové hodnocení" }, -- superior first class ["4s"] = { g = 2, wd ="Q109726210", sortkey = "04*S", n = "★★★★S", t = "4 hvězdičkové Superior hodnocení" }, -- superior first class ["5"] = { g = 2, wd ={ "Q109248725", "Q109248724" }, sortkey = "05*", n = "★★★★★", t = "5 hvězdičkové hodnocení" }, -- luxury ["5s"] = { g = 2, wd ="Q109726138", sortkey = "05*S", n = "★★★★★S", t = "5 hvězdičkové Superior hodnocení" }, -- superior luxury -- Michelin awards to restaurant chefs bib_gourmand = { g = 2, wd ="Q104135230", n = "Bib Gourmand" }, michelin = { g = 2, wd = "Q20824563", n = "Michelin-Stern[e]" }, michelin1 = { g = 2, wd = "", n = "Michelin 1*", f = "Etoile Michelin-1.svg", c = 1 }, michelin2 = { g = 2, wd = "", n = "Michelin 2*", f = "Etoile Michelin-1.svg", c = 2 }, michelin3 = { g = 2, wd = "", n = "Michelin 3*", f = "Etoile Michelin-1.svg", c = 3 }, -- subtypes from subtype parameter in types table bnb = { g = 3, wd = "Q367914", n = "postel a snídaně" }, boarding_house = { g = 3, wd = { "Q1558858", "Q1065252" }, n = "penzion" }, hotel_garni= { g = 3, wd = "Q1631103", n = "garni" }, -- general facilities accessible = { g = 4, wd = "Q808926", n = "bezbariérové" }, -- barrier-free, for handicapped people ai = { g = 4, wd = "Q1281666", n = "All inclusive" }, basement_garage = { g = 4, wd = "Q2431970", n = "podzemní parkoviště" }, car_park = { g = 4, wd = "Q13218805", n = "parkovací garáž" }, free_wlan = { g = 4, wd = "Q1543615", n = "bezplatná Wi-Fi" }, garage = { g = 4, wd = "Q22733", n = "garáž[e]" }, induction_loop = { g = 4, wd = "Q2163913", n = "indukční smyčka" }, internet_access = { g = 4, wd = "Q1472399", n = "přístup k internetu" }, -- unknown type or both lan and wlan lan = { g = 4, wd = "Q11381", n = "LAN" }, lgbt = { g = 4, wd = "Q17884", n = "LGBT", f = "Gay flag.svg" }, -- including gay nobreakfast= { g = 4, wd ="Q106041208", n = "bez snídaně" }, nowheelchair = { g = 4, wd = "Q24192069", n = "není bezbariérové", f = "Wheelchair-red3.png" }, nowlan = { g = 4, wd = "Q1814990", n = "není Wi-Fi" }, -- no paid_wlan = { g = 4, wd = "Q24202480", n = "placená Wi-Fi" }, parking = { g = 4, wd = "Q6501349", n = "parkovací míst[a|o]" }, tactile_graphic = { g = 4, wd = "Q7674130", n = "tyflografika" }, valet_parking = { g = 4, wd = "Q1423019", n = "parkování s obsluhou" }, withbreakfast = { g = 4, wd ="Q106041297", n = "se snídaní" }, wheelchair = { g = 4, wd = "Q24192067", n = "bezbariérové", f = "Wheelchair-green3.png" }, wheelchair_available = { g = 4, wd = "Q191931", n = "invalidní vozík k dispozici" }, wheelchair_with_help = { g = 4, wd = "Q24192068", n = "bezbariérový přístup s asistencí", f = "Wheelchair-yellow3.png" }, wheelchair_partially = { g = 4, wd = "Q63731120", n = "částečně bezbariérové" }, wheelchair_partially_with_help = { g = 4, wd = "Q63731151", n = "částečně bezbariérové s asistencí" }, wlan = { g = 4, wd = { "Q6452715", "Q29643" }, n = "Wi-Fi" }, -- yes -- hotel facilities adult_pool = { g = 5, wd = "", n = "bazén[y] pro dospělé" }, airport_transfer_service = { g = 5, wd ="Q110012299", n = "transfer z letiště" }, atm = { g = 5, wd = "Q81235", n = "bankomat[y]" }, ballroom = { g = 5, wd = "Q805353", n = "taneční sál[y]" }, babysitter = { g = 5, wd = "Q45181247", n = "chůva" }, bank = { g = 5, wd = "Q22687", n = "banka" }, banquet_room = { g = 5, wd = "Q85833489", n = "hodovní síň" }, bar = { g = 5, wd = "Q187456", n = "bar[y]" }, beach = { g = 5, wd = "Q40080", n = "pláž[e]" }, bed = { g = 5, wd = "Q42177", n = "postel[e]" }, bicycle_stand = { g = 5, wd = "Q1392526", n = "stojan na kola" }, bike_rental= { g = 5, wd = "Q10611118", n = "půjčovna kol" }, business = { g = 5, wd = "Q203180", n = "kancelář[e]" }, buy = { g = 5, wd = "Q1369832", n = "nakupování" }, cabana = { g = 5, wd = "Q3649129", n = "chat[y|a]" }, cafe = { g = 5, wd = "Q30022", n = "kavárn[y|a]" }, cafeteria = { g = 5, wd = "Q8463304", n = "Cafeteria[s]" }, casino = { g = 5, wd = "Q133215", n = "kasin[a|o]" }, cell = { g = 5, wd = "Q2555640", n = "Zelle[n]" }, change_machine = { g = 5, wd = "Q5071849", n = "automat[y] na výměnu peněz" }, cinema = { g = 5, wd = "Q41253", n = "kin[a|o]" }, cloakroom = { g = 5, wd = "Q965173", n = "šatn[y|a]" }, conference = { g = 5, wd = { "Q625994", "Q1207465" }, n = "konferenční místnost[i]" }, currency_exchange = { g = 5, wd = "Q2002539", n = "směnárna peněz" }, dance_hall = { g = 5, wd ="Q121085156", n = "taneční sál[y]" }, dining_room= { g = 5, wd = "Q661199", n = "Esszimmer" }, diving = { g = 5, wd = "Q179643", n = "potápění" }, dormitory = { g = 5, wd = "Q3037266", n = "Schlafs[ä|aa]l[e]" }, family_room= { g = 5, wd = "Q5433389", n = "rodinn[é|ý] pokoj[e]" }, fitness_center = { g = 5, wd = { "Q1065656", "Q30750411" }, n = "fitnessstudio" }, -- including gym, healthclub games_room = { g = 5, wd = "", n = "hern[y|a]" }, garden = { g = 5, wd = "Q1107656", n = "zahrad[y|a]" }, golf = { g = 5, wd = { "Q5377", "Q1048525", "Q3177122", "Q3177122" }, n = "golf" }, gym = { g = 5, wd = { "Q14092", "Q203609", "Q121085159" }, n = "tělocvičn[y|a]" }, indoorpool = { g = 5, wd = "Q357380", n = "kryt[é|ý] bazén[y]" }, kidsclub = { g = 5, wd = "Q16255832", n = "dětsk[é|ý] klub[y]" }, kiting = { g = 5, wd = "Q219554", n = "kitesurfing" }, library = { g = 5, wd = "Q7075", n = "knihovn[y|a]" }, lift = { g = 5, wd = "Q132911", n = "výtah[y]" }, lobby = { g = 5, wd = "Q31948", n = "lobby" }, luggage_storage = { g = 5, wd = { "Q1195470", "Q21996814" }, n = "úschovna zavazadel" }, money_exchange_machine = { g = 5, wd = "Q25632829", n = "automat na výměnu peněz" }, meeting = { g = 5, wd = "Q3469909", n = "zasedací místnost[i]" }, -- meeting rooms minigolf = { g = 5, wd = "Q754796", n = "minigolf" }, nightclub = { g = 5, wd = "Q622425", n = "noční klub[y]" }, playground = { g = 5, wd = "Q11875349", n = "hřiště" }, pool = { g = 5, wd = { "Q1501", "Q118559330" }, n = "bazén[y]" }, reception = { g = 5, wd = "Q2794937", alias = "service_counter", n = "recepce" }, restaurant = { g = 5, wd = "Q11707", n = "restaurace" }, roof_garden= { g = 5, wd = "Q1156696", n = "střešní zahrada" }, roof_terrace= { g = 5, wd = "Q1081213", n = "střešní teras[y|a]" }, room = { g = 5, wd = "Q180516", n = "pokoj[e]" }, sauna = { g = 5, wd = "Q57036", n = "sauna" }, socket_near_bed = { g = 5, wd ="Q110073378", n = "zásuvka u postele" }, shop = { g = 5, wd = "Q213441", n = "prodejna" }, souvenir_shop = { g = 5, wd = "Q865693", n = "prodejna suvenýrů" }, spa = { g = 5, wd = "Q1341387", alias = "wellness_center", n = "lázně" }, sports = { g = 5, wd = "Q349", n = "sport" }, suite = { g = 5, wd = "Q1367530", n = "apartmá" }, surfing = { g = 5, wd = "Q1324499", n = "surfing" }, tennis = { g = 5, wd = "Q847", n = "tenis" }, tennis_court = { g = 5, wd = "Q741118", n = "tenisový kurt" }, theater = { g = 5, wd = "Q24354", n = "divadlo" }, warm_water = { g = 5, wd = "Q1419245", n = "teplá voda" }, water_slide= { g = 5, wd = "Q1163166", n = "Wasserrutsche[n]" }, wave_pool = { g = 5, wd = "Q827349", n = "bazén s vlnami" }, -- non-hotel facilities audioguide = { g = 5, wd = "Q758877", n = "audioprůvodce" }, cctv = { g = 5, wd = { "Q242256", "Q334415" }, n = "kamerový systém" }, communal_bunks = { g = 5, wd = "Q1628935", n = "společné palandy" }, educational_workshop = { g = 5, wd ="Q113484895", n = "vzdělávací workshop" }, guidebook = { g = 5, wd = "Q223638", n = "tištěný cestovní průvodce" }, lecture_hall = { g = 5, wd = "Q253275", n = "auditorium" }, lighting = { g = 5, wd = "Q210064", n = "osvětlení" }, museum_shop= { g = 5, wd = "Q2922607", n = "muzejní obchod[y]" }, organ = { g = 5, wd = "Q1444", n = "varhany" }, public_clock = { g = 5, wd ="Q129165885", n = "veřejné hodiny" }, rest_area = { g = 5, wd = { "Q47520603", "Q785979" }, alias = "picnic_site", n = "místo pro piknik" }, reading_room = { g = 5, wd = "Q1753764", n = "čítárna" }, shakedown = { g = 5, wd = "Q40415224", n = "nouzové nocoviště" }, school_meal= { g = 5, wd = "Q1195832", n = "školní stravování" }, winter_room= { g = 5, wd = "Q382899", n = "zimní prostor" }, -- services in hotels etc. ["24-hour_reception"] = { g = 6, wd = "", n = "24hodinová recepce" }, accessible_toilet = { g = 6, wd = "Q2775009", n = "přístupná toaleta" }, airport_shuttle = { g = 6, wd = "", n = "letištní transfer" }, airport_terminal = { g = 6, wd = "Q849706", n = "letištní terminál" }, airport_transportation = { g = 6, wd = "", n = "letištní doprava" }, animation = { g = 6, wd = "Q547762", n = "animátor" }, baby_change = { g = 6, wd = "Q2567605", n = "přebalovací místnost[i]" }, babysitting = { g = 6, wd = "Q797990", n = "hlídání dětí" }, bahnhofsmission = { g = 6, wd = "Q801713", n = "Bahnhofsmission" }, beauty_service = { g = 6, wd = "Q30303305", n = "kosmetický servis" }, bicycle = { g = 6, wd = "Q11442", n = "jízdní kolo" }, breakfast = { g = 6, wd = "Q80973", n = "snídaně" }, breakfast_buffet = { g = 6, wd = "", n = "snídaně ve formě bufetu" }, breakfast_included= { g = 6, wd = "", n = "snídaně v ceně" }, bus_stop = { g = 6, wd = "Q953806", n = "zastávka autobusu" }, car_hire = { g = 6, wd = "Q291240", n = "půjčovna aut" }, changing_table = { g = 6, wd = "Q1780834", n = "přebalovací pult" }, concierge = { g = 6, wd = "Q2664461", n = "vrátný" }, discotheque = { g = 6, wd = "Q1228895", n = "diskotéka" }, dry_cleaning = { g = 6, wd = "Q878156", n = "suché čištění" }, entertainment = { g = 6, wd = "Q173799", n = "zábava" }, federal_police = { g = 6, wd = "Q56026", n = "Bundespolizei" }, free_parking = { g = 6, wd ="Q108759647", n = "bezplatné parkování" }, gate = { g = 6, wd = "Q247739", n = "odletová brána" }, hairdresser = { g = 6, wd = { "Q55187", "Q95856773", "Q3062512" }, n = "kadeřník" }, laundry = { g = 6, wd = { "Q267734", "Q7223085", "Q12893467", "Q57261433" }, n = "prádelna[y]" }, live_music = { g = 6, wd ="Q100348587", n = "živá hudba" }, massage = { g = 6, wd = "Q179415", n = "masáž" }, multilingual_staff= { g = 6, wd = "Q30081", n = "vícejazyčný personál" }, newspaper = { g = 6, wd = "Q11032", n = "noviny" }, paid_parking = { g = 6, wd ="Q128800991", n = "placené parkování" }, post_office = { g = 6, wd = "Q35054", n = "pošta" }, public_toilet = { g = 6, wd = { "Q813966", "Q3472280" }, n = "veřejné záchody" }, railroad_police = { g = 6, wd = "Q1930355", n = "železniční policie" }, room_service = { g = 6, wd = "Q2048970", n = "pokojová služba" }, selflaundry = { g = 6, wd = "Q1143034", n = "samoobslužná prádelna" }, shuttle_bus = { g = 6, wd = "Q1368498", n = "shuttlebus" }, taxicab_stand = { g = 6, wd = { "Q82650", "Q1395196" }, n = "taxi" }, ticket_machine = { g = 6, wd = "Q657345", n = "automat na jízdenky" }, ticket_office = { g = 6, wd = { "Q56845288", "Q15842100" }, n = "pokladna" }, toilet = { g = 6, wd = { "Q7857", "Q97657740" }, n = "záchody" }, urinal = { g = 6, wd = { "Q152285", "Q97657738" }, n = "pisoár" }, wc = { g = 6, wd = "Q7813355", n = "WC" }, workshop = { g = 6, wd = "Q656720", n = "dílna" }, -- room facilities ac = { g = 7, wd = "Q173725", n = "klimatizace" }, air_condition = { g = 5, wd = "Q1265533", n = "klimatizace" }, balcony = { g = 7, wd = "Q170552", n = "balkon" }, bathroom = { g = 7, wd = "Q190771", n = "koupelna" }, bathtub = { g = 7, wd = "Q152095", n = "vana" }, bottle_warmer = { g = 7, wd = "Q56711128", n = "ohřívač lahví" }, coffeemaker= { g = 7, wd = "Q211841", n = "kávovar" }, commonbath = { g = 7, wd = "", n = "společná koupelna" }, -- Gemeinschaftsbad fan = { g = 7, wd = "Q6498398", n = "ventilátor" }, fridge = { g = 7, wd = "Q37828", n = "lednice" }, grab_rail = { g = 7, wd = "", n = "rukojeť" }, hairdryer = { g = 7, wd = "Q15004", n = "fén" }, jacuzzi = { g = 7, wd = "Q1936429", n = "vířivka" }, -- incl. hot tub kitchen = { g = 7, wd = "Q43164", n = "kuchyně" }, -- usable for guest, usually in the room minibar = { g = 7, wd = "Q1191522", n = "minibar[y]" }, phone = { g = 7, wd = "Q11035", n = "telefon[y]" }, safe = { g = 7, wd = "Q471898", n = "trezor[y]" }, shower = { g = 7, wd = "Q7863", n = "sprcha" }, terrace = { g = 7, wd = "Q641406", n = "terasa" }, tv = { g = 7, wd = "Q8075", n = "televize" }, -- cuisine by ethnicity african = { g = 8, wd = "Q386284", n = "africká kuchyně" }, alsatian = { g = 8, wd = "Q3006870", n = "elsässische Küche" }, american = { g = 8, wd = "Q40578", n = "americká kuchyně" }, arab = { g = 8, wd = "Q623970", n = "arabská kuchyně" }, argentinian= { g = 8, wd = "Q579500", n = "argentinská kuchyně" }, asian = { g = 8, wd = "Q728206", n = "asijská kuchyně" }, australian = { g = 8, wd = "Q783010", n = "autralská kuchyně" }, austrian = { g = 8, wd = "Q42029", n = "österreichische Küche" }, baden = { g = 8, wd = "Q799087", n = "badische Küche" }, balkan = { g = 8, wd = "Q805060", n = "balkánská kuchyně" }, basque = { g = 8, wd = "Q521179", n = "baskická kuchyně" }, bavarian = { g = 8, wd = "Q458851", n = "bavorská kuchyně" }, bolivian = { g = 8, wd = "Q3006895", n = "bolivijská kuchyně" }, brazilian = { g = 8, wd = "Q614394", n = "brasilská kuchyně" }, burmese = { g = 8, wd = "Q1187275", n = "burmská kuchyně" }, californian= { g = 8, wd = "Q1026802", n = "kalifornská kuchyně" }, cambodian = { g = 8, wd = "Q139430", n = "kambodžská kuchyně" }, cantonese = { g = 8, wd = "Q1154790", n = "kantonská kuchyně" }, caribbean = { g = 8, wd = "Q1729345", n = "karibská kuchyně" }, chinese = { g = 8, wd = "Q10876842", n = "čínská kuchyně" }, creole = { g = 8, wd = { "Q85430164", "Q1645076" }, n = "kreolische Küche" }, croatian = { g = 8, wd = "Q1789628", n = "chorvatská kuchyně" }, cypriot = { g = 8, wd = "Q245932", n = "kyperská kuchyně" }, czech = { g = 8, wd = "Q871595", n = "česká kuchyně" }, danish = { g = 8, wd = "Q1196267", n = "dánská kuchyně" }, egyptian = { g = 8, wd = "Q1346230", n = "egyptská kuchyně" }, english = { g = 8, wd = "Q1261477", n = "anglická kuchyně" }, ethiopian = { g = 8, wd = "Q257508", n = "etiopská kuchyně" }, european = { g = 8, wd = "Q579316", n = "evropská kuchyně" }, franconian = { g = 8, wd = "Q1471192", n = "fränkische Küche" }, french = { g = 8, wd = "Q6661", n = "francouzská kuchyně" }, fucha_ryori= { g = 8, wd = "Q10286142", n = "Fucha Ryōri" }, -- ????????????? nevím jak přeložit do CZ georgian = { g = 8, wd = "Q1199026", n = "gruzínská kuchyně" }, german = { g = 8, wd = "Q47629", n = "německá kuchyně" }, greek = { g = 8, wd = "Q744027", n = "řecká kuchyně" }, home_style = { g = 8, wd = "Q881929", n = "domácí kuchyně" }, hunan = { g = 8, wd = "Q1156889", n = "Hunanská kuchyně" }, hungarian = { g = 8, wd = "Q264327", n = "maďarská kuchyně" }, indian = { g = 8, wd = "Q192087", n = "indická kuchyně" }, indonesian = { g = 8, wd = "Q787497", n = "indonézská kuchyně" }, international = { g = 8, wd = "Q99522230", n = "mezinárodní kuchyně" }, iranian = { g = 8, wd = "Q1342397", n = "íránská kuchyně" }, irish = { g = 8, wd = "Q1068545", n = "irská kuchyně" }, italian = { g = 8, wd = "Q192786", n = "italská kuchyně" }, japanese = { g = 8, wd = "Q234138", n = "japonská kuchyně" }, jewish = { g = 8, wd = "Q284288", n = "jüdische Küche" }, korean = { g = 8, wd = "Q647500", n = "korejská kuchyně" }, latin_american = { g = 8, wd = "Q2707196", n = "latinskoamerická kuchyně" }, lebanese = { g = 8, wd = "Q929239", n = "libanonská kuchyně" }, levantine = { g = 8, wd = "Q765174", n = "levantská kuchyně" }, malaysian = { g = 8, wd = "Q772247", n = "malajská kuchyně" }, medieval = { g = 8, wd = "Q10886", n = "středověká kuchyně" }, mediterranean = { g = 8, wd = "Q934309", n = "středomořská kuchyně" }, mexican = { g = 8, wd = "Q207965", n = "mexická kuchyně" }, modern = { g = 8, wd = "", n = "moderne Küche" }, national = { g = 8, wd = "Q1968435", n = "národní kuchyně" }, nepalese = { g = 8, wd = "Q1194855", n = "nepálská kuchyně" }, new_nordic = { g = 8, wd = "Q3345199", n = "nová dánská kuchyně" }, nubian = { g = 8, wd ="Q113827054", n = "núbijská kuchyně" }, oriental = { g = 8, wd = "Q1547037", n = "orientální kuchyně" }, pakistani = { g = 8, wd = "Q1089120", n = "pákistánská kuchyně" }, peruvian = { g = 8, wd = "Q749847", n = "peruánská kuchyně" }, polish = { g = 8, wd = "Q756020", n = "polská kuchyně" }, portuguese = { g = 8, wd = "Q180817", n = "portugalská kuchyně" }, regional = { g = 8, wd = "Q94951", n = "regionální kuchyně" }, rhenish = { g = 8, wd = "Q2147761", n = "rýnská kuchyně" }, russian = { g = 8, wd = "Q12505", n = "ruská kuchyně" }, savoy = { g = 8, wd = "Q3006988", n = "Savoyer Küche" }, shandong = { g = 8, wd = "Q1038209", n = "shandongská kuchyně" }, sichuan = { g = 8, wd = "Q691365", n = "sichuanská kuchyně" }, south_indian= { g = 8, wd = "Q3595152", n = "jihoindická kuchyně" }, spanish = { g = 8, wd = "Q622512", n = "španělská kuchyně" }, swedish = { g = 8, wd = "Q35623", n = "švédská kuchyně" }, swiss = { g = 8, wd = "Q13497", n = "švýcarská kuchyně" }, swabian = { g = 8, wd = "Q880365", n = "švábská kuchyně" }, syrian = { g = 8, wd = "Q4119264", n = "syrische Küche" }, thai = { g = 8, wd = "Q841984", n = "thajská kuchyně" }, thuringian = { g = 8, wd = "Q187477", n = "durynská kuchyně" }, turkish = { g = 8, wd = "Q654493", n = "turecká kuchyně" }, ukranian = { g = 8, wd = "Q1503789", n = "ukrajinská kuchyně" }, vietnamese = { g = 8, wd = "Q826059", n = "vietnamská kuchyně" }, western = { g = 8, wd = "Q16143746", n = "západní kuchyně" }, westphalian= { g = 8, wd = "Q2565249", n = "vestfálská kuchyně" }, -- cuisine by type of food bagel = { g = 9, wd = "Q272502", n = "bagel" }, barbecue = { g = 9, wd = "Q461696", n = "Q461696" }, bougatsa = { g = 9, wd = "Q895009", n = "bougatsa" }, burger = { g = 9, wd = "Q6663", n = "hamburger" }, cake = { g = 9, wd = "Q13276", n = "dort" }, casserole = { g = 9, wd = "Q7724780", n = "kastrol" }, chicken = { g = 9, wd = "Q864693", n = "kuře" }, crepe = { g = 9, wd = "Q12200", n = "crêpe" }, couscous = { g = 9, wd = "Q76605", n = "kuskus" }, curry = { g = 9, wd = "Q164606", n = "curry" }, dessert = { g = 9, wd = "Q182940", n = "dezert" }, donut = { g = 9, wd = "Q192783", n = "donut" }, empanada = { g = 9, wd = "Q747457", n = "empanada" }, fish = { g = 9, wd = "Q152", n = "ryba" }, fish_and_chips = { g = 9, wd = "Q203925", n = "fish and chips" }, fried_food = { g = 9, wd = "Q300472", n = "smažené jídlo" }, friture = { g = 9, wd = "Q854618", n = "fritované jídlo" }, grill = { g = 9, wd = "Q853185", n = "gril" }, gyros = { g = 9, wd = "Q681596", n = "gyros" }, ice_cream = { g = 9, wd = "Q13233", n = "zmrzlina" }, kebab = { g = 9, wd = "Q179010", n = "kebab" }, noodle = { g = 9, wd = "Q192874", n = "nudle" }, pancake = { g = 9, wd = "Q44541", n = "palačinky" }, pasta = { g = 9, wd = "Q178", n = "těstoviny" }, pie = { g = 9, wd = "Q13360264", n = "koláč" }, pizza = { g = 9, wd = "Q177", n = "pizza" }, salad = { g = 9, wd = "Q9266", n = "salát" }, sandwich = { g = 9, wd = "Q28803", n = "sandwich" }, sausage = { g = 9, wd = "Q131419", n = "uzenina" }, seafood = { g = 9, wd = "Q192935", n = "mořské plody" }, soba = { g = 9, wd = "Q753910", n = "Soba" }, soup = { g = 9, wd = "Q41415", n = "polévka" }, steakhouse = { g = 9, wd = "Q3109696", n = "steakhouse" }, sushi = { g = 9, wd = "Q46383", n = "sushi" }, tapas = { g = 9, wd = "Q220964", n = "tapas" }, vegan = { g = 9, wd = { "Q181138", "Q20669090" }, n = "veganská strava" }, vegetarian = { g = 9, wd = { "Q83364", "Q638022" }, n = "vegetariánská strava" }, wild_game = { g = 9, wd = "Q223930", n = "zvěřina" }, yakitori = { g = 9, wd = "Q483163", n = "jakitori" }, -- drinks alcoholic = { g = 10, wd = "Q154", n = "alkoholické nápoje" }, beer = { g = 10, wd = "Q44", n = "pivo" }, cocktails = { g = 10, wd = "Q134768", n = "koktejly" }, ["non-alcoholic"] = { g = 10, wd = "Q2647467", n = "nealkoholické nápoje" }, noalcoholic= { g = 10, wd = "Q67426650", n = "žádné alkoholické nápoje" }, wine = { g = 10, wd = "Q282", n = "víno" }, -- services in restaurants beer_garden = { g = 11, wd = "Q857909", n = "pivní zahrada" }, bowling_alley = { g = 11, wd = "Q27106471", n = "bowlingová dráha" }, delivery = { g = 11, wd = { "Q2334804", "Q1824143" }, n = "dodávka" }, drive_in = { g = 11, wd = "Q14253958", n = "drive-in" }, drive_through = { g = 11, wd = "Q14253958", n = "drive-through" }, -- including drive-thru outdoor_seating = { g = 11, wd = "Q98642678", n = "venkovní posezení" }, reservation = { g = 11, wd = { "Q2145615", "Q7673285" }, n = "rezervace" }, self_service = { g = 11, wd = "Q1369310", n = "samoobslužný servis" }, table_service = { g = 11, wd ="Q100805023", n = "číšník" }, takeaway = { g = 11, wd = "Q154383", n = "jídlo s sebou" }, -- including "take-out", "to-go", and "carry-out" -- activity policies (P5023) -- photography noflash = { g = 12, wd = "Q51728726", n = "bez blesku" }, nophotos = { g = 12, wd = "Q51728721", n = "fotografování zakázáno" }, nosticks = { g = 12, wd = "Q53540617", n = "žádné selfie tyče" }, notripod = { g = 12, wd ="Q108583523", n = "bez stativu" }, novideo = { g = 12, wd = "Q66361451", n = "video zakázáno" }, permit_for_commercial_photography = { g = 12, wd ="Q113756144", n = "pro komerční fotografování vyžadováno povolení" }, photos_allowed= { g = 12, wd = "Q51728733", n = "fotografování povoleno" }, -- general policies adults_only = { g = 13, wd ="Q132174927", n = "Adults Only, Erwachsenenhotel" }, animals = { g = 13, wd ="Q105100898", n = "zvířata povolena" }, bags_prohibited = { g = 13, wd ="Q113773766", n = "velké tašky zakázány" }, cats = { g = 13, wd ="Q105100905", n = "kočky povoleny" }, companion_dogs= { g = 13, wd ="Q116343464", n = "doprovodní psi povoleni" }, couples_and_families = { g = 13, wd ="Q136175147", n = "Couples and Families Only" }, couples_only = { g = 13, wd ="Q136175105", n = "Couples Only" }, dogs = { g = 13, wd ="Q105100922", n = "psi povoleni" }, drinking_ban = { g = 13, wd ="Q111986775", n = "zákaz pití" }, eating_ban = { g = 13, wd ="Q116343890", n = "zákaz jezení" }, face_mask_mandatory = { g = 13, wd = "Q97933005", n = "povinná rouška" }, families_only = { g = 13, wd ="Q136175123", n = "Families Only, Familienhotel" }, leashed_dogs = { g = 13, wd = "Q66361287", n = "psi na vodítku" }, noanimals = { g = 13, wd ="Q105094093", n = "zvířata zakázána" }, nobarefoot = { g = 13, wd ="Q135522352", n = "keine Barfüßigkeit" }, nobikes = { g = 13, wd = "Q66361472", n = "Fahrräder verboten" }, nocamping = { g = 13, wd = "Q66361437", n = "zákaz stanování" }, nocats = { g = 13, wd ="Q105094244", n = "kočky zakázány" }, nodogs = { g = 13, wd ="Q105094236", n = "psi zakázáni" }, nodrones = { g = 13, wd = "Q66361435", n = "drony zakázány" }, nofeeding = { g = 13, wd = "Q5286412", n = "krmení zvířat je zakázáno" }, nohighheels = { g = 13, wd ="Q123013492", n = "podpatky zakázány" }, nokids = { g = 13, wd = "Q24861437", n = "děti zakázány" }, nolittering = { g = 13, wd = "Q66361444", n = "odhazování odpadků zakázáno" }, noloudly = { g = 13, wd ="Q111986810", n = "mluvení nahlas zakázáno" }, nonsmoking = { g = 13, wd = "", n = "kouření zakázáno" }, nopets = { g = 13, wd = "Q66361297", n = "domácí zvířata zakázána" }, notouch = { g = 13, wd = "Q66361307", n = "dotýkat se zakázáno" }, pets = { g = 13, wd = "Q66361299", n = "domácí zvířata povolena" }, smoking = { g = 13, wd = "Q18809854", n = "kouření" }, smoking_ban = { g = 13, wd = "Q751734", n = "kouření zakázáno" }, smoking_separated= { g = 13, wd ="Q110090224", n = "kouření na oddělených místech" }, water_mandatory= { g = 13, wd = "Q66361375", n = "eigenes Wasser zwingend erforderlich" }, -- dress codes: dress_code = { g = 13, wd = "Q286300", n = "Kleiderordnung" }, smart_casual = { g = 13, wd = "Q7544032", n = "smart casual" }, decent_clothing = { g = 13, wd = "Q66361332", n = "Angemessene Kleidung erforderlich" }, -- difficulties (routes etc.) novice = { g = 14, wd = "", n = "začátečník" }, easy = { g = 14, wd = "", n = "jednoduché" }, intermediate = { g = 14, wd = "", n = "střední" }, advanced = { g = 14, wd = "", n = "pokročilý" }, expert = { g = 14, wd = "", n = "zkušenější" }, freeride = { g = 14, wd = "", n = "Freeride" }, extreme = { g = 14, wd = "", n = "extrémní" }, }, -- group meanings g = { ["1"] = "cenová skupina", ["2"] = "klasifikace", ["3"] = "typ hotelu", ["4"] = "obecná zařízení", ["5"] = "vybavení", ["6"] = "služby", ["7"] = "vybavení", ["8"] = "kuchyně podle typu", ["9"] = "jídlo podle druhu", ["10"] = "nápoje", ["11"] = "služby restaurace", ["12"] = "fotografování", ["13"] = "chování", ["14"] = "úrovně obtížnosti" }, exclude = { -- do not translate Q116168276 = "10. Superior Deluxe", Q1031873 = "aircraft catapult", Q573970 = "apron", Q104123038 = "bilingual street name sign", Q918324 = "control tower", Q192375 = "hangar", Q464020 = "instrument landing system", Q1061299 = "jet bridge", Q184590 = "runway", Q774583 = "solar panel", Q5191724 = "steeple", Q35473 = "window" } } 8rupvb9g0v2uwtqgw1s3m5l7vefcbz8 Modul:Languages 828 1331 22097 17400 2026-05-20T11:30:24Z LiMr 96 aktualizace na novější verzi 22097 Scribunto text/plain -- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Modul:Languages&oldid=1763812) -- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Modul:Languages&oldid=1763812) --[[ 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 = 'arabská abeceda', Q8201 = 'čínské znaky', Q8209 = 'cyrilice', Q8216 = 'řecká abeceda', Q8222 = 'hangŭl', Q8229 = 'latinka', Q11932 = 'arménské písmo', Q26803 = 'Tamilské písmo', Q33513 = 'hebrejské písmo', Q38592 = 'Dévanágarí', Q46861 = 'tibetské písmo', Q82772 = 'kandži', Q161428 = 'gruzínská písma', Q185083 = 'Bráhmí', Q191272 = 'asamská abeceda', Q236376 = 'thajské písmo', Q257634 = "Etiopské písmo", Q570450 = 'Telugské písmo', Q733944 = 'Gujarati', Q756802 = 'bengálské písmo', Q839666 = 'Kannadské písmo', Q854968 = 'Barmské písmo', Q877906 = 'Tána', Q1054190 = 'khmerské písmo', Q1164129 = 'Malajská abeceda', Q1197646 = 'Yi abeceda', Q1574992 = 'sinhálské písmo', Q1760127 = 'Odia', Q1815229 = 'laoské písmo', Q2274646 = 'Inuktitutské písmo', }, 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'} } } 4d0v243cf4sebzx6t64tgs9dj6k50ce Modul:VCard/Qualifiers 828 1332 22089 17412 2026-05-20T10:29:32Z LiMr 96 aktualizace na novější verzi 22089 Scribunto text/plain -- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Modul:VCard/Qualifiers&oldid=1769792) -- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Modul:VCard/Qualifiers&oldid=1769792) -- 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-04-12", item = 99929816 }, labels = { -- Einheiten / units gratis = "zdarma", Q1543615 = "zdarma", Q1092296 = "rok", Q24564698 = "let", -- Benutzung / use (P366) -- betroffener Teil / applies to part (P518) etc. Q5070802 = "mimořádná událost", Q11028 = "informace", Q58897583 = "Information", Q1482145 = "helpline", Q256132 = "telefonní ústředna", Q1261521 = "Vermittlung", Q589666 = "Telefonzentrale", Q2794937 = "recepce", Q31948 = "předsíň", Q862212 = "lobby", Q4096995 = "Buchung", Q1029698 = "Führung", Q2145615 = "rezervace", Q1162163 = "ředitel", Q267936 = "výkonný ředitel", Q25713832 = "vedoucí organizace", Q11964531 = "generální manažer", Q22132694 = "ředitel muzea", Q80687 = "sekretář", Q859482 = "sekretariát", Q182060 = "kancelář", Q5283295 = "administrativa", Q50412353 = "správa", Q39809 = "marketing", Q133080 = "public relations", Q111148864 = "Kulturamt", Q674426 = "kurátor", Q2108946 = "Pressestelle", Q1193236 = "Presse", Q5196479 = "Kundenbetreuung", Q1060653 = "Kundendienst", Q955464 = "farář", Q7406919 = "služba", Q51073356 = "Hafenmeister", Q11735065 = "Hafenmeister", Q12407563 = "Parkraumbewirtschaftung", Q1049511 = "WhatsApp", Q15616276 = "Telegram", Q17517 = "mobilní telefon", Q738621 = "pevná linka", Q2664461 = "vrátný", Q1735282 = "pokladník", Q1463565 = "pokladna", Q551800 = "vstupenka", Q187456 = "bar", Q777754 = "catering", Q41958 = "catering", Q171141 = "gastronomie", Q43164 = "kuchyně", Q213441 = "prodejna", Q11707 = "restaurace", Q547762 = "animátor", Q133215 = "kasino", Q1065656 = "posilovna", Q55187 = "kadeřník", Q31374404 = "obchodní dům", Q179415 = "masáž", Q33506 = "muzeum", Q2772772 = "Militärmuseum", Q1824143 = "dodávka", Q2048970 = "pokojová služba", Q15983979 = "ztráty a nálezy", Q60616546 = "městský cestovní ruch", Q112726458 = "vízový úřad", Q862761 = "uvnitř", Q1322786 = "außen", Q121298623 = "Außenanlage", Q115156410 = "muzejní výstava", Q464980 = "Ausstellung", Q5402268 = "Dauerausstellung", Q10426913 = "Dauerausstellung", Q29023906 = "dočasná výstava", -- gilt für Leute / applies to people (P6001) Q5 = "osoba", Q1340307 = "batole", Q11370581 = "kojenci a batolata", Q7569 = "dítě", Q29514218 = "dítě", Q1076052 = "Vorschulkinder", Q11519472 = "Vorschulkinder", Q1902344 = "Vorschulkinder", Q190007 = "mladý", Q131774 = "adolescent", Q170079 = "mladistvý", Q1492760 = "teenager", Q17156455 = "mladý dospělý", Q80994 = "dospělý", Q18000 = "zletilý", Q16003605 = "student základní školy", Q98021727 = "student základní školy", Q16003532 = "středoškolák", Q15360275 = "středoškolák", Q48942 = "žák", Q68131879 = "žák", Q73229462 = "Schüler", Q98033936 = "Sekundarschüler", Q37226 = "učitel", Q48282 = "student", Q315247 = "student univerzity", Q110207241 = "zahraniční student", Q253567 = "učeň", Q59263364 = "učeň", Q28790169 = "nezaměstnaný", Q59308743 = "příjemce sociálních dávek", Q109710549 = "Federální poskytovatel dobrovolnických služeb", -- zajímalo by mě kde se to využije Q136806547 = "Freiwilligendienstleistende", Q136806565 = "Freiwilligendienstleistende", Q24716636 = "dobrovolník", Q1454927 = "Wehrdienstleistende", Q47228496 = "Wehrdienstleistende", Q1930187 = "novinář", Q1749879 = "důchodce", Q1358789 = "senior", Q191089 = "senior", Q2191986 = "senior", Q111524907 = "senior od 60 let", Q117131136 = "senior od 65 let", Q108427775 = "senior nad 65 let", Q12131 = "invalida", Q10857933 = "osoba se zdravotním postižením", Q1250414 = "těžce postižený", Q136806121 = "Schwerbehinderte ab 50%", Q8436 = "rodina", Q1422286 = "doprovázející osoba", Q874405 = "sociální skupina", Q16334295 = "skupina", Q1605672 = "vedoucí mládeže", Q113191894 = "egyptští studenti", Q113191817 = "arabští studenti", Q221488 = "chodec", Q11442 = "cyklista", Q42889 = "vozidlo", Q1420 = "auto", Q1144312 = "osobní automobil", Q190578 = "Pkw", Q43193 = "kamion", Q5638 = "Bus", Q1373492 = "Bus", Q193234 = "skútr", Q34493 = "motocykl", Q23901795 = "plná cena", Q100157294 = "snížená cena", Q23901802 = "snížená cena", Q10328277 = "poloviční vstupné", Q10585806 = "Minimum", Q10578722 = "Maximum", Q30079877 = "měsíční jízdenka", Q2024421 = "online jízdenka", Q59582212 = "týdenní jízdenka", Q819073 = "pracovní den", Q211391 = "víkend", Q22947 = "obyvatel", Q1020994 = "občan", Q70237645 = "Inland", Q473741 = "cizinec", Q1072012 = "mezinárodní", Q56508363 = "EU/EEA občan", Q56508358 = "ne EU/EEA občan", Q1061510 = "egypťan", Q35323 = "arab", Q31 = "belgičan", Q4200853 = "indonésan", Q15731961 = "indonésan", Q19840821 = "singapuřan", Q126003079 = "Singapurer*innen", Q2408569 = "Thailänder*innen", Q7901501 = "uruguajec", Q39201 = "domácí mazlíček", Q144 = "pes", Q62966720 = "management parkování", Q1039099 = "průvodce", Q758877 = "audioprůvodce", Q15328 = "kamera", Q313600 = "fotoaparát", Q313614 = "videokamera", Q335234 = "videokamera", Q335095 = "filmová kamera", Q683906 = "stativ", Q24192067 = "rollstuhlgeeignet", Q24192068 = "rollstuhlgeeignet mit Hilfe", Q63731120 = "teilweise rollstuhlzugänglich", Q63731151 = "teilweise rollstuhlzugänglich mit Hilfe" -- es fehlen Übernachtung, ÜF, EZ, DZ u. ä. (in Wikidata anlegen) } } 99anpp79hc5q7b6qm2httpkluf8ds0l Modul:Exchange rate 828 1335 22098 17280 2026-05-20T11:34:48Z LiMr 96 aktualizace na novější verzi 22098 Scribunto text/plain -- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Modul:Exchange_rate&oldid=1775631) -- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Modul:Exchange_rate&oldid=1775631) -- pravděpodobně lze sloučit s modulem převzatým z enwikivoyage modul:Exchangerate --[[ Thanks to GiftBot who is uploading/updating currency exchange rates to Wikimedia Commons. This service is available since March of 2022. ]]-- -- module variable and administration local er = { moduleInterface = { suite = 'Exchange rate', serial = '2026-05-17', item = 112066294 } } -- require( 'strict' ) -- Exchange-rate tables stored on Wikimedia Commons local tableNames = { 'ECB euro foreign exchange reference rates.tab', 'Xe.com exchange rates.tab' } -- language-dependent error messages local messages = { unknownIsoCode = '[[Kategorie:Údržba:Stránky s neznámým kódem měny]] <span class="error">Neznámý kód měny</span>', wrongParams = '[[Kategorie:Údržba:Nesprávné parametry]] <span class="error">Nesprávné parametry</span>' } -- language-dependent constants local language = { defaultUnits = { 'CZK', 'EUR', 'USD' }, decimalSep = ',', -- decimal separator thousandsSep = '.', commaSep = mw.message.new( 'comma-separator' ):plain(), dateFormat = 'j. M Y', convertFormatter = '≈ %s', defaultFormatter = '%s&#x202F;unit', wrapperClass = 'voy-currency', conversionVia = 'EUR', -- EUR or USD all = 'všechno', -- lowercase letters date = 'datum' } -- variables for internal use local cu -- for currencies-table module local rateTables = {} -- to prevent multiple fetching -- check if arg is set local function isSet( arg ) return arg and arg ~= '' end -- returns a currency formatter string for isoCode -- the following function must be localized local function getFormatter( isoCode, externalFormatter ) isoCode = isSet( isoCode ) and isoCode:upper() or 'XXX' if externalFormatter then return externalFormatter( isoCode ) elseif not cu then cu = mw.loadData( 'Module:CountryData/Currencies' ) end local tab = cu.isoToQid[ isoCode ] and cu.currencies[ cu.isoToQid[ isoCode ] ] local default = cu.currencies.default or language.defaultFormatter if tab then if tab.f then return tab.f else local unit = tab.add and tab.add:gsub( ',.*', '' ) or tab.iso return default:gsub( 'unit', unit ) end end return default:gsub( 'unit', isoCode ) end -- returns count of significant digits -- zeros after decimal separator are significant local function getDigitCount( num ) num = num:gsub( '%.', '' ):gsub( '^0+', '' ) return #num end -- rounds mantissa/significand of number num to digit count digitCount local function round( num, digitCount ) return tonumber( string.format( '%.' .. digitCount .. 'g', num ) ) end -- returns tabularData fields schema as associative table local function getFields( tabularData ) local fields = {} local tFields = tabularData.schema.fields for i = 1, #tFields do fields[ tFields[ i ].name ] = i end return fields end -- returns currency-rates table as associative table -- this is an expensive function: the rateTables should be established only once local function getRateTable( tableName ) local rows = {} local colNo, fields, row, tData if not rateTables[ tableName ] then local tabularData = mw.ext.data.get( tableName ) if not tabularData then return nil end fields = getFields( tabularData ) colNo = fields[ 'currency' ] tData = tabularData.data for i = 1, #tData do row = tData[ i ] rows[ row[ colNo ] ] = row end rateTables[ tableName ] = { fields = fields, rows = rows } end return rateTables[ tableName ] end -- returns exchange-rate properties for source -> target iso codes local function getCurrencyData( rateTable, source, target ) local rate, digitCount, asOf local fields = rateTable.fields local row = rateTable.rows[ source ] if row then rate = row[ fields[ target ] ]:gsub( ',', '' ) -- remove English thousands separator digitCount = getDigitCount( rate ) rate = tonumber( rate ) asOf = row[ fields[ 'date' ] ] end return rate, digitCount, asOf end -- returns exchange rate for source -> target iso codes -- toRound: Boolean function er.getRate( source, target, toRound ) -- source, target are three-letter ISO 4217 codes if not source:match( '^%a%a%a$' ) or not target:match( '^%a%a%a$' ) then return nil end local rateTable, fields, rate, digitCount, asOf source = source:upper() target = target:upper() for i = 1, #tableNames do rateTable = getRateTable( tableNames[ i ] ) if rateTable then fields = rateTable.fields if fields[ target ] then rate, digitCount, asOf = getCurrencyData( rateTable, source, target ) if rate then rate = 1/rate end elseif fields[ source ] then rate, digitCount, asOf = getCurrencyData( rateTable, target, source ) elseif fields[ language.conversionVia ] then local rate1, digitCount1, asOf1 = getCurrencyData( rateTable, source, language.conversionVia ) local rate2, digitCount2, asOf2 = getCurrencyData( rateTable, target, language.conversionVia ) if rate1 and rate2 then rate = rate2/rate1 digitCount = digitCount1 < digitCount2 and digitCount1 or digitCount2 asOf = asOf1 < asOf2 and asOf1 or asOf2 end end end if rate then break end end if rate and toRound then rate = round( rate, digitCount ) end return rate, asOf, digitCount end -- returns a converted date for aDate due to formatStr local function getDate( aDate, formatStr ) local function formatDate( date, aFormatStr ) return mw.getContentLanguage():formatDate( aFormatStr, date, true ) end if isSet( aDate ) then local success, t = pcall( formatDate, aDate, formatStr ) return success and t or '' else return '' end end -- inserts thousands separators in amount string local function insertThousandsSep( amount ) local k local sep = '%1' .. language.thousandsSep .. '%2' while true do amount, k = amount:gsub( '^(-?%d+)(%d%d%d)', sep ) if k == 0 then break end end return amount end -- localizes a number string local function formatNumber( num ) if language.decimalSep ~= '.' then num = num:gsub( '%.', language.decimalSep ) end return insertThousandsSep( num ) end -- adds the currency unit of isoCode to amount string local function addUnit( amount, isoCode, externalFormatter ) local formatStr = getFormatter( isoCode, externalFormatter ) return mw.ustring.format( mw.text.decode( formatStr ), amount ) end local function outputFormat( digits ) digits = math.floor( tonumber( digits ) or 2 ) if digits < 0 or digits > 6 then digits = 2 end return '%.'.. digits .. 'f' end -- selects different rate outputs due to show local function formatRate( rate, asOf, show, digits, target ) show = ( show or '' ):lower() rate = formatNumber( isSet( digits ) and outputFormat( digits ):format( rate ) or tostring( rate ) ) if isSet( digits ) or show == 'all' or show == language.all then rate = addUnit( rate, target ) end if show == 'all' or show == language.all then return rate .. ' (' .. getDate( asOf, language.dateFormat ) .. ')' elseif show == 'date' or show == language.date then return getDate( asOf, language.dateFormat ) else return rate end end -- converts a single currency amount without adding the currency unit local function convertSingle( source, target, amount, digits ) local rate, asOf, digitCount = er.getRate( source, target ) if rate then return formatNumber( outputFormat( digits ):format( round( amount * rate, digitCount ) ):gsub( '%.0*$', '' ) ) else return nil end end -- converts a single currency amount or an amount range and adding the currency unit function er._convert( source, targets, amount, withUnit, digits, externalFormatter ) local amount1, amount2, pos, result local results = {} if not isSet( targets ) then targets = language.defaultUnits withUnit = true elseif type( targets ) == 'string' then targets = { targets } end amount = amount:gsub( '[ %a%' .. language.thousandsSep .. ']+', '' ):gsub( '-', '–' ) if language.decimalSep ~= '.' then amount = amount:gsub( language.decimalSep, '.' ) end for i, target in ipairs( targets ) do if target ~= source then pos = mw.ustring.find( amount, '[^,%.%d]' ) if pos then amount1 = mw.ustring.sub( amount, 1, pos - 1 ) amount2 = tonumber( mw.ustring.sub( amount, pos + 1 ) ) else amount1 = amount end amount1 = tonumber( amount1 ) or 1 result = convertSingle( source, target, amount1, digits ) if pos and result and amount2 then amount2 = convertSingle( source, target, amount2, digits ) result = amount2 and ( result .. mw.ustring.sub( amount, pos, pos ) .. amount2 ) end if result then if withUnit then result = addUnit( result, target, externalFormatter ) end table.insert( results, result ) end end end result = table.concat( results, language.commaSep ) return result ~= '' and result end -- returns a wrapper format string with tooltip title function er.getWrapper( amount, source, target, digits, externalFormatter, withMaintenance) local formatStr = getFormatter( source, externalFormatter ) local title = er._convert( source, target, amount, true, digits ) if title then return tostring( mw.html.create( 'abbr' ) :attr( 'title', mw.ustring.format( language.convertFormatter, title ) ) :addClass( language.wrapperClass ) :addClass( language.wrapperClass .. '-' .. source:lower() ) :wikitext( formatStr ) ) else return formatStr .. ( withMaintenance and messages.wrongParams or '' ) end end -- #invoke function returning the exchange rate function er.rate( frame ) local args = frame.args local rate, asOf = er.getRate( args.source, args.target, true ) return rate and formatRate( rate, asOf, args.show, args.digits, args.target ) or messages.unknownIsoCode end -- #invoke function returning the converted amount or amount range function er.convert( frame ) local args = frame.args if isSet( args.show ) then return er.rate( frame ) else return er._convert( args.source, args.target, isSet( args.amount ) and args.amount or '1', ( args.plain or '' ) ~= '1', args.digits ) or messages.wrongParams end end -- #invoke function returning exchange-rate information -- returns the formatted amount or amount range with a tooltip containing -- converted values function er.currencyWithConversions( frame ) local args = frame.args if not isSet( args.amount ) then args.amount = '1' end return mw.ustring.format( er.getWrapper( args.amount, args.source, args.target, args.digits, nil, true ), args.amount:gsub( '-', '–' ) ) end return er mkhssyh1bongcqkdmdtx2fei412iavq Modul:Marker utilities/i18n 828 1336 22093 20759 2026-05-20T11:08:21Z LiMr 96 aktualizace na novější verzi 22093 Scribunto text/plain -- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Modul:Marker_utilities/i18n&oldid=1768059) -- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Modul:Marker_utilities/i18n&oldid=1768059) -- Separating code from internationalization return { -- module administration moduleInterface = { suite = 'Marker utilities', sub = 'i18n', serial = '2026-04-12', 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 = { 'leden', 'únor', 'březen', 'duben', 'květen', 'červen', 'červenec', 'srpen', 'září', 'říjen', 'listopad', 'prosinec' }, monthAbbr = { 'led%.?', 'úno%.?', 'bře%.?', 'dub%.?', 'kvě%.?', 'čvn%.?', 'čvc%.?', 'srp%.?', 'zář%.?', 'říj%.?', 'lis%.?', 'pro%.?' }, -- 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 = { accessibility = { 'P2846' }, contactComments = { 'P366', 'P518', 'P642', 'P1001', 'P1559', 'P106' }, feeComments = { 'P5314', 'P518', 'P6001', 'P1264', 'P585', 'P2899', 'P4135', 'P642', 'P580' }, policyComments = { 'P518', 'P1001', 'P6001' }, quantity = { 'P1114', 'P1083' }, accessQuantity = { 'P1114', 'P1083', 'P2846' } }, -- Wikidata properties representing a qualifier qualifiers = { mobilePhone = 'Q17517', P8733 = 'Q180516', roomNumber = 'Q180516' }, -- Languages for fallbacks, except wiki language langs = { 'en', 'cs', 'de' }, -- 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 = true, -- 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 = '; stav %s', -- with semicolon separator from = 'od %s', fromTo = '%s–%s', to = 'do %s', fromTo2 = '%s až %s', -- General, i18n -- black x-like cross closeX = '[[File:Close x - black.png|15px|link=|class=noviewer|Unbekanntes Marker-Symbol]]', missingName = 'Chybí název', -- 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', '[Ss]oubor', '[Oo]brázek' }, latitude = 'Zeměpisná šířka', longitude = 'Zeměpisná délka', tooltip = 'Kliknutím na značku se otevře mapa.', -- vCard / Listing module checkin = 'Check-in: %s', checkout = 'Check-out: %s', closed = 'Uzavřeno: %s', closedPattern = '^[Uu]zavřeno:?%s*', editInSource = 'upravit ve zdrojovém článku', email = 'e-mail: %s', expirationPeriod = 'now - 3 years', fax = 'Fax: %s', hintName = 'Název v místním jazyce %s', hintLatin = 'Název v latinském přepisu', hintAddress = 'Adresa v místním jazyce %s', hintAddress2 = 'Adresa v %s', hintDirections = 'Pokyny v místním jazyce %s', hours = 'Otevřeno: %s', iata = '[[International Air Transport Association|IATA]]: %s', icao = '[[Mezinárodní organizace pro civilní letectví|ICAO]]: %s', lastedit = 'Aktualizace: %s', lasteditNone = 'není specifikováno', maybeOutdated = '(Informace mohou být zastaralé)[[Kategorie:Údržba:Bod:zastaralé informace]]', mobile = 'Mobil: %s', payment = 'Přijímané způsoby platby: %s', phone = '<abbr title="Telefon">Tel.</abbr>: %s', price = 'Cena: %s', subtype = 'Vlastnost: %s.', subtypes = 'Vlastnosti: %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> zdarma: %s' }, -- format strings for mu.addMaintenance formats = { category = '[[Kategorie:%s]]', error = ' <span class="error">%s</span>', hint = ' <span class="voy-listing-check-recommended" style="display: none;">%s</span>' }, -- maintenance maintenance = { -- general properties = '[[Kategorie:Monitoring:Data z Wikidat]]', --myslím že není třeba kategorizovat type = { category = 'Monitoring:Data z Wikidat' }, --myslím že není třeba kategorizovat group = { category = 'Monitoring:Data z Wikidat' }, --myslím že není třeba kategorizovat urlWithIP = { category = 'Údržba:Špatná URL', hint = 'URL obsahuje IP adresu' }, wrongUrl = { category = 'Údržba:Neplatná URL', err = 'neplatná URL' }, commonscatWD = { category = 'Monitoring:Data z Wikidat' }, --myslím že není třeba kategorizovat contentTooLong = { category = 'Údržba:Popis je příliš dlouhý', err = 'Popis je příliš dlouhý' }, -- currencyTooltip= { category = 'VCard: Währungstooltips eingesetzt' }, --myslím že není třeba kategorizovat dmsCoordinate = { category = 'Údržba:DMS-souřadnice', hint = 'DMS-souřadnice' }, duplicateAliases = { category = 'Údržba:Stránky s duplicitním voláním šablon', err = 'Duplicitní aliasy: %s' }, headquarters = { category = 'VCard: Koordinate der Hauptverwaltung' }, labelFromWD = { category = 'Monitoring:Data z Wikidat', hint = 'Štítek z Wikidat' }, --myslím že není třeba kategorizovat; když tam kategorie není tak to hází chybu -- linkIsRedirect = { category = 'VCard: Artikellink ist Weiterleitung' }, --myslím že není třeba kategorizovat linkToOtherWV = { category = 'Údržba:Odkaz na jiné wikicesty' }, malformedName = { category = 'Údržba:Špatný název', err = 'Špatný název' }, missingImg = { category = 'Údržba:Stránky s neexistujícím souborem', err = 'Neexistující soubor: %s' }, missingNameMsg = { category = 'Údržba:Šablona Bod beze jména', err = 'Chybí název' }, missingType = { category = 'Údržba:Šablona Bod bez typu', hint = 'Chybí typ' }, nameFromWD = { category = 'Monitoring:Data z Wikidat', hint = 'Název z Wikidat' }, --myslím že není třeba kategorizovat nameWithStar = { category = 'Údržba:Šablona Bod s hvězdičkou ve jméně', err = 'Název obsahuje hvězdičku' }, outdated = { category = 'Údržba:Akce ukončena', err = 'Akce ukončena' }, parameterUsed = { category = 'Údržba:Použitý parametr %s' }, --myslím že není třeba kategorizovat deleteShowCopy = { category = 'Údržba:Kopie smazána', hint = 'show=kopie smazána' }, -- showInlineUsed = { category = 'VCard: show=inline gesetzt' }, --myslím že není třeba kategorizovat -- showNoneUsed = { category = 'VCard: show=none gesetzt' }, -- showPoiUsed = { category = 'VCard: show=poi gesetzt' }, --myslím že není třeba kategorizovat typeFromWDchain= { category = 'Monitoring:Data z Wikidat', hint = 'Typ z Wikidat' }, -- typeIsGroup = { category = 'Údržba:Chybné hodnoty', hint = 'Typ je název skupiny' }, -- typeIsColor = { category = 'Údržba:Chybné hodnoty', hint = 'Typ je název barvy' }, -- typeIsColor is not used if excludeColorTypes = true unknownCountry = { category = 'Údržba:Články s neznámým kódem země', err = 'Neznámý kód země' }, unknownGroup = { category = 'Údržba:Šablona Bod s neznámou skupinou', err = 'Neznámá skupina' }, unknownLanguage= { category = 'Údržba:Šablona Bod s neznámým jazykem', hint = 'Neznámý místní jazyk' }, unknownParam = { category = 'Údržba:Články s neznámými parametry', err = 'Neznámý parametr: %s' }, unknownParams = { category = 'Údržba:Články s neznámými parametry', err = 'Neznámé parametry: %s' }, unknownPropertyLanguage= { category = 'Údržba:Šablona Bod s neznámým jazykem', hint = 'Neznámý jazyk pro vlastnost' }, unknownStatus = { category = 'Údržba:Šablona Bod s neznámým statusem', err = 'Neznámý status' }, unknownType = { category = 'Údržba:Chybné hodnoty', err = 'Neznámý typ: %s' }, -- unusedRedirect = { category = 'VCard: Unbenutzter Weiterleitungs-Sitelink' }, urlIsSocialMedia = { category = 'Údržba:Špatná URL', err = 'URL ze sociálních sítí' }, wikidata = { category = 'Monitoring:Data z Wikidat' }, wrongCoord = { category = 'Údržba:Šablona Bod s chybějícími souřadnicemi', err = 'Chybné souřadnice' }, wrongImgName = { category = 'Údržba:Chybný název souboru', err = 'Chybný název souboru' }, wrongQualifier = { category = 'Údržba:Nesprávný odkaz na Wikidata', err = 'Nesprávný odkaz na Wikidata' }, -- Marker module missingCoord = { category = 'Údržba:Šablona Bod s chybějícími souřadnicemi', err = 'Chybí souřadnice' }, numberUsed = { category = 'Údržba:Chybné hodnoty' }, unknownIcon = { category = 'Údržba:Chybné hodnoty' }, -- vCard / Listing module countryFromWD = { category = 'Monitoring:Data z Wikidat' }, missingCoordVc = { category = 'Údržba:Šablona Bod s chybějícími souřadnicemi' }, paymentUsed = { category = 'Monitoring:Zadána platební metoda' }, socialUrlUsed = { category = 'Údržba:URL sociálních sítí', hint = 'Použita URL sítě %s' }, unitFromWD = { category = 'Monitoring:Data z Wikidat' }, unknownLabel = { category = 'Údržba:Neznámý štítek nebo id' }, unknownMAKI = { category = 'Údržba:Neznámý symbol MAKI', hint = 'Neznámý symbol MAKI' }, unknownShow = { category = 'Údržba:Chybné hodnoty', err = 'Hodnota(y) pro show neznámá: %s' }, unknownSubtype = { category = 'Údržba:Chybné hodnoty', err = 'Hodnota(y) pro podtyp neznámý: %s' }, unknownUnit = { category = 'Údržba:Chybné hodnoty', hint = 'Neznámá entita' }, unknowWDfeatures = { category = 'Údržba:Šablona Bod s neznámými charakteristikami Wikidat', hint = 'Neznámé charakteristiky Wikidat' }, wdWithGoogleCid = { category = 'VCard: Parametr google-maps používaný společně s Wikidaty', hint = 'google-maps použito s Wikidaty' }, wikidataWithId = { category = 'VCard: Parametr id používaný společně s Wikidaty', hint = 'id použito s Wikidaty' }, wrongDate = { category = 'Údržba:Články s chybami v datech', hint = 'Nesprávné datum' }, wrongGoogleCid = { category = 'VCard: Nesprávné ID zákazníka Google map', err = 'Nesprávné ID zákazníka Google map' }, wrongId = { category = 'VCard: Nesprávné id', err = 'Nesprávné id' }, wrongSocialId = { category = 'Údrža:Nesprávné ID sociální sítě', err = 'Nesprávné ID %s' }, wrongSocialUrl = { category = 'Údržba:Neplatná URL', err = 'Chybná URL %s' } }, iconTitles = { commons = '%s na Wikimedia Commons', facebook = '%s na Facebooku', flickr = '%s na Flickru', instagram = '%s na Instagramu', internet = 'Web tohoto místa', maps = '%s na mapách a v plánovačích tras', rss = 'RSS webový zdroj této instituce', tiktok = '%s na TikToku', wikidata = '%s (%s) na Wikidatech', wikipedia = '%s na Wikipedii', wikivoyage = '%s na Wikicestách (Wikivoyage) v jiném jazyce', x = '%s na X', youtube = '%s na 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-Restaurace', category = 1 }, ['top-sight'] = { g = 1, label = 'Top-Atrakce', category = 1 }, recommendation = { g = 1, label = 'Doporučení' }, none = { g = 2, alias = 'class-0', label = "Bez klasifikace" }, stub = { g = 2, alias = 'class-1', label = "Pahýl" }, outline = { g = 2, alias = 'class-2', label = "Návrh článku" }, usable = { g = 2, alias = 'class-3', label = "Užitečný článek" }, guide = { g = 2, alias = 'class-4', label = "Celý článek" }, star = { g = 2, alias = 'class-5', label = "Doporučený článek" } }, -- 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', a = 'y', ano = 'y', n = 'n', no = 'n', nein = 'n', ne = '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' } } } it8czwkwhb3j8gpocvzz93mivqbs0be Modul:Marker utilities 828 1337 22092 20820 2026-05-20T10:57:29Z LiMr 96 aktualizace na novější verzi 22092 Scribunto text/plain -- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Modul:Marker_utilities&oldid=1775579) -- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Modul:Marker_utilities&oldid=1775579) --[[ 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:Coordinates2' ) 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-05-16', 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() 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 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' ) 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 ) -- color for print mode :css( { ['background-color'] = args.color, color = args.inverse and '#000' or '#fff' } ) -- 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 j = 1, #sp do if mw.ustring.match( t, sp[ j ] ) then match = true which = j 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 = {} -- Přidáme ikonu pro externí URL, pokud existuje if mu.isSet(args.url) then table.insert( icons, mu.addLinkIcon( 'voy-listing-url' .. mu.addWdClass('url'), args.url, mi.iconTitles.internet or "Internetový odkaz", 'internet' ) ) end if mi.options.showSisters and not show.nositelinks then makeSisterIcons( icons, args, page, country, entity ) end if show.socialmedia then makeSocial( icons, args, fromWikidata, args.givenName.name ) end return table.concat( icons, '' ) 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 8i0s7bwmhig1j2g67tmdkg9n0mzktd2 Modul:VCard/Params 828 1338 22087 17494 2026-05-20T09:42:30Z LiMr 96 aktualizace na novější verzi 22087 Scribunto text/plain -- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Modul:VCard/Params&oldid=1768060) -- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Modul:VCard/Params&oldid=1768060) --[[ 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-04-12', 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 iqa: string value with qualifier ids, for comments in accessibility 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 = 'iqa', 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 } } fwyqsdyh10mf0a2zo3p8kg68cn26bn7 Modul:VCard/i18n 828 1339 22088 17723 2026-05-20T09:59:30Z LiMr 96 aktualizace na novější verzi 22088 Scribunto text/plain -- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Modul:VCard/i18n&oldid=1738007) -- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Modul:VCard/i18n&oldid=1738007) -- This module contains wiki-language specific strings to translate. -- First table contains the arguments' parameter names, the second -- one data name for the wrapping listing tag. -- The following table is used for template's parameter localization. -- The item value like 'address-lang' is the parameter name used in the template. -- The key/index is used by the Marker module. Use value strings for localization. return { -- administration moduleInterface = { suite = 'vCard', sub = 'i18n', serial = '2026-01-03', item = 65455749 }, p = { address = { 'address', 'adresa' }, addressLang = { 'address-lang', 'jazyk adresy' }, addressLocal = { 'address-local', 'adresa lokálně', 'místní adresa' }, alt = 'alt', auto = 'auto', before = { 'before', 'předtím' }, checkin = { 'checkin', 'check in' }, checkout = { 'checkout', 'check out' }, comment = { 'comment', 'komentář' }, commonscat = { 'commonscat', 'commons' }, --funguje s chybami copyMarker = { 'copy-marker', 'marker-copy' }, country = { 'country', 'země', 'stát' }, description = { 'description', 'content', 'popis' }, directions = { 'directions', 'směr' }, directionsLocal = { 'directions-local', 'směr lokálně', 'směr místní' }, email = { 'email', 'e-mail' }, facebook = 'facebook', fax = 'fax', flickr = 'flickr', group = { 'group', 'skupina' }, googlemaps = { 'google-map', 'google-maps' }, hours = { 'hours', 'otevírací doba', 'otevřeno', 'hodiny' }, id = 'id', image = { 'image', 'obrázek' }, instagram = 'instagram', lastedit = { 'lastedit', 'last_edit', 'poslední editace', 'aktualizováno' }, lat = { 'lat', 'latitude', 'coord', 1, 'zeměpisná šířka', 'šířka'}, localLang = 'local-lang', long = { 'long', 'lon', 'longitude', 2, 'zeměpisná délka', 'délka'}, mapGroup = { 'map-group', 'skupina mapy', }, mobile = { 'mobile', 'mobil' }, name = { 'name', 'název' }, -- nameExtra = { 'name-extra', 'název extra' }, nameLatin = { 'name-latin', 'name-roman', 'název latinkou' }, nameLocal = { 'name-local', 'název lokálně', 'místní název' }, nameMap = { 'name-map', 'název mapy' }, payment = { 'payment', 'platba' }, phone = { 'phone', 'telefon' }, price = { 'price', 'cena' }, sectionFrom = { 'section-from', 'výběr' }, show = { 'show', 'zobrazit' }, status = 'status', styles = { 'styles', 'styly' }, subtype = { 'subtype', 'subtypes', 'subtyp', 'podtyp' }, tiktok = 'tiktok', tollfree = { 'tollfree', 'zdarma', 'bezplatně' }, type = { 'type', 'types', 'typ', 'typy' }, url = { 'url', 'web' }, wikidata = { 'wikidata', 'Wikidata', 'wd', 'd' }, wikipedia = { 'wikipedia', 'wikipedie' },-- deprecated --funguje s chybami x = { 'x', 'twitter' }, youtube = 'youtube', zoom = 'zoom', date = { 'date', 'datum' }, -- for events month = { 'month', 'měsíc' }, year = { 'year', 'rok' }, endDate = { 'enddate', 'konec datum' }, endMonth = { 'endmonth', 'konec měsíc' }, endYear = { 'endyear', 'konec rok' }, frequency = { 'frequency', 'frekvence' }, location = { 'location', 'místo', 'lokace' }, }, -- additional vCard options options = { defaultAuto = true, -- vCard default auto mode defaultShow = 'poi', lasteditHours = true, showIata = true, -- possible values true, false showIcao = true, showUnesco = true, useMobile = true -- distinguish landline and mobile phones } } odn09rnlkslyex8edh6u1a1dytlbhfq Modul:LinkMail 828 1340 22096 17237 2026-05-20T11:26:20Z LiMr 96 aktualizace na novější verzi 22096 Scribunto text/plain -- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Modul:LinkMail&oldid=1775629) -- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Modul:LinkMail&oldid=1775629) -- module variable and administration local lm = { moduleInterface = { suite = 'LinkMail', serial = '2026-05-17', 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 dgvfqxddjkixjagbfj634r71ehe21be Modul:LinkSkype 828 1341 22095 17238 2026-05-20T11:24:20Z LiMr 96 aktualizace na novější verzi 22095 Scribunto text/plain -- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Modul:LinkSkype&oldid=1775698) -- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Modul:LinkSkype&oldid=1775698) -- module variable and administration local ls = { moduleInterface = { suite = 'LinkSkype', serial = '2026-05-17', 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 fgz7luzn92c5kkz8ugf58wdhwwyqbts Šablona:VCard/styles.css 10 1344 22084 22082 2026-05-20T09:21:51Z LiMr 96 aktualizace na novější verzi 22084 sanitized-css text/css /* -- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Vorlage:VCard/styles.css&oldid=1775708) -- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Vorlage:VCard/styles.css&oldid=1775708) vCard and Marker styles Version: 2026-05-17 */ /* 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:before, .voy-listing-social-media:before { content: ' '; white-space: normal; } .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-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; } .voy-listing-status + .voy-listing-status { margin-left: 4px; } @media print { .voy-listing-icon a, .voy-listing-icon bdi, .voy-listing-social-media a { display: none !important; } .voy-listing-icon:before, .voy-listing-social-media:before { content: ''; } } /* 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/120px-Symbol_plain_grey.svg.png'); } .voy-listing-status-outline { background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Start-icon.svg/120px-Start-icon.svg.png'); } .voy-listing-status-usable { background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/d/d0/Symbol_keep_vote.svg/120px-Symbol_keep_vote.svg.png'); } .voy-listing-status-guide { background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/9/94/Symbol_support_vote.svg/120px-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/120px-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/120px-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/120px-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/120px-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/120px-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/120px-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/120px-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/120px-2021_Facebook_icon.svg.png'); } .voy-listing-social-media-flickr span { background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/4/44/Flickr.svg/120px-Flickr.svg.png'); } .voy-listing-social-media-instagram span { background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/9/95/Instagram_logo_2022.svg/120px-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/120px-Feed-icon.svg.png'); } .voy-listing-social-media-tiktok span { background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Iconoir_tiktok.svg/120px-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/120px-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/120px-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/120px-Applications-internet.svg.png'); } .voy-listing-unesco span { background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/f/fd/WV-Unesco-icon-small.svg/120px-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-edit-button button, .voy-listing-metadata .voy-listing-toSourcePage a { position: relative; padding-left: 15px; } .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/120px-Maki-information-15.svg.png" ); background-size: 14px; } .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: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/120px-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 */ } @media screen { html.skin-theme-clientpref-night .voy-listing-edit-button button:before, html.skin-theme-clientpref-night .voy-listing-info-button button:before, html.skin-theme-clientpref-night .voy-listing-toSourcePage a: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, html.skin-theme-clientpref-os .voy-listing-toSourcePage a:before { filter: invert(0.5); } } @media print { .voy-listing-metadata .voy-listing-toSourcePage { display: none; } } .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; } .mw-kartographer-maplink img { vertical-align: -15%; } .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%; } 95eyf4kk9v1qiyypsh1lnujc50m0css 22086 22084 2026-05-20T09:37:43Z LiMr 96 ruční úprava, která byla i v předchozí verzi 22086 sanitized-css text/css /* -- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Vorlage:VCard/styles.css&oldid=1775708) -- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Vorlage:VCard/styles.css&oldid=1775708) vCard and Marker styles Version: 2026-05-17 */ /* 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:before, .voy-listing-social-media:before { content: ' '; white-space: normal; } .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-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; } .voy-listing-status + .voy-listing-status { margin-left: 4px; } @media print { .voy-listing-icon a, .voy-listing-icon bdi, .voy-listing-social-media a { display: none !important; } .voy-listing-icon:before, .voy-listing-social-media:before { content: ''; } } /* 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/120px-Symbol_plain_grey.svg.png'); } .voy-listing-status-outline { background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Start-icon.svg/120px-Start-icon.svg.png'); } .voy-listing-status-usable { background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/d/d0/Symbol_keep_vote.svg/120px-Symbol_keep_vote.svg.png'); } .voy-listing-status-guide { background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/9/94/Symbol_support_vote.svg/120px-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/120px-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/120px-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/120px-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/120px-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/120px-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/120px-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/120px-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/120px-2021_Facebook_icon.svg.png'); } .voy-listing-social-media-flickr span { background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/4/44/Flickr.svg/120px-Flickr.svg.png'); } .voy-listing-social-media-instagram span { background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/9/95/Instagram_logo_2022.svg/120px-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/120px-Feed-icon.svg.png'); } .voy-listing-social-media-tiktok span { background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Iconoir_tiktok.svg/120px-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/120px-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/120px-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/120px-Applications-internet.svg.png'); } .voy-listing-unesco span { background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/f/fd/WV-Unesco-icon-small.svg/120px-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: inline; /* manuální úprava pro trvalé zobrazení (automatické skrytí nefunguje) */ } 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-edit-button button, .voy-listing-metadata .voy-listing-toSourcePage a { position: relative; padding-left: 15px; } .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/120px-Maki-information-15.svg.png" ); background-size: 14px; } .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: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/120px-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 */ } @media screen { html.skin-theme-clientpref-night .voy-listing-edit-button button:before, html.skin-theme-clientpref-night .voy-listing-info-button button:before, html.skin-theme-clientpref-night .voy-listing-toSourcePage a: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, html.skin-theme-clientpref-os .voy-listing-toSourcePage a:before { filter: invert(0.5); } } @media print { .voy-listing-metadata .voy-listing-toSourcePage { display: none; } } .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; } .mw-kartographer-maplink img { vertical-align: -15%; } .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%; } ldrr3wsu6gg5umpjemrthq00yb4z1ce Modul:Marker utilities/Types 828 1345 22094 20758 2026-05-20T11:20:51Z LiMr 96 aktualizace na novější verzi 22094 Scribunto text/plain -- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Modul:Marker_utilities/Types&oldid=1764381) -- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Modul:Marker_utilities/Types&oldid=1764381) --[[ 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 = "lanovka" }, airline = { group = "go", wd = "Q46970", label = "letecká společnost" }, airport = { group = "go", wd = { "Q1248784", "Q62447", "Q644371" }, useIATA = "1", label = "letiště" }, airport_service = { group = "go", label = "letištní servis" }, bicycle_parking = { group = "go", wd = "Q16243822", label = "parkování kol" }, bicycle_rental = { alias = "bicycle_share", group = "go", wd = { "Q10611118", "Q1358919" }, label = "půjčovna kol", icon = "bicycle-share" }, bicycle_repair = { group = "go", wd = { "Q96983545", "Q112663579" }, label = "Fahrradreparatur" }, boat_sharing = { group = "go", wd = "Q4931514", label = "pronájem lodí" }, boat_trip = { group = "go", wd = "Q25040412", label = "výlet lodí" }, border_control = { group = "go", wd = "Q218719", label = "hraniční kontrola" }, bus = { alias = "bus_stop", group = "go", wd = { "Q953806", "Q494829" }, label = "zastávka autobusu" }, car_rental = { group = "go", wd = "Q291240", label = "půjčovna aut" }, car_repair = { group = "go", wd = "Q1310967", label = "autoservis" }, car_sharing = { group = "go", wd = "Q847201", label = "sdílení aut" }, charging_station = { group = "go", wd = { "Q2140665", "Q55956304" }, label = "nabíjecí stanice" }, cycle_track = { alias = "cycle_path", group = "go", wd = { "Q25037910", "Q221722" }, label = "cyklostezka" }, entrance = { group = "go", wd = "Q1137365", label = "Vstup" }, ferry = { group = "go", wd = { "Q100355757", "Q25653", "Q1478783" }, label = "přístaviště trajektů" }, ford = { group = "go", wd = "Q12743", label = "brod" }, fuel = { alias = "filling_station", group = "go", wd = "Q205495", label = "čerpací stanice" }, funicular = { group = "go", wd = "Q142031", label = "stanice lanovky" }, harbor = { alias = "port", group = "go", wd = { "Q44782", "Q283202" }, label = "přístav" }, heliport = { group = "go", wd = "Q502074", label = "heliport" }, junction = { alias = { "road_junction", "intersection" }, group = "go", wd = { "Q1788454", "Q285783" }, label = "křižovatka" }, landing_site = { group = "go", wd = "Q3631092", label = "přistávací plocha" }, left_luggage = { group = "go", wd = "Q21996814", label = "úschova zavazadel" }, light_railway = { alias = "lrt", group = "go", wd = "Q32680449", label = "zastávka levné železnice" }, marina = { group = "go", wd = "Q721207", label = "marina" }, monorail = { group = "go", wd = "Q187934", label = "stanice jednokolejky" }, motorbike_rental = { group = "go", label = "půjčovna motocyklů" }, motorway_junction = { group = "go", label = "dálniční křižovatka" }, parking = { group = "go", wd = "Q6501349", label = "parkování" }, parking_garage = { group = "go", wd = "Q13218805", label = "garáž" }, pier = { group = "go", wd = "Q863454", label = "molo" }, -- also jetty public_transport = { group = "go", wd = "Q178512", label = "veřejná doprava" }, quay = { alias = "wharf", group = "go", wd = "Q828909", label = "přístaviště" }, rail = { alias = { "train", "railway", "railway_station" }, group = "go", wd = { "Q55488", "Q55678" }, label = "nádraží" }, scooter = { group = "go", wd = { "Q193234", "Q502057" }, label = "koloběžky" }, service_area = { group = "go", wd = "Q786014", label = "odpočívadlo" }, ship = { group = "go", wd = "Q11446", label = "loď" }, shipping_company = { group = "go", label = "rejdařství" }, shuttle_bus_service = { group = "go", label = "kyvadlová doprava" }, station = { group = "go", wd = "Q12819564", label = "stanice" }, suburban_rail = { alias = { "suburban_railway", "commuter_rail", "s-bahn" }, group = "go", wd = { "Q1412403", "Q95723" }, label = "stanice S-Bahn" }, subway = { alias = "metro", group = "go", wd = "Q928830", label = "stanice metra", icon = "rail-metro" }, taxi = { group = "go", wd = "Q1395196", label = "stanoviště taxi" }, terminal = { group = "go", wd = "Q849706", label = "terminál" }, toll_station = { group = "go", wd = "Q1364150", label = "mýtná stanice" }, tram = { group = "go", wd = "Q2175765", label = "zastávka tramvaje", icon = "rail-light" }, tunnel = { group = "go", wd = "Q44377", label = "tunel" }, waiting_room = { group = "go", wd = "Q674251", label = "čekárna" }, waypoint = { group = "go", wd = "Q138081", label = "traťový bod" }, -- group types go = { group = "go", wd = { "Q334166", "Q740752" }, label = "doprava" }, -- sights: religious sites and monuments altar = { group = "religion", wd = "Q101687", label = "oltář" }, bahai_temple = { group = "religion", wd = "Q1568313", label = "chrám Bahá'í" }, basilica = { group = "religion", wd = { "Q163687", "Q4846867" }, label = "bazilika" }, buddharupa = { group = "religion", wd = "Q1000809", label = "socha Buddhy", icon = "religious-buddhist" }, cathedral = { group = "religion", wd = "Q2977", label = "katedrála", icon = "religious-christian" }, chapel = { group = "religion", wd = "Q108325", label = "kaple", icon = "religious-christian" }, chapel_shrine = { group = "religion", wd = "Q14552192", label = "svatý dům" }, church = { group = "religion", wd = { "Q16970", "Q580499" }, label = "kostel", icon = "religious-christian" }, fire_temple = { group = "religion", wd = "Q115278", label = "chrám ohně" }, gurdwara = { group = "religion", wd = "Q337986", label = "gurdwara" }, hindu_temple = { group = "religion", wd = "Q842402", label = "hinduistický chrám" }, lak_mueang = { group = "religion", wd = "Q974127", label = "Lak Muang" }, lourdes_grotto = { group = "religion", wd = "Q1433032", label = "Lurdská jeskyně, Mariina jeskyně" }, mikveh = { group = "religion", wd = "Q211351", label = "mikve" }, minaret = { group = "religion", wd = "Q48356", label = "minaret" }, monastery = { group = "religion", wd = { "Q44613", "Q160742" }, label = "klášter" }, mosque = { group = "religion", wd = "Q32815", label = "mešita", icon = "religious-muslim" }, nunnery = { group = "religion", wd = "Q6021560", label = "ženský klášter" }, pagoda = { group = "religion", wd = "Q199451", label = "pagoda" }, pilgrimage_site = { group = "religion", wd = "Q15135589", label = "poutní místo" }, sanctuary = { group = "religion", wd = "Q29553", label = "svatyně" }, shinto_shrine = { group = "religion", wd = "Q845945", label = "šintoistická svatyně", icon = "religious-shinto" }, shrine = { group = "religion", wd = "Q697295", label = "svatyně" }, stupa = { group = "religion", wd = "Q180987", label = "stúpa" }, summit_cross = { group = "religion", wd = "Q361665", label = "vrcholový kříž" }, synagogue = { group = "religion", wd = "Q34627", label = "synagoga", icon = "religious-jewish" }, temple = { group = "religion", wd = { "Q44539", "Q927825", "Q58621988" }, label = "chrám" }, wat = { group = "religion", wd = "Q427287", label = "wat" }, wayside_cross = { group = "religion", wd = "Q2309609", label = "kříž u cesty" }, wayside_shrine = { group = "religion", wd = { "Q3395121", "Q12661150" }, label = "boží muka" }, religion = { alias = "religious_site", group = "religion", wd = "Q1370598", label = "náboženské místo" }, -- sights: natural animal_shelter = { group = "nature", wd = "Q1411287", label = "Tierheim" }, animal_stable = { alias = "stable", group = "nature", wd = { "Q214252", "Q1207909" }, label = "chlév" }, aquarium = { group = "nature", wd = "Q2281788", label = "akvárium" }, bay = { group = "nature", wd = { "Q39594", "Q17018380" }, label = "zátoka" }, botanical_garden = { group = "nature", wd = "Q167346", label = "botanická zahrada" }, canal = { group = "nature", wd = "Q12284", label = "kanál" }, canyon = { group = "nature", wd = "Q150784", label = "kaňon, soutěska" }, cape = { group = "nature", wd = "Q185113", label = "mys" }, cave = { group = "nature", wd = "Q35509", label = "jeskyně" }, cliff = { group = "nature", wd = "Q107679", label = "útes" }, coast = { group = "nature", wd = "Q93352", label = "pobřeží" }, crater = { group = "nature", wd = "Q3240715", label = "kráter" }, crocodile_farm = { group = "nature", wd = "Q25691", label = "krokodýlí farma" }, depression = { group = "nature", wd = "Q190429", label = "sníženina" }, desert = { group = "nature", wd = "Q8514", label = "poušť" }, dive_site = { group = "nature", wd = "Q2141554", label = "potápěčská lokalita" }, dog_park = { group = "nature", wd = "Q38516", label = "psí park" }, dolphinarium = { group = "nature", wd = "Q491675", label = "delfinárium" }, dune = { group = "nature", wd = "Q25391", label = "duna" }, dyke = { group = "nature", wd = "Q105190", label = "hráz" }, farm = { group = "nature", wd = "Q131596", label = "statek" }, fish_pond = { group = "nature", wd = "Q1265665", label = "rybník" }, fjord = { group = "nature", wd = "Q45776", label = "fjord" }, forest = { group = "nature", wd = "Q4421", label = "les" }, garden = { group = "nature", wd = "Q1107656", label = "zahrada" }, geyser = { group = "nature", wd = "Q83471", label = "gejzír" }, glacier = { group = "nature", wd = "Q35666", label = "ledovec" }, greenhouse = { group = "nature", wd = "Q165044", label = "Gewächshaus, Treibhaus" }, gulf = { group = "nature", wd = "Q1322134", label = "záliv" }, habitat = { group = "nature", label = "místo výskytu" }, heath = { group = "nature", wd = "Q27590", label = "Heide" }, hill = { group = "nature", wd = "Q54050", label = "kopec" }, horticulture = { group = "nature", wd = "Q48803", label = "hortikultura" }, hot_spring = { group = "nature", wd = "Q177380", label = "termální pramen" }, island = { group = "nature", wd = "Q23442", label = "ostrov" }, lagoon = { group = "nature", wd = "Q187223", label = "laguna" }, lake = { group = "nature", wd = "Q23397", label = "jezero" }, landscape = { group = "nature", wd = "Q107425", label = "krajina" }, mangrove = { group = "nature", wd = "Q19756", label = "mangrov" }, meadow = { group = "nature", wd = "Q7777019", label = "louka" }, mountain = { group = "nature", wd = "Q8502", label = "hora" }, mountain_chain = { group = "nature", wd = "Q2624046", label = "pohoří" }, mountain_pass = { group = "nature", wd = "Q133056", label = "průsmyk" }, mountain_range = { group = "nature", wd = "Q46831", label = "pohoří" }, national_park = { group = "nature", wd = "Q46169", label = "národní park" }, natural_heritage = { group = "nature", wd = "Q386426", label = "přírodní dědictví" }, natural_monument = { group = "nature", wd = "Q23790", label = "Přírodní památka" }, nature_reserve = { group = "nature", wd = { "Q158454", "Q179049", "Q473972", "Q759421", "Q20268756" }, label = "přírodní rezervace" }, oasis = { group = "nature", wd = "Q43742", label = "oáza" }, palaeontological_site = { group = "nature", wd = "Q9096832", label = "paleontologické naleziště" }, park = { group = "nature", wd = { "Q22698", "Q728904" }, label = "park" }, peninsula = { group = "nature", wd = "Q34763", label = "poloostrov" }, plantation = { group = "nature", wd = "Q188913", label = "plantáž" }, plateau = { group = "nature", wd = "Q75520", label = "náhorní plošina" }, protected_area = { alias = "protectorate", group = "nature", wd = "Q473972", label = "chráněná oblast" }, reef = { group = "nature", wd = "Q184358", label = "rif" }, reservoir = { group = "nature", wd = "Q131681", label = "přehradní nádrž" }, river = { group = "nature", wd = "Q4022", label = "řeka" }, river_mouth = { group = "nature", wd = "Q1233637", label = "ústí" }, rock = { group = "nature", wd = { "Q1404150", "Q8063" }, label = "útes" }, sea = { group = "nature", wd = "Q165", label = "moře" }, spring = { group = "nature", wd = "Q124714", label = "pramen" }, steppe = { group = "nature", wd = "Q123991", label = "step" }, strait = { group = "nature", wd = "Q37901", label = "průliv" }, stream = { group = "nature", wd = "Q47521", label = "potok" }, stud = { group = "nature", wd = "Q108696", label = "hřebčín" }, summit = { group = "nature", wd = "Q207326", label = "vrchol" }, tree = { group = "nature", wd = "Q10884", label = "strom" }, valley = { group = "nature", wd = "Q39816", label = "údolí" }, volcano = { group = "nature", wd = "Q8072", label = "vulkán" }, waterfall = { group = "nature", wd = "Q34038", label = "vodopád" }, wetland = { group = "nature", wd = "Q170321", label = "mokřad" }, zoo = { group = "nature", wd = "Q43501", label = "zoo" }, nature = { group = "nature", wd = "Q7860", label = "příroda" }, -- sights: arts, historic amphitheater = { group = "see", wd = "Q54831", label = "amfiteátr" }, aqueduct = { group = "see", wd = "Q474", label = "akvadukt" }, archaeological_site = { group = "see", wd = "Q839954", label = "archeologické naleziště" }, architecture = { group = "see", wd = "Q12271", label = "architektura" }, archive = { group = "see", wd = { "Q166118", "Q635719", "Q27032363" }, label = "archiv" }, artwork = { group = "see", wd = "Q838948", label = "umělecké dílo" }, bakehouse = { group = "see", wd = "Q798436", label = "pekárna" }, barracks = { group = "see", wd = "Q131263", label = "kasárny" }, boat_lift = { group = "see", wd = "Q14908", label = "lodní výtah" }, bridge = { group = "see", wd = "Q12280", label = "most" }, building = { group = "see", wd = { "Q41176", "Q811979" }, label = "budova" }, building_complex = { group = "see", wd = { "Q1497364", "Q18247357" }, label = "komplex budov" }, bunker = { group = "see", wd = "Q91122", label = "bunkr" }, cannon = { group = "see", wd = "Q81103", label = "kanon" }, castle = { group = "see", wd = "Q23413", label = "hrad" }, cellar = { group = "see", wd = "Q234852", label = "sklep" }, cemetery = { alias = "necropolis", group = "see", wd = "Q39614", label = "hřbitov" }, cenotaph = { group = "see", wd = "Q321053", label = "Kenotaf, falešný hrob" }, chateau = { alias = "château", group = "see", wd = "Q751876", label = "zámek" }, city_center = { group = "see", wd = "Q1468524", label = "centrum města" }, city_wall = { group = "see", wd = "Q16748868", label = "městské hradby" }, collection = { group = "see", wd = { "Q2668072", "Q7328910" }, label = "sbírka" }, column = { group = "see", wd = { "Q4817", "Q51845395", "Q1930585" }, label = "soup" }, communication_tower = { group = "see", wd = { "Q11166728", "Q1798641" }, label = "vysílač" }, crematorium = { group = "see", wd = "Q157570", label = "krematorium" }, cultural_heritage = { group = "see", wd = "Q210272", label = "kulturní dědictví" }, dam = { group = "see", wd = "Q12323", label = "přehrada" }, domain = { group = "see", wd = "Q155231", label = "panství" }, embankment_dam = { group = "see", wd = "Q1244922", label = "hráz" }, exhibition = { group = "see", wd = "Q464980", label = "výstava" }, exhibition_hall = { group = "see", wd = { "Q57659484", "Q3364296" }, label = "výstavní síň" }, factory = { group = "see", wd = "Q83405", label = "továrna" }, fort = { group = "see", wd = "Q57831", label = "pevnost" }, fountain = { group = "see", wd = "Q483453", label = "fontána" }, gallery = { group = "see", wd = "Q1007870", label = "Galerie", icon = "art-gallery" }, gate = { group = "see", wd = "Q53060", label = "brána" }, ghost_town = { group = "see", wd = "Q74047", label = "město duchů" }, graduation_tower = { group = "see", wd = "Q1541226", label = "gradovna" }, grave = { group = "see", wd = "Q173387", label = "hrob" }, hall = { group = "see", wd = "Q240854", label = "hala" }, handicraft = { group = "see", wd = "Q52105", label = "ruční práce" }, high_rise = { alias = "skyscraper", group = "see", wd = { "Q18142", "Q11303" }, label = "výšková budova, mrakodrap" }, historic_district = { group = "see", wd = "Q15243209", label = "historická čtvrť", icon = "historic" }, house = { group = "see", wd = "Q3947", label = "dům" }, hydraulic_structure = { group = "see", wd = "Q2466889", label = "vodní dílo" }, landmark = { group = "see", wd = "Q2319498", label = "orientační bod" }, lighthouse = { group = "see", wd = "Q39715", label = "maják" }, lock = { group = "see", wd = "Q105731", label = "plavební komora" }, mausoleum = { group = "see", wd = "Q162875", label = "mauzoleum" }, megalithic_tomb = { group = "see", wd = { "Q10521078", "Q101659" }, label = "megalitická hrobka, dolmen, mohyla" }, memorial = { group = "see", wd = "Q5003624", label = "památník" }, mill = { group = "see", wd = "Q44494", label = "mlýn" }, mine = { group = "see", wd = "Q820477", label = "důl" }, -- including surface mining mining_museum = { group = "see", wd = "Q819426", label = "důlní muzeum" }, monument = { group = "see", wd = "Q4989906", label = "monument" }, museum = { group = "see", wd = "Q33506", label = "muzeum" }, museum_ship = { group = "see", wd = "Q575727", label = "lodní muzeum" }, national_monument = { group = "see", wd = "Q893745", label = "národní památník" }, obelisk = { group = "see", wd = "Q170980", label = "obelisk" }, observatory = { group = "see", wd = { "Q1254933", "Q62832" }, label = "observatoř" }, old_town = { group = "see", wd = "Q676050", label = "staré město", icon = "historic" }, open_air_museum = { group = "see", wd = "Q756102", label = "skanzen" }, palace = { group = "see", wd = "Q16560", label = "palác" }, pavilion = { alias = "arbor", group = "see", wd = { "Q276173", "Q23457088", "Q961082" }, label = "pavilon" }, pedestrian = { group = "see", wd = "Q369730", label = "chodec" }, planetarium = { group = "see", wd = "Q148319", label = "planetárium" }, power = { group = "see", wd = "Q159719", label = "energie" }, -- power station, transformers, towers etc. promenade = { group = "see", wd = "Q787113", label = "promenáda" }, pyramid = { group = "see", wd = "Q12516", label = "pyramida" }, quarry = { group = "see", wd = "Q15115254", label = "lom" }, road = { group = "see", wd = { "Q34442", "Q83620" }, label = "ulice, silnice" }, -- including street and lane rock_art = { group = "see", wd = "Q1211146", label = "kamenné umění" }, ruins = { group = "see", wd = "Q109607", label = "ruiny" }, shipyard = { group = "see", wd = "Q190928", label = "loděnice" }, spaceport = { group = "see", wd = "Q194188", label = "kosmodrom" }, square = { group = "see", wd = "Q174782", label = "náměstí" }, statue = { group = "see", wd = "Q179700", label = "socha" }, stele = { group = "see", wd = "Q178743", label = "stéla" }, stolperstein = { group = "see", wd = "Q314003", label = "kameny zmizelých" }, -- Stolpersteine technical_monument = { group = "see", wd = "Q1516537", label = "technická památka" }, tomb = { group = "see", wd = { "Q381885", "Q6023295" }, label = "hrobka" }, tower = { group = "see", wd = "Q12518", label = "věž" }, town_hall = { group = "see", wd = "Q543654", label = "radnice" }, tumulus = { group = "see", wd = "Q34023", label = "mohyla" }, viaduct = { group = "see", wd = "Q181348", label = "viadukt" }, wall = { group = "see", wd = "Q42948", label = "zeď" }, war_grave = { group = "see", wd = "Q90717531", label = "válečný hrob" }, war_memorial = { group = "see", wd = "Q575759", label = "válečný památník, válečný pomník" }, watermill = { group = "see", wd = "Q185187", label = "vodní mlýn" }, weather_station = { group = "see", wd = "Q190107", label = "meteorologická stanice" }, weir = { group = "see", wd = "Q1066997", label = "jez" }, well = { group = "see", wd = "Q43483", label = "studna" }, windmill = { group = "see", wd = "Q38720", label = "větrný mlýn" }, wreck = { group = "see", wd = "Q852190", label = "lodní vrak" }, -- group types see = { group = "see", wd = "Q570116", label = "pamětihodnost" }, -- culture arena = { group = "do", wd = "Q641226", label = "aréna" }, arts_center = { group = "do", wd = "Q2190251", label = "centrum umění" }, bird_watching = { group = "do", wd = "Q685629", label = "pozorovna ptáků" }, bullring = { group = "do", wd = "Q1193438", label = "býčí aréna" }, cabaret = { group = "do", wd = "Q131183", label = "kabaret" }, cinema = { group = "do", wd = "Q41253", label = "kino" }, circus = { group = "do", wd = "Q47928", label = "cirkus" }, concert_hall = { group = "do", wd = "Q1060829", label = "koncertní síň" }, conference_center = { group = "do", wd = "Q1378975", label = "kongresové centrum" }, cultural_center = { group = "do", wd = "Q1329623", label = "kulturní centrum" }, edutainment = { group = "do", wd = "Q1153173", label = "zábavné vzdělávání" }, event = { group = "do", wd = "Q1190554", label = "událost" }, event_venue = { group = "do", wd = "Q18674739", label = "dějiště událostí" }, fair = { group = "do", wd = { "Q57305", "Q2948561" }, label = "veletrh" }, festival = { group = "do", wd = "Q132241", label = "festival" }, heritage_railway = { group = "do", wd = "Q420962", label = "historická železnice" }, 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 = "víceúčelový sál" }, music = { group = "do", wd = "Q638", label = "hudba" }, -- different types of music theaters opera_house = { group = "do", wd = "Q153562", label = "operní scéna" }, puppet_theater = { group = "do", wd = "Q3982337", label = "loutkové divadlo" }, recording_studio = { group = "do", wd = "Q746369", label = "nahrávací studio" }, sightseeing_flight = { alias = "pleasure_flight", group = "do", wd = "Q1425541", label = "vyhlídkový let" }, theater = { group = "do", wd = { "Q11635", "Q24354" }, label = "divadlo", icon = "theatre" }, -- speech theater, theater in general themed_travel = { group = "do", label = "tematické výlety" }, wildlife_observation = { group = "do", wd = { "Q28455557", "Q241741" }, label = "pozorování zvířat" }, -- recreation amusement_park = { group = "do", wd = "Q194195", label = "zábavní park" }, attraction = { group = "do", wd = "Q2800000", label = "atrakce" }, ballooning = { group = "do", wd = "Q805325", label = "let balónem" }, brine_bath = { group = "do", wd = "Q1316853", label = "solné lázně" }, casino = { group = "do", wd = "Q133215", label = "kasino" }, entertainment = { group = "do", wd = "Q173799", label = "zábava" }, escape_game = { group = "do", wd = "Q1201679", label = "úniková hra" }, falconry_display = { group = "do", wd = "Q1169958", label = "sokolnická expozice" }, game = { group = "do", wd = "Q11410", label = "hra" }, massage = { group = "do", wd = "Q179415", label = "masáž" }, onsen = { group = "do", wd = "Q655311", label = "Onsen" }, picnic = { group = "do", wd = "Q506294", label = "piknik", icon = "picnic-site" }, playground = { group = "do", wd = "Q11875349", label = "dětské hřiště" }, public_bath = { group = "do", wd = "Q785952", label = "veřejné lázně" }, ropes_course = { group = "do", wd = "Q1939700", label = "lanový park" }, sauna = { group = "do", wd = "Q57036", label = "sauna" }, spa = { alias = "wellness", group = "do", wd = "Q6882870", label = "lázně" }, theme_park = { group = "do", wd = "Q2416723", label = "tematický park" }, thermal_bath = { group = "do", wd = "Q1004887", label = "termální lázně" }, water_park = { group = "do", wd = { "Q740326", "Q118559331" }, label = "aquapark" }, water_playground = { group = "do", wd = "Q19984194", label = "vodní hřiště" }, youth_center = { group = "do", wd = "Q1302299", label = "klub mládeže" }, -- sports and fitness ["9pin"] = { group = "do", wd = "Q706199", label = "kuželky" }, ["10pin"] = { alias = "bowling", group = "do", wd = "Q172809", label = "bowling", icon = "bowling-alley" }, athletics_track = { group = "do", wd = { "Q1004435", "Q37025296", "Q121072018" }, label = "atletická dráha" }, archery = { group = "do", wd = "Q108429", label = "lukostřelba" }, badminton = { group = "do", wd = "Q7291", label = "badminton" }, barefoot_path = { group = "do", wd = "Q2143241", label = "bosá stezka" }, baseball = { group = "do", wd = { "Q5369", "Q701629" }, label = "baseball" }, basketball_court = { group = "do", wd = "Q2341939", label = "basketbalové hřiště" }, beach = { group = "do", wd = "Q40080", label = "pláž" }, beachvolleyball = { group = "do", wd = "Q4543", label = "plážový volejbal" }, bicycle_route = { group = "do", wd = { "Q353027", "Q102307360" }, label = "cyklotrasa" }, billiards = { group = "do", wd = "Q3341285", label = "kulečník" }, bmx = { group = "do", wd = "Q215184", label = "BMX" }, boat_rental = { group = "do", wd = "Q25384001", label = "půjčovna lodí" }, bobsleigh = { group = "do", wd = "Q177275", label = "bobování" }, bouldering = { group = "do", wd = "Q852989", label = "bouldering" }, boules = { group = "do", wd = "Q895060", label = "koulové sporty" }, bungee_jumping = { group = "do", wd = "Q193847", label = "bungee jumping" }, canoe = { group = "do", wd = "Q171529", label = "kánoe" }, -- Kanu, Kayak canyoning = { group = "do", wd = "Q206091", label = "canyoning" }, city_beach = { group = "do", wd = "Q7900097", label = "městská pláž" }, -- incl. beach club court = { group = "do", wd = "Q41487", label = "soud" }, cricket = { group = "do", wd = "Q5375", label = "kriket" }, cycling = { group = "do", wd = "Q53121", label = "cyklistika" }, dive_center = { alias = { "dive_centre", "diving center" }, group = "do", wd = "Q3664857", label = "potápěčské centrum" }, downhill = { group = "do", wd = { "Q319899", "Q121071424" }, label = "lyžování", icon = "skiing" }, -- alpine/downhill ski route extreme_sports = { group = "do", wd = "Q309162", label = "extrémní sport" }, fishing = { group = "do", wd = "Q14373", label = "rybaření" }, fitness_center = { alias = "gym", group = "do", wd = { "Q1065656", "Q30750411" }, label = "posilovna", icon = "fitness-centre" }, football_pitch = { group = "do", wd = "Q105755419", label = "fotbalové hřiště" }, gliding = { group = "do", wd = "Q624161", label = "plachtění" }, golf = { group = "do", wd = { "Q5377", "Q3177122" }, label = "golf" }, hiking = { alias = "trekking", group = "do", wd = "Q12014035", label = "turistika" }, horse_racing = { group = "do", wd = "Q187916", label = "dostihy" }, horse_riding = { alias = "equestrian", group = "do", wd = { "Q179226", "Q902378" }, label = "ježdění na koni" }, hunting = { group = "do", wd = "Q36963", label = "lov" }, ice_hockey = { group = "do", wd = "Q41466", label = "lední hokej" }, ice_rink = { group = "do", wd = "Q1282870", label = "ledová plocha" }, ice_skating = { group = "do", wd = "Q779272", label = "bruslení" }, ice_stadium = { group = "do", wd = "Q12019965", label = "zimní stadion" }, indoor_pool = { group = "do", wd = "Q357380", label = "krytý bazén" }, karting = { group = "do", wd = "Q192420", label = "karting" }, kitesurfing = { group = "do", wd = "Q219554", label = "kitesurfing" }, laser_tag = { group = "do", wd = "Q998303", label = "laserová hra" }, leisure_center = { group = "do", wd = "Q30313989", label = "volnočasové centrum" }, minigolf = { group = "do", wd = "Q754796", label = "minigolf" }, mountain_biking = { group = "do", wd = { "Q520611", "Q223705" }, label = "horské kolo" }, mountain_hiking = { alias = "hillwalking", group = "do", wd = "Q1762646", label = "horská turistika" }, mountaineering = { alias = "mountain_climbing", group = "do", wd = "Q22857", label = "lezení" }, motocross = { group = "do", wd = "Q215862", label = "motokros" }, nordic = { group = "do", wd = "Q216613", label = "klasické lyžování" }, -- nordic/cross country ski trail orienteering = { group = "do", wd = "Q29358", label = "orientační sporty" }, outdoor_chess = { group = "do", wd = { "Q115997054", "Q110079" }, label = "venkovní šachy" }, outdoor_pool = { group = "do", wd = "Q13586493", label = "venkovní bazén" }, paintball = { group = "do", wd = "Q192832", label = "paintball" }, parachuting = { alias = "skydiving", group = "do", wd = "Q193210", label = "parašutismus" }, paragliding = { group = "do", wd = "Q178380", label = "paragliding" }, pedalo = { group = "do", wd = "Q1335189", label = "šlapadlo" }, petanque = { group = "do", wd = { "Q189317", "Q114646415" }, label = "pétanque" }, polo = { group = "do", wd = "Q134211", label = "pólo" }, quad_bike = { group = "do", wd = "Q3926537", label = "čtyřkolka" }, racetrack = { group = "do", wd = "Q1777138", label = "závodiště" }, rafting = { group = "do", wd = "Q207238", label = "rafting" }, -- including whitewater rafting roller_skating = { group = "do", wd = "Q1707432", label = "bruslení na kolečkových bruslích" }, -- including inline roller skating rowing = { group = "do", wd = "Q159354", label = "veslování" }, running = { group = "do", wd = "Q3694569", label = "běh" }, sailing = { group = "do", wd = "Q192520", label = "plachtění" }, sandboarding = { group = "do", wd = "Q570459", label = "sandboarding" }, scuba_diving = { group = "do", wd = "Q1096878", label = "potápění" }, shooting_range = { group = "do", wd = "Q521839", label = "střelnice" }, skatepark = { group = "do", wd = "Q909906", label = "skatepark" }, ski_jumping = { group = "do", wd = "Q7718", label = "skok na lyžích" }, ski_school = { group = "do", wd = "Q2292514", label = "lyžařská škola" }, skitour = { group = "do", wd = "Q1075998", label = "skialpinismus" }, sledding = { group = "do", wd = "Q3266340", label = "sáňkování" }, snorkeling = { group = "do", wd = "Q2471422", label = "šnorchlování" }, snow_park = { group = "do", wd = "Q3141488", label = "snowpark" }, soccer = { group = "do", wd = "Q2736", label = "fotbal" }, summer_toboggan = { group = "do", wd = "Q3266345", label = "bobová dráha" }, sports = { group = "do", wd = "Q349", label = "sport" }, sports_venue = { group = "do", wd = { "Q1076486", "Q121071543", "Q120169931" }, label = "sportoviště" }, 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 = "paddleboard" }, surfing = { group = "do", wd = "Q159992", label = "surfing" }, swimming = { group = "do", wd = "Q6388", label = "plavání" }, swimming_pool = { group = "do", wd = "Q200023", label = "bazén" }, table_tennis = { group = "do", wd = "Q3930", label = "stolní tenis" }, tennis = { alias = "tennis_court", group = "do", wd = { "Q847", "Q741118" }, label = "tenis" }, toboggan = { group = "do", wd = "Q56611604", label = "tobogán" }, tour = { group = "do", label = "prohlídka" }, trail = { alias = "hiking_trail", group = "do", wd = { "Q2143825", "Q628179" }, label = "pěší stezka" }, trampoline_park = { group = "do", wd = "Q107338221", label = "trampolínový park" }, triathlon = { group = "do", wd = "Q10980", label = "triatlon" }, velodrome = { group = "do", wd = "Q830528", label = "velodrom", icon = "racetrack-cycling" }, wakeboarding = { group = "do", wd = "Q376040", label = "wakeboarding" }, water_skiing = { group = "do", wd = "Q472827", label = "vodní lyžování" }, water_sports = { group = "do", wd = "Q61065", label = "vodní sporty" }, winter_sports = { group = "do", wd = "Q204686", label = "zimní sporty" }, -- group types ["do"] = { group = "do", label = "aktivity" }, -- shopping alcohol_shop = { group = "buy", wd = "Q2632011", label = "obchod s alkoholem" }, antiquarian = { group = "buy", wd = "Q582794", label = "antikvariát" }, atm = { group = "buy", wd = "Q81235", label = "bankomat" }, bakery = { group = "buy", wd = "Q274393", label = "pekárna" }, bank = { group = "buy", wd = "Q22687", label = "banka" }, beverages = { group = "buy", wd = "Q47504516", label = "prodejna nápojů" }, bike_shop = { group = "buy", wd = "Q26721034", label = "prodejna kol" }, book_seller = { alias = "book_shop", group = "buy", wd = "Q200764", label = "knihkupectví" }, boutique = { group = "buy", wd = "Q1068824", label = "butik" }, business_park = { group = "buy", wd = "Q338313", label = "obchodní park" }, butchery = { group = "buy", wd = "Q13164546", label = "řeznictví" }, carpet_shop = { group = "buy", wd = "Q47516346", label = "obchod s koberci" }, cheesery = { group = "buy", wd = "Q3088348", label = "sýrárna" }, chemist = { alias = "drugstore", group = "buy", wd = "Q1260046", label = "drogerie" }, collector_shop = { group = "buy", label = "sběratelský obchod" }, computer_shop = { alias = "computer", wd = "Q43182520", group = "buy", label = "obchod s počítači" }, cosmetics_shop = { group = "buy", wd = "Q47508166", label = "kosmetický obchod" }, crafts_shop = { group = "buy", wd = "Q101061294", label = "řemeslný obchod" }, currency_exchange = { group = "buy", wd = "Q2002539", label = "směnárna peněz" }, delicatessen = { group = "buy", wd = { "Q3231410", "Q48635101" }, label = "lahůdky" }, department_store = { group = "buy", wd = "Q216107", label = "obchodní dům" }, ["duty-free_shop"] = { group = "buy", wd = "Q545609", label = "bezcelní obchod" }, fashion_store = { alias = "clothing_store", group = "buy", wd = "Q2090555", label = "obchod s oděvy", icon = "clothing-store" }, farm_shop = { group = "buy", wd = "Q1371823", label = "farmářský obchod " }, flea_market = { group = "buy", wd = "Q385870", label = "bleší trh" }, florist = { group = "buy", wd = "Q10431511", label = "květinářství" }, grocery = { group = "buy", wd = "Q1295201", label = "obchod s potravinami" }, hairdresser = { group = "buy", wd = "Q95856773", label = "kadeřník" }, industrial_park = { group = "buy", wd = "Q1662100", label = "průmyslový park" }, jewellery = { group = "buy", wd = "Q20708021", label = "šperkařství", icon = "jewelry-store" }, kiosk = { group = "buy", wd = "Q693369", label = "kiosek" }, livestock_market = { group = "buy", wd = "Q13592976", label = "Viehmarkt, Tiermarkt" }, mall = { group = "buy", wd = { "Q11315", "Q31374404" }, label = "obchodní centrum" }, market = { group = "buy", wd = "Q37654", label = "market" }, market_hall = { group = "buy", wd = "Q2080521", label = "tržnice" }, music_shop = { group = "buy", wd = "Q24284215", label = "obchod s muzikou" }, optician = { group = "buy", wd = "Q80144507", label = "optika" }, outdoor_retailer = { group = "buy", label = "venkovní prodejce" }, outlet = { group = "buy", wd = "Q76470", label = "outlet" }, pastry_shop = { alias = "confectionery", group = "buy", wd = "Q47505416", label = "cukrárna" }, photo_store = { group = "buy", wd = "Q57262241", label = "fotografický obchod" }, second_hand = { group = "buy", wd = "Q2925872", label = "second hand" }, shoe_shop = { group = "buy", wd = "Q7500021", label = "obuvnictví", icon = "shoe" }, shop = { group = "buy", wd = "Q213441", label = "obchod" }, shopping_arcade = { alias = "shopping_passage", group = "buy", wd = "Q97495053", label = "nákupní pasáž, nákupní centrum" }, shopping_district = { group = "buy", wd = "Q27095213", label = "nákupní čtvrť" }, shopping_street = { group = "buy", wd = "Q21000333", label = "nákupní ulice" }, souvenir_shop = { group = "buy", wd = "Q865693", label = "obchod se suvenýry" }, sports_shop = { group = "buy", wd = "Q47516567", label = "sportovní obchod" }, supermarket = { group = "buy", wd = "Q180846", label = "supermarket" }, ticket_shop = { alias = { "box_office", "ticket_sales", "ticket_office" }, group = "buy", wd = { "Q47519615", "Q877435", "Q100681367" }, label = "prodej vstupenek" }, vending_machine = { group = "buy", wd = "Q211584", label = "prodejní automat" }, watersports_shop = { group = "buy", label = "obchod s vodními sporty" }, -- group types buy = { group = "buy", label = "nakupování" }, -- cuisine, eating agriculture = { group = "eat", wd = "Q11451", label = "zemědělství" }, bistro = { group = "eat", wd = "Q866742", label = "bistro" }, brasserie = { group = "eat", wd = "Q1581509", label = "pivnice" }, cafe = { group = "eat", wd = "Q30022", label = "kavárna" }, cafeteria = { group = "eat", wd = "Q8463304", label = "kafeteria" }, canteen = { group = "eat", wd = "Q54957790", label = "jídelna" }, community_kitchen = { group = "eat", wd = "Q28854744", label = "komunitní kuchyně" }, fast_food = { group = "eat", wd = "Q1751429", label = "fast food" }, fish_restaurant = { group = "eat", wd = "Q125216847", label = "rybí restaurace" }, food = { group = "eat", wd = { "Q2095", "Q736427" }, label = "potraviny" }, grill_site = { group = "eat", wd = "Q1546788", label = "grilovací místo" }, ice_cream = { group = "eat", wd = "Q1311064", label = "zmrzlinárna" }, izakaya = { group = "eat", wd = "Q1193068", label = "izakaja" }, pizzeria = { group = "eat", wd = "Q1501212", label = "pizzerie", icon = "restaurant-pizza" }, restaurant = { group = "eat", wd = "Q11707", label = "restaurace" }, seafood_restaurant = { alias = "seafood", group = "eat", wd = "Q17102985", label = "restaurace s mořskými plody", icon = "restaurant-seafood" }, snack_bar = { group = "eat", wd = "Q1318768", label = "občerstvení" }, steak_house = { group = "eat", wd = "Q3109696", label = "steak house" }, street_food = { group = "eat", wd = "Q1316209", label = "pouliční jídlo" }, takeaway = { group = "eat", wd = { "Q154383", "Q506946" }, label = "jídlo s sebou" }, tavern = { group = "eat", wd = { "Q154250", "Q2387565" }, label = "taverna" }, teahouse = { group = "eat", wd = "Q1072166", label = "čajovna" }, wine_tavern = { group = "eat", wd = { "Q2556304", "Q1922416" }, label = "vinárna, vinotéka, vinný bar" }, -- group types eat = { group = "eat", wd = { "Q27038993", "Q27077054" }, label = "jídlo" }, -- drinking, going out bar = { group = "drink", wd = "Q187456", label = "bar" }, beer_garden = { group = "drink", wd = "Q857909", label = "pivní zahrada", icon = "beer" }, brewery = { group = "drink", wd = "Q131734", label = "pivovar" }, club = { group = "drink", label = "klub" }, discotheque = { group = "drink", wd = "Q1228895", label = "diskotéka" }, distillery = { group = "drink", wd = "Q1251750", label = "palírna" }, drinking_hall = { group = "drink", wd = "Q4101440", label = "vinárna" }, drinking_water = { group = "drink", wd = "Q7892", label = "pitná voda" }, nightclub = { group = "drink", wd = "Q622425", label = "noční klub" }, pub = { group = "drink", wd = { "Q19754932", "Q12341378" }, label = "krčma" }, vineyard = { group = "drink", wd = "Q22715", label = "vinice" }, wine_cellar = { group = "drink", wd = "Q22995", label = "vinný sklep" }, winery = { group = "drink", wd = "Q20181766", label = "vinařství" }, -- group types drink = { group = "drink", wd = "Q5307737", label = "pití" }, -- accommodation appartment = { group = "sleep", wd = "Q617839", label = "aparthotel" }, alpine_hut = { group = "sleep", wd = "Q182676", label = "horská chata" }, bed_and_bike = { group = "sleep", label = "postel a kolo" }, bnb = { group = "sleep", subtype = "y", wd = "Q367914", label = "postel a snídaně", icon = "lodging" }, boarding_house = { group = "sleep", subtype = "y", wd = { "Q1558858", "Q1065252" }, label = "penzion" }, boutique_hotel = { group = "sleep", wd = "Q259618", label = "Boutique hotel" }, campsite = { group = "sleep", wd = "Q832778", label = "kemp" }, caravan_site = { group = "sleep", label = "karavanový kemp" }, chalet = { group = "sleep", label = "chata" }, ecolodge = { group = "sleep", wd = "Q3577646", label = "ekolodge" }, group_accomodation = { group = "sleep", label = "skupinové ubytování" }, guest_house = { group = "sleep", wd = "Q2460422", label = "penzion" }, holiday_flat = { group = "sleep", wd = "Q336532", label = "prázdninový pronájem" }, hostel = { group = "sleep", wd = "Q654772", label = "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 = "chata" }, lodge = { group = "sleep", wd = "Q56439882", label = "Lodge" }, motel = { group = "sleep", wd = "Q216212", label = "motel", icon = "lodging" }, resort = { group = "sleep", wd = "Q875157", label = "rezort" }, wilderness_hut = { group = "sleep", wd = "Q17087359", label = "chata v divočině" }, youth_hostel = { group = "sleep", wd = "Q1589077", label = "mládežnická ubytovna" }, -- group types sleep = { group = "sleep", wd = "Q5056668", label = "ubytování" }, -- people children = { group = "other", wd = "Q7569", label = "děti" }, -- health animal_hospital = { group = "health", wd = "Q1706476", label = "veterinární klinika" }, defibrillator = { group = "health", wd = "Q1450682", label = "defibrilátor" }, dental_emergency_service = { group = "health", label = "zubařská pohotovost" }, dentist = { group = "health", wd = "Q2979300", label = "zubař" }, diving_chamber = { alias = "", group = "health", wd = "Q549046", label = "hyperbarická komora" }, doctor = { alias ="surgery", group = "health", wd = "Q718966", label = "doktor" }, emergency = { alias = "emergency_department", group = "health", wd = "Q1295316", label = "urgentní příjem pacientů" }, emergency_medical_services = { group = "health", wd = "Q860447", label = "zdravotnická záchranná služba" }, first_aid = { group = "health", wd = "Q133981", label = "první pomoc" }, health = { group = "health", wd = "Q12147", label = "zdraví" }, health_center = { alias = "clinic", group = "health", wd = { "Q569500", "Q1774898" }, label = "zdravotnické středisko" }, hospital = { group = "health", wd = { "Q16917", "Q180370" }, label = "nemocnice" }, kneipp_facility = { group = "health", wd = "Q66425029", label = "Kneippova lázeň" }, laboratory = { group = "health", wd = { "Q483242", "Q112203425" }, label = "laboratoř" }, ["medical_on-call_service"] = { group = "health", label = "lékařská pohotovost" }, naturopathy = { group = "health", wd = "Q213403", label = "naturopatie" }, nursing_home = { group = "health", wd = "Q837142", label = "dům s pečovatelskou službou" }, pharmacy = { group = "health", wd = "Q13107184", label = "lékárna" }, pharmacy_on_standby_duty = { group = "health", label = "lékárna s pohotovostní službou" }, rehabilitation = { group = "health", wd = "Q2795791", label = "rehabilitace" }, rescue_center = { group = "health", label = "záchranná stanice" }, veterinary = { group = "health", wd = "Q15850915", label = "veterina" }, -- teaching & learning academy = { group = "other", wd = "Q162633", label = "akademie" }, boarding_school = { group = "other", wd = { "Q269770", "Q125783335" }, label = "internátní škola" }, bookcase = { group = "other", wd = "Q215857", label = "knihovna" }, college = { group = "other", wd = "Q189004", label = "univerzita" }, community_center = { group = "other", wd = "Q77115", label = "komunitní centrum" }, cooking_class = { group = "other", label = "kurz vaření" }, education = { alias = "learn", group = "other", wd = "Q8434", label = "vzdělávání" }, folk_high_school = { group = "other", wd = "Q170087", label = "střední lidová škola" }, gymnasium = { group = "other", wd = "Q55043", label = "gymnázium" }, institute = { group = "other", wd = "Q1664720", label = "institut" }, kindergarten = { group = "other", wd = "Q126807", label = "mateřská škola" }, language_school = { group = "other", wd = "Q897403", label = "jazyková škola" }, library = { group = "other", wd = { "Q7075", "Q6503358", "Q2061246" }, label = "knihovna" }, nursery = { group = "other", wd = "Q20174673", label = "jesle" }, school = { group = "other", wd = "Q3914", label = "škola" }, university = { group = "other", wd = "Q3918", label = "univerzita" }, -- administration and uncategorized administration = { group = "other", wd = { "Q327333", "Q5283295" }, label = "administrativa" }, association = { alias = "society", group = "other", wd = { "Q48204", "Q15911314" }, label = "Verein" }, business_development_agency = { group = "other", label = "společnost pro ekonomický rozvoj" }, checkpoint = { group = "other", wd = "Q88871664", label = "kontrolní bod" }, company = { group = "other", wd = "Q6881511", label = "společnost" }, consulate = { group = "other", wd = "Q7843791", label = "konzulát" }, coworking_space = { group = "other", wd = "Q97307779", label = "coworkingový prostor" }, customs = { group = "other", wd = "Q182290", label = "celní správa" }, cultural_organisation = { group = "other", wd = "Q29918292", label = "kulturní asociace" }, embassy = { group = "other", wd = "Q3917681", label = "ambasáda" }, emergency_call = { group = "other", wd = "Q694554", label = "tísňová linka", icon = "emergency-phone" }, fire_brigade = { group = "other", wd = "Q6498663", label = "hasičský sbor", icon = "fire-station" }, government = { group = "other", wd = "Q16831714", label = "vládní budova" }, guide = { group = "other", wd = "Q14290559", label = "průvodce" }, hotline = { group = "other", wd = "Q1482145", label = "helpline" }, internet_cafe = { group = "other", wd = "Q272399", label = "internetová kavárna" }, laundry = { group = "other", wd = "Q12893467", label = "prádelna" }, list = { group = "other", wd = { "Q12139612", "Q13406463" }, label = "seznam" }, lost_and_found = { group = "other", wd = "Q15983979", label = "ztráty a nálezy" }, military = { group = "other", wd = "Q8473", label = "armáda" }, mobile_telephony = { group = "other", wd = "Q47516435", label = "prodejna mobilních telefonů" }, newspaper = { group = "other", wd = "Q11032", label = "noviny" }, office = { group = "other", wd = "Q182060", label = "kancelář" }, organisation = { group = "other", wd = "Q43229", label = "organizace" }, passport_office = { group = "other", label = "pasový úřad" }, 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 = "policie" }, post = { group = "other", wd = "Q35054", label = "pošta" }, register_office = { alias = { "standesamt", "registry_office" }, group = "other", wd = { "Q745221", "Q29127138", "Q206946" }, label = "matrika" }, relief_organisation = { group = "other", wd = "Q708676", label = "charitativní organizace" }, roadside_assistance = { group = "other", wd = "Q337810", label = "asistenční služby" }, shelter = { group = "other", wd = { "Q7493941", "Q989946" }, label = "přístřešek" }, toilet = { group = "other", wd = "Q7857", label = "záchody" }, tour_operator = { group = "other", wd = "Q133744", label = "cestovní kancelář" }, tourism_authority = { group = "other", label = "úřad pro cestovní ruch" }, tourist_information = { alias = "visitor_center", group = "other", wd = { "Q1587716", "Q18411786" }, label = "turistické informace", icon = "information" }, travel_agency = { group = "other", wd = "Q217107", label = "cestovní kancelář" }, weblink = { group = "other", wd = "Q102014", label = "hyperlink" }, wlan = { group = "other", wd = "Q334765", label = "WiFi hotspot" }, work = { group = "other", wd = "Q6958747", label = "práce" }, -- group types other = { group = "other", label = "jiné" }, listing = { group = "other", label = "výpis" }, -- populated areas city = { group = "populated", wd = "Q515", label = "město" }, fraction = { group = "populated", label = "část obce" }, holiday_resort = { group = "populated", wd = "Q3077815", label = "rekreační středisko" }, municipality = { group = "populated", wd = { "Q15284", "Q17376095", "Q562061" }, label = "obec" }, quarter = { alias = "neighborhood", group = "populated", wd = { "Q2983893", "Q253019" }, label = "čtvrť města" }, refugee_camp = { group = "populated", wd = "Q622499", label = "uprchlický tábor" }, settlement = { group = "populated", wd = "Q486972", label = "sídelní útvar" }, town = { group = "populated", wd = "Q3957", label = "město" }, village = { group = "populated", wd = "Q532", label = "vesnice" }, -- views observation_tower = { group = "view", wd = "Q1440300", label = "rozhledna" }, scenic_view = { group = "view", label = "výhled", icon = "attraction" }, viewpoint = { group = "view", wd = "Q6017969", label = "vyhlídka" }, -- areas adm1st = { group = "area", wd = "Q10864048", label = "správní jednotka 1. úrovně" }, adm2nd = { group = "area", wd = "Q13220204", label = "správní jednotka 2. úrovně" }, adm3rd = { group = "area", wd = "Q13221722", label = "správní jednotka 3. úrovně" }, country = { group = "area", wd = "Q6256", label = "stát" }, district = { group = "area", wd = "Q149621", label = "distrikt" }, region = { group = "area", wd = "Q82794", label = "region" }, surroundings = { group = "area", wd = "Q2920644", label = "okolí" }, vicinity = { group = "area", wd = "Q16968816", label = "sousedství" }, -- error error = { group = "error", wd = "Q29485", label = "chyba" } -- do not remove the following line -- ##end } } hgpso0wkwt7zlt4iywwm4491wth3wiu Modul:CountryData2 828 1346 22100 17245 2026-05-20T11:39:43Z LiMr 96 aktualizace na novější verzi 22100 Scribunto text/plain -- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Modul:CountryData&oldid=1775619) -- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Modul:CountryData&oldid=1775619) -- pravděpodobně duplicita s modul:CountyData, který však nefunguje pro zprovoznění šablony:Bod -- CountryData module -- module variable and administration local cm = { moduleInterface = { suite = 'CountryData', serial = '2026-05-17', item = 65431301 } } -- module import -- require( 'strict' ) local cg = mw.loadData( 'Module:CountryData/Geography' ) local cu = mw.loadData( 'Module:CountryData/Currencies' ) -- additional currency symbols local wu = require( 'Module:Wikidata utilities' ) local properties = { continent = 'P30', country = 'P17', countryCode = 'P474', currency = 'P38', iso3166_1 = 'P297', iso3166_2 = 'P300', iso639 = 'P218', locatedIn = 'P131', officialLanguage = 'P37', partOf = 'P361' } local exceptions = { Q145 = '^+44' -- UK } local currencyformatters = {} local function isSet( arg ) return arg and arg ~= '' end local function _getCountry( tab, id ) local item = tab[ id ] if item and item.id then item = tab[ item.id ] end if not item then return nil end local c = {} for k, v in pairs( item ) do -- item is read only c[ k ] = v end if c and not c.id then c.id = id end return c end local function getCountry( id ) return _getCountry( cg.countries, id ) end local function getAdminEntity( id ) return _getCountry( cg.adminEntities, id ) end local function getCountryTable( id ) return getAdminEntity( id ) or getCountry( id ) -- nil or table end local function checkTable( id ) if id == nil or id == '' then return nil end return getCountryTable( id ) -- nil or table end local function checkTableFromEntity( anEntity ) if not anEntity then return nil end local id, t for i, prop in ipairs( { properties.locatedIn, properties.country, properties.partOf } ) do for j, val in ipairs( wu.getValues( anEntity, prop ) ) do id = val.id t = checkTable( id ) if t then return t end end end return nil end function cm.getDataFromTables( vcEntity, wikidata ) -- article id local articleId = mw.wikibase.getEntityIdForCurrentPage() -- article lemma local t = cg.articles[ articleId ] if t then return getCountryTable( t ) end -- if country or admin unit itself if wikidata then t = checkTable( wikidata ) if t then return t end end if not articleId and not vcEntity then return nil end -- vCard entity if vcEntity then t = checkTableFromEntity( vcEntity ) if t then return t end end -- article entity if articleId then t = checkTable( articleId ) or checkTableFromEntity( articleId ) if t then return t end end -- not found in tables, get it now all from Wikidata return nil end -- getting data for vCard local function _getCountryDataByIso( iso_3166 ) for i, tab in ipairs( { 'countries', 'adminEntities' } ) do for id, c in pairs( cg[ tab ] ) do if c.iso_3166 and c.iso_3166 == iso_3166 then local country = {} for k, v in pairs( c ) do country[ k ] = v end country.id = id return country end end end return nil end local function _getCountryData( vcEntity, iso_3166, wikidata ) local t = cm.getDataFromTables( vcEntity, wikidata ) if t then return t end -- use template country parameter iso_3166 if isSet( iso_3166 ) and iso_3166:match( '%a%a' ) then t = _getCountryDataByIso( iso_3166:upper() ) if t then return t end end -- not found in CountryData table -- return default country dataset if not in main namespace if mw.title.getCurrentTitle().namespace ~= 0 and cg.articles[ '_default' ] then return getCountry( cg.articles[ '_default' ] ) end -- getting data from country entity local country = { id = wu.getId( vcEntity, properties.country ), iso_3166 = '', cont = '', cc = '', lang = '', currency = '', country = '', show = '', unknownCountry = isSet( iso_3166 ) } local coEntity = country.id ~= '' and mw.wikibase.getEntity( country.id ) if coEntity then country.fromWD = true country.iso_3166 = wu.getValue( coEntity, properties.iso3166_1 ):upper() country.cont = cg.continents[ wu.getId( coEntity, properties.continent ) ] or '' country.cc = wu.getValue( coEntity, properties.countryCode ) -- country calling code t = wu.getId( coEntity, properties.officialLanguage ) if t ~= '' then country.lang = wu.getValue( t, properties.iso639 ):lower() end country.currency = wu.getId( coEntity, properties.currency ) end return country end -- getting county data from country calling code function cm.getCountryFromPhones( tab ) local country = { id = '', cont = '', iso_3166 = '', cc = '', lang = '', currency = '', country = '', show = '' } -- prepare phone numbers for i = #tab, 1, -1 do tab[ i ] = tab[ i ]:gsub( '^00', '+' ) :gsub( '^%+%+', '+' ) :gsub( '[^%+0-9A-Z]', '' ) if not tab[ i ]:match( '^%+%d%d%d%d' ) then table.remove( tab, i ) end end if #tab == 0 then return country end -- exceptions fur multiple used country calling codes for i = 1, #tab, 1 do for wdId, pattern in pairs( exceptions ) do if tab[ i ]:match( pattern ) then return getCountry( wdId ) end end end -- make country calling codes table local ccodes = {} for i, cgTab in ipairs( { cg.countries, cg.adminEntities } ) do for key, val in pairs( cgTab ) do if val.cc and val.cc ~= '' then ccodes[ val.cc:gsub( '-', '' ) ] = key end end end -- look for country code in phone numbers local q for i, phone in ipairs( tab ) do phone = phone:sub( 1, 5 ) repeat q = ccodes[ phone ] phone = phone:sub( 1, -2 ) until phone == '' or q if q then country = getCountryTable( q ) break end end return country end function cm.getCountryFromWeb( tab ) local at, count, domain, country, toplevel for i, address in ipairs( tab ) do address = mw.text.trim( address ) domain = '' address, count = address:gsub( '^https?://', '' ) if count == 0 then address, count = address:gsub( '^//', '' ) end if count == 1 then -- it is maybe a web domain domain = address at = domain:find( '/' ) if at then domain = domain:sub( 1, at - 1 ) end else -- is maybe an email address address, count = address:gsub( '@', '@' ) if count == 1 then domain = address:gsub( '^.*@', '' ) end end if domain ~= '' then -- get two letters country TLD toplevel, count = domain:gsub( '^.*%.(%a%a)$', '%1' ) if count == 1 then country = _getCountryDataByIso( toplevel:upper() ) if country then return country end end end end return { id = '', cont = '', iso_3166 = '', cc = '', lang = '', currency = '', country = '', show = '' } end -- adding language-dependent parameters function cm.setLanguageParams( langCode, wikiLang, country ) if langCode ~= '' then country.lang = langCode country.unknownLanguage = true country.langName = mw.language.fetchLanguageName( langCode, wikiLang ) or '' if country.langName ~= '' then country.unknownLanguage = false country.isRTL = mw.getLanguage( langCode ):isRTL() end end end -- main getCountryData function -- entity: Wikidata entity or Wikidata id -- phones: table of phone numbers with country calling code -- iso_3166: is given by country parameter of listing/marker templates -- wikidata: Wikidata id -- web: table of urls and/or mail addressess function cm.getCountryData( entity, phones, iso_3166, wikidata, web ) local country = _getCountryData( entity, iso_3166, wikidata ) if country.id == '' and web and #web > 0 then country = cm.getCountryFromWeb( web ) end if country.id == '' and phones and #phones > 0 then country = cm.getCountryFromPhones( phones ) end local c = cu.currencies[ country.currency ] country.currency = c and c.iso or '' country.addCurrency = country.currency if c and c.add and c.add ~= '' then country.addCurrency = country.addCurrency .. ( country.addCurrency ~= '' and ', ' or '' ) .. c.add end country.unknownLanguage = true cm.setLanguageParams( country.lang, mw.getContentLanguage():getCode(), country ) return country end -- getting first-order administrative-territorial entity code function cm.getAdm1st( countryId ) local entityId = mw.wikibase.getEntityIdForCurrentPage() if not entityId or not countryId or countryId == '' then return nil end local i = 0 local iso3166_2 while entityId ~= '' and not getAdminEntity( entityId ) and not getCountry( entityId ) and i < 5 do iso3166_2 = wu.getValue( entityId, properties.iso3166_2 ) if iso3166_2 ~= '' then return iso3166_2 end -- getting next administrative territorial entity entityId = wu.getId( entityId, properties.locatedIn ) i = i + 1 end end function cm.getCategories( formatStr ) return wu.getCategories( formatStr ) end -- getting data for LinkPhone function cm.getCountryCode() local t = cm.getDataFromTables( nil ) if t then return t.cc, t.phoneDigits or 2 else return '', 2 end end -- returns a single data set from Module:CountryData/Currencies function cm.getCurrency( key ) return cu.currencies[ key ] end function cm.getCurrencyFormatter( qId ) qId = qId:upper() if currencyformatters[ qId ] then return currencyformatters[ qId ] elseif qId:match( '^%a%a%a$' ) then -- ISO code qId = cu.isoToQid[ qId ] end local currency = cu.currencies[ qId ] if currency then local formatter, unit if currency.f then formatter = currency.f else formatter = cu.currencies.default or '%s&#x202F;unit' unit = currency.add and currency.add:gsub( ',.*', '' ) or currency.iso formatter = formatter:gsub( 'unit', unit ) end currencyformatters[ qId ] = formatter currencyformatters[ currency.iso ] = formatter return formatter end return nil end return cm dacem5x9g12sewvrfo4had008pydpon Modul:CountryData/Geography 828 1347 22101 18765 2026-05-20T11:43:21Z LiMr 96 aktualizace na novější verzi 22101 Scribunto text/plain -- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Modul:CountryData/Geography&oldid=1695115) -- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Modul:CountryData/Geography&oldid=1695115) -- Preventing expensive Wikidata calls return { -- administration moduleInterface = { suite = 'CountryData', sub = 'Geography', serial = '2025-06-22', item = 65433242 }, -- wiki-specific exceptions for articles with many vCard calls or topic articles -- to prevent data retrieval on the base of article's Wikidata qualifier id articles = { _default = "Q183", -- DE Q24879 = "Q183", -- Bremen Q2814 = "Q183", -- Halle (Saale) Q452401 = "Q183", -- Deutsche Fachwerkstraße Q1741 = "Q40", -- Wien -> AT Q19386 = "Q25227", -- ABC-Inseln -> AN Q5604 = "Q30", -- Arizona/Frank Lloyd Wright -> US Q15112104= "Q79", -- Hamada -> EG Q214077 = "Q801", -- Via Dolorosa -> IL -- historic regions Q564882 = "Q36", -- Dobriner Land -> PL Q661110 = "Q36", -- Glatzer Ländchen Q178813 = "Q38", -- Herculaneum -> IT Q283680 = "Q43", -- Karkemisch -> TR Q672344 = "Q36", -- Kulmer Land Q22880 = "Q183", -- Kurpfalz Q1801987 = "Q36", -- Lande Lauenburg und Bütow Q158445 = "Q183", -- Mecklenburg-Schwerin Q819411 = "Q36", -- Neumark -> PL Q767089 = "Q23681", -- Salamis -> Nordzypern Q1294629 = "Q407199", -- Samaria -> PS Q151005 = "Q183", -- Völkerschlacht Q159626 = "Q183", -- Württemberg }, -- continent list continents = { Q15 = "af", Q51 = "an", Q48 = "as", Q3960 = "au", Q46 = "eu", Q49 = "na", Q538 = "oc", Q18 = "sa" }, -- countries list sorted by ISO 3166 code -- add contains additional show parameters link all, inline -- de-wiki: exceptions: at, ch, de, it: show = "inline" countries = { Q244165 = { cont = "as", iso_3166 = "", cc = "+37447", lang = "hy", currency = "Q130498", country = "Republika Arcach" }, -- Náhorní Karabach Q228 = { cont = "eu", iso_3166 = "AD", cc = "+376", lang = "ca", currency = "Q4916", country = "Andorra" }, Q878 = { cont = "as", iso_3166 = "AE", cc = "+971", lang = "ar", currency = "Q200294", country = "Spojené arabské emiráty" }, Q889 = { cont = "as", iso_3166 = "AF", cc = "+93", lang = "ps", currency = "Q199471", country = "Afghánistán" }, Q781 = { cont = "na", iso_3166 = "AG", cc = "+1-268", lang = "en", currency = "Q26365", country = "Antigua a Barbuda" }, Q222 = { cont = "eu", iso_3166 = "AL", cc = "+355", lang = "sq", currency = "Q125999", country = "Albánie" }, Q399 = { cont = "as", iso_3166 = "AM", cc = "+374", lang = "hy", currency = "Q130498", country = "Arménie" }, Q916 = { cont = "af", iso_3166 = "AO", cc = "+244", lang = "pt", currency = "Q200337", country = "Angola" }, Q1555938 = { cont = "an", iso_3166 = "AQ", cc = "", lang = "en", currency = "", country = "Antarktida" }, Q21590062= { id = "Q1555938" }, Q414 = { cont = "sa", iso_3166 = "AR", cc = "+54", lang = "es", currency = "Q199578", country = "Argentina" }, Q40 = { cont = "eu", iso_3166 = "AT", cc = "+43", lang = "de", currency = "Q4916", show = "inline", country = "Rakousko" }, Q408 = { cont = "au", iso_3166 = "AU", cc = "+61", lang = "en", currency = "Q259502", country = "Austrálie" }, Q227 = { cont = "as", iso_3166 = "AZ", cc = "+994", lang = "az", currency = "Q483725", country = "Ázerbájdžán" }, Q225 = { cont = "eu", iso_3166 = "BA", cc = "+387", lang = "bs", currency = "Q179620", country = "Bosna a Hercegovina" }, Q244 = { cont = "na", iso_3166 = "BB", cc = "+1-246", lang = "en", currency = "Q194351", country = "Barbados" }, Q902 = { cont = "as", iso_3166 = "BD", cc = "+880", lang = "bn", currency = "Q194453", country = "Bangladéš" }, Q31 = { cont = "eu", iso_3166 = "BE", cc = "+32", lang = "nl", currency = "Q4916", country = "Belgie" }, Q29999 = { id = "Q31" }, Q965 = { cont = "af", iso_3166 = "BF", cc = "+226", lang = "fr", currency = "Q861690", country = "Burkina Faso" }, Q219 = { cont = "eu", iso_3166 = "BG", cc = "+359", lang = "bg", currency = "Q172540", country = "Bulharsko" }, Q398 = { cont = "as", iso_3166 = "BH", cc = "+973", lang = "ar", currency = "Q201871", country = "Bahrajn" }, Q967 = { cont = "af", iso_3166 = "BI", cc = "+257", lang = "fr", currency = "Q238007", country = "Burundi" }, Q962 = { cont = "af", iso_3166 = "BJ", cc = "+229", lang = "fr", currency = "Q861690", country = "Benin" }, Q921 = { cont = "as", iso_3166 = "BN", cc = "+673", lang = "ms", currency = "Q206319", country = "Brunej" }, Q750 = { cont = "sa", iso_3166 = "BO", cc = "+591", lang = "es", currency = "Q200737", country = "Bolívie" }, Q155 = { cont = "sa", iso_3166 = "BR", cc = "+55", lang = "pt", currency = "Q173117", country = "Brazílie" }, Q778 = { cont = "na", iso_3166 = "BS", cc = "+1-242", lang = "en", currency = "Q194339", country = "Bahamy" }, Q917 = { cont = "as", iso_3166 = "BT", cc = "+975", lang = "dz", currency = "Q201799", country = "Bhútán" }, Q963 = { cont = "af", iso_3166 = "BW", cc = "+267", lang = "en", currency = "Q186794", country = "Botswana" }, Q184 = { cont = "eu", iso_3166 = "BY", cc = "+375", lang = "be", currency = "Q160680", country = "Bělorusko" }, Q242 = { cont = "na", iso_3166 = "BZ", cc = "+501", lang = "en", currency = "Q275112", country = "Belize" }, Q16 = { cont = "na", iso_3166 = "CA", cc = "+1", lang = "en", currency = "Q1104069", country = "Kanada" }, Q974 = { cont = "af", iso_3166 = "CD", cc = "+243", lang = "fr", currency = "Q4734", country = "Konžská demokratická republika" }, Q929 = { cont = "af", iso_3166 = "CF", cc = "+236", lang = "fr", currency = "Q847739", country = "Středoafrická republika" }, Q971 = { cont = "af", iso_3166 = "CG", cc = "+242", lang = "fr", currency = "Q847739", country = "Kongo" }, Q39 = { cont = "eu", iso_3166 = "CH", cc = "+41", lang = "de", currency = "Q25344", show = "inline", country = "Švýcarsko" }, Q1008 = { cont = "af", iso_3166 = "CI", cc = "+225", lang = "fr", currency = "Q861690", country = "Pobřeží slonoviny" }, Q26988 = { cont = "oc", iso_3166 = "CK", cc = "+682", lang = "en", currency = "Q1472704", country = "Cookovy ostrovy" }, Q298 = { cont = "sa", iso_3166 = "CL", cc = "+56", lang = "es", currency = "Q200050", country = "Chile" }, Q1009 = { cont = "af", iso_3166 = "CM", cc = "+237", lang = "fr", currency = "Q847739", country = "Kamerun" }, Q148 = { cont = "as", iso_3166 = "CN", cc = "+86", lang = "zh", currency = "Q39099", country = "Čína" }, Q739 = { cont = "sa", iso_3166 = "CO", cc = "+57", lang = "es", currency = "Q244819", country = "Kolumbie" }, Q800 = { cont = "na", iso_3166 = "CR", cc = "+506", lang = "es", currency = "Q242915", country = "Kostarika" }, Q241 = { cont = "na", iso_3166 = "CU", cc = "+53", lang = "es", currency = "Q201505", country = "Kuba" }, Q1011 = { cont = "af", iso_3166 = "CV", cc = "+238", lang = "pt", currency = "Q4591", country = "Kapverdy" }, Q229 = { cont = "eu", iso_3166 = "CY", cc = "+357", lang = "el", currency = "Q4916", country = "Kypr" }, Q213 = { cont = "eu", iso_3166 = "CZ", cc = "+420", lang = "cs", currency = "Q131016", country = "Česko" }, Q183 = { cont = "eu", iso_3166 = "DE", cc = "+49", lang = "de", currency = "Q4916", show = "inline", country = "Německo" }, Q977 = { cont = "af", iso_3166 = "DJ", cc = "+253", lang = "fr", currency = "Q4594", country = "Džibutsko" }, Q35 = { cont = "eu", iso_3166 = "DK", cc = "+45", lang = "da", currency = "Q25417", country = "Dánsko" }, Q756617 = { id = "Q35" }, Q784 = { cont = "na", iso_3166 = "DM", cc = "+1-767", lang = "en", currency = "Q26365", country = "Dominika" }, Q786 = { cont = "na", iso_3166 = "DO", cc = "+1-809", lang = "es", currency = "Q242922", country = "Dominikánská republika" }, Q262 = { cont = "af", iso_3166 = "DZ", cc = "+213", lang = "fr", currency = "Q199674", country = "Alžírsko" }, Q736 = { cont = "sa", iso_3166 = "EC", cc = "+593", lang = "es", currency = "Q4917", country = "Ekvádor" }, Q191 = { cont = "eu", iso_3166 = "EE", cc = "+372", lang = "et", currency = "Q4916", country = "Estonsko" }, Q79 = { cont = "af", iso_3166 = "EG", cc = "+20", lang = "ar", currency = "Q199462", phoneDigits = 4, show = "all", country = "Egypt" }, Q6250 = { cont = "af", iso_3166 = "EH", cc = "+212", lang = "ar", currency = "Q200192", country = "Západní Sahara" }, Q40362 = { id = "Q6250" }, Q986 = { cont = "af", iso_3166 = "ER", cc = "+291", lang = "ti", currency = "Q171503", country = "Eritrea" }, Q29 = { cont = "eu", iso_3166 = "ES", cc = "+34", lang = "es", currency = "Q4916", country = "Španělsko" }, Q115 = { cont = "af", iso_3166 = "ET", cc = "+251", lang = "am", currency = "Q206243", show = "all", country = "Etiopie" }, Q33 = { cont = "eu", iso_3166 = "FI", cc = "+358", lang = "fi", currency = "Q4916", country = "Finsko" }, Q712 = { cont = "oc", iso_3166 = "FJ", cc = "+679", lang = "fj", currency = "Q4592", country = "Fidži" }, Q702 = { cont = "oc", iso_3166 = "FM", cc = "+691", lang = "en", currency = "Q4917", country = "Mikronésie" }, Q4628 = { cont = "eu", iso_3166 = "FO", cc = "+298", lang = "da", currency = "Q191068", country = "Faerské ostrovy" }, Q142 = { cont = "eu", iso_3166 = "FR", cc = "+33", lang = "fr", currency = "Q4916", country = "Francie" }, Q1000 = { cont = "af", iso_3166 = "GA", cc = "+241", lang = "fr", currency = "Q847739", country = "Gabon" }, Q145 = { cont = "eu", iso_3166 = "GB", cc = "+44", lang = "en-gb", currency = "Q25224", country = "Velká Británie" }, Q124653007 = { id = "Q145" }, Q769 = { cont = "na", iso_3166 = "GD", cc = "+1-473", lang = "en", currency = "Q26365", country = "Grenada" }, Q230 = { cont = "as", iso_3166 = "GE", cc = "+995", lang = "ka", currency = "Q4608", country = "Gruzie" }, Q117 = { cont = "af", iso_3166 = "GH", cc = "+233", lang = "en", currency = "Q183530", country = "Ghana" }, Q1005 = { cont = "af", iso_3166 = "GM", cc = "+220", lang = "en", currency = "Q202885", country = "Gambie" }, Q1006 = { cont = "af", iso_3166 = "GN", cc = "+224", lang = "fr", currency = "Q213311", country = "Guinea" }, Q983 = { cont = "af", iso_3166 = "GQ", cc = "+240", lang = "es", currency = "Q847739", country = "Rovníková Guinea" }, Q41 = { cont = "eu", iso_3166 = "GR", cc = "+30", lang = "el", currency = "Q4916", country = "Řecko" }, Q774 = { cont = "na", iso_3166 = "GT", cc = "+502", lang = "es", currency = "Q207396", country = "Guatemala" }, Q1007 = { cont = "af", iso_3166 = "GW", cc = "+245", lang = "pt", currency = "Q861690", country = "Guinea-Bissau" }, Q734 = { cont = "sa", iso_3166 = "GY", cc = "+592", lang = "en", currency = "Q213005", country = "Guyana" }, Q783 = { cont = "na", iso_3166 = "HN", cc = "+504", lang = "es", currency = "Q4719", phoneDigits = 4, country = "Honduras" }, Q224 = { cont = "eu", iso_3166 = "HR", cc = "+385", lang = "hr", currency = "Q4916", country = "Chorvatsko" }, Q790 = { cont = "na", iso_3166 = "HT", cc = "+509", lang = "fr", currency = "Q203955", country = "Haiti" }, Q28 = { cont = "eu", iso_3166 = "HU", cc = "+36", lang = "hu", currency = "Q47190", country = "Maďarsko" }, Q252 = { cont = "as", iso_3166 = "ID", cc = "+62", lang = "id", currency = "Q41588", country = "Indonésie" }, Q27 = { cont = "eu", iso_3166 = "IE", cc = "+353", lang = "ga", currency = "Q4916", country = "Irsko" }, Q801 = { cont = "as", iso_3166 = "IL", cc = "+972", lang = "he", currency = "Q131309", country = "Izrael" }, Q575187 = { id = "Q801" }, Q668 = { cont = "as", iso_3166 = "IN", cc = "+91", lang = "hi", currency = "Q80524", country = "Indie" }, Q796 = { cont = "as", iso_3166 = "IQ", cc = "+964", lang = "ar", currency = "Q193094", country = "Irák" }, Q794 = { cont = "as", iso_3166 = "IR", cc = "+98", lang = "fa", currency = "Q188608", country = "Írán" }, Q189 = { cont = "eu", iso_3166 = "IS", cc = "+354", lang = "is", currency = "Q131473", country = "Island" }, Q38 = { cont = "eu", iso_3166 = "IT", cc = "+39", lang = "it", currency = "Q4916", show = "inline", country = "Itálie" }, Q766 = { cont = "na", iso_3166 = "JM", cc = "+1-876", lang = "en", currency = "Q209792", country = "Jamajka" }, Q810 = { cont = "as", iso_3166 = "JO", cc = "+962", lang = "ar", currency = "Q203722", country = "Jordánsko" }, Q17 = { cont = "as", iso_3166 = "JP", cc = "+81", lang = "ja", currency = "Q8146", country = "Japonsko" }, Q114 = { cont = "af", iso_3166 = "KE", cc = "+254", lang = "sw", currency = "Q202882", country = "Keňa" }, Q813 = { cont = "as", iso_3166 = "KG", cc = "+996", lang = "ky", currency = "Q35881", country = "Kyrgyzstán" }, Q424 = { cont = "as", iso_3166 = "KH", cc = "+855", lang = "km", currency = "Q204737", country = "Kambodža" }, Q710 = { cont = "oc", iso_3166 = "KI", cc = "+686", lang = "en", currency = "Q1049963", country = "Kiribati" }, Q970 = { cont = "af", iso_3166 = "KM", cc = "+269", lang = "ar", currency = "Q267264", country = "Komory" }, Q763 = { cont = "na", iso_3166 = "KN", cc = "+1-869", lang = "en", currency = "Q26365", country = "Svatý Kryštof a Nevis" }, Q423 = { cont = "as", iso_3166 = "KP", cc = "+850", lang = "ko", currency = "Q106720", country = "Severní Korea" }, Q884 = { cont = "as", iso_3166 = "KR", cc = "+82", lang = "ko", currency = "Q202040", country = "Jižní Korea" }, Q817 = { cont = "as", iso_3166 = "KW", cc = "+965", lang = "ar", currency = "Q193098", country = "Kuvajt" }, Q232 = { cont = "as", iso_3166 = "KZ", cc = "+7", lang = "kk", currency = "Q173751", country = "Kazachstán" }, Q819 = { cont = "as", iso_3166 = "LA", cc = "+856", lang = "lo", currency = "Q200055", country = "Laos" }, Q822 = { cont = "as", iso_3166 = "LB", cc = "+961", lang = "ar", currency = "Q201880", country = "Libanon" }, Q760 = { cont = "na", iso_3166 = "LC", cc = "+1-758", lang = "en", currency = "Q26365", country = "Svatá Lucie" }, Q347 = { cont = "eu", iso_3166 = "LI", cc = "+423", lang = "de", currency = "Q25344", country = "Lichtenštejnsko" }, Q854 = { cont = "as", iso_3166 = "LK", cc = "+94", lang = "si", currency = "Q4596", country = "Srí Lanka" }, Q1014 = { cont = "af", iso_3166 = "LR", cc = "+231", lang = "en", currency = "Q242988", country = "Libérie" }, Q1013 = { cont = "af", iso_3166 = "LS", cc = "+266", lang = "en", currency = "Q208039", country = "Lesotho" }, Q37 = { cont = "eu", iso_3166 = "LT", cc = "+370", lang = "lt", currency = "Q4916", country = "Litva" }, Q32 = { cont = "eu", iso_3166 = "LU", cc = "+352", lang = "lb", currency = "Q4916", country = "Lucembursko" }, Q211 = { cont = "eu", iso_3166 = "LV", cc = "+371", lang = "lv", currency = "Q4916", country = "Lotyšsko" }, Q1016 = { cont = "af", iso_3166 = "LY", cc = "+218", lang = "ar", currency = "Q190699", country = "Libye" }, Q1028 = { cont = "af", iso_3166 = "MA", cc = "+212", lang = "ar", currency = "Q200192", country = "Maroko" }, Q235 = { cont = "eu", iso_3166 = "MC", cc = "+377", lang = "fr", currency = "Q4916", country = "Monako" }, Q217 = { cont = "eu", iso_3166 = "MD", cc = "+373", lang = "mo", currency = "Q181129", country = "Moldavsko" }, Q236 = { cont = "eu", iso_3166 = "ME", cc = "+382", lang = "sr-me", currency = "Q4916", country = "Černá Hora" }, Q1019 = { cont = "af", iso_3166 = "MG", cc = "+261", lang = "mg", currency = "Q4584", country = "Madagaskar" }, Q709 = { cont = "oc", iso_3166 = "MH", cc = "+692", lang = "en", currency = "Q4917", country = "Marshallovy ostrovy" }, Q221 = { cont = "eu", iso_3166 = "MK", cc = "+389", lang = "mk", currency = "Q177875", country = "Severní Makedonie" }, Q912 = { cont = "af", iso_3166 = "ML", cc = "+223", lang = "fr", currency = "Q861690", country = "Mali" }, Q836 = { cont = "as", iso_3166 = "MM", cc = "+95", lang = "my", currency = "Q201875", country = "Myanmar" }, Q711 = { cont = "as", iso_3166 = "MN", cc = "+976", lang = "mn", currency = "Q183435", country = "Mongolsko" }, Q16644 = { cont = "oc", iso_3166 = "MP", cc ="+1-670", lang = "en", currency = "Q4917", country = "Severní Mariany" }, Q1025 = { cont = "af", iso_3166 = "MR", cc = "+222", lang = "ar", currency = "Q207024", country = "Mauritánie" }, Q233 = { cont = "eu", iso_3166 = "MT", cc = "+356", lang = "mt", currency = "Q4916", country = "Malta" }, Q1027 = { cont = "af", iso_3166 = "MU", cc = "+230", lang = "en", currency = "Q212967", country = "Mauricius" }, Q826 = { cont = "as", iso_3166 = "MV", cc = "+960", lang = "dv", currency = "Q206600", country = "Maledivy" }, Q1020 = { cont = "af", iso_3166 = "MW", cc = "+265", lang = "en", currency = "Q211694", country = "Malawi" }, Q96 = { cont = "na", iso_3166 = "MX", cc = "+52", lang = "es", currency = "Q4730", country = "Mexiko" }, Q833 = { cont = "as", iso_3166 = "MY", cc = "+60", lang = "ms", currency = "Q163712", country = "Malajsie" }, Q1029 = { cont = "af", iso_3166 = "MZ", cc = "+222", lang = "pt", currency = "Q200753", country = "Mosambik" }, Q1030 = { cont = "af", iso_3166 = "NA", cc = "+264", lang = "en", currency = "Q202462", country = "Namibie" }, Q1032 = { cont = "af", iso_3166 = "NE", cc = "+227", lang = "fr", currency = "Q861690", country = "Niger" }, Q1033 = { cont = "af", iso_3166 = "NG", cc = "+234", lang = "en", currency = "Q203567", country = "Nigérie" }, Q811 = { cont = "na", iso_3166 = "NI", cc = "+505", lang = "es", currency = "Q207312", country = "Nikaragua" }, Q55 = { cont = "eu", iso_3166 = "NL", cc = "+31", lang = "nl", currency = "Q4916", country = "Nizozemsko" }, Q20 = { cont = "eu", iso_3166 = "NO", cc = "+47", lang = "no", currency = "Q132643", country = "Norsko" }, Q837 = { cont = "as", iso_3166 = "NP", cc = "+977", lang = "ne", currency = "Q202895", country = "Nepál" }, Q697 = { cont = "oc", iso_3166 = "NR", cc = "+674", lang = "na", currency = "Q259502", country = "Nauru" }, Q34020 = { cont = "oc", iso_3166 = "NU", cc = "+683", lang ="niu", currency = "Q1472704", country = "Niue" }, Q664 = { cont = "oc", iso_3166 = "NZ", cc = "+64", lang = "en", currency = "Q1472704", country = "Nový Zéland" }, Q23681 = { cont = "eu", iso_3166 = "", cc = "+90-392", lang = "tr", currency = "Q172872", country = "Severokyperská turecká republika" }, Q842 = { cont = "as", iso_3166 = "OM", cc = "+968", lang = "ar", currency = "Q272290", country = "Omán" }, Q804 = { cont = "na", iso_3166 = "PA", cc = "+507", lang = "es", currency = "Q210472", country = "Panama" }, Q419 = { cont = "sa", iso_3166 = "PE", cc = "+51", lang = "es", currency = "Q204656", country = "Peru" }, Q691 = { cont = "oc", iso_3166 = "PG", cc = "+675", lang = "ho", currency = "Q200759", country = "Papua Nová Guinea" }, Q928 = { cont = "as", iso_3166 = "PH", cc = "+63", lang = "fil", currency = "Q17193", country = "Filipíny" }, Q843 = { cont = "as", iso_3166 = "PK", cc = "+92", lang = "ur", currency = "Q188289", country = "Pákistán" }, Q36 = { cont = "eu", iso_3166 = "PL", cc = "+48", lang = "pl", currency = "Q123213", country = "Polsko" }, Q407199 = { cont = "as", iso_3166 = "PS", cc = "+970", lang = "ar", currency = "Q203722", country = "Palestina" }, Q23792 = { id = "Q407199" }, Q42620 = { id = "Q407199" }, Q219060 = { id = "Q407199" }, Q45 = { cont = "eu", iso_3166 = "PT", cc = "+351", lang = "pt", currency = "Q4916", country = "Portugalsko" }, Q695 = { cont = "oc", iso_3166 = "PW", cc = "+680", lang = "en", currency = "Q4917", country = "Palau" }, Q733 = { cont = "sa", iso_3166 = "PY", cc = "+595", lang = "es", currency = "Q207514", country = "Paraguay" }, Q846 = { cont = "as", iso_3166 = "QA", cc = "+974", lang = "ar", currency = "Q206386", country = "Katar" }, Q218 = { cont = "eu", iso_3166 = "RO", cc = "+40", lang = "ro", currency = "Q131645", country = "Rumunsko" }, Q403 = { cont = "eu", iso_3166 = "RS", cc = "+381", lang = "sr", currency = "Q172524", country = "Srbsko" }, Q159 = { cont = "eu", iso_3166 = "RU", cc = "+7", lang = "ru", currency = "Q41044", country = "Rusko" }, Q1037 = { cont = "af", iso_3166 = "RW", cc = "+250", lang = "rw", currency = "Q4741", country = "Rwanda" }, Q851 = { cont = "as", iso_3166 = "SA", cc = "+966", lang = "ar", currency = "Q199857", country = "Saúdská Arábie" }, Q685 = { cont = "oc", iso_3166 = "SB", cc = "+677", lang = "en", currency = "Q4597", country = "Šalomounovy ostrovy" }, Q1042 = { cont = "af", iso_3166 = "SC", cc = "+248", lang = "en", currency = "Q4595", country = "Seychely" }, Q1049 = { cont = "af", iso_3166 = "SD", cc = "+249", lang = "ar", currency = "Q271206", show = "all", country = "Súdán" }, Q34 = { cont = "eu", iso_3166 = "SE", cc = "+46", lang = "sv", currency = "Q122922", country = "Švédsko" }, Q334 = { cont = "as", iso_3166 = "SG", cc = "+65", lang = "en", currency = "Q190951", country = "Singapur" }, Q215 = { cont = "eu", iso_3166 = "SI", cc = "+386", lang = "sl", currency = "Q4916", country = "Slovinsko" }, Q214 = { cont = "eu", iso_3166 = "SK", cc = "+421", lang = "sk", currency = "Q4916", country = "Slovensko" }, Q1044 = { cont = "af", iso_3166 = "SL", cc = "+232", lang = "en", currency = "Q122922", country = "Sierra Leone" }, Q238 = { cont = "eu", iso_3166 = "SM", cc = "+378", lang = "it", currency = "Q4916", country = "San Marino" }, Q1041 = { cont = "af", iso_3166 = "SN", cc = "+221", lang = "fr", currency = "Q861690", country = "Senegal" }, Q1045 = { cont = "af", iso_3166 = "SO", cc = "+252", lang = "so", currency = "Q4603", country = "Somálsko" }, Q730 = { cont = "sa", iso_3166 = "SR", cc = "+597", lang = "nl", currency = "Q202036", country = "Surinam" }, Q958 = { cont = "af", iso_3166 = "SS", cc = "+211", lang = "en", currency = "Q244366", country = "Jižní Súdán" }, Q1039 = { cont = "af", iso_3166 = "ST", cc = "+239", lang = "pt", currency = "Q193712", country = "Svatý Tomáš a Princův ostrov" }, Q792 = { cont = "na", iso_3166 = "SV", cc = "+503", lang = "es", currency = "Q4917", country = "Salvador" }, Q858 = { cont = "as", iso_3166 = "SY", cc = "+963", lang = "ar", currency = "Q240468", country = "Sýrie" }, Q1050 = { cont = "af", iso_3166 = "SZ", cc = "+268", lang = "en", currency = "Q4823", country = "Svazijsko" }, Q657 = { cont = "af", iso_3166 = "TD", cc = "+235", lang = "ar", currency = "Q847739", country = "Čad" }, Q945 = { cont = "af", iso_3166 = "TG", cc = "+228", lang = "fr", currency = "Q861690", country = "Togo" }, Q869 = { cont = "as", iso_3166 = "TH", cc = "+66", lang = "th", currency = "Q177882", country = "Thajsko" }, Q863 = { cont = "as", iso_3166 = "TJ", cc = "+992", lang = "tg", currency = "Q199886", country = "Tádžikistán" }, Q574 = { cont = "as", iso_3166 = "TL", cc = "+670", lang = "pt", currency = "Q4917", country = "Východní Timor" }, Q874 = { cont = "as", iso_3166 = "TM", cc = "+993", lang = "tk", currency = "Q486637", country = "Turkmenistán" }, Q948 = { cont = "af", iso_3166 = "TN", cc = "+216", lang = "ar", currency = "Q4602", country = "Tunisko" }, Q678 = { cont = "oc", iso_3166 = "TO", cc = "+676", lang = "to", currency = "Q4613", country = "Tonga" }, Q43 = { cont = "eu", iso_3166 = "TR", cc = "+90", lang = "tr", currency = "Q172872", country = "Turecko" }, Q754 = { cont = "na", iso_3166 = "TT", cc = "+1-868", lang = "en", currency = "Q242890", country = "Trinidad a Tobago" }, Q672 = { cont = "oc", iso_3166 = "TV", cc = "+688", lang = "tvl", currency = "Q4406", country = "Tuvalu" }, Q865 = { cont = "as", iso_3166 = "TW", cc = "+886", lang = "zh", currency = "Q208526", country = "Tchaj-wan" }, Q924 = { cont = "af", iso_3166 = "TZ", cc = "+255", lang = "sw", currency = "Q4589", country = "Tanzanie" }, Q907112 = { cont = "eu", iso_3166 = "", cc = "+373", lang = "ru", currency = "Q200979", country = "Podněstří" }, -- také Podněstersko Q212 = { cont = "eu", iso_3166 = "UA", cc = "+380", lang = "uk", currency = "Q81893", country = "Ukrajina" }, Q1036 = { cont = "af", iso_3166 = "UG", cc = "+256", lang = "sw", currency = "Q4598", country = "Uganda" }, Q30 = { cont = "na", iso_3166 = "US", cc = "+1", lang = "en-us", currency = "Q4917", phoneDigits = 4, country = "Spojené státy americké" }, Q77 = { cont = "sa", iso_3166 = "UY", cc = "+598", lang = "es", currency = "Q209272", country = "Uruguay" }, Q265 = { cont = "as", iso_3166 = "UZ", cc = "+998", lang = "uz", currency = "Q487888", country = "Uzbekistán" }, Q237 = { cont = "eu", iso_3166 = "VA", cc = "+39", lang = "it", currency = "Q4916", country = "Vatikán" }, Q757 = { cont = "na", iso_3166 = "VC", cc = "+1-784", lang = "en", currency = "Q26365", country = "Svatý Vincenc a Grenadiny" }, Q717 = { cont = "sa", iso_3166 = "VE", cc = "+58", lang = "es", currency = "Q56349362", country = "Venezuela" }, Q881 = { cont = "as", iso_3166 = "VN", cc = "+84", lang = "vi", currency = "Q192090", country = "Vietnam" }, Q686 = { cont = "oc", iso_3166 = "VU", cc = "+678", lang = "en", currency = "Q207523", country = "Vanuatu" }, Q683 = { cont = "oc", iso_3166 = "WS", cc = "+685", lang = "sm", currency = "Q4588", country = "Samoa" }, Q1246 = { cont = "eu", iso_3166 = "XK", cc = "+383", lang = "sq", currency = "Q4916", country = "Kosovo" }, Q805 = { cont = "as", iso_3166 = "YE", cc = "+967", lang = "ar", currency = "Q240512", country = "Jemen" }, Q258 = { cont = "af", iso_3166 = "ZA", cc = "+27", lang = "en", currency = "Q181907", country = "Jihoafrická republika" }, Q953 = { cont = "af", iso_3166 = "ZM", cc = "+260", lang = "en", currency = "Q21596813", country = "Zambie" }, Q954 = { cont = "af", iso_3166 = "ZW", cc = "+263", lang = "en", currency = "Q4917", country = "Zimbabwe" } }, -- list of administrative entities usually outside of their home countries. -- These entities are favored over its home countries. adminEntities = { -- extraterritorial areas Q25228 = { cont = "na", iso_3166 = "AI", cc = "+1-264", lang = "en", currency = "Q26365", country = "Anguilla" }, Q25227 = { cont = "na", iso_3166 = "AN", cc = "+599", lang = "nl", currency = "Q4917", country = "Nizozemské Antily" }, Q16641 = { cont = "oc", iso_3166 = "AS", cc = "+1-684", lang = "en", currency = "Q4917", country = "Americká Samoa" }, Q21203 = { cont = "na", iso_3166 = "AW", cc = "+297", lang = "nl", currency = "Q232270", country = "Aruba" }, Q5689 = { cont = "eu", iso_3166 = "AX", cc ="+358-18", lang = "sv", currency = "Q4916", country = "Alandy" }, Q25362 = { cont = "na", iso_3166 = "BL", cc = "+590", lang = "fr", currency = "Q4916", country = "Svatý Bartoloměj" }, Q23635 = { cont = "na", iso_3166 = "BM", cc = "+1-441", lang = "en", currency = "Q210478", country = "Bermudy" }, Q26180 = { cont = "na", iso_3166 = "BQ-SE", cc = "+599", lang = "nl", currency = "Q4917", country = "Nizozemské Antily" }, -- Sint Eustatius, +599-3 Q25528 = { cont = "na", iso_3166 = "BQ-SA", cc = "+599", lang = "nl", currency = "Q4917", country = "Nizozemské Antily" }, -- Saba, +599-4 Q25396 = { cont = "na", iso_3166 = "BQ-BO", cc = "+599", lang = "nl", currency = "Q4917", country = "Nizozemské Antily" }, -- Bonaire, +599-7 Q23408 = { cont = "an", iso_3166 = "BV", cc = "", lang = "", currency = "", country = "Bouvetův ostrov" }, Q36004 = { cont = "oc", iso_3166 = "CC", cc = "+61891", lang = "en", currency = "Q259502", country = "Kokosové ostrovy" }, Q25279 = { cont = "na", iso_3166 = "CW", cc = "+599-9", lang = "nl", currency = "Q522701", country = "Curaçao" }, Q31063 = { cont = "oc", iso_3166 = "CX", cc = "+61", lang = "en", currency = "Q259502", country = "Vánoční ostrov" }, Q9648 = { cont = "sa", iso_3166 = "FK", cc = "+500", lang = "en", currency = "Q330044", country = "Falklandy" }, Q3769 = { cont = "sa", iso_3166 = "GF", cc = "+594", lang = "fr", currency = "Q4916", country = "Francouzská Guyana" }, Q25230 = { cont = "eu", iso_3166 = "GG", cc = "+44", lang = "en-gb", currency = "Q25224", country = "Guernsey" }, Q1410 = { cont = "eu", iso_3166 = "GI", cc = "+350", lang = "en", currency = "Q41429", country = "Gibraltar" }, Q223 = { cont = "na", iso_3166 = "GL", cc = "+299", lang = "kl", currency = "Q25417", country = "Grónsko" }, Q695387 = { id = "Q223" }, -- Kommuneqarfik Sermersooq Q478813 = { id = "Q223" }, -- Kommune Kujalleq Q17012 = { cont = "na", iso_3166 = "GP", cc = "+590", lang = "fr", currency = "Q4916", country = "Guadeloupe" }, Q35086 = { cont = "an", iso_3166 = "GS", cc = "+500", lang = "en", currency = "Q25224", country = "Jižní Georgie a Jižní Sandwichovy ostrovy" }, Q16635 = { cont = "oc", iso_3166 = "GU", cc = "+1-671", lang = "en", currency = "Q4917", country = "Guam" }, Q8646 = { cont = "as", iso_3166 = "HK", cc = "+852", lang = "zh", currency = "Q31015", country = "Hongkong" }, Q131198 = { cont = "oc", iso_3166 = "HM", cc = "", lang = "en", currency = "", country = "Heardův ostrov a McDonaldovy ostrovy" }, Q9676 = { cont = "eu", iso_3166 = "IM", cc = "+44", lang = "en-gb", currency = "Q25224", country = "Ostrov Man" }, Q43448 = { cont = "af", iso_3166 = "IO", cc = "+246", lang = "en", currency = "Q25224", country = "Britské indickooceánské území" }, Q785 = { cont = "eu", iso_3166 = "JE", cc = "+44", lang = "en-gb", currency = "Q25224", country = "Jersey" }, Q5785 = { cont = "na", iso_3166 = "KY", cc = "+1-345", lang = "en", currency = "Q319885", country = "Kajmanské ostrovy" }, Q737765 = { id = "Q5785" }, -- Grand Cayman Q4936407 = { id = "Q5785" }, -- Bodden Town District, Grand Cayman Q126125 = { cont = "na", iso_3166 = "MF", cc = "+590", lang = "fr", currency = "Q4916", country = "Svatý Martin (francouzská část)" }, -- French overseas collectivity Q14773 = { cont = "as", iso_3166 = "MO", cc = "+853", lang = "zh", currency = "Q241214", country = "Macau" }, Q17054 = { cont = "na", iso_3166 = "MQ", cc = "+596", lang = "fr", currency = "Q4916", country = "Martinik" }, Q13353 = { cont = "na", iso_3166 = "MS", cc = "+1-664", lang = "en", currency = "Q26365", country = "Montserrat" }, Q33788 = { cont = "oc", iso_3166 = "NC", cc = "+687", lang = "fr", currency = "Q214393", country = "Nová Kaledonie" }, Q31057 = { cont = "oc", iso_3166 = "NF", cc = "+6723", lang = "en", currency = "Q259502", country = "Norfolk" }, Q30971 = { cont = "oc", iso_3166 = "PF", cc = "+689", lang = "fr", currency = "Q214393", country = "Francouzská Polynésie" }, Q34617 = { cont = "na", iso_3166 = "PM", cc = "+508", lang = "fr", currency = "Q4916", country = "Saint Pierre a Miquelon" }, Q35672 = { cont = "oc", iso_3166 = "PN", cc = " +649", lang = "en", currency = "Q1472704", country = "Pitcairnovy ostrovy" }, Q1183 = { cont = "na", iso_3166 = "PR", cc = "+1-787", lang = "es", currency = "Q4917", country = "Portoriko" }, Q485112 = { cont = "af", iso_3166 = "SO", cc = "+252", lang = "so", currency = "Q4603", country = "Somálsko" }, Q17070 = { cont = "af", iso_3166 = "RE", cc = "+262", lang = "fr", currency = "Q4916", country = "Réunion" }, Q653514 = { id = "Q17070" }, -- Arrondissement Saint-Denis Q47045 = { id = "Q17070" }, -- Saint-Denis Q316887 = { id = "Q17070" }, -- Saint-Paul Q612189 = { id = "Q17070" }, -- Arrondissement Saint-Paul Q702426 = { id = "Q17070" }, -- Arrondissement Saint-Pierre Q192184 = { cont = "af", iso_3166 = "SH", cc = "+290", lang = "en", currency = "Q374453", country = "Svatá Helena, Ascension a Tristan da Cunha" }, -- Sonderbehandlung Tristan da Cunha, Ascension, Gough-Insel Q842829 = { cont = "eu", iso_3166 = "SJ", cc = "+47", lang = "no", currency = "Q4916", country = "Špicberky a Jan Mayen" }, Q34754 = { cont = "af", iso_3166 = "SO", cc = "+252", lang = "so", currency = "Q737384", country = "Somálsko" }, Q26273 = { cont = "na", iso_3166 = "SX", cc = "+1-721", lang = "nl", currency = "Q522701", country = "Svatý Martin (nizozemská část)" }, -- Sint Maarten Q18221 = { cont = "na", iso_3166 = "TC", cc = "+1-649", lang = "en", currency = "Q4917", country = "Turks a Caicos" }, Q129003 = { cont = "an", iso_3166 = "TF", cc = "+262", lang = "fr", currency = "Q4916", country = "Francouzská jižní a antarktická území" }, Q36823 = { cont = "oc", iso_3166 = "TK", cc = "+690", lang ="tkl", currency = "Q1472704", country = "Tokelau" }, Q16645 = { cont = "oc", iso_3166 = "UM", cc = "", lang = "en", currency = "", country = "Menší odlehlé ostrovy USA" }, Q25305 = { cont = "na", iso_3166 = "VG", cc = "+1-284", lang = "en", currency = "Q4917", country = "Britské Panenské ostrovy" }, Q11703 = { cont = "na", iso_3166 = "VI", cc = "+1-340", lang = "en", currency = "Q4917", country = "Americké Panenské ostrovy" }, Q642481 = { id = "Q11703" }, -- Saint Croix Q849441 = { id = "Q11703" }, -- Saint John Q463937 = { id = "Q11703" }, -- Saint Thomas Q35555 = { cont = "oc", iso_3166 = "WF", cc = "+681", lang = "fr", currency = "Q214393", country = "Wallis a Futuna" }, Q17063 = { cont = "af", iso_3166 = "YT", cc = "+262", lang = "fr", currency = "Q4916", country = "Mayotte" }, -- terrae nullius Q620634 = { cont = "af", iso_3166 = "", cc = "", lang = "ar", currency = "", country = "Bir Tawil" }, -- Antarctica Q140948 = { cont = "an", iso_3166 = "", cc = "", lang = "en", currency = "", country = "Jižní Shetlandy" }, } } hilpf5mbvi705615uxrs8263urekabv Modul:UrlCheck 828 1350 22099 17255 2026-05-20T11:37:30Z LiMr 96 aktualizace na novější verzi 22099 Scribunto text/plain -- kopie z německých wikicest (https://de.wikivoyage.org/w/index.php?title=Modul:UrlCheck&oldid=1775630) -- copy from dewikivoyage (https://de.wikivoyage.org/w/index.php?title=Modul:UrlCheck&oldid=1775630) -- module variable and administration local uc = { moduleInterface = { suite = 'UrlCheck', serial = '2026-05-17', item = 40849609 } } function uc.ip4( address ) local parts = { address:match( '(%d+)%.(%d+)%.(%d+)%.(%d+)' ) } if #parts == 4 then for key, value in pairs( parts ) do if tonumber( value ) < 0 or tonumber( value ) > 255 then return false end end return true -- ok end return false end function uc.isUrl( url, skipPathCheck ) -- return codes 0 through 2 reserved if not url or type( url ) ~= 'string' then return 3 end local s = mw.text.trim( url ) if s == '' then return 3 elseif #s > 2048 then -- limitation because of search engines or IE return 4 elseif s:find( '%s' ) or s:find( '%c' ) or s:match( '^%.' ) then return 5 end -- https://max:muster@www.example.com:8080/index.html?p1=A&p2=B#ressource -- protocol local count s, count = s:gsub( '^https?://', '' ) if count == 0 then s, count = s:gsub( '^//', '' ) end if count == 0 then -- missing or wrong protocol return 6 end local aPath = '' local user local password local host local port local topLevel -- split path from host local at = s:find( '/' ) if at then aPath = s:sub( at + 1, #s ) s = s:sub( 1, at - 1 ) if not s then return 7 end end -- path check if not skipPathCheck and aPath ~= '' then if not aPath:match( "^[-A-Za-z0-9_.,~%%%+&:;#*?!'=()@/\128-\255]*$" ) then return 23 end end if s:find( '%.%.' ) or s:find( '%.@' ) or s:find( '@[%.%-]' ) or s:find( '%-%.' ) or s:find( '%.%-' ) or s:find( '%./' ) or s:find( '/%.' ) then return 8 end -- user and password s, count = s:gsub( '@', '@' ) if count > 1 then return 9 elseif count == 1 then at = s:find( '@' ) user = s:sub( 1, at - 1 ) host = s:sub( at + 1, #s ) if not user or not s then return 10 end user, count = user:gsub( ':', ':' ) if count > 1 then return 11 elseif count == 1 then at = user:find( ':' ) password = user:sub( at + 1, #user ) user = user:sub( 1, at - 1 ) if not user or not password then return 12 elseif #user > 64 then return 13 end end else host = s end if host == '' then return 14 end -- host and port host, count = host:gsub( ':', ':' ) if count > 1 then return 15 elseif count == 1 then at = host:find( ':' ) port = host:sub( at + 1, #host ) host = host:sub( 1, at - 1 ) if not host or not port then return 16 elseif not port:match( '^[1-9]%d*$' ) or tonumber( port ) > 65535 then return 17 end end -- handle host part if #host > 253 then return 18 end -- getting top-level domain at = host:match( '^.*()%.' ) -- find last dot if not at then return 19 end topLevel = host:sub( at + 1, #host ) if not topLevel then return 20 end -- future: check of top-level domain if uc.ip4( host ) then -- is ip4 address return 2 elseif not ( mw.ustring.match( host, '^[ะ-๏%w%.%-]+%.%a%a+$' ) or mw.ustring.match( host, '^[ะ-๏%w%.%-]+%.xn%-%-%w%w+$' ) ) then -- Thai diacritical marks ะ (0E30) - ๏ (0E4F) return 22 elseif not ( host:match( '^[%w%.%-]+%.%a%a+$' ) or host:match( '^[%w%.%-]+%.xn%-%-%w%w+$' ) ) then return 1 -- matches domain only in UTF 8 mode end return 0 end function uc.uriEncodePath( url ) local at = url:find( '[^/]/[^/]' ) if at then local domain = url:sub( 1, at + 1 ) local aPath = url:sub( at + 2, #url ) url = domain .. mw.uri.encode( aPath, 'PATH' ) end return url end function uc.checkUrl( frame ) local args = frame.args local pArgs = frame:getParent().args args.url = args.url or pArgs.url or '' args.show = args.show or pArgs.show or '' local result = uc.isUrl( args.url, false ) if args.show:lower() == 'msg' then local ui = mw.loadData( 'Module:UrlCheck/i18n') if ui[ result ] then return ui[ result ] else return ui.unknown end end return result end function uc.encodePath( frame ) local args = frame.args local pArgs = frame:getParent().args args.url = args.url or args[ 1 ] or pArgs.url or pArgs[ 1 ] or '' return uc.uriEncodePath( args.url ) end return uc bhaco5p7902e7csdkt070t2z4tvz47t Diskuse s uživatelem:Pujcsilode 3 1844 22083 2026-05-20T09:03:40Z LiMr 96 nová sekce /* Český Krumlov - propagace */ 22083 wikitext text/x-wiki == Český Krumlov - propagace == Dobrý den, vámi přidaná informace v článku [[Český Krumlov]] je příliš propagační a vložená za komerčním účelem. Přesto se můžeme domluvit na nějakém kompromisu: * Zmíněné informace se krásně hodí do článku [[Vltava]], kde se o sjíždění Vltavy píše detailně, ale úplně tam chybí právě ta možnost, že si lze lodě někde půjčit. * Nepoužívejte prosím první osobu. Wikicesty nepůjčují lodě - to ta vaše společnost :) * V článku [[Český Krumlov]] ale může zůstat informace o tom, že existuje možnost splutí Vltavy a že se dá přímo v Českém Krumlově půjčit loď. Žádné detailnější informace o půjčovně, protože to by bylo už duplikování. Naopak tam udělat odkaz na půjčovnu do článku Vltava, kde se čtenář dozví detaily. Udělejte prosím úpravu nejpozději do konce měsíce. Děkuji [[Uživatel:LiMr|LiMr]] ([[Diskuse s uživatelem:LiMr|diskuse]]) 20. 5. 2026, 11:03 (CEST) oxc041lymnmyihcf2n3b5omadg2y7ap