Dokumentation für das Modul CountryData[Ansicht] [Bearbeiten] [Versionsgeschichte] [Aktualisieren]

Verwendungszweck

Das Modul stellt Funktion zur Bestimmung länderspezifischer Daten wie Wikidata-Qualifikator, ISO-3166-Code, Amtssprache, Landes-Telefonvorwahl und die Landeswährung zur Verfügung.

Die Werte werden teilweise aus der Tabelle Modul:CountryData/Geography bezogen, um teure Wikidata-Abfragen zu vermeiden.

Versionsbezeichnung auf Wikidata: 2025-03-12 Ok!

Benötigte weitere Module

Dieses Modul benötigt folgende weitere Module: CountryData/Currencies • CountryData/Geography • Wikidata utilities

Verwendung in anderen Modulen

Dieses Modul ist notwendig für die Ausführung folgender Module. Bei Anpassungen sollte die Funktionstüchtigkeit der folgenden Module geprüft werden. Benutze dazu auch diese Tracking-Kategorie um Fehler zu finden, die sich dann auf Artikel auswirken:

Funktionen

Für den Einsatz in den Modulen vCard / Marker

function cm.getCountryData( vcEntity ) 

Parameter: vcEntity: Wikidata-Entity oder nil.

Liefert die landesspezifischen Daten in einer Tabelle zurück.

country = { 	id = '',       -- Wikidata qualifier Q#######, string 	iso_3166 = '', -- ISO 3166-1 code, string, uppercase 	cc = '',       -- country calling code, string starting with + 	lang = '',     -- official language code ISO 639-1, string, lowercase 	currency = ''  -- currency code ISO 4217, string, uppercase } 
function cm.getCountryFromPhones( tab ) 

Bestimmung der landesspezifischen Daten anhand der Vorwahlnummern aus der Telefonnummerntabelle tab.

function cm.getAdm1st( countryId ) 

Liefert den ISO-Code 3166-2 für die Verwaltungseinheit erster Ordnung zurück. Übergeben wird die Wikidata-Id für das zugehörige Land, um sicherzustellen, dass die rechenzeitintensive Bestimmung des ISO-Codes nur bei bekanntem Land erfolgt.

function cm.getCategories( formatStr ) 

Liefert eine Zeichenkette mit den Kategorie-Links aller verwendeten Wikidata-Eigenschaften zurück.

Für den Einsatz im Modul Phone

function cm.getCountryCode() 

Liefert die Landes-Telefonvorwahl als Zeichenkette zurück.

function cm.setLanguageParams( langCode, wikiLang, country ) 
Fügt in die Tabelle country sprachspezifische Angaben wie den ISO-Sprachcode langCode, die Sprachbezeichnung in der Wiki-Sprache und die Schreibrichtung ein.
Hinweise
-- CountryData module  -- module variable and administration local cm = { 	moduleInterface = { 		suite  = 'CountryData', 		serial = '2025-03-12', 		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, country in pairs( cgTab ) do 			if country.cc and country.cc ~= '' then 				ccodes[ country.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