diff --git a/src/gui/AboutDialog.cpp b/src/gui/AboutDialog.cpp
index bc3960d11..1fa50043d 100644
--- a/src/gui/AboutDialog.cpp
+++ b/src/gui/AboutDialog.cpp
@@ -44,29 +44,43 @@ static const QString aboutContributors = R"(
Sergey Vilgelm
Victor Engmark
NarwhalOfAges
+ No Name
+ SG
+ Riley Moses
+ Esteban Martinez
+ Marc Morocutti
+ Zivix
+ Benedikt Heine
+ Hugo Locurcio
+ William Petrides
+ Gunar Gessner
+ Christian Wittenhorst
+ Matt Cardarelli
+ Paul Ammann
+ Steve Isom
+ GodSpell
+ Lionel Laské
+ Daniel Epp
+ Oleksii Aleksieiev
+ Julian Stier
+ Ruben Schade
+ Bernhard
+ Wojciech Kozlowski
Caleb Currie
Morgan Courbet
Kyle Kneitinger
Chris Sohns
Shmavon Gazanchyan
xjdwc
- Riley Moses
Igor Zinovik
Jeff
- Esteban Martinez
Max Andersen
- Zivix
- Marc Morocutti
super scampy
- Hugo Locurcio
- Benedikt Heine
Mischa Peters
Rainer-Maria Fritsch
Micha Ober
Ivan Gromov
- William Petrides
Joshua Go
- Gunar Gessner
pancakeplant
Hans-Joachim Forker
Nicolas Vandemaele
@@ -75,30 +89,66 @@ static const QString aboutContributors = R"(
Mike
Thomas Renz
Toby Cline
- Christian Wittenhorst
- Paul Ammann
- Matt Cardarelli
- Steve Isom
Emre Dessoi
- Wojciech Kozlowski
Michael Babnick
kernellinux
Patrick Evans
Marco
- GodSpell
Jeremy Rubin
Korbi
andreas
Tyche's tidings
Daniel Kuebler
Brandon Corujo
+ AheroX
+ Alexandre G
+ AshinaGa
+ BYTEBOLT
+ CEH
+ Chris Stone
+ Christof Böckler
+ Claude
+ CzLer
+ Daniel Burridge
+ dark
+ Dave G
+ David Bowers
+ dickv
+ fp4
+ Huser IT Solutions GmbH
+ irf
+ Isaiah Rahmany
+ JackNYC
+ Jacob Emmert-Aronson
+ John Donadeo
+ Kosta Medinsky
+ leinad987
+ Lux
+ marek
+ mattlongname
+ mattock
+ Max Christian Pohle
+ nta/norma
+ picatsv
+ proto
+ Raymond Lau
+ Waido
+ Weinmann Willy
+ WildMage
+
+VIP GitHub Sponsors:
+
+ - mercedes-benz
+ - tiangolo
+ - mrniko
+ - rszamszur
Notable Code Contributions:
- droidmonkey
- phoerious
- - louib (CLI)
- varjolintu (Browser Integration)
+ - louib (CLI)
- hifi (SSH Agent)
- xvallspl (Tags)
- Aetf (FdoSecrets Storage Server)
@@ -109,6 +159,8 @@ static const QString aboutContributors = R"(
- brainplot (many improvements)
- kneitinger (many improvements)
- frostasm (many improvements)
+ - libklein (many improvements)
+ - w15eacre (many improvements)
- fonic (Entry Table View)
- kylemanna (YubiKey)
- c4rlo (Offline HIBP Checker)
@@ -121,179 +173,145 @@ static const QString aboutContributors = R"(
Patreon Supporters:
- - Richard Ames
- - Bernhard
- - Christian Rasmussen
- - Nuutti Toivola
- - Lionel Laské
- - Tyler Gass
- - NZSmartie
- - Darren
- - Brad
- - Oleksii Aleksieiev
- - Julian Stier
- - Daniel Epp
- - Ruben Schade
- - William Komanetsky
- - Niels Ganser
- - judd
- - Tarek Sherif
- - Eugene
- - CYB3RL4MBD4
- - Alexanderjb
- - Justin Carroll
- - Bart Libert
- Shintaro Matsushima
- - Thammachart Chinvarapon
- - Gernot Premper
- - SLmanDR
- Paul Ellenbogen
- John C
- - Markus Wochnik
- - Clark Henry
- - zapscribe
- - Salt Rock Lamp
- - Steven Crowley
- - Ralph Azucena
- - Guruprasad Kulkarni
- - jose
- - Michael Gulick
- - J Doty
- - Synchro11
- - Michael Soares
- - Johannes Felko
- - Ellie
- - David Walluscheck
- - Anthony Avina
- - pro
- - Mark Luxton
+ - Markus
- Crimson Idol
- - Björn König
- - René Weselowski
- - gonczor
+ - Steven
+ - Ellie
+ - Anthony Avina
- PlushElderGod
- - gilgwath
- - Tobias
+ - zapscribe
- Christopher Hillenbrand
- - Daddy's c$sh
- - Ashura
- - Florian
- - Alexandre
- Dave Jones
- Brett
- - Jim Vanderbilt
- - Brian McGuire
- - Sid Beske
- - Dmitrii Galinskii
- - Johannes Erchen
- - Brandon Zhang
- - Maxley Fraser
- - Nikul Savasadia
- - Claude
- - alga
- - Philipp Jetschina
+ - Ralph Azucena
+ - Florian
- Kristoffer Winther Balling
- Peter Link
- - Vlastimil Vondra
- - Tony Wang
- - John Sivak
- - Nol Aders
- - Charlie Drake
- - Ryan Goldstein
- - Doug Witt
- David S H Rosenthal
- - Lance Simmons
- - Mathew Woodyard
- - GanderPL
- - Neša
- - tolias
+ - Michael Soares
+ - Vlad Didenko
+ - henloo
+ - Erik Rigtorp
+ - Barry McKenzie
+ - Sebastian van der Est
+ - J.C. Polanycia
+ - Peter Upfold
+ - Josh Yates-Walker
- Adam
+ - HJ
+ - bjorndown
+ - Tony Wang
+ - Nol Aders
+ - Dirk Bergstrom
+ - proco
+ - Philipp Baderschneider
+ - Neša
+ - Dimitris Kogias
+ - Robin Hellsten
+ - Scott Williams
+ - klepto68
+ - Uwe S.
+ - codiflow
+ - eugene
+ - Anton Fisher
+ - David Daly
+ - Crispy_Steak
+ - Cilestin
+ - Benjamin
+ - Daniel Lakeland
+ - erinacio
+ - Leo
+ - Payton
+ - Saicxs
+ - Gorund O
+ - Tony G
+ - Simonas S.
+ - LordKnoppers
+ - Fabien Duchaussois
+ - Tim Bahnes
+ - Aleksei Gusev
+ - J Hanssen
+ - schoepp
+ - Klaus
+ - Eric
+ - Griffondale
+ - Andy D
+ - YAMAMOTO Yuji
+ - elmiko
+ - David
+ - Nate Wynd
+ - Nicolas
+ - magila
+ - Bryan Fisher
+ - Mark Nicholson
+ - Asperatus
+ - Patrick Buchan-Hepburn
+ - Richárd Faragó
+ - David Koch
+ - cheese_cake
+ - duke_money
+ - lund
+ - Ivana Kellyer
+ - Skullzam
+ - Chris Bier
+ - Gustavo
+ - Henning_IdB
+ - Edd
+ - Net
+ - Sergei Slipchenko
+ - Amanita
+ - Gaara
+ - Max
+ - 5h4d3
+ - James Taylor
+ - Alexei Bond
+ - cck
+ - David L
+ - devNull
+ - Erica
+ - Matthew O
+ - Druggo Yang
+ - Eric Stokes
+
+GitHub Sponsors:
+
+ - rszamszur
+ - Sidicas
+ - Mr-NH
Translations:
- - العربية (Arabic): 3eani, 3nad, AboShanab, butterflyoffire_temp, jBailony, kmutahar, m.hemoudi,
- Marouane87, microtaha, mohame1d, muha_abdulaziz, Night1, omar.nsy, TheAhmed, zer0x
- - euskara (Basque): azken_tximinoa, Galaipa, Hey_neken, porrumentzio
- - বাংলা (Bengali): codesmite, Foxom, rediancool, RHJihan
- - ဗမာစာ (Burmese): Christine.Ivy, hafe14, Snooooowwwwwman, tuntunaung
- - català (Catalan): antoniopolonio, benLabcat, capitantrueno, dsoms, Ecron, jamalinu, jmaribau,
- MarcRiera, mcus, raulua, zeehio, ZJaume
- - 中文 (Chinese (Simplified)): Biacke, Biggulu, Brandon_c, carp0129, Clafiok, deluxghost, Dy64,
- ef6, Felix2yu, hoilc, jy06308127, kikyous, kofzhanganguo, ligyxy, lxx4380, oksjd, remonli, ShuiHuo, sjdhome,
- slgray, Small_Ku, snhun, umi_neko, vc5, Wylmer_Wang, Z4HD
- - 中文 (台灣) (Chinese (Traditional)): BestSteve, Biacke, flachesis, gojpdchx, ligyxy, MiauLightouch,
- plesry, priv, raymondtau, Siriusmart, Small_Ku, ssuhung, Superbil, th3lusive, yan12125, ymhuang0808
- - hrvatski jezik (Croatian): krekrekre, mladenuzelac
- - čeština (Czech): DanielMilde, jiri.jagos, pavelb, pavelz, S474N, stps, tpavelek, vojtechjurcik
- - dansk (Danish): alfabetacain, dovecode, ebbe, ERYpTION, GimliDk, Grooty12, JakobPP, KalleDK,
- MannVera, nlkl, Saustrup, thniels
- - Nederlands (Dutch): apie, bartlibert, Bubbel, bython, Dr.Default, e2jk, evanoosten, fourwood,
- fvw, glotzbach, JCKalman, keunes, KnooL, ms.vd.linden, ovisicnarf, pietermj, pvdl, rigrig, srgvg, Stephan_P,
- stijndubrul, theniels17, ThomasChurchman, timschreinemachers, Vistaus, wanderingidea, Zombaya1
- - Esperanto (Esperanto): batisteo
- - eesti (Estonian): Hermanio, okul, sarnane, tlend, V6lur
- - suomi (Finnish): artnay, hif1, MawKKe, petri, tomisalmi, uusijani, varjolintu
- - français (French): ayiniho, Beatussum, butterflyoffire_temp, Cabirto, francoisa, iannick,
- jean_pierre_raumer, John.Mickael, Jojo6375, lacnic, Marouane87, mohame1d, orion78fr, stephanecodes, swarmpan,
- t0mmy742, Takeçi, tenzap, webafrancois, x0rld
- - Galego (Galician): damufo, enfeitizador, mustek
- - Deutsch (German): andreas.maier, antsas, archer_321, ASDFGamer, Atalanttore, BasicBaer, blacksn0w,
- bwolkchen, Calyrx, clonejo, codejunky, DavidHamburg, eth0, fahstat, FlotterCodername, for1real, frlan, funny0facer,
- Gyges, h_h, Hativ, heynemax, hjonas, HoferJulian, hueku, janis91, jensrutschmann, jhit, joe776, kflesch, man_at_home,
- marcbone, MarcEdinger, markusd112, Marouane87, maxwxyz, mcliquid, mfernau77, mircsicz, montilo, MuehlburgPhoenix,
- muellerma, nautilusx, neon64, Nerzahd, Nightwriter, noodles101, NotAName, nursoda, OLLI_S, omnisome4, origin_de,
- pcrcoding, PFischbeck, phallobst, philje, pqtjhhBzDd5NuJ9, r3drock, rakekniven, revoltek, rgloor, Rheggie, RogueThorn,
- rugk, ScholliYT, scotwee, Silas_229, spacemanspiff, SteffoSpieler, testarossa47, TheForcer, thillux, transi_222, traschke,
- Unkn0wnCat, vlenzer, vpav, waster, wolfram.roesler, Wyrrrd, xf
- - ελληνικά (Greek): anvo, arttor, Dkafetzis, giwrgosmant, GorianM, Jason_M, magkopian, nplatis, saglogog,
- tassos.b, xinomilo
- - עברית (Hebrew): avimar, ronyala, shemeshg, shmag18, ThunderB0lt, tryandtry, ztwersky
- - magyar (Hungarian): andras_tim, bubu, entaevau, kempelen, meskobalazs, spammy, typingseashell, urbalazs
- - Íslenska (Icelandic): MannVera
- - Bahasa Indonesia (Indonesian): achmad, algustionesa, bora_ach, racrbmr, zk
- - Italiano (Italian): aleb2000, amaxis, bovirus, duncanmid, FranzMari, Gringoarg, idetao, lucaim, NITAL, Peo,
- Pietrog, salvatorecordiano, seatedscribe, Stemby, the.sailor, tosky, VosaxAlo
- - 日本語 (Japanese): AlCooo, gojpdchx, helloguys, masoo, p2635, Shinichirou_Yamada, shortarrow, ssuhung, tadasu,
- take100yen, Umoxfo, vargas.peniel, vmemjp, WatanabeShint, yukinakato
- - қазақ тілі (Kazakh): sotrud_nik
- - 한국어 (Korean): BraINstinct0, cancantun, peremen
- - latine (Latin): alexandercrice
- - latviešu valoda (Latvian): andis.luksho, victormeirans, wakeeshi
- - lietuvių kalba (Lithuanian): Kornelijus, Moo, pauliusbaulius, rookwood101, wakeeshi
- - Norsk Bokmål (Norwegian Bokmål): bkvamme, eirikl, eothred, haarek, JardarBolin, jumpingmushroom, sattor,
- torgeirf, ysteinalver
- - ਪੰਜਾਬੀ (Punjabi): aalam
- - فارسی (Farsi): gnulover, siamax
- - فارسی (Farsi (Iran)): magnifico
- - język polski (Polish): AreYouLoco, dedal123, EsEnZeT, hoek, keypress, konradmb, mrerexx, pabli, ply,
- psobczak, SebJez, verahawk
- - Português (Portuguese): diraol, hugok, pfialho, rudahximenes, weslly, xendez
- - Português (Portuguese (Brazil)): alinda, amalvarenga, andersoniop, danielbibit, diraol, fabiom, flaviobn,
- fmilagres, furious_, gabrieljcs, Guilherme.Peev, guilherme__sr, Havokdan, igorruckert, josephelias94, keeBR, kiskadee, lecalam,
- lucasjsoliveira, mauri.andres, newmanisaac, rafaelnp, ruanmed, rudahximenes, ul1sses, vitor895, weslly, wtuemura, xendez,
- zodSilence
- - Português (Portuguese (Portugal)): a.santos, American_Jesus, arainho, hds, hugok, lecalam, lmagomes, pfialho,
- smarquespt, smiguel, xendez, xnenjm
- - Română (Romanian): _parasite_, aduzsardi, alexminza, polearnik
- - русский (Russian): 3nad, _nomoretears_, agag11507, alexandersokol, alexminza, anm, artemkonenko, ashed,
- BANOnotIT, burningalchemist, cl0ne, cnide, denoos, DG, DmitriyMaksimov, egorrabota, injseon, Japet, JayDi85, KekcuHa, kerastinell,
- laborxcom, leo9uinuo98, Mogost, Mr.GreyWolf, MustangDSG, netforhack, NetWormKido, nibir, Olesya_Gerasimenko, onix, Orianti,
- RKuchma, ruslan.denisenko, ShareDVI, Shevchuk, solodyagin, talvind, treylav, upupa, VictorR2007, vsvyatski, wakeeshi, Walter.S,
- wkill95, wtigga, zOrg1331
- - српски језик (Serbian): ArtBIT, ozzii
- - Slovenčina (Slovak): Asprotes, crazko, jose1711, l.martinicky, pecer, reisuya, Slavko
- - Slovenščina (Slovenian): asasdasd, samodekleva
- - Español (Spanish): adolfogc, antifaz, capitantrueno, cquike, cyphra, DarkHolme, doubleshuffle, e2jk,
- EdwardNavarro, fserrador, gabeweb, gonrial, jjtp, jorpilo, LeoBeltran, mauri.andres, piegope, pquin, puchrojo, rodolfo.guagnini,
- tierracomun, vsvyatski
- - Svenska (Swedish): 0x9fff00, aiix, Anders_Bergqvist, ArmanB, Autom, baxtex, eson, henziger, jpyllman, malkus,
- merikan, peron, peterkz, Thelin, theschitz, victorhggqvst
- - ไทย (Thai): arthit, ben_cm, chumaporn.t, darika, digitalthailandproject, GitJirasamatakij, ll3an, minoplhy,
- muhammadmumean, nimid, nipattra, ordinaryjane, rayg, sirawat, Socialister, Wipanee
- - Türkçe (Turkish): abcmen, ahmed.ulusoy, cagries, denizoglu, desc4rtes, etc, ethem578, kayazeren, mcveri, N3pp,
- rgucluer, SeLeNLeR, sprlptr48, TeknoMobil, Ven_Zallow, veysiertekin
- - Українська (Ukrainian): brisk022, chulivska, cl0ne, exlevan, m0stik, moudrick, netforhack, olko, onix, paul_sm,
- ShareDVI, upupa, zoresvit
+ - Arabic: kmutahar
+ - Chinese (China): Biggulu, Brandon_c, hoilc, ligyxy, Small_Ku, umi_neko, vc5
+ - Chinese (Taiwan): BestSteve, flachesis, MiauLightouch, Small_Ku, yan12125, ymhuang0808
+ - Czech: DanielMilde, pavelb, tpavelek
+ - English (United Kingdom): YCMHARHZ
+ - English (United States): alexandercrice, DarkHolme, nguyenlekhtn
+ - Finnish: artnay, hif1, MawKKe, varjolintu
+ - German: antsas, BasicBaer, Calyrx, codejunky, DavidHamburg, eth0, for1real, jensrutschmann,
+ joe776, kflesch, marcbone, MarcEdinger, mcliquid, mfernau77, montilo, nursoda, omnisome4, origin_de, pcrcoding,
+ rgloor, vlenzer, waster, Wyrrrd
+ - Greek: magkopian, nplatis, tassos.b, xinomilo
+ - Hungarian: bubu, meskobalazs, urbalazs
+ - Indonesian: zk
+ - Italian: amaxis, duncanmid, FranzMari, lucaim, NITAL, Peo, tosky, VosaxAlo
+ - Japanese: masoo, p2635, Shinichirou_Yamada, vmemjp, yukinakato
+ - Korean: cancantun, peremen
+ - Lithuanian: Moo
+ - Norwegian Bokmål: eothred, haarek, torgeirf
+ - Polish: keypress, mrerexx, psobczak
+ - Portuguese (Brazil): danielbibit, fabiom, flaviobn, newmanisaac, vitor895, weslly
+ - Portuguese (Portugal): a.santos, American_Jesus, hds, lmagomes, smarquespt
+ - Romanian: alexminza
+ - Russian: _nomoretears_, agag11507, alexminza, anm, artemkonenko, denoos, KekcuHa, Mogost,
+ netforhack, NetWormKido, RKuchma, ShareDVI, talvind, VictorR2007, vsvyatski, wkill95
+ - Serbian: ArtBIT
+ - Swedish: Anders_Bergqvist, henziger, jpyllman, peron, Thelin
+ - Turkish: etc, N3pp
+ - Ukrainian: brisk022, netforhack, ShareDVI, zoresvit
)";
diff --git a/utils/transifex_translators.py b/utils/transifex_translators.py
index 9170f04ba..9fb51ce26 100644
--- a/utils/transifex_translators.py
+++ b/utils/transifex_translators.py
@@ -1,77 +1,70 @@
#!/usr/bin/env python3
+from collections import defaultdict
import json
-import os
+import sys
+from pathlib import Path
+from urllib import request
-# Download Transifex languages dump at: https://www.transifex.com/api/2/project/keepassxc/languages
-# Language information from https://www.wikiwand.com/en/List_of_ISO_639-1_codes and http://www.lingoes.net/en/translator/langcode.htm
+txrc = Path.home() / '.transifexrc'
+if not txrc.exists():
+ print('No Transifex config found. Run tx init first.')
+ sys.exit(1)
-LANGS = {
- "ar" : "العربية (Arabic)",
- "bn" : "বাংলা (Bengali)",
- "ca" : "català (Catalan)",
- "cs" : "čeština (Czech)",
- "da" : "dansk (Danish)",
- "de" : "Deutsch (German)",
- "el" : "ελληνικά (Greek)",
- "eo" : "Esperanto (Esperanto)",
- "es" : "Español (Spanish)",
- "et" : "eesti (Estonian)",
- "eu" : "euskara (Basque)",
- "fa" : "فارسی (Farsi)",
- "fa_IR" : "فارسی (Farsi (Iran))",
- "fi" : "suomi (Finnish)",
- "fr" : "français (French)",
- "gl" : "Galego (Galician)",
- "he" : "עברית (Hebrew)",
- "hr_HR" : "hrvatski jezik (Croatian)",
- "hu" : "magyar (Hungarian)",
- "id" : "Bahasa Indonesia (Indonesian)",
- "is_IS" : "Íslenska (Icelandic)",
- "it" : "Italiano (Italian)",
- "ja" : "日本語 (Japanese)",
- "kk" : "қазақ тілі (Kazakh)",
- "ko" : "한국어 (Korean)",
- "la" : "latine (Latin)",
- "lt" : "lietuvių kalba (Lithuanian)",
- "lv" : "latviešu valoda (Latvian)",
- "nb" : "Norsk Bokmål (Norwegian Bokmål)",
- "nl_NL" : "Nederlands (Dutch)",
- "my" : "ဗမာစာ (Burmese)",
- "pa" : "ਪੰਜਾਬੀ (Punjabi)",
- "pa_IN" : "ਪੰਜਾਬੀ (Punjabi (India))",
- "pl" : "język polski (Polish)",
- "pt" : "Português (Portuguese)",
- "pt_BR" : "Português (Portuguese (Brazil))",
- "pt_PT" : "Português (Portuguese (Portugal))",
- "ro" : "Română (Romanian)",
- "ru" : "русский (Russian)",
- "sk" : "Slovenčina (Slovak)",
- "sl_SI" : "Slovenščina (Slovenian)",
- "sr" : "српски језик (Serbian)",
- "sv" : "Svenska (Swedish)",
- "th" : "ไทย (Thai)",
- "tr" : "Türkçe (Turkish)",
- "uk" : "Українська (Ukrainian)",
- "zh_CN" : "中文 (Chinese (Simplified))",
- "zh_TW" : "中文 (台灣) (Chinese (Traditional))",
-}
+org = 'o:keepassxc'
+proj = f'{org}:p:keepassxc'
+resource = f'{proj}:r:share-translations-keepassxc-en-ts--master'
+token = [l for l in open(txrc, 'r') if l.startswith('token')][0].split('=', 1)[1].strip()
+member_blacklist = ['u:droidmonkey', 'u:phoerious']
-TEMPLATE = "{0}: {1}\n"
-if not os.path.exists("languages.json"):
- print("Could not find 'languages.json' in current directory!")
- print("Save the output from https://www.transifex.com/api/2/project/keepassxc/languages")
- exit(0)
+def get_url(url):
+ req = request.Request(url)
+ req.add_header('Content-Type', 'application/vnd.api+json')
+ req.add_header('Authorization', f'Bearer {token}')
+ with request.urlopen(req) as resp:
+ return json.load(resp)
-with open("languages.json") as json_file:
- output = open("translators.html", "w", encoding="utf-8")
- languages = json.load(json_file)
- for lang in languages:
- code = lang["language_code"]
- if code not in LANGS:
- print("WARNING: Could not find language code:", code)
- continue
- translators = ", ".join(sorted(lang["reviewers"] + lang["translators"], key=str.casefold))
- output.write(TEMPLATE.format(LANGS[code], translators))
- output.close()
- print("Language translators written to 'translators.html'!")
\ No newline at end of file
+
+print('Fetching languages...', file=sys.stderr)
+languages_json = get_url(f'https://rest.api.transifex.com/projects/{proj}/languages')
+languages = {}
+for lang in languages_json['data']:
+ languages[lang['id']] = lang['attributes']['name']
+
+print('Fetching language stats...', file=sys.stderr)
+language_stats_json = get_url('https://rest.api.transifex.com/resource_language_stats?'
+ f'filter[project]={proj}&filter[resource]={resource}')
+completion = {}
+for stat in language_stats_json['data']:
+ completion = stat['attributes']['translated_strings'] / stat['attributes']['total_strings']
+ if completion < .6:
+ languages.pop(stat['relationships']['language']['data']['id'])
+
+print('Fetching language members...', end='', file=sys.stderr)
+members_json = get_url(f'https://rest.api.transifex.com/team_memberships?filter[organization]={org}')
+members = defaultdict(set)
+for member in members_json['data']:
+ print('.', end='', file=sys.stderr)
+ if member['relationships']['user']['data']['id'] in member_blacklist:
+ continue
+ lid = member['relationships']['language']['data']['id']
+ if lid not in languages:
+ continue
+ user = get_url(member['relationships']['user']['links']['related'])['data']['attributes']['username']
+ members[lid].add(user)
+print(file=sys.stderr)
+
+print('')
+for lang in sorted(languages, key=lambda x: languages[x]):
+ if not members[lang]:
+ continue
+ lines = [f' - {languages[lang]}: ']
+ for i, m in enumerate(sorted(members[lang], key=lambda x: x.lower())):
+ if len(lines[-1]) + len(m) >= 120:
+ lines.append(' ')
+ lines[-1] += m
+ if i < len(members[lang]) - 1:
+ lines[-1] += ', '
+ lines[-1] += '
'
+ print('\n'.join(lines))
+print('
')