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

Conflicts:
- .github/ISSUE_TEMPLATE/bug_report.md
  Took our version.
- CONTRIBUTING.md
  Updated the embedded copy of upstream's version.
- README.md
  Took our version.
- app/policies/status_policy.rb
  Not a real conflict, took code from both.
- app/views/layouts/embedded.html.haml
  Added upstream's changes (dns-prefetch) and fixed
  `%body.embed`
- app/views/settings/preferences/show.html.haml
  Reverted some of upstream changes, as we have a
  page dedicated for flavours and skins.
- config/initializers/content_security_policy.rb
  Kept our version of the CSP.
- config/initializers/doorkeeper.rb
  Not a real conflict, took code from both.
signup-info-prompt
Thibaut Girka 2018-10-22 17:51:38 +02:00
commit dcded13a99
190 changed files with 1798 additions and 911 deletions

View File

@ -13,6 +13,9 @@ aliases:
ALLOW_NOPAM: true ALLOW_NOPAM: true
CONTINUOUS_INTEGRATION: true CONTINUOUS_INTEGRATION: true
DISABLE_SIMPLECOV: true DISABLE_SIMPLECOV: true
PAM_ENABLED: true
PAM_DEFAULT_SERVICE: pam_test
PAM_CONTROLLED_SERVICE: pam_test_controlled
working_directory: ~/projects/mastodon/ working_directory: ~/projects/mastodon/
- &attach_workspace - &attach_workspace

View File

@ -3,7 +3,3 @@ NODE_ENV=test
# Federation # Federation
LOCAL_DOMAIN=cb6e6126.ngrok.io LOCAL_DOMAIN=cb6e6126.ngrok.io
LOCAL_HTTPS=true LOCAL_HTTPS=true
# test pam authentication
PAM_ENABLED=true
PAM_DEFAULT_SERVICE=pam_test
PAM_CONTROLLED_SERVICE=pam_test_controlled

View File

@ -1,11 +1,17 @@
--- ---
name: Feature Request name: Feature Request
about: Suggest an idea for this project about: I have a suggestion
--- ---
[Issue text goes here]. <!-- Please use a concise and distinct title for the issue -->
* * * * <!-- Consider: Could it be implemented as a 3rd party app using the REST API instead? -->
- [ ] I searched or browsed the repos other issues to ensure this is not a duplicate. ### Pitch
<!-- Describe your idea for a feature. Make sure it has not already been suggested/implemented/turned down before -->
### Motivation
<!-- Why do you think this feature is needed? Who would benefit from it? -->

10
.github/ISSUE_TEMPLATE/support.md vendored Normal file
View File

@ -0,0 +1,10 @@
---
name: Support
about: Ask for help with your deployment
---
We primarily use GitHub as a bug and feature tracker. For usage questions, troubleshooting of deployments and other individual technical assistance, please use one of the resources below:
- https://discourse.joinmastodon.org
- #mastodon on irc.freenode.net

View File

@ -1 +1 @@
2.5.1 2.5.3

View File

@ -5,44 +5,46 @@ and provided thanks to the work of the following contributors:
* [ykzts](https://github.com/ykzts) * [ykzts](https://github.com/ykzts)
* [akihikodaki](https://github.com/akihikodaki) * [akihikodaki](https://github.com/akihikodaki)
* [mjankowski](https://github.com/mjankowski) * [mjankowski](https://github.com/mjankowski)
* [unarist](https://github.com/unarist)
* [ThibG](https://github.com/ThibG) * [ThibG](https://github.com/ThibG)
* [unarist](https://github.com/unarist)
* [m4sk1n](https://github.com/m4sk1n) * [m4sk1n](https://github.com/m4sk1n)
* [yiskah](https://github.com/yiskah) * [yiskah](https://github.com/yiskah)
* [nolanlawson](https://github.com/nolanlawson) * [nolanlawson](https://github.com/nolanlawson)
* [sorin-davidoi](https://github.com/sorin-davidoi) * [sorin-davidoi](https://github.com/sorin-davidoi)
* [abcang](https://github.com/abcang) * [abcang](https://github.com/abcang)
* [lynlynlynx](https://github.com/lynlynlynx) * [lynlynlynx](https://github.com/lynlynlynx)
* [dependabot[bot]](https://github.com/apps/dependabot)
* [alpaca-tc](https://github.com/alpaca-tc) * [alpaca-tc](https://github.com/alpaca-tc)
* [nclm](https://github.com/nclm) * [nclm](https://github.com/nclm)
* [ineffyble](https://github.com/ineffyble) * [ineffyble](https://github.com/ineffyble)
* [renatolond](https://github.com/renatolond) * [renatolond](https://github.com/renatolond)
* [jeroenpraat](https://github.com/jeroenpraat) * [jeroenpraat](https://github.com/jeroenpraat)
* [mayaeh](https://github.com/mayaeh)
* [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)
* [nullkal](https://github.com/nullkal) * [nullkal](https://github.com/nullkal)
* [yookoala](https://github.com/yookoala) * [yookoala](https://github.com/yookoala)
* [mayaeh](https://github.com/mayaeh)
* [ysksn](https://github.com/ysksn) * [ysksn](https://github.com/ysksn)
* [shuheiktgw](https://github.com/shuheiktgw) * [shuheiktgw](https://github.com/shuheiktgw)
* [ashfurrow](https://github.com/ashfurrow) * [ashfurrow](https://github.com/ashfurrow)
* [mabkenar](https://github.com/mabkenar)
* [zunda](https://github.com/zunda) * [zunda](https://github.com/zunda)
* [eramdam](https://github.com/eramdam)
* [Kjwon15](https://github.com/Kjwon15) * [Kjwon15](https://github.com/Kjwon15)
* [eramdam](https://github.com/eramdam)
* [masarakki](https://github.com/masarakki) * [masarakki](https://github.com/masarakki)
* [ticky](https://github.com/ticky) * [ticky](https://github.com/ticky)
* [takayamaki](https://github.com/takayamaki)
* [Quenty31](https://github.com/Quenty31) * [Quenty31](https://github.com/Quenty31)
* [danhunsaker](https://github.com/danhunsaker) * [danhunsaker](https://github.com/danhunsaker)
* [ThisIsMissEm](https://github.com/ThisIsMissEm) * [ThisIsMissEm](https://github.com/ThisIsMissEm)
* [hcmiya](https://github.com/hcmiya) * [hcmiya](https://github.com/hcmiya)
* [stephenburgess8](https://github.com/stephenburgess8) * [stephenburgess8](https://github.com/stephenburgess8)
* [Wonderfall](https://github.com/Wonderfall) * [Wonderfall](https://github.com/Wonderfall)
* [takayamaki](https://github.com/takayamaki)
* [matteoaquila](https://github.com/matteoaquila) * [matteoaquila](https://github.com/matteoaquila)
* [rkarabut](https://github.com/rkarabut) * [rkarabut](https://github.com/rkarabut)
* [Artoria2e5](https://github.com/Artoria2e5)
* [yukimochi](https://github.com/yukimochi) * [yukimochi](https://github.com/yukimochi)
* [Artoria2e5](https://github.com/Artoria2e5)
* [marrus-sh](https://github.com/marrus-sh) * [marrus-sh](https://github.com/marrus-sh)
* [krainboltgreene](https://github.com/krainboltgreene) * [krainboltgreene](https://github.com/krainboltgreene)
* [patf](https://github.com/patf) * [patf](https://github.com/patf)
@ -56,7 +58,7 @@ and provided thanks to the work of the following contributors:
* [MasterGroosha](https://github.com/MasterGroosha) * [MasterGroosha](https://github.com/MasterGroosha)
* [JeanGauthier](https://github.com/JeanGauthier) * [JeanGauthier](https://github.com/JeanGauthier)
* [kschaper](https://github.com/kschaper) * [kschaper](https://github.com/kschaper)
* [mabkenar](https://github.com/mabkenar) * [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)
* [adbelle](https://github.com/adbelle) * [adbelle](https://github.com/adbelle)
@ -64,9 +66,9 @@ and provided thanks to the work of the following contributors:
* [MightyPork](https://github.com/MightyPork) * [MightyPork](https://github.com/MightyPork)
* [yhirano55](https://github.com/yhirano55) * [yhirano55](https://github.com/yhirano55)
* [camponez](https://github.com/camponez) * [camponez](https://github.com/camponez)
* [MaciekBaron](https://github.com/MaciekBaron)
* [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)
* [fpiesche](https://github.com/fpiesche) * [fpiesche](https://github.com/fpiesche)
* [gandaro](https://github.com/gandaro) * [gandaro](https://github.com/gandaro)
* [johnsudaar](https://github.com/johnsudaar) * [johnsudaar](https://github.com/johnsudaar)
@ -75,8 +77,6 @@ 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)
* [valentin2105](https://github.com/valentin2105)
* [devkral](https://github.com/devkral)
* [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)
* [seefood](https://github.com/seefood) * [seefood](https://github.com/seefood)
@ -93,6 +93,7 @@ and provided thanks to the work of the following contributors:
* [tsuwatch](https://github.com/tsuwatch) * [tsuwatch](https://github.com/tsuwatch)
* [victorhck](https://github.com/victorhck) * [victorhck](https://github.com/victorhck)
* [puckipedia](https://github.com/puckipedia) * [puckipedia](https://github.com/puckipedia)
* [fvh-P](https://github.com/fvh-P)
* [contraexemplo](https://github.com/contraexemplo) * [contraexemplo](https://github.com/contraexemplo)
* [hugogameiro](https://github.com/hugogameiro) * [hugogameiro](https://github.com/hugogameiro)
* [kazu9su](https://github.com/kazu9su) * [kazu9su](https://github.com/kazu9su)
@ -102,11 +103,11 @@ and provided thanks to the work of the following contributors:
* [Neetshin](mailto:neetshin@neetsh.in) * [Neetshin](mailto:neetshin@neetsh.in)
* [rainyday](https://github.com/rainyday) * [rainyday](https://github.com/rainyday)
* [ProgVal](https://github.com/ProgVal) * [ProgVal](https://github.com/ProgVal)
* [valentin2105](https://github.com/valentin2105)
* [yuntan](https://github.com/yuntan) * [yuntan](https://github.com/yuntan)
* [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)
* [fvh-P](https://github.com/fvh-P)
* [rtucker](https://github.com/rtucker) * [rtucker](https://github.com/rtucker)
* [KScl](https://github.com/KScl) * [KScl](https://github.com/KScl)
* [sterdev](https://github.com/sterdev) * [sterdev](https://github.com/sterdev)
@ -116,6 +117,7 @@ and provided thanks to the work of the following contributors:
* [cpytel](https://github.com/cpytel) * [cpytel](https://github.com/cpytel)
* [northerner](https://github.com/northerner) * [northerner](https://github.com/northerner)
* [fhemberger](https://github.com/fhemberger) * [fhemberger](https://github.com/fhemberger)
* [greysteil](https://github.com/greysteil)
* [hnrysmth](https://github.com/hnrysmth) * [hnrysmth](https://github.com/hnrysmth)
* [d6rkaiz](https://github.com/d6rkaiz) * [d6rkaiz](https://github.com/d6rkaiz)
* [JMendyk](https://github.com/JMendyk) * [JMendyk](https://github.com/JMendyk)
@ -125,12 +127,14 @@ and provided thanks to the work of the following contributors:
* [reneklacan](https://github.com/reneklacan) * [reneklacan](https://github.com/reneklacan)
* [ekiru](https://github.com/ekiru) * [ekiru](https://github.com/ekiru)
* [tcitworld](https://github.com/tcitworld) * [tcitworld](https://github.com/tcitworld)
* [ashleyhull-versent](https://github.com/ashleyhull-versent)
* [geta6](https://github.com/geta6) * [geta6](https://github.com/geta6)
* [happycoloredbanana](https://github.com/happycoloredbanana) * [happycoloredbanana](https://github.com/happycoloredbanana)
* [leopku](https://github.com/leopku) * [leopku](https://github.com/leopku)
* [SansPseudoFix](https://github.com/SansPseudoFix) * [SansPseudoFix](https://github.com/SansPseudoFix)
* [tomfhowe](https://github.com/tomfhowe) * [tomfhowe](https://github.com/tomfhowe)
* [noraworld](https://github.com/noraworld) * [noraworld](https://github.com/noraworld)
* [theboss](https://github.com/theboss)
* [178inaba](https://github.com/178inaba) * [178inaba](https://github.com/178inaba)
* [alyssais](https://github.com/alyssais) * [alyssais](https://github.com/alyssais)
* [kodnaplakal](https://github.com/kodnaplakal) * [kodnaplakal](https://github.com/kodnaplakal)
@ -140,6 +144,7 @@ and provided thanks to the work of the following contributors:
* [halkeye](https://github.com/halkeye) * [halkeye](https://github.com/halkeye)
* [hinaloe](https://github.com/hinaloe) * [hinaloe](https://github.com/hinaloe)
* [treby](https://github.com/treby) * [treby](https://github.com/treby)
* [Reverite](https://github.com/Reverite)
* [jpdevries](https://github.com/jpdevries) * [jpdevries](https://github.com/jpdevries)
* [00x9d](https://github.com/00x9d) * [00x9d](https://github.com/00x9d)
* [Kurtis Rainbolt-Greene](mailto:me@kurtisrainboltgreene.name) * [Kurtis Rainbolt-Greene](mailto:me@kurtisrainboltgreene.name)
@ -147,15 +152,16 @@ and provided thanks to the work of the following contributors:
* [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)
* [Ram Lmn](mailto:ramlmn@users.noreply.github.com) * [Ram Lmn](mailto:ramlmn@users.noreply.github.com)
* [harukasan](https://github.com/harukasan) * [harukasan](https://github.com/harukasan)
* [stamak](https://github.com/stamak) * [stamak](https://github.com/stamak)
* [theboss](https://github.com/theboss)
* [Technowix](mailto:technowix@users.noreply.github.com) * [Technowix](mailto:technowix@users.noreply.github.com)
* [Eychics](https://github.com/Eychics) * [Eychics](https://github.com/Eychics)
* [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)
* [Valentin_NC](mailto:valentin.ouvrard@nautile.sarl)
* [R0ckweb](https://github.com/R0ckweb) * [R0ckweb](https://github.com/R0ckweb)
* [caasi](https://github.com/caasi) * [caasi](https://github.com/caasi)
* [esetomo](https://github.com/esetomo) * [esetomo](https://github.com/esetomo)
@ -168,6 +174,7 @@ and provided thanks to the work of the following contributors:
* [vahnj](https://github.com/vahnj) * [vahnj](https://github.com/vahnj)
* [ikuradon](https://github.com/ikuradon) * [ikuradon](https://github.com/ikuradon)
* [AndreLewin](https://github.com/AndreLewin) * [AndreLewin](https://github.com/AndreLewin)
* [rinsuki](https://github.com/rinsuki)
* [redtachyons](https://github.com/redtachyons) * [redtachyons](https://github.com/redtachyons)
* [thurloat](https://github.com/thurloat) * [thurloat](https://github.com/thurloat)
* [aaribaud](https://github.com/aaribaud) * [aaribaud](https://github.com/aaribaud)
@ -188,14 +195,12 @@ and provided thanks to the work of the following contributors:
* [Fjoerfoks](https://github.com/Fjoerfoks) * [Fjoerfoks](https://github.com/Fjoerfoks)
* [fmauNeko](https://github.com/fmauNeko) * [fmauNeko](https://github.com/fmauNeko)
* [gloaec](https://github.com/gloaec) * [gloaec](https://github.com/gloaec)
* [greysteil](https://github.com/greysteil)
* [unstabler](https://github.com/unstabler) * [unstabler](https://github.com/unstabler)
* [potato4d](https://github.com/potato4d) * [potato4d](https://github.com/potato4d)
* [h-izumi](https://github.com/h-izumi) * [h-izumi](https://github.com/h-izumi)
* [ErikXXon](https://github.com/ErikXXon) * [ErikXXon](https://github.com/ErikXXon)
* [ian-kelling](https://github.com/ian-kelling) * [ian-kelling](https://github.com/ian-kelling)
* [immae](https://github.com/immae) * [immae](https://github.com/immae)
* [Reverite](https://github.com/Reverite)
* [foozmeat](https://github.com/foozmeat) * [foozmeat](https://github.com/foozmeat)
* [jasonrhodes](https://github.com/jasonrhodes) * [jasonrhodes](https://github.com/jasonrhodes)
* [Jason Snell](mailto:jason@newrelic.com) * [Jason Snell](mailto:jason@newrelic.com)
@ -232,6 +237,8 @@ and provided thanks to the work of the following contributors:
* [zacanger](https://github.com/zacanger) * [zacanger](https://github.com/zacanger)
* [amazedkoumei](https://github.com/amazedkoumei) * [amazedkoumei](https://github.com/amazedkoumei)
* [anon5r](https://github.com/anon5r) * [anon5r](https://github.com/anon5r)
* [aus-social](https://github.com/aus-social)
* [imbsky](https://github.com/imbsky)
* [bsky](mailto:me@imbsky.net) * [bsky](mailto:me@imbsky.net)
* [chr-1x](https://github.com/chr-1x) * [chr-1x](https://github.com/chr-1x)
* [codl](https://github.com/codl) * [codl](https://github.com/codl)
@ -249,12 +256,12 @@ and provided thanks to the work of the following contributors:
* [oliverkeeble](https://github.com/oliverkeeble) * [oliverkeeble](https://github.com/oliverkeeble)
* [pinfort](https://github.com/pinfort) * [pinfort](https://github.com/pinfort)
* [rbaumert](https://github.com/rbaumert) * [rbaumert](https://github.com/rbaumert)
* [rhoio](https://github.com/rhoio)
* [trwnh](https://github.com/trwnh) * [trwnh](https://github.com/trwnh)
* [usagi-f](https://github.com/usagi-f) * [usagi-f](https://github.com/usagi-f)
* [vidarlee](https://github.com/vidarlee) * [vidarlee](https://github.com/vidarlee)
* [vjackson725](https://github.com/vjackson725) * [vjackson725](https://github.com/vjackson725)
* [wxcafe](https://github.com/wxcafe) * [wxcafe](https://github.com/wxcafe)
* [rinsuki](https://github.com/rinsuki)
* [新都心(Neet Shin)](mailto:nucx@dio-vox.com) * [新都心(Neet Shin)](mailto:nucx@dio-vox.com)
* [cygnan](https://github.com/cygnan) * [cygnan](https://github.com/cygnan)
* [Awea](https://github.com/Awea) * [Awea](https://github.com/Awea)
@ -282,6 +289,7 @@ and provided thanks to the work of the following contributors:
* [ameliavoncat](https://github.com/ameliavoncat) * [ameliavoncat](https://github.com/ameliavoncat)
* [ilpianista](https://github.com/ilpianista) * [ilpianista](https://github.com/ilpianista)
* [Andreas Drop](mailto:andy@remline.de) * [Andreas Drop](mailto:andy@remline.de)
* [andi1984](https://github.com/andi1984)
* [schas002](https://github.com/schas002) * [schas002](https://github.com/schas002)
* [abackstrom](https://github.com/abackstrom) * [abackstrom](https://github.com/abackstrom)
* [jumbosushi](https://github.com/jumbosushi) * [jumbosushi](https://github.com/jumbosushi)
@ -303,8 +311,9 @@ and provided thanks to the work of the following contributors:
* [chriswk](https://github.com/chriswk) * [chriswk](https://github.com/chriswk)
* [csu](https://github.com/csu) * [csu](https://github.com/csu)
* [kklleemm](https://github.com/kklleemm) * [kklleemm](https://github.com/kklleemm)
* [colindean](https://github.com/colindean)
* [dachinat](https://github.com/dachinat) * [dachinat](https://github.com/dachinat)
* [monsterpit-daggertooth](https://github.com/monsterpit-daggertooth) * [multiple-creatures](https://github.com/multiple-creatures)
* [watilde](https://github.com/watilde) * [watilde](https://github.com/watilde)
* [daprice](https://github.com/daprice) * [daprice](https://github.com/daprice)
* [dar5hak](https://github.com/dar5hak) * [dar5hak](https://github.com/dar5hak)
@ -328,14 +337,17 @@ and provided thanks to the work of the following contributors:
* [espenronnevik](https://github.com/espenronnevik) * [espenronnevik](https://github.com/espenronnevik)
* [Finariel](https://github.com/Finariel) * [Finariel](https://github.com/Finariel)
* [siuying](https://github.com/siuying) * [siuying](https://github.com/siuying)
* [GenbuHase](https://github.com/GenbuHase)
* [hattori6789](https://github.com/hattori6789) * [hattori6789](https://github.com/hattori6789)
* [algernon](https://github.com/algernon) * [algernon](https://github.com/algernon)
* [Fastbyte01](https://github.com/Fastbyte01) * [Fastbyte01](https://github.com/Fastbyte01)
* [Gomasy](https://github.com/Gomasy)
* [myfreeweb](https://github.com/myfreeweb) * [myfreeweb](https://github.com/myfreeweb)
* [gfaivre](https://github.com/gfaivre) * [gfaivre](https://github.com/gfaivre)
* [Fiaxhs](https://github.com/Fiaxhs) * [Fiaxhs](https://github.com/Fiaxhs)
* [reedcourty](https://github.com/reedcourty) * [reedcourty](https://github.com/reedcourty)
* [anneau](https://github.com/anneau) * [anneau](https://github.com/anneau)
* [lanodan](https://github.com/lanodan)
* [Harmon758](https://github.com/Harmon758) * [Harmon758](https://github.com/Harmon758)
* [HellPie](https://github.com/HellPie) * [HellPie](https://github.com/HellPie)
* [Habu-Kagumba](https://github.com/Habu-Kagumba) * [Habu-Kagumba](https://github.com/Habu-Kagumba)
@ -360,6 +372,7 @@ and provided thanks to the work of the following contributors:
* [jguerder](https://github.com/jguerder) * [jguerder](https://github.com/jguerder)
* [Jehops](https://github.com/Jehops) * [Jehops](https://github.com/Jehops)
* [joshuap](https://github.com/joshuap) * [joshuap](https://github.com/joshuap)
* [YuleZ](https://github.com/YuleZ)
* [Tiwy57](https://github.com/Tiwy57) * [Tiwy57](https://github.com/Tiwy57)
* [xuv](https://github.com/xuv) * [xuv](https://github.com/xuv)
* [Jnsll](https://github.com/Jnsll) * [Jnsll](https://github.com/Jnsll)
@ -388,6 +401,7 @@ and provided thanks to the work of the following contributors:
* [otsune](https://github.com/otsune) * [otsune](https://github.com/otsune)
* [Mathias B](mailto:10813340+mathias-b@users.noreply.github.com) * [Mathias B](mailto:10813340+mathias-b@users.noreply.github.com)
* [matt-auckland](https://github.com/matt-auckland) * [matt-auckland](https://github.com/matt-auckland)
* [webroo](https://github.com/webroo)
* [matthiasbeyer](https://github.com/matthiasbeyer) * [matthiasbeyer](https://github.com/matthiasbeyer)
* [mattjmattj](https://github.com/mattjmattj) * [mattjmattj](https://github.com/mattjmattj)
* [mtparet](https://github.com/mtparet) * [mtparet](https://github.com/mtparet)
@ -400,6 +414,7 @@ and provided thanks to the work of the following contributors:
* [mike-burns](https://github.com/mike-burns) * [mike-burns](https://github.com/mike-burns)
* [verymilan](https://github.com/verymilan) * [verymilan](https://github.com/verymilan)
* [milmazz](https://github.com/milmazz) * [milmazz](https://github.com/milmazz)
* [premist](https://github.com/premist)
* [Mnkai](https://github.com/Mnkai) * [Mnkai](https://github.com/Mnkai)
* [mitchhentges](https://github.com/mitchhentges) * [mitchhentges](https://github.com/mitchhentges)
* [moritzheiber](https://github.com/moritzheiber) * [moritzheiber](https://github.com/moritzheiber)
@ -413,7 +428,7 @@ and provided thanks to the work of the following contributors:
* [vonneudeck](https://github.com/vonneudeck) * [vonneudeck](https://github.com/vonneudeck)
* [Ninetailed](https://github.com/Ninetailed) * [Ninetailed](https://github.com/Ninetailed)
* [k24](https://github.com/k24) * [k24](https://github.com/k24)
* [Noiob](mailto:noiob@users.noreply.github.com) * [noiob](https://github.com/noiob)
* [kwaio](https://github.com/kwaio) * [kwaio](https://github.com/kwaio)
* [norayr](https://github.com/norayr) * [norayr](https://github.com/norayr)
* [joyeusenoelle](https://github.com/joyeusenoelle) * [joyeusenoelle](https://github.com/joyeusenoelle)
@ -425,7 +440,6 @@ and provided thanks to the work of the following contributors:
* [Pangoraw](https://github.com/Pangoraw) * [Pangoraw](https://github.com/Pangoraw)
* [peterkeen](https://github.com/peterkeen) * [peterkeen](https://github.com/peterkeen)
* [pgate](https://github.com/pgate) * [pgate](https://github.com/pgate)
* [qguv](https://github.com/qguv)
* [remram44](https://github.com/remram44) * [remram44](https://github.com/remram44)
* [retokromer](https://github.com/retokromer) * [retokromer](https://github.com/retokromer)
* [rfwatson](https://github.com/rfwatson) * [rfwatson](https://github.com/rfwatson)
@ -436,6 +450,7 @@ and provided thanks to the work of the following contributors:
* [staticsafe](https://github.com/staticsafe) * [staticsafe](https://github.com/staticsafe)
* [snwh](https://github.com/snwh) * [snwh](https://github.com/snwh)
* [sts10](https://github.com/sts10) * [sts10](https://github.com/sts10)
* [sascha-sl](https://github.com/sascha-sl)
* [skoji](https://github.com/skoji) * [skoji](https://github.com/skoji)
* [ScienJus](https://github.com/ScienJus) * [ScienJus](https://github.com/ScienJus)
* [larkinscott](https://github.com/larkinscott) * [larkinscott](https://github.com/larkinscott)
@ -450,20 +465,20 @@ and provided thanks to the work of the following contributors:
* [Sina Mashek](mailto:sina@mashek.xyz) * [Sina Mashek](mailto:sina@mashek.xyz)
* [sossii](https://github.com/sossii) * [sossii](https://github.com/sossii)
* [SpankyWorks](https://github.com/SpankyWorks) * [SpankyWorks](https://github.com/SpankyWorks)
* [StefOfficiel](https://github.com/StefOfficiel) * [StefOfficiel](mailto:pichard.stephane@free.fr)
* [svetlik](https://github.com/svetlik) * [Svetlozar Todorov](mailto:svetlik@users.noreply.github.com)
* [dereckson](https://github.com/dereckson) * [Sébastien Santoro](mailto:dereckson@espace-win.org)
* [phaedryx](https://github.com/phaedryx) * [Tad Thorley](mailto:phaedryx@users.noreply.github.com)
* [takp](https://github.com/takp) * [Takayoshi Nishida](mailto:takayoshi.nishida@gmail.com)
* [tkusano](https://github.com/tkusano) * [Takayuki KUSANO](mailto:github@tkusano.jp)
* [TakesxiSximada](https://github.com/TakesxiSximada) * [TakesxiSximada](mailto:takesxi.sximada@gmail.com)
* [TheInventrix](https://github.com/TheInventrix) * [TheInventrix](mailto:theinventrix@users.noreply.github.com)
* [shug0](https://github.com/shug0) * [Thomas Alberola](mailto:thomas@needacoffee.fr)
* [Fortyseven](https://github.com/Fortyseven) * [Toby Deshane](mailto:fortyseven@users.noreply.github.com)
* [tobypinder](https://github.com/tobypinder) * [Toby Pinder](mailto:gigitrix@gmail.com)
* [tomosm](https://github.com/tomosm) * [Tomonori Murakami](mailto:crosslife777@gmail.com)
* [TomoyaShibata](https://github.com/TomoyaShibata) * [TomoyaShibata](mailto:wind.of.hometown@gmail.com)
* [treyssatvincent](https://github.com/treyssatvincent) * [Treyssat-Vincent Nino](mailto:treyssatvincent@users.noreply.github.com)
* [Udo Kramer](mailto:optik@fluffel.io) * [Udo Kramer](mailto:optik@fluffel.io)
* [Una](mailto:una@unascribed.com) * [Una](mailto:una@unascribed.com)
* [Ushitora Anqou](mailto:ushitora_anqou@yahoo.co.jp) * [Ushitora Anqou](mailto:ushitora_anqou@yahoo.co.jp)
@ -489,6 +504,7 @@ and provided thanks to the work of the following contributors:
* [benklop](mailto:benklop@gmail.com) * [benklop](mailto:benklop@gmail.com)
* [bsky](mailto:git@imbsky.net) * [bsky](mailto:git@imbsky.net)
* [caesarologia](mailto:lopesgemelli.1@gmail.com) * [caesarologia](mailto:lopesgemelli.1@gmail.com)
* [cbayerlein](mailto:c.bayerlein@gmail.com)
* [chrolis](mailto:chrolis@users.noreply.github.com) * [chrolis](mailto:chrolis@users.noreply.github.com)
* [cormo](mailto:cormorant2+github@gmail.com) * [cormo](mailto:cormorant2+github@gmail.com)
* [d0p1](mailto:dopi-sama@hush.com) * [d0p1](mailto:dopi-sama@hush.com)
@ -500,19 +516,23 @@ and provided thanks to the work of the following contributors:
* [hakoai](mailto:hk--76@qa2.so-net.ne.jp) * [hakoai](mailto:hk--76@qa2.so-net.ne.jp)
* [haosbvnker](mailto:github@chaosbunker.com) * [haosbvnker](mailto:github@chaosbunker.com)
* [isati](mailto:phil@juchnowi.cz) * [isati](mailto:phil@juchnowi.cz)
* [jacob](mailto:jacobherringtondeveloper@gmail.com)
* [jenn kaplan](mailto:me@jkap.io) * [jenn kaplan](mailto:me@jkap.io)
* [jirayudech](mailto:jirayudech@gmail.com) * [jirayudech](mailto:jirayudech@gmail.com)
* [jooops](mailto:joops@autistici.org)
* [jukper](mailto:jukkaperanto@gmail.com) * [jukper](mailto:jukkaperanto@gmail.com)
* [jumoru](mailto:jumoru@mailbox.org) * [jumoru](mailto:jumoru@mailbox.org)
* [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)
* [kuro5hin](mailto:rusty@kuro5hin.org) * [kuro5hin](mailto:rusty@kuro5hin.org)
* [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)
* [mimikun](mailto:dzdzble_effort_311@outlook.jp) * [mimikun](mailto:dzdzble_effort_311@outlook.jp)
* [mshrtkch](mailto:mshrtkch@users.noreply.github.com) * [mshrtkch](mailto:mshrtkch@users.noreply.github.com)
* [muan](mailto:muan@github.com) * [muan](mailto:muan@github.com)
* [neetshin](mailto:neetshin@neetsh.in) * [neetshin](mailto:neetshin@neetsh.in)
* [nightpool](mailto:nightpool@users.noreply.github.com)
* [rch850](mailto:rich850@gmail.com) * [rch850](mailto:rich850@gmail.com)
* [roikale](mailto:roikale@users.noreply.github.com) * [roikale](mailto:roikale@users.noreply.github.com)
* [rysiekpl](mailto:rysiek@hackerspace.pl) * [rysiekpl](mailto:rysiek@hackerspace.pl)
@ -524,6 +544,7 @@ and provided thanks to the work of the following contributors:
* [tackeyy](mailto:mailto.takita.yusuke@gmail.com) * [tackeyy](mailto:mailto.takita.yusuke@gmail.com)
* [tateisu](mailto:tateisu@gmail.com) * [tateisu](mailto:tateisu@gmail.com)
* [tmyt](mailto:shigure@refy.net) * [tmyt](mailto:shigure@refy.net)
* [trevDev()](mailto:trev@trevdev.ca)
* [utam0k](mailto:k0ma@utam0k.jp) * [utam0k](mailto:k0ma@utam0k.jp)
* [vpzomtrrfrt](mailto:vpzomtrrfrt@gmail.com) * [vpzomtrrfrt](mailto:vpzomtrrfrt@gmail.com)
* [walfie](mailto:walfington@gmail.com) * [walfie](mailto:walfington@gmail.com)

107
CHANGELOG.md Normal file
View File

@ -0,0 +1,107 @@
Changelog
=========
All notable changes to this project will be documented in this file.
## [Unreleased]
### Added
- Add link ownership verification (#8703)
- Add conversations API (#8832)
- Add limit for the number of people that can be followed from one account (#8807)
- Add admin setting to customize mascot (#8766)
- Add support for more granular ActivityPub audiences from other software, i.e. circles (#8950)
- Add option to block all reports from a domain (#8830)
- Add user preference to always expand toots marked with content warnings (#8762)
- Add user preference to always hide all media (#8569)
- Add `force_login` param to OAuth authorize page (#8655)
- Add `tootctl accounts backup` (#8642, #8811)
- Add `tootctl accounts create` (#8642, #8811)
- Add `tootctl accounts cull` (#8642, #8811)
- Add `tootctl accounts delete` (#8642, #8811)
- Add `tootctl accounts modify` (#8642, #8811)
- Add `tootctl accounts refresh` (#8642, #8811)
- Add `tootctl feeds build` (#8642, #8811)
- Add `tootctl feeds clear` (#8642, #8811)
- Add `tootctl settings registrations open` (#8642, #8811)
- Add `tootctl settings registrations close` (#8642, #8811)
- Add `min_id` param to REST API to support backwards pagination (#8736)
- Add a confirmation dialog when hitting reply and the compose box isn't empty (#8893)
- Add PostgreSQL disk space growth tracking in PGHero (#8906)
- Add button for disabling local account to report quick actions bar (#9024)
- Add Czech language (#8594)
- Add `Clear-Site-Data` header when logging out (#8627)
- Add `same-site` (`lax`) attribute to cookies (#8626)
- Add support for styled scrollbars in Firefox Nightly (#8653)
- Add highlight to the active tab in web UI profiles (#8673)
- Add auto-focus for comment textarea in report modal (#8689)
- Add auto-focus for emoji picker's search field (#8688)
- Add nginx and systemd templates to `dist/` directory (#8770)
- Add support for `/.well-known/change-password` (#8828)
- Add option to override FFMPEG binary path (#8855)
- Add `dns-prefetch` tag when using different host for assets or uploads (#8942)
- Add `description` meta tag (#8941)
- Add `Content-Security-Policy` header (#8957)
- Add cache for the instance info API (#8765)
### Changed
- Change forms design (#8703)
- Change reports overview to group by target account (#8674)
- Change web UI to show "read more" link on overly long in-stream statuses (#8205)
- Change design of direct messages column (#8832, #9022)
- Change home timelines to exclude DMs (#8940)
- Change list timelines to exclude all replies (#8683)
- Change admin accounts UI default sort to most recent (#8813)
- Change documentation URL in the UI (#8898)
- Change style of success and failure messages (#8973)
- Change DM filtering to always allow DMs from staff (#8993)
- Change recommended Ruby version to 2.5.3 (#9003)
### Deprecated
- `GET /api/v1/timelines/direct``GET /api/v1/conversations` (#8832)
- `POST /api/v1/notifications/dismiss``POST /api/v1/notifications/:id/dismiss` (#8905)
### Removed
- Remove "on this device" label in column push settings (#8704)
- Remove rake tasks in favour of tootctl commands (#8675)
### Fixed
- Fix remote statuses using instance's default locale if no language given (#8861)
- Fix streaming API not exiting when port or socket is unavailable (#9023)
- Fix network calls being performed in database transaction in ActivityPub handler (#8951)
- Fix dropdown arrow position (#8637)
- Fix first element of dropdowns being focused even if not using keyboard (#8679)
- Fix tootctl requiring `bundle exec` invocation (#8619)
- Fix public pages not using animation preference for avatars (#8614)
- Fix OEmbed/OpenGraph cards not understanding relative URLs (#8669)
- Fix some dark emojis not having a white outline (#8597)
- Fix media description not being displayed in various media modals (#8678)
- Fix generated URLs of desktop notifications missing base URL (#8758)
- Fix RTL styles (#8764, #8767, #8823, #8897, #9005, #9007, #9018, #9021)
- Fix crash in streaming API when tag param missing (#8955)
- Fix hotkeys not working when no element is focused (#8998)
- Fix some hotkeys not working on detailed status view (#9006)
## [2.5.2] - 2018-10-12
### Security
- Fix XSS vulnerability (#8959)
## [2.5.1] - 2018-10-07
### Fixed
- Fix database migrations for PostgreSQL below 9.5 (#8903)
- Fix class autoloading issue in ActivityPub Create handler (#8820)
- Fix cache statistics not being sent via statsd when statsd enabled (#8831)
- Bump puma from 3.11.4 to 3.12.0 (#8883)
### Security
- Fix some local images not having their EXIF metadata stripped on upload (#8714)
- Fix being able to enable a disabled relay via ActivityPub Accept handler (#8864)
- Bump nokogiri from 1.8.4 to 1.8.5 (#8881)
- Fix being able to report statuses not belonging to the reported account (#8916)

View File

@ -32,60 +32,42 @@ You should also try to follow the guidelines set out in the original `CONTRIBUTI
<blockquote> <blockquote>
CONTRIBUTING CONTRIBUTING
============ =======
Contributing
There are three ways in which you can contribute to this repository: Thank you for considering contributing to Mastodon 🐘
1. By improving the documentation You can contribute in the following ways:
2. By working on the back-end application
3. By working on the front-end application
Choosing what to work on in a large open source project is not easy. The list of [GitHub issues](https://github.com/tootsuite/mastodon/issues) may provide some ideas, but not every feature request has been greenlit. Likewise, not every change or feature that resolves a personal itch will be merged into the main repository. Some communication ahead of time may be wise. If your addition creates a new feature or setting, or otherwise changes how things work in some substantial way, please remember to submit a correlating pull request to document your changes in the [documentation](http://github.com/tootsuite/documentation). - Finding and reporting bugs
- Translating the Mastodon interface into various languages
- Contributing code to Mastodon by fixing bugs or implementing features
- Improving the documentation
Below are the guidelines for working on pull requests: ## Bug reports
## General Bug reports and feature suggestions can be submitted to [GitHub Issues](https://github.com/tootsuite/mastodon/issues). Please make sure that you are not submitting duplicates, and that a similar report or request has not already been resolved or rejected in the past using the search function. Please also use descriptive, concise titles.
- 2 spaces indentation ## Translations
You can submit translations via [Weblate](https://weblate.joinmastodon.org/). They are periodically merged into the codebase.
[![Mastodon translation statistics by language](https://weblate.joinmastodon.org/widgets/mastodon/-/multi-auto.svg)](https://weblate.joinmastodon.org/)
## Pull requests
Please use clean, concise titles for your pull requests. We use commit squashing, so the final commit in the master branch will carry the title of the pull request.
The smaller the set of changes in the pull request is, the quicker it can be reviewed and merged. Splitting tasks into multiple smaller pull requests is often preferable.
**Pull requests that do not pass automated checks may not be reviewed**. In particular, you need to keep in mind:
- Unit and integration tests (rspec, jest)
- Code style rules (rubocop, eslint)
- Normalization of locale files (i18n-tasks)
## Documentation ## Documentation
- No spelling mistakes The [Mastodon documentation](https://docs.joinmastodon.org) is a statically generated site. You can [submit merge requests to mastodon/docs](https://source.joinmastodon.org/mastodon/docs).
- No orthographic mistakes
- No Markdown syntax errors
## Requirements
- Ruby
- Node.js
- PostgreSQL
- Redis
- Nginx (optional)
## Back-end application
It is expected that you have a working development environment set up. The development environment includes [rubocop](https://github.com/bbatsov/rubocop), which checks your Ruby code for compliance with our style guide and best practices. Sublime Text, likely like other editors, has a [Rubocop plugin](https://github.com/pderichs/sublime_rubocop) that runs checks on files as you edit them. The codebase also has a test suite.
* The codebase is not perfect, at the time of writing, but it is expected that you do not introduce new code style violations
* The rspec test suite must pass
* To the extent that it is possible, verify your changes. In the best case, by adding new tests to the test suite. At the very least, by running the server or console and checking it manually
* If you are introducing new strings to the user interface, they must be using localization methods
If your code has syntax errors that won't let it run, it's a good sign that the pull request isn't ready for submission yet.
## Front-end application
It is expected that you have a working development environment set up (see back-end application section). This project includes an ESLint configuration file, with which you can lint your changes.
* Avoid grave ESLint violations
* Verify that your changes work
* If you are introducing new strings, they must be using localization methods
If the JavaScript or CSS assets won't compile due to a syntax error, it's a good sign that the pull request isn't ready for submission yet.
## Translate
You can contribute to translating Mastodon via Weblate at [weblate.joinmastodon.org](https://weblate.joinmastodon.org/).
[![Mastodon translation statistics by language](https://weblate.joinmastodon.org/widgets/mastodon/-/multi-auto.svg)](https://weblate.joinmastodon.org/)
</blockquote> </blockquote>

View File

@ -16,8 +16,8 @@ gem 'pghero', '~> 2.2'
gem 'dotenv-rails', '~> 2.5' gem 'dotenv-rails', '~> 2.5'
gem 'aws-sdk-s3', '~> 1.21', require: false gem 'aws-sdk-s3', '~> 1.21', require: false
gem 'fog-core', '~> 2.1' gem 'fog-core', '<= 2.1.0'
gem 'fog-openstack', '~> 1.0', require: false gem 'fog-openstack', '~> 0.3', require: false
gem 'paperclip', '~> 6.0' gem 'paperclip', '~> 6.0'
gem 'paperclip-av-transcoder', '~> 0.6' gem 'paperclip-av-transcoder', '~> 0.6'
gem 'streamio-ffmpeg', '~> 3.0' gem 'streamio-ffmpeg', '~> 3.0'
@ -64,7 +64,7 @@ gem 'oj', '~> 3.6'
gem 'ostatus2', '~> 2.0' gem 'ostatus2', '~> 2.0'
gem 'ox', '~> 2.10' gem 'ox', '~> 2.10'
gem 'posix-spawn', git: 'https://github.com/rtomayko/posix-spawn', ref: '58465d2e213991f8afb13b984854a49fcdcc980c' gem 'posix-spawn', git: 'https://github.com/rtomayko/posix-spawn', ref: '58465d2e213991f8afb13b984854a49fcdcc980c'
gem 'pundit', '~> 1.1' gem 'pundit', '~> 2.0'
gem 'premailer-rails' gem 'premailer-rails'
gem 'rack-attack', '~> 5.4' gem 'rack-attack', '~> 5.4'
gem 'rack-cors', '~> 1.0', require: 'rack/cors' gem 'rack-cors', '~> 1.0', require: 'rack/cors'
@ -82,7 +82,7 @@ gem 'simple-navigation', '~> 4.0'
gem 'simple_form', '~> 4.0' gem 'simple_form', '~> 4.0'
gem 'sprockets-rails', '~> 3.2', require: 'sprockets/railtie' gem 'sprockets-rails', '~> 3.2', require: 'sprockets/railtie'
gem 'stoplight', '~> 2.1.3' gem 'stoplight', '~> 2.1.3'
gem 'strong_migrations', '~> 0.2' gem 'strong_migrations', '~> 0.3'
gem 'tty-command', '~> 0.8', require: false gem 'tty-command', '~> 0.8', require: false
gem 'tty-prompt', '~> 0.17', require: false gem 'tty-prompt', '~> 0.17', require: false
gem 'twitter-text', '~> 1.14' gem 'twitter-text', '~> 1.14'

View File

@ -182,7 +182,7 @@ GEM
docile (1.3.0) docile (1.3.0)
domain_name (0.5.20180417) domain_name (0.5.20180417)
unf (>= 0.0.5, < 1.0.0) unf (>= 0.0.5, < 1.0.0)
doorkeeper (5.0.0) doorkeeper (5.0.1)
railties (>= 4.2) railties (>= 4.2)
dotenv (2.5.0) dotenv (2.5.0)
dotenv-rails (2.5.0) dotenv-rails (2.5.0)
@ -211,7 +211,7 @@ GEM
fast_blank (1.0.0) fast_blank (1.0.0)
fastimage (2.1.4) fastimage (2.1.4)
ffi (1.9.25) ffi (1.9.25)
fog-core (2.1.2) fog-core (2.1.0)
builder builder
excon (~> 0.58) excon (~> 0.58)
formatador (~> 0.2) formatador (~> 0.2)
@ -219,8 +219,8 @@ GEM
fog-json (1.2.0) fog-json (1.2.0)
fog-core fog-core
multi_json (~> 1.10) multi_json (~> 1.10)
fog-openstack (1.0.3) fog-openstack (0.3.7)
fog-core (~> 2.1) fog-core (>= 1.45, <= 2.1.0)
fog-json (>= 1.0) fog-json (>= 1.0)
ipaddress (>= 0.8) ipaddress (>= 0.8)
formatador (0.2.5) formatador (0.2.5)
@ -271,7 +271,7 @@ GEM
httplog (1.1.1) httplog (1.1.1)
rack (>= 1.0) rack (>= 1.0)
rainbow (>= 2.0.0) rainbow (>= 2.0.0)
i18n (1.1.0) i18n (1.1.1)
concurrent-ruby (~> 1.0) concurrent-ruby (~> 1.0)
i18n-tasks (0.9.25) i18n-tasks (0.9.25)
activesupport (>= 4.0.2) activesupport (>= 4.0.2)
@ -360,7 +360,7 @@ GEM
concurrent-ruby (~> 1.0.0) concurrent-ruby (~> 1.0.0)
sidekiq (>= 3.5.0) sidekiq (>= 3.5.0)
statsd-ruby (~> 1.2.0) statsd-ruby (~> 1.2.0)
oj (3.6.11) oj (3.6.12)
omniauth (1.8.1) omniauth (1.8.1)
hashie (>= 3.4.6, < 3.6.0) hashie (>= 3.4.6, < 3.6.0)
rack (>= 1.6.2, < 3) rack (>= 1.6.2, < 3)
@ -417,7 +417,7 @@ GEM
pry (>= 0.10.4) pry (>= 0.10.4)
public_suffix (3.0.3) public_suffix (3.0.3)
puma (3.12.0) puma (3.12.0)
pundit (1.1.0) pundit (2.0.0)
activesupport (>= 3.0.0) activesupport (>= 3.0.0)
raabro (1.1.6) raabro (1.1.6)
rack (2.0.5) rack (2.0.5)
@ -587,7 +587,7 @@ GEM
stoplight (2.1.3) stoplight (2.1.3)
streamio-ffmpeg (3.0.2) streamio-ffmpeg (3.0.2)
multi_json (~> 1.8) multi_json (~> 1.8)
strong_migrations (0.2.3) strong_migrations (0.3.1)
activerecord (>= 3.2.0) activerecord (>= 3.2.0)
temple (0.8.0) temple (0.8.0)
terminal-table (1.8.0) terminal-table (1.8.0)
@ -618,7 +618,7 @@ GEM
unf (~> 0.1.0) unf (~> 0.1.0)
tzinfo (1.2.5) tzinfo (1.2.5)
thread_safe (~> 0.1) thread_safe (~> 0.1)
tzinfo-data (1.2018.5) tzinfo-data (1.2018.6)
tzinfo (>= 1.0.0) tzinfo (>= 1.0.0)
unf (0.1.4) unf (0.1.4)
unf_ext unf_ext
@ -680,8 +680,8 @@ DEPENDENCIES
faker (~> 1.9) faker (~> 1.9)
fast_blank (~> 1.0) fast_blank (~> 1.0)
fastimage fastimage
fog-core (~> 2.1) fog-core (<= 2.1.0)
fog-openstack (~> 1.0) fog-openstack (~> 0.3)
fuubar (~> 2.3) fuubar (~> 2.3)
goldfinger (~> 2.1) goldfinger (~> 2.1)
hamlit-rails (~> 0.2) hamlit-rails (~> 0.2)
@ -727,7 +727,7 @@ DEPENDENCIES
pry-byebug (~> 3.6) pry-byebug (~> 3.6)
pry-rails (~> 0.3) pry-rails (~> 0.3)
puma (~> 3.12) puma (~> 3.12)
pundit (~> 1.1) pundit (~> 2.0)
rack-attack (~> 5.4) rack-attack (~> 5.4)
rack-cors (~> 1.0) rack-cors (~> 1.0)
rails (~> 5.2.1) rails (~> 5.2.1)
@ -755,7 +755,7 @@ DEPENDENCIES
stackprof stackprof
stoplight (~> 2.1.3) stoplight (~> 2.1.3)
streamio-ffmpeg (~> 3.0) streamio-ffmpeg (~> 3.0)
strong_migrations (~> 0.2) strong_migrations (~> 0.3)
thor (~> 0.20) thor (~> 0.20)
tty-command (~> 0.8) tty-command (~> 0.8)
tty-prompt (~> 0.17) tty-prompt (~> 0.17)
@ -766,7 +766,7 @@ DEPENDENCIES
webpush webpush
RUBY VERSION RUBY VERSION
ruby 2.5.0p0 ruby 2.5.3p105
BUNDLED WITH BUNDLED WITH
1.16.5 1.16.6

View File

@ -46,7 +46,7 @@ module Admin
end end
def resource_params def resource_params
params.require(:domain_block).permit(:domain, :severity, :reject_media, :retroactive) params.require(:domain_block).permit(:domain, :severity, :reject_media, :reject_reports, :retroactive)
end end
def retroactive_unblock? def retroactive_unblock?

View File

@ -44,6 +44,14 @@ module Admin
when 'resolve' when 'resolve'
@report.resolve!(current_account) @report.resolve!(current_account)
log_action :resolve, @report log_action :resolve, @report
when 'disable'
@report.resolve!(current_account)
@report.target_account.user.disable!
log_action :resolve, @report
log_action :disable, @report.target_account.user
resolve_all_target_account_reports
when 'silence' when 'silence'
@report.resolve!(current_account) @report.resolve!(current_account)
@report.target_account.update!(silenced: true) @report.target_account.update!(silenced: true)
@ -55,6 +63,7 @@ module Admin
else else
raise ActiveRecord::RecordNotFound raise ActiveRecord::RecordNotFound
end end
@report.reload @report.reload
end end

View File

@ -3,9 +3,11 @@
class Api::V1::ConversationsController < Api::BaseController class Api::V1::ConversationsController < Api::BaseController
LIMIT = 20 LIMIT = 20
before_action -> { doorkeeper_authorize! :read, :'read:statuses' } before_action -> { doorkeeper_authorize! :read, :'read:statuses' }, only: :index
before_action -> { doorkeeper_authorize! :write, :'write:conversations' }, except: :index
before_action :require_user! before_action :require_user!
after_action :insert_pagination_headers before_action :set_conversation, except: :index
after_action :insert_pagination_headers, only: :index
respond_to :json respond_to :json
@ -14,8 +16,22 @@ class Api::V1::ConversationsController < Api::BaseController
render json: @conversations, each_serializer: REST::ConversationSerializer render json: @conversations, each_serializer: REST::ConversationSerializer
end end
def read
@conversation.update!(unread: false)
render json: @conversation, serializer: REST::ConversationSerializer
end
def destroy
@conversation.destroy!
render_empty
end
private private
def set_conversation
@conversation = AccountConversation.where(account: current_account).find(params[:id])
end
def paginated_conversations def paginated_conversations
AccountConversation.where(account: current_account) AccountConversation.where(account: current_account)
.paginate_by_id(limit_param(LIMIT), params_slice(:max_id, :since_id, :min_id)) .paginate_by_id(limit_param(LIMIT), params_slice(:max_id, :since_id, :min_id))

View File

@ -1,7 +1,6 @@
# frozen_string_literal: true # frozen_string_literal: true
class Api::V1::ReportsController < Api::BaseController class Api::V1::ReportsController < Api::BaseController
before_action -> { doorkeeper_authorize! :read, :'read:reports' }, except: [:create]
before_action -> { doorkeeper_authorize! :write, :'write:reports' }, only: [:create] before_action -> { doorkeeper_authorize! :write, :'write:reports' }, only: [:create]
before_action :require_user! before_action :require_user!

View File

@ -84,7 +84,7 @@ module ApplicationHelper
end end
def cdn_host def cdn_host
ENV['CDN_HOST'].presence Rails.configuration.action_controller.asset_host
end end
def cdn_host? def cdn_host?
@ -92,10 +92,10 @@ module ApplicationHelper
end end
def storage_host def storage_host
ENV['S3_ALIAS_HOST'].presence || ENV['S3_CLOUDFRONT_HOST'].presence "https://#{ENV['S3_ALIAS_HOST'].presence || ENV['S3_CLOUDFRONT_HOST']}"
end end
def storage_host? def storage_host?
storage_host.present? ENV['S3_ALIAS_HOST'].present? || ENV['S3_CLOUDFRONT_HOST'].present?
end end
end end

View File

@ -2,18 +2,6 @@
import { delegate } from 'rails-ujs'; import { delegate } from 'rails-ujs';
function handleDeleteStatus(event) {
const [data] = event.detail;
const element = document.querySelector(`[data-id="${data.id}"]`);
if (element) {
element.parentNode.removeChild(element);
}
}
[].forEach.call(document.querySelectorAll('.trash-button'), (content) => {
content.addEventListener('ajax:success', handleDeleteStatus);
});
const batchCheckboxClassName = '.batch-checkbox input[type="checkbox"]'; const batchCheckboxClassName = '.batch-checkbox input[type="checkbox"]';
delegate(document, '#batch_checkbox_all', 'change', ({ target }) => { delegate(document, '#batch_checkbox_all', 'change', ({ target }) => {
@ -24,6 +12,7 @@ delegate(document, '#batch_checkbox_all', 'change', ({ target }) => {
delegate(document, batchCheckboxClassName, 'change', () => { delegate(document, batchCheckboxClassName, 'change', () => {
const checkAllElement = document.querySelector('#batch_checkbox_all'); const checkAllElement = document.querySelector('#batch_checkbox_all');
if (checkAllElement) { if (checkAllElement) {
checkAllElement.checked = [].every.call(document.querySelectorAll(batchCheckboxClassName), (content) => content.checked); checkAllElement.checked = [].every.call(document.querySelectorAll(batchCheckboxClassName), (content) => content.checked);
checkAllElement.indeterminate = !checkAllElement.checked && [].some.call(document.querySelectorAll(batchCheckboxClassName), (content) => content.checked); checkAllElement.indeterminate = !checkAllElement.checked && [].some.call(document.querySelectorAll(batchCheckboxClassName), (content) => content.checked);
@ -43,8 +32,14 @@ delegate(document, '.media-spoiler-hide-button', 'click', () => {
}); });
delegate(document, '#domain_block_severity', 'change', ({ target }) => { delegate(document, '#domain_block_severity', 'change', ({ target }) => {
const rejectMediaDiv = document.querySelector('.input.with_label.domain_block_reject_media'); const rejectMediaDiv = document.querySelector('.input.with_label.domain_block_reject_media');
const rejectReportsDiv = document.querySelector('.input.with_label.domain_block_reject_reports');
if (rejectMediaDiv) { if (rejectMediaDiv) {
rejectMediaDiv.style.display = (target.value === 'suspend') ? 'none' : 'block'; rejectMediaDiv.style.display = (target.value === 'suspend') ? 'none' : 'block';
} }
if (rejectReportsDiv) {
rejectReportsDiv.style.display = (target.value === 'suspend') ? 'none' : 'block';
}
}); });

View File

@ -56,7 +56,7 @@ export function changeCompose(text) {
}; };
}; };
export function replyCompose(status, router) { export function replyCompose(status, routerHistory) {
return (dispatch, getState) => { return (dispatch, getState) => {
dispatch({ dispatch({
type: COMPOSE_REPLY, type: COMPOSE_REPLY,
@ -64,7 +64,7 @@ export function replyCompose(status, router) {
}); });
if (!getState().getIn(['compose', 'mounted'])) { if (!getState().getIn(['compose', 'mounted'])) {
router.push('/statuses/new'); routerHistory.push('/statuses/new');
} }
}; };
}; };
@ -81,7 +81,7 @@ export function resetCompose() {
}; };
}; };
export function mentionCompose(account, router) { export function mentionCompose(account, routerHistory) {
return (dispatch, getState) => { return (dispatch, getState) => {
dispatch({ dispatch({
type: COMPOSE_MENTION, type: COMPOSE_MENTION,
@ -89,12 +89,12 @@ export function mentionCompose(account, router) {
}); });
if (!getState().getIn(['compose', 'mounted'])) { if (!getState().getIn(['compose', 'mounted'])) {
router.push('/statuses/new'); routerHistory.push('/statuses/new');
} }
}; };
}; };
export function directCompose(account, router) { export function directCompose(account, routerHistory) {
return (dispatch, getState) => { return (dispatch, getState) => {
dispatch({ dispatch({
type: COMPOSE_DIRECT, type: COMPOSE_DIRECT,
@ -102,12 +102,12 @@ export function directCompose(account, router) {
}); });
if (!getState().getIn(['compose', 'mounted'])) { if (!getState().getIn(['compose', 'mounted'])) {
router.push('/statuses/new'); routerHistory.push('/statuses/new');
} }
}; };
}; };
export function submitCompose() { export function submitCompose(routerHistory) {
return function (dispatch, getState) { return function (dispatch, getState) {
const status = getState().getIn(['compose', 'text'], ''); const status = getState().getIn(['compose', 'text'], '');
const media = getState().getIn(['compose', 'media_attachments']); const media = getState().getIn(['compose', 'media_attachments']);
@ -133,21 +133,22 @@ export function submitCompose() {
dispatch(insertIntoTagHistory(response.data.tags, status)); dispatch(insertIntoTagHistory(response.data.tags, status));
dispatch(submitComposeSuccess({ ...response.data })); dispatch(submitComposeSuccess({ ...response.data }));
// To make the app more responsive, immediately get the status into the columns // To make the app more responsive, immediately push the status
// into the columns
const insertIfOnline = (timelineId) => { const insertIfOnline = timelineId => {
if (getState().getIn(['timelines', timelineId, 'items', 0]) !== null) { if (getState().getIn(['timelines', timelineId, 'items', 0]) !== null) {
dispatch(updateTimeline(timelineId, { ...response.data })); dispatch(updateTimeline(timelineId, { ...response.data }));
} }
}; };
insertIfOnline('home'); if (response.data.visibility === 'direct' && getState().getIn(['conversations', 'mounted']) <= 0) {
routerHistory.push('/timelines/direct');
if (response.data.in_reply_to_id === null && response.data.visibility === 'public') { } else if (response.data.visibility !== 'direct') {
insertIfOnline('home');
} else if (response.data.in_reply_to_id === null && response.data.visibility === 'public') {
insertIfOnline('community'); insertIfOnline('community');
insertIfOnline('public'); insertIfOnline('public');
} else if (response.data.visibility === 'direct') {
insertIfOnline('direct');
} }
}).catch(function (error) { }).catch(function (error) {
dispatch(submitComposeFail(error)); dispatch(submitComposeFail(error));

View File

@ -5,11 +5,33 @@ import {
importFetchedStatus, importFetchedStatus,
} from './importer'; } from './importer';
export const CONVERSATIONS_MOUNT = 'CONVERSATIONS_MOUNT';
export const CONVERSATIONS_UNMOUNT = 'CONVERSATIONS_UNMOUNT';
export const CONVERSATIONS_FETCH_REQUEST = 'CONVERSATIONS_FETCH_REQUEST'; export const CONVERSATIONS_FETCH_REQUEST = 'CONVERSATIONS_FETCH_REQUEST';
export const CONVERSATIONS_FETCH_SUCCESS = 'CONVERSATIONS_FETCH_SUCCESS'; export const CONVERSATIONS_FETCH_SUCCESS = 'CONVERSATIONS_FETCH_SUCCESS';
export const CONVERSATIONS_FETCH_FAIL = 'CONVERSATIONS_FETCH_FAIL'; export const CONVERSATIONS_FETCH_FAIL = 'CONVERSATIONS_FETCH_FAIL';
export const CONVERSATIONS_UPDATE = 'CONVERSATIONS_UPDATE'; export const CONVERSATIONS_UPDATE = 'CONVERSATIONS_UPDATE';
export const CONVERSATIONS_READ = 'CONVERSATIONS_READ';
export const mountConversations = () => ({
type: CONVERSATIONS_MOUNT,
});
export const unmountConversations = () => ({
type: CONVERSATIONS_UNMOUNT,
});
export const markConversationRead = conversationId => (dispatch, getState) => {
dispatch({
type: CONVERSATIONS_READ,
id: conversationId,
});
api(getState).post(`/api/v1/conversations/${conversationId}/read`);
};
export const expandConversations = ({ maxId } = {}) => (dispatch, getState) => { export const expandConversations = ({ maxId } = {}) => (dispatch, getState) => {
dispatch(expandConversationsRequest()); dispatch(expandConversationsRequest());

View File

@ -0,0 +1,96 @@
import React from 'react';
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { autoPlayGif } from '../initial_state';
export default class AvatarComposite extends React.PureComponent {
static propTypes = {
accounts: ImmutablePropTypes.list.isRequired,
animate: PropTypes.bool,
size: PropTypes.number.isRequired,
};
static defaultProps = {
animate: autoPlayGif,
};
renderItem (account, size, index) {
const { animate } = this.props;
let width = 50;
let height = 100;
let top = 'auto';
let left = 'auto';
let bottom = 'auto';
let right = 'auto';
if (size === 1) {
width = 100;
}
if (size === 4 || (size === 3 && index > 0)) {
height = 50;
}
if (size === 2) {
if (index === 0) {
right = '2px';
} else {
left = '2px';
}
} else if (size === 3) {
if (index === 0) {
right = '2px';
} else if (index > 0) {
left = '2px';
}
if (index === 1) {
bottom = '2px';
} else if (index > 1) {
top = '2px';
}
} else if (size === 4) {
if (index === 0 || index === 2) {
right = '2px';
}
if (index === 1 || index === 3) {
left = '2px';
}
if (index < 2) {
bottom = '2px';
} else {
top = '2px';
}
}
const style = {
left: left,
top: top,
right: right,
bottom: bottom,
width: `${width}%`,
height: `${height}%`,
backgroundSize: 'cover',
backgroundImage: `url(${account.get(animate ? 'avatar' : 'avatar_static')})`,
};
return (
<div key={account.get('id')} style={style} />
);
}
render() {
const { accounts, size } = this.props;
return (
<div className='account__avatar-composite' style={{ width: `${size}px`, height: `${size}px` }}>
{accounts.take(4).map((account, i) => this.renderItem(account, accounts.size, i))}
</div>
);
}
}

View File

@ -1,25 +1,29 @@
import React from 'react'; import React from 'react';
import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
export default class DisplayName extends React.PureComponent { export default class DisplayName extends React.PureComponent {
static propTypes = { static propTypes = {
account: ImmutablePropTypes.map.isRequired, account: ImmutablePropTypes.map.isRequired,
withAcct: PropTypes.bool, others: ImmutablePropTypes.list,
};
static defaultProps = {
withAcct: true,
}; };
render () { render () {
const { account, withAcct } = this.props; const { account, others } = this.props;
const displayNameHtml = { __html: account.get('display_name_html') }; const displayNameHtml = { __html: account.get('display_name_html') };
let suffix;
if (others && others.size > 1) {
suffix = `+${others.size}`;
} else {
suffix = <span className='display-name__account'>@{account.get('acct')}</span>;
}
return ( return (
<span className='display-name'> <span className='display-name'>
<bdi><strong className='display-name__html' dangerouslySetInnerHTML={displayNameHtml} /></bdi> {withAcct && <span className='display-name__account'>@{account.get('acct')}</span>} <bdi><strong className='display-name__html' dangerouslySetInnerHTML={displayNameHtml} /></bdi>
<span>{suffix}</span>
</span> </span>
); );
} }

View File

@ -3,6 +3,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import Avatar from './avatar'; import Avatar from './avatar';
import AvatarOverlay from './avatar_overlay'; import AvatarOverlay from './avatar_overlay';
import AvatarComposite from './avatar_composite';
import RelativeTimestamp from './relative_timestamp'; import RelativeTimestamp from './relative_timestamp';
import DisplayName from './display_name'; import DisplayName from './display_name';
import StatusContent from './status_content'; import StatusContent from './status_content';
@ -45,6 +46,8 @@ class Status extends ImmutablePureComponent {
static propTypes = { static propTypes = {
status: ImmutablePropTypes.map, status: ImmutablePropTypes.map,
account: ImmutablePropTypes.map, account: ImmutablePropTypes.map,
otherAccounts: ImmutablePropTypes.list,
onClick: PropTypes.func,
onReply: PropTypes.func, onReply: PropTypes.func,
onFavourite: PropTypes.func, onFavourite: PropTypes.func,
onReblog: PropTypes.func, onReblog: PropTypes.func,
@ -60,6 +63,7 @@ class Status extends ImmutablePureComponent {
onToggleHidden: PropTypes.func, onToggleHidden: PropTypes.func,
muted: PropTypes.bool, muted: PropTypes.bool,
hidden: PropTypes.bool, hidden: PropTypes.bool,
unread: PropTypes.bool,
onMoveUp: PropTypes.func, onMoveUp: PropTypes.func,
onMoveDown: PropTypes.func, onMoveDown: PropTypes.func,
}; };
@ -74,6 +78,11 @@ class Status extends ImmutablePureComponent {
] ]
handleClick = () => { handleClick = () => {
if (this.props.onClick) {
this.props.onClick();
return;
}
if (!this.context.router) { if (!this.context.router) {
return; return;
} }
@ -158,7 +167,7 @@ class Status extends ImmutablePureComponent {
let media = null; let media = null;
let statusAvatar, prepend, rebloggedByText; let statusAvatar, prepend, rebloggedByText;
const { intl, hidden, featured } = this.props; const { intl, hidden, featured, otherAccounts, unread } = this.props;
let { status, account, ...other } = this.props; let { status, account, ...other } = this.props;
@ -249,9 +258,11 @@ class Status extends ImmutablePureComponent {
} }
} }
if (account === undefined || account === null) { if (otherAccounts) {
statusAvatar = <AvatarComposite accounts={otherAccounts} size={48} />;
} else if (account === undefined || account === null) {
statusAvatar = <Avatar account={status.get('account')} size={48} />; statusAvatar = <Avatar account={status.get('account')} size={48} />;
}else{ } else {
statusAvatar = <AvatarOverlay account={status.get('account')} friend={account} />; statusAvatar = <AvatarOverlay account={status.get('account')} friend={account} />;
} }
@ -269,10 +280,10 @@ class Status extends ImmutablePureComponent {
return ( return (
<HotKeys handlers={handlers}> <HotKeys handlers={handlers}>
<div className={classNames('status__wrapper', `status__wrapper-${status.get('visibility')}`, { 'status__wrapper-reply': !!status.get('in_reply_to_id'), focusable: !this.props.muted })} tabIndex={this.props.muted ? null : 0} data-featured={featured ? 'true' : null} aria-label={textForScreenReader(intl, status, rebloggedByText, !status.get('hidden'))}> <div className={classNames('status__wrapper', `status__wrapper-${status.get('visibility')}`, { 'status__wrapper-reply': !!status.get('in_reply_to_id'), read: unread === false, focusable: !this.props.muted })} tabIndex={this.props.muted ? null : 0} data-featured={featured ? 'true' : null} aria-label={textForScreenReader(intl, status, rebloggedByText, !status.get('hidden'))}>
{prepend} {prepend}
<div className={classNames('status', `status-${status.get('visibility')}`, { 'status-reply': !!status.get('in_reply_to_id'), muted: this.props.muted })} data-id={status.get('id')}> <div className={classNames('status', `status-${status.get('visibility')}`, { 'status-reply': !!status.get('in_reply_to_id'), muted: this.props.muted, read: unread === false })} data-id={status.get('id')}>
<div className='status__info'> <div className='status__info'>
<a href={status.get('url')} className='status__relative-time' target='_blank' rel='noopener'><RelativeTimestamp timestamp={status.get('created_at')} /></a> <a href={status.get('url')} className='status__relative-time' target='_blank' rel='noopener'><RelativeTimestamp timestamp={status.get('created_at')} /></a>
@ -281,7 +292,7 @@ class Status extends ImmutablePureComponent {
{statusAvatar} {statusAvatar}
</div> </div>
<DisplayName account={status.get('account')} /> <DisplayName account={status.get('account')} others={otherAccounts} />
</a> </a>
</div> </div>

View File

@ -31,6 +31,10 @@ const messages = defineMessages({
export default @injectIntl export default @injectIntl
class ComposeForm extends ImmutablePureComponent { class ComposeForm extends ImmutablePureComponent {
static contextTypes = {
router: PropTypes.object,
};
static propTypes = { static propTypes = {
intl: PropTypes.object.isRequired, intl: PropTypes.object.isRequired,
text: PropTypes.string.isRequired, text: PropTypes.string.isRequired,
@ -85,7 +89,7 @@ class ComposeForm extends ImmutablePureComponent {
return; return;
} }
this.props.onSubmit(); this.props.onSubmit(this.context.router.history);
} }
onSuggestionsClearRequested = () => { onSuggestionsClearRequested = () => {

View File

@ -164,7 +164,7 @@ class PrivacyDropdown extends React.PureComponent {
state = { state = {
open: false, open: false,
placement: null, placement: 'bottom',
}; };
handleToggle = ({ target }) => { handleToggle = ({ target }) => {

View File

@ -14,6 +14,10 @@ const messages = defineMessages({
export default @injectIntl export default @injectIntl
class Upload extends ImmutablePureComponent { class Upload extends ImmutablePureComponent {
static contextTypes = {
router: PropTypes.object,
};
static propTypes = { static propTypes = {
media: ImmutablePropTypes.map.isRequired, media: ImmutablePropTypes.map.isRequired,
intl: PropTypes.object.isRequired, intl: PropTypes.object.isRequired,
@ -37,7 +41,7 @@ class Upload extends ImmutablePureComponent {
handleSubmit = () => { handleSubmit = () => {
this.handleInputBlur(); this.handleInputBlur();
this.props.onSubmit(); this.props.onSubmit(this.context.router.history);
} }
handleUndoClick = () => { handleUndoClick = () => {

View File

@ -33,8 +33,8 @@ const mapDispatchToProps = (dispatch) => ({
dispatch(changeCompose(text)); dispatch(changeCompose(text));
}, },
onSubmit () { onSubmit (router) {
dispatch(submitCompose()); dispatch(submitCompose(router));
}, },
onClearSuggestions () { onClearSuggestions () {

View File

@ -22,8 +22,8 @@ const mapDispatchToProps = dispatch => ({
dispatch(openModal('FOCAL_POINT', { id })); dispatch(openModal('FOCAL_POINT', { id }));
}, },
onSubmit () { onSubmit (router) {
dispatch(submitCompose()); dispatch(submitCompose(router));
}, },
}); });

View File

@ -13,6 +13,7 @@ import spring from 'react-motion/lib/spring';
import SearchResultsContainer from './containers/search_results_container'; import SearchResultsContainer from './containers/search_results_container';
import { changeComposing } from '../../actions/compose'; import { changeComposing } from '../../actions/compose';
import elephantUIPlane from '../../../images/elephant_ui_plane.svg'; import elephantUIPlane from '../../../images/elephant_ui_plane.svg';
import { mascot } from '../../initial_state';
const messages = defineMessages({ const messages = defineMessages({
start: { id: 'getting_started.heading', defaultMessage: 'Getting started' }, start: { id: 'getting_started.heading', defaultMessage: 'Getting started' },
@ -107,7 +108,7 @@ class Compose extends React.PureComponent {
<ComposeFormContainer /> <ComposeFormContainer />
{multiColumn && ( {multiColumn && (
<div className='drawer__inner__mastodon'> <div className='drawer__inner__mastodon'>
<img alt='' draggable='false' src={elephantUIPlane} /> <img alt='' draggable='false' src={mascot || elephantUIPlane} />
</div> </div>
)} )}
</div>} </div>}

View File

@ -2,12 +2,7 @@ import React from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component'; import ImmutablePureComponent from 'react-immutable-pure-component';
import StatusContent from '../../../components/status_content'; import StatusContainer from '../../../containers/status_container';
import RelativeTimestamp from '../../../components/relative_timestamp';
import DisplayName from '../../../components/display_name';
import Avatar from '../../../components/avatar';
import AttachmentList from '../../../components/attachment_list';
import { HotKeys } from 'react-hotkeys';
export default class Conversation extends ImmutablePureComponent { export default class Conversation extends ImmutablePureComponent {
@ -18,9 +13,11 @@ export default class Conversation extends ImmutablePureComponent {
static propTypes = { static propTypes = {
conversationId: PropTypes.string.isRequired, conversationId: PropTypes.string.isRequired,
accounts: ImmutablePropTypes.list.isRequired, accounts: ImmutablePropTypes.list.isRequired,
lastStatus: ImmutablePropTypes.map.isRequired, lastStatusId: PropTypes.string,
unread:PropTypes.bool.isRequired,
onMoveUp: PropTypes.func, onMoveUp: PropTypes.func,
onMoveDown: PropTypes.func, onMoveDown: PropTypes.func,
markRead: PropTypes.func.isRequired,
}; };
handleClick = () => { handleClick = () => {
@ -28,8 +25,13 @@ export default class Conversation extends ImmutablePureComponent {
return; return;
} }
const { lastStatus } = this.props; const { lastStatusId, unread, markRead } = this.props;
this.context.router.history.push(`/statuses/${lastStatus.get('id')}`);
if (unread) {
markRead();
}
this.context.router.history.push(`/statuses/${lastStatusId}`);
} }
handleHotkeyMoveUp = () => { handleHotkeyMoveUp = () => {
@ -41,44 +43,20 @@ export default class Conversation extends ImmutablePureComponent {
} }
render () { render () {
const { accounts, lastStatus, lastAccount } = this.props; const { accounts, lastStatusId, unread } = this.props;
if (lastStatus === null) { if (lastStatusId === null) {
return null; return null;
} }
const handlers = {
moveDown: this.handleHotkeyMoveDown,
moveUp: this.handleHotkeyMoveUp,
open: this.handleClick,
};
let media;
if (lastStatus.get('media_attachments').size > 0) {
media = <AttachmentList compact media={lastStatus.get('media_attachments')} />;
}
return ( return (
<HotKeys handlers={handlers}> <StatusContainer
<div className='conversation focusable' tabIndex='0' onClick={this.handleClick} role='button'> id={lastStatusId}
<div className='conversation__header'> unread={unread}
<div className='conversation__avatars'> otherAccounts={accounts}
<div>{accounts.map(account => <Avatar key={account.get('id')} size={36} account={account} />)}</div> onMoveUp={this.handleHotkeyMoveUp}
</div> onMoveDown={this.handleHotkeyMoveDown}
/>
<div className='conversation__time'>
<RelativeTimestamp timestamp={lastStatus.get('created_at')} />
<br />
<DisplayName account={lastAccount} withAcct={false} />
</div>
</div>
<StatusContent status={lastStatus} onClick={this.handleClick} />
{media}
</div>
</HotKeys>
); );
} }

View File

@ -1,15 +1,19 @@
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import Conversation from '../components/conversation'; import Conversation from '../components/conversation';
import { markConversationRead } from '../../../actions/conversations';
const mapStateToProps = (state, { conversationId }) => { const mapStateToProps = (state, { conversationId }) => {
const conversation = state.getIn(['conversations', 'items']).find(x => x.get('id') === conversationId); const conversation = state.getIn(['conversations', 'items']).find(x => x.get('id') === conversationId);
const lastStatus = state.getIn(['statuses', conversation.get('last_status')], null);
return { return {
accounts: conversation.get('accounts').map(accountId => state.getIn(['accounts', accountId], null)), accounts: conversation.get('accounts').map(accountId => state.getIn(['accounts', accountId], null)),
lastStatus, unread: conversation.get('unread'),
lastAccount: lastStatus === null ? null : state.getIn(['accounts', lastStatus.get('account')], null), lastStatusId: conversation.get('last_status', null),
}; };
}; };
export default connect(mapStateToProps)(Conversation); const mapDispatchToProps = (dispatch, { conversationId }) => ({
markRead: () => dispatch(markConversationRead(conversationId)),
});
export default connect(mapStateToProps, mapDispatchToProps)(Conversation);

View File

@ -3,7 +3,7 @@ import { connect } from 'react-redux';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import Column from '../../components/column'; import Column from '../../components/column';
import ColumnHeader from '../../components/column_header'; import ColumnHeader from '../../components/column_header';
import { expandConversations } from '../../actions/conversations'; import { mountConversations, unmountConversations, expandConversations } from '../../actions/conversations';
import { addColumn, removeColumn, moveColumn } from '../../actions/columns'; import { addColumn, removeColumn, moveColumn } from '../../actions/columns';
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import { connectDirectStream } from '../../actions/streaming'; import { connectDirectStream } from '../../actions/streaming';
@ -48,11 +48,14 @@ class DirectTimeline extends React.PureComponent {
componentDidMount () { componentDidMount () {
const { dispatch } = this.props; const { dispatch } = this.props;
dispatch(mountConversations());
dispatch(expandConversations()); dispatch(expandConversations());
this.disconnect = dispatch(connectDirectStream()); this.disconnect = dispatch(connectDirectStream());
} }
componentWillUnmount () { componentWillUnmount () {
this.props.dispatch(unmountConversations());
if (this.disconnect) { if (this.disconnect) {
this.disconnect(); this.disconnect();
this.disconnect = null; this.disconnect = null;

View File

@ -181,7 +181,7 @@ class Status extends ImmutablePureComponent {
if (status.get('reblogged')) { if (status.get('reblogged')) {
this.props.dispatch(unreblog(status)); this.props.dispatch(unreblog(status));
} else { } else {
if (e.shiftKey || !boostModal) { if ((e && e.shiftKey) || !boostModal) {
this.handleModalReblog(status); this.handleModalReblog(status);
} else { } else {
this.props.dispatch(openModal('BOOST', { status, onReblog: this.handleModalReblog })); this.props.dispatch(openModal('BOOST', { status, onReblog: this.handleModalReblog }));

View File

@ -460,7 +460,7 @@ class UI extends React.PureComponent {
}; };
return ( return (
<HotKeys keyMap={keyMap} handlers={handlers} ref={this.setHotkeysRef}> <HotKeys keyMap={keyMap} handlers={handlers} ref={this.setHotkeysRef} attach={window} focused>
<div className={classNames('ui', { 'is-composing': isComposing })} ref={this.setRef} style={{ pointerEvents: dropdownMenuIsOpen ? 'none' : null }}> <div className={classNames('ui', { 'is-composing': isComposing })} ref={this.setRef} style={{ pointerEvents: dropdownMenuIsOpen ? 'none' : null }}>
<TabsBar /> <TabsBar />

View File

@ -15,5 +15,6 @@ export const searchEnabled = getMeta('search_enabled');
export const maxChars = (initialState && initialState.max_toot_chars) || 500; export const maxChars = (initialState && initialState.max_toot_chars) || 500;
export const invitesEnabled = getMeta('invites_enabled'); export const invitesEnabled = getMeta('invites_enabled');
export const version = getMeta('version'); export const version = getMeta('version');
export const mascot = getMeta('mascot');
export default initialState; export default initialState;

View File

@ -15,7 +15,7 @@
"account.follows.empty": "هذا المستخدِم لا يتبع أحدًا بعد.", "account.follows.empty": "هذا المستخدِم لا يتبع أحدًا بعد.",
"account.follows_you": "يتابعك", "account.follows_you": "يتابعك",
"account.hide_reblogs": "إخفاء ترقيات @{name}", "account.hide_reblogs": "إخفاء ترقيات @{name}",
"account.link_verified_on": "Ownership of this link was checked on {date}", "account.link_verified_on": "تم التحقق مِن مالك هذا الرابط بتاريخ {date}",
"account.media": "وسائط", "account.media": "وسائط",
"account.mention": "أُذكُر @{name}", "account.mention": "أُذكُر @{name}",
"account.moved_to": "{name} إنتقل إلى :", "account.moved_to": "{name} إنتقل إلى :",
@ -91,8 +91,11 @@
"confirmations.mute.message": "هل أنت متأكد أنك تريد كتم {name} ؟", "confirmations.mute.message": "هل أنت متأكد أنك تريد كتم {name} ؟",
"confirmations.redraft.confirm": "إزالة و إعادة الصياغة", "confirmations.redraft.confirm": "إزالة و إعادة الصياغة",
"confirmations.redraft.message": "هل أنت متأكد من أنك تريد حذف هذا المنشور و إعادة صياغته ؟ سوف تفقد جميع الإعجابات و الترقيات أما الردود المتصلة به فستُصبِح يتيمة.", "confirmations.redraft.message": "هل أنت متأكد من أنك تريد حذف هذا المنشور و إعادة صياغته ؟ سوف تفقد جميع الإعجابات و الترقيات أما الردود المتصلة به فستُصبِح يتيمة.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "إلغاء المتابعة", "confirmations.unfollow.confirm": "إلغاء المتابعة",
"confirmations.unfollow.message": "متأكد من أنك تريد إلغاء متابعة {name} ؟", "confirmations.unfollow.message": "متأكد من أنك تريد إلغاء متابعة {name} ؟",
"conversation.last_message": "Last message:",
"embed.instructions": "يمكنكم إدماج هذا المنشور على موقعكم الإلكتروني عن طريق نسخ الشفرة أدناه.", "embed.instructions": "يمكنكم إدماج هذا المنشور على موقعكم الإلكتروني عن طريق نسخ الشفرة أدناه.",
"embed.preview": "هكذا ما سوف يبدو عليه :", "embed.preview": "هكذا ما سوف يبدو عليه :",
"emoji_button.activity": "الأنشطة", "emoji_button.activity": "الأنشطة",
@ -113,9 +116,9 @@
"empty_column.community": "الخط الزمني المحلي فارغ. أكتب شيئا ما للعامة كبداية !", "empty_column.community": "الخط الزمني المحلي فارغ. أكتب شيئا ما للعامة كبداية !",
"empty_column.direct": "لم تتلق أية رسالة خاصة مباشِرة بعد. سوف يتم عرض الرسائل المباشرة هنا إن قمت بإرسال واحدة أو تلقيت البعض منها.", "empty_column.direct": "لم تتلق أية رسالة خاصة مباشِرة بعد. سوف يتم عرض الرسائل المباشرة هنا إن قمت بإرسال واحدة أو تلقيت البعض منها.",
"empty_column.domain_blocks": "ليس هناك نطاقات مخفية بعد.", "empty_column.domain_blocks": "ليس هناك نطاقات مخفية بعد.",
"empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", "empty_column.favourited_statuses": "ليس لديك أية تبويقات مفضلة بعد. عندما ستقوم بالإعجاب بواحد، سيظهر هنا.",
"empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.", "empty_column.favourites": "لم يقم أي أحد بالإعجاب بهذا التبويق بعد. عندما يقوم أحدهم بذلك سوف يظهر هنا.",
"empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.", "empty_column.follow_requests": "ليس عندك أي طلب للمتابعة بعد. سوف تظهر طلباتك هنا إن قمت بتلقي البعض منها.",
"empty_column.hashtag": "ليس هناك بعدُ أي محتوى ذو علاقة بهذا الوسم.", "empty_column.hashtag": "ليس هناك بعدُ أي محتوى ذو علاقة بهذا الوسم.",
"empty_column.home": "إنّ الخيط الزمني لصفحتك الرئيسية فارغ. قم بزيارة {public} أو استخدم حقل البحث لكي تكتشف مستخدمين آخرين.", "empty_column.home": "إنّ الخيط الزمني لصفحتك الرئيسية فارغ. قم بزيارة {public} أو استخدم حقل البحث لكي تكتشف مستخدمين آخرين.",
"empty_column.home.public_timeline": "الخيط العام", "empty_column.home.public_timeline": "الخيط العام",
@ -163,7 +166,7 @@
"keyboard_shortcuts.reply": "للردّ", "keyboard_shortcuts.reply": "للردّ",
"keyboard_shortcuts.requests": "لفتح قائمة طلبات المتابعة", "keyboard_shortcuts.requests": "لفتح قائمة طلبات المتابعة",
"keyboard_shortcuts.search": "للتركيز على البحث", "keyboard_shortcuts.search": "للتركيز على البحث",
"keyboard_shortcuts.start": "to open \"get started\" column", "keyboard_shortcuts.start": "لفتح عمود \"هيا نبدأ\"",
"keyboard_shortcuts.toggle_hidden": "لعرض أو إخفاء النص مِن وراء التحذير", "keyboard_shortcuts.toggle_hidden": "لعرض أو إخفاء النص مِن وراء التحذير",
"keyboard_shortcuts.toot": "لتحرير تبويق جديد", "keyboard_shortcuts.toot": "لتحرير تبويق جديد",
"keyboard_shortcuts.unfocus": "لإلغاء التركيز على حقل النص أو نافذة البحث", "keyboard_shortcuts.unfocus": "لإلغاء التركيز على حقل النص أو نافذة البحث",
@ -280,7 +283,7 @@
"status.cancel_reblog_private": "إلغاء الترقية", "status.cancel_reblog_private": "إلغاء الترقية",
"status.cannot_reblog": "تعذرت ترقية هذا المنشور", "status.cannot_reblog": "تعذرت ترقية هذا المنشور",
"status.delete": "إحذف", "status.delete": "إحذف",
"status.detailed_status": "Detailed conversation view", "status.detailed_status": "تفاصيل المحادثة",
"status.direct": "رسالة خاصة إلى @{name}", "status.direct": "رسالة خاصة إلى @{name}",
"status.embed": "إدماج", "status.embed": "إدماج",
"status.favourite": "أضف إلى المفضلة", "status.favourite": "أضف إلى المفضلة",
@ -294,6 +297,7 @@
"status.open": "وسع هذه المشاركة", "status.open": "وسع هذه المشاركة",
"status.pin": "تدبيس على الملف الشخصي", "status.pin": "تدبيس على الملف الشخصي",
"status.pinned": "تبويق مثبَّت", "status.pinned": "تبويق مثبَّت",
"status.read_more": "Read more",
"status.reblog": "رَقِّي", "status.reblog": "رَقِّي",
"status.reblog_private": "القيام بالترقية إلى الجمهور الأصلي", "status.reblog_private": "القيام بالترقية إلى الجمهور الأصلي",
"status.reblogged_by": "رقّاه {name}", "status.reblogged_by": "رقّاه {name}",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "¿De xuru que quies silenciar a {name}?", "confirmations.mute.message": "¿De xuru que quies silenciar a {name}?",
"confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.confirm": "Delete & redraft",
"confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.confirm": "Unfollow",
"confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "Embed this status on your website by copying the code below.", "embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:", "embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Actividá", "emoji_button.activity": "Actividá",
@ -294,6 +297,7 @@
"status.open": "Espander esti estáu", "status.open": "Espander esti estáu",
"status.pin": "Pin on profile", "status.pin": "Pin on profile",
"status.pinned": "Pinned toot", "status.pinned": "Pinned toot",
"status.read_more": "Read more",
"status.reblog": "Boost", "status.reblog": "Boost",
"status.reblog_private": "Boost to original audience", "status.reblog_private": "Boost to original audience",
"status.reblogged_by": "{name} boosted", "status.reblogged_by": "{name} boosted",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "Are you sure you want to mute {name}?", "confirmations.mute.message": "Are you sure you want to mute {name}?",
"confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.confirm": "Delete & redraft",
"confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.confirm": "Unfollow",
"confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "Embed this status on your website by copying the code below.", "embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:", "embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Activity", "emoji_button.activity": "Activity",
@ -294,6 +297,7 @@
"status.open": "Expand this status", "status.open": "Expand this status",
"status.pin": "Pin on profile", "status.pin": "Pin on profile",
"status.pinned": "Pinned toot", "status.pinned": "Pinned toot",
"status.read_more": "Read more",
"status.reblog": "Споделяне", "status.reblog": "Споделяне",
"status.reblog_private": "Boost to original audience", "status.reblog_private": "Boost to original audience",
"status.reblogged_by": "{name} сподели", "status.reblogged_by": "{name} сподели",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "Estàs segur que vols silenciar {name}?", "confirmations.mute.message": "Estàs segur que vols silenciar {name}?",
"confirmations.redraft.confirm": "Esborrar i refer", "confirmations.redraft.confirm": "Esborrar i refer",
"confirmations.redraft.message": "Estàs segur que vols esborrar aquesta publicació i tornar a redactar-la? Perderàs totes els impulsos i favorits, i les respostes a la publicació original es quedaran orfes.", "confirmations.redraft.message": "Estàs segur que vols esborrar aquesta publicació i tornar a redactar-la? Perderàs totes els impulsos i favorits, i les respostes a la publicació original es quedaran orfes.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Deixa de seguir", "confirmations.unfollow.confirm": "Deixa de seguir",
"confirmations.unfollow.message": "Estàs segur que vols deixar de seguir {name}?", "confirmations.unfollow.message": "Estàs segur que vols deixar de seguir {name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "Incrusta aquest estat al lloc web copiant el codi a continuació.", "embed.instructions": "Incrusta aquest estat al lloc web copiant el codi a continuació.",
"embed.preview": "Aquí tenim quin aspecte tindrá:", "embed.preview": "Aquí tenim quin aspecte tindrá:",
"emoji_button.activity": "Activitat", "emoji_button.activity": "Activitat",
@ -294,6 +297,7 @@
"status.open": "Ampliar aquest estat", "status.open": "Ampliar aquest estat",
"status.pin": "Fixat en el perfil", "status.pin": "Fixat en el perfil",
"status.pinned": "Toot fixat", "status.pinned": "Toot fixat",
"status.read_more": "Read more",
"status.reblog": "Impuls", "status.reblog": "Impuls",
"status.reblog_private": "Impulsar a l'audiència original", "status.reblog_private": "Impulsar a l'audiència original",
"status.reblogged_by": "{name} ha retootejat", "status.reblogged_by": "{name} ha retootejat",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "Site sicuru·a che vulete piattà @{name}?", "confirmations.mute.message": "Site sicuru·a che vulete piattà @{name}?",
"confirmations.redraft.confirm": "Sguassà è riscrive", "confirmations.redraft.confirm": "Sguassà è riscrive",
"confirmations.redraft.message": "Site sicuru·a chè vulete sguassà stu statutu è riscrivelu? I favuriti è spartere saranu persi, è e risposte diventeranu orfane.", "confirmations.redraft.message": "Site sicuru·a chè vulete sguassà stu statutu è riscrivelu? I favuriti è spartere saranu persi, è e risposte diventeranu orfane.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Disabbunassi", "confirmations.unfollow.confirm": "Disabbunassi",
"confirmations.unfollow.message": "Site sicuru·a ch'ùn vulete più siguità @{name}?", "confirmations.unfollow.message": "Site sicuru·a ch'ùn vulete più siguità @{name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "Integrà stu statutu à u vostru situ cù u codice quì sottu.", "embed.instructions": "Integrà stu statutu à u vostru situ cù u codice quì sottu.",
"embed.preview": "Assumiglierà à qualcosa cusì:", "embed.preview": "Assumiglierà à qualcosa cusì:",
"emoji_button.activity": "Attività", "emoji_button.activity": "Attività",
@ -294,6 +297,7 @@
"status.open": "Apre stu statutu", "status.open": "Apre stu statutu",
"status.pin": "Puntarulà à u prufile", "status.pin": "Puntarulà à u prufile",
"status.pinned": "Statutu puntarulatu", "status.pinned": "Statutu puntarulatu",
"status.read_more": "Read more",
"status.reblog": "Sparte", "status.reblog": "Sparte",
"status.reblog_private": "Sparte à l'audienza uriginale", "status.reblog_private": "Sparte à l'audienza uriginale",
"status.reblogged_by": "{name} hà spartutu", "status.reblogged_by": "{name} hà spartutu",

View File

@ -8,14 +8,14 @@
"account.domain_blocked": "Doména skryta", "account.domain_blocked": "Doména skryta",
"account.edit_profile": "Upravit profil", "account.edit_profile": "Upravit profil",
"account.endorse": "Představit na profilu", "account.endorse": "Představit na profilu",
"account.follow": "Sleduj", "account.follow": "Sledovat",
"account.followers": "Sledovatelé", "account.followers": "Sledovatelé",
"account.followers.empty": "Tohoto uživatele ještě nikdo nesleduje.", "account.followers.empty": "Tohoto uživatele ještě nikdo nesleduje.",
"account.follows": "Sleduje", "account.follows": "Sleduje",
"account.follows.empty": "Tento uživatel ještě nikoho nesleduje.", "account.follows.empty": "Tento uživatel ještě nikoho nesleduje.",
"account.follows_you": "Sleduje vás", "account.follows_you": "Sleduje vás",
"account.hide_reblogs": "Skrýt boosty od uživatele @{name}", "account.hide_reblogs": "Skrýt boosty od uživatele @{name}",
"account.link_verified_on": "Ownership of this link was checked on {date}", "account.link_verified_on": "Vlastnictví tohoto odkazu bylo zkontrolováno {date}",
"account.media": "Média", "account.media": "Média",
"account.mention": "Zmínit uživatele @{name}", "account.mention": "Zmínit uživatele @{name}",
"account.moved_to": "{name} se přesunul/a na:", "account.moved_to": "{name} se přesunul/a na:",
@ -91,8 +91,11 @@
"confirmations.mute.message": "Jste si jistý/á, že chcete ignorovat uživatele {name}?", "confirmations.mute.message": "Jste si jistý/á, že chcete ignorovat uživatele {name}?",
"confirmations.redraft.confirm": "Vymazat a přepsat", "confirmations.redraft.confirm": "Vymazat a přepsat",
"confirmations.redraft.message": "Jste si jistý/á, že chcete vymazat a přepsat tento příspěvek? Oblíbení a boosty budou ztraceny a odpovědi na původní příspěvek budou opuštěny.", "confirmations.redraft.message": "Jste si jistý/á, že chcete vymazat a přepsat tento příspěvek? Oblíbení a boosty budou ztraceny a odpovědi na původní příspěvek budou opuštěny.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Přestat sledovat", "confirmations.unfollow.confirm": "Přestat sledovat",
"confirmations.unfollow.message": "jste si jistý/á, že chcete přestat sledovat uživatele {name}?", "confirmations.unfollow.message": "jste si jistý/á, že chcete přestat sledovat uživatele {name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "Pro přidání příspěvku na vaši webovou stránku zkopírujte níže uvedený kód.", "embed.instructions": "Pro přidání příspěvku na vaši webovou stránku zkopírujte níže uvedený kód.",
"embed.preview": "Takhle to bude vypadat:", "embed.preview": "Takhle to bude vypadat:",
"emoji_button.activity": "Aktivita", "emoji_button.activity": "Aktivita",
@ -294,6 +297,7 @@
"status.open": "Rozbalit tento příspěvek", "status.open": "Rozbalit tento příspěvek",
"status.pin": "Připnout na profil", "status.pin": "Připnout na profil",
"status.pinned": "Připnutý toot", "status.pinned": "Připnutý toot",
"status.read_more": "Read more",
"status.reblog": "Boostnout", "status.reblog": "Boostnout",
"status.reblog_private": "Boostnout původnímu publiku", "status.reblog_private": "Boostnout původnímu publiku",
"status.reblogged_by": "{name} boostnul/a", "status.reblogged_by": "{name} boostnul/a",

View File

@ -1,335 +1,340 @@
{ {
"account.badges.bot": "Bot", "account.badges.bot": "Bot",
"account.block": "Blociwch @{name}", "account.block": "Blociwch @{name}",
"account.block_domain": "Cuddiwch bopeth rhag {domain}", "account.block_domain": "Cuddiwch bopeth rhag {domain}",
"account.blocked": "Blociwyd", "account.blocked": "Blociwyd",
"account.direct": "Neges breifat @{name}", "account.direct": "Neges breifat @{name}",
"account.disclaimer_full": "Gall y wybodaeth isod adlewyrchu darlun anghyflawn o broffil defnyddiwr.", "account.disclaimer_full": "Gall y wybodaeth isod adlewyrchu darlun anghyflawn o broffil defnyddiwr.",
"account.domain_blocked": "Parth wedi ei guddio", "account.domain_blocked": "Parth wedi ei guddio",
"account.edit_profile": "Golygu proffil", "account.edit_profile": "Golygu proffil",
"account.endorse": "Arddangos ar fy mhroffil", "account.endorse": "Arddangos ar fy mhroffil",
"account.follow": "Dilyn", "account.follow": "Dilyn",
"account.followers": "Dilynwyr", "account.followers": "Dilynwyr",
"account.followers.empty": "Nid oes neb yn dilyn y defnyddiwr hwn eto.", "account.followers.empty": "Nid oes neb yn dilyn y defnyddiwr hwn eto.",
"account.follows": "Yn dilyn", "account.follows": "Yn dilyn",
"account.follows.empty": "Nid yw'r defnyddiwr hwn yn dilyn unrhyw un eto.", "account.follows.empty": "Nid yw'r defnyddiwr hwn yn dilyn unrhyw un eto.",
"account.follows_you": "Yn eich dilyn chi", "account.follows_you": "Yn eich dilyn chi",
"account.hide_reblogs": "Cuddio bwstiau o @{name}", "account.hide_reblogs": "Cuddio bwstiau o @{name}",
"account.media": "Cyfryngau", "account.link_verified_on": "Gwiriwyd perchnogaeth y ddolen yma ar {date}",
"account.mention": "Crybwyll @{name}", "account.media": "Cyfryngau",
"account.moved_to": "Mae @{name} wedi symud i:", "account.mention": "Crybwyll @{name}",
"account.mute": "Tawelu @{name}", "account.moved_to": "Mae @{name} wedi symud i:",
"account.mute_notifications": "Cuddio hysbysiadau o @{name}", "account.mute": "Tawelu @{name}",
"account.muted": "Distewyd", "account.mute_notifications": "Cuddio hysbysiadau o @{name}",
"account.posts": "Tŵtiau", "account.muted": "Distewyd",
"account.posts_with_replies": "Tŵtiau ac atebion", "account.posts": "Tŵtiau",
"account.report": "Adroddwch @{name}", "account.posts_with_replies": "Tŵtiau ac atebion",
"account.requested": "Aros am gymeradwyaeth. Cliciwch er mwyn canslo cais dilyn", "account.report": "Adroddwch @{name}",
"account.share": "Rhannwch broffil @{name}", "account.requested": "Aros am gymeradwyaeth. Cliciwch er mwyn canslo cais dilyn",
"account.show_reblogs": "Dangoswch bwstiau o @{name}", "account.share": "Rhannwch broffil @{name}",
"account.unblock": "Dadflociwch @{name}", "account.show_reblogs": "Dangoswch bwstiau o @{name}",
"account.unblock_domain": "Dadguddiwch {domain}", "account.unblock": "Dadflociwch @{name}",
"account.unendorse": "Peidwch a'i arddangos ar fy mhroffil", "account.unblock_domain": "Dadguddiwch {domain}",
"account.unfollow": "Daddilynwch", "account.unendorse": "Peidwch a'i arddangos ar fy mhroffil",
"account.unmute": "Dad-dawelu @{name}", "account.unfollow": "Daddilynwch",
"account.unmute_notifications": "Dad-dawelu hysbysiadau o @{name}", "account.unmute": "Dad-dawelu @{name}",
"account.view_full_profile": "Gweld proffil llawn", "account.unmute_notifications": "Dad-dawelu hysbysiadau o @{name}",
"alert.unexpected.message": "Digwyddodd gwall annisgwyl.", "account.view_full_profile": "Gweld proffil llawn",
"alert.unexpected.title": "Wps!", "alert.unexpected.message": "Digwyddodd gwall annisgwyl.",
"boost_modal.combo": "Mae modd gwasgu {combo} er mwyn sgipio hyn tro nesa", "alert.unexpected.title": "Wps!",
"bundle_column_error.body": "Aeth rhywbeth o'i le tra'n llwytho'r elfen hon.", "boost_modal.combo": "Mae modd gwasgu {combo} er mwyn sgipio hyn tro nesa",
"bundle_column_error.retry": "Ceisiwch eto", "bundle_column_error.body": "Aeth rhywbeth o'i le tra'n llwytho'r elfen hon.",
"bundle_column_error.title": "Gwall rhwydwaith", "bundle_column_error.retry": "Ceisiwch eto",
"bundle_modal_error.close": "Cau", "bundle_column_error.title": "Gwall rhwydwaith",
"bundle_modal_error.message": "Aeth rhywbeth o'i le tra'n llwytho'r elfen hon.", "bundle_modal_error.close": "Cau",
"bundle_modal_error.retry": "Ceiswich eto", "bundle_modal_error.message": "Aeth rhywbeth o'i le tra'n llwytho'r elfen hon.",
"column.blocks": "Defnyddwyr a flociwyd", "bundle_modal_error.retry": "Ceiswich eto",
"column.community": "Llinell amser lleol", "column.blocks": "Defnyddwyr a flociwyd",
"column.direct": "Negeseuon preifat", "column.community": "Llinell amser lleol",
"column.domain_blocks": "Parthau cuddiedig", "column.direct": "Negeseuon preifat",
"column.favourites": "Ffefrynnau", "column.domain_blocks": "Parthau cuddiedig",
"column.follow_requests": "Ceisiadau dilyn", "column.favourites": "Ffefrynnau",
"column.home": "Hafan", "column.follow_requests": "Ceisiadau dilyn",
"column.lists": "Rhestrau", "column.home": "Hafan",
"column.mutes": "Defnyddwyr a ddistewyd", "column.lists": "Rhestrau",
"column.notifications": "Hysbysiadau", "column.mutes": "Defnyddwyr a ddistewyd",
"column.pins": "Tŵtiau wedi eu pinio", "column.notifications": "Hysbysiadau",
"column.public": "", "column.pins": "Tŵtiau wedi eu pinio",
"column_back_button.label": "Nôl", "column.public": "Ffrwd y ffederasiwn",
"column_header.hide_settings": "Cuddiwch dewisiadau", "column_back_button.label": "Nôl",
"column_header.moveLeft_settings": "Symudwch y golofn i'r chwith", "column_header.hide_settings": "Cuddiwch dewisiadau",
"column_header.moveRight_settings": "Symudwch y golofn i'r dde", "column_header.moveLeft_settings": "Symudwch y golofn i'r chwith",
"column_header.pin": "Piniwch", "column_header.moveRight_settings": "Symudwch y golofn i'r dde",
"column_header.show_settings": "Dangos gosodiadau", "column_header.pin": "Piniwch",
"column_header.unpin": "Dadbiniwch", "column_header.show_settings": "Dangos gosodiadau",
"column_subheading.settings": "Gosodiadau", "column_header.unpin": "Dadbiniwch",
"community.column_settings.media_only": "Cyfryngau yn unig", "column_subheading.settings": "Gosodiadau",
"compose_form.direct_message_warning": "Mi fydd y tŵt hwn ond yn cael ei anfon at y defnyddwyr sy'n cael eu crybwyll.", "community.column_settings.media_only": "Cyfryngau yn unig",
"compose_form.direct_message_warning_learn_more": "Dysgwch fwy", "compose_form.direct_message_warning": "Mi fydd y tŵt hwn ond yn cael ei anfon at y defnyddwyr sy'n cael eu crybwyll.",
"compose_form.hashtag_warning": "Ni fydd y tŵt hwn wedi ei restru o dan unrhyw hashnod gan ei fod heb ei restru. Dim ond tŵtiau cyhoeddus gellid chwilota amdanynt drwy hashnod.", "compose_form.direct_message_warning_learn_more": "Dysgwch fwy",
"compose_form.lock_disclaimer": "Nid yw eich cyfri wedi'i {locked}. Gall unrhyw un eich dilyn i weld eich POSTS dilynwyr-yn-unig.", "compose_form.hashtag_warning": "Ni fydd y tŵt hwn wedi ei restru o dan unrhyw hashnod gan ei fod heb ei restru. Dim ond tŵtiau cyhoeddus gellid chwilota amdanynt drwy hashnod.",
"compose_form.lock_disclaimer.lock": "wedi ei gloi", "compose_form.lock_disclaimer": "Nid yw eich cyfri wedi'i {locked}. Gall unrhyw un eich dilyn i weld eich POSTS dilynwyr-yn-unig.",
"compose_form.placeholder": "Be syd ar eich meddwl?", "compose_form.lock_disclaimer.lock": "wedi ei gloi",
"compose_form.publish": "Tŵt", "compose_form.placeholder": "Be syd ar eich meddwl?",
"compose_form.publish_loud": "{publish}!", "compose_form.publish": "Tŵt",
"compose_form.sensitive.marked": "", "compose_form.publish_loud": "{publish}!",
"compose_form.sensitive.unmarked": "", "compose_form.sensitive.marked": "Media is marked as sensitive",
"compose_form.spoiler.marked": "Testun wedi ei guddio gan rybudd", "compose_form.sensitive.unmarked": "Media is not marked as sensitive",
"compose_form.spoiler.unmarked": "Nid yw'r testun wedi ei guddio", "compose_form.spoiler.marked": "Testun wedi ei guddio gan rybudd",
"compose_form.spoiler_placeholder": "Ysgrifenwch eich rhybudd yma", "compose_form.spoiler.unmarked": "Nid yw'r testun wedi ei guddio",
"confirmation_modal.cancel": "Canslo", "compose_form.spoiler_placeholder": "Ysgrifenwch eich rhybudd yma",
"confirmations.block.confirm": "Blociwch", "confirmation_modal.cancel": "Canslo",
"confirmations.block.message": "Ydych chi'n sicr eich bod eisiau blocio {name}?", "confirmations.block.confirm": "Blociwch",
"confirmations.delete.confirm": "Dileu", "confirmations.block.message": "Ydych chi'n sicr eich bod eisiau blocio {name}?",
"confirmations.delete.message": "Ydych chi'n sicr eich bod eisiau dileu y statws hwn?", "confirmations.delete.confirm": "Dileu",
"confirmations.delete_list.confirm": "Dileu", "confirmations.delete.message": "Ydych chi'n sicr eich bod eisiau dileu y statws hwn?",
"confirmations.delete_list.message": "Ydych chi'n sicr eich bod eisiau dileu y rhestr hwn am byth?", "confirmations.delete_list.confirm": "Dileu",
"confirmations.domain_block.confirm": "", "confirmations.delete_list.message": "Ydych chi'n sicr eich bod eisiau dileu y rhestr hwn am byth?",
"confirmations.domain_block.message": "", "confirmations.domain_block.confirm": "Cuddio parth cyfan",
"confirmations.mute.confirm": "Tawelu", "confirmations.domain_block.message": "A ydych yn hollol, hollol sicr eich bod am flocio y {domain} cyfan? Yn y nifer helaeth o achosion mae blocio neu tawelu ambell gyfrif yn ddigonol ac yn well. Ni fyddwch yn gweld cynnwyr o'r parth hwnnw mewn unrhyw ffrydiau cyhoeddus na chwaith eich hysbysiadau. Bydd hyn yn cael gwared o'ch dilynwyr o'r parth hwnnw.",
"confirmations.mute.message": "Ydych chi'n sicr eich bod am ddistewi {name}?", "confirmations.mute.confirm": "Tawelu",
"confirmations.redraft.confirm": "Dilëwch & ailddrafftio", "confirmations.mute.message": "Ydych chi'n sicr eich bod am ddistewi {name}?",
"confirmations.redraft.message": "Ydych chi'n siwr eich bod eisiau dileu y statws hwn a'i ailddrafftio? Bydd ffefrynnau a bwstiau'n cael ei colli, a bydd ymatebion i'r statws gwreiddiol yn cael eu hamddifadu.", "confirmations.redraft.confirm": "Dilëwch & ailddrafftio",
"confirmations.unfollow.confirm": "Dad-ddilynwch", "confirmations.redraft.message": "Ydych chi'n siwr eich bod eisiau dileu y statws hwn a'i ailddrafftio? Bydd ffefrynnau a bwstiau'n cael ei colli, a bydd ymatebion i'r statws gwreiddiol yn cael eu hamddifadu.",
"confirmations.unfollow.message": "Ydych chi'n sicr eich bod am ddad-ddilyn {name}?", "confirmations.reply.confirm": "Reply",
"embed.instructions": "Mewnblannwch y statws hwn ar eich gwefan drwy gopïo'r côd isod.", "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"embed.preview": "Dyma sut olwg fydd arno:", "confirmations.unfollow.confirm": "Dad-ddilynwch",
"emoji_button.activity": "Gweithgarwch", "confirmations.unfollow.message": "Ydych chi'n sicr eich bod am ddad-ddilyn {name}?",
"emoji_button.custom": "", "conversation.last_message": "Last message:",
"emoji_button.flags": "Baneri", "embed.instructions": "Mewnblannwch y statws hwn ar eich gwefan drwy gopïo'r côd isod.",
"emoji_button.food": "Bwyd a Diod", "embed.preview": "Dyma sut olwg fydd arno:",
"emoji_button.label": "Mewnosodwch emoji", "emoji_button.activity": "Gweithgarwch",
"emoji_button.nature": "Natur", "emoji_button.custom": "Custom",
"emoji_button.not_found": "Dim emojos!! (╯°□°)╯︵ ┻━┻", "emoji_button.flags": "Baneri",
"emoji_button.objects": "Gwrthrychau", "emoji_button.food": "Bwyd a Diod",
"emoji_button.people": "Pobl", "emoji_button.label": "Mewnosodwch emoji",
"emoji_button.recent": "Defnyddir yn aml", "emoji_button.nature": "Natur",
"emoji_button.search": "Chwilio...", "emoji_button.not_found": "Dim emojos!! (╯°□°)╯︵ ┻━┻",
"emoji_button.search_results": "Canlyniadau chwilio", "emoji_button.objects": "Gwrthrychau",
"emoji_button.symbols": "Symbolau", "emoji_button.people": "Pobl",
"emoji_button.travel": "Teithio & Llefydd", "emoji_button.recent": "Defnyddir yn aml",
"empty_column.blocks": "Nid ydych wedi blocio unrhyw ddefnyddwyr eto.", "emoji_button.search": "Chwilio...",
"empty_column.community": "", "emoji_button.search_results": "Canlyniadau chwilio",
"empty_column.direct": "Nid oes gennych unrhyw negeseuon preifat eto. Pan y byddwch yn anfon neu derbyn un, mi fydd yn ymddangos yma.", "emoji_button.symbols": "Symbolau",
"empty_column.domain_blocks": "Nid oes yna unrhyw barthau cuddiedig eto.", "emoji_button.travel": "Teithio & Llefydd",
"empty_column.favourited_statuses": "Nid oes gennych unrhyw hoff dwtiau eto. Pan y byddwch yn hoffi un, mi fydd yn ymddangos yma.", "empty_column.blocks": "Nid ydych wedi blocio unrhyw ddefnyddwyr eto.",
"empty_column.favourites": "Nid oes neb wedi hoffi'r tŵt yma eto. Pan bydd rhywun yn ei hoffi, mi fyddent yn ymddangos yma.", "empty_column.community": "Mae'r ffrwd lleol yn wag. Ysgrifenwch rhywbeth yn gyhoeddus i gael dechrau arni!",
"empty_column.follow_requests": "Nid oes gennych unrhyw geisiadau dilyn eto. Pan dderbyniwch chi un, bydd yn ymddangos yma.", "empty_column.direct": "Nid oes gennych unrhyw negeseuon preifat eto. Pan y byddwch yn anfon neu derbyn un, mi fydd yn ymddangos yma.",
"empty_column.hashtag": "Nid oes dim ar yr hashnod hwn eto.", "empty_column.domain_blocks": "Nid oes yna unrhyw barthau cuddiedig eto.",
"empty_column.home": "", "empty_column.favourited_statuses": "Nid oes gennych unrhyw hoff dwtiau eto. Pan y byddwch yn hoffi un, mi fydd yn ymddangos yma.",
"empty_column.home.public_timeline": "y ffrwd cyhoeddus", "empty_column.favourites": "Nid oes neb wedi hoffi'r tŵt yma eto. Pan bydd rhywun yn ei hoffi, mi fyddent yn ymddangos yma.",
"empty_column.list": "Nid oes dim yn y rhestr yma eto. Pan y bydd aelodau'r rhestr yn cyhoeddi statws newydd, mi fydd yn ymddangos yma.", "empty_column.follow_requests": "Nid oes gennych unrhyw geisiadau dilyn eto. Pan dderbyniwch chi un, bydd yn ymddangos yma.",
"empty_column.lists": "Nid oes gennych unrhyw restrau eto. Pan grëwch chi un, mi fydd yn ymddangos yma.", "empty_column.hashtag": "Nid oes dim ar yr hashnod hwn eto.",
"empty_column.mutes": "Nid ydych wedi tawelu unrhyw ddefnyddwyr eto.", "empty_column.home": "Mae eich ffrwd gartref yn wag! Ymwelwch a {public} neu defnyddiwch y chwilotwr i ddechrau arni ac i gwrdd a defnyddwyr eraill.",
"empty_column.notifications": "Nid oes gennych unrhyw hysbysiadau eto. Rhyngweithiwch ac eraill i ddechrau'r sgwrs.", "empty_column.home.public_timeline": "y ffrwd cyhoeddus",
"empty_column.public": "Does dim byd yma! Ysgrifennwch rhywbeth yn gyhoeddus, neu dilynwch ddefnyddwyr o INSTANCES eraill i'w lenwi", "empty_column.list": "Nid oes dim yn y rhestr yma eto. Pan y bydd aelodau'r rhestr yn cyhoeddi statws newydd, mi fydd yn ymddangos yma.",
"follow_request.authorize": "Caniatau", "empty_column.lists": "Nid oes gennych unrhyw restrau eto. Pan grëwch chi un, mi fydd yn ymddangos yma.",
"follow_request.reject": "Gwrthod", "empty_column.mutes": "Nid ydych wedi tawelu unrhyw ddefnyddwyr eto.",
"getting_started.developers": "Datblygwyr", "empty_column.notifications": "Nid oes gennych unrhyw hysbysiadau eto. Rhyngweithiwch ac eraill i ddechrau'r sgwrs.",
"getting_started.documentation": "Dogfennaeth", "empty_column.public": "Does dim byd yma! Ysgrifennwch rhywbeth yn gyhoeddus, neu dilynwch ddefnyddwyr o INSTANCES eraill i'w lenwi",
"getting_started.find_friends": "Canfod ffrindiau o Twitter", "follow_request.authorize": "Caniatau",
"getting_started.heading": "Dechrau", "follow_request.reject": "Gwrthod",
"getting_started.invite": "Gwahoddwch bobl", "getting_started.developers": "Datblygwyr",
"getting_started.open_source_notice": "Mae Mastodon yn feddalwedd côd agored. Mae modd cyfrannu neu adrodd materion ar GitHUb ar {github}.", "getting_started.documentation": "Dogfennaeth",
"getting_started.security": "Diogelwch", "getting_started.find_friends": "Canfod ffrindiau o Twitter",
"getting_started.terms": "Telerau Gwasanaeth", "getting_started.heading": "Dechrau",
"home.column_settings.basic": "Syml", "getting_started.invite": "Gwahoddwch bobl",
"home.column_settings.show_reblogs": "", "getting_started.open_source_notice": "Mae Mastodon yn feddalwedd côd agored. Mae modd cyfrannu neu adrodd materion ar GitHUb ar {github}.",
"home.column_settings.show_replies": "Dangoswch ymatebion", "getting_started.security": "Diogelwch",
"keyboard_shortcuts.back": "", "getting_started.terms": "Telerau Gwasanaeth",
"keyboard_shortcuts.blocked": "i agor rhestr defnyddwyr a flociwyd", "home.column_settings.basic": "Syml",
"keyboard_shortcuts.boost": "", "home.column_settings.show_reblogs": "Show boosts",
"keyboard_shortcuts.column": "", "home.column_settings.show_replies": "Dangoswch ymatebion",
"keyboard_shortcuts.compose": "", "keyboard_shortcuts.back": "i lywio nôl",
"keyboard_shortcuts.description": "Disgrifiad", "keyboard_shortcuts.blocked": "i agor rhestr defnyddwyr a flociwyd",
"keyboard_shortcuts.direct": "i agor colofn negeseuon preifat", "keyboard_shortcuts.boost": "to boost",
"keyboard_shortcuts.down": "i symud lawr yn y rhestr", "keyboard_shortcuts.column": "to focus a status in one of the columns",
"keyboard_shortcuts.enter": "i agor statws", "keyboard_shortcuts.compose": "to focus the compose textarea",
"keyboard_shortcuts.favourite": "i hoffi", "keyboard_shortcuts.description": "Disgrifiad",
"keyboard_shortcuts.favourites": "i agor rhestr hoffi", "keyboard_shortcuts.direct": "i agor colofn negeseuon preifat",
"keyboard_shortcuts.federated": "", "keyboard_shortcuts.down": "i symud lawr yn y rhestr",
"keyboard_shortcuts.heading": "", "keyboard_shortcuts.enter": "i agor statws",
"keyboard_shortcuts.home": "i agor ffrwd cartref", "keyboard_shortcuts.favourite": "i hoffi",
"keyboard_shortcuts.hotkey": "Hotkey", "keyboard_shortcuts.favourites": "i agor rhestr hoffi",
"keyboard_shortcuts.legend": "", "keyboard_shortcuts.federated": "i agor ffrwd y ffederasiwn",
"keyboard_shortcuts.local": "i agor ffrwd lleol", "keyboard_shortcuts.heading": "Llwybrau byr allweddell",
"keyboard_shortcuts.mention": "i grybwyll yr awdur", "keyboard_shortcuts.home": "i agor ffrwd cartref",
"keyboard_shortcuts.muted": "i agor rhestr defnyddwyr a dawelwyd", "keyboard_shortcuts.hotkey": "Hotkey",
"keyboard_shortcuts.my_profile": "i agor eich proffil", "keyboard_shortcuts.legend": "i ddangos yr arwr yma",
"keyboard_shortcuts.notifications": "i agor colofn hysbysiadau", "keyboard_shortcuts.local": "i agor ffrwd lleol",
"keyboard_shortcuts.pinned": "", "keyboard_shortcuts.mention": "i grybwyll yr awdur",
"keyboard_shortcuts.profile": "i agor proffil yr awdur", "keyboard_shortcuts.muted": "i agor rhestr defnyddwyr a dawelwyd",
"keyboard_shortcuts.reply": "i ateb", "keyboard_shortcuts.my_profile": "i agor eich proffil",
"keyboard_shortcuts.requests": "i agor rhestr ceisiadau dilyn", "keyboard_shortcuts.notifications": "i agor colofn hysbysiadau",
"keyboard_shortcuts.search": "", "keyboard_shortcuts.pinned": "i agor rhestr tŵtiau wedi'i pinio",
"keyboard_shortcuts.start": "", "keyboard_shortcuts.profile": "i agor proffil yr awdur",
"keyboard_shortcuts.toggle_hidden": "", "keyboard_shortcuts.reply": "i ateb",
"keyboard_shortcuts.toot": "i ddechrau tŵt newydd sbon", "keyboard_shortcuts.requests": "i agor rhestr ceisiadau dilyn",
"keyboard_shortcuts.unfocus": "", "keyboard_shortcuts.search": "i ffocysu chwilio",
"keyboard_shortcuts.up": "i symud yn uwch yn y rhestr", "keyboard_shortcuts.start": "i agor colofn \"dechrau arni\"",
"lightbox.close": "Cau", "keyboard_shortcuts.toggle_hidden": "i ddangos/cuddio testun tu ôl i CW",
"lightbox.next": "Nesaf", "keyboard_shortcuts.toot": "i ddechrau tŵt newydd sbon",
"lightbox.previous": "", "keyboard_shortcuts.unfocus": "i ddad-ffocysu ardal cyfansoddi testun/chwilio",
"lists.account.add": "Ychwanegwch at restr", "keyboard_shortcuts.up": "i symud yn uwch yn y rhestr",
"lists.account.remove": "", "lightbox.close": "Cau",
"lists.delete": "Dileu rhestr", "lightbox.next": "Nesaf",
"lists.edit": "Golygwch restr", "lightbox.previous": "Blaenorol",
"lists.new.create": "Ychwanegwch restr", "lists.account.add": "Ychwanegwch at restr",
"lists.new.title_placeholder": "Teitl rhestr newydd", "lists.account.remove": "Remove from list",
"lists.search": "", "lists.delete": "Dileu rhestr",
"lists.subheading": "Eich rhestrau", "lists.edit": "Golygwch restr",
"loading_indicator.label": "Llwytho...", "lists.new.create": "Ychwanegwch restr",
"media_gallery.toggle_visible": "", "lists.new.title_placeholder": "Teitl rhestr newydd",
"missing_indicator.label": "Heb ei ganfod", "lists.search": "Chwiliwch ymysg pobl yr ydych yn ei ddilyn",
"missing_indicator.sublabel": "Ni ellid canfod yr adnodd hwn", "lists.subheading": "Eich rhestrau",
"mute_modal.hide_notifications": "Cuddiwch hysbysiadau rhag y defnyddiwr hwn?", "loading_indicator.label": "Llwytho...",
"navigation_bar.apps": "Apiau symudol", "media_gallery.toggle_visible": "Toglo gwelededd",
"navigation_bar.blocks": "Defnyddwyr wedi eu blocio", "missing_indicator.label": "Heb ei ganfod",
"navigation_bar.community_timeline": "", "missing_indicator.sublabel": "Ni ellid canfod yr adnodd hwn",
"navigation_bar.compose": "Cyfansoddwch dŵt newydd", "mute_modal.hide_notifications": "Cuddiwch hysbysiadau rhag y defnyddiwr hwn?",
"navigation_bar.direct": "Negeseuon preifat", "navigation_bar.apps": "Apiau symudol",
"navigation_bar.discover": "Darganfyddwch", "navigation_bar.blocks": "Defnyddwyr wedi eu blocio",
"navigation_bar.domain_blocks": "Parthau cuddiedig", "navigation_bar.community_timeline": "Ffrwd leol",
"navigation_bar.edit_profile": "Golygu proffil", "navigation_bar.compose": "Cyfansoddwch dŵt newydd",
"navigation_bar.favourites": "Ffefrynnau", "navigation_bar.direct": "Negeseuon preifat",
"navigation_bar.filters": "Geiriau a dawelwyd", "navigation_bar.discover": "Darganfyddwch",
"navigation_bar.follow_requests": "Ceisiadau dilyn", "navigation_bar.domain_blocks": "Parthau cuddiedig",
"navigation_bar.info": "", "navigation_bar.edit_profile": "Golygu proffil",
"navigation_bar.keyboard_shortcuts": "", "navigation_bar.favourites": "Ffefrynnau",
"navigation_bar.lists": "Rhestrau", "navigation_bar.filters": "Geiriau a dawelwyd",
"navigation_bar.logout": "Allgofnodi", "navigation_bar.follow_requests": "Ceisiadau dilyn",
"navigation_bar.mutes": "Defnyddwyr a dawelwyd", "navigation_bar.info": "Ynghylch yr achos hwn",
"navigation_bar.personal": "Personol", "navigation_bar.keyboard_shortcuts": "Bysellau brys",
"navigation_bar.pins": "Tŵtiau wedi eu pinio", "navigation_bar.lists": "Rhestrau",
"navigation_bar.preferences": "Dewisiadau", "navigation_bar.logout": "Allgofnodi",
"navigation_bar.public_timeline": "", "navigation_bar.mutes": "Defnyddwyr a dawelwyd",
"navigation_bar.security": "Diogelwch", "navigation_bar.personal": "Personol",
"notification.favourite": "hoffodd {name} eich statws", "navigation_bar.pins": "Tŵtiau wedi eu pinio",
"notification.follow": "dilynodd {name} chi", "navigation_bar.preferences": "Dewisiadau",
"notification.mention": "Soniodd {name} amdanoch chi", "navigation_bar.public_timeline": "Ffrwd y fferasiwn",
"notification.reblog": "", "navigation_bar.security": "Diogelwch",
"notifications.clear": "Clirio hysbysiadau", "notification.favourite": "hoffodd {name} eich statws",
"notifications.clear_confirmation": "", "notification.follow": "dilynodd {name} chi",
"notifications.column_settings.alert": "", "notification.mention": "Soniodd {name} amdanoch chi",
"notifications.column_settings.favourite": "Ffefrynnau:", "notification.reblog": "{name} boosted your status",
"notifications.column_settings.follow": "Dilynwyr newydd:", "notifications.clear": "Clirio hysbysiadau",
"notifications.column_settings.mention": "", "notifications.clear_confirmation": "Ydych chi'n sicr eich bod am glirio'ch holl hysbysiadau am byth?",
"notifications.column_settings.push": "Hysbysiadau push", "notifications.column_settings.alert": "Hysbysiadau bwrdd gwaith",
"notifications.column_settings.reblog": "", "notifications.column_settings.favourite": "Ffefrynnau:",
"notifications.column_settings.show": "", "notifications.column_settings.follow": "Dilynwyr newydd:",
"notifications.column_settings.sound": "Chwarae sain", "notifications.column_settings.mention": "Crybwylliadau:",
"notifications.group": "{count} o hysbysiadau", "notifications.column_settings.push": "Hysbysiadau push",
"onboarding.done": "Wedi'i wneud", "notifications.column_settings.reblog": "Boosts:",
"onboarding.next": "Nesaf", "notifications.column_settings.show": "Dangos yn y golofn",
"onboarding.page_five.public_timelines": "", "notifications.column_settings.sound": "Chwarae sain",
"onboarding.page_four.home": "Mae'r ffrwd gartref yn dangos twtiau o bobl yr ydych yn dilyn.", "notifications.group": "{count} o hysbysiadau",
"onboarding.page_four.notifications": "", "onboarding.done": "Wedi'i wneud",
"onboarding.page_one.federation": "", "onboarding.next": "Nesaf",
"onboarding.page_one.full_handle": "", "onboarding.page_five.public_timelines": "Mae'r ffrwd lleol yn dangos tŵtiau cyhoeddus o bawb ar y {domain}. Mae ffrwd y ffederasiwn yn dangos tŵtiau cyhoeddus o bawb y mae pobl ar y {domain} yn dilyn. Mae rhain yn Ffrydiau Cyhoeddus, ffordd wych o ddarganfod pobl newydd.",
"onboarding.page_one.handle_hint": "", "onboarding.page_four.home": "Mae'r ffrwd gartref yn dangos twtiau o bobl yr ydych yn dilyn.",
"onboarding.page_one.welcome": "Croeso i Mastodon!", "onboarding.page_four.notifications": "Mae'r golofn hysbysiadau yn dangos pan mae rhywun yn ymwneud a chi.",
"onboarding.page_six.admin": "", "onboarding.page_one.federation": "Mae mastodon yn rwydwaith o weinyddwyr anibynnol sy'n uno i greu un rhwydwaith gymdeithasol mwy. Yr ydym yn galw'r gweinyddwyr yma yn achosion.",
"onboarding.page_six.almost_done": "Bron a gorffen...", "onboarding.page_one.full_handle": "Your full handle",
"onboarding.page_six.appetoot": "Bon Apetŵt!", "onboarding.page_one.handle_hint": "Dyma beth y bysech chi'n dweud wrth eich ffrindiau i chwilota amdano.",
"onboarding.page_six.apps_available": "Mae yna {apps} ar gael i iOS, Android a platfformau eraill.", "onboarding.page_one.welcome": "Croeso i Mastodon!",
"onboarding.page_six.github": "Mae Mastodon yn feddalwedd côd agored rhad ac am ddim. Mae modd adrodd bygiau, gwneud ceisiadau am nodweddion penodol, neu gyfrannu i'r côd ar {github}.", "onboarding.page_six.admin": "Your instance's admin is {admin}.",
"onboarding.page_six.guidelines": "canllawiau cymunedol", "onboarding.page_six.almost_done": "Bron a gorffen...",
"onboarding.page_six.read_guidelines": "Darllenwch {guidelines} y {domain} os gwelwch yn dda!", "onboarding.page_six.appetoot": "Bon Apetŵt!",
"onboarding.page_six.various_app": "apiau symudol", "onboarding.page_six.apps_available": "Mae yna {apps} ar gael i iOS, Android a platfformau eraill.",
"onboarding.page_three.profile": "", "onboarding.page_six.github": "Mae Mastodon yn feddalwedd côd agored rhad ac am ddim. Mae modd adrodd bygiau, gwneud ceisiadau am nodweddion penodol, neu gyfrannu i'r côd ar {github}.",
"onboarding.page_three.search": "", "onboarding.page_six.guidelines": "canllawiau cymunedol",
"onboarding.page_two.compose": "", "onboarding.page_six.read_guidelines": "Darllenwch {guidelines} y {domain} os gwelwch yn dda!",
"onboarding.skip": "Sgipiwch", "onboarding.page_six.various_app": "apiau symudol",
"privacy.change": "", "onboarding.page_three.profile": "Golygwch eich proffil i newid eich afatar, bywgraffiad, ac enw arddangos. Yno fe fyddwch hefyd yn canfod gosodiadau eraill.",
"privacy.direct.long": "", "onboarding.page_three.search": "Defnyddiwch y bar chwilio i ganfod pobl ac i edrych ar eu hashnodau, megis {illustration} ac {introductions}. I chwilio am rhywun nad ydynt ar yr achos hwn, defnyddiwch eu HANDLE llawn.",
"privacy.direct.short": "Uniongyrchol", "onboarding.page_two.compose": "Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.",
"privacy.private.long": "Cyhoeddi i ddilynwyr yn unig", "onboarding.skip": "Sgipiwch",
"privacy.private.short": "Dilynwyr-yn-unig", "privacy.change": "Addasu preifatrwdd y statws",
"privacy.public.long": "Cyhoeddi i ffrydiau cyhoeddus", "privacy.direct.long": "Cyhoeddi i'r defnyddwyr sy'n cael eu crybwyll yn unig",
"privacy.public.short": "Cyhoeddus", "privacy.direct.short": "Uniongyrchol",
"privacy.unlisted.long": "Peidio a cyhoeddi i ffrydiau cyhoeddus", "privacy.private.long": "Cyhoeddi i ddilynwyr yn unig",
"privacy.unlisted.short": "Heb ei restru", "privacy.private.short": "Dilynwyr-yn-unig",
"regeneration_indicator.label": "Llwytho…", "privacy.public.long": "Cyhoeddi i ffrydiau cyhoeddus",
"regeneration_indicator.sublabel": "Mae eich ffrwd cartref yn cael ei baratoi!", "privacy.public.short": "Cyhoeddus",
"relative_time.days": "{number}d", "privacy.unlisted.long": "Peidio a cyhoeddi i ffrydiau cyhoeddus",
"relative_time.hours": "{number}h", "privacy.unlisted.short": "Heb ei restru",
"relative_time.just_now": "nawr", "regeneration_indicator.label": "Llwytho…",
"relative_time.minutes": "{number}m", "regeneration_indicator.sublabel": "Mae eich ffrwd cartref yn cael ei baratoi!",
"relative_time.seconds": "{number}s", "relative_time.days": "{number}d",
"reply_indicator.cancel": "Canslo", "relative_time.hours": "{number}h",
"report.forward": "", "relative_time.just_now": "nawr",
"report.forward_hint": "", "relative_time.minutes": "{number}m",
"report.hint": "", "relative_time.seconds": "{number}s",
"report.placeholder": "Sylwadau ychwanegol", "reply_indicator.cancel": "Canslo",
"report.submit": "Cyflwyno", "report.forward": "Forward to {target}",
"report.target": "", "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
"search.placeholder": "Chwilio", "report.hint": "Bydd yr adroddiad yn cael ei anfon i arolygydd eich achos. Mae modd darparu esboniad o pam yr ydych yn cwyno am y cyfrif hwn isod:",
"search_popout.search_format": "Fformat chwilio uwch", "report.placeholder": "Sylwadau ychwanegol",
"search_popout.tips.full_text": "", "report.submit": "Cyflwyno",
"search_popout.tips.hashtag": "hashnod", "report.target": "Cwyno am {target}",
"search_popout.tips.status": "statws", "search.placeholder": "Chwilio",
"search_popout.tips.text": "", "search_popout.search_format": "Fformat chwilio uwch",
"search_popout.tips.user": "defnyddiwr", "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
"search_results.accounts": "Pobl", "search_popout.tips.hashtag": "hashnod",
"search_results.hashtags": "Hanshnodau", "search_popout.tips.status": "statws",
"search_results.statuses": "Twtiau", "search_popout.tips.text": "Mae testun syml yn dychwelyd enwau arddangos, enwau defnyddwyr a hashnodau sy'n cyfateb",
"search_results.total": "", "search_popout.tips.user": "defnyddiwr",
"standalone.public_title": "Golwg tu fewn...", "search_results.accounts": "Pobl",
"status.block": "Blociwch @{name}", "search_results.hashtags": "Hanshnodau",
"status.cancel_reblog_private": "", "search_results.statuses": "Twtiau",
"status.cannot_reblog": "", "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
"status.delete": "Dileu", "standalone.public_title": "Golwg tu fewn...",
"status.detailed_status": "", "status.block": "Blociwch @{name}",
"status.direct": "Neges breifat @{name}", "status.cancel_reblog_private": "Unboost",
"status.embed": "Plannu", "status.cannot_reblog": "Ni ellir sbarduno'r tŵt hwn",
"status.favourite": "", "status.delete": "Dileu",
"status.filtered": "", "status.detailed_status": "Golwg manwl o'r sgwrs",
"status.load_more": "Llwythwch mwy", "status.direct": "Neges breifat @{name}",
"status.media_hidden": "", "status.embed": "Plannu",
"status.mention": "", "status.favourite": "Favourite",
"status.more": "Mwy", "status.filtered": "Filtered",
"status.mute": "Tawelu @{name}", "status.load_more": "Llwythwch mwy",
"status.mute_conversation": "", "status.media_hidden": "Media hidden",
"status.open": "", "status.mention": "Mention @{name}",
"status.pin": "", "status.more": "Mwy",
"status.pinned": "", "status.mute": "Tawelu @{name}",
"status.reblog": "", "status.mute_conversation": "Mute conversation",
"status.reblog_private": "", "status.open": "Expand this status",
"status.reblogged_by": "", "status.pin": "Pin on profile",
"status.reblogs.empty": "", "status.pinned": "Pinned toot",
"status.redraft": "Dilëwh & ailddrafftio", "status.read_more": "Read more",
"status.reply": "Ateb", "status.reblog": "Boost",
"status.replyAll": "Ateb i edefyn", "status.reblog_private": "Boost to original audience",
"status.report": "", "status.reblogged_by": "{name} boosted",
"status.sensitive_toggle": "", "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
"status.sensitive_warning": "Cynnwys sensitif", "status.redraft": "Dilëwh & ailddrafftio",
"status.share": "Rhannwch", "status.reply": "Ateb",
"status.show_less": "Dangoswch lai", "status.replyAll": "Ateb i edefyn",
"status.show_less_all": "Dangoswch lai i bawb", "status.report": "Report @{name}",
"status.show_more": "Dangoswch fwy", "status.sensitive_toggle": "Click to view",
"status.show_more_all": "", "status.sensitive_warning": "Cynnwys sensitif",
"status.unmute_conversation": "Dad-dawelu sgwrs", "status.share": "Rhannwch",
"status.unpin": "", "status.show_less": "Dangoswch lai",
"tabs_bar.federated_timeline": "", "status.show_less_all": "Dangoswch lai i bawb",
"tabs_bar.home": "Hafan", "status.show_more": "Dangoswch fwy",
"tabs_bar.local_timeline": "Lleol", "status.show_more_all": "Show more for all",
"tabs_bar.notifications": "Hysbysiadau", "status.unmute_conversation": "Dad-dawelu sgwrs",
"tabs_bar.search": "Chwilio", "status.unpin": "Unpin from profile",
"trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} yn siarad", "tabs_bar.federated_timeline": "Federated",
"ui.beforeunload": "Mi fyddwch yn colli eich drafft os gadewch Mastodon.", "tabs_bar.home": "Hafan",
"upload_area.title": "Llusgwch & gollwing i uwchlwytho", "tabs_bar.local_timeline": "Lleol",
"upload_button.label": "Ychwanegwch gyfryngau (JPEG, PNG, GIF, WebM, MP4, MOV)", "tabs_bar.notifications": "Hysbysiadau",
"upload_form.description": "", "tabs_bar.search": "Chwilio",
"upload_form.focus": "", "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} yn siarad",
"upload_form.undo": "Dileu", "ui.beforeunload": "Mi fyddwch yn colli eich drafft os gadewch Mastodon.",
"upload_progress.label": "Uwchlwytho...", "upload_area.title": "Llusgwch & gollwing i uwchlwytho",
"video.close": "Cau fideo", "upload_button.label": "Ychwanegwch gyfryngau (JPEG, PNG, GIF, WebM, MP4, MOV)",
"video.exit_fullscreen": "Gadael sgrîn llawn", "upload_form.description": "Describe for the visually impaired",
"video.expand": "Ymestyn fideo", "upload_form.focus": "Crop",
"video.fullscreen": "Sgrîn llawn", "upload_form.undo": "Dileu",
"video.hide": "Cuddio fideo", "upload_progress.label": "Uwchlwytho...",
"video.mute": "Tawelu sain", "video.close": "Cau fideo",
"video.pause": "Oedi", "video.exit_fullscreen": "Gadael sgrîn llawn",
"video.play": "Chwarae", "video.expand": "Ymestyn fideo",
"video.unmute": "Dad-dawelu sain" "video.fullscreen": "Sgrîn llawn",
"video.hide": "Cuddio fideo",
"video.mute": "Tawelu sain",
"video.pause": "Oedi",
"video.play": "Chwarae",
"video.unmute": "Dad-dawelu sain"
} }

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "Er du sikker på, du vil dæmpe {name}?", "confirmations.mute.message": "Er du sikker på, du vil dæmpe {name}?",
"confirmations.redraft.confirm": "Slet & omskriv", "confirmations.redraft.confirm": "Slet & omskriv",
"confirmations.redraft.message": "Er du sikker på, du vil slette denne status og omskrive den? Favoritter og fremhævelser vil gå tabt og svar til det oprindelige opslag vil blive forældreløse.", "confirmations.redraft.message": "Er du sikker på, du vil slette denne status og omskrive den? Favoritter og fremhævelser vil gå tabt og svar til det oprindelige opslag vil blive forældreløse.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Følg ikke længere", "confirmations.unfollow.confirm": "Følg ikke længere",
"confirmations.unfollow.message": "Er du sikker på, du ikke længere vil følge {name}?", "confirmations.unfollow.message": "Er du sikker på, du ikke længere vil følge {name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "Indlejre denne status på din side ved at kopiere nedenstående kode.", "embed.instructions": "Indlejre denne status på din side ved at kopiere nedenstående kode.",
"embed.preview": "Det kommer til at se således ud:", "embed.preview": "Det kommer til at se således ud:",
"emoji_button.activity": "Aktivitet", "emoji_button.activity": "Aktivitet",
@ -294,6 +297,7 @@
"status.open": "Udvid denne status", "status.open": "Udvid denne status",
"status.pin": "Fastgør til profil", "status.pin": "Fastgør til profil",
"status.pinned": "Fastgjort trut", "status.pinned": "Fastgjort trut",
"status.read_more": "Read more",
"status.reblog": "Fremhæv", "status.reblog": "Fremhæv",
"status.reblog_private": "Fremhæv til oprindeligt publikum", "status.reblog_private": "Fremhæv til oprindeligt publikum",
"status.reblogged_by": "{name} fremhævede", "status.reblogged_by": "{name} fremhævede",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "Bist du dir sicher, dass du {name} stummschalten möchtest?", "confirmations.mute.message": "Bist du dir sicher, dass du {name} stummschalten möchtest?",
"confirmations.redraft.confirm": "Löschen und neu erstellen", "confirmations.redraft.confirm": "Löschen und neu erstellen",
"confirmations.redraft.message": "Bist du dir sicher, dass du diesen Status löschen und neu machen möchtest? Favoriten und Boosts werden verloren gehen und Antworten zu diesem Post werden verwaist sein.", "confirmations.redraft.message": "Bist du dir sicher, dass du diesen Status löschen und neu machen möchtest? Favoriten und Boosts werden verloren gehen und Antworten zu diesem Post werden verwaist sein.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Entfolgen", "confirmations.unfollow.confirm": "Entfolgen",
"confirmations.unfollow.message": "Bist du dir sicher, dass du {name} entfolgen möchtest?", "confirmations.unfollow.message": "Bist du dir sicher, dass du {name} entfolgen möchtest?",
"conversation.last_message": "Last message:",
"embed.instructions": "Du kannst diesen Beitrag auf deiner Webseite einbetten, indem du den folgenden Code einfügst.", "embed.instructions": "Du kannst diesen Beitrag auf deiner Webseite einbetten, indem du den folgenden Code einfügst.",
"embed.preview": "So wird es aussehen:", "embed.preview": "So wird es aussehen:",
"emoji_button.activity": "Aktivitäten", "emoji_button.activity": "Aktivitäten",
@ -294,6 +297,7 @@
"status.open": "Diesen Beitrag öffnen", "status.open": "Diesen Beitrag öffnen",
"status.pin": "Im Profil anheften", "status.pin": "Im Profil anheften",
"status.pinned": "Angehefteter Beitrag", "status.pinned": "Angehefteter Beitrag",
"status.read_more": "Read more",
"status.reblog": "Teilen", "status.reblog": "Teilen",
"status.reblog_private": "An das eigentliche Publikum teilen", "status.reblog_private": "An das eigentliche Publikum teilen",
"status.reblogged_by": "{name} teilte", "status.reblogged_by": "{name} teilte",

View File

@ -1047,6 +1047,15 @@
], ],
"path": "app/javascript/mastodon/features/compose/index.json" "path": "app/javascript/mastodon/features/compose/index.json"
}, },
{
"descriptors": [
{
"defaultMessage": "Last message:",
"id": "conversation.last_message"
}
],
"path": "app/javascript/mastodon/features/direct_timeline/components/conversation.json"
},
{ {
"descriptors": [ "descriptors": [
{ {

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "Σίγουρα θες να αποσιωπήσεις τον/την {name};", "confirmations.mute.message": "Σίγουρα θες να αποσιωπήσεις τον/την {name};",
"confirmations.redraft.confirm": "Διαγραφή & ξαναγράψιμο", "confirmations.redraft.confirm": "Διαγραφή & ξαναγράψιμο",
"confirmations.redraft.message": "Σίγουρα θέλεις να σβήσεις αυτή την κατάσταση και να την ξαναγράψεις; Οι αναφορές και τα αγαπημένα της θα χαθούν ενώ οι απαντήσεις προς αυτή θα μείνουν ορφανές.", "confirmations.redraft.message": "Σίγουρα θέλεις να σβήσεις αυτή την κατάσταση και να την ξαναγράψεις; Οι αναφορές και τα αγαπημένα της θα χαθούν ενώ οι απαντήσεις προς αυτή θα μείνουν ορφανές.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Διακοπή παρακολούθησης", "confirmations.unfollow.confirm": "Διακοπή παρακολούθησης",
"confirmations.unfollow.message": "Σίγουρα θες να πάψεις να ακολουθείς τον/την {name};", "confirmations.unfollow.message": "Σίγουρα θες να πάψεις να ακολουθείς τον/την {name};",
"conversation.last_message": "Last message:",
"embed.instructions": "Ενσωματώστε αυτή την κατάσταση στην ιστοσελίδα σας αντιγράφοντας τον παρακάτω κώδικα.", "embed.instructions": "Ενσωματώστε αυτή την κατάσταση στην ιστοσελίδα σας αντιγράφοντας τον παρακάτω κώδικα.",
"embed.preview": "Ορίστε πως θα φαίνεται:", "embed.preview": "Ορίστε πως θα φαίνεται:",
"emoji_button.activity": "Δραστηριότητα", "emoji_button.activity": "Δραστηριότητα",
@ -274,7 +277,7 @@
"search_results.accounts": "Άνθρωποι", "search_results.accounts": "Άνθρωποι",
"search_results.hashtags": "Ταμπέλες", "search_results.hashtags": "Ταμπέλες",
"search_results.statuses": "Τουτ", "search_results.statuses": "Τουτ",
"search_results.total": "{count, number} {count, plural, one {result} other {results}}", "search_results.total": "{count, number} {count, plural, ένα {result} υπόλοιπα {results}}",
"standalone.public_title": "Μια πρώτη γεύση...", "standalone.public_title": "Μια πρώτη γεύση...",
"status.block": "Block @{name}", "status.block": "Block @{name}",
"status.cancel_reblog_private": "Ακύρωσε την προώθηση", "status.cancel_reblog_private": "Ακύρωσε την προώθηση",
@ -294,6 +297,7 @@
"status.open": "Διεύρυνε αυτή την κατάσταση", "status.open": "Διεύρυνε αυτή την κατάσταση",
"status.pin": "Καρφίτσωσε στο προφίλ", "status.pin": "Καρφίτσωσε στο προφίλ",
"status.pinned": "Καρφιτσωμένο τουτ", "status.pinned": "Καρφιτσωμένο τουτ",
"status.read_more": "Read more",
"status.reblog": "Προώθησε", "status.reblog": "Προώθησε",
"status.reblog_private": "Προώθησε στους αρχικούς παραλήπτες", "status.reblog_private": "Προώθησε στους αρχικούς παραλήπτες",
"status.reblogged_by": "{name} προώθησε", "status.reblogged_by": "{name} προώθησε",

View File

@ -99,6 +99,7 @@
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.confirm": "Unfollow",
"confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "Embed this status on your website by copying the code below.", "embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:", "embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Activity", "emoji_button.activity": "Activity",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "Ĉu vi certas, ke vi volas silentigi {name}?", "confirmations.mute.message": "Ĉu vi certas, ke vi volas silentigi {name}?",
"confirmations.redraft.confirm": "Forigi kaj reskribi", "confirmations.redraft.confirm": "Forigi kaj reskribi",
"confirmations.redraft.message": "Ĉu vi certas, ke vi volas forigi tiun mesaĝon kaj reskribi ĝin? Vi perdos ĉiujn respondojn, diskonigojn kaj stelumojn ligitajn al ĝi.", "confirmations.redraft.message": "Ĉu vi certas, ke vi volas forigi tiun mesaĝon kaj reskribi ĝin? Vi perdos ĉiujn respondojn, diskonigojn kaj stelumojn ligitajn al ĝi.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Ne plu sekvi", "confirmations.unfollow.confirm": "Ne plu sekvi",
"confirmations.unfollow.message": "Ĉu vi certas, ke vi volas ĉesi sekvi {name}?", "confirmations.unfollow.message": "Ĉu vi certas, ke vi volas ĉesi sekvi {name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "Enkorpigu ĉi tiun mesaĝon en vian retejon per kopio de la suba kodo.", "embed.instructions": "Enkorpigu ĉi tiun mesaĝon en vian retejon per kopio de la suba kodo.",
"embed.preview": "Ĝi aperos tiel:", "embed.preview": "Ĝi aperos tiel:",
"emoji_button.activity": "Agadoj", "emoji_button.activity": "Agadoj",
@ -294,6 +297,7 @@
"status.open": "Grandigi", "status.open": "Grandigi",
"status.pin": "Alpingli profile", "status.pin": "Alpingli profile",
"status.pinned": "Alpinglita mesaĝo", "status.pinned": "Alpinglita mesaĝo",
"status.read_more": "Read more",
"status.reblog": "Diskonigi", "status.reblog": "Diskonigi",
"status.reblog_private": "Diskonigi al la originala atentaro", "status.reblog_private": "Diskonigi al la originala atentaro",
"status.reblogged_by": "{name} diskonigis", "status.reblogged_by": "{name} diskonigis",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "¿Estás seguro de que quieres silenciar a {name}?", "confirmations.mute.message": "¿Estás seguro de que quieres silenciar a {name}?",
"confirmations.redraft.confirm": "Borrar y volver a borrador", "confirmations.redraft.confirm": "Borrar y volver a borrador",
"confirmations.redraft.message": "Estás seguro de que quieres borrar este estado y volverlo a borrador? Perderás todas las respuestas, impulsos y favoritos asociados a él, y las respuestas a la publicación original quedarán huérfanos.", "confirmations.redraft.message": "Estás seguro de que quieres borrar este estado y volverlo a borrador? Perderás todas las respuestas, impulsos y favoritos asociados a él, y las respuestas a la publicación original quedarán huérfanos.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Dejar de seguir", "confirmations.unfollow.confirm": "Dejar de seguir",
"confirmations.unfollow.message": "¿Estás seguro de que quieres dejar de seguir a {name}?", "confirmations.unfollow.message": "¿Estás seguro de que quieres dejar de seguir a {name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "Añade este toot a tu sitio web con el siguiente código.", "embed.instructions": "Añade este toot a tu sitio web con el siguiente código.",
"embed.preview": "Así es como se verá:", "embed.preview": "Así es como se verá:",
"emoji_button.activity": "Actividad", "emoji_button.activity": "Actividad",
@ -294,6 +297,7 @@
"status.open": "Expandir estado", "status.open": "Expandir estado",
"status.pin": "Fijar", "status.pin": "Fijar",
"status.pinned": "Toot fijado", "status.pinned": "Toot fijado",
"status.read_more": "Read more",
"status.reblog": "Retootear", "status.reblog": "Retootear",
"status.reblog_private": "Implusar a la audiencia original", "status.reblog_private": "Implusar a la audiencia original",
"status.reblogged_by": "Retooteado por {name}", "status.reblogged_by": "Retooteado por {name}",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "Ziur {name} mututu nahi duzula?", "confirmations.mute.message": "Ziur {name} mututu nahi duzula?",
"confirmations.redraft.confirm": "Ezabatu eta berridatzi", "confirmations.redraft.confirm": "Ezabatu eta berridatzi",
"confirmations.redraft.message": "Ziur mezu hau ezabatu eta berridatzi nahi duzula? Gogokoak eta bultzadak galduko dira eta jaso dituen erantzunak umezurtz geratuko dira.", "confirmations.redraft.message": "Ziur mezu hau ezabatu eta berridatzi nahi duzula? Gogokoak eta bultzadak galduko dira eta jaso dituen erantzunak umezurtz geratuko dira.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Utzi jarraitzeari", "confirmations.unfollow.confirm": "Utzi jarraitzeari",
"confirmations.unfollow.message": "Ziur {name} jarraitzeari utzi nahi diozula?", "confirmations.unfollow.message": "Ziur {name} jarraitzeari utzi nahi diozula?",
"conversation.last_message": "Last message:",
"embed.instructions": "Txertatu mezu hau zure webgunean beheko kodea kopatuz.", "embed.instructions": "Txertatu mezu hau zure webgunean beheko kodea kopatuz.",
"embed.preview": "Hau da izango duen itxura:", "embed.preview": "Hau da izango duen itxura:",
"emoji_button.activity": "Jarduera", "emoji_button.activity": "Jarduera",
@ -294,6 +297,7 @@
"status.open": "Hedatu mezu hau", "status.open": "Hedatu mezu hau",
"status.pin": "Finkatu profilean", "status.pin": "Finkatu profilean",
"status.pinned": "Finkatutako toot-a", "status.pinned": "Finkatutako toot-a",
"status.read_more": "Read more",
"status.reblog": "Bultzada", "status.reblog": "Bultzada",
"status.reblog_private": "Bultzada jatorrizko hartzaileei", "status.reblog_private": "Bultzada jatorrizko hartzaileei",
"status.reblogged_by": "{name}(r)en bultzada", "status.reblogged_by": "{name}(r)en bultzada",

View File

@ -15,7 +15,7 @@
"account.follows.empty": "این کاربر هنوز هیچ کسی را پی نمی‌گیرد.", "account.follows.empty": "این کاربر هنوز هیچ کسی را پی نمی‌گیرد.",
"account.follows_you": "پیگیر شماست", "account.follows_you": "پیگیر شماست",
"account.hide_reblogs": "پنهان کردن بازبوق‌های @{name}", "account.hide_reblogs": "پنهان کردن بازبوق‌های @{name}",
"account.link_verified_on": "Ownership of this link was checked on {date}", "account.link_verified_on": "مالکیت این نشانی در تایخ {date} بررسی شد",
"account.media": "عکس و ویدیو", "account.media": "عکس و ویدیو",
"account.mention": "نام‌بردن از @{name}", "account.mention": "نام‌بردن از @{name}",
"account.moved_to": "{name} منتقل شده است به:", "account.moved_to": "{name} منتقل شده است به:",
@ -91,8 +91,11 @@
"confirmations.mute.message": "آیا واقعاً می‌خواهید {name} را بی‌صدا کنید؟", "confirmations.mute.message": "آیا واقعاً می‌خواهید {name} را بی‌صدا کنید؟",
"confirmations.redraft.confirm": "پاک‌کردن و بازنویسی", "confirmations.redraft.confirm": "پاک‌کردن و بازنویسی",
"confirmations.redraft.message": "آیا واقعاً می‌خواهید این نوشته را پاک کنید و آن را از نو بنویسید؟ با این کار بازبوق‌ها و پسندیده‌شدن‌های آن از دست می‌رود و پاسخ‌ها به آن بی‌مرجع می‌شود.", "confirmations.redraft.message": "آیا واقعاً می‌خواهید این نوشته را پاک کنید و آن را از نو بنویسید؟ با این کار بازبوق‌ها و پسندیده‌شدن‌های آن از دست می‌رود و پاسخ‌ها به آن بی‌مرجع می‌شود.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "لغو پیگیری", "confirmations.unfollow.confirm": "لغو پیگیری",
"confirmations.unfollow.message": "آیا واقعاً می‌خواهید به پیگیری از {name} پایان دهید؟", "confirmations.unfollow.message": "آیا واقعاً می‌خواهید به پیگیری از {name} پایان دهید؟",
"conversation.last_message": "Last message:",
"embed.instructions": "برای جاگذاری این نوشته در سایت خودتان، کد زیر را کپی کنید.", "embed.instructions": "برای جاگذاری این نوشته در سایت خودتان، کد زیر را کپی کنید.",
"embed.preview": "نوشتهٔ جاگذاری‌شده این گونه به نظر خواهد رسید:", "embed.preview": "نوشتهٔ جاگذاری‌شده این گونه به نظر خواهد رسید:",
"emoji_button.activity": "فعالیت", "emoji_button.activity": "فعالیت",
@ -294,6 +297,7 @@
"status.open": "این نوشته را باز کن", "status.open": "این نوشته را باز کن",
"status.pin": "نوشتهٔ ثابت نمایه", "status.pin": "نوشتهٔ ثابت نمایه",
"status.pinned": "بوق ثابت", "status.pinned": "بوق ثابت",
"status.read_more": "Read more",
"status.reblog": "بازبوقیدن", "status.reblog": "بازبوقیدن",
"status.reblog_private": "بازبوق به مخاطبان اولیه", "status.reblog_private": "بازبوق به مخاطبان اولیه",
"status.reblogged_by": "{name} بازبوقید", "status.reblogged_by": "{name} بازبوقید",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "Haluatko varmasti mykistää käyttäjän {name}?", "confirmations.mute.message": "Haluatko varmasti mykistää käyttäjän {name}?",
"confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.confirm": "Delete & redraft",
"confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Lakkaa seuraamasta", "confirmations.unfollow.confirm": "Lakkaa seuraamasta",
"confirmations.unfollow.message": "Haluatko varmasti lakata seuraamasta käyttäjää {name}?", "confirmations.unfollow.message": "Haluatko varmasti lakata seuraamasta käyttäjää {name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "Upota statuspäivitys sivullesi kopioimalla alla oleva koodi.", "embed.instructions": "Upota statuspäivitys sivullesi kopioimalla alla oleva koodi.",
"embed.preview": "Se tulee näyttämään tältä:", "embed.preview": "Se tulee näyttämään tältä:",
"emoji_button.activity": "Aktiviteetit", "emoji_button.activity": "Aktiviteetit",
@ -294,6 +297,7 @@
"status.open": "Laajenna tilapäivitys", "status.open": "Laajenna tilapäivitys",
"status.pin": "Kiinnitä profiiliin", "status.pin": "Kiinnitä profiiliin",
"status.pinned": "Kiinnitetty tuuttaus", "status.pinned": "Kiinnitetty tuuttaus",
"status.read_more": "Read more",
"status.reblog": "Buustaa", "status.reblog": "Buustaa",
"status.reblog_private": "Buustaa alkuperäiselle yleisölle", "status.reblog_private": "Buustaa alkuperäiselle yleisölle",
"status.reblogged_by": "{name} buustasi", "status.reblogged_by": "{name} buustasi",

View File

@ -15,7 +15,7 @@
"account.follows.empty": "Cet utilisateur ne suit personne pour l'instant.", "account.follows.empty": "Cet utilisateur ne suit personne pour l'instant.",
"account.follows_you": "Vous suit", "account.follows_you": "Vous suit",
"account.hide_reblogs": "Masquer les partages de @{name}", "account.hide_reblogs": "Masquer les partages de @{name}",
"account.link_verified_on": "Ownership of this link was checked on {date}", "account.link_verified_on": "La propriété de ce lien a été vérifiée le {date}",
"account.media": "Média", "account.media": "Média",
"account.mention": "Mentionner", "account.mention": "Mentionner",
"account.moved_to": "{name} a déménagé vers:", "account.moved_to": "{name} a déménagé vers:",
@ -91,8 +91,11 @@
"confirmations.mute.message": "Confirmez-vous le masquage de {name}?", "confirmations.mute.message": "Confirmez-vous le masquage de {name}?",
"confirmations.redraft.confirm": "Effacer et ré-écrire", "confirmations.redraft.confirm": "Effacer et ré-écrire",
"confirmations.redraft.message": "Êtes-vous sûr·e de vouloir effacer ce statut pour le ré-écrire? Ses partages ainsi que ses mises en favori seront perdu·e·s et ses réponses seront orphelines.", "confirmations.redraft.message": "Êtes-vous sûr·e de vouloir effacer ce statut pour le ré-écrire? Ses partages ainsi que ses mises en favori seront perdu·e·s et ses réponses seront orphelines.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Ne plus suivre", "confirmations.unfollow.confirm": "Ne plus suivre",
"confirmations.unfollow.message": "Voulez-vous arrêter de suivre {name}?", "confirmations.unfollow.message": "Voulez-vous arrêter de suivre {name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "Intégrez ce statut à votre site en copiant le code ci-dessous.", "embed.instructions": "Intégrez ce statut à votre site en copiant le code ci-dessous.",
"embed.preview": "Il apparaîtra comme cela:", "embed.preview": "Il apparaîtra comme cela:",
"emoji_button.activity": "Activités", "emoji_button.activity": "Activités",
@ -294,6 +297,7 @@
"status.open": "Déplier ce statut", "status.open": "Déplier ce statut",
"status.pin": "Épingler sur le profil", "status.pin": "Épingler sur le profil",
"status.pinned": "Pouet épinglé", "status.pinned": "Pouet épinglé",
"status.read_more": "Read more",
"status.reblog": "Partager", "status.reblog": "Partager",
"status.reblog_private": "Booster vers laudience originale", "status.reblog_private": "Booster vers laudience originale",
"status.reblogged_by": "{name} a partagé:", "status.reblogged_by": "{name} a partagé:",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "Está segura de que quere acalar a {name}?", "confirmations.mute.message": "Está segura de que quere acalar a {name}?",
"confirmations.redraft.confirm": "Eliminar e reescribir", "confirmations.redraft.confirm": "Eliminar e reescribir",
"confirmations.redraft.message": "Está segura de querer eliminar este estado e voltalo a escribir? Perderá réplicas e favoritas, e as respostas ao orixinal quedarán orfas.", "confirmations.redraft.message": "Está segura de querer eliminar este estado e voltalo a escribir? Perderá réplicas e favoritas, e as respostas ao orixinal quedarán orfas.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Deixar de seguir", "confirmations.unfollow.confirm": "Deixar de seguir",
"confirmations.unfollow.message": "Quere deixar de seguir a {name}?", "confirmations.unfollow.message": "Quere deixar de seguir a {name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "Copie o código inferior para incrustar no seu sitio web este estado.", "embed.instructions": "Copie o código inferior para incrustar no seu sitio web este estado.",
"embed.preview": "Así será mostrado:", "embed.preview": "Así será mostrado:",
"emoji_button.activity": "Actividade", "emoji_button.activity": "Actividade",
@ -294,6 +297,7 @@
"status.open": "Expandir este estado", "status.open": "Expandir este estado",
"status.pin": "Fixar no perfil", "status.pin": "Fixar no perfil",
"status.pinned": "Toot fixado", "status.pinned": "Toot fixado",
"status.read_more": "Read more",
"status.reblog": "Promover", "status.reblog": "Promover",
"status.reblog_private": "Promover a audiencia orixinal", "status.reblog_private": "Promover a audiencia orixinal",
"status.reblogged_by": "{name} promoveu", "status.reblogged_by": "{name} promoveu",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "להשתיק את {name}?", "confirmations.mute.message": "להשתיק את {name}?",
"confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.confirm": "Delete & redraft",
"confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "להפסיק מעקב", "confirmations.unfollow.confirm": "להפסיק מעקב",
"confirmations.unfollow.message": "להפסיק מעקב אחרי {name}?", "confirmations.unfollow.message": "להפסיק מעקב אחרי {name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "ניתן להטמיע את ההודעה באתרך ע\"י העתקת הקוד שלהלן.", "embed.instructions": "ניתן להטמיע את ההודעה באתרך ע\"י העתקת הקוד שלהלן.",
"embed.preview": "דוגמא כיצד זה יראה:", "embed.preview": "דוגמא כיצד זה יראה:",
"emoji_button.activity": "פעילות", "emoji_button.activity": "פעילות",
@ -294,6 +297,7 @@
"status.open": "הרחבת הודעה", "status.open": "הרחבת הודעה",
"status.pin": "לקבע באודות", "status.pin": "לקבע באודות",
"status.pinned": "Pinned toot", "status.pinned": "Pinned toot",
"status.read_more": "Read more",
"status.reblog": "הדהוד", "status.reblog": "הדהוד",
"status.reblog_private": "Boost to original audience", "status.reblog_private": "Boost to original audience",
"status.reblogged_by": "הודהד על ידי {name}", "status.reblogged_by": "הודהד על ידי {name}",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "Jesi li siguran da želiš utišati {name}?", "confirmations.mute.message": "Jesi li siguran da želiš utišati {name}?",
"confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.confirm": "Delete & redraft",
"confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.confirm": "Unfollow",
"confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "Embed this status on your website by copying the code below.", "embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:", "embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Aktivnost", "emoji_button.activity": "Aktivnost",
@ -294,6 +297,7 @@
"status.open": "Proširi ovaj status", "status.open": "Proširi ovaj status",
"status.pin": "Pin on profile", "status.pin": "Pin on profile",
"status.pinned": "Pinned toot", "status.pinned": "Pinned toot",
"status.read_more": "Read more",
"status.reblog": "Podigni", "status.reblog": "Podigni",
"status.reblog_private": "Boost to original audience", "status.reblog_private": "Boost to original audience",
"status.reblogged_by": "{name} je podigao", "status.reblogged_by": "{name} je podigao",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "Biztos benne, hogy némítani szeretné {name}?", "confirmations.mute.message": "Biztos benne, hogy némítani szeretné {name}?",
"confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.confirm": "Delete & redraft",
"confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Követés visszavonása", "confirmations.unfollow.confirm": "Követés visszavonása",
"confirmations.unfollow.message": "Biztos benne, hogy vissza szeretné vonni {name} követését?", "confirmations.unfollow.message": "Biztos benne, hogy vissza szeretné vonni {name} követését?",
"conversation.last_message": "Last message:",
"embed.instructions": "Ágyazza be ezen státuszt weboldalába az alábbi kód másolásával.", "embed.instructions": "Ágyazza be ezen státuszt weboldalába az alábbi kód másolásával.",
"embed.preview": "Így fog kinézni:", "embed.preview": "Így fog kinézni:",
"emoji_button.activity": "Aktivitás", "emoji_button.activity": "Aktivitás",
@ -294,6 +297,7 @@
"status.open": "Státusz kinagyítása", "status.open": "Státusz kinagyítása",
"status.pin": "Kitűzés a profilra", "status.pin": "Kitűzés a profilra",
"status.pinned": "Pinned toot", "status.pinned": "Pinned toot",
"status.read_more": "Read more",
"status.reblog": "Reblog", "status.reblog": "Reblog",
"status.reblog_private": "Boost to original audience", "status.reblog_private": "Boost to original audience",
"status.reblogged_by": "{name} reblogolta", "status.reblogged_by": "{name} reblogolta",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "Վստա՞հ ես, որ ուզում ես {name}֊ին լռեցնել։", "confirmations.mute.message": "Վստա՞հ ես, որ ուզում ես {name}֊ին լռեցնել։",
"confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.confirm": "Delete & redraft",
"confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Ապահետեւել", "confirmations.unfollow.confirm": "Ապահետեւել",
"confirmations.unfollow.message": "Վստա՞հ ես, որ ուզում ես այլեւս չհետեւել {name}֊ին։", "confirmations.unfollow.message": "Վստա՞հ ես, որ ուզում ես այլեւս չհետեւել {name}֊ին։",
"conversation.last_message": "Last message:",
"embed.instructions": "Այս թութը քո կայքում ներդնելու համար կարող ես պատճենել ներքոհիշյալ կոդը։", "embed.instructions": "Այս թութը քո կայքում ներդնելու համար կարող ես պատճենել ներքոհիշյալ կոդը։",
"embed.preview": "Ահա, թե ինչ տեսք կունենա այն՝", "embed.preview": "Ահա, թե ինչ տեսք կունենա այն՝",
"emoji_button.activity": "Զբաղմունքներ", "emoji_button.activity": "Զբաղմունքներ",
@ -294,6 +297,7 @@
"status.open": "Ընդարձակել այս թութը", "status.open": "Ընդարձակել այս թութը",
"status.pin": "Ամրացնել անձնական էջում", "status.pin": "Ամրացնել անձնական էջում",
"status.pinned": "Pinned toot", "status.pinned": "Pinned toot",
"status.read_more": "Read more",
"status.reblog": "Տարածել", "status.reblog": "Տարածել",
"status.reblog_private": "Boost to original audience", "status.reblog_private": "Boost to original audience",
"status.reblogged_by": "{name} տարածել է", "status.reblogged_by": "{name} տարածել է",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "Apa anda yakin ingin membisukan {name}?", "confirmations.mute.message": "Apa anda yakin ingin membisukan {name}?",
"confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.confirm": "Delete & redraft",
"confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Berhenti mengikuti", "confirmations.unfollow.confirm": "Berhenti mengikuti",
"confirmations.unfollow.message": "Apakah anda ingin berhenti mengikuti {name}?", "confirmations.unfollow.message": "Apakah anda ingin berhenti mengikuti {name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "Sematkan status ini di website anda dengan menyalin kode di bawah ini.", "embed.instructions": "Sematkan status ini di website anda dengan menyalin kode di bawah ini.",
"embed.preview": "Seperti ini nantinya:", "embed.preview": "Seperti ini nantinya:",
"emoji_button.activity": "Aktivitas", "emoji_button.activity": "Aktivitas",
@ -294,6 +297,7 @@
"status.open": "Tampilkan status ini", "status.open": "Tampilkan status ini",
"status.pin": "Pin on profile", "status.pin": "Pin on profile",
"status.pinned": "Pinned toot", "status.pinned": "Pinned toot",
"status.read_more": "Read more",
"status.reblog": "Boost", "status.reblog": "Boost",
"status.reblog_private": "Boost to original audience", "status.reblog_private": "Boost to original audience",
"status.reblogged_by": "di-boost {name}", "status.reblogged_by": "di-boost {name}",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "Are you sure you want to mute {name}?", "confirmations.mute.message": "Are you sure you want to mute {name}?",
"confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.confirm": "Delete & redraft",
"confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.confirm": "Unfollow",
"confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "Embed this status on your website by copying the code below.", "embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:", "embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Activity", "emoji_button.activity": "Activity",
@ -294,6 +297,7 @@
"status.open": "Detaligar ca mesajo", "status.open": "Detaligar ca mesajo",
"status.pin": "Pin on profile", "status.pin": "Pin on profile",
"status.pinned": "Pinned toot", "status.pinned": "Pinned toot",
"status.read_more": "Read more",
"status.reblog": "Repetar", "status.reblog": "Repetar",
"status.reblog_private": "Boost to original audience", "status.reblog_private": "Boost to original audience",
"status.reblogged_by": "{name} repetita", "status.reblogged_by": "{name} repetita",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "Sei sicuro di voler silenziare {name}?", "confirmations.mute.message": "Sei sicuro di voler silenziare {name}?",
"confirmations.redraft.confirm": "Cancella e riscrivi", "confirmations.redraft.confirm": "Cancella e riscrivi",
"confirmations.redraft.message": "Sei sicuro di voler cancellare questo stato e riscriverlo? Perderai tutte le risposte, condivisioni e preferiti.", "confirmations.redraft.message": "Sei sicuro di voler cancellare questo stato e riscriverlo? Perderai tutte le risposte, condivisioni e preferiti.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Smetti di seguire", "confirmations.unfollow.confirm": "Smetti di seguire",
"confirmations.unfollow.message": "Sei sicuro che non vuoi più seguire {name}?", "confirmations.unfollow.message": "Sei sicuro che non vuoi più seguire {name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "Inserisci questo status nel tuo sito copiando il codice qui sotto.", "embed.instructions": "Inserisci questo status nel tuo sito copiando il codice qui sotto.",
"embed.preview": "Ecco come apparirà:", "embed.preview": "Ecco come apparirà:",
"emoji_button.activity": "Attività", "emoji_button.activity": "Attività",
@ -294,6 +297,7 @@
"status.open": "Espandi questo post", "status.open": "Espandi questo post",
"status.pin": "Fissa in cima sul profilo", "status.pin": "Fissa in cima sul profilo",
"status.pinned": "Toot fissato in cima", "status.pinned": "Toot fissato in cima",
"status.read_more": "Read more",
"status.reblog": "Condividi", "status.reblog": "Condividi",
"status.reblog_private": "Condividi con i destinatari iniziali", "status.reblog_private": "Condividi con i destinatari iniziali",
"status.reblogged_by": "{name} ha condiviso", "status.reblogged_by": "{name} ha condiviso",

View File

@ -15,7 +15,7 @@
"account.follows.empty": "まだ誰もフォローしていません。", "account.follows.empty": "まだ誰もフォローしていません。",
"account.follows_you": "フォローされています", "account.follows_you": "フォローされています",
"account.hide_reblogs": "@{name}さんからのブーストを非表示", "account.hide_reblogs": "@{name}さんからのブーストを非表示",
"account.link_verified_on": "Ownership of this link was checked on {date}", "account.link_verified_on": "このリンクの所有権は{date}に確認されました",
"account.media": "メディア", "account.media": "メディア",
"account.mention": "@{name}さんにトゥート", "account.mention": "@{name}さんにトゥート",
"account.moved_to": "{name}さんは引っ越しました:", "account.moved_to": "{name}さんは引っ越しました:",
@ -95,10 +95,11 @@
"confirmations.mute.message": "本当に{name}さんをミュートしますか?", "confirmations.mute.message": "本当に{name}さんをミュートしますか?",
"confirmations.redraft.confirm": "削除して下書きに戻す", "confirmations.redraft.confirm": "削除して下書きに戻す",
"confirmations.redraft.message": "本当にこのトゥートを削除して下書きに戻しますか? このトゥートへのお気に入り登録やブーストは失われ、返信は孤立することになります。", "confirmations.redraft.message": "本当にこのトゥートを削除して下書きに戻しますか? このトゥートへのお気に入り登録やブーストは失われ、返信は孤立することになります。",
"confirmations.reply.confirm": "返信", "confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "今返信すると現在作成中のメッセージが上書きされます。本当に実行しますか?", "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "フォロー解除", "confirmations.unfollow.confirm": "フォロー解除",
"confirmations.unfollow.message": "本当に{name}さんのフォローを解除しますか?", "confirmations.unfollow.message": "本当に{name}さんのフォローを解除しますか?",
"conversation.last_message": "Last message:",
"embed.instructions": "下記のコードをコピーしてウェブサイトに埋め込みます。", "embed.instructions": "下記のコードをコピーしてウェブサイトに埋め込みます。",
"embed.preview": "表示例:", "embed.preview": "表示例:",
"emoji_button.activity": "活動", "emoji_button.activity": "活動",
@ -301,7 +302,7 @@
"status.open": "詳細を表示", "status.open": "詳細を表示",
"status.pin": "プロフィールに固定表示", "status.pin": "プロフィールに固定表示",
"status.pinned": "固定されたトゥート", "status.pinned": "固定されたトゥート",
"status.read_more": "もっと見る", "status.read_more": "Read more",
"status.reblog": "ブースト", "status.reblog": "ブースト",
"status.reblog_private": "ブースト", "status.reblog_private": "ブースト",
"status.reblogged_by": "{name}さんがブースト", "status.reblogged_by": "{name}さんがブースト",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "დარწმუნებული ხართ, გსურთ გააჩუმოთ {name}?", "confirmations.mute.message": "დარწმუნებული ხართ, გსურთ გააჩუმოთ {name}?",
"confirmations.redraft.confirm": "გაუქმება და გადანაწილება", "confirmations.redraft.confirm": "გაუქმება და გადანაწილება",
"confirmations.redraft.message": "დარწმუნებული ხართ, გსურთ გააუქმოთ ეს სტატუსი და გადაანაწილოთ? დაკარგავთ ყველა პასუხს, ბუსტს და მასზედ არსებულ ფავორიტს.", "confirmations.redraft.message": "დარწმუნებული ხართ, გსურთ გააუქმოთ ეს სტატუსი და გადაანაწილოთ? დაკარგავთ ყველა პასუხს, ბუსტს და მასზედ არსებულ ფავორიტს.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "ნუღარ მიჰყვები", "confirmations.unfollow.confirm": "ნუღარ მიჰყვები",
"confirmations.unfollow.message": "დარწმუნებული ხართ, აღარ გსურთ მიჰყვებოდეთ {name}-ს?", "confirmations.unfollow.message": "დარწმუნებული ხართ, აღარ გსურთ მიჰყვებოდეთ {name}-ს?",
"conversation.last_message": "Last message:",
"embed.instructions": "ეს სტატუსი ჩასვით თქვენს ვებ-საიტზე შემდეგი კოდის კოპირებით.", "embed.instructions": "ეს სტატუსი ჩასვით თქვენს ვებ-საიტზე შემდეგი კოდის კოპირებით.",
"embed.preview": "ესაა თუ როგორც გამოჩნდება:", "embed.preview": "ესაა თუ როგორც გამოჩნდება:",
"emoji_button.activity": "აქტივობა", "emoji_button.activity": "აქტივობა",
@ -294,6 +297,7 @@
"status.open": "ამ სტატუსის გაფართოება", "status.open": "ამ სტატუსის გაფართოება",
"status.pin": "აპინე პროფილზე", "status.pin": "აპინე პროფილზე",
"status.pinned": "აპინული ტუტი", "status.pinned": "აპინული ტუტი",
"status.read_more": "Read more",
"status.reblog": "ბუსტი", "status.reblog": "ბუსტი",
"status.reblog_private": "დაიბუსტოს საწყის აუდიტორიაზე", "status.reblog_private": "დაიბუსტოს საწყის აუდიტორიაზე",
"status.reblogged_by": "{name} დაიბუსტა", "status.reblogged_by": "{name} დაიბუსტა",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "정말로 {name}를 뮤트하시겠습니까?", "confirmations.mute.message": "정말로 {name}를 뮤트하시겠습니까?",
"confirmations.redraft.confirm": "삭제하고 다시 쓰기", "confirmations.redraft.confirm": "삭제하고 다시 쓰기",
"confirmations.redraft.message": "정말로 이 포스트를 삭제하고 다시 쓰시겠습니까? 해당 포스트에 대한 부스트와 즐겨찾기를 잃게 되고 원본에 대한 답장은 연결 되지 않습니다.", "confirmations.redraft.message": "정말로 이 포스트를 삭제하고 다시 쓰시겠습니까? 해당 포스트에 대한 부스트와 즐겨찾기를 잃게 되고 원본에 대한 답장은 연결 되지 않습니다.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "언팔로우", "confirmations.unfollow.confirm": "언팔로우",
"confirmations.unfollow.message": "정말로 {name}를 언팔로우하시겠습니까?", "confirmations.unfollow.message": "정말로 {name}를 언팔로우하시겠습니까?",
"conversation.last_message": "Last message:",
"embed.instructions": "아래의 코드를 복사하여 대화를 원하는 곳으로 공유하세요.", "embed.instructions": "아래의 코드를 복사하여 대화를 원하는 곳으로 공유하세요.",
"embed.preview": "다음과 같이 표시됩니다:", "embed.preview": "다음과 같이 표시됩니다:",
"emoji_button.activity": "활동", "emoji_button.activity": "활동",
@ -294,6 +297,7 @@
"status.open": "상세 정보 표시", "status.open": "상세 정보 표시",
"status.pin": "고정", "status.pin": "고정",
"status.pinned": "고정 된 툿", "status.pinned": "고정 된 툿",
"status.read_more": "Read more",
"status.reblog": "부스트", "status.reblog": "부스트",
"status.reblog_private": "원래의 수신자들에게 부스트", "status.reblog_private": "원래의 수신자들에게 부스트",
"status.reblogged_by": "{name}님이 부스트 했습니다", "status.reblogged_by": "{name}님이 부스트 했습니다",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "Weet je het zeker dat je {name} wilt negeren?", "confirmations.mute.message": "Weet je het zeker dat je {name} wilt negeren?",
"confirmations.redraft.confirm": "Verwijderen en herschrijven", "confirmations.redraft.confirm": "Verwijderen en herschrijven",
"confirmations.redraft.message": "Weet je zeker dat je deze toot wilt verwijderen en herschrijven? Je verliest wel de boosts en favorieten, en reacties op de originele toot zitten niet meer aan de nieuwe toot vast.", "confirmations.redraft.message": "Weet je zeker dat je deze toot wilt verwijderen en herschrijven? Je verliest wel de boosts en favorieten, en reacties op de originele toot zitten niet meer aan de nieuwe toot vast.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Ontvolgen", "confirmations.unfollow.confirm": "Ontvolgen",
"confirmations.unfollow.message": "Weet je het zeker dat je {name} wilt ontvolgen?", "confirmations.unfollow.message": "Weet je het zeker dat je {name} wilt ontvolgen?",
"conversation.last_message": "Last message:",
"embed.instructions": "Embed deze toot op jouw website, door de onderstaande code te kopiëren.", "embed.instructions": "Embed deze toot op jouw website, door de onderstaande code te kopiëren.",
"embed.preview": "Zo komt het eruit te zien:", "embed.preview": "Zo komt het eruit te zien:",
"emoji_button.activity": "Activiteiten", "emoji_button.activity": "Activiteiten",
@ -294,6 +297,7 @@
"status.open": "Toot volledig tonen", "status.open": "Toot volledig tonen",
"status.pin": "Aan profielpagina vastmaken", "status.pin": "Aan profielpagina vastmaken",
"status.pinned": "Vastgemaakte toot", "status.pinned": "Vastgemaakte toot",
"status.read_more": "Read more",
"status.reblog": "Boost", "status.reblog": "Boost",
"status.reblog_private": "Boost naar oorspronkelijke ontvangers", "status.reblog_private": "Boost naar oorspronkelijke ontvangers",
"status.reblogged_by": "{name} boostte", "status.reblogged_by": "{name} boostte",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "Er du sikker på at du vil dempe {name}?", "confirmations.mute.message": "Er du sikker på at du vil dempe {name}?",
"confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.confirm": "Delete & redraft",
"confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Slutt å følge", "confirmations.unfollow.confirm": "Slutt å følge",
"confirmations.unfollow.message": "Er du sikker på at du vil slutte å følge {name}?", "confirmations.unfollow.message": "Er du sikker på at du vil slutte å følge {name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "Kopier koden under for å bygge inn denne statusen på hjemmesiden din.", "embed.instructions": "Kopier koden under for å bygge inn denne statusen på hjemmesiden din.",
"embed.preview": "Slik kommer det til å se ut:", "embed.preview": "Slik kommer det til å se ut:",
"emoji_button.activity": "Aktivitet", "emoji_button.activity": "Aktivitet",
@ -294,6 +297,7 @@
"status.open": "Utvid denne statusen", "status.open": "Utvid denne statusen",
"status.pin": "Fest på profilen", "status.pin": "Fest på profilen",
"status.pinned": "Pinned toot", "status.pinned": "Pinned toot",
"status.read_more": "Read more",
"status.reblog": "Fremhev", "status.reblog": "Fremhev",
"status.reblog_private": "Boost to original audience", "status.reblog_private": "Boost to original audience",
"status.reblogged_by": "Fremhevd av {name}", "status.reblogged_by": "Fremhevd av {name}",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "Volètz vertadièrament rescondre {name}?", "confirmations.mute.message": "Volètz vertadièrament rescondre {name}?",
"confirmations.redraft.confirm": "Escafar & tornar formular", "confirmations.redraft.confirm": "Escafar & tornar formular",
"confirmations.redraft.message": "Volètz vertadièrament escafar aqueste estatut e lo reformular? Tote sos partiments e favorits seràn perduts, e sas responsas seràn orfanèlas.", "confirmations.redraft.message": "Volètz vertadièrament escafar aqueste estatut e lo reformular? Tote sos partiments e favorits seràn perduts, e sas responsas seràn orfanèlas.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Quitar de sègre", "confirmations.unfollow.confirm": "Quitar de sègre",
"confirmations.unfollow.message": "Volètz vertadièrament quitar de sègre {name}?", "confirmations.unfollow.message": "Volètz vertadièrament quitar de sègre {name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "Embarcar aqueste estatut per lo far veire sus un site Internet en copiar lo còdi çai-jos.", "embed.instructions": "Embarcar aqueste estatut per lo far veire sus un site Internet en copiar lo còdi çai-jos.",
"embed.preview": "Semblarà aquò:", "embed.preview": "Semblarà aquò:",
"emoji_button.activity": "Activitats", "emoji_button.activity": "Activitats",
@ -294,6 +297,7 @@
"status.open": "Desplegar aqueste estatut", "status.open": "Desplegar aqueste estatut",
"status.pin": "Penjar al perfil", "status.pin": "Penjar al perfil",
"status.pinned": "Tut penjat", "status.pinned": "Tut penjat",
"status.read_more": "Read more",
"status.reblog": "Partejar", "status.reblog": "Partejar",
"status.reblog_private": "Partejar a laudiéncia dorigina", "status.reblog_private": "Partejar a laudiéncia dorigina",
"status.reblogged_by": "{name} a partejat", "status.reblogged_by": "{name} a partejat",

View File

@ -99,6 +99,7 @@
"confirmations.reply.message": "W ten sposób utracisz wpis który obecnie tworzysz. Czy na pewno chcesz to zrobić?", "confirmations.reply.message": "W ten sposób utracisz wpis który obecnie tworzysz. Czy na pewno chcesz to zrobić?",
"confirmations.unfollow.confirm": "Przestań śledzić", "confirmations.unfollow.confirm": "Przestań śledzić",
"confirmations.unfollow.message": "Czy na pewno zamierzasz przestać śledzić {name}?", "confirmations.unfollow.message": "Czy na pewno zamierzasz przestać śledzić {name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "Osadź ten wpis na swojej stronie wklejając poniższy kod.", "embed.instructions": "Osadź ten wpis na swojej stronie wklejając poniższy kod.",
"embed.preview": "Tak będzie to wyglądać:", "embed.preview": "Tak będzie to wyglądać:",
"emoji_button.activity": "Aktywność", "emoji_button.activity": "Aktywność",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "Você tem certeza de que quer silenciar {name}?", "confirmations.mute.message": "Você tem certeza de que quer silenciar {name}?",
"confirmations.redraft.confirm": "Apagar & usar como rascunho", "confirmations.redraft.confirm": "Apagar & usar como rascunho",
"confirmations.redraft.message": "Você tem certeza que deseja apagar esse status e usá-lo como rascunho? Você vai perder todas as respostas, compartilhamentos e favoritos relacionados a ele.", "confirmations.redraft.message": "Você tem certeza que deseja apagar esse status e usá-lo como rascunho? Você vai perder todas as respostas, compartilhamentos e favoritos relacionados a ele.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Deixar de seguir", "confirmations.unfollow.confirm": "Deixar de seguir",
"confirmations.unfollow.message": "Você tem certeza de que quer deixar de seguir {name}?", "confirmations.unfollow.message": "Você tem certeza de que quer deixar de seguir {name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "Incorpore esta postagem em seu site copiando o código abaixo.", "embed.instructions": "Incorpore esta postagem em seu site copiando o código abaixo.",
"embed.preview": "Aqui está uma previsão de como ficará:", "embed.preview": "Aqui está uma previsão de como ficará:",
"emoji_button.activity": "Atividades", "emoji_button.activity": "Atividades",
@ -294,6 +297,7 @@
"status.open": "Expandir", "status.open": "Expandir",
"status.pin": "Fixar no perfil", "status.pin": "Fixar no perfil",
"status.pinned": "Toot fixado", "status.pinned": "Toot fixado",
"status.read_more": "Read more",
"status.reblog": "Compartilhar", "status.reblog": "Compartilhar",
"status.reblog_private": "Compartilhar com a audiência original", "status.reblog_private": "Compartilhar com a audiência original",
"status.reblogged_by": "{name} compartilhou", "status.reblogged_by": "{name} compartilhou",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "De certeza que queres silenciar {name}?", "confirmations.mute.message": "De certeza que queres silenciar {name}?",
"confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.confirm": "Delete & redraft",
"confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Deixar de seguir", "confirmations.unfollow.confirm": "Deixar de seguir",
"confirmations.unfollow.message": "De certeza que queres deixar de seguir {name}?", "confirmations.unfollow.message": "De certeza que queres deixar de seguir {name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "Publicar este post num outro site copiando o código abaixo.", "embed.instructions": "Publicar este post num outro site copiando o código abaixo.",
"embed.preview": "Podes ver aqui como irá ficar:", "embed.preview": "Podes ver aqui como irá ficar:",
"emoji_button.activity": "Actividade", "emoji_button.activity": "Actividade",
@ -294,6 +297,7 @@
"status.open": "Expandir", "status.open": "Expandir",
"status.pin": "Fixar no perfil", "status.pin": "Fixar no perfil",
"status.pinned": "Pinned toot", "status.pinned": "Pinned toot",
"status.read_more": "Read more",
"status.reblog": "Partilhar", "status.reblog": "Partilhar",
"status.reblog_private": "Boost to original audience", "status.reblog_private": "Boost to original audience",
"status.reblogged_by": "{name} partilhou", "status.reblogged_by": "{name} partilhou",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "Ești sigur că vrei să oprești {name}?", "confirmations.mute.message": "Ești sigur că vrei să oprești {name}?",
"confirmations.redraft.confirm": "Șterge și salvează ca ciornă", "confirmations.redraft.confirm": "Șterge și salvează ca ciornă",
"confirmations.redraft.message": "Ești sigur că vrei să faci asta? Tot ce ține de această postare, inclusiv răspunsurile vor fi deconectate.", "confirmations.redraft.message": "Ești sigur că vrei să faci asta? Tot ce ține de această postare, inclusiv răspunsurile vor fi deconectate.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Nu mai urmări", "confirmations.unfollow.confirm": "Nu mai urmări",
"confirmations.unfollow.message": "Ești sigur că nu mai vrei să îl urmărești pe {name}?", "confirmations.unfollow.message": "Ești sigur că nu mai vrei să îl urmărești pe {name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "Inserează această postare pe site-ul tău adăugând codul de mai jos.", "embed.instructions": "Inserează această postare pe site-ul tău adăugând codul de mai jos.",
"embed.preview": "Cam așa va arăta:", "embed.preview": "Cam așa va arăta:",
"emoji_button.activity": "Activitate", "emoji_button.activity": "Activitate",
@ -294,6 +297,7 @@
"status.open": "Extinde acest status", "status.open": "Extinde acest status",
"status.pin": "Fixează pe profil", "status.pin": "Fixează pe profil",
"status.pinned": "Postare fixată", "status.pinned": "Postare fixată",
"status.read_more": "Read more",
"status.reblog": "Redistribuie", "status.reblog": "Redistribuie",
"status.reblog_private": "Redistribuie către audiența originală", "status.reblog_private": "Redistribuie către audiența originală",
"status.reblogged_by": "{name} redistribuit", "status.reblogged_by": "{name} redistribuit",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "Вы уверены, что хотите заглушить {name}?", "confirmations.mute.message": "Вы уверены, что хотите заглушить {name}?",
"confirmations.redraft.confirm": "Удалить и исправить", "confirmations.redraft.confirm": "Удалить и исправить",
"confirmations.redraft.message": "Вы уверены, что хотите удалить этот статус и превратить в черновик? Вы потеряете все ответы, продвижения и отметки 'нравится' к нему.", "confirmations.redraft.message": "Вы уверены, что хотите удалить этот статус и превратить в черновик? Вы потеряете все ответы, продвижения и отметки 'нравится' к нему.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Отписаться", "confirmations.unfollow.confirm": "Отписаться",
"confirmations.unfollow.message": "Вы уверены, что хотите отписаться от {name}?", "confirmations.unfollow.message": "Вы уверены, что хотите отписаться от {name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "Встройте этот статус на Вашем сайте, скопировав код внизу.", "embed.instructions": "Встройте этот статус на Вашем сайте, скопировав код внизу.",
"embed.preview": "Так это будет выглядеть:", "embed.preview": "Так это будет выглядеть:",
"emoji_button.activity": "Занятия", "emoji_button.activity": "Занятия",
@ -294,6 +297,7 @@
"status.open": "Развернуть статус", "status.open": "Развернуть статус",
"status.pin": "Закрепить в профиле", "status.pin": "Закрепить в профиле",
"status.pinned": "Закреплённый статус", "status.pinned": "Закреплённый статус",
"status.read_more": "Read more",
"status.reblog": "Продвинуть", "status.reblog": "Продвинуть",
"status.reblog_private": "Продвинуть для своей аудитории", "status.reblog_private": "Продвинуть для своей аудитории",
"status.reblogged_by": "{name} продвинул(а)", "status.reblogged_by": "{name} продвинул(а)",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "Naozaj chcete ignorovať {name}?", "confirmations.mute.message": "Naozaj chcete ignorovať {name}?",
"confirmations.redraft.confirm": "Vyčistiť a prepísať", "confirmations.redraft.confirm": "Vyčistiť a prepísať",
"confirmations.redraft.message": "Si si istý/á, že chceš premazať a prepísať tento príspevok? Jeho nadobudnuté odpovede, povýšenia a obľúbenia, ale i odpovede na pôvodný príspevok budú odlúčené.", "confirmations.redraft.message": "Si si istý/á, že chceš premazať a prepísať tento príspevok? Jeho nadobudnuté odpovede, povýšenia a obľúbenia, ale i odpovede na pôvodný príspevok budú odlúčené.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Nesledovať", "confirmations.unfollow.confirm": "Nesledovať",
"confirmations.unfollow.message": "Naozaj chcete prestať sledovať {name}?", "confirmations.unfollow.message": "Naozaj chcete prestať sledovať {name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "Umiestni kód uvedený nižšie pre pridanie tohto statusu na tvoju web stránku.", "embed.instructions": "Umiestni kód uvedený nižšie pre pridanie tohto statusu na tvoju web stránku.",
"embed.preview": "Tu je ako to bude vyzerať:", "embed.preview": "Tu je ako to bude vyzerať:",
"emoji_button.activity": "Aktivita", "emoji_button.activity": "Aktivita",
@ -294,6 +297,7 @@
"status.open": "Otvoriť tento status", "status.open": "Otvoriť tento status",
"status.pin": "Pripni na profil", "status.pin": "Pripni na profil",
"status.pinned": "Pripnutý príspevok", "status.pinned": "Pripnutý príspevok",
"status.read_more": "Read more",
"status.reblog": "Povýšiť", "status.reblog": "Povýšiť",
"status.reblog_private": "Povýš k pôvodnému publiku", "status.reblog_private": "Povýš k pôvodnému publiku",
"status.reblogged_by": "{name} povýšil/a", "status.reblogged_by": "{name} povýšil/a",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "Ali ste prepričani, da želite utišati {name}?", "confirmations.mute.message": "Ali ste prepričani, da želite utišati {name}?",
"confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.confirm": "Delete & redraft",
"confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Prenehaj slediti", "confirmations.unfollow.confirm": "Prenehaj slediti",
"confirmations.unfollow.message": "Ali ste prepričani, da ne želite več slediti {name}?", "confirmations.unfollow.message": "Ali ste prepričani, da ne želite več slediti {name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "Vstavi ta status na svojo spletno stran tako, da kopirate spodnjo kodo.", "embed.instructions": "Vstavi ta status na svojo spletno stran tako, da kopirate spodnjo kodo.",
"embed.preview": "Tukaj je, kako bo izgledalo:", "embed.preview": "Tukaj je, kako bo izgledalo:",
"emoji_button.activity": "Dejavnost", "emoji_button.activity": "Dejavnost",
@ -294,6 +297,7 @@
"status.open": "Expand this status", "status.open": "Expand this status",
"status.pin": "Pin on profile", "status.pin": "Pin on profile",
"status.pinned": "Pripeti tut", "status.pinned": "Pripeti tut",
"status.read_more": "Read more",
"status.reblog": "Suni", "status.reblog": "Suni",
"status.reblog_private": "Suni v prvotno občinstvo", "status.reblog_private": "Suni v prvotno občinstvo",
"status.reblogged_by": "{name} sunjen", "status.reblogged_by": "{name} sunjen",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "Da li stvarno želite da ućutkate korisnika {name}?", "confirmations.mute.message": "Da li stvarno želite da ućutkate korisnika {name}?",
"confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.confirm": "Delete & redraft",
"confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Otprati", "confirmations.unfollow.confirm": "Otprati",
"confirmations.unfollow.message": "Da li ste sigurni da želite da otpratite korisnika {name}?", "confirmations.unfollow.message": "Da li ste sigurni da želite da otpratite korisnika {name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "Ugradi ovaj status na Vaš veb sajt kopiranjem koda ispod.", "embed.instructions": "Ugradi ovaj status na Vaš veb sajt kopiranjem koda ispod.",
"embed.preview": "Ovako će da izgleda:", "embed.preview": "Ovako će da izgleda:",
"emoji_button.activity": "Aktivnost", "emoji_button.activity": "Aktivnost",
@ -294,6 +297,7 @@
"status.open": "Proširi ovaj status", "status.open": "Proširi ovaj status",
"status.pin": "Prikači na profil", "status.pin": "Prikači na profil",
"status.pinned": "Pinned toot", "status.pinned": "Pinned toot",
"status.read_more": "Read more",
"status.reblog": "Podrži", "status.reblog": "Podrži",
"status.reblog_private": "Boost to original audience", "status.reblog_private": "Boost to original audience",
"status.reblogged_by": "{name} podržao(la)", "status.reblogged_by": "{name} podržao(la)",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "Да ли стварно желите да ућуткате корисника {name}?", "confirmations.mute.message": "Да ли стварно желите да ућуткате корисника {name}?",
"confirmations.redraft.confirm": "Избриши и преправи", "confirmations.redraft.confirm": "Избриши и преправи",
"confirmations.redraft.message": "Да ли сте сигурни да желите да избришете овај статус и да га преправите? Сва стављања у омиљене трубе, као и подршке ће бити изгубљене, а одговори на оригинални пост ће бити поништени.", "confirmations.redraft.message": "Да ли сте сигурни да желите да избришете овај статус и да га преправите? Сва стављања у омиљене трубе, као и подршке ће бити изгубљене, а одговори на оригинални пост ће бити поништени.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Отпрати", "confirmations.unfollow.confirm": "Отпрати",
"confirmations.unfollow.message": "Да ли сте сигурни да желите да отпратите корисника {name}?", "confirmations.unfollow.message": "Да ли сте сигурни да желите да отпратите корисника {name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "Угради овај статус на Ваш веб сајт копирањем кода испод.", "embed.instructions": "Угради овај статус на Ваш веб сајт копирањем кода испод.",
"embed.preview": "Овако ће да изгледа:", "embed.preview": "Овако ће да изгледа:",
"emoji_button.activity": "Активност", "emoji_button.activity": "Активност",
@ -294,6 +297,7 @@
"status.open": "Прошири овај статус", "status.open": "Прошири овај статус",
"status.pin": "Закачи на профил", "status.pin": "Закачи на профил",
"status.pinned": "Закачена труба", "status.pinned": "Закачена труба",
"status.read_more": "Read more",
"status.reblog": "Подржи", "status.reblog": "Подржи",
"status.reblog_private": "Подржи да види првобитна публика", "status.reblog_private": "Подржи да види првобитна публика",
"status.reblogged_by": "{name} подржао/ла", "status.reblogged_by": "{name} подржао/ла",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "Är du säker du vill tysta ner {name}?", "confirmations.mute.message": "Är du säker du vill tysta ner {name}?",
"confirmations.redraft.confirm": "Radera och gör om", "confirmations.redraft.confirm": "Radera och gör om",
"confirmations.redraft.message": "Är du säker på att du vill radera meddelandet och göra om det? Du kommer förlora alla svar, knuffar och favoriter som hänvisar till meddelandet.", "confirmations.redraft.message": "Är du säker på att du vill radera meddelandet och göra om det? Du kommer förlora alla svar, knuffar och favoriter som hänvisar till meddelandet.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Sluta följa", "confirmations.unfollow.confirm": "Sluta följa",
"confirmations.unfollow.message": "Är du säker på att du vill sluta följa {name}?", "confirmations.unfollow.message": "Är du säker på att du vill sluta följa {name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "Bädda in den här statusen på din webbplats genom att kopiera koden nedan.", "embed.instructions": "Bädda in den här statusen på din webbplats genom att kopiera koden nedan.",
"embed.preview": "Här ser du hur det kommer att se ut:", "embed.preview": "Här ser du hur det kommer att se ut:",
"emoji_button.activity": "Aktivitet", "emoji_button.activity": "Aktivitet",
@ -294,6 +297,7 @@
"status.open": "Utvidga denna status", "status.open": "Utvidga denna status",
"status.pin": "Fäst i profil", "status.pin": "Fäst i profil",
"status.pinned": "Fäst toot", "status.pinned": "Fäst toot",
"status.read_more": "Read more",
"status.reblog": "Knuff", "status.reblog": "Knuff",
"status.reblog_private": "Knuffa till de ursprungliga åhörarna", "status.reblog_private": "Knuffa till de ursprungliga åhörarna",
"status.reblogged_by": "{name} knuffade", "status.reblogged_by": "{name} knuffade",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "Are you sure you want to mute {name}?", "confirmations.mute.message": "Are you sure you want to mute {name}?",
"confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.confirm": "Delete & redraft",
"confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.confirm": "Unfollow",
"confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "Embed this status on your website by copying the code below.", "embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:", "embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Activity", "emoji_button.activity": "Activity",
@ -294,6 +297,7 @@
"status.open": "Expand this status", "status.open": "Expand this status",
"status.pin": "Pin on profile", "status.pin": "Pin on profile",
"status.pinned": "Pinned toot", "status.pinned": "Pinned toot",
"status.read_more": "Read more",
"status.reblog": "Boost", "status.reblog": "Boost",
"status.reblog_private": "Boost to original audience", "status.reblog_private": "Boost to original audience",
"status.reblogged_by": "{name} boosted", "status.reblogged_by": "{name} boosted",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "{name}ను మీరు ఖచ్చితంగా మ్యూట్ చేయాలనుకుంటున్నారా?", "confirmations.mute.message": "{name}ను మీరు ఖచ్చితంగా మ్యూట్ చేయాలనుకుంటున్నారా?",
"confirmations.redraft.confirm": "తొలగించు & తిరగరాయు", "confirmations.redraft.confirm": "తొలగించు & తిరగరాయు",
"confirmations.redraft.message": "మీరు ఖచ్చితంగా ఈ స్టేటస్ ని తొలగించి తిరగరాయాలనుకుంటున్నారా? ఈ స్టేటస్ యొక్క బూస్ట్ లు మరియు ఇష్టాలు పోతాయి,మరియు ప్రత్యుత్తరాలు అనాధలు అయిపోతాయి.", "confirmations.redraft.message": "మీరు ఖచ్చితంగా ఈ స్టేటస్ ని తొలగించి తిరగరాయాలనుకుంటున్నారా? ఈ స్టేటస్ యొక్క బూస్ట్ లు మరియు ఇష్టాలు పోతాయి,మరియు ప్రత్యుత్తరాలు అనాధలు అయిపోతాయి.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "అనుసరించవద్దు", "confirmations.unfollow.confirm": "అనుసరించవద్దు",
"confirmations.unfollow.message": "{name}ను మీరు ఖచ్చితంగా అనుసరించవద్దనుకుంటున్నారా?", "confirmations.unfollow.message": "{name}ను మీరు ఖచ్చితంగా అనుసరించవద్దనుకుంటున్నారా?",
"conversation.last_message": "Last message:",
"embed.instructions": "దిగువ కోడ్ను కాపీ చేయడం ద్వారా మీ వెబ్సైట్లో ఈ స్టేటస్ ని పొందుపరచండి.", "embed.instructions": "దిగువ కోడ్ను కాపీ చేయడం ద్వారా మీ వెబ్సైట్లో ఈ స్టేటస్ ని పొందుపరచండి.",
"embed.preview": "అది ఈ క్రింది విధంగా కనిపిస్తుంది:", "embed.preview": "అది ఈ క్రింది విధంగా కనిపిస్తుంది:",
"emoji_button.activity": "కార్యకలాపాలు", "emoji_button.activity": "కార్యకలాపాలు",
@ -294,6 +297,7 @@
"status.open": "ఈ స్టేటస్ ను విస్తరించు", "status.open": "ఈ స్టేటస్ ను విస్తరించు",
"status.pin": "ప్రొఫైల్లో అతికించు", "status.pin": "ప్రొఫైల్లో అతికించు",
"status.pinned": "అతికించిన టూట్", "status.pinned": "అతికించిన టూట్",
"status.read_more": "Read more",
"status.reblog": "బూస్ట్", "status.reblog": "బూస్ట్",
"status.reblog_private": "అసలు ప్రేక్షకులకు బూస్ట్ చేయి", "status.reblog_private": "అసలు ప్రేక్షకులకు బూస్ట్ చేయి",
"status.reblogged_by": "{name} బూస్ట్ చేసారు", "status.reblogged_by": "{name} బూస్ట్ చేసారు",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "Are you sure you want to mute {name}?", "confirmations.mute.message": "Are you sure you want to mute {name}?",
"confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.confirm": "Delete & redraft",
"confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.confirm": "Unfollow",
"confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "Embed this status on your website by copying the code below.", "embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:", "embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Activity", "emoji_button.activity": "Activity",
@ -294,6 +297,7 @@
"status.open": "Expand this status", "status.open": "Expand this status",
"status.pin": "Pin on profile", "status.pin": "Pin on profile",
"status.pinned": "Pinned toot", "status.pinned": "Pinned toot",
"status.read_more": "Read more",
"status.reblog": "Boost", "status.reblog": "Boost",
"status.reblog_private": "Boost to original audience", "status.reblog_private": "Boost to original audience",
"status.reblogged_by": "{name} boosted", "status.reblogged_by": "{name} boosted",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "{name} kullanıcısını sessize almak istiyor musunuz?", "confirmations.mute.message": "{name} kullanıcısını sessize almak istiyor musunuz?",
"confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.confirm": "Delete & redraft",
"confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.confirm": "Unfollow",
"confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "Embed this status on your website by copying the code below.", "embed.instructions": "Embed this status on your website by copying the code below.",
"embed.preview": "Here is what it will look like:", "embed.preview": "Here is what it will look like:",
"emoji_button.activity": "Aktivite", "emoji_button.activity": "Aktivite",
@ -294,6 +297,7 @@
"status.open": "Bu gönderiyi genişlet", "status.open": "Bu gönderiyi genişlet",
"status.pin": "Pin on profile", "status.pin": "Pin on profile",
"status.pinned": "Pinned toot", "status.pinned": "Pinned toot",
"status.read_more": "Read more",
"status.reblog": "Boost'la", "status.reblog": "Boost'la",
"status.reblog_private": "Boost to original audience", "status.reblog_private": "Boost to original audience",
"status.reblogged_by": "{name} boost etti", "status.reblogged_by": "{name} boost etti",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "Ви впевнені, що хочете заглушити {name}?", "confirmations.mute.message": "Ви впевнені, що хочете заглушити {name}?",
"confirmations.redraft.confirm": "Видалити і перестворити", "confirmations.redraft.confirm": "Видалити і перестворити",
"confirmations.redraft.message": "Ви впевнені, що хочете видалити допис і перестворити його? Ви втратите всі відповіді, передмухи та вподобайки допису.", "confirmations.redraft.message": "Ви впевнені, що хочете видалити допис і перестворити його? Ви втратите всі відповіді, передмухи та вподобайки допису.",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "Відписатися", "confirmations.unfollow.confirm": "Відписатися",
"confirmations.unfollow.message": "Ви впевнені, що хочете відписатися від {name}?", "confirmations.unfollow.message": "Ви впевнені, що хочете відписатися від {name}?",
"conversation.last_message": "Last message:",
"embed.instructions": "Інтегруйте цей статус на вашому вебсайті, скопіювавши код нижче.", "embed.instructions": "Інтегруйте цей статус на вашому вебсайті, скопіювавши код нижче.",
"embed.preview": "Ось як він виглядатиме:", "embed.preview": "Ось як він виглядатиме:",
"emoji_button.activity": "Заняття", "emoji_button.activity": "Заняття",
@ -294,6 +297,7 @@
"status.open": "Розгорнути допис", "status.open": "Розгорнути допис",
"status.pin": "Pin on profile", "status.pin": "Pin on profile",
"status.pinned": "Pinned toot", "status.pinned": "Pinned toot",
"status.read_more": "Read more",
"status.reblog": "Передмухнути", "status.reblog": "Передмухнути",
"status.reblog_private": "Boost to original audience", "status.reblog_private": "Boost to original audience",
"status.reblogged_by": "{name} передмухнув(-ла)", "status.reblogged_by": "{name} передмухнув(-ла)",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "你确定要隐藏 {name} 吗?", "confirmations.mute.message": "你确定要隐藏 {name} 吗?",
"confirmations.redraft.confirm": "删除并重新编辑", "confirmations.redraft.confirm": "删除并重新编辑",
"confirmations.redraft.message": "你确定要删除这条嘟文并重新编辑它吗?所有相关的回复、转嘟和收藏都会被清除。", "confirmations.redraft.message": "你确定要删除这条嘟文并重新编辑它吗?所有相关的回复、转嘟和收藏都会被清除。",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "取消关注", "confirmations.unfollow.confirm": "取消关注",
"confirmations.unfollow.message": "你确定要取消关注 {name} 吗?", "confirmations.unfollow.message": "你确定要取消关注 {name} 吗?",
"conversation.last_message": "Last message:",
"embed.instructions": "要在你的网站上嵌入这条嘟文,请复制以下代码。", "embed.instructions": "要在你的网站上嵌入这条嘟文,请复制以下代码。",
"embed.preview": "它会像这样显示出来:", "embed.preview": "它会像这样显示出来:",
"emoji_button.activity": "活动", "emoji_button.activity": "活动",
@ -294,6 +297,7 @@
"status.open": "展开嘟文", "status.open": "展开嘟文",
"status.pin": "在个人资料页面置顶", "status.pin": "在个人资料页面置顶",
"status.pinned": "置顶嘟文", "status.pinned": "置顶嘟文",
"status.read_more": "Read more",
"status.reblog": "转嘟", "status.reblog": "转嘟",
"status.reblog_private": "转嘟给原有关注者", "status.reblog_private": "转嘟给原有关注者",
"status.reblogged_by": "{name} 转嘟了", "status.reblogged_by": "{name} 转嘟了",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "你確定要將{name}靜音嗎?", "confirmations.mute.message": "你確定要將{name}靜音嗎?",
"confirmations.redraft.confirm": "刪除並編輯", "confirmations.redraft.confirm": "刪除並編輯",
"confirmations.redraft.message": "你確定要刪除並重新編輯嗎?所有相關的回覆、轉推與最愛都會被刪除。", "confirmations.redraft.message": "你確定要刪除並重新編輯嗎?所有相關的回覆、轉推與最愛都會被刪除。",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "取消關注", "confirmations.unfollow.confirm": "取消關注",
"confirmations.unfollow.message": "真的不要繼續關注 {name} 了嗎?", "confirmations.unfollow.message": "真的不要繼續關注 {name} 了嗎?",
"conversation.last_message": "Last message:",
"embed.instructions": "要內嵌此文章,請將以下代碼貼進你的網站。", "embed.instructions": "要內嵌此文章,請將以下代碼貼進你的網站。",
"embed.preview": "看上去會是這樣:", "embed.preview": "看上去會是這樣:",
"emoji_button.activity": "活動", "emoji_button.activity": "活動",
@ -294,6 +297,7 @@
"status.open": "展開文章", "status.open": "展開文章",
"status.pin": "置頂到資料頁", "status.pin": "置頂到資料頁",
"status.pinned": "置頂文章", "status.pinned": "置頂文章",
"status.read_more": "Read more",
"status.reblog": "轉推", "status.reblog": "轉推",
"status.reblog_private": "轉推到原讀者", "status.reblog_private": "轉推到原讀者",
"status.reblogged_by": "{name} 轉推", "status.reblogged_by": "{name} 轉推",

View File

@ -91,8 +91,11 @@
"confirmations.mute.message": "你確定要消音 {name} ", "confirmations.mute.message": "你確定要消音 {name} ",
"confirmations.redraft.confirm": "刪除 & 編輯", "confirmations.redraft.confirm": "刪除 & 編輯",
"confirmations.redraft.message": "你確定要刪除這條嘟文並重新編輯它嗎?所有相關的轉嘟與最愛都會被刪除,而對原始嘟文的回覆將會變成孤兒。", "confirmations.redraft.message": "你確定要刪除這條嘟文並重新編輯它嗎?所有相關的轉嘟與最愛都會被刪除,而對原始嘟文的回覆將會變成孤兒。",
"confirmations.reply.confirm": "Reply",
"confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.unfollow.confirm": "取消關注", "confirmations.unfollow.confirm": "取消關注",
"confirmations.unfollow.message": "真的不要繼續關注 {name} 了嗎?", "confirmations.unfollow.message": "真的不要繼續關注 {name} 了嗎?",
"conversation.last_message": "Last message:",
"embed.instructions": "要內嵌此嘟文,請將以下代碼貼進你的網站。", "embed.instructions": "要內嵌此嘟文,請將以下代碼貼進你的網站。",
"embed.preview": "看上去會變成這樣:", "embed.preview": "看上去會變成這樣:",
"emoji_button.activity": "活動", "emoji_button.activity": "活動",
@ -294,6 +297,7 @@
"status.open": "展開嘟文", "status.open": "展開嘟文",
"status.pin": "置頂到個人資訊頁", "status.pin": "置頂到個人資訊頁",
"status.pinned": "置頂嘟文", "status.pinned": "置頂嘟文",
"status.read_more": "Read more",
"status.reblog": "轉嘟", "status.reblog": "轉嘟",
"status.reblog_private": "轉嘟給原有關注者", "status.reblog_private": "轉嘟給原有關注者",
"status.reblogged_by": "{name} 轉嘟了", "status.reblogged_by": "{name} 轉嘟了",

View File

@ -1,9 +1,12 @@
import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; import { Map as ImmutableMap, List as ImmutableList } from 'immutable';
import { import {
CONVERSATIONS_MOUNT,
CONVERSATIONS_UNMOUNT,
CONVERSATIONS_FETCH_REQUEST, CONVERSATIONS_FETCH_REQUEST,
CONVERSATIONS_FETCH_SUCCESS, CONVERSATIONS_FETCH_SUCCESS,
CONVERSATIONS_FETCH_FAIL, CONVERSATIONS_FETCH_FAIL,
CONVERSATIONS_UPDATE, CONVERSATIONS_UPDATE,
CONVERSATIONS_READ,
} from '../actions/conversations'; } from '../actions/conversations';
import compareId from '../compare_id'; import compareId from '../compare_id';
@ -11,10 +14,12 @@ const initialState = ImmutableMap({
items: ImmutableList(), items: ImmutableList(),
isLoading: false, isLoading: false,
hasMore: true, hasMore: true,
mounted: false,
}); });
const conversationToMap = item => ImmutableMap({ const conversationToMap = item => ImmutableMap({
id: item.id, id: item.id,
unread: item.unread,
accounts: ImmutableList(item.accounts.map(a => a.id)), accounts: ImmutableList(item.accounts.map(a => a.id)),
last_status: item.last_status.id, last_status: item.last_status.id,
}); });
@ -73,6 +78,18 @@ export default function conversations(state = initialState, action) {
return expandNormalizedConversations(state, action.conversations, action.next); return expandNormalizedConversations(state, action.conversations, action.next);
case CONVERSATIONS_UPDATE: case CONVERSATIONS_UPDATE:
return updateConversation(state, action.conversation); return updateConversation(state, action.conversation);
case CONVERSATIONS_MOUNT:
return state.update('mounted', count => count + 1);
case CONVERSATIONS_UNMOUNT:
return state.update('mounted', count => count - 1);
case CONVERSATIONS_READ:
return state.update('items', list => list.map(item => {
if (item.get('id') === action.id) {
return item.set('unread', false);
}
return item;
}));
default: default:
return state; return state;
} }

View File

@ -286,20 +286,6 @@
} }
} }
.flash-message {
box-shadow: none;
&.notice {
background: rgba($success-green, 0.5);
color: lighten($success-green, 12%);
}
&.alert {
background: rgba($error-red, 0.5);
color: lighten($error-red, 12%);
}
}
.simple_form, .simple_form,
.table-form { .table-form {
.warning { .warning {

View File

@ -801,7 +801,7 @@
padding: 8px 10px; padding: 8px 10px;
padding-left: 68px; padding-left: 68px;
position: relative; position: relative;
min-height: 48px; min-height: 54px;
border-bottom: 1px solid lighten($ui-base-color, 8%); border-bottom: 1px solid lighten($ui-base-color, 8%);
cursor: default; cursor: default;
@ -823,7 +823,7 @@
margin-top: 8px; margin-top: 8px;
} }
&.status-direct { &.status-direct:not(.read) {
background: lighten($ui-base-color, 8%); background: lighten($ui-base-color, 8%);
border-bottom-color: lighten($ui-base-color, 12%); border-bottom-color: lighten($ui-base-color, 12%);
} }
@ -1133,6 +1133,18 @@
vertical-align: middle; vertical-align: middle;
margin-right: 5px; margin-right: 5px;
} }
&-composite {
@include avatar-radius();
overflow: hidden;
& > div {
@include avatar-radius();
float: left;
position: relative;
box-sizing: border-box;
}
}
} }
a .account__avatar { a .account__avatar {
@ -5497,44 +5509,3 @@ noscript {
} }
} }
} }
.conversation {
padding: 14px 10px;
border-bottom: 1px solid lighten($ui-base-color, 8%);
cursor: pointer;
&__header {
display: flex;
margin-bottom: 15px;
}
&__avatars {
overflow: hidden;
flex: 1 1 auto;
& > div {
display: flex;
flex-wrap: none;
width: 900px;
}
.account__avatar {
margin-right: 10px;
}
}
&__time {
flex: 0 0 auto;
font-size: 14px;
color: $darker-text-color;
text-align: right;
.display-name {
color: $secondary-text-color;
}
}
.attachment-list.compact {
margin-top: 15px;
}
}

View File

@ -427,7 +427,7 @@ code {
&__append { &__append {
position: absolute; position: absolute;
right: 1px; right: 3px;
top: 1px; top: 1px;
padding: 10px; padding: 10px;
padding-bottom: 9px; padding-bottom: 9px;
@ -460,9 +460,20 @@ code {
border-radius: 4px; border-radius: 4px;
padding: 15px 10px; padding: 15px 10px;
margin-bottom: 30px; margin-bottom: 30px;
box-shadow: 0 0 5px rgba($base-shadow-color, 0.2);
text-align: center; text-align: center;
&.notice {
border: 1px solid rgba($valid-value-color, 0.5);
background: rgba($valid-value-color, 0.25);
color: $valid-value-color;
}
&.alert {
border: 1px solid rgba($error-value-color, 0.5);
background: rgba($error-value-color, 0.25);
color: $error-value-color;
}
p { p {
margin-bottom: 15px; margin-bottom: 15px;
} }
@ -551,12 +562,12 @@ code {
.oauth-prompt, .oauth-prompt,
.follow-prompt { .follow-prompt {
margin-bottom: 30px; margin-bottom: 30px;
text-align: center;
color: $darker-text-color; color: $darker-text-color;
h2 { h2 {
font-size: 16px; font-size: 16px;
margin-bottom: 30px; margin-bottom: 30px;
text-align: center;
} }
strong { strong {

View File

@ -73,7 +73,7 @@ body.rtl {
float: left; float: left;
} }
.setting-toggle { .setting-toggle__label {
margin-left: 0; margin-left: 0;
margin-right: 8px; margin-right: 8px;
} }
@ -196,6 +196,10 @@ body.rtl {
right: -2.14285714em; right: -2.14285714em;
} }
.admin-wrapper {
direction: rtl;
}
.admin-wrapper .sidebar ul a i.fa, .admin-wrapper .sidebar ul a i.fa,
a.table-action-link i.fa { a.table-action-link i.fa {
margin-right: 0; margin-right: 0;
@ -214,22 +218,47 @@ body.rtl {
right: 0; right: 0;
} }
.simple_form .input.radio_buttons .radio {
left: auto;
right: 0;
}
.simple_form .input.radio_buttons .radio > label {
padding-right: 28px;
padding-left: 0;
}
.simple_form .input-with-append .input input { .simple_form .input-with-append .input input {
padding-left: 142px; padding-left: 142px;
padding-right: 0; padding-right: 0;
} }
.simple_form .input-with-append .append { .simple_form .input.boolean label.checkbox {
left: auto;
right: 0;
}
.simple_form .input.boolean .label_input,
.simple_form .input.boolean .hint {
padding-left: 0;
padding-right: 28px;
}
.simple_form .label_input__append {
right: auto; right: auto;
left: 0; left: 3px;
&::after { &::after {
right: auto; right: auto;
left: 0; left: 0;
background-image: linear-gradient(to left, rgba($ui-base-color, 0), $ui-base-color); background-image: linear-gradient(to left, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));
} }
} }
.simple_form select {
background: darken($ui-base-color, 10%) url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 12%))}'/></svg>") no-repeat left 8px center / auto 16px;
}
.table th, .table th,
.table td { .table td {
text-align: right; text-align: right;
@ -245,6 +274,10 @@ body.rtl {
left: auto; left: auto;
} }
.landing-page__call-to-action .row__information-board {
direction: rtl;
}
.landing-page .header .hero .floats .float-1 { .landing-page .header .hero .floats .float-1 {
left: -120px; left: -120px;
right: auto; right: auto;
@ -308,4 +341,22 @@ body.rtl {
margin-right: 20px; margin-right: 20px;
} }
} }
.landing-page__information {
.account__display-name {
margin-right: 0;
margin-left: 5px;
}
.account__avatar-wrapper {
margin-left: 12px;
margin-right: 0;
}
}
.card__bar .display-name {
margin-left: 0;
margin-right: 15px;
text-align: right;
}
} }

View File

@ -3,7 +3,6 @@
border-radius: 4px; border-radius: 4px;
overflow: hidden; overflow: hidden;
margin-bottom: 10px; margin-bottom: 10px;
text-align: left;
@media screen and (max-width: $no-gap-breakpoint) { @media screen and (max-width: $no-gap-breakpoint) {
margin-bottom: 0; margin-bottom: 0;

View File

@ -96,7 +96,7 @@ class ActivityPub::Activity
end end
def notify_about_mentions(status) def notify_about_mentions(status)
status.mentions.includes(:account).each do |mention| status.active_mentions.includes(:account).each do |mention|
next unless mention.account.local? && audience_includes?(mention.account) next unless mention.account.local? && audience_includes?(mention.account)
NotifyService.new.call(mention.account, mention) NotifyService.new.call(mention.account, mention)
end end

View File

@ -22,12 +22,17 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
private private
def process_status def process_status
status_params = process_status_params @tags = []
@mentions = []
@params = {}
process_status_params
process_tags
process_audience
ApplicationRecord.transaction do ApplicationRecord.transaction do
@status = Status.create!(status_params) @status = Status.create!(@params)
attach_tags(@status)
process_tags(@status)
end end
resolve_thread(@status) resolve_thread(@status)
@ -42,62 +47,98 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
end end
def process_status_params def process_status_params
{ @params = begin
uri: @object['id'], {
url: object_url || @object['id'], uri: @object['id'],
account: @account, url: object_url || @object['id'],
text: text_from_content || '', account: @account,
language: detected_language, text: text_from_content || '',
spoiler_text: text_from_summary || '', language: detected_language,
created_at: @object['published'], spoiler_text: text_from_summary || '',
override_timestamps: @options[:override_timestamps], created_at: @object['published'],
reply: @object['inReplyTo'].present?, override_timestamps: @options[:override_timestamps],
sensitive: @object['sensitive'] || false, reply: @object['inReplyTo'].present?,
visibility: visibility_from_audience, sensitive: @object['sensitive'] || false,
thread: replied_to_status, visibility: visibility_from_audience,
conversation: conversation_from_uri(@object['conversation']), thread: replied_to_status,
media_attachment_ids: process_attachments.take(4).map(&:id), conversation: conversation_from_uri(@object['conversation']),
} media_attachment_ids: process_attachments.take(4).map(&:id),
}
end
end end
def process_tags(status) def process_audience
(as_array(@object['to']) + as_array(@object['cc'])).uniq.each do |audience|
next if audience == ActivityPub::TagManager::COLLECTIONS[:public]
# Unlike with tags, there is no point in resolving accounts we don't already
# know here, because silent mentions would only be used for local access
# control anyway
account = account_from_uri(audience)
next if account.nil? || @mentions.any? { |mention| mention.account_id == account.id }
@mentions << Mention.new(account: account, silent: true)
# If there is at least one silent mention, then the status can be considered
# as a limited-audience status, and not strictly a direct message
next unless @params[:visibility] == :direct
@params[:visibility] = :limited
end
end
def attach_tags(status)
@tags.each do |tag|
status.tags << tag
TrendingTags.record_use!(tag, status.account, status.created_at) if status.public_visibility?
end
@mentions.each do |mention|
mention.status = status
mention.save
end
end
def process_tags
return if @object['tag'].nil? return if @object['tag'].nil?
as_array(@object['tag']).each do |tag| as_array(@object['tag']).each do |tag|
if equals_or_includes?(tag['type'], 'Hashtag') if equals_or_includes?(tag['type'], 'Hashtag')
process_hashtag tag, status process_hashtag tag
elsif equals_or_includes?(tag['type'], 'Mention') elsif equals_or_includes?(tag['type'], 'Mention')
process_mention tag, status process_mention tag
elsif equals_or_includes?(tag['type'], 'Emoji') elsif equals_or_includes?(tag['type'], 'Emoji')
process_emoji tag, status process_emoji tag
end end
end end
end end
def process_hashtag(tag, status) def process_hashtag(tag)
return if tag['name'].blank? return if tag['name'].blank?
hashtag = tag['name'].gsub(/\A#/, '').mb_chars.downcase hashtag = tag['name'].gsub(/\A#/, '').mb_chars.downcase
hashtag = Tag.where(name: hashtag).first_or_create(name: hashtag) hashtag = Tag.where(name: hashtag).first_or_create(name: hashtag)
return if status.tags.include?(hashtag) return if @tags.include?(hashtag)
status.tags << hashtag @tags << hashtag
TrendingTags.record_use!(hashtag, status.account, status.created_at) if status.public_visibility?
rescue ActiveRecord::RecordInvalid rescue ActiveRecord::RecordInvalid
nil nil
end end
def process_mention(tag, status) def process_mention(tag)
return if tag['href'].blank? return if tag['href'].blank?
account = account_from_uri(tag['href']) account = account_from_uri(tag['href'])
account = ::FetchRemoteAccountService.new.call(tag['href'], id: false) if account.nil? account = ::FetchRemoteAccountService.new.call(tag['href'], id: false) if account.nil?
return if account.nil? return if account.nil?
account.mentions.create(status: status)
@mentions << Mention.new(account: account, silent: false)
end end
def process_emoji(tag, _status) 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?

View File

@ -2,6 +2,8 @@
class ActivityPub::Activity::Flag < ActivityPub::Activity class ActivityPub::Activity::Flag < ActivityPub::Activity
def perform def perform
return if skip_reports?
target_accounts = object_uris.map { |uri| account_from_uri(uri) }.compact.select(&:local?) target_accounts = object_uris.map { |uri| account_from_uri(uri) }.compact.select(&:local?)
target_statuses_by_account = object_uris.map { |uri| status_from_uri(uri) }.compact.select(&:local?).group_by(&:account_id) target_statuses_by_account = object_uris.map { |uri| status_from_uri(uri) }.compact.select(&:local?).group_by(&:account_id)
@ -19,6 +21,12 @@ class ActivityPub::Activity::Flag < ActivityPub::Activity
end end
end end
private
def skip_reports?
DomainBlock.find_by(domain: @account.domain)&.reject_reports?
end
def object_uris def object_uris
@object_uris ||= Array(@object.is_a?(Array) ? @object.map { |item| value_or_id(item) } : value_or_id(@object)) @object_uris ||= Array(@object.is_a?(Array) ? @object.map { |item| value_or_id(item) } : value_or_id(@object))
end end

View File

@ -58,8 +58,8 @@ class ActivityPub::TagManager
[COLLECTIONS[:public]] [COLLECTIONS[:public]]
when 'unlisted', 'private' when 'unlisted', 'private'
[account_followers_url(status.account)] [account_followers_url(status.account)]
when 'direct' when 'direct', 'limited'
status.mentions.map { |mention| uri_for(mention.account) } status.active_mentions.map { |mention| uri_for(mention.account) }
end end
end end
@ -80,7 +80,7 @@ class ActivityPub::TagManager
cc << COLLECTIONS[:public] cc << COLLECTIONS[:public]
end end
cc.concat(status.mentions.map { |mention| uri_for(mention.account) }) unless status.direct_visibility? cc.concat(status.active_mentions.map { |mention| uri_for(mention.account) }) unless status.direct_visibility? || status.limited_visibility?
cc cc
end end

View File

@ -88,7 +88,7 @@ class FeedManager
end end
query.each do |status| query.each do |status|
next if status.direct_visibility? || filter?(:home, status, into_account) next if status.direct_visibility? || status.limited_visibility? || filter?(:home, status, into_account)
add_to_feed(:home, into_account.id, status) add_to_feed(:home, into_account.id, status)
end end
@ -156,12 +156,12 @@ class FeedManager
return true if status.reply? && (status.in_reply_to_id.nil? || status.in_reply_to_account_id.nil?) return true if status.reply? && (status.in_reply_to_id.nil? || status.in_reply_to_account_id.nil?)
return true if phrase_filtered?(status, receiver_id, :home) return true if phrase_filtered?(status, receiver_id, :home)
check_for_blocks = status.mentions.pluck(:account_id) check_for_blocks = status.active_mentions.pluck(:account_id)
check_for_blocks.concat([status.account_id]) check_for_blocks.concat([status.account_id])
if status.reblog? if status.reblog?
check_for_blocks.concat([status.reblog.account_id]) check_for_blocks.concat([status.reblog.account_id])
check_for_blocks.concat(status.reblog.mentions.pluck(:account_id)) check_for_blocks.concat(status.reblog.active_mentions.pluck(:account_id))
end end
return true if blocks_or_mutes?(receiver_id, check_for_blocks, :home) return true if blocks_or_mutes?(receiver_id, check_for_blocks, :home)
@ -188,7 +188,7 @@ class FeedManager
# This filter is called from NotifyService, but already after the sender of # This filter is called from NotifyService, but already after the sender of
# the notification has been checked for mute/block. Therefore, it's not # the notification has been checked for mute/block. Therefore, it's not
# necessary to check the author of the toot for mute/block again # necessary to check the author of the toot for mute/block again
check_for_blocks = status.mentions.pluck(:account_id) check_for_blocks = status.active_mentions.pluck(:account_id)
check_for_blocks.concat([status.in_reply_to_account]) if status.reply? && !status.in_reply_to_account_id.nil? check_for_blocks.concat([status.in_reply_to_account]) if status.reply? && !status.in_reply_to_account_id.nil?
should_filter = blocks_or_mutes?(receiver_id, check_for_blocks, :mentions) # Filter if it's from someone I blocked, in reply to someone I blocked, or mentioning someone I blocked (or muted) should_filter = blocks_or_mutes?(receiver_id, check_for_blocks, :mentions) # Filter if it's from someone I blocked, in reply to someone I blocked, or mentioning someone I blocked (or muted)

View File

@ -27,7 +27,7 @@ class Formatter
return html.html_safe # rubocop:disable Rails/OutputSafety return html.html_safe # rubocop:disable Rails/OutputSafety
end end
linkable_accounts = status.mentions.map(&:account) linkable_accounts = status.active_mentions.map(&:account)
linkable_accounts << status.account linkable_accounts << status.account
html = raw_content html = raw_content

View File

@ -354,7 +354,7 @@ class OStatus::AtomSerializer
append_element(entry, 'summary', status.spoiler_text, 'xml:lang': status.language) if status.spoiler_text? append_element(entry, 'summary', status.spoiler_text, 'xml:lang': status.language) if status.spoiler_text?
append_element(entry, 'content', Formatter.instance.format(status).to_str || '.', type: 'html', 'xml:lang': status.language) append_element(entry, 'content', Formatter.instance.format(status).to_str || '.', type: 'html', 'xml:lang': status.language)
status.mentions.sort_by(&:id).each do |mentioned| status.active_mentions.sort_by(&:id).each do |mentioned|
append_element(entry, 'link', nil, rel: :mentioned, 'ostatus:object-type': OStatus::TagManager::TYPES[:person], href: OStatus::TagManager.instance.uri_for(mentioned.account)) append_element(entry, 'link', nil, rel: :mentioned, 'ostatus:object-type': OStatus::TagManager::TYPES[:person], href: OStatus::TagManager.instance.uri_for(mentioned.account))
end end

View File

@ -10,6 +10,7 @@
# status_ids :bigint(8) default([]), not null, is an Array # status_ids :bigint(8) default([]), not null, is an Array
# last_status_id :bigint(8) # last_status_id :bigint(8)
# lock_version :integer default(0), not null # lock_version :integer default(0), not null
# unread :boolean default(FALSE), not null
# #
class AccountConversation < ApplicationRecord class AccountConversation < ApplicationRecord
@ -58,6 +59,7 @@ class AccountConversation < ApplicationRecord
def add_status(recipient, status) def add_status(recipient, status)
conversation = find_or_initialize_by(account: recipient, conversation_id: status.conversation_id, participant_account_ids: participants_from_status(recipient, status)) conversation = find_or_initialize_by(account: recipient, conversation_id: status.conversation_id, participant_account_ids: participants_from_status(recipient, status))
conversation.status_ids << status.id conversation.status_ids << status.id
conversation.unread = status.account_id != recipient.id
conversation.save conversation.save
conversation conversation
rescue ActiveRecord::StaleObjectError rescue ActiveRecord::StaleObjectError
@ -85,7 +87,7 @@ class AccountConversation < ApplicationRecord
private private
def participants_from_status(recipient, status) def participants_from_status(recipient, status)
((status.mentions.pluck(:account_id) + [status.account_id]).uniq - [recipient.id]).sort ((status.active_mentions.pluck(:account_id) + [status.account_id]).uniq - [recipient.id]).sort
end end
end end

View File

@ -3,12 +3,13 @@
# #
# Table name: domain_blocks # Table name: domain_blocks
# #
# id :bigint(8) not null, primary key # id :bigint(8) not null, primary key
# domain :string default(""), not null # domain :string default(""), not null
# created_at :datetime not null # created_at :datetime not null
# updated_at :datetime not null # updated_at :datetime not null
# severity :integer default("silence") # severity :integer default("silence")
# reject_media :boolean default(FALSE), not null # reject_media :boolean default(FALSE), not null
# reject_reports :boolean default(FALSE), not null
# #
class DomainBlock < ApplicationRecord class DomainBlock < ApplicationRecord

View File

@ -8,6 +8,7 @@
# created_at :datetime not null # created_at :datetime not null
# updated_at :datetime not null # updated_at :datetime not null
# account_id :bigint(8) # account_id :bigint(8)
# silent :boolean default(FALSE), not null
# #
class Mention < ApplicationRecord class Mention < ApplicationRecord
@ -18,10 +19,17 @@ class Mention < ApplicationRecord
validates :account, uniqueness: { scope: :status } validates :account, uniqueness: { scope: :status }
scope :active, -> { where(silent: false) }
scope :silent, -> { where(silent: true) }
delegate( delegate(
:username, :username,
:acct, :acct,
to: :account, to: :account,
prefix: true prefix: true
) )
def active?
!silent?
end
end end

View File

@ -24,7 +24,7 @@ class Notification < ApplicationRecord
favourite: 'Favourite', favourite: 'Favourite',
}.freeze }.freeze
STATUS_INCLUDES = [:account, :application, :stream_entry, :media_attachments, :tags, mentions: :account, reblog: [:stream_entry, :account, :application, :media_attachments, :tags, mentions: :account]].freeze STATUS_INCLUDES = [:account, :application, :media_attachments, :tags, active_mentions: :account, reblog: [:account, :application, :media_attachments, :tags, active_mentions: :account]].freeze
belongs_to :account, optional: true belongs_to :account, optional: true
belongs_to :from_account, class_name: 'Account', optional: true belongs_to :from_account, class_name: 'Account', optional: true

Some files were not shown because too many files have changed in this diff Show More