Commit a5427491 authored by jon r's avatar jon r
Browse files

README : revamp

parent 374bb76a
# TransforMap-Viewer
# Berliner Gartenkarte 2017
This is a Web-Map plugin that aims at displaying data from the [TransforMap API](https://github.com/TransforMap/data.transformap.co). It offers dynamic filters, which are built from a Wikibase graph hosted on [base.transformap.co](https://base.transformap.co).
What you are finding here is the source code repository of Berlin's urban agriculture map. It displays the field of intercultural, community and plentiful other forms of urban gardening initatives. It is live on [`gartenkarte.de`](http://gartenkarte.de).
## Features
![](./docs/assets/gartenkarte.de.jpg)
* Displays geoJSON Points
* Clustering via [PruneCluster](https://github.com/SINTEF-9012/PruneCluster)
* Popup with image display, special support for Mediawiki storage
* Filtering system, builds filter menu out of RDF graph provided by Wikibase
The software is derived from the [TransforMap Viewer](https://github.com/TransforMap/transformap-viewer/) ([demo](http://viewer.transformap.co/)) and is accompanied by a data transformation strategy, custom icons and integration with other services from the [Transformaps ecosystem](https://discourse.transformap.co/t/introducing-the-transformap-testbed-architecture/1273). This web map displays data from the [TransforMap data service](https://github.com/TransforMap/data.transformap.co) and uses dynamic filters which are curated in a [wiki database](https://base.transformap.co).
## Embedding
## Communication
To embed the TransforMap-Viewer into your own website, the simplest way is via an iframe:
To get in touch with the maintainers of this project, you have several options. If you want to report a technical deficiency, please adhere to [the issue tracker](https://github.com/gartenkarte/gartenkarte-2017/issues). For all other subjects, feel free to reach out
<iframe width="1200" height="500" src="http://viewer.transformap.co/#5/51.166/10.451"></iframe>
* in the [`#transformaps-development:matrix.allmende.io`](https://riot.allmende.io/#/room/#transformaps-development:matrix.allmende.io) Riot chat messaging channel.
* in the [Transformaps Discourse](https://discourse.transformap.co/) community bulletin board.
* on [Twitter @transformap](https://twitter.com/transformap).
You can change the background layer via the param "background" (e.g. src="http://viewer.transformap.co/?background=mapnik#5/51.166/10.451"). Currently 4 layers are supported:
* background=stamen_terrain_bg : Default, only terrain without any labels, roads or buildings.
* background=stamen_terrain : terrain with (a few) labels, roads and buildings later
* background=mapnik : Default OpenStreetMap 'Mapnik'/'OSM-Carto' style
* background=hot : Humanitarian OSM style. Temperate colors, very detailed.
## Documentation
If you want to change anything else, e.g. color scheme or the displayed data, fork it and embed it from your fork's gh-pages.
A rolling documentation is written in the textpad [`gartenkarte-2017-web`](https://hack.allmende.io/gartenkarte-2017-web).
Further documents reside [in the `docs/` subdirectory](./docs/README.md).
## Translations
## License
Translation for the filter-menu are directly fetched from Wikibase. All other strings are are handled via [weblate.transformap.co](https://weblate.transformap.co/projects/transformap-viewer/transformap-viewer-textsnipplets/). You can help translating, just sign up! It stores its translations here: https://github.com/TransforMap/transformap-viewer-translations.
This repository is licensed under the WTFPL. See the LICENCE file in this repository for details. Please take this exemplary excerpt to grasp its coverage:
Note: The English translations are handled in the source repository directly.
To add new strings, you have to add them currently manually to scripts/map.js and in the translation repository, to each of the language files in json/*.json.
# Development
## Data flows
This service relies heavily on different linked data backends, see flowchart:
![Flowchart showing the services involved](TM-Viewer-dataflow.png)
## CSS
Is created via [less](http://lesscss.org/).
Do not edit the CSS file in styles/css/style.css, edit styles/less/style.less and compile to css.
Install node *less* compiler to convert the stylesheet to less css:
* Debian: `aptitude install node-less`
Compile it via :
lessc -x styles/less/style.less styles/css/style.css
## Dependencies
Install *bower* from npm:
[sudo] npm install -g bower
Debian: install npm:
[sudo] aptitude install npm nodejs-legacy
Fetch external dependencies:
bower install
## Deployment
The site http://viewer.transformap.co/ is actually hosted at github.io. Just push the branch gh-pages to update the site.
Notes: for libraries used with bower, add a static copy of the files to the gh-pages branch to its location in bower_components/ (and add an exception to the .gitignore-file).
### build concatenated and minified js/css
Run `npm install` once to install needed development dependencies.
Then, run `npm run build` each time js and/or css has been changed to update the content in the `/dist` folder.
## Coding Style guide
We use spaces (2) instead of tabs, please also use this convention.
## Forks
Currently, there are 3 "branches" of development:
* http://viewer.transformap.co/ - "master" branch, [this](https://github.com/TransforMap/transformap-viewer) repo.
* https://susy-mapviewer.github.io/transformap-viewer/ for embedding into the [solidarityeconomy.eu](http://solidarityeconomy.eu) site. Repo see [here](https://github.com/susy-mapviewer/transformap-viewer).
* https://susy-partners.github.io/transformap-viewer/ for embedding into the websites of SUSY-partners. Repo see [here](https://github.com/susy-partners/transformap-viewer).
> **DO WHAT THE FUCK YOU WANT**
## 2. User Manual
This user manual presents the functions of the Gartenkarte which are accessible to end users. Below the aspects of *filtering*, *embedding* and *editing* the map are covered.
> ![](./assets/gartenkarte.de.jpg)
>
> [Berliner Gartenkarte 2017](https://github.com/gartenkarte/gartenkarte-2017/)
### Filtering
On a desktop computer, the left side of the screen shows a list of *garden types* which you can select or deselct to filter the displayed points of interest.
Mobile devices show you buttons to collapse and expand the filter view, which is on these shown atop the map.
These filters are built from a collaborative database.
### Embedding
To embed the Gartenkarte into your website, you can use an `<iframe />`:
<iframe width="960" height="720" src="http://gartenkarte.de" />
You can switch the background layer via the URL parameter "background", e.g. `src="http://gartenkarte.de/?background=mapnik#5/51.166/10.451"`. These four layers are supported:
* `background=stamen_terrain_bg` Default, only terrain without any labels, roads or buildings.
* `background=stamen_terrain` terrain with (a few) labels, roads and buildings later
* `background=mapnik` Default OpenStreetMap 'Mapnik'/'OSM-Carto' style
* `background=hot` Humanitarian OSM style. Temperate colors, very detailed.
For other changes you need to adapt the source code.
### Editing
When you log in to the site, the popups that are shown after clicking on a map marker will contain an edit button that sends you to the `transformap-editor` with the point in question.
### 2.1. Localisation notes
> [Berliner Gartenkarte 2017](https://github.com/gartenkarte/gartenkarte-2017/)
#### Translations
Translation for the filter-menu are directly fetched from Wikibase. All other strings are are handled via [weblate.transformap.co](https://weblate.transformap.co/projects/transformap-viewer/transformap-viewer-textsnipplets/). You can help translating, just sign up! It stores its translations here: https://github.com/TransforMap/transformap-viewer-translations.
Note: The English translations are handled in the source repository directly.
To add new strings, you have to add them currently manually to scripts/map.js and in the translation repository, to each of the language files in json/*.json.
#### What can be translated
* Filter Menu
* (later): Informational Texts about each Category/Type of Initiative
* Random Strings (headings, like e.g. "Address" in the popups)
* If it is a common thing, use Wikidata?
* fall back to Weblate?
* In the Popup: -OK
* description of initiative in different language
#### Weblate
* can be used with Github directly
* its ssh-key must be added (to repo?)
* (and user configured?
* github host key in Weblate -OK and checked
* create project -OK
* creating component
* Failed to fetch repository: Could not create directory '/home/weblate/.ssh
* difference bilingual/monolingual?
* only monolingual supported with JSON
* format
filename called `json/$LANGCODE.json`, e.g. `de.json`
```
{
"English Text %d" : "Deutscher Text",
"stuff" : ""
}
```
#### language switcher
* that is set first on
* the user's preferred language
* can be set manually to any lang
* which langs do we support?
* should be generated out of
* https://base.transformap.co/wiki/Special:EntityData/Q5.json .entities.P5.labels.$keys
design: flag symbol,
* on hover open sidewards to display language string
* on click open downwards to choose lang from ... how many?
* mobile: open full-screen
Flag symbol:
* get "en" -> Wikidata -> get country -> get flag?
* is P31 of Q34770 (Einzelsprache)
* P218 is "de"
* gib mir P495 (ursprungsland)
* -> P41 (Flagge)
* wir wollen: Text und Link zur Flatte
* intermediate vars:
* Ursprungsland
* Sprachobjekt
* . query:
* return Ursprungsland of lang object with Lang Label
* query
* return P41 of Ursprungsland
* ==> http://tinyurl.com/zvnb3tw
* funktionierte GENAU bei deutsch, da nur bei 3 Ursprungsland gesetzt ist und nur DE die Flagge gesetzt hat
* Wir können zumindest die Namen der Anderen Sprachen in Landessprache Anzeigen?
* bringt das was, wenn sich wer verklickt hat sieht er die anderen auch in Farsi? -> blöd
* Alle Labels in En?
* Besser: Alle Labels in ihrer eigenen Sprache!
* sind dann N queries? oder lassen sich die in eine tun...
* oder alle Labels in Englisch?
* Hm ... es wär blöd flaggen für Sprachen zu verwenden, die in mehreren Ländern gesprochen werden ... die sich Ev. nicht mögen.
* Und es gibt wohl keine offiziellen Flaggen pro Sprache
* garkeine Flaggen verwenden, nur die Namen!
```
https://query.wikidata.org/bigdata/namespace/wdq/sparql?query=%23language%20and%20flags%0ASELECT%20%3Flang%20%3FlangLabel%20%3Fkuerzel%0AWHERE%0A%7B%0A%20%20%3Flang%20wdt%3AP218%20%3Fkuerzel%3B%0A%20%20FILTER%20regex%20(%3Fkuerzel%2C%20%22%5E(de%7Cfr%7Cen)%24%22).%0A%20%20%20%20%20%0A%20%20SERVICE%20wikibase%3Alabel%20%7B%20bd%3AserviceParam%20wikibase%3Alanguage%20%22en%22.%20%7D%0A%7D%0AORDER%20BY%20%3Flang
```
* We have fallback languages -OK
* e.g. de_AT -> de -> en (en is always last)
* Put such option in a menu for mobile (=) ?
* or disable althogether?
### 2.2. Vocabulary
> [Berliner Gartenkarte 2017](https://github.com/gartenkarte/gartenkarte-2017/)
The vocabulary is created and translated at https://base.transformap.co/wiki/Special:AllPages?from=&to=&namespace=120
It is then exported (currently manually) to a blazgraph RDF database, which serves the taxonomy as RDF.
The RDF interface is here: https://query.base.transformap.co/bigdata/#namespaces
How to update the taxonomy in the RDF DB:
```
ssh root@rancher
cd /srv/wikibase/
date=$(date -I)
docker run -it --rm --env-file /srv/wikibase/mediawiki.env -v /srv/docker-state/wikibase/mediawiki/rootfs/data:/data -v /srv/docker-state/wikibase/mediawiki/rootfs/conf:/conf -v /srv/wikibase/LocalSettings.php:/data/LocalSettings.php --link="wikibase_database_1:database" --net="wikibase_backend" wikibase_mediawiki /usr/bin/php /var/www/html/extensions/Wikibase/repo/maintenance/dumpRdf.php | gzip -c > $date_wikibase_dump.ttl.gz
```
#### Get the dump to your local machine
sftp root@rancher:/srv/wikibase/$date_wikibase_dump.ttl.gz localhost
#### Upload it to the RDF store
The next steps are to be done in the web interface of the data base.
We first need to delete the old DB (there would be duplicate values if we just dump in the new extract)
Go to https://query.base.transformap.co/bigdata/#namespaces
1. clone the transformap namespace to a copy "tm2" or something like that
* click "clone"
2. enter the name in the box on the bottom
* click "create namespace"
3. delete the "transformap" namespace
* clone the copy to "transformap"
4. for the "transformap" namespace, click "Use"
Go to https://query.base.transformap.co/bigdata/#update
1. Choose File
2. Type RDF Data , Turtle
3. click 'update'
#### Backup
A fallback of taxonomy is served from the repository at https://github.com/TransforMap/transformap-viewer-translations
In there is a folder named 'taxonomy-backup/'.
```
git clone https://github.com/TransforMap/transformap-viewer-translations.git
cd taxonomy-backup/
```
In this folder is a README.md. At the bottom of it is a chain of commands to download the taxonomy for each language.
```
cd susy/
```
In the `susy/` folder execute the `for` loop found in the README from `taxonomy-backup/`.
```
git status # to see what has been updated
git add *
git commit -m "taxonomy fallback update"
git push
```
The updated taxonomy is then live for the `transformap-viewer`.
### 2.3. Development notes
> [Berliner Gartenkarte 2017](https://github.com/gartenkarte/gartenkarte-2017/)
#### Setup
For this to work you need to have a working Node.JS installation with NPM. We suggest to use [NVM](http://nvm.sh) for managing versions and updates.
First clone the repository to your local computer:
git clone https://github.com/gartenkarte/gartenkarte-2017.git
and change directory `cd gartenkarte-2017`. If your only wish is to serve the site, you are basically done. Skip the next section and read on at [deployment](#deployment).
#### Developing
Run `npm install` once to install needed development dependencies.
### build concatenated and minified js/css
Then, run `npm run build` each time js and/or css has been changed to update the content in the `/dist` folder.
## CSS
Is created via [less](http://lesscss.org/).
Do not edit the CSS file in styles/css/style.css, edit styles/less/style.less and compile to css.
Install node *less* compiler to convert the stylesheet to less css:
* Debian: `aptitude install node-less`
Compile it via :
lessc -x styles/less/style.less styles/css/style.css
##### Data flows
This service relies heavily on different linked data backends, see flowchart:
![Flowchart showing the services involved](TM-Viewer-dataflow.png)
##### Style guide
We use spaces (2) instead of tabs, please also use this convention.
#### Distribution
#### Deployment
The site can be deployed with any HTTP server that serves static content. Instructions about how to set these up to serve from this repository can be found within their respective user manuals.
Originally deployed via GitHub pages, the `gh-pages` branch has been deprecated in favour of an always deployable `master`. It is prepared to be served as a static site via Dokku
### 2.4. Data processing
> [Berliner Gartenkarte 2017](https://github.com/gartenkarte/gartenkarte-2017/)
These steps represent the phase of interactively exploring the source data set. These commands eventually condensed into the scripts found within the `scripts/` directory.
## Data preparation
```
# Get raw data, CSV generated with Microsoft Excel
wget -O 20160418_stadtacker_gaerten.csv https://discourse.transformap.co/uploads/default/original/1X/bf3b2aa34e93becb84ab94482902f5cb30e42a06.csv
# Create working copy, leave source intact
cp 20160418_stadtacker_gaerten.csv 20170807_stadtacker.csv
# Convert from latin1 to utf-8 after opening
# :set fileencoding=utf-8
# Adapt header values (lower-case, english)
# :x
vim 20170807_stadtacker.csv
# convert line endings
dos2unix 20170807_stadtacker.csv
# manually clean from <96>, line breaks, ...
# :x
vim 20170807_stadtacker.csv
# convert metric into imperial numbers
perl -0777 -pe 's/(?<=[0-9]),(?=[0-9])/./g' 20170807_stadtacker.csv
# Generate GeoJSON
# csv2geojson --lat "lat" --lon "lon" --delimiter ";" 20170807_stadtacker.csv > 20170807_stadtacker.json
```
## Data analysis
```
# Get a list of all combinations of types
cat 20170807_stadtacker.json | jq -r '.features | map(.properties.types) | .[]' | sort -u > 20170807_stadtacker_types.txt
# Filter type list for occurencies of types, including number
perl -0777 -pe 's/(?<=\d);#/\n/g' 20170807_stadtacker_types.txt | sort -u
# Filter type list for occurencies of types, excluding number
perl -0777 -pe 's/(?<=\d);#/\n/g' 20170807_stadtacker_types.txt | sort -u | perl -0777 -pe 's/;#\d{1,2}|"//g'
```
## Data cleaning
```
# Extract id and type mappings
cat 20170807_stadtacker.json | jq -r '[.features | map(.properties) | to_entries[] | {"id": .value.id, "types": .value.types}]' > 20170807_stadtacker_raw_tags.json
# Get a similarily ordered array with tags
cat 20170807_stadtacker.json | jq -r '.features | map(.properties.types | split(";#") )'
# Have an addressable object with tags
cat 20170807_stadtacker.json | jq -r '[ .features | map (.properties.types | split(";#") ) | to_entries[] ] | reduce .[] as $i ({}; .[$i.key|tostring] = $i.value)' > 20170807_stadtacker_key_tags.json
# Receive a linked list of id to key mappings
cat 20170807_stadtacker.json | jq -r '[ .features | map(.properties) | to_entries[] | {"id": .value.id, "key": .key|tostring} ] | {"list": .}' > 20170807_stadtacker_linked_list_id_key.json
# Get a JSON array with the ids
cat 20170807_stadtacker.json | jq -r '.features | map(.properties.id) | { ids: . }' > 20170807_stadtacker_ids.json
# Get a JSON array with the respective tags
cat 20170807_stadtacker.json | jq -r '.features | map (.properties.types | split(";#") ) | { tags: . }' > 20170807_stadtacker_tags.json
```
```
# check for lines without coordinates
grep ";;;" .csv
```
## 2. Technical Supplements
> [Berliner Gartenkarte 2017](https://github.com/gartenkarte/gartenkarte-2017/)
This section of the documentation contains supplements from development. Aspects covered are:
1. [Localisation](./021_localisation.md)
2. [Taxonomy](./022_vocabulary.md)
3. [Development](./023_development.md)
4. [Data](./024_data.md)
## Features
* Displays point `Features` in GeoJSON `FeatureCollections`
* Points are clustered in higher zoom levels
* Clicking a point displays a popup with image, if given
* Filtering system based on a Wikibase vocabulary
The taxonomy is created and translated at https://base.transformap.co/wiki/Special:AllPages?from=&to=&namespace=120
It is then exported (currently manually) to a blazgraph RDF database, which serves the taxonomy as RDF.
The RDF interface is here: https://query.base.transformap.co/bigdata/#namespaces
How to update the taxonomy in the RDF DB:
ssh root@rancher (server at ecobytes) - ask Ecobytes people to execute this if you don't have access
cd /srv/wikibase/
docker run -it --rm --env-file /srv/wikibase/mediawiki.env -v /srv/docker-state/wikibase/mediawiki/rootfs/data:/data -v /srv/docker-state/wikibase/mediawiki/rootfs/conf:/conf -v /srv/wikibase/LocalSettings.php:/data/LocalSettings.php --link="wikibase_database_1:database" --net="wikibase_backend" wikibase_mediawiki /usr/bin/php /var/www/html/extensions/Wikibase/repo/maintenance/dumpRdf.php | gzip -c > $date_wikibase_dump.ttl.gz
# copy dump to your local PC
scp root@rancher:/srv/wikibase/ $date_wikibase_dump.ttl.gz localhost:
# next steps to be done in the WebIf
We first need to delete the old DB (there would be duplicate values if we just dump in the new extract)
go to https://query.base.transformap.co/bigdata/#namespaces
clone the transformap namespace to a copy "tm2" or something like that
click "clone"
enter the name in the box on the bottom
click "create namespace"
delete the "transformap" namespace
clone the copy to "transformap"
for the "transformap" namespace, click "Use"
go to https://query.base.transformap.co/bigdata/#update
Choose File
Type RDF Data , Turtle
click 'update'
the taxonomy is (currently) served from this repository: https://github.com/TransforMap/transformap-viewer-translations
there is a folder named 'taxonomy-backup/'. In there is a folder 'susy', where the taxonomy (for each language) is stored in JSON form.
clone this repository
cd taxonomy-backup/
# in this folder is a README.md: at the bottom is a chain of commands to download the taxonomy for each language
cd susy/
# in the susy/ - folder, execute the 'for' loop found in the README-file in taxonomy-backup/
git status # to see what has been updated
git add *
git commit -m "taxonomy fallback update"
git push
the updated taxonomy is now live on the transformap-viewer
# Gartenkarte 2017
# Documentation
## Datenaufbereitung
> [Berliner Gartenkarte 2017](https://github.com/gartenkarte/gartenkarte-2017/)
```
# Get raw data, CSV generated with Microsoft Excel
wget -O 20160418_stadtacker_gaerten.csv https://discourse.transformap.co/uploads/default/original/1X/bf3b2aa34e93becb84ab94482902f5cb30e42a06.csv
# Create working copy, leave source intact
cp 20160418_stadtacker_gaerten.csv 20170807_stadtacker.csv
# Convert from latin1 to utf-8 after opening
# :set fileencoding=utf-8
# Adapt header values (lower-case, english)
# :x
vim 20170807_stadtacker.csv
# convert line endings
dos2unix 20170807_stadtacker.csv
# manually clean from <96>, line breaks, ...
# :x
vim 20170807_stadtacker.csv
# convert metric into imperial numbers
perl -0777 -pe 's/(?<=[0-9]),(?=[0-9])/./g' 20170807_stadtacker.csv
# Generate GeoJSON
# csv2geojson --lat "lat" --lon "lon" --delimiter ";" 20170807_stadtacker.csv > 20170807_stadtacker.json
```
Welcome to the documentation of Berlin's urban agriculture map!
## Datenanalyse
Depending on your intentions to interact with it, you can choose to read in the **User Manual** or discover the **Technical Notes**.
```
# Get a list of all combinations of types
cat 20170807_stadtacker.json | jq -r '.features | map(.properties.types) | .[]' | sort -u > 20170807_stadtacker_types.txt
# Filter type list for occurencies of types, including number
perl -0777 -pe 's/(?<=\d);#/\n/g' 20170807_stadtacker_types.txt | sort -u
# Filter type list for occurencies of types, excluding number
perl -0777 -pe 's/(?<=\d);#/\n/g' 20170807_stadtacker_types.txt | sort -u | perl -0777 -pe 's/;#\d{1,2}|"//g'
```
## Datenbereinigung
```
# Extract id and type mappings
cat 20170807_stadtacker.json | jq -r '[.features | map(.properties) | to_entries[] | {"id": .value.id, "types": .value.types}]' > 20170807_stadtacker_raw_tags.json
# Get a similarily ordered array with tags
cat 20170807_stadtacker.json | jq -r '.features | map(.properties.types | split(";#") )'
# Have an addressable object with tags
cat 20170807_stadtacker.json | jq -r '[ .features | map (.properties.types | split(";#") ) | to_entries[] ] | reduce .[] as $i ({}; .[$i.key|tostring] = $i.value)' > 20170807_stadtacker_key_tags.json
# Receive a linked list of id to key mappings
cat 20170807_stadtacker.json | jq -r '[ .features | map(.properties) | to_entries[] | {"id": .value.id, "key": .key|tostring} ] | {"list": .}' > 20170807_stadtacker_linked_list_id_key.json
# Get a JSON array with the ids
cat 20170807_stadtacker.json | jq -r '.features | map(.properties.id) | { ids: . }' > 20170807_stadtacker_ids.json
# Get a JSON array with the respective tags
cat 20170807_stadtacker.json | jq -r '.features | map (.properties.types | split(";#") ) | { tags: . }' > 20170807_stadtacker_tags.json
```
```
# check for lines without coordinates
grep ";;;" .csv
```
1. **[User Manual](./01_user-manual.md)**
2. **[Technical Notes](./02_technical-notes.md)**
1. [Localisation](./021_localisation.md)
2. [Taxonomy](./022_vocabulary.md)
3. [Development](./023_development.md)
4. [Data](./024_data.md)
What needs to be translated:
Filter Menu
(later): Informational Texts about each Category/Type of Initiative
Random Strings (headings, like e.g. "Address" in the popups)
If it is a common thing, use Wikidata?
fall back to Weblate?
In the Popup: -OK
description of initiative in different language
Weblate
can be used with Github directly
its ssh-key must be added (to repo?)
(and user configured?
github host key in Weblate -OK and checked
create project -OK
creating component
Failed to fetch repository: Could not create directory '/home/weblate/.ssh
difference bilingual/monolingual?
only monolingual supported with JSON
format
filename called json/$LANGCODE.json, e.g. de.json
content:
{
"English Text %d" : "Deutscher Text",
"stuff" : ""
}
We need a language switcher -OK
that is set first on
the user's preferred language
can be set manually to any lang
which langs do we support?
should be generated out of
https://base.transformap.co/wiki/Special:EntityData/Q5.json .entities.P5.labels.$keys
design: flag symbol,
on hover open sidewards to display language string
on click open downwards to choose lang from ... how many?
mobile: open full-screen
Flag symbol:
get "en" -> Wikidata -> get country -> get flag?
is P31 of Q34770 (Einzelsprache)
P218 is "de"
gib mir P495 (ursprungsland)
-> P41 (Flagge)
wir wollen: Text und Link zur Flatte
intermediate vars:
Ursprungsland
Sprachobjekt
1. query:
return Ursprungsland of lang object with Lang Label
2. query
return P41 of Ursprungsland