Merge branch 'master' into glitch-soc/merge-upstream

lolsob-rspec
Thibaut Girka 2019-03-30 12:36:24 +01:00
commit 99336afaff
29 changed files with 454 additions and 182 deletions

View File

@ -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

View File

@ -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

View File

@ -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'

View File

@ -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)

View File

@ -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) {

View File

@ -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} />;
} }

View File

@ -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>
); );

View File

@ -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>
);
}
}

View File

@ -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);

View File

@ -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>

View File

@ -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>

View File

@ -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",

View File

@ -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}",

View File

@ -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": "پاک کن",

View File

@ -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": "삭제",

View File

@ -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%);
} }
} }

View File

@ -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 {

View File

@ -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) {

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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:

View File

@ -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à chè statu un prublemu cù u nostru servore. content: Scusate, mà chè 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}">lapplicazione 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}">lapplicazione 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 dinfurmazione export: Spurtazione dinfurmazione
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

View File

@ -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í!

View File

@ -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
View File

@ -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";

View File

@ -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

View File

@ -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