Merge branch 'master' into glitch-soc/merge-upstream
This commit is contained in:
		
						commit
						4444d8f9b3
					
				
					 29 changed files with 454 additions and 182 deletions
				
			
		
							
								
								
									
										283
									
								
								AUTHORS.md
									
									
									
									
									
								
							
							
						
						
									
										283
									
								
								AUTHORS.md
									
									
									
									
									
								
							| 
						 | 
					@ -6,8 +6,8 @@ and provided thanks to the work of the following contributors:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* [Gargron](https://github.com/Gargron)
 | 
					* [Gargron](https://github.com/Gargron)
 | 
				
			||||||
* [ykzts](https://github.com/ykzts)
 | 
					* [ykzts](https://github.com/ykzts)
 | 
				
			||||||
* [akihikodaki](https://github.com/akihikodaki)
 | 
					 | 
				
			||||||
* [ThibG](https://github.com/ThibG)
 | 
					* [ThibG](https://github.com/ThibG)
 | 
				
			||||||
 | 
					* [akihikodaki](https://github.com/akihikodaki)
 | 
				
			||||||
* [mjankowski](https://github.com/mjankowski)
 | 
					* [mjankowski](https://github.com/mjankowski)
 | 
				
			||||||
* [dependabot[bot]](https://github.com/apps/dependabot)
 | 
					* [dependabot[bot]](https://github.com/apps/dependabot)
 | 
				
			||||||
* [unarist](https://github.com/unarist)
 | 
					* [unarist](https://github.com/unarist)
 | 
				
			||||||
| 
						 | 
					@ -27,14 +27,14 @@ and provided thanks to the work of the following contributors:
 | 
				
			||||||
* [blackle](https://github.com/blackle)
 | 
					* [blackle](https://github.com/blackle)
 | 
				
			||||||
* [Quent-in](https://github.com/Quent-in)
 | 
					* [Quent-in](https://github.com/Quent-in)
 | 
				
			||||||
* [JantsoP](https://github.com/JantsoP)
 | 
					* [JantsoP](https://github.com/JantsoP)
 | 
				
			||||||
* [mabkenar](https://github.com/mabkenar)
 | 
					 | 
				
			||||||
* [Kjwon15](https://github.com/Kjwon15)
 | 
					* [Kjwon15](https://github.com/Kjwon15)
 | 
				
			||||||
 | 
					* [mabkenar](https://github.com/mabkenar)
 | 
				
			||||||
* [nullkal](https://github.com/nullkal)
 | 
					* [nullkal](https://github.com/nullkal)
 | 
				
			||||||
* [yookoala](https://github.com/yookoala)
 | 
					* [yookoala](https://github.com/yookoala)
 | 
				
			||||||
* [shuheiktgw](https://github.com/shuheiktgw)
 | 
					* [shuheiktgw](https://github.com/shuheiktgw)
 | 
				
			||||||
* [ashfurrow](https://github.com/ashfurrow)
 | 
					* [ashfurrow](https://github.com/ashfurrow)
 | 
				
			||||||
* [Quenty31](https://github.com/Quenty31)
 | 
					 | 
				
			||||||
* [zunda](https://github.com/zunda)
 | 
					* [zunda](https://github.com/zunda)
 | 
				
			||||||
 | 
					* [Quenty31](https://github.com/Quenty31)
 | 
				
			||||||
* [eramdam](https://github.com/eramdam)
 | 
					* [eramdam](https://github.com/eramdam)
 | 
				
			||||||
* [takayamaki](https://github.com/takayamaki)
 | 
					* [takayamaki](https://github.com/takayamaki)
 | 
				
			||||||
* [masarakki](https://github.com/masarakki)
 | 
					* [masarakki](https://github.com/masarakki)
 | 
				
			||||||
| 
						 | 
					@ -45,8 +45,8 @@ and provided thanks to the work of the following contributors:
 | 
				
			||||||
* [stephenburgess8](https://github.com/stephenburgess8)
 | 
					* [stephenburgess8](https://github.com/stephenburgess8)
 | 
				
			||||||
* [Wonderfall](https://github.com/Wonderfall)
 | 
					* [Wonderfall](https://github.com/Wonderfall)
 | 
				
			||||||
* [matteoaquila](https://github.com/matteoaquila)
 | 
					* [matteoaquila](https://github.com/matteoaquila)
 | 
				
			||||||
* [rkarabut](https://github.com/rkarabut)
 | 
					 | 
				
			||||||
* [yukimochi](https://github.com/yukimochi)
 | 
					* [yukimochi](https://github.com/yukimochi)
 | 
				
			||||||
 | 
					* [rkarabut](https://github.com/rkarabut)
 | 
				
			||||||
* [Artoria2e5](https://github.com/Artoria2e5)
 | 
					* [Artoria2e5](https://github.com/Artoria2e5)
 | 
				
			||||||
* [nightpool](https://github.com/nightpool)
 | 
					* [nightpool](https://github.com/nightpool)
 | 
				
			||||||
* [marrus-sh](https://github.com/marrus-sh)
 | 
					* [marrus-sh](https://github.com/marrus-sh)
 | 
				
			||||||
| 
						 | 
					@ -64,11 +64,14 @@ and provided thanks to the work of the following contributors:
 | 
				
			||||||
* [MaciekBaron](https://github.com/MaciekBaron)
 | 
					* [MaciekBaron](https://github.com/MaciekBaron)
 | 
				
			||||||
* [MitarashiDango](mailto:mitarashidango@users.noreply.github.com)
 | 
					* [MitarashiDango](mailto:mitarashidango@users.noreply.github.com)
 | 
				
			||||||
* [beatrix-bitrot](https://github.com/beatrix-bitrot)
 | 
					* [beatrix-bitrot](https://github.com/beatrix-bitrot)
 | 
				
			||||||
 | 
					* [Aditoo17](https://github.com/Aditoo17)
 | 
				
			||||||
* [adbelle](https://github.com/adbelle)
 | 
					* [adbelle](https://github.com/adbelle)
 | 
				
			||||||
* [evanminto](https://github.com/evanminto)
 | 
					* [evanminto](https://github.com/evanminto)
 | 
				
			||||||
* [MightyPork](https://github.com/MightyPork)
 | 
					* [MightyPork](https://github.com/MightyPork)
 | 
				
			||||||
* [yhirano55](https://github.com/yhirano55)
 | 
					* [yhirano55](https://github.com/yhirano55)
 | 
				
			||||||
 | 
					* [rinsuki](https://github.com/rinsuki)
 | 
				
			||||||
* [camponez](https://github.com/camponez)
 | 
					* [camponez](https://github.com/camponez)
 | 
				
			||||||
 | 
					* [hinaloe](https://github.com/hinaloe)
 | 
				
			||||||
* [SerCom-KC](https://github.com/SerCom-KC)
 | 
					* [SerCom-KC](https://github.com/SerCom-KC)
 | 
				
			||||||
* [aschmitz](https://github.com/aschmitz)
 | 
					* [aschmitz](https://github.com/aschmitz)
 | 
				
			||||||
* [devkral](https://github.com/devkral)
 | 
					* [devkral](https://github.com/devkral)
 | 
				
			||||||
| 
						 | 
					@ -81,10 +84,8 @@ and provided thanks to the work of the following contributors:
 | 
				
			||||||
* [lindwurm](https://github.com/lindwurm)
 | 
					* [lindwurm](https://github.com/lindwurm)
 | 
				
			||||||
* [victorhck](mailto:victorhck@geeko.site)
 | 
					* [victorhck](mailto:victorhck@geeko.site)
 | 
				
			||||||
* [voidsatisfaction](https://github.com/voidsatisfaction)
 | 
					* [voidsatisfaction](https://github.com/voidsatisfaction)
 | 
				
			||||||
* [rinsuki](https://github.com/rinsuki)
 | 
					 | 
				
			||||||
* [hikari-no-yume](https://github.com/hikari-no-yume)
 | 
					* [hikari-no-yume](https://github.com/hikari-no-yume)
 | 
				
			||||||
* [angristan](https://github.com/angristan)
 | 
					* [angristan](https://github.com/angristan)
 | 
				
			||||||
* [hinaloe](https://github.com/hinaloe)
 | 
					 | 
				
			||||||
* [seefood](https://github.com/seefood)
 | 
					* [seefood](https://github.com/seefood)
 | 
				
			||||||
* [jackjennings](https://github.com/jackjennings)
 | 
					* [jackjennings](https://github.com/jackjennings)
 | 
				
			||||||
* [spla](mailto:spla@mastodont.cat)
 | 
					* [spla](mailto:spla@mastodont.cat)
 | 
				
			||||||
| 
						 | 
					@ -102,9 +103,10 @@ and provided thanks to the work of the following contributors:
 | 
				
			||||||
* [victorhck](https://github.com/victorhck)
 | 
					* [victorhck](https://github.com/victorhck)
 | 
				
			||||||
* [kedamaDQ](https://github.com/kedamaDQ)
 | 
					* [kedamaDQ](https://github.com/kedamaDQ)
 | 
				
			||||||
* [puckipedia](https://github.com/puckipedia)
 | 
					* [puckipedia](https://github.com/puckipedia)
 | 
				
			||||||
 | 
					* [trwnh](https://github.com/trwnh)
 | 
				
			||||||
* [fvh-P](https://github.com/fvh-P)
 | 
					* [fvh-P](https://github.com/fvh-P)
 | 
				
			||||||
* [contraexemplo](https://github.com/contraexemplo)
 | 
					* [Anna e só](mailto:contraexemplos@gmail.com)
 | 
				
			||||||
* [Aditoo17](https://github.com/Aditoo17)
 | 
					* [BenLubar](https://github.com/BenLubar)
 | 
				
			||||||
* [kazu9su](https://github.com/kazu9su)
 | 
					* [kazu9su](https://github.com/kazu9su)
 | 
				
			||||||
* [Komic](https://github.com/Komic)
 | 
					* [Komic](https://github.com/Komic)
 | 
				
			||||||
* [lmorchard](https://github.com/lmorchard)
 | 
					* [lmorchard](https://github.com/lmorchard)
 | 
				
			||||||
| 
						 | 
					@ -117,7 +119,6 @@ and provided thanks to the work of the following contributors:
 | 
				
			||||||
* [goofy-bz](mailto:goofy@babelzilla.org)
 | 
					* [goofy-bz](mailto:goofy@babelzilla.org)
 | 
				
			||||||
* [kadiix](https://github.com/kadiix)
 | 
					* [kadiix](https://github.com/kadiix)
 | 
				
			||||||
* [kodacs](https://github.com/kodacs)
 | 
					* [kodacs](https://github.com/kodacs)
 | 
				
			||||||
* [trwnh](https://github.com/trwnh)
 | 
					 | 
				
			||||||
* [JMendyk](https://github.com/JMendyk)
 | 
					* [JMendyk](https://github.com/JMendyk)
 | 
				
			||||||
* [KScl](https://github.com/KScl)
 | 
					* [KScl](https://github.com/KScl)
 | 
				
			||||||
* [sterdev](https://github.com/sterdev)
 | 
					* [sterdev](https://github.com/sterdev)
 | 
				
			||||||
| 
						 | 
					@ -133,6 +134,7 @@ and provided thanks to the work of the following contributors:
 | 
				
			||||||
* [Reverite](https://github.com/Reverite)
 | 
					* [Reverite](https://github.com/Reverite)
 | 
				
			||||||
* [JohnD28](https://github.com/JohnD28)
 | 
					* [JohnD28](https://github.com/JohnD28)
 | 
				
			||||||
* [znz](https://github.com/znz)
 | 
					* [znz](https://github.com/znz)
 | 
				
			||||||
 | 
					* [marek-lach](https://github.com/marek-lach)
 | 
				
			||||||
* [Naouak](https://github.com/Naouak)
 | 
					* [Naouak](https://github.com/Naouak)
 | 
				
			||||||
* [pawelngei](https://github.com/pawelngei)
 | 
					* [pawelngei](https://github.com/pawelngei)
 | 
				
			||||||
* [rtucker](https://github.com/rtucker)
 | 
					* [rtucker](https://github.com/rtucker)
 | 
				
			||||||
| 
						 | 
					@ -150,7 +152,6 @@ and provided thanks to the work of the following contributors:
 | 
				
			||||||
* [178inaba](https://github.com/178inaba)
 | 
					* [178inaba](https://github.com/178inaba)
 | 
				
			||||||
* [alyssais](https://github.com/alyssais)
 | 
					* [alyssais](https://github.com/alyssais)
 | 
				
			||||||
* [hiphref](https://github.com/hiphref)
 | 
					* [hiphref](https://github.com/hiphref)
 | 
				
			||||||
* [BenLubar](https://github.com/BenLubar)
 | 
					 | 
				
			||||||
* [stalker314314](https://github.com/stalker314314)
 | 
					* [stalker314314](https://github.com/stalker314314)
 | 
				
			||||||
* [huertanix](https://github.com/huertanix)
 | 
					* [huertanix](https://github.com/huertanix)
 | 
				
			||||||
* [genesixx](https://github.com/genesixx)
 | 
					* [genesixx](https://github.com/genesixx)
 | 
				
			||||||
| 
						 | 
					@ -161,16 +162,16 @@ and provided thanks to the work of the following contributors:
 | 
				
			||||||
* [kmichl](https://github.com/kmichl)
 | 
					* [kmichl](https://github.com/kmichl)
 | 
				
			||||||
* [Kurtis Rainbolt-Greene](mailto:me@kurtisrainboltgreene.name)
 | 
					* [Kurtis Rainbolt-Greene](mailto:me@kurtisrainboltgreene.name)
 | 
				
			||||||
* [saper](https://github.com/saper)
 | 
					* [saper](https://github.com/saper)
 | 
				
			||||||
* [marek-lach](https://github.com/marek-lach)
 | 
					 | 
				
			||||||
* [nevillepark](https://github.com/nevillepark)
 | 
					* [nevillepark](https://github.com/nevillepark)
 | 
				
			||||||
* [ornithocoder](https://github.com/ornithocoder)
 | 
					* [ornithocoder](https://github.com/ornithocoder)
 | 
				
			||||||
* [pierreozoux](https://github.com/pierreozoux)
 | 
					* [pierreozoux](https://github.com/pierreozoux)
 | 
				
			||||||
* [qguv](https://github.com/qguv)
 | 
					* [qguv](https://github.com/qguv)
 | 
				
			||||||
* [Ram Lmn](mailto:ramlmn@users.noreply.github.com)
 | 
					* [Ram Lmn](mailto:ramlmn@users.noreply.github.com)
 | 
				
			||||||
 | 
					* [sascha-sl](https://github.com/sascha-sl)
 | 
				
			||||||
* [harukasan](https://github.com/harukasan)
 | 
					* [harukasan](https://github.com/harukasan)
 | 
				
			||||||
* [stamak](https://github.com/stamak)
 | 
					* [stamak](https://github.com/stamak)
 | 
				
			||||||
* [Technowix](mailto:technowix@users.noreply.github.com)
 | 
					* [Technowix](mailto:technowix@users.noreply.github.com)
 | 
				
			||||||
* [Eychics](https://github.com/Eychics)
 | 
					* [Zoeille](https://github.com/Zoeille)
 | 
				
			||||||
* [Thor Harald Johansen](mailto:thj@thj.no)
 | 
					* [Thor Harald Johansen](mailto:thj@thj.no)
 | 
				
			||||||
* [0x70b1a5](https://github.com/0x70b1a5)
 | 
					* [0x70b1a5](https://github.com/0x70b1a5)
 | 
				
			||||||
* [gled-rs](https://github.com/gled-rs)
 | 
					* [gled-rs](https://github.com/gled-rs)
 | 
				
			||||||
| 
						 | 
					@ -244,9 +245,9 @@ and provided thanks to the work of the following contributors:
 | 
				
			||||||
* [raymestalez](https://github.com/raymestalez)
 | 
					* [raymestalez](https://github.com/raymestalez)
 | 
				
			||||||
* [remram44](https://github.com/remram44)
 | 
					* [remram44](https://github.com/remram44)
 | 
				
			||||||
* [sts10](https://github.com/sts10)
 | 
					* [sts10](https://github.com/sts10)
 | 
				
			||||||
* [sascha-sl](https://github.com/sascha-sl)
 | 
					 | 
				
			||||||
* [u1-liquid](https://github.com/u1-liquid)
 | 
					* [u1-liquid](https://github.com/u1-liquid)
 | 
				
			||||||
* [sim6](https://github.com/sim6)
 | 
					* [sim6](https://github.com/sim6)
 | 
				
			||||||
 | 
					* [Sir-Boops](https://github.com/Sir-Boops)
 | 
				
			||||||
* [stemid](https://github.com/stemid)
 | 
					* [stemid](https://github.com/stemid)
 | 
				
			||||||
* [sumdog](https://github.com/sumdog)
 | 
					* [sumdog](https://github.com/sumdog)
 | 
				
			||||||
* [ThomasLeister](https://github.com/ThomasLeister)
 | 
					* [ThomasLeister](https://github.com/ThomasLeister)
 | 
				
			||||||
| 
						 | 
					@ -316,8 +317,11 @@ and provided thanks to the work of the following contributors:
 | 
				
			||||||
* [Andreas Drop](mailto:andy@remline.de)
 | 
					* [Andreas Drop](mailto:andy@remline.de)
 | 
				
			||||||
* [andi1984](https://github.com/andi1984)
 | 
					* [andi1984](https://github.com/andi1984)
 | 
				
			||||||
* [schas002](https://github.com/schas002)
 | 
					* [schas002](https://github.com/schas002)
 | 
				
			||||||
 | 
					* [contraexemplo](https://github.com/contraexemplo)
 | 
				
			||||||
* [abackstrom](https://github.com/abackstrom)
 | 
					* [abackstrom](https://github.com/abackstrom)
 | 
				
			||||||
 | 
					* [armandfardeau](https://github.com/armandfardeau)
 | 
				
			||||||
* [jumbosushi](https://github.com/jumbosushi)
 | 
					* [jumbosushi](https://github.com/jumbosushi)
 | 
				
			||||||
 | 
					* [aurelien-reeves](https://github.com/aurelien-reeves)
 | 
				
			||||||
* [ayumin](https://github.com/ayumin)
 | 
					* [ayumin](https://github.com/ayumin)
 | 
				
			||||||
* [BaptisteGelez](https://github.com/BaptisteGelez)
 | 
					* [BaptisteGelez](https://github.com/BaptisteGelez)
 | 
				
			||||||
* [bzg](https://github.com/bzg)
 | 
					* [bzg](https://github.com/bzg)
 | 
				
			||||||
| 
						 | 
					@ -335,7 +339,7 @@ and provided thanks to the work of the following contributors:
 | 
				
			||||||
* [Motoma](https://github.com/Motoma)
 | 
					* [Motoma](https://github.com/Motoma)
 | 
				
			||||||
* [chriswk](https://github.com/chriswk)
 | 
					* [chriswk](https://github.com/chriswk)
 | 
				
			||||||
* [csu](https://github.com/csu)
 | 
					* [csu](https://github.com/csu)
 | 
				
			||||||
* [clarcharr](https://github.com/clarcharr)
 | 
					* [clarfon](https://github.com/clarfon)
 | 
				
			||||||
* [kklleemm](https://github.com/kklleemm)
 | 
					* [kklleemm](https://github.com/kklleemm)
 | 
				
			||||||
* [colindean](https://github.com/colindean)
 | 
					* [colindean](https://github.com/colindean)
 | 
				
			||||||
* [dachinat](https://github.com/dachinat)
 | 
					* [dachinat](https://github.com/dachinat)
 | 
				
			||||||
| 
						 | 
					@ -358,6 +362,7 @@ and provided thanks to the work of the following contributors:
 | 
				
			||||||
* [eai04191](https://github.com/eai04191)
 | 
					* [eai04191](https://github.com/eai04191)
 | 
				
			||||||
* [d3vgru](https://github.com/d3vgru)
 | 
					* [d3vgru](https://github.com/d3vgru)
 | 
				
			||||||
* [Elizafox](https://github.com/Elizafox)
 | 
					* [Elizafox](https://github.com/Elizafox)
 | 
				
			||||||
 | 
					* [enewhuis](https://github.com/enewhuis)
 | 
				
			||||||
* [ericblade](https://github.com/ericblade)
 | 
					* [ericblade](https://github.com/ericblade)
 | 
				
			||||||
* [mikoim](https://github.com/mikoim)
 | 
					* [mikoim](https://github.com/mikoim)
 | 
				
			||||||
* [espenronnevik](https://github.com/espenronnevik)
 | 
					* [espenronnevik](https://github.com/espenronnevik)
 | 
				
			||||||
| 
						 | 
					@ -446,6 +451,7 @@ and provided thanks to the work of the following contributors:
 | 
				
			||||||
* [mouse-reeve](https://github.com/mouse-reeve)
 | 
					* [mouse-reeve](https://github.com/mouse-reeve)
 | 
				
			||||||
* [Mozinet-fr](https://github.com/Mozinet-fr)
 | 
					* [Mozinet-fr](https://github.com/Mozinet-fr)
 | 
				
			||||||
* [lae](https://github.com/lae)
 | 
					* [lae](https://github.com/lae)
 | 
				
			||||||
 | 
					* [nosada](https://github.com/nosada)
 | 
				
			||||||
* [Nanamachi](https://github.com/Nanamachi)
 | 
					* [Nanamachi](https://github.com/Nanamachi)
 | 
				
			||||||
* [orinthe](https://github.com/orinthe)
 | 
					* [orinthe](https://github.com/orinthe)
 | 
				
			||||||
* [NecroTechno](https://github.com/NecroTechno)
 | 
					* [NecroTechno](https://github.com/NecroTechno)
 | 
				
			||||||
| 
						 | 
					@ -462,10 +468,11 @@ and provided thanks to the work of the following contributors:
 | 
				
			||||||
* [noppa](https://github.com/noppa)
 | 
					* [noppa](https://github.com/noppa)
 | 
				
			||||||
* [Otakan951](https://github.com/Otakan951)
 | 
					* [Otakan951](https://github.com/Otakan951)
 | 
				
			||||||
* [fahy](https://github.com/fahy)
 | 
					* [fahy](https://github.com/fahy)
 | 
				
			||||||
* [PatrickRWells](https://github.com/PatrickRWells)
 | 
					* [PatrickRWells](mailto:32802366+patrickrwells@users.noreply.github.com)
 | 
				
			||||||
* [Pangoraw](https://github.com/Pangoraw)
 | 
					* [Paul](mailto:naydex.mc+github@gmail.com)
 | 
				
			||||||
* [peterkeen](https://github.com/peterkeen)
 | 
					* [Pete Keen](mailto:pete@petekeen.net)
 | 
				
			||||||
* [pgate](https://github.com/pgate)
 | 
					* [Pierre-Morgan Gate](mailto:pgate@users.noreply.github.com)
 | 
				
			||||||
 | 
					* [Ratmir Karabut](mailto:rkarabut@sfmodern.ru)
 | 
				
			||||||
* [Reto Kromer](mailto:retokromer@users.noreply.github.com)
 | 
					* [Reto Kromer](mailto:retokromer@users.noreply.github.com)
 | 
				
			||||||
* [Rey Tucker](mailto:git@reytucker.us)
 | 
					* [Rey Tucker](mailto:git@reytucker.us)
 | 
				
			||||||
* [Rob Watson](mailto:rfwatson@users.noreply.github.com)
 | 
					* [Rob Watson](mailto:rfwatson@users.noreply.github.com)
 | 
				
			||||||
| 
						 | 
					@ -488,7 +495,6 @@ and provided thanks to the work of the following contributors:
 | 
				
			||||||
* [Sho Kusano](mailto:rosylilly@aduca.org)
 | 
					* [Sho Kusano](mailto:rosylilly@aduca.org)
 | 
				
			||||||
* [Shouko Yu](mailto:imshouko@gmail.com)
 | 
					* [Shouko Yu](mailto:imshouko@gmail.com)
 | 
				
			||||||
* [Sina Mashek](mailto:sina@mashek.xyz)
 | 
					* [Sina Mashek](mailto:sina@mashek.xyz)
 | 
				
			||||||
* [Sir-Boops](mailto:admin@boops.me)
 | 
					 | 
				
			||||||
* [Soshi Kato](mailto:mail@sossii.com)
 | 
					* [Soshi Kato](mailto:mail@sossii.com)
 | 
				
			||||||
* [Spanky](mailto:2788886+spankyworks@users.noreply.github.com)
 | 
					* [Spanky](mailto:2788886+spankyworks@users.noreply.github.com)
 | 
				
			||||||
* [Stanislas](mailto:angristan@pm.me)
 | 
					* [Stanislas](mailto:angristan@pm.me)
 | 
				
			||||||
| 
						 | 
					@ -555,12 +561,14 @@ and provided thanks to the work of the following contributors:
 | 
				
			||||||
* [karlyeurl](mailto:karl.yeurl@gmail.com)
 | 
					* [karlyeurl](mailto:karl.yeurl@gmail.com)
 | 
				
			||||||
* [kedama](mailto:32974885+kedamadq@users.noreply.github.com)
 | 
					* [kedama](mailto:32974885+kedamadq@users.noreply.github.com)
 | 
				
			||||||
* [kodai](mailto:shirafuta.kodai@gmail.com)
 | 
					* [kodai](mailto:shirafuta.kodai@gmail.com)
 | 
				
			||||||
 | 
					* [koyu](mailto:me@koyu.space)
 | 
				
			||||||
* [kuro5hin](mailto:rusty@kuro5hin.org)
 | 
					* [kuro5hin](mailto:rusty@kuro5hin.org)
 | 
				
			||||||
* [luzpaz](mailto:luzpaz@users.noreply.github.com)
 | 
					* [luzpaz](mailto:luzpaz@users.noreply.github.com)
 | 
				
			||||||
* [maxypy](mailto:maxime@mpigou.fr)
 | 
					* [maxypy](mailto:maxime@mpigou.fr)
 | 
				
			||||||
* [mhe](mailto:mail@marcus-herrmann.com)
 | 
					* [mhe](mailto:mail@marcus-herrmann.com)
 | 
				
			||||||
* [mike castleman](mailto:m@mlcastle.net)
 | 
					* [mike castleman](mailto:m@mlcastle.net)
 | 
				
			||||||
* [mimikun](mailto:dzdzble_effort_311@outlook.jp)
 | 
					* [mimikun](mailto:dzdzble_effort_311@outlook.jp)
 | 
				
			||||||
 | 
					* [mohemohe](mailto:mohemohe@users.noreply.github.com)
 | 
				
			||||||
* [mshrtkch](mailto:mshrtkch@users.noreply.github.com)
 | 
					* [mshrtkch](mailto:mshrtkch@users.noreply.github.com)
 | 
				
			||||||
* [muan](mailto:muan@github.com)
 | 
					* [muan](mailto:muan@github.com)
 | 
				
			||||||
* [namelessGonbai](mailto:43787036+namelessgonbai@users.noreply.github.com)
 | 
					* [namelessGonbai](mailto:43787036+namelessgonbai@users.noreply.github.com)
 | 
				
			||||||
| 
						 | 
					@ -599,243 +607,338 @@ This document is provided for informational purposes only. Since it is only upda
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Following people have contributed to translation of Mastodon:
 | 
					Following people have contributed to translation of Mastodon:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- **Albanian**
 | 
				
			||||||
 | 
					  - Besnik Bleta
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
- **Arabic**
 | 
					- **Arabic**
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
 | 
					  - Amrz0
 | 
				
			||||||
- **Asturian**
 | 
					- **Asturian**
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
  - Enol P.
 | 
					  - Enol P.
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
- **Basque**
 | 
					- **Basque**
 | 
				
			||||||
 | 
					  - Osoitz
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
  - Aitzol
 | 
					  - Aitzol
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
  - Gorka Azkarate
 | 
					 | 
				
			||||||
  - Osoitz
 | 
					 | 
				
			||||||
  - Peru Iparragirre
 | 
					  - Peru Iparragirre
 | 
				
			||||||
 | 
					  - Gorka Azkarate
 | 
				
			||||||
 | 
					- **Bengali**
 | 
				
			||||||
 | 
					  - dxwc
 | 
				
			||||||
- **Bulgarian**
 | 
					- **Bulgarian**
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
- **Catalan**
 | 
					- **Catalan**
 | 
				
			||||||
 | 
					  - spla
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
  - Joan Montané
 | 
					  - Joan Montané
 | 
				
			||||||
  - Jose Luis
 | 
					  - Jose Luis
 | 
				
			||||||
  - spla
 | 
					 | 
				
			||||||
- **Chinese (Hong Kong)**
 | 
					- **Chinese (Hong Kong)**
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
  - Luzi Leung
 | 
					  - Luzi Leung
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
- **Chinese (Simplified)**
 | 
					- **Chinese (Simplified)**
 | 
				
			||||||
  - Allen Zhong
 | 
					  - Allen Zhong
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
  - SerCom_KC
 | 
					  - SerCom_KC
 | 
				
			||||||
 | 
					  - martialarts
 | 
				
			||||||
 | 
					  - Kaitian Xie
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
 | 
					  - pan93412
 | 
				
			||||||
- **Chinese (Traditional)**
 | 
					- **Chinese (Traditional)**
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
  - James58899
 | 
					  - James58899
 | 
				
			||||||
  - Jeff Huang
 | 
					  - pan93412
 | 
				
			||||||
  - S1ttidoe477
 | 
					  - S1ttidoe477
 | 
				
			||||||
  - SHA265
 | 
					  - SHA265
 | 
				
			||||||
 | 
					  - Jeff Huang
 | 
				
			||||||
- **Corsican**
 | 
					- **Corsican**
 | 
				
			||||||
  - Alix D. R.
 | 
					  - Alix D. R.
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
- **Croatian**
 | 
					- **Croatian**
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
- **Czech**
 | 
					- **Czech**
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - Aditoo
 | 
				
			||||||
  - Lorem Ipsum
 | 
					 | 
				
			||||||
  - Marek Ľach
 | 
					  - Marek Ľach
 | 
				
			||||||
 | 
					  - ButterflyOfFire
 | 
				
			||||||
- **Danish**
 | 
					- **Danish**
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - Einhjeriar
 | 
				
			||||||
  - Rasmus Sæderup
 | 
					  - Rasmus Sæderup
 | 
				
			||||||
- **Dutch**
 | 
					  - Aditoo
 | 
				
			||||||
 | 
					  - ButterflyOfFire
 | 
				
			||||||
 | 
					- **Dutch**
 | 
				
			||||||
 | 
					  - Albakham
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
  - Jelv
 | 
					 | 
				
			||||||
  - jeroenpraat
 | 
					  - jeroenpraat
 | 
				
			||||||
  - rscmbbng
 | 
					  - rscmbbng
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
 | 
					  - Jelv
 | 
				
			||||||
- **English**
 | 
					- **English**
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
  - Renato "Lond" Cerqueira
 | 
					  - Renato "Lond" Cerqueira
 | 
				
			||||||
 | 
					- **English (United Kingdom)**
 | 
				
			||||||
 | 
					  - Albakham
 | 
				
			||||||
- **Esperanto**
 | 
					- **Esperanto**
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
 | 
					  - Becci Cat
 | 
				
			||||||
  - Jeong Arm
 | 
					  - Jeong Arm
 | 
				
			||||||
  - Martin Bodin
 | 
					 | 
				
			||||||
  - Mélanie Chauvel
 | 
					  - Mélanie Chauvel
 | 
				
			||||||
  - Vanege
 | 
					  - Vanege
 | 
				
			||||||
 | 
					  - Martin Bodin
 | 
				
			||||||
  - tuxayo/Victor Grousset
 | 
					  - tuxayo/Victor Grousset
 | 
				
			||||||
- **Finnish**
 | 
					- **Finnish**
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
  - Jonne Arjoranta
 | 
					  - Mikko Poussu
 | 
				
			||||||
  - S Heija
 | 
					 | 
				
			||||||
  - Taru Luojola
 | 
					  - Taru Luojola
 | 
				
			||||||
 | 
					  - S Heija
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
 | 
					  - Jonne Arjoranta
 | 
				
			||||||
- **French**
 | 
					- **French**
 | 
				
			||||||
  - Alda Marteau-Hardi
 | 
					  - Albakham
 | 
				
			||||||
  - Alix D. R.
 | 
					  - Alix D. R.
 | 
				
			||||||
  - Baptiste Jonglez
 | 
					 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
  - Franck Paul
 | 
					  - codl
 | 
				
			||||||
  - Jean-Baptiste Holcroft
 | 
					  - Leia
 | 
				
			||||||
 | 
					  - Alda Marteau-Hardi
 | 
				
			||||||
 | 
					  - Mélanie Chauvel
 | 
				
			||||||
 | 
					  - Paul Marques Mota
 | 
				
			||||||
 | 
					  - azenet
 | 
				
			||||||
 | 
					  - Olivier Humbert
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
  - Jonathan Chan
 | 
					  - Jonathan Chan
 | 
				
			||||||
  - Letiteuf55
 | 
					  - Letiteuf55
 | 
				
			||||||
  - Martin Bodin
 | 
					  - Baptiste Jonglez
 | 
				
			||||||
  - Mélanie Chauvel
 | 
					  - goofy-mdn
 | 
				
			||||||
  - Olivier Humbert
 | 
					  - Jean-Baptiste Holcroft
 | 
				
			||||||
  - Paul Marques Mota
 | 
					 | 
				
			||||||
  - Sylvhem
 | 
					 | 
				
			||||||
  - Technowix
 | 
					  - Technowix
 | 
				
			||||||
  - Thibaut Girka
 | 
					  - Martin Bodin
 | 
				
			||||||
  - Théodore
 | 
					  - Théodore
 | 
				
			||||||
  - azenet
 | 
					  - Thibaut Girka
 | 
				
			||||||
  - codl
 | 
					  - Franck Paul
 | 
				
			||||||
 | 
					  - Sylvhem
 | 
				
			||||||
- **Galician**
 | 
					- **Galician**
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
  - Xose M.
 | 
					  - Xose M.
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
  - manequim
 | 
					  - manequim
 | 
				
			||||||
- **Georgian**
 | 
					- **Georgian**
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
- **German**
 | 
					- **German**
 | 
				
			||||||
  - Benedikt Geißler
 | 
					  - Aditoo
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
  - Daniel
 | 
					  - Daniel
 | 
				
			||||||
  - Eugen Rochko
 | 
					 | 
				
			||||||
  - Koyu Berteon
 | 
					 | 
				
			||||||
  - Patrick Figel
 | 
					 | 
				
			||||||
  - Weblate Admin
 | 
					 | 
				
			||||||
  - averageunicorn
 | 
					  - averageunicorn
 | 
				
			||||||
  - ePirat
 | 
					  - Koyu Berteon
 | 
				
			||||||
  - koyu
 | 
					 | 
				
			||||||
  - larsreineke
 | 
					  - larsreineke
 | 
				
			||||||
 | 
					  - koyu
 | 
				
			||||||
 | 
					  - Austin Jones
 | 
				
			||||||
  - lilo
 | 
					  - lilo
 | 
				
			||||||
 | 
					  - Benedikt Geißler
 | 
				
			||||||
 | 
					  - ePirat
 | 
				
			||||||
 | 
					  - Eugen Rochko
 | 
				
			||||||
 | 
					  - Weblate Admin
 | 
				
			||||||
 | 
					  - Patrick Figel
 | 
				
			||||||
- **Greek**
 | 
					- **Greek**
 | 
				
			||||||
  - Antonis
 | 
					 | 
				
			||||||
  - ButterflyOfFire
 | 
					 | 
				
			||||||
  - Dimitris Maroulidis
 | 
					  - Dimitris Maroulidis
 | 
				
			||||||
 | 
					  - Antonis
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
 | 
					  - ButterflyOfFire
 | 
				
			||||||
  - Konstantinos Grevenitis
 | 
					  - Konstantinos Grevenitis
 | 
				
			||||||
- **Hebrew**
 | 
					- **Hebrew**
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
  - Ira
 | 
					  - Ira
 | 
				
			||||||
  - Yaron Shahrabani
 | 
					  - Yaron Shahrabani
 | 
				
			||||||
- **Hungarian**
 | 
					- **Hungarian**
 | 
				
			||||||
  - Adam Paszternak
 | 
					 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
 | 
					  - Adam Paszternak
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
  - Tibike Miklós
 | 
					  - Tibike Miklós
 | 
				
			||||||
- **Ido**
 | 
					- **Ido**
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
- **Indonesian**
 | 
					- **Indonesian**
 | 
				
			||||||
  - Alfiana Sibuea
 | 
					  - afachri
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
  - Dito Kurnia Pratama
 | 
					  - Dito Kurnia Pratama
 | 
				
			||||||
  - Eirworks
 | 
					  - Eirworks
 | 
				
			||||||
  - afachri
 | 
					  - Aditoo
 | 
				
			||||||
 | 
					  - Alfiana Sibuea
 | 
				
			||||||
  - se7entime
 | 
					  - se7entime
 | 
				
			||||||
 | 
					- **Irish**
 | 
				
			||||||
 | 
					  - Albakham
 | 
				
			||||||
 | 
					  - Kevin Houlihan
 | 
				
			||||||
- **Italian**
 | 
					- **Italian**
 | 
				
			||||||
  - Alessandro Levati
 | 
					  - Alessandro Levati
 | 
				
			||||||
 | 
					  - Albakham
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
 | 
					  - Marcin Mikołajczak
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
  - Giuseppe Pignataro
 | 
					  - Giuseppe Pignataro
 | 
				
			||||||
  - Stefano
 | 
					  - Stefano
 | 
				
			||||||
- **Japanese**
 | 
					- **Japanese**
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - Hinaloe
 | 
				
			||||||
  - Kumasun Morino
 | 
					  - 小鳥遊まりあ
 | 
				
			||||||
  - Yamagishi Kazutoshi
 | 
					 | 
				
			||||||
  - mayaeh
 | 
					  - mayaeh
 | 
				
			||||||
  - osapon
 | 
					  - osapon
 | 
				
			||||||
  - unarist
 | 
					 | 
				
			||||||
  - 小鳥遊まりあ
 | 
					 | 
				
			||||||
  - 森の子リスのミーコの大冒険
 | 
					  - 森の子リスのミーコの大冒険
 | 
				
			||||||
- **Korean**
 | 
					  - Kumasun Morino
 | 
				
			||||||
 | 
					  - Yamagishi Kazutoshi
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
  - Jeong Arm
 | 
					  - Jeong Arm
 | 
				
			||||||
 | 
					  - unarist
 | 
				
			||||||
 | 
					- **Kazakh**
 | 
				
			||||||
 | 
					  - arshat
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
 | 
					- **Korean**
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
 | 
					  - Jeong Arm
 | 
				
			||||||
 | 
					  - ButterflyOfFire
 | 
				
			||||||
  - Minori Hiraoka
 | 
					  - Minori Hiraoka
 | 
				
			||||||
  - Yamagishi Kazutoshi
 | 
					  - Yamagishi Kazutoshi
 | 
				
			||||||
 | 
					- **Lithuanian**
 | 
				
			||||||
 | 
					  - Sarunas Medeikis
 | 
				
			||||||
- **Malay**
 | 
					- **Malay**
 | 
				
			||||||
  - ButterflyOfFire
 | 
					 | 
				
			||||||
  - Muhammad Nur Hidayat (MNH48)
 | 
					  - Muhammad Nur Hidayat (MNH48)
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
 | 
					  - ButterflyOfFire
 | 
				
			||||||
- **Norwegian (old code)**
 | 
					- **Norwegian (old code)**
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
  - Espen Rønnevik
 | 
					  - Espen Rønnevik
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
  - Tale
 | 
					  - Tale
 | 
				
			||||||
- **Occitan**
 | 
					- **Occitan**
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
  - Maxenç
 | 
					 | 
				
			||||||
  - Quenti2
 | 
					  - Quenti2
 | 
				
			||||||
  - Quentí
 | 
					  - Quentí
 | 
				
			||||||
 | 
					  - Maxenç
 | 
				
			||||||
- **Persian**
 | 
					- **Persian**
 | 
				
			||||||
  - ButterflyOfFire
 | 
					 | 
				
			||||||
  - Masoud Abkenar
 | 
					  - Masoud Abkenar
 | 
				
			||||||
- **Polish**
 | 
					  - Aditoo
 | 
				
			||||||
 | 
					  - ButterflyOfFire
 | 
				
			||||||
 | 
					- **Polish**
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
 | 
					  - Albakham
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
  - Jakub Mendyk
 | 
					 | 
				
			||||||
  - Marcin Mikołajczak
 | 
					 | 
				
			||||||
  - Marek Ľach
 | 
					 | 
				
			||||||
  - Stasiek Michalski
 | 
					  - Stasiek Michalski
 | 
				
			||||||
 | 
					  - Marcin Mikołajczak
 | 
				
			||||||
 | 
					  - Jakub Mendyk
 | 
				
			||||||
 | 
					  - Marek Ľach
 | 
				
			||||||
  - krkk
 | 
					  - krkk
 | 
				
			||||||
- **Portuguese**
 | 
					- **Portuguese**
 | 
				
			||||||
 | 
					  - Albakham
 | 
				
			||||||
 | 
					  - João Pinheiro
 | 
				
			||||||
 | 
					  - manequim
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
  - Hugo Gameiro
 | 
					  - Hugo Gameiro
 | 
				
			||||||
  - manequim
 | 
					 | 
				
			||||||
- **Portuguese (Brazil)**
 | 
					- **Portuguese (Brazil)**
 | 
				
			||||||
  - André Andrade
 | 
					  - Aditoo
 | 
				
			||||||
 | 
					  - Albakham
 | 
				
			||||||
  - Anna e só
 | 
					  - Anna e só
 | 
				
			||||||
  - ButterflyOfFire
 | 
					 | 
				
			||||||
  - Renato "Lond" Cerqueira
 | 
					  - Renato "Lond" Cerqueira
 | 
				
			||||||
- **Romanian**
 | 
					  - André Andrade
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
 | 
					- **Romanian**
 | 
				
			||||||
  - adrianbblk
 | 
					  - adrianbblk
 | 
				
			||||||
 | 
					  - ButterflyOfFire
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
- **Russian**
 | 
					- **Russian**
 | 
				
			||||||
  - Andrew Zyabin
 | 
					  - Albakham
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
  - Evgeny Petrov
 | 
					  - Evgeny Petrov
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
 | 
					  - Павел Гастелло
 | 
				
			||||||
 | 
					  - Andrew Zyabin
 | 
				
			||||||
  - Yaron Shahrabani
 | 
					  - Yaron Shahrabani
 | 
				
			||||||
- **Serbian**
 | 
					- **Serbian**
 | 
				
			||||||
  - Branko Kokanovic
 | 
					  - Branko Kokanovic
 | 
				
			||||||
  - Burekz Finezt
 | 
					  - Burekz Finezt
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
- **Serbian (latin)**
 | 
					- **Serbian (latin)**
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
- **Slovak**
 | 
					- **Slovak**
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
  - Ivan Pleva
 | 
					  - Ivan Pleva
 | 
				
			||||||
  - Lorem Ipsum
 | 
					 | 
				
			||||||
  - Marek Ľach
 | 
					  - Marek Ľach
 | 
				
			||||||
  - Peter
 | 
					  - Peter
 | 
				
			||||||
- **Slovenian**
 | 
					- **Slovenian**
 | 
				
			||||||
  - ButterflyOfFire
 | 
					 | 
				
			||||||
  - Kristijan Tkalec
 | 
					  - Kristijan Tkalec
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
 | 
					  - ButterflyOfFire
 | 
				
			||||||
- **Spanish**
 | 
					- **Spanish**
 | 
				
			||||||
  - Angeles Broullón
 | 
					  - Albakham
 | 
				
			||||||
  - Antón López
 | 
					 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
  - Carlos Mondragon
 | 
					  - Carlos Mondragon
 | 
				
			||||||
 | 
					  - Antón López
 | 
				
			||||||
 | 
					  - Max Winkler
 | 
				
			||||||
 | 
					  - Pablo de la Concepción Sanz
 | 
				
			||||||
 | 
					  - Sergio Soriano
 | 
				
			||||||
 | 
					  - Angeles Broullón
 | 
				
			||||||
 | 
					  - Lothar Wolf
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
  - David Charte
 | 
					  - David Charte
 | 
				
			||||||
  - Emmanuel
 | 
					  - Emmanuel
 | 
				
			||||||
  - Lothar Wolf
 | 
					 | 
				
			||||||
  - Pablo de la Concepción Sanz
 | 
					 | 
				
			||||||
- **Swedish**
 | 
					- **Swedish**
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
  - Elias Mårtenson
 | 
					 | 
				
			||||||
  - Isak Holmström
 | 
					  - Isak Holmström
 | 
				
			||||||
  - Shellkr
 | 
					  - Shellkr
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
 | 
					  - Elias Mårtenson
 | 
				
			||||||
  - Stefan Midjich
 | 
					  - Stefan Midjich
 | 
				
			||||||
  - Tim Stahel
 | 
					  - Tim Stahel
 | 
				
			||||||
 | 
					  - Jonas Hultén
 | 
				
			||||||
- **Telugu**
 | 
					- **Telugu**
 | 
				
			||||||
 | 
					  - avndp
 | 
				
			||||||
 | 
					  - Ranjith Tellakula
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
  - Joseph Nuthalapati
 | 
					  - Joseph Nuthalapati
 | 
				
			||||||
  - Ranjith Tellakula
 | 
					 | 
				
			||||||
  - avndp
 | 
					 | 
				
			||||||
- **Thai**
 | 
					- **Thai**
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
 | 
					  - parnikkapore
 | 
				
			||||||
 | 
					  - Thai Localization
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
- **Turkish**
 | 
					- **Turkish**
 | 
				
			||||||
 | 
					  - Ali Demirtas
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
- **Ukrainian**
 | 
					- **Ukrainian**
 | 
				
			||||||
  - ButterflyOfFire
 | 
					 | 
				
			||||||
  - Ivan Verchenko
 | 
					 | 
				
			||||||
  - alexcleac
 | 
					  - alexcleac
 | 
				
			||||||
- **Welsh**
 | 
					 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
  - Jaz-Michael King
 | 
					  - Aditoo
 | 
				
			||||||
  - Kevin Beynon
 | 
					  - Ivan Verchenko
 | 
				
			||||||
  - Owain Rhys Lewis
 | 
					- **Welsh**
 | 
				
			||||||
  - Renato "Lond" Cerqueira
 | 
					 | 
				
			||||||
  - Rhoslyn Prys
 | 
					 | 
				
			||||||
  - carl morris
 | 
					  - carl morris
 | 
				
			||||||
 | 
					  - Jaz-Michael King
 | 
				
			||||||
 | 
					  - Owain Rhys Lewis
 | 
				
			||||||
 | 
					  - Rhoslyn Prys
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
 | 
					  - ButterflyOfFire
 | 
				
			||||||
 | 
					  - Renato "Lond" Cerqueira
 | 
				
			||||||
 | 
					  - Albakham
 | 
				
			||||||
 | 
					  - Kevin Beynon
 | 
				
			||||||
- **Armenian**
 | 
					- **Armenian**
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
- **Latvian**
 | 
					- **Latvian**
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
 | 
					  - Maigonis
 | 
				
			||||||
- **Tamil**
 | 
					- **Tamil**
 | 
				
			||||||
 | 
					  - Aditoo
 | 
				
			||||||
  - ButterflyOfFire
 | 
					  - ButterflyOfFire
 | 
				
			||||||
  - Prasanna Venkadesh
 | 
					  - Prasanna Venkadesh
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										73
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										73
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| 
						 | 
					@ -3,6 +3,79 @@ Changelog
 | 
				
			||||||
 | 
					
 | 
				
			||||||
All notable changes to this project will be documented in this file.
 | 
					All notable changes to this project will be documented in this file.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [Unreleased]
 | 
				
			||||||
 | 
					### Added
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Add polls ([Gargron](https://github.com/tootsuite/mastodon/pull/10111), [ThibG](https://github.com/tootsuite/mastodon/pull/10155), [Gargron](https://github.com/tootsuite/mastodon/pull/10184), [ThibG](https://github.com/tootsuite/mastodon/pull/10196), [Gargron](https://github.com/tootsuite/mastodon/pull/10248), [ThibG](https://github.com/tootsuite/mastodon/pull/10255), [ThibG](https://github.com/tootsuite/mastodon/pull/10322), [Gargron](https://github.com/tootsuite/mastodon/pull/10138), [Gargron](https://github.com/tootsuite/mastodon/pull/10139), [Gargron](https://github.com/tootsuite/mastodon/pull/10144), [Gargron](https://github.com/tootsuite/mastodon/pull/10145),[Gargron](https://github.com/tootsuite/mastodon/pull/10146), [Gargron](https://github.com/tootsuite/mastodon/pull/10148), [Gargron](https://github.com/tootsuite/mastodon/pull/10151), [ThibG](https://github.com/tootsuite/mastodon/pull/10150), [Gargron](https://github.com/tootsuite/mastodon/pull/10168), [Gargron](https://github.com/tootsuite/mastodon/pull/10165), [Gargron](https://github.com/tootsuite/mastodon/pull/10172), [Gargron](https://github.com/tootsuite/mastodon/pull/10170), [Gargron](https://github.com/tootsuite/mastodon/pull/10171), [Gargron](https://github.com/tootsuite/mastodon/pull/10186), [Gargron](https://github.com/tootsuite/mastodon/pull/10189), [ThibG](https://github.com/tootsuite/mastodon/pull/10200), [rinsuki](https://github.com/tootsuite/mastodon/pull/10203), [Gargron](https://github.com/tootsuite/mastodon/pull/10213), [Gargron](https://github.com/tootsuite/mastodon/pull/10246), [Gargron](https://github.com/tootsuite/mastodon/pull/10265), [Gargron](https://github.com/tootsuite/mastodon/pull/10261), [ThibG](https://github.com/tootsuite/mastodon/pull/10333), [Gargron](https://github.com/tootsuite/mastodon/pull/10352), [ThibG](https://github.com/tootsuite/mastodon/pull/10140), [ThibG](https://github.com/tootsuite/mastodon/pull/10142), [ThibG](https://github.com/tootsuite/mastodon/pull/10141), [ThibG](https://github.com/tootsuite/mastodon/pull/10162), [ThibG](https://github.com/tootsuite/mastodon/pull/10161), [ThibG](https://github.com/tootsuite/mastodon/pull/10158), [ThibG](https://github.com/tootsuite/mastodon/pull/10156), [ThibG](https://github.com/tootsuite/mastodon/pull/10160), [Gargron](https://github.com/tootsuite/mastodon/pull/10185), [Gargron](https://github.com/tootsuite/mastodon/pull/10188), [ThibG](https://github.com/tootsuite/mastodon/pull/10195), [ThibG](https://github.com/tootsuite/mastodon/pull/10208), [Gargron](https://github.com/tootsuite/mastodon/pull/10187), [ThibG](https://github.com/tootsuite/mastodon/pull/10214), [ThibG](https://github.com/tootsuite/mastodon/pull/10209))
 | 
				
			||||||
 | 
					- Add follows & followers managing UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10268), [Gargron](https://github.com/tootsuite/mastodon/pull/10308), [Gargron](https://github.com/tootsuite/mastodon/pull/10404), [Gargron](https://github.com/tootsuite/mastodon/pull/10293))
 | 
				
			||||||
 | 
					- Add identity proof integration with Keybase ([Gargron](https://github.com/tootsuite/mastodon/pull/10297), [xgess](https://github.com/tootsuite/mastodon/pull/10375), [Gargron](https://github.com/tootsuite/mastodon/pull/10338), [Gargron](https://github.com/tootsuite/mastodon/pull/10350), [Gargron](https://github.com/tootsuite/mastodon/pull/10414))
 | 
				
			||||||
 | 
					- Add option to overwrite imported data instead of merging ([Gargron](https://github.com/tootsuite/mastodon/pull/9962))
 | 
				
			||||||
 | 
					- Add featured hashtags to profiles ([Gargron](https://github.com/tootsuite/mastodon/pull/9755), [Gargron](https://github.com/tootsuite/mastodon/pull/10167), [Gargron](https://github.com/tootsuite/mastodon/pull/10249), [ThibG](https://github.com/tootsuite/mastodon/pull/10034))
 | 
				
			||||||
 | 
					- Add admission-based registrations mode ([Gargron](https://github.com/tootsuite/mastodon/pull/10250), [ThibG](https://github.com/tootsuite/mastodon/pull/10269), [Gargron](https://github.com/tootsuite/mastodon/pull/10264), [ThibG](https://github.com/tootsuite/mastodon/pull/10321), [Gargron](https://github.com/tootsuite/mastodon/pull/10349))
 | 
				
			||||||
 | 
					- Add support for WebP uploads ([acid-chicken](https://github.com/tootsuite/mastodon/pull/9879))
 | 
				
			||||||
 | 
					- Add "copy link" item to status action bars in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/9983))
 | 
				
			||||||
 | 
					- Add list title editing in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/9748))
 | 
				
			||||||
 | 
					- Add a "Block & Report" button to the block confirmation dialog in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10360))
 | 
				
			||||||
 | 
					- Add disappointed elephant when the page crashes in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10275))
 | 
				
			||||||
 | 
					- Add ability to upload multiple files at once in web UI ([tmm576](https://github.com/tootsuite/mastodon/pull/9856))
 | 
				
			||||||
 | 
					- Add indication that you have been blocked when viewing profiles in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10420))
 | 
				
			||||||
 | 
					- Add validations to admin settings to catch common mistakes ([Gargron](https://github.com/tootsuite/mastodon/pull/10348), [ThibG](https://github.com/tootsuite/mastodon/pull/10354))
 | 
				
			||||||
 | 
					- Add `type`, `limit`, `offset`, `min_id`, `max_id`, `account_id` to search API ([Gargron](https://github.com/tootsuite/mastodon/pull/10091))
 | 
				
			||||||
 | 
					- Add a preferences API so apps can share basic behaviours ([Gargron](https://github.com/tootsuite/mastodon/pull/10109))
 | 
				
			||||||
 | 
					- Add `visibility` param to reblog REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/9851), [ThibG](https://github.com/tootsuite/mastodon/pull/10302))
 | 
				
			||||||
 | 
					- Add `allowfullscreen` attribute to OEmbed iframe ([rinsuki](https://github.com/tootsuite/mastodon/pull/10370))
 | 
				
			||||||
 | 
					- Add `blocked_by` relationship to the REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/10373))
 | 
				
			||||||
 | 
					- Add `tootctl statuses remove` to sweep unreferenced statuses ([Gargron](https://github.com/tootsuite/mastodon/pull/10063))
 | 
				
			||||||
 | 
					- Add `tootctl search deploy` to avoid ugly rake task syntax ([Gargron](https://github.com/tootsuite/mastodon/pull/10403))
 | 
				
			||||||
 | 
					- Add `tootctl self-destruct` to shut down server gracefully ([Gargron](https://github.com/tootsuite/mastodon/pull/10367))
 | 
				
			||||||
 | 
					- Add option to hide application used to toot ([ThibG](https://github.com/tootsuite/mastodon/pull/9897), [rinsuki](https://github.com/tootsuite/mastodon/pull/9994), [hinaloe](https://github.com/tootsuite/mastodon/pull/10086))
 | 
				
			||||||
 | 
					- Add `DB_SSLMODE` configuration variable ([sascha-sl](https://github.com/tootsuite/mastodon/pull/10210))
 | 
				
			||||||
 | 
					- Add click-to-copy UI to invites page ([Gargron](https://github.com/tootsuite/mastodon/pull/10259))
 | 
				
			||||||
 | 
					- Add self-replies fetching ([ThibG](https://github.com/tootsuite/mastodon/pull/10106), [ThibG](https://github.com/tootsuite/mastodon/pull/10128), [ThibG](https://github.com/tootsuite/mastodon/pull/10175), [ThibG](https://github.com/tootsuite/mastodon/pull/10201))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Change design of landing page ([Gargron](https://github.com/tootsuite/mastodon/pull/10232), [Gargron](https://github.com/tootsuite/mastodon/pull/10260), [ThibG](https://github.com/tootsuite/mastodon/pull/10284), [ThibG](https://github.com/tootsuite/mastodon/pull/10291), [koyuawsmbrtn](https://github.com/tootsuite/mastodon/pull/10356), [Gargron](https://github.com/tootsuite/mastodon/pull/10245))
 | 
				
			||||||
 | 
					- Change design of profile column in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10337), [Aditoo17](https://github.com/tootsuite/mastodon/pull/10387), [ThibG](https://github.com/tootsuite/mastodon/pull/10390), [mayaeh](https://github.com/tootsuite/mastodon/pull/10379), [ThibG](https://github.com/tootsuite/mastodon/pull/10411))
 | 
				
			||||||
 | 
					- Change language detector threshold from 140 characters to 4 words ([Gargron](https://github.com/tootsuite/mastodon/pull/10376))
 | 
				
			||||||
 | 
					- Change language detector to always kick in for non-latin alphabets ([Gargron](https://github.com/tootsuite/mastodon/pull/10276))
 | 
				
			||||||
 | 
					- Change icons of features on admin dashboard ([Gargron](https://github.com/tootsuite/mastodon/pull/10366))
 | 
				
			||||||
 | 
					- Change DNS timeouts from 1s to 5s ([ThibG](https://github.com/tootsuite/mastodon/pull/10238))
 | 
				
			||||||
 | 
					- Change Docker image to use Ubuntu with jemalloc ([Sir-Boops](https://github.com/tootsuite/mastodon/pull/10100), [BenLubar](https://github.com/tootsuite/mastodon/pull/10212))
 | 
				
			||||||
 | 
					- Change public pages to be cacheable by proxies ([BenLubar](https://github.com/tootsuite/mastodon/pull/9059))
 | 
				
			||||||
 | 
					- Change the 410 gone response for suspended accounts to be cacheable by proxies ([ThibG](https://github.com/tootsuite/mastodon/pull/10339))
 | 
				
			||||||
 | 
					- Change web UI to not not empty timeline of blocked users on block ([ThibG](https://github.com/tootsuite/mastodon/pull/10359))
 | 
				
			||||||
 | 
					- Change JSON serializer to remove unused `@context` values ([Gargron](https://github.com/tootsuite/mastodon/pull/10378))
 | 
				
			||||||
 | 
					- Change GIFV file size limit to be the same as for other videos ([rinsuki](https://github.com/tootsuite/mastodon/pull/9924))
 | 
				
			||||||
 | 
					- Change Webpack to not use @babel/preset-env to compile node_modules ([ykzts](https://github.com/tootsuite/mastodon/pull/10289))
 | 
				
			||||||
 | 
					- Change web UI to use new Web Share Target API ([gol-cha](https://github.com/tootsuite/mastodon/pull/9963))
 | 
				
			||||||
 | 
					- Change ActivityPub reports to have persistent URIs ([ThibG](https://github.com/tootsuite/mastodon/pull/10303))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Removed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Remove zopfli compression to speed up Webpack from 6min to 1min ([nolanlawson](https://github.com/tootsuite/mastodon/pull/10288))
 | 
				
			||||||
 | 
					- Remove stats.json generation to speed up Webpack ([nolanlawson](https://github.com/tootsuite/mastodon/pull/10290))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Fix public timelines being broken by new toots when they are not mounted in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10131))
 | 
				
			||||||
 | 
					- Fix quick filter settings not being saved when selecting a different filter in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10296))
 | 
				
			||||||
 | 
					- Fix remote interaction dialogs being indexed by search engines ([Gargron](https://github.com/tootsuite/mastodon/pull/10240))
 | 
				
			||||||
 | 
					- Fix maxed-out invites not showing up as expired in UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10274))
 | 
				
			||||||
 | 
					- Fix scrollbar styles on compose textarea ([Gargron](https://github.com/tootsuite/mastodon/pull/10292))
 | 
				
			||||||
 | 
					- Fix timeline merge workers being queued for remote users ([Gargron](https://github.com/tootsuite/mastodon/pull/10355))
 | 
				
			||||||
 | 
					- Fix alternative relay support regression ([Gargron](https://github.com/tootsuite/mastodon/pull/10398))
 | 
				
			||||||
 | 
					- Fix trying to fetch keys of unknown accounts on a self-delete from them ([ThibG](https://github.com/tootsuite/mastodon/pull/10326))
 | 
				
			||||||
 | 
					- Fix CAS `:service_validate_url` option ([enewhuis](https://github.com/tootsuite/mastodon/pull/10328))
 | 
				
			||||||
 | 
					- Fix race conditions when creating backups ([ThibG](https://github.com/tootsuite/mastodon/pull/10234))
 | 
				
			||||||
 | 
					- Fix whitespace not being stripped out of username before validation ([aurelien-reeves](https://github.com/tootsuite/mastodon/pull/10239))
 | 
				
			||||||
 | 
					- Fix n+1 query when deleting status ([Gargron](https://github.com/tootsuite/mastodon/pull/10247))
 | 
				
			||||||
 | 
					- Fix exiting follows not being rejected when suspending a remote account ([ThibG](https://github.com/tootsuite/mastodon/pull/10230))
 | 
				
			||||||
 | 
					- Fix the underlying button element in a disabled icon button not being disabled ([ThibG](https://github.com/tootsuite/mastodon/pull/10194))
 | 
				
			||||||
 | 
					- Fix race condition when streaming out deleted statuses ([ThibG](https://github.com/tootsuite/mastodon/pull/10280))
 | 
				
			||||||
 | 
					- Fix performance of admin federation UI by caching account counts ([Gargron](https://github.com/tootsuite/mastodon/pull/10374))
 | 
				
			||||||
 | 
					- Fix JS error on pages that don't define a CSRF token ([hinaloe](https://github.com/tootsuite/mastodon/pull/10383))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## [2.7.4] - 2019-03-05
 | 
					## [2.7.4] - 2019-03-05
 | 
				
			||||||
### Fixed
 | 
					### Fixed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								Gemfile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Gemfile
									
									
									
									
									
								
							| 
						 | 
					@ -108,7 +108,7 @@ group :production, :test do
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
group :test do
 | 
					group :test do
 | 
				
			||||||
  gem 'capybara', '~> 3.15'
 | 
					  gem 'capybara', '~> 3.16'
 | 
				
			||||||
  gem 'climate_control', '~> 0.2'
 | 
					  gem 'climate_control', '~> 0.2'
 | 
				
			||||||
  gem 'faker', '~> 1.9'
 | 
					  gem 'faker', '~> 1.9'
 | 
				
			||||||
  gem 'microformats', '~> 4.1'
 | 
					  gem 'microformats', '~> 4.1'
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -127,7 +127,7 @@ GEM
 | 
				
			||||||
      sshkit (~> 1.3)
 | 
					      sshkit (~> 1.3)
 | 
				
			||||||
    capistrano-yarn (2.0.2)
 | 
					    capistrano-yarn (2.0.2)
 | 
				
			||||||
      capistrano (~> 3.0)
 | 
					      capistrano (~> 3.0)
 | 
				
			||||||
    capybara (3.15.0)
 | 
					    capybara (3.16.0)
 | 
				
			||||||
      addressable
 | 
					      addressable
 | 
				
			||||||
      mini_mime (>= 0.1.3)
 | 
					      mini_mime (>= 0.1.3)
 | 
				
			||||||
      nokogiri (~> 1.8)
 | 
					      nokogiri (~> 1.8)
 | 
				
			||||||
| 
						 | 
					@ -672,7 +672,7 @@ DEPENDENCIES
 | 
				
			||||||
  capistrano-rails (~> 1.4)
 | 
					  capistrano-rails (~> 1.4)
 | 
				
			||||||
  capistrano-rbenv (~> 2.1)
 | 
					  capistrano-rbenv (~> 2.1)
 | 
				
			||||||
  capistrano-yarn (~> 2.0)
 | 
					  capistrano-yarn (~> 2.0)
 | 
				
			||||||
  capybara (~> 3.15)
 | 
					  capybara (~> 3.16)
 | 
				
			||||||
  charlock_holmes (~> 0.7.6)
 | 
					  charlock_holmes (~> 0.7.6)
 | 
				
			||||||
  chewy (~> 5.0)
 | 
					  chewy (~> 5.0)
 | 
				
			||||||
  cld3 (~> 3.2.3)
 | 
					  cld3 (~> 3.2.3)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,6 +37,7 @@ export function submitSearch() {
 | 
				
			||||||
      params: {
 | 
					      params: {
 | 
				
			||||||
        q: value,
 | 
					        q: value,
 | 
				
			||||||
        resolve: true,
 | 
					        resolve: true,
 | 
				
			||||||
 | 
					        limit: 5,
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
    }).then(response => {
 | 
					    }).then(response => {
 | 
				
			||||||
      if (response.data.accounts) {
 | 
					      if (response.data.accounts) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -94,15 +94,15 @@ class Header extends ImmutablePureComponent {
 | 
				
			||||||
    let menu        = [];
 | 
					    let menu        = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (me !== account.get('id') && account.getIn(['relationship', 'followed_by'])) {
 | 
					    if (me !== account.get('id') && account.getIn(['relationship', 'followed_by'])) {
 | 
				
			||||||
      info.push(<span className='relationship-tag'><FormattedMessage id='account.follows_you' defaultMessage='Follows you' /></span>);
 | 
					      info.push(<span key='followed_by' className='relationship-tag'><FormattedMessage id='account.follows_you' defaultMessage='Follows you' /></span>);
 | 
				
			||||||
    } else if (me !== account.get('id') && account.getIn(['relationship', 'blocking'])) {
 | 
					    } else if (me !== account.get('id') && account.getIn(['relationship', 'blocking'])) {
 | 
				
			||||||
      info.push(<span className='relationship-tag'><FormattedMessage id='account.blocked' defaultMessage='Blocked' /></span>);
 | 
					      info.push(<span key='blocked' className='relationship-tag'><FormattedMessage id='account.blocked' defaultMessage='Blocked' /></span>);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (me !== account.get('id') && account.getIn(['relationship', 'muting'])) {
 | 
					    if (me !== account.get('id') && account.getIn(['relationship', 'muting'])) {
 | 
				
			||||||
      info.push(<span className='relationship-tag'><FormattedMessage id='account.muted' defaultMessage='Muted' /></span>);
 | 
					      info.push(<span key='muted' className='relationship-tag'><FormattedMessage id='account.muted' defaultMessage='Muted' /></span>);
 | 
				
			||||||
    } else if (me !== account.get('id') && account.getIn(['relationship', 'domain_blocking'])) {
 | 
					    } else if (me !== account.get('id') && account.getIn(['relationship', 'domain_blocking'])) {
 | 
				
			||||||
      info.push(<span className='relationship-tag'><FormattedMessage id='account.domain_blocked' defaultMessage='Domain hidden' /></span>);
 | 
					      info.push(<span key='domain_blocked' className='relationship-tag'><FormattedMessage id='account.domain_blocked' defaultMessage='Domain hidden' /></span>);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (me !== account.get('id')) {
 | 
					    if (me !== account.get('id')) {
 | 
				
			||||||
| 
						 | 
					@ -111,7 +111,7 @@ class Header extends ImmutablePureComponent {
 | 
				
			||||||
      } else if (account.getIn(['relationship', 'requested'])) {
 | 
					      } else if (account.getIn(['relationship', 'requested'])) {
 | 
				
			||||||
        actionBtn = <Button className='logo-button' text={intl.formatMessage(messages.requested)} onClick={this.props.onFollow} />;
 | 
					        actionBtn = <Button className='logo-button' text={intl.formatMessage(messages.requested)} onClick={this.props.onFollow} />;
 | 
				
			||||||
      } else if (!account.getIn(['relationship', 'blocking'])) {
 | 
					      } else if (!account.getIn(['relationship', 'blocking'])) {
 | 
				
			||||||
        actionBtn = <Button className={classNames('logo-button', { 'button--destructive': account.getIn(['relationship', 'following']) })} text={intl.formatMessage(account.getIn(['relationship', 'following']) ? messages.unfollow : messages.follow)} onClick={this.props.onFollow} />;
 | 
					        actionBtn = <Button disabled={account.getIn(['relationship', 'blocked_by'])} className={classNames('logo-button', { 'button--destructive': account.getIn(['relationship', 'following']) })} text={intl.formatMessage(account.getIn(['relationship', 'following']) ? messages.unfollow : messages.follow)} onClick={this.props.onFollow} />;
 | 
				
			||||||
      } else if (account.getIn(['relationship', 'blocking'])) {
 | 
					      } else if (account.getIn(['relationship', 'blocking'])) {
 | 
				
			||||||
        actionBtn = <Button className='logo-button' text={intl.formatMessage(messages.unblock, { name: account.get('username') })} onClick={this.props.onBlock} />;
 | 
					        actionBtn = <Button className='logo-button' text={intl.formatMessage(messages.unblock, { name: account.get('username') })} onClick={this.props.onBlock} />;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,14 +14,17 @@ import ImmutablePureComponent from 'react-immutable-pure-component';
 | 
				
			||||||
import { FormattedMessage } from 'react-intl';
 | 
					import { FormattedMessage } from 'react-intl';
 | 
				
			||||||
import { fetchAccountIdentityProofs } from '../../actions/identity_proofs';
 | 
					import { fetchAccountIdentityProofs } from '../../actions/identity_proofs';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const emptyList = ImmutableList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const mapStateToProps = (state, { params: { accountId }, withReplies = false }) => {
 | 
					const mapStateToProps = (state, { params: { accountId }, withReplies = false }) => {
 | 
				
			||||||
  const path = withReplies ? `${accountId}:with_replies` : accountId;
 | 
					  const path = withReplies ? `${accountId}:with_replies` : accountId;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return {
 | 
					  return {
 | 
				
			||||||
    statusIds: state.getIn(['timelines', `account:${path}`, 'items'], ImmutableList()),
 | 
					    statusIds: state.getIn(['timelines', `account:${path}`, 'items'], emptyList),
 | 
				
			||||||
    featuredStatusIds: withReplies ? ImmutableList() : state.getIn(['timelines', `account:${accountId}:pinned`, 'items'], ImmutableList()),
 | 
					    featuredStatusIds: withReplies ? ImmutableList() : state.getIn(['timelines', `account:${accountId}:pinned`, 'items'], emptyList),
 | 
				
			||||||
    isLoading: state.getIn(['timelines', `account:${path}`, 'isLoading']),
 | 
					    isLoading: state.getIn(['timelines', `account:${path}`, 'isLoading']),
 | 
				
			||||||
    hasMore:   state.getIn(['timelines', `account:${path}`, 'hasMore']),
 | 
					    hasMore: state.getIn(['timelines', `account:${path}`, 'hasMore']),
 | 
				
			||||||
 | 
					    blockedBy: state.getIn(['relationships', accountId, 'blocked_by'], false),
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,6 +40,7 @@ class AccountTimeline extends ImmutablePureComponent {
 | 
				
			||||||
    isLoading: PropTypes.bool,
 | 
					    isLoading: PropTypes.bool,
 | 
				
			||||||
    hasMore: PropTypes.bool,
 | 
					    hasMore: PropTypes.bool,
 | 
				
			||||||
    withReplies: PropTypes.bool,
 | 
					    withReplies: PropTypes.bool,
 | 
				
			||||||
 | 
					    blockedBy: PropTypes.bool,
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  componentWillMount () {
 | 
					  componentWillMount () {
 | 
				
			||||||
| 
						 | 
					@ -44,9 +48,11 @@ class AccountTimeline extends ImmutablePureComponent {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.props.dispatch(fetchAccount(accountId));
 | 
					    this.props.dispatch(fetchAccount(accountId));
 | 
				
			||||||
    this.props.dispatch(fetchAccountIdentityProofs(accountId));
 | 
					    this.props.dispatch(fetchAccountIdentityProofs(accountId));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!withReplies) {
 | 
					    if (!withReplies) {
 | 
				
			||||||
      this.props.dispatch(expandAccountFeaturedTimeline(accountId));
 | 
					      this.props.dispatch(expandAccountFeaturedTimeline(accountId));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.props.dispatch(expandAccountTimeline(accountId, { withReplies }));
 | 
					    this.props.dispatch(expandAccountTimeline(accountId, { withReplies }));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -54,9 +60,11 @@ class AccountTimeline extends ImmutablePureComponent {
 | 
				
			||||||
    if ((nextProps.params.accountId !== this.props.params.accountId && nextProps.params.accountId) || nextProps.withReplies !== this.props.withReplies) {
 | 
					    if ((nextProps.params.accountId !== this.props.params.accountId && nextProps.params.accountId) || nextProps.withReplies !== this.props.withReplies) {
 | 
				
			||||||
      this.props.dispatch(fetchAccount(nextProps.params.accountId));
 | 
					      this.props.dispatch(fetchAccount(nextProps.params.accountId));
 | 
				
			||||||
      this.props.dispatch(fetchAccountIdentityProofs(nextProps.params.accountId));
 | 
					      this.props.dispatch(fetchAccountIdentityProofs(nextProps.params.accountId));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (!nextProps.withReplies) {
 | 
					      if (!nextProps.withReplies) {
 | 
				
			||||||
        this.props.dispatch(expandAccountFeaturedTimeline(nextProps.params.accountId));
 | 
					        this.props.dispatch(expandAccountFeaturedTimeline(nextProps.params.accountId));
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      this.props.dispatch(expandAccountTimeline(nextProps.params.accountId, { withReplies: nextProps.params.withReplies }));
 | 
					      this.props.dispatch(expandAccountTimeline(nextProps.params.accountId, { withReplies: nextProps.params.withReplies }));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -66,7 +74,7 @@ class AccountTimeline extends ImmutablePureComponent {
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  render () {
 | 
					  render () {
 | 
				
			||||||
    const { shouldUpdateScroll, statusIds, featuredStatusIds, isLoading, hasMore } = this.props;
 | 
					    const { shouldUpdateScroll, statusIds, featuredStatusIds, isLoading, hasMore, blockedBy } = this.props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!statusIds && isLoading) {
 | 
					    if (!statusIds && isLoading) {
 | 
				
			||||||
      return (
 | 
					      return (
 | 
				
			||||||
| 
						 | 
					@ -76,6 +84,8 @@ class AccountTimeline extends ImmutablePureComponent {
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const emptyMessage = blockedBy ? <FormattedMessage id='empty_column.account_timeline_blocked' defaultMessage='You are blocked' /> : <FormattedMessage id='empty_column.account_timeline' defaultMessage='No toots here!' />;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
      <Column>
 | 
					      <Column>
 | 
				
			||||||
        <ColumnBackButton />
 | 
					        <ColumnBackButton />
 | 
				
			||||||
| 
						 | 
					@ -84,13 +94,13 @@ class AccountTimeline extends ImmutablePureComponent {
 | 
				
			||||||
          prepend={<HeaderContainer accountId={this.props.params.accountId} />}
 | 
					          prepend={<HeaderContainer accountId={this.props.params.accountId} />}
 | 
				
			||||||
          alwaysPrepend
 | 
					          alwaysPrepend
 | 
				
			||||||
          scrollKey='account_timeline'
 | 
					          scrollKey='account_timeline'
 | 
				
			||||||
          statusIds={statusIds}
 | 
					          statusIds={blockedBy ? emptyList : statusIds}
 | 
				
			||||||
          featuredStatusIds={featuredStatusIds}
 | 
					          featuredStatusIds={featuredStatusIds}
 | 
				
			||||||
          isLoading={isLoading}
 | 
					          isLoading={isLoading}
 | 
				
			||||||
          hasMore={hasMore}
 | 
					          hasMore={hasMore}
 | 
				
			||||||
          onLoadMore={this.handleLoadMore}
 | 
					          onLoadMore={this.handleLoadMore}
 | 
				
			||||||
          shouldUpdateScroll={shouldUpdateScroll}
 | 
					          shouldUpdateScroll={shouldUpdateScroll}
 | 
				
			||||||
          emptyMessage={<FormattedMessage id='empty_column.account_timeline' defaultMessage='No toots here!' />}
 | 
					          emptyMessage={emptyMessage}
 | 
				
			||||||
        />
 | 
					        />
 | 
				
			||||||
      </Column>
 | 
					      </Column>
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,35 +0,0 @@
 | 
				
			||||||
import React from 'react';
 | 
					 | 
				
			||||||
import PropTypes from 'prop-types';
 | 
					 | 
				
			||||||
import ImmutablePropTypes from 'react-immutable-proptypes';
 | 
					 | 
				
			||||||
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 | 
					 | 
				
			||||||
import SettingText from '../../../components/setting_text';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const messages = defineMessages({
 | 
					 | 
				
			||||||
  filter_regex: { id: 'home.column_settings.filter_regex', defaultMessage: 'Filter out by regular expressions' },
 | 
					 | 
				
			||||||
  settings: { id: 'home.settings', defaultMessage: 'Column settings' },
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export default @injectIntl
 | 
					 | 
				
			||||||
class ColumnSettings extends React.PureComponent {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  static propTypes = {
 | 
					 | 
				
			||||||
    settings: ImmutablePropTypes.map.isRequired,
 | 
					 | 
				
			||||||
    onChange: PropTypes.func.isRequired,
 | 
					 | 
				
			||||||
    intl: PropTypes.object.isRequired,
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  render () {
 | 
					 | 
				
			||||||
    const { settings, onChange, intl } = this.props;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return (
 | 
					 | 
				
			||||||
      <div>
 | 
					 | 
				
			||||||
        <span className='column-settings__section'><FormattedMessage id='home.column_settings.advanced' defaultMessage='Advanced' /></span>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        <div className='column-settings__row'>
 | 
					 | 
				
			||||||
          <SettingText settings={settings} settingKey={['regex', 'body']} onChange={onChange} label={intl.formatMessage(messages.filter_regex)} />
 | 
					 | 
				
			||||||
        </div>
 | 
					 | 
				
			||||||
      </div>
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,17 +0,0 @@
 | 
				
			||||||
import { connect } from 'react-redux';
 | 
					 | 
				
			||||||
import ColumnSettings from '../components/column_settings';
 | 
					 | 
				
			||||||
import { changeSetting } from '../../../actions/settings';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const mapStateToProps = state => ({
 | 
					 | 
				
			||||||
  settings: state.getIn(['settings', 'direct']),
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const mapDispatchToProps = dispatch => ({
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  onChange (key, checked) {
 | 
					 | 
				
			||||||
    dispatch(changeSetting(['direct', ...key], checked));
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export default connect(mapStateToProps, mapDispatchToProps)(ColumnSettings);
 | 
					 | 
				
			||||||
| 
						 | 
					@ -20,6 +20,7 @@ import ScrollableList from '../../components/scrollable_list';
 | 
				
			||||||
const mapStateToProps = (state, props) => ({
 | 
					const mapStateToProps = (state, props) => ({
 | 
				
			||||||
  accountIds: state.getIn(['user_lists', 'followers', props.params.accountId, 'items']),
 | 
					  accountIds: state.getIn(['user_lists', 'followers', props.params.accountId, 'items']),
 | 
				
			||||||
  hasMore: !!state.getIn(['user_lists', 'followers', props.params.accountId, 'next']),
 | 
					  hasMore: !!state.getIn(['user_lists', 'followers', props.params.accountId, 'next']),
 | 
				
			||||||
 | 
					  blockedBy: state.getIn(['relationships', props.params.accountId, 'blocked_by'], false),
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default @connect(mapStateToProps)
 | 
					export default @connect(mapStateToProps)
 | 
				
			||||||
| 
						 | 
					@ -31,6 +32,7 @@ class Followers extends ImmutablePureComponent {
 | 
				
			||||||
    shouldUpdateScroll: PropTypes.func,
 | 
					    shouldUpdateScroll: PropTypes.func,
 | 
				
			||||||
    accountIds: ImmutablePropTypes.list,
 | 
					    accountIds: ImmutablePropTypes.list,
 | 
				
			||||||
    hasMore: PropTypes.bool,
 | 
					    hasMore: PropTypes.bool,
 | 
				
			||||||
 | 
					    blockedBy: PropTypes.bool,
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  componentWillMount () {
 | 
					  componentWillMount () {
 | 
				
			||||||
| 
						 | 
					@ -50,7 +52,7 @@ class Followers extends ImmutablePureComponent {
 | 
				
			||||||
  }, 300, { leading: true });
 | 
					  }, 300, { leading: true });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  render () {
 | 
					  render () {
 | 
				
			||||||
    const { shouldUpdateScroll, accountIds, hasMore } = this.props;
 | 
					    const { shouldUpdateScroll, accountIds, hasMore, blockedBy } = this.props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!accountIds) {
 | 
					    if (!accountIds) {
 | 
				
			||||||
      return (
 | 
					      return (
 | 
				
			||||||
| 
						 | 
					@ -60,7 +62,7 @@ class Followers extends ImmutablePureComponent {
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const emptyMessage = <FormattedMessage id='account.followers.empty' defaultMessage='No one follows this user yet.' />;
 | 
					    const emptyMessage = blockedBy ? <FormattedMessage id='empty_column.account_timeline_blocked' defaultMessage='You are blocked' /> : <FormattedMessage id='account.followers.empty' defaultMessage='No one follows this user yet.' />;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
      <Column>
 | 
					      <Column>
 | 
				
			||||||
| 
						 | 
					@ -75,7 +77,7 @@ class Followers extends ImmutablePureComponent {
 | 
				
			||||||
          alwaysPrepend
 | 
					          alwaysPrepend
 | 
				
			||||||
          emptyMessage={emptyMessage}
 | 
					          emptyMessage={emptyMessage}
 | 
				
			||||||
        >
 | 
					        >
 | 
				
			||||||
          {accountIds.map(id =>
 | 
					          {blockedBy ? [] : accountIds.map(id =>
 | 
				
			||||||
            <AccountContainer key={id} id={id} withNote={false} />
 | 
					            <AccountContainer key={id} id={id} withNote={false} />
 | 
				
			||||||
          )}
 | 
					          )}
 | 
				
			||||||
        </ScrollableList>
 | 
					        </ScrollableList>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,6 +20,7 @@ import ScrollableList from '../../components/scrollable_list';
 | 
				
			||||||
const mapStateToProps = (state, props) => ({
 | 
					const mapStateToProps = (state, props) => ({
 | 
				
			||||||
  accountIds: state.getIn(['user_lists', 'following', props.params.accountId, 'items']),
 | 
					  accountIds: state.getIn(['user_lists', 'following', props.params.accountId, 'items']),
 | 
				
			||||||
  hasMore: !!state.getIn(['user_lists', 'following', props.params.accountId, 'next']),
 | 
					  hasMore: !!state.getIn(['user_lists', 'following', props.params.accountId, 'next']),
 | 
				
			||||||
 | 
					  blockedBy: state.getIn(['relationships', props.params.accountId, 'blocked_by'], false),
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default @connect(mapStateToProps)
 | 
					export default @connect(mapStateToProps)
 | 
				
			||||||
| 
						 | 
					@ -31,6 +32,7 @@ class Following extends ImmutablePureComponent {
 | 
				
			||||||
    shouldUpdateScroll: PropTypes.func,
 | 
					    shouldUpdateScroll: PropTypes.func,
 | 
				
			||||||
    accountIds: ImmutablePropTypes.list,
 | 
					    accountIds: ImmutablePropTypes.list,
 | 
				
			||||||
    hasMore: PropTypes.bool,
 | 
					    hasMore: PropTypes.bool,
 | 
				
			||||||
 | 
					    blockedBy: PropTypes.bool,
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  componentWillMount () {
 | 
					  componentWillMount () {
 | 
				
			||||||
| 
						 | 
					@ -50,7 +52,7 @@ class Following extends ImmutablePureComponent {
 | 
				
			||||||
  }, 300, { leading: true });
 | 
					  }, 300, { leading: true });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  render () {
 | 
					  render () {
 | 
				
			||||||
    const { shouldUpdateScroll, accountIds, hasMore } = this.props;
 | 
					    const { shouldUpdateScroll, accountIds, hasMore, blockedBy } = this.props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!accountIds) {
 | 
					    if (!accountIds) {
 | 
				
			||||||
      return (
 | 
					      return (
 | 
				
			||||||
| 
						 | 
					@ -60,7 +62,7 @@ class Following extends ImmutablePureComponent {
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const emptyMessage = <FormattedMessage id='account.follows.empty' defaultMessage="This user doesn't follow anyone yet." />;
 | 
					    const emptyMessage = blockedBy ? <FormattedMessage id='empty_column.account_timeline_blocked' defaultMessage='You are blocked' /> : <FormattedMessage id='account.follows.empty' defaultMessage="This user doesn't follow anyone yet." />;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
      <Column>
 | 
					      <Column>
 | 
				
			||||||
| 
						 | 
					@ -75,7 +77,7 @@ class Following extends ImmutablePureComponent {
 | 
				
			||||||
          alwaysPrepend
 | 
					          alwaysPrepend
 | 
				
			||||||
          emptyMessage={emptyMessage}
 | 
					          emptyMessage={emptyMessage}
 | 
				
			||||||
        >
 | 
					        >
 | 
				
			||||||
          {accountIds.map(id =>
 | 
					          {blockedBy ? [] : accountIds.map(id =>
 | 
				
			||||||
            <AccountContainer key={id} id={id} withNote={false} />
 | 
					            <AccountContainer key={id} id={id} withNote={false} />
 | 
				
			||||||
          )}
 | 
					          )}
 | 
				
			||||||
        </ScrollableList>
 | 
					        </ScrollableList>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -83,7 +83,7 @@
 | 
				
			||||||
  "compose_form.spoiler.unmarked": "Testu micca piattatu",
 | 
					  "compose_form.spoiler.unmarked": "Testu micca piattatu",
 | 
				
			||||||
  "compose_form.spoiler_placeholder": "Scrive u vostr'avertimentu quì",
 | 
					  "compose_form.spoiler_placeholder": "Scrive u vostr'avertimentu quì",
 | 
				
			||||||
  "confirmation_modal.cancel": "Annullà",
 | 
					  "confirmation_modal.cancel": "Annullà",
 | 
				
			||||||
  "confirmations.block.block_and_report": "Block & Report",
 | 
					  "confirmations.block.block_and_report": "Bluccà è signalà",
 | 
				
			||||||
  "confirmations.block.confirm": "Bluccà",
 | 
					  "confirmations.block.confirm": "Bluccà",
 | 
				
			||||||
  "confirmations.block.message": "Site sicuru·a che vulete bluccà @{name}?",
 | 
					  "confirmations.block.message": "Site sicuru·a che vulete bluccà @{name}?",
 | 
				
			||||||
  "confirmations.delete.confirm": "Toglie",
 | 
					  "confirmations.delete.confirm": "Toglie",
 | 
				
			||||||
| 
						 | 
					@ -136,7 +136,7 @@
 | 
				
			||||||
  "follow_request.reject": "Righjittà",
 | 
					  "follow_request.reject": "Righjittà",
 | 
				
			||||||
  "getting_started.developers": "Sviluppatori",
 | 
					  "getting_started.developers": "Sviluppatori",
 | 
				
			||||||
  "getting_started.directory": "Annuariu di i prufili",
 | 
					  "getting_started.directory": "Annuariu di i prufili",
 | 
				
			||||||
  "getting_started.documentation": "Documentation",
 | 
					  "getting_started.documentation": "Ducumentazione",
 | 
				
			||||||
  "getting_started.heading": "Per principià",
 | 
					  "getting_started.heading": "Per principià",
 | 
				
			||||||
  "getting_started.invite": "Invità ghjente",
 | 
					  "getting_started.invite": "Invità ghjente",
 | 
				
			||||||
  "getting_started.open_source_notice": "Mastodon ghjè un lugiziale liberu. Pudete cuntribuisce à u codice o a traduzione, o palisà un bug, nant'à GitHub: {github}.",
 | 
					  "getting_started.open_source_notice": "Mastodon ghjè un lugiziale liberu. Pudete cuntribuisce à u codice o a traduzione, o palisà un bug, nant'à GitHub: {github}.",
 | 
				
			||||||
| 
						 | 
					@ -238,7 +238,7 @@
 | 
				
			||||||
  "navigation_bar.lists": "Liste",
 | 
					  "navigation_bar.lists": "Liste",
 | 
				
			||||||
  "navigation_bar.logout": "Scunnettassi",
 | 
					  "navigation_bar.logout": "Scunnettassi",
 | 
				
			||||||
  "navigation_bar.mutes": "Utilizatori piattati",
 | 
					  "navigation_bar.mutes": "Utilizatori piattati",
 | 
				
			||||||
  "navigation_bar.personal": "Personal",
 | 
					  "navigation_bar.personal": "Persunale",
 | 
				
			||||||
  "navigation_bar.pins": "Statuti puntarulati",
 | 
					  "navigation_bar.pins": "Statuti puntarulati",
 | 
				
			||||||
  "navigation_bar.preferences": "Preferenze",
 | 
					  "navigation_bar.preferences": "Preferenze",
 | 
				
			||||||
  "navigation_bar.public_timeline": "Linea pubblica glubale",
 | 
					  "navigation_bar.public_timeline": "Linea pubblica glubale",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,7 +26,7 @@
 | 
				
			||||||
  "account.posts": "Tooty",
 | 
					  "account.posts": "Tooty",
 | 
				
			||||||
  "account.posts_with_replies": "Tooty a odpovědi",
 | 
					  "account.posts_with_replies": "Tooty a odpovědi",
 | 
				
			||||||
  "account.report": "Nahlásit uživatele @{name}",
 | 
					  "account.report": "Nahlásit uživatele @{name}",
 | 
				
			||||||
  "account.requested": "Požadavek čeká na schválení. Kliknutím zrušíte požadavek o sledování",
 | 
					  "account.requested": "Čekám na schválení. Kliknutím zrušíte požadavek o sledování",
 | 
				
			||||||
  "account.share": "Sdílet profil uživatele @{name}",
 | 
					  "account.share": "Sdílet profil uživatele @{name}",
 | 
				
			||||||
  "account.show_reblogs": "Zobrazit boosty od uživatele @{name}",
 | 
					  "account.show_reblogs": "Zobrazit boosty od uživatele @{name}",
 | 
				
			||||||
  "account.unblock": "Odblokovat uživatele @{name}",
 | 
					  "account.unblock": "Odblokovat uživatele @{name}",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -83,7 +83,7 @@
 | 
				
			||||||
  "compose_form.spoiler.unmarked": "نوشته پنهان نیست",
 | 
					  "compose_form.spoiler.unmarked": "نوشته پنهان نیست",
 | 
				
			||||||
  "compose_form.spoiler_placeholder": "هشدار محتوا",
 | 
					  "compose_form.spoiler_placeholder": "هشدار محتوا",
 | 
				
			||||||
  "confirmation_modal.cancel": "بیخیال",
 | 
					  "confirmation_modal.cancel": "بیخیال",
 | 
				
			||||||
  "confirmations.block.block_and_report": "Block & Report",
 | 
					  "confirmations.block.block_and_report": "مسدودسازی و گزارش",
 | 
				
			||||||
  "confirmations.block.confirm": "مسدود کن",
 | 
					  "confirmations.block.confirm": "مسدود کن",
 | 
				
			||||||
  "confirmations.block.message": "آیا واقعاً میخواهید {name} را مسدود کنید؟",
 | 
					  "confirmations.block.message": "آیا واقعاً میخواهید {name} را مسدود کنید؟",
 | 
				
			||||||
  "confirmations.delete.confirm": "پاک کن",
 | 
					  "confirmations.delete.confirm": "پاک کن",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -83,7 +83,7 @@
 | 
				
			||||||
  "compose_form.spoiler.unmarked": "열람주의가 설정 되어 있지 않습니다",
 | 
					  "compose_form.spoiler.unmarked": "열람주의가 설정 되어 있지 않습니다",
 | 
				
			||||||
  "compose_form.spoiler_placeholder": "경고",
 | 
					  "compose_form.spoiler_placeholder": "경고",
 | 
				
			||||||
  "confirmation_modal.cancel": "취소",
 | 
					  "confirmation_modal.cancel": "취소",
 | 
				
			||||||
  "confirmations.block.block_and_report": "Block & Report",
 | 
					  "confirmations.block.block_and_report": "차단하고 신고하기",
 | 
				
			||||||
  "confirmations.block.confirm": "차단",
 | 
					  "confirmations.block.confirm": "차단",
 | 
				
			||||||
  "confirmations.block.message": "정말로 {name}를 차단하시겠습니까?",
 | 
					  "confirmations.block.message": "정말로 {name}를 차단하시겠습니까?",
 | 
				
			||||||
  "confirmations.delete.confirm": "삭제",
 | 
					  "confirmations.delete.confirm": "삭제",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5308,6 +5308,7 @@ noscript {
 | 
				
			||||||
      margin-left: -2px;
 | 
					      margin-left: -2px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      .account__avatar {
 | 
					      .account__avatar {
 | 
				
			||||||
 | 
					        background: darken($ui-base-color, 8%);
 | 
				
			||||||
        border: 2px solid lighten($ui-base-color, 4%);
 | 
					        border: 2px solid lighten($ui-base-color, 4%);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -99,9 +99,9 @@
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  &:active,
 | 
					  &:active:not(:disabled),
 | 
				
			||||||
  &:focus,
 | 
					  &:focus:not(:disabled),
 | 
				
			||||||
  &:hover {
 | 
					  &:hover:not(:disabled) {
 | 
				
			||||||
    background: lighten($ui-highlight-color, 10%);
 | 
					    background: lighten($ui-highlight-color, 10%);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    svg path:last-child {
 | 
					    svg path:last-child {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -352,6 +352,7 @@
 | 
				
			||||||
    border-radius: 50%;
 | 
					    border-radius: 50%;
 | 
				
			||||||
    position: relative;
 | 
					    position: relative;
 | 
				
			||||||
    margin-left: -10px;
 | 
					    margin-left: -10px;
 | 
				
			||||||
 | 
					    background: darken($ui-base-color, 8%);
 | 
				
			||||||
    border: 2px solid $ui-base-color;
 | 
					    border: 2px solid $ui-base-color;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    &:nth-child(1) {
 | 
					    &:nth-child(1) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,6 +18,7 @@ class ActivityPub::Adapter < ActiveModelSerializers::Adapter::Base
 | 
				
			||||||
    atom_uri: { 'ostatus' => 'http://ostatus.org#', 'atomUri' => 'ostatus:atomUri' },
 | 
					    atom_uri: { 'ostatus' => 'http://ostatus.org#', 'atomUri' => 'ostatus:atomUri' },
 | 
				
			||||||
    conversation: { 'ostatus' => 'http://ostatus.org#', 'inReplyToAtomUri' => 'ostatus:inReplyToAtomUri', 'conversation' => 'ostatus:conversation' },
 | 
					    conversation: { 'ostatus' => 'http://ostatus.org#', 'inReplyToAtomUri' => 'ostatus:inReplyToAtomUri', 'conversation' => 'ostatus:conversation' },
 | 
				
			||||||
    focal_point: { 'toot' => 'http://joinmastodon.org/ns#', 'focalPoint' => { '@container' => '@list', '@id' => 'toot:focalPoint' } },
 | 
					    focal_point: { 'toot' => 'http://joinmastodon.org/ns#', 'focalPoint' => { '@container' => '@list', '@id' => 'toot:focalPoint' } },
 | 
				
			||||||
 | 
					    identity_proof: { 'toot' => 'http://joinmastodon.org/ns#', 'IdentityProof' => 'toot:IdentityProof' },
 | 
				
			||||||
  }.freeze
 | 
					  }.freeze
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def self.default_key_transform
 | 
					  def self.default_key_transform
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,7 +28,8 @@ class ProofProvider::Keybase
 | 
				
			||||||
      return
 | 
					      return
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return if @proof.provider_username.blank?
 | 
					    # Do not perform synchronous validation for remote accounts
 | 
				
			||||||
 | 
					    return if @proof.provider_username.blank? || !@proof.account.local?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if verifier.valid?
 | 
					    if verifier.valid?
 | 
				
			||||||
      @proof.verified = true
 | 
					      @proof.verified = true
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,7 +6,7 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer
 | 
				
			||||||
  context :security
 | 
					  context :security
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  context_extensions :manually_approves_followers, :featured, :also_known_as,
 | 
					  context_extensions :manually_approves_followers, :featured, :also_known_as,
 | 
				
			||||||
                     :moved_to, :property_value, :hashtag, :emoji
 | 
					                     :moved_to, :property_value, :hashtag, :emoji, :identity_proof
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  attributes :id, :type, :following, :followers,
 | 
					  attributes :id, :type, :following, :followers,
 | 
				
			||||||
             :inbox, :outbox, :featured,
 | 
					             :inbox, :outbox, :featured,
 | 
				
			||||||
| 
						 | 
					@ -115,7 +115,7 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def virtual_attachments
 | 
					  def virtual_attachments
 | 
				
			||||||
    object.fields
 | 
					    object.fields + object.identity_proofs.active
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def moved_to
 | 
					  def moved_to
 | 
				
			||||||
| 
						 | 
					@ -158,4 +158,24 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer
 | 
				
			||||||
      Formatter.instance.format_field(object.account, object.value)
 | 
					      Formatter.instance.format_field(object.account, object.value)
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  class AccountIdentityProofSerializer < ActivityPub::Serializer
 | 
				
			||||||
 | 
					    attributes :type, :name, :signature_algorithm, :signature_value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def type
 | 
				
			||||||
 | 
					      'IdentityProof'
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def name
 | 
				
			||||||
 | 
					      object.provider_username
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def signature_algorithm
 | 
				
			||||||
 | 
					      object.provider
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def signature_value
 | 
				
			||||||
 | 
					      object.token
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,6 +24,7 @@ class ActivityPub::ProcessAccountService < BaseService
 | 
				
			||||||
        create_account if @account.nil?
 | 
					        create_account if @account.nil?
 | 
				
			||||||
        update_account
 | 
					        update_account
 | 
				
			||||||
        process_tags
 | 
					        process_tags
 | 
				
			||||||
 | 
					        process_attachments
 | 
				
			||||||
      else
 | 
					      else
 | 
				
			||||||
        raise Mastodon::RaceConditionError
 | 
					        raise Mastodon::RaceConditionError
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
| 
						 | 
					@ -151,7 +152,7 @@ class ActivityPub::ProcessAccountService < BaseService
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def property_values
 | 
					  def property_values
 | 
				
			||||||
    return unless @json['attachment'].is_a?(Array)
 | 
					    return unless @json['attachment'].is_a?(Array)
 | 
				
			||||||
    @json['attachment'].select { |attachment| attachment['type'] == 'PropertyValue' }.map { |attachment| attachment.slice('name', 'value') }
 | 
					    as_array(@json['attachment']).select { |attachment| attachment['type'] == 'PropertyValue' }.map { |attachment| attachment.slice('name', 'value') }
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def mismatching_origin?(url)
 | 
					  def mismatching_origin?(url)
 | 
				
			||||||
| 
						 | 
					@ -231,6 +232,23 @@ class ActivityPub::ProcessAccountService < BaseService
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def process_attachments
 | 
				
			||||||
 | 
					    return if @json['attachment'].blank?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    previous_proofs = @account.identity_proofs.to_a
 | 
				
			||||||
 | 
					    current_proofs  = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    as_array(@json['attachment']).each do |attachment|
 | 
				
			||||||
 | 
					      next unless equals_or_includes?(attachment['type'], 'IdentityProof')
 | 
				
			||||||
 | 
					      current_proofs << process_identity_proof(attachment)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    previous_proofs.each do |previous_proof|
 | 
				
			||||||
 | 
					      next if current_proofs.any? { |current_proof| current_proof.id == previous_proof.id }
 | 
				
			||||||
 | 
					      previous_proof.delete
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def process_emoji(tag)
 | 
					  def process_emoji(tag)
 | 
				
			||||||
    return if skip_download?
 | 
					    return if skip_download?
 | 
				
			||||||
    return if tag['name'].blank? || tag['icon'].blank? || tag['icon']['url'].blank?
 | 
					    return if tag['name'].blank? || tag['icon'].blank? || tag['icon']['url'].blank?
 | 
				
			||||||
| 
						 | 
					@ -247,4 +265,12 @@ class ActivityPub::ProcessAccountService < BaseService
 | 
				
			||||||
    emoji.image_remote_url = image_url
 | 
					    emoji.image_remote_url = image_url
 | 
				
			||||||
    emoji.save
 | 
					    emoji.save
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def process_identity_proof(attachment)
 | 
				
			||||||
 | 
					    provider          = attachment['signatureAlgorithm']
 | 
				
			||||||
 | 
					    provider_username = attachment['name']
 | 
				
			||||||
 | 
					    token             = attachment['signatureValue']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @account.identity_proofs.where(provider: provider, provider_username: provider_username).find_or_create_by(provider: provider, provider_username: provider_username, token: token)
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,8 +2,9 @@
 | 
				
			||||||
co:
 | 
					co:
 | 
				
			||||||
  activerecord:
 | 
					  activerecord:
 | 
				
			||||||
    attributes:
 | 
					    attributes:
 | 
				
			||||||
      status:
 | 
					      poll:
 | 
				
			||||||
        owned_poll: Scandagliu
 | 
					        expires_at: Fine
 | 
				
			||||||
 | 
					        options: Scelte
 | 
				
			||||||
    errors:
 | 
					    errors:
 | 
				
			||||||
      models:
 | 
					      models:
 | 
				
			||||||
        account:
 | 
					        account:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -245,6 +245,7 @@ co:
 | 
				
			||||||
      feature_profile_directory: Annuariu di i prufili
 | 
					      feature_profile_directory: Annuariu di i prufili
 | 
				
			||||||
      feature_registrations: Arregistramenti
 | 
					      feature_registrations: Arregistramenti
 | 
				
			||||||
      feature_relay: Ripetitore di federazione
 | 
					      feature_relay: Ripetitore di federazione
 | 
				
			||||||
 | 
					      feature_timeline_preview: Vista di a linea pubblica
 | 
				
			||||||
      features: Funziunalità
 | 
					      features: Funziunalità
 | 
				
			||||||
      hidden_service: Federazione cù servizii piattati
 | 
					      hidden_service: Federazione cù servizii piattati
 | 
				
			||||||
      open_reports: signalamenti aperti
 | 
					      open_reports: signalamenti aperti
 | 
				
			||||||
| 
						 | 
					@ -586,6 +587,9 @@ co:
 | 
				
			||||||
      content: Scusate, mà c’hè statu un prublemu cù u nostru servore.
 | 
					      content: Scusate, mà c’hè statu un prublemu cù u nostru servore.
 | 
				
			||||||
      title: Sta pagina ùn hè curretta
 | 
					      title: Sta pagina ùn hè curretta
 | 
				
			||||||
    noscript_html: Mastodon nant’à u web hà bisognu di JavaScript per funziunà. Pudete ancu pruvà <a href="%{apps_path}">l’applicazione native</a> per a vostra piattaforma.
 | 
					    noscript_html: Mastodon nant’à u web hà bisognu di JavaScript per funziunà. Pudete ancu pruvà <a href="%{apps_path}">l’applicazione native</a> per a vostra piattaforma.
 | 
				
			||||||
 | 
					  existing_username_validator:
 | 
				
			||||||
 | 
					    not_found: ùn si pudeva micca truvà un'utilizatore lucale cù stu cugnome
 | 
				
			||||||
 | 
					    not_found_multiple: ùn si pudeva micca truvà %{usernames}
 | 
				
			||||||
  exports:
 | 
					  exports:
 | 
				
			||||||
    archive_takeout:
 | 
					    archive_takeout:
 | 
				
			||||||
      date: Data
 | 
					      date: Data
 | 
				
			||||||
| 
						 | 
					@ -629,10 +633,31 @@ co:
 | 
				
			||||||
    all: Tuttu
 | 
					    all: Tuttu
 | 
				
			||||||
    changes_saved_msg: Cambiamenti salvati!
 | 
					    changes_saved_msg: Cambiamenti salvati!
 | 
				
			||||||
    copy: Cupià
 | 
					    copy: Cupià
 | 
				
			||||||
 | 
					    order_by: Urdinà per
 | 
				
			||||||
    save_changes: Salvà e mudificazione
 | 
					    save_changes: Salvà e mudificazione
 | 
				
			||||||
    validation_errors:
 | 
					    validation_errors:
 | 
				
			||||||
      one: Qualcosa ùn và bè! Verificate u prublemu quì sottu
 | 
					      one: Qualcosa ùn và bè! Verificate u prublemu quì sottu
 | 
				
			||||||
      other: Qualcosa ùn và bè! Verificate %{count} prublemi quì sottu
 | 
					      other: Qualcosa ùn và bè! Verificate %{count} prublemi quì sottu
 | 
				
			||||||
 | 
					  html_validator:
 | 
				
			||||||
 | 
					    invalid_markup: 'cuntene codice HTML invalidu: %{error}'
 | 
				
			||||||
 | 
					  identity_proofs:
 | 
				
			||||||
 | 
					    active: Attiva
 | 
				
			||||||
 | 
					    authorize: Ié, auturizà
 | 
				
			||||||
 | 
					    authorize_connection_prompt: Auturizà sta cunnessione crittograffica?
 | 
				
			||||||
 | 
					    errors:
 | 
				
			||||||
 | 
					      failed: A cunnessione crittograffica s'hè fiascata. Ripruvate da %{provider}.
 | 
				
			||||||
 | 
					      keybase:
 | 
				
			||||||
 | 
					        invalid_token: E fiscie Keybase sò hash di firme è duvenu fà 66 caratteri esadecimali (0-9 A-F)
 | 
				
			||||||
 | 
					        verification_failed: Keybase ùn ricunosce micca sta fiscia cum'una firma di l'utilizatore Keybase %{kb_username}. Ripruvate da Keybase.
 | 
				
			||||||
 | 
					      wrong_user: Ùn si pò micca creà una prova per %{proving} mentre chì site cunnettatu·a cum'è %{current}. Cunnettatevi cum'è %{proving} è ripruvate.
 | 
				
			||||||
 | 
					    explanation_html: Quì pudete cunnettà crittografficamente e vostre altre identità, cum'è per esempiu un prufile Keybase. Quessu permette à d'altre persone di mandà vi missaghji crittati, è d'affiducià i cuntinuti chì mandate.
 | 
				
			||||||
 | 
					    i_am_html: Sò %{username} nant'à %{service}.
 | 
				
			||||||
 | 
					    identity: Identità
 | 
				
			||||||
 | 
					    inactive: Inattiva
 | 
				
			||||||
 | 
					    publicize_checkbox: 'È mandà stu statutu:'
 | 
				
			||||||
 | 
					    publicize_toot: 'Hè pruvata! Sò %{username} nant’à %{service}: %{url}'
 | 
				
			||||||
 | 
					    status: Statutu di a verificazione
 | 
				
			||||||
 | 
					    view_proof: Vede a prova
 | 
				
			||||||
  imports:
 | 
					  imports:
 | 
				
			||||||
    modes:
 | 
					    modes:
 | 
				
			||||||
      merge: Unisce
 | 
					      merge: Unisce
 | 
				
			||||||
| 
						 | 
					@ -753,6 +778,8 @@ co:
 | 
				
			||||||
  relationships:
 | 
					  relationships:
 | 
				
			||||||
    activity: Attività di u contu
 | 
					    activity: Attività di u contu
 | 
				
			||||||
    dormant: Inattivu
 | 
					    dormant: Inattivu
 | 
				
			||||||
 | 
					    last_active: Ultima attività
 | 
				
			||||||
 | 
					    most_recent: Più ricente
 | 
				
			||||||
    moved: Spiazzatu
 | 
					    moved: Spiazzatu
 | 
				
			||||||
    mutual: Mutuale
 | 
					    mutual: Mutuale
 | 
				
			||||||
    primary: Primariu
 | 
					    primary: Primariu
 | 
				
			||||||
| 
						 | 
					@ -835,6 +862,7 @@ co:
 | 
				
			||||||
    edit_profile: Mudificà u prufile
 | 
					    edit_profile: Mudificà u prufile
 | 
				
			||||||
    export: Spurtazione d’infurmazione
 | 
					    export: Spurtazione d’infurmazione
 | 
				
			||||||
    featured_tags: Hashtag in vista
 | 
					    featured_tags: Hashtag in vista
 | 
				
			||||||
 | 
					    identity_proofs: Prove d'identità
 | 
				
			||||||
    import: Impurtazione
 | 
					    import: Impurtazione
 | 
				
			||||||
    migrate: Migrazione di u contu
 | 
					    migrate: Migrazione di u contu
 | 
				
			||||||
    notifications: Nutificazione
 | 
					    notifications: Nutificazione
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -650,16 +650,19 @@ cs:
 | 
				
			||||||
  identity_proofs:
 | 
					  identity_proofs:
 | 
				
			||||||
    active: Aktivní
 | 
					    active: Aktivní
 | 
				
			||||||
    authorize: Ano, autorizovat
 | 
					    authorize: Ano, autorizovat
 | 
				
			||||||
    authorize_connection_prompt: Autorizovat tohle kryptografické spojení?
 | 
					    authorize_connection_prompt: Autorizovat toto kryptografické spojení?
 | 
				
			||||||
    errors:
 | 
					    errors:
 | 
				
			||||||
      failed: Kryptografické spojení selhalo. Prosím zkuste to znovu z %{provider}.
 | 
					      failed: Kryptografické spojení selhalo. Prosím zkuste to znovu z %{provider}.
 | 
				
			||||||
      keybase:
 | 
					      keybase:
 | 
				
			||||||
        invalid_token: Tokeny Keybase jsou hashe podpisů a musí být 66 znaků dlouhé
 | 
					        invalid_token: Tokeny Keybase jsou hashe podpisů a musí být 66 znaků dlouhé
 | 
				
			||||||
        verification_failed: Keybase nerozpoznává tento token jako podpis uživatele %{kb_username} na Keybase. Prosím zkuste to znovu z Keybase.
 | 
					        verification_failed: Keybase nerozpoznává tento token jako podpis uživatele %{kb_username} na Keybase. Prosím zkuste to znovu z Keybase.
 | 
				
			||||||
 | 
					      wrong_user: Nelze vytvořit důkaz pro uživatele %{proving}, zatímco jste přihlášen/a jako %{current}. Přihlaste se jako %{proving} a zkuste to znovu.
 | 
				
			||||||
    explanation_html: Zde můžete kryptograficky připojit vaše ostatní identity, například profil Keybase. To dovolí jiným lidem vám posílat šifrované zprávy a důvěřovat obsahu, který jim pošlete.
 | 
					    explanation_html: Zde můžete kryptograficky připojit vaše ostatní identity, například profil Keybase. To dovolí jiným lidem vám posílat šifrované zprávy a důvěřovat obsahu, který jim pošlete.
 | 
				
			||||||
    i_am_html: Na %{service} jsem %{username}.
 | 
					    i_am_html: Na %{service} jsem %{username}.
 | 
				
			||||||
    identity: Identita
 | 
					    identity: Identita
 | 
				
			||||||
    inactive: Neaktivní
 | 
					    inactive: Neaktivní
 | 
				
			||||||
 | 
					    publicize_checkbox: 'A tootnout tohle:'
 | 
				
			||||||
 | 
					    publicize_toot: 'Je to dokázáno! Na %{service} jsem %{username}: %{url}'
 | 
				
			||||||
    status: Stav ověření
 | 
					    status: Stav ověření
 | 
				
			||||||
    view_proof: Zobrazit důkaz
 | 
					    view_proof: Zobrazit důkaz
 | 
				
			||||||
  imports:
 | 
					  imports:
 | 
				
			||||||
| 
						 | 
					@ -784,6 +787,8 @@ cs:
 | 
				
			||||||
  relationships:
 | 
					  relationships:
 | 
				
			||||||
    activity: Aktivita účtu
 | 
					    activity: Aktivita účtu
 | 
				
			||||||
    dormant: Nečinné
 | 
					    dormant: Nečinné
 | 
				
			||||||
 | 
					    last_active: Naposledy aktivní
 | 
				
			||||||
 | 
					    most_recent: Nedávno přidaní
 | 
				
			||||||
    moved: Přesunuté
 | 
					    moved: Přesunuté
 | 
				
			||||||
    mutual: Vzájemné
 | 
					    mutual: Vzájemné
 | 
				
			||||||
    primary: Primární
 | 
					    primary: Primární
 | 
				
			||||||
| 
						 | 
					@ -1026,7 +1031,7 @@ cs:
 | 
				
			||||||
    recovery_codes_regenerated: Záložní kódy byly úspěšně znovu vygenerované
 | 
					    recovery_codes_regenerated: Záložní kódy byly úspěšně znovu vygenerované
 | 
				
			||||||
    recovery_instructions_html: Ztratíte-li někdy přístup k vašemu telefonu, můžete k získání přístupu k účtu použít jeden ze záložních kódů. <strong>Uchovávejte tyto kódy v bezpečí</strong>. Můžete si je například vytisknout a uložit je mezi jiné důležité dokumenty.
 | 
					    recovery_instructions_html: Ztratíte-li někdy přístup k vašemu telefonu, můžete k získání přístupu k účtu použít jeden ze záložních kódů. <strong>Uchovávejte tyto kódy v bezpečí</strong>. Můžete si je například vytisknout a uložit je mezi jiné důležité dokumenty.
 | 
				
			||||||
    setup: Nastavit
 | 
					    setup: Nastavit
 | 
				
			||||||
    wrong_code: Zadaný kód byl neplatný! Je serverový čas a čas na zařízení správný?
 | 
					    wrong_code: Zadaný kód byl neplatný! Je čas na serveru a na zařízení správný?
 | 
				
			||||||
  user_mailer:
 | 
					  user_mailer:
 | 
				
			||||||
    backup_ready:
 | 
					    backup_ready:
 | 
				
			||||||
      explanation: Vyžádal/a jste si úplnou zálohu svého účtu Mastodon. Nyní je připravena ke stažení!
 | 
					      explanation: Vyžádal/a jste si úplnou zálohu svého účtu Mastodon. Nyní je připravena ke stažení!
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -245,6 +245,7 @@ ko:
 | 
				
			||||||
      feature_profile_directory: 프로필 디렉토리
 | 
					      feature_profile_directory: 프로필 디렉토리
 | 
				
			||||||
      feature_registrations: 가입
 | 
					      feature_registrations: 가입
 | 
				
			||||||
      feature_relay: 연합 릴레이
 | 
					      feature_relay: 연합 릴레이
 | 
				
			||||||
 | 
					      feature_timeline_preview: 타임라인 미리보기
 | 
				
			||||||
      features: 기능
 | 
					      features: 기능
 | 
				
			||||||
      hidden_service: 히든 서비스와의 연합
 | 
					      hidden_service: 히든 서비스와의 연합
 | 
				
			||||||
      open_reports: 미해결 신고
 | 
					      open_reports: 미해결 신고
 | 
				
			||||||
| 
						 | 
					@ -634,6 +635,7 @@ ko:
 | 
				
			||||||
    all: 모두
 | 
					    all: 모두
 | 
				
			||||||
    changes_saved_msg: 정상적으로 변경되었습니다!
 | 
					    changes_saved_msg: 정상적으로 변경되었습니다!
 | 
				
			||||||
    copy: 복사
 | 
					    copy: 복사
 | 
				
			||||||
 | 
					    order_by: 순서
 | 
				
			||||||
    save_changes: 변경 사항을 저장
 | 
					    save_changes: 변경 사항을 저장
 | 
				
			||||||
    validation_errors:
 | 
					    validation_errors:
 | 
				
			||||||
      one: 오류가 발생했습니다. 아래 오류를 확인해 주십시오
 | 
					      one: 오류가 발생했습니다. 아래 오류를 확인해 주십시오
 | 
				
			||||||
| 
						 | 
					@ -649,10 +651,13 @@ ko:
 | 
				
			||||||
      keybase:
 | 
					      keybase:
 | 
				
			||||||
        invalid_token: 키베이스 토큰은 서명의 해시이며 66자의 16진수 문자여야 합니다
 | 
					        invalid_token: 키베이스 토큰은 서명의 해시이며 66자의 16진수 문자여야 합니다
 | 
				
			||||||
        verification_failed: 키베이스가 이 토큰을 키베이스 유저 %{kb_username}의 서명으로 인식하지 못했습니다. 키베이스에서 다시 시도하세요.
 | 
					        verification_failed: 키베이스가 이 토큰을 키베이스 유저 %{kb_username}의 서명으로 인식하지 못했습니다. 키베이스에서 다시 시도하세요.
 | 
				
			||||||
 | 
					      wrong_user: "%{current}로 로그인 한 상태에서는 %{proving}에 대한 증명을 할 수 없습니다. %{proving}으로 로그인 한 후 다시 시도하세요."
 | 
				
			||||||
    explanation_html: 키베이스와 같은 다른 명의에 대한 암호화 연결을 할 수 있습니다. 이것으로 다른 사람들이 당신에게 암호화 된 메시지를 보낼 수 있고 당신의 메시지를 믿을 수 있습니다.
 | 
					    explanation_html: 키베이스와 같은 다른 명의에 대한 암호화 연결을 할 수 있습니다. 이것으로 다른 사람들이 당신에게 암호화 된 메시지를 보낼 수 있고 당신의 메시지를 믿을 수 있습니다.
 | 
				
			||||||
    i_am_html: 나는 %{service}의 %{username} 입니다.
 | 
					    i_am_html: 나는 %{service}의 %{username} 입니다.
 | 
				
			||||||
    identity: 신원
 | 
					    identity: 신원
 | 
				
			||||||
    inactive: 비활성
 | 
					    inactive: 비활성
 | 
				
			||||||
 | 
					    publicize_checkbox: '그리고 이것을 툿 하세요:'
 | 
				
			||||||
 | 
					    publicize_toot: '증명되었습니다! 저는 %{service}에 있는 %{username}입니다: %{url}'
 | 
				
			||||||
    status: 인증 상태
 | 
					    status: 인증 상태
 | 
				
			||||||
    view_proof: 증명 보기
 | 
					    view_proof: 증명 보기
 | 
				
			||||||
  imports:
 | 
					  imports:
 | 
				
			||||||
| 
						 | 
					@ -775,6 +780,8 @@ ko:
 | 
				
			||||||
  relationships:
 | 
					  relationships:
 | 
				
			||||||
    activity: 계정 활동
 | 
					    activity: 계정 활동
 | 
				
			||||||
    dormant: 휴면
 | 
					    dormant: 휴면
 | 
				
			||||||
 | 
					    last_active: 마지막 활동
 | 
				
			||||||
 | 
					    most_recent: 가장 최근
 | 
				
			||||||
    moved: 이동함
 | 
					    moved: 이동함
 | 
				
			||||||
    mutual: 상호 팔로우
 | 
					    mutual: 상호 팔로우
 | 
				
			||||||
    primary: 주 계정
 | 
					    primary: 주 계정
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										1
									
								
								dist/nginx.conf
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								dist/nginx.conf
									
									
									
									
										vendored
									
									
								
							| 
						 | 
					@ -78,6 +78,7 @@ server {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    proxy_cache CACHE;
 | 
					    proxy_cache CACHE;
 | 
				
			||||||
    proxy_cache_valid 200 7d;
 | 
					    proxy_cache_valid 200 7d;
 | 
				
			||||||
 | 
					    proxy_cache_valid 410 24h;
 | 
				
			||||||
    proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
 | 
					    proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
 | 
				
			||||||
    add_header X-Cached $upstream_cache_status;
 | 
					    add_header X-Cached $upstream_cache_status;
 | 
				
			||||||
    add_header Strict-Transport-Security "max-age=31536000";
 | 
					    add_header Strict-Transport-Security "max-age=31536000";
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,11 +9,11 @@ module Mastodon
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def minor
 | 
					    def minor
 | 
				
			||||||
      7
 | 
					      8
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def patch
 | 
					    def patch
 | 
				
			||||||
      4
 | 
					      0
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def pre
 | 
					    def pre
 | 
				
			||||||
| 
						 | 
					@ -21,7 +21,7 @@ module Mastodon
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def flags
 | 
					    def flags
 | 
				
			||||||
      ''
 | 
					      'rc1'
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def to_a
 | 
					    def to_a
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,4 +28,45 @@ RSpec.describe ActivityPub::ProcessAccountService, type: :service do
 | 
				
			||||||
      expect(account.fields[1].value).to eq 'Unit test'
 | 
					      expect(account.fields[1].value).to eq 'Unit test'
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  context 'identity proofs' do
 | 
				
			||||||
 | 
					    let(:payload) do
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 'https://foo.test',
 | 
				
			||||||
 | 
					        type: 'Actor',
 | 
				
			||||||
 | 
					        inbox: 'https://foo.test/inbox',
 | 
				
			||||||
 | 
					        attachment: [
 | 
				
			||||||
 | 
					          { type: 'IdentityProof', name: 'Alice', signatureAlgorithm: 'keybase', signatureValue: 'a' * 66 },
 | 
				
			||||||
 | 
					        ],
 | 
				
			||||||
 | 
					      }.with_indifferent_access
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it 'parses out of attachment' do
 | 
				
			||||||
 | 
					      account = subject.call('alice', 'example.com', payload)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      expect(account.identity_proofs.count).to eq 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      proof = account.identity_proofs.first
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      expect(proof.provider).to eq 'keybase'
 | 
				
			||||||
 | 
					      expect(proof.provider_username).to eq 'Alice'
 | 
				
			||||||
 | 
					      expect(proof.token).to eq 'a' * 66
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it 'removes no longer present proofs' do
 | 
				
			||||||
 | 
					      account   = Fabricate(:account, username: 'alice', domain: 'example.com')
 | 
				
			||||||
 | 
					      old_proof = Fabricate(:account_identity_proof, account: account, provider: 'keybase', provider_username: 'Bob', token: 'b' * 66)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      subject.call('alice', 'example.com', payload)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      expect(account.identity_proofs.count).to eq 1
 | 
				
			||||||
 | 
					      expect(account.identity_proofs.find_by(id: old_proof.id)).to be_nil
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it 'queues a validity check on the proof' do
 | 
				
			||||||
 | 
					      allow(ProofProvider::Keybase::Worker).to receive(:perform_async)
 | 
				
			||||||
 | 
					      account = subject.call('alice', 'example.com', payload)
 | 
				
			||||||
 | 
					      expect(ProofProvider::Keybase::Worker).to have_received(:perform_async)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue